tx · HHC5SLqKu2qc7FqHQEzrn238VJJWGwMKeA8zAioMA9C3

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.01400000 Waves

2021.12.25 13:48 [1849697] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "HHC5SLqKu2qc7FqHQEzrn238VJJWGwMKeA8zAioMA9C3", "fee": 1400000, "feeAssetId": null, "timestamp": 1640429395577, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "67j9gHG6rmwcDz2SogPuHcqYuBft2XyaTVM6e7JPQF2yW7WpXkw5nJKPMVtjaFkFAqTejmoYjUMeAqD5AqXeGEpg" ], "script": "base64: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AgAAABElc19fZmFjdG9yeUNvbmZpZwEAAAANa2V5TWF0Y2hlclB1YgAAAAACAAAAGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQEAAAANa2V5UG9vbENvbmZpZwAAAAIAAAAJaUFtdEFzc2V0AAAAC2lQcmljZUFzc2V0CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACCVkJWQlc19fBQAAAAlpQW10QXNzZXQCAAAAAl9fBQAAAAtpUHJpY2VBc3NldAIAAAAIX19jb25maWcBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABAAAADGJhc2VBc3NldFN0cgkAASwAAAACAgAAACglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQAAAAxiYXNlQXNzZXRTdHIBAAAAE2tleUFsbFBvb2xzU2h1dGRvd24AAAAAAgAAAAwlc19fc2h1dGRvd24BAAAADWtleVBvb2xXZWlnaHQAAAABAAAAD2NvbnRyYWN0QWRkcmVzcwkAASwAAAACAgAAABIlcyVzX19wb29sV2VpZ2h0X18FAAAAD2NvbnRyYWN0QWRkcmVzcwEAAAAPdGhyb3dPcmRlckVycm9yAAAAAwAAAApvcmRlclZhbGlkAAAAC3NlbmRlclZhbGlkAAAADG1hdGNoZXJWYWxpZAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAeVmFsaWRhdGlvbiBmYWlsZWQ6IG9yZGVyVmFsaWQ9CQABpQAAAAEFAAAACm9yZGVyVmFsaWQCAAAADSBzZW5kZXJWYWxpZD0JAAGlAAAAAQUAAAALc2VuZGVyVmFsaWQCAAAADiBtYXRjaGVyVmFsaWQ9CQABpQAAAAEFAAAADG1hdGNoZXJWYWxpZAEAAAAIYXNTdHJpbmcAAAABAAAAA3ZhbAQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAABnZhbFN0cgUAAAAHJG1hdGNoMAUAAAAGdmFsU3RyCQAAAgAAAAECAAAAE2ZhaWwgY2FzdCB0byBTdHJpbmcBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAS5AAAAAgkABEwAAAACAgAAAAptYW5kYXRvcnkgCQAETAAAAAIJAAQlAAAAAQUAAAAHYWRkcmVzcwkABEwAAAACAgAAAAEuCQAETAAAAAIFAAAAA2tleQkABEwAAAACAgAAAA8gaXMgbm90IGRlZmluZWQFAAAAA25pbAIAAAAAAQAAAAxnZXRJbnRPckZhaWwAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQAEuQAAAAIJAARMAAAAAgIAAAAKbWFuZGF0b3J5IAkABEwAAAACCQAEJQAAAAEFAAAAB2FkZHJlc3MJAARMAAAAAgIAAAABLgkABEwAAAACBQAAAANrZXkJAARMAAAAAgIAAAAPIGlzIG5vdCBkZWZpbmVkBQAAAANuaWwCAAAAAAAAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAC2tleUZhY3RDbnRyAAAAAAEAAAAQaXNHbG9iYWxTaHV0ZG93bgAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAATa2V5QWxsUG9vbHNTaHV0ZG93bgAAAAAHAQAAABNnZXRNYXRjaGVyUHViT3JGYWlsAAAAAAkAAlkAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAANa2V5TWF0Y2hlclB1YgAAAAABAAAADWdldFBvb2xDb25maWcAAAAABAAAAAVhbXRBcwkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAABHRoaXMJAQAAAAtrZXlBbXRBc3NldAAAAAAEAAAAB3ByaWNlQXMJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAR0aGlzCQEAAAANa2V5UHJpY2VBc3NldAAAAAAEAAAACGlQcmljZUFzCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEFAAAAB3ByaWNlQXMEAAAABmlBbXRBcwkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABBQAAAAVhbXRBcwkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAANa2V5UG9vbENvbmZpZwAAAAIJAAGkAAAAAQUAAAAGaUFtdEFzCQABpAAAAAEFAAAACGlQcmljZUFzBQAAAANTRVABAAAAEGdldEZhY3RvcnlDb25maWcAAAAACQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABBrZXlGYWN0b3J5Q29uZmlnAAAAAAUAAAADU0VQAQAAABFkYXRhUHV0QWN0aW9uSW5mbwAAAAoAAAANaW5BbXRBc3NldEFtdAAAAA9pblByaWNlQXNzZXRBbXQAAAAIb3V0THBBbXQAAAAFcHJpY2UAAAAOc2xpcHBhZ2VCeVVzZXIAAAAMc2xpcHBhZ2VSZWFsAAAACHR4SGVpZ2h0AAAAC3R4VGltZXN0YW1wAAAADHNsaXBhZ2VBbUFtdAAAAAxzbGlwYWdlUHJBbXQJAAS5AAAAAgkABEwAAAACAgAAABQlZCVkJWQlZCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAADWluQW10QXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAA9pblByaWNlQXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAAhvdXRMcEFtdAkABEwAAAACCQABpAAAAAEFAAAABXByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAOc2xpcHBhZ2VCeVVzZXIJAARMAAAAAgkAAaQAAAABBQAAAAxzbGlwcGFnZVJlYWwJAARMAAAAAgkAAaQAAAABBQAAAAh0eEhlaWdodAkABEwAAAACCQABpAAAAAEFAAAAC3R4VGltZXN0YW1wCQAETAAAAAIJAAGkAAAAAQUAAAAMc2xpcGFnZUFtQW10CQAETAAAAAIJAAGkAAAAAQUAAAAMc2xpcGFnZVByQW10BQAAAANuaWwFAAAAA1NFUAEAAAARZGF0YUdldEFjdGlvbkluZm8AAAAGAAAADm91dEFtdEFzc2V0QW10AAAAEG91dFByaWNlQXNzZXRBbXQAAAAHaW5McEFtdAAAAAVwcmljZQAAAAh0eEhlaWdodAAAAAt0eFRpbWVzdGFtcAkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAADm91dEFtdEFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAQb3V0UHJpY2VBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAB2luTHBBbXQJAARMAAAAAgkAAaQAAAABBQAAAAVwcmljZQkABEwAAAACCQABpAAAAAEFAAAACHR4SGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAALdHhUaW1lc3RhbXAFAAAAA25pbAUAAAADU0VQAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQAAAAdhc3NldElkAwkAAAAAAAACBQAAAAdhc3NldElkAgAAAAVXQVZFUwgJAAPvAAAAAQUAAAAEdGhpcwAAAAlhdmFpbGFibGUJAAPwAAAAAgUAAAAEdGhpcwkAAlkAAAABBQAAAAdhc3NldElkAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACAAAACHByQW10WDE4AAAACGFtQW10WDE4CQABPAAAAAMFAAAACHByQW10WDE4BQAAAAdzY2FsZTE4BQAAAAhhbUFtdFgxOAEAAAALY2FsY0Fic0RpZmYAAAADAAAAB3JlYWxBbXQAAAALZXhwZWN0ZWRBbXQAAAAIc2xpcHBhZ2UEAAAABGRpZmYJAAE8AAAAAwkAATgAAAACBQAAAAdyZWFsQW10BQAAAAtleHBlY3RlZEFtdAUAAAAMc2NhbGU4QmlnSW50BQAAAAtleHBlY3RlZEFtdAkABRUAAAADCQABPwAAAAIJAAE4AAAAAgUAAAAIc2xpcHBhZ2UJAQAAAANhYnMAAAABBQAAAARkaWZmBQAAAAp6ZXJvQmlnSW50CQABmQAAAAEJAARMAAAAAgUAAAAHcmVhbEFtdAkABEwAAAACBQAAAAtleHBlY3RlZEFtdAUAAAADbmlsBQAAAARkaWZmAQAAABBwcml2YXRlQ2FsY1ByaWNlAAAABAAAAAphbUFzc2V0RGNtAAAACnByQXNzZXREY20AAAAFYW1BbXQAAAAFcHJBbXQEAAAAC2FtdEFzQW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAVhbUFtdAUAAAAKYW1Bc3NldERjbQQAAAAKcHJBc0FtdFgxOAkBAAAABXRvWDE4AAAAAgUAAAAFcHJBbXQFAAAACnByQXNzZXREY20JAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAAApwckFzQW10WDE4BQAAAAthbXRBc0FtdFgxOAEAAAAKY2FsY1ByaWNlcwAAAAMAAAAFYW1BbXQAAAAFcHJBbXQAAAAFbHBBbXQEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAhhbXRBc0RjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAALaWR4QW10QXNEY20EAAAAB3ByQXNEY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAADWlkeFByaWNlQXNEY20EAAAACHByaWNlWDE4CQEAAAAQcHJpdmF0ZUNhbGNQcmljZQAAAAQFAAAACGFtdEFzRGNtBQAAAAdwckFzRGNtBQAAAAVhbUFtdAUAAAAFcHJBbXQEAAAACGFtQW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAVhbUFtdAUAAAAIYW10QXNEY20EAAAACHByQW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAVwckFtdAUAAAAHcHJBc0RjbQQAAAAIbHBBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAABWxwQW10BQAAAAZzY2FsZTgEAAAADWxwUHJJbkFtQXNYMTgJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAAAhhbUFtdFgxOAUAAAAIbHBBbXRYMTgEAAAADWxwUHJJblByQXNYMTgJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAAAhwckFtdFgxOAUAAAAIbHBBbXRYMTgJAARMAAAAAgUAAAAIcHJpY2VYMTgJAARMAAAAAgUAAAANbHBQckluQW1Bc1gxOAkABEwAAAACBQAAAA1scFBySW5QckFzWDE4BQAAAANuaWwBAAAAD2NhbGN1bGF0ZVByaWNlcwAAAAMAAAAFYW1BbXQAAAAFcHJBbXQAAAAFbHBBbXQEAAAABnByaWNlcwkBAAAACmNhbGNQcmljZXMAAAADBQAAAAVhbUFtdAUAAAAFcHJBbXQFAAAABWxwQW10CQAETAAAAAIJAQAAAAdmcm9tWDE4AAAAAgkAAZEAAAACBQAAAAZwcmljZXMAAAAAAAAAAAAFAAAABnNjYWxlOAkABEwAAAACCQEAAAAHZnJvbVgxOAAAAAIJAAGRAAAAAgUAAAAGcHJpY2VzAAAAAAAAAAABBQAAAAZzY2FsZTgJAARMAAAAAgkBAAAAB2Zyb21YMTgAAAACCQABkQAAAAIFAAAABnByaWNlcwAAAAAAAAAAAgUAAAAGc2NhbGU4BQAAAANuaWwBAAAAFGVzdGltYXRlR2V0T3BlcmF0aW9uAAAABAAAAAZ0eElkNTgAAAAKcG10QXNzZXRJZAAAAAhwbXRMcEFtdAAAAAt1c2VyQWRkcmVzcwQAAAADY2ZnCQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAABGxwSWQJAAGRAAAAAgUAAAADY2ZnBQAAAAlpZHhMUEFzSWQEAAAABGFtSWQJAAGRAAAAAgUAAAADY2ZnBQAAAAlpZHhBbUFzSWQEAAAABHBySWQJAAGRAAAAAgUAAAADY2ZnBQAAAAlpZHhQckFzSWQEAAAABWFtRGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAAtpZHhBbXRBc0RjbQQAAAAFcHJEY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAADWlkeFByaWNlQXNEY20EAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhQb29sU3RhdHVzBAAAAApscEVtaXNzaW9uCAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEJAAJZAAAAAQUAAAAEbHBJZAIAAAANSW52YWxpZCBMUCBpZAAAAAhxdWFudGl0eQMJAQAAAAIhPQAAAAIFAAAABGxwSWQFAAAACnBtdEFzc2V0SWQJAAACAAAAAQIAAAARSW52YWxpZCBwbXQgYXNzZXQEAAAACWFtQmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAARhbUlkBAAAAAxhbUJhbGFuY2VYMTgJAQAAAAV0b1gxOAAAAAIFAAAACWFtQmFsYW5jZQUAAAAFYW1EY20EAAAACXByQmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAARwcklkBAAAAAxwckJhbGFuY2VYMTgJAQAAAAV0b1gxOAAAAAIFAAAACXByQmFsYW5jZQUAAAAFcHJEY20EAAAAC2N1clByaWNlWDE4CQEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgUAAAAMcHJCYWxhbmNlWDE4BQAAAAxhbUJhbGFuY2VYMTgEAAAACGN1clByaWNlCQEAAAAHZnJvbVgxOAAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAZzY2FsZTgEAAAAC3BtdExwQW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAhwbXRMcEFtdAUAAAAGc2NhbGU4BAAAAA1scEVtaXNzaW9uWDE4CQEAAAAFdG9YMTgAAAACBQAAAApscEVtaXNzaW9uBQAAAAZzY2FsZTgEAAAAC291dEFtQW10WDE4CQABPAAAAAMFAAAADGFtQmFsYW5jZVgxOAUAAAALcG10THBBbXRYMTgFAAAADWxwRW1pc3Npb25YMTgEAAAAC291dFByQW10WDE4CQABPAAAAAMFAAAADHByQmFsYW5jZVgxOAUAAAALcG10THBBbXRYMTgFAAAADWxwRW1pc3Npb25YMTgEAAAACG91dEFtQW10CQEAAAAHZnJvbVgxOAAAAAIFAAAAC291dEFtQW10WDE4BQAAAAVhbURjbQQAAAAIb3V0UHJBbXQJAQAAAAdmcm9tWDE4AAAAAgUAAAALb3V0UHJBbXRYMTgFAAAABXByRGNtBAAAAAVzdGF0ZQMJAAAAAAAAAgUAAAAGdHhJZDU4AgAAAAAFAAAAA25pbAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAAIb3V0QW1BbXQDCQAAAAAAAAIFAAAABGFtSWQCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAABGFtSWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAACG91dFByQW10AwkAAAAAAAACBQAAAARwcklkAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAARwcklkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlHZXRBY3Rpb25CeVVzZXIAAAACCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAZ0eElkNTgJAQAAABFkYXRhR2V0QWN0aW9uSW5mbwAAAAYFAAAACG91dEFtQW10BQAAAAhvdXRQckFtdAUAAAAIcG10THBBbXQFAAAACGN1clByaWNlBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAAUAAAAIY3VyUHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAhjdXJQcmljZQUAAAADbmlsCQAFHAAAAAoFAAAACG91dEFtQW10BQAAAAhvdXRQckFtdAUAAAAEYW1JZAUAAAAEcHJJZAUAAAAJYW1CYWxhbmNlBQAAAAlwckJhbGFuY2UFAAAACmxwRW1pc3Npb24FAAAAC2N1clByaWNlWDE4BQAAAApwb29sU3RhdHVzBQAAAAVzdGF0ZQEAAAAUZXN0aW1hdGVQdXRPcGVyYXRpb24AAAAJAAAABnR4SWQ1OAAAAAhzbGlwcGFnZQAAAAdpbkFtQW10AAAABmluQW1JZAAAAAdpblByQW10AAAABmluUHJJZAAAAAt1c2VyQWRkcmVzcwAAAAppc0V2YWx1YXRlAAAABmVtaXRMcAQAAAADY2ZnCQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAABGxwSWQJAAJZAAAAAQkAAZEAAAACBQAAAANjZmcFAAAACWlkeExQQXNJZAQAAAAHYW1JZFN0cgkAAZEAAAACBQAAAANjZmcFAAAACWlkeEFtQXNJZAQAAAAHcHJJZFN0cgkAAZEAAAACBQAAAANjZmcFAAAACWlkeFByQXNJZAQAAAAJaW5BbUlkU3RyCQABkQAAAAIFAAAAA2NmZwUAAAALaWR4SUFtdEFzSWQEAAAACWluUHJJZFN0cgkAAZEAAAACBQAAAANjZmcFAAAADWlkeElQcmljZUFzSWQEAAAABmFtdERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAALaWR4QW10QXNEY20EAAAACHByaWNlRGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhQcmljZUFzRGNtBAAAAApwb29sU3RhdHVzCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UG9vbFN0YXR1cwQAAAAKbHBFbWlzc2lvbggJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAARscElkAgAAAA5Xcm9uZyBscCBhc3NldAAAAAhxdWFudGl0eQQAAAAJYW1CYWxhbmNlAwUAAAAKaXNFdmFsdWF0ZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdhbUlkU3RyCQAAZQAAAAIJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAHYW1JZFN0cgUAAAAHaW5BbUFtdAQAAAAJcHJCYWxhbmNlAwUAAAAKaXNFdmFsdWF0ZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdwcklkU3RyCQAAZQAAAAIJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAHcHJJZFN0cgUAAAAHaW5QckFtdAMGCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADWxwRW1pc3Npb24gPSAJAAGkAAAAAQUAAAAKbHBFbWlzc2lvbgIAAAANIGFtQmFsYW5jZSA9IAkAAaQAAAABBQAAAAlhbUJhbGFuY2UCAAAADSBwckJhbGFuY2UgPSAJAAGkAAAAAQUAAAAJcHJCYWxhbmNlAgAAABogZ2V0QWNjQmFsYW5jZShhbUlkU3RyKSA9IAkAAaQAAAABCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB2FtSWRTdHICAAAAGSBldEFjY0JhbGFuY2UocHJJZFN0cikgPSAJAAGkAAAAAQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdwcklkU3RyBAAAAA9pbkFtQXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAAB2luQW1BbXQFAAAABmFtdERjbQQAAAAPaW5QckFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAdpblByQW10BQAAAAhwcmljZURjbQQAAAAMdXNlclByaWNlWDE4CQEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgUAAAAPaW5QckFzc2V0QW10WDE4BQAAAA9pbkFtQXNzZXRBbXRYMTgEAAAADGFtQmFsYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAAJYW1CYWxhbmNlBQAAAAZhbXREY20EAAAADHByQmFsYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAAJcHJCYWxhbmNlBQAAAAhwcmljZURjbQQAAAADcmVzAwkAAAAAAAACBQAAAApscEVtaXNzaW9uAAAAAAAAAAAABAAAAAtjdXJQcmljZVgxOAUAAAAKemVyb0JpZ0ludAQAAAALc2xpcHBhZ2VYMTgFAAAACnplcm9CaWdJbnQEAAAACGxwQW10WDE4CQAAdgAAAAYJAAE5AAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAA9pblByQXNzZXRBbXRYMTgAAAAAAAAAAAAJAAE2AAAAAQAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgkABRcAAAAFCQEAAAAHZnJvbVgxOAAAAAIFAAAACGxwQW10WDE4BQAAAAZzY2FsZTgJAQAAAAdmcm9tWDE4AAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAAZhbXREY20JAQAAAAdmcm9tWDE4AAAAAgUAAAAPaW5QckFzc2V0QW10WDE4BQAAAAhwcmljZURjbQkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIJAAE3AAAAAgUAAAAMcHJCYWxhbmNlWDE4BQAAAA9pblByQXNzZXRBbXRYMTgJAAE3AAAAAgUAAAAMYW1CYWxhbmNlWDE4BQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAAC3NsaXBwYWdlWDE4BAAAAAtjdXJQcmljZVgxOAkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAADHByQmFsYW5jZVgxOAUAAAAMYW1CYWxhbmNlWDE4BAAAAA9zbGlwcGFnZVJlYWxYMTgJAAE8AAAAAwkBAAAAA2FicwAAAAEJAAE4AAAAAgUAAAALY3VyUHJpY2VYMTgFAAAADHVzZXJQcmljZVgxOAUAAAAHc2NhbGUxOAUAAAALY3VyUHJpY2VYMTgEAAAAC3NsaXBwYWdlWDE4CQEAAAAFdG9YMTgAAAACBQAAAAhzbGlwcGFnZQUAAAAGc2NhbGU4AwMJAQAAAAIhPQAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAp6ZXJvQmlnSW50CQABPwAAAAIFAAAAD3NsaXBwYWdlUmVhbFgxOAUAAAALc2xpcHBhZ2VYMTgHCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1ByaWNlIHNsaXBwYWdlIAkAAaYAAAABBQAAAA9zbGlwcGFnZVJlYWxYMTgCAAAACiBleGNlZWRlZCAJAAGmAAAAAQUAAAALc2xpcHBhZ2VYMTgEAAAADWxwRW1pc3Npb25YMTgJAQAAAAV0b1gxOAAAAAIFAAAACmxwRW1pc3Npb24FAAAABnNjYWxlOAQAAAAKcHJWaWFBbVgxOAkAATwAAAADBQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAAC2N1clByaWNlWDE4BQAAAAdzY2FsZTE4BAAAAAphbVZpYVByWDE4CQABPAAAAAMFAAAAD2luUHJBc3NldEFtdFgxOAUAAAAHc2NhbGUxOAUAAAALY3VyUHJpY2VYMTgEAAAADGV4cGVjdGVkQW10cwMJAAE/AAAAAgUAAAAKcHJWaWFBbVgxOAUAAAAPaW5QckFzc2V0QW10WDE4CQAFFAAAAAIFAAAACmFtVmlhUHJYMTgFAAAAD2luUHJBc3NldEFtdFgxOAkABRQAAAACBQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAACnByVmlhQW1YMTgEAAAAEWV4cEFtdEFzc2V0QW10WDE4CAUAAAAMZXhwZWN0ZWRBbXRzAAAAAl8xBAAAABNleHBQcmljZUFzc2V0QW10WDE4CAUAAAAMZXhwZWN0ZWRBbXRzAAAAAl8yBAAAAAhscEFtdFgxOAkAATwAAAADBQAAAA1scEVtaXNzaW9uWDE4BQAAABNleHBQcmljZUFzc2V0QW10WDE4BQAAAAxwckJhbGFuY2VYMTgJAAUXAAAABQkBAAAAB2Zyb21YMTgAAAACBQAAAAhscEFtdFgxOAUAAAAGc2NhbGU4CQEAAAAHZnJvbVgxOAAAAAIFAAAAEWV4cEFtdEFzc2V0QW10WDE4BQAAAAZhbXREY20JAQAAAAdmcm9tWDE4AAAAAgUAAAATZXhwUHJpY2VBc3NldEFtdFgxOAUAAAAIcHJpY2VEY20FAAAAC2N1clByaWNlWDE4BQAAAAtzbGlwcGFnZVgxOAQAAAAJY2FsY0xwQW10CAUAAAADcmVzAAAAAl8xBAAAAA5jYWxjQW1Bc3NldFBtdAgFAAAAA3JlcwAAAAJfMgQAAAAOY2FsY1ByQXNzZXRQbXQIBQAAAANyZXMAAAACXzMEAAAACGN1clByaWNlCQEAAAAHZnJvbVgxOAAAAAIIBQAAAANyZXMAAAACXzQFAAAABnNjYWxlOAQAAAAMc2xpcHBhZ2VDYWxjCQEAAAAHZnJvbVgxOAAAAAIIBQAAAANyZXMAAAACXzUFAAAABnNjYWxlOAMJAABnAAAAAgAAAAAAAAAAAAUAAAAJY2FsY0xwQW10CQAAAgAAAAECAAAABkxQIDwgMAQAAAAJZW1pdExwQW10AwkBAAAAASEAAAABBQAAAAZlbWl0THAAAAAAAAAAAAAFAAAACWNhbGNMcEFtdAQAAAAGYW1EaWZmCQAAZQAAAAIFAAAAB2luQW1BbXQFAAAADmNhbGNBbUFzc2V0UG10BAAAAAZwckRpZmYJAABlAAAAAgUAAAAHaW5QckFtdAUAAAAOY2FsY1ByQXNzZXRQbXQEAAAAC2NvbW1vblN0YXRlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAAUAAAAIY3VyUHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAhjdXJQcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgUAAAALdXNlckFkZHJlc3MFAAAABnR4SWQ1OAkBAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACgUAAAAOY2FsY0FtQXNzZXRQbXQFAAAADmNhbGNQckFzc2V0UG10BQAAAAllbWl0THBBbXQFAAAACGN1clByaWNlBQAAAAhzbGlwcGFnZQUAAAAMc2xpcHBhZ2VDYWxjBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAZhbURpZmYFAAAABnByRGlmZgUAAAADbmlsCQAFHwAAAA0FAAAACWNhbGNMcEFtdAUAAAAJZW1pdExwQW10BQAAAAhjdXJQcmljZQUAAAAJYW1CYWxhbmNlBQAAAAlwckJhbGFuY2UFAAAACmxwRW1pc3Npb24FAAAABGxwSWQFAAAACnBvb2xTdGF0dXMFAAAAC2NvbW1vblN0YXRlBQAAAAZhbURpZmYFAAAABnByRGlmZgUAAAAGaW5BbUlkBQAAAAZpblBySWQBAAAAG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZAAAAAEAAAAFb3JkZXIEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAdhbXRBc0lkCQABkQAAAAIFAAAAA2NmZwUAAAAJaWR4QW1Bc0lkBAAAAAZwckFzSWQJAAGRAAAAAgUAAAADY2ZnBQAAAAlpZHhQckFzSWQEAAAACnBvb2xTdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAADWlkeFBvb2xTdGF0dXMEAAAACGFtdEFzRGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAAtpZHhBbXRBc0RjbQQAAAAHcHJBc0RjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UHJpY2VBc0RjbQQAAAAPYWNjQW10QXNCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB2FtdEFzSWQEAAAADmFjY1ByQXNCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAABnByQXNJZAQAAAALY3VyUHJpY2VYMTgDCQAAAAAAAAIIBQAAAAVvcmRlcgAAAAlvcmRlclR5cGUFAAAAA0J1eQkBAAAAEHByaXZhdGVDYWxjUHJpY2UAAAAEBQAAAAhhbXRBc0RjbQUAAAAHcHJBc0RjbQkAAGQAAAACBQAAAA9hY2NBbXRBc0JhbGFuY2UIBQAAAAVvcmRlcgAAAAZhbW91bnQFAAAADmFjY1ByQXNCYWxhbmNlCQEAAAAQcHJpdmF0ZUNhbGNQcmljZQAAAAQFAAAACGFtdEFzRGNtBQAAAAdwckFzRGNtCQAAZQAAAAIFAAAAD2FjY0FtdEFzQmFsYW5jZQgFAAAABW9yZGVyAAAABmFtb3VudAUAAAAOYWNjUHJBc0JhbGFuY2UEAAAACGN1clByaWNlCQEAAAAHZnJvbVgxOAAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAZzY2FsZTgDAwMJAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAATUG9vbE1hdGNoZXJEaXNhYmxlZAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAAMUG9vbFNodXRkb3duCQAAAgAAAAECAAAAEEJsb2NrZWQgYnkgYWRtaW4EAAAACm9yQW10QXNzZXQICAUAAAAFb3JkZXIAAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BAAAAApvckFtdEFzU3RyAwkAAAAAAAACBQAAAApvckFtdEFzc2V0BQAAAAR1bml0AgAAAAVXQVZFUwkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAApvckFtdEFzc2V0BAAAAAlvclByQXNzZXQICAUAAAAFb3JkZXIAAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQEAAAACW9yUHJBc1N0cgMJAAAAAAAAAgUAAAAJb3JQckFzc2V0BQAAAAR1bml0AgAAAAVXQVZFUwkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAAlvclByQXNzZXQDAwkBAAAAAiE9AAAAAgUAAAAKb3JBbXRBc1N0cgUAAAAHYW10QXNJZAYJAQAAAAIhPQAAAAIFAAAACW9yUHJBc1N0cgUAAAAGcHJBc0lkCQAAAgAAAAECAAAAEldyb25nIG9yZGVyIGFzc2V0cwQAAAAKb3JkZXJQcmljZQgFAAAABW9yZGVyAAAABXByaWNlBAAAAAhwcmljZURjbQkAAGsAAAADBQAAAAZzY2FsZTgFAAAAB3ByQXNEY20FAAAACGFtdEFzRGNtBAAAAA5jYXN0T3JkZXJQcmljZQkBAAAAB3RvU2NhbGUAAAADBQAAAApvcmRlclByaWNlBQAAAAZzY2FsZTgFAAAACHByaWNlRGNtBAAAABFpc09yZGVyUHJpY2VWYWxpZAMJAAAAAAAAAggFAAAABW9yZGVyAAAACW9yZGVyVHlwZQUAAAADQnV5CQAAZwAAAAIFAAAACGN1clByaWNlBQAAAA5jYXN0T3JkZXJQcmljZQkAAGcAAAACBQAAAA5jYXN0T3JkZXJQcmljZQUAAAAIY3VyUHJpY2UGAQAAAAljb21tb25HZXQAAAABAAAAAWkDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAEjEgcGF5bWVudCBleHBlY3RlZAQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAApwbXRBc3NldElkCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAABnBtdEFtdAgFAAAAA3BtdAAAAAZhbW91bnQEAAAAA3JlcwkBAAAAFGVzdGltYXRlR2V0T3BlcmF0aW9uAAAABAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkCQACWAAAAAEFAAAACnBtdEFzc2V0SWQFAAAABnBtdEFtdAgFAAAAAWkAAAAGY2FsbGVyBAAAAAhvdXRBbUFtdAgFAAAAA3JlcwAAAAJfMQQAAAAIb3V0UHJBbXQIBQAAAANyZXMAAAACXzIEAAAACnBvb2xTdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQgFAAAAA3JlcwAAAAJfOQQAAAAFc3RhdGUIBQAAAANyZXMAAAADXzEwAwMJAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAAMUG9vbFNodXRkb3duCQAAAgAAAAEJAAEsAAAAAgIAAAASQmxvY2tlZCBieSBhZG1pbjogCQABpAAAAAEFAAAACnBvb2xTdGF0dXMJAAUXAAAABQUAAAAIb3V0QW1BbXQFAAAACG91dFByQW10BQAAAAZwbXRBbXQFAAAACnBtdEFzc2V0SWQFAAAABXN0YXRlAQAAAAljb21tb25QdXQAAAAGAAAABmNhbGxlcgAAAAR0eElkAAAAB2FtQXNQbXQAAAAHcHJBc1BtdAAAAAhzbGlwcGFnZQAAAAZlbWl0THAEAAAAAXIJAQAAABRlc3RpbWF0ZVB1dE9wZXJhdGlvbgAAAAkFAAAABHR4SWQFAAAACHNsaXBwYWdlCAkBAAAABXZhbHVlAAAAAQUAAAAHYW1Bc1BtdAAAAAZhbW91bnQICQEAAAAFdmFsdWUAAAABBQAAAAdhbUFzUG10AAAAB2Fzc2V0SWQICQEAAAAFdmFsdWUAAAABBQAAAAdwckFzUG10AAAABmFtb3VudAgJAQAAAAV2YWx1ZQAAAAEFAAAAB3ByQXNQbXQAAAAHYXNzZXRJZAUAAAAGY2FsbGVyBwUAAAAGZW1pdExwBAAAAAZzdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQgFAAAAAXIAAAACXzgDAwMJAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAYJAAAAAAAAAgUAAAAGc3RhdHVzBQAAAA9Qb29sUHV0RGlzYWJsZWQGCQAAAAAAAAIFAAAABnN0YXR1cwUAAAAMUG9vbFNodXRkb3duCQAAAgAAAAEJAAEsAAAAAgIAAAASQmxvY2tlZCBieSBhZG1pbjogCQABpAAAAAEFAAAABnN0YXR1cwUAAAABcgAAABAAAAABaQEAAAALY29uc3RydWN0b3IAAAACAAAAD2ZhY3RvcnlDb250cmFjdAAAABBtYW5hZ2VyUHVibGljS2V5AwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAEnBlcm1pc3Npb25zIGRlbmllZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAALa2V5RmFjdENudHIAAAAABQAAAA9mYWN0b3J5Q29udHJhY3QJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAABQAAABBtYW5hZ2VyUHVibGljS2V5BQAAAANuaWwAAAABaQEAAAADcHV0AAAAAgAAAARzbGlwAAAACWF1dG9TdGFrZQQAAAAHZmFjdENmZwkBAAAAEGdldEZhY3RvcnlDb25maWcAAAAABAAAAAtzdGFraW5nQ250cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAAGRAAAAAgUAAAAHZmFjdENmZwUAAAAPaWR4RmFjdFN0YWtDbnRyAgAAABZJbmNvcnJlY3Qgc3Rha2luZyBhZGRyBAAAAAhzbGlwQ250cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAAGRAAAAAgUAAAAHZmFjdENmZwUAAAAQaWR4RmFjdFNsaXBwQ250cgIAAAAXSW5jb3JyZWN0IHNsaXBwYWdlIGFkZHIDCQAAZgAAAAIAAAAAAAAAAAAFAAAABHNsaXAJAAACAAAAAQIAAAARSW52YWxpZCBzbGlwcGFnZS4DCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAACCQAAAgAAAAECAAAAEzIgcGF5bWVudHMgZXhwZWN0ZWQEAAAABmVzdFB1dAkBAAAACWNvbW1vblB1dAAAAAYJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACCAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkCAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEFAAAABHNsaXAGBAAAAAllbWl0THBBbXQIBQAAAAZlc3RQdXQAAAACXzIEAAAACWxwQXNzZXRJZAgFAAAABmVzdFB1dAAAAAJfNwQAAAAFc3RhdGUIBQAAAAZlc3RQdXQAAAACXzkEAAAABmFtRGlmZggFAAAABmVzdFB1dAAAAANfMTAEAAAABnByRGlmZggFAAAABmVzdFB1dAAAAANfMTEEAAAABGFtSWQIBQAAAAZlc3RQdXQAAAADXzEyBAAAAARwcklkCAUAAAAGZXN0UHV0AAAAA18xMwQAAAAHZW1pdEludgkAA/wAAAAEBQAAAA9mYWN0b3J5Q29udHJhY3QCAAAABGVtaXQJAARMAAAAAgUAAAAJZW1pdExwQW10BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAHZW1pdEludgUAAAAHZW1pdEludgQAAAAMc2xpcHBhZ2VBSW52AwkAAGYAAAACBQAAAAZhbURpZmYAAAAAAAAAAAAJAAP8AAAABAUAAAAIc2xpcENudHICAAAAA3B1dAUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAARhbUlkBQAAAAZhbURpZmYFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAxzbGlwcGFnZUFJbnYFAAAADHNsaXBwYWdlQUludgQAAAAMc2xpcHBhZ2VQSW52AwkAAGYAAAACBQAAAAZwckRpZmYAAAAAAAAAAAAJAAP8AAAABAUAAAAIc2xpcENudHICAAAAA3B1dAUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAARwcklkBQAAAAZwckRpZmYFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAxzbGlwcGFnZVBJbnYFAAAADHNsaXBwYWdlUEludgQAAAAIbHBUcm5zZnIDBQAAAAlhdXRvU3Rha2UEAAAAC3NscFN0YWtlSW52CQAD/AAAAAQFAAAAC3N0YWtpbmdDbnRyAgAAAAVzdGFrZQUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAAlscEFzc2V0SWQFAAAACWVtaXRMcEFtdAUAAAADbmlsAwkAAAAAAAACBQAAAAtzbHBTdGFrZUludgUAAAALc2xwU3Rha2VJbnYFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAllbWl0THBBbXQFAAAACWxwQXNzZXRJZAUAAAADbmlsCQAETgAAAAIFAAAABXN0YXRlBQAAAAhscFRybnNmcgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAlwdXRPbmVUa24AAAAFAAAAC2luQW10QW1vdW50AAAACmluUHJBbW91bnQAAAAFb3V0THAAAAAIc2xpcHBhZ2UAAAAJYXV0b1N0YWtlBAAAAANjZmcJAQAAABBnZXRGYWN0b3J5Q29uZmlnAAAAAAQAAAALc3Rha2luZ0NudHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAPaWR4RmFjdFN0YWtDbnRyAgAAABJXcm9uZyBzdGFraW5nIGFkZHIEAAAACHNsaXBDbnRyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAEGlkeEZhY3RTbGlwcENudHICAAAAE1dyb25nIHNsaXBwYWdlIGFkZHIEAAAAB2d3eENudHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAAA2NmZwUAAAARaWR4RmFjdEd3eFJld0NudHICAAAAE1dyb25nIHNsaXBwYWdlIGFkZHIEAAAAB3Bvb2xDZmcJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAEYW1JZAkAAZEAAAACBQAAAAdwb29sQ2ZnBQAAAAlpZHhBbUFzSWQEAAAABHBySWQJAAGRAAAAAgUAAAAHcG9vbENmZwUAAAAJaWR4UHJBc0lkBAAAAAVhbURjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAB3Bvb2xDZmcFAAAAC2lkeEFtdEFzRGNtBAAA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YXRlUHV0T3BlcmF0aW9uAAAACQUAAAAGdHhJZDU4BQAAAAhzbGlwcGFnZQUAAAAHaW5BbUFtdAUAAAAGaW5BbUlkBQAAAAdpblByQW10BQAAAAZpblBySWQFAAAAC3VzZXJBZGRyZXNzBQAAAAppc0V2YWx1YXRlBQAAAAZlbWl0THAAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFT3JkZXIEAAAABW9yZGVyBQAAAAckbWF0Y2gwBAAAAAptYXRjaGVyUHViCQEAAAATZ2V0TWF0Y2hlclB1Yk9yRmFpbAAAAAAEAAAACm9yZGVyVmFsaWQJAQAAABt2YWxpZGF0ZU1hdGNoZXJPcmRlckFsbG93ZWQAAAABBQAAAAVvcmRlcgQAAAALc2VuZGVyVmFsaWQJAAH0AAAAAwgFAAAABW9yZGVyAAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAAFb3JkZXIAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAAFb3JkZXIAAAAPc2VuZGVyUHVibGljS2V5BAAAAAxtYXRjaGVyVmFsaWQJAAH0AAAAAwgFAAAABW9yZGVyAAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAAFb3JkZXIAAAAGcHJvb2ZzAAAAAAAAAAABBQAAAAptYXRjaGVyUHViAwMDBQAAAApvcmRlclZhbGlkBQAAAAtzZW5kZXJWYWxpZAcFAAAADG1hdGNoZXJWYWxpZAcGCQEAAAAPdGhyb3dPcmRlckVycm9yAAAAAwUAAAAKb3JkZXJWYWxpZAUAAAALc2VuZGVyVmFsaWQFAAAADG1hdGNoZXJWYWxpZAQAAAANbWFuYWdlclB1YmxpYwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAATa2V5TWFuYWdlclB1YmxpY0tleQAAAAAFAAAABUVNUFRZAwkAAAAAAAACBQAAAA1tYW5hZ2VyUHVibGljBQAAAAVFTVBUWQkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACQACWQAAAAEFAAAADW1hbmFnZXJQdWJsaWO3y6C6", "chainId": 84, "height": 1849697, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3MmKcPHh1dRgj2unHNPVjmhwX6A6ybLa2vYLyJRLvH7u Next: 48G5A1xEfH6mzVunUDqUEPxhyV7TU9Xi5hHirRiDoR7s Diff:
OldNewDifferences
245245 then getAccBalance(prIdStr)
246246 else (getAccBalance(prIdStr) - inPrAmt)
247247 if (true)
248- then throw(((((("lpEmission = " + toString(lpEmission)) + " amBalance = ") + toString(amBalance)) + " prBalance = ") + toString(prBalance)))
248+ then throw(((((((((("lpEmission = " + toString(lpEmission)) + " amBalance = ") + toString(amBalance)) + " prBalance = ") + toString(prBalance)) + " getAccBalance(amIdStr) = ") + toString(getAccBalance(amIdStr))) + " etAccBalance(prIdStr) = ") + toString(getAccBalance(prIdStr))))
249249 else {
250250 let inAmAssetAmtX18 = toX18(inAmAmt, amtDcm)
251251 let inPrAssetAmtX18 = toX18(inPrAmt, priceDcm)
743743 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, userAddress, isEvaluate, emitLp))
744744
745745
746-
747-@Callable(i)
748-func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
749- let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
750- $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
751- }
752-
753-
754746 @Verifier(tx)
755747 func verify () = match tx {
756748 case order: Order =>
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
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 calcError = toBigInt(1000000)
1111
1212 let scale18 = toBigInt(1000000000000000000)
1313
1414 let zeroBigInt = toBigInt(0)
1515
1616 let oneBigInt = toBigInt(1)
1717
1818 let SEP = "__"
1919
2020 let EMPTY = ""
2121
2222 let PoolActive = 1
2323
2424 let PoolPutDisabled = 2
2525
2626 let PoolMatcherDisabled = 3
2727
2828 let PoolShutdown = 4
2929
3030 let idxPoolAddress = 1
3131
3232 let idxPoolStatus = 2
3333
3434 let idxLPAsId = 3
3535
3636 let idxAmAsId = 4
3737
3838 let idxPrAsId = 5
3939
4040 let idxAmtAsDcm = 6
4141
4242 let idxPriceAsDcm = 7
4343
4444 let idxIAmtAsId = 8
4545
4646 let idxIPriceAsId = 9
4747
4848 let idxFactStakCntr = 1
4949
5050 let idxFactSlippCntr = 7
5151
5252 let idxFactGwxRewCntr = 10
5353
5454 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
5555
5656
5757 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
5858
5959
6060 func toScale (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6161
6262
6363 func abs (val) = if ((zeroBigInt > val))
6464 then -(val)
6565 else val
6666
6767
6868 func keyFactCntr () = "%s__factoryContract"
6969
7070
7171 func keyManagerPublicKey () = "%s__managerPublicKey"
7272
7373
7474 func keyPriceLast () = "%s%s__price__last"
7575
7676
7777 func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
7878
7979
8080 func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
8181
8282
8383 func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
8484
8585
8686 func keyAmtAsset () = "%s__amountAsset"
8787
8888
8989 func keyPriceAsset () = "%s__priceAsset"
9090
9191
9292 func keyFactoryConfig () = "%s__factoryConfig"
9393
9494
9595 func keyMatcherPub () = "%s%s__matcher__publicKey"
9696
9797
9898 func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config")
9999
100100
101101 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
102102
103103
104104 func keyAllPoolsShutdown () = "%s__shutdown"
105105
106106
107107 func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
108108
109109
110110 func throwOrderError (orderValid,senderValid,matcherValid) = throw(((((("Validation failed: orderValid=" + toString(orderValid)) + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
111111
112112
113113 func asString (val) = match val {
114114 case valStr: String =>
115115 valStr
116116 case _ =>
117117 throw("fail cast to String")
118118 }
119119
120120
121121 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
122122
123123
124124 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
125125
126126
127127 let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactCntr()))
128128
129129 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
130130
131131
132132 func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, keyMatcherPub()))
133133
134134
135135 func getPoolConfig () = {
136136 let amtAs = getStringOrFail(this, keyAmtAsset())
137137 let priceAs = getStringOrFail(this, keyPriceAsset())
138138 let iPriceAs = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAs))
139139 let iAmtAs = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAs))
140140 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAs), toString(iPriceAs))), SEP)
141141 }
142142
143143
144144 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
145145
146146
147147 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageByUser,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(slippageByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
148148
149149
150150 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)
151151
152152
153153 func getAccBalance (assetId) = if ((assetId == "WAVES"))
154154 then wavesBalance(this).available
155155 else assetBalance(this, fromBase58String(assetId))
156156
157157
158158 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
159159
160160
161161 func calcAbsDiff (realAmt,expectedAmt,slippage) = {
162162 let diff = fraction((realAmt - expectedAmt), scale8BigInt, expectedAmt)
163163 $Tuple3(((slippage - abs(diff)) > zeroBigInt), min([realAmt, expectedAmt]), diff)
164164 }
165165
166166
167167 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
168168 let amtAsAmtX18 = toX18(amAmt, amAssetDcm)
169169 let prAsAmtX18 = toX18(prAmt, prAssetDcm)
170170 calcPriceBigInt(prAsAmtX18, amtAsAmtX18)
171171 }
172172
173173
174174 func calcPrices (amAmt,prAmt,lpAmt) = {
175175 let cfg = getPoolConfig()
176176 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
177177 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
178178 let priceX18 = privateCalcPrice(amtAsDcm, prAsDcm, amAmt, prAmt)
179179 let amAmtX18 = toX18(amAmt, amtAsDcm)
180180 let prAmtX18 = toX18(prAmt, prAsDcm)
181181 let lpAmtX18 = toX18(lpAmt, scale8)
182182 let lpPrInAmAsX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
183183 let lpPrInPrAsX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
184184 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
185185 }
186186
187187
188188 func calculatePrices (amAmt,prAmt,lpAmt) = {
189189 let prices = calcPrices(amAmt, prAmt, lpAmt)
190190 [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)]
191191 }
192192
193193
194194 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
195195 let cfg = getPoolConfig()
196196 let lpId = cfg[idxLPAsId]
197197 let amId = cfg[idxAmAsId]
198198 let prId = cfg[idxPrAsId]
199199 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
200200 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
201201 let poolStatus = cfg[idxPoolStatus]
202202 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Invalid LP id").quantity
203203 if ((lpId != pmtAssetId))
204204 then throw("Invalid pmt asset")
205205 else {
206206 let amBalance = getAccBalance(amId)
207207 let amBalanceX18 = toX18(amBalance, amDcm)
208208 let prBalance = getAccBalance(prId)
209209 let prBalanceX18 = toX18(prBalance, prDcm)
210210 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
211211 let curPrice = fromX18(curPriceX18, scale8)
212212 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
213213 let lpEmissionX18 = toX18(lpEmission, scale8)
214214 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
215215 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
216216 let outAmAmt = fromX18(outAmAmtX18, amDcm)
217217 let outPrAmt = fromX18(outPrAmtX18, prDcm)
218218 let state = if ((txId58 == ""))
219219 then nil
220220 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
221221 then unit
222222 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
223223 then unit
224224 else fromBase58String(prId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
225225 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
226226 }
227227 }
228228
229229
230230 func estimatePutOperation (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEvaluate,emitLp) = {
231231 let cfg = getPoolConfig()
232232 let lpId = fromBase58String(cfg[idxLPAsId])
233233 let amIdStr = cfg[idxAmAsId]
234234 let prIdStr = cfg[idxPrAsId]
235235 let inAmIdStr = cfg[idxIAmtAsId]
236236 let inPrIdStr = cfg[idxIPriceAsId]
237237 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
238238 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
239239 let poolStatus = cfg[idxPoolStatus]
240240 let lpEmission = valueOrErrorMessage(assetInfo(lpId), "Wrong lp asset").quantity
241241 let amBalance = if (isEvaluate)
242242 then getAccBalance(amIdStr)
243243 else (getAccBalance(amIdStr) - inAmAmt)
244244 let prBalance = if (isEvaluate)
245245 then getAccBalance(prIdStr)
246246 else (getAccBalance(prIdStr) - inPrAmt)
247247 if (true)
248- then throw(((((("lpEmission = " + toString(lpEmission)) + " amBalance = ") + toString(amBalance)) + " prBalance = ") + toString(prBalance)))
248+ then throw(((((((((("lpEmission = " + toString(lpEmission)) + " amBalance = ") + toString(amBalance)) + " prBalance = ") + toString(prBalance)) + " getAccBalance(amIdStr) = ") + toString(getAccBalance(amIdStr))) + " etAccBalance(prIdStr) = ") + toString(getAccBalance(prIdStr))))
249249 else {
250250 let inAmAssetAmtX18 = toX18(inAmAmt, amtDcm)
251251 let inPrAssetAmtX18 = toX18(inPrAmt, priceDcm)
252252 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
253253 let amBalanceX18 = toX18(amBalance, amtDcm)
254254 let prBalanceX18 = toX18(prBalance, priceDcm)
255255 let res = if ((lpEmission == 0))
256256 then {
257257 let curPriceX18 = zeroBigInt
258258 let slippageX18 = zeroBigInt
259259 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
260260 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtDcm), fromX18(inPrAssetAmtX18, priceDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
261261 }
262262 else {
263263 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
264264 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
265265 let slippageX18 = toX18(slippage, scale8)
266266 if (if ((curPriceX18 != zeroBigInt))
267267 then (slippageRealX18 > slippageX18)
268268 else false)
269269 then throw(((("Price slippage " + toString(slippageRealX18)) + " exceeded ") + toString(slippageX18)))
270270 else {
271271 let lpEmissionX18 = toX18(lpEmission, scale8)
272272 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
273273 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
274274 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
275275 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
276276 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
277277 let expAmtAssetAmtX18 = expectedAmts._1
278278 let expPriceAssetAmtX18 = expectedAmts._2
279279 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
280280 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(expAmtAssetAmtX18, amtDcm), fromX18(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
281281 }
282282 }
283283 let calcLpAmt = res._1
284284 let calcAmAssetPmt = res._2
285285 let calcPrAssetPmt = res._3
286286 let curPrice = fromX18(res._4, scale8)
287287 let slippageCalc = fromX18(res._5, scale8)
288288 if ((0 >= calcLpAmt))
289289 then throw("LP < 0")
290290 else {
291291 let emitLpAmt = if (!(emitLp))
292292 then 0
293293 else calcLpAmt
294294 let amDiff = (inAmAmt - calcAmAssetPmt)
295295 let prDiff = (inPrAmt - calcPrAssetPmt)
296296 let commonState = [IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice), StringEntry(keyPutActionByUser(userAddress, txId58), dataPutActionInfo(calcAmAssetPmt, calcPrAssetPmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
297297 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpId, poolStatus, commonState, amDiff, prDiff, inAmId, inPrId)
298298 }
299299 }
300300 }
301301
302302
303303 func validateMatcherOrderAllowed (order) = {
304304 let cfg = getPoolConfig()
305305 let amtAsId = cfg[idxAmAsId]
306306 let prAsId = cfg[idxPrAsId]
307307 let poolStatus = parseIntValue(cfg[idxPoolStatus])
308308 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
309309 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
310310 let accAmtAsBalance = getAccBalance(amtAsId)
311311 let accPrAsBalance = getAccBalance(prAsId)
312312 let curPriceX18 = if ((order.orderType == Buy))
313313 then privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
314314 else privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
315315 let curPrice = fromX18(curPriceX18, scale8)
316316 if (if (if (isGlobalShutdown())
317317 then true
318318 else (poolStatus == PoolMatcherDisabled))
319319 then true
320320 else (poolStatus == PoolShutdown))
321321 then throw("Blocked by admin")
322322 else {
323323 let orAmtAsset = order.assetPair.amountAsset
324324 let orAmtAsStr = if ((orAmtAsset == unit))
325325 then "WAVES"
326326 else toBase58String(value(orAmtAsset))
327327 let orPrAsset = order.assetPair.priceAsset
328328 let orPrAsStr = if ((orPrAsset == unit))
329329 then "WAVES"
330330 else toBase58String(value(orPrAsset))
331331 if (if ((orAmtAsStr != amtAsId))
332332 then true
333333 else (orPrAsStr != prAsId))
334334 then throw("Wrong order assets")
335335 else {
336336 let orderPrice = order.price
337337 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
338338 let castOrderPrice = toScale(orderPrice, scale8, priceDcm)
339339 let isOrderPriceValid = if ((order.orderType == Buy))
340340 then (curPrice >= castOrderPrice)
341341 else (castOrderPrice >= curPrice)
342342 true
343343 }
344344 }
345345 }
346346
347347
348348 func commonGet (i) = if ((size(i.payments) != 1))
349349 then throw("1 payment expected")
350350 else {
351351 let pmt = value(i.payments[0])
352352 let pmtAssetId = value(pmt.assetId)
353353 let pmtAmt = pmt.amount
354354 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
355355 let outAmAmt = res._1
356356 let outPrAmt = res._2
357357 let poolStatus = parseIntValue(res._9)
358358 let state = res._10
359359 if (if (isGlobalShutdown())
360360 then true
361361 else (poolStatus == PoolShutdown))
362362 then throw(("Blocked by admin: " + toString(poolStatus)))
363363 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
364364 }
365365
366366
367367 func commonPut (caller,txId,amAsPmt,prAsPmt,slippage,emitLp) = {
368368 let r = estimatePutOperation(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp)
369369 let status = parseIntValue(r._8)
370370 if (if (if (isGlobalShutdown())
371371 then true
372372 else (status == PoolPutDisabled))
373373 then true
374374 else (status == PoolShutdown))
375375 then throw(("Blocked by admin: " + toString(status)))
376376 else r
377377 }
378378
379379
380380 @Callable(i)
381381 func constructor (factoryContract,managerPublicKey) = if ((i.caller != this))
382382 then throw("permissions denied")
383383 else [StringEntry(keyFactCntr(), factoryContract), StringEntry(keyManagerPublicKey(), managerPublicKey)]
384384
385385
386386
387387 @Callable(i)
388388 func put (slip,autoStake) = {
389389 let factCfg = getFactoryConfig()
390390 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Incorrect staking addr")
391391 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Incorrect slippage addr")
392392 if ((0 > slip))
393393 then throw("Invalid slippage.")
394394 else if ((size(i.payments) != 2))
395395 then throw("2 payments expected")
396396 else {
397397 let estPut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true)
398398 let emitLpAmt = estPut._2
399399 let lpAssetId = estPut._7
400400 let state = estPut._9
401401 let amDiff = estPut._10
402402 let prDiff = estPut._11
403403 let amId = estPut._12
404404 let prId = estPut._13
405405 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
406406 if ((emitInv == emitInv))
407407 then {
408408 let slippageAInv = if ((amDiff > 0))
409409 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
410410 else nil
411411 if ((slippageAInv == slippageAInv))
412412 then {
413413 let slippagePInv = if ((prDiff > 0))
414414 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
415415 else nil
416416 if ((slippagePInv == slippagePInv))
417417 then {
418418 let lpTrnsfr = if (autoStake)
419419 then {
420420 let slpStakeInv = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
421421 if ((slpStakeInv == slpStakeInv))
422422 then nil
423423 else throw("Strict value is not equal to itself.")
424424 }
425425 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
426426 (state ++ lpTrnsfr)
427427 }
428428 else throw("Strict value is not equal to itself.")
429429 }
430430 else throw("Strict value is not equal to itself.")
431431 }
432432 else throw("Strict value is not equal to itself.")
433433 }
434434 }
435435
436436
437437
438438 @Callable(i)
439439 func putOneTkn (inAmtAmount,inPrAmount,outLp,slippage,autoStake) = {
440440 let cfg = getFactoryConfig()
441441 let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wrong staking addr")
442442 let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wrong slippage addr")
443443 let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wrong slippage addr")
444444 let poolCfg = getPoolConfig()
445445 let amId = poolCfg[idxAmAsId]
446446 let prId = poolCfg[idxPrAsId]
447447 let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
448448 let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
449449 if ((size(i.payments) != 1))
450450 then throw("1 payment expected")
451451 else {
452452 let pmt = value(i.payments[0])
453453 let pmtAssetId = toBase58String(value(pmt.assetId))
454454 let pmtAmt = pmt.amount
455455 let amAssetSwapX18 = toX18(inAmtAmount, amDcm)
456456 let prAssetSwapX18 = toX18(inPrAmount, prDcm)
457457 let amBalance = getAccBalance(amId)
458458 let amBalanceX18 = toX18(amBalance, amDcm)
459459 let prBalance = getAccBalance(prId)
460460 let prBalanceX18 = toX18(prBalance, prDcm)
461461 let amBalanceNow = if ((pmtAssetId == amId))
462462 then (amBalance - pmtAmt)
463463 else amBalance
464464 let prBalanceNow = if ((pmtAssetId == prId))
465465 then (prBalance - pmtAmt)
466466 else prBalance
467467 let dCur = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), "50", "100000000", "1"], nil)
468468 let invLeft = parseBigIntValue(asString(dCur))
469469 let invRight = if ((pmtAssetId == amId))
470470 then {
471471 let pmtAmtX18 = toX18(pmtAmt, amDcm)
472472 let prAdiff = prAssetSwapX18
473473 let amAdiff = (pmtAmtX18 - amAssetSwapX18)
474474 let dSwap = invoke(gwxCntr, "calcD", [toString((toBigInt(amBalanceNow) + toBigInt(fromX18(amAdiff, amDcm)))), toString((toBigInt(prBalanceNow) - toBigInt(fromX18(prAdiff, prDcm)))), "50", "100000000", "1"], nil)
475475 parseBigIntValue(asString(dSwap))
476476 }
477477 else {
478478 let pmtPrX18 = toX18(pmtAmt, prDcm)
479479 let prAdiff = (pmtPrX18 - prAssetSwapX18)
480480 let amAdiff = amAssetSwapX18
481481 let dSwap = invoke(gwxCntr, "calcD", [toString((toBigInt(amBalanceNow) - toBigInt(fromX18(amAdiff, amDcm)))), toString((toBigInt(prBalanceNow) + toBigInt(fromX18(prAdiff, prDcm)))), "50", "100000000", "1"], nil)
482482 parseBigIntValue(asString(dSwap))
483483 }
484484 if (!(calcAbsDiff(invRight, invLeft, toBigInt(1000))._1))
485485 then throw("D mismatch.")
486486 else {
487487 let estPut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), inAmtAmount), AttachedPayment(fromBase58String(prId), inPrAmount), 50000000000, true)
488488 let estimLP = estPut._2
489489 let lpAssetId = estPut._7
490490 let state = estPut._9
491491 let amDiff = estPut._10
492492 let prDiff = estPut._11
493493 let lpCalcRes = calcAbsDiff(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
494494 if (!(lpCalcRes._1))
495495 then throw(((("Too big slippage: " + toString(lpCalcRes._3)) + " vs ") + toString(slippage)))
496496 else {
497497 let emitLpAmt = toInt(lpCalcRes._2)
498498 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
499499 if ((emitInv == emitInv))
500500 then {
501501 let slippageAInv = if ((amDiff > 0))
502502 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
503503 else nil
504504 if ((slippageAInv == slippageAInv))
505505 then {
506506 let slippagePInv = if ((prDiff > 0))
507507 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
508508 else nil
509509 if ((slippagePInv == slippagePInv))
510510 then {
511511 let lpTrnsfr = if (autoStake)
512512 then {
513513 let slpStakeInv = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
514514 if ((slpStakeInv == slpStakeInv))
515515 then nil
516516 else throw("Strict value is not equal to itself.")
517517 }
518518 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
519519 (state ++ lpTrnsfr)
520520 }
521521 else throw("Strict value is not equal to itself.")
522522 }
523523 else throw("Strict value is not equal to itself.")
524524 }
525525 else throw("Strict value is not equal to itself.")
526526 }
527527 }
528528 }
529529 }
530530
531531
532532
533533 @Callable(i)
534534 func putForFree (maxSlippage) = if ((0 > maxSlippage))
535535 then throw("Invalid slippage")
536536 else if ((size(i.payments) != 2))
537537 then throw("2 payments expected")
538538 else {
539539 let estPut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlippage, false)
540540 estPut._9
541541 }
542542
543543
544544
545545 @Callable(i)
546546 func get () = {
547547 let res = commonGet(i)
548548 let outAmtAmt = res._1
549549 let outPrAmt = res._2
550550 let pmtAmt = res._3
551551 let pmtAssetId = res._4
552552 let state = res._5
553553 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
554554 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
555555 then state
556556 else throw("Strict value is not equal to itself.")
557557 }
558558
559559
560560
561561 @Callable(i)
562562 func getOneTkn (amAssetSwap,prAssetSwap,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
563563 then throw("1 payment expected")
564564 else {
565565 let cfg = getPoolConfig()
566566 let lpId = cfg[idxLPAsId]
567567 let amId = cfg[idxAmAsId]
568568 let prId = cfg[idxPrAsId]
569569 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
570570 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
571571 let poolStatus = cfg[idxPoolStatus]
572572 let fcfg = getFactoryConfig()
573573 let gwxCntr = valueOrErrorMessage(addressFromString(fcfg[idxFactGwxRewCntr]), "Wrong slippage address")
574574 if (if ((outAssetId != amId))
575575 then (outAssetId != prId)
576576 else false)
577577 then throw("Invalid out asset")
578578 else {
579579 let resultAssetId = if ((outAssetId == amId))
580580 then amId
581581 else prId
582582 let pmt = value(i.payments[0])
583583 let userAddress = i.caller
584584 let txId58 = toBase58String(i.transactionId)
585585 let pmtAssetId = value(pmt.assetId)
586586 let pmtAmt = pmt.amount
587587 if ((lpId != toBase58String(pmtAssetId)))
588588 then throw("Invalid LP")
589589 else {
590590 let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
591591 let estimAmAmt = r._1
592592 let estimPrAmt = r._2
593593 let amBalance = getAccBalance(amId)
594594 let amBalanceX18 = toX18(amBalance, amDcm)
595595 let prBalance = getAccBalance(prId)
596596 let prBalanceX18 = toX18(prBalance, prDcm)
597597 let invLeft = invoke(gwxCntr, "calcD", [toString(amBalance), toString(prBalance), "50", "100000000", "1"], nil)
598598 let resultTuple = if ((outAssetId == amId))
599599 then {
600600 let amAssetDiff = (outAmount - estimAmAmt)
601601 let invRight = invoke(gwxCntr, "calcD", [toString((amBalance - amAssetDiff)), toString((prBalance + prAssetSwap)), "50", "100000000", "1"], nil)
602602 if (!(calcAbsDiff(parseBigIntValue(asString(invRight)), parseBigIntValue(asString(invLeft)), toBigInt(1000))._1))
603603 then throw("D mismatch")
604604 else {
605605 let resultAmt = (estimAmAmt + amAssetSwap)
606606 let lpCalcRes = calcAbsDiff(toBigInt(resultAmt), toBigInt(outAmount), toBigInt(slippage))
607607 if (!(lpCalcRes._1))
608608 then throw(((("Too big slippage: " + toString(lpCalcRes._3)) + " vs ") + toString(slippage)))
609609 else $Tuple2(toInt(lpCalcRes._2), 0)
610610 }
611611 }
612612 else {
613613 let prAssetDiff = (outAmount - estimPrAmt)
614614 let invRight = invoke(gwxCntr, "calcD", [toString((amBalance + amAssetSwap)), toString((prBalance - prAssetDiff)), "50", "100000000", "1"], nil)
615615 if (!(calcAbsDiff(parseBigIntValue(asString(invRight)), parseBigIntValue(asString(invLeft)), toBigInt(5000))._1))
616616 then throw("D mismatch.")
617617 else {
618618 let resultAmt = (estimPrAmt + prAssetSwap)
619619 let lpCalcRes = calcAbsDiff(toBigInt(resultAmt), toBigInt(outAmount), toBigInt(slippage))
620620 if (!(lpCalcRes._1))
621621 then throw(((("Too big slippage: " + toString(lpCalcRes._3)) + " vs ") + toString(slippage)))
622622 else $Tuple2(0, toInt(lpCalcRes._2))
623623 }
624624 }
625625 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
626626 let curPrice = fromX18(curPriceX18, scale8)
627627 let state = [ScriptTransfer(userAddress, if ((resultAssetId == amId))
628628 then resultTuple._1
629629 else resultTuple._2, if ((resultAssetId == "WAVES"))
630630 then unit
631631 else fromBase58String(resultAssetId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(resultTuple._1, resultTuple._2, pmtAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
632632 let burn = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
633633 if ((burn == burn))
634634 then state
635635 else throw("Strict value is not equal to itself.")
636636 }
637637 }
638638 }
639639
640640
641641
642642 @Callable(i)
643643 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
644644 let res = commonGet(i)
645645 let outAmAmt = res._1
646646 let outPrAmt = res._2
647647 let pmtAmt = res._3
648648 let pmtAssetId = res._4
649649 let state = res._5
650650 if ((noLessThenAmtAsset > outAmAmt))
651651 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
652652 else if ((noLessThenPriceAsset > outPrAmt))
653653 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
654654 else {
655655 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
656656 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
657657 then state
658658 else throw("Strict value is not equal to itself.")
659659 }
660660 }
661661
662662
663663
664664 @Callable(i)
665665 func unstakeAndGet (amount) = {
666666 let checkPayments = if ((size(i.payments) != 0))
667667 then throw("No payments expected")
668668 else true
669669 if ((checkPayments == checkPayments))
670670 then {
671671 let cfg = getPoolConfig()
672672 let factoryCfg = getFactoryConfig()
673673 let lpAssetId = fromBase58String(cfg[idxLPAsId])
674674 let stakingContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wrong staking address.")
675675 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(lpAssetId), amount], nil)
676676 if ((unstakeInv == unstakeInv))
677677 then {
678678 let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
679679 let poolStatus = parseIntValue(r._9)
680680 let state = r._10
681681 let checkPoolStatus = if (if (isGlobalShutdown())
682682 then true
683683 else (poolStatus == PoolShutdown))
684684 then throw(("Blocked by admin: " + toString(poolStatus)))
685685 else true
686686 if ((checkPoolStatus == checkPoolStatus))
687687 then {
688688 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
689689 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
690690 then state
691691 else throw("Strict value is not equal to itself.")
692692 }
693693 else throw("Strict value is not equal to itself.")
694694 }
695695 else throw("Strict value is not equal to itself.")
696696 }
697697 else throw("Strict value is not equal to itself.")
698698 }
699699
700700
701701
702702 @Callable(i)
703703 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
704704 then throw("permissions denied")
705705 else $Tuple2([StringEntry(keyAmtAsset(), amtAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success")
706706
707707
708708
709709 @Callable(i)
710710 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
711711
712712
713713
714714 @Callable(i)
715715 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
716716
717717
718718
719719 @Callable(i)
720720 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
721721 let prices = calcPrices(amAmt, prAmt, lpAmt)
722722 $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])])
723723 }
724724
725725
726726
727727 @Callable(i)
728728 func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult))
729729
730730
731731
732732 @Callable(i)
733733 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
734734
735735
736736
737737 @Callable(i)
738738 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
739739
740740
741741
742742 @Callable(i)
743743 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, userAddress, isEvaluate, emitLp))
744744
745745
746-
747-@Callable(i)
748-func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
749- let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
750- $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
751- }
752-
753-
754746 @Verifier(tx)
755747 func verify () = match tx {
756748 case order: Order =>
757749 let matcherPub = getMatcherPubOrFail()
758750 let orderValid = validateMatcherOrderAllowed(order)
759751 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
760752 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
761753 if (if (if (orderValid)
762754 then senderValid
763755 else false)
764756 then matcherValid
765757 else false)
766758 then true
767759 else throwOrderError(orderValid, senderValid, matcherValid)
768760 case _ =>
769761 let managerPublic = valueOrElse(getString(this, keyManagerPublicKey()), EMPTY)
770762 if ((managerPublic == EMPTY))
771763 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
772764 else sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(managerPublic))
773765 }
774766

github/deemru/w8io/169f3d6 
92.92 ms