tx · CijdC4RfRnKEV9vZB3UNk2LxpiXx7wE8KFFMf2y3snyq

3N8jKcYWjJn5GjrJV94rxzVk42TPk1rPLeu:  -0.02400000 Waves

2022.07.29 23:23 [2161590] smart account 3N8jKcYWjJn5GjrJV94rxzVk42TPk1rPLeu > SELF 0.00000000 Waves

{ "type": 13, "id": "CijdC4RfRnKEV9vZB3UNk2LxpiXx7wE8KFFMf2y3snyq", "fee": 2400000, "feeAssetId": null, "timestamp": 1659126237793, "version": 2, "chainId": 84, "sender": "3N8jKcYWjJn5GjrJV94rxzVk42TPk1rPLeu", "senderPublicKey": "914UmzBhcoS4onGGVcBRgb4VPV88m9VCFjsj5WWck5vm", "proofs": [ "5B7eDp7rU8Jwue6rKG7rDthRDa1WpMKWjNLaz7dcnP2KzdSakjuaBu75EYtnWha4WSr77qE9B4Gv8m9NgETXQ9wz" ], "script": "base64:BgJeCAISAwoBCBIDCgEIEgUKAwEICBIMCgoICAgICAgICAgIEg4KDAgBAQgIAQgICAEBARIECgIIARIECgIICBIFCgMICAgSAwoBCBIECgIICBIGCgQICAgIEgUKAwgICFMACHVuaXRUZXN0BwAJb3JhY2xlS2V5AglvcmFjbGVLZXkBBmdldFN0cgEDa2V5BAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWIFByRtYXRjaDAFAWICAAAGb3JhY2xlCQEGZ2V0U3RyAQUJb3JhY2xlS2V5AAlvcmFjbGVGZWUJAQV2YWx1ZQEJAKYIAQUGb3JhY2xlAAZvd25lcnMJAMwIAgkAnQgCBQlvcmFjbGVGZWUCBm93bmVyMQkAzAgCCQCdCAIFCW9yYWNsZUZlZQIGb3duZXIyBQNuaWwAD2NvbGxlY3Rpb25zRGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCW9yYWNsZUZlZQIPY29sbGVjdGlvbnNEYXBwAhhjb2xsZWN0aW9uRGFwcCBub3QgZm91bmQAC2ZlZVJlY2VpdmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUJb3JhY2xlRmVlAgtmZWVSZWNlaXZlcgIVZmVlUmVjZWl2ZXIgbm90IGZvdW5kAAhjZXJ0RGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCW9yYWNsZUZlZQIIY2VydERhcHACEmNlcnREYXBwIG5vdCBmb3VuZAAHZmVlRGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCW9yYWNsZUZlZQIHZmVlRGFwcAIRZmVlRGFwcCBub3QgZm91bmQACHVzZXJEYXBwCQEFdmFsdWUBCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlvcmFjbGVGZWUCCHVzZXJEYXBwAhJ1c2VyZGFwcCBub3QgZm91bmQACXN0YWtlRGFwcAkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUJb3JhY2xlRmVlAglzdGFrZURhcHACFHNjb25leERhcHAgbm90IGZvdW5kAAtVU0ROQXNzZXRJZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQlvcmFjbGVGZWUCC1VTRE5Bc3NldElkAA1TY29uZXhBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFCW9yYWNsZUZlZQINU2NvbmV4QXNzZXRJZAAFdHlwZXMJAMwIAgIFSU1BR0UJAMwIAgIDUERGCQDMCAICBVZJREVPBQNuaWwADFByZXZpZXd0eXBlcwkAzAgCAgNQREYFA25pbAALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUIdXNlckRhcHACFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAObWFpbnRlbmFuY2VNU0cJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHACFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAADXVzZXJTdXNwZW5kZWQCCVNVU1BFTkRFRAALdXNlclJlbW92ZWQCB1JFTU9WRUQAEHVzZXJVbnJlZ2lzdGVyZWQCDFVOUkVHSVNURVJFRAAMYXVjdGlvblR5cGUxAgdCSURUWVBFAAxhdWN0aW9uVHlwZTICC1RSQURJVElPTkFMAAxhdWN0aW9uVHlwZTMCBkRJUkVDVAEXZ2V0U3RyaW5nQnlLZXlGcm9tVXNlcnMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAUDa2V5AgABDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgABFWdldFN0cmluZ0J5S2V5T3JFcnJvcgIDa2V5BWVycm9yCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5BQVlcnJvcgEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAQx2YWxpZGF0ZUhhc2gBBGhhc2gJAAACCQCxAgEFBGhhc2gAQAENa2V5VXNlclN0YXR1cwEGY2FsbGVyCQCsAgICDHVzZXJfc3RhdHVzXwUGY2FsbGVyAQdrZXlEYXRlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5TmFtZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleURlc2MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlEaXNwbGF5Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDWtleVByZXZpZXdDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X3ByZXZpZXdfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5TWF4TWludAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfbWF4bWludF8FBWFydElkAgFfBQZjYWxsZXIBEmtleUhpZ2hlc3RCaWRCaWRJZAEFYXJ0SWQJAKwCAgIUYXJ0X2hpZ2hlc3RCaWRCaWRJZF8FBWFydElkAQhrZXlCaWRJZAEFYmlkSWQJAKwCAgIEYmlkXwUFYmlkSWQBC2tleUR1cmF0aW9uAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDWFydF9kdXJhdGlvbl8FBWFydElkAgFfBQZjYWxsZXIBDGtleUVuZEhlaWdodAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfZW5kaGVpZ2h0XwUFYXJ0SWQCAV8FBmNhbGxlcgEOa2V5QXVjdGlvblR5cGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2F1Y3Rpb250eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5SXNzdWVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQxLZXlOZnRJc3N1ZXIBBW5mdElkCQCsAgICC25mdF9pc3N1ZWRfBQVuZnRJZAELS2V5TmZ0QXJ0SWQBBW5mdElkCQCsAgICCm5mdF9hcnRJZF8FBW5mdElkAQlrZXlPblNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X29uc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBDmtleUVudGl0bGVtZW50AgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9lbnRpdGxlbWVudF8FBWFydElkAgFfBQZjYWxsZXIBB2tleVRhZ3MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3RhZ3NfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUeXBlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXNzZXRJZEFjY2VwdGVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEmFydF9hc3NldEFjY2VwdGVkXwUFYXJ0SWQCAV8FBmNhbGxlcgERa2V5SGFzaEJ5VHhpZEFkZHICBmNhbGxlcgR0eGlkCQCsAgIJAKwCAgkArAICAhNnZXRfaGFzaGJ5dHhpZGFkZHJfBQR0eGlkAgFfBQZjYWxsZXIBDmtleU93bmVyQnlIYXNoAQpzaGEyNTZIYXNoCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUKc2hhMjU2SGFzaAESa2V5VHhpZEJ5SGFzaE93bmVyAgpzaGEyNTZIYXNoBmNhbGxlcgkArAICAhdnZXRfdHhpZF9ieV9oYXNoX293bmVyXwkA2AQBCQDUFgEJAJsDAQkArAICBQpzaGEyNTZIYXNoBQZjYWxsZXIBDWtleUNvbGxlY3Rpb24CBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FBWFydElkAgFfBQZjYWxsZXIADG1pblVTRE5QcmljZQkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBCQCsAgICBG1pbl8JANgEAQULVVNETkFzc2V0SWQAEGN1cnJlbnRGZWVTY29uZXgJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQkArAICAgRmZWVfCQDYBAEFDVNjb25leEFzc2V0SWQBEGdldEFtb3VudEJ5QmlkSWQBBWJpZElkCQELdmFsdWVPckVsc2UCCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleUJpZElkAQUFYmlkSWQAAAEaZ2V0QW1vdW50SGlnaGVzdEJpZEJ5QXJ0SWQBBWFydElkBAViaWRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkCQEQZ2V0QW1vdW50QnlCaWRJZAEFBWJpZElkAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwkAAAIFCnVzZXJTdGF0dXMFEHVzZXJVbnJlZ2lzdGVyZWQCLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICdBY2NvdW50JyB0YWIDCQAAAgUKdXNlclN0YXR1cwUNdXNlclN1c3BlbmRlZAIRQWNjb3VudCBzdXNwZW5kZWQDCQAAAgUKdXNlclN0YXR1cwULdXNlclJlbW92ZWQCD0FjY291bnQgcmVtb3ZlZAIAARN2YWxpZGF0ZUFydHdvcmtEYXRhBQZjYWxsZXIKY2lkRGlzcGxheQRuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkAAAIJALECAQUKY2lkRGlzcGxheQAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBAiE9AgkAsQIBBQpjaWREaXNwbGF5AC4JAAIBAh5UaGlzIGRvZXNuJ3Qgc2VlbSBhIHZhbGlkIENJRCEDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFBG5hbWUAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgULZGVzY3JpcHRpb24A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMJAGYCCQCQAwEJALUJAgUEdGFncwIBLAAFCQACAQILNSB0YWdzIG1heC4CAAEJaXNQYXltZW50AgFpBWluZGV4AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECE05vIHBheW1lbnQgYXR0YWNoZWQEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BAZhbW91bnQJAQV2YWx1ZQEIBQdwYXltZW50BmFtb3VudAkAlAoCBQdwYXltZW50BQZhbW91bnQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBAVwRGF0YQkBCWlzUGF5bWVudAIFAWkAAQQHcGF5bWVudAgFBXBEYXRhAl8xBAZhbW91bnQIBQVwRGF0YQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhdBc3NldCBJZCBpcyBub3QgZGVmaW5lZAMDCQBmAgkAsQIBBQxwcmljZUFzc2V0SWQAAAkAAAIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAUMcHJpY2VBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAhRQYXltZW50IGRvbid0IG1hdGNoIAkApAMBBQxhcnR3b3JrUHJpY2UCASAJAKQDAQUGYW1vdW50CQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQIhPQIFB2Fzc2V0SWQJANgEAQULVVNETkFzc2V0SWQJAAIBAhJPbmx5IFVTRE4gYWNjZXB0ZWQGAQ92YWxpZGF0ZU1pblNlbGwCB2Fzc2V0SWQFcHJpY2UEDW1pblNlbGxTY29uZXgFDG1pblVTRE5QcmljZQMDAwkBAiE9AgUFcHJpY2UAAAkAZgIFDW1pblNlbGxTY29uZXgFBXByaWNlBwYJAQIhPQIFB2Fzc2V0SWQJANgEAQULVVNETkFzc2V0SWQJAAIBCQCsAgICGVdyb25nIG1pbmltdW0gc2VsbCBwcmljZSAJAKQDAQUNbWluU2VsbFNjb25leAYBDWdldEJpZEFzc2V0SWQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMJAAIBAhZPbmx5IFVTRE4gaXMgYWNjZXB0ZWQhCQDZBAEFB2Fzc2V0SWQBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBCmJpZERhdGFLZXkEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAliaWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEECmJpZEFzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAADCQBnAgAABQliaWRBbW91bnQJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUJYmlkQW1vdW50BQpiaWRBc3NldElkAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQpnZXRBcnREYXRhBAFpBmlzc3VlcgVhcnRJZAVpc0JpZAQOY2FsbGVySXNJc3N1ZXIJAAACCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMFBmlzc3VlcgQIdG90YWxORlQJAQ9nZXRJbnRlZ2VyQnlLZXkBAhB0b3RhbF9uZnRfaXNzdWVkBAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZpc3N1ZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAhFBcnQgZG9lc24ndCBleGlzdAQIaXNPblNhbGUJAQ9nZXRCb29sZWFuQnlLZXkBCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBAxhcnR3b3JrUHJpY2UJAQt2YWx1ZU9yRWxzZQIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEIa2V5UHJpY2UCBQZpc3N1ZXIFBWFydElkBQxtaW5VU0ROUHJpY2UEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFC1VTRE5Bc3NldElkCQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMDAwkBASEBBQVpc0JpZAkBASEBBQ5jYWxsZXJJc0lzc3VlcgcDAwkAZwIAAAUMYXJ0d29ya1ByaWNlBgkBASEBBQhpc09uU2FsZQYJAGcCAAAFCm1heENhblNlbGwHCQACAQIQQXJ0IG5vdCBmb3Igc2FsZQMDAwkBASEBBQVpc0JpZAUOY2FsbGVySXNJc3N1ZXIHCQBnAgAABQptYXhDYW5TZWxsBwkAAgECFE1heCBpc3N1YWJsZSBub3Qgc2V0CQCZCgcFCHRvdGFsTkZUBQthcnR3b3JrTmFtZQUKYW1vdW50U29sZAUMYXJ0d29ya1ByaWNlBQxwcmljZUFzc2V0SWQFCm1heENhblNlbGwFCGlzT25TYWxlAQpnZXRCaWREYXRhCQFpBmNhbGxlcgZpc3N1ZXIFYXJ0SWQIYmlkT3duZXIFYmlkSWQMcHJpY2VBc3NldElkDGFydHdvcmtQcmljZQVpc0JpZAQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGaXNzdWVyAwMFBWlzQmlkCQECIT0CBQljaGVja1VzZXICAAcJAAIBBQljaGVja1VzZXIECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBAx0MDEzNTE5MTM2NDgDBQVpc0JpZAkBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBBQpiaWREYXRhS2V5CQEUdmFsaWRhdGVQcmljZUFzc2V0SWQDBQFpBQxwcmljZUFzc2V0SWQFDGFydHdvcmtQcmljZQQGYW1vdW50CAUMdDAxMzUxOTEzNjQ4Al8xBAdhc3NldElkCAUMdDAxMzUxOTEzNjQ4Al8yCQCVCgMFCmJpZERhdGFLZXkFBmFtb3VudAUHYXNzZXRJZAEMZ2V0SXNzdWVEYXRhCwZpc3N1ZXIFYXJ0SWQLYXJ0d29ya05hbWUNbmV3QW1vdW50U29sZAptYXhDYW5TZWxsCHRvdGFsTkZUBmNhbGxlcghiaWRPd25lcgViaWRJZAFpCGlzT25TYWxlBAlpc3N1ZU1ldGEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAggsQXJ0SUQ6IAUFYXJ0SWQCDyxBcnR3b3JrIG5hbWU6IAULYXJ0d29ya05hbWUCCCxJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMJAQIhPQIFCGJpZE93bmVyAgAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIJAJUKAwUKc2VsbFN0YXR1cwUKcmVjZWl2ZU5GVAUJaXNzdWVNZXRhAQxnZXRCaWRLZXlWYWwDB2Fzc2V0SWQKYmlkRGF0YUtleQRkYXRlBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAkAAgECFU9ubHkgVVNETiBpcyBhY2NlcHRlZAkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQCVCgMFCmFzc2V0SWRCaWQFCWJpZERlbE9sZAUJYmlkVXBkYXRlAQdidXlNaW50BgFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgVpc0JpZAQKY2FsbGVyRGF0YQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUKY2FsbGVyRGF0YQJfMQQGY2FsbGVyCAUKY2FsbGVyRGF0YQJfMgQEZGF0ZQgFCmNhbGxlckRhdGECXzMEB2FydERhdGEJAQpnZXRBcnREYXRhBAUBaQUGaXNzdWVyBQVhcnRJZAUFaXNCaWQECHRvdGFsTkZUCAUHYXJ0RGF0YQJfMQQLYXJ0d29ya05hbWUIBQdhcnREYXRhAl8yBAphbW91bnRTb2xkCAUHYXJ0RGF0YQJfMwQMYXJ0d29ya1ByaWNlCAUHYXJ0RGF0YQJfNAQMcHJpY2VBc3NldElkCAUHYXJ0RGF0YQJfNQQKbWF4Q2FuU2VsbAgFB2FydERhdGECXzYECGlzT25TYWxlCAUHYXJ0RGF0YQJfNwQHYmlkRGF0YQkBCmdldEJpZERhdGEJBQFpBQZjYWxsZXIFBmlzc3VlcgUFYXJ0SWQFCGJpZE93bmVyBQViaWRJZAUMcHJpY2VBc3NldElkBQxhcnR3b3JrUHJpY2UFBWlzQmlkBApiaWREYXRhS2V5CAUHYmlkRGF0YQJfMQQGYW1vdW50CAUHYmlkRGF0YQJfMgQHYXNzZXRJZAgFB2JpZERhdGECXzMEDW5ld0Ftb3VudFNvbGQDCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDk1heCBpdGVtcyBzb2xkCQBkAgUKYW1vdW50U29sZAABBAppc3N1ZXJEYXRhCQEMZ2V0SXNzdWVEYXRhCwUGaXNzdWVyBQVhcnRJZAULYXJ0d29ya05hbWUFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwFCHRvdGFsTkZUBQZjYWxsZXIFCGJpZE93bmVyBQViaWRJZAUBaQUIaXNPblNhbGUECnNlbGxTdGF0dXMIBQppc3N1ZXJEYXRhAl8xBApyZWNlaXZlTkZUCAUKaXNzdWVyRGF0YQJfMgQJaXNzdWVNZXRhCAUKaXNzdWVyRGF0YQJfMwQLaWRORlRJbnZva2UJAPwHBAUEdGhpcwIHbWludE5mdAkAzAgCBQh0b3RhbE5GVAkAzAgCBQlpc3N1ZU1ldGEJAMwIAgkApQgBBQpyZWNlaXZlTkZUBQNuaWwFA25pbAMJAAACBQtpZE5GVEludm9rZQULaWRORlRJbnZva2UEBWlkTkZUBAckbWF0Y2gwBQtpZE5GVEludm9rZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXIFByRtYXRjaDAFAXIJAAIBAhdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAQLYmlkS2V5VmFsdWUJAQxnZXRCaWRLZXlWYWwDBQdhc3NldElkBQpiaWREYXRhS2V5BQRkYXRlBAphc3NldElkQmlkCAULYmlkS2V5VmFsdWUCXzEECWJpZERlbE9sZAgFC2JpZEtleVZhbHVlAl8yBAliaWRVcGRhdGUIBQtiaWRLZXlWYWx1ZQJfMwQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwUFaWRORlQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQpyZWNlaXZlTkZUAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFBmFtb3VudAIBXwUKYXNzZXRJZEJpZAIBXwUFaWRORlQEEmludm9rZVRlYW1GZWVTcGxpdAkA/AcECQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUHZmVlRGFwcAkArAICBQdmZWVEYXBwAgogbm90IGZvdW5kAgZwYXlGZWUJAMwIAgUFYXJ0SWQJAMwIAgUGaXNzdWVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFBmFtb3VudAUDbmlsAwkAAAIFEmludm9rZVRlYW1GZWVTcGxpdAUSaW52b2tlVGVhbUZlZVNwbGl0BAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBAZidXlSZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBQ1uZXdBbW91bnRTb2xkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwUFaWRORlQFB3NvbGRLZXkJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQh0b3RhbE5GVAABCQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCCQELU3RyaW5nRW50cnkCCQEMS2V5TmZ0SXNzdWVyAQUFaWRORlQFBmlzc3VlcgkAzAgCCQELU3RyaW5nRW50cnkCCQELS2V5TmZ0QXJ0SWQBBQVpZE5GVAUFYXJ0SWQFA25pbAQfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQkA/AcECQETdmFsdWVPckVycm9yTWVzc2FnZQIFCXN0YWtlRGFwcAIOdGhpcyBub3QgZm91bmQCGXZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnQFA25pbAkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAAFA25pbAMJAAACBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlBANyZXMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUIY2VydERhcHACCmNyZWF0ZUNlcnQJAMwIAgkApQgBBQpyZWNlaXZlTkZUCQDMCAIFBWlkTkZUCQDMCAIFBmlzc3VlcgUDbmlsBQNuaWwDCQAAAgUDcmVzBQNyZXMDBQVpc0JpZAkAzQgCCQDNCAIJAM0IAgUGYnV5UmVzBQhzb2xkRGF0YQUJYmlkVXBkYXRlBQliaWREZWxPbGQJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEUc2V0QmlkTm9uVHJhZGl0aW9uYWwDAWkFYXJ0SWQGaXNzdWVyBAx0MDI3NzA5Mjc3NDcJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDHQwMjc3MDkyNzc0NwJfMQQGY2FsbGVyCAUMdDAyNzcwOTI3NzQ3Al8yBARkYXRlCAUMdDAyNzcwOTI3NzQ3Al8zBAx0MDI3NzUyMjc3ODgJAQlpc1BheW1lbnQCBQFpAAAEB3BheW1lbnQIBQx0MDI3NzUyMjc3ODgCXzEEBmFtb3VudAgFDHQwMjc3NTIyNzc4OAJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhZPbmx5IFVTRE4gaXMgYWNjZXB0ZWQhCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAQfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQkA/AcECQETdmFsdWVPckVycm9yTWVzc2FnZQIFCXN0YWtlRGFwcAIOdGhpcyBub3QgZm91bmQCGXZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnQFA25pbAkAzAgCCQCRAwIIBQFpCHBheW1lbnRzAAEFA25pbAMJAAACBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlBR92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFzZXRCaWRUcmFkaXRpb25hbAMBaQVhcnRJZAZpc3N1ZXIECWVuZEhlaWdodAkBD2dldEludGVnZXJCeUtleQEJAQxrZXlFbmRIZWlnaHQCBQZpc3N1ZXIFBWFydElkBApoaWdoZXN0QmlkCQEaZ2V0QW1vdW50SGlnaGVzdEJpZEJ5QXJ0SWQBBQVhcnRJZAMJAGYCBQZoZWlnaHQFCWVuZEhlaWdodAkAAgECIVRoaXMgYXVjdGlvbiBpcyBmaW5pc2hlZCBhbHJlYWR5IQQLY2FsbGRlckRhdGEJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFC2NhbGxkZXJEYXRhAl8xBAZjYWxsZXIIBQtjYWxsZGVyRGF0YQJfMgQEZGF0ZQgFC2NhbGxkZXJEYXRhAl8zBAxpc1BheW1lbnRWYXIJAQlpc1BheW1lbnQCBQFpAAAEB3BheW1lbnQIBQxpc1BheW1lbnRWYXICXzEEBmFtb3VudAgFDGlzUGF5bWVudFZhcgJfMgMJAGcCBQpoaWdoZXN0QmlkBQZhbW91bnQJAAIBCQCsAgICIFBsZWFzZSBwbGFjZSBhIGJpZCBoaWdoZXIgdGhhbjogCQCkAwEFCmhpZ2hlc3RCaWQEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIWT25seSBVU0ROIGlzIGFjY2VwdGVkIQkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQED21pbkFydHdvcmtQcmljZQkBC3ZhbHVlT3JFbHNlAgkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQFDG1pblVTRE5QcmljZQMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkAZgIFD21pbkFydHdvcmtQcmljZQUGYW1vdW50CQACAQIXQmlkIGlzIGJlbG93IG1pbiBwcmljZSEECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkBB92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUJc3Rha2VEYXBwAg50aGlzIG5vdCBmb3VuZAIZdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudAUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAQUDbmlsAwkAAAIFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FBmNhbGxlcgIBXwUCaWQCBV9PUEVOCQCsAgIJAKwCAgkArAICCQCsAgIFB2Fzc2V0SWQCAV8JAKQDAQUGYW1vdW50AgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZAIFBmJpZE5icgABCQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlIaWdoZXN0QmlkQmlkSWQBBQVhcnRJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5QmlkSWQBCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFBmFtb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdhY2NlcHRCaWROb25UcmFkaXRpb25hbAUBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEBmNhbGxlcgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzAwkBAiE9AgUGY2FsbGVyBQZpc3N1ZXIJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uCQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgYBDnJlc3RhcnRBdWN0aW9uAgVhcnRJZAZpc3N1ZXIECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAQMb2xkRW5kSGVpZ2h0CQEPZ2V0SW50ZWdlckJ5S2V5AQkBDGtleUVuZEhlaWdodAIFBmlzc3VlcgUFYXJ0SWQECGR1cmF0aW9uCQEPZ2V0SW50ZWdlckJ5S2V5AQkBC2tleUR1cmF0aW9uAgUGaXNzdWVyBQVhcnRJZAQJZW5kSGVpZ2h0CQBkAgUIZHVyYXRpb24FBmhlaWdodAMJAGcCBQxvbGRFbmRIZWlnaHQFBmhlaWdodAkAAgECJFByZXZpb3VzIGF1Y3Rpb24gaXNuJ3QgY29tcGxldGVkIHlldAMJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQImQ2FuJ3QgcmVzdGFydCBhdWN0aW9uLCBtYXggYW1vdW50IHNvbGQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlFbmRIZWlnaHQCBQZpc3N1ZXIFBWFydElkBQllbmRIZWlnaHQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkBQNuaWwBFGFjY2VwdEJpZFRyYWRpdGlvbmFsBQFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQJZW5kSGVpZ2h0CQEPZ2V0SW50ZWdlckJ5S2V5AQkBDGtleUVuZEhlaWdodAIFBmlzc3VlcgUFYXJ0SWQEDGhpZ2hlc3RCaWRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkAwkAZwIFCWVuZEhlaWdodAUGaGVpZ2h0CQACAQIhVGhpcyBhdWN0aW9uIGlzIG5vdCB5ZXQgZmluaXNoZWQhAwkBAiE9AgUFYmlkSWQFDGhpZ2hlc3RCaWRJZAkAAgECHFRoaXMgaXMgbm90IHRoZSB3aW5uaW5nIGJpZCEEC2J1eU1pbnREYXRhCQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgYEEnJlc3RhcnRBdWN0aW9uRGF0YQkBDnJlc3RhcnRBdWN0aW9uAgUFYXJ0SWQFBmlzc3VlcgkAzggCBRJyZXN0YXJ0QXVjdGlvbkRhdGEFC2J1eU1pbnREYXRhAQ1jYW5jZWxCaWRJbXBsBAFpBWFydElkBmlzc3VlcgViaWRJZAQMdDAyODk0MjI5MDk0CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQx0MDI4OTQyMjkwOTQCXzEEBmNhbGxlcggFDHQwMjg5NDIyOTA5NAJfMgQEZGF0ZQgFDHQwMjg5NDIyOTA5NAJfMwQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FBmNhbGxlcgIBXwUFYmlkSWQEB2JpZERhdGEJARVnZXRTdHJpbmdCeUtleU9yRXJyb3ICCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8EB2Fzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAAECWJpZFN0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwBGGNhbmNlbEJpZEltcGxUcmFkaXRpb25hbAQBaQVhcnRJZAZpc3N1ZXIFYmlkSWQEDHQwMjg5NDIyOTA5NAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUMdDAyODk0MjI5MDk0Al8xBAZjYWxsZXIIBQx0MDI4OTQyMjkwOTQCXzIEBGRhdGUIBQx0MDI4OTQyMjkwOTQCXzMEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FBWJpZElkBAdiaWREYXRhCQEVZ2V0U3RyaW5nQnlLZXlPckVycm9yAgkArAICBQpiaWREYXRhS2V5AgVfT1BFTgINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAABAliaWRTdGF0dXMCCENBTkNFTEVEBAliaWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEEDGhpZ2hlc3RCaWRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUhpZ2hlc3RCaWRCaWRJZAEFBWFydElkAwkAAAIFBWJpZElkBQxoaWdoZXN0QmlkSWQJAAIBAiFZb3UgY2FuJ3QgY2FuY2VsIHRoZSBoaWdoZXN0IGJpZCEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyBQliaWRBbW91bnQFB2Fzc2V0SWQFA25pbAwBaQEIaW5pdERhcHABB2RhcHBLZXkDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uAwkBAiE9AgUGb3JhY2xlAgAJAAIBAidvcmFjbGUgYWxyZWFkeSBzZXQsIHlvdSBjYW4ndCBvdmVycmlkZSEJAMwIAgkBC1N0cmluZ0VudHJ5AgUJb3JhY2xlS2V5BQdkYXBwS2V5BQNuaWwBaQEUcmVzdGFydEF1Y3Rpb25NYW51YWwBBWFydElkAwkBAiE9AgkBGmdldEFtb3VudEhpZ2hlc3RCaWRCeUFydElkAQUFYXJ0SWQAAAkAAgECHlBsZWFzZSBhY2NlcHQgdGhlIGhpZ2hlc3QgYmlkIQkBDnJlc3RhcnRBdWN0aW9uAgUFYXJ0SWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwFpAQdtaW50TmZ0Awh0b3RhbE5GVAlpc3N1ZU1ldGEKcmVjZWl2ZU5GVAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHE9ubHkgdGhlIGRBcHAgY2FuIG1pbnQgTkZUJ3MEDnJlY2VpdmVORlRBZGR5CQEHQWRkcmVzcwEJANkEAQUKcmVjZWl2ZU5GVAQIaXNzdWVORlQJAMIIBQkArAICAgdTQ09ORVhfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQJAJQKAgkAzAgCBQhpc3N1ZU5GVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5yZWNlaXZlTkZUQWRkeQABBQVpZE5GVAUDbmlsCQDYBAEFBWlkTkZUAWkBCmFkZEFydHdvcmsKCnNoYTI1Nkhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQtlbnRpdGxlbWVudAdwcmV2aWV3CmNvbGxlY3Rpb24Nc3ViY29sbGVjdGlvbgQMdDAxNzc0MDE3NzgxCQEMaWRDYWxsZXJEYXRlAQUBaQQFYXJ0SWQIBQx0MDE3NzQwMTc3ODECXzEEBmNhbGxlcggFDHQwMTc3NDAxNzc4MQJfMgQEZGF0ZQgFDHQwMTc3NDAxNzc4MQJfMwMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFBXR5cGVzBQR0eXBlCQACAQIMVW5rbm93biB0eXBlBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhBQUGY2FsbGVyBQpjaWREaXNwbGF5BQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBB92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUJc3Rha2VEYXBwAg50aGlzIG5vdCBmb3VuZAIZdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudAUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAAUDbmlsAwkAAAIFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UFH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UEC3ByZXZpZXdEYXRhAwkBD2NvbnRhaW5zRWxlbWVudAIFDFByZXZpZXd0eXBlcwUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5UHJldmlld0NpZAIFBmNhbGxlcgUFYXJ0SWQFB3ByZXZpZXcFA25pbAUDbmlsBBZpbnZva2VDb2xsZWN0aW9uQ3JlYXRlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQ9jb2xsZWN0aW9uc0RhcHAJAKwCAgUPY29sbGVjdGlvbnNEYXBwAgogbm90IGZvdW5kAhFjb2xsZWN0aW9uUHJvY2VzcwkAzAgCBQpjb2xsZWN0aW9uCQDMCAIFDXN1YmNvbGxlY3Rpb24JAMwIAgUGY2FsbGVyBQNuaWwFA25pbAMJAAACBRZpbnZva2VDb2xsZWN0aW9uQ3JlYXRlBRZpbnZva2VDb2xsZWN0aW9uQ3JlYXRlBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyAwkBAiE9AgUKZW50cnlFeGlzdAIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQECWhhc2hFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAMJAQIhPQIFCWhhc2hFeGlzdAIACQACAQIfVGhpcyBoYXNoIGlzIGFscmVhZHkgcmVnaXN0ZXJlZAkAzggCBQtwcmV2aWV3RGF0YQkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoBQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgUFYXJ0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5SGFzaEJ5VHhpZEFkZHICBQZjYWxsZXIFBWFydElkBQpzaGEyNTZIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlFbnRpdGxlbWVudAIFBmNhbGxlcgUFYXJ0SWQFC2VudGl0bGVtZW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2VsbEFydHdvcmsMBWFydElkBXByaWNlB21heE1pbnQHYXNzZXRJZAthdWN0aW9uVHlwZQhkdXJhdGlvbgRhZGQxBGFkZDIEYWRkMwZhZGQxU2gGYWRkMlNoBmFkZDNTaAQIY2FsbERhdGEJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFCGNhbGxEYXRhAl8xBAZjYWxsZXIIBQhjYWxsRGF0YQJfMgQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQEH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UJAPwHBAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQlzdGFrZURhcHACDnRoaXMgbm90IGZvdW5kAhl2YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50BQNuaWwJAMwIAgkAkQMCCAUBaQhwYXltZW50cwAABQNuaWwDCQAAAgUfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQUfdmFsaWRhdGVBbmRQcm9jZXNzUGF5bWVudEludm9rZQMDCQBmAgUGYmlkTmJyAAAGCQBmAgUKYW1vdW50U29sZAAACQACAQI4VGhlcmUgYXJlIGJpZHMgb3IgaXRlbXMgc29sZCwgeW91IGNhbiBub3QgZWRpdCBhbnl0aGluZyEEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGF1Y3Rpb25UeXBlMQkAzAgCBQxhdWN0aW9uVHlwZTIJAMwIAgUMYXVjdGlvblR5cGUzBQNuaWwFC2F1Y3Rpb25UeXBlCQACAQIfV2UgZG9uJ3Qga25vdyB0aGlzIGF1Y3Rpb24gdHlwZQMJAAACBQthcnR3b3JrTmFtZQIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBXByaWNlCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAGYCBQdtYXhNaW50AJBOCQACAQIeMTAwMDAgZWRpdGlvbnMgbWF4IHBlciBhcnR3b3JrBApzZWxsU3RhdHVzAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBAd0ZWFtRmVlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQdmZWVEYXBwCQCsAgIFB2ZlZURhcHACCiBub3QgZm91bmQCDHRlYW1TcGxpdEZlZQkAzAgCBQVhcnRJZAkAzAgCBQtmZWVSZWNlaXZlcgkAzAgCAgAJAMwIAgIACQDMCAIAAwkAzAgCAAAJAMwIAgAABQNuaWwFA25pbAMJAAACBQd0ZWFtRmVlBQd0ZWFtRmVlBApjcmVhdG9yRmVlCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQdmZWVEYXBwCQCsAgIFB2ZlZURhcHACCiBub3QgZm91bmQCD2NyZWF0b3JTcGxpdEZlZQkAzAgCBQVhcnRJZAkAzAgCBQRhZGQxCQDMCAIFBGFkZDIJAMwIAgUEYWRkMwkAzAgCBQZhZGQxU2gJAMwIAgUGYWRkMlNoCQDMCAIFBmFkZDNTaAUDbmlsBQNuaWwDCQAAAgUKY3JlYXRvckZlZQUKY3JlYXRvckZlZQQJZW5kSGVpZ2h0CQBkAgUIZHVyYXRpb24FBmhlaWdodAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQhrZXlQcmljZQIFBmNhbGxlcgUFYXJ0SWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQFB21heE1pbnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtrZXlEdXJhdGlvbgIFBmNhbGxlcgUFYXJ0SWQFCGR1cmF0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5RW5kSGVpZ2h0AgUGY2FsbGVyBQVhcnRJZAUJZW5kSGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBdWN0aW9uVHlwZQIFBmNhbGxlcgUFYXJ0SWQFC2F1Y3Rpb25UeXBlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY2FuY2VsU2FsZQIFYXJ0SWQJbWF4VG9TZWxsBApjYWxsZXJEYXRhCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQpjYWxsZXJEYXRhAl8xBAZjYWxsZXIIBQpjYWxsZXJEYXRhAl8yBAthdWN0aW9uVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEOa2V5QXVjdGlvblR5cGUCBQZjYWxsZXIFBWFydElkAixEbyBub3QgdHJ5IHRvIGVkaXQgYSBhdWN0aW9uIHlvdSBkbyBub3Qgb3duIQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGF1Y3Rpb25UeXBlMQkAzAgCBQxhdWN0aW9uVHlwZTMFA25pbAULYXVjdGlvblR5cGUJAAIBAidZb3UgY2FuIG5vdCBjYW5jZWwgdGhpcyB0eXBlIG9mIGF1Y3Rpb24ECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAMJAGYCBQphbW91bnRTb2xkBQltYXhUb1NlbGwJAAIBCQCsAgICJ1lvdSBjYW4gbm90IGxvd2VyIHRoZSBtYXhDYW5TZWxsIGJlbG93IAkApAMBBQphbW91bnRTb2xkAwkAZgIFCW1heFRvU2VsbAUKbWF4Q2FuU2VsbAkAAgECLVlvdSBjYW4gbm90IGluY3JlYXNlIHRoZSBtYXhDYW5TZWxsIHBhcmFtZXRlcgQJYm9vbEVudHJ5AwkAAAIFCW1heFRvU2VsbAUKYW1vdW50U29sZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQHBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQFCW1heFRvU2VsbAUDbmlsBQlib29sRW50cnkBaQEKYnV5QXJ0d29yawIFYXJ0SWQGaXNzdWVyBAthdWN0aW9uVHlwZQkBDmdldFN0cmluZ0J5S2V5AQkBDmtleUF1Y3Rpb25UeXBlAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthdWN0aW9uVHlwZQUMYXVjdGlvblR5cGUzCQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXICAAIABwkAAgECNERpcmVjdCBidXkgb25seSBhbGxvd2VkIHdoZW4gbm8gYXVjdGlvbiB0eXBlIGlzIHNldCEBaQEKdXBkYXRlVGFncwMGYXJ0aXN0BWFydElkBHRhZ3MEBmNhbGxlcgkApQgBCQCnCAEIBQFpD2NhbGxlclB1YmxpY0tleQMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFBm93bmVycwUGY2FsbGVyCQACAQICbm8DCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguBAd0YWdzT2xkCQEVZ2V0U3RyaW5nQnlLZXlPckVycm9yAgkBB2tleVRhZ3MCBQZhcnRpc3QFBWFydElkAi9ObyB0YWdzIGNyZWF0ZWQgd2l0aCB0aGlzIGtleSwgc28gY2FuJ3QgdXBkYXRlIQMJAAACBQR0YWdzBQd0YWdzT2xkCQACAQIeVGFncyBhcmUgdGhlIHNhbWUgYXMgb2xkIHRhZ3MhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGYXJ0aXN0BQVhcnRJZAUEdGFncwUDbmlsAWkBC2RlbGV0ZUVudHJ5AQVlbnRyeQQGY2FsbGVyCQClCAEJAKcIAQgFAWkPY2FsbGVyUHVibGljS2V5AwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUGb3duZXJzBQZjYWxsZXIJAAIBAgJubwkAzAgCCQELRGVsZXRlRW50cnkBBQVlbnRyeQUDbmlsAWkBBnNldEJpZAIFYXJ0SWQGaXNzdWVyBAthdWN0aW9uVHlwZQkBDmdldFN0cmluZ0J5S2V5AQkBDmtleUF1Y3Rpb25UeXBlAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthdWN0aW9uVHlwZQUMYXVjdGlvblR5cGUxCQEUc2V0QmlkTm9uVHJhZGl0aW9uYWwDBQFpBQVhcnRJZAUGaXNzdWVyAwkAAAIFC2F1Y3Rpb25UeXBlBQxhdWN0aW9uVHlwZTIJARFzZXRCaWRUcmFkaXRpb25hbAMFAWkFBWFydElkBQZpc3N1ZXIJAAIBCQCsAgIJAKwCAgIWVW5rbm93biBhdWN0aW9uIHR5cGUgOgULYXVjdGlvblR5cGUCGywgcGxlYXNlIGNvbnRhY3QgdGhlIGFkbWlucwFpAQlhY2NlcHRCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQLYXVjdGlvblR5cGUJAQ5nZXRTdHJpbmdCeUtleQEJAQ5rZXlBdWN0aW9uVHlwZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXVjdGlvblR5cGUFDGF1Y3Rpb25UeXBlMQkBF2FjY2VwdEJpZE5vblRyYWRpdGlvbmFsBQUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyAwkAAAIFC2F1Y3Rpb25UeXBlBQxhdWN0aW9uVHlwZTIJARRhY2NlcHRCaWRUcmFkaXRpb25hbAUFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgkAAgEJAKwCAgkArAICAhZVbmtub3duIGF1Y3Rpb24gdHlwZSA6BQthdWN0aW9uVHlwZQIbLCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zAWkBCWNhbmNlbEJpZAMFYXJ0SWQGaXNzdWVyBWJpZElkBAthdWN0aW9uVHlwZQkBDmdldFN0cmluZ0J5S2V5AQkBDmtleUF1Y3Rpb25UeXBlAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthdWN0aW9uVHlwZQUMYXVjdGlvblR5cGUxCQENY2FuY2VsQmlkSW1wbAQFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkCQEYY2FuY2VsQmlkSW1wbFRyYWRpdGlvbmFsBAUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQAXnec+Q==", "height": 2161590, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GLDpPKi4RNQ3oPnh2uBiTa69SC9qTs6Tcw6GQaU5ZRtd Next: none Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let unitTest = false
55
66 let oracleKey = "oracleKey"
77
88 func getStr (key) = match getString(this, key) {
99 case b: String =>
1010 b
1111 case _ =>
1212 ""
1313 }
1414
1515
1616 let oracle = getStr(oracleKey)
1717
1818 let oracleFee = value(addressFromString(oracle))
1919
2020 let owners = [getString(oracleFee, "owner1"), getString(oracleFee, "owner2")]
2121
2222 let collectionsDapp = valueOrErrorMessage(getString(oracleFee, "collectionsDapp"), "collectionDapp not found")
2323
2424 let feeReceiver = valueOrErrorMessage(getString(oracleFee, "feeReceiver"), "feeReceiver not found")
2525
2626 let certDapp = valueOrErrorMessage(getString(oracleFee, "certDapp"), "certDapp not found")
2727
2828 let feeDapp = valueOrErrorMessage(getString(oracleFee, "feeDapp"), "feeDapp not found")
2929
3030 let userDapp = value(addressFromString(valueOrErrorMessage(getString(oracleFee, "userDapp"), "userdapp not found")))
3131
3232 let stakeDapp = addressFromString(valueOrErrorMessage(getString(oracleFee, "stakeDapp"), "sconexDapp not found"))
3333
3434 let USDNAssetId = fromBase58String(getStringValue(oracleFee, "USDNAssetId"))
3535
3636 let SconexAssetId = fromBase58String(getStringValue(oracleFee, "SconexAssetId"))
3737
3838 let types = ["IMAGE", "PDF", "VIDEO"]
3939
4040 let Previewtypes = ["PDF"]
4141
4242 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
4343
4444 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
4545
4646 let userSuspended = "SUSPENDED"
4747
4848 let userRemoved = "REMOVED"
4949
5050 let userUnregistered = "UNREGISTERED"
5151
5252 let auctionType1 = "BIDTYPE"
5353
5454 let auctionType2 = "TRADITIONAL"
5555
5656 let auctionType3 = "DIRECT"
5757
5858 func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
5959
6060
6161 func getStringByKey (key) = valueOrElse(getString(this, key), "")
6262
6363
6464 func getStringByKeyOrError (key,error) = valueOrErrorMessage(getString(this, key), error)
6565
6666
6767 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
6868
6969
7070 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
7171
7272
7373 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
7474
7575
7676 func validateHash (hash) = (size(hash) == 64)
7777
7878
7979 func keyUserStatus (caller) = ("user_status_" + caller)
8080
8181
8282 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
8383
8484
8585 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
8686
8787
8888 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
8989
9090
9191 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
9292
9393
9494 func keyPreviewCid (caller,artId) = ((("art_preview_cid_" + artId) + "_") + caller)
9595
9696
9797 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
9898
9999
100100 func keyHighestBidBidId (artId) = ("art_highestBidBidId_" + artId)
101101
102102
103103 func keyBidId (bidId) = ("bid_" + bidId)
104104
105105
106106 func keyDuration (caller,artId) = ((("art_duration_" + artId) + "_") + caller)
107107
108108
109109 func keyEndHeight (caller,artId) = ((("art_endheight_" + artId) + "_") + caller)
110110
111111
112112 func keyAuctionType (caller,artId) = ((("art_auctiontype_" + artId) + "_") + caller)
113113
114114
115115 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
116116
117117
118118 func KeyNftIssuer (nftId) = ("nft_issued_" + nftId)
119119
120120
121121 func KeyNftArtId (nftId) = ("nft_artId_" + nftId)
122122
123123
124124 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
125125
126126
127127 func keyEntitlement (caller,artId) = ((("art_entitlement_" + artId) + "_") + caller)
128128
129129
130130 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
131131
132132
133133 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
134134
135135
136136 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
137137
138138
139139 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
140140
141141
142142 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
143143
144144
145145 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
146146
147147
148148 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
149149
150150
151151 func keyCollection (caller,artId) = ((("collection_" + artId) + "_") + caller)
152152
153153
154154 let minUSDNPrice = getIntegerByKeyFromOracle(("min_" + toBase58String(USDNAssetId)))
155155
156156 let currentFeeSconex = getIntegerByKeyFromOracle(("fee_" + toBase58String(SconexAssetId)))
157157
158158 func getAmountByBidId (bidId) = valueOrElse(getIntegerByKey(keyBidId(bidId)), 0)
159159
160160
161161 func getAmountHighestBidByArtId (artId) = {
162162 let bidId = getStringByKey(keyHighestBidBidId(artId))
163163 getAmountByBidId(bidId)
164164 }
165165
166166
167167 func validateString (str,max) = if ((size(str) == 0))
168168 then throw("Field cannot be is empty")
169169 else if ((size(str) > max))
170170 then throw((str + " is too long"))
171171 else true
172172
173173
174174 func validateUser (caller) = {
175175 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
176176 if ((userStatus == userUnregistered))
177177 then "Register this account first with 'Account' tab"
178178 else if ((userStatus == userSuspended))
179179 then "Account suspended"
180180 else if ((userStatus == userRemoved))
181181 then "Account removed"
182182 else ""
183183 }
184184
185185
186186 func validateArtworkData (caller,cidDisplay,name,description,tags) = {
187187 let checkUser = validateUser(caller)
188188 if ((checkUser != ""))
189189 then throw(checkUser)
190190 else if ((size(cidDisplay) == 0))
191191 then throw("Display CID cannot be empty")
192192 else if ((size(cidDisplay) != 46))
193193 then throw("This doesn't seem a valid CID!")
194194 else if (!(validateString(name, 100)))
195195 then throw("100 Char. max name")
196196 else if (!(validateString(description, 1000)))
197197 then throw("1000 Char. max description")
198198 else if ((size(split(tags, ",")) > 5))
199199 then throw("5 tags max.")
200200 else ""
201201 }
202202
203203
204204 func isPayment (i,index) = if ((size(i.payments) == 0))
205205 then throw("No payment attached")
206206 else {
207207 let payment = value(i.payments[index])
208208 let amount = value(payment.amount)
209209 $Tuple2(payment, amount)
210210 }
211211
212212
213213 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
214214 case b: Int =>
215215 if ((b != 0))
216216 then true
217217 else false
218218 case _ =>
219219 false
220220 }
221221
222222
223223 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
224224 let pData = isPayment(i, 1)
225225 let payment = pData._1
226226 let amount = pData._2
227227 let assetId = if (!(isDefined(payment.assetId)))
228228 then throw("Asset Id is not defined")
229229 else if (if ((size(priceAssetId) > 0))
230230 then (toBase58String(value(payment.assetId)) == priceAssetId)
231231 else false)
232232 then payment.assetId
233233 else throw("Wrong asset id")
234234 if ((artworkPrice != amount))
235235 then throw(((("Payment don't match " + toString(artworkPrice)) + " ") + toString(amount)))
236236 else $Tuple2(amount, assetId)
237237 }
238238
239239
240240 func acceptedAssetIds (assetId) = if ((assetId != toBase58String(USDNAssetId)))
241241 then throw("Only USDN accepted")
242242 else true
243243
244244
245245 func validateMinSell (assetId,price) = {
246246 let minSellSconex = minUSDNPrice
247247 if (if (if ((price != 0))
248248 then (minSellSconex > price)
249249 else false)
250250 then true
251251 else (assetId != toBase58String(USDNAssetId)))
252252 then throw(("Wrong minimum sell price " + toString(minSellSconex)))
253253 else true
254254 }
255255
256256
257257 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
258258 then throw("Only USDN is accepted!")
259259 else fromBase58String(assetId)
260260
261261
262262 func getPriceAssetIdFromBid (bidDataKey) = {
263263 let bidData = getStringByKey((bidDataKey + "_OPEN"))
264264 if ((bidData == ""))
265265 then throw("Bid not found")
266266 else {
267267 let bidDataArr = split(bidData, "_")
268268 let bidAmount = parseIntValue(bidDataArr[1])
269269 let bidAssetId = getBidAssetId(bidDataArr[0])
270270 if ((0 >= bidAmount))
271271 then throw("Wrong amount")
272272 else $Tuple2(bidAmount, bidAssetId)
273273 }
274274 }
275275
276276
277277 func idCallerDate (i) = if (!(dappRunning))
278278 then throw(maintenanceMSG)
279279 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
280280
281281
282282 func getArtData (i,issuer,artId,isBid) = {
283283 let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
284284 let totalNFT = getIntegerByKey("total_nft_issued")
285285 let artworkName = getStringByKey(keyName(issuer, artId))
286286 if ((artworkName == ""))
287287 then throw("Art doesn't exist")
288288 else {
289289 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
290290 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
291291 let artworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), minUSDNPrice)
292292 let priceAssetId = if (callerIsIssuer)
293293 then toBase58String(USDNAssetId)
294294 else getStringByKey(keyAssetIdAccepted(issuer, artId))
295295 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
296296 if (if (if (!(isBid))
297297 then !(callerIsIssuer)
298298 else false)
299299 then if (if ((0 >= artworkPrice))
300300 then true
301301 else !(isOnSale))
302302 then true
303303 else (0 >= maxCanSell)
304304 else false)
305305 then throw("Art not for sale")
306306 else if (if (if (!(isBid))
307307 then callerIsIssuer
308308 else false)
309309 then (0 >= maxCanSell)
310310 else false)
311311 then throw("Max issuable not set")
312312 else $Tuple7(totalNFT, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell, isOnSale)
313313 }
314314 }
315315
316316
317317 func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = {
318318 let checkUser = validateUser(issuer)
319319 if (if (isBid)
320320 then (checkUser != "")
321321 else false)
322322 then throw(checkUser)
323323 else {
324324 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
325325 let t01351913648 = if (isBid)
326326 then getPriceAssetIdFromBid(bidDataKey)
327327 else validatePriceAssetId(i, priceAssetId, artworkPrice)
328328 let amount = t01351913648._1
329329 let assetId = t01351913648._2
330330 $Tuple3(bidDataKey, amount, assetId)
331331 }
332332 }
333333
334334
335335 func getIssueData (issuer,artId,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i,isOnSale) = {
336336 let issueMeta = ((((((((("Creator: " + issuer) + ",ArtID: ") + artId) + ",Artwork name: ") + artworkName) + ",Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
337337 let sellStatus = if (if ((newAmountSold == maxCanSell))
338338 then true
339339 else !(isOnSale))
340340 then false
341341 else true
342342 let receiveNFT = if ((bidOwner != ""))
343343 then addressFromStringValue(bidOwner)
344344 else i.caller
345345 $Tuple3(sellStatus, receiveNFT, issueMeta)
346346 }
347347
348348
349349 func getBidKeyVal (assetId,bidDataKey,date) = {
350350 let assetIdBid = if (!(isDefined(assetId)))
351351 then throw("Only USDN is accepted")
352352 else toBase58String(value(assetId))
353353 let bidData = getStringByKey((bidDataKey + "_OPEN"))
354354 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
355355 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
356356 $Tuple3(assetIdBid, bidDelOld, bidUpdate)
357357 }
358358
359359
360360 func buyMint (i,artId,issuer,bidId,bidOwner,isBid) = {
361361 let callerData = idCallerDate(i)
362362 let id = callerData._1
363363 let caller = callerData._2
364364 let date = callerData._3
365365 let artData = getArtData(i, issuer, artId, isBid)
366366 let totalNFT = artData._1
367367 let artworkName = artData._2
368368 let amountSold = artData._3
369369 let artworkPrice = artData._4
370370 let priceAssetId = artData._5
371371 let maxCanSell = artData._6
372372 let isOnSale = artData._7
373373 let bidData = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid)
374374 let bidDataKey = bidData._1
375375 let amount = bidData._2
376376 let assetId = bidData._3
377377 let newAmountSold = if ((amountSold == maxCanSell))
378378 then throw("Max items sold")
379379 else (amountSold + 1)
380380 let issuerData = getIssueData(issuer, artId, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i, isOnSale)
381381 let sellStatus = issuerData._1
382382 let receiveNFT = issuerData._2
383383 let issueMeta = issuerData._3
384384 let idNFTInvoke = invoke(this, "mintNft", [totalNFT, issueMeta, toString(receiveNFT)], nil)
385385 if ((idNFTInvoke == idNFTInvoke))
386386 then {
387387 let idNFT = match idNFTInvoke {
388388 case r: String =>
389389 r
390390 case _ =>
391391 throw("Incorrect invoke result")
392392 }
393393 let bidKeyValue = getBidKeyVal(assetId, bidDataKey, date)
394394 let assetIdBid = bidKeyValue._1
395395 let bidDelOld = bidKeyValue._2
396396 let bidUpdate = bidKeyValue._3
397397 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
398398 let soldValue = if (!(isBid))
399399 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + idNFT)
400400 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + idNFT)
401401 let invokeTeamFeeSplit = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "payFee", [artId, issuer], [AttachedPayment(assetId, amount)])
402402 if ((invokeTeamFeeSplit == invokeTeamFeeSplit))
403403 then {
404404 let soldData = StringEntry(soldKey, soldValue)
405405 let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + idNFT), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), StringEntry(KeyNftIssuer(idNFT), issuer), StringEntry(KeyNftArtId(idNFT), artId)]
406406 let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
407407 if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
408408 then {
409409 let res = invoke(addressFromStringValue(certDapp), "createCert", [toString(receiveNFT), idNFT, issuer], nil)
410410 if ((res == res))
411411 then if (isBid)
412412 then (((buyRes :+ soldData) :+ bidUpdate) :+ bidDelOld)
413413 else soldData :: buyRes
414414 else throw("Strict value is not equal to itself.")
415415 }
416416 else throw("Strict value is not equal to itself.")
417417 }
418418 else throw("Strict value is not equal to itself.")
419419 }
420420 else throw("Strict value is not equal to itself.")
421421 }
422422
423423
424424 func setBidNonTraditional (i,artId,issuer) = {
425425 let t02770927747 = idCallerDate(i)
426426 let id = t02770927747._1
427427 let caller = t02770927747._2
428428 let date = t02770927747._3
429429 let t02775227788 = isPayment(i, 0)
430430 let payment = t02775227788._1
431431 let amount = t02775227788._2
432432 let assetId = if (!(isDefined(payment.assetId)))
433433 then throw("Only USDN is accepted!")
434434 else toBase58String(value(payment.assetId))
435435 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
436436 if (!(acceptedAssetIds(assetId)))
437437 then throw("asset not accepted")
438438 else {
439439 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
440440 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
441441 if ((0 >= maxCanSell))
442442 then throw("No max edition set for this artwork")
443443 else if ((amountSold >= maxCanSell))
444444 then throw("Sold out, you cannot bid")
445445 else {
446446 let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]])
447447 if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
448448 then [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
449449 else throw("Strict value is not equal to itself.")
450450 }
451451 }
452452 }
453453
454454
455455 func setBidTraditional (i,artId,issuer) = {
456456 let endHeight = getIntegerByKey(keyEndHeight(issuer, artId))
457457 let highestBid = getAmountHighestBidByArtId(artId)
458458 if ((height > endHeight))
459459 then throw("This auction is finished already!")
460460 else {
461461 let callderData = idCallerDate(i)
462462 let id = callderData._1
463463 let caller = callderData._2
464464 let date = callderData._3
465465 let isPaymentVar = isPayment(i, 0)
466466 let payment = isPaymentVar._1
467467 let amount = isPaymentVar._2
468468 if ((highestBid >= amount))
469469 then throw(("Please place a bid higher than: " + toString(highestBid)))
470470 else {
471471 let assetId = if (!(isDefined(payment.assetId)))
472472 then throw("Only USDN is accepted!")
473473 else toBase58String(value(payment.assetId))
474474 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
475475 let minArtworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), minUSDNPrice)
476476 if (!(acceptedAssetIds(assetId)))
477477 then throw("asset not accepted")
478478 else if ((minArtworkPrice > amount))
479479 then throw("Bid is below min price!")
480480 else {
481481 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
482482 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
483483 if ((0 >= maxCanSell))
484484 then throw("No max edition set for this artwork")
485485 else if ((amountSold >= maxCanSell))
486486 then throw("Sold out, you cannot bid")
487487 else {
488488 let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]])
489489 if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
490490 then [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1)), StringEntry(keyHighestBidBidId(artId), toBase58String(i.transactionId)), IntegerEntry(keyBidId(toBase58String(i.transactionId)), amount)]
491491 else throw("Strict value is not equal to itself.")
492492 }
493493 }
494494 }
495495 }
496496 }
497497
498498
499499 func acceptBidNonTraditional (i,artId,issuer,bidId,bidOwner) = {
500500 let caller = toBase58String(i.caller.bytes)
501501 if ((caller != issuer))
502502 then throw("You cannot do this action")
503503 else buyMint(i, artId, issuer, bidId, bidOwner, true)
504504 }
505505
506506
507507 func restartAuction (artId,issuer) = {
508508 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
509509 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
510510 let oldEndHeight = getIntegerByKey(keyEndHeight(issuer, artId))
511511 let duration = getIntegerByKey(keyDuration(issuer, artId))
512512 let endHeight = (duration + height)
513513 if ((oldEndHeight >= height))
514514 then throw("Previous auction isn't completed yet")
515515 else if ((amountSold == maxCanSell))
516516 then throw("Can't restart auction, max amount sold")
517517 else [IntegerEntry(keyEndHeight(issuer, artId), endHeight), DeleteEntry(keyHighestBidBidId(artId))]
518518 }
519519
520520
521521 func acceptBidTraditional (i,artId,issuer,bidId,bidOwner) = {
522522 let endHeight = getIntegerByKey(keyEndHeight(issuer, artId))
523523 let highestBidId = getStringByKey(keyHighestBidBidId(artId))
524524 if ((endHeight >= height))
525525 then throw("This auction is not yet finished!")
526526 else if ((bidId != highestBidId))
527527 then throw("This is not the winning bid!")
528528 else {
529529 let buyMintData = buyMint(i, artId, issuer, bidId, bidOwner, true)
530530 let restartAuctionData = restartAuction(artId, issuer)
531531 (restartAuctionData ++ buyMintData)
532532 }
533533 }
534534
535535
536536 func cancelBidImpl (i,artId,issuer,bidId) = {
537537 let t02894229094 = idCallerDate(i)
538538 let id = t02894229094._1
539539 let caller = t02894229094._2
540540 let date = t02894229094._3
541541 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
542542 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
543543 let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
544544 let bidDataArr = split(bidData, "_")
545545 let assetId = getBidAssetId(bidDataArr[0])
546546 let bidStatus = "CANCELED"
547547 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
548548 }
549549
550550
551551 func cancelBidImplTraditional (i,artId,issuer,bidId) = {
552552 let t02894229094 = idCallerDate(i)
553553 let id = t02894229094._1
554554 let caller = t02894229094._2
555555 let date = t02894229094._3
556556 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
557557 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
558558 let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
559559 let bidDataArr = split(bidData, "_")
560560 let assetId = getBidAssetId(bidDataArr[0])
561561 let bidStatus = "CANCELED"
562562 let bidAmount = parseIntValue(bidDataArr[1])
563563 let highestBidId = getStringByKey(keyHighestBidBidId(artId))
564564 if ((bidId == highestBidId))
565565 then throw("You can't cancel the highest bid!")
566566 else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)]
567567 }
568568
569569
570570 @Callable(i)
571571 func initDapp (dappKey) = if ((i.caller != this))
572572 then throw("You cannot do this action")
573573 else if ((oracle != ""))
574574 then throw("oracle already set, you can't override!")
575575 else [StringEntry(oracleKey, dappKey)]
576576
577577
578578
579579 @Callable(i)
580580 func restartAuctionManual (artId) = if ((getAmountHighestBidByArtId(artId) != 0))
581581 then throw("Please accept the highest bid!")
582582 else restartAuction(artId, toBase58String(i.caller.bytes))
583583
584584
585585
586586 @Callable(i)
587587 func mintNft (totalNFT,issueMeta,receiveNFT) = if ((i.caller != this))
588588 then throw("Only the dApp can mint NFT's")
589589 else {
590590 let receiveNFTAddy = Address(fromBase58String(receiveNFT))
591591 let issueNFT = Issue(("SCONEX_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
592592 let idNFT = calculateAssetId(issueNFT)
593593 $Tuple2([issueNFT, ScriptTransfer(receiveNFTAddy, 1, idNFT)], toBase58String(idNFT))
594594 }
595595
596596
597597
598598 @Callable(i)
599599 func addArtwork (sha256Hash,name,description,tags,type,cidDisplay,entitlement,preview,collection,subcollection) = {
600600 let t01774017781 = idCallerDate(i)
601601 let artId = t01774017781._1
602602 let caller = t01774017781._2
603603 let date = t01774017781._3
604604 if (!(containsElement(types, type)))
605605 then throw("Unknown type")
606606 else {
607607 let validateArtwork = validateArtworkData(caller, cidDisplay, name, description, tags)
608608 if ((validateArtwork != ""))
609609 then throw("Something went wrong!")
610610 else {
611611 let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
612612 if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
613613 then {
614614 let previewData = if (containsElement(Previewtypes, type))
615615 then [StringEntry(keyPreviewCid(caller, artId), preview)]
616616 else nil
617617 let invokeCollectionCreate = invoke(valueOrErrorMessage(addressFromString(collectionsDapp), (collectionsDapp + " not found")), "collectionProcess", [collection, subcollection, caller], nil)
618618 if ((invokeCollectionCreate == invokeCollectionCreate))
619619 then {
620620 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
621621 if ((entryExist != ""))
622622 then throw("You already added it")
623623 else {
624624 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
625625 if ((hashExist != ""))
626626 then throw("This hash is already registered")
627627 else (previewData ++ [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyEntitlement(caller, artId), entitlement)])
628628 }
629629 }
630630 else throw("Strict value is not equal to itself.")
631631 }
632632 else throw("Strict value is not equal to itself.")
633633 }
634634 }
635635 }
636636
637637
638638
639639 @Callable(i)
640640 func sellArtwork (artId,price,maxMint,assetId,auctionType,duration,add1,add2,add3,add1Sh,add2Sh,add3Sh) = {
641641 let callData = idCallerDate(i)
642642 let id = callData._1
643643 let caller = callData._2
644644 let amountSold = getIntegerByKey(keyIssued(caller, artId))
645645 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
646646 let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
647647 if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
648648 then if (if ((bidNbr > 0))
649649 then true
650650 else (amountSold > 0))
651651 then throw("There are bids or items sold, you can not edit anything!")
652652 else {
653653 let artworkName = getStringByKey(keyName(caller, artId))
654654 if (!(containsElement([auctionType1, auctionType2, auctionType3], auctionType)))
655655 then throw("We don't know this auction type")
656656 else if ((artworkName == ""))
657657 then throw("This art doesn't match your account")
658658 else if (!(acceptedAssetIds(assetId)))
659659 then throw("Something went wrong!")
660660 else if (!(validateMinSell(assetId, price)))
661661 then throw("Something went wrong!")
662662 else {
663663 let checkUser = validateUser(caller)
664664 if ((checkUser != ""))
665665 then throw(checkUser)
666666 else if ((maxMint > 10000))
667667 then throw("10000 editions max per artwork")
668668 else {
669669 let sellStatus = if ((price > 0))
670670 then (maxMint > 0)
671671 else false
672672 let teamFee = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "teamSplitFee", [artId, feeReceiver, "", "", 3, 0, 0], nil)
673673 if ((teamFee == teamFee))
674674 then {
675675 let creatorFee = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "creatorSplitFee", [artId, add1, add2, add3, add1Sh, add2Sh, add3Sh], nil)
676676 if ((creatorFee == creatorFee))
677677 then {
678678 let endHeight = (duration + height)
679679 [BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), IntegerEntry(keyDuration(caller, artId), duration), IntegerEntry(keyEndHeight(caller, artId), endHeight), StringEntry(keyAssetIdAccepted(caller, artId), assetId), StringEntry(keyAuctionType(caller, artId), auctionType)]
680680 }
681681 else throw("Strict value is not equal to itself.")
682682 }
683683 else throw("Strict value is not equal to itself.")
684684 }
685685 }
686686 }
687687 else throw("Strict value is not equal to itself.")
688688 }
689689
690690
691691
692692 @Callable(i)
693693 func cancelSale (artId,maxToSell) = {
694694 let callerData = idCallerDate(i)
695695 let id = callerData._1
696696 let caller = callerData._2
697697 let auctionType = valueOrErrorMessage(keyAuctionType(caller, artId), "Do not try to edit a auction you do not own!")
698698 if (containsElement([auctionType1, auctionType3], auctionType))
699699 then throw("You can not cancel this type of auction")
700700 else {
701701 let amountSold = getIntegerByKey(keyIssued(caller, artId))
702702 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
703703 if ((amountSold > maxToSell))
704704 then throw(("You can not lower the maxCanSell below " + toString(amountSold)))
705705 else if ((maxToSell > maxCanSell))
706706 then throw("You can not increase the maxCanSell parameter")
707707 else {
708708 let boolEntry = if ((maxToSell == amountSold))
709709 then [BooleanEntry(keyOnSale(caller, artId), false)]
710710 else nil
711711 ([IntegerEntry(keyMaxMint(caller, artId), maxToSell)] ++ boolEntry)
712712 }
713713 }
714714 }
715715
716716
717717
718718 @Callable(i)
719719 func buyArtwork (artId,issuer) = {
720720 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
721721 if ((auctionType == auctionType3))
722722 then buyMint(i, artId, issuer, "", "", false)
723723 else throw("Direct buy only allowed when no auction type is set!")
724724 }
725725
726726
727727
728728 @Callable(i)
729729 func updateTags (artist,artId,tags) = {
730730 let caller = toString(addressFromPublicKey(i.callerPublicKey))
731731 if (!(containsElement(owners, caller)))
732732 then throw("no")
733733 else if ((size(split(tags, ",")) > 5))
734734 then throw("5 tags max.")
735735 else {
736736 let tagsOld = getStringByKeyOrError(keyTags(artist, artId), "No tags created with this key, so can't update!")
737737 if ((tags == tagsOld))
738738 then throw("Tags are the same as old tags!")
739739 else [StringEntry(keyTags(artist, artId), tags)]
740740 }
741741 }
742742
743743
744744
745745 @Callable(i)
746746 func deleteEntry (entry) = {
747747 let caller = toString(addressFromPublicKey(i.callerPublicKey))
748748 if (!(containsElement(owners, caller)))
749749 then throw("no")
750750 else [DeleteEntry(entry)]
751751 }
752752
753753
754754
755755 @Callable(i)
756756 func setBid (artId,issuer) = {
757757 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
758758 if ((auctionType == auctionType1))
759759 then setBidNonTraditional(i, artId, issuer)
760760 else if ((auctionType == auctionType2))
761761 then setBidTraditional(i, artId, issuer)
762762 else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
763763 }
764764
765765
766766
767767 @Callable(i)
768768 func acceptBid (artId,issuer,bidId,bidOwner) = {
769769 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
770770 if ((auctionType == auctionType1))
771771 then acceptBidNonTraditional(i, artId, issuer, bidId, bidOwner)
772772 else if ((auctionType == auctionType2))
773773 then acceptBidTraditional(i, artId, issuer, bidId, bidOwner)
774774 else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
775775 }
776776
777777
778778
779779 @Callable(i)
780780 func cancelBid (artId,issuer,bidId) = {
781781 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
782782 if ((auctionType == auctionType1))
783783 then cancelBidImpl(i, artId, issuer, bidId)
784784 else cancelBidImplTraditional(i, artId, issuer, bidId)
785785 }
786786
787787

github/deemru/w8io/873ac7e 
68.57 ms