tx · 4wFbEBnphYe5Fiend6wRjrdqLeMw3ZgvGdYSCGbt94Zf

3N7m9xGD4z7uJNvH1s7U1yyU9FygAyDfgNf:  -0.01900000 Waves

2023.03.03 00:41 [2472998] smart account 3N7m9xGD4z7uJNvH1s7U1yyU9FygAyDfgNf > SELF 0.00000000 Waves

{ "type": 13, "id": "4wFbEBnphYe5Fiend6wRjrdqLeMw3ZgvGdYSCGbt94Zf", "fee": 1900000, "feeAssetId": null, "timestamp": 1677793337108, "version": 2, "chainId": 84, "sender": "3N7m9xGD4z7uJNvH1s7U1yyU9FygAyDfgNf", "senderPublicKey": "5xVy1ofqNp5FKaYbUWbxAYDz718ERzA8Eb4RB54ECJV2", "proofs": [ "ScBawo4eeFidMAYLmobrzEkvMGx9TCFXinvj7Tz8MyZwD6phSynJWchH2pJkh9Jkgs9g3xZoQkKh35xWRC7pTfp" ], "script": "base64:BgI4CAISBwoFAQEBCAESBQoDARgBEgUKAwEBCBIHCgUBAQgICBIFCgMBAQgSAwoBCBIDCgEBEgMKAQhmAAlTRVBBUkFUT1ICAl9fAAhLRVlfSU5JVAIESU5JVAAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTABBLRVlfTUlOX1NFQ19ERVBPAgxNSU5fU0VDX0RFUE8ADktFWV9QVU5JU0hNRU5UAgpQVU5JU0hNRU5UABVLRVlfUkVTRVRfQkxPQ0tfREVMVEECEVJFU0VUX0JMT0NLX0RFTFRBAAxLRVlfU0VDX0RFUE8CCFNFQ19ERVBPABhLRVlfUkVXQVJEX1RPS0VOX0FERFJFU1MCFFJFV0FSRF9UT0tFTl9BRERSRVNTABFLRVlfUkVXQVJEX0FNT1VOVAINUkVXQVJEX0FNT1VOVAARS0VZX0NVUlJFTlRfRVBPQ0gCDUNVUlJFTlRfRVBPQ0gAFUtFWV9TSUdORVJTX1BFUl9FUE9DSAIRU0lHTkVSU19QRVJfRVBPQ0gAEEtFWV9FVkVOVF9TVEFUVVMCDEVWRU5UX1NUQVRVUwAJS0VZX0xPQ0tTAgVMT0NLUwAFS0VZX1QCAVQABUtFWV9SAgFSAAVLRVlfUwIBUwANS0VZX1JfU0lHTkVSUwIJUl9TSUdORVJTABVLRVlfRVZFTlRfU1RBUlRfQkxPQ0sCEUVWRU5UX1NUQVJUX0JMT0NLAAtLRVlfUl9TSUdNQQIHUl9TSUdNQQALS0VZX1NfU0lHTUECB1NfU0lHTUEADUtFWV9TX1NJR05FUlMCCVNfU0lHTkVSUwAZS0VZX1NJR05FRF9FVkVOVF9FWEVDVVRPUgIVU0lHTkVEX0VWRU5UX0VYRUNVVE9SAAhLRVlfU0laRQIEU0laRQAORlVOQ19NSU5UX01BTlkCCG1pbnRNYW55ABFFVkVOVF9TVEFUVVNfSU5JVAABABFFVkVOVF9TVEFUVVNfU0lHTgACABFFVkVOVF9TVEFUVVNfRE9ORQADAAdNQVhfSU5UAP//////////fwEQX3ZhbGlkYXRlQWRkcmVzcwIIYWRkcmVzc18EZXJyXwQHJG1hdGNoMAkApggBBQhhZGRyZXNzXwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDl92YWxpZGF0ZUFzc2V0Aghhc3NldElkXwRlcnJfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBD192YWxpZGF0ZVN0cmluZwIEdmFsXwRlcnJfAwkAZwIAAAkAsQIBBQR2YWxfCQACAQUEZXJyXwYBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMJcGF5bWVudHNfB3RhcmdldF8EZXJyXwMJAQIhPQIJAJADAQUJcGF5bWVudHNfBQd0YXJnZXRfCQACAQUEZXJyXwYBFV92YWxpZGF0ZVBheW1lbnRBc3NldAMIcGF5bWVudF8GYXNzZXRfBGVycl8DCQECIT0CCAUIcGF5bWVudF8HYXNzZXRJZAUGYXNzZXRfCQACAQUEZXJyXwYBEl92YWxpZGF0ZVB1YmxpY0tleQIKcHVibGljS2V5XwRlcnJfAwkBAiE9AgkAyAEBCQDZBAEFCnB1YmxpY0tleV8AIAkAAgEFBGVycl8GARNfdmFsaWRhdGVQdWJsaWNLZXlzAgtwdWJsaWNLZXlzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQCUCgIDCAUDYWNjAl8xCQESX3ZhbGlkYXRlUHVibGljS2V5AgUEZWxlbQgFA2FjYwJfMgcIBQNhY2MCXzIEBnJlc3VsdAoAAiRsBQtwdWJsaWNLZXlzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgYFBGVycl8KAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCAUGcmVzdWx0Al8xAQlfbG9hZEluaXQABAckbWF0Y2gwCQCgCAEFCEtFWV9JTklUAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQlfc2F2ZUluaXQBB2lzSW5pdF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCEtFWV9JTklUBQdpc0luaXRfBQNuaWwBDV9sb2FkTXVsdGlzaWcABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQ1fc2F2ZU11bHRpc2lnAQltdWx0aXNpZ18JAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX01VTFRJU0lHCQClCAEFCW11bHRpc2lnXwUDbmlsAQ9fbG9hZE1pblNlY0RlcG8ABAckbWF0Y2gwCQCfCAEFEEtFWV9NSU5fU0VDX0RFUE8DCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABD19zYXZlTWluU2VjRGVwbwEEdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQS0VZX01JTl9TRUNfREVQTwUEdmFsXwUDbmlsAQxfbG9hZFNlY0RlcG8BCGFjY291bnRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBQxLRVlfU0VDX0RFUE8JAMwIAgkApQgBBQhhY2NvdW50XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABDF9zYXZlU2VjRGVwbwIIYWNjb3VudF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFDEtFWV9TRUNfREVQTwkAzAgCCQClCAEFCGFjY291bnRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsAQ9fbG9hZFB1bmlzaG1lbnQABAckbWF0Y2gwCQCfCAEFDktFWV9QVU5JU0hNRU5UAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQ9fc2F2ZVB1bmlzaG1lbnQBBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFDktFWV9QVU5JU0hNRU5UBQR2YWxfBQNuaWwBFF9sb2FkUmVzZXRCbG9ja0RlbHRhAAQHJG1hdGNoMAkAnwgBBRVLRVlfUkVTRVRfQkxPQ0tfREVMVEEDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABFF9zYXZlUmVzZXRCbG9ja0RlbHRhAQR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVLRVlfUkVTRVRfQkxPQ0tfREVMVEEFBHZhbF8FA25pbAEXX2xvYWRSZXdhcmRUb2tlbkFkZHJlc3MABAckbWF0Y2gwCQCiCAEFGEtFWV9SRVdBUkRfVE9LRU5fQUREUkVTUwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARdfc2F2ZVJld2FyZFRva2VuQWRkcmVzcwEEdmFsXwkAzAgCCQELU3RyaW5nRW50cnkCBRhLRVlfUkVXQVJEX1RPS0VOX0FERFJFU1MJAKUIAQUEdmFsXwUDbmlsARFfbG9hZFJld2FyZEFtb3VudAAEByRtYXRjaDAJAJ8IAQURS0VZX1JFV0FSRF9BTU9VTlQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlUmV3YXJkQW1vdW50AQR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFLRVlfUkVXQVJEX0FNT1VOVAUEdmFsXwUDbmlsARFfbG9hZEN1cnJlbnRFcG9jaAEMZXhlY0NoYWluSWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRFLRVlfQ1VSUkVOVF9FUE9DSAkAzAgCCQCkAwEFDGV4ZWNDaGFpbklkXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABEV9zYXZlQ3VycmVudEVwb2NoAgxleGVjQ2hhaW5JZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFEUtFWV9DVVJSRU5UX0VQT0NICQDMCAIJAKQDAQUMZXhlY0NoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgUEdmFsXwUDbmlsAQxfbG9hZFNpZ25lcnMCDGV4ZWNDaGFpbklkXwZlcG9jaF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFFUtFWV9TSUdORVJTX1BFUl9FUE9DSAkAzAgCCQCkAwEFDGV4ZWNDaGFpbklkXwkAzAgCCQCkAwEFBmVwb2NoXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQC1CQIFAWEFCVNFUEFSQVRPUgUDbmlsAQxfc2F2ZVNpZ25lcnMDDGV4ZWNDaGFpbklkXwZlcG9jaF8Ic2lnbmVyc18JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFFUtFWV9TSUdORVJTX1BFUl9FUE9DSAkAzAgCCQCkAwEFDGV4ZWNDaGFpbklkXwkAzAgCCQCkAwEFBmVwb2NoXwUDbmlsBQlTRVBBUkFUT1IJALkJAgUIc2lnbmVyc18FCVNFUEFSQVRPUgUDbmlsARBfbG9hZEV2ZW50U3RhdHVzAQhldmVudElkXwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUQS0VZX0VWRU5UX1NUQVRVUwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEFEUVWRU5UX1NUQVRVU19JTklUARBfc2F2ZUV2ZW50U3RhdHVzAghldmVudElkXwdzdGF0dXNfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUQS0VZX0VWRU5UX1NUQVRVUwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgUHc3RhdHVzXwUDbmlsAQlfbG9hZExvY2sBCnB1YmxpY0tleV8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFCUtFWV9MT0NLUwkAzAgCBQpwdWJsaWNLZXlfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEJX3NhdmVMb2NrAgpwdWJsaWNLZXlfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBQlLRVlfTE9DS1MJAMwIAgUKcHVibGljS2V5XwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEGX2xvYWRUAgxleGVjQ2hhaW5JZF8GZXBvY2hfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBQVLRVlfVAkAzAgCCQCkAwEFDGV4ZWNDaGFpbklkXwkAzAgCCQCkAwEFBmVwb2NoXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABBl9zYXZlVAMMZXhlY0NoYWluSWRfBmVwb2NoXwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUFS0VZX1QJAMwIAgkApAMBBQxleGVjQ2hhaW5JZF8JAMwIAgkApAMBBQZlcG9jaF8FA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBDl9sb2FkUnNCeUV2ZW50AQhldmVudElkXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUFS0VZX1IJAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQC1CQIFAWEFCVNFUEFSQVRPUgUDbmlsAQ5fc2F2ZVJzQnlFdmVudAIIZXZlbnRJZF8DcnNfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBQVLRVlfUgkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgkAuQkCBQNyc18FCVNFUEFSQVRPUgUDbmlsAQ5fbG9hZFNzQnlFdmVudAEIZXZlbnRJZF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFBUtFWV9TCQDMCAIJAKQDAQUIZXZlbnRJZF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkAtQkCBQFhBQlTRVBBUkFUT1IFA25pbAEOX3NhdmVTc0J5RXZlbnQCCGV2ZW50SWRfA3NzXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUFS0VZX1MJAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IJALkJAgUDc3NfBQlTRVBBUkFUT1IFA25pbAESX2xvYWRSU2lnbWFCeUV2ZW50AQhldmVudElkXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgULS0VZX1JfU0lHTUEJAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABEl9zYXZlUlNpZ21hQnlFdmVudAIIZXZlbnRJZF8HclNpZ21hXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgULS0VZX1JfU0lHTUEJAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IFB3JTaWdtYV8FA25pbAESX2xvYWRTU2lnbWFCeUV2ZW50AQhldmVudElkXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgULS0VZX1NfU0lHTUEJAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABEl9zYXZlU1NpZ21hQnlFdmVudAIIZXZlbnRJZF8Hc1NpZ21hXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgULS0VZX1NfU0lHTUEJAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IFB3NTaWdtYV8FA25pbAEWX2xvYWRSQnlFdmVudEFuZFNpZ25lcgIIZXZlbnRJZF8Hc2lnbmVyXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUFS0VZX1IJAMwIAgkApAMBBQhldmVudElkXwkAzAgCBQdzaWduZXJfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEWX3NhdmVSQnlFdmVudEFuZFNpZ25lcgMIZXZlbnRJZF8Hc2lnbmVyXwJyXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUFS0VZX1IJAMwIAgkApAMBBQhldmVudElkXwkAzAgCBQdzaWduZXJfBQNuaWwFCVNFUEFSQVRPUgUCcl8FA25pbAEWX2xvYWRTQnlFdmVudEFuZFNpZ25lcgIIZXZlbnRJZF8Hc2lnbmVyXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUFS0VZX1MJAMwIAgkApAMBBQhldmVudElkXwkAzAgCBQdzaWduZXJfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEWX3NhdmVTQnlFdmVudEFuZFNpZ25lcgMIZXZlbnRJZF8Hc2lnbmVyXwJzXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUFS0VZX1MJAMwIAgkApAMBBQhldmVudElkXwkAzAgCBQdzaWduZXJfBQNuaWwFCVNFUEFSQVRPUgUCc18FA25pbAEYX2xvYWRTaWduZXJzV2l0aFJCeUV2ZW50AQhldmVudElkXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUNS0VZX1JfU0lHTkVSUwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJALUJAgUBYQUJU0VQQVJBVE9SBQNuaWwBGF9zYXZlU2lnbmVyc1dpdGhSQnlFdmVudAIIZXZlbnRJZF8DcnNfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBQ1LRVlfUl9TSUdORVJTCQDMCAIJAKQDAQUIZXZlbnRJZF8FA25pbAUJU0VQQVJBVE9SCQC5CQIFA3JzXwUJU0VQQVJBVE9SBQNuaWwBGF9sb2FkU2lnbmVyc1dpdGhTQnlFdmVudAEIZXZlbnRJZF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFDUtFWV9TX1NJR05FUlMJAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQC1CQIFAWEFCVNFUEFSQVRPUgUDbmlsARhfc2F2ZVNpZ25lcnNXaXRoU0J5RXZlbnQCCGV2ZW50SWRfA3NzXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUNS0VZX1NfU0lHTkVSUwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgkAuQkCBQNzc18FCVNFUEFSQVRPUgUDbmlsARRfbG9hZEV2ZW50U3RhcnRCbG9jawEIZXZlbnRJZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFFUtFWV9FVkVOVF9TVEFSVF9CTE9DSwkAzAgCCQCkAwEFCGV2ZW50SWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEUX3NhdmVFdmVudFN0YXJ0QmxvY2sCCGV2ZW50SWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRVLRVlfRVZFTlRfU1RBUlRfQkxPQ0sJAMwIAgkApAMBBQhldmVudElkXwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAEfX2xvYWRTaWduZWRFdmVudEV4ZWN1dG9ySWR4U2l6ZQERZXhlY3V0aW9uQ2hhaW5JZF8EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFGUtFWV9TSUdORURfRVZFTlRfRVhFQ1VUT1IJAMwIAgkApAMBBRFleGVjdXRpb25DaGFpbklkXwkAzAgCBQhLRVlfU0laRQUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABH19zYXZlU2lnbmVkRXZlbnRFeGVjdXRvcklkeFNpemUCEWV4ZWN1dGlvbkNoYWluSWRfBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIJALkJAgkAzAgCBRlLRVlfU0lHTkVEX0VWRU5UX0VYRUNVVE9SCQDMCAIJAKQDAQURZXhlY3V0aW9uQ2hhaW5JZF8JAMwIAgUIS0VZX1NJWkUFA25pbAUJU0VQQVJBVE9SBQR2YWxfBQNuaWwBG19sb2FkU2lnbmVkRXZlbnRFeGVjdXRvcklkeAIRZXhlY3V0aW9uQ2hhaW5JZF8EaWR4XwQHJG1hdGNoMAkAnwgBCQC5CQIJAMwIAgUZS0VZX1NJR05FRF9FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABG19zYXZlU2lnbmVkRXZlbnRFeGVjdXRvcklkeAMRZXhlY3V0aW9uQ2hhaW5JZF8EaWR4XwR2YWxfCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQC5CQIJAMwIAgUZS0VZX1NJR05FRF9FVkVOVF9FWEVDVVRPUgkAzAgCCQCkAwEFEWV4ZWN1dGlvbkNoYWluSWRfCQDMCAIJAKQDAQUEaWR4XwUDbmlsBQlTRVBBUkFUT1IFBHZhbF8FA25pbAERX29ubHlUaGlzQ29udHJhY3QBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfBQR0aGlzCQACAQIZX29ubHlUaGlzQ29udHJhY3Q6IHJldmVydAYBEF93aGVuTXVsdGlzaWdTZXQAAwkAAAIJAQ1fbG9hZE11bHRpc2lnAAkBB0FkZHJlc3MBAQAJAAIBAhhfd2hlbk11bHRpc2lnU2V0OiByZXZlcnQGARNfd2hlbk5vdEluaXRpYWxpemVkAAMJAQlfbG9hZEluaXQACQACAQIbX3doZW5Ob3RJbml0aWFsaXplZDogcmV2ZXJ0BgEQX3doZW5Jbml0aWFsaXplZAADCQEBIQEJAQlfbG9hZEluaXQACQACAQIYX3doZW5Jbml0aWFsaXplZDogcmV2ZXJ0BgEPX2lzQWN0aXZlU2lnbmVyAwpwdWJsaWNLZXlfC3B1YmxpY0tleXNfBGVycl8DCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQtwdWJsaWNLZXlzXwUKcHVibGljS2V5XwkAAgEFBGVycl8GAQ1fY2hlY2tTZWNEZXBvAgdzaWduZXJfBGVycl8DCQBmAgkBD19sb2FkTWluU2VjRGVwbwAJAQxfbG9hZFNlY0RlcG8BCQCnCAEJANkEAQUHc2lnbmVyXwkAAgEFBGVycl8GARtfY2hlY2tFdmVudFN0YXR1c0ZvclN1Ym1pdFICCGV2ZW50SWRfBGVycl8DCQECIT0CCQEQX2xvYWRFdmVudFN0YXR1cwEFCGV2ZW50SWRfBRFFVkVOVF9TVEFUVVNfSU5JVAkAAgEFBGVycl8GARtfY2hlY2tFdmVudFN0YXR1c0ZvclN1Ym1pdFMCCGV2ZW50SWRfBGVycl8DCQECIT0CCQEQX2xvYWRFdmVudFN0YXR1cwEFCGV2ZW50SWRfBRFFVkVOVF9TVEFUVVNfU0lHTgkAAgEFBGVycl8GARlfY2hlY2tFdmVudFN0YXR1c0ZvclJlc2V0AghldmVudElkXwRlcnJfAwMJAQIhPQIJARBfbG9hZEV2ZW50U3RhdHVzAQUIZXZlbnRJZF8FEUVWRU5UX1NUQVRVU19TSUdOBgkAZwIFBmhlaWdodAkAZAIJARRfbG9hZEV2ZW50U3RhcnRCbG9jawEFCGV2ZW50SWRfCQEUX2xvYWRSZXNldEJsb2NrRGVsdGEACQACAQUEZXJyXwYBD19pbmNyZW1lbnRMb2NrcwEIc2lnbmVyc18KAQhmb2xkRnVuYwIDYWNjBGVsZW0JAM4IAgUDYWNjCQEJX3NhdmVMb2NrAgUEZWxlbQkAZAIJAQlfbG9hZExvY2sBBQRlbGVtAAEKAAIkbAUIc2lnbmVyc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAQtfaXNaZXJvTG9jawIKcHVibGljS2V5XwRlcnJfAwkAZgIJAQlfbG9hZExvY2sBBQpwdWJsaWNLZXlfAAAJAAIBBQRlcnJfBgEOX25vdFN1Ym1pdHRlZFIDCGV2ZW50SWRfB3NpZ25lcl8EZXJyXwMJAQIhPQIJARZfbG9hZFJCeUV2ZW50QW5kU2lnbmVyAgUIZXZlbnRJZF8FB3NpZ25lcl8CAAkAAgEFBGVycl8GAQ5fbm90U3VibWl0dGVkUwMIZXZlbnRJZF8Hc2lnbmVyXwRlcnJfAwkBAiE9AgkBFl9sb2FkU0J5RXZlbnRBbmRTaWduZXICBQhldmVudElkXwUHc2lnbmVyXwIACQACAQUEZXJyXwYBC19zdWJtaXR0ZWRSAwhldmVudElkXwdzaWduZXJfBGVycl8EAXIJARZfbG9hZFJCeUV2ZW50QW5kU2lnbmVyAgUIZXZlbnRJZF8FB3NpZ25lcl8DCQAAAgUBcgIACQACAQUEZXJyXwMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAQ5fbG9hZFJzQnlFdmVudAEFCGV2ZW50SWRfBQFyCQACAQUEZXJyXwYBD19zbGFzaEluY29ycmVjdAINc2lnbmVyc1dpdGhSXw1zaWduZXJzV2l0aFNfBApwdW5pc2htZW50CQEPX2xvYWRQdW5pc2htZW50AAoBCGZvbGRGdW5jAgNhY2MEZWxlbQMJAQ9jb250YWluc0VsZW1lbnQCBQ1zaWduZXJzV2l0aFNfBQRlbGVtCQCVCgMIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgUEZWxlbQgFA2FjYwJfMwQNc2lnbmVyQWRkcmVzcwkApwgBCQDZBAEFBGVsZW0JAJUKAwkAzggCCAUDYWNjAl8xCQEMX3NhdmVTZWNEZXBvAgUNc2lnbmVyQWRkcmVzcwkAZQIJAQxfbG9hZFNlY0RlcG8BBQ1zaWduZXJBZGRyZXNzBQpwdW5pc2htZW50CAUDYWNjAl8yCQBkAggFA2FjYwJfMwUKcHVuaXNobWVudAoAAiRsBQ1zaWduZXJzV2l0aFJfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgESX2NvbXBlbnNhdGVDb3JyZWN0AghzaWduZXJzXw1jb21wZW5zYXRpb25fBAlwZXJTaWduZXIJAGkCBQ1jb21wZW5zYXRpb25fCQCQAwEFCHNpZ25lcnNfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQDNCAIFA2FjYwkBDlNjcmlwdFRyYW5zZmVyAwkApwgBCQDZBAEFBGVsZW0FCXBlclNpZ25lcgUEdW5pdAoAAiRsBQhzaWduZXJzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBFV9wdWJsaWNLZXlzVG9BZGRyc1N0cgELcHVibGljS2V5c18KAQhmb2xkZnVuYwIEYWNjXwVlbGVtXwkAzQgCBQRhY2NfCQClCAEJAKcIAQkA2QQBBQVlbGVtXwoAAiRsBQtwdWJsaWNLZXlzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZGZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUxCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzCAFpAQRpbml0BQttaW5TZWNEZXBvXwtwdW5pc2htZW50XxByZXNldEJsb2NrRGVsdGFfE3Jld2FyZFRva2VuQWRkcmVzc18NcmV3YXJkQW1vdW50XwQDZXJyAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQETX3doZW5Ob3RJbml0aWFsaXplZAAHCQEQX3doZW5NdWx0aXNpZ1NldAAHCQEMX3ZhbGlkYXRlSW50BAULbWluU2VjRGVwb18FC3B1bmlzaG1lbnRfBQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIG1pblNlY0RlcG8HCQEMX3ZhbGlkYXRlSW50BAULcHVuaXNobWVudF8AAAUHTUFYX0lOVAIYaW5pdDogaW52YWxpZCBwdW5pc2htZW50BwkBDF92YWxpZGF0ZUludAQFEHJlc2V0QmxvY2tEZWx0YV8AAAUHTUFYX0lOVAIdaW5pdDogaW52YWxpZCByZXNldEJsb2NrRGVsdGEHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFE3Jld2FyZFRva2VuQWRkcmVzc18CIGluaXQ6IGludmFsaWQgcmV3YXJkVG9rZW5BZGRyZXNzBwkBDF92YWxpZGF0ZUludAQFDXJld2FyZEFtb3VudF8AAAUHTUFYX0lOVAIaaW5pdDogaW52YWxpZCByZXdhcmRBbW91bnQHAwkAAAIFA2VycgUDZXJyCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQEJX3NhdmVJbml0AQYJAQ9fc2F2ZU1pblNlY0RlcG8BBQttaW5TZWNEZXBvXwkBD19zYXZlUHVuaXNobWVudAEFC3B1bmlzaG1lbnRfCQEUX3NhdmVSZXNldEJsb2NrRGVsdGEBBRByZXNldEJsb2NrRGVsdGFfCQEXX3NhdmVSZXdhcmRUb2tlbkFkZHJlc3MBCQERQGV4dHJOYXRpdmUoMTA2MikBBRNyZXdhcmRUb2tlbkFkZHJlc3NfCQERX3NhdmVSZXdhcmRBbW91bnQBBQ1yZXdhcmRBbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEHNldEFjdGl2ZVNpZ25lcnMDDGV4ZWNDaGFpbklkXwhzaWduZXJzXwJ0XwQDZXJyAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARNfdmFsaWRhdGVQdWJsaWNLZXlzAgUIc2lnbmVyc18CIXNldEFjdGl2ZVNpZ25lcnM6IGludmFsaWQgc2lnbmVycwcJAQxfdmFsaWRhdGVJbnQEBQJ0XwACCQCQAwEFCHNpZ25lcnNfAhtzZXRBY3RpdmVTaWduZXJzOiBpbnZhbGlkIFQHAwkAAAIFA2VycgUDZXJyBAVlcG9jaAkBEV9sb2FkQ3VycmVudEVwb2NoAQUMZXhlY0NoYWluSWRfCQCUCgIJAM4IAgkAzggCCQDOCAIJARFfc2F2ZUN1cnJlbnRFcG9jaAIFDGV4ZWNDaGFpbklkXwkAZAIFBWVwb2NoAAEJAQZfc2F2ZVQDBQxleGVjQ2hhaW5JZF8JAGQCBQVlcG9jaAABBQJ0XwkBDF9zYXZlU2lnbmVycwMFDGV4ZWNDaGFpbklkXwkAZAIFBWVwb2NoAAEFCHNpZ25lcnNfCQEPX2luY3JlbWVudExvY2tzAQUIc2lnbmVyc18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHc3VibWl0UgMIZXZlbnRJZF8MZXhlY0NoYWluSWRfAnJfBA9jYWxsZXJQdWJsaWNLZXkJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BAVlcG9jaAkBEV9sb2FkQ3VycmVudEVwb2NoAQUMZXhlY0NoYWluSWRfBAF0CQEGX2xvYWRUAgUMZXhlY0NoYWluSWRfBQVlcG9jaAQDZXJyAwMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEMX3ZhbGlkYXRlSW50BAUIZXZlbnRJZF8AAAUHTUFYX0lOVAIYc3VibWl0UjogaW52YWxpZCBldmVudElkBwkBDF92YWxpZGF0ZUludAQFDGV4ZWNDaGFpbklkXwAABQdNQVhfSU5UAhxzdWJtaXRSOiBpbnZhbGlkIGV4ZWNDaGFpbklkBwkBD192YWxpZGF0ZVN0cmluZwIFAnJfAhJzdWJtaXRSOiBpbnZhbGlkIHIHCQEPX2lzQWN0aXZlU2lnbmVyAwUPY2FsbGVyUHVibGljS2V5CQEMX2xvYWRTaWduZXJzAgUMZXhlY0NoYWluSWRfBQVlcG9jaAITc3VibWl0Ujogbm90IGFjdGl2ZQcJAQ1fY2hlY2tTZWNEZXBvAgUPY2FsbGVyUHVibGljS2V5AiRzdWJtaXRSOiBub3QgZW5vdWdoIHNlY3VyaXR5IGRlcG9zaXQHCQEbX2NoZWNrRXZlbnRTdGF0dXNGb3JTdWJtaXRSAgUIZXZlbnRJZF8CHXN1Ym1pdFI6IGludmFsaWQgZXZlbnQgc3RhdHVzBwkBDl9ub3RTdWJtaXR0ZWRSAwUIZXZlbnRJZF8FD2NhbGxlclB1YmxpY0tleQIac3VibWl0UjogYWxyZWFkeSBzdWJtaXR0ZWQHAwkAAAIFA2VycgUDZXJyBAZyQXJyYXkJAQ5fbG9hZFJzQnlFdmVudAEFCGV2ZW50SWRfBAxzaWduZXJzQXJyYXkJARhfbG9hZFNpZ25lcnNXaXRoUkJ5RXZlbnQBBQhldmVudElkXwQSZXZlbnRTdGF0dXNBY3Rpb25zAwkAAAIJAGQCCQCQAwEFBnJBcnJheQABBQF0CQDOCAIJARBfc2F2ZUV2ZW50U3RhdHVzAgUIZXZlbnRJZF8FEUVWRU5UX1NUQVRVU19TSUdOCQEUX3NhdmVFdmVudFN0YXJ0QmxvY2sCBQhldmVudElkXwUGaGVpZ2h0BQNuaWwJAJQKAgkAzggCCQDOCAIJAM4IAgkBDl9zYXZlUnNCeUV2ZW50AgUIZXZlbnRJZF8JAM0IAgUGckFycmF5BQJyXwkBFl9zYXZlUkJ5RXZlbnRBbmRTaWduZXIDBQhldmVudElkXwUPY2FsbGVyUHVibGljS2V5BQJyXwkBGF9zYXZlU2lnbmVyc1dpdGhSQnlFdmVudAIFCGV2ZW50SWRfCQDNCAIFDHNpZ25lcnNBcnJheQUPY2FsbGVyUHVibGljS2V5BRJldmVudFN0YXR1c0FjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHc3VibWl0UwUIZXZlbnRJZF8MZXhlY0NoYWluSWRfB3JTaWdtYV8Cc18Hc1NpZ21hXwQPY2FsbGVyUHVibGljS2V5CQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQQFZXBvY2gJARFfbG9hZEN1cnJlbnRFcG9jaAEFDGV4ZWNDaGFpbklkXwQBdAkBBl9sb2FkVAIFDGV4ZWNDaGFpbklkXwUFZXBvY2gEA2VycgMDAwMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEMX3ZhbGlkYXRlSW50BAUIZXZlbnRJZF8AAAUHTUFYX0lOVAIYc3VibWl0UzogaW52YWxpZCBldmVudElkBwkBDF92YWxpZGF0ZUludAQFDGV4ZWNDaGFpbklkXwAABQdNQVhfSU5UAhxzdWJtaXRTOiBpbnZhbGlkIGV4ZWNDaGFpbklkBwkBD192YWxpZGF0ZVN0cmluZwIFB3JTaWdtYV8CGHN1Ym1pdFM6IGludmFsaWQgciBzaWdtYQcJAQ9fdmFsaWRhdGVTdHJpbmcCBQJzXwISc3VibWl0UzogaW52YWxpZCBzBwkBD19pc0FjdGl2ZVNpZ25lcgMFD2NhbGxlclB1YmxpY0tleQkBDF9sb2FkU2lnbmVycwIFDGV4ZWNDaGFpbklkXwUFZXBvY2gCE3N1Ym1pdFM6IG5vdCBhY3RpdmUHCQENX2NoZWNrU2VjRGVwbwIFD2NhbGxlclB1YmxpY0tleQIkc3VibWl0Uzogbm90IGVub3VnaCBzZWN1cml0eSBkZXBvc2l0BwkBG19jaGVja0V2ZW50U3RhdHVzRm9yU3VibWl0UwIFCGV2ZW50SWRfAh1zdWJtaXRTOiBpbnZhbGlkIGV2ZW50IHN0YXR1cwcJAQ5fbm90U3VibWl0dGVkUwMFCGV2ZW50SWRfBQ9jYWxsZXJQdWJsaWNLZXkCGnN1Ym1pdFM6IGFscmVhZHkgc3VibWl0dGVkBwkBC19zdWJtaXR0ZWRSAwUIZXZlbnRJZF8FD2NhbGxlclB1YmxpY0tleQIbc3VibWl0UzogUiBpcyBub3Qgc3VibWl0dGVkBwMJAAACBQNlcnIFA2VycgQGc0FycmF5CQEOX2xvYWRTc0J5RXZlbnQBBQhldmVudElkXwQMc2lnbmVyc0FycmF5CQEYX2xvYWRTaWduZXJzV2l0aFNCeUV2ZW50AQUIZXZlbnRJZF8EEmV2ZW50U3RhdHVzQWN0aW9ucwMJAAACCQBkAgkAkAMBBQZzQXJyYXkAAQUBdAQEZXJyMQkBD192YWxpZGF0ZVN0cmluZwIFB3NTaWdtYV8CGHN1Ym1pdFM6IGludmFsaWQgcyBzaWdtYQMJAAACBQRlcnIxBQRlcnIxBA9leGVjdXRvcklkeFNpemUJAR9fbG9hZFNpZ25lZEV2ZW50RXhlY3V0b3JJZHhTaXplAQUMZXhlY0NoYWluSWRfBA9yZXdhcmRBZGRyZXNzZXMJARVfcHVibGljS2V5c1RvQWRkcnNTdHIBCQDNCAIFDHNpZ25lcnNBcnJheQUPY2FsbGVyUHVibGljS2V5BA5zaWduZXJzUmV3YXJkcwkA/AcECQEXX2xvYWRSZXdhcmRUb2tlbkFkZHJlc3MABQ5GVU5DX01JTlRfTUFOWQkAzAgCCQERX2xvYWRSZXdhcmRBbW91bnQACQDMCAIFD3Jld2FyZEFkZHJlc3NlcwUDbmlsBQNuaWwDCQAAAgUOc2lnbmVyc1Jld2FyZHMFDnNpZ25lcnNSZXdhcmRzCQDOCAIJAM4IAgkAzggCCQEQX3NhdmVFdmVudFN0YXR1cwIFCGV2ZW50SWRfBRFFVkVOVF9TVEFUVVNfRE9ORQkBG19zYXZlU2lnbmVkRXZlbnRFeGVjdXRvcklkeAMFDGV4ZWNDaGFpbklkXwUPZXhlY3V0b3JJZHhTaXplBQhldmVudElkXwkBH19zYXZlU2lnbmVkRXZlbnRFeGVjdXRvcklkeFNpemUCBQxleGVjQ2hhaW5JZF8JAGQCBQ9leGVjdXRvcklkeFNpemUAAQkBEl9zYXZlU1NpZ21hQnlFdmVudAIFCGV2ZW50SWRfBQdzU2lnbWFfCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQEOX3NhdmVTc0J5RXZlbnQCBQhldmVudElkXwkAzQgCBQZzQXJyYXkFAnNfCQEWX3NhdmVTQnlFdmVudEFuZFNpZ25lcgMFCGV2ZW50SWRfBQ9jYWxsZXJQdWJsaWNLZXkFAnNfCQEYX3NhdmVTaWduZXJzV2l0aFNCeUV2ZW50AgUIZXZlbnRJZF8JAM0IAgUMc2lnbmVyc0FycmF5BQ9jYWxsZXJQdWJsaWNLZXkJARJfc2F2ZVJTaWdtYUJ5RXZlbnQCBQhldmVudElkXwUHclNpZ21hXwUSZXZlbnRTdGF0dXNBY3Rpb25zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXJlc2V0AwhldmVudElkXwxleGVjQ2hhaW5JZF8Ccl8ED2NhbGxlclB1YmxpY0tleQkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkEBWVwb2NoCQERX2xvYWRDdXJyZW50RXBvY2gBBQxleGVjQ2hhaW5JZF8EA2VycgMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEMX3ZhbGlkYXRlSW50BAUIZXZlbnRJZF8AAAUHTUFYX0lOVAIWcmVzZXQ6IGludmFsaWQgZXZlbnRJZAcJAQxfdmFsaWRhdGVJbnQEBQxleGVjQ2hhaW5JZF8AAAUHTUFYX0lOVAIacmVzZXQ6IGludmFsaWQgZXhlY0NoYWluSWQHCQEPX3ZhbGlkYXRlU3RyaW5nAgUCcl8CEHJlc2V0OiBpbnZhbGlkIHIHCQEPX2lzQWN0aXZlU2lnbmVyAwUPY2FsbGVyUHVibGljS2V5CQEMX2xvYWRTaWduZXJzAgUMZXhlY0NoYWluSWRfBQVlcG9jaAIRcmVzZXQ6IG5vdCBhY3RpdmUHCQENX2NoZWNrU2VjRGVwbwIFD2NhbGxlclB1YmxpY0tleQIicmVzZXQ6IG5vdCBlbm91Z2ggc2VjdXJpdHkgZGVwb3NpdAcJARlfY2hlY2tFdmVudFN0YXR1c0ZvclJlc2V0AgUIZXZlbnRJZF8CG3Jlc2V0OiBpbnZhbGlkIGV2ZW50IHN0YXR1cwcDCQAAAgUDZXJyBQNlcnIEC3NsYXNoQW1vdW50AAAEDHNpZ25lcnNXaXRoUgkBGF9sb2FkU2lnbmVyc1dpdGhSQnlFdmVudAEFCGV2ZW50SWRfBAxzaWduZXJzV2l0aFMJARhfbG9hZFNpZ25lcnNXaXRoU0J5RXZlbnQBBQhldmVudElkXwQGcmVzdWx0CQEPX3NsYXNoSW5jb3JyZWN0AgUMc2lnbmVyc1dpdGhSBQxzaWduZXJzV2l0aFMED3NsYXNoaW5nQWN0aW9ucwgFBnJlc3VsdAJfMQQSY29tcGVuc2F0ZWRTaWduZXJzCAUGcmVzdWx0Al8yBAxjb21wZW5zYXRpb24IBQZyZXN1bHQCXzMEE2NvbXBlbnNhdGlvbkFjdGlvbnMJARJfY29tcGVuc2F0ZUNvcnJlY3QCBRJjb21wZW5zYXRlZFNpZ25lcnMFDGNvbXBlbnNhdGlvbgkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAQ5fc2F2ZVJzQnlFdmVudAIFCGV2ZW50SWRfCQDMCAIFAnJfBQNuaWwJARZfc2F2ZVJCeUV2ZW50QW5kU2lnbmVyAwUIZXZlbnRJZF8FD2NhbGxlclB1YmxpY0tleQUCcl8JARhfc2F2ZVNpZ25lcnNXaXRoUkJ5RXZlbnQCBQhldmVudElkXwkAzAgCBQ9jYWxsZXJQdWJsaWNLZXkFA25pbAkBEl9zYXZlUlNpZ21hQnlFdmVudAIFCGV2ZW50SWRfAgAJARJfc2F2ZVNTaWdtYUJ5RXZlbnQCBQhldmVudElkXwIACQEQX3NhdmVFdmVudFN0YXR1cwIFCGV2ZW50SWRfBRFFVkVOVF9TVEFUVVNfSU5JVAUPc2xhc2hpbmdBY3Rpb25zBRNjb21wZW5zYXRpb25BY3Rpb25zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEmFkZFNlY3VyaXR5RGVwb3NpdAEKcmVjaXBpZW50XwQJcmVjaXBpZW50AwkAAAIFCnJlY2lwaWVudF8CAAkApQgBCAUBaQZjYWxsZXIFCnJlY2lwaWVudF8EA2VycgMDCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCXJlY2lwaWVudAIlYWRkU2VjdXJpdHlEZXBvc2l0OiBpbnZhbGlkIHJlY2lwaWVudAkBFV92YWxpZGF0ZVBheW1lbnRzU2l6ZQMIBQFpCHBheW1lbnRzAAECHmFkZFNlY3VyaXR5RGVwb3NpdDogbm8gcGF5bWVudAcJARVfdmFsaWRhdGVQYXltZW50QXNzZXQDCQCRAwIIBQFpCHBheW1lbnRzAAAFBHVuaXQCIWFkZFNlY3VyaXR5RGVwb3NpdDogaW52YWxpZCBhc3NldAcDCQAAAgUDZXJyBQNlcnIEDXJlY2lwaWVudEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXJlY2lwaWVudAQHYmFsYW5jZQkBDF9sb2FkU2VjRGVwbwEFDXJlY2lwaWVudEFkZHIEDnVwZGF0ZWRCYWxhbmNlCQBkAgUHYmFsYW5jZQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAJQKAgkBDF9zYXZlU2VjRGVwbwIFDXJlY2lwaWVudEFkZHIFDnVwZGF0ZWRCYWxhbmNlBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnN1YlNlY3VyaXR5RGVwb3NpdAEHYW1vdW50XwQHYmFsYW5jZQkBDF9sb2FkU2VjRGVwbwEIBQFpBmNhbGxlcgQDZXJyAwkBC19pc1plcm9Mb2NrAgkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkCGnN1YlNlY3VyaXR5RGVwb3NpdDogbG9ja2VkAwkAZgIFB2Ftb3VudF8FB2JhbGFuY2UJAAIBAihzdWJTZWN1cml0eURlcG9zaXQ6IGluc3VmZmljaWVudCBiYWxhbmNlBgcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQEMX3NhdmVTZWNEZXBvAggFAWkGY2FsbGVyCQBlAgUHYmFsYW5jZQUHYW1vdW50XwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FBHVuaXQFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzZXRNdWx0aXNpZwEJbXVsdGlzaWdfBANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfdmFsaWRhdGVBZGRyZXNzAgUJbXVsdGlzaWdfAiVzZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZyBhZGRyZXNzBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQlTRVBBUkFUT1IHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5SoVaew==", "height": 2472998, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 9iRCKULuSrgreEPfNpnpvnr5LiijwDkJ26QDeQRCGxgx Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEPARATOR = "__"
5+
6+let KEY_INIT = "INIT"
7+
8+let KEY_MULTISIG = "MULTISIG"
9+
10+let KEY_STATUS = "STATUS"
11+
12+let KEY_MIN_SEC_DEPO = "MIN_SEC_DEPO"
13+
14+let KEY_PUNISHMENT = "PUNISHMENT"
15+
16+let KEY_RESET_BLOCK_DELTA = "RESET_BLOCK_DELTA"
17+
18+let KEY_SEC_DEPO = "SEC_DEPO"
19+
20+let KEY_REWARD_TOKEN_ADDRESS = "REWARD_TOKEN_ADDRESS"
21+
22+let KEY_REWARD_AMOUNT = "REWARD_AMOUNT"
23+
24+let KEY_CURRENT_EPOCH = "CURRENT_EPOCH"
25+
26+let KEY_SIGNERS_PER_EPOCH = "SIGNERS_PER_EPOCH"
27+
28+let KEY_EVENT_STATUS = "EVENT_STATUS"
29+
30+let KEY_LOCKS = "LOCKS"
31+
32+let KEY_T = "T"
33+
34+let KEY_R = "R"
35+
36+let KEY_S = "S"
37+
38+let KEY_R_SIGNERS = "R_SIGNERS"
39+
40+let KEY_EVENT_START_BLOCK = "EVENT_START_BLOCK"
41+
42+let KEY_R_SIGMA = "R_SIGMA"
43+
44+let KEY_S_SIGMA = "S_SIGMA"
45+
46+let KEY_S_SIGNERS = "S_SIGNERS"
47+
48+let KEY_SIGNED_EVENT_EXECUTOR = "SIGNED_EVENT_EXECUTOR"
49+
50+let KEY_SIZE = "SIZE"
51+
52+let FUNC_MINT_MANY = "mintMany"
53+
54+let EVENT_STATUS_INIT = 1
55+
56+let EVENT_STATUS_SIGN = 2
57+
58+let EVENT_STATUS_DONE = 3
59+
60+let MAX_INT = 9223372036854775807
61+
62+func _validateAddress (address_,err_) = match addressFromString(address_) {
63+ case a: Address =>
64+ true
65+ case _ =>
66+ throw(err_)
67+}
68+
69+
70+func _validateAsset (assetId_,err_) = match assetInfo(fromBase58String(assetId_)) {
71+ case a: Asset =>
72+ true
73+ case _ =>
74+ throw(err_)
75+}
76+
77+
78+func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
79+ then true
80+ else (val_ > upperBoundary_))
81+ then throw(err_)
82+ else true
83+
84+
85+func _validateString (val_,err_) = if ((0 >= size(val_)))
86+ then throw(err_)
87+ else true
88+
89+
90+func _validatePaymentsSize (payments_,target_,err_) = if ((size(payments_) != target_))
91+ then throw(err_)
92+ else true
93+
94+
95+func _validatePaymentAsset (payment_,asset_,err_) = if ((payment_.assetId != asset_))
96+ then throw(err_)
97+ else true
98+
99+
100+func _validatePublicKey (publicKey_,err_) = if ((size(fromBase58String(publicKey_)) != 32))
101+ then throw(err_)
102+ else true
103+
104+
105+func _validatePublicKeys (publicKeys_,err_) = {
106+ func foldFunc (acc,elem) = $Tuple2(if (acc._1)
107+ then _validatePublicKey(elem, acc._2)
108+ else false, acc._2)
109+
110+ let result = {
111+ let $l = publicKeys_
112+ let $s = size($l)
113+ let $acc0 = $Tuple2(true, err_)
114+ func $f0_1 ($a,$i) = if (($i >= $s))
115+ then $a
116+ else foldFunc($a, $l[$i])
117+
118+ func $f0_2 ($a,$i) = if (($i >= $s))
119+ then $a
120+ else throw("List size exceeds 10")
121+
122+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
123+ }
124+ result._1
125+ }
126+
127+
128+func _loadInit () = match getBoolean(KEY_INIT) {
129+ case a: Boolean =>
130+ a
131+ case _ =>
132+ false
133+}
134+
135+
136+func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
137+
138+
139+func _loadMultisig () = match getString(KEY_MULTISIG) {
140+ case a: String =>
141+ addressFromStringValue(a)
142+ case _ =>
143+ Address(base58'')
144+}
145+
146+
147+func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
148+
149+
150+func _loadMinSecDepo () = match getInteger(KEY_MIN_SEC_DEPO) {
151+ case a: Int =>
152+ a
153+ case _ =>
154+ 0
155+}
156+
157+
158+func _saveMinSecDepo (val_) = [IntegerEntry(KEY_MIN_SEC_DEPO, val_)]
159+
160+
161+func _loadSecDepo (account_) = match getInteger(makeString([KEY_SEC_DEPO, toString(account_)], SEPARATOR)) {
162+ case a: Int =>
163+ a
164+ case _ =>
165+ 0
166+}
167+
168+
169+func _saveSecDepo (account_,val_) = [IntegerEntry(makeString([KEY_SEC_DEPO, toString(account_)], SEPARATOR), val_)]
170+
171+
172+func _loadPunishment () = match getInteger(KEY_PUNISHMENT) {
173+ case a: Int =>
174+ a
175+ case _ =>
176+ 0
177+}
178+
179+
180+func _savePunishment (val_) = [IntegerEntry(KEY_PUNISHMENT, val_)]
181+
182+
183+func _loadResetBlockDelta () = match getInteger(KEY_RESET_BLOCK_DELTA) {
184+ case a: Int =>
185+ a
186+ case _ =>
187+ 0
188+}
189+
190+
191+func _saveResetBlockDelta (val_) = [IntegerEntry(KEY_RESET_BLOCK_DELTA, val_)]
192+
193+
194+func _loadRewardTokenAddress () = match getString(KEY_REWARD_TOKEN_ADDRESS) {
195+ case a: String =>
196+ addressFromStringValue(a)
197+ case _ =>
198+ Address(base58'')
199+}
200+
201+
202+func _saveRewardTokenAddress (val_) = [StringEntry(KEY_REWARD_TOKEN_ADDRESS, toString(val_))]
203+
204+
205+func _loadRewardAmount () = match getInteger(KEY_REWARD_AMOUNT) {
206+ case a: Int =>
207+ a
208+ case _ =>
209+ 0
210+}
211+
212+
213+func _saveRewardAmount (val_) = [IntegerEntry(KEY_REWARD_AMOUNT, val_)]
214+
215+
216+func _loadCurrentEpoch (execChainId_) = match getInteger(makeString([KEY_CURRENT_EPOCH, toString(execChainId_)], SEPARATOR)) {
217+ case a: Int =>
218+ a
219+ case _ =>
220+ 0
221+}
222+
223+
224+func _saveCurrentEpoch (execChainId_,val_) = [IntegerEntry(makeString([KEY_CURRENT_EPOCH, toString(execChainId_)], SEPARATOR), val_)]
225+
226+
227+func _loadSigners (execChainId_,epoch_) = match getString(makeString([KEY_SIGNERS_PER_EPOCH, toString(execChainId_), toString(epoch_)], SEPARATOR)) {
228+ case a: String =>
229+ split(a, SEPARATOR)
230+ case _ =>
231+ nil
232+}
233+
234+
235+func _saveSigners (execChainId_,epoch_,signers_) = [StringEntry(makeString([KEY_SIGNERS_PER_EPOCH, toString(execChainId_), toString(epoch_)], SEPARATOR), makeString(signers_, SEPARATOR))]
236+
237+
238+func _loadEventStatus (eventId_) = match getInteger(makeString([KEY_EVENT_STATUS, toString(eventId_)], SEPARATOR)) {
239+ case a: Int =>
240+ a
241+ case _ =>
242+ EVENT_STATUS_INIT
243+}
244+
245+
246+func _saveEventStatus (eventId_,status_) = [IntegerEntry(makeString([KEY_EVENT_STATUS, toString(eventId_)], SEPARATOR), status_)]
247+
248+
249+func _loadLock (publicKey_) = match getInteger(makeString([KEY_LOCKS, publicKey_], SEPARATOR)) {
250+ case a: Int =>
251+ a
252+ case _ =>
253+ 0
254+}
255+
256+
257+func _saveLock (publicKey_,val_) = [IntegerEntry(makeString([KEY_LOCKS, publicKey_], SEPARATOR), val_)]
258+
259+
260+func _loadT (execChainId_,epoch_) = match getInteger(makeString([KEY_T, toString(execChainId_), toString(epoch_)], SEPARATOR)) {
261+ case a: Int =>
262+ a
263+ case _ =>
264+ 0
265+}
266+
267+
268+func _saveT (execChainId_,epoch_,val_) = [IntegerEntry(makeString([KEY_T, toString(execChainId_), toString(epoch_)], SEPARATOR), val_)]
269+
270+
271+func _loadRsByEvent (eventId_) = match getString(makeString([KEY_R, toString(eventId_)], SEPARATOR)) {
272+ case a: String =>
273+ split(a, SEPARATOR)
274+ case _ =>
275+ nil
276+}
277+
278+
279+func _saveRsByEvent (eventId_,rs_) = [StringEntry(makeString([KEY_R, toString(eventId_)], SEPARATOR), makeString(rs_, SEPARATOR))]
280+
281+
282+func _loadSsByEvent (eventId_) = match getString(makeString([KEY_S, toString(eventId_)], SEPARATOR)) {
283+ case a: String =>
284+ split(a, SEPARATOR)
285+ case _ =>
286+ nil
287+}
288+
289+
290+func _saveSsByEvent (eventId_,ss_) = [StringEntry(makeString([KEY_S, toString(eventId_)], SEPARATOR), makeString(ss_, SEPARATOR))]
291+
292+
293+func _loadRSigmaByEvent (eventId_) = match getString(makeString([KEY_R_SIGMA, toString(eventId_)], SEPARATOR)) {
294+ case a: String =>
295+ a
296+ case _ =>
297+ ""
298+}
299+
300+
301+func _saveRSigmaByEvent (eventId_,rSigma_) = [StringEntry(makeString([KEY_R_SIGMA, toString(eventId_)], SEPARATOR), rSigma_)]
302+
303+
304+func _loadSSigmaByEvent (eventId_) = match getString(makeString([KEY_S_SIGMA, toString(eventId_)], SEPARATOR)) {
305+ case a: String =>
306+ a
307+ case _ =>
308+ ""
309+}
310+
311+
312+func _saveSSigmaByEvent (eventId_,sSigma_) = [StringEntry(makeString([KEY_S_SIGMA, toString(eventId_)], SEPARATOR), sSigma_)]
313+
314+
315+func _loadRByEventAndSigner (eventId_,signer_) = match getString(makeString([KEY_R, toString(eventId_), signer_], SEPARATOR)) {
316+ case a: String =>
317+ a
318+ case _ =>
319+ ""
320+}
321+
322+
323+func _saveRByEventAndSigner (eventId_,signer_,r_) = [StringEntry(makeString([KEY_R, toString(eventId_), signer_], SEPARATOR), r_)]
324+
325+
326+func _loadSByEventAndSigner (eventId_,signer_) = match getString(makeString([KEY_S, toString(eventId_), signer_], SEPARATOR)) {
327+ case a: String =>
328+ a
329+ case _ =>
330+ ""
331+}
332+
333+
334+func _saveSByEventAndSigner (eventId_,signer_,s_) = [StringEntry(makeString([KEY_S, toString(eventId_), signer_], SEPARATOR), s_)]
335+
336+
337+func _loadSignersWithRByEvent (eventId_) = match getString(makeString([KEY_R_SIGNERS, toString(eventId_)], SEPARATOR)) {
338+ case a: String =>
339+ split(a, SEPARATOR)
340+ case _ =>
341+ nil
342+}
343+
344+
345+func _saveSignersWithRByEvent (eventId_,rs_) = [StringEntry(makeString([KEY_R_SIGNERS, toString(eventId_)], SEPARATOR), makeString(rs_, SEPARATOR))]
346+
347+
348+func _loadSignersWithSByEvent (eventId_) = match getString(makeString([KEY_S_SIGNERS, toString(eventId_)], SEPARATOR)) {
349+ case a: String =>
350+ split(a, SEPARATOR)
351+ case _ =>
352+ nil
353+}
354+
355+
356+func _saveSignersWithSByEvent (eventId_,ss_) = [StringEntry(makeString([KEY_S_SIGNERS, toString(eventId_)], SEPARATOR), makeString(ss_, SEPARATOR))]
357+
358+
359+func _loadEventStartBlock (eventId_) = match getInteger(makeString([KEY_EVENT_START_BLOCK, toString(eventId_)], SEPARATOR)) {
360+ case a: Int =>
361+ a
362+ case _ =>
363+ 0
364+}
365+
366+
367+func _saveEventStartBlock (eventId_,val_) = [IntegerEntry(makeString([KEY_EVENT_START_BLOCK, toString(eventId_)], SEPARATOR), val_)]
368+
369+
370+func _loadSignedEventExecutorIdxSize (executionChainId_) = match getInteger(makeString([KEY_SIGNED_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR)) {
371+ case a: Int =>
372+ a
373+ case _ =>
374+ 0
375+}
376+
377+
378+func _saveSignedEventExecutorIdxSize (executionChainId_,val_) = [IntegerEntry(makeString([KEY_SIGNED_EVENT_EXECUTOR, toString(executionChainId_), KEY_SIZE], SEPARATOR), val_)]
379+
380+
381+func _loadSignedEventExecutorIdx (executionChainId_,idx_) = match getInteger(makeString([KEY_SIGNED_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR)) {
382+ case a: Int =>
383+ a
384+ case _ =>
385+ 0
386+}
387+
388+
389+func _saveSignedEventExecutorIdx (executionChainId_,idx_,val_) = [IntegerEntry(makeString([KEY_SIGNED_EVENT_EXECUTOR, toString(executionChainId_), toString(idx_)], SEPARATOR), val_)]
390+
391+
392+func _onlyThisContract (caller_) = if ((caller_ != this))
393+ then throw("_onlyThisContract: revert")
394+ else true
395+
396+
397+func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
398+ then throw("_whenMultisigSet: revert")
399+ else true
400+
401+
402+func _whenNotInitialized () = if (_loadInit())
403+ then throw("_whenNotInitialized: revert")
404+ else true
405+
406+
407+func _whenInitialized () = if (!(_loadInit()))
408+ then throw("_whenInitialized: revert")
409+ else true
410+
411+
412+func _isActiveSigner (publicKey_,publicKeys_,err_) = if (!(containsElement(publicKeys_, publicKey_)))
413+ then throw(err_)
414+ else true
415+
416+
417+func _checkSecDepo (signer_,err_) = if ((_loadMinSecDepo() > _loadSecDepo(addressFromPublicKey(fromBase58String(signer_)))))
418+ then throw(err_)
419+ else true
420+
421+
422+func _checkEventStatusForSubmitR (eventId_,err_) = if ((_loadEventStatus(eventId_) != EVENT_STATUS_INIT))
423+ then throw(err_)
424+ else true
425+
426+
427+func _checkEventStatusForSubmitS (eventId_,err_) = if ((_loadEventStatus(eventId_) != EVENT_STATUS_SIGN))
428+ then throw(err_)
429+ else true
430+
431+
432+func _checkEventStatusForReset (eventId_,err_) = if (if ((_loadEventStatus(eventId_) != EVENT_STATUS_SIGN))
433+ then true
434+ else (height >= (_loadEventStartBlock(eventId_) + _loadResetBlockDelta())))
435+ then throw(err_)
436+ else true
437+
438+
439+func _incrementLocks (signers_) = {
440+ func foldFunc (acc,elem) = (acc ++ _saveLock(elem, (_loadLock(elem) + 1)))
441+
442+ let $l = signers_
443+ let $s = size($l)
444+ let $acc0 = nil
445+ func $f0_1 ($a,$i) = if (($i >= $s))
446+ then $a
447+ else foldFunc($a, $l[$i])
448+
449+ func $f0_2 ($a,$i) = if (($i >= $s))
450+ then $a
451+ else throw("List size exceeds 10")
452+
453+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
454+ }
455+
456+
457+func _isZeroLock (publicKey_,err_) = if ((_loadLock(publicKey_) > 0))
458+ then throw(err_)
459+ else true
460+
461+
462+func _notSubmittedR (eventId_,signer_,err_) = if ((_loadRByEventAndSigner(eventId_, signer_) != ""))
463+ then throw(err_)
464+ else true
465+
466+
467+func _notSubmittedS (eventId_,signer_,err_) = if ((_loadSByEventAndSigner(eventId_, signer_) != ""))
468+ then throw(err_)
469+ else true
470+
471+
472+func _submittedR (eventId_,signer_,err_) = {
473+ let r = _loadRByEventAndSigner(eventId_, signer_)
474+ if ((r == ""))
475+ then throw(err_)
476+ else if (!(containsElement(_loadRsByEvent(eventId_), r)))
477+ then throw(err_)
478+ else true
479+ }
480+
481+
482+func _slashIncorrect (signersWithR_,signersWithS_) = {
483+ let punishment = _loadPunishment()
484+ func foldFunc (acc,elem) = if (containsElement(signersWithS_, elem))
485+ then $Tuple3(acc._1, (acc._2 :+ elem), acc._3)
486+ else {
487+ let signerAddress = addressFromPublicKey(fromBase58String(elem))
488+ $Tuple3((acc._1 ++ _saveSecDepo(signerAddress, (_loadSecDepo(signerAddress) - punishment))), acc._2, (acc._3 + punishment))
489+ }
490+
491+ let $l = signersWithR_
492+ let $s = size($l)
493+ let $acc0 = $Tuple3(nil, nil, 0)
494+ func $f0_1 ($a,$i) = if (($i >= $s))
495+ then $a
496+ else foldFunc($a, $l[$i])
497+
498+ func $f0_2 ($a,$i) = if (($i >= $s))
499+ then $a
500+ else throw("List size exceeds 10")
501+
502+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
503+ }
504+
505+
506+func _compensateCorrect (signers_,compensation_) = {
507+ let perSigner = (compensation_ / size(signers_))
508+ func foldFunc (acc,elem) = (acc :+ ScriptTransfer(addressFromPublicKey(fromBase58String(elem)), perSigner, unit))
509+
510+ let $l = signers_
511+ let $s = size($l)
512+ let $acc0 = nil
513+ func $f0_1 ($a,$i) = if (($i >= $s))
514+ then $a
515+ else foldFunc($a, $l[$i])
516+
517+ func $f0_2 ($a,$i) = if (($i >= $s))
518+ then $a
519+ else throw("List size exceeds 10")
520+
521+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
522+ }
523+
524+
525+func _publicKeysToAddrsStr (publicKeys_) = {
526+ func foldfunc (acc_,elem_) = (acc_ :+ toString(addressFromPublicKey(fromBase58String(elem_))))
527+
528+ let $l = publicKeys_
529+ let $s = size($l)
530+ let $acc0 = nil
531+ func $f0_1 ($a,$i) = if (($i >= $s))
532+ then $a
533+ else foldfunc($a, $l[$i])
534+
535+ func $f0_2 ($a,$i) = if (($i >= $s))
536+ then $a
537+ else throw("List size exceeds 51")
538+
539+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51)
540+ }
541+
542+
543+@Callable(i)
544+func init (minSecDepo_,punishment_,resetBlockDelta_,rewardTokenAddress_,rewardAmount_) = {
545+ let err = if (if (if (if (if (if (if (_onlyThisContract(i.caller))
546+ then _whenNotInitialized()
547+ else false)
548+ then _whenMultisigSet()
549+ else false)
550+ then _validateInt(minSecDepo_, punishment_, MAX_INT, "init: invalid minSecDepo")
551+ else false)
552+ then _validateInt(punishment_, 0, MAX_INT, "init: invalid punishment")
553+ else false)
554+ then _validateInt(resetBlockDelta_, 0, MAX_INT, "init: invalid resetBlockDelta")
555+ else false)
556+ then _validateAddress(rewardTokenAddress_, "init: invalid rewardTokenAddress")
557+ else false)
558+ then _validateInt(rewardAmount_, 0, MAX_INT, "init: invalid rewardAmount")
559+ else false
560+ if ((err == err))
561+ then $Tuple2((((((_saveInit(true) ++ _saveMinSecDepo(minSecDepo_)) ++ _savePunishment(punishment_)) ++ _saveResetBlockDelta(resetBlockDelta_)) ++ _saveRewardTokenAddress(addressFromStringValue(rewardTokenAddress_))) ++ _saveRewardAmount(rewardAmount_)), unit)
562+ else throw("Strict value is not equal to itself.")
563+ }
564+
565+
566+
567+@Callable(i)
568+func setActiveSigners (execChainId_,signers_,t_) = {
569+ let err = if (if (if (_onlyThisContract(i.caller))
570+ then _whenInitialized()
571+ else false)
572+ then _validatePublicKeys(signers_, "setActiveSigners: invalid signers")
573+ else false)
574+ then _validateInt(t_, 2, size(signers_), "setActiveSigners: invalid T")
575+ else false
576+ if ((err == err))
577+ then {
578+ let epoch = _loadCurrentEpoch(execChainId_)
579+ $Tuple2((((_saveCurrentEpoch(execChainId_, (epoch + 1)) ++ _saveT(execChainId_, (epoch + 1), t_)) ++ _saveSigners(execChainId_, (epoch + 1), signers_)) ++ _incrementLocks(signers_)), unit)
580+ }
581+ else throw("Strict value is not equal to itself.")
582+ }
583+
584+
585+
586+@Callable(i)
587+func submitR (eventId_,execChainId_,r_) = {
588+ let callerPublicKey = toBase58String(i.callerPublicKey)
589+ let epoch = _loadCurrentEpoch(execChainId_)
590+ let t = _loadT(execChainId_, epoch)
591+ let err = if (if (if (if (if (if (if (_whenInitialized())
592+ then _validateInt(eventId_, 0, MAX_INT, "submitR: invalid eventId")
593+ else false)
594+ then _validateInt(execChainId_, 0, MAX_INT, "submitR: invalid execChainId")
595+ else false)
596+ then _validateString(r_, "submitR: invalid r")
597+ else false)
598+ then _isActiveSigner(callerPublicKey, _loadSigners(execChainId_, epoch), "submitR: not active")
599+ else false)
600+ then _checkSecDepo(callerPublicKey, "submitR: not enough security deposit")
601+ else false)
602+ then _checkEventStatusForSubmitR(eventId_, "submitR: invalid event status")
603+ else false)
604+ then _notSubmittedR(eventId_, callerPublicKey, "submitR: already submitted")
605+ else false
606+ if ((err == err))
607+ then {
608+ let rArray = _loadRsByEvent(eventId_)
609+ let signersArray = _loadSignersWithRByEvent(eventId_)
610+ let eventStatusActions = if (((size(rArray) + 1) == t))
611+ then (_saveEventStatus(eventId_, EVENT_STATUS_SIGN) ++ _saveEventStartBlock(eventId_, height))
612+ else nil
613+ $Tuple2((((_saveRsByEvent(eventId_, (rArray :+ r_)) ++ _saveRByEventAndSigner(eventId_, callerPublicKey, r_)) ++ _saveSignersWithRByEvent(eventId_, (signersArray :+ callerPublicKey))) ++ eventStatusActions), unit)
614+ }
615+ else throw("Strict value is not equal to itself.")
616+ }
617+
618+
619+
620+@Callable(i)
621+func submitS (eventId_,execChainId_,rSigma_,s_,sSigma_) = {
622+ let callerPublicKey = toBase58String(i.callerPublicKey)
623+ let epoch = _loadCurrentEpoch(execChainId_)
624+ let t = _loadT(execChainId_, epoch)
625+ let err = if (if (if (if (if (if (if (if (if (_whenInitialized())
626+ then _validateInt(eventId_, 0, MAX_INT, "submitS: invalid eventId")
627+ else false)
628+ then _validateInt(execChainId_, 0, MAX_INT, "submitS: invalid execChainId")
629+ else false)
630+ then _validateString(rSigma_, "submitS: invalid r sigma")
631+ else false)
632+ then _validateString(s_, "submitS: invalid s")
633+ else false)
634+ then _isActiveSigner(callerPublicKey, _loadSigners(execChainId_, epoch), "submitS: not active")
635+ else false)
636+ then _checkSecDepo(callerPublicKey, "submitS: not enough security deposit")
637+ else false)
638+ then _checkEventStatusForSubmitS(eventId_, "submitS: invalid event status")
639+ else false)
640+ then _notSubmittedS(eventId_, callerPublicKey, "submitS: already submitted")
641+ else false)
642+ then _submittedR(eventId_, callerPublicKey, "submitS: R is not submitted")
643+ else false
644+ if ((err == err))
645+ then {
646+ let sArray = _loadSsByEvent(eventId_)
647+ let signersArray = _loadSignersWithSByEvent(eventId_)
648+ let eventStatusActions = if (((size(sArray) + 1) == t))
649+ then {
650+ let err1 = _validateString(sSigma_, "submitS: invalid s sigma")
651+ if ((err1 == err1))
652+ then {
653+ let executorIdxSize = _loadSignedEventExecutorIdxSize(execChainId_)
654+ let rewardAddresses = _publicKeysToAddrsStr((signersArray :+ callerPublicKey))
655+ let signersRewards = invoke(_loadRewardTokenAddress(), FUNC_MINT_MANY, [_loadRewardAmount(), rewardAddresses], nil)
656+ if ((signersRewards == signersRewards))
657+ then (((_saveEventStatus(eventId_, EVENT_STATUS_DONE) ++ _saveSignedEventExecutorIdx(execChainId_, executorIdxSize, eventId_)) ++ _saveSignedEventExecutorIdxSize(execChainId_, (executorIdxSize + 1))) ++ _saveSSigmaByEvent(eventId_, sSigma_))
658+ else throw("Strict value is not equal to itself.")
659+ }
660+ else throw("Strict value is not equal to itself.")
661+ }
662+ else nil
663+ $Tuple2(((((_saveSsByEvent(eventId_, (sArray :+ s_)) ++ _saveSByEventAndSigner(eventId_, callerPublicKey, s_)) ++ _saveSignersWithSByEvent(eventId_, (signersArray :+ callerPublicKey))) ++ _saveRSigmaByEvent(eventId_, rSigma_)) ++ eventStatusActions), unit)
664+ }
665+ else throw("Strict value is not equal to itself.")
666+ }
667+
668+
669+
670+@Callable(i)
671+func reset (eventId_,execChainId_,r_) = {
672+ let callerPublicKey = toBase58String(i.callerPublicKey)
673+ let epoch = _loadCurrentEpoch(execChainId_)
674+ let err = if (if (if (if (if (if (_whenInitialized())
675+ then _validateInt(eventId_, 0, MAX_INT, "reset: invalid eventId")
676+ else false)
677+ then _validateInt(execChainId_, 0, MAX_INT, "reset: invalid execChainId")
678+ else false)
679+ then _validateString(r_, "reset: invalid r")
680+ else false)
681+ then _isActiveSigner(callerPublicKey, _loadSigners(execChainId_, epoch), "reset: not active")
682+ else false)
683+ then _checkSecDepo(callerPublicKey, "reset: not enough security deposit")
684+ else false)
685+ then _checkEventStatusForReset(eventId_, "reset: invalid event status")
686+ else false
687+ if ((err == err))
688+ then {
689+ let slashAmount = 0
690+ let signersWithR = _loadSignersWithRByEvent(eventId_)
691+ let signersWithS = _loadSignersWithSByEvent(eventId_)
692+ let result = _slashIncorrect(signersWithR, signersWithS)
693+ let slashingActions = result._1
694+ let compensatedSigners = result._2
695+ let compensation = result._3
696+ let compensationActions = _compensateCorrect(compensatedSigners, compensation)
697+ $Tuple2((((((((_saveRsByEvent(eventId_, [r_]) ++ _saveRByEventAndSigner(eventId_, callerPublicKey, r_)) ++ _saveSignersWithRByEvent(eventId_, [callerPublicKey])) ++ _saveRSigmaByEvent(eventId_, "")) ++ _saveSSigmaByEvent(eventId_, "")) ++ _saveEventStatus(eventId_, EVENT_STATUS_INIT)) ++ slashingActions) ++ compensationActions), unit)
698+ }
699+ else throw("Strict value is not equal to itself.")
700+ }
701+
702+
703+
704+@Callable(i)
705+func addSecurityDeposit (recipient_) = {
706+ let recipient = if ((recipient_ == ""))
707+ then toString(i.caller)
708+ else recipient_
709+ let err = if (if (_validateAddress(recipient, "addSecurityDeposit: invalid recipient"))
710+ then _validatePaymentsSize(i.payments, 1, "addSecurityDeposit: no payment")
711+ else false)
712+ then _validatePaymentAsset(i.payments[0], unit, "addSecurityDeposit: invalid asset")
713+ else false
714+ if ((err == err))
715+ then {
716+ let recipientAddr = addressFromStringValue(recipient)
717+ let balance = _loadSecDepo(recipientAddr)
718+ let updatedBalance = (balance + i.payments[0].amount)
719+ $Tuple2(_saveSecDepo(recipientAddr, updatedBalance), unit)
720+ }
721+ else throw("Strict value is not equal to itself.")
722+ }
723+
724+
725+
726+@Callable(i)
727+func subSecurityDeposit (amount_) = {
728+ let balance = _loadSecDepo(i.caller)
729+ let err = if (_isZeroLock(toBase58String(i.callerPublicKey), "subSecurityDeposit: locked"))
730+ then if ((amount_ > balance))
731+ then throw("subSecurityDeposit: insufficient balance")
732+ else true
733+ else false
734+ if ((err == err))
735+ then $Tuple2((_saveSecDepo(i.caller, (balance - amount_)) ++ [ScriptTransfer(i.caller, amount_, unit)]), unit)
736+ else throw("Strict value is not equal to itself.")
737+ }
738+
739+
740+
741+@Callable(i)
742+func setMultisig (multisig_) = {
743+ let err = if (_onlyThisContract(i.caller))
744+ then _validateAddress(multisig_, "setMultisig: invalid multisig address")
745+ else false
746+ if ((err == err))
747+ then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
748+ else throw("Strict value is not equal to itself.")
749+ }
750+
751+
752+@Verifier(tx)
753+func verify () = match getString(KEY_MULTISIG) {
754+ case multisig: String =>
755+ valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
756+ case _ =>
757+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
758+}
759+

github/deemru/w8io/026f985 
32.38 ms