tx · 3AF4QCzJ2Fpvh6QERPbz1DDUSiNZh3tzfYqCVsGuru6N

3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1:  -0.05000000 Waves

2023.08.23 13:53 [2723185] smart account 3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1 > SELF 0.00000000 Waves

{ "type": 13, "id": "3AF4QCzJ2Fpvh6QERPbz1DDUSiNZh3tzfYqCVsGuru6N", "fee": 5000000, "feeAssetId": null, "timestamp": 1692788038279, "version": 2, "chainId": 84, "sender": "3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1", "senderPublicKey": "Cm1uVVKocYw3S4eL9bYUMNZe5vpBPipgiiTx37eL6E8F", "proofs": [ "4hxw2HaJp4MXSGKn7n7nfDd7XvvUdRtxsTai4yYtxGkxQR23qT3EJt6gJXX9mkf4sRi5HYJH9BgXBfB65Cd2aD71", "4U9XZi135H55UcaFFCiLPP2eKKTDNn1e9GMiLKUmLhqDKtUSeYmZ5fzwPtFmWU8hFrov492c2K3HaPhhb54jffKm" ], "script": "base64:BgJQCAISBAoCAQgSAwoBCBIUChIIAQEIAQEBAQEBAQEYBAEBBBgSBAoCAQgSBAoCAQgSBAoCAQgSBQoDAQEIEgMKAQESAwoBARIECgIBARIAEgBOAAlrZXlBY3RpdmUCBmFjdGl2ZQALa0FjdGl2ZUdsb2ICFGFjdGl2ZV9hbGxfY29udHJhY3RzAA9rZXlBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA9rZXlBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA9rZXlBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zACFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMCIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwASa2V5TGF1bmNocGFkTmV4dElkAhFsYXVuY2hwYWRfbmV4dF9pZAAUa2V5TGF1bmNocGFkQWN0aXZlSWQCE2xhdW5jaHBhZF9hY3RpdmVfaWQADWtleUluaXRDYWxsZXICC2luaXRfY2FsbGVyAAprZXlBZGRyZXNzAghfYWRkcmVzcwANa2V5SW5pdEhlaWdodAIMX2luaXRfaGVpZ2h0AA5rZXlTdGFydEhlaWdodAINX3N0YXJ0X2hlaWdodAARa2V5RmluYWxpc2VIZWlnaHQCEF9maW5hbGlzZV9oZWlnaHQADGtleUNvbWlzc2lvbgIKX2NvbWlzc2lvbgAKa2V5QXNzZXRJZAIJX2Fzc2V0X2lkABNrZXlUb3RhbFRva2VuQW1vdW50AhNfdG90YWxfdG9rZW5fYW1vdW50ABprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZAIVX3RvdGFsX2J1eV9hc3NldF9zb2xkABJrZXlUb2tlbnNQZXJUaWNrZXQCEl90b2tlbnNfcGVyX3RpY2tldAAQa2V5UHJpY2VQZXJUb2tlbgIQX3ByaWNlX3Blcl90b2tlbgAQa2V5U3dvcFBlclRpY2tldAIQX3N3b3BfcGVyX3RpY2tldAAWa2V5U3dvcGZpVGlja2V0c0Ftb3VudAIXX3RpY2tldHNfc3dvcGZpX21lbWJlcnMAF2tleUNhbXBhaWduVG9rZW5zQW1vdW50AhNfdG9rZW5zX2FjY2Vzc19saXN0ABZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uAhZfdG9rZW5zX3Blcl9hbGxvY2F0aW9uABNrZXlUaWNrZXRMYXN0TnVtYmVyAhNfdGlja2V0X2xhc3RfbnVtYmVyABNrZXlHb3Zlcm5hbmNlU3Rha2VkAg1fR1N3b3BfYW1vdW50AAxrZXlVc2VyUmVmSWQCB19yZWZfaWQADWtleVZlcmlmeUhhc2gCDF92ZXJpZnlfaGFzaAALa2V5RHVyYXRpb24CCV9kdXJhdGlvbgAca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwInX3RvdGFsX3B1cmNoYXNlZF9idXlfYXNzZXRfaW5fbWFya2V0aW5nACVrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nRmluYWxpemVkAjFfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmdfZmluYWxpemVkABNrZXlUcmFuc2ZlckJ1eUFzc2V0AhNfdHJhbnNmZXJfYnV5X2Fzc2V0ABRrZXlGcmVlelN3b3BEdXJhdGlvbgIVX2ZyZWV6ZV9zd29wX2R1cmF0aW9uABhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4CGF9mcmVlemVfYWRkaXRpb25hbF90b2tlbgAQa2V5RnJlZXplVG9rZW5JZAIQX2ZyZWV6ZV90b2tlbl9pZAAWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgIWX2ZyZWV6ZV90b2tlbl9kdXJhdGlvbgAXa2V5RnJlZXplVG9rZW5QZXJUaWNrZXQCGF9mcmVlemVfdG9rZW5fcGVyX3RpY2tldAALa2V5QnV5VG9rZW4CCl9idXlfdG9rZW4ADmtleUNsYWltUGFyYW1zAg1fY2xhaW1fcGFyYW1zABtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24CG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lvbgAWa2V5SGlnaENvbXBldGl0aW9uU2FsZQIWX2hpZ2hfY29tcGV0aXRpb25fc2FsZQAVa2V5SENUaWNrZXRMYXN0TnVtYmVyAiRfaGlnaF9jb21wZXRpdGlvbl90aWNrZXRfbGFzdF9udW1iZXIAGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAIZX3RpY2tldHNfaGlnaF9jb21wZXRpdGlvbgAca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQwImX3RvdGFsX2J1eV9hc3NldF9zb2xkX2hpZ2hfY29tcGV0aXRpb24AFGtleVVzZXJDbGFpbWVkVG9rZW5zAg9fY2xhaW1lZF90b2tlbnMAF2tleVVzZXJDbGFpbWVkQnV5VG9rZW5zAhNfY2xhaW1lZF9idXlfdG9rZW5zABprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAIPX2JvdWdodF90aWNrZXRzAA5rZXlVc2VyVGlja2V0cwIPX3RpY2tldHNfbnVtYmVyABBrZXlVc2VySENUaWNrZXRzAiBfdGlja2V0c19udW1iZXJfaGlnaF9jb21wZXRpdGlvbgAca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAIgX2JvdWdodF90aWNrZXRzX2hpZ2hfY29tcGV0aXRpb24AG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwIdX2F2YWlsYWJsZV9wdXJjaGFzZV9tYXJrZXRpbmcAIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nAiFfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwITX2JvdWdodF9hbGxvY2F0aW9ucwASa2V5VXNlckNsYWltU3RhdHVzAg1fY2xhaW1fc3RhdHVzABprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudAIPX3RpY2tldHNfcmVzdWx0AClrZXlVc2VyV2lubmVkSGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAIgX3RpY2tldHNfcmVzdWx0X2hpZ2hfY29tcGV0aXRpb24AEmtleVVzZXJGcmVlemVUb2tlbgIUX2ZyZWV6ZV90b2tlbl9hbW91bnQABm9yYWNsZQkBB0FkZHJlc3MBARoBVEgTlwzA0zPMJTKAtin3p2RogKvjzHtLmQAKZ292ZXJuYW5jZQkBB0FkZHJlc3MBARoBVMjcuWCotbWVPLfydaKVHLjfUPyH4RW0IgAQY29tbWlzc2lvbldhbGxldAkBB0FkZHJlc3MBARoBVIu67/x0Qcp5qolR7D86Zc0NPlB1AJuHDgASc3Rha2luZ1VTRE5BZGRyZXNzCQEHQWRkcmVzcwEBGgFUyzDUI2tI0RnhEQqOmg6HEPqnSokkZ5v9AARVU0ROASA0ARNWjmBG4n5bqbgBR4LnsQAmEpt25E5LoqB8nG3ugQASYWRtaW5QdWJLZXlTdGFraW5nASAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgAMV0FWRVNfWFROX0VYCQEHQWRkcmVzcwEBGgFUE+06HqYmRCC3D4wq0lzrbsHxoPvs0AmgABRtYXhBbGxvY2F0aW9uc0Ftb3VudAACABFhY3RpdmVMYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUUa2V5TGF1bmNocGFkQWN0aXZlSWQA////////////AQELZ2V0QWRtaW5QdWIBC2tleUFkbWluUHViBAckbWF0Y2gwCQCdCAIFBm9yYWNsZQULa2V5QWRtaW5QdWIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQIZQWRtaW4gcHVibGljIGtleSBpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQELZ2V0QWRtaW5QdWIBBQ9rZXlBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBC2dldEFkbWluUHViAQUPa2V5QWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJAQtnZXRBZG1pblB1YgEFD2tleUFkbWluUHViS2V5MwEMZ2V0QXNzZXRJbmZvAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwBAhzdHJpbmdJZAkA2AQBBQJpZAQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmlkCQCsAgIJAKwCAgIGQXNzZXQgBQhzdHJpbmdJZAIOIGRvZXNuJ3QgZXhpc3QJAJUKAwUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCQCVCgMCBVdBVkVTAgVXQVZFUwAICQACAQILTWF0Y2ggZXJyb3IBEmdldExhdW5jaHBhZE5leHRJZAAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5TGF1bmNocGFkTmV4dElkAAEBEHN0YWtlZFVzZG5BbW91bnQACQELdmFsdWVPckVsc2UCCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFBFVTRE4CAV8JAKUIAQUEdGhpcwAAAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUJa2V5QWN0aXZlBgAKYWN0aXZlR2xvYgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFC2tBY3RpdmVHbG9iBgEIaXNBY3RpdmUAAwMFBmFjdGl2ZQUKYWN0aXZlR2xvYgcFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHICBVdBVkVTCQCWCgQFBHVuaXQCBVdBVkVTAgVXQVZFUwAIBAhzdHJpbmdJZAUIYXNzZXRTdHIEAmlkCQDZBAEFCGFzc2V0U3RyBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCaWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlgoEBQJpZAUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAQpidXlJbldhdmVzAwtsYXVuY2hwYWRJZA10aWNrZXRzQW1vdW50BHR5cGUECyR0MDUxNTk1MzA5CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFCyR0MDUxNTk1MzA5Al8xBA1idXlBc3NldFN0cklkCAULJHQwNTE1OTUzMDkCXzIEDGJ1eUFzc2V0TmFtZQgFCyR0MDUxNTk1MzA5Al8zBBBidXlBc3NldERlY2ltYWxzCAULJHQwNTE1OTUzMDkCXzQECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQLJHQwNTQ5MTU2MzUJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAULJHQwNTQ5MTU2MzUCXzEED3Rva2VuU3RyQXNzZXRJZAgFCyR0MDU0OTE1NjM1Al8yBA50b2tlbkFzc2V0TmFtZQgFCyR0MDU0OTE1NjM1Al8zBA10b2tlbkRlY2ltYWxzCAULJHQwNTQ5MTU2MzUCXzQEC3RpY2tldFByaWNlCQBrAwUPdG9rZW5zUGVyVGlja2V0BQp0b2tlblByaWNlCQBsBgAKAAAFDXRva2VuRGVjaW1hbHMAAAAABQRET1dOBBNjb21taXNzaW9uUGVyVGlja2V0AwkAAAIFBHR5cGUAAQkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkCQBrAwULdGlja2V0UHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAGQEEGFtbnRUb0dldFRpY2tldHMJAGgCBQ10aWNrZXRzQW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQECWFtbnRUb1BheQoAAUAJAJEDAgoAAUAJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIVaG93TWFueVlvdVBheVJFQURPTkxZCQDMCAIJAMwIAgkApAMBBRBhbW50VG9HZXRUaWNrZXRzCQDMCAIFCmJ1eUFzc2V0SWQFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFCWFtbnRUb1BheQUJYW1udFRvUGF5CQBrAwUJYW1udFRvUGF5AGUAZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgwBaQENaGFzaGluZ1JhbmRvbQILbGF1bmNocGFkSWQEaGFzaAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gFBGhhc2gFA25pbAFpAQppbml0Q2FsbGVyAQdhZGRyZXNzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXIFB2FkZHJlc3MFA25pbAFpAQRpbml0Eg5wcm9qZWN0QWRkcmVzcwtzdGFydEhlaWdodAhkdXJhdGlvbghidXlUb2tlbgpjb21taXNzaW9uD3Rva2Vuc1BlclRpY2tldA1wcmljZVBlclRva2VuE3N3b3BmaVRpY2tldHNBbW91bnQUY2FtcGFpZ25Ub2tlbnNBbW91bnQTdG9rZW5zUGVyQWxsb2NhdGlvbg1zd29wUGVyVGlja2V0EnN3b3BGcmVlemVEdXJhdGlvbgtjbGFpbVBhcmFtcxNIaWdoQ29tcGV0aXRpb25TYWxlGGhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhxoaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50FWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgxmcmVlemVQYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rZXlJbml0Q2FsbGVyAgAJAAIBAilPbmx5IHByb2plY3QgYWRtaW4gY2FuIGNhbGwgaW5pdCBmdW5jdGlvbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkAZgIFBmhlaWdodAULc3RhcnRIZWlnaHQJAAIBAjNTdGFydCBoZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gYmxvY2tjaGFpbiBoZWlnaHQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuCQECIT0CCQCQAwEFDGZyZWV6ZVBhcmFtcwADBwkAAgECJEZyZWV6ZSBwYXJhbXMgbGlzdCBtdXN0IGhhdmUgMyBpdGVtcwQLbGF1bmNocGFkSWQJARJnZXRMYXVuY2hwYWROZXh0SWQABA5sYXVuY2hwYWRJZFN0cgkApAMBBQtsYXVuY2hwYWRJZAQLJHQwNzc4OTc4NjQJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAULJHQwNzc4OTc4NjQCXzEECnBtdEFzc2V0SWQIBQskdDA3Nzg5Nzg2NAJfMgQLJHQwNzg3Mzc5NDYJAQxnZXRBc3NldEluZm8BBQpwbXRBc3NldElkBA1wbXRTdHJBc3NldElkCAULJHQwNzg3Mzc5NDYCXzEEDHBtdEFzc2V0TmFtZQgFCyR0MDc4NzM3OTQ2Al8yBAtwbXREZWNpbWFscwgFCyR0MDc4NzM3OTQ2Al8zBBVmcmVlemVBZGRpdGlvbmFsRW50cnkDBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUQa2V5RnJlZXplVG9rZW5JZAkAkQMCBQxmcmVlemVQYXJhbXMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwACBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDXBtdFN0ckFzc2V0SWQCCl9sYXVuY2hwYWQFC2xhdW5jaHBhZElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrZXlMYXVuY2hwYWROZXh0SWQJAGQCBQtsYXVuY2hwYWRJZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFkZHJlc3MFDnByb2plY3RBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ1rZXlJbml0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDmtleVN0YXJ0SGVpZ2h0BQtzdGFydEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgULa2V5RHVyYXRpb24FCGR1cmF0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFC2tleUJ1eVRva2VuBQhidXlUb2tlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUUa2V5RnJlZXpTd29wRHVyYXRpb24FEnN3b3BGcmVlemVEdXJhdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VG90YWxUb2tlbkFtb3VudAUJcG10QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFzc2V0SWQFDXBtdFN0ckFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDGtleUNvbWlzc2lvbgUKY29tbWlzc2lvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VGlja2V0TGFzdE51bWJlcgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUSa2V5VG9rZW5zUGVyVGlja2V0BQ90b2tlbnNQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVByaWNlUGVyVG9rZW4FDXByaWNlUGVyVG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVN3b3BQZXJUaWNrZXQFDXN3b3BQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFFmtleVN3b3BmaVRpY2tldHNBbW91bnQFE3N3b3BmaVRpY2tldHNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFF2tleUNhbXBhaWduVG9rZW5zQW1vdW50BRRjYW1wYWlnblRva2Vuc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgUTdG9rZW5zUGVyQWxsb2NhdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ5rZXlDbGFpbVBhcmFtcwkAuQkCBQtjbGFpbVBhcmFtcwIBLAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5SGlnaENvbXBldGl0aW9uU2FsZQUTSGlnaENvbXBldGl0aW9uU2FsZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uBRhoaWdoQ29tcGV0aXRpb25Db21pc3Npb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAUcaGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGF1bmNocGFkQWN0aXZlSWQFC2xhdW5jaHBhZElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXICAAUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkBaQEQY29tbWl0U3dvcGZpU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMTA3MjkxMDg3MwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxMDcyOTEwODczAl8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxMDcyOTEwODczAl8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDEwNzI5MTA4NzMCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxMDcyOTEwODczAl80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTY29tbWlzc2lvblBlclRpY2tldAkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkBA0kdDAxMTA5MDExMjQwCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDExMDkwMTEyNDACXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxMTA5MDExMjQwAl8yBAxidXlBc3NldE5hbWUIBQ0kdDAxMTA5MDExMjQwAl8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTEwOTAxMTI0MAJfNAQLc3Rha2VkU3dvcHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292ZXJuYW5jZQkArAICCQClCAEIBQFpBmNhbGxlcgUTa2V5R292ZXJuYW5jZVN0YWtlZAAABBdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAkAaQIFC3N0YWtlZFN3b3BzCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVN3b3BQZXJUaWNrZXQEE2JvdWdodFRpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AAAEFGFsbG93ZWRUaWNrZXRzQW1vdW50CQBlAgUXYWxsb3dlZFRpY2tldHNBbW91bnRBbGwFE2JvdWdodFRpY2tldHNBbW91bnQEC3N0YXJ0SGVpZ2h0CQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5U3RhcnRIZWlnaHQECGR1cmF0aW9uCQEFdmFsdWUBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5RHVyYXRpb24EFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgcEDSR0MDExOTY1MTMwMTkDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0BAlhbW50VG9HZXQKAAFACQCRAwIKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VHZXRSRUFET05MWQkAzAgCCQDMCAIJAKQDAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgEABQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQlhbW50VG9HZXQFCWFtbnRUb0dldAQNdGlja2V0c0Ftb3VudAkAaQIFCWFtbnRUb0dldAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BBBhbW50VG9HZXRUaWNrZXRzCQBoAgUNdGlja2V0c0Ftb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAlhbW50VG9QYXkKAAFACQCRAwIKAAFACQD8BwQFDFdBVkVTX1hUTl9FWAIMY2FsbEZ1bmN0aW9uCQDMCAICFWhvd01hbnlZb3VQYXlSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwkAzAgCBQpidXlBc3NldElkBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQlhbW50VG9QYXkFCWFtbnRUb1BheQQCZXgJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCCQCkAwEFEGFtbnRUb0dldFRpY2tldHMFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0BQlhbW50VG9QYXkFA25pbAMJAAACBQJleAUCZXgEBmNoYW5nZQkAZQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRBhbW50VG9HZXRUaWNrZXRzBAZjRW50cnkDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZjaGFuZ2UICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBQNuaWwJAJUKAwUQYW1udFRvR2V0VGlja2V0cwUKYnV5QXNzZXRJZAUGY0VudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCVCgMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAQJcG10QW1vdW50CAUNJHQwMTE5NjUxMzAxOQJfMQQKcG10QXNzZXRJZAgFDSR0MDExOTY1MTMwMTkCXzIEC2NoYW5nZUVudHJ5CAUNJHQwMTE5NjUxMzAxOQJfMwMJAQIhPQIFEWFjdGl2ZUxhdW5jaHBhZElkBQtsYXVuY2hwYWRJZAkAAgECN1RoZXJlIGlzIG5vIGFjdGl2ZSBsYXVuY2hwYWQgb3IgdGhpcyBsYXVuY2hwYWQgaXMgZW5kZWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQEBIQEFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQIhPQIFCnBtdEFzc2V0SWQFCmJ1eUFzc2V0SWQHCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACBgkBAiE9AgUKcG10QXNzZXRJZAUKYnV5QXNzZXRJZAcEDWZyZWV6ZVRva2VuSWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5RnJlZXplVG9rZW5JZAkAAgEJAKwCAgkArAICCQCsAgICKVR3byBhdHRhY2hlZCBwYXltZW50cyBleHBlY3RlZDogRmlyc3QgaW4gBQxidXlBc3NldE5hbWUCDCwgc2Vjb25kIGluIAUNZnJlZXplVG9rZW5JZAMDCQBnAgAABRdhbGxvd2VkVGlja2V0c0Ftb3VudEFsbAYJAGcCAAAFFGFsbG93ZWRUaWNrZXRzQW1vdW50CQACAQIqTm90IGVub3VnaHQgU1dPUCBpbiBzdGFraW5nIHRvIGJ1eSB0aWNrZXRzBA9idXlUaWNrZXRBbW91bnQJAGkCBQlwbXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAlwMBCQDMCAIFD2J1eVRpY2tldEFtb3VudAkAzAgCBRRhbGxvd2VkVGlja2V0c0Ftb3VudAUDbmlsBBxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uCQBoAgUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAZjaGFuZ2UJAGUCBQlwbXRBbW91bnQFHGFsbG93ZWRCdXlQcmljZVdpdGhDb21pc3Npb24DCQAAAgUPYnV5VGlja2V0QW1vdW50AAAJAAIBCQCsAgIJAKwCAgIMTm90IGVub3VnaHQgBQxidXlBc3NldE5hbWUCDyB0byBidXkgdGlja2V0cwMJAQIhPQIFBmNoYW5nZQAACQACAQkArAICCQCsAgIJAKwCAgkArAICAhZXcm9uZyBwYXltZW50LiBUbyBidXkgCQCkAwEFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQCGHRpY2tldHMgeW91IG5lZWQgdG8gcGF5IAkApAMBBRxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUEFWZyZWV6ZUFkZGl0aW9uYWxFbnRyeQMFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgQNZnJlZXplVG9rZW5JZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlGcmVlemVUb2tlbklkBBRmcmVlemVUb2tlblBlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAQNJHQwMTQ4NjIxNDk0OQkAlAoCCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkBA9wbXRBbW91bnRGcmVlemUIBQ0kdDAxNDg2MjE0OTQ5Al8xBBBwbXRBc3NldElkRnJlZXplCAUNJHQwMTQ4NjIxNDk0OQJfMgQNJHQwMTQ5NjYxNTA1NwkBDGdldEFzc2V0SW5mbwEFCnBtdEFzc2V0SWQEE3BtdEZyZWV6ZVN0ckFzc2V0SWQIBQ0kdDAxNDk2NjE1MDU3Al8xBBJwbXRGcmVlemVBc3NldE5hbWUIBQ0kdDAxNDk2NjE1MDU3Al8yBBFwbXRGcmVlemVEZWNpbWFscwgFDSR0MDE0OTY2MTUwNTcCXzMEEG5lZWRGcmVlemVUb2tlbnMJAGgCBRRmcmVlemVUb2tlblBlclRpY2tldAUPYnV5VGlja2V0QW1vdW50AwMJAQIhPQIFE3BtdEZyZWV6ZVN0ckFzc2V0SWQFDWZyZWV6ZVRva2VuSWQGCQECIT0CBRBuZWVkRnJlZXplVG9rZW5zBQ9wbXRBbW91bnRGcmVlemUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEFlvdSBuZWVkIHRvIGFkZCAJAKQDAQUQbmVlZEZyZWV6ZVRva2VucwIBIAUScG10RnJlZXplQXNzZXROYW1lAhQgYXMgYSBzZWNvbmQgcGF5bWVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJGcmVlemVUb2tlbgUPcG10QW1vdW50RnJlZXplBQNuaWwFA25pbAQYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlVc2VyVGlja2V0cwIABBZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRpY2tldExhc3ROdW1iZXIEC2JvdWdodFJhbmdlCQCsAgIJAKwCAgkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgABAgEtCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBRZhbGxvd2VkQnV5VGlja2V0QW1vdW50BBtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMJAKwCAgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAwkBAiE9AgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAgAJAKwCAgIBLAULYm91Z2h0UmFuZ2UJAKwCAgIABQtib3VnaHRSYW5nZQQDaW52AwkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4JAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAgxsb2NrTmV1dHJpbm8FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUJcG10QW1vdW50BQNuaWwAAAMJAAACBQNpbnYFA2ludgQJYmFzZUVudHJ5CQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50CQBkAgUTYm91Z2h0VGlja2V0c0Ftb3VudAUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUaWNrZXRMYXN0TnVtYmVyCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUOa2V5VXNlclRpY2tldHMFG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkFC2NoYW5nZUVudHJ5AwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUY29tbWl0QWNjZXNzTGlzdFNhbGUCC2xhdW5jaHBhZElkBXJlZklkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABA0kdDAxNzE0MzE3MjE4CQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFDSR0MDE3MTQzMTcyMTgCXzEECnBtdEFzc2V0SWQIBQ0kdDAxNzE0MzE3MjE4Al8yBA0kdDAxNzIyMzE3MzczCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDE3MjIzMTczNzMCXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxNzIyMzE3MzczAl8yBAxidXlBc3NldE5hbWUIBQ0kdDAxNzIyMzE3MzczAl8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTcyMjMxNzM3MwJfNAQTdXNlclVzZG5Jbk1hcmtldGluZwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUga2V5VXNlckFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcAAAQPdXNkbkluTWFya2V0aW5nCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwAABBFib3VnaHRBbGxvY2F0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zAAAECmNvbW1pc3Npb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUMa2V5Q29taXNzaW9uBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4EE3Rva2Vuc1BlckFsbG9jYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgQNJHQwMTgwNDIxODE4NgkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxODA0MjE4MTg2Al8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxODA0MjE4MTg2Al8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDE4MDQyMTgxODYCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxODA0MjE4MTg2Al80BBxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uCQBrAwkAawMFCnRva2VuUHJpY2UFE3Rva2Vuc1BlckFsbG9jYXRpb24JAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04JAGQCAGQFCmNvbW1pc3Npb24AZAQLc3RhcnRIZWlnaHQJAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlTdGFydEhlaWdodAQIZHVyYXRpb24JAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlEdXJhdGlvbgMJAQIhPQIFEWFjdGl2ZUxhdW5jaHBhZElkBQtsYXVuY2hwYWRJZAkAAgECN1RoZXJlIGlzIG5vIGFjdGl2ZSBsYXVuY2hwYWQgb3IgdGhpcyBsYXVuY2hwYWQgaXMgZW5kZWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQDCQBnAgURYm91Z2h0QWxsb2NhdGlvbnMFFG1heEFsbG9jYXRpb25zQW1vdW50CQACAQkArAICCQCsAgICEVlvdSBjYW4gYnV5IG9ubHkgCQCkAwEFFG1heEFsbG9jYXRpb25zQW1vdW50AgthbGxvY2F0aW9ucwMDCQECIT0CBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBQlwbXRBbW91bnQJAQIhPQIJAGgCBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uAAIFCXBtdEFtb3VudAcJAAIBCQCsAgIJAKwCAgkArAICAjJXcm9uZyBwYXltZW50LiBZb3UgY2FuIGJ1eSAxIG9yIDIgYWxsb2NhdGlvbnMgZm9yIAkApAMBBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUCDyBwZXIgYWxsb2NhdGlvbgQUYnV5QWxsb2NhdGlvbnNBbW91bnQJAGkCBQlwbXRBbW91bnQFHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24EA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIMbG9ja05ldXRyaW5vBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFCXBtdEFtb3VudAUDbmlsAAADCQAAAgUDaW52BQNpbnYECWJhc2VFbnRyeQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwkAZAIFEWJvdWdodEFsbG9jYXRpb25zBRRidXlBbGxvY2F0aW9uc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQBkAgUTdXNlclVzZG5Jbk1hcmtldGluZwUJcG10QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFHGtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcJAGQCBQ91c2RuSW5NYXJrZXRpbmcFCXBtdEFtb3VudAUDbmlsAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEZY29tbWl0SGlnaENvbXBldGl0aW9uU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDSR0MDIwNDQ0MjA1OTQJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMjA0NDQyMDU5NAJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDIwNDQ0MjA1OTQCXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDIwNDQ0MjA1OTQCXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAyMDQ0NDIwNTk0Al80BAtzdGFydEhlaWdodAkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleVN0YXJ0SGVpZ2h0BAhkdXJhdGlvbgkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uBBVib3VnaHRIQ1RpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQAAAQTaGlnaENvbXBldGl0aW9uU2FsZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFmtleUhpZ2hDb21wZXRpdGlvblNhbGUHBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4ED3Rva2Vuc1BlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlUb2tlbnNQZXJUaWNrZXQEDSR0MDIxMjA0MjEzNDgJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAUNJHQwMjEyMDQyMTM0OAJfMQQPdG9rZW5TdHJBc3NldElkCAUNJHQwMjEyMDQyMTM0OAJfMgQOdG9rZW5Bc3NldE5hbWUIBQ0kdDAyMTIwNDIxMzQ4Al8zBA10b2tlbkRlY2ltYWxzCAUNJHQwMjEyMDQyMTM0OAJfNAQLdGlja2V0UHJpY2UJAGsDBQ90b2tlbnNQZXJUaWNrZXQFCnRva2VuUHJpY2UJAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04EE2NvbW1pc3Npb25QZXJUaWNrZXQJAGsDBQt0aWNrZXRQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24AZAQNJHQwMjE1ODEyMjYzNQMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFBHVuaXQECWFtbnRUb0dldAoAAUAJAJEDAgoAAUAJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIVaG93TWFueVlvdUdldFJFQURPTkxZCQDMCAIJAMwIAgkApAMBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCAQAFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFCWFtbnRUb0dldAUJYW1udFRvR2V0BA10aWNrZXRzQW1vdW50CQBpAgUJYW1udFRvR2V0CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQEEGFtbnRUb0dldFRpY2tldHMJAGgCBQ10aWNrZXRzQW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQECWFtbnRUb1BheQoAAUAJAJEDAgoAAUAJAPwHBAUMV0FWRVNfWFROX0VYAgxjYWxsRnVuY3Rpb24JAMwIAgIVaG93TWFueVlvdVBheVJFQURPTkxZCQDMCAIJAMwIAgkApAMBBRBhbW50VG9HZXRUaWNrZXRzCQDMCAIFCmJ1eUFzc2V0SWQFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFCWFtbnRUb1BheQUJYW1udFRvUGF5BAJleAkA/AcEBQxXQVZFU19YVE5fRVgCDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIJAKQDAQUQYW1udFRvR2V0VGlja2V0cwUDbmlsBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFCWFtbnRUb1BheQUDbmlsAwkAAAIFAmV4BQJleAQGY2hhbmdlCQBlAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFEGFtbnRUb0dldFRpY2tldHMEBmNFbnRyeQMJAGYCBQZjaGFuZ2UAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmNoYW5nZQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwFA25pbAkAlQoDBRBhbW50VG9HZXRUaWNrZXRzBQpidXlBc3NldElkBQZjRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJUKAwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsBAlwbXRBbW91bnQIBQ0kdDAyMTU4MTIyNjM1Al8xBApwbXRBc3NldElkCAUNJHQwMjE1ODEyMjYzNQJfMgQLY2hhbmdlRW50cnkIBQ0kdDAyMTU4MTIyNjM1Al8zAwkBAiE9AgURYWN0aXZlTGF1bmNocGFkSWQFC2xhdW5jaHBhZElkCQACAQI3VGhlcmUgaXMgbm8gYWN0aXZlIGxhdW5jaHBhZCBvciB0aGlzIGxhdW5jaHBhZCBpcyBlbmRlZAMJAQEhAQUTaGlnaENvbXBldGl0aW9uU2FsZQkAAgECNFRoZXJlIGlzIG5vIGhpZ2ggY29tcGV0aXRpb24gc2FsZSBmb3IgdGhpcyBsYXVuY2hwYWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQED2J1eVRpY2tldEFtb3VudAkAaQIFCXBtdEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BBVidXlQcmljZVdpdGhDb21pc3Npb24JAGgCBQ9idXlUaWNrZXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQGY2hhbmdlCQBlAgUJcG10QW1vdW50BRVidXlQcmljZVdpdGhDb21pc3Npb24DCQAAAgUPYnV5VGlja2V0QW1vdW50AAAJAAIBCQCsAgIJAKwCAgIMTm90IGVub3VnaHQgBQxidXlBc3NldE5hbWUCDyB0byBidXkgdGlja2V0cwMJAQIhPQIFBmNoYW5nZQAACQACAQkArAICCQCsAgIJAKwCAgkArAICAhZXcm9uZyBwYXltZW50LiBUbyBidXkgCQCkAwEFD2J1eVRpY2tldEFtb3VudAIYdGlja2V0cyB5b3UgbmVlZCB0byBwYXkgCQCkAwEFFWJ1eVByaWNlV2l0aENvbWlzc2lvbgUMYnV5QXNzZXROYW1lBBh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEGtleVVzZXJIQ1RpY2tldHMCAAQWbGFzdEJvdWdodFRpY2tldE51bWJlcgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIEC2JvdWdodFJhbmdlCQCsAgIJAKwCAgkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgABAgEtCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBQ9idXlUaWNrZXRBbW91bnQEG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwkArAICBRh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMDCQECIT0CBRh1c2VyQm91Z2h0VGlja2V0c051bWJlcnMCAAkArAICAgEsBQtib3VnaHRSYW5nZQkArAICAgAFC2JvdWdodFJhbmdlBANpbnYDCQAAAgUKYnV5QXNzZXRJZAUEVVNETgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGxvY2tOZXV0cmlubwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQlwbXRBbW91bnQFA25pbAAAAwkAAAIFA2ludgUDaW52BAliYXNlRW50cnkJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQJAGQCBRVib3VnaHRIQ1RpY2tldHNBbW91bnQFD2J1eVRpY2tldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBQ9idXlUaWNrZXRBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEGtleVVzZXJIQ1RpY2tldHMFG25ld1VzZXJCb3VnaHRUaWNrZXRzTnVtYmVycwUDbmlsBQtjaGFuZ2VFbnRyeQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAkAzggCBQliYXNlRW50cnkJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDGtleVVzZXJSZWZJZAUFcmVmSWQFA25pbAUJYmFzZUVudHJ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZpbmFsaXNlAwtsYXVuY2hwYWRJZAl2cmZIZWlnaHQKc2VjcmV0V29yZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQQJc2F2ZWRIYXNoCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gECGNhbGNIYXNoCQDYBAEJAPcDAQkAywECCQCaAwEFCXZyZkhlaWdodAkAmwMBBQpzZWNyZXRXb3JkAwkBAiE9AgUIY2FsY0hhc2gFCXNhdmVkSGFzaAkAAgECHHZyZiBIZWlnaHQgaGFzaCBub3QgbWF0Y2hpbmcEDSR0MDI1NTg4MjU3MzgJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMjU1ODgyNTczOAJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDI1NTg4MjU3MzgCXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDI1NTg4MjU3MzgCXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAyNTU4ODI1NzM4Al80BA5wcm9qZWN0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBZGRyZXNzBApjb21taXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgQMY29tbWlzc2lvbkhDCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbgQSdHJhbnNmZXJlZEJ1eUFzc2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUTa2V5VHJhbnNmZXJCdXlBc3NldAAABBtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUaa2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGQEFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRxrZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZEhDAAAEFnN3b3BmaU1lbWJlcnNDb21pc3Npb24JAGsDBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFCmNvbW1pc3Npb24AZAQRc3dvcGZpSENDb21pc3Npb24JAGsDBRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BQxjb21taXNzaW9uSEMAZAQedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFJWtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmdGaW5hbGl6ZWQEEm1hcmtldGluZ0NvbWlzc2lvbgkAawMFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUKY29tbWlzc2lvbgBkBA11bnN0YWtlQW1vdW50CQBlAgkAZAIJAGQCCQBkAgkAZAIJAGQCBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUWc3dvcGZpTWVtYmVyc0NvbWlzc2lvbgUSbWFya2V0aW5nQ29taXNzaW9uBRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BRFzd29wZmlIQ0NvbWlzc2lvbgUSdHJhbnNmZXJlZEJ1eUFzc2V0AwkAZgIFEnRyYW5zZmVyZWRCdXlBc3NldAkAZAIJAGQCBRtzd29wZmlNZW1iZXJzQnV5QXNzZXRBbW91bnQFHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwUWc3dvcGZpSENCdXlBc3NldEFtb3VudAkAAgECKENhbid0IHRyYW5zZmVyIG5lZ2F0aXZlIHZhbHVlIHRvIHByb2plY3QEA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUNdW5zdGFrZUFtb3VudAkAzAgCCQDYBAEFBFVTRE4FA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAURa2V5RmluYWxpc2VIZWlnaHQFBmhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5wcm9qZWN0QWRkcmVzcwkAZQIJAGQCCQBkAgUbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50BRZzd29wZmlIQ0J1eUFzc2V0QW1vdW50BR50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFEnRyYW5zZmVyZWRCdXlBc3NldAUKYnV5QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRBjb21taXNzaW9uV2FsbGV0CQBkAgkAZAIFFnN3b3BmaU1lbWJlcnNDb21pc3Npb24FEm1hcmtldGluZ0NvbWlzc2lvbgURc3dvcGZpSENDb21pc3Npb24FCmJ1eUFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQELbGF1bmNocGFkSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDWJvdWdodFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJCb3VnaHRUaWNrZXRzQW1vdW50AAAED2JvdWdodEhDVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAAABBFib3VnaHRBbGxvY2F0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zAAAED3VzZXJDbGFpbVN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckNsYWltU3RhdHVzBwQOZmluYWxpemVIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRFrZXlGaW5hbGlzZUhlaWdodAAAAwkAAAIFDmZpbmFsaXplSGVpZ2h0AAAJAAIBAjFZb3UgY2FuJ3QgY2xhaW0gYmVjYXVzZSByZXN1bHRzIGFyZSBub3QgZmluYWxpemVkAwUPdXNlckNsYWltU3RhdHVzCQACAQIXWW91IGFyZSBhbHJlYWR5IGNsYWltZWQDAwMJAAACBQ1ib3VnaHRUaWNrZXRzAAAJAAACBRFib3VnaHRBbGxvY2F0aW9ucwAABwkAAAIFD2JvdWdodEhDVGlja2V0cwAABwkAAgECLllvdSBjYW4ndCBjbGFpbSBiZWNhdXNlIHlvdSBkb24ndCBidXkgYW55dGhpbmcEDSR0MDI4ODIyMjg5OTkJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuCQDYBAEFBFVTRE4ECmJ1eUFzc2V0SWQIBQ0kdDAyODgyMjI4OTk5Al8xBA1idXlBc3NldFN0cklkCAUNJHQwMjg4MjIyODk5OQJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMjg4MjIyODk5OQJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDI4ODIyMjg5OTkCXzQEDXdvbm5lZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGmtleVVzZXJXaW5uZWRUaWNrZXRzQW1vdW50AAAED3dvbm5lZEhDVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUpa2V5VXNlcldpbm5lZEhpZ2hDb21wZXRpdGlvblRpY2tldHNBbW91bnQAAAQUYXdhaWxhYmxlQWxsb2NhdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwAABApjb21taXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgQMY29tbWlzc2lvbkhDCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uAAAEEmFsbG93ZWRBbGxvY2F0aW9ucwkAlwMBCQDMCAIFEWJvdWdodEFsbG9jYXRpb25zCQDMCAIFFGF3YWlsYWJsZUFsbG9jYXRpb25zBQNuaWwECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMjk5MTUzMDA1OQkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAyOTkxNTMwMDU5Al8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAyOTkxNTMwMDU5Al8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDI5OTE1MzAwNTkCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAyOTkxNTMwMDU5Al80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTdG9rZW5zUGVyQWxsb2NhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uBBR0cmFuc2ZlclRva2Vuc0Ftb3VudAkAZAIJAGQCCQBoAgUNd29ubmVkVGlja2V0cwUPdG9rZW5zUGVyVGlja2V0CQBoAgUSYWxsb3dlZEFsbG9jYXRpb25zBRN0b2tlbnNQZXJBbGxvY2F0aW9uCQBoAgUPd29ubmVkSENUaWNrZXRzBQ90b2tlbnNQZXJUaWNrZXQEG25vdEFsbG93ZWRBbGxvY2F0aW9uc1Rva2VucwkAaAIJAGUCBRFib3VnaHRBbGxvY2F0aW9ucwUSYWxsb3dlZEFsbG9jYXRpb25zBRN0b2tlbnNQZXJBbGxvY2F0aW9uBBZidXlBc3NldEZvckFsbG9jYXRpb25zCQBrAwkAawMFG25vdEFsbG93ZWRBbGxvY2F0aW9uc1Rva2VucwUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgkAZAIAZAUKY29tbWlzc2lvbgBkBBpidXlBc3NldEZvclVud29ubmVkVGlja2V0cwkAawMJAGgCCQBlAgUNYm91Z2h0VGlja2V0cwUNd29ubmVkVGlja2V0cwULdGlja2V0UHJpY2UJAGQCAGQFCmNvbW1pc3Npb24AZAQcYnV5QXNzZXRGb3JIQ1Vud29ubmVkVGlja2V0cwkAawMJAGgCCQBlAgUPYm91Z2h0SENUaWNrZXRzBQ93b25uZWRIQ1RpY2tldHMFC3RpY2tldFByaWNlCQBkAgBkBQxjb21taXNzaW9uSEMAZAQPY2xhaW1lZEJ1eVRva2VuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRdrZXlVc2VyQ2xhaW1lZEJ1eVRva2VucwAAAwMDCQBmAgAABRZidXlBc3NldEZvckFsbG9jYXRpb25zBgkAZgIAAAUaYnV5QXNzZXRGb3JVbndvbm5lZFRpY2tldHMGCQBmAgAABRxidXlBc3NldEZvckhDVW53b25uZWRUaWNrZXRzCQACAQJSRXJyb3Igd2l0aCBhbGxvd2VkIGFsbG9jYXRpb24gcGFyYW0gb3Igd29ubmVkIHRpY2tldHMgcGFyYW0gcGxlYXNlIGNvbnRhY3Qgc3VwcG9ydAQWcmV0dXJuZWRCdXlBc3NldEFtb3VudAkAZQIJAGQCCQBkAgUaYnV5QXNzZXRGb3JVbndvbm5lZFRpY2tldHMFHGJ1eUFzc2V0Rm9ySENVbndvbm5lZFRpY2tldHMFFmJ1eUFzc2V0Rm9yQWxsb2NhdGlvbnMFD2NsYWltZWRCdXlUb2tlbgQQdHJhbnNmZXJCdXlBc3NldAMJAGYCBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50BQpidXlBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUXa2V5VXNlckNsYWltZWRCdXlUb2tlbnMFFnJldHVybmVkQnV5QXNzZXRBbW91bnQFA25pbAUDbmlsBANpbnYDAwkAZgIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQAAAkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4HCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAkAzAgCCQDYBAEFBFVTRE4FA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYEDWNsYWltZWRQYXJhbXMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleUNsYWltUGFyYW1zAghjbGFpbUFsbAIBLAMJAAACCQCRAwIFDWNsYWltZWRQYXJhbXMAAAIIY2xhaW1BbGwEDnRyYW5zZmVyVG9rZW5zAwkAZgIFFHRyYW5zZmVyVG9rZW5zQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUHdG9rZW5JZAUDbmlsBQNuaWwJAM4IAgkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckNsYWltU3RhdHVzBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFFGtleVVzZXJDbGFpbWVkVG9rZW5zBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUDbmlsBQ50cmFuc2ZlclRva2VucwUQdHJhbnNmZXJCdXlBc3NldAMJAAACCQCRAwIFDWNsYWltZWRQYXJhbXMAAAILY2xhaW1QZXJpb2QEDWNsYWltZWRUb2tlbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFFGtleVVzZXJDbGFpbWVkVG9rZW5zAAAEDHVubG9ja1BlcmlvZAkBBXZhbHVlAQkAtgkBCQCRAwIFDWNsYWltZWRQYXJhbXMAAgQLYmxvY2tIZWlnaHQJAGQCCQEFdmFsdWUBCQC2CQEJAJEDAgUNY2xhaW1lZFBhcmFtcwADBQ5maW5hbGl6ZUhlaWdodAQMdW5sb2NrSGVpZ2h0CQBkAgUMdW5sb2NrUGVyaW9kBQtibG9ja0hlaWdodAQSYWxsb3dlZFN0YXJ0QW1vdW50CQBrAwUUdHJhbnNmZXJUb2tlbnNBbW91bnQJAQV2YWx1ZQEJALYJAQkAkQMCBQ1jbGFpbWVkUGFyYW1zAAEAZAQTYWxsb3dlZFRva2Vuc0Ftb3VudAkAZAIFEmFsbG93ZWRTdGFydEFtb3VudAMJAGYCBQZoZWlnaHQFC2Jsb2NrSGVpZ2h0CQBlAgkAawMJAGUCBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAUSYWxsb3dlZFN0YXJ0QW1vdW50CQBlAgkAlwMBCQDMCAIFBmhlaWdodAkAzAgCBQx1bmxvY2tIZWlnaHQFA25pbAULYmxvY2tIZWlnaHQFDHVubG9ja1BlcmlvZAUNY2xhaW1lZFRva2VucwkAZQIAAAUNY2xhaW1lZFRva2VucwQQY2xhaW1TdGF0dXNFbnRyeQMJAGcCBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAkAZAIFDWNsYWltZWRUb2tlbnMFE2FsbG93ZWRUb2tlbnNBbW91bnQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyQ2xhaW1TdGF0dXMGBQNuaWwFA25pbAMDCQBmAgUTYWxsb3dlZFRva2Vuc0Ftb3VudAAABgkAZgIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQAAAQOdHJhbnNmZXJUb2tlbnMDCQBmAgUTYWxsb3dlZFRva2Vuc0Ftb3VudAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUUa2V5VXNlckNsYWltZWRUb2tlbnMJAGQCBQ1jbGFpbWVkVG9rZW5zBRNhbGxvd2VkVG9rZW5zQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUTYWxsb3dlZFRva2Vuc0Ftb3VudAUHdG9rZW5JZAUDbmlsBQNuaWwJAM4IAgUQdHJhbnNmZXJCdXlBc3NldAUOdHJhbnNmZXJUb2tlbnMJAAIBAhBOb3RoaW5nIHRvIGNsYWltCQACAQIWVW5rbm93biBjbGFpbSBmdW5jdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjbGFpbUZyZWV6ZVRva2VuAQtsYXVuY2hwYWRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQVZnJlZXplQWRkaXRpb25hbFRva2VuCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUYa2V5RnJlZXplQWRkaXRpb25hbFRva2VuBwMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRFrZXlGaW5hbGlzZUhlaWdodAkAAgECMVlvdSBjYW4ndCBjbGFpbSBiZWNhdXNlIHJlc3VsdHMgYXJlIG5vdCBmaW5hbGl6ZWQDCQEBIQEFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkAAgECOVRoZXJlIGFyZSBubyBhZGRpdGlvbmFsIHRva2VuIGZyZWV6aW5nIGZvciB0aGlzIGxhdW5jaHBhZAQHdG9rZW5JZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleUZyZWV6ZVRva2VuSWQEEXVzZXJUb2tlbnNGcmVlemVkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyRnJlZXplVG9rZW4AAAQLc3RhcnRIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlTdGFydEhlaWdodAAABAhkdXJhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uAAAEE2ZyZWV6ZVRva2VuRHVyYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgQOYmxvY2tFbmRIZWlnaHQJAGQCCQBkAgULc3RhcnRIZWlnaHQFCGR1cmF0aW9uBRNmcmVlemVUb2tlbkR1cmF0aW9uAwkAAAIFEXVzZXJUb2tlbnNGcmVlemVkAAAJAAIBAjhZb3UgYXJlIGFscmVhZHkgY2xhaW1lZCB5b3VyIHRva2VucyBvciBub3QgcGFpZCBhbnl0aGluZwMJAGYCBQ5ibG9ja0VuZEhlaWdodAUGaGVpZ2h0CQACAQkArAICAhlZb3VyIHRva2VucyBmcmVlemVkIHRlZWwgCQCkAwEFDmJsb2NrRW5kSGVpZ2h0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgURdXNlclRva2Vuc0ZyZWV6ZWQFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlVc2VyRnJlZXplVG9rZW4AAAUDbmlsAWkBEHRyYW5zZmVyQnV5QXNzZXQCC2xhdW5jaHBhZElkBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQQOcHJvamVjdEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUKa2V5QWRkcmVzcwQNJHQwMzYyMjQzNjM3NAkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQEFdmFsdWUBCQCdCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAULa2V5QnV5VG9rZW4ECmJ1eUFzc2V0SWQIBQ0kdDAzNjIyNDM2Mzc0Al8xBA1idXlBc3NldFN0cklkCAUNJHQwMzYyMjQzNjM3NAJfMgQMYnV5QXNzZXROYW1lCAUNJHQwMzYyMjQzNjM3NAJfMwQQYnV5QXNzZXREZWNpbWFscwgFDSR0MDM2MjI0MzYzNzQCXzQEEnRyYW5zZmVyZWRCdXlBc3NldAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRyYW5zZmVyQnV5QXNzZXQAAAQDaW52AwMJAGYCBQZhbW91bnQAAAkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4HCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIOdW5sb2NrTmV1dHJpbm8JAMwIAgUGYW1vdW50CQDMCAIJANgEAQUEVVNETgUDbmlsBQNuaWwAAAMJAAACBQNpbnYFA2ludgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUcmFuc2ZlckJ1eUFzc2V0CQBkAgUSdHJhbnNmZXJlZEJ1eUFzc2V0BQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOcHJvamVjdEFkZHJlc3MFBmFtb3VudAUKYnV5QXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQUGYWN0aXZlCQACAQIVREFwcCBhbHJlYWR5IGluYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQlrZXlBY3RpdmUHBQNuaWwBaQEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwUGYWN0aXZlCQACAQITREFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUJa2V5QWN0aXZlBgUDbmlsAQJ0eAEGdmVyaWZ5AAQTbXVsdGlTaWduZWRCeUFkbWlucwQSYWRtaW5QdWJLZXkxU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUMYWRtaW5QdWJLZXkxAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUMYWRtaW5QdWJLZXkyAAEAAAQSYWRtaW5QdWJLZXkzU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUMYWRtaW5QdWJLZXkzAAEAAAkAZwIJAGQCCQBkAgUSYWRtaW5QdWJLZXkxU2lnbmVkBRJhZG1pblB1YktleTJTaWduZWQFEmFkbWluUHViS2V5M1NpZ25lZAACBA1zaWduZWRCeUFkbWluAwMDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTIGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTMGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABRJhZG1pblB1YktleVN0YWtpbmcEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACD0RhdGFUcmFuc2FjdGlvbgQDZHR4BQckbWF0Y2gwAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFIWtleUxhdW5jaHBhZERhdGFUcmFuc2FjdGlvblN0YXR1cwcFDXNpZ25lZEJ5QWRtaW4HBRNtdWx0aVNpZ25lZEJ5QWRtaW5zsC5R7A==", "height": 2723185, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GwsfeCjPHUA2ZWTvfrdVFcd2TZ86yDRdhW4SUKY6VtLE Next: 6fXQU633NvXpTrp9JYc1tekuydQtKwEk2fu57G21dN1x Diff:
OldNewDifferences
286286 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
287287 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
288288 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
289- let $t01196513021 = if ((i.payments[0].assetId == unit))
289+ let $t01196513019 = if ((i.payments[0].assetId == unit))
290290 then {
291291 let amntToGet = {
292292 let @ = ({
293- let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
293+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), base58'']], nil)
294294 if ($isInstanceOf(@, "List[Any]"))
295295 then @
296296 else throw(($getType(@) + " couldn't be cast to List[Any]"))
332332 else throw("Strict value is not equal to itself.")
333333 }
334334 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
335- let pmtAmount = $t01196513021._1
336- let pmtAssetId = $t01196513021._2
337- let changeEntry = $t01196513021._3
335+ let pmtAmount = $t01196513019._1
336+ let pmtAssetId = $t01196513019._2
337+ let changeEntry = $t01196513019._3
338338 if ((activeLaunchpadId != launchpadId))
339339 then throw("There is no active launchpad or this launchpad is ended")
340340 else if ((startHeight > height))
374374 then {
375375 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
376376 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
377- let $t01486414951 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
378- let pmtAmountFreeze = $t01486414951._1
379- let pmtAssetIdFreeze = $t01486414951._2
380- let $t01496815059 = getAssetInfo(pmtAssetId)
381- let pmtFreezeStrAssetId = $t01496815059._1
382- let pmtFreezeAssetName = $t01496815059._2
383- let pmtFreezeDecimals = $t01496815059._3
377+ let $t01486214949 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
378+ let pmtAmountFreeze = $t01486214949._1
379+ let pmtAssetIdFreeze = $t01486214949._2
380+ let $t01496615057 = getAssetInfo(pmtAssetId)
381+ let pmtFreezeStrAssetId = $t01496615057._1
382+ let pmtFreezeAssetName = $t01496615057._2
383+ let pmtFreezeDecimals = $t01496615057._3
384384 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
385385 if (if ((pmtFreezeStrAssetId != freezeTokenId))
386386 then true
414414
415415 @Callable(i)
416416 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
417- let $t01714517220 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
418- let pmtAmount = $t01714517220._1
419- let pmtAssetId = $t01714517220._2
420- let $t01722517375 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
421- let buyAssetId = $t01722517375._1
422- let buyAssetStrId = $t01722517375._2
423- let buyAssetName = $t01722517375._3
424- let buyAssetDecimals = $t01722517375._4
417+ let $t01714317218 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
418+ let pmtAmount = $t01714317218._1
419+ let pmtAssetId = $t01714317218._2
420+ let $t01722317373 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
421+ let buyAssetId = $t01722317373._1
422+ let buyAssetStrId = $t01722317373._2
423+ let buyAssetName = $t01722317373._3
424+ let buyAssetDecimals = $t01722317373._4
425425 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
426426 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
427427 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
428428 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
429429 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
430430 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
431- let $t01804418188 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
432- let tokenId = $t01804418188._1
433- let tokenStrAssetId = $t01804418188._2
434- let tokenAssetName = $t01804418188._3
435- let tokenDecimals = $t01804418188._4
431+ let $t01804218186 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
432+ let tokenId = $t01804218186._1
433+ let tokenStrAssetId = $t01804218186._2
434+ let tokenAssetName = $t01804218186._3
435+ let tokenDecimals = $t01804218186._4
436436 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
437437 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
438438 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
472472
473473 @Callable(i)
474474 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
475- let $t02044620596 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
476- let buyAssetId = $t02044620596._1
477- let buyAssetStrId = $t02044620596._2
478- let buyAssetName = $t02044620596._3
479- let buyAssetDecimals = $t02044620596._4
475+ let $t02044420594 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
476+ let buyAssetId = $t02044420594._1
477+ let buyAssetStrId = $t02044420594._2
478+ let buyAssetName = $t02044420594._3
479+ let buyAssetDecimals = $t02044420594._4
480480 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
481481 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
482482 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
483483 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
484484 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
485485 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
486- let $t02120621350 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
487- let tokenId = $t02120621350._1
488- let tokenStrAssetId = $t02120621350._2
489- let tokenAssetName = $t02120621350._3
490- let tokenDecimals = $t02120621350._4
486+ let $t02120421348 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
487+ let tokenId = $t02120421348._1
488+ let tokenStrAssetId = $t02120421348._2
489+ let tokenAssetName = $t02120421348._3
490+ let tokenDecimals = $t02120421348._4
491491 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
492492 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
493- let $t02158322639 = if ((i.payments[0].assetId == unit))
493+ let $t02158122635 = if ((i.payments[0].assetId == unit))
494494 then {
495495 let amntToGet = {
496496 let @ = ({
497- let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
497+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), base58'']], nil)
498498 if ($isInstanceOf(@, "List[Any]"))
499499 then @
500500 else throw(($getType(@) + " couldn't be cast to List[Any]"))
536536 else throw("Strict value is not equal to itself.")
537537 }
538538 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
539- let pmtAmount = $t02158322639._1
540- let pmtAssetId = $t02158322639._2
541- let changeEntry = $t02158322639._3
539+ let pmtAmount = $t02158122635._1
540+ let pmtAssetId = $t02158122635._2
541+ let changeEntry = $t02158122635._3
542542 if ((activeLaunchpadId != launchpadId))
543543 then throw("There is no active launchpad or this launchpad is ended")
544544 else if (!(highCompetitionSale))
590590 if ((calcHash != savedHash))
591591 then throw("vrf Height hash not matching")
592592 else {
593- let $t02559225742 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
594- let buyAssetId = $t02559225742._1
595- let buyAssetStrId = $t02559225742._2
596- let buyAssetName = $t02559225742._3
597- let buyAssetDecimals = $t02559225742._4
593+ let $t02558825738 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
594+ let buyAssetId = $t02558825738._1
595+ let buyAssetStrId = $t02558825738._2
596+ let buyAssetName = $t02558825738._3
597+ let buyAssetDecimals = $t02558825738._4
598598 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
599599 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
600600 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
639639 else false)
640640 then throw("You can't claim because you don't buy anything")
641641 else {
642- let $t02882629003 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
643- let buyAssetId = $t02882629003._1
644- let buyAssetStrId = $t02882629003._2
645- let buyAssetName = $t02882629003._3
646- let buyAssetDecimals = $t02882629003._4
642+ let $t02882228999 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
643+ let buyAssetId = $t02882228999._1
644+ let buyAssetStrId = $t02882228999._2
645+ let buyAssetName = $t02882228999._3
646+ let buyAssetDecimals = $t02882228999._4
647647 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
648648 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
649649 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
652652 let allowedAllocations = min([boughtAllocations, awailableAllocations])
653653 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
654654 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
655- let $t02991930063 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
656- let tokenId = $t02991930063._1
657- let tokenStrAssetId = $t02991930063._2
658- let tokenAssetName = $t02991930063._3
659- let tokenDecimals = $t02991930063._4
655+ let $t02991530059 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
656+ let tokenId = $t02991530059._1
657+ let tokenStrAssetId = $t02991530059._2
658+ let tokenAssetName = $t02991530059._3
659+ let tokenDecimals = $t02991530059._4
660660 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
661661 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
662662 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
751751 @Callable(i)
752752 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
753753 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
754- let $t03622836378 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
755- let buyAssetId = $t03622836378._1
756- let buyAssetStrId = $t03622836378._2
757- let buyAssetName = $t03622836378._3
758- let buyAssetDecimals = $t03622836378._4
754+ let $t03622436374 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
755+ let buyAssetId = $t03622436374._1
756+ let buyAssetStrId = $t03622436374._2
757+ let buyAssetName = $t03622436374._3
758+ let buyAssetDecimals = $t03622436374._4
759759 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
760760 let inv = if (if ((amount > 0))
761761 then (buyAssetId == USDN)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let keyActive = "active"
55
66 let kActiveGlob = "active_all_contracts"
77
88 let keyAdminPubKey1 = "admin_pub_1"
99
1010 let keyAdminPubKey2 = "admin_pub_2"
1111
1212 let keyAdminPubKey3 = "admin_pub_3"
1313
1414 let keyLaunchpadDataTransactionStatus = "launchpad_data_transaction_status"
1515
1616 let keyLaunchpadNextId = "launchpad_next_id"
1717
1818 let keyLaunchpadActiveId = "launchpad_active_id"
1919
2020 let keyInitCaller = "init_caller"
2121
2222 let keyAddress = "_address"
2323
2424 let keyInitHeight = "_init_height"
2525
2626 let keyStartHeight = "_start_height"
2727
2828 let keyFinaliseHeight = "_finalise_height"
2929
3030 let keyComission = "_comission"
3131
3232 let keyAssetId = "_asset_id"
3333
3434 let keyTotalTokenAmount = "_total_token_amount"
3535
3636 let keyTotalAmountBuyAssetSold = "_total_buy_asset_sold"
3737
3838 let keyTokensPerTicket = "_tokens_per_ticket"
3939
4040 let keyPricePerToken = "_price_per_token"
4141
4242 let keySwopPerTicket = "_swop_per_ticket"
4343
4444 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4545
4646 let keyCampaignTokensAmount = "_tokens_access_list"
4747
4848 let keyTokensPerAllocation = "_tokens_per_allocation"
4949
5050 let keyTicketLastNumber = "_ticket_last_number"
5151
5252 let keyGovernanceStaked = "_GSwop_amount"
5353
5454 let keyUserRefId = "_ref_id"
5555
5656 let keyVerifyHash = "_verify_hash"
5757
5858 let keyDuration = "_duration"
5959
6060 let keyAmountBuyAssetInMarketing = "_total_purchased_buy_asset_in_marketing"
6161
6262 let keyAmountBuyAssetInMarketingFinalized = "_total_purchased_buy_asset_in_marketing_finalized"
6363
6464 let keyTransferBuyAsset = "_transfer_buy_asset"
6565
6666 let keyFreezSwopDuration = "_freeze_swop_duration"
6767
6868 let keyFreezeAdditionalToken = "_freeze_additional_token"
6969
7070 let keyFreezeTokenId = "_freeze_token_id"
7171
7272 let keyFreezeTokenDuration = "_freeze_token_duration"
7373
7474 let keyFreezeTokenPerTicket = "_freeze_token_per_ticket"
7575
7676 let keyBuyToken = "_buy_token"
7777
7878 let keyClaimParams = "_claim_params"
7979
8080 let keyHighCompetitionComission = "_high_competition_comission"
8181
8282 let keyHighCompetitionSale = "_high_competition_sale"
8383
8484 let keyHCTicketLastNumber = "_high_competition_ticket_last_number"
8585
8686 let keyHighCompetitionAmount = "_tickets_high_competition"
8787
8888 let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
8989
9090 let keyUserClaimedTokens = "_claimed_tokens"
9191
9292 let keyUserClaimedBuyTokens = "_claimed_buy_tokens"
9393
9494 let keyUserBoughtTicketsAmount = "_bought_tickets"
9595
9696 let keyUserTickets = "_tickets_number"
9797
9898 let keyUserHCTickets = "_tickets_number_high_competition"
9999
100100 let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
101101
102102 let keyUserAvailableAllocations = "_available_purchase_marketing"
103103
104104 let keyUserAmountBuyAssetInMarketing = "_purchased_buy_asset_in_marketing"
105105
106106 let keyUserBoughtAllocations = "_bought_allocations"
107107
108108 let keyUserClaimStatus = "_claim_status"
109109
110110 let keyUserWinnedTicketsAmount = "_tickets_result"
111111
112112 let keyUserWinnedHighCompetitionTicketsAmount = "_tickets_result_high_competition"
113113
114114 let keyUserFreezeToken = "_freeze_token_amount"
115115
116116 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
117117
118118 let governance = Address(base58'3N8E9LU71MDkdP8FWtbP4TBXCNhoc15hWfs')
119119
120120 let commissionWallet = Address(base58'3N2eueE5vLLKe8jXuBDbdbKcPaH36yG1Had')
121121
122122 let stakingUSDNAddress = Address(base58'3N8STSY7dWpBYLiCimEQMkRizyWePSX3qQx')
123123
124124 let USDN = base58'4W19ndijcc2CsQa9HGW2dfXKTVXhnneWWttxXrtjPmEp'
125125
126126 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
127127
128128 let WAVES_XTN_EX = Address(base58'3MqjSoPUdGHaan9uhxwTnFw1uH7uZ8dgt8f')
129129
130130 let maxAllocationsAmount = 2
131131
132132 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
133133
134134 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
135135 case string: String =>
136136 fromBase58String(string)
137137 case nothing =>
138138 throw("Admin public key is empty")
139139 }
140140
141141
142142 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
143143
144144 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
145145
146146 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
147147
148148 func getAssetInfo (assetId) = match assetId {
149149 case id: ByteVector =>
150150 let stringId = toBase58String(id)
151151 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
152152 $Tuple3(stringId, info.name, info.decimals)
153153 case waves: Unit =>
154154 $Tuple3("WAVES", "WAVES", 8)
155155 case _ =>
156156 throw("Match error")
157157 }
158158
159159
160160 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
161161
162162
163163 func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
164164
165165
166166 let active = valueOrElse(getBoolean(this, keyActive), true)
167167
168168 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
169169
170170 func isActive () = if (if (active)
171171 then activeGlob
172172 else false)
173173 then unit
174174 else throw("DApp is inactive at this moment")
175175
176176
177177 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
178178 then unit
179179 else throw("Only admin can call this function")
180180
181181
182182 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
183183 then $Tuple4(unit, "WAVES", "WAVES", 8)
184184 else {
185185 let stringId = assetStr
186186 let id = fromBase58String(assetStr)
187187 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
188188 $Tuple4(id, stringId, info.name, info.decimals)
189189 }
190190
191191
192192 func buyInWaves (launchpadId,ticketsAmount,type) = {
193193 let $t051595309 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
194194 let buyAssetId = $t051595309._1
195195 let buyAssetStrId = $t051595309._2
196196 let buyAssetName = $t051595309._3
197197 let buyAssetDecimals = $t051595309._4
198198 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
199199 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
200200 let $t054915635 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
201201 let tokenId = $t054915635._1
202202 let tokenStrAssetId = $t054915635._2
203203 let tokenAssetName = $t054915635._3
204204 let tokenDecimals = $t054915635._4
205205 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
206206 let commissionPerTicket = if ((type == 1))
207207 then fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
208208 else fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
209209 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
210210 let amntToPay = {
211211 let @ = ({
212212 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
213213 if ($isInstanceOf(@, "List[Any]"))
214214 then @
215215 else throw(($getType(@) + " couldn't be cast to List[Any]"))
216216 })[0]
217217 if ($isInstanceOf(@, "Int"))
218218 then @
219219 else throw(($getType(@) + " couldn't be cast to Int"))
220220 }
221221 if ((amntToPay == amntToPay))
222222 then fraction(amntToPay, 101, 100)
223223 else throw("Strict value is not equal to itself.")
224224 }
225225
226226
227227 @Callable(i)
228228 func hashingRandom (launchpadId,hash) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]))
229229
230230
231231
232232 @Callable(i)
233233 func initCaller (address) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry(keyInitCaller, address)]))
234234
235235
236236
237237 @Callable(i)
238238 func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = valueOrElse(isActive(), if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
239239 then throw("Only project admin can call init function")
240240 else if ((size(i.payments) != 1))
241241 then throw("One attached payment expected")
242242 else if ((height > startHeight))
243243 then throw("Start height must be greater than blockchain height")
244244 else if (if (freezeAdditionalToken)
245245 then (size(freezeParams) != 3)
246246 else false)
247247 then throw("Freeze params list must have 3 items")
248248 else {
249249 let launchpadId = getLaunchpadNextId()
250250 let launchpadIdStr = toString(launchpadId)
251251 let $t077897864 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
252252 let pmtAmount = $t077897864._1
253253 let pmtAssetId = $t077897864._2
254254 let $t078737946 = getAssetInfo(pmtAssetId)
255255 let pmtStrAssetId = $t078737946._1
256256 let pmtAssetName = $t078737946._2
257257 let pmtDecimals = $t078737946._3
258258 let freezeAdditionalEntry = if (freezeAdditionalToken)
259259 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
260260 else nil
261261 ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), duration), StringEntry((launchpadIdStr + keyBuyToken), buyToken), IntegerEntry((launchpadIdStr + keyFreezSwopDuration), swopFreezeDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyHCTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry((launchpadIdStr + keyHighCompetitionComission), highCompetitionComission), IntegerEntry((launchpadIdStr + keyHighCompetitionAmount), highCompetitionTicketsAmount), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
262262 })
263263
264264
265265
266266 @Callable(i)
267267 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
268268 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
269269 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
270270 let $t01072910873 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
271271 let tokenId = $t01072910873._1
272272 let tokenStrAssetId = $t01072910873._2
273273 let tokenAssetName = $t01072910873._3
274274 let tokenDecimals = $t01072910873._4
275275 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
276276 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
277277 let $t01109011240 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
278278 let buyAssetId = $t01109011240._1
279279 let buyAssetStrId = $t01109011240._2
280280 let buyAssetName = $t01109011240._3
281281 let buyAssetDecimals = $t01109011240._4
282282 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
283283 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
284284 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
285285 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
286286 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
287287 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
288288 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
289- let $t01196513021 = if ((i.payments[0].assetId == unit))
289+ let $t01196513019 = if ((i.payments[0].assetId == unit))
290290 then {
291291 let amntToGet = {
292292 let @ = ({
293- let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
293+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), base58'']], nil)
294294 if ($isInstanceOf(@, "List[Any]"))
295295 then @
296296 else throw(($getType(@) + " couldn't be cast to List[Any]"))
297297 })[0]
298298 if ($isInstanceOf(@, "Int"))
299299 then @
300300 else throw(($getType(@) + " couldn't be cast to Int"))
301301 }
302302 if ((amntToGet == amntToGet))
303303 then {
304304 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
305305 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
306306 let amntToPay = {
307307 let @ = ({
308308 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
309309 if ($isInstanceOf(@, "List[Any]"))
310310 then @
311311 else throw(($getType(@) + " couldn't be cast to List[Any]"))
312312 })[0]
313313 if ($isInstanceOf(@, "Int"))
314314 then @
315315 else throw(($getType(@) + " couldn't be cast to Int"))
316316 }
317317 if ((amntToPay == amntToPay))
318318 then {
319319 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
320320 if ((ex == ex))
321321 then {
322322 let change = (i.payments[0].amount - amntToGetTickets)
323323 let cEntry = if ((change > 0))
324324 then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
325325 else nil
326326 $Tuple3(amntToGetTickets, buyAssetId, cEntry)
327327 }
328328 else throw("Strict value is not equal to itself.")
329329 }
330330 else throw("Strict value is not equal to itself.")
331331 }
332332 else throw("Strict value is not equal to itself.")
333333 }
334334 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
335- let pmtAmount = $t01196513021._1
336- let pmtAssetId = $t01196513021._2
337- let changeEntry = $t01196513021._3
335+ let pmtAmount = $t01196513019._1
336+ let pmtAssetId = $t01196513019._2
337+ let changeEntry = $t01196513019._3
338338 if ((activeLaunchpadId != launchpadId))
339339 then throw("There is no active launchpad or this launchpad is ended")
340340 else if ((startHeight > height))
341341 then throw("Launchpad sale not started yet")
342342 else if ((height > (startHeight + duration)))
343343 then throw("Launchpad sale ended")
344344 else if (if (!(freezeAdditionalToken))
345345 then if ((size(i.payments) != 1))
346346 then true
347347 else (pmtAssetId != buyAssetId)
348348 else false)
349349 then throw((("One attached payment in " + buyAssetName) + " expected"))
350350 else if (if (freezeAdditionalToken)
351351 then if ((size(i.payments) != 2))
352352 then true
353353 else (pmtAssetId != buyAssetId)
354354 else false)
355355 then {
356356 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
357357 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
358358 }
359359 else if (if ((0 >= allowedTicketsAmountAll))
360360 then true
361361 else (0 >= allowedTicketsAmount))
362362 then throw("Not enought SWOP in staking to buy tickets")
363363 else {
364364 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
365365 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
366366 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
367367 let change = (pmtAmount - allowedBuyPriceWithComission)
368368 if ((buyTicketAmount == 0))
369369 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
370370 else if ((change != 0))
371371 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
372372 else {
373373 let freezeAdditionalEntry = if (freezeAdditionalToken)
374374 then {
375375 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
376376 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
377- let $t01486414951 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
378- let pmtAmountFreeze = $t01486414951._1
379- let pmtAssetIdFreeze = $t01486414951._2
380- let $t01496815059 = getAssetInfo(pmtAssetId)
381- let pmtFreezeStrAssetId = $t01496815059._1
382- let pmtFreezeAssetName = $t01496815059._2
383- let pmtFreezeDecimals = $t01496815059._3
377+ let $t01486214949 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
378+ let pmtAmountFreeze = $t01486214949._1
379+ let pmtAssetIdFreeze = $t01486214949._2
380+ let $t01496615057 = getAssetInfo(pmtAssetId)
381+ let pmtFreezeStrAssetId = $t01496615057._1
382+ let pmtFreezeAssetName = $t01496615057._2
383+ let pmtFreezeDecimals = $t01496615057._3
384384 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
385385 if (if ((pmtFreezeStrAssetId != freezeTokenId))
386386 then true
387387 else (needFreezeTokens != pmtAmountFreeze))
388388 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
389389 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
390390 }
391391 else nil
392392 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
393393 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
394394 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
395395 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
396396 then ("," + boughtRange)
397397 else ("" + boughtRange)))
398398 let inv = if ((buyAssetId == USDN))
399399 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
400400 else 0
401401 if ((inv == inv))
402402 then {
403403 let baseEntry = (([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTicketNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)] ++ freezeAdditionalEntry) ++ changeEntry)
404404 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
405405 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
406406 else baseEntry
407407 }
408408 else throw("Strict value is not equal to itself.")
409409 }
410410 }
411411 })
412412
413413
414414
415415 @Callable(i)
416416 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
417- let $t01714517220 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
418- let pmtAmount = $t01714517220._1
419- let pmtAssetId = $t01714517220._2
420- let $t01722517375 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
421- let buyAssetId = $t01722517375._1
422- let buyAssetStrId = $t01722517375._2
423- let buyAssetName = $t01722517375._3
424- let buyAssetDecimals = $t01722517375._4
417+ let $t01714317218 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
418+ let pmtAmount = $t01714317218._1
419+ let pmtAssetId = $t01714317218._2
420+ let $t01722317373 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
421+ let buyAssetId = $t01722317373._1
422+ let buyAssetStrId = $t01722317373._2
423+ let buyAssetName = $t01722317373._3
424+ let buyAssetDecimals = $t01722317373._4
425425 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
426426 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
427427 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
428428 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
429429 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
430430 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
431- let $t01804418188 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
432- let tokenId = $t01804418188._1
433- let tokenStrAssetId = $t01804418188._2
434- let tokenAssetName = $t01804418188._3
435- let tokenDecimals = $t01804418188._4
431+ let $t01804218186 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
432+ let tokenId = $t01804218186._1
433+ let tokenStrAssetId = $t01804218186._2
434+ let tokenAssetName = $t01804218186._3
435+ let tokenDecimals = $t01804218186._4
436436 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
437437 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
438438 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
439439 if ((activeLaunchpadId != launchpadId))
440440 then throw("There is no active launchpad or this launchpad is ended")
441441 else if ((startHeight > height))
442442 then throw("Launchpad sale not started yet")
443443 else if ((height > (startHeight + duration)))
444444 then throw("Launchpad sale ended")
445445 else if (if ((size(i.payments) != 1))
446446 then true
447447 else (pmtAssetId != buyAssetId))
448448 then throw((("One attached payment in " + buyAssetName) + " expected"))
449449 else if ((boughtAllocations >= maxAllocationsAmount))
450450 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
451451 else if (if ((allocationPriceWithComission != pmtAmount))
452452 then ((allocationPriceWithComission * 2) != pmtAmount)
453453 else false)
454454 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
455455 else {
456456 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
457457 let inv = if ((buyAssetId == USDN))
458458 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
459459 else 0
460460 if ((inv == inv))
461461 then {
462462 let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountBuyAssetInMarketing), (usdnInMarketing + pmtAmount))]
463463 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
464464 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
465465 else baseEntry
466466 }
467467 else throw("Strict value is not equal to itself.")
468468 }
469469 })
470470
471471
472472
473473 @Callable(i)
474474 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
475- let $t02044620596 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
476- let buyAssetId = $t02044620596._1
477- let buyAssetStrId = $t02044620596._2
478- let buyAssetName = $t02044620596._3
479- let buyAssetDecimals = $t02044620596._4
475+ let $t02044420594 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
476+ let buyAssetId = $t02044420594._1
477+ let buyAssetStrId = $t02044420594._2
478+ let buyAssetName = $t02044420594._3
479+ let buyAssetDecimals = $t02044420594._4
480480 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
481481 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
482482 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
483483 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
484484 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
485485 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
486- let $t02120621350 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
487- let tokenId = $t02120621350._1
488- let tokenStrAssetId = $t02120621350._2
489- let tokenAssetName = $t02120621350._3
490- let tokenDecimals = $t02120621350._4
486+ let $t02120421348 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
487+ let tokenId = $t02120421348._1
488+ let tokenStrAssetId = $t02120421348._2
489+ let tokenAssetName = $t02120421348._3
490+ let tokenDecimals = $t02120421348._4
491491 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
492492 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
493- let $t02158322639 = if ((i.payments[0].assetId == unit))
493+ let $t02158122635 = if ((i.payments[0].assetId == unit))
494494 then {
495495 let amntToGet = {
496496 let @ = ({
497- let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), buyAssetId]], nil)
497+ let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouGetREADONLY", [toString(i.payments[0].amount), base58'']], nil)
498498 if ($isInstanceOf(@, "List[Any]"))
499499 then @
500500 else throw(($getType(@) + " couldn't be cast to List[Any]"))
501501 })[0]
502502 if ($isInstanceOf(@, "Int"))
503503 then @
504504 else throw(($getType(@) + " couldn't be cast to Int"))
505505 }
506506 if ((amntToGet == amntToGet))
507507 then {
508508 let ticketsAmount = (amntToGet / (ticketPrice + commissionPerTicket))
509509 let amntToGetTickets = (ticketsAmount * (ticketPrice + commissionPerTicket))
510510 let amntToPay = {
511511 let @ = ({
512512 let @ = invoke(WAVES_XTN_EX, "callFunction", ["howManyYouPayREADONLY", [toString(amntToGetTickets), buyAssetId]], nil)
513513 if ($isInstanceOf(@, "List[Any]"))
514514 then @
515515 else throw(($getType(@) + " couldn't be cast to List[Any]"))
516516 })[0]
517517 if ($isInstanceOf(@, "Int"))
518518 then @
519519 else throw(($getType(@) + " couldn't be cast to Int"))
520520 }
521521 if ((amntToPay == amntToPay))
522522 then {
523523 let ex = invoke(WAVES_XTN_EX, "callFunction", ["exchange", [toString(amntToGetTickets)]], [AttachedPayment(unit, amntToPay)])
524524 if ((ex == ex))
525525 then {
526526 let change = (i.payments[0].amount - amntToGetTickets)
527527 let cEntry = if ((change > 0))
528528 then [ScriptTransfer(i.caller, change, i.payments[0].assetId)]
529529 else nil
530530 $Tuple3(amntToGetTickets, buyAssetId, cEntry)
531531 }
532532 else throw("Strict value is not equal to itself.")
533533 }
534534 else throw("Strict value is not equal to itself.")
535535 }
536536 else throw("Strict value is not equal to itself.")
537537 }
538538 else $Tuple3(i.payments[0].amount, i.payments[0].assetId, nil)
539- let pmtAmount = $t02158322639._1
540- let pmtAssetId = $t02158322639._2
541- let changeEntry = $t02158322639._3
539+ let pmtAmount = $t02158122635._1
540+ let pmtAssetId = $t02158122635._2
541+ let changeEntry = $t02158122635._3
542542 if ((activeLaunchpadId != launchpadId))
543543 then throw("There is no active launchpad or this launchpad is ended")
544544 else if (!(highCompetitionSale))
545545 then throw("There is no high competition sale for this launchpad")
546546 else if ((startHeight > height))
547547 then throw("Launchpad sale not started yet")
548548 else if ((height > (startHeight + duration)))
549549 then throw("Launchpad sale ended")
550550 else if (if ((size(i.payments) != 1))
551551 then true
552552 else (pmtAssetId != buyAssetId))
553553 then throw((("One attached payment in " + buyAssetName) + " expected"))
554554 else {
555555 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
556556 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
557557 let change = (pmtAmount - buyPriceWithComission)
558558 if ((buyTicketAmount == 0))
559559 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
560560 else if ((change != 0))
561561 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
562562 else {
563563 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
564564 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
565565 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
566566 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
567567 then ("," + boughtRange)
568568 else ("" + boughtRange)))
569569 let inv = if ((buyAssetId == USDN))
570570 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
571571 else 0
572572 if ((inv == inv))
573573 then {
574574 let baseEntry = ([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount), (boughtHCTicketsAmount + buyTicketAmount)), IntegerEntry((toString(launchpadId) + keyHCTicketLastNumber), (lastBoughtTicketNumber + buyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets), newUserBoughtTicketsNumbers)] ++ changeEntry)
575575 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
576576 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
577577 else baseEntry
578578 }
579579 else throw("Strict value is not equal to itself.")
580580 }
581581 }
582582 })
583583
584584
585585
586586 @Callable(i)
587587 func finalise (launchpadId,vrfHeight,secretWord) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
588588 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
589589 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
590590 if ((calcHash != savedHash))
591591 then throw("vrf Height hash not matching")
592592 else {
593- let $t02559225742 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
594- let buyAssetId = $t02559225742._1
595- let buyAssetStrId = $t02559225742._2
596- let buyAssetName = $t02559225742._3
597- let buyAssetDecimals = $t02559225742._4
593+ let $t02558825738 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
594+ let buyAssetId = $t02558825738._1
595+ let buyAssetStrId = $t02558825738._2
596+ let buyAssetName = $t02558825738._3
597+ let buyAssetDecimals = $t02558825738._4
598598 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
599599 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
600600 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
601601 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
602602 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
603603 let swopfiHCBuyAssetAmount = valueOrElse(getInteger(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
604604 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
605605 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
606606 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
607607 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
608608 let unstakeAmount = ((((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission) - transferedBuyAsset)
609609 if ((transferedBuyAsset > ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiHCBuyAssetAmount)))
610610 then throw("Can't transfer negative value to project")
611611 else {
612612 let inv = if ((buyAssetId == USDN))
613613 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
614614 else 0
615615 if ((inv == inv))
616616 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, (((swopfiMembersBuyAssetAmount + swopfiHCBuyAssetAmount) + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
617617 else throw("Strict value is not equal to itself.")
618618 }
619619 }
620620 }))
621621
622622
623623
624624 @Callable(i)
625625 func claim (launchpadId) = valueOrElse(isActive(), {
626626 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
627627 let boughtHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
628628 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
629629 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
630630 let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
631631 if ((finalizeHeight == 0))
632632 then throw("You can't claim because results are not finalized")
633633 else if (userClaimStatus)
634634 then throw("You are already claimed")
635635 else if (if (if ((boughtTickets == 0))
636636 then (boughtAllocations == 0)
637637 else false)
638638 then (boughtHCTickets == 0)
639639 else false)
640640 then throw("You can't claim because you don't buy anything")
641641 else {
642- let $t02882629003 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
643- let buyAssetId = $t02882629003._1
644- let buyAssetStrId = $t02882629003._2
645- let buyAssetName = $t02882629003._3
646- let buyAssetDecimals = $t02882629003._4
642+ let $t02882228999 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
643+ let buyAssetId = $t02882228999._1
644+ let buyAssetStrId = $t02882228999._2
645+ let buyAssetName = $t02882228999._3
646+ let buyAssetDecimals = $t02882228999._4
647647 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
648648 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
649649 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
650650 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
651651 let commissionHC = valueOrElse(getInteger(this, (toString(launchpadId) + keyHighCompetitionComission)), 0)
652652 let allowedAllocations = min([boughtAllocations, awailableAllocations])
653653 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
654654 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
655- let $t02991930063 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
656- let tokenId = $t02991930063._1
657- let tokenStrAssetId = $t02991930063._2
658- let tokenAssetName = $t02991930063._3
659- let tokenDecimals = $t02991930063._4
655+ let $t02991530059 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
656+ let tokenId = $t02991530059._1
657+ let tokenStrAssetId = $t02991530059._2
658+ let tokenAssetName = $t02991530059._3
659+ let tokenDecimals = $t02991530059._4
660660 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
661661 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
662662 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
663663 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
664664 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
665665 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
666666 let buyAssetForHCUnwonnedTickets = fraction(((boughtHCTickets - wonnedHCTickets) * ticketPrice), (100 + commissionHC), 100)
667667 let claimedBuyToken = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens)), 0)
668668 if (if (if ((0 > buyAssetForAllocations))
669669 then true
670670 else (0 > buyAssetForUnwonnedTickets))
671671 then true
672672 else (0 > buyAssetForHCUnwonnedTickets))
673673 then throw("Error with allowed allocation param or wonned tickets param please contact support")
674674 else {
675675 let returnedBuyAssetAmount = (((buyAssetForUnwonnedTickets + buyAssetForHCUnwonnedTickets) + buyAssetForAllocations) - claimedBuyToken)
676676 let transferBuyAsset = if ((returnedBuyAssetAmount > 0))
677677 then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens), returnedBuyAssetAmount)]
678678 else nil
679679 let inv = if (if ((returnedBuyAssetAmount > 0))
680680 then (buyAssetId == USDN)
681681 else false)
682682 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
683683 else 0
684684 if ((inv == inv))
685685 then {
686686 let claimedParams = split(valueOrElse(getString(this, (toString(launchpadId) + keyClaimParams)), "claimAll"), ",")
687687 if ((claimedParams[0] == "claimAll"))
688688 then {
689689 let transferTokens = if ((transferTokensAmount > 0))
690690 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
691691 else nil
692692 (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), transferTokensAmount)] ++ transferTokens) ++ transferBuyAsset)
693693 }
694694 else if ((claimedParams[0] == "claimPeriod"))
695695 then {
696696 let claimedTokens = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens)), 0)
697697 let unlockPeriod = value(parseInt(claimedParams[2]))
698698 let blockHeight = (value(parseInt(claimedParams[3])) + finalizeHeight)
699699 let unlockHeight = (unlockPeriod + blockHeight)
700700 let allowedStartAmount = fraction(transferTokensAmount, value(parseInt(claimedParams[1])), 100)
701701 let allowedTokensAmount = (allowedStartAmount + (if ((height > blockHeight))
702702 then (fraction((transferTokensAmount - allowedStartAmount), (min([height, unlockHeight]) - blockHeight), unlockPeriod) - claimedTokens)
703703 else (0 - claimedTokens)))
704704 let claimStatusEntry = if ((transferTokensAmount >= (claimedTokens + allowedTokensAmount)))
705705 then [BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)]
706706 else nil
707707 if (if ((allowedTokensAmount > 0))
708708 then true
709709 else (returnedBuyAssetAmount > 0))
710710 then {
711711 let transferTokens = if ((allowedTokensAmount > 0))
712712 then [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), (claimedTokens + allowedTokensAmount)), ScriptTransfer(i.caller, allowedTokensAmount, tokenId)]
713713 else nil
714714 (transferBuyAsset ++ transferTokens)
715715 }
716716 else throw("Nothing to claim")
717717 }
718718 else throw("Unknown claim function")
719719 }
720720 else throw("Strict value is not equal to itself.")
721721 }
722722 }
723723 })
724724
725725
726726
727727 @Callable(i)
728728 func claimFreezeToken (launchpadId) = valueOrElse(isActive(), {
729729 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
730730 if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
731731 then throw("You can't claim because results are not finalized")
732732 else if (!(freezeAdditionalToken))
733733 then throw("There are no additional token freezing for this launchpad")
734734 else {
735735 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
736736 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
737737 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
738738 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
739739 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
740740 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
741741 if ((userTokensFreezed == 0))
742742 then throw("You are already claimed your tokens or not paid anything")
743743 else if ((blockEndHeight > height))
744744 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
745745 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
746746 }
747747 })
748748
749749
750750
751751 @Callable(i)
752752 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
753753 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
754- let $t03622836378 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
755- let buyAssetId = $t03622836378._1
756- let buyAssetStrId = $t03622836378._2
757- let buyAssetName = $t03622836378._3
758- let buyAssetDecimals = $t03622836378._4
754+ let $t03622436374 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
755+ let buyAssetId = $t03622436374._1
756+ let buyAssetStrId = $t03622436374._2
757+ let buyAssetName = $t03622436374._3
758+ let buyAssetDecimals = $t03622436374._4
759759 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
760760 let inv = if (if ((amount > 0))
761761 then (buyAssetId == USDN)
762762 else false)
763763 then invoke(stakingUSDNAddress, "unlockNeutrino", [amount, toBase58String(USDN)], nil)
764764 else 0
765765 if ((inv == inv))
766766 then [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), (transferedBuyAsset + amount)), ScriptTransfer(projectAddress, amount, buyAssetId)]
767767 else throw("Strict value is not equal to itself.")
768768 }))
769769
770770
771771
772772 @Callable(i)
773773 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
774774 then throw("DApp already inactive")
775775 else [BooleanEntry(keyActive, false)])
776776
777777
778778
779779 @Callable(i)
780780 func activate () = valueOrElse(isAdminCall(i), if (active)
781781 then throw("DApp already active")
782782 else [BooleanEntry(keyActive, true)])
783783
784784
785785 @Verifier(tx)
786786 func verify () = {
787787 let multiSignedByAdmins = {
788788 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
789789 then 1
790790 else 0
791791 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
792792 then 1
793793 else 0
794794 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
795795 then 1
796796 else 0
797797 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
798798 }
799799 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
800800 then true
801801 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
802802 then true
803803 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
804804 then true
805805 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
806806 match tx {
807807 case dtx: DataTransaction =>
808808 if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
809809 then signedByAdmin
810810 else false
811811 case _ =>
812812 multiSignedByAdmins
813813 }
814814 }
815815

github/deemru/w8io/3ef1775 
177.12 ms