tx · HKjeQi66DS5LZUXAfw8ifFkqFohx7GaHGbEKsPukJGLw

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.03700000 Waves

2023.04.04 14:03 [2519735] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "HKjeQi66DS5LZUXAfw8ifFkqFohx7GaHGbEKsPukJGLw", "fee": 3700000, "feeAssetId": null, "timestamp": 1680606255739, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "3FtD72Y4mmi1zmVbWn9MSygLyaJYJMrqHXWEA1m8y1UmP3LXLezrojjm2kGVjWhW9rwutddirCi8DBa2sk7C6FtJ" ], "script": "base64:BgIxCAISAwoBCBIECgIRERIECgIRERIDCgEREgUKAwEBARIDCgEIEgQKAggIEgUKAwgICEkAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAGTVVMVDEwAIDIr6AlAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkbkFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRAwkAAAIBAVQFByRtYXRjaDABIPd26vf3g8pl224T7gI7z1gplanB0Y3yS9ps2B1igMjeCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQARSWR4Q2ZnRWNvbm9teURhcHAAAgAUSWR4Q2ZnR292ZXJuYW5jZURhcHAAAwEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EABk5VTVJFUwAGABNGQUNUT1JZTUFYV0FSRUhPVVNFAIDIr6AlABBSRVNPVVJDRVBSSUNFTUlOANXWCQAKTUlOUEFZTUVOVACQTgAOU0VMTE1VTFRJUExJRVIAyAEADUJVWU1VTFRJUExJRVIArAIACkxBTkRQUkVGSVgCBExBTkQACkRVQ0tQUkVGSVgCBERVQ0sADFdITVVMVElQTElFUgCAyK+gJQAKQVVDVElPTkZFRQCQTgAIcmVzVHlwZXMJAMwIAgIDT2lsCQDMCAICA09yZQkAzAgCAgRXb29kCQDMCAICBFNhbmQJAMwIAgIEQ2xheQkAzAgCAgdPcmdhbmljBQNuaWwACG1hdFR5cGVzCQDMCAICBEZ1ZWwJAMwIAgIFTWV0YWwJAMwIAgIFUGxhbmsJAMwIAgIFR2xhc3MJAMwIAgIHUGxhc3RpYwkAzAgCAgdQcm90ZWluBQNuaWwACXByb2RUeXBlcwkAzAgCAg1GaXJzdCBBaWQgS2l0CQDMCAICCEJhY2twYWNrCQDMCAICC0Zvb2QgUmF0aW9uCQDMCAICCEpldCBQYWNrCQDMCAICBVJhZGFyBQNuaWwACmNvbnRpbmVudHMJAMwIAgIIQW1lcmljYXMJAMwIAgIGRXVyb3BlCQDMCAICBEFzaWEJAMwIAgIGQWZyaWNhCQDMCAICB09jZWFuaWEFA25pbAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAhAxXzFfMV8yXzJfNV8xXzEwCQDMCAICETJfNV81XzJfN181XzJfMTAwCQDMCAICEDFfMV8xXzJfMl81XzFfMTAJAMwIAgIROV85XzFfNV81XzFfNV8xMDAJAMwIAgIRMV81XzFfNV81XzFfMV8xMDAFA25pbAAPY29udElkeEFtZXJpY2FzAAAADWNvbnRJZHhFdXJvcGUAAQALY29udElkeEFzaWEAAgANY29udElkeEFmcmljYQADAA5jb250SWR4T2NlYW5pYQAEAR5rZXlGYWN0b3J5V2FyZWhvdXNlQnlJZEFuZFR5cGUCCWZhY3RvcnlJZAdyZXNUeXBlCQCsAgIJAKwCAgkArAICAhtmYWN0b3J5V2hCeUNvbnRpbmVudEFuZFJlc18FCWZhY3RvcnlJZAIBXwkApAMBBQdyZXNUeXBlAQ5rZXlPcmRlckJ5TGFuZAELbGFuZEFzc2V0SWQJAKwCAgIKbGFuZE9yZGVyXwULbGFuZEFzc2V0SWQBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBEWtleUJhY2twYWNrQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAgliYWNrUGFja18FC2R1Y2tBc3NldElkAQ9rZXlEdWNrTG9jYXRpb24BC2R1Y2tBc3NldElkCQCsAgICDWR1Y2tMb2NhdGlvbl8FC2R1Y2tBc3NldElkAQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQdhc3NldElkCQCsAgICCW5mdE93bmVyXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgtzdGFrZWRUaW1lXwUHYXNzZXRJZAAPbG9jSWR4Q29udGluZW50AAAACmxvY0lkeFR5cGUAAQAIbG9jSWR4SWQAAgAKYnBJZHhMZXZlbAAAAAhicElkeFJlcwABAAhicElkeE1hdAACAAlicElkeFByb2QAAwAId2hJZHhWb2wAAAAId2hJZHhSZXMAAQAId2hJZHhNYXQAAgAJd2hJZHhQcm9kAAMADndoSWR4TG9ja2VkVm9sAAQACW9yZElkeFJlcwAAAAlvcmRJZHhNYXQAAQAKb3JkSWR4UHJvZAACAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBCGdldE9yZGVyAQZvcmRLZXkEAXAJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQZvcmRLZXkCMDBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOjBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOgIBOgkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAXAFCW9yZElkeFJlcwIBXwUGTlVNUkVTCQCRAwIFAXAFCW9yZElkeFJlcwIXMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQlvcmRJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQFwBQlvcmRJZHhNYXQCFzBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwCQDMCAIJAJEDAgUBcAUKb3JkSWR4UHJvZAUDbmlsARJnZXRXYXJlaG91c2VWb2x1bWUBCXZvbFByZWZpeAQFcGFydHMJALUJAgUJdm9sUHJlZml4AgFfCQBoAgkAaAIFDFdITVVMVElQTElFUgkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwYXJ0cwABAAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwYXJ0cwAAARlnZXRXYXJlaG91c2VDdXJyUmVzVm9sdW1lAQljdXJyZW50V2gKAQNzdW0CA2FjYwRpdGVtCQBkAgUDYWNjCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0KAAIkbAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8KAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA3N1bQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8y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YXhQcmljZSA9IAkApAMBBQhtYXhQcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIbWF0VHlwZXMFB21hdFR5cGUCASkJAJUKAwkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBlAgUCdzAFAW0FCXVzZG5TcGVudAUBbQELZ2V0QmFja3BhY2sBBWJwS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQVicEtleQIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToJAMwIAgkApAMBCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUBcAUKYnBJZHhMZXZlbAAACQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeFJlcwILMF8wXzBfMF8wXzAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAXAFCWJwSWR4UHJvZAUDbmlsAQxjaGVja0Jsb2NrZWQAAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ9zdGFraW5nQ29udHJhY3QJAQprZXlCbG9ja2VkAAcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlBQR1bml0CAFpAQ1jb25zdHJ1Y3RvclYxAQhyZXN0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyBQNuaWwBaQENc2VsbFJlc291cmNlcwIHYW1vdW50cwltaW5QcmljZXMEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECKnNlbGxSZXNvdXJjZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwoBBWFkZGVyAgNhY2MBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkAkQMCBQdyZXNMaXN0BQFqAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhQsIGJ1dCB0cmllZCB0byBzZWxsIAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiVZb3UgdHJpZWQgdG8gc2VsbCBuZWdhdGl2ZSBhbW91bnQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAgI6IAkApAMBCQCRAwIFB2Ftb3VudHMFAWoDCQBmAgkAkQMCBQdhbW91bnRzBQFqAAAEAWIJAQxzZWxsSW50ZXJuYWwEBQVsb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1pblByaWNlcwUBagkAlQoDCQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFqCQCRAwIFB2Ftb3VudHMFAWoJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHcmVzTGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwJAJQKAgkAzQgCCAUGbWVyZ2VkAl8xCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIIBQZtZXJnZWQCXzMFC3VzZG5Bc3NldElkBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMYnV5TWF0ZXJpYWxzAgdhbW91bnRzCW1heFByaWNlcwQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2RuQXNzZXRJZAkAAgECE1VTRE4gcGF5bWVudHMgb25seSEEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUYJAAIBCQCsAgICLUR1Y2sgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQFbG9jSWQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8KAQhtVXBkYXRlcgIDYWNjAWoDCQBmAgAACQCRAwIFB2Ftb3VudHMFAWoJAAIBCQCsAgIJAKwCAgkArAICAiRZb3UgdHJpZWQgdG8gYnV5IG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIbWF0VHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBC2J1eUludGVybmFsBAUFbG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltYXhQcmljZXMFAWoJAJUKAwkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBaggFAWICXzMJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHbWF0TGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIbVVwZGF0ZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAgFBm1lcmdlZAJfMwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAgFBm1lcmdlZAJfMwULdXNkbkFzc2V0SWQFA25pbAUDbmlsCQCUCgIJAM4IAggFBm1lcmdlZAJfMQUEcmVzdAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWV4Y2hhbmdlUmVzb3VyY2VzAQdhbW91bnRzBAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZG5Bc3NldElkCQACAQITVVNETiBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwoBCWV4Y2hhbmdlcgIDYWNjAWoEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFAWoEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEA2FtagkAkQMCBQdhbW91bnRzBQFqAwkAZgIFA2FtagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCGCwgYnV0IHRyaWVkIHRvIGV4Y2hhbmdlIAkApAMBBQNhbWoDCQBmAgAABQNhbWoJAAIBCQCsAgIJAKwCAgkArAICAilZb3UgdHJpZWQgdG8gZXhjaGFuZ2UgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhyZXNUeXBlcwUBagICOiAJAKQDAQUDYW1qAwkAZgIFA2FtagAACQCWCgQJAM0IAggFA2FjYwJfMQkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoFA2FtagkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBagUDYW1qCQBkAggFA2FjYwJfMwkAawMFA2FtagUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgJAM0IAggFA2FjYwJfNAkBDEludGVnZXJFbnRyeQIFBXdoS2V5BQJ3MAkAlgoECQDNCAIIBQNhY2MCXzEJAJEDAgUHcmVzTGlzdAUBagkAzQgCCAUDYWNjAl8yCQCRAwIFB21hdExpc3QFAWoIBQNhY2MCXzMIBQNhY2MCXzQEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFA25pbAUDbmlsAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZXhjaGFuZ2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAwkAZgIIBQZtZXJnZWQCXzMFA2FtdAkAAgEJAKwCAgkArAICCQCsAgICH0luc3VmZmljaWVudCBwYXltZW50ISBBdHRhY2hlZD0JAKQDAQUDYW10AgssIHJlcXVpcmVkPQkApAMBCAUGbWVyZ2VkAl8zBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIIBQZtZXJnZWQCXzECAV8JAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10CAUGbWVyZ2VkAl8zAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10CAUGbWVyZ2VkAl8zBQt1c2RuQXNzZXRJZAUDbmlsBQNuaWwJAJQKAgkAzggCBQRyZXN0CAUGbWVyZ2VkAl80BQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIYnV5R29vZHMDCnByb2R1Y3RJZHgFbGV2ZWwIcXVhbnRpdHkEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiVidXlHb29kcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzAwkAZgIAAAUIcXVhbnRpdHkJAAIBAhtRdWFudGl0eSBzaG91bGQgYmUgcG9zaXRpdmUEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBTQkAAgEJAKwCAgIxRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBNYW51ZmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQEY29udAkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8DAwkAZgIAAAUKcHJvZHVjdElkeAYJAGcCBQpwcm9kdWN0SWR4CQCQAwEFEHByb2R1Y3Rpb25NYXRyaXgJAAIBCQCsAgICFFVua25vd24gcHJvZHVjdCBpZHg9CQCkAwEFCnByb2R1Y3RJZHgEDnByb2R1Y3RDb250SWR4CQBqAgUKcHJvZHVjdElkeAkAkAMBBQpjb250aW5lbnRzAwkBAiE9AgkAkQMCBQpjb250aW5lbnRzBQ5wcm9kdWN0Q29udElkeAUEY29udAkAAgEJAKwCAgkArAICCQCsAgICHVRoaXMgcHJvZHVjdCBpcyBhdmFpbGFibGUgaW4gCQCRAwIFCmNvbnRpbmVudHMFDnByb2R1Y3RDb250SWR4AhEsIGJ1dCB5b3UgYXJlIGluIAUEY29udAQGcmVjaXBlCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUKcHJvZHVjdElkeAIBXwMJAQIhPQIJAJADAQUGcmVjaXBlCQBkAgUGTlVNUkVTAAIJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgECHByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfCgEGZmlsbGVyAgNhY2MLaWdub3JlZEl0ZW0EAW4IBQNhY2MCXzIEAXgDCQBmAgkAkAMBBQhwcm9kTGlzdAUBbgkAtQkCCQCRAwIFCHByb2RMaXN0BQFuAgEsCQDMCAICATAJAMwIAgIBMAkAzAgCAgEwBQNuaWwEA3gxcwkAkQMCBQF4AAAEAngxCQENcGFyc2VJbnRWYWx1ZQEFA3gxcwQDeDJzCQCRAwIFAXgAAQQCeDIJAQ1wYXJzZUludFZhbHVlAQUDeDJzBAN4M3MJAJEDAgUBeAACBAJ4MwkBDXBhcnNlSW50VmFsdWUBBQN4M3MEBmFtb3VudAkAaAIFCHF1YW50aXR5CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlAAcEAXkDCQAAAgUBbgUKcHJvZHVjdElkeAQHJG1hdGNoMAUFbGV2ZWwDCQAAAgABBQckbWF0Y2gwCQCsAgIJAKwCAgkArAICCQCsAgIJAKQDAQkAZAIFAngxBQZhbW91bnQCASwFA3gycwIBLAUDeDNzAwkAAAIAAgUHJG1hdGNoMAkArAICCQCsAgIJAKwCAgkArAICBQN4MXMCASwJAKQDAQkAZAIFAngyBQZhbW91bnQCASwFA3gzcwMJAAACAAMFByRtYXRjaDAJAKwCAgkArAICCQCsAgIJAKwCAgUDeDFzAgEsBQN4MnMCASwJAKQDAQkAZAIFAngzBQZhbW91bnQJAAIBCQCsAgICIlByb2R1Y3QgbGV2ZWwgc2hvdWxkIGJl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dG8gaXRzZWxmLgFpARRhY2NlcHRTZXJ2aWNlUGF5bWVudAEHc2VydmljZQQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkbkFzc2V0SWQJAAIBAhNVU0ROIHBheW1lbnRzIG9ubHkhBARuZWVkBAckbWF0Y2gwBQdzZXJ2aWNlAwkAAAICC0xBTkRfUkVOQU1FBQckbWF0Y2gwAICt4gQJAAIBAhBVbmtub3duIHNlcnZpY2UhAwkBAiE9AgUDYW10BQRuZWVkCQACAQkArAICCQCsAgIJAKwCAgUHc2VydmljZQIHIGNvc3RzIAkApAMBBQRuZWVkAgUgVVNETgkAlAoCBQNuaWwFA2FtdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFzZXRXYXJlaG91c2VPcmRlcgIMY2FyZ29MaXN0U3RyC2xhbmRBc3NldElkBAR1c2VyCAUBaQxvcmlnaW5DYWxsZXIEBGFkZHIJAKUIAQUEdXNlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQKY2FyZ29QYXJ0cwkAvAkCBQxjYXJnb0xpc3RTdHICAToDCQECIT0CCQCQAwEFCmNhcmdvUGFydHMAAwkAAgECNGNhcmdvTGlzdFN0ciBzaG91bGQgY29udGFpbiBleGFjdGx5IDIgJzonIHNlcGFyYXRvcnMECHJlc1BhcnRzCQC1CQIJAJEDAgUKY2FyZ29QYXJ0cwAAAgFfBAhtYXRQYXJ0cwkAtQkCCQCRAwIFCmNhcmdvUGFydHMAAQIBXwQJcHJvZFBhcnRzAwkAAAIJAJEDAgUKY2FyZ29QYXJ0cwACAgAFA25pbAkAtQkCCQCRAwIFCmNhcmdvUGFydHMAAgIBXwMJAQIhPQIJAJADAQUIcmVzUGFydHMFBk5VTVJFUwkAAgECIEFsbCA2IHJlc291cmNlcyBzaG91bGQgYmUgcGFzc2VkAwkBAiE9AgkAkAMBBQhtYXRQYXJ0cwUGTlVNUkVTCQACAQIgQWxsIDYgbWF0ZXJpYWxzIHNob3VsZCBiZSBwYXNzZWQEAndoCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIUZ2V0V2FyZWhvdXNlUkVBRE9OTFkJAMwIAgULbGFuZEFzc2V0SWQFA25pbAUDbmlsBAljdXJyZW50V2gJALwJAgUCd2gCAToECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQMY3VycldoUmVzVm9sCQEZZ2V0V2FyZWhvdXNlQ3VyclJlc1ZvbHVtZQEFCWN1cnJlbnRXaAQMY3VycldoTWF0Vm9sCQEZZ2V0V2FyZWhvdXNlQ3Vyck1hdFZvbHVtZQEFCWN1cnJlbnRXaAQOY3VycldoR29vZHNWb2wJARtnZXRXYXJlaG91c2VDdXJyR29vZHNWb2x1bWUBBQljdXJyZW50V2gED2N1cnJXaExvY2tlZFZvbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWN1cnJlbnRXaAUOd2hJZHhMb2NrZWRWb2wEC3doU3BhY2VMZWZ0CQBlAgkAZQIJAGUCCQBlAgkBEmdldFdhcmVob3VzZVZvbHVtZQEJAJEDAgUJY3VycmVudFdoBQh3aElkeFZvbAUMY3VycldoUmVzVm9sBQxjdXJyV2hNYXRWb2wFDmN1cnJXaEdvb2RzVm9sBQ9jdXJyV2hMb2NrZWRWb2wEBm9yZEtleQkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQECmN1cnJlbnRPcmQJAQhnZXRPcmRlcgEFBm9yZEtleQQNY3VycmVudE9yZFJlcwkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeFJlcwIBXwQNY3VycmVudE9yZE1hdAkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCW9yZElkeE1hdAIBXwQOY3VycmVudE9yZFByb2QDCQAAAgkAkQMCBQpjdXJyZW50T3JkBQpvcmRJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFCmN1cnJlbnRPcmQFCm9yZElkeFByb2QCAV8EDXVzZG5OZWVkMkxvY2sAAAoBBG9yZFICA2FjYwRpdGVtBAFqCAUDYWNjAl8xBAlpdGVtUGFydHMJALUJAgUEaXRlbQIBQAMJAQIhPQIJAJADAQUJaXRlbVBhcnRzAAIJAAIBAi5JbmNvcnJlY3Qgb3JkZXIgZm9ybWF0LCBzaG91bGQgYmUgYW1vdW50QHByaWNlBAhuZXdPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwAABAhuZXdPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwABBAluZXdPcmRVc2QJAGsDBQhuZXdPcmRBbQUIbmV3T3JkUHIFBU1VTFQ4BAN3aHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQljdXJyV2hSZXMFAWoEC2N1ck9yZFBhcnRzCQC1CQIJAJEDAgUNY3VycmVudE9yZFJlcwUBagIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDCQBmAgAABQhjdXJPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUDd2hyCQBlAggFA2FjYwJfMwUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QJAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aHIFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUIY3VyT3JkQW0IBQNhY2MCXzQDCQBmAgUIbmV3T3JkQW0AAAMJAGYCAAAFCGN1ck9yZEFtBAZhbURpZmYJAGQCBQhuZXdPcmRBbQUIY3VyT3JkQW0JAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aHIFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUGYW1EaWZmCQBkAggFA2FjYwJfNAUJbmV3T3JkVXNkCQCWCgQJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQN3aHIJAGUCCQBkAggFA2FjYwJfMwUIbmV3T3JkQW0FCGN1ck9yZEFtCQBlAgkAZAIIBQNhY2MCXzQFCW5ld09yZFVzZAUJY3VyT3JkVXNkAwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZQIFCGN1ck9yZEFtBQhuZXdPcmRBbQMJAGYCAAAJAGUCBQN3aHIFBmFtRGlmZgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBBQZhbURpZmYCGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFA3docgIKIGF2YWlsYWJsZQkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFA3docgUGYW1EaWZmCQBkAggFA2FjYwJfMwUGYW1EaWZmCAUDYWNjAl80AwkAZgIAAAkAZAIFA3docgUIbmV3T3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQkBAS0BBQhuZXdPcmRBbQIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUDd2hyAgogYXZhaWxhYmxlCQCWCgQJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUDd2hyBQhuZXdPcmRBbQkAZQIJAGUCCAUDYWNjAl8zBQhuZXdPcmRBbQUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QEAXIKAAIkbAUIcmVzUGFydHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAUDbmlsAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEb3JkUgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgoBBG9yZE0CA2FjYwRpdGVtBAFqCAUDYWNjAl8xBAlpdGVtUGFydHMJALUJAgUEaXRlbQIBQAMJAQIhPQIJAJADAQUJaXRlbVBhcnRzAAIJAAIBAi5JbmNvcnJlY3Qgb3JkZXIgZm9ybWF0LCBzaG91bGQgYmUgYW1vdW50QHByaWNlBAhuZXdPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwAABAhuZXdPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWl0ZW1QYXJ0cwABBAluZXdPcmRVc2QJAGsDBQhuZXdPcmRBbQUIbmV3T3JkUHIFBU1VTFQ4BAN3aG0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQljdXJyV2hNYXQFAWoEC2N1ck9yZFBhcnRzCQC1CQIJAJEDAgUNY3VycmVudE9yZE1hdAUBagIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDCQBmAgAABQhjdXJPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUDd2htCQBlAggFA2FjYwJfMwUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QJAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aG0FCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUIY3VyT3JkQW0IBQNhY2MCXzQDCQBmAgUIbmV3T3JkQW0AAAMJAGYCAAAFCGN1ck9yZEFtBAZhbURpZmYJAGQCBQhuZXdPcmRBbQUIY3VyT3JkQW0JAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aG0FCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUGYW1EaWZmCQBkAggFA2FjYwJfNAUJbmV3T3JkVXNkCQCWCgQJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQN3aG0JAGUCCQBkAggFA2FjYwJfMwUIbmV3T3JkQW0FCGN1ck9yZEFtCQBlAgkAZAIIBQNhY2MCXzQFCW5ld09yZFVzZAUJY3VyT3JkVXNkAwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZQIFCGN1ck9yZEFtBQhuZXdPcmRBbQMJAGYCAAAJAGUCBQN3aG0FBmFtRGlmZgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBBQZhbURpZmYCGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFA3dobQIKIGF2YWlsYWJsZQkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFA3dobQUGYW1EaWZmCQBkAggFA2FjYwJfMwUGYW1EaWZmCAUDYWNjAl80AwkAZgIAAAkAZAIFA3dobQUIbmV3T3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAJAKQDAQkBAS0BBQhuZXdPcmRBbQIaIGZyb20gd2FyZWhvdXNlLCBidXQgb25seSAJAKQDAQUDd2htAgogYXZhaWxhYmxlCQCWCgQJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUDd2htBQhuZXdPcmRBbQkAZQIJAGUCCAUDYWNjAl8zBQhuZXdPcmRBbQUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QEAW0KAAIkbAUIbWF0UGFydHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAUDbmlsCAUBcgJfMwgFAXICXzQKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBG9yZE0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYKAQRvcmRQAgNhY2MEaXRlbQQBaggFA2FjYwJfMQQJaXRlbVBhcnRzCQC1CQIFBGl0ZW0CAUADCQECIT0CCQCQAwEFCWl0ZW1QYXJ0cwACCQACAQIuSW5jb3JyZWN0IG9yZGVyIGZvcm1hdCwgc2hvdWxkIGJlIGFtb3VudEBwcmljZQQIbmV3T3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlpdGVtUGFydHMAAAQIbmV3T3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlpdGVtUGFydHMAAQQJbmV3T3JkVXNkCQBrAwUIbmV3T3JkQW0FCG5ld09yZFByBQVNVUxUOAQDd2hwCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKY3VycldoUHJvZAUBagQLY3VyT3JkUGFydHMJALUJAgkAkQMCBQ5jdXJyZW50T3JkUHJvZAUBagIBQAQIY3VyT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJPcmRQYXJ0cwAABAhjdXJPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ck9yZFBhcnRzAAEDCQBmAgAABQhjdXJPcmRQcgkAAgECF1ByaWNlIGNhbid0IGJlIG5lZ2F0aXZlBAljdXJPcmRVc2QJAGsDBQhjdXJPcmRBbQUIY3VyT3JkUHIFBU1VTFQ4AwkAAAIFCG5ld09yZEFtAAADCQBmAgUIY3VyT3JkQW0AAAkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQUDd2hwCQBlAggFA2FjYwJfMwUIY3VyT3JkQW0JAGUCCAUDYWNjAl80BQljdXJPcmRVc2QJAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aHAFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUIY3VyT3JkQW0IBQNhY2MCXzQDCQBmAgUIbmV3T3JkQW0AAAMJAGYCAAAFCGN1ck9yZEFtBAZhbURpZmYJAGQCBQhuZXdPcmRBbQUIY3VyT3JkQW0JAJYKBAkAZAIFAWoAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCBQN3aHAFCGN1ck9yZEFtCQBkAggFA2FjYwJfMwUGYW1EaWZmCQBkAggFA2FjYwJfNAUJbmV3T3JkVXNkCQCWCgQJAGQCBQFqAAEJAM0IAggFA2FjYwJfMgkApAMBBQN3aHAJAGUCCQBkAggFA2FjYwJfMwUIbmV3T3JkQW0FCGN1ck9yZEFtCQBlAgkAZAIIBQNhY2MCXzQFCW5ld09yZFVzZAUJY3VyT3JkVXNkAwkAZgIAAAUIY3VyT3JkQW0EBmFtRGlmZgkAZQIFCGN1ck9yZEFtBQhuZXdPcmRBbQMJAGYCAAAJAGUCBQN3aHAFBmFtRGlmZgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBBQZhbURpZmYCGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFA3docAIKIGF2YWlsYWJsZQkAlgoECQBkAgUBagABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZQIFA3docAUGYW1EaWZmCQBkAggFA2FjYwJfMwUGYW1EaWZmCAUDYWNjAl8zAwkAZgIAAAkAZAIFA3docAUIbmV3T3JkQW0JAAIBCQCsAgIJAKwCAgkArAIC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AQISTm8gcGF5bWVudHMgbmVlZGVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBm9yZEtleQUMY2FyZ29MaXN0U3RyBQNuaWwDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhJObyBwYXltZW50cyBuZWVkZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUEdXNlcgkBAS0BBQh1c2RTYWxkbwULdXNkbkFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUGb3JkS2V5BQxjYXJnb0xpc3RTdHIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRhY2NlcHRXYXJlaG91c2VPcmRlcgMKYnBPcmRlclN0cgtsYW5kQXNzZXRJZAtkdWNrQXNzZXRJZAQGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIECmNhbGxlckFkZHIJAKUIAQUGY2FsbGVyBBFzdGFrZWREdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUKY2FsbGVyQWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5RHVja0xvY2F0aW9uAQURc3Rha2VkRHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgQDbG9jCQC1CQIJAQV2YWx1ZQEFC2N1ckxvY2F0aW9uAgFfAwkBAiE9AgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUwJAAIBCQCsAgIJAKwCAgIWRHVjayBsb2NhdGlvbiB0eXBlIGlzIAkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCESwgYnV0IHNob3VsZCBiZSBMAwkBAiE9AgURc3Rha2VkRHVja0Fzc2V0SWQFC2R1Y2tBc3NldElkCQACAQkArAICCQCsAgIJAKwCAgIUWW91ciBzdGFrZWQgZHVjayBpcyAFEXN0YWtlZER1Y2tBc3NldElkAg0sIGJ1dCBwYXNzZWQgBQtkdWNrQXNzZXRJZAQJbGFuZEFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICAgRORlQgCAUJbGFuZEFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAlsYW5kT3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQlsYW5kQXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkAAAIFCWxhbmRPd25lcgUKY2FsbGVyQWRkcgkAAgECHllvdSBjYW5ub3QgdHJhZGUgd2l0aCB5b3Vyc2VsZgQMYnBPcmRlclBhcnRzCQC8CQIFCmJwT3JkZXJTdHICAToDCQECIT0CCQCQAwEFDGJwT3JkZXJQYXJ0cwADCQACAQIyYnBPcmRlclN0ciBzaG91bGQgY29udGFpbiBleGFjdGx5IDIgJzonIHNlcGFyYXRvcnMECGJwT3JkUmVzCQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAACAV8ECGJwT3JkTWF0CQC1CQIJAJEDAgUMYnBPcmRlclBhcnRzAAECAV8ECWJwT3JkUHJvZAMJAAACCQCRAwIFDGJwT3JkZXJQYXJ0cwACAgAFA25pbAkAtQkCCQCRAwIFDGJwT3JkZXJQYXJ0cwACAgFfAwkBAiE9AgkAkAMBBQhicE9yZFJlcwUGTlVNUkVTCQACAQIgQWxsIDYgcmVzb3VyY2VzIHNob3VsZCBiZSBwYXNzZWQDCQECIT0CCQCQAwEFCGJwT3JkTWF0BQZOVU1SRVMJAAIBAiBBbGwgNiBtYXRlcmlhbHMgc2hvdWxkIGJlIHBhc3NlZAQCd2gJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhRnZXRXYXJlaG91c2VSRUFET05MWQkAzAgCBQtsYW5kQXNzZXRJZAUDbmlsBQNuaWwECWN1cnJlbnRXaAkAvAkCBQJ3aAIBOgQJY3VycldoUmVzCQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQJY3VycldoTWF0CQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwQKY3VycldoUHJvZAMJAAACCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgAFA25pbAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kAgFfBAxjdXJyV2hSZXNWb2wJARlnZXRXYXJlaG91c2VDdXJyUmVzVm9sdW1lAQUJY3VycmVudFdoBAxjdXJyV2hNYXRWb2wJARlnZXRXYXJlaG91c2VDdXJyTWF0Vm9sdW1lAQUJY3VycmVudFdoBA5jdXJyV2hHb29kc1ZvbAkBG2dldFdhcmVob3VzZUN1cnJHb29kc1ZvbHVtZQEFCWN1cnJlbnRXaAQPY3VycldoTG9ja2VkVm9sCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJY3VycmVudFdoBQ53aElkeExvY2tlZFZvbAQLd2hTcGFjZUxlZnQJAGUCCQBlAgkAZQIJAGUCCQESZ2V0V2FyZWhvdXNlVm9sdW1lAQkAkQMCBQljdXJyZW50V2gFCHdoSWR4Vm9sBQxjdXJyV2hSZXNWb2wFDGN1cnJXaE1hdFZvbAUOY3VycldoR29vZHNWb2wFD2N1cnJXaExvY2tlZFZvbAQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkECWJwUmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQJYnBNYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBApicFByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfBAZvcmRLZXkJAQ5rZXlPcmRlckJ5TGFuZAEFC2xhbmRBc3NldElkBAV3aE9yZAkBCGdldE9yZGVyAQUGb3JkS2V5BAh3aE9yZFJlcwkAtQkCCQCRAwIFBXdoT3JkBQlvcmRJZHhSZXMCAV8ECHdoT3JkTWF0CQC1CQIJAJEDAgUFd2hPcmQFCW9yZElkeE1hdAIBXwQJd2hPcmRQcm9kAwkAAAIJAJEDAgUFd2hPcmQFCm9yZElkeFByb2QCAAUDbmlsCQC1CQIJAJEDAgUFd2hPcmQFCm9yZElkeFByb2QCAV8EDXVzZG5OZWVkMkxvY2sAAAoBBG9yZFICA2FjYwFqBA1icE9yZFJlc1BhcnRzCQC1CQIJAJEDAgUIYnBPcmRSZXMFAWoCAUADCQECIT0CCQCQAwEFDWJwT3JkUmVzUGFydHMAAgkAAgECLkluY29ycmVjdCBvcmRlciBmb3JtYXQsIHNob3VsZCBiZSBhbW91bnRAcHJpY2UEB2JwT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ1icE9yZFJlc1BhcnRzAAAEB2JwT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ1icE9yZFJlc1BhcnRzAAEDCQBmAgAABQdicE9yZFByCQACAQIXUHJpY2UgY2FuJ3QgYmUgbmVnYXRpdmUECGJwT3JkVXNkCQBrAwUHYnBPcmRBbQUHYnBPcmRQcgUFTVVMVDgEA2JwcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWJwUmVzTGlzdAUBagQDd2hyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJY3VycldoUmVzBQFqBAp3aE9yZFBhcnRzCQC1CQIJAJEDAgUId2hPcmRSZXMFAWoCAUAEB3doT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAAEB3doT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAEDCQECIT0CBQdicE9yZFByBQd3aE9yZFByCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICClByaWNlcyBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCFyBkb24ndCBtYXRjaCEgV0ggcHJpY2U9CQCkAwEFB3doT3JkUHICDSwgeW91ciBwcmljZT0JAKQDAQUHYnBPcmRQcgQId2hPcmRVc2QJAGsDBQd3aE9yZEFtBQd3aE9yZFByBQVNVUxUOAMJAAACBQdicE9yZEFtAAAJAJgKBgkAzQgCCAUDYWNjAl8xCQCRAwIFCWN1cnJXaFJlcwUBagkAzQgCCAUDYWNjAl8yCQCRAwIFCHdoT3JkUmVzBQFqCQDNCAIIBQNhY2MCXzMJAJEDAgUJYnBSZXNMaXN0BQFqCAUDYWNjAl80CAUDYWNjAl81CAUDYWNjAl82AwkAZgIFB2JwT3JkQW0AAAMJAGYCAAAFB3doT3JkQW0DCQBmAgUHYnBPcmRBbQkBAS0BBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0F0dGVtcHQgdG8gYnV5IAkApAMBBQdicE9yZEFtAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhssIGJ1dCB3YXJlaG91c2Ugb25seSBzZWxscyAJAKQDAQkBAS0BBQd3aE9yZEFtCQCYCgYJAM0IAggFA2FjYwJfMQkAkQMCBQljdXJyV2hSZXMFAWoJAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQNicHIFB2JwT3JkQW0JAGQCCAUDYWNjAl80BQdicE9yZEFtCAUDYWNjAl81CQBkAggFA2FjYwJfNgUIYnBPcmRVc2QJAAIBCQCsAgIJAKwCAgIPQXR0ZW1wdCB0byBidXkgCQCRAwIFCHJlc1R5cGVzBQFqAiAgd2hpbGUgd2FyZWhvdXNlIGRvZXNuJ3Qgc2VsbCBpdAMJAGYCBQd3aE9yZEFtAAADCQBmAgkBAS0BBQdicE9yZEFtBQd3aE9yZEFtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQFqAhosIGJ1dCB3YXJlaG91c2Ugb25seSBidXlzIAkApAMBBQd3aE9yZEFtAwkAZgIJAQEtAQUHYnBPcmRBbQUDYnByCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAKQDAQkBAS0BBQdicE9yZEFtAhQsIGJ1dCB5b3Ugb25seSBoYXZlIAkAkQMCBQlicFJlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoJAJgKBgkAzQgCCAUDYWNjAl8xCQCkAwEJAGUCBQN3aHIFB2JwT3JkQW0JAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zAgEwCQBlAggFA2FjYwJfNAUHYnBPcmRBbQkAZQIIBQNhY2MCXzUFCGJwT3JkVXNkCAUDYWNjAl82CQACAQkArAICCQCsAgICEEF0dGVtcHQgdG8gc2VsbCAJAJEDAgUIcmVzVHlwZXMFAWoCHyB3aGlsZSB3YXJlaG91c2UgZG9lc24ndCBidXkgaXQEAXIKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAmAoGBQNuaWwFA25pbAUDbmlsAAAAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRvcmRSAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGCgEEb3JkTQIDYWNjAWoEDWJwT3JkTWF0UGFydHMJALUJAgkAkQMCBQhicE9yZE1hdAUBagIBQAMJAQIhPQIJAJADAQUNYnBPcmRNYXRQYXJ0cwACCQACAQIuSW5jb3JyZWN0IG9yZGVyIGZvcm1hdCwgc2hvdWxkIGJlIGFtb3VudEBwcmljZQQHYnBPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWJwT3JkTWF0UGFydHMAAAQHYnBPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWJwT3JkTWF0UGFydHMAAQMJAGYCAAAFB2JwT3JkUHIJAAIBAhdQcmljZSBjYW4ndCBiZSBuZWdhdGl2ZQQIYnBPcmRVc2QJAGsDBQdicE9yZEFtBQdicE9yZFByBQVNVUxUOAQDYnByCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJYnBNYXRMaXN0BQFqBAN3aHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQljdXJyV2hNYXQFAWoECndoT3JkUGFydHMJALUJAgkAkQMCBQh3aE9yZE1hdAUBagIBQAQHd2hPcmRBbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCndoT3JkUGFydHMAAAQHd2hPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCndoT3JkUGFydHMAAQMJAQIhPQIFB2JwT3JkUHIFB3doT3JkUHIJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIKUHJpY2VzIG9mIAkAkQMCBQhtYXRUeXBlcwUBagIXIGRvbid0IG1hdGNoISBXSCBwcmljZT0JAKQDAQUHd2hPcmRQcgINLCB5b3VyIHByaWNlPQkApAMBBQdicE9yZFByBAh3aE9yZFVzZAkAawMFB3doT3JkQW0FB3doT3JkUHIFBU1VTFQ4AwkAAAIFB2JwT3JkQW0AAAkAmAoGCQDNCAIIBQNhY2MCXzEJAJEDAgUJY3VycldoTWF0BQFqCQDNCAIIBQNhY2MCXzIJAJEDAgUId2hPcmRNYXQFAWoJAM0IAggFA2FjYwJfMwkAkQMCBQlicE1hdExpc3QFAWoIBQNhY2MCXzQIBQNhY2MCXzUIBQNhY2MCXzYDCQBmAgUHYnBPcmRBbQAAAwkAZgIAAAUHd2hPcmRBbQMJAGYCBQdicE9yZEFtCQEBLQEFB3doT3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQXR0ZW1wdCB0byBidXkgCQCkAwEFB2JwT3JkQW0CBCBvZiAJAJEDAgUIbWF0VHlwZXMFAWoCGywgYnV0IHdhcmVob3VzZSBvbmx5IHNlbGxzIAkApAMBCQEBLQEFB3doT3JkQW0JAJgKBgkAzQgCCAUDYWNjAl8xCQCRAwIFCWN1cnJXaE1hdAUBagkAzQgCCAUDYWNjAl8yCQCsAgIJAKwCAgkApAMBCQBkAgUHd2hPcmRBbQUHYnBPcmRBbQIBQAkApAMBBQd3aE9yZFByCQDNCAIIBQNhY2MCXzMJAKQDAQkAZAIFA2JwcgUHYnBPcmRBbQkAZAIIBQNhY2MCXzQFB2JwT3JkQW0IBQNhY2MCXzUJAGQCCAUDYWNjAl82BQhicE9yZFVzZAkAAgEJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAJEDAgUIbWF0VHlwZXMFAWoCICB3aGlsZSB3YXJlaG91c2UgZG9lc24ndCBzZWxsIGl0AwkAZgIFB3doT3JkQW0AAAMJAGYCCQEBLQEFB2JwT3JkQW0FB3doT3JkQW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkApAMBCQEBLQEFB2JwT3JkQW0CBCBvZiAJAJEDAgUIbWF0VHlwZXMFAWoCGiwgYnV0IHdhcmVob3VzZSBvbmx5IGJ1eXMgCQCkAwEFB3doT3JkQW0DCQBmAgkBAS0BBQdicE9yZEFtBQNicHIJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkApAMBCQEBLQEFB2JwT3JkQW0CFCwgYnV0IHlvdSBvbmx5IGhhdmUgCQCRAwIFCWJwTWF0TGlzdAUBagIEIG9mIAkAkQMCBQhtYXRUeXBlcwUBagkAmAoGCQDNCAIIBQNhY2MCXzEJAKQDAQkAZQIFA3docgUHYnBPcmRBbQkAzQgCCAUDYWNjAl8yCQCsAgIJAKwCAgkApAMBCQBkAgUHd2hPcmRBbQUHYnBPcmRBbQIBQAkApAMBBQd3aE9yZFByCQDNCAIIBQNhY2MCXzMCATAJAGUCCAUDYWNjAl80BQdicE9yZEFtCQBlAggFA2FjYwJfNQUIYnBPcmRVc2QIBQNhY2MCXzYJAAIBCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkAkQMCBQhtYXRUeXBlcwUBagIfIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IGJ1eSBpdAQBbQoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCYCgYFA25pbAUDbmlsBQNuaWwIBQFyAl80CAUBcgJfNQgFAXICXzYKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBG9yZE0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYKAQRvcmRQAgNhY2MBagQOYnBPcmRQcm9kUGFydHMJALUJAgkAkQMCBQlicE9yZFByb2QFAWoCAUADCQECIT0CCQCQAwEFDmJwT3JkUHJvZFBhcnRzAAIJAAIBAi5JbmNvcnJlY3Qgb3JkZXIgZm9ybWF0LCBzaG91bGQgYmUgYW1vdW50QHByaWNlBAdicE9yZEFtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOYnBPcmRQcm9kUGFydHMAAAQHYnBPcmRQcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmJwT3JkUHJvZFBhcnRzAAEDCQBmAgAABQdicE9yZFByCQACAQIXUHJpY2UgY2FuJ3QgYmUgbmVnYXRpdmUECGJwT3JkVXNkCQBrAwUHYnBPcmRBbQUHYnBPcmRQcgUFTVVMVDgEA2JwcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJwUHJvZExpc3QFAWoEA3docgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmN1cnJXaFByb2QFAWoECndoT3JkUGFydHMJALUJAgkAkQMCBQl3aE9yZFByb2QFAWoCAUAEB3doT3JkQW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAAEB3doT3JkUHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQp3aE9yZFBhcnRzAAEDCQECIT0CBQdicE9yZFByBQd3aE9yZFByCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICClByaWNlcyBvZiAJAJEDAgUJcHJvZFR5cGVzBQFqAhcgZG9uJ3QgbWF0Y2ghIFdIIHByaWNlPQkApAMBBQd3aE9yZFByAg0sIHlvdXIgcHJpY2U9CQCkAwEFB2JwT3JkUHIECHdoT3JkVXNkCQBrAwUHd2hPcmRBbQUHd2hPcmRQcgUFTVVMVDgDCQAAAgUHYnBPcmRBbQAACQCYCgYJAM0IAggFA2FjYwJfMQkAkQMCBQpjdXJyV2hQcm9kBQFqCQDNCAIIBQNhY2MCXzIJAJEDAgUJd2hPcmRQcm9kBQFqCQDNCAIIBQNhY2MCXzMJAJEDAgUKYnBQcm9kTGlzdAUBaggFA2FjYwJfNAgFA2FjYwJfNQgFA2FjYwJfNgMJAGYCBQdicE9yZEFtAAADCQBmAgAABQd3aE9yZEFtAwkAZgIFB2JwT3JkQW0JAQEtAQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg9BdHRlbXB0IHRvIGJ1eSAJAKQDAQUHYnBPcmRBbQIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFAWoCGywgYnV0IHdhcmVob3VzZSBvbmx5IHNlbGxzIAkApAMBCQEBLQEFB3doT3JkQW0JAJgKBgkAzQgCCAUDYWNjAl8xCQCRAwIFCmN1cnJXaFByb2QFAWoJAM0IAggFA2FjYwJfMgkArAICCQCsAgIJAKQDAQkAZAIFB3doT3JkQW0FB2JwT3JkQW0CAUAJAKQDAQUHd2hPcmRQcgkAzQgCCAUDYWNjAl8zCQCkAwEJAGQCBQNicHIFB2JwT3JkQW0JAGQCCAUDYWNjAl80BQdicE9yZEFtCAUDYWNjAl81CQBkAggFA2FjYwJfNgUIYnBPcmRVc2QJAAIBCQCsAgIJAKwCAgIPQXR0ZW1wdCB0byBidXkgCQCRAwIFCXByb2RUeXBlcwUBagIgIHdoaWxlIHdhcmVob3VzZSBkb2Vzbid0IHNlbGwgaXQDCQBmAgUHd2hPcmRBbQAAAwkAZgIJAQEtAQUHYnBPcmRBbQUHd2hPcmRBbQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHNlbGwgCQCkAwEJAQEtAQUHYnBPcmRBbQIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFAWoCGiwgYnV0IHdhcmVob3VzZSBvbmx5IGJ1eXMgCQCkAwEFB3doT3JkQW0DCQBmAgkBAS0BBQdicE9yZEFtBQNicHIJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byBzZWxsIAkApAMBCQEBLQEFB2JwT3JkQW0CFCwgYnV0IHlvdSBvbmx5IGhhdmUgCQCRAwIFCmJwUHJvZExpc3QFAWoCBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQFqCQCYCgYJAM0I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VHJhbnNmZXIDBQZjYWxsZXIJAGUCCAUBcAJfNQULdXNkV2gyQnBGZWUFC3VzZG5Bc3NldElkBQdhY3Rpb25zBAt1c2RCcDJXaEZlZQkAawMIBQFwAl82BQpBVUNUSU9ORkVFBQVNVUxUNgQNdXNkQnAyV2hTYWxkbwgFAXACXzYDCQBmAgUNdXNkQnAyV2hTYWxkbwAAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2RuQXNzZXRJZAkAAgECE1VTRE4gcGF5bWVudHMgb25seSEDCQECIT0CBQNhbXQFDXVzZEJwMldoU2FsZG8JAAIBCQCsAgICElBheW1lbnQgbmVlZGVkIGlzIAkApAMBBQ11c2RCcDJXaFNhbGRvCQDNCAIFCGFjdGlvbnMxCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlsYW5kT3duZXIJAGUCCAUBcAJfNgULdXNkQnAyV2hGZWUFC3VzZG5Bc3NldElkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQISTm8gcGF5bWVudHMgbmVlZGVkBQhhY3Rpb25zMQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgBici/g", "height": 2519735, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5mVjATuTepdb2fK1y43A8WMVy8WQp5MQvCGoSMjjt1Jo Next: EvF1KUv7Nuwf1uCKFpFtaARnebs1qPPP3iuPt38J29ne Diff:
OldNewDifferences
947947 let whOrdAm = parseIntValue(whOrdParts[0])
948948 let whOrdPr = parseIntValue(whOrdParts[1])
949949 if ((bpOrdPr != whOrdPr))
950- then throw((("Prices of " + resTypes[j]) + " don't match"))
950+ then throw(((((("Prices of " + resTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
951951 else {
952952 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
953953 if ((bpOrdAm == 0))
10011001 let whOrdAm = parseIntValue(whOrdParts[0])
10021002 let whOrdPr = parseIntValue(whOrdParts[1])
10031003 if ((bpOrdPr != whOrdPr))
1004- then throw((("Prices of " + matTypes[j]) + " don't match"))
1004+ then throw(((((("Prices of " + matTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
10051005 else {
10061006 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
10071007 if ((bpOrdAm == 0))
10551055 let whOrdAm = parseIntValue(whOrdParts[0])
10561056 let whOrdPr = parseIntValue(whOrdParts[1])
10571057 if ((bpOrdPr != whOrdPr))
1058- then throw((("Prices of " + prodTypes[j]) + " don't match"))
1058+ then throw(((((("Prices of " + prodTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
10591059 else {
10601060 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
10611061 if ((bpOrdAm == 0))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT8 = 100000000
99
1010 let MULT10 = 10000000000
1111
1212 let chain = take(drop(this.bytes, 1), 1)
1313
1414 let usdnAssetId = match chain {
1515 case _ =>
1616 if ((base58'2W' == $match0))
1717 then base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1818 else if ((base58'2T' == $match0))
1919 then base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
2020 else throw("Unknown chain")
2121 }
2222
2323 let defaultRestAddressStr = match chain {
2424 case _ =>
2525 if ((base58'2W' == $match0))
2626 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
2727 else if ((base58'2T' == $match0))
2828 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
2929 else throw("Unknown chain")
3030 }
3131
3232 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
3333
3434
3535 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
3636
3737
3838 let IdxCfgStakingDapp = 1
3939
4040 let IdxCfgEconomyDapp = 2
4141
4242 let IdxCfgGovernanceDapp = 3
4343
4444 func keyRestCfg () = "%s__restConfig"
4545
4646
4747 func keyRestAddress () = "%s__restAddr"
4848
4949
5050 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
5151
5252
5353 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
5454
5555
5656 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
5757
5858 let restCfg = readRestCfgOrFail(restContract)
5959
6060 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
6161
6262 let DEFAULTLOCATION = "Africa_F_Africa"
6363
6464 let NUMRES = 6
6565
6666 let FACTORYMAXWAREHOUSE = 10000000000
6767
6868 let RESOURCEPRICEMIN = 158549
6969
7070 let MINPAYMENT = 10000
7171
7272 let SELLMULTIPLIER = 200
7373
7474 let BUYMULTIPLIER = 300
7575
7676 let LANDPREFIX = "LAND"
7777
7878 let DUCKPREFIX = "DUCK"
7979
8080 let WHMULTIPLIER = 10000000000
8181
8282 let AUCTIONFEE = 10000
8383
8484 let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
8585
8686 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
8787
8888 let prodTypes = ["First Aid Kit", "Backpack", "Food Ration", "Jet Pack", "Radar"]
8989
9090 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
9191
9292 let productionMatrix = ["1_1_1_2_2_5_1_10", "2_5_5_2_7_5_2_100", "1_1_1_2_2_5_1_10", "9_9_1_5_5_1_5_100", "1_5_1_5_5_1_1_100"]
9393
9494 let contIdxAmericas = 0
9595
9696 let contIdxEurope = 1
9797
9898 let contIdxAsia = 2
9999
100100 let contIdxAfrica = 3
101101
102102 let contIdxOceania = 4
103103
104104 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
105105
106106
107107 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
108108
109109
110110 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
111111
112112
113113 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
114114
115115
116116 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
117117
118118
119119 func keyBlocked () = "contractsBlocked"
120120
121121
122122 func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
123123
124124
125125 func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
126126
127127
128128 let locIdxContinent = 0
129129
130130 let locIdxType = 1
131131
132132 let locIdxId = 2
133133
134134 let bpIdxLevel = 0
135135
136136 let bpIdxRes = 1
137137
138138 let bpIdxMat = 2
139139
140140 let bpIdxProd = 3
141141
142142 let whIdxVol = 0
143143
144144 let whIdxRes = 1
145145
146146 let whIdxMat = 2
147147
148148 let whIdxProd = 3
149149
150150 let whIdxLockedVol = 4
151151
152152 let ordIdxRes = 0
153153
154154 let ordIdxMat = 1
155155
156156 let ordIdxProd = 2
157157
158158 func asString (v) = match v {
159159 case s: String =>
160160 s
161161 case _ =>
162162 throw("fail to cast into String")
163163 }
164164
165165
166166 func getOrder (ordKey) = {
167167 let p = split(valueOrElse(getString(ordKey), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"), ":")
168168 [if ((size(split(p[ordIdxRes], "_")) == NUMRES))
169169 then p[ordIdxRes]
170170 else "0@0_0@0_0@0_0@0_0@0_0@0", if ((size(split(p[ordIdxMat], "_")) == NUMRES))
171171 then p[ordIdxMat]
172172 else "0@0_0@0_0@0_0@0_0@0_0@0", p[ordIdxProd]]
173173 }
174174
175175
176176 func getWarehouseVolume (volPrefix) = {
177177 let parts = split(volPrefix, "_")
178178 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
179179 }
180180
181181
182182 func getWarehouseCurrResVolume (currentWh) = {
183183 func sum (acc,item) = (acc + parseIntValue(item))
184184
185185 let $l = split(currentWh[whIdxRes], "_")
186186 let $s = size($l)
187187 let $acc0 = 0
188188 func $f0_1 ($a,$i) = if (($i >= $s))
189189 then $a
190190 else sum($a, $l[$i])
191191
192192 func $f0_2 ($a,$i) = if (($i >= $s))
193193 then $a
194194 else throw("List size exceeds 6")
195195
196196 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
197197 }
198198
199199
200200 func getWarehouseCurrMatVolume (currentWh) = {
201201 func sum (acc,item) = (acc + parseIntValue(item))
202202
203203 let $l = split(currentWh[whIdxMat], "_")
204204 let $s = size($l)
205205 let $acc0 = 0
206206 func $f0_1 ($a,$i) = if (($i >= $s))
207207 then $a
208208 else sum($a, $l[$i])
209209
210210 func $f0_2 ($a,$i) = if (($i >= $s))
211211 then $a
212212 else throw("List size exceeds 6")
213213
214214 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
215215 }
216216
217217
218218 func getWarehouseCurrGoodsVolume (currentWh) = {
219219 let goods = currentWh[whIdxProd]
220220 if ((goods == ""))
221221 then 0
222222 else {
223223 func sum (acc,item) = (acc + parseIntValue(item))
224224
225225 let $l = split_4C(goods, "_")
226226 let $s = size($l)
227227 let $acc0 = 0
228228 func $f0_1 ($a,$i) = if (($i >= $s))
229229 then $a
230230 else sum($a, $l[$i])
231231
232232 func $f0_2 ($a,$i) = if (($i >= $s))
233233 then $a
234234 else throw("List size exceeds 50")
235235
236236 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
237237 }
238238 }
239239
240240
241241 func sellInternal (locId,resType,amount,minPrice) = {
242242 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
243243 let w0 = valueOrElse(getInteger(whKey), 0)
244244 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
245245 then 0
246246 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
247247 then (FACTORYMAXWAREHOUSE - w0)
248248 else amount
249249 let usdnReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
250250 let min99 = (minPrice - (minPrice / 100))
251251 if (((min99 * amount) > (usdnReceived * MULT8)))
252252 then throw((((((((((("Actual price = " + toString(usdnReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
253253 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdnReceived)
254254 }
255255
256256
257257 func buyInternal (locId,matType,amount,maxPrice) = {
258258 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
259259 let w0 = valueOrElse(getInteger(whKey), 0)
260260 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
261261 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
262262 else 0
263263 let m0 = min([w0, (amount - m1)])
264264 let m = (m0 + m1)
265265 let usdnSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
266266 let max101 = (maxPrice + (maxPrice / 100))
267267 if (((usdnSpent * MULT8) > (max101 * m)))
268268 then throw((((((((((("Actual price = " + toString(usdnSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
269269 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdnSpent, m)
270270 }
271271
272272
273273 func getBackpack (bpKey) = {
274274 let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
275275 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
276276 then p[bpIdxRes]
277277 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
278278 then p[bpIdxMat]
279279 else "0_0_0_0_0_0", p[bpIdxProd]]
280280 }
281281
282282
283283 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
284284 then throw("Contracts are under maintenance")
285285 else unit
286286
287287
288288 @Callable(i)
289289 func constructorV1 (restAddr) = if ((i.caller != this))
290290 then throw("Permission denied")
291291 else [StringEntry(keyRestAddress(), restAddr)]
292292
293293
294294
295295 @Callable(i)
296296 func sellResources (amounts,minPrices) = {
297297 let blocked = checkBlocked()
298298 if ((blocked == blocked))
299299 then {
300300 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
301301 if ((size(i.payments) != 0))
302302 then throw("sellResources doesn't require any payments")
303303 else {
304304 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
305305 if ((curLocation[locIdxType] != "F"))
306306 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
307307 else {
308308 let locId = curLocation[locIdxId]
309309 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
310310 let resList = split(currentPack[bpIdxRes], "_")
311311 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
312312 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
313313 else if ((0 > amounts[j]))
314314 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
315315 else if ((amounts[j] > 0))
316316 then {
317317 let b = sellInternal(locId, j, amounts[j], minPrices[j])
318318 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
319319 }
320320 else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
321321
322322 let merged = {
323323 let $l = [0, 1, 2, 3, 4, 5]
324324 let $s = size($l)
325325 let $acc0 = $Tuple3(nil, nil, 0)
326326 func $f0_1 ($a,$i) = if (($i >= $s))
327327 then $a
328328 else adder($a, $l[$i])
329329
330330 func $f0_2 ($a,$i) = if (($i >= $s))
331331 then $a
332332 else throw("List size exceeds 6")
333333
334334 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
335335 }
336336 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
337337 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
338338 $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdnAssetId)), result)
339339 }
340340 }
341341 }
342342 else throw("Strict value is not equal to itself.")
343343 }
344344
345345
346346
347347 @Callable(i)
348348 func buyMaterials (amounts,maxPrices) = {
349349 let blocked = checkBlocked()
350350 if ((blocked == blocked))
351351 then {
352352 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
353353 if ((size(i.payments) != 1))
354354 then throw("exactly 1 payment must be attached")
355355 else {
356356 let pmt = i.payments[0]
357357 let amt = pmt.amount
358358 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
359359 if ((pmtAssetId != usdnAssetId))
360360 then throw("USDN payments only!")
361361 else {
362362 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
363363 if ((curLocation[locIdxType] != "F"))
364364 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
365365 else {
366366 let locId = curLocation[locIdxId]
367367 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
368368 let matList = split(currentPack[bpIdxMat], "_")
369369 func mUpdater (acc,j) = if ((0 > amounts[j]))
370370 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
371371 else if ((amounts[j] > 0))
372372 then {
373373 let b = buyInternal(locId, j, amounts[j], maxPrices[j])
374374 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
375375 }
376376 else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
377377
378378 let merged = {
379379 let $l = [0, 1, 2, 3, 4, 5]
380380 let $s = size($l)
381381 let $acc0 = $Tuple3(nil, nil, 0)
382382 func $f0_1 ($a,$i) = if (($i >= $s))
383383 then $a
384384 else mUpdater($a, $l[$i])
385385
386386 func $f0_2 ($a,$i) = if (($i >= $s))
387387 then $a
388388 else throw("List size exceeds 6")
389389
390390 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
391391 }
392392 if ((merged._3 > amt))
393393 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
394394 else {
395395 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
396396 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
397397 let rest = if (((amt - merged._3) > 0))
398398 then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
399399 else nil
400400 $Tuple2((merged._1 ++ rest), result)
401401 }
402402 }
403403 }
404404 }
405405 }
406406 else throw("Strict value is not equal to itself.")
407407 }
408408
409409
410410
411411 @Callable(i)
412412 func exchangeResources (amounts) = {
413413 let blocked = checkBlocked()
414414 if ((blocked == blocked))
415415 then {
416416 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
417417 if ((size(i.payments) != 1))
418418 then throw("exactly 1 payment must be attached")
419419 else {
420420 let pmt = i.payments[0]
421421 let amt = pmt.amount
422422 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
423423 if ((pmtAssetId != usdnAssetId))
424424 then throw("USDN payments only!")
425425 else {
426426 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
427427 if ((curLocation[locIdxType] != "F"))
428428 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
429429 else {
430430 let locId = curLocation[locIdxId]
431431 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
432432 let resList = split(currentPack[bpIdxRes], "_")
433433 let matList = split(currentPack[bpIdxMat], "_")
434434 func exchanger (acc,j) = {
435435 let whKey = keyFactoryWarehouseByIdAndType(locId, j)
436436 let w0 = valueOrElse(getInteger(whKey), 0)
437437 let amj = amounts[j]
438438 if ((amj > parseIntValue(resList[j])))
439439 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to exchange ") + toString(amj)))
440440 else if ((0 > amj))
441441 then throw(((("You tried to exchange negative amount of " + resTypes[j]) + ": ") + toString(amj)))
442442 else if ((amj > 0))
443443 then $Tuple4((acc._1 :+ toString((parseIntValue(resList[j]) - amj))), (acc._2 :+ toString((parseIntValue(matList[j]) + amj))), (acc._3 + fraction(amj, RESOURCEPRICEMIN, MULT8)), (acc._4 :+ IntegerEntry(whKey, w0)))
444444 else $Tuple4((acc._1 :+ resList[j]), (acc._2 :+ matList[j]), acc._3, acc._4)
445445 }
446446
447447 let merged = {
448448 let $l = [0, 1, 2, 3, 4, 5]
449449 let $s = size($l)
450450 let $acc0 = $Tuple4(nil, nil, 0, nil)
451451 func $f0_1 ($a,$i) = if (($i >= $s))
452452 then $a
453453 else exchanger($a, $l[$i])
454454
455455 func $f0_2 ($a,$i) = if (($i >= $s))
456456 then $a
457457 else throw("List size exceeds 6")
458458
459459 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
460460 }
461461 if ((merged._3 > amt))
462462 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
463463 else {
464464 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._1, "_"), makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
465465 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
466466 let rest = if (((amt - merged._3) > 0))
467467 then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
468468 else nil
469469 $Tuple2((rest ++ merged._4), result)
470470 }
471471 }
472472 }
473473 }
474474 }
475475 else throw("Strict value is not equal to itself.")
476476 }
477477
478478
479479
480480 @Callable(i)
481481 func buyGoods (productIdx,level,quantity) = {
482482 let blocked = checkBlocked()
483483 if ((blocked == blocked))
484484 then if ((size(i.payments) != 0))
485485 then throw("buyGoods doesn't require any payments")
486486 else if ((0 > quantity))
487487 then throw("Quantity should be positive")
488488 else {
489489 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
490490 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
491491 if ((curLocation[locIdxType] != "M"))
492492 then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
493493 else {
494494 let cont = curLocation[locIdxContinent]
495495 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
496496 let matList = split(currentPack[bpIdxMat], "_")
497497 if (if ((0 > productIdx))
498498 then true
499499 else (productIdx >= size(productionMatrix)))
500500 then throw(("Unknown product idx=" + toString(productIdx)))
501501 else {
502502 let productContIdx = (productIdx % size(continents))
503503 if ((continents[productContIdx] != cont))
504504 then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
505505 else {
506506 let recipe = split(productionMatrix[productIdx], "_")
507507 if ((size(recipe) != (NUMRES + 2)))
508508 then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
509509 else {
510510 let prodList = if ((currentPack[bpIdxProd] == ""))
511511 then nil
512512 else split(currentPack[bpIdxProd], "_")
513513 func filler (acc,ignoredItem) = {
514514 let n = acc._2
515515 let x = if ((size(prodList) > n))
516516 then split(prodList[n], ",")
517517 else ["0", "0", "0"]
518518 let x1s = x[0]
519519 let x1 = parseIntValue(x1s)
520520 let x2s = x[1]
521521 let x2 = parseIntValue(x2s)
522522 let x3s = x[2]
523523 let x3 = parseIntValue(x3s)
524524 let amount = (quantity * parseIntValue(recipe[7]))
525525 let y = if ((n == productIdx))
526526 then match level {
527527 case _ =>
528528 if ((1 == $match0))
529529 then ((((toString((x1 + amount)) + ",") + x2s) + ",") + x3s)
530530 else if ((2 == $match0))
531531 then ((((x1s + ",") + toString((x2 + amount))) + ",") + x3s)
532532 else if ((3 == $match0))
533533 then ((((x1s + ",") + x2s) + ",") + toString((x3 + amount)))
534534 else throw(("Product level should be 1..3, not " + toString(level)))
535535 }
536536 else ((((x1s + ",") + x2s) + ",") + x3s)
537537 $Tuple2((acc._1 :+ y), (n + 1))
538538 }
539539
540540 let bpProd = ( let $l = productionMatrix
541541 let $s = size($l)
542542 let $acc0 = $Tuple2(nil, 0)
543543 func $f0_1 ($a,$i) = if (($i >= $s))
544544 then $a
545545 else filler($a, $l[$i])
546546
547547 func $f0_2 ($a,$i) = if (($i >= $s))
548548 then $a
549549 else throw("List size exceeds 50")
550550
551551 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._1
552552 func producer (acc,j) = {
553553 let needMat = (parseIntValue(recipe[j]) * quantity)
554554 let haveMat = parseIntValue(matList[j])
555555 if ((needMat > haveMat))
556556 then throw(((((((("You have " + matList[j]) + " of ") + matTypes[j]) + ", but recipe requires ") + toString(needMat)) + " for quantity ") + toString(quantity)))
557557 else if ((needMat > 0))
558558 then (acc :+ toString((haveMat - needMat)))
559559 else (acc :+ matList[j])
560560 }
561561
562562 let merged = {
563563 let $l = [0, 1, 2, 3, 4, 5]
564564 let $s = size($l)
565565 let $acc0 = nil
566566 func $f1_1 ($a,$i) = if (($i >= $s))
567567 then $a
568568 else producer($a, $l[$i])
569569
570570 func $f1_2 ($a,$i) = if (($i >= $s))
571571 then $a
572572 else throw("List size exceeds 6")
573573
574574 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
575575 }
576576 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged, "_"), makeString(bpProd, "_")], ":")
577577 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
578578 $Tuple2(nil, result)
579579 }
580580 }
581581 }
582582 }
583583 }
584584 else throw("Strict value is not equal to itself.")
585585 }
586586
587587
588588
589589 @Callable(i)
590590 func acceptServicePayment (service) = {
591591 let blocked = checkBlocked()
592592 if ((blocked == blocked))
593593 then if ((size(i.payments) != 1))
594594 then throw("exactly 1 payment must be attached")
595595 else {
596596 let pmt = i.payments[0]
597597 let amt = pmt.amount
598598 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
599599 if ((pmtAssetId != usdnAssetId))
600600 then throw("USDN payments only!")
601601 else {
602602 let need = match service {
603603 case _ =>
604604 if (("LAND_RENAME" == $match0))
605605 then 10000000
606606 else throw("Unknown service!")
607607 }
608608 if ((amt != need))
609609 then throw((((service + " costs ") + toString(need)) + " USDN"))
610610 else $Tuple2(nil, amt)
611611 }
612612 }
613613 else throw("Strict value is not equal to itself.")
614614 }
615615
616616
617617
618618 @Callable(i)
619619 func setWarehouseOrder (cargoListStr,landAssetId) = {
620620 let user = i.originCaller
621621 let addr = toString(user)
622622 let asset = value(assetInfo(fromBase58String(landAssetId)))
623623 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
624624 then throw((("NFT " + asset.name) + " is not staked"))
625625 else {
626626 let owner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
627627 if ((owner != addr))
628628 then throw((LANDPREFIX + " is not yours"))
629629 else {
630630 let cargoParts = split_4C(cargoListStr, ":")
631631 if ((size(cargoParts) != 3))
632632 then throw("cargoListStr should contain exactly 2 ':' separators")
633633 else {
634634 let resParts = split(cargoParts[0], "_")
635635 let matParts = split(cargoParts[1], "_")
636636 let prodParts = if ((cargoParts[2] == ""))
637637 then nil
638638 else split(cargoParts[2], "_")
639639 if ((size(resParts) != NUMRES))
640640 then throw("All 6 resources should be passed")
641641 else if ((size(matParts) != NUMRES))
642642 then throw("All 6 materials should be passed")
643643 else {
644644 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
645645 let currentWh = split_4C(wh, ":")
646646 let currWhRes = split(currentWh[whIdxRes], "_")
647647 let currWhMat = split(currentWh[whIdxMat], "_")
648648 let currWhProd = if ((currentWh[whIdxProd] == ""))
649649 then nil
650650 else split(currentWh[whIdxProd], "_")
651651 let currWhResVol = getWarehouseCurrResVolume(currentWh)
652652 let currWhMatVol = getWarehouseCurrMatVolume(currentWh)
653653 let currWhGoodsVol = getWarehouseCurrGoodsVolume(currentWh)
654654 let currWhLockedVol = parseIntValue(currentWh[whIdxLockedVol])
655655 let whSpaceLeft = ((((getWarehouseVolume(currentWh[whIdxVol]) - currWhResVol) - currWhMatVol) - currWhGoodsVol) - currWhLockedVol)
656656 let ordKey = keyOrderByLand(landAssetId)
657657 let currentOrd = getOrder(ordKey)
658658 let currentOrdRes = split(currentOrd[ordIdxRes], "_")
659659 let currentOrdMat = split(currentOrd[ordIdxMat], "_")
660660 let currentOrdProd = if ((currentOrd[ordIdxProd] == ""))
661661 then nil
662662 else split(currentOrd[ordIdxProd], "_")
663663 let usdnNeed2Lock = 0
664664 func ordR (acc,item) = {
665665 let j = acc._1
666666 let itemParts = split(item, "@")
667667 if ((size(itemParts) != 2))
668668 then throw("Incorrect order format, should be amount@price")
669669 else {
670670 let newOrdAm = parseIntValue(itemParts[0])
671671 let newOrdPr = parseIntValue(itemParts[1])
672672 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
673673 let whr = parseIntValue(currWhRes[j])
674674 let curOrdParts = split(currentOrdRes[j], "@")
675675 let curOrdAm = parseIntValue(curOrdParts[0])
676676 let curOrdPr = parseIntValue(curOrdParts[1])
677677 if ((0 > curOrdPr))
678678 then throw("Price can't be negative")
679679 else {
680680 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
681681 if ((newOrdAm == 0))
682682 then if ((curOrdAm > 0))
683683 then $Tuple4((j + 1), (acc._2 :+ toString(whr)), (acc._3 - curOrdAm), (acc._4 - curOrdUsd))
684684 else $Tuple4((j + 1), (acc._2 :+ toString((whr - curOrdAm))), (acc._3 + curOrdAm), acc._4)
685685 else if ((newOrdAm > 0))
686686 then if ((0 > curOrdAm))
687687 then {
688688 let amDiff = (newOrdAm + curOrdAm)
689689 $Tuple4((j + 1), (acc._2 :+ toString((whr - curOrdAm))), (acc._3 + amDiff), (acc._4 + newOrdUsd))
690690 }
691691 else $Tuple4((j + 1), (acc._2 :+ toString(whr)), ((acc._3 + newOrdAm) - curOrdAm), ((acc._4 + newOrdUsd) - curOrdUsd))
692692 else if ((0 > curOrdAm))
693693 then {
694694 let amDiff = (curOrdAm - newOrdAm)
695695 if ((0 > (whr - amDiff)))
696696 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whr)) + " available"))
697697 else $Tuple4((j + 1), (acc._2 :+ toString((whr - amDiff))), (acc._3 + amDiff), acc._4)
698698 }
699699 else if ((0 > (whr + newOrdAm)))
700700 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whr)) + " available"))
701701 else $Tuple4((j + 1), (acc._2 :+ toString((whr + newOrdAm))), ((acc._3 - newOrdAm) - curOrdAm), (acc._4 - curOrdUsd))
702702 }
703703 }
704704 }
705705
706706 let r = {
707707 let $l = resParts
708708 let $s = size($l)
709709 let $acc0 = $Tuple4(0, nil, 0, 0)
710710 func $f0_1 ($a,$i) = if (($i >= $s))
711711 then $a
712712 else ordR($a, $l[$i])
713713
714714 func $f0_2 ($a,$i) = if (($i >= $s))
715715 then $a
716716 else throw("List size exceeds 6")
717717
718718 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
719719 }
720720 func ordM (acc,item) = {
721721 let j = acc._1
722722 let itemParts = split(item, "@")
723723 if ((size(itemParts) != 2))
724724 then throw("Incorrect order format, should be amount@price")
725725 else {
726726 let newOrdAm = parseIntValue(itemParts[0])
727727 let newOrdPr = parseIntValue(itemParts[1])
728728 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
729729 let whm = parseIntValue(currWhMat[j])
730730 let curOrdParts = split(currentOrdMat[j], "@")
731731 let curOrdAm = parseIntValue(curOrdParts[0])
732732 let curOrdPr = parseIntValue(curOrdParts[1])
733733 if ((0 > curOrdPr))
734734 then throw("Price can't be negative")
735735 else {
736736 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
737737 if ((newOrdAm == 0))
738738 then if ((curOrdAm > 0))
739739 then $Tuple4((j + 1), (acc._2 :+ toString(whm)), (acc._3 - curOrdAm), (acc._4 - curOrdUsd))
740740 else $Tuple4((j + 1), (acc._2 :+ toString((whm - curOrdAm))), (acc._3 + curOrdAm), acc._4)
741741 else if ((newOrdAm > 0))
742742 then if ((0 > curOrdAm))
743743 then {
744744 let amDiff = (newOrdAm + curOrdAm)
745745 $Tuple4((j + 1), (acc._2 :+ toString((whm - curOrdAm))), (acc._3 + amDiff), (acc._4 + newOrdUsd))
746746 }
747747 else $Tuple4((j + 1), (acc._2 :+ toString(whm)), ((acc._3 + newOrdAm) - curOrdAm), ((acc._4 + newOrdUsd) - curOrdUsd))
748748 else if ((0 > curOrdAm))
749749 then {
750750 let amDiff = (curOrdAm - newOrdAm)
751751 if ((0 > (whm - amDiff)))
752752 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whm)) + " available"))
753753 else $Tuple4((j + 1), (acc._2 :+ toString((whm - amDiff))), (acc._3 + amDiff), acc._4)
754754 }
755755 else if ((0 > (whm + newOrdAm)))
756756 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whm)) + " available"))
757757 else $Tuple4((j + 1), (acc._2 :+ toString((whm + newOrdAm))), ((acc._3 - newOrdAm) - curOrdAm), (acc._4 - curOrdUsd))
758758 }
759759 }
760760 }
761761
762762 let m = {
763763 let $l = matParts
764764 let $s = size($l)
765765 let $acc0 = $Tuple4(0, nil, r._3, r._4)
766766 func $f1_1 ($a,$i) = if (($i >= $s))
767767 then $a
768768 else ordM($a, $l[$i])
769769
770770 func $f1_2 ($a,$i) = if (($i >= $s))
771771 then $a
772772 else throw("List size exceeds 6")
773773
774774 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
775775 }
776776 func ordP (acc,item) = {
777777 let j = acc._1
778778 let itemParts = split(item, "@")
779779 if ((size(itemParts) != 2))
780780 then throw("Incorrect order format, should be amount@price")
781781 else {
782782 let newOrdAm = parseIntValue(itemParts[0])
783783 let newOrdPr = parseIntValue(itemParts[1])
784784 let newOrdUsd = fraction(newOrdAm, newOrdPr, MULT8)
785785 let whp = parseIntValue(currWhProd[j])
786786 let curOrdParts = split(currentOrdProd[j], "@")
787787 let curOrdAm = parseIntValue(curOrdParts[0])
788788 let curOrdPr = parseIntValue(curOrdParts[1])
789789 if ((0 > curOrdPr))
790790 then throw("Price can't be negative")
791791 else {
792792 let curOrdUsd = fraction(curOrdAm, curOrdPr, MULT8)
793793 if ((newOrdAm == 0))
794794 then if ((curOrdAm > 0))
795795 then $Tuple4((j + 1), (acc._2 :+ toString(whp)), (acc._3 - curOrdAm), (acc._4 - curOrdUsd))
796796 else $Tuple4((j + 1), (acc._2 :+ toString((whp - curOrdAm))), (acc._3 + curOrdAm), acc._4)
797797 else if ((newOrdAm > 0))
798798 then if ((0 > curOrdAm))
799799 then {
800800 let amDiff = (newOrdAm + curOrdAm)
801801 $Tuple4((j + 1), (acc._2 :+ toString((whp - curOrdAm))), (acc._3 + amDiff), (acc._4 + newOrdUsd))
802802 }
803803 else $Tuple4((j + 1), (acc._2 :+ toString(whp)), ((acc._3 + newOrdAm) - curOrdAm), ((acc._4 + newOrdUsd) - curOrdUsd))
804804 else if ((0 > curOrdAm))
805805 then {
806806 let amDiff = (curOrdAm - newOrdAm)
807807 if ((0 > (whp - amDiff)))
808808 then throw((((("Attempt to take " + toString(amDiff)) + " from warehouse, but only ") + toString(whp)) + " available"))
809809 else $Tuple4((j + 1), (acc._2 :+ toString((whp - amDiff))), (acc._3 + amDiff), acc._3)
810810 }
811811 else if ((0 > (whp + newOrdAm)))
812812 then throw((((("Attempt to take " + toString(-(newOrdAm))) + " from warehouse, but only ") + toString(whp)) + " available"))
813813 else $Tuple4((j + 1), (acc._2 :+ toString((whp + newOrdAm))), ((acc._3 - newOrdAm) - curOrdAm), (acc._4 - curOrdUsd))
814814 }
815815 }
816816 }
817817
818818 let p = {
819819 let $l = prodParts
820820 let $s = size($l)
821821 let $acc0 = $Tuple4(0, nil, m._3, m._4)
822822 func $f2_1 ($a,$i) = if (($i >= $s))
823823 then $a
824824 else ordP($a, $l[$i])
825825
826826 func $f2_2 ($a,$i) = if (($i >= $s))
827827 then $a
828828 else throw("List size exceeds 50")
829829
830830 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
831831 }
832832 let volSaldo = p._3
833833 if ((volSaldo > whSpaceLeft))
834834 then throw((((("Attempt to reserve " + toString(volSaldo)) + " space, but only ") + toString(whSpaceLeft)) + " warehouse space left"))
835835 else {
836836 let whStr = makeString_2C([currentWh[whIdxVol], makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_"), toString(volSaldo)], ":")
837837 let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
838838 if ((whSave == whSave))
839839 then {
840840 let usdSaldo = p._4
841841 if ((usdSaldo > 0))
842842 then if ((size(i.payments) != 1))
843843 then throw("exactly 1 payment must be attached")
844844 else {
845845 let pmt = i.payments[0]
846846 let amt = pmt.amount
847847 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
848848 if ((pmtAssetId != usdnAssetId))
849849 then throw("USDN payments only!")
850850 else if ((amt != usdSaldo))
851851 then throw(("Payment needed is " + toString(usdSaldo)))
852852 else [StringEntry(ordKey, cargoListStr)]
853853 }
854854 else if ((usdSaldo == 0))
855855 then if ((size(i.payments) != 0))
856856 then throw("No payments needed")
857857 else [StringEntry(ordKey, cargoListStr)]
858858 else if ((size(i.payments) != 0))
859859 then throw("No payments needed")
860860 else [ScriptTransfer(user, -(usdSaldo), usdnAssetId), StringEntry(ordKey, cargoListStr)]
861861 }
862862 else throw("Strict value is not equal to itself.")
863863 }
864864 }
865865 }
866866 }
867867 }
868868 }
869869
870870
871871
872872 @Callable(i)
873873 func acceptWarehouseOrder (bpOrderStr,landAssetId,duckAssetId) = {
874874 let caller = i.originCaller
875875 let callerAddr = toString(caller)
876876 let stakedDuckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(callerAddr)), "You don't have a duck staked")
877877 let curLocation = valueOrElse(getString(stakingContract, keyDuckLocation(stakedDuckAssetId)), DEFAULTLOCATION)
878878 let loc = split(value(curLocation), "_")
879879 if ((loc[locIdxType] != "L"))
880880 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
881881 else if ((stakedDuckAssetId != duckAssetId))
882882 then throw(((("Your staked duck is " + stakedDuckAssetId) + ", but passed ") + duckAssetId))
883883 else {
884884 let landAsset = value(assetInfo(fromBase58String(landAssetId)))
885885 if (!(isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)))))
886886 then throw((("NFT " + landAsset.name) + " is not staked"))
887887 else {
888888 let landOwner = valueOrErrorMessage(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)), (("NFT " + landAsset.name) + " is orphaned"))
889889 if ((landOwner == callerAddr))
890890 then throw("You cannot trade with yourself")
891891 else {
892892 let bpOrderParts = split_4C(bpOrderStr, ":")
893893 if ((size(bpOrderParts) != 3))
894894 then throw("bpOrderStr should contain exactly 2 ':' separators")
895895 else {
896896 let bpOrdRes = split(bpOrderParts[0], "_")
897897 let bpOrdMat = split(bpOrderParts[1], "_")
898898 let bpOrdProd = if ((bpOrderParts[2] == ""))
899899 then nil
900900 else split(bpOrderParts[2], "_")
901901 if ((size(bpOrdRes) != NUMRES))
902902 then throw("All 6 resources should be passed")
903903 else if ((size(bpOrdMat) != NUMRES))
904904 then throw("All 6 materials should be passed")
905905 else {
906906 let wh = asString(invoke(stakingContract, "getWarehouseREADONLY", [landAssetId], nil))
907907 let currentWh = split_4C(wh, ":")
908908 let currWhRes = split(currentWh[whIdxRes], "_")
909909 let currWhMat = split(currentWh[whIdxMat], "_")
910910 let currWhProd = if ((currentWh[whIdxProd] == ""))
911911 then nil
912912 else split(currentWh[whIdxProd], "_")
913913 let currWhResVol = getWarehouseCurrResVolume(currentWh)
914914 let currWhMatVol = getWarehouseCurrMatVolume(currentWh)
915915 let currWhGoodsVol = getWarehouseCurrGoodsVolume(currentWh)
916916 let currWhLockedVol = parseIntValue(currentWh[whIdxLockedVol])
917917 let whSpaceLeft = ((((getWarehouseVolume(currentWh[whIdxVol]) - currWhResVol) - currWhMatVol) - currWhGoodsVol) - currWhLockedVol)
918918 let bpKey = keyBackpackByDuck(duckAssetId)
919919 let currentPack = getBackpack(bpKey)
920920 let bpResList = split(currentPack[bpIdxRes], "_")
921921 let bpMatList = split(currentPack[bpIdxMat], "_")
922922 let bpProdList = if ((currentPack[bpIdxProd] == ""))
923923 then nil
924924 else split(currentPack[bpIdxProd], "_")
925925 let ordKey = keyOrderByLand(landAssetId)
926926 let whOrd = getOrder(ordKey)
927927 let whOrdRes = split(whOrd[ordIdxRes], "_")
928928 let whOrdMat = split(whOrd[ordIdxMat], "_")
929929 let whOrdProd = if ((whOrd[ordIdxProd] == ""))
930930 then nil
931931 else split(whOrd[ordIdxProd], "_")
932932 let usdnNeed2Lock = 0
933933 func ordR (acc,j) = {
934934 let bpOrdResParts = split(bpOrdRes[j], "@")
935935 if ((size(bpOrdResParts) != 2))
936936 then throw("Incorrect order format, should be amount@price")
937937 else {
938938 let bpOrdAm = parseIntValue(bpOrdResParts[0])
939939 let bpOrdPr = parseIntValue(bpOrdResParts[1])
940940 if ((0 > bpOrdPr))
941941 then throw("Price can't be negative")
942942 else {
943943 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
944944 let bpr = parseIntValue(bpResList[j])
945945 let whr = parseIntValue(currWhRes[j])
946946 let whOrdParts = split(whOrdRes[j], "@")
947947 let whOrdAm = parseIntValue(whOrdParts[0])
948948 let whOrdPr = parseIntValue(whOrdParts[1])
949949 if ((bpOrdPr != whOrdPr))
950- then throw((("Prices of " + resTypes[j]) + " don't match"))
950+ then throw(((((("Prices of " + resTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
951951 else {
952952 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
953953 if ((bpOrdAm == 0))
954954 then $Tuple6((acc._1 :+ currWhRes[j]), (acc._2 :+ whOrdRes[j]), (acc._3 :+ bpResList[j]), acc._4, acc._5, acc._6)
955955 else if ((bpOrdAm > 0))
956956 then if ((0 > whOrdAm))
957957 then if ((bpOrdAm > -(whOrdAm)))
958958 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + resTypes[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
959959 else $Tuple6((acc._1 :+ currWhRes[j]), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpr + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd))
960960 else throw((("Attempt to buy " + resTypes[j]) + " while warehouse doesn't sell it"))
961961 else if ((whOrdAm > 0))
962962 then if ((-(bpOrdAm) > whOrdAm))
963963 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + resTypes[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
964964 else if ((-(bpOrdAm) > bpr))
965965 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + bpResList[j]) + " of ") + resTypes[j]))
966966 else $Tuple6((acc._1 :+ toString((whr - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ "0"), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6)
967967 else throw((("Attempt to sell " + resTypes[j]) + " while warehouse doesn't buy it"))
968968 }
969969 }
970970 }
971971 }
972972
973973 let r = {
974974 let $l = [0, 1, 2, 3, 4, 5]
975975 let $s = size($l)
976976 let $acc0 = $Tuple6(nil, nil, nil, 0, 0, 0)
977977 func $f0_1 ($a,$i) = if (($i >= $s))
978978 then $a
979979 else ordR($a, $l[$i])
980980
981981 func $f0_2 ($a,$i) = if (($i >= $s))
982982 then $a
983983 else throw("List size exceeds 6")
984984
985985 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
986986 }
987987 func ordM (acc,j) = {
988988 let bpOrdMatParts = split(bpOrdMat[j], "@")
989989 if ((size(bpOrdMatParts) != 2))
990990 then throw("Incorrect order format, should be amount@price")
991991 else {
992992 let bpOrdAm = parseIntValue(bpOrdMatParts[0])
993993 let bpOrdPr = parseIntValue(bpOrdMatParts[1])
994994 if ((0 > bpOrdPr))
995995 then throw("Price can't be negative")
996996 else {
997997 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
998998 let bpr = parseIntValue(bpMatList[j])
999999 let whr = parseIntValue(currWhMat[j])
10001000 let whOrdParts = split(whOrdMat[j], "@")
10011001 let whOrdAm = parseIntValue(whOrdParts[0])
10021002 let whOrdPr = parseIntValue(whOrdParts[1])
10031003 if ((bpOrdPr != whOrdPr))
1004- then throw((("Prices of " + matTypes[j]) + " don't match"))
1004+ then throw(((((("Prices of " + matTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
10051005 else {
10061006 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
10071007 if ((bpOrdAm == 0))
10081008 then $Tuple6((acc._1 :+ currWhMat[j]), (acc._2 :+ whOrdMat[j]), (acc._3 :+ bpMatList[j]), acc._4, acc._5, acc._6)
10091009 else if ((bpOrdAm > 0))
10101010 then if ((0 > whOrdAm))
10111011 then if ((bpOrdAm > -(whOrdAm)))
10121012 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + matTypes[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
10131013 else $Tuple6((acc._1 :+ currWhMat[j]), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpr + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd))
10141014 else throw((("Attempt to buy " + matTypes[j]) + " while warehouse doesn't sell it"))
10151015 else if ((whOrdAm > 0))
10161016 then if ((-(bpOrdAm) > whOrdAm))
10171017 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + matTypes[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
10181018 else if ((-(bpOrdAm) > bpr))
10191019 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + bpMatList[j]) + " of ") + matTypes[j]))
10201020 else $Tuple6((acc._1 :+ toString((whr - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ "0"), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6)
10211021 else throw((("Attempt to sell " + matTypes[j]) + " while warehouse doesn't buy it"))
10221022 }
10231023 }
10241024 }
10251025 }
10261026
10271027 let m = {
10281028 let $l = [0, 1, 2, 3, 4, 5]
10291029 let $s = size($l)
10301030 let $acc0 = $Tuple6(nil, nil, nil, r._4, r._5, r._6)
10311031 func $f1_1 ($a,$i) = if (($i >= $s))
10321032 then $a
10331033 else ordM($a, $l[$i])
10341034
10351035 func $f1_2 ($a,$i) = if (($i >= $s))
10361036 then $a
10371037 else throw("List size exceeds 6")
10381038
10391039 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
10401040 }
10411041 func ordP (acc,j) = {
10421042 let bpOrdProdParts = split(bpOrdProd[j], "@")
10431043 if ((size(bpOrdProdParts) != 2))
10441044 then throw("Incorrect order format, should be amount@price")
10451045 else {
10461046 let bpOrdAm = parseIntValue(bpOrdProdParts[0])
10471047 let bpOrdPr = parseIntValue(bpOrdProdParts[1])
10481048 if ((0 > bpOrdPr))
10491049 then throw("Price can't be negative")
10501050 else {
10511051 let bpOrdUsd = fraction(bpOrdAm, bpOrdPr, MULT8)
10521052 let bpr = parseIntValue(bpProdList[j])
10531053 let whr = parseIntValue(currWhProd[j])
10541054 let whOrdParts = split(whOrdProd[j], "@")
10551055 let whOrdAm = parseIntValue(whOrdParts[0])
10561056 let whOrdPr = parseIntValue(whOrdParts[1])
10571057 if ((bpOrdPr != whOrdPr))
1058- then throw((("Prices of " + prodTypes[j]) + " don't match"))
1058+ then throw(((((("Prices of " + prodTypes[j]) + " don't match! WH price=") + toString(whOrdPr)) + ", your price=") + toString(bpOrdPr)))
10591059 else {
10601060 let whOrdUsd = fraction(whOrdAm, whOrdPr, MULT8)
10611061 if ((bpOrdAm == 0))
10621062 then $Tuple6((acc._1 :+ currWhProd[j]), (acc._2 :+ whOrdProd[j]), (acc._3 :+ bpProdList[j]), acc._4, acc._5, acc._6)
10631063 else if ((bpOrdAm > 0))
10641064 then if ((0 > whOrdAm))
10651065 then if ((bpOrdAm > -(whOrdAm)))
10661066 then throw(((((("Attempt to buy " + toString(bpOrdAm)) + " of ") + prodTypes[j]) + ", but warehouse only sells ") + toString(-(whOrdAm))))
10671067 else $Tuple6((acc._1 :+ currWhProd[j]), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ toString((bpr + bpOrdAm))), (acc._4 + bpOrdAm), acc._5, (acc._6 + bpOrdUsd))
10681068 else throw((("Attempt to buy " + prodTypes[j]) + " while warehouse doesn't sell it"))
10691069 else if ((whOrdAm > 0))
10701070 then if ((-(bpOrdAm) > whOrdAm))
10711071 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + " of ") + prodTypes[j]) + ", but warehouse only buys ") + toString(whOrdAm)))
10721072 else if ((-(bpOrdAm) > bpr))
10731073 then throw(((((("Attempt to sell " + toString(-(bpOrdAm))) + ", but you only have ") + bpProdList[j]) + " of ") + prodTypes[j]))
10741074 else $Tuple6((acc._1 :+ toString((whr - bpOrdAm))), (acc._2 :+ ((toString((whOrdAm + bpOrdAm)) + "@") + toString(whOrdPr))), (acc._3 :+ "0"), (acc._4 - bpOrdAm), (acc._5 - bpOrdUsd), acc._6)
10751075 else throw((("Attempt to sell " + prodTypes[j]) + " while warehouse doesn't buy it"))
10761076 }
10771077 }
10781078 }
10791079 }
10801080
10811081 let p = {
10821082 let $l = [0, 1, 2, 3, 4, 5]
10831083 let $s = size($l)
10841084 let $acc0 = $Tuple6(nil, nil, nil, m._4, m._5, m._6)
10851085 func $f2_1 ($a,$i) = if (($i >= $s))
10861086 then $a
10871087 else ordP($a, $l[$i])
10881088
10891089 func $f2_2 ($a,$i) = if (($i >= $s))
10901090 then $a
10911091 else throw("List size exceeds 50")
10921092
10931093 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
10941094 }
10951095 let volSaldo = p._4
10961096 let whStr = makeString_2C([currentWh[whIdxVol], makeString(r._1, "_"), makeString(m._1, "_"), makeString(p._1, "_"), toString(volSaldo)], ":")
10971097 let newWhOrdStr = makeString_2C([makeString(r._2, "_"), makeString(m._2, "_"), makeString(p._2, "_")], ":")
10981098 let newBpStr = makeString_2C([currentPack[bpIdxLevel], makeString(r._3, "_"), makeString(m._3, "_"), makeString(p._3, "_")], ":")
10991099 let whSave = invoke(stakingContract, "saveWarehouse", [whStr, landAssetId], nil)
11001100 if ((whSave == whSave))
11011101 then {
11021102 let bpSave = invoke(stakingContract, "updateBackpack", [duckAssetId, newBpStr], nil)
11031103 if ((bpSave == bpSave))
11041104 then {
11051105 let actions = [StringEntry(ordKey, newWhOrdStr)]
11061106 let usdWh2BpFee = fraction(p._5, AUCTIONFEE, MULT6)
11071107 let usdWh2BpSaldo = p._5
11081108 let actions1 = if ((usdWh2BpSaldo > 0))
11091109 then (actions :+ ScriptTransfer(caller, (p._5 - usdWh2BpFee), usdnAssetId))
11101110 else actions
11111111 let usdBp2WhFee = fraction(p._6, AUCTIONFEE, MULT6)
11121112 let usdBp2WhSaldo = p._6
11131113 if ((usdBp2WhSaldo > 0))
11141114 then if ((size(i.payments) != 1))
11151115 then throw("exactly 1 payment must be attached")
11161116 else {
11171117 let pmt = i.payments[0]
11181118 let amt = pmt.amount
11191119 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
11201120 if ((pmtAssetId != usdnAssetId))
11211121 then throw("USDN payments only!")
11221122 else if ((amt != usdBp2WhSaldo))
11231123 then throw(("Payment needed is " + toString(usdBp2WhSaldo)))
11241124 else (actions1 :+ ScriptTransfer(addressFromStringValue(landOwner), (p._6 - usdBp2WhFee), usdnAssetId))
11251125 }
11261126 else if ((size(i.payments) != 0))
11271127 then throw("No payments needed")
11281128 else actions1
11291129 }
11301130 else throw("Strict value is not equal to itself.")
11311131 }
11321132 else throw("Strict value is not equal to itself.")
11331133 }
11341134 }
11351135 }
11361136 }
11371137 }
11381138 }
11391139
11401140

github/deemru/w8io/873ac7e 
144.30 ms