tx · HS5MDX4eAekX6RqCYd6s8RheWVsLheMBEXir8yA5CD59

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.10.11 06:25 [2793421] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "HS5MDX4eAekX6RqCYd6s8RheWVsLheMBEXir8yA5CD59", "fee": 2600000, "feeAssetId": null, "timestamp": 1696994763541, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "92btZi9TWiPXBeAmYRyLxPDFaj74FkcrRmPTiob33Jjz4BFg3FRnaQ4npTwg2TSBiQbHWa5QDNb7q7ut2RcTjKF" ], "script": "base64:BgJeCAISBAoCCAgSDgoMCAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICFsAB1ZFUlNJT04CBTIuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX29yYWNsZV9mZWUACHNpZ25EYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfc2lnbndlYl9kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIACHVzZXJEYXBwAwUIdW5pdFRlc3QJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAA13aGl0ZWxpc3REYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfd2hpdGVsaXN0X2RhcHAAD3B1enpsZV9hcnRfcG9vbAkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9wdXp6bGVfYXJ0X3Bvb2wAEXVzZHRQUEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRFRfUFAADmFydEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhdjb25mX2FjY2VwdGVkX2Fzc2V0X0FSVAARdXNkY1BQQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEQ19QUAAPZWFzdEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X0VBU1QAEXB1enpsZUFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X1BVWlpMRQAQZXRoUFBBc3NldElkX3N0cgkBDmdldFN0cmluZ0J5S2V5AQIaY29uZl9hY2NlcHRlZF9hc3NldF9FVEhfUFAAEHdhdmVzQXNzZXRJZF9zdHICBVdBVkVTAA11c2R0UFBBc3NldElkCQDZBAEFEXVzZHRQUEFzc2V0SWRfc3RyAAphcnRBc3NldElkCQDZBAEFDmFydEFzc2V0SWRfc3RyAA11c2RjUFBBc3NldElkCQDZBAEFEXVzZGNQUEFzc2V0SWRfc3RyAAtlYXN0QXNzZXRJZAkA2QQBBQ9lYXN0QXNzZXRJZF9zdHIADXB1enpsZUFzc2V0SWQJANkEAQURcHV6emxlQXNzZXRJZF9zdHIADGV0aFBQQXNzZXRJZAkA2QQBBRBldGhQUEFzc2V0SWRfc3RyAAx3YXZlc0Fzc2V0SWQBAAATYWxsX2FjY2VwdGVkX2Fzc2V0cwkAzAgCBRF1c2R0UFBBc3NldElkX3N0cgkAzAgCBQ5hcnRBc3NldElkX3N0cgkAzAgCBRF1c2RjUFBBc3NldElkX3N0cgkAzAgCBQ9lYXN0QXNzZXRJZF9zdHIJAMwIAgURcHV6emxlQXNzZXRJZF9zdHIJAMwIAgUQd2F2ZXNBc3NldElkX3N0cgkAzAgCBRBldGhQUEFzc2V0SWRfc3RyBQNuaWwABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAOY29tbWlzc2lvbl9mZWUACAAOZGVmYXVsdExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECFGNvbmZfZGVmYXVsdF9saWNlbmNlABJkZWZhdWx0SGFzaExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECGWNvbmZfZGVmYXVsdF9saWNlbmNlX2hhc2gAC2RhcHBSdW5uaW5nCQELdmFsdWVPckVsc2UCCQCbCAIFCHVzZXJEYXBwAhRjb25mX2RhcHBfaXNfcnVubmluZwYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwAhRjb25mX21haW50ZW5hbmNlX21zZwIAAA11c2VyU3VzcGVuZGVkAglTVVNQRU5ERUQAC3VzZXJSZW1vdmVkAgdSRU1PVkVEABB1c2VyVW5yZWdpc3RlcmVkAgxVTlJFR0lTVEVSRUQAC3VzZXJBbGxvd2VkAgdBTExPV0VEABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEFCmFydEFzc2V0SWQACG1pbnRfZmVlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgIJbWludF9mZWVfCQDYBAEFCmFydEFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBC3ZhbGlkYXRlQ0lEAQNjaWQDCQEIY29udGFpbnMCBQNjaWQCAS8DAwkAZgIATAkAsQIBBQNjaWQJAAACCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAAA7BwkAZgIAEAkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAEHBwEMdmFsaWRhdGVIYXNoAQRoYXNoCQAAAgkAsQIBBQRoYXNoAEABDWtleVVzZXJTdGF0dXMBBmNhbGxlcgkArAICAgx1c2VyX3N0YXR1c18FBmNhbGxlcgEHa2V5RGF0ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGF0ZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5hbWUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25hbWVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlEZXNjAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kZXNjXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RGlzcGxheUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZGlzcGxheV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlFeHBvcnRIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9leHBvcnRfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDGtleUV4cG9ydENpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBCmtleU1heE1pbnQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlTaWduSUQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X3NpZ25pZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleUlzc3VlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfaXNzdWVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5T25TYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyAQ5rZXlMaWNlbmNlSGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhFhcnRfbGljZW5jZV9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5TGljZW5jZUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUYWdzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90YWdzXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VHlwZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdHlwZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5vdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlDcmF3bGVyAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9jcmF3bGVyX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDGtleVJveWFsdGllcwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5RW5kU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfZW5kc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBEmtleUFzc2V0SWRBY2NlcHRlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleUZsYWcCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2ZsYWdfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBcnRpc3RBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgINYXJ0aXN0X2FnZW50XwUKYXJ0aXN0QWRkcgEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgIUYXJ0aXN0X3B1YmxpY19hZ2VudF8FCmFydGlzdEFkZHIBGmtleVByaW1hcnlTaGFyZVB1YmxpY0FnZW50AQphcnRpc3RBZGRyCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBDnZhbGlkYXRlQWxsQ0lEAwpjaWREaXNwbGF5CWNpZEV4cG9ydApjaWRMaWNlbmNlAwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCWNpZEV4cG9ydAkAAgECEFdyb25nIEV4cG9ydCBDSUQDAwkBAiE9AgUKY2lkTGljZW5jZQIACQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZExpY2VuY2UHCQACAQIRV3JvbmcgTGljZW5jZSBDSUQGAQ92YWxpZGF0ZUFsbEhhc2gCDHNoYTI1NkV4cG9ydA1zaGEyNTZMaWNlbmNlAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUMc2hhMjU2RXhwb3J0CQACAQIYRXhwb3J0IEhhc2ggNjQgY2hhci4gbWF4AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUNc2hhMjU2TGljZW5jZQkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBA0kdDAxMDE1NjEwMTkyCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwMTU2MTAxOTICXzEEBmFtb3VudAgFDSR0MDEwMTU2MTAxOTICXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQphcnRBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBA0kdDAxMDc3OTEwODE1CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwNzc5MTA4MTUCXzEEBmFtb3VudAgFDSR0MDEwNzc5MTA4MTUCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFE2FsbF9hY2NlcHRlZF9hc3NldHMFB2Fzc2V0SWQJAAIBAkBPbmx5ICRBUlQsIFVTRFQtUFAsIFVTREMtUFAsIEVBU1QsIFBVWlpMRSwgRVRIIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAQVwcmljZQMJAGcCAAAFBXByaWNlCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQpiaWREYXRhS2V5BAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQJYmlkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBApiaWRBc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAAAwkAZwIAAAUJYmlkQW1vdW50CQACAQIMV3JvbmcgYW1vdW50CQCUCgIFCWJpZEFtb3VudAUKYmlkQXNzZXRJZAEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgFpBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQLaXNTcG9uc29yZWQDCQECIT0CBQZwdWJLZXkCAAkBC3ZhbHVlT3JFbHNlAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkCCV9mcmVlX3R4cwAAAAAEBmNhbGxlcgMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAGYCBQtpc1Nwb25zb3JlZAAABwkApQgBCQCnCAEJANkEAQUGcHViS2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEE2dldF9zcG9uc29yZWRfd2F2ZXMDAwkBAiE9AgUGcHViS2V5AgAJAGYCBQtpc1Nwb25zb3JlZAAABwkA/AcEBQ13aGl0ZWxpc3REYXBwAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUGcHViS2V5BQNuaWwFA25pbAUEdW5pdAMJAAACBRNnZXRfc3BvbnNvcmVkX3dhdmVzBRNnZXRfc3BvbnNvcmVkX3dhdmVzCQCWCgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUGY2FsbGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZgIFC2lzU3BvbnNvcmVkAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGlkQ2FsbGVyRGF0ZQEBaQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEHYnV5TWludAYBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIGcHViS2V5BA0kdDAxMzQyMDEzNTA5CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDEzNDIwMTM1MDkCXzEEBmNhbGxlcggFDSR0MDEzNDIwMTM1MDkCXzIEBGRhdGUIBQ0kdDAxMzQyMDEzNTA5Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDEzNDIwMTM1MDkCXzQEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHAwMFBWlzQmlkCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyBQhtaW50X2ZlZQkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFCmFydEFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTUwODYxNTI3OAMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNTA4NjE1Mjc4Al8xBAdhc3NldElkCAUNJHQwMTUwODYxNTI3OAJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBBQZpc3N1ZXIAAAQLcHVibGljQWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBBBwdWJsaWNBZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBBQZpc3N1ZXIAAAQNaXNXaGl0ZWxpc3RlZAkBDmNoZWNrV2hpdGVsaXN0AQUGaXNzdWVyBA1hbW91bnRGb3JTaWduCQBrAwUGYW1vdW50BQ5jb21taXNzaW9uX2ZlZQBkBA5hbW91bnRGb3JBZ2VudAMDAwkBAiE9AgUFYWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUKYWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFCmFnZW50U2hhcmUAkE4AAAQUYW1vdW50Rm9yUHVibGljQWdlbnQDAwMJAQIhPQIFC3B1YmxpY0FnZW50BQtmZWVSZWNlaXZlcgkAZgIFEHB1YmxpY0FnZW50U2hhcmUAAAcJAGYCBQZoZWlnaHQFDWlzV2hpdGVsaXN0ZWQHCQBrAwUGYW1vdW50BRBwdWJsaWNBZ2VudFNoYXJlAJBOAAAEEGFtb3VudEZvckNyZWF0b3IJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglDcmVhdG9yOiAFBmlzc3VlcgIKLAogQXJ0SUQ6IAUFYXJ0SWQCESwKIEFydHdvcmsgbmFtZTogBQthcnR3b3JrTmFtZQIKLAogSXNzdWU6IAkApAMBBQ1uZXdBbW91bnRTb2xkAgEvCQCkAwEFCm1heENhblNlbGwECGlzc3VlTkZUCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQECnNlbGxTdGF0dXMDAwkAAAIFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwGCQEBIQEFCGlzT25TYWxlBwYECnJlY2VpdmVORlQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQhiaWRPd25lcggFAWkGY2FsbGVyBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkRGVsT2xkCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWRVcGRhdGUJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYmlkRGF0YUtleQIHX0NMT1NFRAkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwkA2AQBBQVpZE5GVAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEFCnJlY2VpdmVORlQCAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUGYW1vdW50AgFfBQphc3NldElkQmlkAgFfCQDYBAEFBWlkTkZUBAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBCJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwAwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50BQ1hbW91bnRGb3JTaWduBBFhbW91bnRfYXJ0X2JlZm9yZQkBCmdldEJhbGFuY2UBBQphcnRBc3NldElkAwkAAAIFEWFtb3VudF9hcnRfYmVmb3JlBRFhbW91bnRfYXJ0X2JlZm9yZQQPc3dhcF9mZWVfdG9fYXJ0AwkBAiE9AgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkA/AcECQEHQWRkcmVzcwEJANkEAQUPcHV6emxlX2FydF9wb29sAgRzd2FwCQDMCAIFDmFydEFzc2V0SWRfc3RyCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBSJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwBQNuaWwFBHVuaXQDCQAAAgUPc3dhcF9mZWVfdG9fYXJ0BQ9zd2FwX2ZlZV90b19hcnQEEGFtb3VudF9hcnRfYWZ0ZXIJAQpnZXRCYWxhbmNlAQUKYXJ0QXNzZXRJZAMJAAACBRBhbW91bnRfYXJ0X2FmdGVyBRBhbW91bnRfYXJ0X2FmdGVyAwYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICE2Fzc2V0aWQgcmVjZWl2ZWQgPSAJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAISYW1vdW50IHJlY2VpdmVkID0gCQCkAwEFBmFtb3VudAImIGFtb3VudF9jb21taXNzaW9uX2Zvcl9zaWduX3RvX3N3YXAgPSAJAKQDAQUiYW1vdW50X2NvbW1pc3Npb25fZm9yX3NpZ25fdG9fc3dhcAIRIGFtb3VudEZvclNpZ24gPSAJAKQDAQUNYW1vdW50Rm9yU2lnbgISIGFtb3VudEZvckFnZW50ID0gCQCkAwEFDmFtb3VudEZvckFnZW50AhQgYW1vdW50Rm9yQ3JlYXRvciA9IAkApAMBBRBhbW91bnRGb3JDcmVhdG9yAhggYW1vdW50Rm9yUHVibGljQWdlbnQgPSAJAKQDAQUUYW1vdW50Rm9yUHVibGljQWdlbnQEFGNvbW1pc3Npb25zV2l0aEFnZW50AwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIDCQAAAgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50CQBlAgUQYW1vdW50X2FydF9hZnRlcgURYW1vdW50X2FydF9iZWZvcmUFCmFydEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBWFnZW50BQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgMJAAACBQdhc3NldElkBQphcnRBc3NldElkBQ1hbW91bnRGb3JTaWduCQBlAgUQYW1vdW50X2FydF9hZnRlcgURYW1vdW50X2FydF9iZWZvcmUFCmFydEFzc2V0SWQFA25pbAQaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQDCQECIT0CBRRhbW91bnRGb3JQdWJsaWNBZ2VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtwdWJsaWNBZ2VudAUUYW1vdW50Rm9yUHVibGljQWdlbnQFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgkAZQIFEGFtb3VudEZvckNyZWF0b3IFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgUQYW1vdW50Rm9yQ3JlYXRvcgUHYXNzZXRJZAUDbmlsBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAQGYnV5UmVzCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAUNbmV3QW1vdW50U29sZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUFaWRORlQFB3NvbGRLZXkJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQh0b3RhbE5GVAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgUIaXNzdWVORlQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjZWl2ZU5GVAABBQVpZE5GVAUDbmlsBRRjb21taXNzaW9uc1dpdGhBZ2VudAUaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQFCnR4VG9DYWxsZXIDBQVpc0JpZAkAzAgCBQhzb2xkRGF0YQkAzAgCBQliaWRVcGRhdGUJAMwIAgUJYmlkRGVsT2xkBQZidXlSZXMJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEIYXNTdHJpbmcBAmJ2BAckbWF0Y2gwBQJidgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA2J2MAUHJG1hdGNoMAUDYnYwCQACAQIkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkCgZpbnZva2UBB3NldENvbmYCA2tleQN2YWwEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEIY29udGFpbnMCBQNrZXkCBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEKYWRkQXJ0d29yawwEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkEDSR0MDIxNTM2MjE2MDkJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEBWFydElkCAUNJHQwMjE1MzYyMTYwOQJfMQQGY2FsbGVyCAUNJHQwMjE1MzYyMTYwOQJfMgQEZGF0ZQgFDSR0MDIxNTM2MjE2MDkCXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjE1MzYyMTYwOQJfNAQNJHQwMjE2MTkyMTY4OAkBCnNldExJY2VuY2UCBQpjaWRMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlBApsaWNlbmNlQ0lECAUNJHQwMjE2MTkyMTY4OAJfMQQLbGljZW5jZUhhc2gIBQ0kdDAyMTYxOTIxNjg4Al8yBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhCgUGY2FsbGVyBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQlyb3lhbHRpZXMDCQECIT0CBQ92YWxpZGF0ZUFydHdvcmsCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQQd2hpdGVsaXN0ZWRfZHJvcAkAZgIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgUGY2FsbGVyAgtfZnJlZV9kcm9wcwAABA0kdDAyMTk4NzIyMDc1AwUQd2hpdGVsaXN0ZWRfZHJvcAkAlAoCAAAFCmFydEFzc2V0SWQJAQ92YWxpZGF0ZVBheW1lbnQBBQFpBAZhbW91bnQIBQ0kdDAyMTk4NzIyMDc1Al8xBAdhc3NldElkCAUNJHQwMjE5ODcyMjA3NQJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFBmFtb3VudAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBBdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAMFEHdoaXRlbGlzdGVkX2Ryb3AJAPwHBAUNd2hpdGVsaXN0RGFwcAILdXNlRnJlZURyb3AJAMwIAgUGY2FsbGVyBQNuaWwFA25pbAUEdW5pdAMJAAACBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUFYXJ0SWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUFYXJ0SWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBWFydElkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUFYXJ0SWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBWFydElkBQlyb3lhbHRpZXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQZhbW91bnQFCmFydEFzc2V0SWQFA25pbAUKdHhUb0NhbGxlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ11cGRhdGVBcnR3b3JrDQR0eGlkBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBA0kdDAyMzk5MDI0MDYwCQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDIzOTkwMjQwNjACXzEEBmNhbGxlcggFDSR0MDIzOTkwMjQwNjACXzIEBGRhdGUIBQ0kdDAyMzk5MDI0MDYwAl8zBAtpc1Nwb25zb3JlZAgFDSR0MDIzOTkwMjQwNjACXzQEDSR0MDI0MDcwMjQxMzkJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDI0MDcwMjQxMzkCXzEEC2xpY2VuY2VIYXNoCAUNJHQwMjQwNzAyNDEzOQJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECmVudHJ5RXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECD0VudHJ5IG5vdCBmb3VuZAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBHR4aWQDCQAAAgUEZmxhZwIHSUxMRUdBTAkAAgECHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBASEBCQELaXNBcnRNaW50ZWQCBQZjYWxsZXIFBHR4aWQECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBHR4aWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBHR4aWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlEaXNwbGF5Q2lkAgUGY2FsbGVyBQR0eGlkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBHR4aWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUEdHhpZAUMc2hhMjU2RXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlMaWNlbmNlQ2lkAgUGY2FsbGVyBQR0eGlkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlMaWNlbmNlSGFzaAIFBmNhbGxlcgUEdHhpZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVRhZ3MCBQZjYWxsZXIFBHR4aWQFBHRhZ3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBHR4aWQFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBHR4aWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBHR4aWQFCXJveWFsdGllcwUDbmlsBQp0eFRvQ2FsbGVyCQACAQIOQWxyZWFkeSBtaW50ZWQBaQELZmxhZ0FydHdvcmsEBWFydElkBGFkZHIEZmxhZwRub3RlBA0kdDAyNTc2NjI1ODAwCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNTc2NjI1ODAwAl8xBAZjYWxsZXIIBQ0kdDAyNTc2NjI1ODAwAl8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RmxhZwIFBGFkZHIFBWFydElkBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOb3RlAgUEYWRkcgUFYXJ0SWQFBG5vdGUFA25pbAkAAgEJAKwCAgIOVW5rbm93IHN0YXR1cyAFBGZsYWcJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAWkBDWRlbGV0ZUFydHdvcmsCBWFydElkBGFkZHIEDSR0MDI2MjM2MjYyNzAJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDI2MjM2MjYyNzACXzEEBmNhbGxlcggFDSR0MDI2MjM2MjYyNzACXzIECWFkZHJUb1VzZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFBGFkZHIFBmNhbGxlcgQKZW50cnlFeGlzdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQCIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBApzaGEyNTZIYXNoCQEOZ2V0U3RyaW5nQnlLZXkBCQERa2V5SGFzaEJ5VHhpZEFkZHICBQlhZGRyVG9Vc2UFBWFydElkBAZzaWduSUQDCQECIT0CBQpzaGEyNTZIYXNoAgAJAQ5nZXRTdHJpbmdCeUtleQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkAgAEDXNpZ25JRF9sZWdhY3kDCQAAAgUGc2lnbklEAgAFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5aWRCeVNpZ25pZAIFCWFkZHJUb1VzZQUGc2lnbklEBQNuaWwEDGRhdGFUb0RlbGV0ZQkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEYXRlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURlc2MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlEaXNwbGF5Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXhwb3J0Q2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RXhwb3J0SGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleUxpY2VuY2VIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5TGljZW5jZUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVR5cGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUYWdzAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5TWF4TWludAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCWtleU9uU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleUZsYWcCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQhrZXlQcmljZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5RW5kU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5vdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlDcmF3bGVyAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5Um95YWx0aWVzAgUJYWRkclRvVXNlBQVhcnRJZAUDbmlsBQ1zaWduSURfbGVnYWN5AwkBASEBCQELaXNBcnRNaW50ZWQCBQlhZGRyVG9Vc2UFBWFydElkAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBQxkYXRhVG9EZWxldGUDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQxkYXRhVG9EZWxldGUJAAIBAihBcnQgYWxyZWFkeSBtaW50ZWQsIHlvdSBjYW5ub3QgZGVsZXRlIGl0AWkBC3NlbGxBcnR3b3JrBgVhcnRJZAVwcmljZQdtYXhNaW50B2Fzc2V0SWQIYmxvY2tFbmQGcHViS2V5BA0kdDAyOTA0OTI5MTE5CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDI5MDQ5MjkxMTkCXzEEBmNhbGxlcggFDSR0MDI5MDQ5MjkxMTkCXzIEBGRhdGUIBQ0kdDAyOTA0OTI5MTE5Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDI5MDQ5MjkxMTkCXzQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECI1RoaXMgYXJ0IGRvZXNuJ3QgbWF0Y2ggeW91ciBhY2NvdW50BARmbGFnCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5RmxhZwIFBmNhbGxlcgUFYXJ0SWQDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAAIBAg9GbGFnZ2VkIGFydHdvcmsEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAGYCAAAFCGJsb2NrRW5kCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQhibG9ja0VuZAAAAwkBAiE9AgUHbWF4TWludAABBgkBAiE9AgUFcHJpY2UAAAcJAAIBAjpUaW1lZCBvZmZlciBvbmx5IGFsbG93ZWQgZm9yIHVuaXF1ZSBlZGl0aW9uIGFuZCBvZmZlciBvbmx5BApiYXNlSGVpZ2h0AwkAAAIFCGJsb2NrRW5kAAAAAAUGaGVpZ2h0AwkBASEBCQEQYWNjZXB0ZWRBc3NldElkcwEFB2Fzc2V0SWQJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEDCQEBIQEJAQ92YWxpZGF0ZU1pblNlbGwBBQVwcmljZQkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAMJAGYCBQdtYXhNaW50AGQJAAIBAhwxMDAgZWRpdGlvbnMgbWF4IHBlciBhcnR3b3JrAwMJAQIhPQIFCmFtb3VudFNvbGQAAAkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwHCQACAQIUTWF4IGVkaXRpb24gcmVhY2hlZC4DAwkAZgIFCmFtb3VudFNvbGQAAAkBAiE9AgUKbWF4Q2FuU2VsbAUHbWF4TWludAcJAAIBAiZDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgYW55bW9yZQMDCQBmAgUGYmlkTmJyAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQIxQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIHdpdGggYWN0aXZlIG9yZGVycwQKc2VsbFN0YXR1cwMDCQBmAgUFcHJpY2UAAAkAZgIFB21heE1pbnQAAAcGBwQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQhrZXlQcmljZQIFBmNhbGxlcgUFYXJ0SWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQFB21heE1pbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmNhbGxlcgUFYXJ0SWQFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAkAZAIFCmJhc2VIZWlnaHQFCGJsb2NrRW5kBQNuaWwFCnR4VG9DYWxsZXIBaQEKYnV5QXJ0d29yawIFYXJ0SWQGaXNzdWVyCQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXICAAIAAgABaQEGc2V0QmlkAgVhcnRJZAZpc3N1ZXIEDSR0MDMxNDkyMzE1MzIJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDMxNDkyMzE1MzICXzEEBmNhbGxlcggFDSR0MDMxNDkyMzE1MzICXzIEBGRhdGUIBQ0kdDAzMTQ5MjMxNTMyAl8zBA0kdDAzMTUzNzMxNTczCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDMxNTM3MzE1NzMCXzEEBmFtb3VudAgFDSR0MDMxNTM3MzE1NzMCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGaXNzdWVyBQVhcnRJZAMDCQECIT0CBQhibG9ja0VuZAAACQBnAgUGaGVpZ2h0BQhibG9ja0VuZAcJAAIBAgtTYWxlIGVuZGVkLgQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkAwkBASEBCQEQYWNjZXB0ZWRBc3NldElkcwEFB2Fzc2V0SWQJAAIBAhJhc3NldCBub3QgYWNjZXB0ZWQDCQEBIQEJAQ92YWxpZGF0ZU1pblNlbGwBBQZhbW91bnQJAAIBAg5Xcm9uZyBtaW4gc2VsbAQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwkAZwIAAAUKbWF4Q2FuU2VsbAkAAgECI05vIG1heCBlZGl0aW9uIHNldCBmb3IgdGhpcyBhcnR3b3JrAwkAZwIFCmFtb3VudFNvbGQFCm1heENhblNlbGwJAAIBAhhTb2xkIG91dCwgeW91IGNhbm5vdCBiaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FBmNhbGxlcgIBXwUCaWQCBV9PUEVOCQCsAgIJAKwCAgkArAICCQCsAgIFB2Fzc2V0SWQCAV8JAKQDAQUGYW1vdW50AgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZAIFBmJpZE5icgABBQNuaWwBaQEJYWNjZXB0QmlkBQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIGcHViS2V5CQEHYnV5TWludAYFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgUGcHViS2V5AWkBCWNhbmNlbEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBA0kdDAzMjg5NzMyOTU4CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMjg5NzMyOTU4Al8xBAZjYWxsZXIIBQ0kdDAzMjg5NzMyOTU4Al8yBARkYXRlCAUNJHQwMzI4OTczMjk1OAJfMwMDCQECIT0CBQZjYWxsZXIFCGJpZE93bmVyCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBA1yZXR1cm5Nb25leVRvAwkAAAIFBmNhbGxlcgUGaXNzdWVyBQhiaWRPd25lcgUGY2FsbGVyBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQHYXNzZXRJZAkBDWdldEJpZEFzc2V0SWQBCQCRAwIFCmJpZERhdGFBcnIAAAQJYmlkU3RhdHVzAghDQU5DRUxFRAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQpiaWREYXRhS2V5AgFfBQliaWRTdGF0dXMJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZQIFBmJpZE5icgABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQ1yZXR1cm5Nb25leVRvCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBQdhc3NldElkBQNuaWwBAnR4AQh2ZXJpZmllcgAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDADAwMDCQAAAggFA2ludghmdW5jdGlvbgIKYWRkQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwALAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CDXVwZGF0ZUFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MADAMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAgtzZWxsQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAFAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CCWFjY2VwdEJpZAkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkAyBMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAECQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5hE7jJw==", "height": 2793421, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7TRsmnzD9TyY2ZXyBn6zHDSGRShpLa6iB6JE4nPVqFjU Next: GG5LzJ6W65sEEqBviQzd2XtFNMnatCuy7xbqpKfRCuet Diff:
OldNewDifferences
521521 then {
522522 let amount_art_after = getBalance(artAssetId)
523523 if ((amount_art_after == amount_art_after))
524- then {
525- let commissionsWithAgent = if ((amountForAgent != 0))
526- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
527- then (amountForSign - amountForAgent)
528- else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
529- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
530- then amountForSign
531- else (amount_art_after - amount_art_before), artAssetId)]
532- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
533- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
534- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
535- let txToCaller = if (isSponsored)
536- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
537- else nil
538- let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
539- if (isBid)
540- then [soldData, bidUpdate, bidDelOld] :: buyRes
541- else soldData :: buyRes
542- }
524+ then if (true)
525+ then throw(((((((((((((("assetid received = " + toBase58String(value(assetId))) + "amount received = ") + toString(amount)) + " amount_commission_for_sign_to_swap = ") + toString(amount_commission_for_sign_to_swap)) + " amountForSign = ") + toString(amountForSign)) + " amountForAgent = ") + toString(amountForAgent)) + " amountForCreator = ") + toString(amountForCreator)) + " amountForPublicAgent = ") + toString(amountForPublicAgent)))
526+ else {
527+ let commissionsWithAgent = if ((amountForAgent != 0))
528+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
529+ then (amountForSign - amountForAgent)
530+ else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
531+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
532+ then amountForSign
533+ else (amount_art_after - amount_art_before), artAssetId)]
534+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
535+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
536+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
537+ let txToCaller = if (isSponsored)
538+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
539+ else nil
540+ let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
541+ if (isBid)
542+ then [soldData, bidUpdate, bidDelOld] :: buyRes
543+ else soldData :: buyRes
544+ }
543545 else throw("Strict value is not equal to itself.")
544546 }
545547 else throw("Strict value is not equal to itself.")
576578
577579 @Callable(i)
578580 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
579- let $t02154221615 = idCallerDateSponsored(i, pubKey)
580- let artId = $t02154221615._1
581- let caller = $t02154221615._2
582- let date = $t02154221615._3
583- let isSponsored = $t02154221615._4
584- let $t02162521694 = setLIcence(cidLicence, sha256Licence)
585- let licenceCID = $t02162521694._1
586- let licenceHash = $t02162521694._2
581+ let $t02153621609 = idCallerDateSponsored(i, pubKey)
582+ let artId = $t02153621609._1
583+ let caller = $t02153621609._2
584+ let date = $t02153621609._3
585+ let isSponsored = $t02153621609._4
586+ let $t02161921688 = setLIcence(cidLicence, sha256Licence)
587+ let licenceCID = $t02161921688._1
588+ let licenceHash = $t02161921688._2
587589 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
588590 if ((validateArtwork != ""))
589591 then throw("Something went wrong!")
590592 else {
591593 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
592- let $t02199322081 = if (whitelisted_drop)
594+ let $t02198722075 = if (whitelisted_drop)
593595 then $Tuple2(0, artAssetId)
594596 else validatePayment(i)
595- let amount = $t02199322081._1
596- let assetId = $t02199322081._2
597+ let amount = $t02198722075._1
598+ let assetId = $t02198722075._2
597599 if (!(isDefined(amount)))
598600 then throw("Something went wrong")
599601 else {
618620 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
619621 then throw(maintenanceMSG)
620622 else {
621- let $t02399624066 = idCallerDateSponsored(i, pubKey)
622- let id = $t02399624066._1
623- let caller = $t02399624066._2
624- let date = $t02399624066._3
625- let isSponsored = $t02399624066._4
626- let $t02407624145 = setLIcence(cidLicence, sha256Licence)
627- let licenceCID = $t02407624145._1
628- let licenceHash = $t02407624145._2
623+ let $t02399024060 = idCallerDateSponsored(i, pubKey)
624+ let id = $t02399024060._1
625+ let caller = $t02399024060._2
626+ let date = $t02399024060._3
627+ let isSponsored = $t02399024060._4
628+ let $t02407024139 = setLIcence(cidLicence, sha256Licence)
629+ let licenceCID = $t02407024139._1
630+ let licenceHash = $t02407024139._2
629631 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
630632 if ((validateArtwork != ""))
631633 then throw("Something went wrong!")
653655
654656 @Callable(i)
655657 func flagArtwork (artId,addr,flag,note) = {
656- let $t02577225806 = idCallerDate(i)
657- let id = $t02577225806._1
658- let caller = $t02577225806._2
658+ let $t02576625800 = idCallerDate(i)
659+ let id = $t02576625800._1
660+ let caller = $t02576625800._2
659661 if (containsElement([chris, toString(this)], caller))
660662 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
661663 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
667669
668670 @Callable(i)
669671 func deleteArtwork (artId,addr) = {
670- let $t02624226276 = idCallerDate(i)
671- let id = $t02624226276._1
672- let caller = $t02624226276._2
672+ let $t02623626270 = idCallerDate(i)
673+ let id = $t02623626270._1
674+ let caller = $t02623626270._2
673675 let addrToUse = if (containsElement([chris, toString(this)], caller))
674676 then addr
675677 else caller
678680 then throw("No art matching for this address")
679681 else {
680682 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
681- let signID = if ((sha256Hash == ""))
683+ let signID = if ((sha256Hash != ""))
682684 then getStringByKey(keySignID(addrToUse, artId))
683685 else ""
684686 let signID_legacy = if ((signID == ""))
699701
700702 @Callable(i)
701703 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
702- let $t02905529125 = idCallerDateSponsored(i, pubKey)
703- let id = $t02905529125._1
704- let caller = $t02905529125._2
705- let date = $t02905529125._3
706- let isSponsored = $t02905529125._4
704+ let $t02904929119 = idCallerDateSponsored(i, pubKey)
705+ let id = $t02904929119._1
706+ let caller = $t02904929119._2
707+ let date = $t02904929119._3
708+ let isSponsored = $t02904929119._4
707709 let artworkName = getStringByKey(keyName(caller, artId))
708710 if ((artworkName == ""))
709711 then throw("This art doesn't match your account")
777779
778780 @Callable(i)
779781 func setBid (artId,issuer) = {
780- let $t03149831538 = idCallerDate(i)
781- let id = $t03149831538._1
782- let caller = $t03149831538._2
783- let date = $t03149831538._3
784- let $t03154331579 = isPayment(i)
785- let payment = $t03154331579._1
786- let amount = $t03154331579._2
782+ let $t03149231532 = idCallerDate(i)
783+ let id = $t03149231532._1
784+ let caller = $t03149231532._2
785+ let date = $t03149231532._3
786+ let $t03153731573 = isPayment(i)
787+ let payment = $t03153731573._1
788+ let amount = $t03153731573._2
787789 let assetId = if (!(isDefined(payment.assetId)))
788790 then "WAVES"
789791 else toBase58String(value(payment.assetId))
819821
820822 @Callable(i)
821823 func cancelBid (artId,issuer,bidId,bidOwner) = {
822- let $t03290332964 = idCallerDate(i)
823- let id = $t03290332964._1
824- let caller = $t03290332964._2
825- let date = $t03290332964._3
824+ let $t03289732958 = idCallerDate(i)
825+ let id = $t03289732958._1
826+ let caller = $t03289732958._2
827+ let date = $t03289732958._3
826828 if (if ((caller != bidOwner))
827829 then (caller != issuer)
828830 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "2.0.0"
55
66 func getStringByKey (key) = valueOrElse(getString(this, key), "")
77
88
99 let unitTest = false
1010
1111 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1212
1313 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1414
1515 let feeReceiver = getStringByKey("conf_fee_receiver")
1616
1717 let userDapp = if (unitTest)
1818 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1919 else value(addressFromString(getStringByKey("conf_users_dapp")))
2020
2121 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2222
2323 let puzzle_art_pool = getStringByKey("conf_puzzle_art_pool")
2424
2525 let usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2626
2727 let artAssetId_str = getStringByKey("conf_accepted_asset_ART")
2828
2929 let usdcPPAssetId_str = getStringByKey("conf_accepted_asset_USDC_PP")
3030
3131 let eastAssetId_str = getStringByKey("conf_accepted_asset_EAST")
3232
3333 let puzzleAssetId_str = getStringByKey("conf_accepted_asset_PUZZLE")
3434
3535 let ethPPAssetId_str = getStringByKey("conf_accepted_asset_ETH_PP")
3636
3737 let wavesAssetId_str = "WAVES"
3838
3939 let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
4040
4141 let artAssetId = fromBase58String(artAssetId_str)
4242
4343 let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
4444
4545 let eastAssetId = fromBase58String(eastAssetId_str)
4646
4747 let puzzleAssetId = fromBase58String(puzzleAssetId_str)
4848
4949 let ethPPAssetId = fromBase58String(ethPPAssetId_str)
5050
5151 let wavesAssetId = base58''
5252
5353 let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
5454
5555 let chris = getStringByKey("conf_admin_1")
5656
5757 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5858
5959
6060 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
6161
6262
6363 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6464
6565
6666 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6767
6868
6969 let commission_fee = 8
7070
7171 let defaultLicence = getStringByKey("conf_default_licence")
7272
7373 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
7474
7575 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
7676
7777 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
7878
7979 let userSuspended = "SUSPENDED"
8080
8181 let userRemoved = "REMOVED"
8282
8383 let userUnregistered = "UNREGISTERED"
8484
8585 let userAllowed = "ALLOWED"
8686
8787 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(artAssetId)))
8888
8989 let mint_fee = getIntegerByKeyFromOracle(("mint_fee_" + toBase58String(artAssetId)))
9090
9191 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
9292
9393
9494 func validateCID (cid) = if (contains(cid, "/"))
9595 then if (if ((76 > size(cid)))
9696 then (size(split(cid, "/")[0]) == 59)
9797 else false)
9898 then (16 > size(split(cid, "/")[1]))
9999 else false
100100 else false
101101
102102
103103 func validateHash (hash) = (size(hash) == 64)
104104
105105
106106 func keyUserStatus (caller) = ("user_status_" + caller)
107107
108108
109109 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
110110
111111
112112 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
113113
114114
115115 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
116116
117117
118118 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
119119
120120
121121 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
122122
123123
124124 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
125125
126126
127127 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
128128
129129
130130 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
131131
132132
133133 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
134134
135135
136136 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
137137
138138
139139 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
140140
141141
142142 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
143143
144144
145145 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
146146
147147
148148 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
149149
150150
151151 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
152152
153153
154154 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
155155
156156
157157 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
158158
159159
160160 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
161161
162162
163163 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
164164
165165
166166 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
167167
168168
169169 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
170170
171171
172172 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
173173
174174
175175 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
176176
177177
178178 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
179179
180180
181181 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
182182
183183
184184 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
185185
186186
187187 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
188188
189189
190190 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
191191
192192
193193 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
194194 then throw("Wrong Display CID")
195195 else if (!(validateCID(cidExport)))
196196 then throw("Wrong Export CID")
197197 else if (if ((cidLicence != ""))
198198 then !(validateCID(cidLicence))
199199 else false)
200200 then throw("Wrong Licence CID")
201201 else true
202202
203203
204204 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
205205 then throw("Export Hash 64 char. max")
206206 else if (!(validateHash(sha256Licence)))
207207 then throw("Licence Hash 64 char. max")
208208 else true
209209
210210
211211 func validateString (str,max) = if ((size(str) == 0))
212212 then throw("Field cannot be is empty")
213213 else if ((size(str) > max))
214214 then throw((str + " is too long"))
215215 else true
216216
217217
218218 func validateUser (caller) = {
219219 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
220220 if (if ((userStatus == userUnregistered))
221221 then true
222222 else (userStatus == userAllowed))
223223 then "Register this account first with \"Account\" tab"
224224 else if ((userStatus == userSuspended))
225225 then "Account suspended"
226226 else if ((userStatus == userRemoved))
227227 then "Account removed"
228228 else ""
229229 }
230230
231231
232232 func setLIcence (cidLicence,sha256Licence) = {
233233 let cid = if ((size(cidLicence) == 0))
234234 then defaultLicence
235235 else cidLicence
236236 let hash = if ((size(sha256Licence) == 0))
237237 then defaultHashLicence
238238 else sha256Licence
239239 $Tuple2(cid, hash)
240240 }
241241
242242
243243 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
244244 let checkUser = validateUser(caller)
245245 if ((checkUser != ""))
246246 then throw(checkUser)
247247 else if ((size(cidDisplay) == 0))
248248 then throw("Display CID cannot be empty")
249249 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
250250 then throw("Problem with CID")
251251 else if (!(validateAllHash(sha256Export, licenceHash)))
252252 then throw("Problem with Hashes")
253253 else if (!(validateString(name, 100)))
254254 then throw("100 Char. max name")
255255 else if (!(validateString(description, 1000)))
256256 then throw("1000 Char. max description")
257257 else if (if ((0 > royalties))
258258 then true
259259 else (royalties > 1000))
260260 then throw("Royalties cannot be less than 0% or higher than 10%")
261261 else if ((size(split(tags, ",")) > 5))
262262 then throw("5 tags max.")
263263 else ""
264264 }
265265
266266
267267 func isPayment (i) = if ((size(i.payments) == 0))
268268 then throw("No payment attached")
269269 else {
270270 let payment = value(i.payments[0])
271271 let amount = value(payment.amount)
272272 $Tuple2(payment, amount)
273273 }
274274
275275
276276 func validatePayment (i) = {
277277 let $t01015610192 = isPayment(i)
278278 let payment = $t01015610192._1
279279 let amount = $t01015610192._2
280280 let assetId = if (if (isDefined(payment.assetId))
281281 then (payment.assetId == artAssetId)
282282 else false)
283283 then payment.assetId
284284 else throw("Only SIGN token accepted as transaction fee")
285285 if ((amount != currentCertificationPrice))
286286 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
287287 else $Tuple2(amount, assetId)
288288 }
289289
290290
291291 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
292292 case b: Int =>
293293 if ((b != 0))
294294 then true
295295 else false
296296 case _ =>
297297 false
298298 }
299299
300300
301301 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
302302 let $t01077910815 = isPayment(i)
303303 let payment = $t01077910815._1
304304 let amount = $t01077910815._2
305305 let assetId = if (!(isDefined(payment.assetId)))
306306 then unit
307307 else if (if ((size(priceAssetId) > 0))
308308 then (toBase58String(value(payment.assetId)) == priceAssetId)
309309 else false)
310310 then payment.assetId
311311 else throw("Wrong asset id")
312312 if (if ((assetId == unit))
313313 then (priceAssetId != "")
314314 else false)
315315 then throw("Wrong asset id")
316316 else if ((artworkPrice != amount))
317317 then throw("Payment don't match")
318318 else $Tuple2(amount, assetId)
319319 }
320320
321321
322322 func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
323323 then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
324324 else true
325325
326326
327327 func validateMinSell (price) = if ((0 >= price))
328328 then throw("Wrong minimum sell price")
329329 else true
330330
331331
332332 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
333333 then unit
334334 else fromBase58String(assetId)
335335
336336
337337 func getPriceAssetIdFromBid (bidDataKey) = {
338338 let bidData = getStringByKey((bidDataKey + "_OPEN"))
339339 if ((bidData == ""))
340340 then throw("Bid not found")
341341 else {
342342 let bidDataArr = split(bidData, "_")
343343 let bidAmount = parseIntValue(bidDataArr[1])
344344 let bidAssetId = getBidAssetId(bidDataArr[0])
345345 if ((0 >= bidAmount))
346346 then throw("Wrong amount")
347347 else $Tuple2(bidAmount, bidAssetId)
348348 }
349349 }
350350
351351
352352 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
353353 then throw(maintenanceMSG)
354354 else {
355355 let isSponsored = if ((pubKey != ""))
356356 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
357357 else 0
358358 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
359359 then (isSponsored > 0)
360360 else false)
361361 then toString(addressFromPublicKey(fromBase58String(pubKey)))
362362 else toBase58String(i.caller.bytes)
363363 let get_sponsored_waves = if (if ((pubKey != ""))
364364 then (isSponsored > 0)
365365 else false)
366366 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
367367 else unit
368368 if ((get_sponsored_waves == get_sponsored_waves))
369369 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
370370 else throw("Strict value is not equal to itself.")
371371 }
372372
373373
374374 func idCallerDate (i) = if (!(dappRunning))
375375 then throw(maintenanceMSG)
376376 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
377377
378378
379379 func getBalance (assetId) = match assetId {
380380 case b: ByteVector =>
381381 assetBalance(this, b)
382382 case _ =>
383383 wavesBalance(this).available
384384 }
385385
386386
387387 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
388388 let $t01342013509 = idCallerDateSponsored(i, pubKey)
389389 let id = $t01342013509._1
390390 let caller = $t01342013509._2
391391 let date = $t01342013509._3
392392 let isSponsored = $t01342013509._4
393393 let isBid = if (if (if ((caller == issuer))
394394 then (bidOwner != "")
395395 else false)
396396 then (bidId != "")
397397 else false)
398398 then true
399399 else false
400400 if (if (isBid)
401401 then (caller != issuer)
402402 else false)
403403 then throw("You cannot do this action")
404404 else {
405405 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
406406 if (if (if ((blockEnd != 0))
407407 then (height >= blockEnd)
408408 else false)
409409 then !(isBid)
410410 else false)
411411 then throw("Sale ended.")
412412 else {
413413 let callerIsIssuer = (caller == issuer)
414414 let totalNFT = getIntegerByKey("total_nft_issued")
415415 let artworkName = getStringByKey(keyName(issuer, artId))
416416 if ((artworkName == ""))
417417 then throw("Art doesn't exist")
418418 else {
419419 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
420420 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
421421 let artworkPrice = if (callerIsIssuer)
422422 then mint_fee
423423 else getIntegerByKey(keyPrice(issuer, artId))
424424 let priceAssetId = if (callerIsIssuer)
425425 then toBase58String(artAssetId)
426426 else getStringByKey(keyAssetIdAccepted(issuer, artId))
427427 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
428428 if (if (if (!(isBid))
429429 then !(callerIsIssuer)
430430 else false)
431431 then if (if ((0 >= artworkPrice))
432432 then true
433433 else !(isOnSale))
434434 then true
435435 else (0 >= maxCanSell)
436436 else false)
437437 then throw("Art not for sale")
438438 else if (if (if (!(isBid))
439439 then callerIsIssuer
440440 else false)
441441 then (0 >= maxCanSell)
442442 else false)
443443 then throw("Max issuable not set")
444444 else {
445445 let checkUser = validateUser(issuer)
446446 if (if (isBid)
447447 then (checkUser != "")
448448 else false)
449449 then throw(checkUser)
450450 else {
451451 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
452452 let $t01508615278 = if (isBid)
453453 then getPriceAssetIdFromBid(bidDataKey)
454454 else validatePriceAssetId(i, priceAssetId, artworkPrice)
455455 let amount = $t01508615278._1
456456 let assetId = $t01508615278._2
457457 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
458458 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
459459 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
460460 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
461461 let isWhitelisted = checkWhitelist(issuer)
462462 let amountForSign = fraction(amount, commission_fee, 100)
463463 let amountForAgent = if (if (if ((agent != feeReceiver))
464464 then (agentShare > 0)
465465 else false)
466466 then (height > isWhitelisted)
467467 else false)
468468 then fraction(amount, agentShare, 10000)
469469 else 0
470470 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
471471 then (publicAgentShare > 0)
472472 else false)
473473 then (height > isWhitelisted)
474474 else false)
475475 then fraction(amount, publicAgentShare, 10000)
476476 else 0
477477 let amountForCreator = (amount - amountForSign)
478478 if ((amountSold == maxCanSell))
479479 then throw("Art sold out")
480480 else {
481481 let newAmountSold = (amountSold + 1)
482482 let issueMeta = ((((((((("Creator: " + issuer) + ",
483483 ArtID: ") + artId) + ",
484484 Artwork name: ") + artworkName) + ",
485485 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
486486 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
487487 let idNFT = calculateAssetId(issueNFT)
488488 let sellStatus = if (if ((newAmountSold == maxCanSell))
489489 then true
490490 else !(isOnSale))
491491 then false
492492 else true
493493 let receiveNFT = if (if (if ((caller == issuer))
494494 then (bidOwner != "")
495495 else false)
496496 then (bidId != "")
497497 else false)
498498 then addressFromStringValue(bidOwner)
499499 else i.caller
500500 let assetIdBid = if (!(isDefined(assetId)))
501501 then "WAVES"
502502 else toBase58String(value(assetId))
503503 let bidData = getStringByKey((bidDataKey + "_OPEN"))
504504 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
505505 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
506506 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
507507 let soldValue = if (!(isBid))
508508 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
509509 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
510510 let soldData = StringEntry(soldKey, soldValue)
511511 let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
512512 then (amountForSign - amountForAgent)
513513 else amountForSign
514514 let amount_art_before = getBalance(artAssetId)
515515 if ((amount_art_before == amount_art_before))
516516 then {
517517 let swap_fee_to_art = if ((assetId != artAssetId))
518518 then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
519519 else unit
520520 if ((swap_fee_to_art == swap_fee_to_art))
521521 then {
522522 let amount_art_after = getBalance(artAssetId)
523523 if ((amount_art_after == amount_art_after))
524- then {
525- let commissionsWithAgent = if ((amountForAgent != 0))
526- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
527- then (amountForSign - amountForAgent)
528- else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
529- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
530- then amountForSign
531- else (amount_art_after - amount_art_before), artAssetId)]
532- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
533- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
534- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
535- let txToCaller = if (isSponsored)
536- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
537- else nil
538- let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
539- if (isBid)
540- then [soldData, bidUpdate, bidDelOld] :: buyRes
541- else soldData :: buyRes
542- }
524+ then if (true)
525+ then throw(((((((((((((("assetid received = " + toBase58String(value(assetId))) + "amount received = ") + toString(amount)) + " amount_commission_for_sign_to_swap = ") + toString(amount_commission_for_sign_to_swap)) + " amountForSign = ") + toString(amountForSign)) + " amountForAgent = ") + toString(amountForAgent)) + " amountForCreator = ") + toString(amountForCreator)) + " amountForPublicAgent = ") + toString(amountForPublicAgent)))
526+ else {
527+ let commissionsWithAgent = if ((amountForAgent != 0))
528+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
529+ then (amountForSign - amountForAgent)
530+ else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
531+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
532+ then amountForSign
533+ else (amount_art_after - amount_art_before), artAssetId)]
534+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
535+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
536+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
537+ let txToCaller = if (isSponsored)
538+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
539+ else nil
540+ let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
541+ if (isBid)
542+ then [soldData, bidUpdate, bidDelOld] :: buyRes
543+ else soldData :: buyRes
544+ }
543545 else throw("Strict value is not equal to itself.")
544546 }
545547 else throw("Strict value is not equal to itself.")
546548 }
547549 else throw("Strict value is not equal to itself.")
548550 }
549551 }
550552 }
551553 }
552554 }
553555 }
554556 }
555557
556558
557559 func asString (bv) = match bv {
558560 case bv0: String =>
559561 bv0
560562 case _ =>
561563 throw("Sponsored Public Key String expected")
562564 }
563565
564566
565567 @Callable(invoke)
566568 func setConf (key,val) = {
567569 let caller = toString(invoke.caller)
568570 if (containsElement([chris, toString(this)], caller))
569571 then if (contains(key, "conf_"))
570572 then [StringEntry(key, val)]
571573 else throw("Entries starting with conf_ only")
572574 else throw("You are not allowed to change this")
573575 }
574576
575577
576578
577579 @Callable(i)
578580 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
579- let $t02154221615 = idCallerDateSponsored(i, pubKey)
580- let artId = $t02154221615._1
581- let caller = $t02154221615._2
582- let date = $t02154221615._3
583- let isSponsored = $t02154221615._4
584- let $t02162521694 = setLIcence(cidLicence, sha256Licence)
585- let licenceCID = $t02162521694._1
586- let licenceHash = $t02162521694._2
581+ let $t02153621609 = idCallerDateSponsored(i, pubKey)
582+ let artId = $t02153621609._1
583+ let caller = $t02153621609._2
584+ let date = $t02153621609._3
585+ let isSponsored = $t02153621609._4
586+ let $t02161921688 = setLIcence(cidLicence, sha256Licence)
587+ let licenceCID = $t02161921688._1
588+ let licenceHash = $t02161921688._2
587589 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
588590 if ((validateArtwork != ""))
589591 then throw("Something went wrong!")
590592 else {
591593 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
592- let $t02199322081 = if (whitelisted_drop)
594+ let $t02198722075 = if (whitelisted_drop)
593595 then $Tuple2(0, artAssetId)
594596 else validatePayment(i)
595- let amount = $t02199322081._1
596- let assetId = $t02199322081._2
597+ let amount = $t02198722075._1
598+ let assetId = $t02198722075._2
597599 if (!(isDefined(amount)))
598600 then throw("Something went wrong")
599601 else {
600602 let decrease_whitelist_drop = if (whitelisted_drop)
601603 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
602604 else unit
603605 if ((decrease_whitelist_drop == decrease_whitelist_drop))
604606 then {
605607 let txToCaller = if (isSponsored)
606608 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
607609 else nil
608610 ([IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), 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(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, artAssetId)] ++ txToCaller)
609611 }
610612 else throw("Strict value is not equal to itself.")
611613 }
612614 }
613615 }
614616
615617
616618
617619 @Callable(i)
618620 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
619621 then throw(maintenanceMSG)
620622 else {
621- let $t02399624066 = idCallerDateSponsored(i, pubKey)
622- let id = $t02399624066._1
623- let caller = $t02399624066._2
624- let date = $t02399624066._3
625- let isSponsored = $t02399624066._4
626- let $t02407624145 = setLIcence(cidLicence, sha256Licence)
627- let licenceCID = $t02407624145._1
628- let licenceHash = $t02407624145._2
623+ let $t02399024060 = idCallerDateSponsored(i, pubKey)
624+ let id = $t02399024060._1
625+ let caller = $t02399024060._2
626+ let date = $t02399024060._3
627+ let isSponsored = $t02399024060._4
628+ let $t02407024139 = setLIcence(cidLicence, sha256Licence)
629+ let licenceCID = $t02407024139._1
630+ let licenceHash = $t02407024139._2
629631 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
630632 if ((validateArtwork != ""))
631633 then throw("Something went wrong!")
632634 else {
633635 let entryExist = getStringByKey(keyName(caller, txid))
634636 if ((entryExist == ""))
635637 then throw("Entry not found")
636638 else {
637639 let flag = getStringByKey(keyFlag(caller, txid))
638640 if ((flag == "ILLEGAL"))
639641 then throw("Cannot update ILLEGAL artwork")
640642 else if (!(isArtMinted(caller, txid)))
641643 then {
642644 let txToCaller = if (isSponsored)
643645 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
644646 else nil
645647 ([StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type), StringEntry(keyCrawler(caller, txid), crawler), IntegerEntry(keyRoyalties(caller, txid), royalties)] ++ txToCaller)
646648 }
647649 else throw("Already minted")
648650 }
649651 }
650652 }
651653
652654
653655
654656 @Callable(i)
655657 func flagArtwork (artId,addr,flag,note) = {
656- let $t02577225806 = idCallerDate(i)
657- let id = $t02577225806._1
658- let caller = $t02577225806._2
658+ let $t02576625800 = idCallerDate(i)
659+ let id = $t02576625800._1
660+ let caller = $t02576625800._2
659661 if (containsElement([chris, toString(this)], caller))
660662 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
661663 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
662664 else throw(("Unknow status " + flag))
663665 else throw("You are not allowed")
664666 }
665667
666668
667669
668670 @Callable(i)
669671 func deleteArtwork (artId,addr) = {
670- let $t02624226276 = idCallerDate(i)
671- let id = $t02624226276._1
672- let caller = $t02624226276._2
672+ let $t02623626270 = idCallerDate(i)
673+ let id = $t02623626270._1
674+ let caller = $t02623626270._2
673675 let addrToUse = if (containsElement([chris, toString(this)], caller))
674676 then addr
675677 else caller
676678 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
677679 if ((entryExist == ""))
678680 then throw("No art matching for this address")
679681 else {
680682 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
681- let signID = if ((sha256Hash == ""))
683+ let signID = if ((sha256Hash != ""))
682684 then getStringByKey(keySignID(addrToUse, artId))
683685 else ""
684686 let signID_legacy = if ((signID == ""))
685687 then nil
686688 else [DeleteEntry(keyidBySignid(addrToUse, signID))]
687689 let dataToDelete = ([DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addrToUse, artId)), DeleteEntry(keyPrice(addrToUse, artId)), DeleteEntry(keyAssetIdAccepted(addrToUse, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId)), DeleteEntry(keyRoyalties(addrToUse, artId))] ++ signID_legacy)
688690 if (!(isArtMinted(addrToUse, artId)))
689691 then if (!(dappRunning))
690692 then throw(maintenanceMSG)
691693 else dataToDelete
692694 else if (containsElement([chris, toString(this)], caller))
693695 then dataToDelete
694696 else throw("Art already minted, you cannot delete it")
695697 }
696698 }
697699
698700
699701
700702 @Callable(i)
701703 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
702- let $t02905529125 = idCallerDateSponsored(i, pubKey)
703- let id = $t02905529125._1
704- let caller = $t02905529125._2
705- let date = $t02905529125._3
706- let isSponsored = $t02905529125._4
704+ let $t02904929119 = idCallerDateSponsored(i, pubKey)
705+ let id = $t02904929119._1
706+ let caller = $t02904929119._2
707+ let date = $t02904929119._3
708+ let isSponsored = $t02904929119._4
707709 let artworkName = getStringByKey(keyName(caller, artId))
708710 if ((artworkName == ""))
709711 then throw("This art doesn't match your account")
710712 else {
711713 let flag = getStringByKey(keyFlag(caller, artId))
712714 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
713715 then throw("Flagged artwork")
714716 else {
715717 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
716718 if ((0 > blockEnd))
717719 then throw("Negative end")
718720 else if (if ((blockEnd > 0))
719721 then if ((maxMint != 1))
720722 then true
721723 else (price != 0)
722724 else false)
723725 then throw("Timed offer only allowed for unique edition and offer only")
724726 else {
725727 let baseHeight = if ((blockEnd == 0))
726728 then 0
727729 else height
728730 if (!(acceptedAssetIds(assetId)))
729731 then throw("Something went wrong!")
730732 else if (!(validateMinSell(price)))
731733 then throw("Something went wrong!")
732734 else {
733735 let checkUser = validateUser(caller)
734736 if ((checkUser != ""))
735737 then throw(checkUser)
736738 else {
737739 let amountSold = getIntegerByKey(keyIssued(caller, artId))
738740 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
739741 if ((maxMint > 100))
740742 then throw("100 editions max per artwork")
741743 else if (if ((amountSold != 0))
742744 then (amountSold == maxCanSell)
743745 else false)
744746 then throw("Max edition reached.")
745747 else if (if ((amountSold > 0))
746748 then (maxCanSell != maxMint)
747749 else false)
748750 then throw("Cannot change maximum issuable anymore")
749751 else if (if ((bidNbr > 0))
750752 then (maxCanSell != maxMint)
751753 else false)
752754 then throw("Cannot change maximum issuable with active orders")
753755 else {
754756 let sellStatus = if (if ((price > 0))
755757 then (maxMint > 0)
756758 else false)
757759 then true
758760 else false
759761 let txToCaller = if (isSponsored)
760762 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
761763 else nil
762764 ([BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId), IntegerEntry(keyEndSale(caller, artId), (baseHeight + blockEnd))] ++ txToCaller)
763765 }
764766 }
765767 }
766768 }
767769 }
768770 }
769771 }
770772
771773
772774
773775 @Callable(i)
774776 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
775777
776778
777779
778780 @Callable(i)
779781 func setBid (artId,issuer) = {
780- let $t03149831538 = idCallerDate(i)
781- let id = $t03149831538._1
782- let caller = $t03149831538._2
783- let date = $t03149831538._3
784- let $t03154331579 = isPayment(i)
785- let payment = $t03154331579._1
786- let amount = $t03154331579._2
782+ let $t03149231532 = idCallerDate(i)
783+ let id = $t03149231532._1
784+ let caller = $t03149231532._2
785+ let date = $t03149231532._3
786+ let $t03153731573 = isPayment(i)
787+ let payment = $t03153731573._1
788+ let amount = $t03153731573._2
787789 let assetId = if (!(isDefined(payment.assetId)))
788790 then "WAVES"
789791 else toBase58String(value(payment.assetId))
790792 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
791793 if (if ((blockEnd != 0))
792794 then (height >= blockEnd)
793795 else false)
794796 then throw("Sale ended.")
795797 else {
796798 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
797799 if (!(acceptedAssetIds(assetId)))
798800 then throw("asset not accepted")
799801 else if (!(validateMinSell(amount)))
800802 then throw("Wrong min sell")
801803 else {
802804 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
803805 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
804806 if ((0 >= maxCanSell))
805807 then throw("No max edition set for this artwork")
806808 else if ((amountSold >= maxCanSell))
807809 then throw("Sold out, you cannot bid")
808810 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
809811 }
810812 }
811813 }
812814
813815
814816
815817 @Callable(i)
816818 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
817819
818820
819821
820822 @Callable(i)
821823 func cancelBid (artId,issuer,bidId,bidOwner) = {
822- let $t03290332964 = idCallerDate(i)
823- let id = $t03290332964._1
824- let caller = $t03290332964._2
825- let date = $t03290332964._3
824+ let $t03289732958 = idCallerDate(i)
825+ let id = $t03289732958._1
826+ let caller = $t03289732958._2
827+ let date = $t03289732958._3
826828 if (if ((caller != bidOwner))
827829 then (caller != issuer)
828830 else false)
829831 then throw("You cannot do this action")
830832 else {
831833 let returnMoneyTo = if ((caller == issuer))
832834 then bidOwner
833835 else caller
834836 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
835837 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
836838 let bidData = getStringByKey((bidDataKey + "_OPEN"))
837839 if ((bidData == ""))
838840 then throw("Bid not found")
839841 else {
840842 let bidDataArr = split(bidData, "_")
841843 let assetId = getBidAssetId(bidDataArr[0])
842844 let bidStatus = "CANCELED"
843845 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
844846 }
845847 }
846848 }
847849
848850
849851 @Verifier(tx)
850852 func verifier () = match tx {
851853 case inv: InvokeScriptTransaction =>
852854 if (if (if (if ((inv.function == "addArtwork"))
853855 then (inv.dApp == this)
854856 else false)
855857 then (inv.fee == 500000)
856858 else false)
857859 then (inv.feeAssetId == unit)
858860 else false)
859861 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[11])))
860862 else if (if (if (if ((inv.function == "updateArtwork"))
861863 then (inv.dApp == this)
862864 else false)
863865 then (inv.fee == 500000)
864866 else false)
865867 then (inv.feeAssetId == unit)
866868 else false)
867869 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
868870 else if (if (if (if ((inv.function == "sellArtwork"))
869871 then (inv.dApp == this)
870872 else false)
871873 then (inv.fee == 500000)
872874 else false)
873875 then (inv.feeAssetId == unit)
874876 else false)
875877 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
876878 else if (if (if (if ((inv.function == "acceptBid"))
877879 then (inv.dApp == this)
878880 else false)
879881 then (inv.fee == 500000)
880882 else false)
881883 then (inv.feeAssetId == unit)
882884 else false)
883885 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
884886 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
885887 case _ =>
886888 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
887889 }
888890

github/deemru/w8io/026f985 
112.79 ms