tx · BJ2NSLraw4CeByAZVxmSexduE9mV6FN3WSKoPD6RD7M9

3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS:  -0.01400000 Waves

2020.11.03 11:25 [1248874] smart account 3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS > SELF 0.00000000 Waves

{ "type": 13, "id": "BJ2NSLraw4CeByAZVxmSexduE9mV6FN3WSKoPD6RD7M9", "fee": 1400000, "feeAssetId": null, "timestamp": 1604391976485, "version": 1, "sender": "3N3UHNYQ8xwe2WWLKgXX628JyUtF6kYK4wS", "senderPublicKey": "Hxyif8HnnHh34SZ7PZewDcNUgrZfHNJsQvLNCcPbCW27", "proofs": [ "h8TZyR2zuxmhui5BKjcpp2364cerWohJUwASsiKAipCkQqDWHehuDUfQYZvrBEPPNa9n2ZEks29yAR6HfGoyTs9" ], "script": "base64:AAIEAAAAAAAAADwIAhIKCggICAEIAQEICBIRCg8ICAEIAQgBAQEBAQEBAQESAwoBCBIDCgEIEgQKAggBEgQKAggIEgMKAQgAAABpAQAAABZjb252ZXJ0SnNvbkFycmF5VG9MaXN0AAAAAgAAAAlqc29uQXJyYXkAAAALc3BsaXRTeW1ib2wJAAS1AAAAAgUAAAAJanNvbkFycmF5BQAAAAtzcGxpdFN5bWJvbAEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkCAAAAAAEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAADa2V5BwAAAAADU0VQAgAAAAJfXwAAAAAMa2V5QXNzZXRDb2RlAAAAAAAAAAABAAAAAAprZXlBc3NldElkAAAAAAAAAAACAAAAAA5rZXlBc3NldFN0YXR1cwAAAAAAAAAAAwAAAAAVa2V5QXNzZXRQcmljZURlY2ltYWxzAAAAAAAAAAAEAAAAABNrZXlBc3NldEJha2luZ0Fzc2V0AAAAAAAAAAAFAAAAABtrZXlPdmVyY29sbGF0ZXJhbFBlcmNlbnRhZ2UAAAAAAAAAAAYAAAAACmtleU1pblBvb2wAAAAAAAAAAAcAAAAAFWtleVByaWNlT3JhY2xlQWRkcmVzcwAAAAAAAAAACAAAAAAQa2V5TWluQnV5UGF5bWVudAAAAAAAAAAACQAAAAARa2V5TWluU2VsbFBheW1lbnQAAAAAAAAAAAoAAAAAEmtleUJ1eUxvY2tJbnRlcnZhbAAAAAAAAAAACwAAAAATa2V5U2VsbExvY2tJbnRlcnZhbAAAAAAAAAAADAAAAAAJa2V5QnV5RmVlAAAAAAAAAAANAAAAAAprZXlTZWxsRmVlAAAAAAAAAAAOAAAAABhrZXlQb29sUmVkZW1wdGlvblRpbWVvdXQAAAAAAAAAAA8AAAAAIWtleVdlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAAAAAAAAAAAEAAAAAAOYWRtaW5QdWJsaWNLZXkCAAAALEcxRWJ1NUFNSGFUSkZFYlpOa1pRY0pGVVE5S2ZpWVV3dXB5TEc4NTdEY0ZyAAAAABpuZXV0cmlub0NvbnRyYWN0QWRkcmVzc0tleQIAAAArJXMlc19fY29tbW9uQ29uZmlnX19uZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAAAAZbmV1dHJpbm9TdGFraW5nQWRkcmVzc0tleQIAAAAqJXMlc19fY29tbW9uQ29uZmlnX19uZXV0cmlub1N0YWtpbmdBZGRyZXNzAAAAABttaW5pbXVuUG9vbEZ1bmRpbmdBbW91bnRLZXkCAAAALCVzJXNfX2NvbW1vbkNvbmZpZ19fbWluaW11bVBvb2xGdW5kaW5nQW1vdW50AAAAABBpc0luaXRpYWxpemVkS2V5AgAAAB8lcyVzX19jb21tb25Db25maWdfX2luaXRpYWxpemVkAAAAABRjdXJyZW50QXNzZXRJbmRleEtleQIAAAAvJXMlc19fY29tbW9uQ29uZmlnX19wcmVkZWZpbmVkQXNzZXRzQWN0aXZlSW5kZXgAAAAAFGFzc2V0c0FkZHJlc3NMaXN0S2V5AgAAACglcyVzX19jb21tb25Db25maWdfX3ByZWRlZmluZWRBc3NldHNMaXN0AAAAAA5kZWJ0VG9rZW5JZEtleQIAAAAfJXMlc19fY29tbW9uQ29uZmlnX19kZWJ0QXNzZXRJZAAAAAAZZGVidFRva2VuRXRhbG9uQmFsYW5jZUtleQIAAAAqJXMlc19fY29tbW9uQ29uZmlnX19kZWJ0QXNzZXRFdGFsb25CYWxhbmNlAAAAABVkZWZvU3Rha2luZ0FkZHJlc3NLZXkCAAAAJiVzJXNfX2NvbW1vbkNvbmZpZ19fZGVmb1N0YWtpbmdBZGRyZXNzAAAAABpkZWZvU3Rha2luZ1BhY2VtYWtlclB1YktleQIAAAArJXMlc19fY29tbW9uQ29uZmlnX19kZWZvU3Rha2luZ1BhY2VtYWtlclB1YgAAAAAWbWluUG9vbEludmVzdEFtb3VudEtleQIAAAAnJXMlc19fY29tbW9uQ29uZmlnX19taW5Qb29sSW52ZXN0QW1vdW50AAAAABJuZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAAA5uc2J0QXNzZXRJZEtleQIAAAANYm9uZF9hc3NldF9pZAAAAAAObmV1dHJpbm9ScGRLZXkCAAAADHJwZF9jb250cmFjdAAAAAAOZGVmb0Fzc2V0SWRLZXkCAAAADyVzX19kZWZvQXNzZXRJZAAAAAAVc2V0QXNzZXRTY3JpcHRUeElkS2V5AgAAABMlc19fYXNzZXRTY3JpcHRUeElkAQAAABFnZXRBc3NldENvbmZpZ0tleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAMYXNzZXRBZGRyZXNzAgAAAAhfX2NvbmZpZwEAAAAQZ2V0QXNzZXRQcmljZUtleQAAAAEAAAAJYXNzZXRDb2RlCQABLAAAAAICAAAADSVzJXNfX3ByaWNlX18FAAAACWFzc2V0Q29kZQEAAAAVZ2V0QXNzZXRJbml0SGVpZ2h0S2V5AAAAAQAAAAxhc3NldEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAxhc3NldEFkZHJlc3MCAAAADF9faW5pdEhlaWdodAEAAAAZZ2V0QXNzZXRBY3RpdmF0ZUhlaWdodEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAMYXNzZXRBZGRyZXNzAgAAABBfX2FjdGl2YXRlSGVpZ2h0AQAAAB1nZXRBc3NldEN1cnJyZW50UG9vbEFtb3VudEtleQAAAAEAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAATJXMlcyVzX19kZWZvQXNzZXRfXwUAAAAMYXNzZXRBZGRyZXNzAgAAAA1fX2N1cnJlbnRQb29sAQAAABhnZXRBc3NldE1heFBvb2xBbW91bnRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAJX19tYXhQb29sAQAAAA9nZXRBc3NldE1ldGFLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAGX19tZXRhAQAAABVnZXRBc3NldFBvb2xNYWtlcnNLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAMX19wb29sTWFrZXJzAQAAABhnZXRBc3NldEFkZHJlc3NCeUNvZGVLZXkAAAABAAAACWFzc2V0Q29kZQkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAACWFzc2V0Q29kZQIAAAAUX19hZGRyZXNzQnlBc3NldENvZGUBAAAAG2dldEFzc2V0QWRkcmVzc0J5QXNzZXRJZEtleQAAAAEAAAAHYXNzZXRJZAkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAAB2Fzc2V0SWQCAAAAEl9fYWRkcmVzc0J5QXNzZXRJZAEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudEtleQAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAA4lcyVzJXMlc19fcG9vbAkABEwAAAACBQAAAAxhc3NldEFkZHJlc3MJAARMAAAAAgUAAAAQcG9vbE1ha2VyQWRkcmVzcwkABEwAAAACAgAAAAZhbW91bnQFAAAAA25pbAUAAAADU0VQAQAAACVnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uTWF4QW1vdW50S2V5AAAAAgAAAAxhc3NldEFkZHJlc3MAAAAQcG9vbE1ha2VyQWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAADiVzJXMlcyVzX19wb29sCQAETAAAAAIFAAAADGFzc2V0QWRkcmVzcwkABEwAAAACBQAAABBwb29sTWFrZXJBZGRyZXNzCQAETAAAAAICAAAACW1heEFtb3VudAUAAAADbmlsBQAAAANTRVABAAAAG2dldFBvb2xNYWtlckxvY2tlZEFtb3VudEtleQAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAA4lcyVzJXMlc19fcG9vbAkABEwAAAACBQAAAAxhc3NldEFkZHJlc3MJAARMAAAAAgUAAAAQcG9vbE1ha2VyQWRkcmVzcwkABEwAAAACAgAAAAxsb2NrZWRBbW91bnQFAAAAA25pbAUAAAADU0VQAQAAABtnZXRQb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAOJXMlcyVzJXNfX3Bvb2wJAARMAAAAAgUAAAAMYXNzZXRBZGRyZXNzCQAETAAAAAIFAAAAEHBvb2xNYWtlckFkZHJlc3MJAARMAAAAAgIAAAAMdW5sb2NrSGVpZ2h0BQAAAANuaWwFAAAAA1NFUAEAAAAfZ2V0UG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleQAAAAMAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MAAAABaAkABLkAAAACCQAETAAAAAICAAAAECVzJXMlcyVkJXNfX3Bvb2wJAARMAAAAAgUAAAAMYXNzZXRBZGRyZXNzCQAETAAAAAIFAAAAEHBvb2xNYWtlckFkZHJlc3MJAARMAAAAAgkAAaQAAAABBQAAAAFoCQAETAAAAAICAAAAEGxpcXVpZGl0eVJlcXVlc3QFAAAAA25pbAUAAAADU0VQAQAAABtnZXRQb29sVG90YWxMb2NrZWRBbW91bnRLZXkAAAABAAAADGFzc2V0QWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAADCVzJXMlc19fcG9vbAkABEwAAAACBQAAAAxhc3NldEFkZHJlc3MJAARMAAAAAgIAAAARdG90YWxMb2NrZWRBbW91bnQFAAAAA25pbAUAAAADU0VQAQAAABNnZXRBc3NldENvbmZpZ0FycmF5AAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAABZjb252ZXJ0SnNvbkFycmF5VG9MaXN0AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAEdGhpcwkBAAAAEWdldEFzc2V0Q29uZmlnS2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAOTm8gREVGTyBBc3NldCAFAAAADGFzc2V0QWRkcmVzcwIAAAAOY29uZmlnIHByZXNlbnQCAAAAAl9fAAAAAA1tdWx0aXBsaWNhdG9yAAAAAAAAD0JAAAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAabmV1dHJpbm9Db250cmFjdEFkZHJlc3NLZXkCAAAAH05vIG5ldXRyaW5vIGNvbnRyYWN0IHNwZWNpZmllZC4AAAAAEm5ldXRyaW5vQXNzZXRJZFN0cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAEm5ldXRyaW5vQXNzZXRJZEtleQIAAAAXTm8gVVNETiBhc3NldCBpZCBmb3VuZC4AAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABBQAAABJuZXV0cmlub0Fzc2V0SWRTdHIAAAAAC25zYnRBc3NldElkCQACWQAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAA5uc2J0QXNzZXRJZEtleQIAAAAWTm8gTlNCVCBhc3NldCBpZCBmb3VuZAAAAAASbWluaW11bVBvb2xGdW5kaW5nCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAbbWluaW11blBvb2xGdW5kaW5nQW1vdW50S2V5AgAAAC1NaW5pbXVtIHBvb2wgZnVuZGluZyBhbW91bnQgaXMgbm90IHNwZWNpZmllZC4AAAAAE21pblBvb2xJbnZlc3RBbW91bnQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAWbWluUG9vbEludmVzdEFtb3VudEtleQkAAGgAAAACAAAAAAAAAAAKBQAAAA1tdWx0aXBsaWNhdG9yAAAAAA1BU1NFdFBST1BPU0VEAgAAAAhQUk9QT1NFRAAAAAAKQVNTRXRSRUFEWQIAAAAFUkVBRFkAAAAAC0FTU0V0SVNTVUVEAgAAAAZJU1NVRUQAAAAAC2Fzc2V0U3RhdHVzCQAFFQAAAAMFAAAADUFTU0V0UFJPUE9TRUQFAAAACkFTU0V0UkVBRFkFAAAAC0FTU0V0SVNTVUVEAAAAABhwcmVkZWZpbmVkQXNzZXRDb250cmFjdHMJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAABRhc3NldHNBZGRyZXNzTGlzdEtleQIAAAAtTm8gcG9vbCBvZiBwcmVkZXBsb3llZCBhc3NldCBjb250cmFjdHMgZm91bmQuAAAAABRwcmVkZWZpbmVkQXNzZXRzTGlzdAkBAAAAFmNvbnZlcnRKc29uQXJyYXlUb0xpc3QAAAACBQAAABhwcmVkZWZpbmVkQXNzZXRDb250cmFjdHMCAAAAASwAAAAAEWN1cnJlbnRBc3NldEluZGV4CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFGN1cnJlbnRBc3NldEluZGV4S2V5AAAAAAAAAAAAAAAAAAlkZWJ0VG9rZW4JAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAADmRlYnRUb2tlbklkS2V5AgAAABNObyBkZWJ0IHRva2VuIGZvdW5kAAAAABZkZWJ0VG9rZW5SZWlzc3VlQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAGWRlYnRUb2tlbkV0YWxvbkJhbGFuY2VLZXkAAAAAAAAAAAAAAAAAE25ldXRyaW5vUnBkQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAADm5ldXRyaW5vUnBkS2V5AQAAABVnZXROZXV0cmlub1JwZEJhbGFuY2UAAAABAAAAC3VzZXJBZGRyZXNzBAAAABZ1c2VyTmV1dHJpbm9ScGRCYWxhbmNlCQAEuQAAAAIJAARMAAAAAgIAAAALcnBkX2JhbGFuY2UJAARMAAAAAgUAAAASbmV1dHJpbm9Bc3NldElkU3RyCQAETAAAAAIFAAAAC3VzZXJBZGRyZXNzBQAAAANuaWwCAAAAAV8JAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAATbmV1dHJpbm9ScGRDb250cmFjdAUAAAAWdXNlck5ldXRyaW5vUnBkQmFsYW5jZQAAAAAAAAAAAAEAAAAVZ2V0QXNzZXRBZGRyZXNzQnlDb2RlAAAAAQAAAAthc3NldFN5bWJvbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAAYZ2V0QXNzZXRBZGRyZXNzQnlDb2RlS2V5AAAAAQUAAAALYXNzZXRTeW1ib2wCAAAAAAEAAAAbZ2V0QXNzZXRBZGRyZXNzQnlDb2RlT3JGYWlsAAAAAQAAAAthc3NldFN5bWJvbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAABhnZXRBc3NldEFkZHJlc3NCeUNvZGVLZXkAAAABBQAAAAthc3NldFN5bWJvbAkAASwAAAACCQABLAAAAAICAAAAHUNhbm5vdCBmaW5kIGFzc2V0IGFkZHJlc3MgYnkgBQAAAAthc3NldFN5bWJvbAIAAAAFIGNvZGUBAAAADGdldEFzc2V0Q29kZQAAAAEAAAALYXNzZXRDb25maWcJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAADGtleUFzc2V0Q29kZQEAAAAKZ2V0QXNzZXRJRAAAAAEAAAALYXNzZXRDb25maWcJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAACmtleUFzc2V0SWQBAAAADmdldEFzc2V0U3RhdHVzAAAAAQAAAAthc3NldENvbmZpZwkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAOa2V5QXNzZXRTdGF0dXMBAAAAFWdldEFzc2V0UHJpY2VEZWNpbWFscwAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAVa2V5QXNzZXRQcmljZURlY2ltYWxzAQAAABVnZXRBc3NldEJha2luZ0Fzc2V0SWQAAAABAAAAC2Fzc2V0Q29uZmlnCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABNrZXlBc3NldEJha2luZ0Fzc2V0AQAAAB1nZXRBc3NldE92ZXJDb2xsYXRlcmFsUGVyY2VudAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAba2V5T3ZlcmNvbGxhdGVyYWxQZXJjZW50YWdlAQAAAB1nZXRBc3NldE1pblJlcXVpcmVkUG9vbEFtb3VudAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAKa2V5TWluUG9vbAEAAAAaZ2V0QXNzZXRQcmljZU9yYWNsZUFkZHJlc3MAAAABAAAAC2Fzc2V0Q29uZmlnCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABVrZXlQcmljZU9yYWNsZUFkZHJlc3MBAAAAGGdldE1pbkJ1eVBheW1lbnRQZXJBc3NldAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAQa2V5TWluQnV5UGF5bWVudAEAAAAZZ2V0TWluU2VsbFBheW1lbnRQZXJBc3NldAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAARa2V5TWluU2VsbFBheW1lbnQBAAAAGmdldEJ1eUxvY2tJbnRlcnZhbFBlckFzc2V0AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAABJrZXlCdXlMb2NrSW50ZXJ2YWwBAAAAG2dldFNlbGxMb2NrSW50ZXJ2YWxQZXJBc3NldAAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAATa2V5U2VsbExvY2tJbnRlcnZhbAEAAAARZ2V0QnV5RmVlUGVyQXNzZXQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAACWtleUJ1eUZlZQEAAAASZ2V0U2VsbEZlZVBlckFzc2V0AAAAAQAAAAthc3NldENvbmZpZwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2Fzc2V0Q29uZmlnBQAAAAprZXlTZWxsRmVlAQAAABpnZXRSZWRlbXB0aW9uVGltZW91dEJsb2NrcwAAAAEAAAALYXNzZXRDb25maWcJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAthc3NldENvbmZpZwUAAAAYa2V5UG9vbFJlZGVtcHRpb25UaW1lb3V0AQAAACFnZXRXZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQAAAABAAAAC2Fzc2V0Q29uZmlnCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAALYXNzZXRDb25maWcFAAAAIWtleVdlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAEAAAASZ2V0QXNzZXRQb29sTWFrZXJzAAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAFWdldEFzc2V0UG9vbE1ha2Vyc0tleQAAAAEFAAAADGFzc2V0QWRkcmVzcwIAAAAAAQAAABJnZXRBc3NldEluaXRIZWlnaHQAAAABAAAADGFzc2V0QWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAVZ2V0QXNzZXRJbml0SGVpZ2h0S2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzAAAAAAAAAAAAAQAAABZnZXRBc3NldEFjdGl2YXRlSGVpZ2h0AAAAAQAAAAxhc3NldEFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAGWdldEFzc2V0QWN0aXZhdGVIZWlnaHRLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MAAAAAAAAAAAABAAAAGWdldEFzc2V0Q3VycmVudFBvb2xBbW91bnQAAAABAAAADGFzc2V0QWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAdZ2V0QXNzZXRDdXJycmVudFBvb2xBbW91bnRLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MAAAAAAAAAAAABAAAAFWdldEFzc2V0TWF4UG9vbEFtb3VudAAAAAEAAAAMYXNzZXRBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABhnZXRBc3NldE1heFBvb2xBbW91bnRLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MAAAAAAAAAAAABAAAADGdldEFzc2V0TWV0YQAAAAEAAAAMYXNzZXRBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAAA9nZXRBc3NldE1ldGFLZXkAAAABBQAAAAxhc3NldEFkZHJlc3MCAAAAAAEAAAAfZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudAAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAImdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnRLZXkAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAAEHBvb2xNYWtlckFkZHJlc3MAAAAAAAAAAAABAAAAImdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnQAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAACVnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uTWF4QW1vdW50S2V5AAAAAgUAAAAMYXNzZXRBZGRyZXNzBQAAABBwb29sTWFrZXJBZGRyZXNzAAAAAAAAAAAAAQAAABhnZXRQb29sTWFrZXJMb2NrZWRBbW91bnQAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABtnZXRQb29sTWFrZXJMb2NrZWRBbW91bnRLZXkAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAAEHBvb2xNYWtlckFkZHJlc3MAAAAAAAAAAAABAAAAGGdldFBvb2xNYWtlclVubG9ja0hlaWdodAAAAAIAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAG2dldFBvb2xNYWtlclVubG9ja0hlaWdodEtleQAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAAQcG9vbE1ha2VyQWRkcmVzcwAAAAAAAAAAAAEAAAANZ2V0QXNzZXRQcmljZQAAAAIAAAAScHJpY2VPcmFjbGVBZGRyZXNzAAAACWFzc2V0Q29kZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwkBAAAAEGdldEFzc2V0UHJpY2VLZXkAAAABBQAAAAlhc3NldENvZGUCAAAAFE5vIEFzc2V0IHByaWNlIGZvdW5kAQAAABhnZXRQb29sVG90YWxMb2NrZWRBbW91bnQAAAABAAAADGFzc2V0QWRkcmVzcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAbZ2V0UG9vbFRvdGFsTG9ja2VkQW1vdW50S2V5AAAAAQUAAAAMYXNzZXRBZGRyZXNzAAAAAAAAAAAAAQAAAB9jb21wb3NlQXNzZXRDb25maWd1cmF0aW9uU3RyaW5nAAAAEAAAAAlhc3NldENvZGUAAAAHYXNzZXRJZAAAAAthc3NldFN0YXR1cwAAAA1wcmljZURlY2ltYWxzAAAADmJhY2tpbmdBc3NldElkAAAAFW92ZXJDb2xsYXRlcmFsUGVyY2VudAAAAAdtaW5Qb29sAAAAEnByaWNlT3JhY2xlQWRkcmVzcwAAAA1taW5CdXlQYXltZW50AAAADm1pblNlbGxQYXltZW50AAAAD2J1eUxvY2tJbnRlcnZhbAAAABBzZWxsTG9ja0ludGVydmFsAAAABmJ1eUZlZQAAAAdzZWxsRmVlAAAAFXBvb2xSZWRlbXB0aW9uVGltZW91dAAAAB53ZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQJAAS5AAAAAgkABEwAAAACAgAAAB4lcyVzJXMlZCVzJWQlZCVzJWQlZCVkJWQlZCVkJWQJAARMAAAAAgUAAAAJYXNzZXRDb2RlCQAETAAAAAIFAAAAB2Fzc2V0SWQJAARMAAAAAgUAAAALYXNzZXRTdGF0dXMJAARMAAAAAgkAAaQAAAABBQAAAA1wcmljZURlY2ltYWxzCQAETAAAAAIFAAAADmJhY2tpbmdBc3NldElkCQAETAAAAAIJAAGkAAAAAQUAAAAVb3ZlckNvbGxhdGVyYWxQZXJjZW50CQAETAAAAAIJAAGkAAAAAQUAAAAHbWluUG9vbAkABEwAAAACBQAAABJwcmljZU9yYWNsZUFkZHJlc3MJAARMAAAAAgkAAaQAAAABBQAAAA1taW5CdXlQYXltZW50CQAETAAAAAIJAAGkAAAAAQUAAAAObWluU2VsbFBheW1lbnQJAARMAAAAAgkAAaQAAAABBQAAAA9idXlMb2NrSW50ZXJ2YWwJAARMAAAAAgkAAaQAAAABBQAAABBzZWxsTG9ja0ludGVydmFsCQAETAAAAAIJAAGkAAAAAQUAAAAGYnV5RmVlCQAETAAAAAIJAAGkAAAAAQUAAAAHc2VsbEZlZQkABEwAAAACCQABpAAAAAEFAAAAFXBvb2xSZWRlbXB0aW9uVGltZW91dAkABEwAAAACCQABpAAAAAEFAAAAHndlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAUAAAADbmlsAgAAAAJfXwEAAAAUdXBkYXRlQXNzZXRDZmdTdGF0dXMAAAACAAAACW5ld1N0YXR1cwAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAAVhQ29kZQkBAAAADGdldEFzc2V0Q29kZQAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAA2FJRAkBAAAACmdldEFzc2V0SUQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAA5hUHJpY2VEZWNpbWFscwkBAAAAFWdldEFzc2V0UHJpY2VEZWNpbWFscwAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAADmFCYWtpbmdBc3NldElkCQEAAAAVZ2V0QXNzZXRCYWtpbmdBc3NldElkAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAWYU92ZXJDb2xsYXRlcmFsUGVyY2VudAkBAAAAHWdldEFzc2V0T3ZlckNvbGxhdGVyYWxQZXJjZW50AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAQYU1pblJlcXVpcmVkUG9vbAkBAAAAHWdldEFzc2V0TWluUmVxdWlyZWRQb29sQW1vdW50AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAATYVByaWNlT3JhY2xlQWRkcmVzcwkBAAAAGmdldEFzc2V0UHJpY2VPcmFjbGVBZGRyZXNzAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAOYU1pbkJ1eVBheW1lbnQJAQAAABhnZXRNaW5CdXlQYXltZW50UGVyQXNzZXQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAA9hTWluU2VsbFBheW1lbnQJAQAAABlnZXRNaW5TZWxsUGF5bWVudFBlckFzc2V0AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAQYUJ1eUxvY2tJbnRlcnZhbAkBAAAAGmdldEJ1eUxvY2tJbnRlcnZhbFBlckFzc2V0AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAARYVNlbGxMb2NrSW50ZXJ2YWwJAQAAABtnZXRTZWxsTG9ja0ludGVydmFsUGVyQXNzZXQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAAdhQnV5RmVlCQEAAAARZ2V0QnV5RmVlUGVyQXNzZXQAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAAhhU2VsbEZlZQkBAAAAEmdldFNlbGxGZWVQZXJBc3NldAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAGGFSZWRlbXB0aW9uVGltZW91dEJsb2NrcwkBAAAAGmdldFJlZGVtcHRpb25UaW1lb3V0QmxvY2tzAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAed2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50CQEAAAAhZ2V0V2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAkBAAAAH2NvbXBvc2VBc3NldENvbmZpZ3VyYXRpb25TdHJpbmcAAAAQBQAAAAVhQ29kZQUAAAADYUlEBQAAAAluZXdTdGF0dXMFAAAADmFQcmljZURlY2ltYWxzBQAAAA5hQmFraW5nQXNzZXRJZAUAAAAWYU92ZXJDb2xsYXRlcmFsUGVyY2VudAUAAAAQYU1pblJlcXVpcmVkUG9vbAUAAAATYVByaWNlT3JhY2xlQWRkcmVzcwUAAAAOYU1pbkJ1eVBheW1lbnQFAAAAD2FNaW5TZWxsUGF5bWVudAUAAAAQYUJ1eUxvY2tJbnRlcnZhbAUAAAARYVNlbGxMb2NrSW50ZXJ2YWwFAAAAB2FCdXlGZWUFAAAACGFTZWxsRmVlBQAAABhhUmVkZW1wdGlvblRpbWVvdXRCbG9ja3MFAAAAHndlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAEAAAAZY2FsY0FsbG93ZWRBbW91bnRUb1JlZGVlbQAAAAIAAAAJYXNzZXRDb2RlAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAD2Fzc2V0QWRkcmVzc1N0cgkBAAAAG2dldEFzc2V0QWRkcmVzc0J5Q29kZU9yRmFpbAAAAAEFAAAACWFzc2V0Q29kZQQAAAAMYXNzZXRBZGRyZXNzCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIEAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QJAQAAABNnZXRBc3NldENvbmZpZ0FycmF5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyBAAAAAphc3NldElkU3RyCQEAAAAKZ2V0QXNzZXRJRAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QEAAAAB2Fzc2V0SWQJAAJZAAAAAQUAAAAKYXNzZXRJZFN0cgQAAAAOcG9vbEFjdHVhbFNpemUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAHWdldEFzc2V0Q3VycnJlbnRQb29sQW1vdW50S2V5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyAAAAAAAAAAAABAAAAAtwb29sTWF4U2l6ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAYZ2V0QXNzZXRNYXhQb29sQW1vdW50S2V5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyAAAAAAAAAAAABAAAABhwb29sVG90YWxMb2NrZWRBbW91bnRLZXkJAQAAABtnZXRQb29sVG90YWxMb2NrZWRBbW91bnRLZXkAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIEAAAAD3Bvb2xUb3RhbExvY2tlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABhwb29sVG90YWxMb2NrZWRBbW91bnRLZXkAAAAAAAAAAAAEAAAAFWFzc2V0VXNkblN0YWtlZEFtb3VudAkBAAAAFWdldE5ldXRyaW5vUnBkQmFsYW5jZQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgQAAAAWYXNzZXRVc2RuQmFsYW5jZUFtb3VudAkAA/AAAAACBQAAAAxhc3NldEFkZHJlc3MFAAAAD25ldXRyaW5vQXNzZXRJZAQAAAAUYXNzZXRUb3RhbFVzZG5BbW91bnQJAABlAAAAAgkAAGQAAAACBQAAABVhc3NldFVzZG5TdGFrZWRBbW91bnQFAAAAFmFzc2V0VXNkbkJhbGFuY2VBbW91bnQFAAAAD3Bvb2xUb3RhbExvY2tlZAQAAAALdWNvbGxhdGVyYWwJAABlAAAAAgUAAAAUYXNzZXRUb3RhbFVzZG5BbW91bnQFAAAADnBvb2xBY3R1YWxTaXplBAAAABBkZWZvQXNzZXRCYWxhbmNlCQAD8AAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAAHYXNzZXRJZAQAAAASYXNzZXRFbWlzc2lvbkRpcnR5CAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEFAAAAB2Fzc2V0SWQJAAEsAAAAAgIAAAAYQ2Fubm90IGZpbmQgYXNzZXQgYnkgaWQgBQAAAAphc3NldElkU3RyAAAACHF1YW50aXR5BAAAAA1hc3NldEVtaXNzaW9uCQAAZQAAAAIFAAAAEmFzc2V0RW1pc3Npb25EaXJ0eQUAAAAQZGVmb0Fzc2V0QmFsYW5jZQQAAAAScHJpY2VPcmFjbGVBZGRyZXNzCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAaZ2V0QXNzZXRQcmljZU9yYWNsZUFkZHJlc3MAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0BAAAAAxjdXJyZW50UHJpY2UJAQAAAA1nZXRBc3NldFByaWNlAAAAAgUAAAAScHJpY2VPcmFjbGVBZGRyZXNzBQAAAAlhc3NldENvZGUEAAAAG3ByaWNlV2l0aE92ZXJjb2xsYXRlcmFsUmF0ZQkAAGkAAAACCQAAaAAAAAIJAABkAAAAAgUAAAANbXVsdGlwbGljYXRvcgkBAAAAHWdldEFzc2V0T3ZlckNvbGxhdGVyYWxQZXJjZW50AAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAUAAAAMY3VycmVudFByaWNlBQAAAA1tdWx0aXBsaWNhdG9yBAAAABl1c2RuTmVlZGVkVG9Db3ZlckVtaXNzaW9uCQAAaAAAAAIFAAAAG3ByaWNlV2l0aE92ZXJjb2xsYXRlcmFsUmF0ZQUAAAANYXNzZXRFbWlzc2lvbgQAAAAScG9vbE1ha2VyTWF4QW1vdW50CQEAAAAiZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbk1heEFtb3VudAAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAAQcG9vbE1ha2VyQWRkcmVzcwQAAAAfcG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudEtleQkBAAAAImdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnRLZXkAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAFXBvb2xNYWtlckFjdHVhbEFtb3VudAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAB9wb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50S2V5AAAAAAAAAAAABAAAABVwb29sTWFrZXJMb2NrZWRBbW91bnQJAQAAABhnZXRQb29sTWFrZXJMb2NrZWRBbW91bnQAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAB3N1cnBsdXMJAABlAAAAAgUAAAALdWNvbGxhdGVyYWwFAAAAGXVzZG5OZWVkZWRUb0NvdmVyRW1pc3Npb24EAAAAEHBlcmNlbnRWaWFBY3R1YWwJAABrAAAAAwUAAAAVcG9vbE1ha2VyQWN0dWFsQW1vdW50BQAAAA1tdWx0aXBsaWNhdG9yBQAAAA5wb29sQWN0dWFsU2l6ZQQAAAANcGVyY2VudFZpYU1heAkAAGsAAAADBQAAABJwb29sTWFrZXJNYXhBbW91bnQFAAAADW11bHRpcGxpY2F0b3IFAAAAC3Bvb2xNYXhTaXplBAAAAApmcm96ZW5QYXJ0AwkAAGcAAAACBQAAAAdzdXJwbHVzAAAAAAAAAAAAAAAAAAAAAAAACQABlgAAAAEJAARMAAAAAgUAAAAQcGVyY2VudFZpYUFjdHVhbAkABEwAAAACBQAAAA1wZXJjZW50VmlhTWF4BQAAAANuaWwEAAAAFWFsbG93ZWRBbW91bnRUb1JlZGVlbQkAAGsAAAADCQAAZQAAAAIFAAAADW11bHRpcGxpY2F0b3IFAAAACmZyb3plblBhcnQFAAAAFXBvb2xNYWtlckFjdHVhbEFtb3VudAUAAAANbXVsdGlwbGljYXRvcgQAAAAOd2l0aGRyYXdIZWlnaHQJAABkAAAAAgUAAAAGaGVpZ2h0CQEAAAAaZ2V0UmVkZW1wdGlvblRpbWVvdXRCbG9ja3MAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0CQAFGgAAAAgFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAAVYWxsb3dlZEFtb3VudFRvUmVkZWVtBQAAAA9wb29sVG90YWxMb2NrZWQFAAAADnBvb2xBY3R1YWxTaXplBQAAABVwb29sTWFrZXJBY3R1YWxBbW91bnQFAAAADndpdGhkcmF3SGVpZ2h0BQAAABVwb29sTWFrZXJMb2NrZWRBbW91bnQJAAS5AAAAAgkABEwAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIJAARMAAAAAgUAAAAKYXNzZXRJZFN0cgkABEwAAAACBQAAABBwb29sTWFrZXJBZGRyZXNzCQAETAAAAAIJAAGkAAAAAQUAAAAVYXNzZXRVc2RuU3Rha2VkQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAWYXNzZXRVc2RuQmFsYW5jZUFtb3VudAkABEwAAAACCQABpAAAAAEFAAAAFGFzc2V0VG90YWxVc2RuQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAOcG9vbEFjdHVhbFNpemUJAARMAAAAAgkAAaQAAAABBQAAAAtwb29sTWF4U2l6ZQkABEwAAAACCQABpAAAAAEFAAAAC3Vjb2xsYXRlcmFsCQAETAAAAAIJAAGkAAAAAQUAAAANYXNzZXRFbWlzc2lvbgkABEwAAAACCQABpAAAAAEFAAAADGN1cnJlbnRQcmljZQkABEwAAAACCQABpAAAAAEFAAAAG3ByaWNlV2l0aE92ZXJjb2xsYXRlcmFsUmF0ZQkABEwAAAACCQABpAAAAAEFAAAAEnBvb2xNYWtlck1heEFtb3VudAkABEwAAAACCQABpAAAAAEFAAAAFXBvb2xNYWtlckFjdHVhbEFtb3VudAkABEwAAAACCQABpAAAAAEFAAAAFXBvb2xNYWtlckxvY2tlZEFtb3VudAkABEwAAAACCQABpAAAAAEFAAAAB3N1cnBsdXMJAARMAAAAAgkAAaQAAAABBQAAABBwZXJjZW50VmlhQWN0dWFsCQAETAAAAAIJAAGkAAAAAQUAAAANcGVyY2VudFZpYU1heAkABEwAAAACCQABpAAAAAEFAAAACmZyb3plblBhcnQJAARMAAAAAgkAAaQAAAABBQAAABVhbGxvd2VkQW1vdW50VG9SZWRlZW0FAAAAA25pbAUAAAADU0VQAAAABwAAAAFpAQAAAARpbml0AAAACAAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAABZuZXV0cmlub1N0YWtpbmdBZGRyZXNzAAAAGG1pbmltdW5Qb29sRnVuZGluZ0Ftb3VudAAAABNwcmVkZWZpbmVkQXNzZXRMaXN0AAAAEWN1cnJlbnRBc3NldEluZGV4AAAAEmRlYnRFdGhhbG9uQmFsYW5jZQAAABJkZWZvU3Rha2luZ0FkZHJlc3MAAAAXZGVmb1N0YWtpbmdQYWNlbWFrZXJQdWIDCQEAAAACIT0AAAACCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAAACAAAAAQIAAAAqT25seSBBZG1pbiBjYW4gcGVyZm9ybSBjb250cmFjdCBvcGVyYXRpb24uAwkAAAAAAAACCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAQaXNJbml0aWFsaXplZEtleQYJAAACAAAAAQIAAAAhQ29udHJhY3Qgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuBAAAAAlpc3N1ZURlYnQJAARCAAAABQIAAAAJREVGT19ERUJUAgAAABBERUZPIERlYnQgVG9rZW4uAAAAAAAAAAABAAAAAAAAAAAGBgQAAAALZGVidFRva2VuSWQJAAQ4AAAAAQUAAAAJaXNzdWVEZWJ0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAGm5ldXRyaW5vQ29udHJhY3RBZGRyZXNzS2V5BQAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABluZXV0cmlub1N0YWtpbmdBZGRyZXNzS2V5BQAAABZuZXV0cmlub1N0YWtpbmdBZGRyZXNzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABttaW5pbXVuUG9vbEZ1bmRpbmdBbW91bnRLZXkFAAAAGG1pbmltdW5Qb29sRnVuZGluZ0Ftb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABRhc3NldHNBZGRyZXNzTGlzdEtleQUAAAATcHJlZGVmaW5lZEFzc2V0TGlzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAUY3VycmVudEFzc2V0SW5kZXhLZXkFAAAAEWN1cnJlbnRBc3NldEluZGV4CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABlkZWJ0VG9rZW5FdGFsb25CYWxhbmNlS2V5BQAAABJkZWJ0RXRoYWxvbkJhbGFuY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAOZGVidFRva2VuSWRLZXkJAAJYAAAAAQUAAAALZGVidFRva2VuSWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAVZGVmb1N0YWtpbmdBZGRyZXNzS2V5BQAAABJkZWZvU3Rha2luZ0FkZHJlc3MJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAaZGVmb1N0YWtpbmdQYWNlbWFrZXJQdWJLZXkFAAAAF2RlZm9TdGFraW5nUGFjZW1ha2VyUHViCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAABBpc0luaXRpYWxpemVkS2V5BgkABEwAAAACBQAAAAlpc3N1ZURlYnQJAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAAAtkZWJ0VG9rZW5JZAAAAAAAAAAAAQUAAAADbmlsAAAAAWkBAAAADHByb3Bvc2VBc3NldAAAAA8AAAAJYXNzZXRDb2RlAAAABG1ldGEAAAAHbWluUG9vbAAAABJwcmljZU9yYWNsZUFkZHJlc3MAAAAVb3ZlckNvbGxhdGVyYWxQZXJjZW50AAAADmJhY2tpbmdBc3NldElkAAAADXByaWNlRGVjaW1hbHMAAAANbWluQnV5UGF5bWVudAAAAA5taW5TZWxsUGF5bWVudAAAAA9idXlMb2NrSW50ZXJ2YWwAAAAQc2VsbExvY2tJbnRlcnZhbAAAAAZidXlGZWUAAAAHc2VsbEZlZQAAABVwb29sUmVkZW1wdGlvblRpbWVvdXQAAAAed2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50AwkBAAAAAiE9AAAAAgkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAADmFkbWluUHVibGljS2V5CQAAAgAAAAECAAAAKk9ubHkgQWRtaW4gY2FuIHBlcmZvcm0gY29udHJhY3Qgb3BlcmF0aW9uLgMJAAAAAAAAAgkBAAAADGdldEJvb2xCeUtleQAAAAEFAAAAEGlzSW5pdGlhbGl6ZWRLZXkHCQAAAgAAAAECAAAAGkNvbnRyYWN0IGlzIG5vdCB5ZXQgcmVhZHkuAwkBAAAAAiE9AAAAAgkAAlkAAAABBQAAAA5iYWNraW5nQXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkCQAAAgAAAAECAAAAI0Jha2luZyBhc3NldCBpZCBjb3VsZCBiZSBVU0ROIG9ubHkuAwkBAAAAAiE9AAAAAgkBAAAAFWdldEFzc2V0QWRkcmVzc0J5Q29kZQAAAAEFAAAACWFzc2V0Q29kZQIAAAAACQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABdBc3NldCB3aXRoIHBhc3NlZCBjb2RlIAUAAAAJYXNzZXRDb2RlAgAAABsgaGFzIGFscmVhZHkgYmVlbiBwcm9wb3NlZC4DCQAAZgAAAAIFAAAAEm1pbmltdW1Qb29sRnVuZGluZwUAAAAHbWluUG9vbAkAAAIAAAABCQABLAAAAAICAAAAM01pbmltdW0gcG9vbCBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgb3IgZXF1YWxzIHRvIAkAAaQAAAABBQAAABJtaW5pbXVtUG9vbEZ1bmRpbmcDAwMDAwMDAwkAAGYAAAACAAAAAAAAAAAABQAAABVvdmVyQ29sbGF0ZXJhbFBlcmNlbnQGCQAAZgAAAAIAAAAAAAAAAAAFAAAADXByaWNlRGVjaW1hbHMGCQAAZgAAAAIAAAAAAAAAAAAFAAAADW1pbkJ1eVBheW1lbnQGCQAAZgAAAAIAAAAAAAAAAAAFAAAADm1pblNlbGxQYXltZW50BgkAAGYAAAACAAAAAAAAAAAABQAAAA9idXlMb2NrSW50ZXJ2YWwGCQAAZgAAAAIAAAAAAAAAAAAFAAAAEHNlbGxMb2NrSW50ZXJ2YWwGCQAAZgAAAAIAAAAAAAAAAAAFAAAABmJ1eUZlZQYJAABmAAAAAgAAAAAAAAAAAAUAAAAHc2VsbEZlZQkAAAIAAAABAgAAAChPbmUgb2YgdGhlIHBhc3NlZCBwYXJhbWV0ZXJzIGlzIGludmFsaWQuBAAAABdwcmljZU9yYWNsZUFkZHJlc3NWYWxpZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAABJwcmljZU9yYWNsZUFkZHJlc3MCAAAAKVBhc3NlZCBQcmljZSBPcmFjbGUgQWRkcmVzcyBpcyBub3QgdmFsaWQuBAAAAAxhc3NldEFkZHJlc3MJAAGRAAAAAgUAAAAUcHJlZGVmaW5lZEFzc2V0c0xpc3QFAAAAEWN1cnJlbnRBc3NldEluZGV4BAAAAAtkZWZvQXNzZXRJZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABBQAAAAxhc3NldEFkZHJlc3MCAAAAAAUAAAAOZGVmb0Fzc2V0SWRLZXkCAAAAF05vIGRlZm8gYXNzZXQgSUQgZm91bmQuCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFnZXRBc3NldENvbmZpZ0tleQAAAAEFAAAADGFzc2V0QWRkcmVzcwkBAAAAH2NvbXBvc2VBc3NldENvbmZpZ3VyYXRpb25TdHJpbmcAAAAQBQAAAAlhc3NldENvZGUFAAAAC2RlZm9Bc3NldElkCAUAAAALYXNzZXRTdGF0dXMAAAACXzEFAAAADXByaWNlRGVjaW1hbHMFAAAADmJhY2tpbmdBc3NldElkBQAAABVvdmVyQ29sbGF0ZXJhbFBlcmNlbnQFAAAAB21pblBvb2wFAAAAEnByaWNlT3JhY2xlQWRkcmVzcwUAAAANbWluQnV5UGF5bWVudAUAAAAObWluU2VsbFBheW1lbnQFAAAAD2J1eUxvY2tJbnRlcnZhbAUAAAAQc2VsbExvY2tJbnRlcnZhbAUAAAAGYnV5RmVlBQAAAAdzZWxsRmVlBQAAABVwb29sUmVkZW1wdGlvblRpbWVvdXQFAAAAHndlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAYZ2V0QXNzZXRBZGRyZXNzQnlDb2RlS2V5AAAAAQUAAAAJYXNzZXRDb2RlBQAAAAxhc3NldEFkZHJlc3MJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldEFzc2V0TWV0YUtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwUAAAAEbWV0YQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFWdldEFzc2V0SW5pdEhlaWdodEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABRjdXJyZW50QXNzZXRJbmRleEtleQkAAGQAAAACBQAAABFjdXJyZW50QXNzZXRJbmRleAAAAAAAAAAAAQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAbZ2V0QXNzZXRBZGRyZXNzQnlBc3NldElkS2V5AAAAAQUAAAALZGVmb0Fzc2V0SWQFAAAADGFzc2V0QWRkcmVzcwUAAAADbmlsAAAAAWkBAAAAEWZ1bmRMaXF1aWRpdHlQb29sAAAAAQAAAAlhc3NldENvZGUEAAAAD2Fzc2V0QWRkcmVzc1N0cgkBAAAAG2dldEFzc2V0QWRkcmVzc0J5Q29kZU9yRmFpbAAAAAEFAAAACWFzc2V0Q29kZQQAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAkBAAAAE2dldEFzc2V0Q29uZmlnQXJyYXkAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIEAAAAD2F0dGFjaGVkUGF5bWVudAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAQcG9vbE1ha2VyQWRkcmVzcwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAAAAAAAIJAQAAAAxnZXRCb29sQnlLZXkAAAABBQAAABBpc0luaXRpYWxpemVkS2V5BwkAAAIAAAABAgAAABpDb250cmFjdCBpcyBub3QgeWV0IHJlYWR5LgMJAQAAAAIhPQAAAAIIBQAAAA9hdHRhY2hlZFBheW1lbnQAAAAHYXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkCQAAAgAAAAECAAAALkxpcXVpZGl0eSBwb29sIGNvdWxkIGJlIGZ1bmRlZCB3aXRoIFVTRE4gb25seS4DCQAAZgAAAAIFAAAAE21pblBvb2xJbnZlc3RBbW91bnQIBQAAAA9hdHRhY2hlZFBheW1lbnQAAAAGYW1vdW50CQAAAgAAAAEJAAEsAAAAAgIAAAAxQXR0YWNoZWQgcGF5bWVudCBhbW91bnQgaXMgbGVzcyB0aGEgbWluIGFsbG93ZWQ6IAkAAaQAAAABBQAAABNtaW5Qb29sSW52ZXN0QW1vdW50BAAAABRuZXdDdXJyZW50UG9vbEFtb3VudAkAAGQAAAACCAUAAAAPYXR0YWNoZWRQYXltZW50AAAABmFtb3VudAkBAAAAGWdldEFzc2V0Q3VycmVudFBvb2xBbW91bnQAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIEAAAADW1heFBvb2xBbW91bnQJAQAAABVnZXRBc3NldE1heFBvb2xBbW91bnQAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIEAAAAF2N1cnJlbnRQb29sTWFrZXJCYWxhbmNlCQEAAAAfZ2V0UG9vbE1ha2VyUGFydGljaXBhdGlvbkFtb3VudAAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAAQcG9vbE1ha2VyQWRkcmVzcwQAAAATbWF4UG9vbE1ha2VyQmFsYW5jZQkBAAAAImdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25NYXhBbW91bnQAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAEmN1cnJlbnRBc3NldFN0YXR1cwkBAAAADmdldEFzc2V0U3RhdHVzAAAAAQUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAQAAAAObmV3QXNzZXRTdGF0dXMDAwkAAAAAAAACBQAAABJjdXJyZW50QXNzZXRTdGF0dXMFAAAADUFTU0V0UFJPUE9TRUQJAABnAAAAAgUAAAAUbmV3Q3VycmVudFBvb2xBbW91bnQJAQAAAB1nZXRBc3NldE1pblJlcXVpcmVkUG9vbEFtb3VudAAAAAEFAAAAFmFzc2V0Q29uZmlndXJhdGlvbkxpc3QHBQAAAApBU1NFdFJFQURZBQAAABJjdXJyZW50QXNzZXRTdGF0dXMEAAAAE25ld1Bvb2xNYWtlckJhbGFuY2UJAABkAAAAAgUAAAAXY3VycmVudFBvb2xNYWtlckJhbGFuY2UIBQAAAA9hdHRhY2hlZFBheW1lbnQAAAAGYW1vdW50BAAAABlpbW1lZGlhdGVUcmFuc2ZlcklmSXNzdWVkAwkAAAAAAAACBQAAABJjdXJyZW50QXNzZXRTdGF0dXMFAAAAC0FTU0V0SVNTVUVECQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cggFAAAAD2F0dGFjaGVkUGF5bWVudAAAAAZhbW91bnQFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAADbmlsBQAAAANuaWwJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAImdldFBvb2xNYWtlclBhcnRpY2lwYXRpb25BbW91bnRLZXkAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAAEHBvb2xNYWtlckFkZHJlc3MFAAAAE25ld1Bvb2xNYWtlckJhbGFuY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAACVnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uTWF4QW1vdW50S2V5AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAABBwb29sTWFrZXJBZGRyZXNzCQABlgAAAAEJAARMAAAAAgUAAAATbmV3UG9vbE1ha2VyQmFsYW5jZQkABEwAAAACBQAAABNtYXhQb29sTWFrZXJCYWxhbmNlBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAB1nZXRBc3NldEN1cnJyZW50UG9vbEFtb3VudEtleQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAAUbmV3Q3VycmVudFBvb2xBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABhnZXRBc3NldE1heFBvb2xBbW91bnRLZXkAAAABBQAAAA9hc3NldEFkZHJlc3NTdHIJAAGWAAAAAQkABEwAAAACBQAAAA1tYXhQb29sQW1vdW50CQAETAAAAAIFAAAAFG5ld0N1cnJlbnRQb29sQW1vdW50BQAAAANuaWwJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWdldEFzc2V0Q29uZmlnS2V5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyCQEAAAAUdXBkYXRlQXNzZXRDZmdTdGF0dXMAAAACBQAAAA5uZXdBc3NldFN0YXR1cwUAAAAWYXNzZXRDb25maWd1cmF0aW9uTGlzdAUAAAADbmlsBQAAABlpbW1lZGlhdGVUcmFuc2ZlcklmSXNzdWVkAAAAAWkBAAAADWFjdGl2YXRlQXNzZXQAAAABAAAACWFzc2V0Q29kZQQAAAAMYXNzZXRBZGRyZXNzCQEAAAAVZ2V0QXNzZXRBZGRyZXNzQnlDb2RlAAAAAQUAAAAJYXNzZXRDb2RlBAAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0CQEAAAATZ2V0QXNzZXRDb25maWdBcnJheQAAAAEFAAAADGFzc2V0QWRkcmVzcwQAAAAWYXNzZXRDdXJyZW50UG9vbEFtb3VudAkBAAAAGWdldEFzc2V0Q3VycmVudFBvb2xBbW91bnQAAAABBQAAAAxhc3NldEFkZHJlc3MEAAAADmFDdXJyZW50U3RhdHVzCQEAAAAOZ2V0QXNzZXRTdGF0dXMAAAABBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0AwkBAAAAAiE9AAAAAgkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAADmFkbWluUHVibGljS2V5CQAAAgAAAAECAAAAKk9ubHkgQWRtaW4gY2FuIHBlcmZvcm0gY29udHJhY3Qgb3BlcmF0aW9uLgMJAAAAAAAAAgkBAAAADGdldEJvb2xCeUtleQAAAAEFAAAAEGlzSW5pdGlhbGl6ZWRLZXkHCQAAAgAAAAECAAAAGkNvbnRyYWN0IGlzIG5vdCB5ZXQgcmVhZHkuAwkBAAAAAiE9AAAAAgUAAAAOYUN1cnJlbnRTdGF0dXMIBQAAAAthc3NldFN0YXR1cwAAAAJfMgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAwQXNzZXQgaXMgbm90IGluIFJFQURZIHN0YXR1cy4gQ3VycmVudCBzdGF0dXMgaXMgBQAAAA5hQ3VycmVudFN0YXR1cwIAAAABLgMJAAAAAAAAAgUAAAAMYXNzZXRBZGRyZXNzAgAAAAAJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAEkNhbm5vdCBmaW5kIGFzc2V0IAUAAAAJYXNzZXRDb2RlAgAAAAEuAwkAAGYAAAACBQAAABJtaW5pbXVtUG9vbEZ1bmRpbmcFAAAAFmFzc2V0Q3VycmVudFBvb2xBbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAC1DYW5ub3QgaXNzdWUgYXNzZXQgYXMgbGlxdWlkaXR5IHBvb2wgYW1vdW50ICgJAAGkAAAAAQUAAAAWYXNzZXRDdXJyZW50UG9vbEFtb3VudAIAAAAZKSBpcyBsZXNzIHRoYW4gcmVxdWlyZWQgKAkAAaQAAAABBQAAABJtaW5pbXVtUG9vbEZ1bmRpbmcCAAAAASkEAAAACWlzc3VlRGVidAkBAAAAB1JlaXNzdWUAAAADBQAAAAlkZWJ0VG9rZW4FAAAAFmRlYnRUb2tlblJlaXNzdWVBbW91bnQGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAZZ2V0QXNzZXRBY3RpdmF0ZUhlaWdodEtleQAAAAEFAAAADGFzc2V0QWRkcmVzcwUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFnZXRBc3NldENvbmZpZ0tleQAAAAEFAAAADGFzc2V0QWRkcmVzcwkBAAAAFHVwZGF0ZUFzc2V0Q2ZnU3RhdHVzAAAAAggFAAAAC2Fzc2V0U3RhdHVzAAAAAl8zBQAAABZhc3NldENvbmZpZ3VyYXRpb25MaXN0CQAETAAAAAIFAAAACWlzc3VlRGVidAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAxhc3NldEFkZHJlc3MFAAAAFmFzc2V0Q3VycmVudFBvb2xBbW91bnQFAAAAD25ldXRyaW5vQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAxhc3NldEFkZHJlc3MFAAAAFmRlYnRUb2tlblJlaXNzdWVBbW91bnQFAAAACWRlYnRUb2tlbgUAAAADbmlsAAAAAWkBAAAADnJlZGVlbUZyb21Qb29sAAAAAgAAAAlhc3NldENvZGUAAAAGYW1vdW50BAAAAA1jYWxsZXJBZGRyZXNzCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAALcmVkZWVtVHVwbGUJAQAAABljYWxjQWxsb3dlZEFtb3VudFRvUmVkZWVtAAAAAgUAAAAJYXNzZXRDb2RlBQAAAA1jYWxsZXJBZGRyZXNzBAAAAA9hc3NldEFkZHJlc3NTdHIIBQAAAAtyZWRlZW1UdXBsZQAAAAJfMQQAAAAVYWxsb3dlZEFtb3VudFRvUmVkZWVtCAUAAAALcmVkZWVtVHVwbGUAAAACXzIEAAAAD3Bvb2xUb3RhbExvY2tlZAgFAAAAC3JlZGVlbVR1cGxlAAAAAl8zBAAAAA5wb29sQWN0dWFsU2l6ZQgFAAAAC3JlZGVlbVR1cGxlAAAAAl80BAAAABVwb29sTWFrZXJBY3R1YWxBbW91bnQIBQAAAAtyZWRlZW1UdXBsZQAAAAJfNQQAAAAOd2l0aGRyYXdIZWlnaHQIBQAAAAtyZWRlZW1UdXBsZQAAAAJfNgQAAAAVcG9vbE1ha2VyTG9ja2VkQW1vdW50CAUAAAALcmVkZWVtVHVwbGUAAAACXzcEAAAACXRyYWNlRGF0YQgFAAAAC3JlZGVlbVR1cGxlAAAAAl84BAAAABxwb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0S2V5CQEAAAAfZ2V0UG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleQAAAAMFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAANY2FsbGVyQWRkcmVzcwUAAAAOd2l0aGRyYXdIZWlnaHQDCQAAAAAAAAIJAQAAAAxnZXRCb29sQnlLZXkAAAABBQAAABBpc0luaXRpYWxpemVkS2V5BwkAAAIAAAABAgAAABpDb250cmFjdCBpcyBub3QgeWV0IHJlYWR5LgMDAwkAAGYAAAACAAAAAAAAAAAABQAAAAZhbW91bnQGCQAAZwAAAAIAAAAAAAAAAAAFAAAAFXBvb2xNYWtlckFjdHVhbEFtb3VudAYJAABmAAAAAgUAAAAGYW1vdW50BQAAABVhbGxvd2VkQW1vdW50VG9SZWRlZW0JAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAIkNhbm5vdCBmaW5kIHBvb2wgbWFrZXIgYnkgYWRkcmVzcyAFAAAADWNhbGxlckFkZHJlc3MCAAAAISBvciBhbW91bnQgcGFzc2VkIGlzIG5vdCBjb3JyZWN0LgMJAABmAAAAAgkAAGgAAAACAAAAAAAAAAABBQAAAA1tdWx0aXBsaWNhdG9yBQAAAAZhbW91bnQJAAACAAAAAQIAAAAmUmVkZWVtIGFtb3VudCBpcyBsZXNzIHRoZW4gbWluIGFsbG93ZWQDCQAAZgAAAAIFAAAAFXBvb2xNYWtlckxvY2tlZEFtb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAAEZQb29sIG1ha2VyIGFscmVhZHkgaGFzIGluaXRpYXRlZCByZWRlbXB0aW9uIHRoYXQgaXMgbm90IHdpdGhkcmF3biB5ZXQuAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQaAAAAAgUAAAAEdGhpcwUAAAAccG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAwUG9vbCBtYWtlciBoYXMgYWxyZWFkeSBpbml0aWF0ZWQgcmVkZW1wdGlvbiBmb3IgCQABpAAAAAEFAAAABmhlaWdodAIAAAAHIGhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAG2dldFBvb2xUb3RhbExvY2tlZEFtb3VudEtleQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgkAAGQAAAACBQAAAA9wb29sVG90YWxMb2NrZWQFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAHWdldEFzc2V0Q3VycnJlbnRQb29sQW1vdW50S2V5AAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyCQAAZQAAAAIFAAAADnBvb2xBY3R1YWxTaXplBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAACJnZXRQb29sTWFrZXJQYXJ0aWNpcGF0aW9uQW1vdW50S2V5AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAAA1jYWxsZXJBZGRyZXNzCQAAZQAAAAIFAAAAFXBvb2xNYWtlckFjdHVhbEFtb3VudAUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABxwb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0S2V5BQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABtnZXRQb29sTWFrZXJMb2NrZWRBbW91bnRLZXkAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAADWNhbGxlckFkZHJlc3MFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAG2dldFBvb2xNYWtlclVubG9ja0hlaWdodEtleQAAAAIFAAAAD2Fzc2V0QWRkcmVzc1N0cgUAAAANY2FsbGVyQWRkcmVzcwUAAAAOd2l0aGRyYXdIZWlnaHQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgIAAAAZJXMlc190cmFjZV9yZWRlZW1Gcm9tUG9vbAUAAAAJdHJhY2VEYXRhBQAAAANuaWwAAAABaQEAAAAbZ2V0TWF4QWxsb3dlZEFtb3VudFRvUmVkZWVtAAAAAgAAAAlhc3NldENvZGUAAAAQcG9vbE1ha2VyQWRkcmVzcwQAAAALcmVkZWVtVHVwbGUJAQAAABljYWxjQWxsb3dlZEFtb3VudFRvUmVkZWVtAAAAAgUAAAAJYXNzZXRDb2RlBQAAABBwb29sTWFrZXJBZGRyZXNzBAAAAA9hc3NldEFkZHJlc3NTdHIIBQAAAAtyZWRlZW1UdXBsZQAAAAJfMQQAAAAVYWxsb3dlZEFtb3VudFRvUmVkZWVtCAUAAAALcmVkZWVtVHVwbGUAAAACXzIEAAAAD3Bvb2xUb3RhbExvY2tlZAgFAAAAC3JlZGVlbVR1cGxlAAAAAl8zBAAAAA5wb29sQWN0dWFsU2l6ZQgFAAAAC3JlZGVlbVR1cGxlAAAAAl80BAAAABVwb29sTWFrZXJBY3R1YWxBbW91bnQIBQAAAAtyZWRlZW1UdXBsZQAAAAJfNQQAAAAOd2l0aGRyYXdIZWlnaHQIBQAAAAtyZWRlZW1UdXBsZQAAAAJfNgQAAAAVcG9vbE1ha2VyTG9ja2VkQW1vdW50CAUAAAALcmVkZWVtVHVwbGUAAAACXzcEAAAACXRyYWNlRGF0YQgFAAAAC3JlZGVlbVR1cGxlAAAAAl84CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAAXsCAAAAF2FsbG93ZWRBbW91bnRUb1JlZGVlbTogCQABpAAAAAEFAAAAFWFsbG93ZWRBbW91bnRUb1JlZGVlbQIAAAANLCBhc3NldENvZGU6IAUAAAAJYXNzZXRDb2RlAgAAAA0sIHBvb2xNYWtlcjogBQAAABBwb29sTWFrZXJBZGRyZXNzAgAAAAksIHRyYWNlOiAFAAAACXRyYWNlRGF0YQIAAAABfQAAAAFpAQAAAAh3aXRoZHJhdwAAAAEAAAAJYXNzZXRDb2RlBAAAAA1jYWxsZXJBZGRyZXNzCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAPYXNzZXRBZGRyZXNzU3RyCQEAAAAbZ2V0QXNzZXRBZGRyZXNzQnlDb2RlT3JGYWlsAAAAAQUAAAAJYXNzZXRDb2RlBAAAAAxhc3NldEFkZHJlc3MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgQAAAAYcG9vbE1ha2VyTG9ja2VkQW1vdW50S2V5CQEAAAAbZ2V0UG9vbE1ha2VyTG9ja2VkQW1vdW50S2V5AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAAA1jYWxsZXJBZGRyZXNzBAAAABlyZWdpc3RlcmVkQW1vdW50NFdpdGhkcmF3CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAGHBvb2xNYWtlckxvY2tlZEFtb3VudEtleQAAAAAAAAAAAAQAAAAYcG9vbE1ha2VyVW5sb2NrSGVpZ2h0S2V5CQEAAAAbZ2V0UG9vbE1ha2VyVW5sb2NrSGVpZ2h0S2V5AAAAAgUAAAAPYXNzZXRBZGRyZXNzU3RyBQAAAA1jYWxsZXJBZGRyZXNzBAAAAA53aXRoZHJhd0hlaWdodAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABhwb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkAAAAAAAAAAAAEAAAAGHBvb2xUb3RhbExvY2tlZEFtb3VudEtleQkBAAAAG2dldFBvb2xUb3RhbExvY2tlZEFtb3VudEtleQAAAAEFAAAAD2Fzc2V0QWRkcmVzc1N0cgQAAAAPcG9vbFRvdGFsTG9ja2VkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAGHBvb2xUb3RhbExvY2tlZEFtb3VudEtleQAAAAAAAAAAAAQAAAAccG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleQkBAAAAH2dldFBvb2xNYWtlckxpcXVpZGl0eVJlcXVlc3RLZXkAAAADBQAAAA9hc3NldEFkZHJlc3NTdHIFAAAADWNhbGxlckFkZHJlc3MFAAAADndpdGhkcmF3SGVpZ2h0AwkAAAAAAAACCQEAAAAMZ2V0Qm9vbEJ5S2V5AAAAAQUAAAAQaXNJbml0aWFsaXplZEtleQcJAAACAAAAAQIAAAAaQ29udHJhY3QgaXMgbm90IHlldCByZWFkeS4DCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEGgAAAAIFAAAADGFzc2V0QWRkcmVzcwUAAAAccG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleQkAAAIAAAABAgAAADNOZWVkIHRvIHRyYW5zZmVyIGxpcXVpZGl0eSBmcm9tIGFzc2V0IGFjY291bnQgZmlyc3QDCQAAZwAAAAIAAAAAAAAAAAAFAAAAGXJlZ2lzdGVyZWRBbW91bnQ0V2l0aGRyYXcJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAIkNhbm5vdCBmaW5kIHBvb2wgbWFrZXIgYnkgYWRkcmVzcyAFAAAADWNhbGxlckFkZHJlc3MCAAAAFSBvciBubyBsb2NrZWQgYW1vdW50LgMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAA53aXRoZHJhd0hlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAMUGxlYXNlIHdhaXQgCQABpAAAAAEFAAAADndpdGhkcmF3SGVpZ2h0AgAAABEgYmVmb3JlIHdpdGhkcmF3LgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAYcG9vbE1ha2VyTG9ja2VkQW1vdW50S2V5AAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABhwb29sVG90YWxMb2NrZWRBbW91bnRLZXkJAABlAAAAAgUAAAAPcG9vbFRvdGFsTG9ja2VkBQAAABlyZWdpc3RlcmVkQW1vdW50NFdpdGhkcmF3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABhwb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkAAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAANY2FsbGVyQWRkcmVzcwUAAAAZcmVnaXN0ZXJlZEFtb3VudDRXaXRoZHJhdwUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwAAAAASkMubw==", "chainId": 84, "height": 1248874, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9MqbrqgMMp8aMDgXAZuv5wYQrBUcLtSd7CJFELKmgLHw Next: DTGk32BBivkGKQFqVUq6XgxmZeQdfNtG6Bp3RviDtDzo Diff:
OldNewDifferences
467467 let poolMakerActualAmount = redeemTuple._5
468468 let withdrawHeight = redeemTuple._6
469469 let poolMakerLockedAmount = redeemTuple._7
470- throw(((((((("{" + "allowedAmountToRedeem: ") + toString(allowedAmountToRedeem)) + ", assetCode: ") + assetCode) + ", poolMaker: ") + poolMakerAddress) + "}"))
470+ let traceData = redeemTuple._8
471+ throw(((((((((("{" + "allowedAmountToRedeem: ") + toString(allowedAmountToRedeem)) + ", assetCode: ") + assetCode) + ", poolMaker: ") + poolMakerAddress) + ", trace: ") + traceData) + "}"))
471472 }
472473
473474
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func convertJsonArrayToList (jsonArray,splitSymbol) = split(jsonArray, splitSymbol)
55
66
77 func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "")
88
99
1010 func getBoolByKey (key) = valueOrElse(getBoolean(this, key), false)
1111
1212
1313 let SEP = "__"
1414
1515 let keyAssetCode = 1
1616
1717 let keyAssetId = 2
1818
1919 let keyAssetStatus = 3
2020
2121 let keyAssetPriceDecimals = 4
2222
2323 let keyAssetBakingAsset = 5
2424
2525 let keyOvercollateralPercentage = 6
2626
2727 let keyMinPool = 7
2828
2929 let keyPriceOracleAddress = 8
3030
3131 let keyMinBuyPayment = 9
3232
3333 let keyMinSellPayment = 10
3434
3535 let keyBuyLockInterval = 11
3636
3737 let keySellLockInterval = 12
3838
3939 let keyBuyFee = 13
4040
4141 let keySellFee = 14
4242
4343 let keyPoolRedemptionTimeout = 15
4444
4545 let keyWeekendsPriceChangeCoefficient = 16
4646
4747 let adminPublicKey = "G1Ebu5AMHaTJFEbZNkZQcJFUQ9KfiYUwupyLG857DcFr"
4848
4949 let neutrinoContractAddressKey = "%s%s__commonConfig__neutrinoContractAddress"
5050
5151 let neutrinoStakingAddressKey = "%s%s__commonConfig__neutrinoStakingAddress"
5252
5353 let minimunPoolFundingAmountKey = "%s%s__commonConfig__minimumPoolFundingAmount"
5454
5555 let isInitializedKey = "%s%s__commonConfig__initialized"
5656
5757 let currentAssetIndexKey = "%s%s__commonConfig__predefinedAssetsActiveIndex"
5858
5959 let assetsAddressListKey = "%s%s__commonConfig__predefinedAssetsList"
6060
6161 let debtTokenIdKey = "%s%s__commonConfig__debtAssetId"
6262
6363 let debtTokenEtalonBalanceKey = "%s%s__commonConfig__debtAssetEtalonBalance"
6464
6565 let defoStakingAddressKey = "%s%s__commonConfig__defoStakingAddress"
6666
6767 let defoStakingPacemakerPubKey = "%s%s__commonConfig__defoStakingPacemakerPub"
6868
6969 let minPoolInvestAmountKey = "%s%s__commonConfig__minPoolInvestAmount"
7070
7171 let neutrinoAssetIdKey = "neutrino_asset_id"
7272
7373 let nsbtAssetIdKey = "bond_asset_id"
7474
7575 let neutrinoRpdKey = "rpd_contract"
7676
7777 let defoAssetIdKey = "%s__defoAssetId"
7878
7979 let setAssetScriptTxIdKey = "%s__assetScriptTxId"
8080
8181 func getAssetConfigKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__config")
8282
8383
8484 func getAssetPriceKey (assetCode) = ("%s%s__price__" + assetCode)
8585
8686
8787 func getAssetInitHeightKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__initHeight")
8888
8989
9090 func getAssetActivateHeightKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__activateHeight")
9191
9292
9393 func getAssetCurrrentPoolAmountKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__currentPool")
9494
9595
9696 func getAssetMaxPoolAmountKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__maxPool")
9797
9898
9999 func getAssetMetaKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__meta")
100100
101101
102102 func getAssetPoolMakersKey (assetAddress) = (("%s%s%s__defoAsset__" + assetAddress) + "__poolMakers")
103103
104104
105105 func getAssetAddressByCodeKey (assetCode) = (("%s%s%s__defoAsset__" + assetCode) + "__addressByAssetCode")
106106
107107
108108 func getAssetAddressByAssetIdKey (assetId) = (("%s%s%s__defoAsset__" + assetId) + "__addressByAssetId")
109109
110110
111111 func getPoolMakerParticipationAmountKey (assetAddress,poolMakerAddress) = makeString(["%s%s%s%s__pool", assetAddress, poolMakerAddress, "amount"], SEP)
112112
113113
114114 func getPoolMakerParticipationMaxAmountKey (assetAddress,poolMakerAddress) = makeString(["%s%s%s%s__pool", assetAddress, poolMakerAddress, "maxAmount"], SEP)
115115
116116
117117 func getPoolMakerLockedAmountKey (assetAddress,poolMakerAddress) = makeString(["%s%s%s%s__pool", assetAddress, poolMakerAddress, "lockedAmount"], SEP)
118118
119119
120120 func getPoolMakerUnlockHeightKey (assetAddress,poolMakerAddress) = makeString(["%s%s%s%s__pool", assetAddress, poolMakerAddress, "unlockHeight"], SEP)
121121
122122
123123 func getPoolMakerLiquidityRequestKey (assetAddress,poolMakerAddress,h) = makeString(["%s%s%s%d%s__pool", assetAddress, poolMakerAddress, toString(h), "liquidityRequest"], SEP)
124124
125125
126126 func getPoolTotalLockedAmountKey (assetAddress) = makeString(["%s%s%s__pool", assetAddress, "totalLockedAmount"], SEP)
127127
128128
129129 func getAssetConfigArray (assetAddress) = convertJsonArrayToList(valueOrErrorMessage(getStringByAddressAndKey(this, getAssetConfigKey(assetAddress)), (("No DEFO Asset " + assetAddress) + "config present")), "__")
130130
131131
132132 let multiplicator = 1000000
133133
134134 let neutrinoContract = addressFromStringValue(valueOrErrorMessage(getString(this, neutrinoContractAddressKey), "No neutrino contract specified."))
135135
136136 let neutrinoAssetIdStr = valueOrErrorMessage(getString(neutrinoContract, neutrinoAssetIdKey), "No USDN asset id found.")
137137
138138 let neutrinoAssetId = fromBase58String(neutrinoAssetIdStr)
139139
140140 let nsbtAssetId = fromBase58String(valueOrErrorMessage(getString(neutrinoContract, nsbtAssetIdKey), "No NSBT asset id found"))
141141
142142 let minimumPoolFunding = valueOrErrorMessage(getInteger(this, minimunPoolFundingAmountKey), "Minimum pool funding amount is not specified.")
143143
144144 let minPoolInvestAmount = valueOrElse(getInteger(this, minPoolInvestAmountKey), (10 * multiplicator))
145145
146146 let ASSEtPROPOSED = "PROPOSED"
147147
148148 let ASSEtREADY = "READY"
149149
150150 let ASSEtISSUED = "ISSUED"
151151
152152 let assetStatus = $Tuple3(ASSEtPROPOSED, ASSEtREADY, ASSEtISSUED)
153153
154154 let predefinedAssetContracts = valueOrErrorMessage(getString(this, assetsAddressListKey), "No pool of predeployed asset contracts found.")
155155
156156 let predefinedAssetsList = convertJsonArrayToList(predefinedAssetContracts, ",")
157157
158158 let currentAssetIndex = valueOrElse(getInteger(this, currentAssetIndexKey), 0)
159159
160160 let debtToken = fromBase58String(valueOrErrorMessage(getString(this, debtTokenIdKey), "No debt token found"))
161161
162162 let debtTokenReissueAmount = valueOrElse(getInteger(this, debtTokenEtalonBalanceKey), 0)
163163
164164 let neutrinoRpdContract = addressFromStringValue(getStringValue(neutrinoContract, neutrinoRpdKey))
165165
166166 func getNeutrinoRpdBalance (userAddress) = {
167167 let userNeutrinoRpdBalance = makeString(["rpd_balance", neutrinoAssetIdStr, userAddress], "_")
168168 valueOrElse(getInteger(neutrinoRpdContract, userNeutrinoRpdBalance), 0)
169169 }
170170
171171
172172 func getAssetAddressByCode (assetSymbol) = valueOrElse(getString(this, getAssetAddressByCodeKey(assetSymbol)), "")
173173
174174
175175 func getAssetAddressByCodeOrFail (assetSymbol) = valueOrErrorMessage(getString(this, getAssetAddressByCodeKey(assetSymbol)), (("Cannot find asset address by " + assetSymbol) + " code"))
176176
177177
178178 func getAssetCode (assetConfig) = assetConfig[keyAssetCode]
179179
180180
181181 func getAssetID (assetConfig) = assetConfig[keyAssetId]
182182
183183
184184 func getAssetStatus (assetConfig) = assetConfig[keyAssetStatus]
185185
186186
187187 func getAssetPriceDecimals (assetConfig) = parseIntValue(assetConfig[keyAssetPriceDecimals])
188188
189189
190190 func getAssetBakingAssetId (assetConfig) = assetConfig[keyAssetBakingAsset]
191191
192192
193193 func getAssetOverCollateralPercent (assetConfig) = parseIntValue(assetConfig[keyOvercollateralPercentage])
194194
195195
196196 func getAssetMinRequiredPoolAmount (assetConfig) = parseIntValue(assetConfig[keyMinPool])
197197
198198
199199 func getAssetPriceOracleAddress (assetConfig) = assetConfig[keyPriceOracleAddress]
200200
201201
202202 func getMinBuyPaymentPerAsset (assetConfig) = parseIntValue(assetConfig[keyMinBuyPayment])
203203
204204
205205 func getMinSellPaymentPerAsset (assetConfig) = parseIntValue(assetConfig[keyMinSellPayment])
206206
207207
208208 func getBuyLockIntervalPerAsset (assetConfig) = parseIntValue(assetConfig[keyBuyLockInterval])
209209
210210
211211 func getSellLockIntervalPerAsset (assetConfig) = parseIntValue(assetConfig[keySellLockInterval])
212212
213213
214214 func getBuyFeePerAsset (assetConfig) = parseIntValue(assetConfig[keyBuyFee])
215215
216216
217217 func getSellFeePerAsset (assetConfig) = parseIntValue(assetConfig[keySellFee])
218218
219219
220220 func getRedemptionTimeoutBlocks (assetConfig) = parseIntValue(assetConfig[keyPoolRedemptionTimeout])
221221
222222
223223 func getWeekendsPriceChangeCoefficient (assetConfig) = parseIntValue(assetConfig[keyWeekendsPriceChangeCoefficient])
224224
225225
226226 func getAssetPoolMakers (assetAddress) = valueOrElse(getString(this, getAssetPoolMakersKey(assetAddress)), "")
227227
228228
229229 func getAssetInitHeight (assetAddress) = valueOrElse(getInteger(this, getAssetInitHeightKey(assetAddress)), 0)
230230
231231
232232 func getAssetActivateHeight (assetAddress) = valueOrElse(getInteger(this, getAssetActivateHeightKey(assetAddress)), 0)
233233
234234
235235 func getAssetCurrentPoolAmount (assetAddress) = valueOrElse(getInteger(this, getAssetCurrrentPoolAmountKey(assetAddress)), 0)
236236
237237
238238 func getAssetMaxPoolAmount (assetAddress) = valueOrElse(getInteger(this, getAssetMaxPoolAmountKey(assetAddress)), 0)
239239
240240
241241 func getAssetMeta (assetAddress) = valueOrElse(getString(this, getAssetMetaKey(assetAddress)), "")
242242
243243
244244 func getPoolMakerParticipationAmount (assetAddress,poolMakerAddress) = valueOrElse(getInteger(this, getPoolMakerParticipationAmountKey(assetAddress, poolMakerAddress)), 0)
245245
246246
247247 func getPoolMakerParticipationMaxAmount (assetAddress,poolMakerAddress) = valueOrElse(getInteger(this, getPoolMakerParticipationMaxAmountKey(assetAddress, poolMakerAddress)), 0)
248248
249249
250250 func getPoolMakerLockedAmount (assetAddress,poolMakerAddress) = valueOrElse(getInteger(this, getPoolMakerLockedAmountKey(assetAddress, poolMakerAddress)), 0)
251251
252252
253253 func getPoolMakerUnlockHeight (assetAddress,poolMakerAddress) = valueOrElse(getInteger(this, getPoolMakerUnlockHeightKey(assetAddress, poolMakerAddress)), 0)
254254
255255
256256 func getAssetPrice (priceOracleAddress,assetCode) = valueOrErrorMessage(getInteger(priceOracleAddress, getAssetPriceKey(assetCode)), "No Asset price found")
257257
258258
259259 func getPoolTotalLockedAmount (assetAddress) = valueOrElse(getInteger(this, getPoolTotalLockedAmountKey(assetAddress)), 0)
260260
261261
262262 func composeAssetConfigurationString (assetCode,assetId,assetStatus,priceDecimals,backingAssetId,overCollateralPercent,minPool,priceOracleAddress,minBuyPayment,minSellPayment,buyLockInterval,sellLockInterval,buyFee,sellFee,poolRedemptionTimeout,weekendsPriceChangeCoefficient) = makeString(["%s%s%s%d%s%d%d%s%d%d%d%d%d%d%d", assetCode, assetId, assetStatus, toString(priceDecimals), backingAssetId, toString(overCollateralPercent), toString(minPool), priceOracleAddress, toString(minBuyPayment), toString(minSellPayment), toString(buyLockInterval), toString(sellLockInterval), toString(buyFee), toString(sellFee), toString(poolRedemptionTimeout), toString(weekendsPriceChangeCoefficient)], "__")
263263
264264
265265 func updateAssetCfgStatus (newStatus,assetConfigurationList) = {
266266 let aCode = getAssetCode(assetConfigurationList)
267267 let aID = getAssetID(assetConfigurationList)
268268 let aPriceDecimals = getAssetPriceDecimals(assetConfigurationList)
269269 let aBakingAssetId = getAssetBakingAssetId(assetConfigurationList)
270270 let aOverCollateralPercent = getAssetOverCollateralPercent(assetConfigurationList)
271271 let aMinRequiredPool = getAssetMinRequiredPoolAmount(assetConfigurationList)
272272 let aPriceOracleAddress = getAssetPriceOracleAddress(assetConfigurationList)
273273 let aMinBuyPayment = getMinBuyPaymentPerAsset(assetConfigurationList)
274274 let aMinSellPayment = getMinSellPaymentPerAsset(assetConfigurationList)
275275 let aBuyLockInterval = getBuyLockIntervalPerAsset(assetConfigurationList)
276276 let aSellLockInterval = getSellLockIntervalPerAsset(assetConfigurationList)
277277 let aBuyFee = getBuyFeePerAsset(assetConfigurationList)
278278 let aSellFee = getSellFeePerAsset(assetConfigurationList)
279279 let aRedemptionTimeoutBlocks = getRedemptionTimeoutBlocks(assetConfigurationList)
280280 let weekendsPriceChangeCoefficient = getWeekendsPriceChangeCoefficient(assetConfigurationList)
281281 composeAssetConfigurationString(aCode, aID, newStatus, aPriceDecimals, aBakingAssetId, aOverCollateralPercent, aMinRequiredPool, aPriceOracleAddress, aMinBuyPayment, aMinSellPayment, aBuyLockInterval, aSellLockInterval, aBuyFee, aSellFee, aRedemptionTimeoutBlocks, weekendsPriceChangeCoefficient)
282282 }
283283
284284
285285 func calcAllowedAmountToRedeem (assetCode,poolMakerAddress) = {
286286 let assetAddressStr = getAssetAddressByCodeOrFail(assetCode)
287287 let assetAddress = addressFromStringValue(assetAddressStr)
288288 let assetConfigurationList = getAssetConfigArray(assetAddressStr)
289289 let assetIdStr = getAssetID(assetConfigurationList)
290290 let assetId = fromBase58String(assetIdStr)
291291 let poolActualSize = valueOrElse(getInteger(this, getAssetCurrrentPoolAmountKey(assetAddressStr)), 0)
292292 let poolMaxSize = valueOrElse(getInteger(this, getAssetMaxPoolAmountKey(assetAddressStr)), 0)
293293 let poolTotalLockedAmountKey = getPoolTotalLockedAmountKey(assetAddressStr)
294294 let poolTotalLocked = valueOrElse(getInteger(this, poolTotalLockedAmountKey), 0)
295295 let assetUsdnStakedAmount = getNeutrinoRpdBalance(assetAddressStr)
296296 let assetUsdnBalanceAmount = assetBalance(assetAddress, neutrinoAssetId)
297297 let assetTotalUsdnAmount = ((assetUsdnStakedAmount + assetUsdnBalanceAmount) - poolTotalLocked)
298298 let ucollateral = (assetTotalUsdnAmount - poolActualSize)
299299 let defoAssetBalance = assetBalance(assetAddress, assetId)
300300 let assetEmissionDirty = valueOrErrorMessage(assetInfo(assetId), ("Cannot find asset by id " + assetIdStr)).quantity
301301 let assetEmission = (assetEmissionDirty - defoAssetBalance)
302302 let priceOracleAddress = addressFromStringValue(getAssetPriceOracleAddress(assetConfigurationList))
303303 let currentPrice = getAssetPrice(priceOracleAddress, assetCode)
304304 let priceWithOvercollateralRate = (((multiplicator + getAssetOverCollateralPercent(assetConfigurationList)) * currentPrice) / multiplicator)
305305 let usdnNeededToCoverEmission = (priceWithOvercollateralRate * assetEmission)
306306 let poolMakerMaxAmount = getPoolMakerParticipationMaxAmount(assetAddressStr, poolMakerAddress)
307307 let poolMakerParticipationAmountKey = getPoolMakerParticipationAmountKey(assetAddressStr, poolMakerAddress)
308308 let poolMakerActualAmount = valueOrElse(getInteger(this, poolMakerParticipationAmountKey), 0)
309309 let poolMakerLockedAmount = getPoolMakerLockedAmount(assetAddressStr, poolMakerAddress)
310310 let surplus = (ucollateral - usdnNeededToCoverEmission)
311311 let percentViaActual = fraction(poolMakerActualAmount, multiplicator, poolActualSize)
312312 let percentViaMax = fraction(poolMakerMaxAmount, multiplicator, poolMaxSize)
313313 let frozenPart = if ((surplus >= 0))
314314 then 0
315315 else max([percentViaActual, percentViaMax])
316316 let allowedAmountToRedeem = fraction((multiplicator - frozenPart), poolMakerActualAmount, multiplicator)
317317 let withdrawHeight = (height + getRedemptionTimeoutBlocks(assetConfigurationList))
318318 $Tuple8(assetAddressStr, allowedAmountToRedeem, poolTotalLocked, poolActualSize, poolMakerActualAmount, withdrawHeight, poolMakerLockedAmount, makeString([assetAddressStr, assetIdStr, poolMakerAddress, toString(assetUsdnStakedAmount), toString(assetUsdnBalanceAmount), toString(assetTotalUsdnAmount), toString(poolActualSize), toString(poolMaxSize), toString(ucollateral), toString(assetEmission), toString(currentPrice), toString(priceWithOvercollateralRate), toString(poolMakerMaxAmount), toString(poolMakerActualAmount), toString(poolMakerLockedAmount), toString(surplus), toString(percentViaActual), toString(percentViaMax), toString(frozenPart), toString(allowedAmountToRedeem)], SEP))
319319 }
320320
321321
322322 @Callable(i)
323323 func init (neutrinoContractAddress,neutrinoStakingAddress,minimunPoolFundingAmount,predefinedAssetList,currentAssetIndex,debtEthalonBalance,defoStakingAddress,defoStakingPacemakerPub) = if ((toBase58String(i.callerPublicKey) != adminPublicKey))
324324 then throw("Only Admin can perform contract operation.")
325325 else if ((getBoolByKey(isInitializedKey) == true))
326326 then throw("Contract was already initialized.")
327327 else {
328328 let issueDebt = Issue("DEFO_DEBT", "DEFO Debt Token.", 1, 6, true)
329329 let debtTokenId = calculateAssetId(issueDebt)
330330 [StringEntry(neutrinoContractAddressKey, neutrinoContractAddress), StringEntry(neutrinoStakingAddressKey, neutrinoStakingAddress), IntegerEntry(minimunPoolFundingAmountKey, minimunPoolFundingAmount), StringEntry(assetsAddressListKey, predefinedAssetList), IntegerEntry(currentAssetIndexKey, currentAssetIndex), IntegerEntry(debtTokenEtalonBalanceKey, debtEthalonBalance), StringEntry(debtTokenIdKey, toBase58String(debtTokenId)), StringEntry(defoStakingAddressKey, defoStakingAddress), StringEntry(defoStakingPacemakerPubKey, defoStakingPacemakerPub), BooleanEntry(isInitializedKey, true), issueDebt, Burn(debtTokenId, 1)]
331331 }
332332
333333
334334
335335 @Callable(i)
336336 func proposeAsset (assetCode,meta,minPool,priceOracleAddress,overCollateralPercent,backingAssetId,priceDecimals,minBuyPayment,minSellPayment,buyLockInterval,sellLockInterval,buyFee,sellFee,poolRedemptionTimeout,weekendsPriceChangeCoefficient) = if ((toBase58String(i.callerPublicKey) != adminPublicKey))
337337 then throw("Only Admin can perform contract operation.")
338338 else if ((getBoolByKey(isInitializedKey) == false))
339339 then throw("Contract is not yet ready.")
340340 else if ((fromBase58String(backingAssetId) != neutrinoAssetId))
341341 then throw("Baking asset id could be USDN only.")
342342 else if ((getAssetAddressByCode(assetCode) != ""))
343343 then throw((("Asset with passed code " + assetCode) + " has already been proposed."))
344344 else if ((minimumPoolFunding > minPool))
345345 then throw(("Minimum pool amount should be greater or equals to " + toString(minimumPoolFunding)))
346346 else if (if (if (if (if (if (if (if ((0 > overCollateralPercent))
347347 then true
348348 else (0 > priceDecimals))
349349 then true
350350 else (0 > minBuyPayment))
351351 then true
352352 else (0 > minSellPayment))
353353 then true
354354 else (0 > buyLockInterval))
355355 then true
356356 else (0 > sellLockInterval))
357357 then true
358358 else (0 > buyFee))
359359 then true
360360 else (0 > sellFee))
361361 then throw("One of the passed parameters is invalid.")
362362 else {
363363 let priceOracleAddressValid = valueOrErrorMessage(addressFromStringValue(priceOracleAddress), "Passed Price Oracle Address is not valid.")
364364 let assetAddress = predefinedAssetsList[currentAssetIndex]
365365 let defoAssetId = valueOrErrorMessage(getString(valueOrErrorMessage(addressFromString(assetAddress), ""), defoAssetIdKey), "No defo asset ID found.")
366366 [StringEntry(getAssetConfigKey(assetAddress), composeAssetConfigurationString(assetCode, defoAssetId, assetStatus._1, priceDecimals, backingAssetId, overCollateralPercent, minPool, priceOracleAddress, minBuyPayment, minSellPayment, buyLockInterval, sellLockInterval, buyFee, sellFee, poolRedemptionTimeout, weekendsPriceChangeCoefficient)), StringEntry(getAssetAddressByCodeKey(assetCode), assetAddress), StringEntry(getAssetMetaKey(assetAddress), meta), IntegerEntry(getAssetInitHeightKey(assetAddress), height), IntegerEntry(currentAssetIndexKey, (currentAssetIndex + 1)), StringEntry(getAssetAddressByAssetIdKey(defoAssetId), assetAddress)]
367367 }
368368
369369
370370
371371 @Callable(i)
372372 func fundLiquidityPool (assetCode) = {
373373 let assetAddressStr = getAssetAddressByCodeOrFail(assetCode)
374374 let assetConfigurationList = getAssetConfigArray(assetAddressStr)
375375 let attachedPayment = value(i.payments[0])
376376 let poolMakerAddress = toString(i.caller)
377377 if ((getBoolByKey(isInitializedKey) == false))
378378 then throw("Contract is not yet ready.")
379379 else if ((attachedPayment.assetId != neutrinoAssetId))
380380 then throw("Liquidity pool could be funded with USDN only.")
381381 else if ((minPoolInvestAmount > attachedPayment.amount))
382382 then throw(("Attached payment amount is less tha min allowed: " + toString(minPoolInvestAmount)))
383383 else {
384384 let newCurrentPoolAmount = (attachedPayment.amount + getAssetCurrentPoolAmount(assetAddressStr))
385385 let maxPoolAmount = getAssetMaxPoolAmount(assetAddressStr)
386386 let currentPoolMakerBalance = getPoolMakerParticipationAmount(assetAddressStr, poolMakerAddress)
387387 let maxPoolMakerBalance = getPoolMakerParticipationMaxAmount(assetAddressStr, poolMakerAddress)
388388 let currentAssetStatus = getAssetStatus(assetConfigurationList)
389389 let newAssetStatus = if (if ((currentAssetStatus == ASSEtPROPOSED))
390390 then (newCurrentPoolAmount >= getAssetMinRequiredPoolAmount(assetConfigurationList))
391391 else false)
392392 then ASSEtREADY
393393 else currentAssetStatus
394394 let newPoolMakerBalance = (currentPoolMakerBalance + attachedPayment.amount)
395395 let immediateTransferIfIssued = if ((currentAssetStatus == ASSEtISSUED))
396396 then [ScriptTransfer(addressFromStringValue(assetAddressStr), attachedPayment.amount, neutrinoAssetId)]
397397 else nil
398398 ([IntegerEntry(getPoolMakerParticipationAmountKey(assetAddressStr, poolMakerAddress), newPoolMakerBalance), IntegerEntry(getPoolMakerParticipationMaxAmountKey(assetAddressStr, poolMakerAddress), max([newPoolMakerBalance, maxPoolMakerBalance])), IntegerEntry(getAssetCurrrentPoolAmountKey(assetAddressStr), newCurrentPoolAmount), IntegerEntry(getAssetMaxPoolAmountKey(assetAddressStr), max([maxPoolAmount, newCurrentPoolAmount])), StringEntry(getAssetConfigKey(assetAddressStr), updateAssetCfgStatus(newAssetStatus, assetConfigurationList))] ++ immediateTransferIfIssued)
399399 }
400400 }
401401
402402
403403
404404 @Callable(i)
405405 func activateAsset (assetCode) = {
406406 let assetAddress = getAssetAddressByCode(assetCode)
407407 let assetConfigurationList = getAssetConfigArray(assetAddress)
408408 let assetCurrentPoolAmount = getAssetCurrentPoolAmount(assetAddress)
409409 let aCurrentStatus = getAssetStatus(assetConfigurationList)
410410 if ((toBase58String(i.callerPublicKey) != adminPublicKey))
411411 then throw("Only Admin can perform contract operation.")
412412 else if ((getBoolByKey(isInitializedKey) == false))
413413 then throw("Contract is not yet ready.")
414414 else if ((aCurrentStatus != assetStatus._2))
415415 then throw((("Asset is not in READY status. Current status is " + aCurrentStatus) + "."))
416416 else if ((assetAddress == ""))
417417 then throw((("Cannot find asset " + assetCode) + "."))
418418 else if ((minimumPoolFunding > assetCurrentPoolAmount))
419419 then throw((((("Cannot issue asset as liquidity pool amount (" + toString(assetCurrentPoolAmount)) + ") is less than required (") + toString(minimumPoolFunding)) + ")"))
420420 else {
421421 let issueDebt = Reissue(debtToken, debtTokenReissueAmount, true)
422422 [IntegerEntry(getAssetActivateHeightKey(assetAddress), height), StringEntry(getAssetConfigKey(assetAddress), updateAssetCfgStatus(assetStatus._3, assetConfigurationList)), issueDebt, ScriptTransfer(addressFromStringValue(assetAddress), assetCurrentPoolAmount, neutrinoAssetId), ScriptTransfer(addressFromStringValue(assetAddress), debtTokenReissueAmount, debtToken)]
423423 }
424424 }
425425
426426
427427
428428 @Callable(i)
429429 func redeemFromPool (assetCode,amount) = {
430430 let callerAddress = toString(i.caller)
431431 let redeemTuple = calcAllowedAmountToRedeem(assetCode, callerAddress)
432432 let assetAddressStr = redeemTuple._1
433433 let allowedAmountToRedeem = redeemTuple._2
434434 let poolTotalLocked = redeemTuple._3
435435 let poolActualSize = redeemTuple._4
436436 let poolMakerActualAmount = redeemTuple._5
437437 let withdrawHeight = redeemTuple._6
438438 let poolMakerLockedAmount = redeemTuple._7
439439 let traceData = redeemTuple._8
440440 let poolMakerLiquidityRequestKey = getPoolMakerLiquidityRequestKey(assetAddressStr, callerAddress, withdrawHeight)
441441 if ((getBoolByKey(isInitializedKey) == false))
442442 then throw("Contract is not yet ready.")
443443 else if (if (if ((0 > amount))
444444 then true
445445 else (0 >= poolMakerActualAmount))
446446 then true
447447 else (amount > allowedAmountToRedeem))
448448 then throw((("Cannot find pool maker by address " + callerAddress) + " or amount passed is not correct."))
449449 else if (((1 * multiplicator) > amount))
450450 then throw("Redeem amount is less then min allowed")
451451 else if ((poolMakerLockedAmount > 0))
452452 then throw("Pool maker already has initiated redemption that is not withdrawn yet.")
453453 else if (isDefined(getInteger(this, poolMakerLiquidityRequestKey)))
454454 then throw((("Pool maker has already initiated redemption for " + toString(height)) + " height"))
455455 else [IntegerEntry(getPoolTotalLockedAmountKey(assetAddressStr), (poolTotalLocked + amount)), IntegerEntry(getAssetCurrrentPoolAmountKey(assetAddressStr), (poolActualSize - amount)), IntegerEntry(getPoolMakerParticipationAmountKey(assetAddressStr, callerAddress), (poolMakerActualAmount - amount)), IntegerEntry(poolMakerLiquidityRequestKey, amount), IntegerEntry(getPoolMakerLockedAmountKey(assetAddressStr, callerAddress), amount), IntegerEntry(getPoolMakerUnlockHeightKey(assetAddressStr, callerAddress), withdrawHeight), StringEntry("%s%s_trace_redeemFromPool", traceData)]
456456 }
457457
458458
459459
460460 @Callable(i)
461461 func getMaxAllowedAmountToRedeem (assetCode,poolMakerAddress) = {
462462 let redeemTuple = calcAllowedAmountToRedeem(assetCode, poolMakerAddress)
463463 let assetAddressStr = redeemTuple._1
464464 let allowedAmountToRedeem = redeemTuple._2
465465 let poolTotalLocked = redeemTuple._3
466466 let poolActualSize = redeemTuple._4
467467 let poolMakerActualAmount = redeemTuple._5
468468 let withdrawHeight = redeemTuple._6
469469 let poolMakerLockedAmount = redeemTuple._7
470- throw(((((((("{" + "allowedAmountToRedeem: ") + toString(allowedAmountToRedeem)) + ", assetCode: ") + assetCode) + ", poolMaker: ") + poolMakerAddress) + "}"))
470+ let traceData = redeemTuple._8
471+ throw(((((((((("{" + "allowedAmountToRedeem: ") + toString(allowedAmountToRedeem)) + ", assetCode: ") + assetCode) + ", poolMaker: ") + poolMakerAddress) + ", trace: ") + traceData) + "}"))
471472 }
472473
473474
474475
475476 @Callable(i)
476477 func withdraw (assetCode) = {
477478 let callerAddress = toString(i.caller)
478479 let assetAddressStr = getAssetAddressByCodeOrFail(assetCode)
479480 let assetAddress = addressFromStringValue(assetAddressStr)
480481 let poolMakerLockedAmountKey = getPoolMakerLockedAmountKey(assetAddressStr, callerAddress)
481482 let registeredAmount4Withdraw = valueOrElse(getInteger(this, poolMakerLockedAmountKey), 0)
482483 let poolMakerUnlockHeightKey = getPoolMakerUnlockHeightKey(assetAddressStr, callerAddress)
483484 let withdrawHeight = valueOrElse(getInteger(this, poolMakerUnlockHeightKey), 0)
484485 let poolTotalLockedAmountKey = getPoolTotalLockedAmountKey(assetAddressStr)
485486 let poolTotalLocked = valueOrElse(getInteger(this, poolTotalLockedAmountKey), 0)
486487 let poolMakerLiquidityRequestKey = getPoolMakerLiquidityRequestKey(assetAddressStr, callerAddress, withdrawHeight)
487488 if ((getBoolByKey(isInitializedKey) == false))
488489 then throw("Contract is not yet ready.")
489490 else if (!(isDefined(getInteger(assetAddress, poolMakerLiquidityRequestKey))))
490491 then throw("Need to transfer liquidity from asset account first")
491492 else if ((0 >= registeredAmount4Withdraw))
492493 then throw((("Cannot find pool maker by address " + callerAddress) + " or no locked amount."))
493494 else if ((height > withdrawHeight))
494495 then throw((("Please wait " + toString(withdrawHeight)) + " before withdraw."))
495496 else [IntegerEntry(poolMakerLockedAmountKey, 0), IntegerEntry(poolTotalLockedAmountKey, (poolTotalLocked - registeredAmount4Withdraw)), IntegerEntry(poolMakerUnlockHeightKey, 0), ScriptTransfer(addressFromStringValue(callerAddress), registeredAmount4Withdraw, neutrinoAssetId)]
496497 }
497498
498499

github/deemru/w8io/3ef1775 
89.51 ms