tx · H7C1zzQiAyMEc3aZA1DD3RxeB1V71eJBysAnZm3NAHnM

3MyeMZm2BLBkcgK2VBeTU8h1n562iB3zA2Z:  -0.02900000 Waves

2022.09.13 00:15 [2226425] smart account 3MyeMZm2BLBkcgK2VBeTU8h1n562iB3zA2Z > SELF 0.00000000 Waves

{ "type": 13, "id": "H7C1zzQiAyMEc3aZA1DD3RxeB1V71eJBysAnZm3NAHnM", "fee": 2900000, "feeAssetId": null, "timestamp": 1663017336016, "version": 2, "chainId": 84, "sender": "3MyeMZm2BLBkcgK2VBeTU8h1n562iB3zA2Z", "senderPublicKey": "5bHbDgAVwbyzkor8HrHKU8zcg5RfwKy3rNihVqk8YUvP", "proofs": [ "3Y4qcbxfKhMBLp9eq4LETyZN4UKoF3zWx6vhegF54Qjg8rtjtBuXWQXYEehSqxEHdRPzYMW61nbc7YTzRMx3GE2V" ], "script": "base64:BgJ/CAISAwoBCBIDCgEIEgASBAoCAQQSBwoFAQEBAQQSAwoBARIAEgcKBQEBAQgBEgQKAgEBEgMKAQESBAoCCAgSBAoCCAgSBAoCCAESABIDCgEIEgUKAwEBARIECgIIARIECgIBARIECgIICBILCgkIAQECAQIIBAQSBgoECAgBCE8AD2RlZmF1bHREZWNpbWFscwCAwtcvAAZzY2FsZTgAgMLXLwAMc2NhbGU4QmlnSW50CQC2AgEAgMLXLwAHc2NhbGUxOAkAtgIBAICAkLu61q3wDQAKemVyb0JpZ0ludAkAtgIBAAAACW9uZUJpZ0ludAkAtgIBAAEACnNsaXBwYWdlNEQJALYCAQkAZQIFBnNjYWxlOAkAaQIJAGgCBQZzY2FsZTgAAQUGc2NhbGU4AAVBbXVsdAIDMTAwAAVEY29udgIBMQADU0VQAgJfXwAFRU1QVFkCAAAKUG9vbEFjdGl2ZQABAApQb29sUHV0RGlzAAIADlBvb2xNYXRjaGVyRGlzAAMADFBvb2xTaHV0ZG93bgAEAA5pZHhQb29sQWRkcmVzcwABAAlpZHhQb29sU3QAAgAJaWR4TFBBc0lkAAMACWlkeEFtQXNJZAAEAAlpZHhQckFzSWQABQALaWR4QW10QXNEY20ABgANaWR4UHJpY2VBc0RjbQAHAAtpZHhJQW10QXNJZAAIAA1pZHhJUHJpY2VBc0lkAAkAD2lkeEZhY3RTdGFrQ250cgABABBpZHhGYWN0U2xpcHBDbnRyAAcAEWlkeEZhY3RHd3hSZXdDbnRyAAoABWRlbGF5Agklc19fZGVsYXkBAnQxAgdvcmlnVmFsDW9yaWdTY2FsZU11bHQJALwCAwkAtgIBBQdvcmlnVmFsBQdzY2FsZTE4CQC2AgEFDW9yaWdTY2FsZU11bHQBAmYxAgN2YWwPcmVzdWx0U2NhbGVNdWx0CQCgAwEJALwCAwUDdmFsCQC2AgEFD3Jlc3VsdFNjYWxlTXVsdAUHc2NhbGUxOAECdHMDA2FtdAhyZXNTY2FsZQhjdXJTY2FsZQkAawMFA2FtdAUIcmVzU2NhbGUFCGN1clNjYWxlAQNhYnMBA3ZhbAMJAL8CAgUKemVyb0JpZ0ludAUDdmFsCQC+AgEFA3ZhbAUDdmFsAQJmYwACEyVzX19mYWN0b3J5Q29udHJhY3QBA21wawACFCVzX19tYW5hZ2VyUHVibGljS2V5AQRwbXBrAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQJwbAACESVzJXNfX3ByaWNlX19sYXN0AQJwaAIBaAF0CQC5CQIJAMwIAgIYJXMlcyVkJWRfX3ByaWNlX19oaXN0b3J5CQDMCAIJAKQDAQUBaAkAzAgCCQCkAwEFAXQFA25pbAUDU0VQAQNwYXUCAnVhBHR4SWQJAKwCAgkArAICCQCsAgICCyVzJXMlc19fUF9fBQJ1YQICX18FBHR4SWQBA2dhdQICdWEEdHhJZAkArAICCQCsAgIJAKwCAgILJXMlcyVzX19HX18FAnVhAgJfXwUEdHhJZAECYWEAAg8lc19fYW1vdW50QXNzZXQBAnBhAAIOJXNfX3ByaWNlQXNzZXQBA2FtcAACByVzX19hbXABA2FkYQACDSVzX19hZGRvbkFkZHIBBWxnb3RjAQZjYWxsZXIJALkJAgkAzAgCAhclcyVzX19sYXN0R2V0T25lVGtuQ2FsbAkAzAgCBQZjYWxsZXIFA25pbAUDU0VQAQVsc290YwEGY2FsbGVyCQC5CQIJAMwIAgIXJXMlc19fbGFzdFB1dE9uZVRrbkNhbGwJAMwIAgUGY2FsbGVyBQNuaWwFA1NFUAEEZmNmZwACESVzX19mYWN0b3J5Q29uZmlnAQRtdHBrAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJwYwIGaUFtdEFzBWlQckFzCQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQZpQW10QXMCAl9fBQVpUHJBcwIIX19jb25maWcBA21iYQEFYkFTdHIJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUFYkFTdHIBA2FwcwACDCVzX19zaHV0ZG93bgEca2V5QWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAQN0b2UDA29yVgZzZW5kclYGbWF0Y2hWCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEUZhaWxlZDogb3JkVmFsaWQ9CQClAwEFA29yVgILIHNuZHJWYWxpZD0JAKUDAQUGc2VuZHJWAgwgbXRjaHJWYWxpZD0JAKUDAQUGbWF0Y2hWAQNzdHIBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACBlN0cmluZwQGdmFsU3RyBQckbWF0Y2gwBQZ2YWxTdHIJAAIBAhNmYWlsIGNhc3QgdG8gU3RyaW5nAQRzdHJmAgRhZGRyA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBGFkZHIFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQRhZGRyCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABBGludGYCBGFkZHIDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEYWRkcgUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFBGFkZHIJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAADZmNhCQERQGV4dHJOYXRpdmUoMTA2MikBCQEEc3RyZgIFBHRoaXMJAQJmYwAAAUEJAQRzdHJmAgUEdGhpcwkBA2FtcAABA2lncwAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUDZmNhCQEDYXBzAAcBAm1wAAkA2QQBCQEEc3RyZgIFA2ZjYQkBBG10cGsAAQNncGMABAVhbXRBcwkBBHN0cmYCBQR0aGlzCQECYWEABAdwcmljZUFzCQEEc3RyZgIFBHRoaXMJAQJwYQAECGlQcmljZUFzCQEEaW50ZgIFA2ZjYQkBA21iYQEFB3ByaWNlQXMEBmlBbXRBcwkBBGludGYCBQNmY2EJAQNtYmEBBQVhbXRBcwkAtQkCCQEEc3RyZgIFA2ZjYQkBAnBjAgkApAMBBQZpQW10QXMJAKQDAQUIaVByaWNlQXMFA1NFUAEDZ2ZjAAkAtQkCCQEEc3RyZgIFA2ZjYQkBBGZjZmcABQNTRVABEWRhdGFQdXRBY3Rpb25JbmZvCg1pbkFtdEFzc2V0QW10D2luUHJpY2VBc3NldEFtdAhvdXRMcEFtdAVwcmljZQpzbGlwQnlVc2VyDHNsaXBwYWdlUmVhbAh0eEhlaWdodAt0eFRpbWVzdGFtcAxzbGlwYWdlQW1BbXQMc2xpcGFnZVByQW10CQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQ1pbkFtdEFzc2V0QW10CQDMCAIJAKQDAQUPaW5QcmljZUFzc2V0QW10CQDMCAIJAKQDAQUIb3V0THBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFCnNsaXBCeVVzZXIJAMwIAgkApAMBBQxzbGlwcGFnZVJlYWwJAMwIAgkApAMBBQh0eEhlaWdodAkAzAgCCQCkAwEFC3R4VGltZXN0YW1wCQDMCAIJAKQDAQUMc2xpcGFnZUFtQW10CQDMCAIJAKQDAQUMc2xpcGFnZVByQW10BQNuaWwFA1NFUAERZGF0YUdldEFjdGlvbkluZm8GDm91dEFtdEFzc2V0QW10EG91dFByaWNlQXNzZXRBbXQHaW5McEFtdAVwcmljZQh0eEhlaWdodAt0eFRpbWVzdGFtcAkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFDm91dEFtdEFzc2V0QW10CQDMCAIJAKQDAQUQb3V0UHJpY2VBc3NldEFtdAkAzAgCCQCkAwEFB2luTHBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFCHR4SGVpZ2h0CQDMCAIJAKQDAQULdHhUaW1lc3RhbXAFA25pbAUDU0VQAQ1nZXRBY2NCYWxhbmNlAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkA8AcCBQR0aGlzCQDZBAEFB2Fzc2V0SWQBBGNwYmkCCHByQW10WDE4CGFtQW10WDE4CQC8AgMFCHByQW10WDE4BQdzY2FsZTE4BQhhbUFtdFgxOAEDdmFkAwJBMQJBMghzbGlwcGFnZQQEZGlmZgkAvAIDCQC4AgIFAkExBQJBMgUMc2NhbGU4QmlnSW50BQJBMgQEcGFzcwkAvwICCQC4AgIFCHNsaXBwYWdlCQEDYWJzAQUEZGlmZgUKemVyb0JpZ0ludAMJAQEhAQUEcGFzcwkAAgEJAKwCAgIKQmlnIHNscGc6IAkApgMBBQRkaWZmCQCUCgIFBHBhc3MJAJkDAQkAzAgCBQJBMQkAzAgCBQJBMgUDbmlsAQJ2ZAMCRDECRDAEc2xwZwQEZGlmZgkAvAIDBQJEMAUMc2NhbGU4QmlnSW50BQJEMQQEZmFpbAkAvwICBQRzbHBnBQRkaWZmAwMFBGZhaWwGCQC/AgIFAkQwBQJEMQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKYDAQUCRDACASAJAKYDAQUCRDECASAJAKYDAQUEZGlmZgIBIAkApgMBBQRzbHBnBQRmYWlsAQNwY3AECmFtQXNzZXREY20KcHJBc3NldERjbQVhbUFtdAVwckFtdAQLYW10QXNBbXRYMTgJAQJ0MQIFBWFtQW10BQphbUFzc2V0RGNtBApwckFzQW10WDE4CQECdDECBQVwckFtdAUKcHJBc3NldERjbQkBBGNwYmkCBQpwckFzQW10WDE4BQthbXRBc0FtdFgxOAEKY2FsY1ByaWNlcwMFYW1BbXQFcHJBbXQFbHBBbXQEA2NmZwkBA2dwYwAECGFtdEFzRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQtpZHhBbXRBc0RjbQQHcHJBc0RjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUNaWR4UHJpY2VBc0RjbQQIcHJpY2VYMTgJAQNwY3AEBQhhbXRBc0RjbQUHcHJBc0RjbQUFYW1BbXQFBXByQW10BAhhbUFtdFgxOAkBAnQxAgUFYW1BbXQFCGFtdEFzRGNtBAhwckFtdFgxOAkBAnQxAgUFcHJBbXQFB3ByQXNEY20ECGxwQW10WDE4CQECdDECBQVscEFtdAUGc2NhbGU4BA1scFBySW5BbUFzWDE4CQEEY3BiaQIFCGFtQW10WDE4BQhscEFtdFgxOAQNbHBQckluUHJBc1gxOAkBBGNwYmkCBQhwckFtdFgxOAUIbHBBbXRYMTgJAMwIAgUIcHJpY2VYMTgJAMwIAgUNbHBQckluQW1Bc1gxOAkAzAgCBQ1scFBySW5QckFzWDE4BQNuaWwBD2NhbGN1bGF0ZVByaWNlcwMFYW1BbXQFcHJBbXQFbHBBbXQEAXAJAQpjYWxjUHJpY2VzAwUFYW1BbXQFBXByQW10BQVscEFtdAkAzAgCCQECZjECCQCRAwIFAXAAAAUGc2NhbGU4CQDMCAIJAQJmMQIJAJEDAgUBcAABBQZzY2FsZTgJAMwIAgkBAmYxAgkAkQMCBQFwAAIFBnNjYWxlOAUDbmlsAQNlZ28EBnR4SWQ1OApwbXRBc3NldElkCHBtdExwQW10C3VzZXJBZGRyZXNzBANjZmcJAQNncGMABARscElkCQCRAwIFA2NmZwUJaWR4TFBBc0lkBARhbUlkCQCRAwIFA2NmZwUJaWR4QW1Bc0lkBARwcklkCQCRAwIFA2NmZwUJaWR4UHJBc0lkBAVhbURjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwULaWR4QW10QXNEY20EBXByRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ1pZHhQcmljZUFzRGNtBANzdHMJAJEDAgUDY2ZnBQlpZHhQb29sU3QEB2xwRW1pc3MICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQRscElkAgtXcm9uZyBMUCBpZAhxdWFudGl0eQMJAQIhPQIFBGxwSWQFCnBtdEFzc2V0SWQJAAIBAg9Xcm9uZyBwbXQgYXNzZXQECWFtQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQRhbUlkBAlwckJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUEcHJJZAQcYW1vdW50QmFsYW5jZURlZmF1bHREZWNpbWFscwkAawMFCWFtQmFsYW5jZQUPZGVmYXVsdERlY2ltYWxzBQVhbURjbQQbcHJpY2VCYWxhbmNlRGVmYXVsdERlY2ltYWxzCQBrAwUJcHJCYWxhbmNlBQ9kZWZhdWx0RGVjaW1hbHMFBXByRGNtBAxhbUJhbGFuY2VYMTgJAQJ0MQIFHGFtb3VudEJhbGFuY2VEZWZhdWx0RGVjaW1hbHMFD2RlZmF1bHREZWNpbWFscwQMcHJCYWxhbmNlWDE4CQECdDECBRtwcmljZUJhbGFuY2VEZWZhdWx0RGVjaW1hbHMFD2RlZmF1bHREZWNpbWFscwQLY3VyUHJpY2VYMTgJAQRjcGJpAgUMcHJCYWxhbmNlWDE4BQxhbUJhbGFuY2VYMTgECGN1clByaWNlCQECZjECBQtjdXJQcmljZVgxOAUGc2NhbGU4BAtwbXRMcEFtdFgxOAkBAnQxAgUIcG10THBBbXQFBnNjYWxlOAQKbHBFbWlzc1gxOAkBAnQxAgUHbHBFbWlzcwUGc2NhbGU4BAtvdXRBbUFtdFgxOAkAvAIDBQxhbUJhbGFuY2VYMTgFC3BtdExwQW10WDE4BQpscEVtaXNzWDE4BAtvdXRQckFtdFgxOAkAvAIDBQxwckJhbGFuY2VYMTgFC3BtdExwQW10WDE4BQpscEVtaXNzWDE4BB5vdXRBbW91bnRBbW91bnREZWZhdWx0RGVjaW1hbHMJAQJmMQIFC291dEFtQW10WDE4BQ9kZWZhdWx0RGVjaW1hbHMEHW91dFByaWNlQW1vdW50RGVmYXVsdERlY2ltYWxzCQECZjECBQtvdXRQckFtdFgxOAUPZGVmYXVsdERlY2ltYWxzBAhvdXRBbUFtdAkAawMFHm91dEFtb3VudEFtb3VudERlZmF1bHREZWNpbWFscwUFYW1EY20FD2RlZmF1bHREZWNpbWFscwQIb3V0UHJBbXQJAGsDBR1vdXRQcmljZUFtb3VudERlZmF1bHREZWNpbWFscwUFcHJEY20FD2RlZmF1bHREZWNpbWFscwQFc3RhdGUDCQAAAgUGdHhJZDU4AgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUIb3V0QW1BbXQDCQAAAgUEYW1JZAIFV0FWRVMFBHVuaXQJANkEAQUEYW1JZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUIb3V0UHJBbXQDCQAAAgUEcHJJZAIFV0FWRVMFBHVuaXQJANkEAQUEcHJJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEDZ2F1AgkApQgBBQt1c2VyQWRkcmVzcwUGdHhJZDU4CQERZGF0YUdldEFjdGlvbkluZm8GBQhvdXRBbUFtdAUIb3V0UHJBbXQFCHBtdExwQW10BQhjdXJQcmljZQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUIY3VyUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFCGN1clByaWNlBQNuaWwJAJwKCgUIb3V0QW1BbXQFCG91dFByQW10BQRhbUlkBQRwcklkBQlhbUJhbGFuY2UFCXByQmFsYW5jZQUHbHBFbWlzcwULY3VyUHJpY2VYMTgFA3N0cwUFc3RhdGUBA2VwbwwGdHhJZDU4CHNsaXBwYWdlB2luQW1BbXQGaW5BbUlkB2luUHJBbXQGaW5QcklkC3VzZXJBZGRyZXNzBmlzRXZhbAZlbWl0THAKaXNPbmVBc3NldAZwbXRBbXQFcG10SWQEA2NmZwkBA2dwYwAEBGxwSWQJANkEAQkAkQMCBQNjZmcFCWlkeExQQXNJZAQHYW1JZFN0cgkAkQMCBQNjZmcFCWlkeEFtQXNJZAQHcHJJZFN0cgkAkQMCBQNjZmcFCWlkeFByQXNJZAQJaW5BbUlkU3RyCQCRAwIFA2NmZwULaWR4SUFtdEFzSWQECWluUHJJZFN0cgkAkQMCBQNjZmcFDWlkeElQcmljZUFzSWQEBmFtdERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwULaWR4QW10QXNEY20ECHByaWNlRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ1pZHhQcmljZUFzRGNtBANzdHMJAJEDAgUDY2ZnBQlpZHhQb29sU3QEBGxwRW0ICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUEbHBJZAIIV3IgbHAgYXMIcXVhbnRpdHkECWFtQmFsYW5jZQMFBmlzRXZhbAkBDWdldEFjY0JhbGFuY2UBBQdhbUlkU3RyAwMFCmlzT25lQXNzZXQJAAACBQVwbXRJZAUHYW1JZFN0cgcJAGUCCQENZ2V0QWNjQmFsYW5jZQEFB2FtSWRTdHIFBnBtdEFtdAMFCmlzT25lQXNzZXQJAQ1nZXRBY2NCYWxhbmNlAQUHYW1JZFN0cgkAZQIJAQ1nZXRBY2NCYWxhbmNlAQUHYW1JZFN0cgUHaW5BbUFtdAQJcHJCYWxhbmNlAwUGaXNFdmFsCQENZ2V0QWNjQmFsYW5jZQEFB3BySWRTdHIDAwUKaXNPbmVBc3NldAkAAAIFBXBtdElkBQdwcklkU3RyBwkAZQIJAQ1nZXRBY2NCYWxhbmNlAQUHcHJJZFN0cgUGcG10QW10AwUKaXNPbmVBc3NldAkBDWdldEFjY0JhbGFuY2UBBQdwcklkU3RyCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdwcklkU3RyBQdpblByQW10BBxhbW91bnRCYWxhbmNlRGVmYXVsdERlY2ltYWxzCQBrAwUJYW1CYWxhbmNlBQ9kZWZhdWx0RGVjaW1hbHMFBmFtdERjbQQbcHJpY2VCYWxhbmNlRGVmYXVsdERlY2ltYWxzCQBrAwUJcHJCYWxhbmNlBQ9kZWZhdWx0RGVjaW1hbHMFCHByaWNlRGNtBCJpbkFtb3VudEFzc2V0QW1vdW50RGVmYXVsdERlY2ltYWxzCQBrAwUHaW5BbUFtdAUPZGVmYXVsdERlY2ltYWxzBQZhbXREY20EIWluUHJpY2VBc3NldEFtb3VudERlZmF1bHREZWNpbWFscwkAawMFB2luUHJBbXQFD2RlZmF1bHREZWNpbWFscwUIcHJpY2VEY20ED2luQW1Bc3NldEFtdFgxOAkBAnQxAgUiaW5BbW91bnRBc3NldEFtb3VudERlZmF1bHREZWNpbWFscwUPZGVmYXVsdERlY2ltYWxzBA9pblByQXNzZXRBbXRYMTgJAQJ0MQIFIWluUHJpY2VBc3NldEFtb3VudERlZmF1bHREZWNpbWFscwUPZGVmYXVsdERlY2ltYWxzBAx1c2VyUHJpY2VYMTgJAQRjcGJpAgUPaW5QckFzc2V0QW10WDE4BQ9pbkFtQXNzZXRBbXRYMTgEDGFtQmFsYW5jZVgxOAkBAnQxAgUcYW1vdW50QmFsYW5jZURlZmF1bHREZWNpbWFscwUPZGVmYXVsdERlY2ltYWxzBAxwckJhbGFuY2VYMTgJAQJ0MQIFG3ByaWNlQmFsYW5jZURlZmF1bHREZWNpbWFscwUPZGVmYXVsdERlY2ltYWxzBAFyAwkAAAIFBGxwRW0AAAQLY3VyUHJpY2VYMTgFCnplcm9CaWdJbnQEC3NsaXBwYWdlWDE4BQp6ZXJvQmlnSW50BAhscEFtdFgxOAkAdgYJALkCAgUPaW5BbUFzc2V0QW10WDE4BQ9pblByQXNzZXRBbXRYMTgAAAkAtgIBAAUAAQAABQRET1dOCQCXCgUJAQJmMQIFCGxwQW10WDE4BQZzY2FsZTgJAQJmMQIFD2luQW1Bc3NldEFtdFgxOAUPZGVmYXVsdERlY2ltYWxzCQECZjECBQ9pblByQXNzZXRBbXRYMTgFD2RlZmF1bHREZWNpbWFscwkBBGNwYmkCCQC3AgIFDHByQmFsYW5jZVgxOAUPaW5QckFzc2V0QW10WDE4CQC3AgIFDGFtQmFsYW5jZVgxOAUPaW5BbUFzc2V0QW10WDE4BQtzbGlwcGFnZVgxOAQLY3VyUHJpY2VYMTgJAQRjcGJpAgUMcHJCYWxhbmNlWDE4BQxhbUJhbGFuY2VYMTgED3NsaXBwYWdlUmVhbFgxOAkAvAIDCQEDYWJzAQkAuAICBQtjdXJQcmljZVgxOAUMdXNlclByaWNlWDE4BQdzY2FsZTE4BQtjdXJQcmljZVgxOAQLc2xpcHBhZ2VYMTgJAQJ0MQIFCHNsaXBwYWdlBQZzY2FsZTgDAwkBAiE9AgULY3VyUHJpY2VYMTgFCnplcm9CaWdJbnQJAL8CAgUPc2xpcHBhZ2VSZWFsWDE4BQtzbGlwcGFnZVgxOAcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUPc2xpcHBhZ2VSZWFsWDE4AgMgPiAJAKYDAQULc2xpcHBhZ2VYMTgEDWxwRW1pc3Npb25YMTgJAQJ0MQIFBGxwRW0FBnNjYWxlOAQKcHJWaWFBbVgxOAkAvAIDBQ9pbkFtQXNzZXRBbXRYMTgFC2N1clByaWNlWDE4BQdzY2FsZTE4BAphbVZpYVByWDE4CQC8AgMFD2luUHJBc3NldEFtdFgxOAUHc2NhbGUxOAULY3VyUHJpY2VYMTgEDGV4cGVjdGVkQW10cwMJAL8CAgUKcHJWaWFBbVgxOAUPaW5QckFzc2V0QW10WDE4CQCUCgIFCmFtVmlhUHJYMTgFD2luUHJBc3NldEFtdFgxOAkAlAoCBQ9pbkFtQXNzZXRBbXRYMTgFCnByVmlhQW1YMTgEEWV4cEFtdEFzc2V0QW10WDE4CAUMZXhwZWN0ZWRBbXRzAl8xBBNleHBQcmljZUFzc2V0QW10WDE4CAUMZXhwZWN0ZWRBbXRzAl8yBAhscEFtdFgxOAkAvAIDBQ1scEVtaXNzaW9uWDE4BRNleHBQcmljZUFzc2V0QW10WDE4BQxwckJhbGFuY2VYMTgJAJcKBQkBAmYxAgUIbHBBbXRYMTgFBnNjYWxlOAkBAmYxAgURZXhwQW10QXNzZXRBbXRYMTgFD2RlZmF1bHREZWNpbWFscwkBAmYxAgUTZXhwUHJpY2VBc3NldEFtdFgxOAUPZGVmYXVsdERlY2ltYWxzBQtjdXJQcmljZVgxOAULc2xpcHBhZ2VYMTgECWNhbGNMcEFtdAgFAXICXzEEDmNhbGNBbUFzc2V0UG10CQBrAwgFAXICXzIFBmFtdERjbQUPZGVmYXVsdERlY2ltYWxzBA5jYWxjUHJBc3NldFBtdAkAawMIBQFyAl8zBQhwcmljZURjbQUPZGVmYXVsdERlY2ltYWxzBAhjdXJQcmljZQkBAmYxAggFAXICXzQFBnNjYWxlOAQMc2xpcHBhZ2VDYWxjCQECZjECCAUBcgJfNQUGc2NhbGU4AwkAZwIAAAUJY2FsY0xwQW10CQACAQIHTFAgPD0gMAQJZW1pdExwQW10AwkBASEBBQZlbWl0THAAAAUJY2FsY0xwQW10BAZhbURpZmYJAGUCBQdpbkFtQW10BQ5jYWxjQW1Bc3NldFBtdAQGcHJEaWZmCQBlAgUHaW5QckFtdAUOY2FsY1ByQXNzZXRQbXQEDSR0MDE2NjQ5MTY5OTQDAwUKaXNPbmVBc3NldAkAAAIFBXBtdElkBQdhbUlkU3RyBwkAlAoCBQZwbXRBbXQAAAMDBQppc09uZUFzc2V0CQAAAgUFcG10SWQFB3BySWRTdHIHCQCUCgIAAAUGcG10QW10CQCUCgIFDmNhbGNBbUFzc2V0UG10BQ5jYWxjUHJBc3NldFBtdAQKd3JpdGVBbUFtdAgFDSR0MDE2NjQ5MTY5OTQCXzEECndyaXRlUHJBbXQIBQ0kdDAxNjY0OTE2OTk0Al8yBAtjb21tb25TdGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUIY3VyUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFCGN1clByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNwYXUCBQt1c2VyQWRkcmVzcwUGdHhJZDU4CQERZGF0YVB1dEFjdGlvbkluZm8KBQp3cml0ZUFtQW10BQp3cml0ZVByQW10BQllbWl0THBBbXQFCGN1clByaWNlBQhzbGlwcGFnZQUMc2xpcHBhZ2VDYWxjBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQZhbURpZmYFBnByRGlmZgUDbmlsCQCfCg0FCWNhbGNMcEFtdAUJZW1pdExwQW10BQhjdXJQcmljZQUJYW1CYWxhbmNlBQlwckJhbGFuY2UFBGxwRW0FBGxwSWQFA3N0cwULY29tbW9uU3RhdGUFBmFtRGlmZgUGcHJEaWZmBQZpbkFtSWQFBmluUHJJZAEDbW9hAQVvcmRlcgQDY2ZnCQEDZ3BjAAQHYW10QXNJZAkAkQMCBQNjZmcFCWlkeEFtQXNJZAQGcHJBc0lkCQCRAwIFA2NmZwUJaWR4UHJBc0lkBANzdHMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFCWlkeFBvb2xTdAQIYW10QXNEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFC2lkeEFtdEFzRGNtBAdwckFzRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ1pZHhQcmljZUFzRGNtBA9hY2NBbXRBc0JhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUHYW10QXNJZAQOYWNjUHJBc0JhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUGcHJBc0lkBAtjdXJQcmljZVgxOAMJAAACCAUFb3JkZXIJb3JkZXJUeXBlBQNCdXkJAQNwY3AEBQhhbXRBc0RjbQUHcHJBc0RjbQkAZAIFD2FjY0FtdEFzQmFsYW5jZQgFBW9yZGVyBmFtb3VudAUOYWNjUHJBc0JhbGFuY2UJAQNwY3AEBQhhbXRBc0RjbQUHcHJBc0RjbQkAZQIFD2FjY0FtdEFzQmFsYW5jZQgFBW9yZGVyBmFtb3VudAUOYWNjUHJBc0JhbGFuY2UECGN1clByaWNlCQECZjECBQtjdXJQcmljZVgxOAUGc2NhbGU4AwMDCQEDaWdzAAYJAAACBQNzdHMFDlBvb2xNYXRjaGVyRGlzBgkAAAIFA3N0cwUMUG9vbFNodXRkb3duCQACAQINQWRtaW4gYmxvY2tlZAQKb3JBbXRBc3NldAgIBQVvcmRlcglhc3NldFBhaXILYW1vdW50QXNzZXQECm9yQW10QXNTdHIDCQAAAgUKb3JBbXRBc3NldAUEdW5pdAIFV0FWRVMJANgEAQkBBXZhbHVlAQUKb3JBbXRBc3NldAQJb3JQckFzc2V0CAgFBW9yZGVyCWFzc2V0UGFpcgpwcmljZUFzc2V0BAlvclByQXNTdHIDCQAAAgUJb3JQckFzc2V0BQR1bml0AgVXQVZFUwkA2AQBCQEFdmFsdWUBBQlvclByQXNzZXQDAwkBAiE9AgUKb3JBbXRBc1N0cgUHYW10QXNJZAYJAQIhPQIFCW9yUHJBc1N0cgUGcHJBc0lkCQACAQIJV3IgYXNzZXRzBApvcmRlclByaWNlCAUFb3JkZXIFcHJpY2UECHByaWNlRGNtCQBrAwUGc2NhbGU4BQdwckFzRGNtBQhhbXRBc0RjbQQOY2FzdE9yZGVyUHJpY2UJAQJ0cwMFCm9yZGVyUHJpY2UFBnNjYWxlOAUIcHJpY2VEY20EEWlzT3JkZXJQcmljZVZhbGlkAwkAAAIIBQVvcmRlcglvcmRlclR5cGUFA0J1eQkAZwIFCGN1clByaWNlBQ5jYXN0T3JkZXJQcmljZQkAZwIFDmNhc3RPcmRlclByaWNlBQhjdXJQcmljZQYBAmNnAQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIKMSBwbW50IGV4cAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECnBtdEFzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQGcG10QW10CAUDcG10BmFtb3VudAQBcgkBA2VnbwQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBBQpwbXRBc3NldElkBQZwbXRBbXQIBQFpBmNhbGxlcgQIb3V0QW1BbXQIBQFyAl8xBAhvdXRQckFtdAgFAXICXzIEA3N0cwkBDXBhcnNlSW50VmFsdWUBCAUBcgJfOQQFc3RhdGUIBQFyA18xMAMDCQEDaWdzAAYJAAACBQNzdHMFDFBvb2xTaHV0ZG93bgkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFA3N0cwkAlwoFBQhvdXRBbUFtdAUIb3V0UHJBbXQFBnBtdEFtdAUKcG10QXNzZXRJZAUFc3RhdGUBAmNwCQZjYWxsZXIEdHhJZAdhbUFzUG10B3ByQXNQbXQIc2xpcHBhZ2UGZW1pdExwCmlzT25lQXNzZXQGcG10QW10BXBtdElkBAFyCQEDZXBvDAUEdHhJZAUIc2xpcHBhZ2UICQEFdmFsdWUBBQdhbUFzUG10BmFtb3VudAgJAQV2YWx1ZQEFB2FtQXNQbXQHYXNzZXRJZAgJAQV2YWx1ZQEFB3ByQXNQbXQGYW1vdW50CAkBBXZhbHVlAQUHcHJBc1BtdAdhc3NldElkBQZjYWxsZXIHBQZlbWl0THAFCmlzT25lQXNzZXQFBnBtdEFtdAUFcG10SWQEA3N0cwkBDXBhcnNlSW50VmFsdWUBCAUBcgJfOAMDAwkBA2lncwAGCQAAAgUDc3RzBQpQb29sUHV0RGlzBgkAAAIFA3N0cwUMUG9vbFNodXRkb3duCQACAQkArAICAghCbG9ja2VkOgkApAMBBQNzdHMFAXIBAW0ABAckbWF0Y2gwCQCiCAEJAQNtcGsAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECcG0ABAckbWF0Y2gwCQCiCAEJAQRwbXBrAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAAnBkCQACAQIRUGVybWlzc2lvbiBkZW5pZWQBAm1tAQFpBAckbWF0Y2gwCQEBbQADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawYFAnBkAwkAAQIFByRtYXRjaDACBFVuaXQDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgUCcGQJAAIBAgtNYXRjaCBlcnJvchUBaQELY29uc3RydWN0b3IBAmZjBAFjCQECbW0BBQFpAwkAAAIFAWMFAWMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmZjAAUCZmMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpzZXRNYW5hZ2VyARdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQBYwkBAm1tAQUBaQMJAAACBQFjBQFjBAJjbQkA2QQBBRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQMJAAACBQJjbQUCY20JAMwIAgkBC1N0cmluZ0VudHJ5AgkBBHBtcGsABRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNvbmZpcm1NYW5hZ2VyAAQBcAkBAnBtAAQDaHBtAwkBCWlzRGVmaW5lZAEFAXAGCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFA2hwbQUDaHBtBANjcG0DCQAAAggFAWkPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQFwBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQNjcG0FA2NwbQkAzAgCCQELU3RyaW5nRW50cnkCCQEDbXBrAAkA2AQBCQEFdmFsdWUBBQFwCQDMCAIJAQtEZWxldGVFbnRyeQEJAQRwbXBrAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBA3B1dAIEc2xpcAlhdXRvU3Rha2UEB2ZhY3RDZmcJAQNnZmMABAtzdGFraW5nQ250cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHZmFjdENmZwUPaWR4RmFjdFN0YWtDbnRyAgpXciBzdCBhZGRyBAhzbGlwQ250cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHZmFjdENmZwUQaWR4RmFjdFNsaXBwQ250cgIKV3Igc2wgYWRkcgMJAGYCAAAFBHNsaXAJAAIBAg5Xcm9uZyBzbGlwcGFnZQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQBZQkBAmNwCQkApQgBCAUBaQZjYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAWkIcGF5bWVudHMAAQUEc2xpcAYHAAACAAQJZW1pdExwQW10CAUBZQJfMgQJbHBBc3NldElkCAUBZQJfNwQFc3RhdGUIBQFlAl85BAZhbURpZmYIBQFlA18xMAQGcHJEaWZmCAUBZQNfMTEEBGFtSWQIBQFlA18xMgQEcHJJZAgFAWUDXzEzBAFyCQD8BwQFA2ZjYQIEZW1pdAkAzAgCBQllbWl0THBBbXQFA25pbAUDbmlsAwkAAAIFAXIFAXIEAmVsBAckbWF0Y2gwBQFyAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEBmxlZ2FjeQUHJG1hdGNoMAkA/AcEBQZsZWdhY3kCBGVtaXQJAMwIAgUJZW1pdExwQW10BQNuaWwFA25pbAUEdW5pdAMJAAACBQJlbAUCZWwEAnNhAwkAZgIFBmFtRGlmZgAACQD8BwQFCHNsaXBDbnRyAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEYW1JZAUGYW1EaWZmBQNuaWwFA25pbAMJAAACBQJzYQUCc2EEAnNwAwkAZgIFBnByRGlmZgAACQD8BwQFCHNsaXBDbnRyAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEcHJJZAUGcHJEaWZmBQNuaWwFA25pbAMJAAACBQJzcAUCc3AECGxwVHJuc2ZyAwUJYXV0b1N0YWtlBAJzcwkA/AcEBQtzdGFraW5nQ250cgIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUJbHBBc3NldElkBQllbWl0THBBbXQFA25pbAMJAAACBQJzcwUCc3MFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCWVtaXRMcEFtdAUJbHBBc3NldElkBQNuaWwJAM4IAgUFc3RhdGUFCGxwVHJuc2ZyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXB1dE9uZVRrbgULYW1Bc3NldFBhcnQLcHJBc3NldFBhcnQFb3V0THAIc2xpcHBhZ2UJYXV0b1N0YWtlBANjZmcJAQNnZmMABAtzdGFraW5nQ250cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUDY2ZnBQ9pZHhGYWN0U3Rha0NudHICCldyIHN0IGFkZHIECHNsaXBDbnRyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQNjZmcFEGlkeEZhY3RTbGlwcENudHICCldyIHNsIGFkZHIEB2d3eENudHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFA2NmZwURaWR4RmFjdEd3eFJld0NudHICC1dyIGd3eCBhZGRyBAdwb29sQ2ZnCQEDZ3BjAAQEYW1JZAkAkQMCBQdwb29sQ2ZnBQlpZHhBbUFzSWQEBHBySWQJAJEDAgUHcG9vbENmZwUJaWR4UHJBc0lkBAVhbURjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Bvb2xDZmcFC2lkeEFtdEFzRGNtBAVwckRjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Bvb2xDZmcFDWlkeFByaWNlQXNEY20EBWFkZG9uCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQNhZGEAAgAEC3VzZXJBZGRyZXNzAwkAAAIFBWFkZG9uCQClCAEIBQFpBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyCAUBaQZjYWxsZXIDAwMDCQBnAgAABQhzbGlwcGFnZQYJAGcCAAAFC2FtQXNzZXRQYXJ0BgkAZwIAAAULcHJBc3NldFBhcnQGCQBnAgAABQVvdXRMcAkAAgECDFdyb25nIHBhcmFtcwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECCzEgcG1udCBleHBkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQKcG10QXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEC3BtdERlY2ltYWxzCAkBBXZhbHVlAQkA7AcBCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQIZGVjaW1hbHMEBnBtdEFtdAgFA3BtdAZhbW91bnQEFXBtdEFtdERlZmF1bHREZWNpbWFscwkAaQIJAGgCBQZwbXRBbXQFD2RlZmF1bHREZWNpbWFscwkAbAYACgAABQtwbXREZWNpbWFscwAAAAAFBERPV04DCQBmAgCAreIEBRVwbXRBbXREZWZhdWx0RGVjaW1hbHMJAAIBAg1Xcm9uZyBwbXQgYW10BAlhbUJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUEYW1JZAQJcHJCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBHBySWQEGGFtQmFsYW5jZURlZmF1bHREZWNpbWFscwkAaQIJAGgCBQlhbUJhbGFuY2UFD2RlZmF1bHREZWNpbWFscwkAbAYACgAABQVhbURjbQAAAAAFBERPV04EGHByQmFsYW5jZURlZmF1bHREZWNpbWFscwkAaQIJAGgCBQlwckJhbGFuY2UFD2RlZmF1bHREZWNpbWFscwkAbAYACgAABQVwckRjbQAAAAAFBERPV04EDSR0MDI2MDI5MjY4MTUDCQAAAgUKcG10QXNzZXRJZAUEYW1JZAMDCQBmAgUVcG10QW10RGVmYXVsdERlY2ltYWxzBRhhbUJhbGFuY2VEZWZhdWx0RGVjaW1hbHMGCQBmAgULYW1Bc3NldFBhcnQFFXBtdEFtdERlZmF1bHREZWNpbWFscwkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJgKBgkAZQIFGGFtQmFsYW5jZURlZmF1bHREZWNpbWFscwUVcG10QW10RGVmYXVsdERlY2ltYWxzBRhwckJhbGFuY2VEZWZhdWx0RGVjaW1hbHMJAGUCBRVwbXRBbXREZWZhdWx0RGVjaW1hbHMFC2FtQXNzZXRQYXJ0BQtwckFzc2V0UGFydAAAAAADCQAAAgUKcG10QXNzZXRJZAUEcHJJZAMDCQBmAgUVcG10QW10RGVmYXVsdERlY2ltYWxzBRhwckJhbGFuY2VEZWZhdWx0RGVjaW1hbHMGCQBmAgULcHJBc3NldFBhcnQFFXBtdEFtdERlZmF1bHREZWNpbWFscwkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJgKBgUYYW1CYWxhbmNlRGVmYXVsdERlY2ltYWxzCQBlAgUYcHJCYWxhbmNlRGVmYXVsdERlY2ltYWxzBRVwbXRBbXREZWZhdWx0RGVjaW1hbHMAAAAACQBlAgUVcG10QW10RGVmYXVsdERlY2ltYWxzBQtwckFzc2V0UGFydAULYW1Bc3NldFBhcnQJAAIBAhB3cm9uZyBwbXRBc3NldElkBAxhbUJhbGFuY2VOb3cIBQ0kdDAyNjAyOTI2ODE1Al8xBAxwckJhbGFuY2VOb3cIBQ0kdDAyNjAyOTI2ODE1Al8yBAx2aXJ0U3dhcEluQW0IBQ0kdDAyNjAyOTI2ODE1Al8zBA12aXJ0U3dhcE91dFByCAUNJHQwMjYwMjkyNjgxNQJfNAQMdmlydFN3YXBJblByCAUNJHQwMjYwMjkyNjgxNQJfNQQNdmlydFN3YXBPdXRBbQgFDSR0MDI2MDI5MjY4MTUCXzYEAkQwCQD8BwQFB2d3eENudHICBWNhbGNECQDMCAIJAKQDAQUMYW1CYWxhbmNlTm93CQDMCAIJAKQDAQUMcHJCYWxhbmNlTm93CQDMCAIFAUEJAMwIAgUFQW11bHQJAMwIAgUFRGNvbnYFA25pbAUDbmlsBAJEMQkA/AcEBQdnd3hDbnRyAgVjYWxjRAkAzAgCCQCmAwEJALYCAQkAZQIJAGQCBQxhbUJhbGFuY2VOb3cFDHZpcnRTd2FwSW5BbQUNdmlydFN3YXBPdXRBbQkAzAgCCQCmAwEJALYCAQkAZQIJAGQCBQxwckJhbGFuY2VOb3cFDHZpcnRTd2FwSW5QcgUNdmlydFN3YXBPdXRQcgkAzAgCBQFBCQDMCAIFBUFtdWx0CQDMCAIFBURjb252BQNuaWwFA25pbAQGRDB2c0QxCQECdmQDCQCnAwEJAQNzdHIBBQJEMQkApwMBCQEDc3RyAQUCRDAFCnNsaXBwYWdlNEQDCQAAAgUGRDB2c0QxBQZEMHZzRDEEBmVzdFB1dAkBAmNwCQkApQgBCAUBaQZjYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUEYW1JZAULYW1Bc3NldFBhcnQJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFBHBySWQFC3ByQXNzZXRQYXJ0BQhzbGlwcGFnZQYGBQZwbXRBbXQFCnBtdEFzc2V0SWQEB2VzdGltTFAIBQZlc3RQdXQCXzIECWxwQXNzZXRJZAgFBmVzdFB1dAJfNwQFc3RhdGUIBQZlc3RQdXQCXzkEBmFtRGlmZggFBmVzdFB1dANfMTAEBnByRGlmZggFBmVzdFB1dANfMTEECWxwQ2FsY1JlcwkBA3ZhZAMJALYCAQUHZXN0aW1MUAkAtgIBBQVvdXRMcAkAtgIBBQhzbGlwcGFnZQQJZW1pdExwQW10CQCgAwEIBQlscENhbGNSZXMCXzIEAWUJAPwHBAUDZmNhAgRlbWl0CQDMCAIFCWVtaXRMcEFtdAUDbmlsBQNuaWwDCQAAAgUBZQUBZQQCZWwEByRtYXRjaDAFAWUDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQGbGVnYWN5BQckbWF0Y2gwCQD8BwQFBmxlZ2FjeQIEZW1pdAkAzAgCBQllbWl0THBBbXQFA25pbAUDbmlsBQR1bml0AwkAAAIFAmVsBQJlbAQCc2EDCQBmAgUGYW1EaWZmAAAJAPwHBAUIc2xpcENudHICA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFBGFtSWQFBmFtRGlmZgUDbmlsBQNuaWwDCQAAAgUCc2EFAnNhBAJzcAMJAGYCBQZwckRpZmYAAAkA/AcEBQhzbGlwQ250cgIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUEcHJJZAUGcHJEaWZmBQNuaWwFA25pbAMJAAACBQJzcAUCc3AECGxwVHJuc2ZyAwUJYXV0b1N0YWtlBAJzcwkA/AcEBQtzdGFraW5nQ250cgIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUJbHBBc3NldElkBQllbWl0THBBbXQFA25pbAMJAAACBQJzcwUCc3MFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCWVtaXRMcEFtdAUJbHBBc3NldElkBQNuaWwJAM4IAgUFc3RhdGUFCGxwVHJuc2ZyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnB1dEZvckZyZWUBB21heFNscGcDCQBmAgAABQdtYXhTbHBnCQACAQIKV3Jvbmcgc2xwZwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQGZXN0UHV0CQECY3AJCQClCAEIBQFpBmNhbGxlcgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAkQMCCAUBaQhwYXltZW50cwABBQdtYXhTbHBnBwcAAAIACAUGZXN0UHV0Al85AWkBA2dldAAEAXIJAQJjZwEFAWkECW91dEFtdEFtdAgFAXICXzEECG91dFByQW10CAUBcgJfMgQGcG10QW10CAUBcgJfMwQKcG10QXNzZXRJZAgFAXICXzQEBXN0YXRlCAUBcgJfNQQBYgkA/AcEBQNmY2ECBGJ1cm4JAMwIAgUGcG10QW10BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFBnBtdEFtdAUDbmlsAwkAAAIFAWIFAWIFBXN0YXRlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWdldE9uZVRrbgUKZXhjaFJlc3VsdAdub3RVc2VkCW91dEFtb3VudApvdXRBc3NldElkCHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQILMSBwbW50IGV4cGQEA2NmZwkBA2dwYwAEBGxwSWQJAJEDAgUDY2ZnBQlpZHhMUEFzSWQEBGFtSWQJAJEDAgUDY2ZnBQlpZHhBbUFzSWQEBHBySWQJAJEDAgUDY2ZnBQlpZHhQckFzSWQEBWFtRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQtpZHhBbXRBc0RjbQQFcHJEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDWlkeFByaWNlQXNEY20EA3N0cwkAkQMCBQNjZmcFCWlkeFBvb2xTdAQHZmFjdENmZwkBA2dmYwAEB2d3eENudHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFB2ZhY3RDZmcFEWlkeEZhY3RHd3hSZXdDbnRyAgpXciBzbCBhZGRyBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQFYWRkb24JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBA2FkYQACAAQLdXNlckFkZHJlc3MDCQAAAgUFYWRkb24JAKUIAQgFAWkGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIIBQFpBmNhbGxlcgQGdHhJZDU4CQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQECnBtdEFzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQGcG10QW10CAUDcG10BmFtb3VudAMJAGYCAICU69wDBQZwbXRBbXQJAAIBAg1NaW4gcG10IDEwIExQAwMDCQBmAgAABQhzbGlwcGFnZQYJAGYCAAAFCmV4Y2hSZXN1bHQGCQBmAgAABQlvdXRBbW91bnQJAAIBAgxXcm9uZyBwYXJhbXMDCQECIT0CBQRscElkCQDYBAEFCnBtdEFzc2V0SWQJAAIBAghXcm9uZyBMUAQBcgkBA2VnbwQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBBQpwbXRBc3NldElkBQZwbXRBbXQIBQFpBmNhbGxlcgQKZXN0aW1BbUFtdAgFAXICXzEECmVzdGltUHJBbXQIBQFyAl8yBAlhbUJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUEYW1JZAQJcHJCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBHBySWQEDSR0MDMxNTk0MzIwNTEDCQAAAgUKb3V0QXNzZXRJZAUEYW1JZAkAmQoHCQBlAgUJYW1CYWxhbmNlBQplc3RpbUFtQW10CQBlAgUJcHJCYWxhbmNlBQplc3RpbVByQW10BQpleGNoUmVzdWx0BQplc3RpbVByQW10AAAAAAkAZAIFCmVzdGltQW1BbXQFCmV4Y2hSZXN1bHQDCQAAAgUKb3V0QXNzZXRJZAUEcHJJZAkAmQoHCQBlAgUJYW1CYWxhbmNlBQplc3RpbUFtQW10CQBlAgUJcHJCYWxhbmNlBQplc3RpbVByQW10AAAAAAUKZXhjaFJlc3VsdAUKZXN0aW1BbUFtdAkAZAIFCmVzdGltUHJBbXQFCmV4Y2hSZXN1bHQJAAIBAhB3cm9uZyBvdXRBc3NldElkBAxhbUJhbGFuY2VOb3cIBQ0kdDAzMTU5NDMyMDUxAl8xBAxwckJhbGFuY2VOb3cIBQ0kdDAzMTU5NDMyMDUxAl8yBAx2aXJ0U3dhcEluQW0IBQ0kdDAzMTU5NDMyMDUxAl8zBA12aXJ0U3dhcE91dFByCAUNJHQwMzE1OTQzMjA1MQJfNAQMdmlydFN3YXBJblByCAUNJHQwMzE1OTQzMjA1MQJfNQQNdmlydFN3YXBPdXRBbQgFDSR0MDMxNTk0MzIwNTECXzYECHRvdGFsR2V0CAUNJHQwMzE1OTQzMjA1MQJfNwMDCQBmAgAABQx2aXJ0U3dhcEluQW0GCQBmAgAABQx2aXJ0U3dhcEluUHIJAAIBAgpXcm9uZyBjYWxjBAJEMAkA/AcEBQdnd3hDbnRyAgVjYWxjRAkAzAgCCQCkAwEFDGFtQmFsYW5jZU5vdwkAzAgCCQCkAwEFDHByQmFsYW5jZU5vdwkAzAgCBQFBCQDMCAIFBUFtdWx0CQDMCAIFBURjb252BQNuaWwFA25pbAQCRDEJAPwHBAUHZ3d4Q250cgIFY2FsY0QJAMwIAgkApAMBCQBkAgkAZQIFDGFtQmFsYW5jZU5vdwUMdmlydFN3YXBJbkFtBQ12aXJ0U3dhcE91dEFtCQDMCAIJAKQDAQkAZQIJAGQCBQxwckJhbGFuY2VOb3cFDXZpcnRTd2FwT3V0UHIFDHZpcnRTd2FwSW5QcgkAzAgCBQFBCQDMCAIFBUFtdWx0CQDMCAIFBURjb252BQNuaWwFA25pbAQGRDB2c0QxCQECdmQDCQCnAwEJAQNzdHIBBQJEMQkApwMBCQEDc3RyAQUCRDAFCnNsaXBwYWdlNEQDCQAAAgUGRDB2c0QxBQZEMHZzRDEECGZpbmFsUmVzCQEDdmFkAwkAtgIBBQh0b3RhbEdldAkAtgIBBQlvdXRBbW91bnQJALYCAQUIc2xpcHBhZ2UDCQAAAgUIZmluYWxSZXMFCGZpbmFsUmVzBA0kdDAzMjc1NjMyODYwAwkAAAIFCm91dEFzc2V0SWQFBGFtSWQJAJQKAgkAoAMBCAUIZmluYWxSZXMCXzIAAAkAlAoCAAAJAKADAQgFCGZpbmFsUmVzAl8yBAVvdXRBbQgFDSR0MDMyNzU2MzI4NjACXzEEBW91dFByCAUNJHQwMzI3NTYzMjg2MAJfMgQIY3VyUHJYMTgJAQRjcGJpAgkBAnQxAgUJcHJCYWxhbmNlBQVwckRjbQkBAnQxAgUJYW1CYWxhbmNlBQVhbURjbQQFY3VyUHIJAQJmMQIFCGN1clByWDE4BQZzY2FsZTgEBXN0YXRlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzCQBkAgUFb3V0QW0FBW91dFByAwkAAAIFCm91dEFzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFCm91dEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA2dhdQIJAKUIAQULdXNlckFkZHJlc3MFBnR4SWQ1OAkBEWRhdGFHZXRBY3Rpb25JbmZvBgUFb3V0QW0FBW91dFByBQZwbXRBbXQFBWN1clByBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQVjdXJQcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUFY3VyUHIFA25pbAMJAAACBQVzdGF0ZQUFc3RhdGUEBGJ1cm4JAPwHBAUDZmNhAgRidXJuCQDMCAIFBnBtdEFtdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQZwbXRBbXQFA25pbAMJAAACBQRidXJuBQRidXJuBQVzdGF0ZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlnZXROb0xlc3MCEm5vTGVzc1RoZW5BbXRBc3NldBRub0xlc3NUaGVuUHJpY2VBc3NldAQBcgkBAmNnAQUBaQQIb3V0QW1BbXQIBQFyAl8xBAhvdXRQckFtdAgFAXICXzIEBnBtdEFtdAgFAXICXzMECnBtdEFzc2V0SWQIBQFyAl80BAVzdGF0ZQgFAXICXzUDCQBmAgUSbm9MZXNzVGhlbkFtdEFzc2V0BQhvdXRBbUFtdAkAAgEJAKwCAgkArAICCQCsAgICCUZhaWxlZDogIAkApAMBBQhvdXRBbUFtdAIDIDwgCQCkAwEFEm5vTGVzc1RoZW5BbXRBc3NldAMJAGYCBRRub0xlc3NUaGVuUHJpY2VBc3NldAUIb3V0UHJBbXQJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQhvdXRQckFtdAIDIDwgCQCkAwEFFG5vTGVzc1RoZW5QcmljZUFzc2V0BBRidXJuTFBBc3NldE9uRmFjdG9yeQkA/AcEBQNmY2ECBGJ1cm4JAMwIAgUGcG10QW10BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFBnBtdEFtdAUDbmlsAwkAAAIFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BRRidXJuTFBBc3NldE9uRmFjdG9yeQUFc3RhdGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdW5zdGFrZUFuZEdldAEGYW1vdW50BA1jaGVja1BheW1lbnRzAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUNY2hlY2tQYXltZW50cwUNY2hlY2tQYXltZW50cwQDY2ZnCQEDZ3BjAAQKZmFjdG9yeUNmZwkBA2dmYwAECWxwQXNzZXRJZAkA2QQBCQCRAwIFA2NmZwUJaWR4TFBBc0lkBAdzdGFraW5nCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQpmYWN0b3J5Q2ZnBQ9pZHhGYWN0U3Rha0NudHICCldyIHN0IGFkZHIECnVuc3Rha2VJbnYJAPwHBAUHc3Rha2luZwIHdW5zdGFrZQkAzAgCCQDYBAEFCWxwQXNzZXRJZAkAzAgCBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFCnVuc3Rha2VJbnYFCnVuc3Rha2VJbnYEAXIJAQNlZ28ECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQUJbHBBc3NldElkBQZhbW91bnQIBQFpBmNhbGxlcgQDc3RzCQENcGFyc2VJbnRWYWx1ZQEIBQFyAl85BAVzdGF0ZQgFAXIDXzEwBAF2AwMJAQNpZ3MABgkAAAIFA3N0cwUMUG9vbFNodXRkb3duCQACAQkArAICAglCbG9ja2VkOiAJAKQDAQUDc3RzBgMJAAACBQF2BQF2BAVidXJuQQkA/AcEBQNmY2ECBGJ1cm4JAMwIAgUGYW1vdW50BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCWxwQXNzZXRJZAUGYW1vdW50BQNuaWwDCQAAAgUFYnVybkEFBWJ1cm5BBQVzdGF0ZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhhY3RpdmF0ZQIIYW10QXNTdHIHcHJBc1N0cgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyCQClCAEFA2ZjYQkAAgECBmRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQAFCGFtdEFzU3RyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJwYQAFB3ByQXNTdHIFA25pbAIHc3VjY2VzcwFpAQRzZXRTAgFrAXYDCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBBHN0cmYCBQR0aGlzCQEDYWRhAAUCcGQJAMwIAgkBC1N0cmluZ0VudHJ5AgUBawUBdgUDbmlsAWkBBHNldEkCAWsBdgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyCQEEc3RyZgIFBHRoaXMJAQNhZGEABQJwZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBawUBdgUDbmlsAWkBHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkACQCUCgIFA25pbAkBA2dwYwABaQEcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQEHYXNzZXRJZAkAlAoCBQNuaWwJAQ1nZXRBY2NCYWxhbmNlAQUHYXNzZXRJZAFpARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwVhbUFtdAVwckFtdAVscEFtdAQCcHIJAQpjYWxjUHJpY2VzAwUFYW1BbXQFBXByQW10BQVscEFtdAkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAnByAAAJAMwIAgkApgMBCQCRAwIFAnByAAEJAMwIAgkApgMBCQCRAwIFAnByAAIFA25pbAFpARZmcm9tWDE4V3JhcHBlclJFQURPTkxZAgN2YWwMcmVzU2NhbGVNdWx0CQCUCgIFA25pbAkBAmYxAgkApwMBBQN2YWwFDHJlc1NjYWxlTXVsdAFpARR0b1gxOFdyYXBwZXJSRUFET05MWQIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQCUCgIFA25pbAkApgMBCQECdDECBQdvcmlnVmFsBQ1vcmlnU2NhbGVNdWx0AWkBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQIIcHJBbXRYMTgIYW1BbXRYMTgJAJQKAgUDbmlsCQCmAwEJAQRjcGJpAgkApwMBBQhwckFtdFgxOAkApwMBBQhhbUFtdFgxOAFpASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkGdHhJZDU4CHNsaXBwYWdlB2luQW1BbXQGaW5BbUlkB2luUHJBbXQGaW5QcklkB3VzckFkZHIGaXNFdmFsBmVtaXRMcAkAlAoCBQNuaWwJAQNlcG8MBQZ0eElkNTgFCHNsaXBwYWdlBQdpbkFtQW10BQZpbkFtSWQFB2luUHJBbXQFBmluUHJJZAUHdXNyQWRkcgUGaXNFdmFsBQZlbWl0THAHAAACAAFpASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQGdHhJZDU4B3BtdEFzSWQIcG10THBBbXQHdXNyQWRkcgQBcgkBA2VnbwQFBnR4SWQ1OAUHcG10QXNJZAUIcG10THBBbXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3VzckFkZHIJAJQKAgUDbmlsCQCcCgoIBQFyAl8xCAUBcgJfMggFAXICXzMIBQFyAl80CAUBcgJfNQgFAXICXzYIBQFyAl83CQCmAwEIBQFyAl84CAUBcgJfOQgFAXIDXzEwAQJ0eAEGdmVyaWZ5AAQPdGFyZ2V0UHVibGljS2V5BAckbWF0Y2gwCQEBbQADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIFT3JkZXIEBW9yZGVyBQckbWF0Y2gwBAptYXRjaGVyUHViCQECbXAABApvcmRlclZhbGlkCQEDbW9hAQUFb3JkZXIEC3NlbmRlclZhbGlkCQD0AwMIBQVvcmRlcglib2R5Qnl0ZXMJAJEDAggFBW9yZGVyBnByb29mcwAACAUFb3JkZXIPc2VuZGVyUHVibGljS2V5BAxtYXRjaGVyVmFsaWQJAPQDAwgFBW9yZGVyCWJvZHlCeXRlcwkAkQMCCAUFb3JkZXIGcHJvb2ZzAAEFCm1hdGNoZXJQdWIDAwMFCm9yZGVyVmFsaWQFC3NlbmRlclZhbGlkBwUMbWF0Y2hlclZhbGlkBwYJAQN0b2UDBQpvcmRlclZhbGlkBQtzZW5kZXJWYWxpZAUMbWF0Y2hlclZhbGlkAwkAAQIFByRtYXRjaDACFFNldFNjcmlwdFRyYW5zYWN0aW9uBAFzBQckbWF0Y2gwBAduZXdIYXNoCQD2AwEJAQV2YWx1ZQEIBQFzBnNjcmlwdAQLYWxsb3dlZEhhc2gJANsEAQkBBXZhbHVlAQkAnQgCBQNmY2EJARxrZXlBbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAAQLY3VycmVudEhhc2gJAPEHAQUEdGhpcwMDCQAAAgULYWxsb3dlZEhhc2gFB25ld0hhc2gJAQIhPQIFC2N1cnJlbnRIYXNoBQduZXdIYXNoBwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V5+SmWhw==", "height": 2226425, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GUpMxyZQmTczx19YvnwihhixsXw3smudYtE2uzkPhioe Next: DuTvqn8retCMWKnhW1NZtvcwqtYzGj5DhP5984wfEtrU Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let defaultDecimals = 1000000
4+let defaultDecimals = 100000000
55
66 let scale8 = 100000000
77
347347 else calcLpAmt
348348 let amDiff = (inAmAmt - calcAmAssetPmt)
349349 let prDiff = (inPrAmt - calcPrAssetPmt)
350- let $t01664716992 = if (if (isOneAsset)
350+ let $t01664916994 = if (if (isOneAsset)
351351 then (pmtId == amIdStr)
352352 else false)
353353 then $Tuple2(pmtAmt, 0)
356356 else false)
357357 then $Tuple2(0, pmtAmt)
358358 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
359- let writeAmAmt = $t01664716992._1
360- let writePrAmt = $t01664716992._2
359+ let writeAmAmt = $t01664916994._1
360+ let writePrAmt = $t01664916994._2
361361 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
362362 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
363363 }
619619 else {
620620 let amBalance = getAccBalance(amId)
621621 let prBalance = getAccBalance(prId)
622- let $t02583626532 = if ((pmtAssetId == amId))
623- then if (if ((pmtAmtDefaultDecimals > amBalance))
622+ let amBalanceDefaultDecimals = ((amBalance * defaultDecimals) / pow(10, 0, amDcm, 0, 0, DOWN))
623+ let prBalanceDefaultDecimals = ((prBalance * defaultDecimals) / pow(10, 0, prDcm, 0, 0, DOWN))
624+ let $t02602926815 = if ((pmtAssetId == amId))
625+ then if (if ((pmtAmtDefaultDecimals > amBalanceDefaultDecimals))
624626 then true
625627 else (amAssetPart > pmtAmtDefaultDecimals))
626628 then throw("invalid payment amount")
627- else $Tuple6((amBalance - pmtAmtDefaultDecimals), prBalance, (pmtAmtDefaultDecimals - amAssetPart), prAssetPart, 0, 0)
629+ else $Tuple6((amBalanceDefaultDecimals - pmtAmtDefaultDecimals), prBalanceDefaultDecimals, (pmtAmtDefaultDecimals - amAssetPart), prAssetPart, 0, 0)
628630 else if ((pmtAssetId == prId))
629- then if (if ((pmtAmtDefaultDecimals > prBalance))
631+ then if (if ((pmtAmtDefaultDecimals > prBalanceDefaultDecimals))
630632 then true
631633 else (prAssetPart > pmtAmtDefaultDecimals))
632634 then throw("invalid payment amount")
633- else $Tuple6(amBalance, (prBalance - pmtAmtDefaultDecimals), 0, 0, (pmtAmtDefaultDecimals - prAssetPart), amAssetPart)
635+ else $Tuple6(amBalanceDefaultDecimals, (prBalanceDefaultDecimals - pmtAmtDefaultDecimals), 0, 0, (pmtAmtDefaultDecimals - prAssetPart), amAssetPart)
634636 else throw("wrong pmtAssetId")
635- let amBalanceNow = $t02583626532._1
636- let prBalanceNow = $t02583626532._2
637- let virtSwapInAm = $t02583626532._3
638- let virtSwapOutPr = $t02583626532._4
639- let virtSwapInPr = $t02583626532._5
640- let virtSwapOutAm = $t02583626532._6
637+ let amBalanceNow = $t02602926815._1
638+ let prBalanceNow = $t02602926815._2
639+ let virtSwapInAm = $t02602926815._3
640+ let virtSwapOutPr = $t02602926815._4
641+ let virtSwapInPr = $t02602926815._5
642+ let virtSwapOutAm = $t02602926815._6
641643 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
642644 let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
643645 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
762764 let estimPrAmt = r._2
763765 let amBalance = getAccBalance(amId)
764766 let prBalance = getAccBalance(prId)
765- let $t03131131768 = if ((outAssetId == amId))
767+ let $t03159432051 = if ((outAssetId == amId))
766768 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
767769 else if ((outAssetId == prId))
768770 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
769771 else throw("wrong outAssetId")
770- let amBalanceNow = $t03131131768._1
771- let prBalanceNow = $t03131131768._2
772- let virtSwapInAm = $t03131131768._3
773- let virtSwapOutPr = $t03131131768._4
774- let virtSwapInPr = $t03131131768._5
775- let virtSwapOutAm = $t03131131768._6
776- let totalGet = $t03131131768._7
772+ let amBalanceNow = $t03159432051._1
773+ let prBalanceNow = $t03159432051._2
774+ let virtSwapInAm = $t03159432051._3
775+ let virtSwapOutPr = $t03159432051._4
776+ let virtSwapInPr = $t03159432051._5
777+ let virtSwapOutAm = $t03159432051._6
778+ let totalGet = $t03159432051._7
777779 if (if ((0 > virtSwapInAm))
778780 then true
779781 else (0 > virtSwapInPr))
787789 let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
788790 if ((finalRes == finalRes))
789791 then {
790- let $t03247332577 = if ((outAssetId == amId))
792+ let $t03275632860 = if ((outAssetId == amId))
791793 then $Tuple2(toInt(finalRes._2), 0)
792794 else $Tuple2(0, toInt(finalRes._2))
793- let outAm = $t03247332577._1
794- let outPr = $t03247332577._2
795+ let outAm = $t03275632860._1
796+ let outPr = $t03275632860._2
795797 let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
796798 let curPr = f1(curPrX18, scale8)
797799 let state = [ScriptTransfer(userAddress, (outAm + outPr), if ((outAssetId == "WAVES"))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let defaultDecimals = 1000000
4+let defaultDecimals = 100000000
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 oneBigInt = toBigInt(1)
1515
1616 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1717
1818 let Amult = "100"
1919
2020 let Dconv = "1"
2121
2222 let SEP = "__"
2323
2424 let EMPTY = ""
2525
2626 let PoolActive = 1
2727
2828 let PoolPutDis = 2
2929
3030 let PoolMatcherDis = 3
3131
3232 let PoolShutdown = 4
3333
3434 let idxPoolAddress = 1
3535
3636 let idxPoolSt = 2
3737
3838 let idxLPAsId = 3
3939
4040 let idxAmAsId = 4
4141
4242 let idxPrAsId = 5
4343
4444 let idxAmtAsDcm = 6
4545
4646 let idxPriceAsDcm = 7
4747
4848 let idxIAmtAsId = 8
4949
5050 let idxIPriceAsId = 9
5151
5252 let idxFactStakCntr = 1
5353
5454 let idxFactSlippCntr = 7
5555
5656 let idxFactGwxRewCntr = 10
5757
5858 let delay = "%s__delay"
5959
6060 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6161
6262
6363 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6464
6565
6666 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6767
6868
6969 func abs (val) = if ((zeroBigInt > val))
7070 then -(val)
7171 else val
7272
7373
7474 func fc () = "%s__factoryContract"
7575
7676
7777 func mpk () = "%s__managerPublicKey"
7878
7979
8080 func pmpk () = "%s__pendingManagerPublicKey"
8181
8282
8383 func pl () = "%s%s__price__last"
8484
8585
8686 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
8787
8888
8989 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9090
9191
9292 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
9393
9494
9595 func aa () = "%s__amountAsset"
9696
9797
9898 func pa () = "%s__priceAsset"
9999
100100
101101 func amp () = "%s__amp"
102102
103103
104104 func ada () = "%s__addonAddr"
105105
106106
107107 func lgotc (caller) = makeString(["%s%s__lastGetOneTknCall", caller], SEP)
108108
109109
110110 func lsotc (caller) = makeString(["%s%s__lastPutOneTknCall", caller], SEP)
111111
112112
113113 func fcfg () = "%s__factoryConfig"
114114
115115
116116 func mtpk () = "%s%s__matcher__publicKey"
117117
118118
119119 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
120120
121121
122122 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
123123
124124
125125 func aps () = "%s__shutdown"
126126
127127
128128 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
129129
130130
131131 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
132132
133133
134134 func str (val) = match val {
135135 case valStr: String =>
136136 valStr
137137 case _ =>
138138 throw("fail cast to String")
139139 }
140140
141141
142142 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
143143
144144
145145 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
146146
147147
148148 let fca = addressFromStringValue(strf(this, fc()))
149149
150150 let A = strf(this, amp())
151151
152152 func igs () = valueOrElse(getBoolean(fca, aps()), false)
153153
154154
155155 func mp () = fromBase58String(strf(fca, mtpk()))
156156
157157
158158 func gpc () = {
159159 let amtAs = strf(this, aa())
160160 let priceAs = strf(this, pa())
161161 let iPriceAs = intf(fca, mba(priceAs))
162162 let iAmtAs = intf(fca, mba(amtAs))
163163 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
164164 }
165165
166166
167167 func gfc () = split(strf(fca, fcfg()), SEP)
168168
169169
170170 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
171171
172172
173173 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)
174174
175175
176176 func getAccBalance (assetId) = if ((assetId == "WAVES"))
177177 then wavesBalance(this).available
178178 else assetBalance(this, fromBase58String(assetId))
179179
180180
181181 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
182182
183183
184184 func vad (A1,A2,slippage) = {
185185 let diff = fraction((A1 - A2), scale8BigInt, A2)
186186 let pass = ((slippage - abs(diff)) > zeroBigInt)
187187 if (!(pass))
188188 then throw(("Big slpg: " + toString(diff)))
189189 else $Tuple2(pass, min([A1, A2]))
190190 }
191191
192192
193193 func vd (D1,D0,slpg) = {
194194 let diff = fraction(D0, scale8BigInt, D1)
195195 let fail = (slpg > diff)
196196 if (if (fail)
197197 then true
198198 else (D0 > D1))
199199 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
200200 else fail
201201 }
202202
203203
204204 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
205205 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
206206 let prAsAmtX18 = t1(prAmt, prAssetDcm)
207207 cpbi(prAsAmtX18, amtAsAmtX18)
208208 }
209209
210210
211211 func calcPrices (amAmt,prAmt,lpAmt) = {
212212 let cfg = gpc()
213213 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
214214 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
215215 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
216216 let amAmtX18 = t1(amAmt, amtAsDcm)
217217 let prAmtX18 = t1(prAmt, prAsDcm)
218218 let lpAmtX18 = t1(lpAmt, scale8)
219219 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
220220 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
221221 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
222222 }
223223
224224
225225 func calculatePrices (amAmt,prAmt,lpAmt) = {
226226 let p = calcPrices(amAmt, prAmt, lpAmt)
227227 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
228228 }
229229
230230
231231 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
232232 let cfg = gpc()
233233 let lpId = cfg[idxLPAsId]
234234 let amId = cfg[idxAmAsId]
235235 let prId = cfg[idxPrAsId]
236236 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
237237 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
238238 let sts = cfg[idxPoolSt]
239239 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
240240 if ((lpId != pmtAssetId))
241241 then throw("Wrong pmt asset")
242242 else {
243243 let amBalance = getAccBalance(amId)
244244 let prBalance = getAccBalance(prId)
245245 let amountBalanceDefaultDecimals = fraction(amBalance, defaultDecimals, amDcm)
246246 let priceBalanceDefaultDecimals = fraction(prBalance, defaultDecimals, prDcm)
247247 let amBalanceX18 = t1(amountBalanceDefaultDecimals, defaultDecimals)
248248 let prBalanceX18 = t1(priceBalanceDefaultDecimals, defaultDecimals)
249249 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
250250 let curPrice = f1(curPriceX18, scale8)
251251 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
252252 let lpEmissX18 = t1(lpEmiss, scale8)
253253 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
254254 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
255255 let outAmountAmountDefaultDecimals = f1(outAmAmtX18, defaultDecimals)
256256 let outPriceAmountDefaultDecimals = f1(outPrAmtX18, defaultDecimals)
257257 let outAmAmt = fraction(outAmountAmountDefaultDecimals, amDcm, defaultDecimals)
258258 let outPrAmt = fraction(outPriceAmountDefaultDecimals, prDcm, defaultDecimals)
259259 let state = if ((txId58 == ""))
260260 then nil
261261 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
262262 then unit
263263 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
264264 then unit
265265 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
266266 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
267267 }
268268 }
269269
270270
271271 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
272272 let cfg = gpc()
273273 let lpId = fromBase58String(cfg[idxLPAsId])
274274 let amIdStr = cfg[idxAmAsId]
275275 let prIdStr = cfg[idxPrAsId]
276276 let inAmIdStr = cfg[idxIAmtAsId]
277277 let inPrIdStr = cfg[idxIPriceAsId]
278278 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
279279 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
280280 let sts = cfg[idxPoolSt]
281281 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
282282 let amBalance = if (isEval)
283283 then getAccBalance(amIdStr)
284284 else if (if (isOneAsset)
285285 then (pmtId == amIdStr)
286286 else false)
287287 then (getAccBalance(amIdStr) - pmtAmt)
288288 else if (isOneAsset)
289289 then getAccBalance(amIdStr)
290290 else (getAccBalance(amIdStr) - inAmAmt)
291291 let prBalance = if (isEval)
292292 then getAccBalance(prIdStr)
293293 else if (if (isOneAsset)
294294 then (pmtId == prIdStr)
295295 else false)
296296 then (getAccBalance(prIdStr) - pmtAmt)
297297 else if (isOneAsset)
298298 then getAccBalance(prIdStr)
299299 else (getAccBalance(prIdStr) - inPrAmt)
300300 let amountBalanceDefaultDecimals = fraction(amBalance, defaultDecimals, amtDcm)
301301 let priceBalanceDefaultDecimals = fraction(prBalance, defaultDecimals, priceDcm)
302302 let inAmountAssetAmountDefaultDecimals = fraction(inAmAmt, defaultDecimals, amtDcm)
303303 let inPriceAssetAmountDefaultDecimals = fraction(inPrAmt, defaultDecimals, priceDcm)
304304 let inAmAssetAmtX18 = t1(inAmountAssetAmountDefaultDecimals, defaultDecimals)
305305 let inPrAssetAmtX18 = t1(inPriceAssetAmountDefaultDecimals, defaultDecimals)
306306 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
307307 let amBalanceX18 = t1(amountBalanceDefaultDecimals, defaultDecimals)
308308 let prBalanceX18 = t1(priceBalanceDefaultDecimals, defaultDecimals)
309309 let r = if ((lpEm == 0))
310310 then {
311311 let curPriceX18 = zeroBigInt
312312 let slippageX18 = zeroBigInt
313313 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
314314 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, defaultDecimals), f1(inPrAssetAmtX18, defaultDecimals), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
315315 }
316316 else {
317317 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
318318 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
319319 let slippageX18 = t1(slippage, scale8)
320320 if (if ((curPriceX18 != zeroBigInt))
321321 then (slippageRealX18 > slippageX18)
322322 else false)
323323 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
324324 else {
325325 let lpEmissionX18 = t1(lpEm, scale8)
326326 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
327327 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
328328 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
329329 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
330330 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
331331 let expAmtAssetAmtX18 = expectedAmts._1
332332 let expPriceAssetAmtX18 = expectedAmts._2
333333 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
334334 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, defaultDecimals), f1(expPriceAssetAmtX18, defaultDecimals), curPriceX18, slippageX18)
335335 }
336336 }
337337 let calcLpAmt = r._1
338338 let calcAmAssetPmt = fraction(r._2, amtDcm, defaultDecimals)
339339 let calcPrAssetPmt = fraction(r._3, priceDcm, defaultDecimals)
340340 let curPrice = f1(r._4, scale8)
341341 let slippageCalc = f1(r._5, scale8)
342342 if ((0 >= calcLpAmt))
343343 then throw("LP <= 0")
344344 else {
345345 let emitLpAmt = if (!(emitLp))
346346 then 0
347347 else calcLpAmt
348348 let amDiff = (inAmAmt - calcAmAssetPmt)
349349 let prDiff = (inPrAmt - calcPrAssetPmt)
350- let $t01664716992 = if (if (isOneAsset)
350+ let $t01664916994 = if (if (isOneAsset)
351351 then (pmtId == amIdStr)
352352 else false)
353353 then $Tuple2(pmtAmt, 0)
354354 else if (if (isOneAsset)
355355 then (pmtId == prIdStr)
356356 else false)
357357 then $Tuple2(0, pmtAmt)
358358 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
359- let writeAmAmt = $t01664716992._1
360- let writePrAmt = $t01664716992._2
359+ let writeAmAmt = $t01664916994._1
360+ let writePrAmt = $t01664916994._2
361361 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
362362 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
363363 }
364364 }
365365
366366
367367 func moa (order) = {
368368 let cfg = gpc()
369369 let amtAsId = cfg[idxAmAsId]
370370 let prAsId = cfg[idxPrAsId]
371371 let sts = parseIntValue(cfg[idxPoolSt])
372372 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
373373 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
374374 let accAmtAsBalance = getAccBalance(amtAsId)
375375 let accPrAsBalance = getAccBalance(prAsId)
376376 let curPriceX18 = if ((order.orderType == Buy))
377377 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
378378 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
379379 let curPrice = f1(curPriceX18, scale8)
380380 if (if (if (igs())
381381 then true
382382 else (sts == PoolMatcherDis))
383383 then true
384384 else (sts == PoolShutdown))
385385 then throw("Admin blocked")
386386 else {
387387 let orAmtAsset = order.assetPair.amountAsset
388388 let orAmtAsStr = if ((orAmtAsset == unit))
389389 then "WAVES"
390390 else toBase58String(value(orAmtAsset))
391391 let orPrAsset = order.assetPair.priceAsset
392392 let orPrAsStr = if ((orPrAsset == unit))
393393 then "WAVES"
394394 else toBase58String(value(orPrAsset))
395395 if (if ((orAmtAsStr != amtAsId))
396396 then true
397397 else (orPrAsStr != prAsId))
398398 then throw("Wr assets")
399399 else {
400400 let orderPrice = order.price
401401 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
402402 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
403403 let isOrderPriceValid = if ((order.orderType == Buy))
404404 then (curPrice >= castOrderPrice)
405405 else (castOrderPrice >= curPrice)
406406 true
407407 }
408408 }
409409 }
410410
411411
412412 func cg (i) = if ((size(i.payments) != 1))
413413 then throw("1 pmnt exp")
414414 else {
415415 let pmt = value(i.payments[0])
416416 let pmtAssetId = value(pmt.assetId)
417417 let pmtAmt = pmt.amount
418418 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
419419 let outAmAmt = r._1
420420 let outPrAmt = r._2
421421 let sts = parseIntValue(r._9)
422422 let state = r._10
423423 if (if (igs())
424424 then true
425425 else (sts == PoolShutdown))
426426 then throw(("Admin blocked: " + toString(sts)))
427427 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
428428 }
429429
430430
431431 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
432432 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
433433 let sts = parseIntValue(r._8)
434434 if (if (if (igs())
435435 then true
436436 else (sts == PoolPutDis))
437437 then true
438438 else (sts == PoolShutdown))
439439 then throw(("Blocked:" + toString(sts)))
440440 else r
441441 }
442442
443443
444444 func m () = match getString(mpk()) {
445445 case s: String =>
446446 fromBase58String(s)
447447 case _: Unit =>
448448 unit
449449 case _ =>
450450 throw("Match error")
451451 }
452452
453453
454454 func pm () = match getString(pmpk()) {
455455 case s: String =>
456456 fromBase58String(s)
457457 case _: Unit =>
458458 unit
459459 case _ =>
460460 throw("Match error")
461461 }
462462
463463
464464 let pd = throw("Permission denied")
465465
466466 func mm (i) = match m() {
467467 case pk: ByteVector =>
468468 if ((i.callerPublicKey == pk))
469469 then true
470470 else pd
471471 case _: Unit =>
472472 if ((i.caller == this))
473473 then true
474474 else pd
475475 case _ =>
476476 throw("Match error")
477477 }
478478
479479
480480 @Callable(i)
481481 func constructor (fc) = {
482482 let c = mm(i)
483483 if ((c == c))
484484 then [StringEntry(fc(), fc)]
485485 else throw("Strict value is not equal to itself.")
486486 }
487487
488488
489489
490490 @Callable(i)
491491 func setManager (pendingManagerPublicKey) = {
492492 let c = mm(i)
493493 if ((c == c))
494494 then {
495495 let cm = fromBase58String(pendingManagerPublicKey)
496496 if ((cm == cm))
497497 then [StringEntry(pmpk(), pendingManagerPublicKey)]
498498 else throw("Strict value is not equal to itself.")
499499 }
500500 else throw("Strict value is not equal to itself.")
501501 }
502502
503503
504504
505505 @Callable(i)
506506 func confirmManager () = {
507507 let p = pm()
508508 let hpm = if (isDefined(p))
509509 then true
510510 else throw("No pending manager")
511511 if ((hpm == hpm))
512512 then {
513513 let cpm = if ((i.callerPublicKey == value(p)))
514514 then true
515515 else throw("You are not pending manager")
516516 if ((cpm == cpm))
517517 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
518518 else throw("Strict value is not equal to itself.")
519519 }
520520 else throw("Strict value is not equal to itself.")
521521 }
522522
523523
524524
525525 @Callable(i)
526526 func put (slip,autoStake) = {
527527 let factCfg = gfc()
528528 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
529529 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
530530 if ((0 > slip))
531531 then throw("Wrong slippage")
532532 else if ((size(i.payments) != 2))
533533 then throw("2 pmnts expd")
534534 else {
535535 let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, 0, "")
536536 let emitLpAmt = e._2
537537 let lpAssetId = e._7
538538 let state = e._9
539539 let amDiff = e._10
540540 let prDiff = e._11
541541 let amId = e._12
542542 let prId = e._13
543543 let r = invoke(fca, "emit", [emitLpAmt], nil)
544544 if ((r == r))
545545 then {
546546 let el = match r {
547547 case legacy: Address =>
548548 invoke(legacy, "emit", [emitLpAmt], nil)
549549 case _ =>
550550 unit
551551 }
552552 if ((el == el))
553553 then {
554554 let sa = if ((amDiff > 0))
555555 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
556556 else nil
557557 if ((sa == sa))
558558 then {
559559 let sp = if ((prDiff > 0))
560560 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
561561 else nil
562562 if ((sp == sp))
563563 then {
564564 let lpTrnsfr = if (autoStake)
565565 then {
566566 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
567567 if ((ss == ss))
568568 then nil
569569 else throw("Strict value is not equal to itself.")
570570 }
571571 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
572572 (state ++ lpTrnsfr)
573573 }
574574 else throw("Strict value is not equal to itself.")
575575 }
576576 else throw("Strict value is not equal to itself.")
577577 }
578578 else throw("Strict value is not equal to itself.")
579579 }
580580 else throw("Strict value is not equal to itself.")
581581 }
582582 }
583583
584584
585585
586586 @Callable(i)
587587 func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
588588 let cfg = gfc()
589589 let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
590590 let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
591591 let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
592592 let poolCfg = gpc()
593593 let amId = poolCfg[idxAmAsId]
594594 let prId = poolCfg[idxPrAsId]
595595 let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
596596 let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
597597 let addon = valueOrElse(getString(this, ada()), "")
598598 let userAddress = if ((addon == toString(i.caller)))
599599 then i.originCaller
600600 else i.caller
601601 if (if (if (if ((0 >= slippage))
602602 then true
603603 else (0 >= amAssetPart))
604604 then true
605605 else (0 >= prAssetPart))
606606 then true
607607 else (0 >= outLp))
608608 then throw("Wrong params")
609609 else if ((size(i.payments) != 1))
610610 then throw("1 pmnt expd")
611611 else {
612612 let pmt = value(i.payments[0])
613613 let pmtAssetId = toBase58String(value(pmt.assetId))
614614 let pmtDecimals = value(assetInfo(value(i.payments[0].assetId))).decimals
615615 let pmtAmt = pmt.amount
616616 let pmtAmtDefaultDecimals = ((pmtAmt * defaultDecimals) / pow(10, 0, pmtDecimals, 0, 0, DOWN))
617617 if ((10000000 > pmtAmtDefaultDecimals))
618618 then throw("Wrong pmt amt")
619619 else {
620620 let amBalance = getAccBalance(amId)
621621 let prBalance = getAccBalance(prId)
622- let $t02583626532 = if ((pmtAssetId == amId))
623- then if (if ((pmtAmtDefaultDecimals > amBalance))
622+ let amBalanceDefaultDecimals = ((amBalance * defaultDecimals) / pow(10, 0, amDcm, 0, 0, DOWN))
623+ let prBalanceDefaultDecimals = ((prBalance * defaultDecimals) / pow(10, 0, prDcm, 0, 0, DOWN))
624+ let $t02602926815 = if ((pmtAssetId == amId))
625+ then if (if ((pmtAmtDefaultDecimals > amBalanceDefaultDecimals))
624626 then true
625627 else (amAssetPart > pmtAmtDefaultDecimals))
626628 then throw("invalid payment amount")
627- else $Tuple6((amBalance - pmtAmtDefaultDecimals), prBalance, (pmtAmtDefaultDecimals - amAssetPart), prAssetPart, 0, 0)
629+ else $Tuple6((amBalanceDefaultDecimals - pmtAmtDefaultDecimals), prBalanceDefaultDecimals, (pmtAmtDefaultDecimals - amAssetPart), prAssetPart, 0, 0)
628630 else if ((pmtAssetId == prId))
629- then if (if ((pmtAmtDefaultDecimals > prBalance))
631+ then if (if ((pmtAmtDefaultDecimals > prBalanceDefaultDecimals))
630632 then true
631633 else (prAssetPart > pmtAmtDefaultDecimals))
632634 then throw("invalid payment amount")
633- else $Tuple6(amBalance, (prBalance - pmtAmtDefaultDecimals), 0, 0, (pmtAmtDefaultDecimals - prAssetPart), amAssetPart)
635+ else $Tuple6(amBalanceDefaultDecimals, (prBalanceDefaultDecimals - pmtAmtDefaultDecimals), 0, 0, (pmtAmtDefaultDecimals - prAssetPart), amAssetPart)
634636 else throw("wrong pmtAssetId")
635- let amBalanceNow = $t02583626532._1
636- let prBalanceNow = $t02583626532._2
637- let virtSwapInAm = $t02583626532._3
638- let virtSwapOutPr = $t02583626532._4
639- let virtSwapInPr = $t02583626532._5
640- let virtSwapOutAm = $t02583626532._6
637+ let amBalanceNow = $t02602926815._1
638+ let prBalanceNow = $t02602926815._2
639+ let virtSwapInAm = $t02602926815._3
640+ let virtSwapOutPr = $t02602926815._4
641+ let virtSwapInPr = $t02602926815._5
642+ let virtSwapOutAm = $t02602926815._6
641643 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
642644 let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
643645 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
644646 if ((D0vsD1 == D0vsD1))
645647 then {
646648 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
647649 let estimLP = estPut._2
648650 let lpAssetId = estPut._7
649651 let state = estPut._9
650652 let amDiff = estPut._10
651653 let prDiff = estPut._11
652654 let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
653655 let emitLpAmt = toInt(lpCalcRes._2)
654656 let e = invoke(fca, "emit", [emitLpAmt], nil)
655657 if ((e == e))
656658 then {
657659 let el = match e {
658660 case legacy: Address =>
659661 invoke(legacy, "emit", [emitLpAmt], nil)
660662 case _ =>
661663 unit
662664 }
663665 if ((el == el))
664666 then {
665667 let sa = if ((amDiff > 0))
666668 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
667669 else nil
668670 if ((sa == sa))
669671 then {
670672 let sp = if ((prDiff > 0))
671673 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
672674 else nil
673675 if ((sp == sp))
674676 then {
675677 let lpTrnsfr = if (autoStake)
676678 then {
677679 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
678680 if ((ss == ss))
679681 then nil
680682 else throw("Strict value is not equal to itself.")
681683 }
682684 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
683685 (state ++ lpTrnsfr)
684686 }
685687 else throw("Strict value is not equal to itself.")
686688 }
687689 else throw("Strict value is not equal to itself.")
688690 }
689691 else throw("Strict value is not equal to itself.")
690692 }
691693 else throw("Strict value is not equal to itself.")
692694 }
693695 else throw("Strict value is not equal to itself.")
694696 }
695697 }
696698 }
697699
698700
699701
700702 @Callable(i)
701703 func putForFree (maxSlpg) = if ((0 > maxSlpg))
702704 then throw("Wrong slpg")
703705 else if ((size(i.payments) != 2))
704706 then throw("2 pmnts expd")
705707 else {
706708 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, 0, "")
707709 estPut._9
708710 }
709711
710712
711713
712714 @Callable(i)
713715 func get () = {
714716 let r = cg(i)
715717 let outAmtAmt = r._1
716718 let outPrAmt = r._2
717719 let pmtAmt = r._3
718720 let pmtAssetId = r._4
719721 let state = r._5
720722 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
721723 if ((b == b))
722724 then state
723725 else throw("Strict value is not equal to itself.")
724726 }
725727
726728
727729
728730 @Callable(i)
729731 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
730732 then throw("1 pmnt expd")
731733 else {
732734 let cfg = gpc()
733735 let lpId = cfg[idxLPAsId]
734736 let amId = cfg[idxAmAsId]
735737 let prId = cfg[idxPrAsId]
736738 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
737739 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
738740 let sts = cfg[idxPoolSt]
739741 let factCfg = gfc()
740742 let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
741743 let pmt = value(i.payments[0])
742744 let addon = valueOrElse(getString(this, ada()), "")
743745 let userAddress = if ((addon == toString(i.caller)))
744746 then i.originCaller
745747 else i.caller
746748 let txId58 = toBase58String(i.transactionId)
747749 let pmtAssetId = value(pmt.assetId)
748750 let pmtAmt = pmt.amount
749751 if ((1000000000 > pmtAmt))
750752 then throw("Min pmt 10 LP")
751753 else if (if (if ((0 > slippage))
752754 then true
753755 else (0 > exchResult))
754756 then true
755757 else (0 > outAmount))
756758 then throw("Wrong params")
757759 else if ((lpId != toBase58String(pmtAssetId)))
758760 then throw("Wrong LP")
759761 else {
760762 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
761763 let estimAmAmt = r._1
762764 let estimPrAmt = r._2
763765 let amBalance = getAccBalance(amId)
764766 let prBalance = getAccBalance(prId)
765- let $t03131131768 = if ((outAssetId == amId))
767+ let $t03159432051 = if ((outAssetId == amId))
766768 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
767769 else if ((outAssetId == prId))
768770 then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
769771 else throw("wrong outAssetId")
770- let amBalanceNow = $t03131131768._1
771- let prBalanceNow = $t03131131768._2
772- let virtSwapInAm = $t03131131768._3
773- let virtSwapOutPr = $t03131131768._4
774- let virtSwapInPr = $t03131131768._5
775- let virtSwapOutAm = $t03131131768._6
776- let totalGet = $t03131131768._7
772+ let amBalanceNow = $t03159432051._1
773+ let prBalanceNow = $t03159432051._2
774+ let virtSwapInAm = $t03159432051._3
775+ let virtSwapOutPr = $t03159432051._4
776+ let virtSwapInPr = $t03159432051._5
777+ let virtSwapOutAm = $t03159432051._6
778+ let totalGet = $t03159432051._7
777779 if (if ((0 > virtSwapInAm))
778780 then true
779781 else (0 > virtSwapInPr))
780782 then throw("Wrong calc")
781783 else {
782784 let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
783785 let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
784786 let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
785787 if ((D0vsD1 == D0vsD1))
786788 then {
787789 let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
788790 if ((finalRes == finalRes))
789791 then {
790- let $t03247332577 = if ((outAssetId == amId))
792+ let $t03275632860 = if ((outAssetId == amId))
791793 then $Tuple2(toInt(finalRes._2), 0)
792794 else $Tuple2(0, toInt(finalRes._2))
793- let outAm = $t03247332577._1
794- let outPr = $t03247332577._2
795+ let outAm = $t03275632860._1
796+ let outPr = $t03275632860._2
795797 let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
796798 let curPr = f1(curPrX18, scale8)
797799 let state = [ScriptTransfer(userAddress, (outAm + outPr), if ((outAssetId == "WAVES"))
798800 then unit
799801 else fromBase58String(outAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
800802 if ((state == state))
801803 then {
802804 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
803805 if ((burn == burn))
804806 then state
805807 else throw("Strict value is not equal to itself.")
806808 }
807809 else throw("Strict value is not equal to itself.")
808810 }
809811 else throw("Strict value is not equal to itself.")
810812 }
811813 else throw("Strict value is not equal to itself.")
812814 }
813815 }
814816 }
815817
816818
817819
818820 @Callable(i)
819821 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
820822 let r = cg(i)
821823 let outAmAmt = r._1
822824 let outPrAmt = r._2
823825 let pmtAmt = r._3
824826 let pmtAssetId = r._4
825827 let state = r._5
826828 if ((noLessThenAmtAsset > outAmAmt))
827829 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
828830 else if ((noLessThenPriceAsset > outPrAmt))
829831 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
830832 else {
831833 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
832834 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
833835 then state
834836 else throw("Strict value is not equal to itself.")
835837 }
836838 }
837839
838840
839841
840842 @Callable(i)
841843 func unstakeAndGet (amount) = {
842844 let checkPayments = if ((size(i.payments) != 0))
843845 then throw("No pmnts expd")
844846 else true
845847 if ((checkPayments == checkPayments))
846848 then {
847849 let cfg = gpc()
848850 let factoryCfg = gfc()
849851 let lpAssetId = fromBase58String(cfg[idxLPAsId])
850852 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
851853 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
852854 if ((unstakeInv == unstakeInv))
853855 then {
854856 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
855857 let sts = parseIntValue(r._9)
856858 let state = r._10
857859 let v = if (if (igs())
858860 then true
859861 else (sts == PoolShutdown))
860862 then throw(("Blocked: " + toString(sts)))
861863 else true
862864 if ((v == v))
863865 then {
864866 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
865867 if ((burnA == burnA))
866868 then state
867869 else throw("Strict value is not equal to itself.")
868870 }
869871 else throw("Strict value is not equal to itself.")
870872 }
871873 else throw("Strict value is not equal to itself.")
872874 }
873875 else throw("Strict value is not equal to itself.")
874876 }
875877
876878
877879
878880 @Callable(i)
879881 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
880882 then throw("denied")
881883 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
882884
883885
884886
885887 @Callable(i)
886888 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
887889 then pd
888890 else [StringEntry(k, v)]
889891
890892
891893
892894 @Callable(i)
893895 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
894896 then pd
895897 else [IntegerEntry(k, v)]
896898
897899
898900
899901 @Callable(i)
900902 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
901903
902904
903905
904906 @Callable(i)
905907 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
906908
907909
908910
909911 @Callable(i)
910912 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
911913 let pr = calcPrices(amAmt, prAmt, lpAmt)
912914 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
913915 }
914916
915917
916918
917919 @Callable(i)
918920 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
919921
920922
921923
922924 @Callable(i)
923925 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
924926
925927
926928
927929 @Callable(i)
928930 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
929931
930932
931933
932934 @Callable(i)
933935 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, false, 0, ""))
934936
935937
936938
937939 @Callable(i)
938940 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
939941 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
940942 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
941943 }
942944
943945
944946 @Verifier(tx)
945947 func verify () = {
946948 let targetPublicKey = match m() {
947949 case pk: ByteVector =>
948950 pk
949951 case _: Unit =>
950952 tx.senderPublicKey
951953 case _ =>
952954 throw("Match error")
953955 }
954956 match tx {
955957 case order: Order =>
956958 let matcherPub = mp()
957959 let orderValid = moa(order)
958960 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
959961 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
960962 if (if (if (orderValid)
961963 then senderValid
962964 else false)
963965 then matcherValid
964966 else false)
965967 then true
966968 else toe(orderValid, senderValid, matcherValid)
967969 case s: SetScriptTransaction =>
968970 let newHash = blake2b256(value(s.script))
969971 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
970972 let currentHash = scriptHash(this)
971973 if (if ((allowedHash == newHash))
972974 then (currentHash != newHash)
973975 else false)
974976 then true
975977 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
976978 case _ =>
977979 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
978980 }
979981 }
980982

github/deemru/w8io/c3f4982 
121.24 ms