tx · EcgcLqYpdrg7GknRTtZdXgjntZS8SqgFcdk9aeGHAMeg

3Mqo3c7G5qkBfvMMLhriequKQFofhJSP9ip:  -0.06200000 Waves

2024.02.21 14:00 [2985918] smart account 3Mqo3c7G5qkBfvMMLhriequKQFofhJSP9ip > SELF 0.00000000 Waves

{ "type": 13, "id": "EcgcLqYpdrg7GknRTtZdXgjntZS8SqgFcdk9aeGHAMeg", "fee": 6200000, "feeAssetId": null, "timestamp": 1708513204942, "version": 2, "chainId": 84, "sender": "3Mqo3c7G5qkBfvMMLhriequKQFofhJSP9ip", "senderPublicKey": "5A4c5wG6NUWakcEewdfBkkZSvSdZRqo9onS5bqQrv3x1", "proofs": [ "4neD1fBtUrNqAd65NdeoygJVs9s3ZyhGD41GqzXaM11LjVSH98rqnbMQJ3Va1ByQxXCB6p1AKkauVFYSmmVa3ekp" ], "script": "base64:BgKhAQgCEgASBQoDAQQBEgcKBQEEAQgBEgQKAgEEEgMKAQESBAoCAQQSBAoCCAESBAoCCAESBAoCCAESBQoDAQgBEgASBAoCAQESAwoBARIFCgMBAQESBAoCCAgSABIAEgMKAQgSBQoDAQEBEgQKAgEBEgQKAggBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgASAwoBARIDCgEBEgQKAggBhAEACmxQZGVjaW1hbHMACAAGc2NhbGU4AIDC1y8ADHNjYWxlOEJpZ0ludAkAtgIBAIDC1y8AB3NjYWxlMTgJALYCAQCAgJC7utat8A0ACnplcm9CaWdJbnQJALYCAQAAAARiaWcwCQC2AgEAAAAEYmlnMQkAtgIBAAEABGJpZzIJALYCAQACAAt3YXZlc1N0cmluZwIFV0FWRVMAA1NFUAICX18AClBvb2xBY3RpdmUAAQAPUG9vbFB1dERpc2FibGVkAAIAE1Bvb2xNYXRjaGVyRGlzYWJsZWQAAwAMUG9vbFNodXRkb3duAAQADmlkeFBvb2xBZGRyZXNzAAEADWlkeFBvb2xTdGF0dXMAAgAQaWR4UG9vbExQQXNzZXRJZAADAA1pZHhBbXRBc3NldElkAAQAD2lkeFByaWNlQXNzZXRJZAAFAA5pZHhBbXRBc3NldERjbQAGABBpZHhQcmljZUFzc2V0RGNtAAcADmlkeElBbXRBc3NldElkAAgAEGlkeElQcmljZUFzc2V0SWQACQANaWR4TFBBc3NldERjbQAKABJpZHhQb29sQW10QXNzZXRBbXQAAQAUaWR4UG9vbFByaWNlQXNzZXRBbXQAAgARaWR4UG9vbExQQXNzZXRBbXQAAwAZaWR4RmFjdG9yeVN0YWtpbmdDb250cmFjdAABABppZHhGYWN0b3J5U2xpcHBhZ2VDb250cmFjdAAHAQV0b1gxOAIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUHc2NhbGUxOAkAtgIBBQ1vcmlnU2NhbGVNdWx0AQt0b1gxOEJpZ0ludAIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQC8AgMFB29yaWdWYWwFB3NjYWxlMTgFDW9yaWdTY2FsZU11bHQBB2Zyb21YMTgCA3ZhbA9yZXN1bHRTY2FsZU11bHQJAKADAQkAvAIDBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQdzY2FsZTE4AQxmcm9tWDE4Um91bmQDA3ZhbA9yZXN1bHRTY2FsZU11bHQFcm91bmQJAKADAQkAvQIEBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQdzY2FsZTE4BQVyb3VuZAEHdG9TY2FsZQMDYW10CHJlc1NjYWxlCGN1clNjYWxlCQBrAwUDYW10BQhyZXNTY2FsZQUIY3VyU2NhbGUBA2FicwEDdmFsAwkAZgIAAAUDdmFsCQEBLQEFA3ZhbAUDdmFsAQlhYnNCaWdJbnQBA3ZhbAMJAL8CAgUKemVyb0JpZ0ludAUDdmFsCQC+AgEFA3ZhbAUDdmFsAQxzd2FwQ29udHJhY3QAAhAlc19fc3dhcENvbnRyYWN0AQJmYwACEyVzX19mYWN0b3J5Q29udHJhY3QBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEWa2V5TWFuYWdlclZhdWx0QWRkcmVzcwACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQJwbAACESVzJXNfX3ByaWNlX19sYXN0AQJwaAIBaAl0aW1lc3RhbXAJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQFoCQDMCAIJAKQDAQUJdGltZXN0YW1wBQNuaWwFA1NFUAEDcGF1Agt1c2VyQWRkcmVzcwR0eElkCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwULdXNlckFkZHJlc3MCAl9fBQR0eElkAQNnYXUCC3VzZXJBZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQt1c2VyQWRkcmVzcwICX18FBHR4SWQBAmFhAAIPJXNfX2Ftb3VudEFzc2V0AQJwYQACDiVzX19wcmljZUFzc2V0AAZrZXlGZWUCByVzX19mZWUACmZlZURlZmF1bHQJAGsDAAoFBnNjYWxlOACQTgADZmVlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFBmtleUZlZQUKZmVlRGVmYXVsdAAGa2V5S0xwCQC5CQIJAMwIAgICJXMJAMwIAgIDa0xwBQNuaWwFA1NFUAAVa2V5S0xwUmVmcmVzaGVkSGVpZ2h0CQC5CQIJAMwIAgICJXMJAMwIAgISa0xwUmVmcmVzaGVkSGVpZ2h0BQNuaWwFA1NFUAASa2V5S0xwUmVmcmVzaERlbGF5CQC5CQIJAMwIAgICJXMJAMwIAgIPcmVmcmVzaEtMcERlbGF5BQNuaWwFA1NFUAAWa0xwUmVmcmVzaERlbGF5RGVmYXVsdAAeAA9rTHBSZWZyZXNoRGVsYXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5S0xwUmVmcmVzaERlbGF5BRZrTHBSZWZyZXNoRGVsYXlEZWZhdWx0ARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgINc3Rha2VkQmFsYW5jZQkAzAgCBQdhc3NldElkBQNuaWwFA1NFUAEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIRc2hhcmVBc3NldEJhbGFuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAQdhc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEFB2Fzc2V0SWQAAAEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEFB2Fzc2V0SWQAAAEQa2V5RmFjdG9yeUNvbmZpZwACESVzX19mYWN0b3J5Q29uZmlnAQ1rZXlNYXRjaGVyUHViAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5ASlrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cwETcG9vbENvbnRyYWN0QWRkcmVzcwkArAICCQCsAgICCCVzJXMlc19fBRNwb29sQ29udHJhY3RBZGRyZXNzAiBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAENa2V5UG9vbENvbmZpZwIJaUFtdEFzc2V0C2lQcmljZUFzc2V0CQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQlpQW10QXNzZXQCAl9fBQtpUHJpY2VBc3NldAIIX19jb25maWcBH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQBDGJhc2VBc3NldFN0cgkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQxiYXNlQXNzZXRTdHIBE2tleUFsbFBvb2xzU2h1dGRvd24AAgwlc19fc2h1dGRvd24BDWtleVBvb2xXZWlnaHQBD2NvbnRyYWN0QWRkcmVzcwkArAICAhIlcyVzX19wb29sV2VpZ2h0X18FD2NvbnRyYWN0QWRkcmVzcwEWa2V5QWxsb3dlZExwU2NyaXB0SGFzaAACFyVzX19hbGxvd2VkTHBTY3JpcHRIYXNoABZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzAhclc19fZmVlQ29sbGVjdG9yQWRkcmVzcwEWa2V5U2tpcE9yZGVyVmFsaWRhdGlvbgELcG9vbEFkZHJlc3MJAKwCAgIbJXMlc19fc2tpcE9yZGVyVmFsaWRhdGlvbl9fBQtwb29sQWRkcmVzcwEPdGhyb3dPcmRlckVycm9yBApvcmRlclZhbGlkDm9yZGVyVmFsaWRJbmZvC3NlbmRlclZhbGlkDG1hdGNoZXJWYWxpZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiRvcmRlciB2YWxpZGF0aW9uIGZhaWxlZDogb3JkZXJWYWxpZD0JAKUDAQUKb3JkZXJWYWxpZAICICgFDm9yZGVyVmFsaWRJbmZvAgEpAg0gc2VuZGVyVmFsaWQ9CQClAwEFC3NlbmRlclZhbGlkAg4gbWF0Y2hlclZhbGlkPQkApQMBBQxtYXRjaGVyVmFsaWQBF2FkZHJlc3NGcm9tU3RyaW5nT3JUaGlzAQ1hZGRyZXNzU3RyaW5nBAckbWF0Y2gwCQCmCAEFDWFkZHJlc3NTdHJpbmcDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAUBYQUEdGhpcwEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEDmZhY3RvcnlBZGRyZXNzBAckbWF0Y2gwCQCiCAEJAQJmYwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBANmY2EFByRtYXRjaDAJARdhZGRyZXNzRnJvbVN0cmluZ09yVGhpcwEFA2ZjYQUEdGhpcwQHJG1hdGNoMAkAnQgCBQ5mYWN0b3J5QWRkcmVzcwkBFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBF2FkZHJlc3NGcm9tU3RyaW5nT3JUaGlzAQUBcwUEdGhpcwEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABDGdldEludE9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQh0aHJvd0VycgEDbXNnCQACAQkAuQkCCQDMCAICCGxwLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAQZmbXRFcnIBA21zZwkAuQkCCQDMCAICCGxwLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECZmMAABNmZWVDb2xsZWN0b3JBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0BRZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzAAVpbkZlZQoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AhBnZXRJbkZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AAZvdXRGZWUKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIRZ2V0T3V0RmVlUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBFWtleUFkZHJlc3NXaGl0ZWxpc3RlZAEHYWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgILd2hpdGVsaXN0ZWQJAMwIAgkApQgBBQdhZGRyZXNzBQNuaWwFA1NFUAEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBB2FkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPZmFjdG9yeUNvbnRyYWN0CQEVa2V5QWRkcmVzc1doaXRlbGlzdGVkAQUHYWRkcmVzcwcBEGlzR2xvYmFsU2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQCbCAIFD2ZhY3RvcnlDb250cmFjdAkBE2tleUFsbFBvb2xzU2h1dGRvd24ABwETZ2V0TWF0Y2hlclB1Yk9yRmFpbAAJANkEAQkBD2dldFN0cmluZ09yRmFpbAIFD2ZhY3RvcnlDb250cmFjdAkBDWtleU1hdGNoZXJQdWIAAQ1nZXRQb29sQ29uZmlnAAQIYW10QXNzZXQJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEABApwcmljZUFzc2V0CQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAQLaVByaWNlQXNzZXQJAQxnZXRJbnRPckZhaWwCBQ9mYWN0b3J5Q29udHJhY3QJAR9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAQUKcHJpY2VBc3NldAQJaUFtdEFzc2V0CQEMZ2V0SW50T3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAEFCGFtdEFzc2V0CQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQ9mYWN0b3J5Q29udHJhY3QJAQ1rZXlQb29sQ29uZmlnAgkApAMBBQlpQW10QXNzZXQJAKQDAQULaVByaWNlQXNzZXQFA1NFUAEMcGFyc2VBc3NldElkAQVpbnB1dAMJAAACBQVpbnB1dAULd2F2ZXNTdHJpbmcFBHVuaXQJANkEAQUFaW5wdXQBD2Fzc2V0SWRUb1N0cmluZwEFaW5wdXQDCQAAAgUFaW5wdXQFBHVuaXQFC3dhdmVzU3RyaW5nCQDYBAEJAQV2YWx1ZQEFBWlucHV0AQ9wYXJzZVBvb2xDb25maWcBCnBvb2xDb25maWcJAJkKBwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQpwb29sQ29uZmlnBQ5pZHhQb29sQWRkcmVzcwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFDWlkeFBvb2xTdGF0dXMJANkEAQkAkQMCBQpwb29sQ29uZmlnBRBpZHhQb29sTFBBc3NldElkCQEMcGFyc2VBc3NldElkAQkAkQMCBQpwb29sQ29uZmlnBQ1pZHhBbXRBc3NldElkCQEMcGFyc2VBc3NldElkAQkAkQMCBQpwb29sQ29uZmlnBQ9pZHhQcmljZUFzc2V0SWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpwb29sQ29uZmlnBQ5pZHhBbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFEGlkeFByaWNlQXNzZXREY20AEHBvb2xDb25maWdQYXJzZWQJAQ9wYXJzZVBvb2xDb25maWcBCQENZ2V0UG9vbENvbmZpZwAACyR0MDk3Njk5OTM1BRBwb29sQ29uZmlnUGFyc2VkAA5jZmdQb29sQWRkcmVzcwgFCyR0MDk3Njk5OTM1Al8xAA1jZmdQb29sU3RhdHVzCAULJHQwOTc2OTk5MzUCXzIADGNmZ0xwQXNzZXRJZAgFCyR0MDk3Njk5OTM1Al8zABBjZmdBbW91bnRBc3NldElkCAULJHQwOTc2OTk5MzUCXzQAD2NmZ1ByaWNlQXNzZXRJZAgFCyR0MDk3Njk5OTM1Al81ABZjZmdBbW91bnRBc3NldERlY2ltYWxzCAULJHQwOTc2OTk5MzUCXzYAFWNmZ1ByaWNlQXNzZXREZWNpbWFscwgFCyR0MDk3Njk5OTM1Al83ARBnZXRGYWN0b3J5Q29uZmlnAAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEQa2V5RmFjdG9yeUNvbmZpZwAFA1NFUAAPc3Rha2luZ0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCCQEQZ2V0RmFjdG9yeUNvbmZpZwAFGWlkeEZhY3RvcnlTdGFraW5nQ29udHJhY3QCGWluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MAEHNsaXBwYWdlQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIJARBnZXRGYWN0b3J5Q29uZmlnAAUaaWR4RmFjdG9yeVNsaXBwYWdlQ29udHJhY3QCGWluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MBEWRhdGFQdXRBY3Rpb25JbmZvCg1pbkFtdEFzc2V0QW10D2luUHJpY2VBc3NldEFtdAhvdXRMcEFtdAVwcmljZR1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlchVzbGlwcGFnZVRvbGVyYW5jZVJlYWwIdHhIZWlnaHQLdHhUaW1lc3RhbXASc2xpcGFnZUFtdEFzc2V0QW10FHNsaXBhZ2VQcmljZUFzc2V0QW10CQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQ1pbkFtdEFzc2V0QW10CQDMCAIJAKQDAQUPaW5QcmljZUFzc2V0QW10CQDMCAIJAKQDAQUIb3V0THBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFHXNsaXBwYWdlVG9sZXJhbmNlUGFzc2VkQnlVc2VyCQDMCAIJAKQDAQUVc2xpcHBhZ2VUb2xlcmFuY2VSZWFsCQDMCAIJAKQDAQUIdHhIZWlnaHQJAMwIAgkApAMBBQt0eFRpbWVzdGFtcAkAzAgCCQCkAwEFEnNsaXBhZ2VBbXRBc3NldEFtdAkAzAgCCQCkAwEFFHNsaXBhZ2VQcmljZUFzc2V0QW10BQNuaWwFA1NFUAERZGF0YUdldEFjdGlvbkluZm8GDm91dEFtdEFzc2V0QW10EG91dFByaWNlQXNzZXRBbXQHaW5McEFtdAVwcmljZQh0eEhlaWdodAt0eFRpbWVzdGFtcAkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFDm91dEFtdEFzc2V0QW10CQDMCAIJAKQDAQUQb3V0UHJpY2VBc3NldEFtdAkAzAgCCQCkAwEFB2luTHBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFCHR4SGVpZ2h0CQDMCAIJAKQDAQULdHhUaW1lc3RhbXAFA25pbAUDU0VQAQ1nZXRBY2NCYWxhbmNlAQdhc3NldElkBA1iYWxhbmNlT25Qb29sAwkAAAIFB2Fzc2V0SWQCBVdBVkVTCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkA8AcCBQR0aGlzCQDZBAEFB2Fzc2V0SWQEDHRvdGFsQmFsYW5jZQkAZQIJAGQCBQ1iYWxhbmNlT25Qb29sCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8BBQdhc3NldElkCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgUMdG90YWxCYWxhbmNlBQNuaWwBD2NhbGNQcmljZUJpZ0ludAIIcHJBbXRYMTgIYW1BbXRYMTgJALwCAwUIcHJBbXRYMTgFB3NjYWxlMTgFCGFtQW10WDE4ARRjYWxjUHJpY2VCaWdJbnRSb3VuZAMIcHJBbXRYMTgIYW1BbXRYMTgFcm91bmQJAL0CBAUIcHJBbXRYMTgFB3NjYWxlMTgFCGFtQW10WDE4BQVyb3VuZAEHZ2V0UmF0ZQEFcHJveHkEA2ludgkA/AcEBQVwcm94eQIHZ2V0UmF0ZQUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYEByRtYXRjaDAFA2ludgMJAAECBQckbWF0Y2gwAgNJbnQEAXIFByRtYXRjaDAFAXIJAQh0aHJvd0VycgECIHByb3h5LmdldFJhdGUoKSB1bmV4cGVjdGVkIHZhbHVlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQdkZXBvc2l0BAdhc3NldElkBmFtb3VudA5zdGFraW5nQXNzZXRJZAVwcm94eQQYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8BBQdhc3NldElkAwkAAAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBBpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQkBHGdldFN0YWtpbmdBc3NldEJhbGFuY2VPclplcm8BBQ5zdGFraW5nQXNzZXRJZAMJAAACBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UEBWFzc2V0CQEMcGFyc2VBc3NldElkAQUHYXNzZXRJZAMJAGYCBQZhbW91bnQAAAQNZGVwb3NpdEludm9rZQkA/AcEBQVwcm94eQIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQVhc3NldAUGYW1vdW50BQNuaWwDCQAAAgUNZGVwb3NpdEludm9rZQUNZGVwb3NpdEludm9rZQQHJG1hdGNoMAUNZGVwb3NpdEludm9rZQMJAAECBQckbWF0Y2gwAgNJbnQEFHJlY2VpdmVkU3Rha2luZ0Fzc2V0BQckbWF0Y2gwBBRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAZAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUGYW1vdW50BBZuZXdTdGFraW5nQXNzZXRCYWxhbmNlCQBkAgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UFFHJlY2VpdmVkU3Rha2luZ0Fzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5QWRkaXRpb25hbEJhbGFuY2UBBQdhc3NldElkBRRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVN0YWtpbmdBc3NldEJhbGFuY2UBBQ5zdGFraW5nQXNzZXRJZAUWbmV3U3Rha2luZ0Fzc2V0QmFsYW5jZQUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEId2l0aGRyYXcGB2Fzc2V0SWQGYW1vdW50DnN0YWtpbmdBc3NldElkBXByb3h5DHByb3h5UmF0ZU11bA1wcm9maXRBZGRyZXNzBBhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UJARpnZXRBZGRpdGlvbmFsQmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQDCQAAAgUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFDnN0YWtpbmdBc3NldElkAwkAAAIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQQQY3VycmVudFByb3h5UmF0ZQkBB2dldFJhdGUBBQVwcm94eQMJAAACBRBjdXJyZW50UHJveHlSYXRlBRBjdXJyZW50UHJveHlSYXRlBAdvbGRSYXRlCQBrAwUMcHJveHlSYXRlTXVsBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBAxzdGFraW5nQXNzZXQJAQxwYXJzZUFzc2V0SWQBBQ5zdGFraW5nQXNzZXRJZAQUb2xkU2VuZFN0YWtpbmdBbW91bnQJAGsDBQxwcm94eVJhdGVNdWwFBmFtb3VudAUHb2xkUmF0ZQQWc2VuZFN0YWtpbmdBc3NldEFtb3VudAkAawMFDHByb3h5UmF0ZU11bAUGYW1vdW50BRBjdXJyZW50UHJveHlSYXRlBAxwcm9maXRBbW91bnQJAJYDAQkAzAgCAAAJAMwIAgkAZQIFFG9sZFNlbmRTdGFraW5nQW1vdW50BRZzZW5kU3Rha2luZ0Fzc2V0QW1vdW50BQNuaWwDCQBmAgUWc2VuZFN0YWtpbmdBc3NldEFtb3VudAAABA53aXRoZHJhd0ludm9rZQkA/AcEBQVwcm94eQIId2l0aGRyYXcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc3Rha2luZ0Fzc2V0BRZzZW5kU3Rha2luZ0Fzc2V0QW1vdW50BQNuaWwDCQAAAgUOd2l0aGRyYXdJbnZva2UFDndpdGhkcmF3SW52b2tlBAckbWF0Y2gwBQ53aXRoZHJhd0ludm9rZQMJAAECBQckbWF0Y2gwAgNJbnQEDnJlY2VpdmVkQXNzZXRzBQckbWF0Y2gwBBRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAZQIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUOcmVjZWl2ZWRBc3NldHMEFm5ld1N0YWtpbmdBc3NldEJhbGFuY2UJAGUCCQBlAgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UFFnNlbmRTdGFraW5nQXNzZXRBbW91bnQFDHByb2ZpdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleUFkZGl0aW9uYWxCYWxhbmNlAQUHYXNzZXRJZAUUbmV3QWRkaXRpb25hbEJhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlTdGFraW5nQXNzZXRCYWxhbmNlAQUOc3Rha2luZ0Fzc2V0SWQFFm5ld1N0YWtpbmdBc3NldEJhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUNcHJvZml0QWRkcmVzcwUMcHJvZml0QW1vdW50CQEMcGFyc2VBc3NldElkAQUOc3Rha2luZ0Fzc2V0SWQFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2dldExlYXNlUHJveHlDb25maWcBB2Fzc2V0SWQEByRtYXRjaDAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AhpnZXRQb29sTGVhc2VDb25maWdSRUFET05MWQkAzAgCCQClCAEFBHRoaXMJAMwIAgUHYXNzZXRJZAUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIwKEJvb2xlYW4sIEludCwgSW50LCBTdHJpbmcsIFN0cmluZywgSW50LCBTdHJpbmcpBAFhBQckbWF0Y2gwBQFhCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIBWwUHYXNzZXRJZAIdXSBnZXRMZWFzZVByb3h5Q29uZmlnKCkgZXJyb3IBEXJlYmFsYW5jZUludGVybmFsBwt0YXJnZXRSYXRpbwdhc3NldElkDnN0YWtpbmdBc3NldElkCm1pbkJhbGFuY2UFcHJveHkMcHJveHlSYXRlTXVsDXByb2ZpdEFkZHJlc3MEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFDnN0YWtpbmdBc3NldElkAwkAAAIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQQYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlAwkBAiE9AgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UAAAkBGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAQUHYXNzZXRJZAAAAwkAAAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBBRsZWFzYWJsZVRvdGFsQmFsYW5jZQkAlgMBCQDMCAIAAAkAzAgCCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdhc3NldElkBQptaW5CYWxhbmNlBQNuaWwEF3RhcmdldEFkZGl0aW9uYWxCYWxhbmNlCQBrAwULdGFyZ2V0UmF0aW8FFGxlYXNhYmxlVG90YWxCYWxhbmNlAGQEBGRpZmYJAGUCBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFF3RhcmdldEFkZGl0aW9uYWxCYWxhbmNlAwkAAAIFBGRpZmYAAAUDbmlsAwkAZgIAAAUEZGlmZgQPc2VuZEFzc2V0QW1vdW50CQEBLQEFBGRpZmYJAQdkZXBvc2l0BAUHYXNzZXRJZAUPc2VuZEFzc2V0QW1vdW50BQ5zdGFraW5nQXNzZXRJZAUFcHJveHkEDmdldEFzc2V0QW1vdW50BQRkaWZmCQEId2l0aGRyYXcGBQdhc3NldElkBQ5nZXRBc3NldEFtb3VudAUOc3Rha2luZ0Fzc2V0SWQFBXByb3h5BQxwcm94eVJhdGVNdWwFDXByb2ZpdEFkZHJlc3MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDnJlYmFsYW5jZUFzc2V0AQdhc3NldElkBA0kdDAxNjIyMDE2MzU2CQETZ2V0TGVhc2VQcm94eUNvbmZpZwEFB2Fzc2V0SWQECmlzTGVhc2FibGUIBQ0kdDAxNjIyMDE2MzU2Al8xBAtsZWFzZWRSYXRpbwgFDSR0MDE2MjIwMTYzNTYCXzIECm1pbkJhbGFuY2UIBQ0kdDAxNjIyMDE2MzU2Al8zBAxwcm94eUFkZHJlc3MIBQ0kdDAxNjIyMDE2MzU2Al80BAxwcm94eUFzc2V0SWQIBQ0kdDAxNjIyMDE2MzU2Al81BAxwcm94eVJhdGVNdWwIBQ0kdDAxNjIyMDE2MzU2Al82BBRzdGFraW5nUHJvZml0QWRkcmVzcwgFDSR0MDE2MjIwMTYzNTYCXzcDBQppc0xlYXNhYmxlCQERcmViYWxhbmNlSW50ZXJuYWwHBQtsZWFzZWRSYXRpbwUHYXNzZXRJZAUMcHJveHlBc3NldElkBQptaW5CYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA2MikBBQxwcm94eUFkZHJlc3MFDHByb3h5UmF0ZU11bAkBEUBleHRyTmF0aXZlKDEwNjIpAQUUc3Rha2luZ1Byb2ZpdEFkZHJlc3MFA25pbAEZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldAIHYXNzZXRJZAlnZXRBbW91bnQEDSR0MDE2NzU1MTY4OTEJARNnZXRMZWFzZVByb3h5Q29uZmlnAQUHYXNzZXRJZAQKaXNMZWFzYWJsZQgFDSR0MDE2NzU1MTY4OTECXzEEC2xlYXNlZFJhdGlvCAUNJHQwMTY3NTUxNjg5MQJfMgQKbWluQmFsYW5jZQgFDSR0MDE2NzU1MTY4OTECXzMEDHByb3h5QWRkcmVzcwgFDSR0MDE2NzU1MTY4OTECXzQEDHByb3h5QXNzZXRJZAgFDSR0MDE2NzU1MTY4OTECXzUEDHByb3h5UmF0ZU11bAgFDSR0MDE2NzU1MTY4OTECXzYEFHN0YWtpbmdQcm9maXRBZGRyZXNzCAUNJHQwMTY3NTUxNjg5MQJfNwMFCmlzTGVhc2FibGUEF25ld1RvdGFsTGVhc2FibGVCYWxhbmNlCQCWAwEJAMwIAgAACQDMCAIJAGUCCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdhc3NldElkBQlnZXRBbW91bnQFCm1pbkJhbGFuY2UFA25pbAMJAAACBRduZXdUb3RhbExlYXNhYmxlQmFsYW5jZQUXbmV3VG90YWxMZWFzYWJsZUJhbGFuY2UEFG5ld0FkZGl0aW9uYWxCYWxhbmNlCQBrAwULbGVhc2VkUmF0aW8FF25ld1RvdGFsTGVhc2FibGVCYWxhbmNlAGQDCQAAAgUUbmV3QWRkaXRpb25hbEJhbGFuY2UFFG5ld0FkZGl0aW9uYWxCYWxhbmNlBA53aXRoZHJhd0Ftb3VudAkAZQIJARpnZXRBZGRpdGlvbmFsQmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQFFG5ld0FkZGl0aW9uYWxCYWxhbmNlAwkAAAIFDndpdGhkcmF3QW1vdW50BQ53aXRoZHJhd0Ftb3VudAMJAGYCAAAFDndpdGhkcmF3QW1vdW50CQEHZGVwb3NpdAQFB2Fzc2V0SWQJAQEtAQUOd2l0aGRyYXdBbW91bnQFDHByb3h5QXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNjIpAQUMcHJveHlBZGRyZXNzCQEId2l0aGRyYXcGBQdhc3NldElkBQ53aXRoZHJhd0Ftb3VudAUMcHJveHlBc3NldElkCQERQGV4dHJOYXRpdmUoMTA2MikBBQxwcm94eUFkZHJlc3MFDHByb3h5UmF0ZU11bAkBEUBleHRyTmF0aXZlKDEwNjIpAQUUc3Rha2luZ1Byb2ZpdEFkZHJlc3MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAEXd2l0aGRyYXdBbmRSZWJhbGFuY2VBbGwCFGFtb3VudEFzc2V0T3V0QW1vdW50E3ByaWNlQXNzZXRPdXRBbW91bnQEEkFtQW10V2l0aGRyYXdTdGF0ZQkBGXdpdGhkcmF3QW5kUmViYWxhbmNlQXNzZXQCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAmFhAAUUYW1vdW50QXNzZXRPdXRBbW91bnQEElByQW10V2l0aGRyYXdTdGF0ZQkBGXdpdGhkcmF3QW5kUmViYWxhbmNlQXNzZXQCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAUTcHJpY2VBc3NldE91dEFtb3VudAkAzggCBRJBbUFtdFdpdGhkcmF3U3RhdGUFElByQW10V2l0aGRyYXdTdGF0ZQEQcHJpdmF0ZUNhbGNQcmljZQQKYW1Bc3NldERjbQpwckFzc2V0RGNtBWFtQW10BXByQW10BA5hbXRBc3NldEFtdFgxOAkBBXRvWDE4AgUFYW1BbXQFCmFtQXNzZXREY20EEHByaWNlQXNzZXRBbXRYMTgJAQV0b1gxOAIFBXByQW10BQpwckFzc2V0RGNtCQEPY2FsY1ByaWNlQmlnSW50AgUQcHJpY2VBc3NldEFtdFgxOAUOYW10QXNzZXRBbXRYMTgBCmNhbGNQcmljZXMDBWFtQW10BXByQW10BWxwQW10BANjZmcJAQ1nZXRQb29sQ29uZmlnAAQLYW10QXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDmlkeEFtdEFzc2V0RGNtBA1wcmljZUFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBRBpZHhQcmljZUFzc2V0RGNtBAhwcmljZVgxOAkBEHByaXZhdGVDYWxjUHJpY2UEBQthbXRBc3NldERjbQUNcHJpY2VBc3NldERjbQUFYW1BbXQFBXByQW10BAhhbUFtdFgxOAkBBXRvWDE4AgUFYW1BbXQFC2FtdEFzc2V0RGNtBAhwckFtdFgxOAkBBXRvWDE4AgUFcHJBbXQFDXByaWNlQXNzZXREY20ECGxwQW10WDE4CQEFdG9YMTgCBQVscEFtdAUGc2NhbGU4BBNscFByaWNlSW5BbUFzc2V0WDE4CQEPY2FsY1ByaWNlQmlnSW50AgUIYW1BbXRYMTgFCGxwQW10WDE4BBNscFByaWNlSW5QckFzc2V0WDE4CQEPY2FsY1ByaWNlQmlnSW50AgUIcHJBbXRYMTgFCGxwQW10WDE4CQDMCAIFCHByaWNlWDE4CQDMCAIFE2xwUHJpY2VJbkFtQXNzZXRYMTgJAMwIAgUTbHBQcmljZUluUHJBc3NldFgxOAUDbmlsAQ9jYWxjdWxhdGVQcmljZXMDBWFtQW10BXByQW10BWxwQW10BAZwcmljZXMJAQpjYWxjUHJpY2VzAwUFYW1BbXQFBXByQW10BQVscEFtdAkAzAgCCQEHZnJvbVgxOAIJAJEDAgUGcHJpY2VzAAAFBnNjYWxlOAkAzAgCCQEHZnJvbVgxOAIJAJEDAgUGcHJpY2VzAAEFBnNjYWxlOAkAzAgCCQEHZnJvbVgxOAIJAJEDAgUGcHJpY2VzAAIFBnNjYWxlOAUDbmlsARRlc3RpbWF0ZUdldE9wZXJhdGlvbgQGdHhJZDU4CnBtdEFzc2V0SWQIcG10THBBbXQLdXNlckFkZHJlc3MEA2NmZwkBDWdldFBvb2xDb25maWcABAlscEFzc2V0SWQJAJEDAgUDY2ZnBRBpZHhQb29sTFBBc3NldElkBAlhbUFzc2V0SWQJAJEDAgUDY2ZnBQ1pZHhBbXRBc3NldElkBAlwckFzc2V0SWQJAJEDAgUDY2ZnBQ9pZHhQcmljZUFzc2V0SWQECmFtQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDmlkeEFtdEFzc2V0RGNtBApwckFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBRBpZHhQcmljZUFzc2V0RGNtBApwb29sU3RhdHVzCQCRAwIFA2NmZwUNaWR4UG9vbFN0YXR1cwQKbHBFbWlzc2lvbggJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFCWxwQXNzZXRJZAkArAICCQCsAgICBkFzc2V0IAUJbHBBc3NldElkAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQMJAQIhPQIFCWxwQXNzZXRJZAUKcG10QXNzZXRJZAkAAgECFUludmFsaWQgYXNzZXQgcGFzc2VkLgQJYW1CYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFCWFtQXNzZXRJZAQMYW1CYWxhbmNlWDE4CQEFdG9YMTgCBQlhbUJhbGFuY2UFCmFtQXNzZXREY20ECXByQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQlwckFzc2V0SWQEDHByQmFsYW5jZVgxOAkBBXRvWDE4AgUJcHJCYWxhbmNlBQpwckFzc2V0RGNtBAtjdXJQcmljZVgxOAkBD2NhbGNQcmljZUJpZ0ludAIFDHByQmFsYW5jZVgxOAUMYW1CYWxhbmNlWDE4BAhjdXJQcmljZQkBB2Zyb21YMTgCBQtjdXJQcmljZVgxOAUGc2NhbGU4BAtwbXRMcEFtdFgxOAkBBXRvWDE4AgUIcG10THBBbXQFBnNjYWxlOAQNbHBFbWlzc2lvblgxOAkBBXRvWDE4AgUKbHBFbWlzc2lvbgUGc2NhbGU4BAtvdXRBbUFtdFgxOAkAvAIDBQxhbUJhbGFuY2VYMTgFC3BtdExwQW10WDE4BQ1scEVtaXNzaW9uWDE4BAtvdXRQckFtdFgxOAkAvAIDBQxwckJhbGFuY2VYMTgFC3BtdExwQW10WDE4BQ1scEVtaXNzaW9uWDE4BAhvdXRBbUFtdAkBDGZyb21YMThSb3VuZAMFC291dEFtQW10WDE4BQphbUFzc2V0RGNtBQVGTE9PUgQIb3V0UHJBbXQJAQxmcm9tWDE4Um91bmQDBQtvdXRQckFtdFgxOAUKcHJBc3NldERjbQUFRkxPT1IEBXN0YXRlAwkAAAIFBnR4SWQ1OAIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFCG91dEFtQW10AwkAAAIFCWFtQXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUJYW1Bc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQhvdXRQckFtdAMJAAACBQlwckFzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFCXByQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEDZ2F1AgkApQgBBQt1c2VyQWRkcmVzcwUGdHhJZDU4CQERZGF0YUdldEFjdGlvbkluZm8GBQhvdXRBbUFtdAUIb3V0UHJBbXQFCHBtdExwQW10BQhjdXJQcmljZQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUIY3VyUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFCGN1clByaWNlBQNuaWwJAJwKCgUIb3V0QW1BbXQFCG91dFByQW10BQlhbUFzc2V0SWQFCXByQXNzZXRJZAUJYW1CYWxhbmNlBQlwckJhbGFuY2UFCmxwRW1pc3Npb24FC2N1clByaWNlWDE4BQpwb29sU3RhdHVzBQVzdGF0ZQEUZXN0aW1hdGVQdXRPcGVyYXRpb24JBnR4SWQ1OBFzbGlwcGFnZVRvbGVyYW5jZQxpbkFtQXNzZXRBbXQLaW5BbUFzc2V0SWQMaW5QckFzc2V0QW10C2luUHJBc3NldElkC3VzZXJBZGRyZXNzCmlzRXZhbHVhdGUGZW1pdExwBANjZmcJAQ1nZXRQb29sQ29uZmlnAAQJbHBBc3NldElkCQDZBAEJAJEDAgUDY2ZnBRBpZHhQb29sTFBBc3NldElkBAxhbUFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ1pZHhBbXRBc3NldElkBAxwckFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ9pZHhQcmljZUFzc2V0SWQEC2lBbXRBc3NldElkCQCRAwIFA2NmZwUOaWR4SUFtdEFzc2V0SWQEDWlQcmljZUFzc2V0SWQJAJEDAgUDY2ZnBRBpZHhJUHJpY2VBc3NldElkBAthbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUOaWR4QW10QXNzZXREY20EDXByaWNlQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFEGlkeFByaWNlQXNzZXREY20ECnBvb2xTdGF0dXMJAJEDAgUDY2ZnBQ1pZHhQb29sU3RhdHVzBApscEVtaXNzaW9uCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFCWxwQXNzZXRJZAkArAICCQCsAgICBkFzc2V0IAkA2AQBBQlscEFzc2V0SWQCDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5BA5pbkFtQXNzZXRJZFN0cgkA2AQBCQELdmFsdWVPckVsc2UCBQtpbkFtQXNzZXRJZAkA2QQBAgVXQVZFUwQOaW5QckFzc2V0SWRTdHIJANgEAQkBC3ZhbHVlT3JFbHNlAgULaW5QckFzc2V0SWQJANkEAQIFV0FWRVMDAwkBAiE9AgUMYW1Bc3NldElkU3RyBQ5pbkFtQXNzZXRJZFN0cgYJAQIhPQIFDHByQXNzZXRJZFN0cgUOaW5QckFzc2V0SWRTdHIJAAIBAiJJbnZhbGlkIGFtdCBvciBwcmljZSBhc3NldCBwYXNzZWQuBAlhbUJhbGFuY2UDBQppc0V2YWx1YXRlCQENZ2V0QWNjQmFsYW5jZQEFDGFtQXNzZXRJZFN0cgkAZQIJAQ1nZXRBY2NCYWxhbmNlAQUMYW1Bc3NldElkU3RyBQxpbkFtQXNzZXRBbXQECXByQmFsYW5jZQMFCmlzRXZhbHVhdGUJAQ1nZXRBY2NCYWxhbmNlAQUMcHJBc3NldElkU3RyCQBlAgkBDWdldEFjY0JhbGFuY2UBBQxwckFzc2V0SWRTdHIFDGluUHJBc3NldEFtdAQPaW5BbUFzc2V0QW10WDE4CQEFdG9YMTgCBQxpbkFtQXNzZXRBbXQFC2FtdEFzc2V0RGNtBA9pblByQXNzZXRBbXRYMTgJAQV0b1gxOAIFDGluUHJBc3NldEFtdAUNcHJpY2VBc3NldERjbQQMdXNlclByaWNlWDE4CQEPY2FsY1ByaWNlQmlnSW50AgUPaW5QckFzc2V0QW10WDE4BQ9pbkFtQXNzZXRBbXRYMTgEDGFtQmFsYW5jZVgxOAkBBXRvWDE4AgUJYW1CYWxhbmNlBQthbXRBc3NldERjbQQMcHJCYWxhbmNlWDE4CQEFdG9YMTgCBQlwckJhbGFuY2UFDXByaWNlQXNzZXREY20EA3JlcwMJAAACBQpscEVtaXNzaW9uAAAEC2N1clByaWNlWDE4BQp6ZXJvQmlnSW50BAtzbGlwcGFnZVgxOAUKemVyb0JpZ0ludAQIbHBBbXRYMTgJAHYGCQC5AgIFD2luQW1Bc3NldEFtdFgxOAUPaW5QckFzc2V0QW10WDE4AAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEHZnJvbVgxOAIFCGxwQW10WDE4BQZzY2FsZTgJAQdmcm9tWDE4AgUPaW5BbUFzc2V0QW10WDE4BQthbXRBc3NldERjbQkBB2Zyb21YMTgCBQ9pblByQXNzZXRBbXRYMTgFDXByaWNlQXNzZXREY20JAQ9jYWxjUHJpY2VCaWdJbnQCCQC3AgIFDHByQmFsYW5jZVgxOAUPaW5QckFzc2V0QW10WDE4CQC3AgIFDGFtQmFsYW5jZVgxOAUPaW5BbUFzc2V0QW10WDE4BQtzbGlwcGFnZVgxOAQLY3VyUHJpY2VYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCBQxwckJhbGFuY2VYMTgFDGFtQmFsYW5jZVgxOAQLc2xpcHBhZ2VYMTgJALwCAwkBCWFic0JpZ0ludAEJALgCAgULY3VyUHJpY2VYMTgFDHVzZXJQcmljZVgxOAUHc2NhbGUxOAULY3VyUHJpY2VYMTgEFHNsaXBwYWdlVG9sZXJhbmNlWDE4CQEFdG9YMTgCBRFzbGlwcGFnZVRvbGVyYW5jZQUGc2NhbGU4AwMJAQIhPQIFC2N1clByaWNlWDE4BQp6ZXJvQmlnSW50CQC/AgIFC3NsaXBwYWdlWDE4BRRzbGlwcGFnZVRvbGVyYW5jZVgxOAcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQULc2xpcHBhZ2VYMTgCHiBleGNlZWRlZCB0aGUgcGFzc2VkIGxpbWl0IG9mIAkApgMBBRRzbGlwcGFnZVRvbGVyYW5jZVgxOAQNbHBFbWlzc2lvblgxOAkBBXRvWDE4AgUKbHBFbWlzc2lvbgUGc2NhbGU4BApwclZpYUFtWDE4CQC9AgQFD2luQW1Bc3NldEFtdFgxOAkBFGNhbGNQcmljZUJpZ0ludFJvdW5kAwUMcHJCYWxhbmNlWDE4BQxhbUJhbGFuY2VYMTgFB0NFSUxJTkcFB3NjYWxlMTgFB0NFSUxJTkcECmFtVmlhUHJYMTgJAL0CBAUPaW5QckFzc2V0QW10WDE4BQdzY2FsZTE4CQEUY2FsY1ByaWNlQmlnSW50Um91bmQDBQxwckJhbGFuY2VYMTgFDGFtQmFsYW5jZVgxOAUFRkxPT1IFB0NFSUxJTkcEDGV4cGVjdGVkQW10cwMJAL8CAgUKcHJWaWFBbVgxOAUPaW5QckFzc2V0QW10WDE4CQCUCgIFCmFtVmlhUHJYMTgFD2luUHJBc3NldEFtdFgxOAkAlAoCBQ9pbkFtQXNzZXRBbXRYMTgFCnByVmlhQW1YMTgEEWV4cEFtdEFzc2V0QW10WDE4CAUMZXhwZWN0ZWRBbXRzAl8xBBNleHBQcmljZUFzc2V0QW10WDE4CAUMZXhwZWN0ZWRBbXRzAl8yBAhscEFtdFgxOAkAvQIEBQ1scEVtaXNzaW9uWDE4BRNleHBQcmljZUFzc2V0QW10WDE4BQxwckJhbGFuY2VYMTgFBUZMT09SCQCXCgUJAQxmcm9tWDE4Um91bmQDBQhscEFtdFgxOAUGc2NhbGU4BQVGTE9PUgkBDGZyb21YMThSb3VuZAMFEWV4cEFtdEFzc2V0QW10WDE4BQthbXRBc3NldERjbQUHQ0VJTElORwkBDGZyb21YMThSb3VuZAMFE2V4cFByaWNlQXNzZXRBbXRYMTgFDXByaWNlQXNzZXREY20FB0NFSUxJTkcFC2N1clByaWNlWDE4BQtzbGlwcGFnZVgxOAQJY2FsY0xwQW10CAUDcmVzAl8xBA5jYWxjQW1Bc3NldFBtdAgFA3JlcwJfMgQOY2FsY1ByQXNzZXRQbXQIBQNyZXMCXzMECGN1clByaWNlCQEHZnJvbVgxOAIIBQNyZXMCXzQFBnNjYWxlOAQMc2xpcHBhZ2VDYWxjCQEHZnJvbVgxOAIIBQNyZXMCXzUFBnNjYWxlOAMJAGcCAAAFCWNhbGNMcEFtdAkAAgECNkludmFsaWQgY2FsY3VsYXRpb25zLiBMUCBjYWxjdWxhdGVkIGlzIGxlc3MgdGhhbiB6ZXJvLgQJZW1pdExwQW10AwkBASEBBQZlbWl0THAAAAUJY2FsY0xwQW10BAZhbURpZmYJAGUCBQxpbkFtQXNzZXRBbXQFDmNhbGNBbUFzc2V0UG10BAZwckRpZmYJAGUCBQxpblByQXNzZXRBbXQFDmNhbGNQckFzc2V0UG10BAtjb21tb25TdGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUIY3VyUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFCGN1clByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNwYXUCBQt1c2VyQWRkcmVzcwUGdHhJZDU4CQERZGF0YVB1dEFjdGlvbkluZm8KBQ5jYWxjQW1Bc3NldFBtdAUOY2FsY1ByQXNzZXRQbXQFCWVtaXRMcEFtdAUIY3VyUHJpY2UFEXNsaXBwYWdlVG9sZXJhbmNlBQxzbGlwcGFnZUNhbGMFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFBmFtRGlmZgUGcHJEaWZmBQNuaWwJAJ8KDQUJY2FsY0xwQW10BQllbWl0THBBbXQFCGN1clByaWNlBQlhbUJhbGFuY2UFCXByQmFsYW5jZQUKbHBFbWlzc2lvbgUJbHBBc3NldElkBQpwb29sU3RhdHVzBQtjb21tb25TdGF0ZQUGYW1EaWZmBQZwckRpZmYFC2luQW1Bc3NldElkBQtpblByQXNzZXRJZAEHY2FsY0tMcAMNYW1vdW50QmFsYW5jZQxwcmljZUJhbGFuY2UKbHBFbWlzc2lvbgQQYW1vdW50QmFsYW5jZVgxOAkBC3RvWDE4QmlnSW50AgUNYW1vdW50QmFsYW5jZQkAtgIBBRZjZmdBbW91bnRBc3NldERlY2ltYWxzBA9wcmljZUJhbGFuY2VYMTgJAQt0b1gxOEJpZ0ludAIFDHByaWNlQmFsYW5jZQkAtgIBBRVjZmdQcmljZUFzc2V0RGVjaW1hbHMECnVwZGF0ZWRLTHAJALwCAwkAdgYJALkCAgUQYW1vdW50QmFsYW5jZVgxOAUPcHJpY2VCYWxhbmNlWDE4AAAJALYCAQAFAAEAEgUERE9XTgUEYmlnMQUKbHBFbWlzc2lvbgMJAAACBQpscEVtaXNzaW9uBQRiaWcwBQRiaWcwBQp1cGRhdGVkS0xwAQ5jYWxjQ3VycmVudEtMcAMQYW1vdW50QXNzZXREZWx0YQ9wcmljZUFzc2V0RGVsdGEUbHBBc3NldEVtaXNzaW9uRGVsdGEEEmFtb3VudEFzc2V0QmFsYW5jZQkAuAICCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFEGNmZ0Ftb3VudEFzc2V0SWQFEGFtb3VudEFzc2V0RGVsdGEEEXByaWNlQXNzZXRCYWxhbmNlCQC4AgIJALYCAQkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUPY2ZnUHJpY2VBc3NldElkBQ9wcmljZUFzc2V0RGVsdGEED2xwQXNzZXRFbWlzc2lvbgkAuAICCQC2AgEICQEFdmFsdWUBCQDsBwEFDGNmZ0xwQXNzZXRJZAhxdWFudGl0eQUUbHBBc3NldEVtaXNzaW9uRGVsdGEECmN1cnJlbnRLTHAJAQdjYWxjS0xwAwUSYW1vdW50QXNzZXRCYWxhbmNlBRFwcmljZUFzc2V0QmFsYW5jZQUPbHBBc3NldEVtaXNzaW9uBQpjdXJyZW50S0xwARJyZWZyZXNoS0xwSW50ZXJuYWwDF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEUbHBBc3NldEVtaXNzaW9uRGVsdGEEEmFtb3VudEFzc2V0QmFsYW5jZQkAZAIJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFEGNmZ0Ftb3VudEFzc2V0SWQFF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhBBFwcmljZUFzc2V0QmFsYW5jZQkAZAIJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFD2NmZ1ByaWNlQXNzZXRJZAUWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQQPbHBBc3NldEVtaXNzaW9uCQBkAggJAQV2YWx1ZQEJAOwHAQUMY2ZnTHBBc3NldElkCHF1YW50aXR5BRRscEFzc2V0RW1pc3Npb25EZWx0YQQKdXBkYXRlZEtMcAkBB2NhbGNLTHADCQC2AgEFEmFtb3VudEFzc2V0QmFsYW5jZQkAtgIBBRFwcmljZUFzc2V0QmFsYW5jZQkAtgIBBQ9scEFzc2V0RW1pc3Npb24EB2FjdGlvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleUtMcFJlZnJlc2hlZEhlaWdodAUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtleUtMcAkApgMBBQp1cGRhdGVkS0xwBQNuaWwJAJQKAgUHYWN0aW9ucwUKdXBkYXRlZEtMcAETc2tpcE9yZGVyVmFsaWRhdGlvbgAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPZmFjdG9yeUNvbnRyYWN0CQEWa2V5U2tpcE9yZGVyVmFsaWRhdGlvbgEJAKUIAQUEdGhpcwcBEnZhbGlkYXRlVXBkYXRlZEtMcAIGb2xkS0xwCnVwZGF0ZWRLTHADCQDAAgIFCnVwZGF0ZWRLTHAFBm9sZEtMcAYJAQh0aHJvd0VycgEJALkJAgkAzAgCAiJ1cGRhdGVkIEtMcCBsb3dlciB0aGFuIGN1cnJlbnQgS0xwCQDMCAIJAKYDAQUGb2xkS0xwCQDMCAIJAKYDAQUKdXBkYXRlZEtMcAUDbmlsAgEgARt2YWxpZGF0ZU1hdGNoZXJPcmRlckFsbG93ZWQBBW9yZGVyBBJhbW91bnRBc3NldEJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFEGNmZ0Ftb3VudEFzc2V0SWQEEXByaWNlQXNzZXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBQ9jZmdQcmljZUFzc2V0SWQEEWFtb3VudEFzc2V0QW1vdW50CAUFb3JkZXIGYW1vdW50BBBwcmljZUFzc2V0QW1vdW50CQBuBAgFBW9yZGVyBmFtb3VudAgFBW9yZGVyBXByaWNlBQZzY2FsZTgFBUZMT09SBA0kdDAyOTI4MDI5NDkyAwkAAAIIBQVvcmRlcglvcmRlclR5cGUFA0J1eQkAlAoCBRFhbW91bnRBc3NldEFtb3VudAkBAS0BBRBwcmljZUFzc2V0QW1vdW50CQCUCgIJAQEtAQURYW1vdW50QXNzZXRBbW91bnQFEHByaWNlQXNzZXRBbW91bnQEF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhCAUNJHQwMjkyODAyOTQ5MgJfMQQWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDI5MjgwMjk0OTICXzIDAwMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBRNQb29sTWF0Y2hlckRpc2FibGVkBgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgkAAgECHEV4Y2hhbmdlIG9wZXJhdGlvbnMgZGlzYWJsZWQDAwkBAiE9AggIBQVvcmRlcglhc3NldFBhaXILYW1vdW50QXNzZXQFEGNmZ0Ftb3VudEFzc2V0SWQGCQECIT0CCAgFBW9yZGVyCWFzc2V0UGFpcgpwcmljZUFzc2V0BQ9jZmdQcmljZUFzc2V0SWQJAAIBAhNXcm9uZyBvcmRlciBhc3NldHMuBANrTHAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtleUtMcAIBMAkBBmZtdEVycgECC2ludmFsaWQga0xwBA0kdDAyOTkzMjMwMDMyCQEScmVmcmVzaEtMcEludGVybmFsAwUXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEFFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEAAAQNdW51c2VkQWN0aW9ucwgFDSR0MDI5OTMyMzAwMzICXzEEBmtMcE5ldwgFDSR0MDI5OTMyMzAwMzICXzIEDGlzT3JkZXJWYWxpZAkAwAICBQZrTHBOZXcFA2tMcAQEaW5mbwkAuQkCCQDMCAICBGtMcD0JAMwIAgkApgMBBQNrTHAJAMwIAgIIIGtMcE5ldz0JAMwIAgkApgMBBQZrTHBOZXcJAMwIAgIUIGFtb3VudEFzc2V0QmFsYW5jZT0JAMwIAgkApAMBBRJhbW91bnRBc3NldEJhbGFuY2UJAMwIAgITIHByaWNlQXNzZXRCYWxhbmNlPQkAzAgCCQCkAwEFEXByaWNlQXNzZXRCYWxhbmNlCQDMCAICGSBhbW91bnRBc3NldEJhbGFuY2VEZWx0YT0JAMwIAgkApAMBBRdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQkAzAgCAhggcHJpY2VBc3NldEJhbGFuY2VEZWx0YT0JAMwIAgkApAMBBRZwcmljZUFzc2V0QmFsYW5jZURlbHRhCQDMCAICCCBoZWlnaHQ9CQDMCAIJAKQDAQUGaGVpZ2h0BQNuaWwCAAkAlAoCBQxpc09yZGVyVmFsaWQFBGluZm8BCWNvbW1vbkdldAEBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHWV4YWN0bHkgMSBwYXltZW50IGlzIGV4cGVjdGVkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQKcG10QXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAZwbXRBbXQIBQNwbXQGYW1vdW50BANyZXMJARRlc3RpbWF0ZUdldE9wZXJhdGlvbgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBBQpwbXRBc3NldElkBQZwbXRBbXQIBQFpBmNhbGxlcgQIb3V0QW1BbXQIBQNyZXMCXzEECG91dFByQW10CAUDcmVzAl8yBAVzdGF0ZQgFA3JlcwNfMTAEDWlzR2V0RGlzYWJsZWQDCQEBIQEJARRpc0FkZHJlc3NXaGl0ZWxpc3RlZAEIBQFpBmNhbGxlcgMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24HAwUNaXNHZXREaXNhYmxlZAkAAgEJAKwCAgIsR2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAKQDAQUNY2ZnUG9vbFN0YXR1cwkAlwoFBQhvdXRBbUFtdAUIb3V0UHJBbXQFBnBtdEFtdAUKcG10QXNzZXRJZAUFc3RhdGUBCWNvbW1vblB1dAMBaRFzbGlwcGFnZVRvbGVyYW5jZQZlbWl0THADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAIJAAIBAh9leGFjdGx5IDIgcGF5bWVudHMgYXJlIGV4cGVjdGVkBAphbUFzc2V0UG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECnByQXNzZXRQbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQGZXN0UHV0CQEUZXN0aW1hdGVQdXRPcGVyYXRpb24JCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFEXNsaXBwYWdlVG9sZXJhbmNlCAUKYW1Bc3NldFBtdAZhbW91bnQIBQphbUFzc2V0UG10B2Fzc2V0SWQIBQpwckFzc2V0UG10BmFtb3VudAgFCnByQXNzZXRQbXQHYXNzZXRJZAkApQgBCAUBaQZjYWxsZXIHBQZlbWl0THAEDWlzUHV0RGlzYWJsZWQDCQEBIQEJARRpc0FkZHJlc3NXaGl0ZWxpc3RlZAEIBQFpBmNhbGxlcgMDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUPUG9vbFB1dERpc2FibGVkBgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgcDBQ1pc1B1dERpc2FibGVkCQACAQkArAICAixQdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4uIFN0YXR1cyA9IAkApAMBBQ1jZmdQb29sU3RhdHVzBQZlc3RQdXQBBGVtaXQBBmFtb3VudAQHZW1pdEludgkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCBGVtaXQJAMwIAgUGYW1vdW50BQNuaWwFA25pbAMJAAACBQdlbWl0SW52BQdlbWl0SW52BA1lbWl0SW52TGVnYWN5BAckbWF0Y2gwBQdlbWl0SW52AwkAAQIFByRtYXRjaDACB0FkZHJlc3MEFWxlZ2FjeUZhY3RvcnlDb250cmFjdAUHJG1hdGNoMAkA/AcEBRVsZWdhY3lGYWN0b3J5Q29udHJhY3QCBGVtaXQJAMwIAgUGYW1vdW50BQNuaWwFA25pbAUEdW5pdAMJAAACBQ1lbWl0SW52TGVnYWN5BQ1lbWl0SW52TGVnYWN5BQZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BB3Rha2VGZWUCBmFtb3VudANmZWUECWZlZUFtb3VudAMJAAACBQNmZWUAAAAACQBrAwUGYW1vdW50BQNmZWUFBnNjYWxlOAkAlAoCCQBlAgUGYW1vdW50BQlmZWVBbW91bnQFCWZlZUFtb3VudAEPY2FsY1B1dE9uZVRva2VuBBBwYXltZW50QW1vdW50UmF3DnBheW1lbnRBc3NldElkC3VzZXJBZGRyZXNzBHR4SWQEBmlzRXZhbAkAAAIFBHR4SWQFBHVuaXQEEGFtb3VudEJhbGFuY2VSYXcJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFEGNmZ0Ftb3VudEFzc2V0SWQED3ByaWNlQmFsYW5jZVJhdwkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUPY2ZnUHJpY2VBc3NldElkBBRwYXltZW50SW5BbW91bnRBc3NldAMJAAACBQ5wYXltZW50QXNzZXRJZAUQY2ZnQW1vdW50QXNzZXRJZAYDCQAAAgUOcGF5bWVudEFzc2V0SWQFD2NmZ1ByaWNlQXNzZXRJZAcJAQh0aHJvd0VycgECDWludmFsaWQgYXNzZXQEDSR0MDMzMjE4MzM1MTEDBQZpc0V2YWwJAJQKAgUQYW1vdW50QmFsYW5jZVJhdwUPcHJpY2VCYWxhbmNlUmF3AwUUcGF5bWVudEluQW1vdW50QXNzZXQJAJQKAgkAZQIFEGFtb3VudEJhbGFuY2VSYXcFEHBheW1lbnRBbW91bnRSYXcFD3ByaWNlQmFsYW5jZVJhdwkAlAoCBRBhbW91bnRCYWxhbmNlUmF3CQBlAgUPcHJpY2VCYWxhbmNlUmF3BRBwYXltZW50QW1vdW50UmF3BBBhbW91bnRCYWxhbmNlT2xkCAUNJHQwMzMyMTgzMzUxMQJfMQQPcHJpY2VCYWxhbmNlT2xkCAUNJHQwMzMyMTgzMzUxMQJfMgQNJHQwMzM1MTUzMzY2NAMFFHBheW1lbnRJbkFtb3VudEFzc2V0CQCUCgIFEHBheW1lbnRBbW91bnRSYXcAAAkAlAoCAAAFEHBheW1lbnRBbW91bnRSYXcEFGFtb3VudEFzc2V0QW1vdW50UmF3CAUNJHQwMzM1MTUzMzY2NAJfMQQTcHJpY2VBc3NldEFtb3VudFJhdwgFDSR0MDMzNTE1MzM2NjQCXzIEEWFtb3VudEFzc2V0QW1vdW50CAkBB3Rha2VGZWUCBRRhbW91bnRBc3NldEFtb3VudFJhdwUFaW5GZWUCXzEEEHByaWNlQXNzZXRBbW91bnQICQEHdGFrZUZlZQIFE3ByaWNlQXNzZXRBbW91bnRSYXcFBWluRmVlAl8xBA0kdDAzMzc5NjMzODYwCQEHdGFrZUZlZQIFEHBheW1lbnRBbW91bnRSYXcFBWluRmVlBA1wYXltZW50QW1vdW50CAUNJHQwMzM3OTYzMzg2MAJfMQQJZmVlQW1vdW50CAUNJHQwMzM3OTYzMzg2MAJfMgQQYW1vdW50QmFsYW5jZU5ldwkAZAIFEGFtb3VudEJhbGFuY2VPbGQFEWFtb3VudEFzc2V0QW1vdW50BA9wcmljZUJhbGFuY2VOZXcJAGQCBQ9wcmljZUJhbGFuY2VPbGQFEHByaWNlQXNzZXRBbW91bnQEC3ByaWNlTmV3WDE4CQEPY2FsY1ByaWNlQmlnSW50AgkBBXRvWDE4AgUPcHJpY2VCYWxhbmNlTmV3BRVjZmdQcmljZUFzc2V0RGVjaW1hbHMJAQV0b1gxOAIFEGFtb3VudEJhbGFuY2VOZXcFFmNmZ0Ftb3VudEFzc2V0RGVjaW1hbHMECHByaWNlTmV3CQEHZnJvbVgxOAIFC3ByaWNlTmV3WDE4BQZzY2FsZTgEDnBheW1lbnRCYWxhbmNlAwUUcGF5bWVudEluQW1vdW50QXNzZXQFEGFtb3VudEJhbGFuY2VPbGQFD3ByaWNlQmFsYW5jZU9sZAQUcGF5bWVudEJhbGFuY2VCaWdJbnQJALYCAQUOcGF5bWVudEJhbGFuY2UEDHN1cHBseUJpZ0ludAkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFDGNmZ0xwQXNzZXRJZAkArAICCQCsAgICBmFzc2V0IAkA2AQBBQxjZmdMcEFzc2V0SWQCDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5BAtjaGVjaFN1cHBseQMJAL8CAgUMc3VwcGx5QmlnSW50BQRiaWcwBgkBCHRocm93RXJyAQIiaW5pdGlhbCBkZXBvc2l0IHJlcXVpcmVzIGFsbCBjb2lucwMJAAACBQtjaGVjaFN1cHBseQULY2hlY2hTdXBwbHkEDWRlcG9zaXRCaWdJbnQJALYCAQUNcGF5bWVudEFtb3VudAQLaXNzdWVBbW91bnQJAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC6AgIJALkCAgUMc3VwcGx5QmlnSW50CQC4AgIJAQpzcXJ0QmlnSW50BAkAtwICBQdzY2FsZTE4CQC6AgIJALkCAgUNZGVwb3NpdEJpZ0ludAUHc2NhbGUxOAUUcGF5bWVudEJhbGFuY2VCaWdJbnQAEgASBQRET1dOBQdzY2FsZTE4BQdzY2FsZTE4BQNuaWwEC2NvbW1vblN0YXRlAwUGaXNFdmFsBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwbAAFCHByaWNlTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhwcmljZU5ldwkAzAgCCQELU3RyaW5nRW50cnkCCQEDcGF1AgkApQgBCQEFdmFsdWUBBQt1c2VyQWRkcmVzcwkA2AQBCQEFdmFsdWUBBQR0eElkCQERZGF0YVB1dEFjdGlvbkluZm8KBRRhbW91bnRBc3NldEFtb3VudFJhdwUTcHJpY2VBc3NldEFtb3VudFJhdwULaXNzdWVBbW91bnQFCHByaWNlTmV3AAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQLcHJpY2VPbGRYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCCQEFdG9YMTgCBQ9wcmljZUJhbGFuY2VPbGQFFWNmZ1ByaWNlQXNzZXREZWNpbWFscwkBBXRvWDE4AgUQYW1vdW50QmFsYW5jZU9sZAUWY2ZnQW1vdW50QXNzZXREZWNpbWFscwQIcHJpY2VPbGQJAQdmcm9tWDE4AgULcHJpY2VPbGRYMTgFBnNjYWxlOAQEbG9zcwQNJHQwMzU1NDEzNTcwOAMFFHBheW1lbnRJbkFtb3VudEFzc2V0CQCUCgIFFGFtb3VudEFzc2V0QW1vdW50UmF3BRBhbW91bnRCYWxhbmNlT2xkCQCUCgIFE3ByaWNlQXNzZXRBbW91bnRSYXcFD3ByaWNlQmFsYW5jZU9sZAQGYW1vdW50CAUNJHQwMzU1NDEzNTcwOAJfMQQHYmFsYW5jZQgFDSR0MDM1NTQxMzU3MDgCXzIED2lzc3VlQW1vdW50Qm90aAkAoAMBCQC8AgMFDHN1cHBseUJpZ0ludAkAtgIBCQBpAgUGYW1vdW50AAIJALYCAQUHYmFsYW5jZQkAawMJAGUCBQtpc3N1ZUFtb3VudAUPaXNzdWVBbW91bnRCb3RoBQZzY2FsZTgFD2lzc3VlQW1vdW50Qm90aAkAlwoFBQtpc3N1ZUFtb3VudAULY29tbW9uU3RhdGUFCWZlZUFtb3VudAUEbG9zcwUUcGF5bWVudEluQW1vdW50QXNzZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD2NhbGNHZXRPbmVUb2tlbgUKb3V0QXNzZXRJZA1wYXltZW50QW1vdW50DnBheW1lbnRBc3NldElkC3VzZXJBZGRyZXNzBHR4SWQEBmlzRXZhbAkAAAIFBHR4SWQFBHVuaXQEA2NmZwkBDWdldFBvb2xDb25maWcABAthbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUOaWR4QW10QXNzZXREY20EDXByaWNlQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFEGlkeFByaWNlQXNzZXREY20EBmNoZWNrcwkAzAgCAwkAAAIFDnBheW1lbnRBc3NldElkBQxjZmdMcEFzc2V0SWQGCQEIdGhyb3dFcnIBAhBpbnZhbGlkIGxwIGFzc2V0BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEEG91dEluQW1vdW50QXNzZXQDCQAAAgUKb3V0QXNzZXRJZAUQY2ZnQW1vdW50QXNzZXRJZAYDCQAAAgUKb3V0QXNzZXRJZAUPY2ZnUHJpY2VBc3NldElkBwkBCHRocm93RXJyAQINaW52YWxpZCBhc3NldAQNYmFsYW5jZUJpZ0ludAMFEG91dEluQW1vdW50QXNzZXQJALYCAQkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUQY2ZnQW1vdW50QXNzZXRJZAkAtgIBCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBQ9jZmdQcmljZUFzc2V0SWQEGG91dEluQW1vdW50QXNzZXREZWNpbWFscwMFEG91dEluQW1vdW50QXNzZXQFC2FtdEFzc2V0RGNtBQ1wcmljZUFzc2V0RGNtBAxhbUJhbGFuY2VPbGQJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFEGNmZ0Ftb3VudEFzc2V0SWQEDHByQmFsYW5jZU9sZAkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUPY2ZnUHJpY2VBc3NldElkBApvdXRCYWxhbmNlAwUQb3V0SW5BbW91bnRBc3NldAUMYW1CYWxhbmNlT2xkBQxwckJhbGFuY2VPbGQEEG91dEJhbGFuY2VCaWdJbnQJALYCAQUKb3V0QmFsYW5jZQQMc3VwcGx5QmlnSW50CQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUMY2ZnTHBBc3NldElkCQCsAgIJAKwCAgIGYXNzZXQgCQDYBAEFDGNmZ0xwQXNzZXRJZAIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEDnJlZGVlbWVkQmlnSW50CQC2AgEFDXBheW1lbnRBbW91bnQECWFtb3VudFJhdwkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALoCAgkAuQICBQ1iYWxhbmNlQmlnSW50CQC4AgIFB3NjYWxlMTgJAHYGCQC4AgIFB3NjYWxlMTgJALoCAgkAuQICBQ5yZWRlZW1lZEJpZ0ludAUHc2NhbGUxOAUMc3VwcGx5QmlnSW50ABIFBGJpZzIAAAASBQRET1dOBQdzY2FsZTE4BQNuaWwEDSR0MDM3Nzg2Mzc4NDIJAQd0YWtlRmVlAgUJYW1vdW50UmF3BQZvdXRGZWUEC3RvdGFsQW1vdW50CAUNJHQwMzc3ODYzNzg0MgJfMQQJZmVlQW1vdW50CAUNJHQwMzc3ODYzNzg0MgJfMgQNJHQwMzc4NDYzODA3MgMFEG91dEluQW1vdW50QXNzZXQJAJYKBAULdG90YWxBbW91bnQAAAkAZQIFDGFtQmFsYW5jZU9sZAUJYW1vdW50UmF3BQxwckJhbGFuY2VPbGQJAJYKBAAABQt0b3RhbEFtb3VudAUMYW1CYWxhbmNlT2xkCQBlAgUMcHJCYWxhbmNlT2xkBQlhbW91bnRSYXcEC291dEFtQW1vdW50CAUNJHQwMzc4NDYzODA3MgJfMQQLb3V0UHJBbW91bnQIBQ0kdDAzNzg0NjM4MDcyAl8yBAxhbUJhbGFuY2VOZXcIBQ0kdDAzNzg0NjM4MDcyAl8zBAxwckJhbGFuY2VOZXcIBQ0kdDAzNzg0NjM4MDcyAl80BAtwcmljZU5ld1gxOAkBD2NhbGNQcmljZUJpZ0ludAIJAQV0b1gxOAIFDHByQmFsYW5jZU5ldwUVY2ZnUHJpY2VBc3NldERlY2ltYWxzCQEFdG9YMTgCBQxhbUJhbGFuY2VOZXcFFmNmZ0Ftb3VudEFzc2V0RGVjaW1hbHMECHByaWNlTmV3CQEHZnJvbVgxOAIFC3ByaWNlTmV3WDE4BQZzY2FsZTgEC2NvbW1vblN0YXRlAwUGaXNFdmFsBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA2dhdQIJAKUIAQkBBXZhbHVlAQULdXNlckFkZHJlc3MJANgEAQkBBXZhbHVlAQUEdHhJZAkBEWRhdGFHZXRBY3Rpb25JbmZvBgULb3V0QW1BbW91bnQFC291dFByQW1vdW50BQ1wYXltZW50QW1vdW50BQhwcmljZU5ldwUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUIcHJpY2VOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFCHByaWNlTmV3BQNuaWwEC3ByaWNlT2xkWDE4CQEPY2FsY1ByaWNlQmlnSW50AgkBBXRvWDE4AgUMcHJCYWxhbmNlT2xkBRVjZmdQcmljZUFzc2V0RGVjaW1hbHMJAQV0b1gxOAIFDGFtQmFsYW5jZU9sZAUWY2ZnQW1vdW50QXNzZXREZWNpbWFscwQIcHJpY2VPbGQJAQdmcm9tWDE4AgULcHJpY2VPbGRYMTgFBnNjYWxlOAQEbG9zcwQYYW1vdW50Qm90aEluUGF5bWVudEFzc2V0CQBoAgkAoAMBCQC8AgMFDWJhbGFuY2VCaWdJbnQFDnJlZGVlbWVkQmlnSW50BQxzdXBwbHlCaWdJbnQAAgkAawMJAGUCBQt0b3RhbEFtb3VudAUYYW1vdW50Qm90aEluUGF5bWVudEFzc2V0BQZzY2FsZTgFGGFtb3VudEJvdGhJblBheW1lbnRBc3NldAkAlwoFBQt0b3RhbEFtb3VudAULY29tbW9uU3RhdGUFCWZlZUFtb3VudAUEbG9zcwUQb3V0SW5BbW91bnRBc3NldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEE21hbmFnZXJWYXVsdEFkZHJlc3MJARxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzAAQHJG1hdGNoMAkAnQgCBRNtYW5hZ2VyVmF1bHRBZGRyZXNzCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQlpc01hbmFnZXIBAWkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAAgECC01hdGNoIGVycm9yAQttdXN0TWFuYWdlcgEBaQQCcGQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsGBQJwZAMJAAECBQckbWF0Y2gwAgRVbml0AwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFAnBkCQACAQILTWF0Y2ggZXJyb3IcAWkBCXJlYmFsYW5jZQAJAM4IAgkBDnJlYmFsYW5jZUFzc2V0AQkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJhYQAJAQ5yZWJhbGFuY2VBc3NldAEJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECcGEAAWkBIWNhbGN1bGF0ZUFtb3VudE91dEZvclN3YXBSRUFET05MWQMNY2xlYW5BbW91bnRJbglpc1JldmVyc2UNZmVlUG9vbEFtb3VudAQNJHQwMzk5MzA0MDIzNQMJAAACBQlpc1JldmVyc2UHBAhhc3NldE91dAkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJwYQAEB2Fzc2V0SW4JAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEACQCUCgIFCGFzc2V0T3V0BQdhc3NldEluBAhhc3NldE91dAkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJhYQAEB2Fzc2V0SW4JAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECcGEACQCUCgIFCGFzc2V0T3V0BQdhc3NldEluBAhhc3NldE91dAgFDSR0MDM5OTMwNDAyMzUCXzEEB2Fzc2V0SW4IBQ0kdDAzOTkzMDQwMjM1Al8yBBJwb29sQXNzZXRJbkJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUHYXNzZXRJbgQTcG9vbEFzc2V0T3V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQhhc3NldE91dAQJYW1vdW50T3V0CQBrAwUTcG9vbEFzc2V0T3V0QmFsYW5jZQUNY2xlYW5BbW91bnRJbgkAZAIFEnBvb2xBc3NldEluQmFsYW5jZQUNY2xlYW5BbW91bnRJbgQEb2xkSwkAuQICCQC2AgEFEnBvb2xBc3NldEluQmFsYW5jZQkAtgIBBRNwb29sQXNzZXRPdXRCYWxhbmNlBARuZXdLCQC5AgIJALcCAgkAtwICCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQUHYXNzZXRJbgkAtgIBBQ1jbGVhbkFtb3VudEluCQC2AgEFDWZlZVBvb2xBbW91bnQJALgCAgkAtgIBCQENZ2V0QWNjQmFsYW5jZQEFCGFzc2V0T3V0CQC2AgEFCWFtb3VudE91dAQGY2hlY2tLAwkAwAICBQRuZXdLBQRvbGRLBgkAAgECFG5ldyBLIGlzIGZld2VyIGVycm9yAwkAAAIFBmNoZWNrSwUGY2hlY2tLCQCUCgIFA25pbAUJYW1vdW50T3V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBJmNhbGN1bGF0ZUFtb3VudE91dEZvclN3YXBBbmRTZW5kVG9rZW5zBQ1jbGVhbkFtb3VudEluCWlzUmV2ZXJzZQxhbW91bnRPdXRNaW4JYWRkcmVzc1RvDWZlZVBvb2xBbW91bnQEC3N3YXBDb250YWN0CgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCF2dldFN3YXBDb250cmFjdFJFQURPTkxZBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcEEmlzUG9vbFN3YXBEaXNhYmxlZAoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0Ahppc1Bvb2xTd2FwRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBBQFAAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBA5pc1N3YXBEaXNhYmxlZAMJAQEhAQkBFGlzQWRkcmVzc1doaXRlbGlzdGVkAQgFAWkGY2FsbGVyAwMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24GBRJpc1Bvb2xTd2FwRGlzYWJsZWQHBAZjaGVja3MJAMwIAgMDCQEBIQEFDmlzU3dhcERpc2FibGVkBgkBCWlzTWFuYWdlcgEFAWkGCQEIdGhyb3dFcnIBAiJzd2FwIG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQBnAggJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFDWNsZWFuQW1vdW50SW4GCQEIdGhyb3dFcnIBAgxXcm9uZyBhbW91bnQJAMwIAgMJAAACCAUBaQZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3N3YXBDb250YWN0BgkBCHRocm93RXJyAQIRUGVybWlzc2lvbiBkZW5pZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEB2Fzc2V0SW4JAQ9hc3NldElkVG9TdHJpbmcBCAUDcG10B2Fzc2V0SWQECGFzc2V0T3V0AwkAAAIFCWlzUmV2ZXJzZQcJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECcGEACQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAmFhAAQScG9vbEFzc2V0SW5CYWxhbmNlCQBlAgkAZQIJAQ1nZXRBY2NCYWxhbmNlAQUHYXNzZXRJbggJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFDWZlZVBvb2xBbW91bnQEE3Bvb2xBc3NldE91dEJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUIYXNzZXRPdXQECWFtb3VudE91dAkAawMFE3Bvb2xBc3NldE91dEJhbGFuY2UFDWNsZWFuQW1vdW50SW4JAGQCBRJwb29sQXNzZXRJbkJhbGFuY2UFDWNsZWFuQW1vdW50SW4EBG9sZEsJALkCAgkAtgIBBRJwb29sQXNzZXRJbkJhbGFuY2UJALYCAQUTcG9vbEFzc2V0T3V0QmFsYW5jZQQEbmV3SwkAuQICCQC3AgIJALYCAQkBDWdldEFjY0JhbGFuY2UBBQdhc3NldEluCQC2AgEFDWZlZVBvb2xBbW91bnQJALgCAgkAtgIBCQENZ2V0QWNjQmFsYW5jZQEFCGFzc2V0T3V0CQC2AgEFCWFtb3VudE91dAQGY2hlY2tLAwkAwAICBQRuZXdLBQRvbGRLBgkAAgECFG5ldyBLIGlzIGZld2VyIGVycm9yAwkAAAIFBmNoZWNrSwUGY2hlY2tLBAhjaGVja01pbgMJAGcCBQlhbW91bnRPdXQFDGFtb3VudE91dE1pbgYJAAIBAixFeGNoYW5nZSByZXN1bHQgaXMgZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAMJAAACBQhjaGVja01pbgUIY2hlY2tNaW4EF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhAwUJaXNSZXZlcnNlCQEBLQEFCWFtb3VudE91dAUNZmVlUG9vbEFtb3VudAQWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQMFCWlzUmV2ZXJzZQUNZmVlUG9vbEFtb3VudAkBAS0BBQlhbW91bnRPdXQEEXJlZnJlc2hLTHBBY3Rpb25zCAkBEnJlZnJlc2hLTHBJbnRlcm5hbAMFF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhBRZwcmljZUFzc2V0QmFsYW5jZURlbHRhAAACXzEDCQAAAgURcmVmcmVzaEtMcEFjdGlvbnMFEXJlZnJlc2hLTHBBY3Rpb25zBA5yZWJhbGFuY2VTdGF0ZQkBDnJlYmFsYW5jZUFzc2V0AQUHYXNzZXRJbgMJAAACBQ5yZWJhbGFuY2VTdGF0ZQUOcmViYWxhbmNlU3RhdGUEDXdpdGhkcmF3U3RhdGUJARl3aXRoZHJhd0FuZFJlYmFsYW5jZUFzc2V0AgUIYXNzZXRPdXQFCWFtb3VudE91dAMJAAACBQ13aXRoZHJhd1N0YXRlBQ13aXRoZHJhd1N0YXRlCQCUCgIJAM4IAgkAzggCBQ13aXRoZHJhd1N0YXRlBQ5yZWJhbGFuY2VTdGF0ZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlhZGRyZXNzVG8FCWFtb3VudE91dAkBDHBhcnNlQXNzZXRJZAEFCGFzc2V0T3V0BQNuaWwFCWFtb3VudE91dAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQNwdXQCEXNsaXBwYWdlVG9sZXJhbmNlD3Nob3VsZEF1dG9TdGFrZQMJAGYCAAAFEXNsaXBwYWdlVG9sZXJhbmNlCQACAQIgSW52YWxpZCBzbGlwcGFnZVRvbGVyYW5jZSBwYXNzZWQEBmVzdFB1dAkBCWNvbW1vblB1dAMFAWkFEXNsaXBwYWdlVG9sZXJhbmNlBgQJZW1pdExwQW10CAUGZXN0UHV0Al8yBAlscEFzc2V0SWQIBQZlc3RQdXQCXzcEBXN0YXRlCAUGZXN0UHV0Al85BAZhbURpZmYIBQZlc3RQdXQDXzEwBAZwckRpZmYIBQZlc3RQdXQDXzExBARhbUlkCAUGZXN0UHV0A18xMgQEcHJJZAgFBmVzdFB1dANfMTMECmFtQXNzZXRQbXQJALYCAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECnByQXNzZXRQbXQJALYCAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQECmN1cnJlbnRLTHAJAQ5jYWxjQ3VycmVudEtMcAMFCmFtQXNzZXRQbXQFCnByQXNzZXRQbXQJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAEB2VtaXRJbnYJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRlbWl0CQDMCAIFCWVtaXRMcEFtdAUDbmlsBQNuaWwDCQAAAgUHZW1pdEludgUHZW1pdEludgQNZW1pdEludkxlZ2FjeQQHJG1hdGNoMAUHZW1pdEludgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBBVsZWdhY3lGYWN0b3J5Q29udHJhY3QFByRtYXRjaDAJAPwHBAUVbGVnYWN5RmFjdG9yeUNvbnRyYWN0AgRlbWl0CQDMCAIFCWVtaXRMcEFtdAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUNZW1pdEludkxlZ2FjeQUNZW1pdEludkxlZ2FjeQQMc2xpcHBhZ2VBSW52AwkAZgIFBmFtRGlmZgAACQD8BwQFEHNsaXBwYWdlQ29udHJhY3QCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQRhbUlkBQZhbURpZmYFA25pbAUDbmlsAwkAAAIFDHNsaXBwYWdlQUludgUMc2xpcHBhZ2VBSW52BAxzbGlwcGFnZVBJbnYDCQBmAgUGcHJEaWZmAAAJAPwHBAUQc2xpcHBhZ2VDb250cmFjdAIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHBySWQFBnByRGlmZgUDbmlsBQNuaWwDCQAAAgUMc2xpcHBhZ2VQSW52BQxzbGlwcGFnZVBJbnYECmxwVHJhbnNmZXIDBQ9zaG91bGRBdXRvU3Rha2UEC3NscFN0YWtlSW52CQD8BwQFD3N0YWtpbmdDb250cmFjdAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUJbHBBc3NldElkBQllbWl0THBBbXQFA25pbAMJAAACBQtzbHBTdGFrZUludgULc2xwU3Rha2VJbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCWVtaXRMcEFtdAUJbHBBc3NldElkBQNuaWwEDSR0MDQ1NDExNDU4NzMJARJyZWZyZXNoS0xwSW50ZXJuYWwDAAAAAAAAAwkAAAIFDSR0MDQ1NDExNDU4NzMFDSR0MDQ1NDExNDU4NzMECnVwZGF0ZWRLTHAIBQ0kdDA0NTQxMTQ1ODczAl8yBBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDQ1NDExNDU4NzMCXzEEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQEA3JlYgkA/AcEBQR0aGlzAglyZWJhbGFuY2UFA25pbAUDbmlsAwkAAAIFA3JlYgUDcmViCQDOCAIJAM4IAgUFc3RhdGUFCmxwVHJhbnNmZXIFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnB1dEZvckZyZWUBC21heFNsaXBwYWdlAwkAZgIAAAULbWF4U2xpcHBhZ2UJAAIBAhRJbnZhbGlkIHZhbHVlIHBhc3NlZAQGZXN0UHV0CQEJY29tbW9uUHV0AwUBaQULbWF4U2xpcHBhZ2UHBAVzdGF0ZQgFBmVzdFB1dAJfOQQKYW1Bc3NldFBtdAkAtgIBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKcHJBc3NldFBtdAkAtgIBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwUKYW1Bc3NldFBtdAUKcHJBc3NldFBtdAkAtgIBAAADCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQNJHQwNDY0ODU0NjU1MAkBEnJlZnJlc2hLTHBJbnRlcm5hbAMAAAAAAAAEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNDY0ODU0NjU1MAJfMQQKdXBkYXRlZEtMcAgFDSR0MDQ2NDg1NDY1NTACXzIEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQJAM4IAgUFc3RhdGUFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXB1dE9uZVRrbgIMbWluT3V0QW1vdW50CWF1dG9TdGFrZQQgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBBQFAAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBA1pc1B1dERpc2FibGVkAwkBASEBCQEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBCAUBaQZjYWxsZXIDAwMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBQ9Qb29sUHV0RGlzYWJsZWQGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duBgUgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQHBAZjaGVja3MJAMwIAgMDCQEBIQEFDWlzUHV0RGlzYWJsZWQGCQEJaXNNYW5hZ2VyAQUBaQYJAQh0aHJvd0VycgECIXB1dCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEDnBheW1lbnRBc3NldElkCAUHcGF5bWVudAdhc3NldElkBBBwYXltZW50QW1vdW50UmF3CAUHcGF5bWVudAZhbW91bnQECmN1cnJlbnRLTHADCQAAAgUOcGF5bWVudEFzc2V0SWQFEGNmZ0Ftb3VudEFzc2V0SWQJAQ5jYWxjQ3VycmVudEtMcAMJALYCAQUQcGF5bWVudEFtb3VudFJhdwkAtgIBAAAJALYCAQAAAwkAAAIFDnBheW1lbnRBc3NldElkBQ9jZmdQcmljZUFzc2V0SWQJAQ5jYWxjQ3VycmVudEtMcAMJALYCAQAACQC2AgEFEHBheW1lbnRBbW91bnRSYXcJALYCAQAACQEIdGhyb3dFcnIBAh5wYXltZW50IGFzc2V0IGlzIG5vdCBzdXBwb3J0ZWQDCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQLdXNlckFkZHJlc3MIBQFpBmNhbGxlcgQEdHhJZAgFAWkNdHJhbnNhY3Rpb25JZAQNJHQwNDc3Nzk0NzkzMQkBD2NhbGNQdXRPbmVUb2tlbgQFEHBheW1lbnRBbW91bnRSYXcFDnBheW1lbnRBc3NldElkBQt1c2VyQWRkcmVzcwUEdHhJZAMJAAACBQ0kdDA0Nzc3OTQ3OTMxBQ0kdDA0Nzc3OTQ3OTMxBBRwYXltZW50SW5BbW91bnRBc3NldAgFDSR0MDQ3Nzc5NDc5MzECXzUEBWJvbnVzCAUNJHQwNDc3Nzk0NzkzMQJfNAQJZmVlQW1vdW50CAUNJHQwNDc3Nzk0NzkzMQJfMwQLY29tbW9uU3RhdGUIBQ0kdDA0Nzc3OTQ3OTMxAl8yBBNlbWl0QW1vdW50RXN0aW1hdGVkCAUNJHQwNDc3Nzk0NzkzMQJfMQQKZW1pdEFtb3VudAMDCQBmAgUMbWluT3V0QW1vdW50AAAJAGYCBQxtaW5PdXRBbW91bnQFE2VtaXRBbW91bnRFc3RpbWF0ZWQHCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFDG1pbk91dEFtb3VudAUDbmlsAgAFE2VtaXRBbW91bnRFc3RpbWF0ZWQEB2VtaXRJbnYJAQRlbWl0AQUKZW1pdEFtb3VudAMJAAACBQdlbWl0SW52BQdlbWl0SW52BApscFRyYW5zZmVyAwUJYXV0b1N0YWtlBAhzdGFrZUludgkA/AcEBQ9zdGFraW5nQ29udHJhY3QCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDGNmZ0xwQXNzZXRJZAUKZW1pdEFtb3VudAUDbmlsAwkAAAIFCHN0YWtlSW52BQhzdGFrZUludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKZW1pdEFtb3VudAUMY2ZnTHBBc3NldElkBQNuaWwEB3NlbmRGZWUDCQBmAgUJZmVlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmVlQ29sbGVjdG9yQWRkcmVzcwUJZmVlQW1vdW50BQ5wYXltZW50QXNzZXRJZAUDbmlsBQNuaWwEDSR0MDQ4NTE3NDg3MTQDCQAAAgUEdGhpcwUTZmVlQ29sbGVjdG9yQWRkcmVzcwkAlAoCAAAAAAMFFHBheW1lbnRJbkFtb3VudEFzc2V0CQCUCgIJAQEtAQUJZmVlQW1vdW50AAAJAJQKAgAACQEBLQEFCWZlZUFtb3VudAQXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDA0ODUxNzQ4NzE0Al8xBBZwcmljZUFzc2V0QmFsYW5jZURlbHRhCAUNJHQwNDg1MTc0ODcxNAJfMgQNJHQwNDg3MTc0ODgyNQkBEnJlZnJlc2hLTHBJbnRlcm5hbAMFF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhBRZwcmljZUFzc2V0QmFsYW5jZURlbHRhAAAEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNDg3MTc0ODgyNQJfMQQKdXBkYXRlZEtMcAgFDSR0MDQ4NzE3NDg4MjUCXzIEA2tMcAkBBXZhbHVlAQkAoggBBQZrZXlLTHAEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQEA3JlYgkA/AcEBQR0aGlzAglyZWJhbGFuY2UFA25pbAUDbmlsAwkAAAIFA3JlYgUDcmViCQCUCgIJAM4IAgkAzggCCQDOCAIFC2NvbW1vblN0YXRlBQpscFRyYW5zZmVyBQdzZW5kRmVlBRFyZWZyZXNoS0xwQWN0aW9ucwUKZW1pdEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFwdXRPbmVUa25SRUFET05MWQIOcGF5bWVudEFzc2V0SWQQcGF5bWVudEFtb3VudFJhdwQNJHQwNDkxODA0OTMzNwkBD2NhbGNQdXRPbmVUb2tlbgQFEHBheW1lbnRBbW91bnRSYXcJAQxwYXJzZUFzc2V0SWQBBQ5wYXltZW50QXNzZXRJZAUEdW5pdAUEdW5pdAQTZW1pdEFtb3VudEVzdGltYXRlZAgFDSR0MDQ5MTgwNDkzMzcCXzEEC2NvbW1vblN0YXRlCAUNJHQwNDkxODA0OTMzNwJfMgQJZmVlQW1vdW50CAUNJHQwNDkxODA0OTMzNwJfMwQFYm9udXMIBQ0kdDA0OTE4MDQ5MzM3Al80BBRwYXltZW50SW5BbW91bnRBc3NldAgFDSR0MDQ5MTgwNDkzMzcCXzUJAJQKAgUDbmlsCQCVCgMFE2VtaXRBbW91bnRFc3RpbWF0ZWQFCWZlZUFtb3VudAUFYm9udXMBaQEJZ2V0T25lVGtuAg1vdXRBc3NldElkU3RyDG1pbk91dEFtb3VudAQgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBBQFAAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBA1pc0dldERpc2FibGVkAwkBASEBCQEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBCAUBaQZjYWxsZXIDAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgYFIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkBwQGY2hlY2tzCQDMCAIDAwkBASEBBQ1pc0dldERpc2FibGVkBgkBCWlzTWFuYWdlcgEFAWkGCQEIdGhyb3dFcnIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAh5leGFjdGx5IDEgcGF5bWVudCBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKb3V0QXNzZXRJZAkBDHBhcnNlQXNzZXRJZAEFDW91dEFzc2V0SWRTdHIEB3BheW1lbnQJAJEDAggFAWkIcGF5bWVudHMAAAQOcGF5bWVudEFzc2V0SWQIBQdwYXltZW50B2Fzc2V0SWQEDXBheW1lbnRBbW91bnQIBQdwYXltZW50BmFtb3VudAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBAt1c2VyQWRkcmVzcwgFAWkGY2FsbGVyBAR0eElkCAUBaQ10cmFuc2FjdGlvbklkBA0kdDA1MDI1OTUwNDEyCQEPY2FsY0dldE9uZVRva2VuBQUKb3V0QXNzZXRJZAUNcGF5bWVudEFtb3VudAUOcGF5bWVudEFzc2V0SWQFC3VzZXJBZGRyZXNzBQR0eElkAwkAAAIFDSR0MDUwMjU5NTA0MTIFDSR0MDUwMjU5NTA0MTIEEG91dEluQW1vdW50QXNzZXQIBQ0kdDA1MDI1OTUwNDEyAl81BAVib251cwgFDSR0MDUwMjU5NTA0MTICXzQECWZlZUFtb3VudAgFDSR0MDUwMjU5NTA0MTICXzMEC2NvbW1vblN0YXRlCAUNJHQwNTAyNTk1MDQxMgJfMgQPYW1vdW50RXN0aW1hdGVkCAUNJHQwNTAyNTk1MDQxMgJfMQQGYW1vdW50AwMJAGYCBQxtaW5PdXRBbW91bnQAAAkAZgIFDG1pbk91dEFtb3VudAUPYW1vdW50RXN0aW1hdGVkBwkBCHRocm93RXJyAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQxtaW5PdXRBbW91bnQFA25pbAIABQ9hbW91bnRFc3RpbWF0ZWQEB2J1cm5JbnYJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRidXJuCQDMCAIFDXBheW1lbnRBbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUOcGF5bWVudEFzc2V0SWQFDXBheW1lbnRBbW91bnQFA25pbAMJAAACBQdidXJuSW52BQdidXJuSW52BA13aXRoZHJhd1N0YXRlCQEZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldAIFDW91dEFzc2V0SWRTdHIJAGQCBQZhbW91bnQJAJYDAQkAzAgCAAAJAMwIAgUJZmVlQW1vdW50BQNuaWwEDWFzc2V0VHJhbnNmZXIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFBmFtb3VudAUKb3V0QXNzZXRJZAUDbmlsBAdzZW5kRmVlAwkAZgIFCWZlZUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2ZlZUNvbGxlY3RvckFkZHJlc3MFCWZlZUFtb3VudAUKb3V0QXNzZXRJZAUDbmlsBQNuaWwEDSR0MDUxMDc2NTEzMjMEEGZlZUFtb3VudEZvckNhbGMDCQAAAgUEdGhpcwUTZmVlQ29sbGVjdG9yQWRkcmVzcwAABQlmZWVBbW91bnQDBRBvdXRJbkFtb3VudEFzc2V0CQCUCgIJAQEtAQkAZAIFBmFtb3VudAUQZmVlQW1vdW50Rm9yQ2FsYwAACQCUCgIAAAkBAS0BCQBkAgUGYW1vdW50BRBmZWVBbW91bnRGb3JDYWxjBBdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDUxMDc2NTEzMjMCXzEEFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDA1MTA3NjUxMzIzAl8yBA0kdDA1MTMyNjUxNDM0CQEScmVmcmVzaEtMcEludGVybmFsAwUXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEFFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEAAAQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA1MTMyNjUxNDM0Al8xBAp1cGRhdGVkS0xwCAUNJHQwNTEzMjY1MTQzNAJfMgQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIFC2NvbW1vblN0YXRlBQ13aXRoZHJhd1N0YXRlBQ1hc3NldFRyYW5zZmVyBQdzZW5kRmVlBRFyZWZyZXNoS0xwQWN0aW9ucwUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWdldE9uZVRrblJFQURPTkxZAgpvdXRBc3NldElkDXBheW1lbnRBbW91bnQEDSR0MDUxNzEyNTE4NjgJAQ9jYWxjR2V0T25lVG9rZW4FCQEMcGFyc2VBc3NldElkAQUKb3V0QXNzZXRJZAUNcGF5bWVudEFtb3VudAUMY2ZnTHBBc3NldElkBQR1bml0BQR1bml0BA9hbW91bnRFc3RpbWF0ZWQIBQ0kdDA1MTcxMjUxODY4Al8xBAtjb21tb25TdGF0ZQgFDSR0MDUxNzEyNTE4NjgCXzIECWZlZUFtb3VudAgFDSR0MDUxNzEyNTE4NjgCXzMEBWJvbnVzCAUNJHQwNTE3MTI1MTg2OAJfNAQQb3V0SW5BbW91bnRBc3NldAgFDSR0MDUxNzEyNTE4NjgCXzUJAJQKAgUDbmlsCQCVCgMFD2Ftb3VudEVzdGltYXRlZAUJZmVlQW1vdW50BQVib251cwFpARN1bnN0YWtlQW5kR2V0T25lVGtuAw11bnN0YWtlQW1vdW50DW91dEFzc2V0SWRTdHIMbWluT3V0QW1vdW50BCBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0Aihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EDWlzR2V0RGlzYWJsZWQDCQEBIQEJARRpc0FkZHJlc3NXaGl0ZWxpc3RlZAEIBQFpBmNhbGxlcgMDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duBgUgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQHBAZjaGVja3MJAMwIAgMDCQEBIQEFDWlzR2V0RGlzYWJsZWQGCQEJaXNNYW5hZ2VyAQUBaQYJAQh0aHJvd0VycgECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAYJAQh0aHJvd0VycgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApvdXRBc3NldElkCQEMcGFyc2VBc3NldElkAQUNb3V0QXNzZXRJZFN0cgQLdXNlckFkZHJlc3MIBQFpBmNhbGxlcgQEdHhJZAgFAWkNdHJhbnNhY3Rpb25JZAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBAp1bnN0YWtlSW52CQD8BwQFD3N0YWtpbmdDb250cmFjdAIHdW5zdGFrZQkAzAgCCQDYBAEFDGNmZ0xwQXNzZXRJZAkAzAgCBQ11bnN0YWtlQW1vdW50BQNuaWwFA25pbAMJAAACBQp1bnN0YWtlSW52BQp1bnN0YWtlSW52BA0kdDA1MjgxMDUyOTYxCQEPY2FsY0dldE9uZVRva2VuBQUKb3V0QXNzZXRJZAUNdW5zdGFrZUFtb3VudAUMY2ZnTHBBc3NldElkBQt1c2VyQWRkcmVzcwUEdHhJZAMJAAACBQ0kdDA1MjgxMDUyOTYxBQ0kdDA1MjgxMDUyOTYxBBBvdXRJbkFtb3VudEFzc2V0CAUNJHQwNTI4MTA1Mjk2MQJfNQQFYm9udXMIBQ0kdDA1MjgxMDUyOTYxAl80BAlmZWVBbW91bnQIBQ0kdDA1MjgxMDUyOTYxAl8zBAtjb21tb25TdGF0ZQgFDSR0MDUyODEwNTI5NjECXzIED2Ftb3VudEVzdGltYXRlZAgFDSR0MDUyODEwNTI5NjECXzEEBmFtb3VudAMDCQBmAgUMbWluT3V0QW1vdW50AAAJAGYCBQxtaW5PdXRBbW91bnQFD2Ftb3VudEVzdGltYXRlZAcJAQh0aHJvd0VycgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUMbWluT3V0QW1vdW50BQNuaWwCAAUPYW1vdW50RXN0aW1hdGVkBAdidXJuSW52CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEYnVybgkAzAgCBQ11bnN0YWtlQW1vdW50BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDGNmZ0xwQXNzZXRJZAUNdW5zdGFrZUFtb3VudAUDbmlsAwkAAAIFB2J1cm5JbnYFB2J1cm5JbnYEDXdpdGhkcmF3U3RhdGUJARl3aXRoZHJhd0FuZFJlYmFsYW5jZUFzc2V0AgUNb3V0QXNzZXRJZFN0cgkAZAIFBmFtb3VudAkAlgMBCQDMCAIAAAkAzAgCBQlmZWVBbW91bnQFA25pbAQNYXNzZXRUcmFuc2ZlcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAUKb3V0QXNzZXRJZAUDbmlsBAdzZW5kRmVlAwkAZgIFCWZlZUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2ZlZUNvbGxlY3RvckFkZHJlc3MFCWZlZUFtb3VudAUKb3V0QXNzZXRJZAUDbmlsBQNuaWwEDSR0MDUzNjIwNTM4NjcEEGZlZUFtb3VudEZvckNhbGMDCQAAAgUEdGhpcwUTZmVlQ29sbGVjdG9yQWRkcmVzcwAABQlmZWVBbW91bnQDBRBvdXRJbkFtb3VudEFzc2V0CQCUCgIJAQEtAQkAZAIFBmFtb3VudAUQZmVlQW1vdW50Rm9yQ2FsYwAACQCUCgIAAAkBAS0BCQBkAgUGYW1vdW50BRBmZWVBbW91bnRGb3JDYWxjBBdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDUzNjIwNTM4NjcCXzEEFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDA1MzYyMDUzODY3Al8yBA0kdDA1Mzg3MDUzOTc4CQEScmVmcmVzaEtMcEludGVybmFsAwUXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEFFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEAAAQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA1Mzg3MDUzOTc4Al8xBAp1cGRhdGVkS0xwCAUNJHQwNTM4NzA1Mzk3OAJfMgQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIFC2NvbW1vblN0YXRlBQ13aXRoZHJhd1N0YXRlBQ1hc3NldFRyYW5zZmVyBQdzZW5kRmVlBRFyZWZyZXNoS0xwQWN0aW9ucwUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBA2dldAAEA3JlcwkBCWNvbW1vbkdldAEFAWkECG91dEFtQW10CAUDcmVzAl8xBAhvdXRQckFtdAgFA3JlcwJfMgQGcG10QW10CAUDcmVzAl8zBApwbXRBc3NldElkCAUDcmVzAl80BAVzdGF0ZQgFA3JlcwJfNQQNd2l0aGRyYXdTdGF0ZQkBF3dpdGhkcmF3QW5kUmViYWxhbmNlQWxsAgUIb3V0QW1BbXQFCG91dFByQW10BApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAEFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEYnVybgkAzAgCBQZwbXRBbXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUGcG10QW10BQNuaWwDCQAAAgUUYnVybkxQQXNzZXRPbkZhY3RvcnkFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BA0kdDA1NTA3MzU1MTU0CQEScmVmcmVzaEtMcEludGVybmFsAwkBAS0BBQhvdXRBbUFtdAkBAS0BBQhvdXRQckFtdAAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDU1MDczNTUxNTQCXzEECnVwZGF0ZWRLTHAIBQ0kdDA1NTA3MzU1MTU0Al8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQDOCAIJAM4IAgUNd2l0aGRyYXdTdGF0ZQUFc3RhdGUFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWdldE5vTGVzcwISbm9MZXNzVGhlbkFtdEFzc2V0FG5vTGVzc1RoZW5QcmljZUFzc2V0BANyZXMJAQljb21tb25HZXQBBQFpBAhvdXRBbUFtdAgFA3JlcwJfMQQIb3V0UHJBbXQIBQNyZXMCXzIEBnBtdEFtdAgFA3JlcwJfMwQKcG10QXNzZXRJZAgFA3JlcwJfNAQFc3RhdGUIBQNyZXMCXzUDCQBmAgUSbm9MZXNzVGhlbkFtdEFzc2V0BQhvdXRBbUFtdAkAAgEJAKwCAgkArAICCQCsAgICHG5vTGVzc1RoZW5BbXRBc3NldCBmYWlsZWQ6ICAJAKQDAQUIb3V0QW1BbXQCAyA8IAkApAMBBRJub0xlc3NUaGVuQW10QXNzZXQDCQBmAgUUbm9MZXNzVGhlblByaWNlQXNzZXQFCG91dFByQW10CQACAQkArAICCQCsAgIJAKwCAgIdbm9MZXNzVGhlblByaWNlQXNzZXQgZmFpbGVkOiAJAKQDAQUIb3V0UHJBbXQCAyA8IAkApAMBBRRub0xlc3NUaGVuUHJpY2VBc3NldAQNd2l0aGRyYXdTdGF0ZQkBF3dpdGhkcmF3QW5kUmViYWxhbmNlQWxsAgUIb3V0QW1BbXQFCG91dFByQW10BApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAEFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEYnVybgkAzAgCBQZwbXRBbXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUGcG10QW10BQNuaWwDCQAAAgUUYnVybkxQQXNzZXRPbkZhY3RvcnkFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BA0kdDA1NjI0OTU2MzMwCQEScmVmcmVzaEtMcEludGVybmFsAwkBAS0BBQhvdXRBbUFtdAkBAS0BBQhvdXRQckFtdAAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDU2MjQ5NTYzMzACXzEECnVwZGF0ZWRLTHAIBQ0kdDA1NjI0OTU2MzMwAl8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQDOCAIJAM4IAgUNd2l0aGRyYXdTdGF0ZQUFc3RhdGUFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXVuc3Rha2VBbmRHZXQBBmFtb3VudAQNY2hlY2tQYXltZW50cwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECGE5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAYDCQAAAgUNY2hlY2tQYXltZW50cwUNY2hlY2tQYXltZW50cwQDY2ZnCQENZ2V0UG9vbENvbmZpZwAECWxwQXNzZXRJZAkA2QQBCQCRAwIFA2NmZwUQaWR4UG9vbExQQXNzZXRJZAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBAp1bnN0YWtlSW52CQD8BwQFD3N0YWtpbmdDb250cmFjdAIHdW5zdGFrZQkAzAgCCQDYBAEFCWxwQXNzZXRJZAkAzAgCBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFCnVuc3Rha2VJbnYFCnVuc3Rha2VJbnYEA3JlcwkBFGVzdGltYXRlR2V0T3BlcmF0aW9uBAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEFCWxwQXNzZXRJZAUGYW1vdW50CAUBaQZjYWxsZXIECG91dEFtQW10CAUDcmVzAl8xBAhvdXRQckFtdAgFA3JlcwJfMgQKcG9vbFN0YXR1cwkBDXBhcnNlSW50VmFsdWUBCAUDcmVzAl85BAVzdGF0ZQgFA3JlcwNfMTAEDXdpdGhkcmF3U3RhdGUJARd3aXRoZHJhd0FuZFJlYmFsYW5jZUFsbAIFCG91dEFtQW10BQhvdXRQckFtdAQNaXNHZXREaXNhYmxlZAMJAQEhAQkBFGlzQWRkcmVzc1doaXRlbGlzdGVkAQgFAWkGY2FsbGVyAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgcED2NoZWNrUG9vbFN0YXR1cwMFDWlzR2V0RGlzYWJsZWQJAAIBCQCsAgICLEdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbi4gU3RhdHVzID0gCQCkAwEFCnBvb2xTdGF0dXMGAwkAAAIFD2NoZWNrUG9vbFN0YXR1cwUPY2hlY2tQb29sU3RhdHVzBBRidXJuTFBBc3NldE9uRmFjdG9yeQkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCBGJ1cm4JAMwIAgUGYW1vdW50BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCWxwQXNzZXRJZAUGYW1vdW50BQNuaWwDCQAAAgUUYnVybkxQQXNzZXRPbkZhY3RvcnkFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BA0kdDA1NzY3ODU3NzU5CQEScmVmcmVzaEtMcEludGVybmFsAwkBAS0BBQhvdXRBbUFtdAkBAS0BBQhvdXRQckFtdAAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDU3Njc4NTc3NTkCXzEECnVwZGF0ZWRLTHAIBQ0kdDA1NzY3ODU3NzU5Al8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQDOCAIJAM4IAgUNd2l0aGRyYXdTdGF0ZQUFc3RhdGUFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE3Vuc3Rha2VBbmRHZXROb0xlc3MDDXVuc3Rha2VBbW91bnQVbm9MZXNzVGhlbkFtb3VudEFzc2V0FG5vTGVzc1RoZW5QcmljZUFzc2V0BA1pc0dldERpc2FibGVkAwkBASEBCQEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBCAUBaQZjYWxsZXIDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duBwQGY2hlY2tzCQDMCAIDCQEBIQEFDWlzR2V0RGlzYWJsZWQGCQACAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAECnVuc3Rha2VJbnYJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Agd1bnN0YWtlCQDMCAIJANgEAQUMY2ZnTHBBc3NldElkCQDMCAIFDXVuc3Rha2VBbW91bnQFA25pbAUDbmlsAwkAAAIFCnVuc3Rha2VJbnYFCnVuc3Rha2VJbnYEA3JlcwkBFGVzdGltYXRlR2V0T3BlcmF0aW9uBAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEFDGNmZ0xwQXNzZXRJZAUNdW5zdGFrZUFtb3VudAgFAWkGY2FsbGVyBAhvdXRBbUFtdAgFA3JlcwJfMQQIb3V0UHJBbXQIBQNyZXMCXzIEBXN0YXRlCAUDcmVzA18xMAQNd2l0aGRyYXdTdGF0ZQkBF3dpdGhkcmF3QW5kUmViYWxhbmNlQWxsAgUIb3V0QW1BbXQFCG91dFByQW10BAxjaGVja0Ftb3VudHMJAMwIAgMJAGcCBQhvdXRBbUFtdAUVbm9MZXNzVGhlbkFtb3VudEFzc2V0BgkAAgEJALkJAgkAzAgCAixhbW91bnQgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFFW5vTGVzc1RoZW5BbW91bnRBc3NldAUDbmlsAgAJAMwIAgMJAGcCBQhvdXRQckFtdAUUbm9MZXNzVGhlblByaWNlQXNzZXQGCQACAQkAuQkCCQDMCAICK3ByaWNlIGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBRRub0xlc3NUaGVuUHJpY2VBc3NldAUDbmlsAgAFA25pbAMJAAACBQxjaGVja0Ftb3VudHMFDGNoZWNrQW1vdW50cwQUYnVybkxQQXNzZXRPbkZhY3RvcnkJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRidXJuCQDMCAIFDXVuc3Rha2VBbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMY2ZnTHBBc3NldElkBQ11bnN0YWtlQW1vdW50BQNuaWwDCQAAAgUUYnVybkxQQXNzZXRPbkZhY3RvcnkFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BA0kdDA1OTIzNzU5MzE4CQEScmVmcmVzaEtMcEludGVybmFsAwkBAS0BBQhvdXRBbUFtdAkBAS0BBQhvdXRQckFtdAAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDU5MjM3NTkzMTgCXzEECnVwZGF0ZWRLTHAIBQ0kdDA1OTIzNzU5MzE4Al8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQDOCAIJAM4IAgUNd2l0aGRyYXdTdGF0ZQUFc3RhdGUFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGFjdGl2YXRlAgthbXRBc3NldFN0cg1wcmljZUFzc2V0U3RyAwkBAiE9AgkApQgBCAUBaQZjYWxsZXIJAKUIAQUPZmFjdG9yeUNvbnRyYWN0CQACAQIScGVybWlzc2lvbnMgZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAAULYW10QXNzZXRTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAnBhAAUNcHJpY2VBc3NldFN0cgUDbmlsAgdzdWNjZXNzAWkBCnJlZnJlc2hLTHAABBhsYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVa2V5S0xwUmVmcmVzaGVkSGVpZ2h0AAAEHWNoZWNrTGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0AwkAZwIJAGUCBQZoZWlnaHQFGGxhc3RSZWZyZXNoZWRCbG9ja0hlaWdodAUPa0xwUmVmcmVzaERlbGF5BQR1bml0CQEIdGhyb3dFcnIBCQC5CQIJAMwIAgkApAMBBQ9rTHBSZWZyZXNoRGVsYXkJAMwIAgIvIGJsb2NrcyBoYXZlIG5vdCBwYXNzZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwFA25pbAIAAwkAAAIFHWNoZWNrTGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0BR1jaGVja0xhc3RSZWZyZXNoZWRCbG9ja0hlaWdodAQDa0xwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKgDAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQZrZXlLTHACATAJAQZmbXRFcnIBAgtpbnZhbGlkIGtMcAQNJHQwNjA1MjI2MDU4NgkBEnJlZnJlc2hLTHBJbnRlcm5hbAMAAAAAAAAEEGtMcFVwZGF0ZUFjdGlvbnMIBQ0kdDA2MDUyMjYwNTg2Al8xBAp1cGRhdGVkS0xwCAUNJHQwNjA1MjI2MDU4NgJfMgQHYWN0aW9ucwMJAQIhPQIFA2tMcAUKdXBkYXRlZEtMcAUQa0xwVXBkYXRlQWN0aW9ucwkBCHRocm93RXJyAQISbm90aGluZyB0byByZWZyZXNoCQCUCgIFB2FjdGlvbnMJAKYDAQUKdXBkYXRlZEtMcAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQ1nZXRQb29sQ29uZmlnAAFpARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQdhc3NldElkCQCUCgIFA25pbAkBDWdldEFjY0JhbGFuY2UBBQdhc3NldElkAWkBGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkDBWFtQW10BXByQW10BWxwQW10BAZwcmljZXMJAQpjYWxjUHJpY2VzAwUFYW1BbXQFBXByQW10BQVscEFtdAkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFBnByaWNlcwAACQDMCAIJAKYDAQkAkQMCBQZwcmljZXMAAQkAzAgCCQCmAwEJAJEDAgUGcHJpY2VzAAIFA25pbAFpARR0b1gxOFdyYXBwZXJSRUFET05MWQIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQCUCgIFA25pbAkApgMBCQEFdG9YMTgCBQdvcmlnVmFsBQ1vcmlnU2NhbGVNdWx0AWkBFmZyb21YMThXcmFwcGVyUkVBRE9OTFkCA3ZhbA9yZXN1bHRTY2FsZU11bHQJAJQKAgUDbmlsCQEHZnJvbVgxOAIJAKcDAQUDdmFsBQ9yZXN1bHRTY2FsZU11bHQBaQEeY2FsY1ByaWNlQmlnSW50V3JhcHBlclJFQURPTkxZAghwckFtdFgxOAhhbUFtdFgxOAkAlAoCBQNuaWwJAKYDAQkBD2NhbGNQcmljZUJpZ0ludAIJAKcDAQUIcHJBbXRYMTgJAKcDAQUIYW1BbXRYMTgBaQEjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJBnR4SWQ1OBFzbGlwcGFnZVRvbGVyYW5jZQxpbkFtQXNzZXRBbXQLaW5BbUFzc2V0SWQMaW5QckFzc2V0QW10C2luUHJBc3NldElkC3VzZXJBZGRyZXNzCmlzRXZhbHVhdGUGZW1pdExwCQCUCgIFA25pbAkBFGVzdGltYXRlUHV0T3BlcmF0aW9uCQUGdHhJZDU4BRFzbGlwcGFnZVRvbGVyYW5jZQUMaW5BbUFzc2V0QW10BQtpbkFtQXNzZXRJZAUMaW5QckFzc2V0QW10BQtpblByQXNzZXRJZAULdXNlckFkZHJlc3MFCmlzRXZhbHVhdGUFBmVtaXRMcAFpASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQGdHhJZDU4CnBtdEFzc2V0SWQIcG10THBBbXQLdXNlckFkZHJlc3MEA3JlcwkBFGVzdGltYXRlR2V0T3BlcmF0aW9uBAUGdHhJZDU4BQpwbXRBc3NldElkBQhwbXRMcEFtdAkBEUBleHRyTmF0aXZlKDEwNjIpAQULdXNlckFkZHJlc3MJAJQKAgUDbmlsCQCcCgoIBQNyZXMCXzEIBQNyZXMCXzIIBQNyZXMCXzMIBQNyZXMCXzQIBQNyZXMCXzUIBQNyZXMCXzYIBQNyZXMCXzcJAKYDAQgFA3JlcwJfOAgFA3JlcwJfOQgFA3JlcwNfMTABaQENc3RhdHNSRUFET05MWQAEA2NmZwkBDWdldFBvb2xDb25maWcABAlscEFzc2V0SWQJANkEAQkAkQMCBQNjZmcFEGlkeFBvb2xMUEFzc2V0SWQECmFtdEFzc2V0SWQJAJEDAgUDY2ZnBQ1pZHhBbXRBc3NldElkBAxwcmljZUFzc2V0SWQJAJEDAgUDY2ZnBQ9pZHhQcmljZUFzc2V0SWQEC2lBbXRBc3NldElkCQCRAwIFA2NmZwUOaWR4SUFtdEFzc2V0SWQEDWlQcmljZUFzc2V0SWQJAJEDAgUDY2ZnBRBpZHhJUHJpY2VBc3NldElkBAthbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUOaWR4QW10QXNzZXREY20EDXByaWNlQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFEGlkeFByaWNlQXNzZXREY20EDXBvb2xMUEJhbGFuY2UICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUJbHBBc3NldElkCQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFCWxwQXNzZXRJZAIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEEmFjY0FtdEFzc2V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQphbXRBc3NldElkBBRhY2NQcmljZUFzc2V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQxwcmljZUFzc2V0SWQECnByaWNlc0xpc3QDCQAAAgUNcG9vbExQQmFsYW5jZQAACQDMCAIFCnplcm9CaWdJbnQJAMwIAgUKemVyb0JpZ0ludAkAzAgCBQp6ZXJvQmlnSW50BQNuaWwJAQpjYWxjUHJpY2VzAwUSYWNjQW10QXNzZXRCYWxhbmNlBRRhY2NQcmljZUFzc2V0QmFsYW5jZQUNcG9vbExQQmFsYW5jZQQIY3VyUHJpY2UAAAQPbHBBbXRBc3NldFNoYXJlCQEHZnJvbVgxOAIJAJEDAgUKcHJpY2VzTGlzdAABBQZzY2FsZTgEEWxwUHJpY2VBc3NldFNoYXJlCQEHZnJvbVgxOAIJAJEDAgUKcHJpY2VzTGlzdAACBQZzY2FsZTgECnBvb2xXZWlnaHQJAQV2YWx1ZQEJAJoIAgUPZmFjdG9yeUNvbnRyYWN0CQENa2V5UG9vbFdlaWdodAEJAKUIAQUEdGhpcwkAlAoCBQNuaWwJALkJAgkAzAgCAg4lZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFEmFjY0FtdEFzc2V0QmFsYW5jZQkAzAgCCQCkAwEFFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQDMCAIJAKQDAQUNcG9vbExQQmFsYW5jZQkAzAgCCQCkAwEFCGN1clByaWNlCQDMCAIJAKQDAQUPbHBBbXRBc3NldFNoYXJlCQDMCAIJAKQDAQURbHBQcmljZUFzc2V0U2hhcmUJAMwIAgkApAMBBQpwb29sV2VpZ2h0BQNuaWwFA1NFUAFpASBldmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQEMaW5BbUFzc2V0QW10BANjZmcJAQ1nZXRQb29sQ29uZmlnAAQJbHBBc3NldElkCQDZBAEJAJEDAgUDY2ZnBRBpZHhQb29sTFBBc3NldElkBAxhbUFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ1pZHhBbXRBc3NldElkBAlhbUFzc2V0SWQJANkEAQUMYW1Bc3NldElkU3RyBAxwckFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ9pZHhQcmljZUFzc2V0SWQECXByQXNzZXRJZAkA2QQBBQxwckFzc2V0SWRTdHIEC2FtdEFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ5pZHhBbXRBc3NldERjbQQNcHJpY2VBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUQaWR4UHJpY2VBc3NldERjbQQKcG9vbFN0YXR1cwkAkQMCBQNjZmcFDWlkeFBvb2xTdGF0dXMEDXBvb2xMUEJhbGFuY2UICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUJbHBBc3NldElkCQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFCWxwQXNzZXRJZAIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEEmFjY0FtdEFzc2V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQxhbUFzc2V0SWRTdHIEFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFDHByQXNzZXRJZFN0cgQOYW10QXNzZXRBbXRYMTgJAQV0b1gxOAIFEmFjY0FtdEFzc2V0QmFsYW5jZQULYW10QXNzZXREY20EEHByaWNlQXNzZXRBbXRYMTgJAQV0b1gxOAIFFGFjY1ByaWNlQXNzZXRCYWxhbmNlBQ1wcmljZUFzc2V0RGNtBAtjdXJQcmljZVgxOAMJAAACBQ1wb29sTFBCYWxhbmNlAAAFCnplcm9CaWdJbnQJAQ9jYWxjUHJpY2VCaWdJbnQCBRBwcmljZUFzc2V0QW10WDE4BQ5hbXRBc3NldEFtdFgxOAQPaW5BbUFzc2V0QW10WDE4CQEFdG9YMTgCBQxpbkFtQXNzZXRBbXQFC2FtdEFzc2V0RGNtBA9pblByQXNzZXRBbXRYMTgJALwCAwUPaW5BbUFzc2V0QW10WDE4BQtjdXJQcmljZVgxOAUHc2NhbGUxOAQMaW5QckFzc2V0QW10CQEHZnJvbVgxOAIFD2luUHJBc3NldEFtdFgxOAUNcHJpY2VBc3NldERjbQQGZXN0UHV0CQEUZXN0aW1hdGVQdXRPcGVyYXRpb24JAgAAoMIeBQxpbkFtQXNzZXRBbXQFCWFtQXNzZXRJZAUMaW5QckFzc2V0QW10BQlwckFzc2V0SWQCAAYHBAljYWxjTHBBbXQIBQZlc3RQdXQCXzEEDGN1clByaWNlQ2FsYwgFBmVzdFB1dAJfMwQJYW1CYWxhbmNlCAUGZXN0UHV0Al80BAlwckJhbGFuY2UIBQZlc3RQdXQCXzUECmxwRW1pc3Npb24IBQZlc3RQdXQCXzYJAJQKAgUDbmlsCQC5CQIJAMwIAgIQJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFCWNhbGNMcEFtdAkAzAgCCQCkAwEJAQdmcm9tWDE4AgULY3VyUHJpY2VYMTgFBnNjYWxlOAkAzAgCCQCkAwEFCWFtQmFsYW5jZQkAzAgCCQCkAwEFCXByQmFsYW5jZQkAzAgCCQCkAwEFCmxwRW1pc3Npb24JAMwIAgUKcG9vbFN0YXR1cwkAzAgCCQCkAwEFDGluQW1Bc3NldEFtdAkAzAgCCQCkAwEFDGluUHJBc3NldEFtdAUDbmlsBQNTRVABaQEfZXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQEMaW5QckFzc2V0QW10BANjZmcJAQ1nZXRQb29sQ29uZmlnAAQJbHBBc3NldElkCQDZBAEJAJEDAgUDY2ZnBRBpZHhQb29sTFBBc3NldElkBAxhbUFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ1pZHhBbXRBc3NldElkBAlhbUFzc2V0SWQJANkEAQUMYW1Bc3NldElkU3RyBAxwckFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ9pZHhQcmljZUFzc2V0SWQECXByQXNzZXRJZAkA2QQBBQxwckFzc2V0SWRTdHIEC2FtdEFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ5pZHhBbXRBc3NldERjbQQNcHJpY2VBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUQaWR4UHJpY2VBc3NldERjbQQKcG9vbFN0YXR1cwkAkQMCBQNjZmcFDWlkeFBvb2xTdGF0dXMEDXBvb2xMUEJhbGFuY2UICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUJbHBBc3NldElkCQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFCWxwQXNzZXRJZAIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEDGFtQmFsYW5jZVJhdwkBDWdldEFjY0JhbGFuY2UBBQxhbUFzc2V0SWRTdHIEDHByQmFsYW5jZVJhdwkBDWdldEFjY0JhbGFuY2UBBQxwckFzc2V0SWRTdHIED2FtQmFsYW5jZVJhd1gxOAkBBXRvWDE4AgUMYW1CYWxhbmNlUmF3BQthbXRBc3NldERjbQQPcHJCYWxhbmNlUmF3WDE4CQEFdG9YMTgCBQxwckJhbGFuY2VSYXcFDXByaWNlQXNzZXREY20EC2N1clByaWNlWDE4AwkAAAIFDXBvb2xMUEJhbGFuY2UAAAUKemVyb0JpZ0ludAkBD2NhbGNQcmljZUJpZ0ludAIFD3ByQmFsYW5jZVJhd1gxOAUPYW1CYWxhbmNlUmF3WDE4BA9pblByQXNzZXRBbXRYMTgJAQV0b1gxOAIFDGluUHJBc3NldEFtdAUNcHJpY2VBc3NldERjbQQPaW5BbUFzc2V0QW10WDE4CQC8AgMFD2luUHJBc3NldEFtdFgxOAUHc2NhbGUxOAULY3VyUHJpY2VYMTgEDGluQW1Bc3NldEFtdAkBB2Zyb21YMTgCBQ9pbkFtQXNzZXRBbXRYMTgFC2FtdEFzc2V0RGNtBAZlc3RQdXQJARRlc3RpbWF0ZVB1dE9wZXJhdGlvbgkCAACgwh4FDGluQW1Bc3NldEFtdAUJYW1Bc3NldElkBQxpblByQXNzZXRBbXQFCXByQXNzZXRJZAIABgcECWNhbGNMcEFtdAgFBmVzdFB1dAJfMQQMY3VyUHJpY2VDYWxjCAUGZXN0UHV0Al8zBAlhbUJhbGFuY2UIBQZlc3RQdXQCXzQECXByQmFsYW5jZQgFBmVzdFB1dAJfNQQKbHBFbWlzc2lvbggFBmVzdFB1dAJfNgkAlAoCBQNuaWwJALkJAgkAzAgCAhAlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUJY2FsY0xwQW10CQDMCAIJAKQDAQkBB2Zyb21YMTgCBQtjdXJQcmljZVgxOAUGc2NhbGU4CQDMCAIJAKQDAQUJYW1CYWxhbmNlCQDMCAIJAKQDAQUJcHJCYWxhbmNlCQDMCAIJAKQDAQUKbHBFbWlzc2lvbgkAzAgCBQpwb29sU3RhdHVzCQDMCAIJAKQDAQUMaW5BbUFzc2V0QW10CQDMCAIJAKQDAQUMaW5QckFzc2V0QW10BQNuaWwFA1NFUAFpARNldmFsdWF0ZUdldFJFQURPTkxZAhBwYXltZW50THBBc3NldElkDHBheW1lbnRMcEFtdAQDcmVzCQEUZXN0aW1hdGVHZXRPcGVyYXRpb24EAgAFEHBheW1lbnRMcEFzc2V0SWQFDHBheW1lbnRMcEFtdAUEdGhpcwQIb3V0QW1BbXQIBQNyZXMCXzEECG91dFByQW10CAUDcmVzAl8yBAlhbUJhbGFuY2UIBQNyZXMCXzUECXByQmFsYW5jZQgFA3JlcwJfNgQKbHBFbWlzc2lvbggFA3JlcwJfNwQIY3VyUHJpY2UIBQNyZXMCXzgECnBvb2xTdGF0dXMJAQ1wYXJzZUludFZhbHVlAQgFA3JlcwJfOQkAlAoCBQNuaWwJALkJAgkAzAgCAg4lZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFCG91dEFtQW10CQDMCAIJAKQDAQUIb3V0UHJBbXQJAMwIAgkApAMBBQlhbUJhbGFuY2UJAMwIAgkApAMBBQlwckJhbGFuY2UJAMwIAgkApAMBBQpscEVtaXNzaW9uCQDMCAIJAKYDAQUIY3VyUHJpY2UJAMwIAgkApAMBBQpwb29sU3RhdHVzBQNuaWwFA1NFUAECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACBU9yZGVyBAVvcmRlcgUHJG1hdGNoMAQKbWF0Y2hlclB1YgkBE2dldE1hdGNoZXJQdWJPckZhaWwABA0kdDA2OTI0ODY5MzY1AwkBE3NraXBPcmRlclZhbGlkYXRpb24ACQCUCgIGAgAJARt2YWxpZGF0ZU1hdGNoZXJPcmRlckFsbG93ZWQBBQVvcmRlcgQKb3JkZXJWYWxpZAgFDSR0MDY5MjQ4NjkzNjUCXzEEDm9yZGVyVmFsaWRJbmZvCAUNJHQwNjkyNDg2OTM2NQJfMgQLc2VuZGVyVmFsaWQJAPQDAwgFBW9yZGVyCWJvZHlCeXRlcwkAkQMCCAUFb3JkZXIGcHJvb2ZzAAAIBQVvcmRlcg9zZW5kZXJQdWJsaWNLZXkEDG1hdGNoZXJWYWxpZAkA9AMDCAUFb3JkZXIJYm9keUJ5dGVzCQCRAwIIBQVvcmRlcgZwcm9vZnMAAQUKbWF0Y2hlclB1YgMDAwUKb3JkZXJWYWxpZAULc2VuZGVyVmFsaWQHBQxtYXRjaGVyVmFsaWQHBgkBD3Rocm93T3JkZXJFcnJvcgQFCm9yZGVyVmFsaWQFDm9yZGVyVmFsaWRJbmZvBQtzZW5kZXJWYWxpZAUMbWF0Y2hlclZhbGlkAwkAAQIFByRtYXRjaDACFFNldFNjcmlwdFRyYW5zYWN0aW9uBAFzBQckbWF0Y2gwAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V5BgQHbmV3SGFzaAkA9gMBCQEFdmFsdWUBCAUBcwZzY3JpcHQEC2FsbG93ZWRIYXNoCQDbBAEJAQV2YWx1ZQEJAJ0IAgUPZmFjdG9yeUNvbnRyYWN0CQEWa2V5QWxsb3dlZExwU2NyaXB0SGFzaAAEC2N1cnJlbnRIYXNoCQDxBwEFBHRoaXMDCQAAAgULYWxsb3dlZEhhc2gFB25ld0hhc2gJAQIhPQIFC2N1cnJlbnRIYXNoBQduZXdIYXNoBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V5tyLBXA==", "height": 2985918, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7RANfJGgQAbYmr95cNJSwjgdSN3pJfGPYJbFfdBddxSH Next: FsiYSLSi2LwLFrvsx8cKu4b35Gx4Zz5UowqZA9H4x5xE Diff:
OldNewDifferences
399399
400400
401401 func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul,profitAddress) = {
402- let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
403- if ((currentAdditionalBalance == currentAdditionalBalance))
402+ let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
403+ if ((currentStakingAssetBalance == currentStakingAssetBalance))
404404 then {
405- let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
406- if ((currentStakingAssetBalance == currentStakingAssetBalance))
405+ let currentAdditionalBalance = if ((currentStakingAssetBalance != 0))
406+ then getAdditionalBalanceOrZero(assetId)
407+ else 0
408+ if ((currentAdditionalBalance == currentAdditionalBalance))
407409 then {
408410 let leasableTotalBalance = max([0, (getAccBalance(assetId) - minBalance)])
409411 let targetAdditionalBalance = fraction(targetRatio, leasableTotalBalance, 100)
427429
428430
429431 func rebalanceAsset (assetId) = {
430- let $t01617116307 = getLeaseProxyConfig(assetId)
431- let isLeasable = $t01617116307._1
432- let leasedRatio = $t01617116307._2
433- let minBalance = $t01617116307._3
434- let proxyAddress = $t01617116307._4
435- let proxyAssetId = $t01617116307._5
436- let proxyRateMul = $t01617116307._6
437- let stakingProfitAddress = $t01617116307._7
432+ let $t01622016356 = getLeaseProxyConfig(assetId)
433+ let isLeasable = $t01622016356._1
434+ let leasedRatio = $t01622016356._2
435+ let minBalance = $t01622016356._3
436+ let proxyAddress = $t01622016356._4
437+ let proxyAssetId = $t01622016356._5
438+ let proxyRateMul = $t01622016356._6
439+ let stakingProfitAddress = $t01622016356._7
438440 if (isLeasable)
439441 then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
440442 else nil
442444
443445
444446 func withdrawAndRebalanceAsset (assetId,getAmount) = {
445- let $t01670616842 = getLeaseProxyConfig(assetId)
446- let isLeasable = $t01670616842._1
447- let leasedRatio = $t01670616842._2
448- let minBalance = $t01670616842._3
449- let proxyAddress = $t01670616842._4
450- let proxyAssetId = $t01670616842._5
451- let proxyRateMul = $t01670616842._6
452- let stakingProfitAddress = $t01670616842._7
447+ let $t01675516891 = getLeaseProxyConfig(assetId)
448+ let isLeasable = $t01675516891._1
449+ let leasedRatio = $t01675516891._2
450+ let minBalance = $t01675516891._3
451+ let proxyAddress = $t01675516891._4
452+ let proxyAssetId = $t01675516891._5
453+ let proxyRateMul = $t01675516891._6
454+ let stakingProfitAddress = $t01675516891._7
453455 if (isLeasable)
454456 then {
455457 let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
662664 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
663665 let amountAssetAmount = order.amount
664666 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
665- let $t02923129443 = if ((order.orderType == Buy))
667+ let $t02928029492 = if ((order.orderType == Buy))
666668 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
667669 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
668- let amountAssetBalanceDelta = $t02923129443._1
669- let priceAssetBalanceDelta = $t02923129443._2
670+ let amountAssetBalanceDelta = $t02928029492._1
671+ let priceAssetBalanceDelta = $t02928029492._2
670672 if (if (if (isGlobalShutdown())
671673 then true
672674 else (cfgPoolStatus == PoolMatcherDisabled))
679681 then throw("Wrong order assets.")
680682 else {
681683 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
682- let $t02988329983 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
683- let unusedActions = $t02988329983._1
684- let kLpNew = $t02988329983._2
684+ let $t02993230032 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
685+ let unusedActions = $t02993230032._1
686+ let kLpNew = $t02993230032._2
685687 let isOrderValid = (kLpNew >= kLp)
686688 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
687689 $Tuple2(isOrderValid, info)
764766 else if ((paymentAssetId == cfgPriceAssetId))
765767 then false
766768 else throwErr("invalid asset")
767- let $t03316933462 = if (isEval)
769+ let $t03321833511 = if (isEval)
768770 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
769771 else if (paymentInAmountAsset)
770772 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
771773 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
772- let amountBalanceOld = $t03316933462._1
773- let priceBalanceOld = $t03316933462._2
774- let $t03346633615 = if (paymentInAmountAsset)
774+ let amountBalanceOld = $t03321833511._1
775+ let priceBalanceOld = $t03321833511._2
776+ let $t03351533664 = if (paymentInAmountAsset)
775777 then $Tuple2(paymentAmountRaw, 0)
776778 else $Tuple2(0, paymentAmountRaw)
777- let amountAssetAmountRaw = $t03346633615._1
778- let priceAssetAmountRaw = $t03346633615._2
779+ let amountAssetAmountRaw = $t03351533664._1
780+ let priceAssetAmountRaw = $t03351533664._2
779781 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
780782 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
781- let $t03374733811 = takeFee(paymentAmountRaw, inFee)
782- let paymentAmount = $t03374733811._1
783- let feeAmount = $t03374733811._2
783+ let $t03379633860 = takeFee(paymentAmountRaw, inFee)
784+ let paymentAmount = $t03379633860._1
785+ let feeAmount = $t03379633860._2
784786 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
785787 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
786788 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
803805 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
804806 let priceOld = fromX18(priceOldX18, scale8)
805807 let loss = {
806- let $t03549235659 = if (paymentInAmountAsset)
808+ let $t03554135708 = if (paymentInAmountAsset)
807809 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
808810 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
809- let amount = $t03549235659._1
810- let balance = $t03549235659._2
811+ let amount = $t03554135708._1
812+ let balance = $t03554135708._2
811813 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
812814 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
813815 }
847849 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
848850 let redeemedBigInt = toBigInt(paymentAmount)
849851 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
850- let $t03773737793 = takeFee(amountRaw, outFee)
851- let totalAmount = $t03773737793._1
852- let feeAmount = $t03773737793._2
853- let $t03779738023 = if (outInAmountAsset)
852+ let $t03778637842 = takeFee(amountRaw, outFee)
853+ let totalAmount = $t03778637842._1
854+ let feeAmount = $t03778637842._2
855+ let $t03784638072 = if (outInAmountAsset)
854856 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
855857 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
856- let outAmAmount = $t03779738023._1
857- let outPrAmount = $t03779738023._2
858- let amBalanceNew = $t03779738023._3
859- let prBalanceNew = $t03779738023._4
858+ let outAmAmount = $t03784638072._1
859+ let outPrAmount = $t03784638072._2
860+ let amBalanceNew = $t03784638072._3
861+ let prBalanceNew = $t03784638072._4
860862 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
861863 let priceNew = fromX18(priceNewX18, scale8)
862864 let commonState = if (isEval)
921923
922924 @Callable(i)
923925 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
924- let $t03988140186 = if ((isReverse == false))
926+ let $t03993040235 = if ((isReverse == false))
925927 then {
926928 let assetOut = getStringOrFail(this, pa())
927929 let assetIn = getStringOrFail(this, aa())
932934 let assetIn = getStringOrFail(this, pa())
933935 $Tuple2(assetOut, assetIn)
934936 }
935- let assetOut = $t03988140186._1
936- let assetIn = $t03988140186._2
937+ let assetOut = $t03993040235._1
938+ let assetIn = $t03993040235._2
937939 let poolAssetInBalance = getAccBalance(assetIn)
938940 let poolAssetOutBalance = getAccBalance(assetOut)
939941 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
10771079 else throw("Strict value is not equal to itself.")
10781080 }
10791081 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1080- let $t04536245824 = refreshKLpInternal(0, 0, 0)
1081- if (($t04536245824 == $t04536245824))
1082+ let $t04541145873 = refreshKLpInternal(0, 0, 0)
1083+ if (($t04541145873 == $t04541145873))
10821084 then {
1083- let updatedKLp = $t04536245824._2
1084- let refreshKLpActions = $t04536245824._1
1085+ let updatedKLp = $t04541145873._2
1086+ let refreshKLpActions = $t04541145873._1
10851087 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10861088 if ((isUpdatedKLpValid == isUpdatedKLpValid))
10871089 then {
11181120 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
11191121 if ((currentKLp == currentKLp))
11201122 then {
1121- let $t04643646501 = refreshKLpInternal(0, 0, 0)
1122- let refreshKLpActions = $t04643646501._1
1123- let updatedKLp = $t04643646501._2
1123+ let $t04648546550 = refreshKLpInternal(0, 0, 0)
1124+ let refreshKLpActions = $t04648546550._1
1125+ let updatedKLp = $t04648546550._2
11241126 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11251127 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11261128 then (state ++ refreshKLpActions)
11691171 then {
11701172 let userAddress = i.caller
11711173 let txId = i.transactionId
1172- let $t04773047882 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1173- if (($t04773047882 == $t04773047882))
1174+ let $t04777947931 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1175+ if (($t04777947931 == $t04777947931))
11741176 then {
1175- let paymentInAmountAsset = $t04773047882._5
1176- let bonus = $t04773047882._4
1177- let feeAmount = $t04773047882._3
1178- let commonState = $t04773047882._2
1179- let emitAmountEstimated = $t04773047882._1
1177+ let paymentInAmountAsset = $t04777947931._5
1178+ let bonus = $t04777947931._4
1179+ let feeAmount = $t04777947931._3
1180+ let commonState = $t04777947931._2
1181+ let emitAmountEstimated = $t04777947931._1
11801182 let emitAmount = if (if ((minOutAmount > 0))
11811183 then (minOutAmount > emitAmountEstimated)
11821184 else false)
11961198 let sendFee = if ((feeAmount > 0))
11971199 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
11981200 else nil
1199- let $t04846848665 = if ((this == feeCollectorAddress))
1201+ let $t04851748714 = if ((this == feeCollectorAddress))
12001202 then $Tuple2(0, 0)
12011203 else if (paymentInAmountAsset)
12021204 then $Tuple2(-(feeAmount), 0)
12031205 else $Tuple2(0, -(feeAmount))
1204- let amountAssetBalanceDelta = $t04846848665._1
1205- let priceAssetBalanceDelta = $t04846848665._2
1206- let $t04866848776 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1207- let refreshKLpActions = $t04866848776._1
1208- let updatedKLp = $t04866848776._2
1206+ let amountAssetBalanceDelta = $t04851748714._1
1207+ let priceAssetBalanceDelta = $t04851748714._2
1208+ let $t04871748825 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1209+ let refreshKLpActions = $t04871748825._1
1210+ let updatedKLp = $t04871748825._2
12091211 let kLp = value(getString(keyKLp))
12101212 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12111213 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12301232
12311233 @Callable(i)
12321234 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
1233- let $t04913149288 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1234- let emitAmountEstimated = $t04913149288._1
1235- let commonState = $t04913149288._2
1236- let feeAmount = $t04913149288._3
1237- let bonus = $t04913149288._4
1238- let paymentInAmountAsset = $t04913149288._5
1235+ let $t04918049337 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1236+ let emitAmountEstimated = $t04918049337._1
1237+ let commonState = $t04918049337._2
1238+ let feeAmount = $t04918049337._3
1239+ let bonus = $t04918049337._4
1240+ let paymentInAmountAsset = $t04918049337._5
12391241 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
12401242 }
12411243
12741276 then {
12751277 let userAddress = i.caller
12761278 let txId = i.transactionId
1277- let $t05021050363 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1278- if (($t05021050363 == $t05021050363))
1279+ let $t05025950412 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1280+ if (($t05025950412 == $t05025950412))
12791281 then {
1280- let outInAmountAsset = $t05021050363._5
1281- let bonus = $t05021050363._4
1282- let feeAmount = $t05021050363._3
1283- let commonState = $t05021050363._2
1284- let amountEstimated = $t05021050363._1
1282+ let outInAmountAsset = $t05025950412._5
1283+ let bonus = $t05025950412._4
1284+ let feeAmount = $t05025950412._3
1285+ let commonState = $t05025950412._2
1286+ let amountEstimated = $t05025950412._1
12851287 let amount = if (if ((minOutAmount > 0))
12861288 then (minOutAmount > amountEstimated)
12871289 else false)
12951297 let sendFee = if ((feeAmount > 0))
12961298 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
12971299 else nil
1298- let $t05102751274 = {
1300+ let $t05107651323 = {
12991301 let feeAmountForCalc = if ((this == feeCollectorAddress))
13001302 then 0
13011303 else feeAmount
13031305 then $Tuple2(-((amount + feeAmountForCalc)), 0)
13041306 else $Tuple2(0, -((amount + feeAmountForCalc)))
13051307 }
1306- let amountAssetBalanceDelta = $t05102751274._1
1307- let priceAssetBalanceDelta = $t05102751274._2
1308- let $t05127751385 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1309- let refreshKLpActions = $t05127751385._1
1310- let updatedKLp = $t05127751385._2
1308+ let amountAssetBalanceDelta = $t05107651323._1
1309+ let priceAssetBalanceDelta = $t05107651323._2
1310+ let $t05132651434 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1311+ let refreshKLpActions = $t05132651434._1
1312+ let updatedKLp = $t05132651434._2
13111313 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13121314 if ((isUpdatedKLpValid == isUpdatedKLpValid))
13131315 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
13261328
13271329 @Callable(i)
13281330 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1329- let $t05166351819 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1330- let amountEstimated = $t05166351819._1
1331- let commonState = $t05166351819._2
1332- let feeAmount = $t05166351819._3
1333- let bonus = $t05166351819._4
1334- let outInAmountAsset = $t05166351819._5
1331+ let $t05171251868 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1332+ let amountEstimated = $t05171251868._1
1333+ let commonState = $t05171251868._2
1334+ let feeAmount = $t05171251868._3
1335+ let bonus = $t05171251868._4
1336+ let outInAmountAsset = $t05171251868._5
13351337 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
13361338 }
13371339
13701372 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13711373 if ((unstakeInv == unstakeInv))
13721374 then {
1373- let $t05276152912 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1374- if (($t05276152912 == $t05276152912))
1375+ let $t05281052961 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1376+ if (($t05281052961 == $t05281052961))
13751377 then {
1376- let outInAmountAsset = $t05276152912._5
1377- let bonus = $t05276152912._4
1378- let feeAmount = $t05276152912._3
1379- let commonState = $t05276152912._2
1380- let amountEstimated = $t05276152912._1
1378+ let outInAmountAsset = $t05281052961._5
1379+ let bonus = $t05281052961._4
1380+ let feeAmount = $t05281052961._3
1381+ let commonState = $t05281052961._2
1382+ let amountEstimated = $t05281052961._1
13811383 let amount = if (if ((minOutAmount > 0))
13821384 then (minOutAmount > amountEstimated)
13831385 else false)
13911393 let sendFee = if ((feeAmount > 0))
13921394 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
13931395 else nil
1394- let $t05357153818 = {
1396+ let $t05362053867 = {
13951397 let feeAmountForCalc = if ((this == feeCollectorAddress))
13961398 then 0
13971399 else feeAmount
13991401 then $Tuple2(-((amount + feeAmountForCalc)), 0)
14001402 else $Tuple2(0, -((amount + feeAmountForCalc)))
14011403 }
1402- let amountAssetBalanceDelta = $t05357153818._1
1403- let priceAssetBalanceDelta = $t05357153818._2
1404- let $t05382153929 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1405- let refreshKLpActions = $t05382153929._1
1406- let updatedKLp = $t05382153929._2
1404+ let amountAssetBalanceDelta = $t05362053867._1
1405+ let priceAssetBalanceDelta = $t05362053867._2
1406+ let $t05387053978 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1407+ let refreshKLpActions = $t05387053978._1
1408+ let updatedKLp = $t05387053978._2
14071409 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14081410 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14091411 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
14371439 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14381440 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14391441 then {
1440- let $t05502455105 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1441- let refreshKLpActions = $t05502455105._1
1442- let updatedKLp = $t05502455105._2
1442+ let $t05507355154 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1443+ let refreshKLpActions = $t05507355154._1
1444+ let updatedKLp = $t05507355154._2
14431445 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14441446 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14451447 then ((withdrawState ++ state) ++ refreshKLpActions)
14721474 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14731475 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14741476 then {
1475- let $t05620056281 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1476- let refreshKLpActions = $t05620056281._1
1477- let updatedKLp = $t05620056281._2
1477+ let $t05624956330 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1478+ let refreshKLpActions = $t05624956330._1
1479+ let updatedKLp = $t05624956330._2
14781480 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14791481 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14801482 then ((withdrawState ++ state) ++ refreshKLpActions)
15221524 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15231525 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15241526 then {
1525- let $t05762957710 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1526- let refreshKLpActions = $t05762957710._1
1527- let updatedKLp = $t05762957710._2
1527+ let $t05767857759 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1528+ let refreshKLpActions = $t05767857759._1
1529+ let updatedKLp = $t05767857759._2
15281530 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15291531 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15301532 then ((withdrawState ++ state) ++ refreshKLpActions)
15781580 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15791581 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15801582 then {
1581- let $t05918859269 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1582- let refreshKLpActions = $t05918859269._1
1583- let updatedKLp = $t05918859269._2
1583+ let $t05923759318 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1584+ let refreshKLpActions = $t05923759318._1
1585+ let updatedKLp = $t05923759318._2
15841586 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15851587 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15861588 then ((withdrawState ++ state) ++ refreshKLpActions)
16151617 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
16161618 then {
16171619 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1618- let $t06047360537 = refreshKLpInternal(0, 0, 0)
1619- let kLpUpdateActions = $t06047360537._1
1620- let updatedKLp = $t06047360537._2
1620+ let $t06052260586 = refreshKLpInternal(0, 0, 0)
1621+ let kLpUpdateActions = $t06052260586._1
1622+ let updatedKLp = $t06052260586._2
16211623 let actions = if ((kLp != updatedKLp))
16221624 then kLpUpdateActions
16231625 else throwErr("nothing to refresh")
17921794 match tx {
17931795 case order: Order =>
17941796 let matcherPub = getMatcherPubOrFail()
1795- let $t06919969316 = if (skipOrderValidation())
1797+ let $t06924869365 = if (skipOrderValidation())
17961798 then $Tuple2(true, "")
17971799 else validateMatcherOrderAllowed(order)
1798- let orderValid = $t06919969316._1
1799- let orderValidInfo = $t06919969316._2
1800+ let orderValid = $t06924869365._1
1801+ let orderValidInfo = $t06924869365._2
18001802 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
18011803 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
18021804 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) = {
402- let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
403- if ((currentAdditionalBalance == currentAdditionalBalance))
402+ let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
403+ if ((currentStakingAssetBalance == currentStakingAssetBalance))
404404 then {
405- let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
406- if ((currentStakingAssetBalance == currentStakingAssetBalance))
405+ let currentAdditionalBalance = if ((currentStakingAssetBalance != 0))
406+ then getAdditionalBalanceOrZero(assetId)
407+ else 0
408+ if ((currentAdditionalBalance == currentAdditionalBalance))
407409 then {
408410 let leasableTotalBalance = max([0, (getAccBalance(assetId) - minBalance)])
409411 let targetAdditionalBalance = fraction(targetRatio, leasableTotalBalance, 100)
410412 let diff = (currentAdditionalBalance - targetAdditionalBalance)
411413 if ((diff == 0))
412414 then nil
413415 else if ((0 > diff))
414416 then {
415417 let sendAssetAmount = -(diff)
416418 deposit(assetId, sendAssetAmount, stakingAssetId, proxy)
417419 }
418420 else {
419421 let getAssetAmount = diff
420422 withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul, profitAddress)
421423 }
422424 }
423425 else throw("Strict value is not equal to itself.")
424426 }
425427 else throw("Strict value is not equal to itself.")
426428 }
427429
428430
429431 func rebalanceAsset (assetId) = {
430- let $t01617116307 = getLeaseProxyConfig(assetId)
431- let isLeasable = $t01617116307._1
432- let leasedRatio = $t01617116307._2
433- let minBalance = $t01617116307._3
434- let proxyAddress = $t01617116307._4
435- let proxyAssetId = $t01617116307._5
436- let proxyRateMul = $t01617116307._6
437- let stakingProfitAddress = $t01617116307._7
432+ let $t01622016356 = getLeaseProxyConfig(assetId)
433+ let isLeasable = $t01622016356._1
434+ let leasedRatio = $t01622016356._2
435+ let minBalance = $t01622016356._3
436+ let proxyAddress = $t01622016356._4
437+ let proxyAssetId = $t01622016356._5
438+ let proxyRateMul = $t01622016356._6
439+ let stakingProfitAddress = $t01622016356._7
438440 if (isLeasable)
439441 then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
440442 else nil
441443 }
442444
443445
444446 func withdrawAndRebalanceAsset (assetId,getAmount) = {
445- let $t01670616842 = getLeaseProxyConfig(assetId)
446- let isLeasable = $t01670616842._1
447- let leasedRatio = $t01670616842._2
448- let minBalance = $t01670616842._3
449- let proxyAddress = $t01670616842._4
450- let proxyAssetId = $t01670616842._5
451- let proxyRateMul = $t01670616842._6
452- let stakingProfitAddress = $t01670616842._7
447+ let $t01675516891 = getLeaseProxyConfig(assetId)
448+ let isLeasable = $t01675516891._1
449+ let leasedRatio = $t01675516891._2
450+ let minBalance = $t01675516891._3
451+ let proxyAddress = $t01675516891._4
452+ let proxyAssetId = $t01675516891._5
453+ let proxyRateMul = $t01675516891._6
454+ let stakingProfitAddress = $t01675516891._7
453455 if (isLeasable)
454456 then {
455457 let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
456458 if ((newTotalLeasableBalance == newTotalLeasableBalance))
457459 then {
458460 let newAdditionalBalance = fraction(leasedRatio, newTotalLeasableBalance, 100)
459461 if ((newAdditionalBalance == newAdditionalBalance))
460462 then {
461463 let withdrawAmount = (getAdditionalBalanceOrZero(assetId) - newAdditionalBalance)
462464 if ((withdrawAmount == withdrawAmount))
463465 then if ((0 > withdrawAmount))
464466 then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
465467 else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
466468 else throw("Strict value is not equal to itself.")
467469 }
468470 else throw("Strict value is not equal to itself.")
469471 }
470472 else throw("Strict value is not equal to itself.")
471473 }
472474 else nil
473475 }
474476
475477
476478 func withdrawAndRebalanceAll (amountAssetOutAmount,priceAssetOutAmount) = {
477479 let AmAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, aa()), amountAssetOutAmount)
478480 let PrAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, pa()), priceAssetOutAmount)
479481 (AmAmtWithdrawState ++ PrAmtWithdrawState)
480482 }
481483
482484
483485 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
484486 let amtAssetAmtX18 = toX18(amAmt, amAssetDcm)
485487 let priceAssetAmtX18 = toX18(prAmt, prAssetDcm)
486488 calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
487489 }
488490
489491
490492 func calcPrices (amAmt,prAmt,lpAmt) = {
491493 let cfg = getPoolConfig()
492494 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
493495 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
494496 let priceX18 = privateCalcPrice(amtAssetDcm, priceAssetDcm, amAmt, prAmt)
495497 let amAmtX18 = toX18(amAmt, amtAssetDcm)
496498 let prAmtX18 = toX18(prAmt, priceAssetDcm)
497499 let lpAmtX18 = toX18(lpAmt, scale8)
498500 let lpPriceInAmAssetX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
499501 let lpPriceInPrAssetX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
500502 [priceX18, lpPriceInAmAssetX18, lpPriceInPrAssetX18]
501503 }
502504
503505
504506 func calculatePrices (amAmt,prAmt,lpAmt) = {
505507 let prices = calcPrices(amAmt, prAmt, lpAmt)
506508 [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)]
507509 }
508510
509511
510512 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
511513 let cfg = getPoolConfig()
512514 let lpAssetId = cfg[idxPoolLPAssetId]
513515 let amAssetId = cfg[idxAmtAssetId]
514516 let prAssetId = cfg[idxPriceAssetId]
515517 let amAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
516518 let prAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
517519 let poolStatus = cfg[idxPoolStatus]
518520 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), (("Asset " + lpAssetId) + " doesn't exist")).quantity
519521 if ((lpAssetId != pmtAssetId))
520522 then throw("Invalid asset passed.")
521523 else {
522524 let amBalance = getAccBalance(amAssetId)
523525 let amBalanceX18 = toX18(amBalance, amAssetDcm)
524526 let prBalance = getAccBalance(prAssetId)
525527 let prBalanceX18 = toX18(prBalance, prAssetDcm)
526528 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
527529 let curPrice = fromX18(curPriceX18, scale8)
528530 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
529531 let lpEmissionX18 = toX18(lpEmission, scale8)
530532 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
531533 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
532534 let outAmAmt = fromX18Round(outAmAmtX18, amAssetDcm, FLOOR)
533535 let outPrAmt = fromX18Round(outPrAmtX18, prAssetDcm, FLOOR)
534536 let state = if ((txId58 == ""))
535537 then nil
536538 else [ScriptTransfer(userAddress, outAmAmt, if ((amAssetId == "WAVES"))
537539 then unit
538540 else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES"))
539541 then unit
540542 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)]
541543 $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
542544 }
543545 }
544546
545547
546548 func estimatePutOperation (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = {
547549 let cfg = getPoolConfig()
548550 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
549551 let amAssetIdStr = cfg[idxAmtAssetId]
550552 let prAssetIdStr = cfg[idxPriceAssetId]
551553 let iAmtAssetId = cfg[idxIAmtAssetId]
552554 let iPriceAssetId = cfg[idxIPriceAssetId]
553555 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
554556 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
555557 let poolStatus = cfg[idxPoolStatus]
556558 let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
557559 let inAmAssetIdStr = toBase58String(valueOrElse(inAmAssetId, fromBase58String("WAVES")))
558560 let inPrAssetIdStr = toBase58String(valueOrElse(inPrAssetId, fromBase58String("WAVES")))
559561 if (if ((amAssetIdStr != inAmAssetIdStr))
560562 then true
561563 else (prAssetIdStr != inPrAssetIdStr))
562564 then throw("Invalid amt or price asset passed.")
563565 else {
564566 let amBalance = if (isEvaluate)
565567 then getAccBalance(amAssetIdStr)
566568 else (getAccBalance(amAssetIdStr) - inAmAssetAmt)
567569 let prBalance = if (isEvaluate)
568570 then getAccBalance(prAssetIdStr)
569571 else (getAccBalance(prAssetIdStr) - inPrAssetAmt)
570572 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
571573 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
572574 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
573575 let amBalanceX18 = toX18(amBalance, amtAssetDcm)
574576 let prBalanceX18 = toX18(prBalance, priceAssetDcm)
575577 let res = if ((lpEmission == 0))
576578 then {
577579 let curPriceX18 = zeroBigInt
578580 let slippageX18 = zeroBigInt
579581 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
580582 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtAssetDcm), fromX18(inPrAssetAmtX18, priceAssetDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
581583 }
582584 else {
583585 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
584586 let slippageX18 = fraction(absBigInt((curPriceX18 - userPriceX18)), scale18, curPriceX18)
585587 let slippageToleranceX18 = toX18(slippageTolerance, scale8)
586588 if (if ((curPriceX18 != zeroBigInt))
587589 then (slippageX18 > slippageToleranceX18)
588590 else false)
589591 then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18)))
590592 else {
591593 let lpEmissionX18 = toX18(lpEmission, scale8)
592594 let prViaAmX18 = fraction(inAmAssetAmtX18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
593595 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, FLOOR), CEILING)
594596 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
595597 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
596598 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
597599 let expAmtAssetAmtX18 = expectedAmts._1
598600 let expPriceAssetAmtX18 = expectedAmts._2
599601 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
600602 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtAssetDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceAssetDcm, CEILING), curPriceX18, slippageX18)
601603 }
602604 }
603605 let calcLpAmt = res._1
604606 let calcAmAssetPmt = res._2
605607 let calcPrAssetPmt = res._3
606608 let curPrice = fromX18(res._4, scale8)
607609 let slippageCalc = fromX18(res._5, scale8)
608610 if ((0 >= calcLpAmt))
609611 then throw("Invalid calculations. LP calculated is less than zero.")
610612 else {
611613 let emitLpAmt = if (!(emitLp))
612614 then 0
613615 else calcLpAmt
614616 let amDiff = (inAmAssetAmt - calcAmAssetPmt)
615617 let prDiff = (inPrAssetAmt - calcPrAssetPmt)
616618 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))]
617619 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId)
618620 }
619621 }
620622 }
621623
622624
623625 func calcKLp (amountBalance,priceBalance,lpEmission) = {
624626 let amountBalanceX18 = toX18BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals))
625627 let priceBalanceX18 = toX18BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))
626628 let updatedKLp = fraction(pow((amountBalanceX18 * priceBalanceX18), 0, toBigInt(5), 1, 18, DOWN), big1, lpEmission)
627629 if ((lpEmission == big0))
628630 then big0
629631 else updatedKLp
630632 }
631633
632634
633635 func calcCurrentKLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
634636 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
635637 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
636638 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
637639 let currentKLp = calcKLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
638640 currentKLp
639641 }
640642
641643
642644 func refreshKLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
643645 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
644646 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
645647 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
646648 let updatedKLp = calcKLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
647649 let actions = [IntegerEntry(keyKLpRefreshedHeight, height), StringEntry(keyKLp, toString(updatedKLp))]
648650 $Tuple2(actions, updatedKLp)
649651 }
650652
651653
652654 func skipOrderValidation () = valueOrElse(getBoolean(factoryContract, keySkipOrderValidation(toString(this))), false)
653655
654656
655657 func validateUpdatedKLp (oldKLp,updatedKLp) = if ((updatedKLp >= oldKLp))
656658 then true
657659 else throwErr(makeString(["updated KLp lower than current KLp", toString(oldKLp), toString(updatedKLp)], " "))
658660
659661
660662 func validateMatcherOrderAllowed (order) = {
661663 let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
662664 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
663665 let amountAssetAmount = order.amount
664666 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
665- let $t02923129443 = if ((order.orderType == Buy))
667+ let $t02928029492 = if ((order.orderType == Buy))
666668 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
667669 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
668- let amountAssetBalanceDelta = $t02923129443._1
669- let priceAssetBalanceDelta = $t02923129443._2
670+ let amountAssetBalanceDelta = $t02928029492._1
671+ let priceAssetBalanceDelta = $t02928029492._2
670672 if (if (if (isGlobalShutdown())
671673 then true
672674 else (cfgPoolStatus == PoolMatcherDisabled))
673675 then true
674676 else (cfgPoolStatus == PoolShutdown))
675677 then throw("Exchange operations disabled")
676678 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
677679 then true
678680 else (order.assetPair.priceAsset != cfgPriceAssetId))
679681 then throw("Wrong order assets.")
680682 else {
681683 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
682- let $t02988329983 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
683- let unusedActions = $t02988329983._1
684- let kLpNew = $t02988329983._2
684+ let $t02993230032 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
685+ let unusedActions = $t02993230032._1
686+ let kLpNew = $t02993230032._2
685687 let isOrderValid = (kLpNew >= kLp)
686688 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
687689 $Tuple2(isOrderValid, info)
688690 }
689691 }
690692
691693
692694 func commonGet (i) = if ((size(i.payments) != 1))
693695 then throw("exactly 1 payment is expected")
694696 else {
695697 let pmt = value(i.payments[0])
696698 let pmtAssetId = value(pmt.assetId)
697699 let pmtAmt = pmt.amount
698700 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
699701 let outAmAmt = res._1
700702 let outPrAmt = res._2
701703 let state = res._10
702704 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
703705 then if (isGlobalShutdown())
704706 then true
705707 else (cfgPoolStatus == PoolShutdown)
706708 else false
707709 if (isGetDisabled)
708710 then throw(("Get operation is blocked by admin. Status = " + toString(cfgPoolStatus)))
709711 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
710712 }
711713
712714
713715 func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2))
714716 then throw("exactly 2 payments are expected")
715717 else {
716718 let amAssetPmt = value(i.payments[0])
717719 let prAssetPmt = value(i.payments[1])
718720 let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp)
719721 let isPutDisabled = if (!(isAddressWhitelisted(i.caller)))
720722 then if (if (isGlobalShutdown())
721723 then true
722724 else (cfgPoolStatus == PoolPutDisabled))
723725 then true
724726 else (cfgPoolStatus == PoolShutdown)
725727 else false
726728 if (isPutDisabled)
727729 then throw(("Put operation is blocked by admin. Status = " + toString(cfgPoolStatus)))
728730 else estPut
729731 }
730732
731733
732734 func emit (amount) = {
733735 let emitInv = invoke(factoryContract, "emit", [amount], nil)
734736 if ((emitInv == emitInv))
735737 then {
736738 let emitInvLegacy = match emitInv {
737739 case legacyFactoryContract: Address =>
738740 invoke(legacyFactoryContract, "emit", [amount], nil)
739741 case _ =>
740742 unit
741743 }
742744 if ((emitInvLegacy == emitInvLegacy))
743745 then amount
744746 else throw("Strict value is not equal to itself.")
745747 }
746748 else throw("Strict value is not equal to itself.")
747749 }
748750
749751
750752 func takeFee (amount,fee) = {
751753 let feeAmount = if ((fee == 0))
752754 then 0
753755 else fraction(amount, fee, scale8)
754756 $Tuple2((amount - feeAmount), feeAmount)
755757 }
756758
757759
758760 func calcPutOneToken (paymentAmountRaw,paymentAssetId,userAddress,txId) = {
759761 let isEval = (txId == unit)
760762 let amountBalanceRaw = getAccBalance(assetIdToString(cfgAmountAssetId))
761763 let priceBalanceRaw = getAccBalance(assetIdToString(cfgPriceAssetId))
762764 let paymentInAmountAsset = if ((paymentAssetId == cfgAmountAssetId))
763765 then true
764766 else if ((paymentAssetId == cfgPriceAssetId))
765767 then false
766768 else throwErr("invalid asset")
767- let $t03316933462 = if (isEval)
769+ let $t03321833511 = if (isEval)
768770 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
769771 else if (paymentInAmountAsset)
770772 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
771773 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
772- let amountBalanceOld = $t03316933462._1
773- let priceBalanceOld = $t03316933462._2
774- let $t03346633615 = if (paymentInAmountAsset)
774+ let amountBalanceOld = $t03321833511._1
775+ let priceBalanceOld = $t03321833511._2
776+ let $t03351533664 = if (paymentInAmountAsset)
775777 then $Tuple2(paymentAmountRaw, 0)
776778 else $Tuple2(0, paymentAmountRaw)
777- let amountAssetAmountRaw = $t03346633615._1
778- let priceAssetAmountRaw = $t03346633615._2
779+ let amountAssetAmountRaw = $t03351533664._1
780+ let priceAssetAmountRaw = $t03351533664._2
779781 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
780782 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
781- let $t03374733811 = takeFee(paymentAmountRaw, inFee)
782- let paymentAmount = $t03374733811._1
783- let feeAmount = $t03374733811._2
783+ let $t03379633860 = takeFee(paymentAmountRaw, inFee)
784+ let paymentAmount = $t03379633860._1
785+ let feeAmount = $t03379633860._2
784786 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
785787 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
786788 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
787789 let priceNew = fromX18(priceNewX18, scale8)
788790 let paymentBalance = if (paymentInAmountAsset)
789791 then amountBalanceOld
790792 else priceBalanceOld
791793 let paymentBalanceBigInt = toBigInt(paymentBalance)
792794 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
793795 let chechSupply = if ((supplyBigInt > big0))
794796 then true
795797 else throwErr("initial deposit requires all coins")
796798 if ((chechSupply == chechSupply))
797799 then {
798800 let depositBigInt = toBigInt(paymentAmount)
799801 let issueAmount = max([0, toInt(((supplyBigInt * (sqrtBigInt((scale18 + ((depositBigInt * scale18) / paymentBalanceBigInt)), 18, 18, DOWN) - scale18)) / scale18))])
800802 let commonState = if (isEval)
801803 then nil
802804 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))]
803805 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
804806 let priceOld = fromX18(priceOldX18, scale8)
805807 let loss = {
806- let $t03549235659 = if (paymentInAmountAsset)
808+ let $t03554135708 = if (paymentInAmountAsset)
807809 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
808810 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
809- let amount = $t03549235659._1
810- let balance = $t03549235659._2
811+ let amount = $t03554135708._1
812+ let balance = $t03554135708._2
811813 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
812814 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
813815 }
814816 $Tuple5(issueAmount, commonState, feeAmount, loss, paymentInAmountAsset)
815817 }
816818 else throw("Strict value is not equal to itself.")
817819 }
818820
819821
820822 func calcGetOneToken (outAssetId,paymentAmount,paymentAssetId,userAddress,txId) = {
821823 let isEval = (txId == unit)
822824 let cfg = getPoolConfig()
823825 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
824826 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
825827 let checks = [if ((paymentAssetId == cfgLpAssetId))
826828 then true
827829 else throwErr("invalid lp asset")]
828830 if ((checks == checks))
829831 then {
830832 let outInAmountAsset = if ((outAssetId == cfgAmountAssetId))
831833 then true
832834 else if ((outAssetId == cfgPriceAssetId))
833835 then false
834836 else throwErr("invalid asset")
835837 let balanceBigInt = if (outInAmountAsset)
836838 then toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId)))
837839 else toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId)))
838840 let outInAmountAssetDecimals = if (outInAmountAsset)
839841 then amtAssetDcm
840842 else priceAssetDcm
841843 let amBalanceOld = getAccBalance(assetIdToString(cfgAmountAssetId))
842844 let prBalanceOld = getAccBalance(assetIdToString(cfgPriceAssetId))
843845 let outBalance = if (outInAmountAsset)
844846 then amBalanceOld
845847 else prBalanceOld
846848 let outBalanceBigInt = toBigInt(outBalance)
847849 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
848850 let redeemedBigInt = toBigInt(paymentAmount)
849851 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
850- let $t03773737793 = takeFee(amountRaw, outFee)
851- let totalAmount = $t03773737793._1
852- let feeAmount = $t03773737793._2
853- let $t03779738023 = if (outInAmountAsset)
852+ let $t03778637842 = takeFee(amountRaw, outFee)
853+ let totalAmount = $t03778637842._1
854+ let feeAmount = $t03778637842._2
855+ let $t03784638072 = if (outInAmountAsset)
854856 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
855857 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
856- let outAmAmount = $t03779738023._1
857- let outPrAmount = $t03779738023._2
858- let amBalanceNew = $t03779738023._3
859- let prBalanceNew = $t03779738023._4
858+ let outAmAmount = $t03784638072._1
859+ let outPrAmount = $t03784638072._2
860+ let amBalanceNew = $t03784638072._3
861+ let prBalanceNew = $t03784638072._4
860862 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
861863 let priceNew = fromX18(priceNewX18, scale8)
862864 let commonState = if (isEval)
863865 then nil
864866 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)]
865867 let priceOldX18 = calcPriceBigInt(toX18(prBalanceOld, cfgPriceAssetDecimals), toX18(amBalanceOld, cfgAmountAssetDecimals))
866868 let priceOld = fromX18(priceOldX18, scale8)
867869 let loss = {
868870 let amountBothInPaymentAsset = (toInt(fraction(balanceBigInt, redeemedBigInt, supplyBigInt)) * 2)
869871 fraction((totalAmount - amountBothInPaymentAsset), scale8, amountBothInPaymentAsset)
870872 }
871873 $Tuple5(totalAmount, commonState, feeAmount, loss, outInAmountAsset)
872874 }
873875 else throw("Strict value is not equal to itself.")
874876 }
875877
876878
877879 func managerPublicKeyOrUnit () = {
878880 let managerVaultAddress = getManagerVaultAddressOrThis()
879881 match getString(managerVaultAddress, keyManagerPublicKey()) {
880882 case s: String =>
881883 fromBase58String(s)
882884 case _: Unit =>
883885 unit
884886 case _ =>
885887 throw("Match error")
886888 }
887889 }
888890
889891
890892 func isManager (i) = match managerPublicKeyOrUnit() {
891893 case pk: ByteVector =>
892894 (i.callerPublicKey == pk)
893895 case _: Unit =>
894896 (i.caller == this)
895897 case _ =>
896898 throw("Match error")
897899 }
898900
899901
900902 func mustManager (i) = {
901903 let pd = throw("Permission denied")
902904 match managerPublicKeyOrUnit() {
903905 case pk: ByteVector =>
904906 if ((i.callerPublicKey == pk))
905907 then true
906908 else pd
907909 case _: Unit =>
908910 if ((i.caller == this))
909911 then true
910912 else pd
911913 case _ =>
912914 throw("Match error")
913915 }
914916 }
915917
916918
917919 @Callable(i)
918920 func rebalance () = (rebalanceAsset(getStringOrFail(this, aa())) ++ rebalanceAsset(getStringOrFail(this, pa())))
919921
920922
921923
922924 @Callable(i)
923925 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
924- let $t03988140186 = if ((isReverse == false))
926+ let $t03993040235 = if ((isReverse == false))
925927 then {
926928 let assetOut = getStringOrFail(this, pa())
927929 let assetIn = getStringOrFail(this, aa())
928930 $Tuple2(assetOut, assetIn)
929931 }
930932 else {
931933 let assetOut = getStringOrFail(this, aa())
932934 let assetIn = getStringOrFail(this, pa())
933935 $Tuple2(assetOut, assetIn)
934936 }
935- let assetOut = $t03988140186._1
936- let assetIn = $t03988140186._2
937+ let assetOut = $t03993040235._1
938+ let assetIn = $t03993040235._2
937939 let poolAssetInBalance = getAccBalance(assetIn)
938940 let poolAssetOutBalance = getAccBalance(assetOut)
939941 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
940942 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
941943 let newK = (((toBigInt(getAccBalance(assetIn)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
942944 let checkK = if ((newK >= oldK))
943945 then true
944946 else throw("new K is fewer error")
945947 if ((checkK == checkK))
946948 then $Tuple2(nil, amountOut)
947949 else throw("Strict value is not equal to itself.")
948950 }
949951
950952
951953
952954 @Callable(i)
953955 func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo,feePoolAmount) = {
954956 let swapContact = {
955957 let @ = invoke(factoryContract, "getSwapContractREADONLY", nil, nil)
956958 if ($isInstanceOf(@, "String"))
957959 then @
958960 else throw(($getType(@) + " couldn't be cast to String"))
959961 }
960962 let isPoolSwapDisabled = {
961963 let @ = invoke(factoryContract, "isPoolSwapDisabledREADONLY", [toString(this)], nil)
962964 if ($isInstanceOf(@, "Boolean"))
963965 then @
964966 else throw(($getType(@) + " couldn't be cast to Boolean"))
965967 }
966968 let isSwapDisabled = if (!(isAddressWhitelisted(i.caller)))
967969 then if (if (isGlobalShutdown())
968970 then true
969971 else (cfgPoolStatus == PoolShutdown))
970972 then true
971973 else isPoolSwapDisabled
972974 else false
973975 let checks = [if (if (!(isSwapDisabled))
974976 then true
975977 else isManager(i))
976978 then true
977979 else throwErr("swap operation is blocked by admin"), if ((value(i.payments[0]).amount >= cleanAmountIn))
978980 then true
979981 else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(swapContact)))
980982 then true
981983 else throwErr("Permission denied")]
982984 if ((checks == checks))
983985 then {
984986 let pmt = value(i.payments[0])
985987 let assetIn = assetIdToString(pmt.assetId)
986988 let assetOut = if ((isReverse == false))
987989 then getStringOrFail(this, pa())
988990 else getStringOrFail(this, aa())
989991 let poolAssetInBalance = ((getAccBalance(assetIn) - value(i.payments[0]).amount) - feePoolAmount)
990992 let poolAssetOutBalance = getAccBalance(assetOut)
991993 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
992994 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
993995 let newK = ((toBigInt(getAccBalance(assetIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
994996 let checkK = if ((newK >= oldK))
995997 then true
996998 else throw("new K is fewer error")
997999 if ((checkK == checkK))
9981000 then {
9991001 let checkMin = if ((amountOut >= amountOutMin))
10001002 then true
10011003 else throw("Exchange result is fewer coins than expected")
10021004 if ((checkMin == checkMin))
10031005 then {
10041006 let amountAssetBalanceDelta = if (isReverse)
10051007 then -(amountOut)
10061008 else feePoolAmount
10071009 let priceAssetBalanceDelta = if (isReverse)
10081010 then feePoolAmount
10091011 else -(amountOut)
10101012 let refreshKLpActions = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)._1
10111013 if ((refreshKLpActions == refreshKLpActions))
10121014 then {
10131015 let rebalanceState = rebalanceAsset(assetIn)
10141016 if ((rebalanceState == rebalanceState))
10151017 then {
10161018 let withdrawState = withdrawAndRebalanceAsset(assetOut, amountOut)
10171019 if ((withdrawState == withdrawState))
10181020 then $Tuple2(((withdrawState ++ rebalanceState) ++ [ScriptTransfer(addressFromStringValue(addressTo), amountOut, parseAssetId(assetOut))]), amountOut)
10191021 else throw("Strict value is not equal to itself.")
10201022 }
10211023 else throw("Strict value is not equal to itself.")
10221024 }
10231025 else throw("Strict value is not equal to itself.")
10241026 }
10251027 else throw("Strict value is not equal to itself.")
10261028 }
10271029 else throw("Strict value is not equal to itself.")
10281030 }
10291031 else throw("Strict value is not equal to itself.")
10301032 }
10311033
10321034
10331035
10341036 @Callable(i)
10351037 func put (slippageTolerance,shouldAutoStake) = if ((0 > slippageTolerance))
10361038 then throw("Invalid slippageTolerance passed")
10371039 else {
10381040 let estPut = commonPut(i, slippageTolerance, true)
10391041 let emitLpAmt = estPut._2
10401042 let lpAssetId = estPut._7
10411043 let state = estPut._9
10421044 let amDiff = estPut._10
10431045 let prDiff = estPut._11
10441046 let amId = estPut._12
10451047 let prId = estPut._13
10461048 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
10471049 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
10481050 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
10491051 if ((currentKLp == currentKLp))
10501052 then {
10511053 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
10521054 if ((emitInv == emitInv))
10531055 then {
10541056 let emitInvLegacy = match emitInv {
10551057 case legacyFactoryContract: Address =>
10561058 invoke(legacyFactoryContract, "emit", [emitLpAmt], nil)
10571059 case _ =>
10581060 unit
10591061 }
10601062 if ((emitInvLegacy == emitInvLegacy))
10611063 then {
10621064 let slippageAInv = if ((amDiff > 0))
10631065 then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
10641066 else nil
10651067 if ((slippageAInv == slippageAInv))
10661068 then {
10671069 let slippagePInv = if ((prDiff > 0))
10681070 then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
10691071 else nil
10701072 if ((slippagePInv == slippagePInv))
10711073 then {
10721074 let lpTransfer = if (shouldAutoStake)
10731075 then {
10741076 let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
10751077 if ((slpStakeInv == slpStakeInv))
10761078 then nil
10771079 else throw("Strict value is not equal to itself.")
10781080 }
10791081 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1080- let $t04536245824 = refreshKLpInternal(0, 0, 0)
1081- if (($t04536245824 == $t04536245824))
1082+ let $t04541145873 = refreshKLpInternal(0, 0, 0)
1083+ if (($t04541145873 == $t04541145873))
10821084 then {
1083- let updatedKLp = $t04536245824._2
1084- let refreshKLpActions = $t04536245824._1
1085+ let updatedKLp = $t04541145873._2
1086+ let refreshKLpActions = $t04541145873._1
10851087 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10861088 if ((isUpdatedKLpValid == isUpdatedKLpValid))
10871089 then {
10881090 let reb = invoke(this, "rebalance", nil, nil)
10891091 if ((reb == reb))
10901092 then ((state ++ lpTransfer) ++ refreshKLpActions)
10911093 else throw("Strict value is not equal to itself.")
10921094 }
10931095 else throw("Strict value is not equal to itself.")
10941096 }
10951097 else throw("Strict value is not equal to itself.")
10961098 }
10971099 else throw("Strict value is not equal to itself.")
10981100 }
10991101 else throw("Strict value is not equal to itself.")
11001102 }
11011103 else throw("Strict value is not equal to itself.")
11021104 }
11031105 else throw("Strict value is not equal to itself.")
11041106 }
11051107 else throw("Strict value is not equal to itself.")
11061108 }
11071109
11081110
11091111
11101112 @Callable(i)
11111113 func putForFree (maxSlippage) = if ((0 > maxSlippage))
11121114 then throw("Invalid value passed")
11131115 else {
11141116 let estPut = commonPut(i, maxSlippage, false)
11151117 let state = estPut._9
11161118 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11171119 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11181120 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
11191121 if ((currentKLp == currentKLp))
11201122 then {
1121- let $t04643646501 = refreshKLpInternal(0, 0, 0)
1122- let refreshKLpActions = $t04643646501._1
1123- let updatedKLp = $t04643646501._2
1123+ let $t04648546550 = refreshKLpInternal(0, 0, 0)
1124+ let refreshKLpActions = $t04648546550._1
1125+ let updatedKLp = $t04648546550._2
11241126 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11251127 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11261128 then (state ++ refreshKLpActions)
11271129 else throw("Strict value is not equal to itself.")
11281130 }
11291131 else throw("Strict value is not equal to itself.")
11301132 }
11311133
11321134
11331135
11341136 @Callable(i)
11351137 func putOneTkn (minOutAmount,autoStake) = {
11361138 let isPoolOneTokenOperationsDisabled = {
11371139 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11381140 if ($isInstanceOf(@, "Boolean"))
11391141 then @
11401142 else throw(($getType(@) + " couldn't be cast to Boolean"))
11411143 }
11421144 let isPutDisabled = if (!(isAddressWhitelisted(i.caller)))
11431145 then if (if (if (isGlobalShutdown())
11441146 then true
11451147 else (cfgPoolStatus == PoolPutDisabled))
11461148 then true
11471149 else (cfgPoolStatus == PoolShutdown))
11481150 then true
11491151 else isPoolOneTokenOperationsDisabled
11501152 else false
11511153 let checks = [if (if (!(isPutDisabled))
11521154 then true
11531155 else isManager(i))
11541156 then true
11551157 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
11561158 then true
11571159 else throwErr("exactly 1 payment are expected")]
11581160 if ((checks == checks))
11591161 then {
11601162 let payment = i.payments[0]
11611163 let paymentAssetId = payment.assetId
11621164 let paymentAmountRaw = payment.amount
11631165 let currentKLp = if ((paymentAssetId == cfgAmountAssetId))
11641166 then calcCurrentKLp(toBigInt(paymentAmountRaw), toBigInt(0), toBigInt(0))
11651167 else if ((paymentAssetId == cfgPriceAssetId))
11661168 then calcCurrentKLp(toBigInt(0), toBigInt(paymentAmountRaw), toBigInt(0))
11671169 else throwErr("payment asset is not supported")
11681170 if ((currentKLp == currentKLp))
11691171 then {
11701172 let userAddress = i.caller
11711173 let txId = i.transactionId
1172- let $t04773047882 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1173- if (($t04773047882 == $t04773047882))
1174+ let $t04777947931 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1175+ if (($t04777947931 == $t04777947931))
11741176 then {
1175- let paymentInAmountAsset = $t04773047882._5
1176- let bonus = $t04773047882._4
1177- let feeAmount = $t04773047882._3
1178- let commonState = $t04773047882._2
1179- let emitAmountEstimated = $t04773047882._1
1177+ let paymentInAmountAsset = $t04777947931._5
1178+ let bonus = $t04777947931._4
1179+ let feeAmount = $t04777947931._3
1180+ let commonState = $t04777947931._2
1181+ let emitAmountEstimated = $t04777947931._1
11801182 let emitAmount = if (if ((minOutAmount > 0))
11811183 then (minOutAmount > emitAmountEstimated)
11821184 else false)
11831185 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
11841186 else emitAmountEstimated
11851187 let emitInv = emit(emitAmount)
11861188 if ((emitInv == emitInv))
11871189 then {
11881190 let lpTransfer = if (autoStake)
11891191 then {
11901192 let stakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(cfgLpAssetId, emitAmount)])
11911193 if ((stakeInv == stakeInv))
11921194 then nil
11931195 else throw("Strict value is not equal to itself.")
11941196 }
11951197 else [ScriptTransfer(i.caller, emitAmount, cfgLpAssetId)]
11961198 let sendFee = if ((feeAmount > 0))
11971199 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
11981200 else nil
1199- let $t04846848665 = if ((this == feeCollectorAddress))
1201+ let $t04851748714 = if ((this == feeCollectorAddress))
12001202 then $Tuple2(0, 0)
12011203 else if (paymentInAmountAsset)
12021204 then $Tuple2(-(feeAmount), 0)
12031205 else $Tuple2(0, -(feeAmount))
1204- let amountAssetBalanceDelta = $t04846848665._1
1205- let priceAssetBalanceDelta = $t04846848665._2
1206- let $t04866848776 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1207- let refreshKLpActions = $t04866848776._1
1208- let updatedKLp = $t04866848776._2
1206+ let amountAssetBalanceDelta = $t04851748714._1
1207+ let priceAssetBalanceDelta = $t04851748714._2
1208+ let $t04871748825 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1209+ let refreshKLpActions = $t04871748825._1
1210+ let updatedKLp = $t04871748825._2
12091211 let kLp = value(getString(keyKLp))
12101212 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12111213 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12121214 then {
12131215 let reb = invoke(this, "rebalance", nil, nil)
12141216 if ((reb == reb))
12151217 then $Tuple2((((commonState ++ lpTransfer) ++ sendFee) ++ refreshKLpActions), emitAmount)
12161218 else throw("Strict value is not equal to itself.")
12171219 }
12181220 else throw("Strict value is not equal to itself.")
12191221 }
12201222 else throw("Strict value is not equal to itself.")
12211223 }
12221224 else throw("Strict value is not equal to itself.")
12231225 }
12241226 else throw("Strict value is not equal to itself.")
12251227 }
12261228 else throw("Strict value is not equal to itself.")
12271229 }
12281230
12291231
12301232
12311233 @Callable(i)
12321234 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
1233- let $t04913149288 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1234- let emitAmountEstimated = $t04913149288._1
1235- let commonState = $t04913149288._2
1236- let feeAmount = $t04913149288._3
1237- let bonus = $t04913149288._4
1238- let paymentInAmountAsset = $t04913149288._5
1235+ let $t04918049337 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1236+ let emitAmountEstimated = $t04918049337._1
1237+ let commonState = $t04918049337._2
1238+ let feeAmount = $t04918049337._3
1239+ let bonus = $t04918049337._4
1240+ let paymentInAmountAsset = $t04918049337._5
12391241 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
12401242 }
12411243
12421244
12431245
12441246 @Callable(i)
12451247 func getOneTkn (outAssetIdStr,minOutAmount) = {
12461248 let isPoolOneTokenOperationsDisabled = {
12471249 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12481250 if ($isInstanceOf(@, "Boolean"))
12491251 then @
12501252 else throw(($getType(@) + " couldn't be cast to Boolean"))
12511253 }
12521254 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
12531255 then if (if (isGlobalShutdown())
12541256 then true
12551257 else (cfgPoolStatus == PoolShutdown))
12561258 then true
12571259 else isPoolOneTokenOperationsDisabled
12581260 else false
12591261 let checks = [if (if (!(isGetDisabled))
12601262 then true
12611263 else isManager(i))
12621264 then true
12631265 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
12641266 then true
12651267 else throwErr("exactly 1 payment are expected")]
12661268 if ((checks == checks))
12671269 then {
12681270 let outAssetId = parseAssetId(outAssetIdStr)
12691271 let payment = i.payments[0]
12701272 let paymentAssetId = payment.assetId
12711273 let paymentAmount = payment.amount
12721274 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
12731275 if ((currentKLp == currentKLp))
12741276 then {
12751277 let userAddress = i.caller
12761278 let txId = i.transactionId
1277- let $t05021050363 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1278- if (($t05021050363 == $t05021050363))
1279+ let $t05025950412 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1280+ if (($t05025950412 == $t05025950412))
12791281 then {
1280- let outInAmountAsset = $t05021050363._5
1281- let bonus = $t05021050363._4
1282- let feeAmount = $t05021050363._3
1283- let commonState = $t05021050363._2
1284- let amountEstimated = $t05021050363._1
1282+ let outInAmountAsset = $t05025950412._5
1283+ let bonus = $t05025950412._4
1284+ let feeAmount = $t05025950412._3
1285+ let commonState = $t05025950412._2
1286+ let amountEstimated = $t05025950412._1
12851287 let amount = if (if ((minOutAmount > 0))
12861288 then (minOutAmount > amountEstimated)
12871289 else false)
12881290 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
12891291 else amountEstimated
12901292 let burnInv = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
12911293 if ((burnInv == burnInv))
12921294 then {
12931295 let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
12941296 let assetTransfer = [ScriptTransfer(userAddress, amount, outAssetId)]
12951297 let sendFee = if ((feeAmount > 0))
12961298 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
12971299 else nil
1298- let $t05102751274 = {
1300+ let $t05107651323 = {
12991301 let feeAmountForCalc = if ((this == feeCollectorAddress))
13001302 then 0
13011303 else feeAmount
13021304 if (outInAmountAsset)
13031305 then $Tuple2(-((amount + feeAmountForCalc)), 0)
13041306 else $Tuple2(0, -((amount + feeAmountForCalc)))
13051307 }
1306- let amountAssetBalanceDelta = $t05102751274._1
1307- let priceAssetBalanceDelta = $t05102751274._2
1308- let $t05127751385 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1309- let refreshKLpActions = $t05127751385._1
1310- let updatedKLp = $t05127751385._2
1308+ let amountAssetBalanceDelta = $t05107651323._1
1309+ let priceAssetBalanceDelta = $t05107651323._2
1310+ let $t05132651434 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1311+ let refreshKLpActions = $t05132651434._1
1312+ let updatedKLp = $t05132651434._2
13111313 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13121314 if ((isUpdatedKLpValid == isUpdatedKLpValid))
13131315 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
13141316 else throw("Strict value is not equal to itself.")
13151317 }
13161318 else throw("Strict value is not equal to itself.")
13171319 }
13181320 else throw("Strict value is not equal to itself.")
13191321 }
13201322 else throw("Strict value is not equal to itself.")
13211323 }
13221324 else throw("Strict value is not equal to itself.")
13231325 }
13241326
13251327
13261328
13271329 @Callable(i)
13281330 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1329- let $t05166351819 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1330- let amountEstimated = $t05166351819._1
1331- let commonState = $t05166351819._2
1332- let feeAmount = $t05166351819._3
1333- let bonus = $t05166351819._4
1334- let outInAmountAsset = $t05166351819._5
1331+ let $t05171251868 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1332+ let amountEstimated = $t05171251868._1
1333+ let commonState = $t05171251868._2
1334+ let feeAmount = $t05171251868._3
1335+ let bonus = $t05171251868._4
1336+ let outInAmountAsset = $t05171251868._5
13351337 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
13361338 }
13371339
13381340
13391341
13401342 @Callable(i)
13411343 func unstakeAndGetOneTkn (unstakeAmount,outAssetIdStr,minOutAmount) = {
13421344 let isPoolOneTokenOperationsDisabled = {
13431345 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
13441346 if ($isInstanceOf(@, "Boolean"))
13451347 then @
13461348 else throw(($getType(@) + " couldn't be cast to Boolean"))
13471349 }
13481350 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
13491351 then if (if (isGlobalShutdown())
13501352 then true
13511353 else (cfgPoolStatus == PoolShutdown))
13521354 then true
13531355 else isPoolOneTokenOperationsDisabled
13541356 else false
13551357 let checks = [if (if (!(isGetDisabled))
13561358 then true
13571359 else isManager(i))
13581360 then true
13591361 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
13601362 then true
13611363 else throwErr("no payments are expected")]
13621364 if ((checks == checks))
13631365 then {
13641366 let outAssetId = parseAssetId(outAssetIdStr)
13651367 let userAddress = i.caller
13661368 let txId = i.transactionId
13671369 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
13681370 if ((currentKLp == currentKLp))
13691371 then {
13701372 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13711373 if ((unstakeInv == unstakeInv))
13721374 then {
1373- let $t05276152912 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1374- if (($t05276152912 == $t05276152912))
1375+ let $t05281052961 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1376+ if (($t05281052961 == $t05281052961))
13751377 then {
1376- let outInAmountAsset = $t05276152912._5
1377- let bonus = $t05276152912._4
1378- let feeAmount = $t05276152912._3
1379- let commonState = $t05276152912._2
1380- let amountEstimated = $t05276152912._1
1378+ let outInAmountAsset = $t05281052961._5
1379+ let bonus = $t05281052961._4
1380+ let feeAmount = $t05281052961._3
1381+ let commonState = $t05281052961._2
1382+ let amountEstimated = $t05281052961._1
13811383 let amount = if (if ((minOutAmount > 0))
13821384 then (minOutAmount > amountEstimated)
13831385 else false)
13841386 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
13851387 else amountEstimated
13861388 let burnInv = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
13871389 if ((burnInv == burnInv))
13881390 then {
13891391 let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
13901392 let assetTransfer = [ScriptTransfer(i.caller, amount, outAssetId)]
13911393 let sendFee = if ((feeAmount > 0))
13921394 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
13931395 else nil
1394- let $t05357153818 = {
1396+ let $t05362053867 = {
13951397 let feeAmountForCalc = if ((this == feeCollectorAddress))
13961398 then 0
13971399 else feeAmount
13981400 if (outInAmountAsset)
13991401 then $Tuple2(-((amount + feeAmountForCalc)), 0)
14001402 else $Tuple2(0, -((amount + feeAmountForCalc)))
14011403 }
1402- let amountAssetBalanceDelta = $t05357153818._1
1403- let priceAssetBalanceDelta = $t05357153818._2
1404- let $t05382153929 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1405- let refreshKLpActions = $t05382153929._1
1406- let updatedKLp = $t05382153929._2
1404+ let amountAssetBalanceDelta = $t05362053867._1
1405+ let priceAssetBalanceDelta = $t05362053867._2
1406+ let $t05387053978 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1407+ let refreshKLpActions = $t05387053978._1
1408+ let updatedKLp = $t05387053978._2
14071409 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14081410 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14091411 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
14101412 else throw("Strict value is not equal to itself.")
14111413 }
14121414 else throw("Strict value is not equal to itself.")
14131415 }
14141416 else throw("Strict value is not equal to itself.")
14151417 }
14161418 else throw("Strict value is not equal to itself.")
14171419 }
14181420 else throw("Strict value is not equal to itself.")
14191421 }
14201422 else throw("Strict value is not equal to itself.")
14211423 }
14221424
14231425
14241426
14251427 @Callable(i)
14261428 func get () = {
14271429 let res = commonGet(i)
14281430 let outAmAmt = res._1
14291431 let outPrAmt = res._2
14301432 let pmtAmt = res._3
14311433 let pmtAssetId = res._4
14321434 let state = res._5
14331435 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14341436 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14351437 if ((currentKLp == currentKLp))
14361438 then {
14371439 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14381440 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14391441 then {
1440- let $t05502455105 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1441- let refreshKLpActions = $t05502455105._1
1442- let updatedKLp = $t05502455105._2
1442+ let $t05507355154 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1443+ let refreshKLpActions = $t05507355154._1
1444+ let updatedKLp = $t05507355154._2
14431445 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14441446 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14451447 then ((withdrawState ++ state) ++ refreshKLpActions)
14461448 else throw("Strict value is not equal to itself.")
14471449 }
14481450 else throw("Strict value is not equal to itself.")
14491451 }
14501452 else throw("Strict value is not equal to itself.")
14511453 }
14521454
14531455
14541456
14551457 @Callable(i)
14561458 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
14571459 let res = commonGet(i)
14581460 let outAmAmt = res._1
14591461 let outPrAmt = res._2
14601462 let pmtAmt = res._3
14611463 let pmtAssetId = res._4
14621464 let state = res._5
14631465 if ((noLessThenAmtAsset > outAmAmt))
14641466 then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
14651467 else if ((noLessThenPriceAsset > outPrAmt))
14661468 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
14671469 else {
14681470 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14691471 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14701472 if ((currentKLp == currentKLp))
14711473 then {
14721474 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14731475 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14741476 then {
1475- let $t05620056281 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1476- let refreshKLpActions = $t05620056281._1
1477- let updatedKLp = $t05620056281._2
1477+ let $t05624956330 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1478+ let refreshKLpActions = $t05624956330._1
1479+ let updatedKLp = $t05624956330._2
14781480 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14791481 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14801482 then ((withdrawState ++ state) ++ refreshKLpActions)
14811483 else throw("Strict value is not equal to itself.")
14821484 }
14831485 else throw("Strict value is not equal to itself.")
14841486 }
14851487 else throw("Strict value is not equal to itself.")
14861488 }
14871489 }
14881490
14891491
14901492
14911493 @Callable(i)
14921494 func unstakeAndGet (amount) = {
14931495 let checkPayments = if ((size(i.payments) != 0))
14941496 then throw("No payments are expected")
14951497 else true
14961498 if ((checkPayments == checkPayments))
14971499 then {
14981500 let cfg = getPoolConfig()
14991501 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
15001502 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
15011503 if ((currentKLp == currentKLp))
15021504 then {
15031505 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(lpAssetId), amount], nil)
15041506 if ((unstakeInv == unstakeInv))
15051507 then {
15061508 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
15071509 let outAmAmt = res._1
15081510 let outPrAmt = res._2
15091511 let poolStatus = parseIntValue(res._9)
15101512 let state = res._10
15111513 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
15121514 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
15131515 then if (isGlobalShutdown())
15141516 then true
15151517 else (cfgPoolStatus == PoolShutdown)
15161518 else false
15171519 let checkPoolStatus = if (isGetDisabled)
15181520 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
15191521 else true
15201522 if ((checkPoolStatus == checkPoolStatus))
15211523 then {
15221524 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15231525 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15241526 then {
1525- let $t05762957710 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1526- let refreshKLpActions = $t05762957710._1
1527- let updatedKLp = $t05762957710._2
1527+ let $t05767857759 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1528+ let refreshKLpActions = $t05767857759._1
1529+ let updatedKLp = $t05767857759._2
15281530 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15291531 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15301532 then ((withdrawState ++ state) ++ refreshKLpActions)
15311533 else throw("Strict value is not equal to itself.")
15321534 }
15331535 else throw("Strict value is not equal to itself.")
15341536 }
15351537 else throw("Strict value is not equal to itself.")
15361538 }
15371539 else throw("Strict value is not equal to itself.")
15381540 }
15391541 else throw("Strict value is not equal to itself.")
15401542 }
15411543 else throw("Strict value is not equal to itself.")
15421544 }
15431545
15441546
15451547
15461548 @Callable(i)
15471549 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
15481550 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
15491551 then if (isGlobalShutdown())
15501552 then true
15511553 else (cfgPoolStatus == PoolShutdown)
15521554 else false
15531555 let checks = [if (!(isGetDisabled))
15541556 then true
15551557 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
15561558 then true
15571559 else throw("no payments are expected")]
15581560 if ((checks == checks))
15591561 then {
15601562 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
15611563 if ((currentKLp == currentKLp))
15621564 then {
15631565 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
15641566 if ((unstakeInv == unstakeInv))
15651567 then {
15661568 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
15671569 let outAmAmt = res._1
15681570 let outPrAmt = res._2
15691571 let state = res._10
15701572 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
15711573 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
15721574 then true
15731575 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
15741576 then true
15751577 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
15761578 if ((checkAmounts == checkAmounts))
15771579 then {
15781580 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15791581 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15801582 then {
1581- let $t05918859269 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1582- let refreshKLpActions = $t05918859269._1
1583- let updatedKLp = $t05918859269._2
1583+ let $t05923759318 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1584+ let refreshKLpActions = $t05923759318._1
1585+ let updatedKLp = $t05923759318._2
15841586 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15851587 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15861588 then ((withdrawState ++ state) ++ refreshKLpActions)
15871589 else throw("Strict value is not equal to itself.")
15881590 }
15891591 else throw("Strict value is not equal to itself.")
15901592 }
15911593 else throw("Strict value is not equal to itself.")
15921594 }
15931595 else throw("Strict value is not equal to itself.")
15941596 }
15951597 else throw("Strict value is not equal to itself.")
15961598 }
15971599 else throw("Strict value is not equal to itself.")
15981600 }
15991601
16001602
16011603
16021604 @Callable(i)
16031605 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
16041606 then throw("permissions denied")
16051607 else $Tuple2([StringEntry(aa(), amtAssetStr), StringEntry(pa(), priceAssetStr)], "success")
16061608
16071609
16081610
16091611 @Callable(i)
16101612 func refreshKLp () = {
16111613 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyKLpRefreshedHeight), 0)
16121614 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= kLpRefreshDelay))
16131615 then unit
16141616 else throwErr(makeString([toString(kLpRefreshDelay), " blocks have not passed since the previous call"], ""))
16151617 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
16161618 then {
16171619 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1618- let $t06047360537 = refreshKLpInternal(0, 0, 0)
1619- let kLpUpdateActions = $t06047360537._1
1620- let updatedKLp = $t06047360537._2
1620+ let $t06052260586 = refreshKLpInternal(0, 0, 0)
1621+ let kLpUpdateActions = $t06052260586._1
1622+ let updatedKLp = $t06052260586._2
16211623 let actions = if ((kLp != updatedKLp))
16221624 then kLpUpdateActions
16231625 else throwErr("nothing to refresh")
16241626 $Tuple2(actions, toString(updatedKLp))
16251627 }
16261628 else throw("Strict value is not equal to itself.")
16271629 }
16281630
16291631
16301632
16311633 @Callable(i)
16321634 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
16331635
16341636
16351637
16361638 @Callable(i)
16371639 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
16381640
16391641
16401642
16411643 @Callable(i)
16421644 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
16431645 let prices = calcPrices(amAmt, prAmt, lpAmt)
16441646 $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])])
16451647 }
16461648
16471649
16481650
16491651 @Callable(i)
16501652 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
16511653
16521654
16531655
16541656 @Callable(i)
16551657 func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult))
16561658
16571659
16581660
16591661 @Callable(i)
16601662 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
16611663
16621664
16631665
16641666 @Callable(i)
16651667 func estimatePutOperationWrapperREADONLY (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippageTolerance, inAmAssetAmt, inAmAssetId, inPrAssetAmt, inPrAssetId, userAddress, isEvaluate, emitLp))
16661668
16671669
16681670
16691671 @Callable(i)
16701672 func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
16711673 let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
16721674 $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
16731675 }
16741676
16751677
16761678
16771679 @Callable(i)
16781680 func statsREADONLY () = {
16791681 let cfg = getPoolConfig()
16801682 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
16811683 let amtAssetId = cfg[idxAmtAssetId]
16821684 let priceAssetId = cfg[idxPriceAssetId]
16831685 let iAmtAssetId = cfg[idxIAmtAssetId]
16841686 let iPriceAssetId = cfg[idxIPriceAssetId]
16851687 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
16861688 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
16871689 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
16881690 let accAmtAssetBalance = getAccBalance(amtAssetId)
16891691 let accPriceAssetBalance = getAccBalance(priceAssetId)
16901692 let pricesList = if ((poolLPBalance == 0))
16911693 then [zeroBigInt, zeroBigInt, zeroBigInt]
16921694 else calcPrices(accAmtAssetBalance, accPriceAssetBalance, poolLPBalance)
16931695 let curPrice = 0
16941696 let lpAmtAssetShare = fromX18(pricesList[1], scale8)
16951697 let lpPriceAssetShare = fromX18(pricesList[2], scale8)
16961698 let poolWeight = value(getInteger(factoryContract, keyPoolWeight(toString(this))))
16971699 $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))
16981700 }
16991701
17001702
17011703
17021704 @Callable(i)
17031705 func evaluatePutByAmountAssetREADONLY (inAmAssetAmt) = {
17041706 let cfg = getPoolConfig()
17051707 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
17061708 let amAssetIdStr = cfg[idxAmtAssetId]
17071709 let amAssetId = fromBase58String(amAssetIdStr)
17081710 let prAssetIdStr = cfg[idxPriceAssetId]
17091711 let prAssetId = fromBase58String(prAssetIdStr)
17101712 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
17111713 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
17121714 let poolStatus = cfg[idxPoolStatus]
17131715 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
17141716 let accAmtAssetBalance = getAccBalance(amAssetIdStr)
17151717 let accPriceAssetBalance = getAccBalance(prAssetIdStr)
17161718 let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm)
17171719 let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm)
17181720 let curPriceX18 = if ((poolLPBalance == 0))
17191721 then zeroBigInt
17201722 else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
17211723 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
17221724 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
17231725 let inPrAssetAmt = fromX18(inPrAssetAmtX18, priceAssetDcm)
17241726 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
17251727 let calcLpAmt = estPut._1
17261728 let curPriceCalc = estPut._3
17271729 let amBalance = estPut._4
17281730 let prBalance = estPut._5
17291731 let lpEmission = estPut._6
17301732 $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))
17311733 }
17321734
17331735
17341736
17351737 @Callable(i)
17361738 func evaluatePutByPriceAssetREADONLY (inPrAssetAmt) = {
17371739 let cfg = getPoolConfig()
17381740 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
17391741 let amAssetIdStr = cfg[idxAmtAssetId]
17401742 let amAssetId = fromBase58String(amAssetIdStr)
17411743 let prAssetIdStr = cfg[idxPriceAssetId]
17421744 let prAssetId = fromBase58String(prAssetIdStr)
17431745 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
17441746 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
17451747 let poolStatus = cfg[idxPoolStatus]
17461748 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
17471749 let amBalanceRaw = getAccBalance(amAssetIdStr)
17481750 let prBalanceRaw = getAccBalance(prAssetIdStr)
17491751 let amBalanceRawX18 = toX18(amBalanceRaw, amtAssetDcm)
17501752 let prBalanceRawX18 = toX18(prBalanceRaw, priceAssetDcm)
17511753 let curPriceX18 = if ((poolLPBalance == 0))
17521754 then zeroBigInt
17531755 else calcPriceBigInt(prBalanceRawX18, amBalanceRawX18)
17541756 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
17551757 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
17561758 let inAmAssetAmt = fromX18(inAmAssetAmtX18, amtAssetDcm)
17571759 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
17581760 let calcLpAmt = estPut._1
17591761 let curPriceCalc = estPut._3
17601762 let amBalance = estPut._4
17611763 let prBalance = estPut._5
17621764 let lpEmission = estPut._6
17631765 $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))
17641766 }
17651767
17661768
17671769
17681770 @Callable(i)
17691771 func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
17701772 let res = estimateGetOperation("", paymentLpAssetId, paymentLpAmt, this)
17711773 let outAmAmt = res._1
17721774 let outPrAmt = res._2
17731775 let amBalance = res._5
17741776 let prBalance = res._6
17751777 let lpEmission = res._7
17761778 let curPrice = res._8
17771779 let poolStatus = parseIntValue(res._9)
17781780 $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))
17791781 }
17801782
17811783
17821784 @Verifier(tx)
17831785 func verify () = {
17841786 let targetPublicKey = match managerPublicKeyOrUnit() {
17851787 case pk: ByteVector =>
17861788 pk
17871789 case _: Unit =>
17881790 tx.senderPublicKey
17891791 case _ =>
17901792 throw("Match error")
17911793 }
17921794 match tx {
17931795 case order: Order =>
17941796 let matcherPub = getMatcherPubOrFail()
1795- let $t06919969316 = if (skipOrderValidation())
1797+ let $t06924869365 = if (skipOrderValidation())
17961798 then $Tuple2(true, "")
17971799 else validateMatcherOrderAllowed(order)
1798- let orderValid = $t06919969316._1
1799- let orderValidInfo = $t06919969316._2
1800+ let orderValid = $t06924869365._1
1801+ let orderValidInfo = $t06924869365._2
18001802 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
18011803 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
18021804 if (if (if (orderValid)
18031805 then senderValid
18041806 else false)
18051807 then matcherValid
18061808 else false)
18071809 then true
18081810 else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
18091811 case s: SetScriptTransaction =>
18101812 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
18111813 then true
18121814 else {
18131815 let newHash = blake2b256(value(s.script))
18141816 let allowedHash = fromBase64String(value(getString(factoryContract, keyAllowedLpScriptHash())))
18151817 let currentHash = scriptHash(this)
18161818 if ((allowedHash == newHash))
18171819 then (currentHash != newHash)
18181820 else false
18191821 }
18201822 case _ =>
18211823 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
18221824 }
18231825 }
18241826

github/deemru/w8io/3ef1775 
321.20 ms