tx · Cb2u4seQJrmPkcfntrb3oM7wZLgd3biNBZ44DWjjwWxG

3Mswdgqx1w8LGXoJvQdWFz8X4AJAoztpdmy:  -0.01800000 Waves

2022.10.27 11:53 [2290611] smart account 3Mswdgqx1w8LGXoJvQdWFz8X4AJAoztpdmy > SELF 0.00000000 Waves

{ "type": 13, "id": "Cb2u4seQJrmPkcfntrb3oM7wZLgd3biNBZ44DWjjwWxG", "fee": 1800000, "feeAssetId": null, "timestamp": 1666860808312, "version": 2, "chainId": 84, "sender": "3Mswdgqx1w8LGXoJvQdWFz8X4AJAoztpdmy", "senderPublicKey": "DAYCdPzQbyP8fBRipiGJt2goKgGb4ETfiSN5jJAN7X1F", "proofs": [ "Z99MrLeJUrPNBJTa435ykeWQuv7PAtqicuCoC6Pg1HQFayukWEVPwDNAvEMrABRsma1ZMLa1qFR6pp4Er6j9wtc" ], "script": "base64:BgJgCAISBAoCCAgSCAoGCAgICAgIEgkKBwgICAgICAgSAwoBCBIECgIICBIGCgQICAgIEggKBggICAEBARIJCgcICAgIAQEBEgUKAwgIBBIECgIICBIFCgMICAgSABIDCgEIMwAHVkVSU0lPTgIFMS4wLjABDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgAACHVzZXJEYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfdXNlcnNfZGFwcAALZmVlUmVjZWl2ZXIJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfZmVlX3JlY2VpdmVyAAtzaWduQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1NJR04ABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAAtkYXBwUnVubmluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQh1c2VyRGFwcAIUY29uZl9kYXBwX2lzX3J1bm5pbmcGAA5tYWludGVuYW5jZU1TRwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAIUY29uZl9tYWludGVuYW5jZV9tc2cCAAANdXNlclN1c3BlbmRlZAIJU1VTUEVOREVEABB1c2VyVW5yZWdpc3RlcmVkAgxVTlJFR0lTVEVSRUQBC3ZhbGlkYXRlQ0lEAQNjaWQDCQEIY29udGFpbnMCBQNjaWQCAS8DAwkAZgIATAkAsQIBBQNjaWQJAAACCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAAA7BwkAZgIAEAkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAEHBwAHc2lnbkN1dAACAQ1rZXlVc2VyU3RhdHVzAQZjYWxsZXIJAKwCAgIMdXNlcl9zdGF0dXNfBQZjYWxsZXIBFmtleUV2ZW50T3duZXJCeUV2ZW50SWQBB2V2ZW50SWQJAKwCAgIQZ2V0X2V2ZW50X293bmVyXwUHZXZlbnRJZAERa2V5RXZlbnRBZGRlZERhdGUCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAhBldmVudF9hZGRlZERhdGVfBQdldmVudElkAgFfBQZjYWxsZXIBDGtleUV2ZW50RGF0ZQIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICC2V2ZW50X2RhdGVfBQdldmVudElkAgFfBQZjYWxsZXIBDGtleUV2ZW50TmFtZQIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICC2V2ZW50X25hbWVfBQdldmVudElkAgFfBQZjYWxsZXIBDGtleUV2ZW50RGVzYwIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICC2V2ZW50X2Rlc2NfBQdldmVudElkAgFfBQZjYWxsZXIBEmtleUV2ZW50RGlzcGxheUNpZAIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICEWV2ZW50X2Rpc3BsYXlDaWRfBQdldmVudElkAgFfBQZjYWxsZXIBDGtleUV2ZW50VGFncwIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICC2V2ZW50X3RhZ3NfBQdldmVudElkAgFfBQZjYWxsZXIBDGtleUV2ZW50RmxhZwIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICC2V2ZW50X2ZsYWdfBQdldmVudElkAgFfBQZjYWxsZXIBDGtleUV2ZW50Tm90ZQIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICC2V2ZW50X25vdGVfBQdldmVudElkAgFfBQZjYWxsZXIBD2tleUV2ZW50Q3Jhd2xlcgIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICEWV2ZW50X2NyYXdsZXJDaWRfBQdldmVudElkAgFfBQZjYWxsZXIBGGtleUV2ZW50VG90YWxUaWNrZXRUeXBlcwIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICF2V2ZW50X3RvdGFsVGlja2V0VHlwZXNfBQdldmVudElkAgFfBQZjYWxsZXIBGmtleUV2ZW50VG90YWxUaWNrZXRzSXNzdWVkAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgISZXZlbnRfdG90YWxJc3N1ZWRfBQdldmVudElkAgFfBQZjYWxsZXIBEGtleUV2ZW50Q2FuY2VsZWQCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAg9ldmVudF9jYW5jZWxlZF8FB2V2ZW50SWQCAV8FBmNhbGxlcgEWa2V5RXZlbnRDYW5jZWxlZFJlYXNvbgIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICFWV2ZW50X2NhbmNlbGVkUmVhc29uXwUHZXZlbnRJZAIBXwUGY2FsbGVyAQ1rZXlUaWNrZXROYW1lAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDHRpY2tldF9uYW1lXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAENa2V5VGlja2V0RGVzYwMGY2FsbGVyB2V2ZW50SWQIdGlja2V0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgx0aWNrZXRfZGVzY18FB2V2ZW50SWQCAV8FBmNhbGxlcgIBXwUIdGlja2V0SWQBDmtleVRpY2tldFByaWNlAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDXRpY2tldF9wcmljZV8FB2V2ZW50SWQCAV8FBmNhbGxlcgIBXwUIdGlja2V0SWQBDWtleVRpY2tldERhdGUDBmNhbGxlcgdldmVudElkCHRpY2tldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIMdGlja2V0X2RhdGVfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkARVrZXlUaWNrZXRNYXhBdmFpbGFibGUDBmNhbGxlcgdldmVudElkCHRpY2tldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIUdGlja2V0X21heEF2YWlsYWJsZV8FB2V2ZW50SWQCAV8FBmNhbGxlcgIBXwUIdGlja2V0SWQBDWtleVRpY2tldFNvbGQDBmNhbGxlcgdldmVudElkCHRpY2tldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIMdGlja2V0X3NvbGRfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkAQ9rZXlUaWNrZXRPblNhbGUDBmNhbGxlcgdldmVudElkCHRpY2tldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIOdGlja2V0X29uU2FsZV8FB2V2ZW50SWQCAV8FBmNhbGxlcgIBXwUIdGlja2V0SWQBE2tleVRpY2tldEFtb3VudFVzZWQDBmNhbGxlcgdldmVudElkCHRpY2tldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgISdGlja2V0X2Ftb3VudFVzZWRfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkAQ9rZXlUaWNrZXRNYXhVc2UDBmNhbGxlcgdldmVudElkCHRpY2tldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIOdGlja2V0X21heFVzZV8FB2V2ZW50SWQCAV8FBmNhbGxlcgIBXwUIdGlja2V0SWQBFGtleVRpY2tldFRvdGFsSXNzdWVkAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICE3RpY2tldF90b3RhbElzc3VlZF8FB2V2ZW50SWQCAV8FBmNhbGxlcgIBXwUIdGlja2V0SWQBDnZhbGlkYXRlU3RyaW5nAgNzdHIDbWF4AwkAAAIJALECAQUDc3RyAAAJAAIBAhhGaWVsZCBjYW5ub3QgYmUgaXMgZW1wdHkDCQBmAgkAsQIBBQNzdHIFA21heAkAAgEJAKwCAgUDc3RyAgwgaXMgdG9vIGxvbmcGAQt2YWxpZGF0ZUludAEDbnVtCQBmAgAABQNudW0BFmdldEV2ZW50T3duZXJCeUV2ZW50SWQBB2V2ZW50SWQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBFmtleUV2ZW50T3duZXJCeUV2ZW50SWQBBQdldmVudElkAgABDHZhbGlkYXRlVXNlcgEGY2FsbGVyBAp1c2VyU3RhdHVzCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwCQENa2V5VXNlclN0YXR1cwEFBmNhbGxlcgUQdXNlclVucmVnaXN0ZXJlZAMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAgABEXZhbGlkYXRlRXZlbnREYXRhBgZjYWxsZXIKY2lkRGlzcGxheQRuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEZGF0ZQQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZERpc3BsYXkJAAIBAhBQcm9ibGVtIHdpdGggQ0lEAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQRuYW1lAKwCCQACAQISMzAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgC4FwkAAgECGjMwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQRkYXRlAOgHCQACAQITMTAwMCBDaGFyLiBtYXggZGF0ZQMJAGYCCQCQAwEJALUJAgUEdGFncwIBLAAFCQACAQILNSB0YWdzIG1heC4CAAESdmFsaWRhdGVUaWNrZXREYXRhBwdldmVudElkBmNhbGxlcgRuYW1lC2Rlc2NyaXB0aW9uBXByaWNlDG1heEF2YWlsYWJsZQZtYXhVc2UECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQRuYW1lAMgBCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMDCQELdmFsaWRhdGVJbnQBBQVwcmljZQYJAQt2YWxpZGF0ZUludAEFBm1heFVzZQYJAQt2YWxpZGF0ZUludAEFDG1heEF2YWlsYWJsZQkAAgECFFBvc2l0aXZlIGFtb3VudCBvbmx5AwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAgABDGlkQ2FsbGVyRGF0ZQEBaQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEUdmFsaWRhdGVQcmljZUFzc2V0SWQDAWkMcHJpY2VBc3NldElkDGFydHdvcmtQcmljZQQLJHQwNjQ4MzY1MTkJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAULJHQwNjQ4MzY1MTkCXzEEBmFtb3VudAgFCyR0MDY0ODM2NTE5Al8yAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAgECFFdyb25nIGFzc2V0IGF0dGFjaGVkBAdhc3NldElkAwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIUV3JvbmcgYXNzZXQgYXR0YWNoZWQDCQECIT0CBQxhcnR3b3JrUHJpY2UFBmFtb3VudAkAAgECGlBheW1lbnQgYW1vdW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEMaXNFdmVudE93bmVyAgdldmVudElkBmNhbGxlcgQKZXZlbnRPd25lcgkBFmdldEV2ZW50T3duZXJCeUV2ZW50SWQBBQdldmVudElkAwkAAAIFCmV2ZW50T3duZXICAAkAAgECD0V2ZW50IG5vdCBmb3VuZAkAAAIFCmV2ZW50T3duZXIFBmNhbGxlcgELdGlja2V0RXhpc3QDBmNhbGxlcgdldmVudElkCHRpY2tldElkBAZ0aWNrZXQJAQ5nZXRTdHJpbmdCeUtleQEJAQ1rZXlUaWNrZXROYW1lAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkBAiE9AgkAsQIBBQZ0aWNrZXQAAAEPZXZlbnRJc0NhbmNlbGVkAgZpc3N1ZXIHZXZlbnRJZAkBD2dldEJvb2xlYW5CeUtleQEJARBrZXlFdmVudENhbmNlbGVkAgUGaXNzdWVyBQdldmVudElkDQZpbnZva2UBB3NldENvbmYCA2tleQN2YWwEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEIY29udGFpbnMCBQNrZXkCBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEIYWRkRXZlbnQGBG5hbWULZGVzY3JpcHRpb24EdGFncwpjaWREaXNwbGF5B2NyYXdsZXIEZGF0ZQQLJHQwNzg0ODc4OTcJAQxpZENhbGxlckRhdGUBBQFpBAdldmVudElkCAULJHQwNzg0ODc4OTcCXzEEBmNhbGxlcggFCyR0MDc4NDg3ODk3Al8yBAlhZGRlZERhdGUIBQskdDA3ODQ4Nzg5NwJfMwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIEDXZhbGlkYXRlRXZlbnQJARF2YWxpZGF0ZUV2ZW50RGF0YQYFBmNhbGxlcgUKY2lkRGlzcGxheQUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFBGRhdGUDCQECIT0CBQ12YWxpZGF0ZUV2ZW50AgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEJAMwIAgkBDEludGVnZXJFbnRyeQIJARFrZXlFdmVudEFkZGVkRGF0ZQIFBmNhbGxlcgUHZXZlbnRJZAUJYWRkZWREYXRlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFdmVudERhdGUCBQZjYWxsZXIFB2V2ZW50SWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV2ZW50TmFtZQIFBmNhbGxlcgUHZXZlbnRJZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXZlbnREZXNjAgUGY2FsbGVyBQdldmVudElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5RXZlbnREaXNwbGF5Q2lkAgUGY2FsbGVyBQdldmVudElkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFdmVudFRhZ3MCBQZjYWxsZXIFB2V2ZW50SWQFBHRhZ3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleUV2ZW50Q3Jhd2xlcgIFBmNhbGxlcgUHZXZlbnRJZAUHY3Jhd2xlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleUV2ZW50VG90YWxUaWNrZXRzSXNzdWVkAgUGY2FsbGVyBQdldmVudElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARBrZXlFdmVudENhbmNlbGVkAgUGY2FsbGVyBQdldmVudElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5RXZlbnRPd25lckJ5RXZlbnRJZAEFB2V2ZW50SWQFBmNhbGxlcgUDbmlsAWkBCWVkaXRFdmVudAcHZXZlbnRJZARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MKY2lkRGlzcGxheQdjcmF3bGVyBGRhdGUDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEBmNhbGxlcgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgQNdmFsaWRhdGVFdmVudAkBEXZhbGlkYXRlRXZlbnREYXRhBgUGY2FsbGVyBQpjaWREaXNwbGF5BQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUEZGF0ZQMJAQIhPQIFDXZhbGlkYXRlRXZlbnQCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQKZW50cnlFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBDGtleUV2ZW50TmFtZQIFBmNhbGxlcgUHZXZlbnRJZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQxrZXlFdmVudEZsYWcCBQZjYWxsZXIFB2V2ZW50SWQDCQAAAgUEZmxhZwIHSUxMRUdBTAkAAgECG0Nhbm5vdCB1cGRhdGUgSUxMRUdBTCBFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXZlbnROYW1lAgUGY2FsbGVyBQdldmVudElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFdmVudERhdGUCBQZjYWxsZXIFB2V2ZW50SWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV2ZW50RGVzYwIFBmNhbGxlcgUHZXZlbnRJZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV2ZW50VGFncwIFBmNhbGxlcgUHZXZlbnRJZAUEdGFncwkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5RXZlbnRDcmF3bGVyAgUGY2FsbGVyBQdldmVudElkBQdjcmF3bGVyBQNuaWwBaQELZGVsZXRlRXZlbnQBB2V2ZW50SWQEDSR0MDEwMTE3MTAxNjEJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDEwMTE3MTAxNjECXzEEBmNhbGxlcggFDSR0MDEwMTE3MTAxNjECXzIECWFkZGVkRGF0ZQgFDSR0MDEwMTE3MTAxNjECXzMECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkBASEBCQEMaXNFdmVudE93bmVyAgUHZXZlbnRJZAUGY2FsbGVyCQACAQIjWW91IGFyZSBub3QgdGhlIG93bmVyIG9mIHRoaXMgZXZlbnQEDWV2ZW50VG90YWxORlQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEaa2V5RXZlbnRUb3RhbFRpY2tldHNJc3N1ZWQCBQZjYWxsZXIFB2V2ZW50SWQDCQECIT0CBQ1ldmVudFRvdGFsTkZUAAAJAAIBAi1DYW5ub3QgZGVsZXRlIGV2ZW50IHdpdGggYWxyZWFkeSBzb2xkIHRpY2tldHMEF3RvdGFsVGlja2V0VHlwZUZvckV2ZW50CQEPZ2V0SW50ZWdlckJ5S2V5AQkBGGtleUV2ZW50VG90YWxUaWNrZXRUeXBlcwIFBmNhbGxlcgUHZXZlbnRJZAMJAGYCBRd0b3RhbFRpY2tldFR5cGVGb3JFdmVudAAACQACAQIYRGVsZXRlIGFsbCB0aWNrZXRzIGZpcnN0CQDMCAIJAQtEZWxldGVFbnRyeQEJARFrZXlFdmVudEFkZGVkRGF0ZQIFBmNhbGxlcgUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXZlbnREYXRlAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlFdmVudE5hbWUCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV2ZW50RGVzYwIFBmNhbGxlcgUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5RXZlbnREaXNwbGF5Q2lkAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlFdmVudFRhZ3MCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBD2tleUV2ZW50Q3Jhd2xlcgIFBmNhbGxlcgUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5RXZlbnRUb3RhbFRpY2tldHNJc3N1ZWQCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEGtleUV2ZW50Q2FuY2VsZWQCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFmtleUV2ZW50T3duZXJCeUV2ZW50SWQBBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARhrZXlFdmVudFRvdGFsVGlja2V0VHlwZXMCBQZjYWxsZXIFB2V2ZW50SWQFA25pbAFpAQtjYW5jZWxFdmVudAIHZXZlbnRJZAZyZWFzb24EDSR0MDExNTAyMTE1NDYJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDExNTAyMTE1NDYCXzEEBmNhbGxlcggFDSR0MDExNTAyMTE1NDYCXzIECWFkZGVkRGF0ZQgFDSR0MDExNTAyMTE1NDYCXzMECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkBASEBCQEMaXNFdmVudE93bmVyAgUHZXZlbnRJZAUGY2FsbGVyCQACAQIjWW91IGFyZSBub3QgdGhlIG93bmVyIG9mIHRoaXMgZXZlbnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARBrZXlFdmVudENhbmNlbGVkAgUGY2FsbGVyBQdldmVudElkBgkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5RXZlbnRDYW5jZWxlZFJlYXNvbgIFBmNhbGxlcgUHZXZlbnRJZAUGcmVhc29uBQNuaWwBaQEJZmxhZ0V2ZW50BAdldmVudElkBGFkZHIEZmxhZwRub3RlBA0kdDAxMTk4MTEyMDE0CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAxMTk4MTEyMDE0Al8xBAZjYWxsZXIIBQ0kdDAxMTk4MTEyMDE0Al8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV2ZW50RmxhZwIFBGFkZHIFB2V2ZW50SWQFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV2ZW50Tm90ZQIFBGFkZHIFB2V2ZW50SWQFBG5vdGUFA25pbAkAAgEJAKwCAgIOVW5rbm93IHN0YXR1cyAFBGZsYWcJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAWkBCWFkZFRpY2tldAYHZXZlbnRJZARuYW1lC2Rlc2NyaXB0aW9uBXByaWNlDG1heEF2YWlsYWJsZQZNYXhVc2UEDSR0MDEyNTE1MTI1NTUJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDEyNTE1MTI1NTUCXzEEBmNhbGxlcggFDSR0MDEyNTE1MTI1NTUCXzIEBGRhdGUIBQ0kdDAxMjUxNTEyNTU1Al8zBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAQ9ldmVudElzQ2FuY2VsZWQCBQZjYWxsZXIFB2V2ZW50SWQJAAIBAhhFdmVudCBoYXZlIGJlZW4gY2FuY2VsZWQDCQEBIQEJAQxpc0V2ZW50T3duZXICBQdldmVudElkBQZjYWxsZXIJAAIBAiNZb3UgYXJlIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBldmVudAQOdmFsaWRhdGVUaWNrZXQJARJ2YWxpZGF0ZVRpY2tldERhdGEHBQdldmVudElkBQZjYWxsZXIFBG5hbWUFC2Rlc2NyaXB0aW9uBQVwcmljZQUMbWF4QXZhaWxhYmxlBQZNYXhVc2UDCQECIT0CBQ52YWxpZGF0ZVRpY2tldAIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBBd0b3RhbFRpY2tldFR5cGVGb3JFdmVudAkBD2dldEludGVnZXJCeUtleQEJARhrZXlFdmVudFRvdGFsVGlja2V0VHlwZXMCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleVRpY2tldE5hbWUDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBQRuYW1lCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5VGlja2V0RGF0ZQMFBmNhbGxlcgUHZXZlbnRJZAUCaWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleVRpY2tldERlc2MDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBQtkZXNjcmlwdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmtleVRpY2tldFByaWNlAwUGY2FsbGVyBQdldmVudElkBQJpZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlUaWNrZXRNYXhBdmFpbGFibGUDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBQxtYXhBdmFpbGFibGUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQ9rZXlUaWNrZXRPblNhbGUDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVRpY2tldE1heFVzZQMFBmNhbGxlcgUHZXZlbnRJZAUCaWQFBk1heFVzZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVRpY2tldFRvdGFsSXNzdWVkAwUGY2FsbGVyBQdldmVudElkBQJpZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5RXZlbnRUb3RhbFRpY2tldFR5cGVzAgUGY2FsbGVyBQdldmVudElkCQBkAgUXdG90YWxUaWNrZXRUeXBlRm9yRXZlbnQAAQUDbmlsAWkBCmVkaXRUaWNrZXQHCHRpY2tldElkB2V2ZW50SWQEbmFtZQtkZXNjcmlwdGlvbgVwcmljZQxtYXhBdmFpbGFibGUGbWF4VXNlBA0kdDAxMzg5MDEzOTMwCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAxMzg5MDEzOTMwAl8xBAZjYWxsZXIIBQ0kdDAxMzg5MDEzOTMwAl8yBARkYXRlCAUNJHQwMTM4OTAxMzkzMAJfMwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQEBIQEJAQxpc0V2ZW50T3duZXICBQdldmVudElkBQZjYWxsZXIJAAIBAiNZb3UgYXJlIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBldmVudAMJAQEhAQkBC3RpY2tldEV4aXN0AwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAAgECEFRpY2tldCBub3QgZm91bmQEDnZhbGlkYXRlVGlja2V0CQESdmFsaWRhdGVUaWNrZXREYXRhBwUHZXZlbnRJZAUGY2FsbGVyBQRuYW1lBQtkZXNjcmlwdGlvbgUFcHJpY2UFDG1heEF2YWlsYWJsZQUGbWF4VXNlAwkBAiE9AgUOdmFsaWRhdGVUaWNrZXQCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQKdGlja2V0U29sZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQENa2V5VGlja2V0U29sZAMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQAAAMJAGYCBQp0aWNrZXRTb2xkBQxtYXhBdmFpbGFibGUJAAIBAj5NYXggdGlja2V0cyBhdmFpbGFibGUgY2Fubm90IGJlIGxvd2VyIHRoYW4gYW1vdW50IGFscmVhZHkgc29sZAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5VGlja2V0TmFtZQMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleVRpY2tldERlc2MDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkBQtkZXNjcmlwdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmtleVRpY2tldFByaWNlAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlUaWNrZXRNYXhBdmFpbGFibGUDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkBQxtYXhBdmFpbGFibGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlUaWNrZXRNYXhVc2UDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBQZtYXhVc2UFA25pbAFpAQ9wYXVzZVRpY2tldFNhbGUDB2V2ZW50SWQIdGlja2V0SWQGc3RhdHVzBA0kdDAxNTA2MjE1MTAyCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAxNTA2MjE1MTAyAl8xBAZjYWxsZXIIBQ0kdDAxNTA2MjE1MTAyAl8yBARkYXRlCAUNJHQwMTUwNjIxNTEwMgJfMwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQEBIQEJAQxpc0V2ZW50T3duZXICBQdldmVudElkBQZjYWxsZXIJAAIBAiNZb3UgYXJlIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBldmVudAMJAQEhAQkBC3RpY2tldEV4aXN0AwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAAgECEFRpY2tldCBub3QgZm91bmQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQ9rZXlUaWNrZXRPblNhbGUDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkBQZzdGF0dXMFA25pbAFpAQxkZWxldGVUaWNrZXQCCHRpY2tldElkB2V2ZW50SWQEDSR0MDE1NTY1MTU2MDUJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDE1NTY1MTU2MDUCXzEEBmNhbGxlcggFDSR0MDE1NTY1MTU2MDUCXzIEBGRhdGUIBQ0kdDAxNTU2NTE1NjA1Al8zBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAQEhAQkBDGlzRXZlbnRPd25lcgIFB2V2ZW50SWQFBmNhbGxlcgkAAgECI1lvdSBhcmUgbm90IHRoZSBvd25lciBvZiB0aGlzIGV2ZW50AwkBASEBCQELdGlja2V0RXhpc3QDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQACAQIQVGlja2V0IG5vdCBmb3VuZAQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQ1rZXlUaWNrZXRTb2xkAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAMJAQIhPQIFCmFtb3VudFNvbGQAAAkAAgECJkNhbm5vdCBkZWxldGUgdGlja2V0IHRoYXQgc29sZCBhbHJlYWR5BBd0b3RhbFRpY2tldFR5cGVGb3JFdmVudAkBD2dldEludGVnZXJCeUtleQEJARhrZXlFdmVudFRvdGFsVGlja2V0VHlwZXMCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleVRpY2tldE5hbWUDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlUaWNrZXREYXRlAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5VGlja2V0RGVzYwMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleVRpY2tldFByaWNlAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEVa2V5VGlja2V0TWF4QXZhaWxhYmxlAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEPa2V5VGlja2V0T25TYWxlAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEPa2V5VGlja2V0TWF4VXNlAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEUa2V5VGlja2V0VG90YWxJc3N1ZWQDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5RXZlbnRUb3RhbFRpY2tldFR5cGVzAgUGY2FsbGVyBQdldmVudElkCQBlAgUXdG90YWxUaWNrZXRUeXBlRm9yRXZlbnQAAQUDbmlsAWkBCWJ1eVRpY2tldAMIdGlja2V0SWQHZXZlbnRJZAZpc3N1ZXIEDSR0MDE2ODI5MTY4NjcJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDE2ODI5MTY4NjcCXzEEBmNhbGxlcggFDSR0MDE2ODI5MTY4NjcCXzIEBGRhdGUIBQ0kdDAxNjgyOTE2ODY3Al8zBAh0b3RhbE5GVAkBC3ZhbHVlT3JFbHNlAgkBD2dldEludGVnZXJCeUtleQECFHRvdGFsX3RpY2tldHNfaXNzdWVkAAADCQEBIQEJAQxpc0V2ZW50T3duZXICBQdldmVudElkBQZpc3N1ZXIJAAIBAh9FdmVudCBJRCBhbmQgSXNzdWVyIGRvbid0IG1hdGNoAwkBASEBCQELdGlja2V0RXhpc3QDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkCQACAQIQVGlja2V0IG5vdCBmb3VuZAQJZXZlbnROYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEMa2V5RXZlbnROYW1lAgUGaXNzdWVyBQdldmVudElkAwkAAAIFCWV2ZW50TmFtZQIACQACAQIRQXJ0IGRvZXNuJ3QgZXhpc3QDCQEPZXZlbnRJc0NhbmNlbGVkAgUGaXNzdWVyBQdldmVudElkCQACAQIYRXZlbnQgaGF2ZSBiZWVuIGNhbmNlbGVkBAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQ9rZXlUaWNrZXRPblNhbGUDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkAwkBASEBBQhpc09uU2FsZQkAAgECFFRpY2tldHMgbm90IGZvciBzYWxlBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBDWtleVRpY2tldFNvbGQDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkBAt0aWNrZXRQcmljZQkBD2dldEludGVnZXJCeUtleQEJAQ5rZXlUaWNrZXRQcmljZQMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQEDHByaWNlQXNzZXRJZAkA2AQBBQtzaWduQXNzZXRJZAQNJHQwMTc3MTMxNzc4NwkBFHZhbGlkYXRlUHJpY2VBc3NldElkAwUBaQUMcHJpY2VBc3NldElkBQt0aWNrZXRQcmljZQQGYW1vdW50CAUNJHQwMTc3MTMxNzc4NwJfMQQHYXNzZXRJZAgFDSR0MDE3NzEzMTc3ODcCXzIECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEVa2V5VGlja2V0TWF4QXZhaWxhYmxlAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAQNYW1vdW50Rm9yU2lnbgkAawMFBmFtb3VudAUHc2lnbkN1dABkBBJhbW91bnRGb3JPcmdhbml6ZXIJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgILT3JnYW5pemVyOiAFBmlzc3VlcgIMLAogRXZlbnRJRDogBQdldmVudElkAg0sCiBUaWNrZXRJRDogBQh0aWNrZXRJZAIOLAogRXZlbnROYW1lOiAFCWV2ZW50TmFtZQIKLAogSXNzdWU6IAkApAMBBQ1uZXdBbW91bnRTb2xkAgEvCQCkAwEFCm1heENhblNlbGwECGlzc3VlTkZUCQDCCAUJAKwCAgIDU1RfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQECnNlbGxTdGF0dXMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAcGBApyZWNlaXZlTkZUCAUBaQZjYWxsZXIEB3NvbGRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDHRpY2tldF9zb2xkXwkApAMBBQ1uZXdBbW91bnRTb2xkAgRfb2ZfCQCkAwEFCm1heENhblNlbGwCAV8FB2V2ZW50SWQCAV8FBmlzc3VlcgIBXwUIdGlja2V0SWQECXNvbGRWYWx1ZQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUKcmVjZWl2ZU5GVAIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQZhbW91bnQCAV8JANgEAQUFaWRORlQECHNvbGREYXRhCQELU3RyaW5nRW50cnkCBQdzb2xkS2V5BQlzb2xkVmFsdWUEDWV2ZW50VG90YWxORlQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEaa2V5RXZlbnRUb3RhbFRpY2tldHNJc3N1ZWQCBQZpc3N1ZXIFB2V2ZW50SWQEDnRpY2tldFRvdGFsTkZUCQEPZ2V0SW50ZWdlckJ5S2V5AQkBFGtleVRpY2tldFRvdGFsSXNzdWVkAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAQGYnV5UmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5VGlja2V0U29sZAMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQFDW5ld0Ftb3VudFNvbGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFBWlkTkZUBQdzb2xkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhR0b3RhbF90aWNrZXRzX2lzc3VlZAkAZAIFCHRvdGFsTkZUAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJARprZXlFdmVudFRvdGFsVGlja2V0c0lzc3VlZAIFBmlzc3VlcgUHZXZlbnRJZAkAZAIFDWV2ZW50VG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVRpY2tldFRvdGFsSXNzdWVkAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAkAZAIFDnRpY2tldFRvdGFsTkZUAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICA1NUXwkApAMBCQBkAgUIdG90YWxORlQAAQIIX2Fzc2V0SWQJAKwCAgkArAICBQh0aWNrZXRJZAIBXwkA2AQBBQVpZE5GVAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBD2tleVRpY2tldE9uU2FsZQMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQFCnNlbGxTdGF0dXMJAMwIAgkBDEludGVnZXJFbnRyeQIJARNrZXlUaWNrZXRBbW91bnRVc2VkAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAAACQDMCAIFCGlzc3VlTkZUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIFEmFtb3VudEZvck9yZ2FuaXplcgUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQpyZWNlaXZlTkZUAAEFBWlkTkZUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUNYW1vdW50Rm9yU2lnbgUHYXNzZXRJZAUDbmlsCQDMCAIFCHNvbGREYXRhBQZidXlSZXMBaQEJdXNlVGlja2V0AAQNJHQwMjAwMzcyMDA3NQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjAwMzcyMDA3NQJfMQQGY2FsbGVyCAUNJHQwMjAwMzcyMDA3NQJfMgQEZGF0ZQgFDSR0MDIwMDM3MjAwNzUCXzMEDSR0MDIwMDgxMjAxMTcJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMjAwODEyMDExNwJfMQQGYW1vdW50CAUNJHQwMjAwODEyMDExNwJfMgMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhRXcm9uZyBhc3NldCBhdHRhY2hlZAQEZGF0YQkAtQkCCQCsAgICBG5mdF8JANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAIBXwQGaXNzdWVyCQCRAwIFBGRhdGEABQQHZXZlbnRJZAkAkQMCBQRkYXRhAAYECHRpY2tldElkCQCRAwIFBGRhdGEABwMJAQEhAQkBC3RpY2tldEV4aXN0AwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAkAAgECEFRpY2tldCBub3QgZm91bmQECmFtb3VudFVzZWQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQETa2V5VGlja2V0QW1vdW50VXNlZAMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQEDG1heFVzaW5nVGltZQkBD2dldEludGVnZXJCeUtleQEJAQ9rZXlUaWNrZXRNYXhVc2UDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkAwkAAAIFDG1heFVzaW5nVGltZQUKYW1vdW50VXNlZAkAAgEJAKwCAgkArAICAgxUaWNrZXQgdXNlZCAJAKQDAQUKYW1vdW50VXNlZAIOIHRpbWVzIGFscmVhZHkJAMwIAgkBDEludGVnZXJFbnRyeQIJARNrZXlUaWNrZXRBbW91bnRVc2VkAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAkAZAIFCmFtb3VudFVzZWQAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAEIBQdwYXltZW50B2Fzc2V0SWQFA25pbAFpAQtkZWxldGVFbnRyeQEFZW50cnkEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIDCQAAAgUGY2FsbGVyBQVjaHJpcwkAzAgCCQELRGVsZXRlRW50cnkBBQVlbnRyeQUDbmlsCQACAQICbm8Alqh7CQ==", "height": 2290611, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9BPVAecdAvzmVGSaPE9qVAzVPz2Rbkfnhd34g4NHrqts Next: GzZ1D5GddBnqMZmxwi6jhyH6kAZywdDgosMDouFmG1Tm Diff:
OldNewDifferences
512512 let amount = $t02008120117._2
513513 if (!(isDefined(payment.assetId)))
514514 then throw("Wrong asset attached")
515- else if (true)
516- then throw(("nft_" + toBase58String(value(payment.assetId))))
517- else {
518- let data = split(("nft_" + toBase58String(value(payment.assetId))), "_")
519- let issuer = data[5]
520- let eventId = data[6]
521- let ticketId = data[7]
522- if (!(ticketExist(issuer, eventId, ticketId)))
523- then throw("Ticket not found")
524- else {
525- let amountUsed = getIntegerByKey(keyTicketAmountUsed(issuer, eventId, ticketId))
526- let maxUsingTime = getIntegerByKey(keyTicketMaxUse(issuer, eventId, ticketId))
527- if ((maxUsingTime == amountUsed))
528- then throw((("Ticket used " + toString(amountUsed)) + " times already"))
529- else [IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId), (amountUsed + 1)), ScriptTransfer(Address(fromBase58String(caller)), 1, payment.assetId)]
530- }
531- }
515+ else {
516+ let data = split(("nft_" + toBase58String(value(payment.assetId))), "_")
517+ let issuer = data[5]
518+ let eventId = data[6]
519+ let ticketId = data[7]
520+ if (!(ticketExist(issuer, eventId, ticketId)))
521+ then throw("Ticket not found")
522+ else {
523+ let amountUsed = getIntegerByKey(keyTicketAmountUsed(issuer, eventId, ticketId))
524+ let maxUsingTime = getIntegerByKey(keyTicketMaxUse(issuer, eventId, ticketId))
525+ if ((maxUsingTime == amountUsed))
526+ then throw((("Ticket used " + toString(amountUsed)) + " times already"))
527+ else [IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId), (amountUsed + 1)), ScriptTransfer(Address(fromBase58String(caller)), 1, payment.assetId)]
528+ }
529+ }
532530 }
533531
534532
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "1.0.0"
55
66 func getStringByKey (key) = valueOrElse(getString(this, key), "")
77
88
99 let userDapp = value(addressFromString(getStringByKey("conf_users_dapp")))
1010
1111 let feeReceiver = getStringByKey("conf_fee_receiver")
1212
1313 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
1414
1515 let chris = getStringByKey("conf_admin_1")
1616
1717 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
1818
1919
2020 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
2121
2222
2323 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
2424
2525 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
2626
2727 let userSuspended = "SUSPENDED"
2828
2929 let userUnregistered = "UNREGISTERED"
3030
3131 func validateCID (cid) = if (contains(cid, "/"))
3232 then if (if ((76 > size(cid)))
3333 then (size(split(cid, "/")[0]) == 59)
3434 else false)
3535 then (16 > size(split(cid, "/")[1]))
3636 else false
3737 else false
3838
3939
4040 let signCut = 2
4141
4242 func keyUserStatus (caller) = ("user_status_" + caller)
4343
4444
4545 func keyEventOwnerByEventId (eventId) = ("get_event_owner_" + eventId)
4646
4747
4848 func keyEventAddedDate (caller,eventId) = ((("event_addedDate_" + eventId) + "_") + caller)
4949
5050
5151 func keyEventDate (caller,eventId) = ((("event_date_" + eventId) + "_") + caller)
5252
5353
5454 func keyEventName (caller,eventId) = ((("event_name_" + eventId) + "_") + caller)
5555
5656
5757 func keyEventDesc (caller,eventId) = ((("event_desc_" + eventId) + "_") + caller)
5858
5959
6060 func keyEventDisplayCid (caller,eventId) = ((("event_displayCid_" + eventId) + "_") + caller)
6161
6262
6363 func keyEventTags (caller,eventId) = ((("event_tags_" + eventId) + "_") + caller)
6464
6565
6666 func keyEventFlag (caller,eventId) = ((("event_flag_" + eventId) + "_") + caller)
6767
6868
6969 func keyEventNote (caller,eventId) = ((("event_note_" + eventId) + "_") + caller)
7070
7171
7272 func keyEventCrawler (caller,eventId) = ((("event_crawlerCid_" + eventId) + "_") + caller)
7373
7474
7575 func keyEventTotalTicketTypes (caller,eventId) = ((("event_totalTicketTypes_" + eventId) + "_") + caller)
7676
7777
7878 func keyEventTotalTicketsIssued (caller,eventId) = ((("event_totalIssued_" + eventId) + "_") + caller)
7979
8080
8181 func keyEventCanceled (caller,eventId) = ((("event_canceled_" + eventId) + "_") + caller)
8282
8383
8484 func keyEventCanceledReason (caller,eventId) = ((("event_canceledReason_" + eventId) + "_") + caller)
8585
8686
8787 func keyTicketName (caller,eventId,ticketId) = ((((("ticket_name_" + eventId) + "_") + caller) + "_") + ticketId)
8888
8989
9090 func keyTicketDesc (caller,eventId,ticketId) = ((((("ticket_desc_" + eventId) + "_") + caller) + "_") + ticketId)
9191
9292
9393 func keyTicketPrice (caller,eventId,ticketId) = ((((("ticket_price_" + eventId) + "_") + caller) + "_") + ticketId)
9494
9595
9696 func keyTicketDate (caller,eventId,ticketId) = ((((("ticket_date_" + eventId) + "_") + caller) + "_") + ticketId)
9797
9898
9999 func keyTicketMaxAvailable (caller,eventId,ticketId) = ((((("ticket_maxAvailable_" + eventId) + "_") + caller) + "_") + ticketId)
100100
101101
102102 func keyTicketSold (caller,eventId,ticketId) = ((((("ticket_sold_" + eventId) + "_") + caller) + "_") + ticketId)
103103
104104
105105 func keyTicketOnSale (caller,eventId,ticketId) = ((((("ticket_onSale_" + eventId) + "_") + caller) + "_") + ticketId)
106106
107107
108108 func keyTicketAmountUsed (caller,eventId,ticketId) = ((((("ticket_amountUsed_" + eventId) + "_") + caller) + "_") + ticketId)
109109
110110
111111 func keyTicketMaxUse (caller,eventId,ticketId) = ((((("ticket_maxUse_" + eventId) + "_") + caller) + "_") + ticketId)
112112
113113
114114 func keyTicketTotalIssued (caller,eventId,ticketId) = ((((("ticket_totalIssued_" + eventId) + "_") + caller) + "_") + ticketId)
115115
116116
117117 func validateString (str,max) = if ((size(str) == 0))
118118 then throw("Field cannot be is empty")
119119 else if ((size(str) > max))
120120 then throw((str + " is too long"))
121121 else true
122122
123123
124124 func validateInt (num) = (0 > num)
125125
126126
127127 func getEventOwnerByEventId (eventId) = valueOrElse(getString(this, keyEventOwnerByEventId(eventId)), "")
128128
129129
130130 func validateUser (caller) = {
131131 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
132132 if ((userStatus == userUnregistered))
133133 then "Register this account first with \"Account\" tab"
134134 else if ((userStatus == userSuspended))
135135 then "Account suspended"
136136 else ""
137137 }
138138
139139
140140 func validateEventData (caller,cidDisplay,name,description,tags,date) = {
141141 let checkUser = validateUser(caller)
142142 if ((checkUser != ""))
143143 then throw(checkUser)
144144 else if ((size(cidDisplay) == 0))
145145 then throw("Display CID cannot be empty")
146146 else if (!(validateCID(cidDisplay)))
147147 then throw("Problem with CID")
148148 else if (!(validateString(name, 300)))
149149 then throw("300 Char. max name")
150150 else if (!(validateString(description, 3000)))
151151 then throw("3000 Char. max description")
152152 else if (!(validateString(date, 1000)))
153153 then throw("1000 Char. max date")
154154 else if ((size(split(tags, ",")) > 5))
155155 then throw("5 tags max.")
156156 else ""
157157 }
158158
159159
160160 func validateTicketData (eventId,caller,name,description,price,maxAvailable,maxUse) = {
161161 let checkUser = validateUser(caller)
162162 if ((checkUser != ""))
163163 then throw(checkUser)
164164 else if (!(validateString(name, 200)))
165165 then throw("100 Char. max name")
166166 else if (!(validateString(description, 1000)))
167167 then throw("1000 Char. max description")
168168 else if (if (if (validateInt(price))
169169 then true
170170 else validateInt(maxUse))
171171 then true
172172 else validateInt(maxAvailable))
173173 then throw("Positive amount only")
174174 else if (!(validateString(description, 1000)))
175175 then throw("1000 Char. max description")
176176 else ""
177177 }
178178
179179
180180 func idCallerDate (i) = if (!(dappRunning))
181181 then throw(maintenanceMSG)
182182 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
183183
184184
185185 func isPayment (i) = if ((size(i.payments) == 0))
186186 then throw("No payment attached")
187187 else {
188188 let payment = value(i.payments[0])
189189 let amount = value(payment.amount)
190190 $Tuple2(payment, amount)
191191 }
192192
193193
194194 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
195195 let $t064836519 = isPayment(i)
196196 let payment = $t064836519._1
197197 let amount = $t064836519._2
198198 if (!(isDefined(payment.assetId)))
199199 then throw("Wrong asset attached")
200200 else {
201201 let assetId = if (if ((size(priceAssetId) > 0))
202202 then (toBase58String(value(payment.assetId)) == priceAssetId)
203203 else false)
204204 then payment.assetId
205205 else throw("Wrong asset attached")
206206 if ((artworkPrice != amount))
207207 then throw("Payment amount don't match")
208208 else $Tuple2(amount, assetId)
209209 }
210210 }
211211
212212
213213 func isEventOwner (eventId,caller) = {
214214 let eventOwner = getEventOwnerByEventId(eventId)
215215 if ((eventOwner == ""))
216216 then throw("Event not found")
217217 else (eventOwner == caller)
218218 }
219219
220220
221221 func ticketExist (caller,eventId,ticketId) = {
222222 let ticket = getStringByKey(keyTicketName(caller, eventId, ticketId))
223223 (size(ticket) != 0)
224224 }
225225
226226
227227 func eventIsCanceled (issuer,eventId) = getBooleanByKey(keyEventCanceled(issuer, eventId))
228228
229229
230230 @Callable(invoke)
231231 func setConf (key,val) = {
232232 let caller = toString(invoke.caller)
233233 if (containsElement([chris, toString(this)], caller))
234234 then if (contains(key, "conf_"))
235235 then [StringEntry(key, val)]
236236 else throw("Entries starting with conf_ only")
237237 else throw("You are not allowed to change this")
238238 }
239239
240240
241241
242242 @Callable(i)
243243 func addEvent (name,description,tags,cidDisplay,crawler,date) = {
244244 let $t078487897 = idCallerDate(i)
245245 let eventId = $t078487897._1
246246 let caller = $t078487897._2
247247 let addedDate = $t078487897._3
248248 let checkUser = validateUser(caller)
249249 if ((checkUser != ""))
250250 then throw(checkUser)
251251 else {
252252 let validateEvent = validateEventData(caller, cidDisplay, name, description, tags, date)
253253 if ((validateEvent != ""))
254254 then throw("Something went wrong!")
255255 else [IntegerEntry(keyEventAddedDate(caller, eventId), addedDate), StringEntry(keyEventDate(caller, eventId), date), StringEntry(keyEventName(caller, eventId), name), StringEntry(keyEventDesc(caller, eventId), description), StringEntry(keyEventDisplayCid(caller, eventId), cidDisplay), StringEntry(keyEventTags(caller, eventId), tags), StringEntry(keyEventCrawler(caller, eventId), crawler), IntegerEntry(keyEventTotalTicketsIssued(caller, eventId), 0), BooleanEntry(keyEventCanceled(caller, eventId), false), StringEntry(keyEventOwnerByEventId(eventId), caller)]
256256 }
257257 }
258258
259259
260260
261261 @Callable(i)
262262 func editEvent (eventId,name,description,tags,cidDisplay,crawler,date) = if (!(dappRunning))
263263 then throw(maintenanceMSG)
264264 else {
265265 let caller = toBase58String(i.caller.bytes)
266266 let checkUser = validateUser(caller)
267267 if ((checkUser != ""))
268268 then throw(checkUser)
269269 else {
270270 let validateEvent = validateEventData(caller, cidDisplay, name, description, tags, date)
271271 if ((validateEvent != ""))
272272 then throw("Something went wrong!")
273273 else {
274274 let entryExist = getStringByKey(keyEventName(caller, eventId))
275275 if ((entryExist == ""))
276276 then throw("Entry not found")
277277 else {
278278 let flag = getStringByKey(keyEventFlag(caller, eventId))
279279 if ((flag == "ILLEGAL"))
280280 then throw("Cannot update ILLEGAL Event")
281281 else [StringEntry(keyEventName(caller, eventId), name), StringEntry(keyEventDate(caller, eventId), date), StringEntry(keyEventDesc(caller, eventId), description), StringEntry(keyEventTags(caller, eventId), tags), StringEntry(keyEventCrawler(caller, eventId), crawler)]
282282 }
283283 }
284284 }
285285 }
286286
287287
288288
289289 @Callable(i)
290290 func deleteEvent (eventId) = {
291291 let $t01011710161 = idCallerDate(i)
292292 let id = $t01011710161._1
293293 let caller = $t01011710161._2
294294 let addedDate = $t01011710161._3
295295 let checkUser = validateUser(caller)
296296 if ((checkUser != ""))
297297 then throw(checkUser)
298298 else if (!(isEventOwner(eventId, caller)))
299299 then throw("You are not the owner of this event")
300300 else {
301301 let eventTotalNFT = getIntegerByKey(keyEventTotalTicketsIssued(caller, eventId))
302302 if ((eventTotalNFT != 0))
303303 then throw("Cannot delete event with already sold tickets")
304304 else {
305305 let totalTicketTypeForEvent = getIntegerByKey(keyEventTotalTicketTypes(caller, eventId))
306306 if ((totalTicketTypeForEvent > 0))
307307 then throw("Delete all tickets first")
308308 else [DeleteEntry(keyEventAddedDate(caller, eventId)), DeleteEntry(keyEventDate(caller, eventId)), DeleteEntry(keyEventName(caller, eventId)), DeleteEntry(keyEventDesc(caller, eventId)), DeleteEntry(keyEventDisplayCid(caller, eventId)), DeleteEntry(keyEventTags(caller, eventId)), DeleteEntry(keyEventCrawler(caller, eventId)), DeleteEntry(keyEventTotalTicketsIssued(caller, eventId)), DeleteEntry(keyEventCanceled(caller, eventId)), DeleteEntry(keyEventOwnerByEventId(eventId)), DeleteEntry(keyEventTotalTicketTypes(caller, eventId))]
309309 }
310310 }
311311 }
312312
313313
314314
315315 @Callable(i)
316316 func cancelEvent (eventId,reason) = {
317317 let $t01150211546 = idCallerDate(i)
318318 let id = $t01150211546._1
319319 let caller = $t01150211546._2
320320 let addedDate = $t01150211546._3
321321 let checkUser = validateUser(caller)
322322 if ((checkUser != ""))
323323 then throw(checkUser)
324324 else if (!(isEventOwner(eventId, caller)))
325325 then throw("You are not the owner of this event")
326326 else [BooleanEntry(keyEventCanceled(caller, eventId), true), StringEntry(keyEventCanceledReason(caller, eventId), reason)]
327327 }
328328
329329
330330
331331 @Callable(i)
332332 func flagEvent (eventId,addr,flag,note) = {
333333 let $t01198112014 = idCallerDate(i)
334334 let id = $t01198112014._1
335335 let caller = $t01198112014._2
336336 if (containsElement([chris, toString(this)], caller))
337337 then if (containsElement(["", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
338338 then [StringEntry(keyEventFlag(addr, eventId), flag), StringEntry(keyEventNote(addr, eventId), note)]
339339 else throw(("Unknow status " + flag))
340340 else throw("You are not allowed")
341341 }
342342
343343
344344
345345 @Callable(i)
346346 func addTicket (eventId,name,description,price,maxAvailable,MaxUse) = {
347347 let $t01251512555 = idCallerDate(i)
348348 let id = $t01251512555._1
349349 let caller = $t01251512555._2
350350 let date = $t01251512555._3
351351 let checkUser = validateUser(caller)
352352 if ((checkUser != ""))
353353 then throw(checkUser)
354354 else if (eventIsCanceled(caller, eventId))
355355 then throw("Event have been canceled")
356356 else if (!(isEventOwner(eventId, caller)))
357357 then throw("You are not the owner of this event")
358358 else {
359359 let validateTicket = validateTicketData(eventId, caller, name, description, price, maxAvailable, MaxUse)
360360 if ((validateTicket != ""))
361361 then throw("Something went wrong!")
362362 else {
363363 let totalTicketTypeForEvent = getIntegerByKey(keyEventTotalTicketTypes(caller, eventId))
364364 [StringEntry(keyTicketName(caller, eventId, id), name), IntegerEntry(keyTicketDate(caller, eventId, id), date), StringEntry(keyTicketDesc(caller, eventId, id), description), IntegerEntry(keyTicketPrice(caller, eventId, id), price), IntegerEntry(keyTicketMaxAvailable(caller, eventId, id), maxAvailable), BooleanEntry(keyTicketOnSale(caller, eventId, id), true), IntegerEntry(keyTicketMaxUse(caller, eventId, id), MaxUse), IntegerEntry(keyTicketTotalIssued(caller, eventId, id), 0), IntegerEntry(keyEventTotalTicketTypes(caller, eventId), (totalTicketTypeForEvent + 1))]
365365 }
366366 }
367367 }
368368
369369
370370
371371 @Callable(i)
372372 func editTicket (ticketId,eventId,name,description,price,maxAvailable,maxUse) = {
373373 let $t01389013930 = idCallerDate(i)
374374 let id = $t01389013930._1
375375 let caller = $t01389013930._2
376376 let date = $t01389013930._3
377377 let checkUser = validateUser(caller)
378378 if ((checkUser != ""))
379379 then throw(checkUser)
380380 else if (!(isEventOwner(eventId, caller)))
381381 then throw("You are not the owner of this event")
382382 else if (!(ticketExist(caller, eventId, ticketId)))
383383 then throw("Ticket not found")
384384 else {
385385 let validateTicket = validateTicketData(eventId, caller, name, description, price, maxAvailable, maxUse)
386386 if ((validateTicket != ""))
387387 then throw("Something went wrong!")
388388 else {
389389 let ticketSold = valueOrElse(getInteger(keyTicketSold(caller, eventId, ticketId)), 0)
390390 if ((ticketSold > maxAvailable))
391391 then throw("Max tickets available cannot be lower than amount already sold")
392392 else [StringEntry(keyTicketName(caller, eventId, ticketId), name), StringEntry(keyTicketDesc(caller, eventId, ticketId), description), IntegerEntry(keyTicketPrice(caller, eventId, ticketId), price), IntegerEntry(keyTicketMaxAvailable(caller, eventId, ticketId), maxAvailable), IntegerEntry(keyTicketMaxUse(caller, eventId, id), maxUse)]
393393 }
394394 }
395395 }
396396
397397
398398
399399 @Callable(i)
400400 func pauseTicketSale (eventId,ticketId,status) = {
401401 let $t01506215102 = idCallerDate(i)
402402 let id = $t01506215102._1
403403 let caller = $t01506215102._2
404404 let date = $t01506215102._3
405405 let checkUser = validateUser(caller)
406406 if ((checkUser != ""))
407407 then throw(checkUser)
408408 else if (!(isEventOwner(eventId, caller)))
409409 then throw("You are not the owner of this event")
410410 else if (!(ticketExist(caller, eventId, ticketId)))
411411 then throw("Ticket not found")
412412 else [BooleanEntry(keyTicketOnSale(caller, eventId, ticketId), status)]
413413 }
414414
415415
416416
417417 @Callable(i)
418418 func deleteTicket (ticketId,eventId) = {
419419 let $t01556515605 = idCallerDate(i)
420420 let id = $t01556515605._1
421421 let caller = $t01556515605._2
422422 let date = $t01556515605._3
423423 let checkUser = validateUser(caller)
424424 if ((checkUser != ""))
425425 then throw(checkUser)
426426 else if (!(isEventOwner(eventId, caller)))
427427 then throw("You are not the owner of this event")
428428 else if (!(ticketExist(caller, eventId, ticketId)))
429429 then throw("Ticket not found")
430430 else {
431431 let amountSold = getIntegerByKey(keyTicketSold(caller, eventId, ticketId))
432432 if ((amountSold != 0))
433433 then throw("Cannot delete ticket that sold already")
434434 else {
435435 let totalTicketTypeForEvent = getIntegerByKey(keyEventTotalTicketTypes(caller, eventId))
436436 [DeleteEntry(keyTicketName(caller, eventId, ticketId)), DeleteEntry(keyTicketDate(caller, eventId, ticketId)), DeleteEntry(keyTicketDesc(caller, eventId, ticketId)), DeleteEntry(keyTicketPrice(caller, eventId, ticketId)), DeleteEntry(keyTicketMaxAvailable(caller, eventId, ticketId)), DeleteEntry(keyTicketOnSale(caller, eventId, ticketId)), DeleteEntry(keyTicketMaxUse(caller, eventId, ticketId)), DeleteEntry(keyTicketTotalIssued(caller, eventId, ticketId)), IntegerEntry(keyEventTotalTicketTypes(caller, eventId), (totalTicketTypeForEvent - 1))]
437437 }
438438 }
439439 }
440440
441441
442442
443443 @Callable(i)
444444 func buyTicket (ticketId,eventId,issuer) = {
445445 let $t01682916867 = idCallerDate(i)
446446 let id = $t01682916867._1
447447 let caller = $t01682916867._2
448448 let date = $t01682916867._3
449449 let totalNFT = valueOrElse(getIntegerByKey("total_tickets_issued"), 0)
450450 if (!(isEventOwner(eventId, issuer)))
451451 then throw("Event ID and Issuer don't match")
452452 else if (!(ticketExist(issuer, eventId, ticketId)))
453453 then throw("Ticket not found")
454454 else {
455455 let eventName = getStringByKey(keyEventName(issuer, eventId))
456456 if ((eventName == ""))
457457 then throw("Art doesn't exist")
458458 else if (eventIsCanceled(issuer, eventId))
459459 then throw("Event have been canceled")
460460 else {
461461 let isOnSale = getBooleanByKey(keyTicketOnSale(issuer, eventId, ticketId))
462462 if (!(isOnSale))
463463 then throw("Tickets not for sale")
464464 else {
465465 let amountSold = getIntegerByKey(keyTicketSold(issuer, eventId, ticketId))
466466 let ticketPrice = getIntegerByKey(keyTicketPrice(issuer, eventId, ticketId))
467467 let priceAssetId = toBase58String(signAssetId)
468468 let $t01771317787 = validatePriceAssetId(i, priceAssetId, ticketPrice)
469469 let amount = $t01771317787._1
470470 let assetId = $t01771317787._2
471471 let maxCanSell = getIntegerByKey(keyTicketMaxAvailable(issuer, eventId, ticketId))
472472 let amountForSign = fraction(amount, signCut, 100)
473473 let amountForOrganizer = (amount - amountForSign)
474474 if ((amountSold == maxCanSell))
475475 then throw("Art sold out")
476476 else {
477477 let newAmountSold = (amountSold + 1)
478478 let issueMeta = ((((((((((("Organizer: " + issuer) + ",
479479 EventID: ") + eventId) + ",
480480 TicketID: ") + ticketId) + ",
481481 EventName: ") + eventName) + ",
482482 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
483483 let issueNFT = Issue(("ST_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
484484 let idNFT = calculateAssetId(issueNFT)
485485 let sellStatus = if ((newAmountSold == maxCanSell))
486486 then false
487487 else true
488488 let receiveNFT = i.caller
489489 let soldKey = ((((((((("ticket_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + eventId) + "_") + issuer) + "_") + ticketId)
490490 let soldValue = ((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + toBase58String(idNFT))
491491 let soldData = StringEntry(soldKey, soldValue)
492492 let eventTotalNFT = getIntegerByKey(keyEventTotalTicketsIssued(issuer, eventId))
493493 let ticketTotalNFT = getIntegerByKey(keyTicketTotalIssued(issuer, eventId, ticketId))
494494 let buyRes = [IntegerEntry(keyTicketSold(issuer, eventId, ticketId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_tickets_issued", (totalNFT + 1)), IntegerEntry(keyEventTotalTicketsIssued(issuer, eventId), (eventTotalNFT + 1)), IntegerEntry(keyTicketTotalIssued(issuer, eventId, ticketId), (ticketTotalNFT + 1)), StringEntry((("ST_" + toString((totalNFT + 1))) + "_assetId"), ((ticketId + "_") + toBase58String(idNFT))), BooleanEntry(keyTicketOnSale(issuer, eventId, ticketId), sellStatus), IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId), 0), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForOrganizer, assetId), ScriptTransfer(receiveNFT, 1, idNFT), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
495495 soldData :: buyRes
496496 }
497497 }
498498 }
499499 }
500500 }
501501
502502
503503
504504 @Callable(i)
505505 func useTicket () = {
506506 let $t02003720075 = idCallerDate(i)
507507 let id = $t02003720075._1
508508 let caller = $t02003720075._2
509509 let date = $t02003720075._3
510510 let $t02008120117 = isPayment(i)
511511 let payment = $t02008120117._1
512512 let amount = $t02008120117._2
513513 if (!(isDefined(payment.assetId)))
514514 then throw("Wrong asset attached")
515- else if (true)
516- then throw(("nft_" + toBase58String(value(payment.assetId))))
517- else {
518- let data = split(("nft_" + toBase58String(value(payment.assetId))), "_")
519- let issuer = data[5]
520- let eventId = data[6]
521- let ticketId = data[7]
522- if (!(ticketExist(issuer, eventId, ticketId)))
523- then throw("Ticket not found")
524- else {
525- let amountUsed = getIntegerByKey(keyTicketAmountUsed(issuer, eventId, ticketId))
526- let maxUsingTime = getIntegerByKey(keyTicketMaxUse(issuer, eventId, ticketId))
527- if ((maxUsingTime == amountUsed))
528- then throw((("Ticket used " + toString(amountUsed)) + " times already"))
529- else [IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId), (amountUsed + 1)), ScriptTransfer(Address(fromBase58String(caller)), 1, payment.assetId)]
530- }
531- }
515+ else {
516+ let data = split(("nft_" + toBase58String(value(payment.assetId))), "_")
517+ let issuer = data[5]
518+ let eventId = data[6]
519+ let ticketId = data[7]
520+ if (!(ticketExist(issuer, eventId, ticketId)))
521+ then throw("Ticket not found")
522+ else {
523+ let amountUsed = getIntegerByKey(keyTicketAmountUsed(issuer, eventId, ticketId))
524+ let maxUsingTime = getIntegerByKey(keyTicketMaxUse(issuer, eventId, ticketId))
525+ if ((maxUsingTime == amountUsed))
526+ then throw((("Ticket used " + toString(amountUsed)) + " times already"))
527+ else [IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId), (amountUsed + 1)), ScriptTransfer(Address(fromBase58String(caller)), 1, payment.assetId)]
528+ }
529+ }
532530 }
533531
534532
535533
536534 @Callable(i)
537535 func deleteEntry (entry) = {
538536 let caller = toString(i.caller)
539537 if ((caller == chris))
540538 then [DeleteEntry(entry)]
541539 else throw("no")
542540 }
543541
544542

github/deemru/w8io/3ef1775 
80.78 ms