tx · GSD7jDoEao5F9zPjEfY9cgn2Y3bsqiKFRMaGqYYXwY1Q

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.10.10 07:41 [2792064] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "GSD7jDoEao5F9zPjEfY9cgn2Y3bsqiKFRMaGqYYXwY1Q", "fee": 2600000, "feeAssetId": null, "timestamp": 1696912920221, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "3WDsbzzVSs5L5uY8QdaQyoSizeUv4h36MEknLJb4W9NxTzf742HCtBEJTZqsBivEttSpL4uCgB15HYVL3XreYrDX" ], "script": "base64:BgJeCAISBAoCCAgSDgoMCAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICFsAB1ZFUlNJT04CBTIuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX29yYWNsZV9mZWUACHNpZ25EYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfc2lnbndlYl9kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIACHVzZXJEYXBwAwUIdW5pdFRlc3QJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAA13aGl0ZWxpc3REYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfd2hpdGVsaXN0X2RhcHAAD3B1enpsZV9hcnRfcG9vbAkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9wdXp6bGVfYXJ0X3Bvb2wAEXVzZHRQUEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRFRfUFAADmFydEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhdjb25mX2FjY2VwdGVkX2Fzc2V0X0FSVAARdXNkY1BQQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEQ19QUAAPZWFzdEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X0VBU1QAEXB1enpsZUFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X1BVWlpMRQAQZXRoUFBBc3NldElkX3N0cgkBDmdldFN0cmluZ0J5S2V5AQIaY29uZl9hY2NlcHRlZF9hc3NldF9FVEhfUFAAEHdhdmVzQXNzZXRJZF9zdHICBVdBVkVTAA11c2R0UFBBc3NldElkCQDZBAEFEXVzZHRQUEFzc2V0SWRfc3RyAAphcnRBc3NldElkCQDZBAEFDmFydEFzc2V0SWRfc3RyAA11c2RjUFBBc3NldElkCQDZBAEFEXVzZGNQUEFzc2V0SWRfc3RyAAtlYXN0QXNzZXRJZAkA2QQBBQ9lYXN0QXNzZXRJZF9zdHIADXB1enpsZUFzc2V0SWQJANkEAQURcHV6emxlQXNzZXRJZF9zdHIADGV0aFBQQXNzZXRJZAkA2QQBBRBldGhQUEFzc2V0SWRfc3RyAAx3YXZlc0Fzc2V0SWQBAAATYWxsX2FjY2VwdGVkX2Fzc2V0cwkAzAgCBRF1c2R0UFBBc3NldElkX3N0cgkAzAgCBQ5hcnRBc3NldElkX3N0cgkAzAgCBRF1c2RjUFBBc3NldElkX3N0cgkAzAgCBQ9lYXN0QXNzZXRJZF9zdHIJAMwIAgURcHV6emxlQXNzZXRJZF9zdHIJAMwIAgUQd2F2ZXNBc3NldElkX3N0cgkAzAgCBRBldGhQUEFzc2V0SWRfc3RyBQNuaWwABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAOY29tbWlzc2lvbl9mZWUACAAOZGVmYXVsdExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECFGNvbmZfZGVmYXVsdF9saWNlbmNlABJkZWZhdWx0SGFzaExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECGWNvbmZfZGVmYXVsdF9saWNlbmNlX2hhc2gAC2RhcHBSdW5uaW5nCQELdmFsdWVPckVsc2UCCQCbCAIFCHVzZXJEYXBwAhRjb25mX2RhcHBfaXNfcnVubmluZwYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwAhRjb25mX21haW50ZW5hbmNlX21zZwIAAA11c2VyU3VzcGVuZGVkAglTVVNQRU5ERUQAC3VzZXJSZW1vdmVkAgdSRU1PVkVEABB1c2VyVW5yZWdpc3RlcmVkAgxVTlJFR0lTVEVSRUQAC3VzZXJBbGxvd2VkAgdBTExPV0VEABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEFCmFydEFzc2V0SWQACG1pbnRfZmVlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgIJbWludF9mZWVfCQDYBAEFCmFydEFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBC3ZhbGlkYXRlQ0lEAQNjaWQDCQEIY29udGFpbnMCBQNjaWQCAS8DAwkAZgIATAkAsQIBBQNjaWQJAAACCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAAA7BwkAZgIAEAkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAEHBwEMdmFsaWRhdGVIYXNoAQRoYXNoCQAAAgkAsQIBBQRoYXNoAEABDWtleVVzZXJTdGF0dXMBBmNhbGxlcgkArAICAgx1c2VyX3N0YXR1c18FBmNhbGxlcgEHa2V5RGF0ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGF0ZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5hbWUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25hbWVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlEZXNjAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kZXNjXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RGlzcGxheUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZGlzcGxheV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlFeHBvcnRIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9leHBvcnRfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDGtleUV4cG9ydENpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBCmtleU1heE1pbnQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlTaWduSUQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X3NpZ25pZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleUlzc3VlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfaXNzdWVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5T25TYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyAQ5rZXlMaWNlbmNlSGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhFhcnRfbGljZW5jZV9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5TGljZW5jZUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUYWdzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90YWdzXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VHlwZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdHlwZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5vdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlDcmF3bGVyAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9jcmF3bGVyX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDGtleVJveWFsdGllcwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5RW5kU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfZW5kc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBEmtleUFzc2V0SWRBY2NlcHRlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleUZsYWcCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2ZsYWdfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBcnRpc3RBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgINYXJ0aXN0X2FnZW50XwUKYXJ0aXN0QWRkcgEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgIUYXJ0aXN0X3B1YmxpY19hZ2VudF8FCmFydGlzdEFkZHIBGmtleVByaW1hcnlTaGFyZVB1YmxpY0FnZW50AQphcnRpc3RBZGRyCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBDnZhbGlkYXRlQWxsQ0lEAwpjaWREaXNwbGF5CWNpZEV4cG9ydApjaWRMaWNlbmNlAwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCWNpZEV4cG9ydAkAAgECEFdyb25nIEV4cG9ydCBDSUQDAwkBAiE9AgUKY2lkTGljZW5jZQIACQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZExpY2VuY2UHCQACAQIRV3JvbmcgTGljZW5jZSBDSUQGAQ92YWxpZGF0ZUFsbEhhc2gCDHNoYTI1NkV4cG9ydA1zaGEyNTZMaWNlbmNlAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUMc2hhMjU2RXhwb3J0CQACAQIYRXhwb3J0IEhhc2ggNjQgY2hhci4gbWF4AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUNc2hhMjU2TGljZW5jZQkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBA0kdDAxMDE1NjEwMTkyCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwMTU2MTAxOTICXzEEBmFtb3VudAgFDSR0MDEwMTU2MTAxOTICXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQphcnRBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBA0kdDAxMDc3OTEwODE1CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwNzc5MTA4MTUCXzEEBmFtb3VudAgFDSR0MDEwNzc5MTA4MTUCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFE2FsbF9hY2NlcHRlZF9hc3NldHMFB2Fzc2V0SWQJAAIBAkBPbmx5ICRBUlQsIFVTRFQtUFAsIFVTREMtUFAsIEVBU1QsIFBVWlpMRSwgRVRIIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAQVwcmljZQMJAGcCAAAFBXByaWNlCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQpiaWREYXRhS2V5BAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQJYmlkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBApiaWRBc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAAAwkAZwIAAAUJYmlkQW1vdW50CQACAQIMV3JvbmcgYW1vdW50CQCUCgIFCWJpZEFtb3VudAUKYmlkQXNzZXRJZAEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgFpBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQLaXNTcG9uc29yZWQDCQECIT0CBQZwdWJLZXkCAAkBC3ZhbHVlT3JFbHNlAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkCCV9mcmVlX3R4cwAAAAAEBmNhbGxlcgMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAGYCBQtpc1Nwb25zb3JlZAAABwkApQgBCQCnCAEJANkEAQUGcHViS2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEE2dldF9zcG9uc29yZWRfd2F2ZXMDAwkBAiE9AgUGcHViS2V5AgAJAGYCBQtpc1Nwb25zb3JlZAAABwkA/AcEBQ13aGl0ZWxpc3REYXBwAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUGcHViS2V5BQNuaWwFA25pbAUEdW5pdAMJAAACBRNnZXRfc3BvbnNvcmVkX3dhdmVzBRNnZXRfc3BvbnNvcmVkX3dhdmVzCQCWCgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUGY2FsbGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZgIFC2lzU3BvbnNvcmVkAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGlkQ2FsbGVyRGF0ZQEBaQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEHYnV5TWludAYBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIGcHViS2V5BA0kdDAxMzQyMDEzNTA5CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDEzNDIwMTM1MDkCXzEEBmNhbGxlcggFDSR0MDEzNDIwMTM1MDkCXzIEBGRhdGUIBQ0kdDAxMzQyMDEzNTA5Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDEzNDIwMTM1MDkCXzQEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHAwMFBWlzQmlkCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyBQhtaW50X2ZlZQkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFCmFydEFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTUwODYxNTI3OAMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNTA4NjE1Mjc4Al8xBAdhc3NldElkCAUNJHQwMTUwODYxNTI3OAJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBBQZpc3N1ZXIAAAQLcHVibGljQWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBBBwdWJsaWNBZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBBQZpc3N1ZXIAAAQNaXNXaGl0ZWxpc3RlZAkBDmNoZWNrV2hpdGVsaXN0AQUGaXNzdWVyBA1hbW91bnRGb3JTaWduCQBrAwUGYW1vdW50BQ5jb21taXNzaW9uX2ZlZQBkBA5hbW91bnRGb3JBZ2VudAMDAwkBAiE9AgUFYWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUKYWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFCmFnZW50U2hhcmUAkE4AAAQUYW1vdW50Rm9yUHVibGljQWdlbnQDAwMJAQIhPQIFC3B1YmxpY0FnZW50BQtmZWVSZWNlaXZlcgkAZgIFEHB1YmxpY0FnZW50U2hhcmUAAAcJAGYCBQZoZWlnaHQFDWlzV2hpdGVsaXN0ZWQHCQBrAwUGYW1vdW50BRBwdWJsaWNBZ2VudFNoYXJlAJBOAAAEEGFtb3VudEZvckNyZWF0b3IJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglDcmVhdG9yOiAFBmlzc3VlcgIKLAogQXJ0SUQ6IAUFYXJ0SWQCESwKIEFydHdvcmsgbmFtZTogBQthcnR3b3JrTmFtZQIKLAogSXNzdWU6IAkApAMBBQ1uZXdBbW91bnRTb2xkAgEvCQCkAwEFCm1heENhblNlbGwECGlzc3VlTkZUCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQECnNlbGxTdGF0dXMDAwkAAAIFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwGCQEBIQEFCGlzT25TYWxlBwYECnJlY2VpdmVORlQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQhiaWRPd25lcggFAWkGY2FsbGVyBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkRGVsT2xkCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWRVcGRhdGUJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYmlkRGF0YUtleQIHX0NMT1NFRAkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwkA2AQBBQVpZE5GVAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEFCnJlY2VpdmVORlQCAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUGYW1vdW50AgFfBQphc3NldElkQmlkAgFfCQDYBAEFBWlkTkZUBAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBCJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwAwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50BQ1hbW91bnRGb3JTaWduBBFhbW91bnRfYXJ0X2JlZm9yZQkBCmdldEJhbGFuY2UBBQphcnRBc3NldElkAwkAAAIFEWFtb3VudF9hcnRfYmVmb3JlBRFhbW91bnRfYXJ0X2JlZm9yZQQPc3dhcF9mZWVfdG9fYXJ0AwkBAiE9AgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkA/AcECQEHQWRkcmVzcwEJANkEAQUPcHV6emxlX2FydF9wb29sAgRzd2FwCQDMCAIFDmFydEFzc2V0SWRfc3RyCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBSJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwBQNuaWwFBHVuaXQDCQAAAgUPc3dhcF9mZWVfdG9fYXJ0BQ9zd2FwX2ZlZV90b19hcnQEEGFtb3VudF9hcnRfYWZ0ZXIJAQpnZXRCYWxhbmNlAQUKYXJ0QXNzZXRJZAMJAAACBRBhbW91bnRfYXJ0X2FmdGVyBRBhbW91bnRfYXJ0X2FmdGVyBBRjb21taXNzaW9uc1dpdGhBZ2VudAMJAQIhPQIFDmFtb3VudEZvckFnZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyAwkAAAIFB2Fzc2V0SWQFCmFydEFzc2V0SWQJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAkAZQIFEGFtb3VudF9hcnRfYWZ0ZXIFEWFtb3VudF9hcnRfYmVmb3JlBQphcnRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQVhZ2VudAUOYW1vdW50Rm9yQWdlbnQFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFDWFtb3VudEZvclNpZ24FCmFydEFzc2V0SWQFA25pbAQaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQDCQECIT0CBRRhbW91bnRGb3JQdWJsaWNBZ2VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtwdWJsaWNBZ2VudAUUYW1vdW50Rm9yUHVibGljQWdlbnQFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgkAZQIFEGFtb3VudEZvckNyZWF0b3IFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgUQYW1vdW50Rm9yQ3JlYXRvcgUHYXNzZXRJZAUDbmlsBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAQGYnV5UmVzCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAUNbmV3QW1vdW50U29sZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUFaWRORlQFB3NvbGRLZXkJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQh0b3RhbE5GVAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgUIaXNzdWVORlQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjZWl2ZU5GVAABBQVpZE5GVAUDbmlsBRRjb21taXNzaW9uc1dpdGhBZ2VudAUaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQFCnR4VG9DYWxsZXIDBQVpc0JpZAkAzAgCBQhzb2xkRGF0YQkAzAgCBQliaWRVcGRhdGUJAMwIAgUJYmlkRGVsT2xkBQZidXlSZXMJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEIYXNTdHJpbmcBAmJ2BAckbWF0Y2gwBQJidgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA2J2MAUHJG1hdGNoMAUDYnYwCQACAQIkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkCgZpbnZva2UBB3NldENvbmYCA2tleQN2YWwEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEIY29udGFpbnMCBQNrZXkCBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEKYWRkQXJ0d29yawwEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkEDSR0MDIxNDcwMjE1NDMJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEBWFydElkCAUNJHQwMjE0NzAyMTU0MwJfMQQGY2FsbGVyCAUNJHQwMjE0NzAyMTU0MwJfMgQEZGF0ZQgFDSR0MDIxNDcwMjE1NDMCXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjE0NzAyMTU0MwJfNAQNJHQwMjE1NTMyMTYyMgkBCnNldExJY2VuY2UCBQpjaWRMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlBApsaWNlbmNlQ0lECAUNJHQwMjE1NTMyMTYyMgJfMQQLbGljZW5jZUhhc2gIBQ0kdDAyMTU1MzIxNjIyAl8yBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhCgUGY2FsbGVyBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQlyb3lhbHRpZXMDCQECIT0CBQ92YWxpZGF0ZUFydHdvcmsCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQQd2hpdGVsaXN0ZWRfZHJvcAkAZgIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgUGY2FsbGVyAgtfZnJlZV9kcm9wcwAABA0kdDAyMTkyMTIyMDA5AwUQd2hpdGVsaXN0ZWRfZHJvcAkAlAoCAAAFCmFydEFzc2V0SWQJAQ92YWxpZGF0ZVBheW1lbnQBBQFpBAZhbW91bnQIBQ0kdDAyMTkyMTIyMDA5Al8xBAdhc3NldElkCAUNJHQwMjE5MjEyMjAwOQJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFBmFtb3VudAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBBdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAMFEHdoaXRlbGlzdGVkX2Ryb3AJAPwHBAUNd2hpdGVsaXN0RGFwcAILdXNlRnJlZURyb3AJAMwIAgUGY2FsbGVyBQNuaWwFA25pbAUEdW5pdAMJAAACBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUFYXJ0SWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUFYXJ0SWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBWFydElkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUFYXJ0SWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBWFydElkBQlyb3lhbHRpZXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQZhbW91bnQFCmFydEFzc2V0SWQFA25pbAUKdHhUb0NhbGxlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ11cGRhdGVBcnR3b3JrDQR0eGlkBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBA0kdDAyMzkyNDIzOTk0CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDIzOTI0MjM5OTQCXzEEBmNhbGxlcggFDSR0MDIzOTI0MjM5OTQCXzIEBGRhdGUIBQ0kdDAyMzkyNDIzOTk0Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDIzOTI0MjM5OTQCXzQEDSR0MDI0MDA0MjQwNzMJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDI0MDA0MjQwNzMCXzEEC2xpY2VuY2VIYXNoCAUNJHQwMjQwMDQyNDA3MwJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECmVudHJ5RXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECD0VudHJ5IG5vdCBmb3VuZAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBHR4aWQDCQAAAgUEZmxhZwIHSUxMRUdBTAkAAgECHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBASEBCQELaXNBcnRNaW50ZWQCBQZjYWxsZXIFBHR4aWQECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBHR4aWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBHR4aWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlEaXNwbGF5Q2lkAgUGY2FsbGVyBQR0eGlkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBHR4aWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUEdHhpZAUMc2hhMjU2RXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlMaWNlbmNlQ2lkAgUGY2FsbGVyBQR0eGlkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlMaWNlbmNlSGFzaAIFBmNhbGxlcgUEdHhpZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVRhZ3MCBQZjYWxsZXIFBHR4aWQFBHRhZ3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBHR4aWQFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBHR4aWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBHR4aWQFCXJveWFsdGllcwUDbmlsBQp0eFRvQ2FsbGVyCQACAQIOQWxyZWFkeSBtaW50ZWQBaQELZmxhZ0FydHdvcmsEBWFydElkBGFkZHIEZmxhZwRub3RlBA0kdDAyNTcwMDI1NzM0CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNTcwMDI1NzM0Al8xBAZjYWxsZXIIBQ0kdDAyNTcwMDI1NzM0Al8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RmxhZwIFBGFkZHIFBWFydElkBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOb3RlAgUEYWRkcgUFYXJ0SWQFBG5vdGUFA25pbAkAAgEJAKwCAgIOVW5rbm93IHN0YXR1cyAFBGZsYWcJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAWkBDWRlbGV0ZUFydHdvcmsCBWFydElkBGFkZHIEDSR0MDI2MTcwMjYyMDQJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDI2MTcwMjYyMDQCXzEEBmNhbGxlcggFDSR0MDI2MTcwMjYyMDQCXzIECWFkZHJUb1VzZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFBGFkZHIFBmNhbGxlcgQKZW50cnlFeGlzdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQCIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBApzaGEyNTZIYXNoCQEOZ2V0U3RyaW5nQnlLZXkBCQERa2V5SGFzaEJ5VHhpZEFkZHICBQlhZGRyVG9Vc2UFBWFydElkBAZzaWduSUQDCQAAAgUKc2hhMjU2SGFzaAIACQEOZ2V0U3RyaW5nQnlLZXkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAIABA1zaWduSURfbGVnYWN5AwkAAAIFBnNpZ25JRAIABQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleWlkQnlTaWduaWQCBQlhZGRyVG9Vc2UFBnNpZ25JRAUDbmlsBAxkYXRhVG9EZWxldGUJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGF0ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEZXNjAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RGlzcGxheUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV4cG9ydENpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUV4cG9ydEhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlMaWNlbmNlSGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUxpY2VuY2VDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUeXBlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VGFncwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleU1heE1pbnQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlPblNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlGbGFnAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEIa2V5UHJpY2UCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUVuZFNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOb3RlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5Q3Jhd2xlcgIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVJveWFsdGllcwIFCWFkZHJUb1VzZQUFYXJ0SWQFA25pbAUNc2lnbklEX2xlZ2FjeQMJAQEhAQkBC2lzQXJ0TWludGVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwUMZGF0YVRvRGVsZXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUMZGF0YVRvRGVsZXRlCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAFpAQtzZWxsQXJ0d29yawYFYXJ0SWQFcHJpY2UHbWF4TWludAdhc3NldElkCGJsb2NrRW5kBnB1YktleQQNJHQwMjg5ODMyOTA1MwkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyODk4MzI5MDUzAl8xBAZjYWxsZXIIBQ0kdDAyODk4MzI5MDUzAl8yBARkYXRlCAUNJHQwMjg5ODMyOTA1MwJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyODk4MzI5MDUzAl80BAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBWFydElkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQBmAgAABQhibG9ja0VuZAkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUIYmxvY2tFbmQAAAMJAQIhPQIFB21heE1pbnQAAQYJAQIhPQIFBXByaWNlAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQKYmFzZUhlaWdodAMJAAACBQhibG9ja0VuZAAAAAAFBmhlaWdodAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUFcHJpY2UJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQDCQBmAgUHbWF4TWludABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQphbW91bnRTb2xkAAAJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQphbW91bnRTb2xkAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFBmJpZE5icgAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMECnNlbGxTdGF0dXMDAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBgcECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5UHJpY2UCBQZjYWxsZXIFBWFydElkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkBQdtYXhNaW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQJAGQCBQpiYXNlSGVpZ2h0BQhibG9ja0VuZAUDbmlsBQp0eFRvQ2FsbGVyAWkBCmJ1eUFydHdvcmsCBWFydElkBmlzc3VlcgkBB2J1eU1pbnQGBQFpBQVhcnRJZAUGaXNzdWVyAgACAAIAAWkBBnNldEJpZAIFYXJ0SWQGaXNzdWVyBA0kdDAzMTQyNjMxNDY2CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMTQyNjMxNDY2Al8xBAZjYWxsZXIIBQ0kdDAzMTQyNjMxNDY2Al8yBARkYXRlCAUNJHQwMzE0MjYzMTQ2NgJfMwQNJHQwMzE0NzEzMTUwNwkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAzMTQ3MTMxNTA3Al8xBAZhbW91bnQIBQ0kdDAzMTQ3MTMxNTA3Al8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQIYmxvY2tFbmQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQACAQILU2FsZSBlbmRlZC4EBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUGYW1vdW50CQACAQIOV3JvbmcgbWluIHNlbGwECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsAWkBCWFjY2VwdEJpZAUFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBnB1YktleQkBB2J1eU1pbnQGBQFpBQVhcnRJZAUGaXNzdWVyBQViaWRJZAUIYmlkT3duZXIFBnB1YktleQFpAQljYW5jZWxCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMzI4MzEzMjg5MgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzI4MzEzMjg5MgJfMQQGY2FsbGVyCAUNJHQwMzI4MzEzMjg5MgJfMgQEZGF0ZQgFDSR0MDMyODMxMzI4OTICXzMDAwkBAiE9AgUGY2FsbGVyBQhiaWRPd25lcgkBAiE9AgUGY2FsbGVyBQZpc3N1ZXIHCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgQNcmV0dXJuTW9uZXlUbwMJAAACBQZjYWxsZXIFBmlzc3VlcgUIYmlkT3duZXIFBmNhbGxlcgQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8EB2Fzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAAECWJpZFN0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUNcmV0dXJuTW9uZXlUbwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQUHYXNzZXRJZAUDbmlsAQJ0eAEIdmVyaWZpZXIABAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MACwMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAg11cGRhdGVBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAwDAwMDCQAAAggFA2ludghmdW5jdGlvbgILc2VsbEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABQMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAglhY2NlcHRCaWQJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAMgTAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tlee08ukE=", "height": 2792064, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 27jXT8psTeUgVvwNgx3PzdN4RTWQgsZW3YryJvGcDoRP Next: 7TRsmnzD9TyY2ZXyBn6zHDSGRShpLa6iB6JE4nPVqFjU Diff:
OldNewDifferences
526526 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
527527 then (amountForSign - amountForAgent)
528528 else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
529- else if (true)
530- 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)))
531- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
529+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, artAssetId)]
532530 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
533531 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
534532 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
576574
577575 @Callable(i)
578576 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
579- let $t02146621539 = idCallerDateSponsored(i, pubKey)
580- let artId = $t02146621539._1
581- let caller = $t02146621539._2
582- let date = $t02146621539._3
583- let isSponsored = $t02146621539._4
584- let $t02154921618 = setLIcence(cidLicence, sha256Licence)
585- let licenceCID = $t02154921618._1
586- let licenceHash = $t02154921618._2
577+ let $t02147021543 = idCallerDateSponsored(i, pubKey)
578+ let artId = $t02147021543._1
579+ let caller = $t02147021543._2
580+ let date = $t02147021543._3
581+ let isSponsored = $t02147021543._4
582+ let $t02155321622 = setLIcence(cidLicence, sha256Licence)
583+ let licenceCID = $t02155321622._1
584+ let licenceHash = $t02155321622._2
587585 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
588586 if ((validateArtwork != ""))
589587 then throw("Something went wrong!")
590588 else {
591589 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
592- let $t02191722005 = if (whitelisted_drop)
590+ let $t02192122009 = if (whitelisted_drop)
593591 then $Tuple2(0, artAssetId)
594592 else validatePayment(i)
595- let amount = $t02191722005._1
596- let assetId = $t02191722005._2
593+ let amount = $t02192122009._1
594+ let assetId = $t02192122009._2
597595 if (!(isDefined(amount)))
598596 then throw("Something went wrong")
599597 else {
618616 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
619617 then throw(maintenanceMSG)
620618 else {
621- let $t02392023990 = idCallerDateSponsored(i, pubKey)
622- let id = $t02392023990._1
623- let caller = $t02392023990._2
624- let date = $t02392023990._3
625- let isSponsored = $t02392023990._4
626- let $t02400024069 = setLIcence(cidLicence, sha256Licence)
627- let licenceCID = $t02400024069._1
628- let licenceHash = $t02400024069._2
619+ let $t02392423994 = idCallerDateSponsored(i, pubKey)
620+ let id = $t02392423994._1
621+ let caller = $t02392423994._2
622+ let date = $t02392423994._3
623+ let isSponsored = $t02392423994._4
624+ let $t02400424073 = setLIcence(cidLicence, sha256Licence)
625+ let licenceCID = $t02400424073._1
626+ let licenceHash = $t02400424073._2
629627 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
630628 if ((validateArtwork != ""))
631629 then throw("Something went wrong!")
653651
654652 @Callable(i)
655653 func flagArtwork (artId,addr,flag,note) = {
656- let $t02569625730 = idCallerDate(i)
657- let id = $t02569625730._1
658- let caller = $t02569625730._2
654+ let $t02570025734 = idCallerDate(i)
655+ let id = $t02570025734._1
656+ let caller = $t02570025734._2
659657 if (containsElement([chris, toString(this)], caller))
660658 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
661659 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
667665
668666 @Callable(i)
669667 func deleteArtwork (artId,addr) = {
670- let $t02616626200 = idCallerDate(i)
671- let id = $t02616626200._1
672- let caller = $t02616626200._2
668+ let $t02617026204 = idCallerDate(i)
669+ let id = $t02617026204._1
670+ let caller = $t02617026204._2
673671 let addrToUse = if (containsElement([chris, toString(this)], caller))
674672 then addr
675673 else caller
699697
700698 @Callable(i)
701699 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
702- let $t02897929049 = idCallerDateSponsored(i, pubKey)
703- let id = $t02897929049._1
704- let caller = $t02897929049._2
705- let date = $t02897929049._3
706- let isSponsored = $t02897929049._4
700+ let $t02898329053 = idCallerDateSponsored(i, pubKey)
701+ let id = $t02898329053._1
702+ let caller = $t02898329053._2
703+ let date = $t02898329053._3
704+ let isSponsored = $t02898329053._4
707705 let artworkName = getStringByKey(keyName(caller, artId))
708706 if ((artworkName == ""))
709707 then throw("This art doesn't match your account")
777775
778776 @Callable(i)
779777 func setBid (artId,issuer) = {
780- let $t03142231462 = idCallerDate(i)
781- let id = $t03142231462._1
782- let caller = $t03142231462._2
783- let date = $t03142231462._3
784- let $t03146731503 = isPayment(i)
785- let payment = $t03146731503._1
786- let amount = $t03146731503._2
778+ let $t03142631466 = idCallerDate(i)
779+ let id = $t03142631466._1
780+ let caller = $t03142631466._2
781+ let date = $t03142631466._3
782+ let $t03147131507 = isPayment(i)
783+ let payment = $t03147131507._1
784+ let amount = $t03147131507._2
787785 let assetId = if (!(isDefined(payment.assetId)))
788786 then "WAVES"
789787 else toBase58String(value(payment.assetId))
819817
820818 @Callable(i)
821819 func cancelBid (artId,issuer,bidId,bidOwner) = {
822- let $t03282732888 = idCallerDate(i)
823- let id = $t03282732888._1
824- let caller = $t03282732888._2
825- let date = $t03282732888._3
820+ let $t03283132892 = idCallerDate(i)
821+ let id = $t03283132892._1
822+ let caller = $t03283132892._2
823+ let date = $t03283132892._3
826824 if (if ((caller != bidOwner))
827825 then (caller != issuer)
828826 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))
524524 then {
525525 let commissionsWithAgent = if ((amountForAgent != 0))
526526 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
527527 then (amountForSign - amountForAgent)
528528 else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
529- else if (true)
530- 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)))
531- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
529+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, artAssetId)]
532530 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
533531 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
534532 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
535533 let txToCaller = if (isSponsored)
536534 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
537535 else nil
538536 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)
539537 if (isBid)
540538 then [soldData, bidUpdate, bidDelOld] :: buyRes
541539 else soldData :: buyRes
542540 }
543541 else throw("Strict value is not equal to itself.")
544542 }
545543 else throw("Strict value is not equal to itself.")
546544 }
547545 else throw("Strict value is not equal to itself.")
548546 }
549547 }
550548 }
551549 }
552550 }
553551 }
554552 }
555553
556554
557555 func asString (bv) = match bv {
558556 case bv0: String =>
559557 bv0
560558 case _ =>
561559 throw("Sponsored Public Key String expected")
562560 }
563561
564562
565563 @Callable(invoke)
566564 func setConf (key,val) = {
567565 let caller = toString(invoke.caller)
568566 if (containsElement([chris, toString(this)], caller))
569567 then if (contains(key, "conf_"))
570568 then [StringEntry(key, val)]
571569 else throw("Entries starting with conf_ only")
572570 else throw("You are not allowed to change this")
573571 }
574572
575573
576574
577575 @Callable(i)
578576 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
579- let $t02146621539 = idCallerDateSponsored(i, pubKey)
580- let artId = $t02146621539._1
581- let caller = $t02146621539._2
582- let date = $t02146621539._3
583- let isSponsored = $t02146621539._4
584- let $t02154921618 = setLIcence(cidLicence, sha256Licence)
585- let licenceCID = $t02154921618._1
586- let licenceHash = $t02154921618._2
577+ let $t02147021543 = idCallerDateSponsored(i, pubKey)
578+ let artId = $t02147021543._1
579+ let caller = $t02147021543._2
580+ let date = $t02147021543._3
581+ let isSponsored = $t02147021543._4
582+ let $t02155321622 = setLIcence(cidLicence, sha256Licence)
583+ let licenceCID = $t02155321622._1
584+ let licenceHash = $t02155321622._2
587585 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
588586 if ((validateArtwork != ""))
589587 then throw("Something went wrong!")
590588 else {
591589 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
592- let $t02191722005 = if (whitelisted_drop)
590+ let $t02192122009 = if (whitelisted_drop)
593591 then $Tuple2(0, artAssetId)
594592 else validatePayment(i)
595- let amount = $t02191722005._1
596- let assetId = $t02191722005._2
593+ let amount = $t02192122009._1
594+ let assetId = $t02192122009._2
597595 if (!(isDefined(amount)))
598596 then throw("Something went wrong")
599597 else {
600598 let decrease_whitelist_drop = if (whitelisted_drop)
601599 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
602600 else unit
603601 if ((decrease_whitelist_drop == decrease_whitelist_drop))
604602 then {
605603 let txToCaller = if (isSponsored)
606604 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
607605 else nil
608606 ([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)
609607 }
610608 else throw("Strict value is not equal to itself.")
611609 }
612610 }
613611 }
614612
615613
616614
617615 @Callable(i)
618616 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
619617 then throw(maintenanceMSG)
620618 else {
621- let $t02392023990 = idCallerDateSponsored(i, pubKey)
622- let id = $t02392023990._1
623- let caller = $t02392023990._2
624- let date = $t02392023990._3
625- let isSponsored = $t02392023990._4
626- let $t02400024069 = setLIcence(cidLicence, sha256Licence)
627- let licenceCID = $t02400024069._1
628- let licenceHash = $t02400024069._2
619+ let $t02392423994 = idCallerDateSponsored(i, pubKey)
620+ let id = $t02392423994._1
621+ let caller = $t02392423994._2
622+ let date = $t02392423994._3
623+ let isSponsored = $t02392423994._4
624+ let $t02400424073 = setLIcence(cidLicence, sha256Licence)
625+ let licenceCID = $t02400424073._1
626+ let licenceHash = $t02400424073._2
629627 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
630628 if ((validateArtwork != ""))
631629 then throw("Something went wrong!")
632630 else {
633631 let entryExist = getStringByKey(keyName(caller, txid))
634632 if ((entryExist == ""))
635633 then throw("Entry not found")
636634 else {
637635 let flag = getStringByKey(keyFlag(caller, txid))
638636 if ((flag == "ILLEGAL"))
639637 then throw("Cannot update ILLEGAL artwork")
640638 else if (!(isArtMinted(caller, txid)))
641639 then {
642640 let txToCaller = if (isSponsored)
643641 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
644642 else nil
645643 ([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)
646644 }
647645 else throw("Already minted")
648646 }
649647 }
650648 }
651649
652650
653651
654652 @Callable(i)
655653 func flagArtwork (artId,addr,flag,note) = {
656- let $t02569625730 = idCallerDate(i)
657- let id = $t02569625730._1
658- let caller = $t02569625730._2
654+ let $t02570025734 = idCallerDate(i)
655+ let id = $t02570025734._1
656+ let caller = $t02570025734._2
659657 if (containsElement([chris, toString(this)], caller))
660658 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
661659 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
662660 else throw(("Unknow status " + flag))
663661 else throw("You are not allowed")
664662 }
665663
666664
667665
668666 @Callable(i)
669667 func deleteArtwork (artId,addr) = {
670- let $t02616626200 = idCallerDate(i)
671- let id = $t02616626200._1
672- let caller = $t02616626200._2
668+ let $t02617026204 = idCallerDate(i)
669+ let id = $t02617026204._1
670+ let caller = $t02617026204._2
673671 let addrToUse = if (containsElement([chris, toString(this)], caller))
674672 then addr
675673 else caller
676674 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
677675 if ((entryExist == ""))
678676 then throw("No art matching for this address")
679677 else {
680678 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
681679 let signID = if ((sha256Hash == ""))
682680 then getStringByKey(keySignID(addrToUse, artId))
683681 else ""
684682 let signID_legacy = if ((signID == ""))
685683 then nil
686684 else [DeleteEntry(keyidBySignid(addrToUse, signID))]
687685 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)
688686 if (!(isArtMinted(addrToUse, artId)))
689687 then if (!(dappRunning))
690688 then throw(maintenanceMSG)
691689 else dataToDelete
692690 else if (containsElement([chris, toString(this)], caller))
693691 then dataToDelete
694692 else throw("Art already minted, you cannot delete it")
695693 }
696694 }
697695
698696
699697
700698 @Callable(i)
701699 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
702- let $t02897929049 = idCallerDateSponsored(i, pubKey)
703- let id = $t02897929049._1
704- let caller = $t02897929049._2
705- let date = $t02897929049._3
706- let isSponsored = $t02897929049._4
700+ let $t02898329053 = idCallerDateSponsored(i, pubKey)
701+ let id = $t02898329053._1
702+ let caller = $t02898329053._2
703+ let date = $t02898329053._3
704+ let isSponsored = $t02898329053._4
707705 let artworkName = getStringByKey(keyName(caller, artId))
708706 if ((artworkName == ""))
709707 then throw("This art doesn't match your account")
710708 else {
711709 let flag = getStringByKey(keyFlag(caller, artId))
712710 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
713711 then throw("Flagged artwork")
714712 else {
715713 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
716714 if ((0 > blockEnd))
717715 then throw("Negative end")
718716 else if (if ((blockEnd > 0))
719717 then if ((maxMint != 1))
720718 then true
721719 else (price != 0)
722720 else false)
723721 then throw("Timed offer only allowed for unique edition and offer only")
724722 else {
725723 let baseHeight = if ((blockEnd == 0))
726724 then 0
727725 else height
728726 if (!(acceptedAssetIds(assetId)))
729727 then throw("Something went wrong!")
730728 else if (!(validateMinSell(price)))
731729 then throw("Something went wrong!")
732730 else {
733731 let checkUser = validateUser(caller)
734732 if ((checkUser != ""))
735733 then throw(checkUser)
736734 else {
737735 let amountSold = getIntegerByKey(keyIssued(caller, artId))
738736 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
739737 if ((maxMint > 100))
740738 then throw("100 editions max per artwork")
741739 else if (if ((amountSold != 0))
742740 then (amountSold == maxCanSell)
743741 else false)
744742 then throw("Max edition reached.")
745743 else if (if ((amountSold > 0))
746744 then (maxCanSell != maxMint)
747745 else false)
748746 then throw("Cannot change maximum issuable anymore")
749747 else if (if ((bidNbr > 0))
750748 then (maxCanSell != maxMint)
751749 else false)
752750 then throw("Cannot change maximum issuable with active orders")
753751 else {
754752 let sellStatus = if (if ((price > 0))
755753 then (maxMint > 0)
756754 else false)
757755 then true
758756 else false
759757 let txToCaller = if (isSponsored)
760758 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
761759 else nil
762760 ([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)
763761 }
764762 }
765763 }
766764 }
767765 }
768766 }
769767 }
770768
771769
772770
773771 @Callable(i)
774772 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
775773
776774
777775
778776 @Callable(i)
779777 func setBid (artId,issuer) = {
780- let $t03142231462 = idCallerDate(i)
781- let id = $t03142231462._1
782- let caller = $t03142231462._2
783- let date = $t03142231462._3
784- let $t03146731503 = isPayment(i)
785- let payment = $t03146731503._1
786- let amount = $t03146731503._2
778+ let $t03142631466 = idCallerDate(i)
779+ let id = $t03142631466._1
780+ let caller = $t03142631466._2
781+ let date = $t03142631466._3
782+ let $t03147131507 = isPayment(i)
783+ let payment = $t03147131507._1
784+ let amount = $t03147131507._2
787785 let assetId = if (!(isDefined(payment.assetId)))
788786 then "WAVES"
789787 else toBase58String(value(payment.assetId))
790788 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
791789 if (if ((blockEnd != 0))
792790 then (height >= blockEnd)
793791 else false)
794792 then throw("Sale ended.")
795793 else {
796794 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
797795 if (!(acceptedAssetIds(assetId)))
798796 then throw("asset not accepted")
799797 else if (!(validateMinSell(amount)))
800798 then throw("Wrong min sell")
801799 else {
802800 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
803801 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
804802 if ((0 >= maxCanSell))
805803 then throw("No max edition set for this artwork")
806804 else if ((amountSold >= maxCanSell))
807805 then throw("Sold out, you cannot bid")
808806 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
809807 }
810808 }
811809 }
812810
813811
814812
815813 @Callable(i)
816814 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
817815
818816
819817
820818 @Callable(i)
821819 func cancelBid (artId,issuer,bidId,bidOwner) = {
822- let $t03282732888 = idCallerDate(i)
823- let id = $t03282732888._1
824- let caller = $t03282732888._2
825- let date = $t03282732888._3
820+ let $t03283132892 = idCallerDate(i)
821+ let id = $t03283132892._1
822+ let caller = $t03283132892._2
823+ let date = $t03283132892._3
826824 if (if ((caller != bidOwner))
827825 then (caller != issuer)
828826 else false)
829827 then throw("You cannot do this action")
830828 else {
831829 let returnMoneyTo = if ((caller == issuer))
832830 then bidOwner
833831 else caller
834832 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
835833 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
836834 let bidData = getStringByKey((bidDataKey + "_OPEN"))
837835 if ((bidData == ""))
838836 then throw("Bid not found")
839837 else {
840838 let bidDataArr = split(bidData, "_")
841839 let assetId = getBidAssetId(bidDataArr[0])
842840 let bidStatus = "CANCELED"
843841 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
844842 }
845843 }
846844 }
847845
848846
849847 @Verifier(tx)
850848 func verifier () = match tx {
851849 case inv: InvokeScriptTransaction =>
852850 if (if (if (if ((inv.function == "addArtwork"))
853851 then (inv.dApp == this)
854852 else false)
855853 then (inv.fee == 500000)
856854 else false)
857855 then (inv.feeAssetId == unit)
858856 else false)
859857 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[11])))
860858 else if (if (if (if ((inv.function == "updateArtwork"))
861859 then (inv.dApp == this)
862860 else false)
863861 then (inv.fee == 500000)
864862 else false)
865863 then (inv.feeAssetId == unit)
866864 else false)
867865 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
868866 else if (if (if (if ((inv.function == "sellArtwork"))
869867 then (inv.dApp == this)
870868 else false)
871869 then (inv.fee == 500000)
872870 else false)
873871 then (inv.feeAssetId == unit)
874872 else false)
875873 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
876874 else if (if (if (if ((inv.function == "acceptBid"))
877875 then (inv.dApp == this)
878876 else false)
879877 then (inv.fee == 500000)
880878 else false)
881879 then (inv.feeAssetId == unit)
882880 else false)
883881 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
884882 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
885883 case _ =>
886884 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
887885 }
888886

github/deemru/w8io/3ef1775 
184.71 ms