tx · 838d9aNBMi4kstg36zxLE49tezzDLvMamci9kRLAU3Eb

3Mqo3c7G5qkBfvMMLhriequKQFofhJSP9ip:  -0.06200000 Waves

2024.02.21 15:36 [2986007] smart account 3Mqo3c7G5qkBfvMMLhriequKQFofhJSP9ip > SELF 0.00000000 Waves

{ "type": 13, "id": "838d9aNBMi4kstg36zxLE49tezzDLvMamci9kRLAU3Eb", "fee": 6200000, "feeAssetId": null, "timestamp": 1708518915704, "version": 2, "chainId": 84, "sender": "3Mqo3c7G5qkBfvMMLhriequKQFofhJSP9ip", "senderPublicKey": "5A4c5wG6NUWakcEewdfBkkZSvSdZRqo9onS5bqQrv3x1", "proofs": [ "4ytoRcjJhbBRsKumrTEVK3h2tgFQwxPqkntAr4YxiCMB5SFrfQv3wQHFKsSGevVyaHVpaapK2WmmD1bZqbavyuRV" ], "script": "base64:BgKhAQgCEgASBQoDAQQBEgcKBQEEAQgBEgQKAgEEEgMKAQESBAoCAQQSBAoCCAESBAoCCAESBAoCCAESBQoDAQgBEgASBAoCAQESAwoBARIFCgMBAQESBAoCCAgSABIAEgMKAQgSBQoDAQEBEgQKAgEBEgQKAggBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgASAwoBARIDCgEBEgQKAggBhAEACmxQZGVjaW1hbHMACAAGc2NhbGU4AIDC1y8ADHNjYWxlOEJpZ0ludAkAtgIBAIDC1y8AB3NjYWxlMTgJALYCAQCAgJC7utat8A0ACnplcm9CaWdJbnQJALYCAQAAAARiaWcwCQC2AgEAAAAEYmlnMQkAtgIBAAEABGJpZzIJALYCAQACAAt3YXZlc1N0cmluZwIFV0FWRVMAA1NFUAICX18AClBvb2xBY3RpdmUAAQAPUG9vbFB1dERpc2FibGVkAAIAE1Bvb2xNYXRjaGVyRGlzYWJsZWQAAwAMUG9vbFNodXRkb3duAAQADmlkeFBvb2xBZGRyZXNzAAEADWlkeFBvb2xTdGF0dXMAAgAQaWR4UG9vbExQQXNzZXRJZAADAA1pZHhBbXRBc3NldElkAAQAD2lkeFByaWNlQXNzZXRJZAAFAA5pZHhBbXRBc3NldERjbQAGABBpZHhQcmljZUFzc2V0RGNtAAcADmlkeElBbXRBc3NldElkAAgAEGlkeElQcmljZUFzc2V0SWQACQANaWR4TFBBc3NldERjbQAKABJpZHhQb29sQW10QXNzZXRBbXQAAQAUaWR4UG9vbFByaWNlQXNzZXRBbXQAAgARaWR4UG9vbExQQXNzZXRBbXQAAwAZaWR4RmFjdG9yeVN0YWtpbmdDb250cmFjdAABABppZHhGYWN0b3J5U2xpcHBhZ2VDb250cmFjdAAHAQV0b1gxOAIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUHc2NhbGUxOAkAtgIBBQ1vcmlnU2NhbGVNdWx0AQt0b1gxOEJpZ0ludAIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQC8AgMFB29yaWdWYWwFB3NjYWxlMTgFDW9yaWdTY2FsZU11bHQBB2Zyb21YMTgCA3ZhbA9yZXN1bHRTY2FsZU11bHQJAKADAQkAvAIDBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQdzY2FsZTE4AQxmcm9tWDE4Um91bmQDA3ZhbA9yZXN1bHRTY2FsZU11bHQFcm91bmQJAKADAQkAvQIEBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQdzY2FsZTE4BQVyb3VuZAEHdG9TY2FsZQMDYW10CHJlc1NjYWxlCGN1clNjYWxlCQBrAwUDYW10BQhyZXNTY2FsZQUIY3VyU2NhbGUBA2FicwEDdmFsAwkAZgIAAAUDdmFsCQEBLQEFA3ZhbAUDdmFsAQlhYnNCaWdJbnQBA3ZhbAMJAL8CAgUKemVyb0JpZ0ludAUDdmFsCQC+AgEFA3ZhbAUDdmFsAQxzd2FwQ29udHJhY3QAAhAlc19fc3dhcENvbnRyYWN0AQJmYwACEyVzX19mYWN0b3J5Q29udHJhY3QBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEWa2V5TWFuYWdlclZhdWx0QWRkcmVzcwACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQJwbAACESVzJXNfX3ByaWNlX19sYXN0AQJwaAIBaAl0aW1lc3RhbXAJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQFoCQDMCAIJAKQDAQUJdGltZXN0YW1wBQNuaWwFA1NFUAEDcGF1Agt1c2VyQWRkcmVzcwR0eElkCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwULdXNlckFkZHJlc3MCAl9fBQR0eElkAQNnYXUCC3VzZXJBZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQt1c2VyQWRkcmVzcwICX18FBHR4SWQBAmFhAAIPJXNfX2Ftb3VudEFzc2V0AQJwYQACDiVzX19wcmljZUFzc2V0AAZrZXlGZWUCByVzX19mZWUACmZlZURlZmF1bHQJAGsDAAoFBnNjYWxlOACQTgADZmVlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFBmtleUZlZQUKZmVlRGVmYXVsdAAGa2V5S0xwCQC5CQIJAMwIAgICJXMJAMwIAgIDa0xwBQNuaWwFA1NFUAAVa2V5S0xwUmVmcmVzaGVkSGVpZ2h0CQC5CQIJAMwIAgICJXMJAMwIAgISa0xwUmVmcmVzaGVkSGVpZ2h0BQNuaWwFA1NFUAASa2V5S0xwUmVmcmVzaERlbGF5CQC5CQIJAMwIAgICJXMJAMwIAgIPcmVmcmVzaEtMcERlbGF5BQNuaWwFA1NFUAAWa0xwUmVmcmVzaERlbGF5RGVmYXVsdAAeAA9rTHBSZWZyZXNoRGVsYXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5S0xwUmVmcmVzaERlbGF5BRZrTHBSZWZyZXNoRGVsYXlEZWZhdWx0ARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgINc3Rha2VkQmFsYW5jZQkAzAgCBQdhc3NldElkBQNuaWwFA1NFUAEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIRc2hhcmVBc3NldEJhbGFuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAQdhc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEFB2Fzc2V0SWQAAAEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEFB2Fzc2V0SWQAAAEQa2V5RmFjdG9yeUNvbmZpZwACESVzX19mYWN0b3J5Q29uZmlnAQ1rZXlNYXRjaGVyUHViAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5ASlrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cwETcG9vbENvbnRyYWN0QWRkcmVzcwkArAICCQCsAgICCCVzJXMlc19fBRNwb29sQ29udHJhY3RBZGRyZXNzAiBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAENa2V5UG9vbENvbmZpZwIJaUFtdEFzc2V0C2lQcmljZUFzc2V0CQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQlpQW10QXNzZXQCAl9fBQtpUHJpY2VBc3NldAIIX19jb25maWcBH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQBDGJhc2VBc3NldFN0cgkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQxiYXNlQXNzZXRTdHIBE2tleUFsbFBvb2xzU2h1dGRvd24AAgwlc19fc2h1dGRvd24BDWtleVBvb2xXZWlnaHQBD2NvbnRyYWN0QWRkcmVzcwkArAICAhIlcyVzX19wb29sV2VpZ2h0X18FD2NvbnRyYWN0QWRkcmVzcwEWa2V5QWxsb3dlZExwU2NyaXB0SGFzaAACFyVzX19hbGxvd2VkTHBTY3JpcHRIYXNoABZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzAhclc19fZmVlQ29sbGVjdG9yQWRkcmVzcwEWa2V5U2tpcE9yZGVyVmFsaWRhdGlvbgELcG9vbEFkZHJlc3MJAKwCAgIbJXMlc19fc2tpcE9yZGVyVmFsaWRhdGlvbl9fBQtwb29sQWRkcmVzcwEPdGhyb3dPcmRlckVycm9yBApvcmRlclZhbGlkDm9yZGVyVmFsaWRJbmZvC3NlbmRlclZhbGlkDG1hdGNoZXJWYWxpZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiRvcmRlciB2YWxpZGF0aW9uIGZhaWxlZDogb3JkZXJWYWxpZD0JAKUDAQUKb3JkZXJWYWxpZAICICgFDm9yZGVyVmFsaWRJbmZvAgEpAg0gc2VuZGVyVmFsaWQ9CQClAwEFC3NlbmRlclZhbGlkAg4gbWF0Y2hlclZhbGlkPQkApQMBBQxtYXRjaGVyVmFsaWQBF2FkZHJlc3NGcm9tU3RyaW5nT3JUaGlzAQ1hZGRyZXNzU3RyaW5nBAckbWF0Y2gwCQCmCAEFDWFkZHJlc3NTdHJpbmcDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAUBYQUEdGhpcwEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEDmZhY3RvcnlBZGRyZXNzBAckbWF0Y2gwCQCiCAEJAQJmYwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBANmY2EFByRtYXRjaDAJARdhZGRyZXNzRnJvbVN0cmluZ09yVGhpcwEFA2ZjYQUEdGhpcwQHJG1hdGNoMAkAnQgCBQ5mYWN0b3J5QWRkcmVzcwkBFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBF2FkZHJlc3NGcm9tU3RyaW5nT3JUaGlzAQUBcwUEdGhpcwEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABDGdldEludE9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQh0aHJvd0VycgEDbXNnCQACAQkAuQkCCQDMCAICCGxwLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAQZmbXRFcnIBA21zZwkAuQkCCQDMCAICCGxwLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECZmMAABNmZWVDb2xsZWN0b3JBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0BRZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzAAVpbkZlZQoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AhBnZXRJbkZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AAZvdXRGZWUKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIRZ2V0T3V0RmVlUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBFWtleUFkZHJlc3NXaGl0ZWxpc3RlZAEHYWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgILd2hpdGVsaXN0ZWQJAMwIAgkApQgBBQdhZGRyZXNzBQNuaWwFA1NFUAEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBB2FkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPZmFjdG9yeUNvbnRyYWN0CQEVa2V5QWRkcmVzc1doaXRlbGlzdGVkAQUHYWRkcmVzcwcBEGlzR2xvYmFsU2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQCbCAIFD2ZhY3RvcnlDb250cmFjdAkBE2tleUFsbFBvb2xzU2h1dGRvd24ABwETZ2V0TWF0Y2hlclB1Yk9yRmFpbAAJANkEAQkBD2dldFN0cmluZ09yRmFpbAIFD2ZhY3RvcnlDb250cmFjdAkBDWtleU1hdGNoZXJQdWIAAQ1nZXRQb29sQ29uZmlnAAQIYW10QXNzZXQJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEABApwcmljZUFzc2V0CQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAQLaVByaWNlQXNzZXQJAQxnZXRJbnRPckZhaWwCBQ9mYWN0b3J5Q29udHJhY3QJAR9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAQUKcHJpY2VBc3NldAQJaUFtdEFzc2V0CQEMZ2V0SW50T3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAEFCGFtdEFzc2V0CQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQ9mYWN0b3J5Q29udHJhY3QJAQ1rZXlQb29sQ29uZmlnAgkApAMBBQlpQW10QXNzZXQJAKQDAQULaVByaWNlQXNzZXQFA1NFUAEMcGFyc2VBc3NldElkAQVpbnB1dAMJAAACBQVpbnB1dAULd2F2ZXNTdHJpbmcFBHVuaXQJANkEAQUFaW5wdXQBD2Fzc2V0SWRUb1N0cmluZwEFaW5wdXQDCQAAAgUFaW5wdXQFBHVuaXQFC3dhdmVzU3RyaW5nCQDYBAEJAQV2YWx1ZQEFBWlucHV0AQ9wYXJzZVBvb2xDb25maWcBCnBvb2xDb25maWcJAJkKBwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQpwb29sQ29uZmlnBQ5pZHhQb29sQWRkcmVzcwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFDWlkeFBvb2xTdGF0dXMJANkEAQkAkQMCBQpwb29sQ29uZmlnBRBpZHhQb29sTFBBc3NldElkCQEMcGFyc2VBc3NldElkAQkAkQMCBQpwb29sQ29uZmlnBQ1pZHhBbXRBc3NldElkCQEMcGFyc2VBc3NldElkAQkAkQMCBQpwb29sQ29uZmlnBQ9pZHhQcmljZUFzc2V0SWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpwb29sQ29uZmlnBQ5pZHhBbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFEGlkeFByaWNlQXNzZXREY20AEHBvb2xDb25maWdQYXJzZWQJAQ9wYXJzZVBvb2xDb25maWcBCQENZ2V0UG9vbENvbmZpZwAACyR0MDk3Njk5OTM1BRBwb29sQ29uZmlnUGFyc2VkAA5jZmdQb29sQWRkcmVzcwgFCyR0MDk3Njk5OTM1Al8xAA1jZmdQb29sU3RhdHVzCAULJHQwOTc2OTk5MzUCXzIADGNmZ0xwQXNzZXRJZAgFCyR0MDk3Njk5OTM1Al8zABBjZmdBbW91bnRBc3NldElkCAULJHQwOTc2OTk5MzUCXzQAD2NmZ1ByaWNlQXNzZXRJZAgFCyR0MDk3Njk5OTM1Al81ABZjZmdBbW91bnRBc3NldERlY2ltYWxzCAULJHQwOTc2OTk5MzUCXzYAFWNmZ1ByaWNlQXNzZXREZWNpbWFscwgFCyR0MDk3Njk5OTM1Al83ARBnZXRGYWN0b3J5Q29uZmlnAAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEQa2V5RmFjdG9yeUNvbmZpZwAFA1NFUAAPc3Rha2luZ0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCCQEQZ2V0RmFjdG9yeUNvbmZpZwAFGWlkeEZhY3RvcnlTdGFraW5nQ29udHJhY3QCGWluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MAEHNsaXBwYWdlQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIJARBnZXRGYWN0b3J5Q29uZmlnAAUaaWR4RmFjdG9yeVNsaXBwYWdlQ29udHJhY3QCGWluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MBEWRhdGFQdXRBY3Rpb25JbmZvCg1pbkFtdEFzc2V0QW10D2luUHJpY2VBc3NldEFtdAhvdXRMcEFtdAVwcmljZR1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlchVzbGlwcGFnZVRvbGVyYW5jZVJlYWwIdHhIZWlnaHQLdHhUaW1lc3RhbXASc2xpcGFnZUFtdEFzc2V0QW10FHNsaXBhZ2VQcmljZUFzc2V0QW10CQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQ1pbkFtdEFzc2V0QW10CQDMCAIJAKQDAQUPaW5QcmljZUFzc2V0QW10CQDMCAIJAKQDAQUIb3V0THBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFHXNsaXBwYWdlVG9sZXJhbmNlUGFzc2VkQnlVc2VyCQDMCAIJAKQDAQUVc2xpcHBhZ2VUb2xlcmFuY2VSZWFsCQDMCAIJAKQDAQUIdHhIZWlnaHQJAMwIAgkApAMBBQt0eFRpbWVzdGFtcAkAzAgCCQCkAwEFEnNsaXBhZ2VBbXRBc3NldEFtdAkAzAgCCQCkAwEFFHNsaXBhZ2VQcmljZUFzc2V0QW10BQNuaWwFA1NFUAERZGF0YUdldEFjdGlvbkluZm8GDm91dEFtdEFzc2V0QW10EG91dFByaWNlQXNzZXRBbXQHaW5McEFtdAVwcmljZQh0eEhlaWdodAt0eFRpbWVzdGFtcAkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFDm91dEFtdEFzc2V0QW10CQDMCAIJAKQDAQUQb3V0UHJpY2VBc3NldEFtdAkAzAgCCQCkAwEFB2luTHBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFCHR4SGVpZ2h0CQDMCAIJAKQDAQULdHhUaW1lc3RhbXAFA25pbAUDU0VQAQ1nZXRBY2NCYWxhbmNlAQdhc3NldElkBA1iYWxhbmNlT25Qb29sAwkAAAIFB2Fzc2V0SWQCBVdBVkVTCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkA8AcCBQR0aGlzCQDZBAEFB2Fzc2V0SWQEDHRvdGFsQmFsYW5jZQkAZQIJAGQCBQ1iYWxhbmNlT25Qb29sCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8BBQdhc3NldElkCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgUMdG90YWxCYWxhbmNlBQNuaWwBD2NhbGNQcmljZUJpZ0ludAIIcHJBbXRYMTgIYW1BbXRYMTgJALwCAwUIcHJBbXRYMTgFB3NjYWxlMTgFCGFtQW10WDE4ARRjYWxjUHJpY2VCaWdJbnRSb3VuZAMIcHJBbXRYMTgIYW1BbXRYMTgFcm91bmQJAL0CBAUIcHJBbXRYMTgFB3NjYWxlMTgFCGFtQW10WDE4BQVyb3VuZAEHZ2V0UmF0ZQEFcHJveHkEA2ludgkA/AcEBQVwcm94eQIHZ2V0UmF0ZQUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYEByRtYXRjaDAFA2ludgMJAAECBQckbWF0Y2gwAgNJbnQEAXIFByRtYXRjaDAFAXIJAQh0aHJvd0VycgECIHByb3h5LmdldFJhdGUoKSB1bmV4cGVjdGVkIHZhbHVlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQdkZXBvc2l0BAdhc3NldElkBmFtb3VudA5zdGFraW5nQXNzZXRJZAVwcm94eQQYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8BBQdhc3NldElkAwkAAAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBBpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQkBHGdldFN0YWtpbmdBc3NldEJhbGFuY2VPclplcm8BBQ5zdGFraW5nQXNzZXRJZAMJAAACBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UEBWFzc2V0CQEMcGFyc2VBc3NldElkAQUHYXNzZXRJZAMJAGYCBQZhbW91bnQAAAQNZGVwb3NpdEludm9rZQkA/AcEBQVwcm94eQIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQVhc3NldAUGYW1vdW50BQNuaWwDCQAAAgUNZGVwb3NpdEludm9rZQUNZGVwb3NpdEludm9rZQQHJG1hdGNoMAUNZGVwb3NpdEludm9rZQMJAAECBQckbWF0Y2gwAgNJbnQEFHJlY2VpdmVkU3Rha2luZ0Fzc2V0BQckbWF0Y2gwBBRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAZAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUGYW1vdW50BBZuZXdTdGFraW5nQXNzZXRCYWxhbmNlCQBkAgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UFFHJlY2VpdmVkU3Rha2luZ0Fzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5QWRkaXRpb25hbEJhbGFuY2UBBQdhc3NldElkBRRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVN0YWtpbmdBc3NldEJhbGFuY2UBBQ5zdGFraW5nQXNzZXRJZAUWbmV3U3Rha2luZ0Fzc2V0QmFsYW5jZQUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEId2l0aGRyYXcGB2Fzc2V0SWQGYW1vdW50DnN0YWtpbmdBc3NldElkBXByb3h5DHByb3h5UmF0ZU11bA1wcm9maXRBZGRyZXNzBBhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UJARpnZXRBZGRpdGlvbmFsQmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQDCQAAAgUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFDnN0YWtpbmdBc3NldElkAwkAAAIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQQQY3VycmVudFByb3h5UmF0ZQkBB2dldFJhdGUBBQVwcm94eQMJAAACBRBjdXJyZW50UHJveHlSYXRlBRBjdXJyZW50UHJveHlSYXRlBAdvbGRSYXRlCQBrAwUMcHJveHlSYXRlTXVsBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBAxzdGFraW5nQXNzZXQJAQxwYXJzZUFzc2V0SWQBBQ5zdGFraW5nQXNzZXRJZAQUb2xkU2VuZFN0YWtpbmdBbW91bnQJAGsDBQxwcm94eVJhdGVNdWwFBmFtb3VudAUHb2xkUmF0ZQQWc2VuZFN0YWtpbmdBc3NldEFtb3VudAkAawMFDHByb3h5UmF0ZU11bAUGYW1vdW50BRBjdXJyZW50UHJveHlSYXRlBAxwcm9maXRBbW91bnQJAJYDAQkAzAgCAAAJAMwIAgkAZQIFFG9sZFNlbmRTdGFraW5nQW1vdW50BRZzZW5kU3Rha2luZ0Fzc2V0QW1vdW50BQNuaWwDCQBmAgUWc2VuZFN0YWtpbmdBc3NldEFtb3VudAAABA53aXRoZHJhd0ludm9rZQkA/AcEBQVwcm94eQIId2l0aGRyYXcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc3Rha2luZ0Fzc2V0BRZzZW5kU3Rha2luZ0Fzc2V0QW1vdW50BQNuaWwDCQAAAgUOd2l0aGRyYXdJbnZva2UFDndpdGhkcmF3SW52b2tlBAckbWF0Y2gwBQ53aXRoZHJhd0ludm9rZQMJAAECBQckbWF0Y2gwAgNJbnQEDnJlY2VpdmVkQXNzZXRzBQckbWF0Y2gwBBRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAZQIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUOcmVjZWl2ZWRBc3NldHMEFm5ld1N0YWtpbmdBc3NldEJhbGFuY2UJAGUCCQBlAgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UFFnNlbmRTdGFraW5nQXNzZXRBbW91bnQFDHByb2ZpdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleUFkZGl0aW9uYWxCYWxhbmNlAQUHYXNzZXRJZAUUbmV3QWRkaXRpb25hbEJhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlTdGFraW5nQXNzZXRCYWxhbmNlAQUOc3Rha2luZ0Fzc2V0SWQFFm5ld1N0YWtpbmdBc3NldEJhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUNcHJvZml0QWRkcmVzcwUMcHJvZml0QW1vdW50CQEMcGFyc2VBc3NldElkAQUOc3Rha2luZ0Fzc2V0SWQFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2dldExlYXNlUHJveHlDb25maWcBB2Fzc2V0SWQEByRtYXRjaDAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AhpnZXRQb29sTGVhc2VDb25maWdSRUFET05MWQkAzAgCCQClCAEFBHRoaXMJAMwIAgUHYXNzZXRJZAUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIwKEJvb2xlYW4sIEludCwgSW50LCBTdHJpbmcsIFN0cmluZywgSW50LCBTdHJpbmcpBAFhBQckbWF0Y2gwBQFhCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIBWwUHYXNzZXRJZAIdXSBnZXRMZWFzZVByb3h5Q29uZmlnKCkgZXJyb3IBEXJlYmFsYW5jZUludGVybmFsBwt0YXJnZXRSYXRpbwdhc3NldElkDnN0YWtpbmdBc3NldElkCm1pbkJhbGFuY2UFcHJveHkMcHJveHlSYXRlTXVsDXByb2ZpdEFkZHJlc3MEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFDnN0YWtpbmdBc3NldElkAwkAAAIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQQYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlAwkBAiE9AgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UAAAkBGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAQUHYXNzZXRJZAAAAwkAAAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBBRsZWFzYWJsZVRvdGFsQmFsYW5jZQkAlgMBCQDMCAIAAAkAzAgCCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdhc3NldElkBQptaW5CYWxhbmNlBQNuaWwEF3RhcmdldEFkZGl0aW9uYWxCYWxhbmNlCQBrAwULdGFyZ2V0UmF0aW8FFGxlYXNhYmxlVG90YWxCYWxhbmNlAGQEBGRpZmYJAGUCBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFF3RhcmdldEFkZGl0aW9uYWxCYWxhbmNlAwkAAAIFBGRpZmYAAAUDbmlsAwkAZgIAAAUEZGlmZgQPc2VuZEFzc2V0QW1vdW50CQEBLQEFBGRpZmYJAQdkZXBvc2l0BAUHYXNzZXRJZAUPc2VuZEFzc2V0QW1vdW50BQ5zdGFraW5nQXNzZXRJZAUFcHJveHkEDmdldEFzc2V0QW1vdW50BQRkaWZmCQEId2l0aGRyYXcGBQdhc3NldElkBQ5nZXRBc3NldEFtb3VudAUOc3Rha2luZ0Fzc2V0SWQFBXByb3h5BQxwcm94eVJhdGVNdWwFDXByb2ZpdEFkZHJlc3MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDnJlYmFsYW5jZUFzc2V0AQdhc3NldElkBA0kdDAxNjIyMDE2MzU2CQETZ2V0TGVhc2VQcm94eUNvbmZpZwEFB2Fzc2V0SWQECmlzTGVhc2FibGUIBQ0kdDAxNjIyMDE2MzU2Al8xBAtsZWFzZWRSYXRpbwgFDSR0MDE2MjIwMTYzNTYCXzIECm1pbkJhbGFuY2UIBQ0kdDAxNjIyMDE2MzU2Al8zBAxwcm94eUFkZHJlc3MIBQ0kdDAxNjIyMDE2MzU2Al80BAxwcm94eUFzc2V0SWQIBQ0kdDAxNjIyMDE2MzU2Al81BAxwcm94eVJhdGVNdWwIBQ0kdDAxNjIyMDE2MzU2Al82BBRzdGFraW5nUHJvZml0QWRkcmVzcwgFDSR0MDE2MjIwMTYzNTYCXzcDBQppc0xlYXNhYmxlCQERcmViYWxhbmNlSW50ZXJuYWwHBQtsZWFzZWRSYXRpbwUHYXNzZXRJZAUMcHJveHlBc3NldElkBQptaW5CYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA2MikBBQxwcm94eUFkZHJlc3MFDHByb3h5UmF0ZU11bAkBEUBleHRyTmF0aXZlKDEwNjIpAQUUc3Rha2luZ1Byb2ZpdEFkZHJlc3MFA25pbAEZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldAIHYXNzZXRJZAlnZXRBbW91bnQEDSR0MDE2NzU1MTY4OTEJARNnZXRMZWFzZVByb3h5Q29uZmlnAQUHYXNzZXRJZAQKaXNMZWFzYWJsZQgFDSR0MDE2NzU1MTY4OTECXzEEC2xlYXNlZFJhdGlvCAUNJHQwMTY3NTUxNjg5MQJfMgQKbWluQmFsYW5jZQgFDSR0MDE2NzU1MTY4OTECXzMEDHByb3h5QWRkcmVzcwgFDSR0MDE2NzU1MTY4OTECXzQEDHByb3h5QXNzZXRJZAgFDSR0MDE2NzU1MTY4OTECXzUEDHByb3h5UmF0ZU11bAgFDSR0MDE2NzU1MTY4OTECXzYEFHN0YWtpbmdQcm9maXRBZGRyZXNzCAUNJHQwMTY3NTUxNjg5MQJfNwMFCmlzTGVhc2FibGUEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFDHByb3h5QXNzZXRJZAMJAAACBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UEGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQMJAQIhPQIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlAAAJARpnZXRBZGRpdGlvbmFsQmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQAAAMJAAACBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQQXbmV3VG90YWxMZWFzYWJsZUJhbGFuY2UJAJYDAQkAzAgCAAAJAMwIAgkAZQIJAGUCCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SWQFCWdldEFtb3VudAUKbWluQmFsYW5jZQUDbmlsAwkAAAIFF25ld1RvdGFsTGVhc2FibGVCYWxhbmNlBRduZXdUb3RhbExlYXNhYmxlQmFsYW5jZQQUbmV3QWRkaXRpb25hbEJhbGFuY2UJAGsDBQtsZWFzZWRSYXRpbwUXbmV3VG90YWxMZWFzYWJsZUJhbGFuY2UAZAMJAAACBRRuZXdBZGRpdGlvbmFsQmFsYW5jZQUUbmV3QWRkaXRpb25hbEJhbGFuY2UEDndpdGhkcmF3QW1vdW50CQBlAgUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBRRuZXdBZGRpdGlvbmFsQmFsYW5jZQMJAAACBQ53aXRoZHJhd0Ftb3VudAUOd2l0aGRyYXdBbW91bnQDCQAAAgUOd2l0aGRyYXdBbW91bnQAAAUDbmlsAwkAZgIAAAUOd2l0aGRyYXdBbW91bnQJAQdkZXBvc2l0BAUHYXNzZXRJZAkBAS0BBQ53aXRoZHJhd0Ftb3VudAUMcHJveHlBc3NldElkCQERQGV4dHJOYXRpdmUoMTA2MikBBQxwcm94eUFkZHJlc3MJAQh3aXRoZHJhdwYFB2Fzc2V0SWQFDndpdGhkcmF3QW1vdW50BQxwcm94eUFzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDHByb3h5QWRkcmVzcwUMcHJveHlSYXRlTXVsCQERQGV4dHJOYXRpdmUoMTA2MikBBRRzdGFraW5nUHJvZml0QWRkcmVzcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsARd3aXRoZHJhd0FuZFJlYmFsYW5jZUFsbAIUYW1vdW50QXNzZXRPdXRBbW91bnQTcHJpY2VBc3NldE91dEFtb3VudAQSQW1BbXRXaXRoZHJhd1N0YXRlCQEZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldAIJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEABRRhbW91bnRBc3NldE91dEFtb3VudAQSUHJBbXRXaXRoZHJhd1N0YXRlCQEZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldAIJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECcGEABRNwcmljZUFzc2V0T3V0QW1vdW50CQDOCAIFEkFtQW10V2l0aGRyYXdTdGF0ZQUSUHJBbXRXaXRoZHJhd1N0YXRlARBwcml2YXRlQ2FsY1ByaWNlBAphbUFzc2V0RGNtCnByQXNzZXREY20FYW1BbXQFcHJBbXQEDmFtdEFzc2V0QW10WDE4CQEFdG9YMTgCBQVhbUFtdAUKYW1Bc3NldERjbQQQcHJpY2VBc3NldEFtdFgxOAkBBXRvWDE4AgUFcHJBbXQFCnByQXNzZXREY20JAQ9jYWxjUHJpY2VCaWdJbnQCBRBwcmljZUFzc2V0QW10WDE4BQ5hbXRBc3NldEFtdFgxOAEKY2FsY1ByaWNlcwMFYW1BbXQFcHJBbXQFbHBBbXQEA2NmZwkBDWdldFBvb2xDb25maWcABAthbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUOaWR4QW10QXNzZXREY20EDXByaWNlQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFEGlkeFByaWNlQXNzZXREY20ECHByaWNlWDE4CQEQcHJpdmF0ZUNhbGNQcmljZQQFC2FtdEFzc2V0RGNtBQ1wcmljZUFzc2V0RGNtBQVhbUFtdAUFcHJBbXQECGFtQW10WDE4CQEFdG9YMTgCBQVhbUFtdAULYW10QXNzZXREY20ECHByQW10WDE4CQEFdG9YMTgCBQVwckFtdAUNcHJpY2VBc3NldERjbQQIbHBBbXRYMTgJAQV0b1gxOAIFBWxwQW10BQZzY2FsZTgEE2xwUHJpY2VJbkFtQXNzZXRYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCBQhhbUFtdFgxOAUIbHBBbXRYMTgEE2xwUHJpY2VJblByQXNzZXRYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCBQhwckFtdFgxOAUIbHBBbXRYMTgJAMwIAgUIcHJpY2VYMTgJAMwIAgUTbHBQcmljZUluQW1Bc3NldFgxOAkAzAgCBRNscFByaWNlSW5QckFzc2V0WDE4BQNuaWwBD2NhbGN1bGF0ZVByaWNlcwMFYW1BbXQFcHJBbXQFbHBBbXQEBnByaWNlcwkBCmNhbGNQcmljZXMDBQVhbUFtdAUFcHJBbXQFBWxwQW10CQDMCAIJAQdmcm9tWDE4AgkAkQMCBQZwcmljZXMAAAUGc2NhbGU4CQDMCAIJAQdmcm9tWDE4AgkAkQMCBQZwcmljZXMAAQUGc2NhbGU4CQDMCAIJAQdmcm9tWDE4AgkAkQMCBQZwcmljZXMAAgUGc2NhbGU4BQNuaWwBFGVzdGltYXRlR2V0T3BlcmF0aW9uBAZ0eElkNTgKcG10QXNzZXRJZAhwbXRMcEFtdAt1c2VyQWRkcmVzcwQDY2ZnCQENZ2V0UG9vbENvbmZpZwAECWxwQXNzZXRJZAkAkQMCBQNjZmcFEGlkeFBvb2xMUEFzc2V0SWQECWFtQXNzZXRJZAkAkQMCBQNjZmcFDWlkeEFtdEFzc2V0SWQECXByQXNzZXRJZAkAkQMCBQNjZmcFD2lkeFByaWNlQXNzZXRJZAQKYW1Bc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUOaWR4QW10QXNzZXREY20ECnByQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFEGlkeFByaWNlQXNzZXREY20ECnBvb2xTdGF0dXMJAJEDAgUDY2ZnBQ1pZHhQb29sU3RhdHVzBApscEVtaXNzaW9uCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUJbHBBc3NldElkCQCsAgIJAKwCAgIGQXNzZXQgBQlscEFzc2V0SWQCDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5AwkBAiE9AgUJbHBBc3NldElkBQpwbXRBc3NldElkCQACAQIVSW52YWxpZCBhc3NldCBwYXNzZWQuBAlhbUJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUJYW1Bc3NldElkBAxhbUJhbGFuY2VYMTgJAQV0b1gxOAIFCWFtQmFsYW5jZQUKYW1Bc3NldERjbQQJcHJCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFCXByQXNzZXRJZAQMcHJCYWxhbmNlWDE4CQEFdG9YMTgCBQlwckJhbGFuY2UFCnByQXNzZXREY20EC2N1clByaWNlWDE4CQEPY2FsY1ByaWNlQmlnSW50AgUMcHJCYWxhbmNlWDE4BQxhbUJhbGFuY2VYMTgECGN1clByaWNlCQEHZnJvbVgxOAIFC2N1clByaWNlWDE4BQZzY2FsZTgEC3BtdExwQW10WDE4CQEFdG9YMTgCBQhwbXRMcEFtdAUGc2NhbGU4BA1scEVtaXNzaW9uWDE4CQEFdG9YMTgCBQpscEVtaXNzaW9uBQZzY2FsZTgEC291dEFtQW10WDE4CQC8AgMFDGFtQmFsYW5jZVgxOAULcG10THBBbXRYMTgFDWxwRW1pc3Npb25YMTgEC291dFByQW10WDE4CQC8AgMFDHByQmFsYW5jZVgxOAULcG10THBBbXRYMTgFDWxwRW1pc3Npb25YMTgECG91dEFtQW10CQEMZnJvbVgxOFJvdW5kAwULb3V0QW1BbXRYMTgFCmFtQXNzZXREY20FBUZMT09SBAhvdXRQckFtdAkBDGZyb21YMThSb3VuZAMFC291dFByQW10WDE4BQpwckFzc2V0RGNtBQVGTE9PUgQFc3RhdGUDCQAAAgUGdHhJZDU4AgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUIb3V0QW1BbXQDCQAAAgUJYW1Bc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQlhbUFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFCG91dFByQW10AwkAAAIFCXByQXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUJcHJBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNnYXUCCQClCAEFC3VzZXJBZGRyZXNzBQZ0eElkNTgJARFkYXRhR2V0QWN0aW9uSW5mbwYFCG91dEFtQW10BQhvdXRQckFtdAUIcG10THBBbXQFCGN1clByaWNlBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQhjdXJQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIY3VyUHJpY2UFA25pbAkAnAoKBQhvdXRBbUFtdAUIb3V0UHJBbXQFCWFtQXNzZXRJZAUJcHJBc3NldElkBQlhbUJhbGFuY2UFCXByQmFsYW5jZQUKbHBFbWlzc2lvbgULY3VyUHJpY2VYMTgFCnBvb2xTdGF0dXMFBXN0YXRlARRlc3RpbWF0ZVB1dE9wZXJhdGlvbgkGdHhJZDU4EXNsaXBwYWdlVG9sZXJhbmNlDGluQW1Bc3NldEFtdAtpbkFtQXNzZXRJZAxpblByQXNzZXRBbXQLaW5QckFzc2V0SWQLdXNlckFkZHJlc3MKaXNFdmFsdWF0ZQZlbWl0THAEA2NmZwkBDWdldFBvb2xDb25maWcABAlscEFzc2V0SWQJANkEAQkAkQMCBQNjZmcFEGlkeFBvb2xMUEFzc2V0SWQEDGFtQXNzZXRJZFN0cgkAkQMCBQNjZmcFDWlkeEFtdEFzc2V0SWQEDHByQXNzZXRJZFN0cgkAkQMCBQNjZmcFD2lkeFByaWNlQXNzZXRJZAQLaUFtdEFzc2V0SWQJAJEDAgUDY2ZnBQ5pZHhJQW10QXNzZXRJZAQNaVByaWNlQXNzZXRJZAkAkQMCBQNjZmcFEGlkeElQcmljZUFzc2V0SWQEC2FtdEFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ5pZHhBbXRBc3NldERjbQQNcHJpY2VBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUQaWR4UHJpY2VBc3NldERjbQQKcG9vbFN0YXR1cwkAkQMCBQNjZmcFDWlkeFBvb2xTdGF0dXMECmxwRW1pc3Npb24ICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUJbHBBc3NldElkCQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFCWxwQXNzZXRJZAIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEDmluQW1Bc3NldElkU3RyCQDYBAEJAQt2YWx1ZU9yRWxzZQIFC2luQW1Bc3NldElkCQDZBAECBVdBVkVTBA5pblByQXNzZXRJZFN0cgkA2AQBCQELdmFsdWVPckVsc2UCBQtpblByQXNzZXRJZAkA2QQBAgVXQVZFUwMDCQECIT0CBQxhbUFzc2V0SWRTdHIFDmluQW1Bc3NldElkU3RyBgkBAiE9AgUMcHJBc3NldElkU3RyBQ5pblByQXNzZXRJZFN0cgkAAgECIkludmFsaWQgYW10IG9yIHByaWNlIGFzc2V0IHBhc3NlZC4ECWFtQmFsYW5jZQMFCmlzRXZhbHVhdGUJAQ1nZXRBY2NCYWxhbmNlAQUMYW1Bc3NldElkU3RyCQBlAgkBDWdldEFjY0JhbGFuY2UBBQxhbUFzc2V0SWRTdHIFDGluQW1Bc3NldEFtdAQJcHJCYWxhbmNlAwUKaXNFdmFsdWF0ZQkBDWdldEFjY0JhbGFuY2UBBQxwckFzc2V0SWRTdHIJAGUCCQENZ2V0QWNjQmFsYW5jZQEFDHByQXNzZXRJZFN0cgUMaW5QckFzc2V0QW10BA9pbkFtQXNzZXRBbXRYMTgJAQV0b1gxOAIFDGluQW1Bc3NldEFtdAULYW10QXNzZXREY20ED2luUHJBc3NldEFtdFgxOAkBBXRvWDE4AgUMaW5QckFzc2V0QW10BQ1wcmljZUFzc2V0RGNtBAx1c2VyUHJpY2VYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCBQ9pblByQXNzZXRBbXRYMTgFD2luQW1Bc3NldEFtdFgxOAQMYW1CYWxhbmNlWDE4CQEFdG9YMTgCBQlhbUJhbGFuY2UFC2FtdEFzc2V0RGNtBAxwckJhbGFuY2VYMTgJAQV0b1gxOAIFCXByQmFsYW5jZQUNcHJpY2VBc3NldERjbQQDcmVzAwkAAAIFCmxwRW1pc3Npb24AAAQLY3VyUHJpY2VYMTgFCnplcm9CaWdJbnQEC3NsaXBwYWdlWDE4BQp6ZXJvQmlnSW50BAhscEFtdFgxOAkAdgYJALkCAgUPaW5BbUFzc2V0QW10WDE4BQ9pblByQXNzZXRBbXRYMTgAAAkAtgIBAAUAAQAABQRET1dOCQCXCgUJAQdmcm9tWDE4AgUIbHBBbXRYMTgFBnNjYWxlOAkBB2Zyb21YMTgCBQ9pbkFtQXNzZXRBbXRYMTgFC2FtdEFzc2V0RGNtCQEHZnJvbVgxOAIFD2luUHJBc3NldEFtdFgxOAUNcHJpY2VBc3NldERjbQkBD2NhbGNQcmljZUJpZ0ludAIJALcCAgUMcHJCYWxhbmNlWDE4BQ9pblByQXNzZXRBbXRYMTgJALcCAgUMYW1CYWxhbmNlWDE4BQ9pbkFtQXNzZXRBbXRYMTgFC3NsaXBwYWdlWDE4BAtjdXJQcmljZVgxOAkBD2NhbGNQcmljZUJpZ0ludAIFDHByQmFsYW5jZVgxOAUMYW1CYWxhbmNlWDE4BAtzbGlwcGFnZVgxOAkAvAIDCQEJYWJzQmlnSW50AQkAuAICBQtjdXJQcmljZVgxOAUMdXNlclByaWNlWDE4BQdzY2FsZTE4BQtjdXJQcmljZVgxOAQUc2xpcHBhZ2VUb2xlcmFuY2VYMTgJAQV0b1gxOAIFEXNsaXBwYWdlVG9sZXJhbmNlBQZzY2FsZTgDAwkBAiE9AgULY3VyUHJpY2VYMTgFCnplcm9CaWdJbnQJAL8CAgULc2xpcHBhZ2VYMTgFFHNsaXBwYWdlVG9sZXJhbmNlWDE4BwkAAgEJAKwCAgkArAICCQCsAgICD1ByaWNlIHNsaXBwYWdlIAkApgMBBQtzbGlwcGFnZVgxOAIeIGV4Y2VlZGVkIHRoZSBwYXNzZWQgbGltaXQgb2YgCQCmAwEFFHNsaXBwYWdlVG9sZXJhbmNlWDE4BA1scEVtaXNzaW9uWDE4CQEFdG9YMTgCBQpscEVtaXNzaW9uBQZzY2FsZTgECnByVmlhQW1YMTgJAL0CBAUPaW5BbUFzc2V0QW10WDE4CQEUY2FsY1ByaWNlQmlnSW50Um91bmQDBQxwckJhbGFuY2VYMTgFDGFtQmFsYW5jZVgxOAUHQ0VJTElORwUHc2NhbGUxOAUHQ0VJTElORwQKYW1WaWFQclgxOAkAvQIEBQ9pblByQXNzZXRBbXRYMTgFB3NjYWxlMTgJARRjYWxjUHJpY2VCaWdJbnRSb3VuZAMFDHByQmFsYW5jZVgxOAUMYW1CYWxhbmNlWDE4BQVGTE9PUgUHQ0VJTElORwQMZXhwZWN0ZWRBbXRzAwkAvwICBQpwclZpYUFtWDE4BQ9pblByQXNzZXRBbXRYMTgJAJQKAgUKYW1WaWFQclgxOAUPaW5QckFzc2V0QW10WDE4CQCUCgIFD2luQW1Bc3NldEFtdFgxOAUKcHJWaWFBbVgxOAQRZXhwQW10QXNzZXRBbXRYMTgIBQxleHBlY3RlZEFtdHMCXzEEE2V4cFByaWNlQXNzZXRBbXRYMTgIBQxleHBlY3RlZEFtdHMCXzIECGxwQW10WDE4CQC9AgQFDWxwRW1pc3Npb25YMTgFE2V4cFByaWNlQXNzZXRBbXRYMTgFDHByQmFsYW5jZVgxOAUFRkxPT1IJAJcKBQkBDGZyb21YMThSb3VuZAMFCGxwQW10WDE4BQZzY2FsZTgFBUZMT09SCQEMZnJvbVgxOFJvdW5kAwURZXhwQW10QXNzZXRBbXRYMTgFC2FtdEFzc2V0RGNtBQdDRUlMSU5HCQEMZnJvbVgxOFJvdW5kAwUTZXhwUHJpY2VBc3NldEFtdFgxOAUNcHJpY2VBc3NldERjbQUHQ0VJTElORwULY3VyUHJpY2VYMTgFC3NsaXBwYWdlWDE4BAljYWxjTHBBbXQIBQNyZXMCXzEEDmNhbGNBbUFzc2V0UG10CAUDcmVzAl8yBA5jYWxjUHJBc3NldFBtdAgFA3JlcwJfMwQIY3VyUHJpY2UJAQdmcm9tWDE4AggFA3JlcwJfNAUGc2NhbGU4BAxzbGlwcGFnZUNhbGMJAQdmcm9tWDE4AggFA3JlcwJfNQUGc2NhbGU4AwkAZwIAAAUJY2FsY0xwQW10CQACAQI2SW52YWxpZCBjYWxjdWxhdGlvbnMuIExQIGNhbGN1bGF0ZWQgaXMgbGVzcyB0aGFuIHplcm8uBAllbWl0THBBbXQDCQEBIQEFBmVtaXRMcAAABQljYWxjTHBBbXQEBmFtRGlmZgkAZQIFDGluQW1Bc3NldEFtdAUOY2FsY0FtQXNzZXRQbXQEBnByRGlmZgkAZQIFDGluUHJBc3NldEFtdAUOY2FsY1ByQXNzZXRQbXQEC2NvbW1vblN0YXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQhjdXJQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIY3VyUHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA3BhdQIFC3VzZXJBZGRyZXNzBQZ0eElkNTgJARFkYXRhUHV0QWN0aW9uSW5mbwoFDmNhbGNBbUFzc2V0UG10BQ5jYWxjUHJBc3NldFBtdAUJZW1pdExwQW10BQhjdXJQcmljZQURc2xpcHBhZ2VUb2xlcmFuY2UFDHNsaXBwYWdlQ2FsYwUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUGYW1EaWZmBQZwckRpZmYFA25pbAkAnwoNBQljYWxjTHBBbXQFCWVtaXRMcEFtdAUIY3VyUHJpY2UFCWFtQmFsYW5jZQUJcHJCYWxhbmNlBQpscEVtaXNzaW9uBQlscEFzc2V0SWQFCnBvb2xTdGF0dXMFC2NvbW1vblN0YXRlBQZhbURpZmYFBnByRGlmZgULaW5BbUFzc2V0SWQFC2luUHJBc3NldElkAQdjYWxjS0xwAw1hbW91bnRCYWxhbmNlDHByaWNlQmFsYW5jZQpscEVtaXNzaW9uBBBhbW91bnRCYWxhbmNlWDE4CQELdG9YMThCaWdJbnQCBQ1hbW91bnRCYWxhbmNlCQC2AgEFFmNmZ0Ftb3VudEFzc2V0RGVjaW1hbHMED3ByaWNlQmFsYW5jZVgxOAkBC3RvWDE4QmlnSW50AgUMcHJpY2VCYWxhbmNlCQC2AgEFFWNmZ1ByaWNlQXNzZXREZWNpbWFscwQKdXBkYXRlZEtMcAkAvAIDCQB2BgkAuQICBRBhbW91bnRCYWxhbmNlWDE4BQ9wcmljZUJhbGFuY2VYMTgAAAkAtgIBAAUAAQASBQRET1dOBQRiaWcxBQpscEVtaXNzaW9uAwkAAAIFCmxwRW1pc3Npb24FBGJpZzAFBGJpZzAFCnVwZGF0ZWRLTHABDmNhbGNDdXJyZW50S0xwAxBhbW91bnRBc3NldERlbHRhD3ByaWNlQXNzZXREZWx0YRRscEFzc2V0RW1pc3Npb25EZWx0YQQSYW1vdW50QXNzZXRCYWxhbmNlCQC4AgIJALYCAQkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUQY2ZnQW1vdW50QXNzZXRJZAUQYW1vdW50QXNzZXREZWx0YQQRcHJpY2VBc3NldEJhbGFuY2UJALgCAgkAtgIBCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBQ9jZmdQcmljZUFzc2V0SWQFD3ByaWNlQXNzZXREZWx0YQQPbHBBc3NldEVtaXNzaW9uCQC4AgIJALYCAQgJAQV2YWx1ZQEJAOwHAQUMY2ZnTHBBc3NldElkCHF1YW50aXR5BRRscEFzc2V0RW1pc3Npb25EZWx0YQQKY3VycmVudEtMcAkBB2NhbGNLTHADBRJhbW91bnRBc3NldEJhbGFuY2UFEXByaWNlQXNzZXRCYWxhbmNlBQ9scEFzc2V0RW1pc3Npb24FCmN1cnJlbnRLTHABEnJlZnJlc2hLTHBJbnRlcm5hbAMXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEWcHJpY2VBc3NldEJhbGFuY2VEZWx0YRRscEFzc2V0RW1pc3Npb25EZWx0YQQSYW1vdW50QXNzZXRCYWxhbmNlCQBkAgkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUQY2ZnQW1vdW50QXNzZXRJZAUXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEEEXByaWNlQXNzZXRCYWxhbmNlCQBkAgkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUPY2ZnUHJpY2VBc3NldElkBRZwcmljZUFzc2V0QmFsYW5jZURlbHRhBA9scEFzc2V0RW1pc3Npb24JAGQCCAkBBXZhbHVlAQkA7AcBBQxjZmdMcEFzc2V0SWQIcXVhbnRpdHkFFGxwQXNzZXRFbWlzc2lvbkRlbHRhBAp1cGRhdGVkS0xwCQEHY2FsY0tMcAMJALYCAQUSYW1vdW50QXNzZXRCYWxhbmNlCQC2AgEFEXByaWNlQXNzZXRCYWxhbmNlCQC2AgEFD2xwQXNzZXRFbWlzc2lvbgQHYWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa2V5S0xwUmVmcmVzaGVkSGVpZ2h0BQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa2V5S0xwCQCmAwEFCnVwZGF0ZWRLTHAFA25pbAkAlAoCBQdhY3Rpb25zBQp1cGRhdGVkS0xwARNza2lwT3JkZXJWYWxpZGF0aW9uAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ9mYWN0b3J5Q29udHJhY3QJARZrZXlTa2lwT3JkZXJWYWxpZGF0aW9uAQkApQgBBQR0aGlzBwESdmFsaWRhdGVVcGRhdGVkS0xwAgZvbGRLTHAKdXBkYXRlZEtMcAMJAMACAgUKdXBkYXRlZEtMcAUGb2xkS0xwBgkBCHRocm93RXJyAQkAuQkCCQDMCAICInVwZGF0ZWQgS0xwIGxvd2VyIHRoYW4gY3VycmVudCBLTHAJAMwIAgkApgMBBQZvbGRLTHAJAMwIAgkApgMBBQp1cGRhdGVkS0xwBQNuaWwCASABG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZAEFb3JkZXIEEmFtb3VudEFzc2V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUQY2ZnQW1vdW50QXNzZXRJZAQRcHJpY2VBc3NldEJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFD2NmZ1ByaWNlQXNzZXRJZAQRYW1vdW50QXNzZXRBbW91bnQIBQVvcmRlcgZhbW91bnQEEHByaWNlQXNzZXRBbW91bnQJAG4ECAUFb3JkZXIGYW1vdW50CAUFb3JkZXIFcHJpY2UFBnNjYWxlOAUFRkxPT1IEDSR0MDI5NTE3Mjk3MjkDCQAAAggFBW9yZGVyCW9yZGVyVHlwZQUDQnV5CQCUCgIFEWFtb3VudEFzc2V0QW1vdW50CQEBLQEFEHByaWNlQXNzZXRBbW91bnQJAJQKAgkBAS0BBRFhbW91bnRBc3NldEFtb3VudAUQcHJpY2VBc3NldEFtb3VudAQXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDAyOTUxNzI5NzI5Al8xBBZwcmljZUFzc2V0QmFsYW5jZURlbHRhCAUNJHQwMjk1MTcyOTcyOQJfMgMDAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFE1Bvb2xNYXRjaGVyRGlzYWJsZWQGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duCQACAQIcRXhjaGFuZ2Ugb3BlcmF0aW9ucyBkaXNhYmxlZAMDCQECIT0CCAgFBW9yZGVyCWFzc2V0UGFpcgthbW91bnRBc3NldAUQY2ZnQW1vdW50QXNzZXRJZAYJAQIhPQIICAUFb3JkZXIJYXNzZXRQYWlyCnByaWNlQXNzZXQFD2NmZ1ByaWNlQXNzZXRJZAkAAgECE1dyb25nIG9yZGVyIGFzc2V0cy4EA2tMcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa2V5S0xwAgEwCQEGZm10RXJyAQILaW52YWxpZCBrTHAEDSR0MDMwMTY5MzAyNjkJARJyZWZyZXNoS0xwSW50ZXJuYWwDBRdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQUWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQAABA11bnVzZWRBY3Rpb25zCAUNJHQwMzAxNjkzMDI2OQJfMQQGa0xwTmV3CAUNJHQwMzAxNjkzMDI2OQJfMgQMaXNPcmRlclZhbGlkCQDAAgIFBmtMcE5ldwUDa0xwBARpbmZvCQC5CQIJAMwIAgIEa0xwPQkAzAgCCQCmAwEFA2tMcAkAzAgCAggga0xwTmV3PQkAzAgCCQCmAwEFBmtMcE5ldwkAzAgCAhQgYW1vdW50QXNzZXRCYWxhbmNlPQkAzAgCCQCkAwEFEmFtb3VudEFzc2V0QmFsYW5jZQkAzAgCAhMgcHJpY2VBc3NldEJhbGFuY2U9CQDMCAIJAKQDAQURcHJpY2VBc3NldEJhbGFuY2UJAMwIAgIZIGFtb3VudEFzc2V0QmFsYW5jZURlbHRhPQkAzAgCCQCkAwEFF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhCQDMCAICGCBwcmljZUFzc2V0QmFsYW5jZURlbHRhPQkAzAgCCQCkAwEFFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEJAMwIAgIIIGhlaWdodD0JAMwIAgkApAMBBQZoZWlnaHQFA25pbAIACQCUCgIFDGlzT3JkZXJWYWxpZAUEaW5mbwEJY29tbW9uR2V0AQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIdZXhhY3RseSAxIHBheW1lbnQgaXMgZXhwZWN0ZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABApwbXRBc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEBnBtdEFtdAgFA3BtdAZhbW91bnQEA3JlcwkBFGVzdGltYXRlR2V0T3BlcmF0aW9uBAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEFCnBtdEFzc2V0SWQFBnBtdEFtdAgFAWkGY2FsbGVyBAhvdXRBbUFtdAgFA3JlcwJfMQQIb3V0UHJBbXQIBQNyZXMCXzIEBXN0YXRlCAUDcmVzA18xMAQNaXNHZXREaXNhYmxlZAMJAQEhAQkBFGlzQWRkcmVzc1doaXRlbGlzdGVkAQgFAWkGY2FsbGVyAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgcDBQ1pc0dldERpc2FibGVkCQACAQkArAICAixHZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4uIFN0YXR1cyA9IAkApAMBBQ1jZmdQb29sU3RhdHVzCQCXCgUFCG91dEFtQW10BQhvdXRQckFtdAUGcG10QW10BQpwbXRBc3NldElkBQVzdGF0ZQEJY29tbW9uUHV0AwFpEXNsaXBwYWdlVG9sZXJhbmNlBmVtaXRMcAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAgkAAgECH2V4YWN0bHkgMiBwYXltZW50cyBhcmUgZXhwZWN0ZWQECmFtQXNzZXRQbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQKcHJBc3NldFBtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAZlc3RQdXQJARRlc3RpbWF0ZVB1dE9wZXJhdGlvbgkJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAURc2xpcHBhZ2VUb2xlcmFuY2UIBQphbUFzc2V0UG10BmFtb3VudAgFCmFtQXNzZXRQbXQHYXNzZXRJZAgFCnByQXNzZXRQbXQGYW1vdW50CAUKcHJBc3NldFBtdAdhc3NldElkCQClCAEIBQFpBmNhbGxlcgcFBmVtaXRMcAQNaXNQdXREaXNhYmxlZAMJAQEhAQkBFGlzQWRkcmVzc1doaXRlbGlzdGVkAQgFAWkGY2FsbGVyAwMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBQ9Qb29sUHV0RGlzYWJsZWQGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duBwMFDWlzUHV0RGlzYWJsZWQJAAIBCQCsAgICLFB1dCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbi4gU3RhdHVzID0gCQCkAwEFDWNmZ1Bvb2xTdGF0dXMFBmVzdFB1dAEEZW1pdAEGYW1vdW50BAdlbWl0SW52CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEZW1pdAkAzAgCBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFB2VtaXRJbnYFB2VtaXRJbnYEDWVtaXRJbnZMZWdhY3kEByRtYXRjaDAFB2VtaXRJbnYDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQVbGVnYWN5RmFjdG9yeUNvbnRyYWN0BQckbWF0Y2gwCQD8BwQFFWxlZ2FjeUZhY3RvcnlDb250cmFjdAIEZW1pdAkAzAgCBQZhbW91bnQFA25pbAUDbmlsBQR1bml0AwkAAAIFDWVtaXRJbnZMZWdhY3kFDWVtaXRJbnZMZWdhY3kFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEHdGFrZUZlZQIGYW1vdW50A2ZlZQQJZmVlQW1vdW50AwkAAAIFA2ZlZQAAAAAJAGsDBQZhbW91bnQFA2ZlZQUGc2NhbGU4CQCUCgIJAGUCBQZhbW91bnQFCWZlZUFtb3VudAUJZmVlQW1vdW50AQ9jYWxjUHV0T25lVG9rZW4EEHBheW1lbnRBbW91bnRSYXcOcGF5bWVudEFzc2V0SWQLdXNlckFkZHJlc3MEdHhJZAQGaXNFdmFsCQAAAgUEdHhJZAUEdW5pdAQQYW1vdW50QmFsYW5jZVJhdwkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUQY2ZnQW1vdW50QXNzZXRJZAQPcHJpY2VCYWxhbmNlUmF3CQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBQ9jZmdQcmljZUFzc2V0SWQEFHBheW1lbnRJbkFtb3VudEFzc2V0AwkAAAIFDnBheW1lbnRBc3NldElkBRBjZmdBbW91bnRBc3NldElkBgMJAAACBQ5wYXltZW50QXNzZXRJZAUPY2ZnUHJpY2VBc3NldElkBwkBCHRocm93RXJyAQINaW52YWxpZCBhc3NldAQNJHQwMzM0NTUzMzc0OAMFBmlzRXZhbAkAlAoCBRBhbW91bnRCYWxhbmNlUmF3BQ9wcmljZUJhbGFuY2VSYXcDBRRwYXltZW50SW5BbW91bnRBc3NldAkAlAoCCQBlAgUQYW1vdW50QmFsYW5jZVJhdwUQcGF5bWVudEFtb3VudFJhdwUPcHJpY2VCYWxhbmNlUmF3CQCUCgIFEGFtb3VudEJhbGFuY2VSYXcJAGUCBQ9wcmljZUJhbGFuY2VSYXcFEHBheW1lbnRBbW91bnRSYXcEEGFtb3VudEJhbGFuY2VPbGQIBQ0kdDAzMzQ1NTMzNzQ4Al8xBA9wcmljZUJhbGFuY2VPbGQIBQ0kdDAzMzQ1NTMzNzQ4Al8yBA0kdDAzMzc1MjMzOTAxAwUUcGF5bWVudEluQW1vdW50QXNzZXQJAJQKAgUQcGF5bWVudEFtb3VudFJhdwAACQCUCgIAAAUQcGF5bWVudEFtb3VudFJhdwQUYW1vdW50QXNzZXRBbW91bnRSYXcIBQ0kdDAzMzc1MjMzOTAxAl8xBBNwcmljZUFzc2V0QW1vdW50UmF3CAUNJHQwMzM3NTIzMzkwMQJfMgQRYW1vdW50QXNzZXRBbW91bnQICQEHdGFrZUZlZQIFFGFtb3VudEFzc2V0QW1vdW50UmF3BQVpbkZlZQJfMQQQcHJpY2VBc3NldEFtb3VudAgJAQd0YWtlRmVlAgUTcHJpY2VBc3NldEFtb3VudFJhdwUFaW5GZWUCXzEEDSR0MDM0MDMzMzQwOTcJAQd0YWtlRmVlAgUQcGF5bWVudEFtb3VudFJhdwUFaW5GZWUEDXBheW1lbnRBbW91bnQIBQ0kdDAzNDAzMzM0MDk3Al8xBAlmZWVBbW91bnQIBQ0kdDAzNDAzMzM0MDk3Al8yBBBhbW91bnRCYWxhbmNlTmV3CQBkAgUQYW1vdW50QmFsYW5jZU9sZAURYW1vdW50QXNzZXRBbW91bnQED3ByaWNlQmFsYW5jZU5ldwkAZAIFD3ByaWNlQmFsYW5jZU9sZAUQcHJpY2VBc3NldEFtb3VudAQLcHJpY2VOZXdYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCCQEFdG9YMTgCBQ9wcmljZUJhbGFuY2VOZXcFFWNmZ1ByaWNlQXNzZXREZWNpbWFscwkBBXRvWDE4AgUQYW1vdW50QmFsYW5jZU5ldwUWY2ZnQW1vdW50QXNzZXREZWNpbWFscwQIcHJpY2VOZXcJAQdmcm9tWDE4AgULcHJpY2VOZXdYMTgFBnNjYWxlOAQOcGF5bWVudEJhbGFuY2UDBRRwYXltZW50SW5BbW91bnRBc3NldAUQYW1vdW50QmFsYW5jZU9sZAUPcHJpY2VCYWxhbmNlT2xkBBRwYXltZW50QmFsYW5jZUJpZ0ludAkAtgIBBQ5wYXltZW50QmFsYW5jZQQMc3VwcGx5QmlnSW50CQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUMY2ZnTHBBc3NldElkCQCsAgIJAKwCAgIGYXNzZXQgCQDYBAEFDGNmZ0xwQXNzZXRJZAIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEC2NoZWNoU3VwcGx5AwkAvwICBQxzdXBwbHlCaWdJbnQFBGJpZzAGCQEIdGhyb3dFcnIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFC2NoZWNoU3VwcGx5BQtjaGVjaFN1cHBseQQNZGVwb3NpdEJpZ0ludAkAtgIBBQ1wYXltZW50QW1vdW50BAtpc3N1ZUFtb3VudAkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALoCAgkAuQICBQxzdXBwbHlCaWdJbnQJALgCAgkBCnNxcnRCaWdJbnQECQC3AgIFB3NjYWxlMTgJALoCAgkAuQICBQ1kZXBvc2l0QmlnSW50BQdzY2FsZTE4BRRwYXltZW50QmFsYW5jZUJpZ0ludAASABIFBERPV04FB3NjYWxlMTgFB3NjYWxlMTgFA25pbAQLY29tbW9uU3RhdGUDBQZpc0V2YWwFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUIcHJpY2VOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFCHByaWNlTmV3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNwYXUCCQClCAEJAQV2YWx1ZQEFC3VzZXJBZGRyZXNzCQDYBAEJAQV2YWx1ZQEFBHR4SWQJARFkYXRhUHV0QWN0aW9uSW5mbwoFFGFtb3VudEFzc2V0QW1vdW50UmF3BRNwcmljZUFzc2V0QW1vdW50UmF3BQtpc3N1ZUFtb3VudAUIcHJpY2VOZXcAAAAABQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wAAAAAAUDbmlsBAtwcmljZU9sZFgxOAkBD2NhbGNQcmljZUJpZ0ludAIJAQV0b1gxOAIFD3ByaWNlQmFsYW5jZU9sZAUVY2ZnUHJpY2VBc3NldERlY2ltYWxzCQEFdG9YMTgCBRBhbW91bnRCYWxhbmNlT2xkBRZjZmdBbW91bnRBc3NldERlY2ltYWxzBAhwcmljZU9sZAkBB2Zyb21YMTgCBQtwcmljZU9sZFgxOAUGc2NhbGU4BARsb3NzBA0kdDAzNTc3ODM1OTQ1AwUUcGF5bWVudEluQW1vdW50QXNzZXQJAJQKAgUUYW1vdW50QXNzZXRBbW91bnRSYXcFEGFtb3VudEJhbGFuY2VPbGQJAJQKAgUTcHJpY2VBc3NldEFtb3VudFJhdwUPcHJpY2VCYWxhbmNlT2xkBAZhbW91bnQIBQ0kdDAzNTc3ODM1OTQ1Al8xBAdiYWxhbmNlCAUNJHQwMzU3NzgzNTk0NQJfMgQPaXNzdWVBbW91bnRCb3RoCQCgAwEJALwCAwUMc3VwcGx5QmlnSW50CQC2AgEJAGkCBQZhbW91bnQAAgkAtgIBBQdiYWxhbmNlCQBrAwkAZQIFC2lzc3VlQW1vdW50BQ9pc3N1ZUFtb3VudEJvdGgFBnNjYWxlOAUPaXNzdWVBbW91bnRCb3RoCQCXCgUFC2lzc3VlQW1vdW50BQtjb21tb25TdGF0ZQUJZmVlQW1vdW50BQRsb3NzBRRwYXltZW50SW5BbW91bnRBc3NldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEPY2FsY0dldE9uZVRva2VuBQpvdXRBc3NldElkDXBheW1lbnRBbW91bnQOcGF5bWVudEFzc2V0SWQLdXNlckFkZHJlc3MEdHhJZAQGaXNFdmFsCQAAAgUEdHhJZAUEdW5pdAQDY2ZnCQENZ2V0UG9vbENvbmZpZwAEC2FtdEFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ5pZHhBbXRBc3NldERjbQQNcHJpY2VBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUQaWR4UHJpY2VBc3NldERjbQQGY2hlY2tzCQDMCAIDCQAAAgUOcGF5bWVudEFzc2V0SWQFDGNmZ0xwQXNzZXRJZAYJAQh0aHJvd0VycgECEGludmFsaWQgbHAgYXNzZXQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQQb3V0SW5BbW91bnRBc3NldAMJAAACBQpvdXRBc3NldElkBRBjZmdBbW91bnRBc3NldElkBgMJAAACBQpvdXRBc3NldElkBQ9jZmdQcmljZUFzc2V0SWQHCQEIdGhyb3dFcnIBAg1pbnZhbGlkIGFzc2V0BA1iYWxhbmNlQmlnSW50AwUQb3V0SW5BbW91bnRBc3NldAkAtgIBCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBRBjZmdBbW91bnRBc3NldElkCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFD2NmZ1ByaWNlQXNzZXRJZAQYb3V0SW5BbW91bnRBc3NldERlY2ltYWxzAwUQb3V0SW5BbW91bnRBc3NldAULYW10QXNzZXREY20FDXByaWNlQXNzZXREY20EDGFtQmFsYW5jZU9sZAkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUQY2ZnQW1vdW50QXNzZXRJZAQMcHJCYWxhbmNlT2xkCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBQ9jZmdQcmljZUFzc2V0SWQECm91dEJhbGFuY2UDBRBvdXRJbkFtb3VudEFzc2V0BQxhbUJhbGFuY2VPbGQFDHByQmFsYW5jZU9sZAQQb3V0QmFsYW5jZUJpZ0ludAkAtgIBBQpvdXRCYWxhbmNlBAxzdXBwbHlCaWdJbnQJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQxjZmdMcEFzc2V0SWQJAKwCAgkArAICAgZhc3NldCAJANgEAQUMY2ZnTHBBc3NldElkAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQOcmVkZWVtZWRCaWdJbnQJALYCAQUNcGF5bWVudEFtb3VudAQJYW1vdW50UmF3CQCWAwEJAMwIAgAACQDMCAIJAKADAQkAugICCQC5AgIFDWJhbGFuY2VCaWdJbnQJALgCAgUHc2NhbGUxOAkAdgYJALgCAgUHc2NhbGUxOAkAugICCQC5AgIFDnJlZGVlbWVkQmlnSW50BQdzY2FsZTE4BQxzdXBwbHlCaWdJbnQAEgUEYmlnMgAAABIFBERPV04FB3NjYWxlMTgFA25pbAQNJHQwMzgwMjMzODA3OQkBB3Rha2VGZWUCBQlhbW91bnRSYXcFBm91dEZlZQQLdG90YWxBbW91bnQIBQ0kdDAzODAyMzM4MDc5Al8xBAlmZWVBbW91bnQIBQ0kdDAzODAyMzM4MDc5Al8yBA0kdDAzODA4MzM4MzA5AwUQb3V0SW5BbW91bnRBc3NldAkAlgoEBQt0b3RhbEFtb3VudAAACQBlAgUMYW1CYWxhbmNlT2xkBQlhbW91bnRSYXcFDHByQmFsYW5jZU9sZAkAlgoEAAAFC3RvdGFsQW1vdW50BQxhbUJhbGFuY2VPbGQJAGUCBQxwckJhbGFuY2VPbGQFCWFtb3VudFJhdwQLb3V0QW1BbW91bnQIBQ0kdDAzODA4MzM4MzA5Al8xBAtvdXRQckFtb3VudAgFDSR0MDM4MDgzMzgzMDkCXzIEDGFtQmFsYW5jZU5ldwgFDSR0MDM4MDgzMzgzMDkCXzMEDHByQmFsYW5jZU5ldwgFDSR0MDM4MDgzMzgzMDkCXzQEC3ByaWNlTmV3WDE4CQEPY2FsY1ByaWNlQmlnSW50AgkBBXRvWDE4AgUMcHJCYWxhbmNlTmV3BRVjZmdQcmljZUFzc2V0RGVjaW1hbHMJAQV0b1gxOAIFDGFtQmFsYW5jZU5ldwUWY2ZnQW1vdW50QXNzZXREZWNpbWFscwQIcHJpY2VOZXcJAQdmcm9tWDE4AgULcHJpY2VOZXdYMTgFBnNjYWxlOAQLY29tbW9uU3RhdGUDBQZpc0V2YWwFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQEDZ2F1AgkApQgBCQEFdmFsdWUBBQt1c2VyQWRkcmVzcwkA2AQBCQEFdmFsdWUBBQR0eElkCQERZGF0YUdldEFjdGlvbkluZm8GBQtvdXRBbUFtb3VudAULb3V0UHJBbW91bnQFDXBheW1lbnRBbW91bnQFCHByaWNlTmV3BQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQhwcmljZU5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIcHJpY2VOZXcFA25pbAQLcHJpY2VPbGRYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCCQEFdG9YMTgCBQxwckJhbGFuY2VPbGQFFWNmZ1ByaWNlQXNzZXREZWNpbWFscwkBBXRvWDE4AgUMYW1CYWxhbmNlT2xkBRZjZmdBbW91bnRBc3NldERlY2ltYWxzBAhwcmljZU9sZAkBB2Zyb21YMTgCBQtwcmljZU9sZFgxOAUGc2NhbGU4BARsb3NzBBhhbW91bnRCb3RoSW5QYXltZW50QXNzZXQJAGgCCQCgAwEJALwCAwUNYmFsYW5jZUJpZ0ludAUOcmVkZWVtZWRCaWdJbnQFDHN1cHBseUJpZ0ludAACCQBrAwkAZQIFC3RvdGFsQW1vdW50BRhhbW91bnRCb3RoSW5QYXltZW50QXNzZXQFBnNjYWxlOAUYYW1vdW50Qm90aEluUGF5bWVudEFzc2V0CQCXCgUFC3RvdGFsQW1vdW50BQtjb21tb25TdGF0ZQUJZmVlQW1vdW50BQRsb3NzBRBvdXRJbkFtb3VudEFzc2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQTbWFuYWdlclZhdWx0QWRkcmVzcwkBHGdldE1hbmFnZXJWYXVsdEFkZHJlc3NPclRoaXMABAckbWF0Y2gwCQCdCAIFE21hbmFnZXJWYXVsdEFkZHJlc3MJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBCWlzTWFuYWdlcgEBaQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawMJAAECBQckbWF0Y2gwAgRVbml0CQAAAggFAWkGY2FsbGVyBQR0aGlzCQACAQILTWF0Y2ggZXJyb3IBC211c3RNYW5hZ2VyAQFpBAJwZAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawYFAnBkAwkAAQIFByRtYXRjaDACBFVuaXQDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgUCcGQJAAIBAgtNYXRjaCBlcnJvchwBaQEJcmViYWxhbmNlAAkAzggCCQEOcmViYWxhbmNlQXNzZXQBCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAmFhAAkBDnJlYmFsYW5jZUFzc2V0AQkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJwYQABaQEhY2FsY3VsYXRlQW1vdW50T3V0Rm9yU3dhcFJFQURPTkxZAw1jbGVhbkFtb3VudEluCWlzUmV2ZXJzZQ1mZWVQb29sQW1vdW50BA0kdDA0MDE2NzQwNDcyAwkAAAIFCWlzUmV2ZXJzZQcECGFzc2V0T3V0CQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAQHYXNzZXRJbgkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJhYQAJAJQKAgUIYXNzZXRPdXQFB2Fzc2V0SW4ECGFzc2V0T3V0CQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAmFhAAQHYXNzZXRJbgkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJwYQAJAJQKAgUIYXNzZXRPdXQFB2Fzc2V0SW4ECGFzc2V0T3V0CAUNJHQwNDAxNjc0MDQ3MgJfMQQHYXNzZXRJbggFDSR0MDQwMTY3NDA0NzICXzIEEnBvb2xBc3NldEluQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQdhc3NldEluBBNwb29sQXNzZXRPdXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFCGFzc2V0T3V0BAlhbW91bnRPdXQJAGsDBRNwb29sQXNzZXRPdXRCYWxhbmNlBQ1jbGVhbkFtb3VudEluCQBkAgUScG9vbEFzc2V0SW5CYWxhbmNlBQ1jbGVhbkFtb3VudEluBARvbGRLCQC5AgIJALYCAQUScG9vbEFzc2V0SW5CYWxhbmNlCQC2AgEFE3Bvb2xBc3NldE91dEJhbGFuY2UEBG5ld0sJALkCAgkAtwICCQC3AgIJALYCAQkBDWdldEFjY0JhbGFuY2UBBQdhc3NldEluCQC2AgEFDWNsZWFuQW1vdW50SW4JALYCAQUNZmVlUG9vbEFtb3VudAkAuAICCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQUIYXNzZXRPdXQJALYCAQUJYW1vdW50T3V0BAZjaGVja0sDCQDAAgIFBG5ld0sFBG9sZEsGCQACAQIUbmV3IEsgaXMgZmV3ZXIgZXJyb3IDCQAAAgUGY2hlY2tLBQZjaGVja0sJAJQKAgUDbmlsBQlhbW91bnRPdXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEmY2FsY3VsYXRlQW1vdW50T3V0Rm9yU3dhcEFuZFNlbmRUb2tlbnMFDWNsZWFuQW1vdW50SW4JaXNSZXZlcnNlDGFtb3VudE91dE1pbglhZGRyZXNzVG8NZmVlUG9vbEFtb3VudAQLc3dhcENvbnRhY3QKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIXZ2V0U3dhcENvbnRyYWN0UkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwQSaXNQb29sU3dhcERpc2FibGVkCgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCGmlzUG9vbFN3YXBEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EDmlzU3dhcERpc2FibGVkAwkBASEBCQEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBCAUBaQZjYWxsZXIDAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgYFEmlzUG9vbFN3YXBEaXNhYmxlZAcEBmNoZWNrcwkAzAgCAwMJAQEhAQUOaXNTd2FwRGlzYWJsZWQGCQEJaXNNYW5hZ2VyAQUBaQYJAQh0aHJvd0VycgECInN3YXAgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAGcCCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNY2xlYW5BbW91bnRJbgYJAQh0aHJvd0VycgECDFdyb25nIGFtb3VudAkAzAgCAwkAAAIIBQFpBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQULc3dhcENvbnRhY3QGCQEIdGhyb3dFcnIBAhFQZXJtaXNzaW9uIGRlbmllZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQHYXNzZXRJbgkBD2Fzc2V0SWRUb1N0cmluZwEIBQNwbXQHYXNzZXRJZAQIYXNzZXRPdXQDCQAAAgUJaXNSZXZlcnNlBwkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJwYQAJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEABBJwb29sQXNzZXRJbkJhbGFuY2UJAGUCCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdhc3NldEluCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNZmVlUG9vbEFtb3VudAQTcG9vbEFzc2V0T3V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQhhc3NldE91dAQJYW1vdW50T3V0CQBrAwUTcG9vbEFzc2V0T3V0QmFsYW5jZQUNY2xlYW5BbW91bnRJbgkAZAIFEnBvb2xBc3NldEluQmFsYW5jZQUNY2xlYW5BbW91bnRJbgQEb2xkSwkAuQICCQC2AgEFEnBvb2xBc3NldEluQmFsYW5jZQkAtgIBBRNwb29sQXNzZXRPdXRCYWxhbmNlBARuZXdLCQC5AgIJALcCAgkAtgIBCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SW4JALYCAQUNZmVlUG9vbEFtb3VudAkAuAICCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQUIYXNzZXRPdXQJALYCAQUJYW1vdW50T3V0BAZjaGVja0sDCQDAAgIFBG5ld0sFBG9sZEsGCQACAQIUbmV3IEsgaXMgZmV3ZXIgZXJyb3IDCQAAAgUGY2hlY2tLBQZjaGVja0sECGNoZWNrTWluAwkAZwIFCWFtb3VudE91dAUMYW1vdW50T3V0TWluBgkAAgECLEV4Y2hhbmdlIHJlc3VsdCBpcyBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkAwkAAAIFCGNoZWNrTWluBQhjaGVja01pbgQXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEDBQlpc1JldmVyc2UJAQEtAQUJYW1vdW50T3V0BQ1mZWVQb29sQW1vdW50BBZwcmljZUFzc2V0QmFsYW5jZURlbHRhAwUJaXNSZXZlcnNlBQ1mZWVQb29sQW1vdW50CQEBLQEFCWFtb3VudE91dAQRcmVmcmVzaEtMcEFjdGlvbnMICQEScmVmcmVzaEtMcEludGVybmFsAwUXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEFFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEAAAJfMQMJAAACBRFyZWZyZXNoS0xwQWN0aW9ucwURcmVmcmVzaEtMcEFjdGlvbnMEDnJlYmFsYW5jZVN0YXRlCQEOcmViYWxhbmNlQXNzZXQBBQdhc3NldEluAwkAAAIFDnJlYmFsYW5jZVN0YXRlBQ5yZWJhbGFuY2VTdGF0ZQQNd2l0aGRyYXdTdGF0ZQkBGXdpdGhkcmF3QW5kUmViYWxhbmNlQXNzZXQCBQhhc3NldE91dAUJYW1vdW50T3V0AwkAAAIFDXdpdGhkcmF3U3RhdGUFDXdpdGhkcmF3U3RhdGUJAJQKAgkAzggCCQDOCAIFDXdpdGhkcmF3U3RhdGUFDnJlYmFsYW5jZVN0YXRlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCWFkZHJlc3NUbwUJYW1vdW50T3V0CQEMcGFyc2VBc3NldElkAQUIYXNzZXRPdXQFA25pbAUJYW1vdW50T3V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBA3B1dAIRc2xpcHBhZ2VUb2xlcmFuY2UPc2hvdWxkQXV0b1N0YWtlAwkAZgIAAAURc2xpcHBhZ2VUb2xlcmFuY2UJAAIBAiBJbnZhbGlkIHNsaXBwYWdlVG9sZXJhbmNlIHBhc3NlZAQGZXN0UHV0CQEJY29tbW9uUHV0AwUBaQURc2xpcHBhZ2VUb2xlcmFuY2UGBAllbWl0THBBbXQIBQZlc3RQdXQCXzIECWxwQXNzZXRJZAgFBmVzdFB1dAJfNwQFc3RhdGUIBQZlc3RQdXQCXzkEBmFtRGlmZggFBmVzdFB1dANfMTAEBnByRGlmZggFBmVzdFB1dANfMTEEBGFtSWQIBQZlc3RQdXQDXzEyBARwcklkCAUGZXN0UHV0A18xMwQKYW1Bc3NldFBtdAkAtgIBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKcHJBc3NldFBtdAkAtgIBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwUKYW1Bc3NldFBtdAUKcHJBc3NldFBtdAkAtgIBAAADCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQHZW1pdEludgkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCBGVtaXQJAMwIAgUJZW1pdExwQW10BQNuaWwFA25pbAMJAAACBQdlbWl0SW52BQdlbWl0SW52BA1lbWl0SW52TGVnYWN5BAckbWF0Y2gwBQdlbWl0SW52AwkAAQIFByRtYXRjaDACB0FkZHJlc3MEFWxlZ2FjeUZhY3RvcnlDb250cmFjdAUHJG1hdGNoMAkA/AcEBRVsZWdhY3lGYWN0b3J5Q29udHJhY3QCBGVtaXQJAMwIAgUJZW1pdExwQW10BQNuaWwFA25pbAUEdW5pdAMJAAACBQ1lbWl0SW52TGVnYWN5BQ1lbWl0SW52TGVnYWN5BAxzbGlwcGFnZUFJbnYDCQBmAgUGYW1EaWZmAAAJAPwHBAUQc2xpcHBhZ2VDb250cmFjdAIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBGFtSWQFBmFtRGlmZgUDbmlsBQNuaWwDCQAAAgUMc2xpcHBhZ2VBSW52BQxzbGlwcGFnZUFJbnYEDHNsaXBwYWdlUEludgMJAGYCBQZwckRpZmYAAAkA/AcEBRBzbGlwcGFnZUNvbnRyYWN0AgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEcHJJZAUGcHJEaWZmBQNuaWwFA25pbAMJAAACBQxzbGlwcGFnZVBJbnYFDHNsaXBwYWdlUEludgQKbHBUcmFuc2ZlcgMFD3Nob3VsZEF1dG9TdGFrZQQLc2xwU3Rha2VJbnYJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQlscEFzc2V0SWQFCWVtaXRMcEFtdAUDbmlsAwkAAAIFC3NscFN0YWtlSW52BQtzbHBTdGFrZUludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUJZW1pdExwQW10BQlscEFzc2V0SWQFA25pbAQNJHQwNDU2NDg0NjExMAkBEnJlZnJlc2hLTHBJbnRlcm5hbAMAAAAAAAADCQAAAgUNJHQwNDU2NDg0NjExMAUNJHQwNDU2NDg0NjExMAQKdXBkYXRlZEtMcAgFDSR0MDQ1NjQ4NDYxMTACXzIEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNDU2NDg0NjExMAJfMQQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAQDcmViCQD8BwQFBHRoaXMCCXJlYmFsYW5jZQUDbmlsBQNuaWwDCQAAAgUDcmViBQNyZWIJAM4IAgkAzggCBQVzdGF0ZQUKbHBUcmFuc2ZlcgURcmVmcmVzaEtMcEFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKcHV0Rm9yRnJlZQELbWF4U2xpcHBhZ2UDCQBmAgAABQttYXhTbGlwcGFnZQkAAgECFEludmFsaWQgdmFsdWUgcGFzc2VkBAZlc3RQdXQJAQljb21tb25QdXQDBQFpBQttYXhTbGlwcGFnZQcEBXN0YXRlCAUGZXN0UHV0Al85BAphbUFzc2V0UG10CQC2AgEICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BApwckFzc2V0UG10CQC2AgEICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50BApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADBQphbUFzc2V0UG10BQpwckFzc2V0UG10CQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBA0kdDA0NjcyMjQ2Nzg3CQEScmVmcmVzaEtMcEludGVybmFsAwAAAAAAAAQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA0NjcyMjQ2Nzg3Al8xBAp1cGRhdGVkS0xwCAUNJHQwNDY3MjI0Njc4NwJfMgQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAkAzggCBQVzdGF0ZQURcmVmcmVzaEtMcEFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJcHV0T25lVGtuAgxtaW5PdXRBbW91bnQJYXV0b1N0YWtlBCBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0Aihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EDWlzUHV0RGlzYWJsZWQDCQEBIQEJARRpc0FkZHJlc3NXaGl0ZWxpc3RlZAEIBQFpBmNhbGxlcgMDAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFD1Bvb2xQdXREaXNhYmxlZAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24GBSBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAcEBmNoZWNrcwkAzAgCAwMJAQEhAQUNaXNQdXREaXNhYmxlZAYJAQlpc01hbmFnZXIBBQFpBgkBCHRocm93RXJyAQIhcHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEB3BheW1lbnQJAJEDAggFAWkIcGF5bWVudHMAAAQOcGF5bWVudEFzc2V0SWQIBQdwYXltZW50B2Fzc2V0SWQEEHBheW1lbnRBbW91bnRSYXcIBQdwYXltZW50BmFtb3VudAQKY3VycmVudEtMcAMJAAACBQ5wYXltZW50QXNzZXRJZAUQY2ZnQW1vdW50QXNzZXRJZAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBBRBwYXltZW50QW1vdW50UmF3CQC2AgEAAAkAtgIBAAADCQAAAgUOcGF5bWVudEFzc2V0SWQFD2NmZ1ByaWNlQXNzZXRJZAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBAAAJALYCAQUQcGF5bWVudEFtb3VudFJhdwkAtgIBAAAJAQh0aHJvd0VycgECHnBheW1lbnQgYXNzZXQgaXMgbm90IHN1cHBvcnRlZAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBAt1c2VyQWRkcmVzcwgFAWkGY2FsbGVyBAR0eElkCAUBaQ10cmFuc2FjdGlvbklkBA0kdDA0ODAxNjQ4MTY4CQEPY2FsY1B1dE9uZVRva2VuBAUQcGF5bWVudEFtb3VudFJhdwUOcGF5bWVudEFzc2V0SWQFC3VzZXJBZGRyZXNzBQR0eElkAwkAAAIFDSR0MDQ4MDE2NDgxNjgFDSR0MDQ4MDE2NDgxNjgEFHBheW1lbnRJbkFtb3VudEFzc2V0CAUNJHQwNDgwMTY0ODE2OAJfNQQFYm9udXMIBQ0kdDA0ODAxNjQ4MTY4Al80BAlmZWVBbW91bnQIBQ0kdDA0ODAxNjQ4MTY4Al8zBAtjb21tb25TdGF0ZQgFDSR0MDQ4MDE2NDgxNjgCXzIEE2VtaXRBbW91bnRFc3RpbWF0ZWQIBQ0kdDA0ODAxNjQ4MTY4Al8xBAplbWl0QW1vdW50AwMJAGYCBQxtaW5PdXRBbW91bnQAAAkAZgIFDG1pbk91dEFtb3VudAUTZW1pdEFtb3VudEVzdGltYXRlZAcJAQh0aHJvd0VycgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUMbWluT3V0QW1vdW50BQNuaWwCAAUTZW1pdEFtb3VudEVzdGltYXRlZAQHZW1pdEludgkBBGVtaXQBBQplbWl0QW1vdW50AwkAAAIFB2VtaXRJbnYFB2VtaXRJbnYECmxwVHJhbnNmZXIDBQlhdXRvU3Rha2UECHN0YWtlSW52CQD8BwQFD3N0YWtpbmdDb250cmFjdAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMY2ZnTHBBc3NldElkBQplbWl0QW1vdW50BQNuaWwDCQAAAgUIc3Rha2VJbnYFCHN0YWtlSW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQplbWl0QW1vdW50BQxjZmdMcEFzc2V0SWQFA25pbAQHc2VuZEZlZQMJAGYCBQlmZWVBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmZWVDb2xsZWN0b3JBZGRyZXNzBQlmZWVBbW91bnQFDnBheW1lbnRBc3NldElkBQNuaWwFA25pbAQNJHQwNDg3NTQ0ODk1MQMJAAACBQR0aGlzBRNmZWVDb2xsZWN0b3JBZGRyZXNzCQCUCgIAAAAAAwUUcGF5bWVudEluQW1vdW50QXNzZXQJAJQKAgkBAS0BBQlmZWVBbW91bnQAAAkAlAoCAAAJAQEtAQUJZmVlQW1vdW50BBdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDQ4NzU0NDg5NTECXzEEFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDA0ODc1NDQ4OTUxAl8yBA0kdDA0ODk1NDQ5MDYyCQEScmVmcmVzaEtMcEludGVybmFsAwUXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEFFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEAAAQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA0ODk1NDQ5MDYyAl8xBAp1cGRhdGVkS0xwCAUNJHQwNDg5NTQ0OTA2MgJfMgQDa0xwCQEFdmFsdWUBCQCiCAEFBmtleUtMcAQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAQDcmViCQD8BwQFBHRoaXMCCXJlYmFsYW5jZQUDbmlsBQNuaWwDCQAAAgUDcmViBQNyZWIJAJQKAgkAzggCCQDOCAIJAM4IAgULY29tbW9uU3RhdGUFCmxwVHJhbnNmZXIFB3NlbmRGZWUFEXJlZnJlc2hLTHBBY3Rpb25zBQplbWl0QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXB1dE9uZVRrblJFQURPTkxZAg5wYXltZW50QXNzZXRJZBBwYXltZW50QW1vdW50UmF3BA0kdDA0OTQxNzQ5NTc0CQEPY2FsY1B1dE9uZVRva2VuBAUQcGF5bWVudEFtb3VudFJhdwkBDHBhcnNlQXNzZXRJZAEFDnBheW1lbnRBc3NldElkBQR1bml0BQR1bml0BBNlbWl0QW1vdW50RXN0aW1hdGVkCAUNJHQwNDk0MTc0OTU3NAJfMQQLY29tbW9uU3RhdGUIBQ0kdDA0OTQxNzQ5NTc0Al8yBAlmZWVBbW91bnQIBQ0kdDA0OTQxNzQ5NTc0Al8zBAVib251cwgFDSR0MDQ5NDE3NDk1NzQCXzQEFHBheW1lbnRJbkFtb3VudEFzc2V0CAUNJHQwNDk0MTc0OTU3NAJfNQkAlAoCBQNuaWwJAJUKAwUTZW1pdEFtb3VudEVzdGltYXRlZAUJZmVlQW1vdW50BQVib251cwFpAQlnZXRPbmVUa24CDW91dEFzc2V0SWRTdHIMbWluT3V0QW1vdW50BCBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0Aihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EDWlzR2V0RGlzYWJsZWQDCQEBIQEJARRpc0FkZHJlc3NXaGl0ZWxpc3RlZAEIBQFpBmNhbGxlcgMDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duBgUgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQHBAZjaGVja3MJAMwIAgMDCQEBIQEFDWlzR2V0RGlzYWJsZWQGCQEJaXNNYW5hZ2VyAQUBaQYJAQh0aHJvd0VycgECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApvdXRBc3NldElkCQEMcGFyc2VBc3NldElkAQUNb3V0QXNzZXRJZFN0cgQHcGF5bWVudAkAkQMCCAUBaQhwYXltZW50cwAABA5wYXltZW50QXNzZXRJZAgFB3BheW1lbnQHYXNzZXRJZAQNcGF5bWVudEFtb3VudAgFB3BheW1lbnQGYW1vdW50BApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAEC3VzZXJBZGRyZXNzCAUBaQZjYWxsZXIEBHR4SWQIBQFpDXRyYW5zYWN0aW9uSWQEDSR0MDUwNDk2NTA2NDkJAQ9jYWxjR2V0T25lVG9rZW4FBQpvdXRBc3NldElkBQ1wYXltZW50QW1vdW50BQ5wYXltZW50QXNzZXRJZAULdXNlckFkZHJlc3MFBHR4SWQDCQAAAgUNJHQwNTA0OTY1MDY0OQUNJHQwNTA0OTY1MDY0OQQQb3V0SW5BbW91bnRBc3NldAgFDSR0MDUwNDk2NTA2NDkCXzUEBWJvbnVzCAUNJHQwNTA0OTY1MDY0OQJfNAQJZmVlQW1vdW50CAUNJHQwNTA0OTY1MDY0OQJfMwQLY29tbW9uU3RhdGUIBQ0kdDA1MDQ5NjUwNjQ5Al8yBA9hbW91bnRFc3RpbWF0ZWQIBQ0kdDA1MDQ5NjUwNjQ5Al8xBAZhbW91bnQDAwkAZgIFDG1pbk91dEFtb3VudAAACQBmAgUMbWluT3V0QW1vdW50BQ9hbW91bnRFc3RpbWF0ZWQHCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFDG1pbk91dEFtb3VudAUDbmlsAgAFD2Ftb3VudEVzdGltYXRlZAQHYnVybkludgkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCBGJ1cm4JAMwIAgUNcGF5bWVudEFtb3VudAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQ5wYXltZW50QXNzZXRJZAUNcGF5bWVudEFtb3VudAUDbmlsAwkAAAIFB2J1cm5JbnYFB2J1cm5JbnYEDXdpdGhkcmF3U3RhdGUJARl3aXRoZHJhd0FuZFJlYmFsYW5jZUFzc2V0AgUNb3V0QXNzZXRJZFN0cgkAZAIFBmFtb3VudAkAlgMBCQDMCAIAAAkAzAgCBQlmZWVBbW91bnQFA25pbAQNYXNzZXRUcmFuc2ZlcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUGYW1vdW50BQpvdXRBc3NldElkBQNuaWwEB3NlbmRGZWUDCQBmAgUJZmVlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmVlQ29sbGVjdG9yQWRkcmVzcwUJZmVlQW1vdW50BQpvdXRBc3NldElkBQNuaWwFA25pbAQNJHQwNTEzMTM1MTU2MAQQZmVlQW1vdW50Rm9yQ2FsYwMJAAACBQR0aGlzBRNmZWVDb2xsZWN0b3JBZGRyZXNzAAAFCWZlZUFtb3VudAMFEG91dEluQW1vdW50QXNzZXQJAJQKAgkBAS0BCQBkAgUGYW1vdW50BRBmZWVBbW91bnRGb3JDYWxjAAAJAJQKAgAACQEBLQEJAGQCBQZhbW91bnQFEGZlZUFtb3VudEZvckNhbGMEF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhCAUNJHQwNTEzMTM1MTU2MAJfMQQWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDUxMzEzNTE1NjACXzIEDSR0MDUxNTYzNTE2NzEJARJyZWZyZXNoS0xwSW50ZXJuYWwDBRdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQUWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDUxNTYzNTE2NzECXzEECnVwZGF0ZWRLTHAIBQ0kdDA1MTU2MzUxNjcxAl8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgULY29tbW9uU3RhdGUFDXdpdGhkcmF3U3RhdGUFDWFzc2V0VHJhbnNmZXIFB3NlbmRGZWUFEXJlZnJlc2hLTHBBY3Rpb25zBQZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERZ2V0T25lVGtuUkVBRE9OTFkCCm91dEFzc2V0SWQNcGF5bWVudEFtb3VudAQNJHQwNTE5NDk1MjEwNQkBD2NhbGNHZXRPbmVUb2tlbgUJAQxwYXJzZUFzc2V0SWQBBQpvdXRBc3NldElkBQ1wYXltZW50QW1vdW50BQxjZmdMcEFzc2V0SWQFBHVuaXQFBHVuaXQED2Ftb3VudEVzdGltYXRlZAgFDSR0MDUxOTQ5NTIxMDUCXzEEC2NvbW1vblN0YXRlCAUNJHQwNTE5NDk1MjEwNQJfMgQJZmVlQW1vdW50CAUNJHQwNTE5NDk1MjEwNQJfMwQFYm9udXMIBQ0kdDA1MTk0OTUyMTA1Al80BBBvdXRJbkFtb3VudEFzc2V0CAUNJHQwNTE5NDk1MjEwNQJfNQkAlAoCBQNuaWwJAJUKAwUPYW1vdW50RXN0aW1hdGVkBQlmZWVBbW91bnQFBWJvbnVzAWkBE3Vuc3Rha2VBbmRHZXRPbmVUa24DDXVuc3Rha2VBbW91bnQNb3V0QXNzZXRJZFN0cgxtaW5PdXRBbW91bnQEIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkCgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQFAAgdCb29sZWFuBQFACQACAQkArAICCQADAQUBQAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQNaXNHZXREaXNhYmxlZAMJAQEhAQkBFGlzQWRkcmVzc1doaXRlbGlzdGVkAQgFAWkGY2FsbGVyAwMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24GBSBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAcEBmNoZWNrcwkAzAgCAwMJAQEhAQUNaXNHZXREaXNhYmxlZAYJAQlpc01hbmFnZXIBBQFpBgkBCHRocm93RXJyAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkBCHRocm93RXJyAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MECm91dEFzc2V0SWQJAQxwYXJzZUFzc2V0SWQBBQ1vdXRBc3NldElkU3RyBAt1c2VyQWRkcmVzcwgFAWkGY2FsbGVyBAR0eElkCAUBaQ10cmFuc2FjdGlvbklkBApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAECnVuc3Rha2VJbnYJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Agd1bnN0YWtlCQDMCAIJANgEAQUMY2ZnTHBBc3NldElkCQDMCAIFDXVuc3Rha2VBbW91bnQFA25pbAUDbmlsAwkAAAIFCnVuc3Rha2VJbnYFCnVuc3Rha2VJbnYEDSR0MDUzMDQ3NTMxOTgJAQ9jYWxjR2V0T25lVG9rZW4FBQpvdXRBc3NldElkBQ11bnN0YWtlQW1vdW50BQxjZmdMcEFzc2V0SWQFC3VzZXJBZGRyZXNzBQR0eElkAwkAAAIFDSR0MDUzMDQ3NTMxOTgFDSR0MDUzMDQ3NTMxOTgEEG91dEluQW1vdW50QXNzZXQIBQ0kdDA1MzA0NzUzMTk4Al81BAVib251cwgFDSR0MDUzMDQ3NTMxOTgCXzQECWZlZUFtb3VudAgFDSR0MDUzMDQ3NTMxOTgCXzMEC2NvbW1vblN0YXRlCAUNJHQwNTMwNDc1MzE5OAJfMgQPYW1vdW50RXN0aW1hdGVkCAUNJHQwNTMwNDc1MzE5OAJfMQQGYW1vdW50AwMJAGYCBQxtaW5PdXRBbW91bnQAAAkAZgIFDG1pbk91dEFtb3VudAUPYW1vdW50RXN0aW1hdGVkBwkBCHRocm93RXJyAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQxtaW5PdXRBbW91bnQFA25pbAIABQ9hbW91bnRFc3RpbWF0ZWQEB2J1cm5JbnYJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRidXJuCQDMCAIFDXVuc3Rha2VBbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMY2ZnTHBBc3NldElkBQ11bnN0YWtlQW1vdW50BQNuaWwDCQAAAgUHYnVybkludgUHYnVybkludgQNd2l0aGRyYXdTdGF0ZQkBGXdpdGhkcmF3QW5kUmViYWxhbmNlQXNzZXQCBQ1vdXRBc3NldElkU3RyCQBkAgUGYW1vdW50CQCWAwEJAMwIAgAACQDMCAIFCWZlZUFtb3VudAUDbmlsBA1hc3NldFRyYW5zZmVyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50BQpvdXRBc3NldElkBQNuaWwEB3NlbmRGZWUDCQBmAgUJZmVlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmVlQ29sbGVjdG9yQWRkcmVzcwUJZmVlQW1vdW50BQpvdXRBc3NldElkBQNuaWwFA25pbAQNJHQwNTM4NTc1NDEwNAQQZmVlQW1vdW50Rm9yQ2FsYwMJAAACBQR0aGlzBRNmZWVDb2xsZWN0b3JBZGRyZXNzAAAFCWZlZUFtb3VudAMFEG91dEluQW1vdW50QXNzZXQJAJQKAgkBAS0BCQBkAgUGYW1vdW50BRBmZWVBbW91bnRGb3JDYWxjAAAJAJQKAgAACQEBLQEJAGQCBQZhbW91bnQFEGZlZUFtb3VudEZvckNhbGMEF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhCAUNJHQwNTM4NTc1NDEwNAJfMQQWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDUzODU3NTQxMDQCXzIEDSR0MDU0MTA3NTQyMTUJARJyZWZyZXNoS0xwSW50ZXJuYWwDBRdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQUWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDU0MTA3NTQyMTUCXzEECnVwZGF0ZWRLTHAIBQ0kdDA1NDEwNzU0MjE1Al8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgULY29tbW9uU3RhdGUFDXdpdGhkcmF3U3RhdGUFDWFzc2V0VHJhbnNmZXIFB3NlbmRGZWUFEXJlZnJlc2hLTHBBY3Rpb25zBQZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEDZ2V0AAQDcmVzCQEJY29tbW9uR2V0AQUBaQQIb3V0QW1BbXQIBQNyZXMCXzEECG91dFByQW10CAUDcmVzAl8yBAZwbXRBbXQIBQNyZXMCXzMECnBtdEFzc2V0SWQIBQNyZXMCXzQEBXN0YXRlCAUDcmVzAl81BA13aXRoZHJhd1N0YXRlCQEXd2l0aGRyYXdBbmRSZWJhbGFuY2VBbGwCBQhvdXRBbUFtdAUIb3V0UHJBbXQECmN1cnJlbnRLTHAJAQ5jYWxjQ3VycmVudEtMcAMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQUYnVybkxQQXNzZXRPbkZhY3RvcnkJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRidXJuCQDMCAIFBnBtdEFtdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQZwbXRBbXQFA25pbAMJAAACBRRidXJuTFBBc3NldE9uRmFjdG9yeQUUYnVybkxQQXNzZXRPbkZhY3RvcnkEDSR0MDU1MzEwNTUzOTEJARJyZWZyZXNoS0xwSW50ZXJuYWwDCQEBLQEFCG91dEFtQW10CQEBLQEFCG91dFByQW10AAAEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNTUzMTA1NTM5MQJfMQQKdXBkYXRlZEtMcAgFDSR0MDU1MzEwNTUzOTECXzIEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQJAM4IAgkAzggCBQ13aXRoZHJhd1N0YXRlBQVzdGF0ZQURcmVmcmVzaEtMcEFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJZ2V0Tm9MZXNzAhJub0xlc3NUaGVuQW10QXNzZXQUbm9MZXNzVGhlblByaWNlQXNzZXQEA3JlcwkBCWNvbW1vbkdldAEFAWkECG91dEFtQW10CAUDcmVzAl8xBAhvdXRQckFtdAgFA3JlcwJfMgQGcG10QW10CAUDcmVzAl8zBApwbXRBc3NldElkCAUDcmVzAl80BAVzdGF0ZQgFA3JlcwJfNQMJAGYCBRJub0xlc3NUaGVuQW10QXNzZXQFCG91dEFtQW10CQACAQkArAICCQCsAgIJAKwCAgIcbm9MZXNzVGhlbkFtdEFzc2V0IGZhaWxlZDogIAkApAMBBQhvdXRBbUFtdAIDIDwgCQCkAwEFEm5vTGVzc1RoZW5BbXRBc3NldAMJAGYCBRRub0xlc3NUaGVuUHJpY2VBc3NldAUIb3V0UHJBbXQJAAIBCQCsAgIJAKwCAgkArAICAh1ub0xlc3NUaGVuUHJpY2VBc3NldCBmYWlsZWQ6IAkApAMBBQhvdXRQckFtdAIDIDwgCQCkAwEFFG5vTGVzc1RoZW5QcmljZUFzc2V0BA13aXRoZHJhd1N0YXRlCQEXd2l0aGRyYXdBbmRSZWJhbGFuY2VBbGwCBQhvdXRBbUFtdAUIb3V0UHJBbXQECmN1cnJlbnRLTHAJAQ5jYWxjQ3VycmVudEtMcAMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQUYnVybkxQQXNzZXRPbkZhY3RvcnkJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRidXJuCQDMCAIFBnBtdEFtdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQZwbXRBbXQFA25pbAMJAAACBRRidXJuTFBBc3NldE9uRmFjdG9yeQUUYnVybkxQQXNzZXRPbkZhY3RvcnkEDSR0MDU2NDg2NTY1NjcJARJyZWZyZXNoS0xwSW50ZXJuYWwDCQEBLQEFCG91dEFtQW10CQEBLQEFCG91dFByQW10AAAEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNTY0ODY1NjU2NwJfMQQKdXBkYXRlZEtMcAgFDSR0MDU2NDg2NTY1NjcCXzIEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQJAM4IAgkAzggCBQ13aXRoZHJhd1N0YXRlBQVzdGF0ZQURcmVmcmVzaEtMcEFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdW5zdGFrZUFuZEdldAEGYW1vdW50BA1jaGVja1BheW1lbnRzAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIYTm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBgMJAAACBQ1jaGVja1BheW1lbnRzBQ1jaGVja1BheW1lbnRzBANjZmcJAQ1nZXRQb29sQ29uZmlnAAQJbHBBc3NldElkCQDZBAEJAJEDAgUDY2ZnBRBpZHhQb29sTFBBc3NldElkBApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAECnVuc3Rha2VJbnYJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Agd1bnN0YWtlCQDMCAIJANgEAQUJbHBBc3NldElkCQDMCAIFBmFtb3VudAUDbmlsBQNuaWwDCQAAAgUKdW5zdGFrZUludgUKdW5zdGFrZUludgQDcmVzCQEUZXN0aW1hdGVHZXRPcGVyYXRpb24ECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQUJbHBBc3NldElkBQZhbW91bnQIBQFpBmNhbGxlcgQIb3V0QW1BbXQIBQNyZXMCXzEECG91dFByQW10CAUDcmVzAl8yBApwb29sU3RhdHVzCQENcGFyc2VJbnRWYWx1ZQEIBQNyZXMCXzkEBXN0YXRlCAUDcmVzA18xMAQNd2l0aGRyYXdTdGF0ZQkBF3dpdGhkcmF3QW5kUmViYWxhbmNlQWxsAgUIb3V0QW1BbXQFCG91dFByQW10BA1pc0dldERpc2FibGVkAwkBASEBCQEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBCAUBaQZjYWxsZXIDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duBwQPY2hlY2tQb29sU3RhdHVzAwUNaXNHZXREaXNhYmxlZAkAAgEJAKwCAgIsR2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAKQDAQUKcG9vbFN0YXR1cwYDCQAAAgUPY2hlY2tQb29sU3RhdHVzBQ9jaGVja1Bvb2xTdGF0dXMEFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEYnVybgkAzAgCBQZhbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUJbHBBc3NldElkBQZhbW91bnQFA25pbAMJAAACBRRidXJuTFBBc3NldE9uRmFjdG9yeQUUYnVybkxQQXNzZXRPbkZhY3RvcnkEDSR0MDU3OTE1NTc5OTYJARJyZWZyZXNoS0xwSW50ZXJuYWwDCQEBLQEFCG91dEFtQW10CQEBLQEFCG91dFByQW10AAAEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNTc5MTU1Nzk5NgJfMQQKdXBkYXRlZEtMcAgFDSR0MDU3OTE1NTc5OTYCXzIEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQJAM4IAgkAzggCBQ13aXRoZHJhd1N0YXRlBQVzdGF0ZQURcmVmcmVzaEtMcEFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETdW5zdGFrZUFuZEdldE5vTGVzcwMNdW5zdGFrZUFtb3VudBVub0xlc3NUaGVuQW1vdW50QXNzZXQUbm9MZXNzVGhlblByaWNlQXNzZXQEDWlzR2V0RGlzYWJsZWQDCQEBIQEJARRpc0FkZHJlc3NXaGl0ZWxpc3RlZAEIBQFpBmNhbGxlcgMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24HBAZjaGVja3MJAMwIAgMJAQEhAQUNaXNHZXREaXNhYmxlZAYJAAIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAGCQACAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MECmN1cnJlbnRLTHAJAQ5jYWxjQ3VycmVudEtMcAMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQKdW5zdGFrZUludgkA/AcEBQ9zdGFraW5nQ29udHJhY3QCB3Vuc3Rha2UJAMwIAgkA2AQBBQxjZmdMcEFzc2V0SWQJAMwIAgUNdW5zdGFrZUFtb3VudAUDbmlsBQNuaWwDCQAAAgUKdW5zdGFrZUludgUKdW5zdGFrZUludgQDcmVzCQEUZXN0aW1hdGVHZXRPcGVyYXRpb24ECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQUMY2ZnTHBBc3NldElkBQ11bnN0YWtlQW1vdW50CAUBaQZjYWxsZXIECG91dEFtQW10CAUDcmVzAl8xBAhvdXRQckFtdAgFA3JlcwJfMgQFc3RhdGUIBQNyZXMDXzEwBA13aXRoZHJhd1N0YXRlCQEXd2l0aGRyYXdBbmRSZWJhbGFuY2VBbGwCBQhvdXRBbUFtdAUIb3V0UHJBbXQEDGNoZWNrQW1vdW50cwkAzAgCAwkAZwIFCG91dEFtQW10BRVub0xlc3NUaGVuQW1vdW50QXNzZXQGCQACAQkAuQkCCQDMCAICLGFtb3VudCBhc3NldCBhbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUVbm9MZXNzVGhlbkFtb3VudEFzc2V0BQNuaWwCAAkAzAgCAwkAZwIFCG91dFByQW10BRRub0xlc3NUaGVuUHJpY2VBc3NldAYJAAIBCQC5CQIJAMwIAgIrcHJpY2UgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFFG5vTGVzc1RoZW5QcmljZUFzc2V0BQNuaWwCAAUDbmlsAwkAAAIFDGNoZWNrQW1vdW50cwUMY2hlY2tBbW91bnRzBBRidXJuTFBBc3NldE9uRmFjdG9yeQkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCBGJ1cm4JAMwIAgUNdW5zdGFrZUFtb3VudAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxjZmdMcEFzc2V0SWQFDXVuc3Rha2VBbW91bnQFA25pbAMJAAACBRRidXJuTFBBc3NldE9uRmFjdG9yeQUUYnVybkxQQXNzZXRPbkZhY3RvcnkEDSR0MDU5NDc0NTk1NTUJARJyZWZyZXNoS0xwSW50ZXJuYWwDCQEBLQEFCG91dEFtQW10CQEBLQEFCG91dFByQW10AAAEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNTk0NzQ1OTU1NQJfMQQKdXBkYXRlZEtMcAgFDSR0MDU5NDc0NTk1NTUCXzIEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQJAM4IAgkAzggCBQ13aXRoZHJhd1N0YXRlBQVzdGF0ZQURcmVmcmVzaEtMcEFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIYWN0aXZhdGUCC2FtdEFzc2V0U3RyDXByaWNlQXNzZXRTdHIDCQECIT0CCQClCAEIBQFpBmNhbGxlcgkApQgBBQ9mYWN0b3J5Q29udHJhY3QJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWEABQthbXRBc3NldFN0cgkAzAgCCQELU3RyaW5nRW50cnkCCQECcGEABQ1wcmljZUFzc2V0U3RyBQNuaWwCB3N1Y2Nlc3MBaQEKcmVmcmVzaEtMcAAEGGxhc3RSZWZyZXNoZWRCbG9ja0hlaWdodAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRVrZXlLTHBSZWZyZXNoZWRIZWlnaHQAAAQdY2hlY2tMYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQDCQBnAgkAZQIFBmhlaWdodAUYbGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0BQ9rTHBSZWZyZXNoRGVsYXkFBHVuaXQJAQh0aHJvd0VycgEJALkJAgkAzAgCCQCkAwEFD2tMcFJlZnJlc2hEZWxheQkAzAgCAi8gYmxvY2tzIGhhdmUgbm90IHBhc3NlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbAUDbmlsAgADCQAAAgUdY2hlY2tMYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQFHWNoZWNrTGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0BANrTHAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtleUtMcAIBMAkBBmZtdEVycgECC2ludmFsaWQga0xwBA0kdDA2MDc1OTYwODIzCQEScmVmcmVzaEtMcEludGVybmFsAwAAAAAAAAQQa0xwVXBkYXRlQWN0aW9ucwgFDSR0MDYwNzU5NjA4MjMCXzEECnVwZGF0ZWRLTHAIBQ0kdDA2MDc1OTYwODIzAl8yBAdhY3Rpb25zAwkBAiE9AgUDa0xwBQp1cGRhdGVkS0xwBRBrTHBVcGRhdGVBY3Rpb25zCQEIdGhyb3dFcnIBAhJub3RoaW5nIHRvIHJlZnJlc2gJAJQKAgUHYWN0aW9ucwkApgMBBQp1cGRhdGVkS0xwCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkACQCUCgIFA25pbAkBDWdldFBvb2xDb25maWcAAWkBHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkBB2Fzc2V0SWQJAJQKAgUDbmlsCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SWQBaQEZY2FsY1ByaWNlc1dyYXBwZXJSRUFET05MWQMFYW1BbXQFcHJBbXQFbHBBbXQEBnByaWNlcwkBCmNhbGNQcmljZXMDBQVhbUFtdAUFcHJBbXQFBWxwQW10CQCUCgIFA25pbAkAzAgCCQCmAwEJAJEDAgUGcHJpY2VzAAAJAMwIAgkApgMBCQCRAwIFBnByaWNlcwABCQDMCAIJAKYDAQkAkQMCBQZwcmljZXMAAgUDbmlsAWkBFHRvWDE4V3JhcHBlclJFQURPTkxZAgdvcmlnVmFsDW9yaWdTY2FsZU11bHQJAJQKAgUDbmlsCQCmAwEJAQV0b1gxOAIFB29yaWdWYWwFDW9yaWdTY2FsZU11bHQBaQEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIDdmFsD3Jlc3VsdFNjYWxlTXVsdAkAlAoCBQNuaWwJAQdmcm9tWDE4AgkApwMBBQN2YWwFD3Jlc3VsdFNjYWxlTXVsdAFpAR5jYWxjUHJpY2VCaWdJbnRXcmFwcGVyUkVBRE9OTFkCCHByQW10WDE4CGFtQW10WDE4CQCUCgIFA25pbAkApgMBCQEPY2FsY1ByaWNlQmlnSW50AgkApwMBBQhwckFtdFgxOAkApwMBBQhhbUFtdFgxOAFpASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkGdHhJZDU4EXNsaXBwYWdlVG9sZXJhbmNlDGluQW1Bc3NldEFtdAtpbkFtQXNzZXRJZAxpblByQXNzZXRBbXQLaW5QckFzc2V0SWQLdXNlckFkZHJlc3MKaXNFdmFsdWF0ZQZlbWl0THAJAJQKAgUDbmlsCQEUZXN0aW1hdGVQdXRPcGVyYXRpb24JBQZ0eElkNTgFEXNsaXBwYWdlVG9sZXJhbmNlBQxpbkFtQXNzZXRBbXQFC2luQW1Bc3NldElkBQxpblByQXNzZXRBbXQFC2luUHJBc3NldElkBQt1c2VyQWRkcmVzcwUKaXNFdmFsdWF0ZQUGZW1pdExwAWkBI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAZ0eElkNTgKcG10QXNzZXRJZAhwbXRMcEFtdAt1c2VyQWRkcmVzcwQDcmVzCQEUZXN0aW1hdGVHZXRPcGVyYXRpb24EBQZ0eElkNTgFCnBtdEFzc2V0SWQFCHBtdExwQW10CQERQGV4dHJOYXRpdmUoMTA2MikBBQt1c2VyQWRkcmVzcwkAlAoCBQNuaWwJAJwKCggFA3JlcwJfMQgFA3JlcwJfMggFA3JlcwJfMwgFA3JlcwJfNAgFA3JlcwJfNQgFA3JlcwJfNggFA3JlcwJfNwkApgMBCAUDcmVzAl84CAUDcmVzAl85CAUDcmVzA18xMAFpAQ1zdGF0c1JFQURPTkxZAAQDY2ZnCQENZ2V0UG9vbENvbmZpZwAECWxwQXNzZXRJZAkA2QQBCQCRAwIFA2NmZwUQaWR4UG9vbExQQXNzZXRJZAQKYW10QXNzZXRJZAkAkQMCBQNjZmcFDWlkeEFtdEFzc2V0SWQEDHByaWNlQXNzZXRJZAkAkQMCBQNjZmcFD2lkeFByaWNlQXNzZXRJZAQLaUFtdEFzc2V0SWQJAJEDAgUDY2ZnBQ5pZHhJQW10QXNzZXRJZAQNaVByaWNlQXNzZXRJZAkAkQMCBQNjZmcFEGlkeElQcmljZUFzc2V0SWQEC2FtdEFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ5pZHhBbXRBc3NldERjbQQNcHJpY2VBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUQaWR4UHJpY2VBc3NldERjbQQNcG9vbExQQmFsYW5jZQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQlscEFzc2V0SWQJAKwCAgkArAICAgZBc3NldCAJANgEAQUJbHBBc3NldElkAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQSYWNjQW10QXNzZXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFCmFtdEFzc2V0SWQEFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFDHByaWNlQXNzZXRJZAQKcHJpY2VzTGlzdAMJAAACBQ1wb29sTFBCYWxhbmNlAAAJAMwIAgUKemVyb0JpZ0ludAkAzAgCBQp6ZXJvQmlnSW50CQDMCAIFCnplcm9CaWdJbnQFA25pbAkBCmNhbGNQcmljZXMDBRJhY2NBbXRBc3NldEJhbGFuY2UFFGFjY1ByaWNlQXNzZXRCYWxhbmNlBQ1wb29sTFBCYWxhbmNlBAhjdXJQcmljZQAABA9scEFtdEFzc2V0U2hhcmUJAQdmcm9tWDE4AgkAkQMCBQpwcmljZXNMaXN0AAEFBnNjYWxlOAQRbHBQcmljZUFzc2V0U2hhcmUJAQdmcm9tWDE4AgkAkQMCBQpwcmljZXNMaXN0AAIFBnNjYWxlOAQKcG9vbFdlaWdodAkBBXZhbHVlAQkAmggCBQ9mYWN0b3J5Q29udHJhY3QJAQ1rZXlQb29sV2VpZ2h0AQkApQgBBQR0aGlzCQCUCgIFA25pbAkAuQkCCQDMCAICDiVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUSYWNjQW10QXNzZXRCYWxhbmNlCQDMCAIJAKQDAQUUYWNjUHJpY2VBc3NldEJhbGFuY2UJAMwIAgkApAMBBQ1wb29sTFBCYWxhbmNlCQDMCAIJAKQDAQUIY3VyUHJpY2UJAMwIAgkApAMBBQ9scEFtdEFzc2V0U2hhcmUJAMwIAgkApAMBBRFscFByaWNlQXNzZXRTaGFyZQkAzAgCCQCkAwEFCnBvb2xXZWlnaHQFA25pbAUDU0VQAWkBIGV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZAQxpbkFtQXNzZXRBbXQEA2NmZwkBDWdldFBvb2xDb25maWcABAlscEFzc2V0SWQJANkEAQkAkQMCBQNjZmcFEGlkeFBvb2xMUEFzc2V0SWQEDGFtQXNzZXRJZFN0cgkAkQMCBQNjZmcFDWlkeEFtdEFzc2V0SWQECWFtQXNzZXRJZAkA2QQBBQxhbUFzc2V0SWRTdHIEDHByQXNzZXRJZFN0cgkAkQMCBQNjZmcFD2lkeFByaWNlQXNzZXRJZAQJcHJBc3NldElkCQDZBAEFDHByQXNzZXRJZFN0cgQLYW10QXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDmlkeEFtdEFzc2V0RGNtBA1wcmljZUFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBRBpZHhQcmljZUFzc2V0RGNtBApwb29sU3RhdHVzCQCRAwIFA2NmZwUNaWR4UG9vbFN0YXR1cwQNcG9vbExQQmFsYW5jZQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQlscEFzc2V0SWQJAKwCAgkArAICAgZBc3NldCAJANgEAQUJbHBBc3NldElkAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQSYWNjQW10QXNzZXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFDGFtQXNzZXRJZFN0cgQUYWNjUHJpY2VBc3NldEJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUMcHJBc3NldElkU3RyBA5hbXRBc3NldEFtdFgxOAkBBXRvWDE4AgUSYWNjQW10QXNzZXRCYWxhbmNlBQthbXRBc3NldERjbQQQcHJpY2VBc3NldEFtdFgxOAkBBXRvWDE4AgUUYWNjUHJpY2VBc3NldEJhbGFuY2UFDXByaWNlQXNzZXREY20EC2N1clByaWNlWDE4AwkAAAIFDXBvb2xMUEJhbGFuY2UAAAUKemVyb0JpZ0ludAkBD2NhbGNQcmljZUJpZ0ludAIFEHByaWNlQXNzZXRBbXRYMTgFDmFtdEFzc2V0QW10WDE4BA9pbkFtQXNzZXRBbXRYMTgJAQV0b1gxOAIFDGluQW1Bc3NldEFtdAULYW10QXNzZXREY20ED2luUHJBc3NldEFtdFgxOAkAvAIDBQ9pbkFtQXNzZXRBbXRYMTgFC2N1clByaWNlWDE4BQdzY2FsZTE4BAxpblByQXNzZXRBbXQJAQdmcm9tWDE4AgUPaW5QckFzc2V0QW10WDE4BQ1wcmljZUFzc2V0RGNtBAZlc3RQdXQJARRlc3RpbWF0ZVB1dE9wZXJhdGlvbgkCAACgwh4FDGluQW1Bc3NldEFtdAUJYW1Bc3NldElkBQxpblByQXNzZXRBbXQFCXByQXNzZXRJZAIABgcECWNhbGNMcEFtdAgFBmVzdFB1dAJfMQQMY3VyUHJpY2VDYWxjCAUGZXN0UHV0Al8zBAlhbUJhbGFuY2UIBQZlc3RQdXQCXzQECXByQmFsYW5jZQgFBmVzdFB1dAJfNQQKbHBFbWlzc2lvbggFBmVzdFB1dAJfNgkAlAoCBQNuaWwJALkJAgkAzAgCAhAlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUJY2FsY0xwQW10CQDMCAIJAKQDAQkBB2Zyb21YMTgCBQtjdXJQcmljZVgxOAUGc2NhbGU4CQDMCAIJAKQDAQUJYW1CYWxhbmNlCQDMCAIJAKQDAQUJcHJCYWxhbmNlCQDMCAIJAKQDAQUKbHBFbWlzc2lvbgkAzAgCBQpwb29sU3RhdHVzCQDMCAIJAKQDAQUMaW5BbUFzc2V0QW10CQDMCAIJAKQDAQUMaW5QckFzc2V0QW10BQNuaWwFA1NFUAFpAR9ldmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZAQxpblByQXNzZXRBbXQEA2NmZwkBDWdldFBvb2xDb25maWcABAlscEFzc2V0SWQJANkEAQkAkQMCBQNjZmcFEGlkeFBvb2xMUEFzc2V0SWQEDGFtQXNzZXRJZFN0cgkAkQMCBQNjZmcFDWlkeEFtdEFzc2V0SWQECWFtQXNzZXRJZAkA2QQBBQxhbUFzc2V0SWRTdHIEDHByQXNzZXRJZFN0cgkAkQMCBQNjZmcFD2lkeFByaWNlQXNzZXRJZAQJcHJBc3NldElkCQDZBAEFDHByQXNzZXRJZFN0cgQLYW10QXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDmlkeEFtdEFzc2V0RGNtBA1wcmljZUFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBRBpZHhQcmljZUFzc2V0RGNtBApwb29sU3RhdHVzCQCRAwIFA2NmZwUNaWR4UG9vbFN0YXR1cwQNcG9vbExQQmFsYW5jZQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQlscEFzc2V0SWQJAKwCAgkArAICAgZBc3NldCAJANgEAQUJbHBBc3NldElkAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQMYW1CYWxhbmNlUmF3CQENZ2V0QWNjQmFsYW5jZQEFDGFtQXNzZXRJZFN0cgQMcHJCYWxhbmNlUmF3CQENZ2V0QWNjQmFsYW5jZQEFDHByQXNzZXRJZFN0cgQPYW1CYWxhbmNlUmF3WDE4CQEFdG9YMTgCBQxhbUJhbGFuY2VSYXcFC2FtdEFzc2V0RGNtBA9wckJhbGFuY2VSYXdYMTgJAQV0b1gxOAIFDHByQmFsYW5jZVJhdwUNcHJpY2VBc3NldERjbQQLY3VyUHJpY2VYMTgDCQAAAgUNcG9vbExQQmFsYW5jZQAABQp6ZXJvQmlnSW50CQEPY2FsY1ByaWNlQmlnSW50AgUPcHJCYWxhbmNlUmF3WDE4BQ9hbUJhbGFuY2VSYXdYMTgED2luUHJBc3NldEFtdFgxOAkBBXRvWDE4AgUMaW5QckFzc2V0QW10BQ1wcmljZUFzc2V0RGNtBA9pbkFtQXNzZXRBbXRYMTgJALwCAwUPaW5QckFzc2V0QW10WDE4BQdzY2FsZTE4BQtjdXJQcmljZVgxOAQMaW5BbUFzc2V0QW10CQEHZnJvbVgxOAIFD2luQW1Bc3NldEFtdFgxOAULYW10QXNzZXREY20EBmVzdFB1dAkBFGVzdGltYXRlUHV0T3BlcmF0aW9uCQIAAKDCHgUMaW5BbUFzc2V0QW10BQlhbUFzc2V0SWQFDGluUHJBc3NldEFtdAUJcHJBc3NldElkAgAGBwQJY2FsY0xwQW10CAUGZXN0UHV0Al8xBAxjdXJQcmljZUNhbGMIBQZlc3RQdXQCXzMECWFtQmFsYW5jZQgFBmVzdFB1dAJfNAQJcHJCYWxhbmNlCAUGZXN0UHV0Al81BApscEVtaXNzaW9uCAUGZXN0UHV0Al82CQCUCgIFA25pbAkAuQkCCQDMCAICECVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQljYWxjTHBBbXQJAMwIAgkApAMBCQEHZnJvbVgxOAIFC2N1clByaWNlWDE4BQZzY2FsZTgJAMwIAgkApAMBBQlhbUJhbGFuY2UJAMwIAgkApAMBBQlwckJhbGFuY2UJAMwIAgkApAMBBQpscEVtaXNzaW9uCQDMCAIFCnBvb2xTdGF0dXMJAMwIAgkApAMBBQxpbkFtQXNzZXRBbXQJAMwIAgkApAMBBQxpblByQXNzZXRBbXQFA25pbAUDU0VQAWkBE2V2YWx1YXRlR2V0UkVBRE9OTFkCEHBheW1lbnRMcEFzc2V0SWQMcGF5bWVudExwQW10BANyZXMJARRlc3RpbWF0ZUdldE9wZXJhdGlvbgQCAAUQcGF5bWVudExwQXNzZXRJZAUMcGF5bWVudExwQW10BQR0aGlzBAhvdXRBbUFtdAgFA3JlcwJfMQQIb3V0UHJBbXQIBQNyZXMCXzIECWFtQmFsYW5jZQgFA3JlcwJfNQQJcHJCYWxhbmNlCAUDcmVzAl82BApscEVtaXNzaW9uCAUDcmVzAl83BAhjdXJQcmljZQgFA3JlcwJfOAQKcG9vbFN0YXR1cwkBDXBhcnNlSW50VmFsdWUBCAUDcmVzAl85CQCUCgIFA25pbAkAuQkCCQDMCAICDiVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUIb3V0QW1BbXQJAMwIAgkApAMBBQhvdXRQckFtdAkAzAgCCQCkAwEFCWFtQmFsYW5jZQkAzAgCCQCkAwEFCXByQmFsYW5jZQkAzAgCCQCkAwEFCmxwRW1pc3Npb24JAMwIAgkApgMBBQhjdXJQcmljZQkAzAgCCQCkAwEFCnBvb2xTdGF0dXMFA25pbAUDU0VQAQJ0eAEGdmVyaWZ5AAQPdGFyZ2V0UHVibGljS2V5BAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIFT3JkZXIEBW9yZGVyBQckbWF0Y2gwBAptYXRjaGVyUHViCQETZ2V0TWF0Y2hlclB1Yk9yRmFpbAAEDSR0MDY5NDg1Njk2MDIDCQETc2tpcE9yZGVyVmFsaWRhdGlvbgAJAJQKAgYCAAkBG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZAEFBW9yZGVyBApvcmRlclZhbGlkCAUNJHQwNjk0ODU2OTYwMgJfMQQOb3JkZXJWYWxpZEluZm8IBQ0kdDA2OTQ4NTY5NjAyAl8yBAtzZW5kZXJWYWxpZAkA9AMDCAUFb3JkZXIJYm9keUJ5dGVzCQCRAwIIBQVvcmRlcgZwcm9vZnMAAAgFBW9yZGVyD3NlbmRlclB1YmxpY0tleQQMbWF0Y2hlclZhbGlkCQD0AwMIBQVvcmRlcglib2R5Qnl0ZXMJAJEDAggFBW9yZGVyBnByb29mcwABBQptYXRjaGVyUHViAwMDBQpvcmRlclZhbGlkBQtzZW5kZXJWYWxpZAcFDG1hdGNoZXJWYWxpZAcGCQEPdGhyb3dPcmRlckVycm9yBAUKb3JkZXJWYWxpZAUOb3JkZXJWYWxpZEluZm8FC3NlbmRlclZhbGlkBQxtYXRjaGVyVmFsaWQDCQABAgUHJG1hdGNoMAIUU2V0U2NyaXB0VHJhbnNhY3Rpb24EAXMFByRtYXRjaDADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXkGBAduZXdIYXNoCQD2AwEJAQV2YWx1ZQEIBQFzBnNjcmlwdAQLYWxsb3dlZEhhc2gJANsEAQkBBXZhbHVlAQkAnQgCBQ9mYWN0b3J5Q29udHJhY3QJARZrZXlBbGxvd2VkTHBTY3JpcHRIYXNoAAQLY3VycmVudEhhc2gJAPEHAQUEdGhpcwMJAAACBQthbGxvd2VkSGFzaAUHbmV3SGFzaAkBAiE9AgULY3VycmVudEhhc2gFB25ld0hhc2gHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXkke20V", "height": 2986007, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FsiYSLSi2LwLFrvsx8cKu4b35Gx4Zz5UowqZA9H4x5xE Next: HGZ2CAgzanPgqCjsWFqeBrkAaDF3cEErpndPzLAFjDr4 Diff:
OldNewDifferences
470470 then {
471471 let withdrawAmount = (currentAdditionalBalance - newAdditionalBalance)
472472 if ((withdrawAmount == withdrawAmount))
473- then if ((0 > withdrawAmount))
474- then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
475- else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
473+ then if ((withdrawAmount == 0))
474+ then nil
475+ else if ((0 > withdrawAmount))
476+ then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
477+ else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
476478 else throw("Strict value is not equal to itself.")
477479 }
478480 else throw("Strict value is not equal to itself.")
676678 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
677679 let amountAssetAmount = order.amount
678680 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
679- let $t02947529687 = if ((order.orderType == Buy))
681+ let $t02951729729 = if ((order.orderType == Buy))
680682 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
681683 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
682- let amountAssetBalanceDelta = $t02947529687._1
683- let priceAssetBalanceDelta = $t02947529687._2
684+ let amountAssetBalanceDelta = $t02951729729._1
685+ let priceAssetBalanceDelta = $t02951729729._2
684686 if (if (if (isGlobalShutdown())
685687 then true
686688 else (cfgPoolStatus == PoolMatcherDisabled))
693695 then throw("Wrong order assets.")
694696 else {
695697 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
696- let $t03012730227 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
697- let unusedActions = $t03012730227._1
698- let kLpNew = $t03012730227._2
698+ let $t03016930269 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
699+ let unusedActions = $t03016930269._1
700+ let kLpNew = $t03016930269._2
699701 let isOrderValid = (kLpNew >= kLp)
700702 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
701703 $Tuple2(isOrderValid, info)
778780 else if ((paymentAssetId == cfgPriceAssetId))
779781 then false
780782 else throwErr("invalid asset")
781- let $t03341333706 = if (isEval)
783+ let $t03345533748 = if (isEval)
782784 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
783785 else if (paymentInAmountAsset)
784786 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
785787 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
786- let amountBalanceOld = $t03341333706._1
787- let priceBalanceOld = $t03341333706._2
788- let $t03371033859 = if (paymentInAmountAsset)
788+ let amountBalanceOld = $t03345533748._1
789+ let priceBalanceOld = $t03345533748._2
790+ let $t03375233901 = if (paymentInAmountAsset)
789791 then $Tuple2(paymentAmountRaw, 0)
790792 else $Tuple2(0, paymentAmountRaw)
791- let amountAssetAmountRaw = $t03371033859._1
792- let priceAssetAmountRaw = $t03371033859._2
793+ let amountAssetAmountRaw = $t03375233901._1
794+ let priceAssetAmountRaw = $t03375233901._2
793795 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
794796 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
795- let $t03399134055 = takeFee(paymentAmountRaw, inFee)
796- let paymentAmount = $t03399134055._1
797- let feeAmount = $t03399134055._2
797+ let $t03403334097 = takeFee(paymentAmountRaw, inFee)
798+ let paymentAmount = $t03403334097._1
799+ let feeAmount = $t03403334097._2
798800 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
799801 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
800802 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
817819 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
818820 let priceOld = fromX18(priceOldX18, scale8)
819821 let loss = {
820- let $t03573635903 = if (paymentInAmountAsset)
822+ let $t03577835945 = if (paymentInAmountAsset)
821823 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
822824 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
823- let amount = $t03573635903._1
824- let balance = $t03573635903._2
825+ let amount = $t03577835945._1
826+ let balance = $t03577835945._2
825827 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
826828 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
827829 }
861863 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
862864 let redeemedBigInt = toBigInt(paymentAmount)
863865 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
864- let $t03798138037 = takeFee(amountRaw, outFee)
865- let totalAmount = $t03798138037._1
866- let feeAmount = $t03798138037._2
867- let $t03804138267 = if (outInAmountAsset)
866+ let $t03802338079 = takeFee(amountRaw, outFee)
867+ let totalAmount = $t03802338079._1
868+ let feeAmount = $t03802338079._2
869+ let $t03808338309 = if (outInAmountAsset)
868870 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
869871 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
870- let outAmAmount = $t03804138267._1
871- let outPrAmount = $t03804138267._2
872- let amBalanceNew = $t03804138267._3
873- let prBalanceNew = $t03804138267._4
872+ let outAmAmount = $t03808338309._1
873+ let outPrAmount = $t03808338309._2
874+ let amBalanceNew = $t03808338309._3
875+ let prBalanceNew = $t03808338309._4
874876 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
875877 let priceNew = fromX18(priceNewX18, scale8)
876878 let commonState = if (isEval)
935937
936938 @Callable(i)
937939 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
938- let $t04012540430 = if ((isReverse == false))
940+ let $t04016740472 = if ((isReverse == false))
939941 then {
940942 let assetOut = getStringOrFail(this, pa())
941943 let assetIn = getStringOrFail(this, aa())
946948 let assetIn = getStringOrFail(this, pa())
947949 $Tuple2(assetOut, assetIn)
948950 }
949- let assetOut = $t04012540430._1
950- let assetIn = $t04012540430._2
951+ let assetOut = $t04016740472._1
952+ let assetIn = $t04016740472._2
951953 let poolAssetInBalance = getAccBalance(assetIn)
952954 let poolAssetOutBalance = getAccBalance(assetOut)
953955 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
10911093 else throw("Strict value is not equal to itself.")
10921094 }
10931095 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1094- let $t04560646068 = refreshKLpInternal(0, 0, 0)
1095- if (($t04560646068 == $t04560646068))
1096+ let $t04564846110 = refreshKLpInternal(0, 0, 0)
1097+ if (($t04564846110 == $t04564846110))
10961098 then {
1097- let updatedKLp = $t04560646068._2
1098- let refreshKLpActions = $t04560646068._1
1099+ let updatedKLp = $t04564846110._2
1100+ let refreshKLpActions = $t04564846110._1
10991101 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11001102 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11011103 then {
11321134 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
11331135 if ((currentKLp == currentKLp))
11341136 then {
1135- let $t04668046745 = refreshKLpInternal(0, 0, 0)
1136- let refreshKLpActions = $t04668046745._1
1137- let updatedKLp = $t04668046745._2
1137+ let $t04672246787 = refreshKLpInternal(0, 0, 0)
1138+ let refreshKLpActions = $t04672246787._1
1139+ let updatedKLp = $t04672246787._2
11381140 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11391141 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11401142 then (state ++ refreshKLpActions)
11831185 then {
11841186 let userAddress = i.caller
11851187 let txId = i.transactionId
1186- let $t04797448126 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1187- if (($t04797448126 == $t04797448126))
1188+ let $t04801648168 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1189+ if (($t04801648168 == $t04801648168))
11881190 then {
1189- let paymentInAmountAsset = $t04797448126._5
1190- let bonus = $t04797448126._4
1191- let feeAmount = $t04797448126._3
1192- let commonState = $t04797448126._2
1193- let emitAmountEstimated = $t04797448126._1
1191+ let paymentInAmountAsset = $t04801648168._5
1192+ let bonus = $t04801648168._4
1193+ let feeAmount = $t04801648168._3
1194+ let commonState = $t04801648168._2
1195+ let emitAmountEstimated = $t04801648168._1
11941196 let emitAmount = if (if ((minOutAmount > 0))
11951197 then (minOutAmount > emitAmountEstimated)
11961198 else false)
12101212 let sendFee = if ((feeAmount > 0))
12111213 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
12121214 else nil
1213- let $t04871248909 = if ((this == feeCollectorAddress))
1215+ let $t04875448951 = if ((this == feeCollectorAddress))
12141216 then $Tuple2(0, 0)
12151217 else if (paymentInAmountAsset)
12161218 then $Tuple2(-(feeAmount), 0)
12171219 else $Tuple2(0, -(feeAmount))
1218- let amountAssetBalanceDelta = $t04871248909._1
1219- let priceAssetBalanceDelta = $t04871248909._2
1220- let $t04891249020 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1221- let refreshKLpActions = $t04891249020._1
1222- let updatedKLp = $t04891249020._2
1220+ let amountAssetBalanceDelta = $t04875448951._1
1221+ let priceAssetBalanceDelta = $t04875448951._2
1222+ let $t04895449062 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1223+ let refreshKLpActions = $t04895449062._1
1224+ let updatedKLp = $t04895449062._2
12231225 let kLp = value(getString(keyKLp))
12241226 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12251227 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12441246
12451247 @Callable(i)
12461248 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
1247- let $t04937549532 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1248- let emitAmountEstimated = $t04937549532._1
1249- let commonState = $t04937549532._2
1250- let feeAmount = $t04937549532._3
1251- let bonus = $t04937549532._4
1252- let paymentInAmountAsset = $t04937549532._5
1249+ let $t04941749574 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1250+ let emitAmountEstimated = $t04941749574._1
1251+ let commonState = $t04941749574._2
1252+ let feeAmount = $t04941749574._3
1253+ let bonus = $t04941749574._4
1254+ let paymentInAmountAsset = $t04941749574._5
12531255 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
12541256 }
12551257
12881290 then {
12891291 let userAddress = i.caller
12901292 let txId = i.transactionId
1291- let $t05045450607 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1292- if (($t05045450607 == $t05045450607))
1293+ let $t05049650649 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1294+ if (($t05049650649 == $t05049650649))
12931295 then {
1294- let outInAmountAsset = $t05045450607._5
1295- let bonus = $t05045450607._4
1296- let feeAmount = $t05045450607._3
1297- let commonState = $t05045450607._2
1298- let amountEstimated = $t05045450607._1
1296+ let outInAmountAsset = $t05049650649._5
1297+ let bonus = $t05049650649._4
1298+ let feeAmount = $t05049650649._3
1299+ let commonState = $t05049650649._2
1300+ let amountEstimated = $t05049650649._1
12991301 let amount = if (if ((minOutAmount > 0))
13001302 then (minOutAmount > amountEstimated)
13011303 else false)
13091311 let sendFee = if ((feeAmount > 0))
13101312 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
13111313 else nil
1312- let $t05127151518 = {
1314+ let $t05131351560 = {
13131315 let feeAmountForCalc = if ((this == feeCollectorAddress))
13141316 then 0
13151317 else feeAmount
13171319 then $Tuple2(-((amount + feeAmountForCalc)), 0)
13181320 else $Tuple2(0, -((amount + feeAmountForCalc)))
13191321 }
1320- let amountAssetBalanceDelta = $t05127151518._1
1321- let priceAssetBalanceDelta = $t05127151518._2
1322- let $t05152151629 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1323- let refreshKLpActions = $t05152151629._1
1324- let updatedKLp = $t05152151629._2
1322+ let amountAssetBalanceDelta = $t05131351560._1
1323+ let priceAssetBalanceDelta = $t05131351560._2
1324+ let $t05156351671 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1325+ let refreshKLpActions = $t05156351671._1
1326+ let updatedKLp = $t05156351671._2
13251327 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13261328 if ((isUpdatedKLpValid == isUpdatedKLpValid))
13271329 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
13401342
13411343 @Callable(i)
13421344 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1343- let $t05190752063 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1344- let amountEstimated = $t05190752063._1
1345- let commonState = $t05190752063._2
1346- let feeAmount = $t05190752063._3
1347- let bonus = $t05190752063._4
1348- let outInAmountAsset = $t05190752063._5
1345+ let $t05194952105 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1346+ let amountEstimated = $t05194952105._1
1347+ let commonState = $t05194952105._2
1348+ let feeAmount = $t05194952105._3
1349+ let bonus = $t05194952105._4
1350+ let outInAmountAsset = $t05194952105._5
13491351 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
13501352 }
13511353
13841386 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13851387 if ((unstakeInv == unstakeInv))
13861388 then {
1387- let $t05300553156 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1388- if (($t05300553156 == $t05300553156))
1389+ let $t05304753198 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1390+ if (($t05304753198 == $t05304753198))
13891391 then {
1390- let outInAmountAsset = $t05300553156._5
1391- let bonus = $t05300553156._4
1392- let feeAmount = $t05300553156._3
1393- let commonState = $t05300553156._2
1394- let amountEstimated = $t05300553156._1
1392+ let outInAmountAsset = $t05304753198._5
1393+ let bonus = $t05304753198._4
1394+ let feeAmount = $t05304753198._3
1395+ let commonState = $t05304753198._2
1396+ let amountEstimated = $t05304753198._1
13951397 let amount = if (if ((minOutAmount > 0))
13961398 then (minOutAmount > amountEstimated)
13971399 else false)
14051407 let sendFee = if ((feeAmount > 0))
14061408 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
14071409 else nil
1408- let $t05381554062 = {
1410+ let $t05385754104 = {
14091411 let feeAmountForCalc = if ((this == feeCollectorAddress))
14101412 then 0
14111413 else feeAmount
14131415 then $Tuple2(-((amount + feeAmountForCalc)), 0)
14141416 else $Tuple2(0, -((amount + feeAmountForCalc)))
14151417 }
1416- let amountAssetBalanceDelta = $t05381554062._1
1417- let priceAssetBalanceDelta = $t05381554062._2
1418- let $t05406554173 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1419- let refreshKLpActions = $t05406554173._1
1420- let updatedKLp = $t05406554173._2
1418+ let amountAssetBalanceDelta = $t05385754104._1
1419+ let priceAssetBalanceDelta = $t05385754104._2
1420+ let $t05410754215 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1421+ let refreshKLpActions = $t05410754215._1
1422+ let updatedKLp = $t05410754215._2
14211423 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14221424 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14231425 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
14511453 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14521454 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14531455 then {
1454- let $t05526855349 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1455- let refreshKLpActions = $t05526855349._1
1456- let updatedKLp = $t05526855349._2
1456+ let $t05531055391 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1457+ let refreshKLpActions = $t05531055391._1
1458+ let updatedKLp = $t05531055391._2
14571459 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14581460 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14591461 then ((withdrawState ++ state) ++ refreshKLpActions)
14861488 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14871489 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14881490 then {
1489- let $t05644456525 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1490- let refreshKLpActions = $t05644456525._1
1491- let updatedKLp = $t05644456525._2
1491+ let $t05648656567 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1492+ let refreshKLpActions = $t05648656567._1
1493+ let updatedKLp = $t05648656567._2
14921494 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14931495 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14941496 then ((withdrawState ++ state) ++ refreshKLpActions)
15361538 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15371539 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15381540 then {
1539- let $t05787357954 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1540- let refreshKLpActions = $t05787357954._1
1541- let updatedKLp = $t05787357954._2
1541+ let $t05791557996 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1542+ let refreshKLpActions = $t05791557996._1
1543+ let updatedKLp = $t05791557996._2
15421544 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15431545 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15441546 then ((withdrawState ++ state) ++ refreshKLpActions)
15921594 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15931595 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15941596 then {
1595- let $t05943259513 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1596- let refreshKLpActions = $t05943259513._1
1597- let updatedKLp = $t05943259513._2
1597+ let $t05947459555 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1598+ let refreshKLpActions = $t05947459555._1
1599+ let updatedKLp = $t05947459555._2
15981600 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15991601 if ((isUpdatedKLpValid == isUpdatedKLpValid))
16001602 then ((withdrawState ++ state) ++ refreshKLpActions)
16291631 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
16301632 then {
16311633 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1632- let $t06071760781 = refreshKLpInternal(0, 0, 0)
1633- let kLpUpdateActions = $t06071760781._1
1634- let updatedKLp = $t06071760781._2
1634+ let $t06075960823 = refreshKLpInternal(0, 0, 0)
1635+ let kLpUpdateActions = $t06075960823._1
1636+ let updatedKLp = $t06075960823._2
16351637 let actions = if ((kLp != updatedKLp))
16361638 then kLpUpdateActions
16371639 else throwErr("nothing to refresh")
18061808 match tx {
18071809 case order: Order =>
18081810 let matcherPub = getMatcherPubOrFail()
1809- let $t06944369560 = if (skipOrderValidation())
1811+ let $t06948569602 = if (skipOrderValidation())
18101812 then $Tuple2(true, "")
18111813 else validateMatcherOrderAllowed(order)
1812- let orderValid = $t06944369560._1
1813- let orderValidInfo = $t06944369560._2
1814+ let orderValid = $t06948569602._1
1815+ let orderValidInfo = $t06948569602._2
18141816 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
18151817 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
18161818 if (if (if (orderValid)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let lPdecimals = 8
55
66 let scale8 = 100000000
77
88 let scale8BigInt = toBigInt(100000000)
99
1010 let scale18 = toBigInt(1000000000000000000)
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let big0 = toBigInt(0)
1515
1616 let big1 = toBigInt(1)
1717
1818 let big2 = toBigInt(2)
1919
2020 let wavesString = "WAVES"
2121
2222 let SEP = "__"
2323
2424 let PoolActive = 1
2525
2626 let PoolPutDisabled = 2
2727
2828 let PoolMatcherDisabled = 3
2929
3030 let PoolShutdown = 4
3131
3232 let idxPoolAddress = 1
3333
3434 let idxPoolStatus = 2
3535
3636 let idxPoolLPAssetId = 3
3737
3838 let idxAmtAssetId = 4
3939
4040 let idxPriceAssetId = 5
4141
4242 let idxAmtAssetDcm = 6
4343
4444 let idxPriceAssetDcm = 7
4545
4646 let idxIAmtAssetId = 8
4747
4848 let idxIPriceAssetId = 9
4949
5050 let idxLPAssetDcm = 10
5151
5252 let idxPoolAmtAssetAmt = 1
5353
5454 let idxPoolPriceAssetAmt = 2
5555
5656 let idxPoolLPAssetAmt = 3
5757
5858 let idxFactoryStakingContract = 1
5959
6060 let idxFactorySlippageContract = 7
6161
6262 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6363
6464
6565 func toX18BigInt (origVal,origScaleMult) = fraction(origVal, scale18, origScaleMult)
6666
6767
6868 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6969
7070
7171 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
7272
7373
7474 func toScale (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7575
7676
7777 func abs (val) = if ((0 > val))
7878 then -(val)
7979 else val
8080
8181
8282 func absBigInt (val) = if ((zeroBigInt > val))
8383 then -(val)
8484 else val
8585
8686
8787 func swapContract () = "%s__swapContract"
8888
8989
9090 func fc () = "%s__factoryContract"
9191
9292
9393 func keyManagerPublicKey () = "%s__managerPublicKey"
9494
9595
9696 func keyManagerVaultAddress () = "%s__managerVaultAddress"
9797
9898
9999 func pl () = "%s%s__price__last"
100100
101101
102102 func ph (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
103103
104104
105105 func pau (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
106106
107107
108108 func gau (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
109109
110110
111111 func aa () = "%s__amountAsset"
112112
113113
114114 func pa () = "%s__priceAsset"
115115
116116
117117 let keyFee = "%s__fee"
118118
119119 let feeDefault = fraction(10, scale8, 10000)
120120
121121 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
122122
123123 let keyKLp = makeString(["%s", "kLp"], SEP)
124124
125125 let keyKLpRefreshedHeight = makeString(["%s", "kLpRefreshedHeight"], SEP)
126126
127127 let keyKLpRefreshDelay = makeString(["%s", "refreshKLpDelay"], SEP)
128128
129129 let kLpRefreshDelayDefault = 30
130130
131131 let kLpRefreshDelay = valueOrElse(getInteger(this, keyKLpRefreshDelay), kLpRefreshDelayDefault)
132132
133133 func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP)
134134
135135
136136 func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP)
137137
138138
139139 func getAdditionalBalanceOrZero (assetId) = valueOrElse(getInteger(this, keyAdditionalBalance(assetId)), 0)
140140
141141
142142 func getStakingAssetBalanceOrZero (assetId) = valueOrElse(getInteger(this, keyStakingAssetBalance(assetId)), 0)
143143
144144
145145 func keyFactoryConfig () = "%s__factoryConfig"
146146
147147
148148 func keyMatcherPub () = "%s%s__matcher__publicKey"
149149
150150
151151 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
152152
153153
154154 func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config")
155155
156156
157157 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
158158
159159
160160 func keyAllPoolsShutdown () = "%s__shutdown"
161161
162162
163163 func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
164164
165165
166166 func keyAllowedLpScriptHash () = "%s__allowedLpScriptHash"
167167
168168
169169 let keyFeeCollectorAddress = "%s__feeCollectorAddress"
170170
171171 func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
172172
173173
174174 func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
175175
176176
177177 func addressFromStringOrThis (addressString) = match addressFromString(addressString) {
178178 case a: Address =>
179179 a
180180 case _ =>
181181 this
182182 }
183183
184184
185185 func getManagerVaultAddressOrThis () = {
186186 let factoryAddress = match getString(fc()) {
187187 case fca: String =>
188188 addressFromStringOrThis(fca)
189189 case _ =>
190190 this
191191 }
192192 match getString(factoryAddress, keyManagerVaultAddress()) {
193193 case s: String =>
194194 addressFromStringOrThis(s)
195195 case _ =>
196196 this
197197 }
198198 }
199199
200200
201201 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
202202
203203
204204 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
205205
206206
207207 func throwErr (msg) = throw(makeString(["lp.ride:", msg], " "))
208208
209209
210210 func fmtErr (msg) = makeString(["lp.ride:", msg], " ")
211211
212212
213213 let factoryContract = addressFromStringValue(getStringOrFail(this, fc()))
214214
215215 let feeCollectorAddress = addressFromStringValue(getStringOrFail(factoryContract, keyFeeCollectorAddress))
216216
217217 let inFee = {
218218 let @ = invoke(factoryContract, "getInFeeREADONLY", [toString(this)], nil)
219219 if ($isInstanceOf(@, "Int"))
220220 then @
221221 else throw(($getType(@) + " couldn't be cast to Int"))
222222 }
223223
224224 let outFee = {
225225 let @ = invoke(factoryContract, "getOutFeeREADONLY", [toString(this)], nil)
226226 if ($isInstanceOf(@, "Int"))
227227 then @
228228 else throw(($getType(@) + " couldn't be cast to Int"))
229229 }
230230
231231 func keyAddressWhitelisted (address) = makeString(["%s%s", "whitelisted", toString(address)], SEP)
232232
233233
234234 func isAddressWhitelisted (address) = valueOrElse(getBoolean(factoryContract, keyAddressWhitelisted(address)), false)
235235
236236
237237 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
238238
239239
240240 func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, keyMatcherPub()))
241241
242242
243243 func getPoolConfig () = {
244244 let amtAsset = getStringOrFail(this, aa())
245245 let priceAsset = getStringOrFail(this, pa())
246246 let iPriceAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAsset))
247247 let iAmtAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAsset))
248248 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAsset), toString(iPriceAsset))), SEP)
249249 }
250250
251251
252252 func parseAssetId (input) = if ((input == wavesString))
253253 then unit
254254 else fromBase58String(input)
255255
256256
257257 func assetIdToString (input) = if ((input == unit))
258258 then wavesString
259259 else toBase58String(value(input))
260260
261261
262262 func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolStatus]), fromBase58String(poolConfig[idxPoolLPAssetId]), parseAssetId(poolConfig[idxAmtAssetId]), parseAssetId(poolConfig[idxPriceAssetId]), parseIntValue(poolConfig[idxAmtAssetDcm]), parseIntValue(poolConfig[idxPriceAssetDcm]))
263263
264264
265265 let poolConfigParsed = parsePoolConfig(getPoolConfig())
266266
267267 let $t097699935 = poolConfigParsed
268268
269269 let cfgPoolAddress = $t097699935._1
270270
271271 let cfgPoolStatus = $t097699935._2
272272
273273 let cfgLpAssetId = $t097699935._3
274274
275275 let cfgAmountAssetId = $t097699935._4
276276
277277 let cfgPriceAssetId = $t097699935._5
278278
279279 let cfgAmountAssetDecimals = $t097699935._6
280280
281281 let cfgPriceAssetDecimals = $t097699935._7
282282
283283 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
284284
285285
286286 let stakingContract = valueOrErrorMessage(addressFromString(getFactoryConfig()[idxFactoryStakingContract]), "incorrect staking address")
287287
288288 let slippageContract = valueOrErrorMessage(addressFromString(getFactoryConfig()[idxFactorySlippageContract]), "incorrect staking address")
289289
290290 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,slippageToleranceReal,txHeight,txTimestamp,slipageAmtAssetAmt,slipagePriceAssetAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(slippageToleranceReal), toString(txHeight), toString(txTimestamp), toString(slipageAmtAssetAmt), toString(slipagePriceAssetAmt)], SEP)
291291
292292
293293 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
294294
295295
296296 func getAccBalance (assetId) = {
297297 let balanceOnPool = if ((assetId == "WAVES"))
298298 then wavesBalance(this).available
299299 else assetBalance(this, fromBase58String(assetId))
300300 let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(assetId)) - getStakingAssetBalanceOrZero(assetId))
301301 max([0, totalBalance])
302302 }
303303
304304
305305 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
306306
307307
308308 func calcPriceBigIntRound (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
309309
310310
311311 func getRate (proxy) = {
312312 let inv = invoke(proxy, "getRate", nil, nil)
313313 if ((inv == inv))
314314 then match inv {
315315 case r: Int =>
316316 r
317317 case _ =>
318318 throwErr("proxy.getRate() unexpected value")
319319 }
320320 else throw("Strict value is not equal to itself.")
321321 }
322322
323323
324324 func deposit (assetId,amount,stakingAssetId,proxy) = {
325325 let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
326326 if ((currentAdditionalBalance == currentAdditionalBalance))
327327 then {
328328 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
329329 if ((currentStakingAssetBalance == currentStakingAssetBalance))
330330 then {
331331 let asset = parseAssetId(assetId)
332332 if ((amount > 0))
333333 then {
334334 let depositInvoke = invoke(proxy, "deposit", nil, [AttachedPayment(asset, amount)])
335335 if ((depositInvoke == depositInvoke))
336336 then match depositInvoke {
337337 case receivedStakingAsset: Int =>
338338 let newAdditionalBalance = (currentAdditionalBalance + amount)
339339 let newStakingAssetBalance = (currentStakingAssetBalance + receivedStakingAsset)
340340 [IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance)]
341341 case _ =>
342342 nil
343343 }
344344 else throw("Strict value is not equal to itself.")
345345 }
346346 else nil
347347 }
348348 else throw("Strict value is not equal to itself.")
349349 }
350350 else throw("Strict value is not equal to itself.")
351351 }
352352
353353
354354 func withdraw (assetId,amount,stakingAssetId,proxy,proxyRateMul,profitAddress) = {
355355 let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
356356 if ((currentAdditionalBalance == currentAdditionalBalance))
357357 then {
358358 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
359359 if ((currentStakingAssetBalance == currentStakingAssetBalance))
360360 then {
361361 let currentProxyRate = getRate(proxy)
362362 if ((currentProxyRate == currentProxyRate))
363363 then {
364364 let oldRate = fraction(proxyRateMul, currentAdditionalBalance, currentStakingAssetBalance)
365365 let stakingAsset = parseAssetId(stakingAssetId)
366366 let oldSendStakingAmount = fraction(proxyRateMul, amount, oldRate)
367367 let sendStakingAssetAmount = fraction(proxyRateMul, amount, currentProxyRate)
368368 let profitAmount = max([0, (oldSendStakingAmount - sendStakingAssetAmount)])
369369 if ((sendStakingAssetAmount > 0))
370370 then {
371371 let withdrawInvoke = invoke(proxy, "withdraw", nil, [AttachedPayment(stakingAsset, sendStakingAssetAmount)])
372372 if ((withdrawInvoke == withdrawInvoke))
373373 then match withdrawInvoke {
374374 case receivedAssets: Int =>
375375 let newAdditionalBalance = (currentAdditionalBalance - receivedAssets)
376376 let newStakingAssetBalance = ((currentStakingAssetBalance - sendStakingAssetAmount) - profitAmount)
377377 [IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance), ScriptTransfer(profitAddress, profitAmount, parseAssetId(stakingAssetId))]
378378 case _ =>
379379 nil
380380 }
381381 else throw("Strict value is not equal to itself.")
382382 }
383383 else nil
384384 }
385385 else throw("Strict value is not equal to itself.")
386386 }
387387 else throw("Strict value is not equal to itself.")
388388 }
389389 else throw("Strict value is not equal to itself.")
390390 }
391391
392392
393393 func getLeaseProxyConfig (assetId) = match invoke(factoryContract, "getPoolLeaseConfigREADONLY", [toString(this), assetId], nil) {
394394 case a: (Boolean, Int, Int, String, String, Int, String) =>
395395 a
396396 case _ =>
397397 throwErr((("[" + assetId) + "] getLeaseProxyConfig() error"))
398398 }
399399
400400
401401 func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul,profitAddress) = {
402402 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
403403 if ((currentStakingAssetBalance == currentStakingAssetBalance))
404404 then {
405405 let currentAdditionalBalance = if ((currentStakingAssetBalance != 0))
406406 then getAdditionalBalanceOrZero(assetId)
407407 else 0
408408 if ((currentAdditionalBalance == currentAdditionalBalance))
409409 then {
410410 let leasableTotalBalance = max([0, (getAccBalance(assetId) - minBalance)])
411411 let targetAdditionalBalance = fraction(targetRatio, leasableTotalBalance, 100)
412412 let diff = (currentAdditionalBalance - targetAdditionalBalance)
413413 if ((diff == 0))
414414 then nil
415415 else if ((0 > diff))
416416 then {
417417 let sendAssetAmount = -(diff)
418418 deposit(assetId, sendAssetAmount, stakingAssetId, proxy)
419419 }
420420 else {
421421 let getAssetAmount = diff
422422 withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul, profitAddress)
423423 }
424424 }
425425 else throw("Strict value is not equal to itself.")
426426 }
427427 else throw("Strict value is not equal to itself.")
428428 }
429429
430430
431431 func rebalanceAsset (assetId) = {
432432 let $t01622016356 = getLeaseProxyConfig(assetId)
433433 let isLeasable = $t01622016356._1
434434 let leasedRatio = $t01622016356._2
435435 let minBalance = $t01622016356._3
436436 let proxyAddress = $t01622016356._4
437437 let proxyAssetId = $t01622016356._5
438438 let proxyRateMul = $t01622016356._6
439439 let stakingProfitAddress = $t01622016356._7
440440 if (isLeasable)
441441 then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
442442 else nil
443443 }
444444
445445
446446 func withdrawAndRebalanceAsset (assetId,getAmount) = {
447447 let $t01675516891 = getLeaseProxyConfig(assetId)
448448 let isLeasable = $t01675516891._1
449449 let leasedRatio = $t01675516891._2
450450 let minBalance = $t01675516891._3
451451 let proxyAddress = $t01675516891._4
452452 let proxyAssetId = $t01675516891._5
453453 let proxyRateMul = $t01675516891._6
454454 let stakingProfitAddress = $t01675516891._7
455455 if (isLeasable)
456456 then {
457457 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(proxyAssetId)
458458 if ((currentStakingAssetBalance == currentStakingAssetBalance))
459459 then {
460460 let currentAdditionalBalance = if ((currentStakingAssetBalance != 0))
461461 then getAdditionalBalanceOrZero(assetId)
462462 else 0
463463 if ((currentAdditionalBalance == currentAdditionalBalance))
464464 then {
465465 let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
466466 if ((newTotalLeasableBalance == newTotalLeasableBalance))
467467 then {
468468 let newAdditionalBalance = fraction(leasedRatio, newTotalLeasableBalance, 100)
469469 if ((newAdditionalBalance == newAdditionalBalance))
470470 then {
471471 let withdrawAmount = (currentAdditionalBalance - newAdditionalBalance)
472472 if ((withdrawAmount == withdrawAmount))
473- then if ((0 > withdrawAmount))
474- then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
475- else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
473+ then if ((withdrawAmount == 0))
474+ then nil
475+ else if ((0 > withdrawAmount))
476+ then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
477+ else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
476478 else throw("Strict value is not equal to itself.")
477479 }
478480 else throw("Strict value is not equal to itself.")
479481 }
480482 else throw("Strict value is not equal to itself.")
481483 }
482484 else throw("Strict value is not equal to itself.")
483485 }
484486 else throw("Strict value is not equal to itself.")
485487 }
486488 else nil
487489 }
488490
489491
490492 func withdrawAndRebalanceAll (amountAssetOutAmount,priceAssetOutAmount) = {
491493 let AmAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, aa()), amountAssetOutAmount)
492494 let PrAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, pa()), priceAssetOutAmount)
493495 (AmAmtWithdrawState ++ PrAmtWithdrawState)
494496 }
495497
496498
497499 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
498500 let amtAssetAmtX18 = toX18(amAmt, amAssetDcm)
499501 let priceAssetAmtX18 = toX18(prAmt, prAssetDcm)
500502 calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
501503 }
502504
503505
504506 func calcPrices (amAmt,prAmt,lpAmt) = {
505507 let cfg = getPoolConfig()
506508 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
507509 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
508510 let priceX18 = privateCalcPrice(amtAssetDcm, priceAssetDcm, amAmt, prAmt)
509511 let amAmtX18 = toX18(amAmt, amtAssetDcm)
510512 let prAmtX18 = toX18(prAmt, priceAssetDcm)
511513 let lpAmtX18 = toX18(lpAmt, scale8)
512514 let lpPriceInAmAssetX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
513515 let lpPriceInPrAssetX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
514516 [priceX18, lpPriceInAmAssetX18, lpPriceInPrAssetX18]
515517 }
516518
517519
518520 func calculatePrices (amAmt,prAmt,lpAmt) = {
519521 let prices = calcPrices(amAmt, prAmt, lpAmt)
520522 [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)]
521523 }
522524
523525
524526 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
525527 let cfg = getPoolConfig()
526528 let lpAssetId = cfg[idxPoolLPAssetId]
527529 let amAssetId = cfg[idxAmtAssetId]
528530 let prAssetId = cfg[idxPriceAssetId]
529531 let amAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
530532 let prAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
531533 let poolStatus = cfg[idxPoolStatus]
532534 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), (("Asset " + lpAssetId) + " doesn't exist")).quantity
533535 if ((lpAssetId != pmtAssetId))
534536 then throw("Invalid asset passed.")
535537 else {
536538 let amBalance = getAccBalance(amAssetId)
537539 let amBalanceX18 = toX18(amBalance, amAssetDcm)
538540 let prBalance = getAccBalance(prAssetId)
539541 let prBalanceX18 = toX18(prBalance, prAssetDcm)
540542 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
541543 let curPrice = fromX18(curPriceX18, scale8)
542544 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
543545 let lpEmissionX18 = toX18(lpEmission, scale8)
544546 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
545547 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
546548 let outAmAmt = fromX18Round(outAmAmtX18, amAssetDcm, FLOOR)
547549 let outPrAmt = fromX18Round(outPrAmtX18, prAssetDcm, FLOOR)
548550 let state = if ((txId58 == ""))
549551 then nil
550552 else [ScriptTransfer(userAddress, outAmAmt, if ((amAssetId == "WAVES"))
551553 then unit
552554 else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES"))
553555 then unit
554556 else fromBase58String(prAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
555557 $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
556558 }
557559 }
558560
559561
560562 func estimatePutOperation (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = {
561563 let cfg = getPoolConfig()
562564 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
563565 let amAssetIdStr = cfg[idxAmtAssetId]
564566 let prAssetIdStr = cfg[idxPriceAssetId]
565567 let iAmtAssetId = cfg[idxIAmtAssetId]
566568 let iPriceAssetId = cfg[idxIPriceAssetId]
567569 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
568570 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
569571 let poolStatus = cfg[idxPoolStatus]
570572 let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
571573 let inAmAssetIdStr = toBase58String(valueOrElse(inAmAssetId, fromBase58String("WAVES")))
572574 let inPrAssetIdStr = toBase58String(valueOrElse(inPrAssetId, fromBase58String("WAVES")))
573575 if (if ((amAssetIdStr != inAmAssetIdStr))
574576 then true
575577 else (prAssetIdStr != inPrAssetIdStr))
576578 then throw("Invalid amt or price asset passed.")
577579 else {
578580 let amBalance = if (isEvaluate)
579581 then getAccBalance(amAssetIdStr)
580582 else (getAccBalance(amAssetIdStr) - inAmAssetAmt)
581583 let prBalance = if (isEvaluate)
582584 then getAccBalance(prAssetIdStr)
583585 else (getAccBalance(prAssetIdStr) - inPrAssetAmt)
584586 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
585587 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
586588 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
587589 let amBalanceX18 = toX18(amBalance, amtAssetDcm)
588590 let prBalanceX18 = toX18(prBalance, priceAssetDcm)
589591 let res = if ((lpEmission == 0))
590592 then {
591593 let curPriceX18 = zeroBigInt
592594 let slippageX18 = zeroBigInt
593595 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
594596 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtAssetDcm), fromX18(inPrAssetAmtX18, priceAssetDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
595597 }
596598 else {
597599 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
598600 let slippageX18 = fraction(absBigInt((curPriceX18 - userPriceX18)), scale18, curPriceX18)
599601 let slippageToleranceX18 = toX18(slippageTolerance, scale8)
600602 if (if ((curPriceX18 != zeroBigInt))
601603 then (slippageX18 > slippageToleranceX18)
602604 else false)
603605 then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18)))
604606 else {
605607 let lpEmissionX18 = toX18(lpEmission, scale8)
606608 let prViaAmX18 = fraction(inAmAssetAmtX18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
607609 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, FLOOR), CEILING)
608610 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
609611 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
610612 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
611613 let expAmtAssetAmtX18 = expectedAmts._1
612614 let expPriceAssetAmtX18 = expectedAmts._2
613615 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
614616 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtAssetDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceAssetDcm, CEILING), curPriceX18, slippageX18)
615617 }
616618 }
617619 let calcLpAmt = res._1
618620 let calcAmAssetPmt = res._2
619621 let calcPrAssetPmt = res._3
620622 let curPrice = fromX18(res._4, scale8)
621623 let slippageCalc = fromX18(res._5, scale8)
622624 if ((0 >= calcLpAmt))
623625 then throw("Invalid calculations. LP calculated is less than zero.")
624626 else {
625627 let emitLpAmt = if (!(emitLp))
626628 then 0
627629 else calcLpAmt
628630 let amDiff = (inAmAssetAmt - calcAmAssetPmt)
629631 let prDiff = (inPrAssetAmt - calcPrAssetPmt)
630632 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(calcAmAssetPmt, calcPrAssetPmt, emitLpAmt, curPrice, slippageTolerance, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
631633 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId)
632634 }
633635 }
634636 }
635637
636638
637639 func calcKLp (amountBalance,priceBalance,lpEmission) = {
638640 let amountBalanceX18 = toX18BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals))
639641 let priceBalanceX18 = toX18BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))
640642 let updatedKLp = fraction(pow((amountBalanceX18 * priceBalanceX18), 0, toBigInt(5), 1, 18, DOWN), big1, lpEmission)
641643 if ((lpEmission == big0))
642644 then big0
643645 else updatedKLp
644646 }
645647
646648
647649 func calcCurrentKLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
648650 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
649651 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
650652 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
651653 let currentKLp = calcKLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
652654 currentKLp
653655 }
654656
655657
656658 func refreshKLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
657659 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
658660 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
659661 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
660662 let updatedKLp = calcKLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
661663 let actions = [IntegerEntry(keyKLpRefreshedHeight, height), StringEntry(keyKLp, toString(updatedKLp))]
662664 $Tuple2(actions, updatedKLp)
663665 }
664666
665667
666668 func skipOrderValidation () = valueOrElse(getBoolean(factoryContract, keySkipOrderValidation(toString(this))), false)
667669
668670
669671 func validateUpdatedKLp (oldKLp,updatedKLp) = if ((updatedKLp >= oldKLp))
670672 then true
671673 else throwErr(makeString(["updated KLp lower than current KLp", toString(oldKLp), toString(updatedKLp)], " "))
672674
673675
674676 func validateMatcherOrderAllowed (order) = {
675677 let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
676678 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
677679 let amountAssetAmount = order.amount
678680 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
679- let $t02947529687 = if ((order.orderType == Buy))
681+ let $t02951729729 = if ((order.orderType == Buy))
680682 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
681683 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
682- let amountAssetBalanceDelta = $t02947529687._1
683- let priceAssetBalanceDelta = $t02947529687._2
684+ let amountAssetBalanceDelta = $t02951729729._1
685+ let priceAssetBalanceDelta = $t02951729729._2
684686 if (if (if (isGlobalShutdown())
685687 then true
686688 else (cfgPoolStatus == PoolMatcherDisabled))
687689 then true
688690 else (cfgPoolStatus == PoolShutdown))
689691 then throw("Exchange operations disabled")
690692 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
691693 then true
692694 else (order.assetPair.priceAsset != cfgPriceAssetId))
693695 then throw("Wrong order assets.")
694696 else {
695697 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
696- let $t03012730227 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
697- let unusedActions = $t03012730227._1
698- let kLpNew = $t03012730227._2
698+ let $t03016930269 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
699+ let unusedActions = $t03016930269._1
700+ let kLpNew = $t03016930269._2
699701 let isOrderValid = (kLpNew >= kLp)
700702 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
701703 $Tuple2(isOrderValid, info)
702704 }
703705 }
704706
705707
706708 func commonGet (i) = if ((size(i.payments) != 1))
707709 then throw("exactly 1 payment is expected")
708710 else {
709711 let pmt = value(i.payments[0])
710712 let pmtAssetId = value(pmt.assetId)
711713 let pmtAmt = pmt.amount
712714 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
713715 let outAmAmt = res._1
714716 let outPrAmt = res._2
715717 let state = res._10
716718 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
717719 then if (isGlobalShutdown())
718720 then true
719721 else (cfgPoolStatus == PoolShutdown)
720722 else false
721723 if (isGetDisabled)
722724 then throw(("Get operation is blocked by admin. Status = " + toString(cfgPoolStatus)))
723725 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
724726 }
725727
726728
727729 func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2))
728730 then throw("exactly 2 payments are expected")
729731 else {
730732 let amAssetPmt = value(i.payments[0])
731733 let prAssetPmt = value(i.payments[1])
732734 let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp)
733735 let isPutDisabled = if (!(isAddressWhitelisted(i.caller)))
734736 then if (if (isGlobalShutdown())
735737 then true
736738 else (cfgPoolStatus == PoolPutDisabled))
737739 then true
738740 else (cfgPoolStatus == PoolShutdown)
739741 else false
740742 if (isPutDisabled)
741743 then throw(("Put operation is blocked by admin. Status = " + toString(cfgPoolStatus)))
742744 else estPut
743745 }
744746
745747
746748 func emit (amount) = {
747749 let emitInv = invoke(factoryContract, "emit", [amount], nil)
748750 if ((emitInv == emitInv))
749751 then {
750752 let emitInvLegacy = match emitInv {
751753 case legacyFactoryContract: Address =>
752754 invoke(legacyFactoryContract, "emit", [amount], nil)
753755 case _ =>
754756 unit
755757 }
756758 if ((emitInvLegacy == emitInvLegacy))
757759 then amount
758760 else throw("Strict value is not equal to itself.")
759761 }
760762 else throw("Strict value is not equal to itself.")
761763 }
762764
763765
764766 func takeFee (amount,fee) = {
765767 let feeAmount = if ((fee == 0))
766768 then 0
767769 else fraction(amount, fee, scale8)
768770 $Tuple2((amount - feeAmount), feeAmount)
769771 }
770772
771773
772774 func calcPutOneToken (paymentAmountRaw,paymentAssetId,userAddress,txId) = {
773775 let isEval = (txId == unit)
774776 let amountBalanceRaw = getAccBalance(assetIdToString(cfgAmountAssetId))
775777 let priceBalanceRaw = getAccBalance(assetIdToString(cfgPriceAssetId))
776778 let paymentInAmountAsset = if ((paymentAssetId == cfgAmountAssetId))
777779 then true
778780 else if ((paymentAssetId == cfgPriceAssetId))
779781 then false
780782 else throwErr("invalid asset")
781- let $t03341333706 = if (isEval)
783+ let $t03345533748 = if (isEval)
782784 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
783785 else if (paymentInAmountAsset)
784786 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
785787 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
786- let amountBalanceOld = $t03341333706._1
787- let priceBalanceOld = $t03341333706._2
788- let $t03371033859 = if (paymentInAmountAsset)
788+ let amountBalanceOld = $t03345533748._1
789+ let priceBalanceOld = $t03345533748._2
790+ let $t03375233901 = if (paymentInAmountAsset)
789791 then $Tuple2(paymentAmountRaw, 0)
790792 else $Tuple2(0, paymentAmountRaw)
791- let amountAssetAmountRaw = $t03371033859._1
792- let priceAssetAmountRaw = $t03371033859._2
793+ let amountAssetAmountRaw = $t03375233901._1
794+ let priceAssetAmountRaw = $t03375233901._2
793795 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
794796 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
795- let $t03399134055 = takeFee(paymentAmountRaw, inFee)
796- let paymentAmount = $t03399134055._1
797- let feeAmount = $t03399134055._2
797+ let $t03403334097 = takeFee(paymentAmountRaw, inFee)
798+ let paymentAmount = $t03403334097._1
799+ let feeAmount = $t03403334097._2
798800 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
799801 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
800802 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
801803 let priceNew = fromX18(priceNewX18, scale8)
802804 let paymentBalance = if (paymentInAmountAsset)
803805 then amountBalanceOld
804806 else priceBalanceOld
805807 let paymentBalanceBigInt = toBigInt(paymentBalance)
806808 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
807809 let chechSupply = if ((supplyBigInt > big0))
808810 then true
809811 else throwErr("initial deposit requires all coins")
810812 if ((chechSupply == chechSupply))
811813 then {
812814 let depositBigInt = toBigInt(paymentAmount)
813815 let issueAmount = max([0, toInt(((supplyBigInt * (sqrtBigInt((scale18 + ((depositBigInt * scale18) / paymentBalanceBigInt)), 18, 18, DOWN) - scale18)) / scale18))])
814816 let commonState = if (isEval)
815817 then nil
816818 else [IntegerEntry(pl(), priceNew), IntegerEntry(ph(height, lastBlock.timestamp), priceNew), StringEntry(pau(toString(value(userAddress)), toBase58String(value(txId))), dataPutActionInfo(amountAssetAmountRaw, priceAssetAmountRaw, issueAmount, priceNew, 0, 0, height, lastBlock.timestamp, 0, 0))]
817819 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
818820 let priceOld = fromX18(priceOldX18, scale8)
819821 let loss = {
820- let $t03573635903 = if (paymentInAmountAsset)
822+ let $t03577835945 = if (paymentInAmountAsset)
821823 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
822824 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
823- let amount = $t03573635903._1
824- let balance = $t03573635903._2
825+ let amount = $t03577835945._1
826+ let balance = $t03577835945._2
825827 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
826828 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
827829 }
828830 $Tuple5(issueAmount, commonState, feeAmount, loss, paymentInAmountAsset)
829831 }
830832 else throw("Strict value is not equal to itself.")
831833 }
832834
833835
834836 func calcGetOneToken (outAssetId,paymentAmount,paymentAssetId,userAddress,txId) = {
835837 let isEval = (txId == unit)
836838 let cfg = getPoolConfig()
837839 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
838840 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
839841 let checks = [if ((paymentAssetId == cfgLpAssetId))
840842 then true
841843 else throwErr("invalid lp asset")]
842844 if ((checks == checks))
843845 then {
844846 let outInAmountAsset = if ((outAssetId == cfgAmountAssetId))
845847 then true
846848 else if ((outAssetId == cfgPriceAssetId))
847849 then false
848850 else throwErr("invalid asset")
849851 let balanceBigInt = if (outInAmountAsset)
850852 then toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId)))
851853 else toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId)))
852854 let outInAmountAssetDecimals = if (outInAmountAsset)
853855 then amtAssetDcm
854856 else priceAssetDcm
855857 let amBalanceOld = getAccBalance(assetIdToString(cfgAmountAssetId))
856858 let prBalanceOld = getAccBalance(assetIdToString(cfgPriceAssetId))
857859 let outBalance = if (outInAmountAsset)
858860 then amBalanceOld
859861 else prBalanceOld
860862 let outBalanceBigInt = toBigInt(outBalance)
861863 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
862864 let redeemedBigInt = toBigInt(paymentAmount)
863865 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
864- let $t03798138037 = takeFee(amountRaw, outFee)
865- let totalAmount = $t03798138037._1
866- let feeAmount = $t03798138037._2
867- let $t03804138267 = if (outInAmountAsset)
866+ let $t03802338079 = takeFee(amountRaw, outFee)
867+ let totalAmount = $t03802338079._1
868+ let feeAmount = $t03802338079._2
869+ let $t03808338309 = if (outInAmountAsset)
868870 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
869871 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
870- let outAmAmount = $t03804138267._1
871- let outPrAmount = $t03804138267._2
872- let amBalanceNew = $t03804138267._3
873- let prBalanceNew = $t03804138267._4
872+ let outAmAmount = $t03808338309._1
873+ let outPrAmount = $t03808338309._2
874+ let amBalanceNew = $t03808338309._3
875+ let prBalanceNew = $t03808338309._4
874876 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
875877 let priceNew = fromX18(priceNewX18, scale8)
876878 let commonState = if (isEval)
877879 then nil
878880 else [StringEntry(gau(toString(value(userAddress)), toBase58String(value(txId))), dataGetActionInfo(outAmAmount, outPrAmount, paymentAmount, priceNew, height, lastBlock.timestamp)), IntegerEntry(pl(), priceNew), IntegerEntry(ph(height, lastBlock.timestamp), priceNew)]
879881 let priceOldX18 = calcPriceBigInt(toX18(prBalanceOld, cfgPriceAssetDecimals), toX18(amBalanceOld, cfgAmountAssetDecimals))
880882 let priceOld = fromX18(priceOldX18, scale8)
881883 let loss = {
882884 let amountBothInPaymentAsset = (toInt(fraction(balanceBigInt, redeemedBigInt, supplyBigInt)) * 2)
883885 fraction((totalAmount - amountBothInPaymentAsset), scale8, amountBothInPaymentAsset)
884886 }
885887 $Tuple5(totalAmount, commonState, feeAmount, loss, outInAmountAsset)
886888 }
887889 else throw("Strict value is not equal to itself.")
888890 }
889891
890892
891893 func managerPublicKeyOrUnit () = {
892894 let managerVaultAddress = getManagerVaultAddressOrThis()
893895 match getString(managerVaultAddress, keyManagerPublicKey()) {
894896 case s: String =>
895897 fromBase58String(s)
896898 case _: Unit =>
897899 unit
898900 case _ =>
899901 throw("Match error")
900902 }
901903 }
902904
903905
904906 func isManager (i) = match managerPublicKeyOrUnit() {
905907 case pk: ByteVector =>
906908 (i.callerPublicKey == pk)
907909 case _: Unit =>
908910 (i.caller == this)
909911 case _ =>
910912 throw("Match error")
911913 }
912914
913915
914916 func mustManager (i) = {
915917 let pd = throw("Permission denied")
916918 match managerPublicKeyOrUnit() {
917919 case pk: ByteVector =>
918920 if ((i.callerPublicKey == pk))
919921 then true
920922 else pd
921923 case _: Unit =>
922924 if ((i.caller == this))
923925 then true
924926 else pd
925927 case _ =>
926928 throw("Match error")
927929 }
928930 }
929931
930932
931933 @Callable(i)
932934 func rebalance () = (rebalanceAsset(getStringOrFail(this, aa())) ++ rebalanceAsset(getStringOrFail(this, pa())))
933935
934936
935937
936938 @Callable(i)
937939 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
938- let $t04012540430 = if ((isReverse == false))
940+ let $t04016740472 = if ((isReverse == false))
939941 then {
940942 let assetOut = getStringOrFail(this, pa())
941943 let assetIn = getStringOrFail(this, aa())
942944 $Tuple2(assetOut, assetIn)
943945 }
944946 else {
945947 let assetOut = getStringOrFail(this, aa())
946948 let assetIn = getStringOrFail(this, pa())
947949 $Tuple2(assetOut, assetIn)
948950 }
949- let assetOut = $t04012540430._1
950- let assetIn = $t04012540430._2
951+ let assetOut = $t04016740472._1
952+ let assetIn = $t04016740472._2
951953 let poolAssetInBalance = getAccBalance(assetIn)
952954 let poolAssetOutBalance = getAccBalance(assetOut)
953955 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
954956 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
955957 let newK = (((toBigInt(getAccBalance(assetIn)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
956958 let checkK = if ((newK >= oldK))
957959 then true
958960 else throw("new K is fewer error")
959961 if ((checkK == checkK))
960962 then $Tuple2(nil, amountOut)
961963 else throw("Strict value is not equal to itself.")
962964 }
963965
964966
965967
966968 @Callable(i)
967969 func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo,feePoolAmount) = {
968970 let swapContact = {
969971 let @ = invoke(factoryContract, "getSwapContractREADONLY", nil, nil)
970972 if ($isInstanceOf(@, "String"))
971973 then @
972974 else throw(($getType(@) + " couldn't be cast to String"))
973975 }
974976 let isPoolSwapDisabled = {
975977 let @ = invoke(factoryContract, "isPoolSwapDisabledREADONLY", [toString(this)], nil)
976978 if ($isInstanceOf(@, "Boolean"))
977979 then @
978980 else throw(($getType(@) + " couldn't be cast to Boolean"))
979981 }
980982 let isSwapDisabled = if (!(isAddressWhitelisted(i.caller)))
981983 then if (if (isGlobalShutdown())
982984 then true
983985 else (cfgPoolStatus == PoolShutdown))
984986 then true
985987 else isPoolSwapDisabled
986988 else false
987989 let checks = [if (if (!(isSwapDisabled))
988990 then true
989991 else isManager(i))
990992 then true
991993 else throwErr("swap operation is blocked by admin"), if ((value(i.payments[0]).amount >= cleanAmountIn))
992994 then true
993995 else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(swapContact)))
994996 then true
995997 else throwErr("Permission denied")]
996998 if ((checks == checks))
997999 then {
9981000 let pmt = value(i.payments[0])
9991001 let assetIn = assetIdToString(pmt.assetId)
10001002 let assetOut = if ((isReverse == false))
10011003 then getStringOrFail(this, pa())
10021004 else getStringOrFail(this, aa())
10031005 let poolAssetInBalance = ((getAccBalance(assetIn) - value(i.payments[0]).amount) - feePoolAmount)
10041006 let poolAssetOutBalance = getAccBalance(assetOut)
10051007 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
10061008 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
10071009 let newK = ((toBigInt(getAccBalance(assetIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
10081010 let checkK = if ((newK >= oldK))
10091011 then true
10101012 else throw("new K is fewer error")
10111013 if ((checkK == checkK))
10121014 then {
10131015 let checkMin = if ((amountOut >= amountOutMin))
10141016 then true
10151017 else throw("Exchange result is fewer coins than expected")
10161018 if ((checkMin == checkMin))
10171019 then {
10181020 let amountAssetBalanceDelta = if (isReverse)
10191021 then -(amountOut)
10201022 else feePoolAmount
10211023 let priceAssetBalanceDelta = if (isReverse)
10221024 then feePoolAmount
10231025 else -(amountOut)
10241026 let refreshKLpActions = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)._1
10251027 if ((refreshKLpActions == refreshKLpActions))
10261028 then {
10271029 let rebalanceState = rebalanceAsset(assetIn)
10281030 if ((rebalanceState == rebalanceState))
10291031 then {
10301032 let withdrawState = withdrawAndRebalanceAsset(assetOut, amountOut)
10311033 if ((withdrawState == withdrawState))
10321034 then $Tuple2(((withdrawState ++ rebalanceState) ++ [ScriptTransfer(addressFromStringValue(addressTo), amountOut, parseAssetId(assetOut))]), amountOut)
10331035 else throw("Strict value is not equal to itself.")
10341036 }
10351037 else throw("Strict value is not equal to itself.")
10361038 }
10371039 else throw("Strict value is not equal to itself.")
10381040 }
10391041 else throw("Strict value is not equal to itself.")
10401042 }
10411043 else throw("Strict value is not equal to itself.")
10421044 }
10431045 else throw("Strict value is not equal to itself.")
10441046 }
10451047
10461048
10471049
10481050 @Callable(i)
10491051 func put (slippageTolerance,shouldAutoStake) = if ((0 > slippageTolerance))
10501052 then throw("Invalid slippageTolerance passed")
10511053 else {
10521054 let estPut = commonPut(i, slippageTolerance, true)
10531055 let emitLpAmt = estPut._2
10541056 let lpAssetId = estPut._7
10551057 let state = estPut._9
10561058 let amDiff = estPut._10
10571059 let prDiff = estPut._11
10581060 let amId = estPut._12
10591061 let prId = estPut._13
10601062 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
10611063 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
10621064 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
10631065 if ((currentKLp == currentKLp))
10641066 then {
10651067 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
10661068 if ((emitInv == emitInv))
10671069 then {
10681070 let emitInvLegacy = match emitInv {
10691071 case legacyFactoryContract: Address =>
10701072 invoke(legacyFactoryContract, "emit", [emitLpAmt], nil)
10711073 case _ =>
10721074 unit
10731075 }
10741076 if ((emitInvLegacy == emitInvLegacy))
10751077 then {
10761078 let slippageAInv = if ((amDiff > 0))
10771079 then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
10781080 else nil
10791081 if ((slippageAInv == slippageAInv))
10801082 then {
10811083 let slippagePInv = if ((prDiff > 0))
10821084 then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
10831085 else nil
10841086 if ((slippagePInv == slippagePInv))
10851087 then {
10861088 let lpTransfer = if (shouldAutoStake)
10871089 then {
10881090 let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
10891091 if ((slpStakeInv == slpStakeInv))
10901092 then nil
10911093 else throw("Strict value is not equal to itself.")
10921094 }
10931095 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1094- let $t04560646068 = refreshKLpInternal(0, 0, 0)
1095- if (($t04560646068 == $t04560646068))
1096+ let $t04564846110 = refreshKLpInternal(0, 0, 0)
1097+ if (($t04564846110 == $t04564846110))
10961098 then {
1097- let updatedKLp = $t04560646068._2
1098- let refreshKLpActions = $t04560646068._1
1099+ let updatedKLp = $t04564846110._2
1100+ let refreshKLpActions = $t04564846110._1
10991101 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11001102 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11011103 then {
11021104 let reb = invoke(this, "rebalance", nil, nil)
11031105 if ((reb == reb))
11041106 then ((state ++ lpTransfer) ++ refreshKLpActions)
11051107 else throw("Strict value is not equal to itself.")
11061108 }
11071109 else throw("Strict value is not equal to itself.")
11081110 }
11091111 else throw("Strict value is not equal to itself.")
11101112 }
11111113 else throw("Strict value is not equal to itself.")
11121114 }
11131115 else throw("Strict value is not equal to itself.")
11141116 }
11151117 else throw("Strict value is not equal to itself.")
11161118 }
11171119 else throw("Strict value is not equal to itself.")
11181120 }
11191121 else throw("Strict value is not equal to itself.")
11201122 }
11211123
11221124
11231125
11241126 @Callable(i)
11251127 func putForFree (maxSlippage) = if ((0 > maxSlippage))
11261128 then throw("Invalid value passed")
11271129 else {
11281130 let estPut = commonPut(i, maxSlippage, false)
11291131 let state = estPut._9
11301132 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11311133 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11321134 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
11331135 if ((currentKLp == currentKLp))
11341136 then {
1135- let $t04668046745 = refreshKLpInternal(0, 0, 0)
1136- let refreshKLpActions = $t04668046745._1
1137- let updatedKLp = $t04668046745._2
1137+ let $t04672246787 = refreshKLpInternal(0, 0, 0)
1138+ let refreshKLpActions = $t04672246787._1
1139+ let updatedKLp = $t04672246787._2
11381140 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11391141 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11401142 then (state ++ refreshKLpActions)
11411143 else throw("Strict value is not equal to itself.")
11421144 }
11431145 else throw("Strict value is not equal to itself.")
11441146 }
11451147
11461148
11471149
11481150 @Callable(i)
11491151 func putOneTkn (minOutAmount,autoStake) = {
11501152 let isPoolOneTokenOperationsDisabled = {
11511153 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11521154 if ($isInstanceOf(@, "Boolean"))
11531155 then @
11541156 else throw(($getType(@) + " couldn't be cast to Boolean"))
11551157 }
11561158 let isPutDisabled = if (!(isAddressWhitelisted(i.caller)))
11571159 then if (if (if (isGlobalShutdown())
11581160 then true
11591161 else (cfgPoolStatus == PoolPutDisabled))
11601162 then true
11611163 else (cfgPoolStatus == PoolShutdown))
11621164 then true
11631165 else isPoolOneTokenOperationsDisabled
11641166 else false
11651167 let checks = [if (if (!(isPutDisabled))
11661168 then true
11671169 else isManager(i))
11681170 then true
11691171 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
11701172 then true
11711173 else throwErr("exactly 1 payment are expected")]
11721174 if ((checks == checks))
11731175 then {
11741176 let payment = i.payments[0]
11751177 let paymentAssetId = payment.assetId
11761178 let paymentAmountRaw = payment.amount
11771179 let currentKLp = if ((paymentAssetId == cfgAmountAssetId))
11781180 then calcCurrentKLp(toBigInt(paymentAmountRaw), toBigInt(0), toBigInt(0))
11791181 else if ((paymentAssetId == cfgPriceAssetId))
11801182 then calcCurrentKLp(toBigInt(0), toBigInt(paymentAmountRaw), toBigInt(0))
11811183 else throwErr("payment asset is not supported")
11821184 if ((currentKLp == currentKLp))
11831185 then {
11841186 let userAddress = i.caller
11851187 let txId = i.transactionId
1186- let $t04797448126 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1187- if (($t04797448126 == $t04797448126))
1188+ let $t04801648168 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1189+ if (($t04801648168 == $t04801648168))
11881190 then {
1189- let paymentInAmountAsset = $t04797448126._5
1190- let bonus = $t04797448126._4
1191- let feeAmount = $t04797448126._3
1192- let commonState = $t04797448126._2
1193- let emitAmountEstimated = $t04797448126._1
1191+ let paymentInAmountAsset = $t04801648168._5
1192+ let bonus = $t04801648168._4
1193+ let feeAmount = $t04801648168._3
1194+ let commonState = $t04801648168._2
1195+ let emitAmountEstimated = $t04801648168._1
11941196 let emitAmount = if (if ((minOutAmount > 0))
11951197 then (minOutAmount > emitAmountEstimated)
11961198 else false)
11971199 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
11981200 else emitAmountEstimated
11991201 let emitInv = emit(emitAmount)
12001202 if ((emitInv == emitInv))
12011203 then {
12021204 let lpTransfer = if (autoStake)
12031205 then {
12041206 let stakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(cfgLpAssetId, emitAmount)])
12051207 if ((stakeInv == stakeInv))
12061208 then nil
12071209 else throw("Strict value is not equal to itself.")
12081210 }
12091211 else [ScriptTransfer(i.caller, emitAmount, cfgLpAssetId)]
12101212 let sendFee = if ((feeAmount > 0))
12111213 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
12121214 else nil
1213- let $t04871248909 = if ((this == feeCollectorAddress))
1215+ let $t04875448951 = if ((this == feeCollectorAddress))
12141216 then $Tuple2(0, 0)
12151217 else if (paymentInAmountAsset)
12161218 then $Tuple2(-(feeAmount), 0)
12171219 else $Tuple2(0, -(feeAmount))
1218- let amountAssetBalanceDelta = $t04871248909._1
1219- let priceAssetBalanceDelta = $t04871248909._2
1220- let $t04891249020 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1221- let refreshKLpActions = $t04891249020._1
1222- let updatedKLp = $t04891249020._2
1220+ let amountAssetBalanceDelta = $t04875448951._1
1221+ let priceAssetBalanceDelta = $t04875448951._2
1222+ let $t04895449062 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1223+ let refreshKLpActions = $t04895449062._1
1224+ let updatedKLp = $t04895449062._2
12231225 let kLp = value(getString(keyKLp))
12241226 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12251227 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12261228 then {
12271229 let reb = invoke(this, "rebalance", nil, nil)
12281230 if ((reb == reb))
12291231 then $Tuple2((((commonState ++ lpTransfer) ++ sendFee) ++ refreshKLpActions), emitAmount)
12301232 else throw("Strict value is not equal to itself.")
12311233 }
12321234 else throw("Strict value is not equal to itself.")
12331235 }
12341236 else throw("Strict value is not equal to itself.")
12351237 }
12361238 else throw("Strict value is not equal to itself.")
12371239 }
12381240 else throw("Strict value is not equal to itself.")
12391241 }
12401242 else throw("Strict value is not equal to itself.")
12411243 }
12421244
12431245
12441246
12451247 @Callable(i)
12461248 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
1247- let $t04937549532 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1248- let emitAmountEstimated = $t04937549532._1
1249- let commonState = $t04937549532._2
1250- let feeAmount = $t04937549532._3
1251- let bonus = $t04937549532._4
1252- let paymentInAmountAsset = $t04937549532._5
1249+ let $t04941749574 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1250+ let emitAmountEstimated = $t04941749574._1
1251+ let commonState = $t04941749574._2
1252+ let feeAmount = $t04941749574._3
1253+ let bonus = $t04941749574._4
1254+ let paymentInAmountAsset = $t04941749574._5
12531255 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
12541256 }
12551257
12561258
12571259
12581260 @Callable(i)
12591261 func getOneTkn (outAssetIdStr,minOutAmount) = {
12601262 let isPoolOneTokenOperationsDisabled = {
12611263 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12621264 if ($isInstanceOf(@, "Boolean"))
12631265 then @
12641266 else throw(($getType(@) + " couldn't be cast to Boolean"))
12651267 }
12661268 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
12671269 then if (if (isGlobalShutdown())
12681270 then true
12691271 else (cfgPoolStatus == PoolShutdown))
12701272 then true
12711273 else isPoolOneTokenOperationsDisabled
12721274 else false
12731275 let checks = [if (if (!(isGetDisabled))
12741276 then true
12751277 else isManager(i))
12761278 then true
12771279 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
12781280 then true
12791281 else throwErr("exactly 1 payment are expected")]
12801282 if ((checks == checks))
12811283 then {
12821284 let outAssetId = parseAssetId(outAssetIdStr)
12831285 let payment = i.payments[0]
12841286 let paymentAssetId = payment.assetId
12851287 let paymentAmount = payment.amount
12861288 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
12871289 if ((currentKLp == currentKLp))
12881290 then {
12891291 let userAddress = i.caller
12901292 let txId = i.transactionId
1291- let $t05045450607 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1292- if (($t05045450607 == $t05045450607))
1293+ let $t05049650649 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1294+ if (($t05049650649 == $t05049650649))
12931295 then {
1294- let outInAmountAsset = $t05045450607._5
1295- let bonus = $t05045450607._4
1296- let feeAmount = $t05045450607._3
1297- let commonState = $t05045450607._2
1298- let amountEstimated = $t05045450607._1
1296+ let outInAmountAsset = $t05049650649._5
1297+ let bonus = $t05049650649._4
1298+ let feeAmount = $t05049650649._3
1299+ let commonState = $t05049650649._2
1300+ let amountEstimated = $t05049650649._1
12991301 let amount = if (if ((minOutAmount > 0))
13001302 then (minOutAmount > amountEstimated)
13011303 else false)
13021304 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
13031305 else amountEstimated
13041306 let burnInv = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
13051307 if ((burnInv == burnInv))
13061308 then {
13071309 let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
13081310 let assetTransfer = [ScriptTransfer(userAddress, amount, outAssetId)]
13091311 let sendFee = if ((feeAmount > 0))
13101312 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
13111313 else nil
1312- let $t05127151518 = {
1314+ let $t05131351560 = {
13131315 let feeAmountForCalc = if ((this == feeCollectorAddress))
13141316 then 0
13151317 else feeAmount
13161318 if (outInAmountAsset)
13171319 then $Tuple2(-((amount + feeAmountForCalc)), 0)
13181320 else $Tuple2(0, -((amount + feeAmountForCalc)))
13191321 }
1320- let amountAssetBalanceDelta = $t05127151518._1
1321- let priceAssetBalanceDelta = $t05127151518._2
1322- let $t05152151629 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1323- let refreshKLpActions = $t05152151629._1
1324- let updatedKLp = $t05152151629._2
1322+ let amountAssetBalanceDelta = $t05131351560._1
1323+ let priceAssetBalanceDelta = $t05131351560._2
1324+ let $t05156351671 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1325+ let refreshKLpActions = $t05156351671._1
1326+ let updatedKLp = $t05156351671._2
13251327 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13261328 if ((isUpdatedKLpValid == isUpdatedKLpValid))
13271329 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
13281330 else throw("Strict value is not equal to itself.")
13291331 }
13301332 else throw("Strict value is not equal to itself.")
13311333 }
13321334 else throw("Strict value is not equal to itself.")
13331335 }
13341336 else throw("Strict value is not equal to itself.")
13351337 }
13361338 else throw("Strict value is not equal to itself.")
13371339 }
13381340
13391341
13401342
13411343 @Callable(i)
13421344 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1343- let $t05190752063 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1344- let amountEstimated = $t05190752063._1
1345- let commonState = $t05190752063._2
1346- let feeAmount = $t05190752063._3
1347- let bonus = $t05190752063._4
1348- let outInAmountAsset = $t05190752063._5
1345+ let $t05194952105 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1346+ let amountEstimated = $t05194952105._1
1347+ let commonState = $t05194952105._2
1348+ let feeAmount = $t05194952105._3
1349+ let bonus = $t05194952105._4
1350+ let outInAmountAsset = $t05194952105._5
13491351 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
13501352 }
13511353
13521354
13531355
13541356 @Callable(i)
13551357 func unstakeAndGetOneTkn (unstakeAmount,outAssetIdStr,minOutAmount) = {
13561358 let isPoolOneTokenOperationsDisabled = {
13571359 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
13581360 if ($isInstanceOf(@, "Boolean"))
13591361 then @
13601362 else throw(($getType(@) + " couldn't be cast to Boolean"))
13611363 }
13621364 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
13631365 then if (if (isGlobalShutdown())
13641366 then true
13651367 else (cfgPoolStatus == PoolShutdown))
13661368 then true
13671369 else isPoolOneTokenOperationsDisabled
13681370 else false
13691371 let checks = [if (if (!(isGetDisabled))
13701372 then true
13711373 else isManager(i))
13721374 then true
13731375 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
13741376 then true
13751377 else throwErr("no payments are expected")]
13761378 if ((checks == checks))
13771379 then {
13781380 let outAssetId = parseAssetId(outAssetIdStr)
13791381 let userAddress = i.caller
13801382 let txId = i.transactionId
13811383 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
13821384 if ((currentKLp == currentKLp))
13831385 then {
13841386 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13851387 if ((unstakeInv == unstakeInv))
13861388 then {
1387- let $t05300553156 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1388- if (($t05300553156 == $t05300553156))
1389+ let $t05304753198 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1390+ if (($t05304753198 == $t05304753198))
13891391 then {
1390- let outInAmountAsset = $t05300553156._5
1391- let bonus = $t05300553156._4
1392- let feeAmount = $t05300553156._3
1393- let commonState = $t05300553156._2
1394- let amountEstimated = $t05300553156._1
1392+ let outInAmountAsset = $t05304753198._5
1393+ let bonus = $t05304753198._4
1394+ let feeAmount = $t05304753198._3
1395+ let commonState = $t05304753198._2
1396+ let amountEstimated = $t05304753198._1
13951397 let amount = if (if ((minOutAmount > 0))
13961398 then (minOutAmount > amountEstimated)
13971399 else false)
13981400 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
13991401 else amountEstimated
14001402 let burnInv = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
14011403 if ((burnInv == burnInv))
14021404 then {
14031405 let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
14041406 let assetTransfer = [ScriptTransfer(i.caller, amount, outAssetId)]
14051407 let sendFee = if ((feeAmount > 0))
14061408 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
14071409 else nil
1408- let $t05381554062 = {
1410+ let $t05385754104 = {
14091411 let feeAmountForCalc = if ((this == feeCollectorAddress))
14101412 then 0
14111413 else feeAmount
14121414 if (outInAmountAsset)
14131415 then $Tuple2(-((amount + feeAmountForCalc)), 0)
14141416 else $Tuple2(0, -((amount + feeAmountForCalc)))
14151417 }
1416- let amountAssetBalanceDelta = $t05381554062._1
1417- let priceAssetBalanceDelta = $t05381554062._2
1418- let $t05406554173 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1419- let refreshKLpActions = $t05406554173._1
1420- let updatedKLp = $t05406554173._2
1418+ let amountAssetBalanceDelta = $t05385754104._1
1419+ let priceAssetBalanceDelta = $t05385754104._2
1420+ let $t05410754215 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1421+ let refreshKLpActions = $t05410754215._1
1422+ let updatedKLp = $t05410754215._2
14211423 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14221424 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14231425 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
14241426 else throw("Strict value is not equal to itself.")
14251427 }
14261428 else throw("Strict value is not equal to itself.")
14271429 }
14281430 else throw("Strict value is not equal to itself.")
14291431 }
14301432 else throw("Strict value is not equal to itself.")
14311433 }
14321434 else throw("Strict value is not equal to itself.")
14331435 }
14341436 else throw("Strict value is not equal to itself.")
14351437 }
14361438
14371439
14381440
14391441 @Callable(i)
14401442 func get () = {
14411443 let res = commonGet(i)
14421444 let outAmAmt = res._1
14431445 let outPrAmt = res._2
14441446 let pmtAmt = res._3
14451447 let pmtAssetId = res._4
14461448 let state = res._5
14471449 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14481450 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14491451 if ((currentKLp == currentKLp))
14501452 then {
14511453 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14521454 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14531455 then {
1454- let $t05526855349 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1455- let refreshKLpActions = $t05526855349._1
1456- let updatedKLp = $t05526855349._2
1456+ let $t05531055391 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1457+ let refreshKLpActions = $t05531055391._1
1458+ let updatedKLp = $t05531055391._2
14571459 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14581460 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14591461 then ((withdrawState ++ state) ++ refreshKLpActions)
14601462 else throw("Strict value is not equal to itself.")
14611463 }
14621464 else throw("Strict value is not equal to itself.")
14631465 }
14641466 else throw("Strict value is not equal to itself.")
14651467 }
14661468
14671469
14681470
14691471 @Callable(i)
14701472 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
14711473 let res = commonGet(i)
14721474 let outAmAmt = res._1
14731475 let outPrAmt = res._2
14741476 let pmtAmt = res._3
14751477 let pmtAssetId = res._4
14761478 let state = res._5
14771479 if ((noLessThenAmtAsset > outAmAmt))
14781480 then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
14791481 else if ((noLessThenPriceAsset > outPrAmt))
14801482 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
14811483 else {
14821484 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14831485 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14841486 if ((currentKLp == currentKLp))
14851487 then {
14861488 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14871489 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14881490 then {
1489- let $t05644456525 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1490- let refreshKLpActions = $t05644456525._1
1491- let updatedKLp = $t05644456525._2
1491+ let $t05648656567 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1492+ let refreshKLpActions = $t05648656567._1
1493+ let updatedKLp = $t05648656567._2
14921494 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14931495 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14941496 then ((withdrawState ++ state) ++ refreshKLpActions)
14951497 else throw("Strict value is not equal to itself.")
14961498 }
14971499 else throw("Strict value is not equal to itself.")
14981500 }
14991501 else throw("Strict value is not equal to itself.")
15001502 }
15011503 }
15021504
15031505
15041506
15051507 @Callable(i)
15061508 func unstakeAndGet (amount) = {
15071509 let checkPayments = if ((size(i.payments) != 0))
15081510 then throw("No payments are expected")
15091511 else true
15101512 if ((checkPayments == checkPayments))
15111513 then {
15121514 let cfg = getPoolConfig()
15131515 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
15141516 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
15151517 if ((currentKLp == currentKLp))
15161518 then {
15171519 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(lpAssetId), amount], nil)
15181520 if ((unstakeInv == unstakeInv))
15191521 then {
15201522 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
15211523 let outAmAmt = res._1
15221524 let outPrAmt = res._2
15231525 let poolStatus = parseIntValue(res._9)
15241526 let state = res._10
15251527 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
15261528 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
15271529 then if (isGlobalShutdown())
15281530 then true
15291531 else (cfgPoolStatus == PoolShutdown)
15301532 else false
15311533 let checkPoolStatus = if (isGetDisabled)
15321534 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
15331535 else true
15341536 if ((checkPoolStatus == checkPoolStatus))
15351537 then {
15361538 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15371539 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15381540 then {
1539- let $t05787357954 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1540- let refreshKLpActions = $t05787357954._1
1541- let updatedKLp = $t05787357954._2
1541+ let $t05791557996 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1542+ let refreshKLpActions = $t05791557996._1
1543+ let updatedKLp = $t05791557996._2
15421544 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15431545 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15441546 then ((withdrawState ++ state) ++ refreshKLpActions)
15451547 else throw("Strict value is not equal to itself.")
15461548 }
15471549 else throw("Strict value is not equal to itself.")
15481550 }
15491551 else throw("Strict value is not equal to itself.")
15501552 }
15511553 else throw("Strict value is not equal to itself.")
15521554 }
15531555 else throw("Strict value is not equal to itself.")
15541556 }
15551557 else throw("Strict value is not equal to itself.")
15561558 }
15571559
15581560
15591561
15601562 @Callable(i)
15611563 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
15621564 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
15631565 then if (isGlobalShutdown())
15641566 then true
15651567 else (cfgPoolStatus == PoolShutdown)
15661568 else false
15671569 let checks = [if (!(isGetDisabled))
15681570 then true
15691571 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
15701572 then true
15711573 else throw("no payments are expected")]
15721574 if ((checks == checks))
15731575 then {
15741576 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
15751577 if ((currentKLp == currentKLp))
15761578 then {
15771579 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
15781580 if ((unstakeInv == unstakeInv))
15791581 then {
15801582 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
15811583 let outAmAmt = res._1
15821584 let outPrAmt = res._2
15831585 let state = res._10
15841586 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
15851587 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
15861588 then true
15871589 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
15881590 then true
15891591 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
15901592 if ((checkAmounts == checkAmounts))
15911593 then {
15921594 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15931595 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15941596 then {
1595- let $t05943259513 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1596- let refreshKLpActions = $t05943259513._1
1597- let updatedKLp = $t05943259513._2
1597+ let $t05947459555 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1598+ let refreshKLpActions = $t05947459555._1
1599+ let updatedKLp = $t05947459555._2
15981600 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15991601 if ((isUpdatedKLpValid == isUpdatedKLpValid))
16001602 then ((withdrawState ++ state) ++ refreshKLpActions)
16011603 else throw("Strict value is not equal to itself.")
16021604 }
16031605 else throw("Strict value is not equal to itself.")
16041606 }
16051607 else throw("Strict value is not equal to itself.")
16061608 }
16071609 else throw("Strict value is not equal to itself.")
16081610 }
16091611 else throw("Strict value is not equal to itself.")
16101612 }
16111613 else throw("Strict value is not equal to itself.")
16121614 }
16131615
16141616
16151617
16161618 @Callable(i)
16171619 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
16181620 then throw("permissions denied")
16191621 else $Tuple2([StringEntry(aa(), amtAssetStr), StringEntry(pa(), priceAssetStr)], "success")
16201622
16211623
16221624
16231625 @Callable(i)
16241626 func refreshKLp () = {
16251627 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyKLpRefreshedHeight), 0)
16261628 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= kLpRefreshDelay))
16271629 then unit
16281630 else throwErr(makeString([toString(kLpRefreshDelay), " blocks have not passed since the previous call"], ""))
16291631 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
16301632 then {
16311633 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1632- let $t06071760781 = refreshKLpInternal(0, 0, 0)
1633- let kLpUpdateActions = $t06071760781._1
1634- let updatedKLp = $t06071760781._2
1634+ let $t06075960823 = refreshKLpInternal(0, 0, 0)
1635+ let kLpUpdateActions = $t06075960823._1
1636+ let updatedKLp = $t06075960823._2
16351637 let actions = if ((kLp != updatedKLp))
16361638 then kLpUpdateActions
16371639 else throwErr("nothing to refresh")
16381640 $Tuple2(actions, toString(updatedKLp))
16391641 }
16401642 else throw("Strict value is not equal to itself.")
16411643 }
16421644
16431645
16441646
16451647 @Callable(i)
16461648 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
16471649
16481650
16491651
16501652 @Callable(i)
16511653 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
16521654
16531655
16541656
16551657 @Callable(i)
16561658 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
16571659 let prices = calcPrices(amAmt, prAmt, lpAmt)
16581660 $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])])
16591661 }
16601662
16611663
16621664
16631665 @Callable(i)
16641666 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
16651667
16661668
16671669
16681670 @Callable(i)
16691671 func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult))
16701672
16711673
16721674
16731675 @Callable(i)
16741676 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
16751677
16761678
16771679
16781680 @Callable(i)
16791681 func estimatePutOperationWrapperREADONLY (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippageTolerance, inAmAssetAmt, inAmAssetId, inPrAssetAmt, inPrAssetId, userAddress, isEvaluate, emitLp))
16801682
16811683
16821684
16831685 @Callable(i)
16841686 func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
16851687 let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
16861688 $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
16871689 }
16881690
16891691
16901692
16911693 @Callable(i)
16921694 func statsREADONLY () = {
16931695 let cfg = getPoolConfig()
16941696 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
16951697 let amtAssetId = cfg[idxAmtAssetId]
16961698 let priceAssetId = cfg[idxPriceAssetId]
16971699 let iAmtAssetId = cfg[idxIAmtAssetId]
16981700 let iPriceAssetId = cfg[idxIPriceAssetId]
16991701 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
17001702 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
17011703 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
17021704 let accAmtAssetBalance = getAccBalance(amtAssetId)
17031705 let accPriceAssetBalance = getAccBalance(priceAssetId)
17041706 let pricesList = if ((poolLPBalance == 0))
17051707 then [zeroBigInt, zeroBigInt, zeroBigInt]
17061708 else calcPrices(accAmtAssetBalance, accPriceAssetBalance, poolLPBalance)
17071709 let curPrice = 0
17081710 let lpAmtAssetShare = fromX18(pricesList[1], scale8)
17091711 let lpPriceAssetShare = fromX18(pricesList[2], scale8)
17101712 let poolWeight = value(getInteger(factoryContract, keyPoolWeight(toString(this))))
17111713 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accAmtAssetBalance), toString(accPriceAssetBalance), toString(poolLPBalance), toString(curPrice), toString(lpAmtAssetShare), toString(lpPriceAssetShare), toString(poolWeight)], SEP))
17121714 }
17131715
17141716
17151717
17161718 @Callable(i)
17171719 func evaluatePutByAmountAssetREADONLY (inAmAssetAmt) = {
17181720 let cfg = getPoolConfig()
17191721 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
17201722 let amAssetIdStr = cfg[idxAmtAssetId]
17211723 let amAssetId = fromBase58String(amAssetIdStr)
17221724 let prAssetIdStr = cfg[idxPriceAssetId]
17231725 let prAssetId = fromBase58String(prAssetIdStr)
17241726 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
17251727 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
17261728 let poolStatus = cfg[idxPoolStatus]
17271729 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
17281730 let accAmtAssetBalance = getAccBalance(amAssetIdStr)
17291731 let accPriceAssetBalance = getAccBalance(prAssetIdStr)
17301732 let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm)
17311733 let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm)
17321734 let curPriceX18 = if ((poolLPBalance == 0))
17331735 then zeroBigInt
17341736 else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
17351737 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
17361738 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
17371739 let inPrAssetAmt = fromX18(inPrAssetAmtX18, priceAssetDcm)
17381740 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
17391741 let calcLpAmt = estPut._1
17401742 let curPriceCalc = estPut._3
17411743 let amBalance = estPut._4
17421744 let prBalance = estPut._5
17431745 let lpEmission = estPut._6
17441746 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
17451747 }
17461748
17471749
17481750
17491751 @Callable(i)
17501752 func evaluatePutByPriceAssetREADONLY (inPrAssetAmt) = {
17511753 let cfg = getPoolConfig()
17521754 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
17531755 let amAssetIdStr = cfg[idxAmtAssetId]
17541756 let amAssetId = fromBase58String(amAssetIdStr)
17551757 let prAssetIdStr = cfg[idxPriceAssetId]
17561758 let prAssetId = fromBase58String(prAssetIdStr)
17571759 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
17581760 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
17591761 let poolStatus = cfg[idxPoolStatus]
17601762 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
17611763 let amBalanceRaw = getAccBalance(amAssetIdStr)
17621764 let prBalanceRaw = getAccBalance(prAssetIdStr)
17631765 let amBalanceRawX18 = toX18(amBalanceRaw, amtAssetDcm)
17641766 let prBalanceRawX18 = toX18(prBalanceRaw, priceAssetDcm)
17651767 let curPriceX18 = if ((poolLPBalance == 0))
17661768 then zeroBigInt
17671769 else calcPriceBigInt(prBalanceRawX18, amBalanceRawX18)
17681770 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
17691771 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
17701772 let inAmAssetAmt = fromX18(inAmAssetAmtX18, amtAssetDcm)
17711773 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
17721774 let calcLpAmt = estPut._1
17731775 let curPriceCalc = estPut._3
17741776 let amBalance = estPut._4
17751777 let prBalance = estPut._5
17761778 let lpEmission = estPut._6
17771779 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
17781780 }
17791781
17801782
17811783
17821784 @Callable(i)
17831785 func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
17841786 let res = estimateGetOperation("", paymentLpAssetId, paymentLpAmt, this)
17851787 let outAmAmt = res._1
17861788 let outPrAmt = res._2
17871789 let amBalance = res._5
17881790 let prBalance = res._6
17891791 let lpEmission = res._7
17901792 let curPrice = res._8
17911793 let poolStatus = parseIntValue(res._9)
17921794 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), toString(curPrice), toString(poolStatus)], SEP))
17931795 }
17941796
17951797
17961798 @Verifier(tx)
17971799 func verify () = {
17981800 let targetPublicKey = match managerPublicKeyOrUnit() {
17991801 case pk: ByteVector =>
18001802 pk
18011803 case _: Unit =>
18021804 tx.senderPublicKey
18031805 case _ =>
18041806 throw("Match error")
18051807 }
18061808 match tx {
18071809 case order: Order =>
18081810 let matcherPub = getMatcherPubOrFail()
1809- let $t06944369560 = if (skipOrderValidation())
1811+ let $t06948569602 = if (skipOrderValidation())
18101812 then $Tuple2(true, "")
18111813 else validateMatcherOrderAllowed(order)
1812- let orderValid = $t06944369560._1
1813- let orderValidInfo = $t06944369560._2
1814+ let orderValid = $t06948569602._1
1815+ let orderValidInfo = $t06948569602._2
18141816 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
18151817 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
18161818 if (if (if (orderValid)
18171819 then senderValid
18181820 else false)
18191821 then matcherValid
18201822 else false)
18211823 then true
18221824 else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
18231825 case s: SetScriptTransaction =>
18241826 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
18251827 then true
18261828 else {
18271829 let newHash = blake2b256(value(s.script))
18281830 let allowedHash = fromBase64String(value(getString(factoryContract, keyAllowedLpScriptHash())))
18291831 let currentHash = scriptHash(this)
18301832 if ((allowedHash == newHash))
18311833 then (currentHash != newHash)
18321834 else false
18331835 }
18341836 case _ =>
18351837 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
18361838 }
18371839 }
18381840

github/deemru/w8io/6500d08 
310.02 ms