tx · 8NwPqcnvrXqTuuaw29z42w48kYQ597SUMVeTaS2utiTf

3NBsEdgQXYpy59EHGqgwfE7jSAqFUzo7Ccp:  -0.05000000 Waves

2021.09.13 13:40 [1701168] smart account 3NBsEdgQXYpy59EHGqgwfE7jSAqFUzo7Ccp > SELF 0.00000000 Waves

{ "type": 13, "id": "8NwPqcnvrXqTuuaw29z42w48kYQ597SUMVeTaS2utiTf", "fee": 5000000, "feeAssetId": null, "timestamp": 1631529642028, "version": 2, "chainId": 84, "sender": "3NBsEdgQXYpy59EHGqgwfE7jSAqFUzo7Ccp", "senderPublicKey": "FwAzvdwqFM7zuHfsEbjdj845GeiE4UKnLGPLbqhS4U38", "proofs": [ "2Mwj53pypbbXhbevNbMtWnnsM4eaSGVY8NutqtR2eQysqbZCcCfK6QypGSKNYmLjdLXNnsV4PNyjahkQ39QVDmSt" ], "script": "base64:AAIFAAAAAAAAACkIAhIECgIBBBIAEgQKAggIEgASBQoDAQEIEgUKAwEBCBIFCgMIAQgSAAAAADgAAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAB0FkZHJlc3MAAAABAQAAABoBVGKj2upWaZ+pQUgYRThtGvhV6u4YNF7hRQAAAAAKbFBkZWNpbWFscwAAAAAAAAAACAAAAAAGc2NhbGU4AAAAAAAF9eEAAAAAAAdzY2FsZTE4CQABNgAAAAEADeC2s6dkAAAAAAAAA1NFUAIAAAACX18AAAAAClBvb2xBY3RpdmUAAAAAAAAAAAEAAAAAD1Bvb2xQdXREaXNhYmxlZAAAAAAAAAAAAgAAAAATUG9vbE1hdGNoZXJEaXNhYmxlZAAAAAAAAAAAAwAAAAAMUG9vbFNodXRkb3duAAAAAAAAAAAEAAAAAA5pZHhQb29sQWRkcmVzcwAAAAAAAAAAAQAAAAANaWR4UG9vbFN0YXR1cwAAAAAAAAAAAgAAAAAQaWR4UG9vbExQQXNzZXRJZAAAAAAAAAAAAwAAAAAQaWR4QW1vdW50QXNzZXRJZAAAAAAAAAAABAAAAAAPaWR4UHJpY2VBc3NldElkAAAAAAAAAAAFAAAAABZpZHhBbW91bnRBc3NldERlY2ltYWxzAAAAAAAAAAAGAAAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMAAAAAAAAAAAcAAAAAGGlkeEFtb3VudEFzc2V0SW50ZXJuYWxJZAAAAAAAAAAACAAAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQAAAAAAAAAAAkAAAAAEmlkeExQQXNzZXREZWNpbWFscwAAAAAAAAAACgAAAAATaWR4TWF0Y2hlclB1YmxpY0tleQAAAAAAAAAACwAAAAAVaWR4UG9vbEFtb3VudEFzc2V0QW10AAAAAAAAAAABAAAAABRpZHhQb29sUHJpY2VBc3NldEFtdAAAAAAAAAAAAgAAAAARaWR4UG9vbExQQXNzZXRBbXQAAAAAAAAAAAMAAAAAGWlkeEZhY3RvcnlTdGFraW5nQ29udHJhY3QAAAAAAAAAAAEAAAAAGGlkeEZhY3RvcnlCb29zdGluZ0NvbmZpZwAAAAAAAAAAAgEAAAAMa2V5UHJpY2VMYXN0AAAAAAIAAAARJXMlc19fcHJpY2VfX2xhc3QBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIAAAABaAAAAAl0aW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAABglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAARMAAAAAgkAAaQAAAABBQAAAAFoCQAETAAAAAIJAAGkAAAAAQUAAAAJdGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAAQa2V5UG9vbExpcXVpZGl0eQAAAAIAAAATaW50ZXJuYWxBbW91bnRBc3NldAAAABJpbnRlcm5hbFByaWNlQXNzZXQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIJWQlZCVzX18FAAAAE2ludGVybmFsQW1vdW50QXNzZXQCAAAAAl9fBQAAABJpbnRlcm5hbFByaWNlQXNzZXQCAAAACF9fbG9ja2VkAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwAAABNpbnRlcm5hbEFtb3VudEFzc2V0AAAAEmludGVybmFsUHJpY2VBc3NldAAAAAt1c2VyQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAKJWQlZCVzJXNfXwUAAAATaW50ZXJuYWxBbW91bnRBc3NldAIAAAACX18FAAAAEmludGVybmFsUHJpY2VBc3NldAIAAAACX18FAAAAC3VzZXJBZGRyZXNzAgAAAAhfX2xvY2tlZAEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgAAAAt1c2VyQWRkcmVzcwAAAAR0eElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAslcyVzJXNfX1BfXwUAAAALdXNlckFkZHJlc3MCAAAAAl9fBQAAAAR0eElkAQAAABJrZXlHZXRBY3Rpb25CeVVzZXIAAAACAAAAC3VzZXJBZGRyZXNzAAAABHR4SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACyVzJXMlc19fR19fBQAAAAt1c2VyQWRkcmVzcwIAAAACX18FAAAABHR4SWQBAAAADmtleUFtb3VudEFzc2V0AAAAAAIAAAAPJXNfX2Ftb3VudEFzc2V0AQAAAA1rZXlQcmljZUFzc2V0AAAAAAIAAAAOJXNfX3ByaWNlQXNzZXQBAAAAEGtleUZhY3RvcnlDb25maWcAAAAAAgAAABElc19fZmFjdG9yeUNvbmZpZwEAAAApa2V5TWFwcGluZ1Bvb2xDb250cmFjdEFkZHJlc3NUb1Bvb2xBc3NldHMAAAABAAAAE3Bvb2xDb250cmFjdEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAAAglcyVzJXNfXwUAAAATcG9vbENvbnRyYWN0QWRkcmVzcwIAAAAgX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MkxwQXNzZXQBAAAADWtleVBvb2xDb25maWcAAAACAAAAE2Ftb3VudEFzc2V0SW50ZXJuYWwAAAAScHJpY2VBc3NldEludGVybmFsCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACCVkJWQlc19fBQAAABNhbW91bnRBc3NldEludGVybmFsAgAAAAJfXwUAAAAScHJpY2VBc3NldEludGVybmFsAgAAAAhfX2NvbmZpZwEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEAAAAMYmFzZUFzc2V0U3RyCQABLAAAAAICAAAAKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAAAADGJhc2VBc3NldFN0cgEAAAATa2V5QWxsUG9vbHNTaHV0ZG93bgAAAAACAAAADCVzX19zaHV0ZG93bgEAAAANa2V5UG9vbFdlaWdodAAAAAEAAAAPY29udHJhY3RBZGRyZXNzCQABLAAAAAICAAAAEiVzJXNfX3Bvb2xXZWlnaHRfXwUAAAAPY29udHJhY3RBZGRyZXNzAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABNrZXlBbGxQb29sc1NodXRkb3duAAAAAAcBAAAADWdldFBvb2xDb25maWcAAAAABAAAAA9wb29sQW1vdW50QXNzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAAOa2V5QW1vdW50QXNzZXQAAAAAAgAAACBObyBjb25maWcgZm9yIGFtb3VudCBhc3NldCBmb3VuZAQAAAAOcG9vbFByaWNlQXNzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAANa2V5UHJpY2VBc3NldAAAAAACAAAAH05vIGNvbmZpZyBmb3IgcHJpY2UgYXNzZXQgZm91bmQEAAAAFnBvb2xQcmljZUFzc2V0SW50ZXJuYWwJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAB9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAAAAAQUAAAAOcG9vbFByaWNlQXNzZXQCAAAAKE5vIGNvbmZpZyBmb3IgaW50ZXJuYWwgcHJpY2UgYXNzZXQgZm91bmQEAAAAF3Bvb2xBbW91bnRBc3NldEludGVybmFsCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEFAAAAD3Bvb2xBbW91bnRBc3NldAIAAAApTm8gY29uZmlnIGZvciBpbnRlcm5hbCBhbW91bnQgYXNzZXQgZm91bmQJAAS1AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAADWtleVBvb2xDb25maWcAAAACCQABpAAAAAEFAAAAF3Bvb2xBbW91bnRBc3NldEludGVybmFsCQABpAAAAAEFAAAAFnBvb2xQcmljZUFzc2V0SW50ZXJuYWwCAAAAKE5vIGZhY3RvcnkgY29uZmlnIGZvdW5kIGZvciBwb29sIGFzc2V0cy4FAAAAA1NFUAEAAAAQZ2V0RmFjdG9yeUNvbmZpZwAAAAAJAAS1AAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAEGtleUZhY3RvcnlDb25maWcAAAAAAgAAABhObyBmYWN0b3J5IGNvbmZpZyBmb3VuZC4FAAAAA1NFUAEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEHQAAAAIFAAAABHRoaXMJAQAAABBrZXlQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAMJAQAAAAlpc0RlZmluZWQAAAABBQAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEtQAAAAIJAQAAAAV2YWx1ZQAAAAEFAAAAGWN1cnJlbnRQb29sTGlxdWlkaXR5VmFsdWUFAAAAA1NFUAkABEwAAAACAgAAAAAJAARMAAAAAgIAAAABMAkABEwAAAACAgAAAAEwCQAETAAAAAICAAAAATAFAAAAA25pbAEAAAAWZ2V0UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkAAAAC3VzZXJBZGRyZXNzBAAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEHQAAAAIFAAAABHRoaXMJAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAUAAAALdXNlckFkZHJlc3MDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAZY3VycmVudFBvb2xMaXF1aWRpdHlWYWx1ZQkABLUAAAACCQEAAAAFdmFsdWUAAAABBQAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlBQAAAANTRVAJAARMAAAAAgIAAAAACQAETAAAAAICAAAAATAJAARMAAAAAgIAAAABMAkABEwAAAACAgAAAAEwCQAETAAAAAICAAAAATAFAAAAA25pbAEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADAAAAEWFtb3VudEFzc2V0TG9ja2VkAAAAEHByaWNlQXNzZXRMb2NrZWQAAAANbHBUb2tlbkxvY2tlZAkABLkAAAACCQAETAAAAAICAAAABiVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEWFtb3VudEFzc2V0TG9ja2VkCQAETAAAAAIJAAGkAAAAAQUAAAAQcHJpY2VBc3NldExvY2tlZAkABEwAAAACCQABpAAAAAEFAAAADWxwVG9rZW5Mb2NrZWQFAAAAA25pbAUAAAADU0VQAQAAABdkYXRhUG9vbExpcXVpZGl0eUJ5VXNlcgAAAAQAAAARYW1vdW50QXNzZXRMb2NrZWQAAAAQcHJpY2VBc3NldExvY2tlZAAAAA1scFRva2VuTG9ja2VkAAAAC3VzZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAGJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAARYW1vdW50QXNzZXRMb2NrZWQJAARMAAAAAgkAAaQAAAABBQAAABBwcmljZUFzc2V0TG9ja2VkCQAETAAAAAIJAAGkAAAAAQUAAAANbHBUb2tlbkxvY2tlZAUAAAADbmlsBQAAAANTRVABAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACAAAABBpbkFtb3VudEFzc2V0QW10AAAAD2luUHJpY2VBc3NldEFtdAAAAAhvdXRMcEFtdAAAAAVwcmljZQAAAB1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlcgAAABVzbGlwcGFnZVRvbGVyYW5jZVJlYWwAAAAIdHhIZWlnaHQAAAALdHhUaW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAAA4lZCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEGluQW1vdW50QXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAA9pblByaWNlQXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAAhvdXRMcEFtdAkABEwAAAACCQABpAAAAAEFAAAABXByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAdc2xpcHBhZ2VUb2xlcmFuY2VQYXNzZWRCeVVzZXIJAARMAAAAAgkAAaQAAAABBQAAABVzbGlwcGFnZVRvbGVyYW5jZVJlYWwJAARMAAAAAgkAAaQAAAABBQAAAAh0eEhlaWdodAkABEwAAAACCQABpAAAAAEFAAAAC3R4VGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAARZGF0YUdldEFjdGlvbkluZm8AAAAGAAAAEW91dEFtb3VudEFzc2V0QW10AAAAEG91dFByaWNlQXNzZXRBbXQAAAAHaW5McEFtdAAAAAVwcmljZQAAAAh0eEhlaWdodAAAAAt0eFRpbWVzdGFtcAkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEW91dEFtb3VudEFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAQb3V0UHJpY2VBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAB2luTHBBbXQJAARMAAAAAgkAAaQAAAABBQAAAAVwcmljZQkABEwAAAACCQABpAAAAAEFAAAACHR4SGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAALdHhUaW1lc3RhbXAFAAAAA25pbAUAAAADU0VQAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMAAAAGYW1vdW50AAAAC3Jlc3VsdFNjYWxlAAAADGN1cnJlbnRTY2FsZQkAAGsAAAADBQAAAAZhbW91bnQFAAAAC3Jlc3VsdFNjYWxlBQAAAAxjdXJyZW50U2NhbGUBAAAADmNhbGN1bGF0ZVByaWNlAAAAAgAAABNwcmljZUFzc2V0TG9ja2VkQW10AAAAFWFtb3VudEFzc2V0bExvY2tlZEFtdAkAAGsAAAADBQAAABNwcmljZUFzc2V0TG9ja2VkQW10BQAAAAZzY2FsZTgFAAAAFWFtb3VudEFzc2V0bExvY2tlZEFtdAEAAAAVcHJpdmF0ZUNhbGN1bGF0ZVByaWNlAAAABAAAABJhbW91dEFzc2V0RGVjaW1hbHMAAAAScHJpY2VBc3NldERlY2ltYWxzAAAADmFtb3VudEFzc2V0QW10AAAADXByaWNlQXNzZXRBbXQEAAAAFGFtb3VudEFzc2V0QW10Q2FzdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAAA5hbW91bnRBc3NldEFtdAUAAAAGc2NhbGU4BQAAABJhbW91dEFzc2V0RGVjaW1hbHMEAAAAE3ByaWNlQXNzZXRBbXRDYXN0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAADXByaWNlQXNzZXRBbXQFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABNwcmljZUFzc2V0QW10Q2FzdGVkBQAAABRhbW91bnRBc3NldEFtdENhc3RlZAEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQAAAAdhc3NldElkAwkAAAAAAAACBQAAAAdhc3NldElkAgAAAAVXQVZFUwgJAAPvAAAAAQUAAAAEdGhpcwAAAAlhdmFpbGFibGUJAAPwAAAAAgUAAAAEdGhpcwkAAlkAAAABBQAAAAdhc3NldElkAQAAAA9jYWxjdWxhdGVQcmljZXMAAAADAAAADmFtb3VudEFzc2V0QW10AAAADXByaWNlQXNzZXRBbXQAAAAIbHBBbW91bnQEAAAAEnBvb2xDb25maWdEYXRhTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAABJhbW91dEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAAAlwb29sUHJpY2UJAQAAABVwcml2YXRlQ2FsY3VsYXRlUHJpY2UAAAAEBQAAABJhbW91dEFzc2V0RGVjaW1hbHMFAAAAEnByaWNlQXNzZXREZWNpbWFscwUAAAAOYW1vdW50QXNzZXRBbXQFAAAADXByaWNlQXNzZXRBbXQEAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAOYW1vdW50QXNzZXRBbXQFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAANcHJpY2VBc3NldEFtdAUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQFAAAACGxwQW1vdW50BAAAABNscFByaWNlSW5QcmljZUFzc2V0CQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAUAAAAIbHBBbW91bnQJAARMAAAAAgUAAAAJcG9vbFByaWNlCQAETAAAAAIFAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQAETAAAAAIFAAAAE2xwUHJpY2VJblByaWNlQXNzZXQFAAAAA25pbAEAAAAbcHJpdmF0ZUVzdGltYXRlR2V0T3BlcmF0aW9uAAAAAwAAABBwYXltZW50THBBc3NldElkAAAAD3BheW1lbnRMcEFtb3VudAAAAAt1c2VyQWRkcmVzcwQAAAAOcG9vbENvbmZpZ0xpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABBpZHhBbW91bnRBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABdpZHhQcmljZUFzc2V0SW50ZXJuYWxJZAQAAAASYW1vdXRBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAADWlkeFBvb2xTdGF0dXMEAAAAEXVzZXJMaXF1aWRpdHlMaXN0CQEAAAAWZ2V0UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQFAAAAC3VzZXJBZGRyZXNzBAAAAA11c2VyTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARdXNlckxpcXVpZGl0eUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARdXNlckxpcXVpZGl0eUxpc3QFAAAAFWlkeFBvb2xBbW91bnRBc3NldEFtdAQAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARdXNlckxpcXVpZGl0eUxpc3QFAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10BAAAABFwb29sTGlxdWlkaXR5TGlzdAkBAAAAEGdldFBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAAA1wb29sTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARcG9vbExpcXVpZGl0eUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARcG9vbExpcXVpZGl0eUxpc3QFAAAAFWlkeFBvb2xBbW91bnRBc3NldEFtdAQAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAARcG9vbExpcXVpZGl0eUxpc3QFAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10AwkBAAAAAiE9AAAAAgUAAAAJbHBBc3NldElkBQAAABBwYXltZW50THBBc3NldElkCQAAAgAAAAECAAAAFUludmFsaWQgYXNzZXQgcGFzc2VkLgQAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADWFtb3VudEFzc2V0SWQEAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAQAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10CQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEmFtb3V0QXNzZXREZWNpbWFscwQAAAAXcHJpY2VBc3NldFBvb2xMb2NrZWRBbXQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAEW91dEFtb3VudEFzc2V0QW10CQAAawAAAAMFAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAUAAAAPcGF5bWVudExwQW1vdW50BQAAAA1wb29sTFBCYWxhbmNlBAAAABBvdXRQcmljZUFzc2V0QW10CQAAawAAAAMFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAAA9wYXltZW50THBBbW91bnQFAAAADXBvb2xMUEJhbGFuY2UEAAAAFm91dEFtb3VudEFzc2V0QW10RmluYWwJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAEW91dEFtb3VudEFzc2V0QW10BQAAABJhbW91dEFzc2V0RGVjaW1hbHMFAAAABnNjYWxlOAQAAAAVb3V0UHJpY2VBc3NldEFtdEZpbmFsCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABBvdXRQcmljZUFzc2V0QW10BQAAABJwcmljZUFzc2V0RGVjaW1hbHMFAAAABnNjYWxlOAQAAAAMY3VycmVudFByaWNlCQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10CQAFIAAAAA4FAAAAFm91dEFtb3VudEFzc2V0QW10RmluYWwFAAAAFW91dFByaWNlQXNzZXRBbXRGaW5hbAUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAUAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQUAAAANYW1vdW50QXNzZXRJZAUAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlBQAAAAxwcmljZUFzc2V0SWQFAAAADXVzZXJMUEJhbGFuY2UFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQUAAAANcG9vbExQQmFsYW5jZQUAAAAMY3VycmVudFByaWNlBQAAAApwb29sU3RhdHVzAQAAABtwcml2YXRlRXN0aW1hdGVQdXRPcGVyYXRpb24AAAAHAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAEGluQW1vdW50QXNzZXRBbXQAAAAPaW5BbW91bnRBc3NldElkAAAAD2luUHJpY2VBc3NldEFtdAAAAA5pblByaWNlQXNzZXRJZAAAAAt1c2VyQWRkcmVzcwAAAAppc0V2YWx1YXRlBAAAABJwb29sQ29uZmlnRGF0YUxpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4QW1vdW50QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAPaWR4UHJpY2VBc3NldElkBAAAABVhbW91bnRBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQEAAAAEmFtb3V0QXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwQAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA1pZHhQb29sU3RhdHVzBAAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QJAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAAVaWR4UG9vbEFtb3VudEFzc2V0QW10BAAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10BAAAAA1wb29sTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAVdXNlckxpcXVpZGl0eURhdGFMaXN0CQEAAAAWZ2V0UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQFAAAAC3VzZXJBZGRyZXNzBAAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVdXNlckxpcXVpZGl0eURhdGFMaXN0BQAAABVpZHhQb29sQW1vdW50QXNzZXRBbXQEAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXVzZXJMaXF1aWRpdHlEYXRhTGlzdAUAAAAUaWR4UG9vbFByaWNlQXNzZXRBbXQEAAAADXVzZXJMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABV1c2VyTGlxdWlkaXR5RGF0YUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10AwMJAQAAAAIhPQAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAAD2luQW1vdW50QXNzZXRJZAYJAQAAAAIhPQAAAAIFAAAADHByaWNlQXNzZXRJZAUAAAAOaW5QcmljZUFzc2V0SWQJAAACAAAAAQIAAAAlSW52YWxpZCBhbW91bnQgb3IgcHJpY2UgYXNzZXQgcGFzc2VkLgQAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQMFAAAACmlzRXZhbHVhdGUJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkCQAAZQAAAAIJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkBQAAABBpbkFtb3VudEFzc2V0QW10BAAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UDBQAAAAppc0V2YWx1YXRlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkCQAAZQAAAAIJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQFAAAAD2luUHJpY2VBc3NldEFtdAQAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAAA9pblByaWNlQXNzZXRBbXQFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzBAAAAAl1c2VyUHJpY2UJAQAAAA5jYWxjdWxhdGVQcmljZQAAAAIFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQFAAAAGmluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkBAAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEnByaWNlQXNzZXREZWNpbWFscwQAAAALY3VyZW50UHJpY2UDCQAAAAAAAAIFAAAADXBvb2xMUEJhbGFuY2UAAAAAAAAAAAAAAAAAAAAAAAAJAQAAAA5jYWxjdWxhdGVQcmljZQAAAAIFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQEAAAACHNsaXBwYWdlAwkAAAAAAAACBQAAAAtjdXJlbnRQcmljZQAAAAAAAAAAAAAAAAAAAAAAAAMJAABmAAAAAgUAAAALY3VyZW50UHJpY2UFAAAACXVzZXJQcmljZQkAAGsAAAADCQAAZQAAAAIFAAAAC2N1cmVudFByaWNlBQAAAAl1c2VyUHJpY2UAAAAAAAAAAGQFAAAAC2N1cmVudFByaWNlCQAAawAAAAMJAABlAAAAAgUAAAAJdXNlclByaWNlBQAAAAtjdXJlbnRQcmljZQAAAAAAAAAAZAUAAAALY3VyZW50UHJpY2UDAwkBAAAAAiE9AAAAAgUAAAALY3VyZW50UHJpY2UAAAAAAAAAAAAJAABmAAAAAgkAAGgAAAACBQAAAAhzbGlwcGFnZQUAAAAGc2NhbGU4BQAAABFzbGlwcGFnZVRvbGVyYW5jZQcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAPUHJpY2Ugc2xpcHBhZ2UgCQABpAAAAAEJAABoAAAAAgUAAAAIc2xpcHBhZ2UFAAAABnNjYWxlOAIAAAAeIGV4Y2VlZGVkIHRoZSBwYXNzZWQgbGltaXQgb2YgCQABpAAAAAEFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAApmaW5hbFByaWNlCQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACCQAAZAAAAAIFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkCQAAZAAAAAIFAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAUAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQEAAAAC291dExwQW1vdW50AwkAAAAAAAACBQAAAA1wb29sTFBCYWxhbmNlAAAAAAAAAAAABAAAAAVwYXJ0QQkAAGwAAAAGBQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgQAAAAFcGFydEIJAABsAAAABgUAAAAZaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgkAAGgAAAACBQAAAAVwYXJ0QQUAAAAFcGFydEIEAAAAEmxwQW10QnlBbW91bnRBc3NldAkAAGsAAAADBQAAAA1wb29sTFBCYWxhbmNlBQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10BAAAABFscEFtdEJ5UHJpY2VBc3NldAkAAGsAAAADBQAAAA1wb29sTFBCYWxhbmNlBQAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAMGCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAOcG9vbExQQmFsYW5jZT0JAAGkAAAAAQUAAAANcG9vbExQQmFsYW5jZQIAAAAcIGluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkPQkAAaQAAAABBQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAIAAAAbIGluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQ9CQABpAAAAAEFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQCAAAAHCBhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQgPSAJAAGkAAAAAQUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10AgAAABkgcHJpY2VBc3NldFBvb2xMb2NrZWRBbXQ9CQABpAAAAAEFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10AgAAABUgbHBBbXRCeUFtb3VudEFzc2V0ID0JAAGkAAAAAQUAAAASbHBBbXRCeUFtb3VudEFzc2V0AgAAABMgbHBBbXRCeVByaWNlQXNzZXQ9CQABpAAAAAEFAAAAEWxwQW10QnlQcmljZUFzc2V0AwkAAGYAAAACBQAAABFscEFtdEJ5UHJpY2VBc3NldAUAAAASbHBBbXRCeUFtb3VudEFzc2V0BQAAABJscEFtdEJ5QW1vdW50QXNzZXQFAAAAEWxwQW10QnlQcmljZUFzc2V0CQAFHwAAAA0FAAAAC291dExwQW1vdW50BQAAAApmaW5hbFByaWNlBQAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlBQAAABV1c2VyUHJpY2VBc3NldEJhbGFuY2UFAAAADXVzZXJMUEJhbGFuY2UFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQUAAAANcG9vbExQQmFsYW5jZQUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAUAAAAJbHBBc3NldElkBQAAAAhzbGlwcGFnZQUAAAAKcG9vbFN0YXR1cwEAAAAbdmFsaWRhdGVNYXRjaGVyT3JkZXJBbGxvd2VkAAAAAQAAAAVvcmRlcgQAAAAScG9vbENvbmZpZ0RhdGFMaXN0CQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAADWFtb3VudEFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhBbW91bnRBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA9pZHhQcmljZUFzc2V0SWQEAAAACnBvb2xTdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAADWlkeFBvb2xTdGF0dXMEAAAAE21hdGNoZXJQdWJsaWNLZXlTdHIJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABNpZHhNYXRjaGVyUHVibGljS2V5BAAAABNhbW91bnRBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABZpZHhBbW91bnRBc3NldERlY2ltYWxzBAAAABJwcmljZUFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFWlkeFByaWNlQXNzZXREZWNpbWFscwQAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADWFtb3VudEFzc2V0SWQEAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAQAAAAMY3VycmVudFByaWNlAwkAAAAAAAACCAUAAAAFb3JkZXIAAAAJb3JkZXJUeXBlBQAAAANCdXkJAQAAABVwcml2YXRlQ2FsY3VsYXRlUHJpY2UAAAAEBQAAABNhbW91bnRBc3NldERlY2ltYWxzBQAAABJwcmljZUFzc2V0RGVjaW1hbHMJAABkAAAAAgUAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQgFAAAABW9yZGVyAAAABmFtb3VudAUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlCQEAAAAVcHJpdmF0ZUNhbGN1bGF0ZVByaWNlAAAABAUAAAATYW1vdW50QXNzZXREZWNpbWFscwUAAAAScHJpY2VBc3NldERlY2ltYWxzCQAAZAAAAAIFAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UIBQAAAAVvcmRlcgAAAAZhbW91bnQFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQQAAAARaXNQb29sU3RhdHVzVmFsaWQDAwMJAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAATUG9vbE1hdGNoZXJEaXNhYmxlZAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAAMUG9vbFNodXRkb3duBwYEAAAAEmlzVmFsaWRNYXRjaGVyU2lnbgYEAAAAEG9yZGVyQW1vdW50QXNzZXQICAUAAAAFb3JkZXIAAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BAAAABNvcmRlckFtb3VudEFzc2V0U3RyAwkAAAAAAAACBQAAABBvcmRlckFtb3VudEFzc2V0BQAAAAR1bml0AgAAAAVXQVZFUwkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAABBvcmRlckFtb3VudEFzc2V0BAAAAA9vcmRlclByaWNlQXNzZXQICAUAAAAFb3JkZXIAAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQEAAAAEm9yZGVyUHJpY2VBc3NldFN0cgMJAAAAAAAAAgUAAAAPb3JkZXJQcmljZUFzc2V0BQAAAAR1bml0AgAAAAVXQVZFUwkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAA9vcmRlclByaWNlQXNzZXQEAAAAEGlzVmFsaWRBc3NldFBhaXIDAwkBAAAAAiE9AAAAAgUAAAATb3JkZXJBbW91bnRBc3NldFN0cgUAAAANYW1vdW50QXNzZXRJZAYJAQAAAAIhPQAAAAIFAAAAEm9yZGVyUHJpY2VBc3NldFN0cgUAAAAMcHJpY2VBc3NldElkBwYEAAAACm9yZGVyUHJpY2UIBQAAAAVvcmRlcgAAAAVwcmljZQQAAAANcHJpY2VEZWNpbWFscwkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEnByaWNlQXNzZXREZWNpbWFscwUAAAATYW1vdW50QXNzZXREZWNpbWFscwQAAAAQY2FzdGVkT3JkZXJQcmljZQkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAKb3JkZXJQcmljZQUAAAAGc2NhbGU4BQAAAA1wcmljZURlY2ltYWxzBAAAABFpc09yZGVyUHJpY2VWYWxpZAMJAAAAAAAAAggFAAAABW9yZGVyAAAACW9yZGVyVHlwZQUAAAADQnV5CQAAZwAAAAIFAAAADGN1cnJlbnRQcmljZQUAAAAQY2FzdGVkT3JkZXJQcmljZQkAAGcAAAACBQAAABBjYXN0ZWRPcmRlclByaWNlBQAAAAxjdXJyZW50UHJpY2UDAwMFAAAAEGlzVmFsaWRBc3NldFBhaXIFAAAAEmlzVmFsaWRNYXRjaGVyU2lnbgcFAAAAEWlzUG9vbFN0YXR1c1ZhbGlkBwUAAAARaXNPcmRlclByaWNlVmFsaWQHAAAACAAAAAFpAQAAAANwdXQAAAACAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAD3Nob3VsZEF1dG9TdGFrZQQAAAARZmFjdG9yeUNvbmZpZ0xpc3QJAQAAABBnZXRGYWN0b3J5Q29uZmlnAAAAAAQAAAAPc3Rha2luZ0NvbnRyYWN0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkAAZEAAAACBQAAABFmYWN0b3J5Q29uZmlnTGlzdAUAAAAZaWR4RmFjdG9yeVN0YWtpbmdDb250cmFjdAIAAAAhRXJyb3IuIEluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MuBAAAAA5wbXRBbW91bnRBc3NldAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAQaW5BbW91bnRBc3NldEFtdAgFAAAADnBtdEFtb3VudEFzc2V0AAAABmFtb3VudAQAAAAPaW5BbW91bnRBc3NldElkAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAADnBtdEFtb3VudEFzc2V0AAAAB2Fzc2V0SWQJAAJZAAAAAQIAAAAFV0FWRVMJAQAAAAV2YWx1ZQAAAAEIBQAAAA5wbXRBbW91bnRBc3NldAAAAAdhc3NldElkBAAAAA1wbXRQcmljZUFzc2V0CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABBAAAAA9pblByaWNlQXNzZXRBbXQIBQAAAA1wbXRQcmljZUFzc2V0AAAABmFtb3VudAQAAAAOaW5QcmljZUFzc2V0SWQDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCAUAAAANcG10UHJpY2VBc3NldAAAAAdhc3NldElkCQACWQAAAAECAAAABVdBVkVTCQEAAAAFdmFsdWUAAAABCAUAAAANcG10UHJpY2VBc3NldAAAAAdhc3NldElkBAAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzCQEAAAAbcHJpdmF0ZUVzdGltYXRlUHV0T3BlcmF0aW9uAAAABwUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAEGluQW1vdW50QXNzZXRBbXQJAAJYAAAAAQUAAAAPaW5BbW91bnRBc3NldElkBQAAAA9pblByaWNlQXNzZXRBbXQJAAJYAAAAAQUAAAAOaW5QcmljZUFzc2V0SWQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBwQAAAALb3V0THBBbW91bnQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8xBAAAAAtjdXJlbnRQcmljZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzIEAAAAFnVzZXJBbW91bnRBc3NldEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8zBAAAABV1c2VyUHJpY2VBc3NldEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl80BAAAAA11c2VyTFBCYWxhbmNlCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNQQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzYEAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzcEAAAADXBvb2xMUEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl84BAAAABVhbW91bnRBc3NldEludGVybmFsSWQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl85BAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAADXzEwBAAAAAlscEFzc2V0SWQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAA18xMQQAAAASc2xpcHBhZ2VDYWxjdWxhdGVkCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAANfMTIEAAAACnBvb2xTdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAADXzEzAwMDCQEAAAAQaXNHbG9iYWxTaHV0ZG93bgAAAAAGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAAD1Bvb2xQdXREaXNhYmxlZAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAAMUG9vbFNodXRkb3duCQAAAgAAAAEJAAEsAAAAAgIAAAAsUHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAAGkAAAAAQUAAAAKcG9vbFN0YXR1cwQAAAAUZW1pdExQQXNzZXRPbkZhY3RvcnkJAAP8AAAABAUAAAAPZmFjdG9yeUNvbnRyYWN0AgAAAARlbWl0CQAETAAAAAIFAAAAC291dExwQW1vdW50BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAUZW1pdExQQXNzZXRPbkZhY3RvcnkFAAAAFGVtaXRMUEFzc2V0T25GYWN0b3J5AwkBAAAAAiE9AAAAAgUAAAAUZW1pdExQQXNzZXRPbkZhY3RvcnkCAAAAB3N1Y2Nlc3MJAAACAAAAAQIAAAA0TFAgYXNzZXQgcmVpc3N1ZSBmYWlsZWQgZHVyaW5nIGVtaXQgY2FsbCBvbiBmYWN0b3J5LgQAAAAHcmVzdWx0cwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAAkAASwAAAACAgAAAAQlc19fCQABpAAAAAEFAAAAC2N1cmVudFByaWNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQABLAAAAAICAAAABCVzX18JAAGkAAAAAQUAAAALY3VyZW50UHJpY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleVB1dEFjdGlvbkJ5VXNlcgAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQJAQAAABFkYXRhUHV0QWN0aW9uSW5mbwAAAAgFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAAD2luUHJpY2VBc3NldEFtdAUAAAALb3V0THBBbW91bnQFAAAAC2N1cmVudFByaWNlBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAASc2xpcHBhZ2VDYWxjdWxhdGVkBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMJAABkAAAAAgUAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQUAAAAQaW5BbW91bnRBc3NldEFtdAkAAGQAAAACBQAAABV1c2VyUHJpY2VBc3NldEJhbGFuY2UFAAAAD2luUHJpY2VBc3NldEFtdAkAAGQAAAACBQAAAA11c2VyTFBCYWxhbmNlBQAAAAtvdXRMcEFtb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMJAABkAAAAAgUAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQUAAAAQaW5BbW91bnRBc3NldEFtdAkAAGQAAAACBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UFAAAAD2luUHJpY2VBc3NldEFtdAkAAGQAAAACBQAAAA1wb29sTFBCYWxhbmNlBQAAAAtvdXRMcEFtb3VudAUAAAADbmlsAwUAAAAPc2hvdWxkQXV0b1N0YWtlBAAAAAVzdGFrZQkAA/wAAAAEBQAAAA9zdGFraW5nQ29udHJhY3QCAAAABXN0YWtlBQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAACWxwQXNzZXRJZAUAAAALb3V0THBBbW91bnQFAAAAA25pbAMJAAAAAAAAAgUAAAAFc3Rha2UFAAAABXN0YWtlBQAAAAdyZXN1bHRzCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkABE0AAAACBQAAAAdyZXN1bHRzCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAC291dExwQW1vdW50BQAAAAlscEFzc2V0SWQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAA2dldAAAAAAEAAAADnBtdEFtb3VudEFzc2V0CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAApwbXRBc3NldElkCQEAAAAFdmFsdWUAAAABCAUAAAAOcG10QW1vdW50QXNzZXQAAAAHYXNzZXRJZAQAAAAOcG10QXNzZXRBbW91bnQIBQAAAA5wbXRBbW91bnRBc3NldAAAAAZhbW91bnQEAAAAB3Jlc3VsdHMJAQAAABtwcml2YXRlRXN0aW1hdGVHZXRPcGVyYXRpb24AAAADCQACWAAAAAEFAAAACnBtdEFzc2V0SWQFAAAADnBtdEFzc2V0QW1vdW50CQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAARb3V0QW1vdW50QXNzZXRBbXQIBQAAAAdyZXN1bHRzAAAAAl8xBAAAABBvdXRQcmljZUFzc2V0QW10CAUAAAAHcmVzdWx0cwAAAAJfMgQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCAUAAAAHcmVzdWx0cwAAAAJfMwQAAAAUcHJpY2VBc3NldEludGVybmFsSWQIBQAAAAdyZXN1bHRzAAAAAl80BAAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAAJfNQQAAAANYW1vdW50QXNzZXRJZAgFAAAAB3Jlc3VsdHMAAAACXzYEAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAACXzcEAAAADHByaWNlQXNzZXRJZAgFAAAAB3Jlc3VsdHMAAAACXzgEAAAADXVzZXJMUEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAAl85BAAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAANfMTAEAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAADXzExBAAAAA1wb29sTFBCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAANfMTIEAAAADGN1cnJlbnRQcmljZQgFAAAAB3Jlc3VsdHMAAAADXzEzBAAAAApwb29sU3RhdHVzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEIBQAAAAdyZXN1bHRzAAAAA18xNAMDCQEAAAAQaXNHbG9iYWxTaHV0ZG93bgAAAAAGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAADFBvb2xTaHV0ZG93bgkAAAIAAAABCQABLAAAAAICAAAALEdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbi4gU3RhdHVzID0gCQABpAAAAAEFAAAACnBvb2xTdGF0dXMEAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQAD/AAAAAQFAAAAD2ZhY3RvcnlDb250cmFjdAIAAAAEYnVybgkABEwAAAACBQAAAA5wbXRBc3NldEFtb3VudAUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAApwbXRBc3NldElkBQAAAA5wbXRBc3NldEFtb3VudAUAAAADbmlsAwkAAAAAAAACBQAAABRidXJuTFBBc3NldE9uRmFjdG9yeQUAAAAUYnVybkxQQXNzZXRPbkZhY3RvcnkDCQEAAAACIT0AAAACBQAAABRidXJuTFBBc3NldE9uRmFjdG9yeQIAAAAHc3VjY2VzcwkAAAIAAAABAgAAADFMUCBhc3NldCBidXJuIGZhaWxlZCBkdXJpbmcgZW1pdCBjYWxsIG9uIGZhY3RvcnkuCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAARb3V0QW1vdW50QXNzZXRBbXQDCQAAAAAAAAIFAAAADWFtb3VudEFzc2V0SWQCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAADWFtb3VudEFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABBvdXRQcmljZUFzc2V0QW10CQACWQAAAAEFAAAADHByaWNlQXNzZXRJZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAWa2V5UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADCQAAZQAAAAIFAAAAFnVzZXJBbW91bnRBc3NldEJhbGFuY2UFAAAAEW91dEFtb3VudEFzc2V0QW10CQAAZQAAAAIFAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQUAAAAQb3V0UHJpY2VBc3NldEFtdAkAAGUAAAACBQAAAA11c2VyTFBCYWxhbmNlBQAAAA5wbXRBc3NldEFtb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMJAABlAAAAAgUAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQUAAAARb3V0QW1vdW50QXNzZXRBbXQJAABlAAAAAgUAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlBQAAABBvdXRQcmljZUFzc2V0QW10CQAAZQAAAAIFAAAADXBvb2xMUEJhbGFuY2UFAAAADnBtdEFzc2V0QW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlHZXRBY3Rpb25CeVVzZXIAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkCQEAAAARZGF0YUdldEFjdGlvbkluZm8AAAAGBQAAABFvdXRBbW91bnRBc3NldEFtdAUAAAAQb3V0UHJpY2VBc3NldEFtdAUAAAAOcG10QXNzZXRBbW91bnQFAAAADGN1cnJlbnRQcmljZQUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAAkAASwAAAACAgAAAAQlc19fCQABpAAAAAEFAAAADGN1cnJlbnRQcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5UHJpY2VIaXN0b3J5AAAAAgUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkAASwAAAACAgAAAAQlc19fCQABpAAAAAEFAAAADGN1cnJlbnRQcmljZQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAhhY3RpdmF0ZQAAAAIAAAAOYW1vdW50QXNzZXRTdHIAAAANcHJpY2VBc3NldFN0cgMJAQAAAAIhPQAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAEJQAAAAEFAAAAD2ZhY3RvcnlDb250cmFjdAkAAAIAAAABAgAAABJwZXJtaXNzaW9ucyBkZW5pZWQJAAUUAAAAAgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAOa2V5QW1vdW50QXNzZXQAAAAABQAAAA5hbW91bnRBc3NldFN0cgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAANa2V5UHJpY2VBc3NldAAAAAAFAAAADXByaWNlQXNzZXRTdHIFAAAAA25pbAIAAAAHc3VjY2VzcwAAAAFpAQAAAA1zdGF0c1JFQURPTkxZAAAAAAQAAAAScG9vbENvbmZpZ0RhdGFMaXN0CQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACWxwQXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4UG9vbExQQXNzZXRJZAQAAAANYW1vdW50QXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeEFtb3VudEFzc2V0SWQEAAAADHByaWNlQXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAYaWR4QW1vdW50QXNzZXRJbnRlcm5hbElkBAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAF2lkeFByaWNlQXNzZXRJbnRlcm5hbElkBAAAABJhbW91dEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QJAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAANcG9vbExQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAARaWR4UG9vbExQQXNzZXRBbXQEAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkBAAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQEAAAACnByaWNlc0xpc3QJAQAAAA9jYWxjdWxhdGVQcmljZXMAAAADBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlBQAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UFAAAADXBvb2xMUEJhbGFuY2UEAAAADGN1cnJlbnRQcmljZQkAAZEAAAACBQAAAApwcmljZXNMaXN0AAAAAAAAAAAABAAAABRscFByaWNlSW5BbW91bnRBc3NldAkAAZEAAAACBQAAAApwcmljZXNMaXN0AAAAAAAAAAABBAAAABNscFByaWNlSW5QcmljZUFzc2V0CQABkQAAAAIFAAAACnByaWNlc0xpc3QAAAAAAAAAAAIEAAAACnBvb2xXZWlnaHQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAA1rZXlQb29sV2VpZ2h0AAAAAQkABCUAAAABBQAAAAR0aGlzAgAAABlQb29sIGRvZXNuJ3QgaGF2ZSB3ZWlnaHQuCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAADiVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAADXBvb2xMUEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABRscFByaWNlSW5BbW91bnRBc3NldAkABEwAAAACCQABpAAAAAEFAAAAE2xwUHJpY2VJblByaWNlQXNzZXQJAARMAAAAAgkAAaQAAAABBQAAAApwb29sV2VpZ2h0BQAAAANuaWwFAAAAA1NFUAAAAAFpAQAAACBldmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQAAAAMAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAAQaW5BbW91bnRBc3NldEFtdAAAAAt1c2VyQWRkcmVzcwQAAAAScG9vbENvbmZpZ0RhdGFMaXN0CQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACWxwQXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4UG9vbExQQXNzZXRJZAQAAAANYW1vdW50QXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeEFtb3VudEFzc2V0SWQEAAAADHByaWNlQXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAYaWR4QW1vdW50QXNzZXRJbnRlcm5hbElkBAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAF2lkeFByaWNlQXNzZXRJbnRlcm5hbElkBAAAABJhbW91dEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAAApwb29sU3RhdHVzCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAANaWR4UG9vbFN0YXR1cwQAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0CQEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQEAAAADXBvb2xMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAANYW1vdW50QXNzZXRJZAQAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkBAAAAB9hY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlQ2FzdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEmFtb3V0QXNzZXREZWNpbWFscwQAAAAeYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlQ2FzdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzBAAAAAtjdXJlbnRQcmljZQMJAAAAAAAAAgUAAAANcG9vbExQQmFsYW5jZQAAAAAAAAAAAAAAAAAAAAAAAAkBAAAADmNhbGN1bGF0ZVByaWNlAAAAAgUAAAAeYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlQ2FzdGVkBQAAAB9hY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlQ2FzdGVkBAAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkCQAAawAAAAMFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAAC2N1cmVudFByaWNlBQAAAAZzY2FsZTgEAAAAD2luUHJpY2VBc3NldEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAZaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZAUAAAAScHJpY2VBc3NldERlY2ltYWxzBQAAAAZzY2FsZTgEAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMJAQAAABtwcml2YXRlRXN0aW1hdGVQdXRPcGVyYXRpb24AAAAHBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAQaW5BbW91bnRBc3NldEFtdAUAAAANYW1vdW50QXNzZXRJZAUAAAAPaW5QcmljZUFzc2V0QW10BQAAAAxwcmljZUFzc2V0SWQFAAAAC3VzZXJBZGRyZXNzBgQAAAAPb3V0THBBbW91bnRDYWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfMQQAAAAPY3VyZW50UHJpY2VDYWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfMgQAAAAacG9vbEFtb3VudEFzc2V0QmFsYW5jZUNhbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl82BAAAABlwb29sUHJpY2VBc3NldEJhbGFuY2VDQWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNwQAAAARcG9vbExQQmFsYW5jZUNhbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl84BAAAAA5wb29sU3RhdHVzQ2FsYwkBAAAADXBhcnNlSW50VmFsdWUAAAABCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAANfMTMJAAUUAAAAAgUAAAADbmlsCQAEuQAAAAIJAARMAAAAAgIAAAAMJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAAPb3V0THBBbW91bnRDYWxjCQAETAAAAAIJAAGkAAAAAQUAAAALY3VyZW50UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABpwb29sQW1vdW50QXNzZXRCYWxhbmNlQ2FsYwkABEwAAAACCQABpAAAAAEFAAAAGXBvb2xQcmljZUFzc2V0QmFsYW5jZUNBbGMJAARMAAAAAgkAAaQAAAABBQAAABFwb29sTFBCYWxhbmNlQ2FsYwkABEwAAAACCQABpAAAAAEFAAAADnBvb2xTdGF0dXNDYWxjBQAAAANuaWwFAAAAA1NFUAAAAAFpAQAAAB9ldmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZAAAAAwAAABFzbGlwcGFnZVRvbGVyYW5jZQAAAA9pblByaWNlQXNzZXRBbXQAAAALdXNlckFkZHJlc3MEAAAAEnBvb2xDb25maWdEYXRhTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAlscEFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeFBvb2xMUEFzc2V0SWQEAAAADWFtb3VudEFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhBbW91bnRBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA9pZHhQcmljZUFzc2V0SWQEAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAGGlkeEFtb3VudEFzc2V0SW50ZXJuYWxJZAQAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABdpZHhQcmljZUFzc2V0SW50ZXJuYWxJZAQAAAASYW1vdXRBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABZpZHhBbW91bnRBc3NldERlY2ltYWxzBAAAABJwcmljZUFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFWlkeFByaWNlQXNzZXREZWNpbWFscwQAAAAKcG9vbFN0YXR1cwkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAADWlkeFBvb2xTdGF0dXMEAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAkBAAAAEGdldFBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAAA1wb29sTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADWFtb3VudEFzc2V0SWQEAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAQAAAAfYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZUNhc3RlZAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQUAAAAGc2NhbGU4BQAAABJhbW91dEFzc2V0RGVjaW1hbHMEAAAAHmFjY291bnRQcmljZUFzc2V0QmFsYW5jZUNhc3RlZAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEnByaWNlQXNzZXREZWNpbWFscwQAAAAeaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZFR1cGxlCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAAA9pblByaWNlQXNzZXRBbXQFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzBAAAAAtjdXJlbnRQcmljZQMJAAAAAAAAAgUAAAANcG9vbExQQmFsYW5jZQAAAAAAAAAAAAAAAAAAAAAAAAkBAAAADmNhbGN1bGF0ZVByaWNlAAAAAgUAAAAeYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlQ2FzdGVkBQAAAB9hY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlQ2FzdGVkBAAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAkAAGsAAAADBQAAAB5pblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkVHVwbGUFAAAABnNjYWxlOAUAAAALY3VyZW50UHJpY2UEAAAAEGluQW1vdW50QXNzZXRBbXQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGmluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkBQAAABJhbW91dEFzc2V0RGVjaW1hbHMFAAAABnNjYWxlOAQAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwkBAAAAG3ByaXZhdGVFc3RpbWF0ZVB1dE9wZXJhdGlvbgAAAAcFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABBpbkFtb3VudEFzc2V0QW10BQAAAA1hbW91bnRBc3NldElkBQAAAA9pblByaWNlQXNzZXRBbXQFAAAADHByaWNlQXNzZXRJZAUAAAALdXNlckFkZHJlc3MGBAAAAA9vdXRMcEFtb3VudENhbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8xBAAAAA9jdXJlbnRQcmljZUNhbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8yBAAAABpwb29sQW1vdW50QXNzZXRCYWxhbmNlQ2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzYEAAAAGXBvb2xQcmljZUFzc2V0QmFsYW5jZUNBbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl83BAAAABFwb29sTFBCYWxhbmNlQ2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzgEAAAADnBvb2xTdGF0dXNDYWxjCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAA18xMwkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAAAwlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAA9vdXRMcEFtb3VudENhbGMJAARMAAAAAgkAAaQAAAABBQAAAAtjdXJlbnRQcmljZQkABEwAAAACCQABpAAAAAEFAAAAGnBvb2xBbW91bnRBc3NldEJhbGFuY2VDYWxjCQAETAAAAAIJAAGkAAAAAQUAAAAZcG9vbFByaWNlQXNzZXRCYWxhbmNlQ0FsYwkABEwAAAACCQABpAAAAAEFAAAAEXBvb2xMUEJhbGFuY2VDYWxjCQAETAAAAAIJAAGkAAAAAQUAAAAOcG9vbFN0YXR1c0NhbGMFAAAAA25pbAUAAAADU0VQAAAAAWkBAAAAE2V2YWx1YXRlR2V0UkVBRE9OTFkAAAADAAAAEHBheW1lbnRMcEFzc2V0SWQAAAAPcGF5bWVudExwQW1vdW50AAAAC3VzZXJBZGRyZXNzBAAAAAdyZXN1bHRzCQEAAAAbcHJpdmF0ZUVzdGltYXRlR2V0T3BlcmF0aW9uAAAAAwUAAAAQcGF5bWVudExwQXNzZXRJZAUAAAAPcGF5bWVudExwQW1vdW50BQAAAAt1c2VyQWRkcmVzcwQAAAARb3V0QW1vdW50QXNzZXRBbXQIBQAAAAdyZXN1bHRzAAAAAl8xBAAAABBvdXRQcmljZUFzc2V0QW10CAUAAAAHcmVzdWx0cwAAAAJfMgQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAADXzEwBAAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAA18xMQQAAAANcG9vbExQQmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAADXzEyBAAAAAxjdXJyZW50UHJpY2UIBQAAAAdyZXN1bHRzAAAAA18xMwQAAAAKcG9vbFN0YXR1cwkBAAAADXBhcnNlSW50VmFsdWUAAAABCAUAAAAHcmVzdWx0cwAAAANfMTQJAAUUAAAAAgUAAAADbmlsCQAEuQAAAAIJAARMAAAAAgIAAAAOJWQlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAABFvdXRBbW91bnRBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAEG91dFByaWNlQXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAANcG9vbExQQmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAADGN1cnJlbnRQcmljZQkABEwAAAACCQABpAAAAAEFAAAACnBvb2xTdGF0dXMFAAAAA25pbAUAAAADU0VQAAAAAWkBAAAADGhhc2hSRUFET05MWQAAAAAJAAUUAAAAAgUAAAADbmlsCQACWgAAAAEJAQAAAAV2YWx1ZQAAAAEJAAPxAAAAAQUAAAAEdGhpcwAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAVPcmRlcgQAAAAFb3JkZXIFAAAAByRtYXRjaDAGCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleXJZzoU=", "height": 1701168, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: J29e25sQGrcvTscAjBx5suj1ekwfJPA5YfbowMP1FvFN Next: 2uEqncQKAFqMaJaTTFap8A2uTeBTRBZAGfGGGUzUzfkN Diff:
OldNewDifferences
139139 func privateCastToScaleOf (amount,resultScale,currentScale) = fraction(amount, resultScale, currentScale)
140140
141141
142-func calculatePriceBigInt (priceAssetLockedAmt,amountAssetlLockedAmt) = {
143- let priceBigInt = fraction(toBigInt(priceAssetLockedAmt), scale18, toBigInt(amountAssetlLockedAmt))
144- toInt(fraction(priceBigInt, toBigInt(scale8), scale18))
145- }
146-
147-
148142 func calculatePrice (priceAssetLockedAmt,amountAssetlLockedAmt) = fraction(priceAssetLockedAmt, scale8, amountAssetlLockedAmt)
149143
150144
208202 }
209203
210204
211-func privateEstimatePutOperation (slippageTolerance,inAmountAssetAmt,inAmountAssetId,inPriceAssetAmt,inPriceAssetId,userAddress) = {
205+func privateEstimatePutOperation (slippageTolerance,inAmountAssetAmt,inAmountAssetId,inPriceAssetAmt,inPriceAssetId,userAddress,isEvaluate) = {
212206 let poolConfigDataList = getPoolConfig()
213207 let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
214208 let amountAssetId = poolConfigDataList[idxAmountAssetId]
231225 else (priceAssetId != inPriceAssetId))
232226 then throw("Invalid amount or price asset passed.")
233227 else {
234- let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
235- let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
228+ let accountAmountAssetBalance = if (isEvaluate)
229+ then privateGetAccountBalance(amountAssetId)
230+ else (privateGetAccountBalance(amountAssetId) - inAmountAssetAmt)
231+ let accountPriceAssetBalance = if (isEvaluate)
232+ then privateGetAccountBalance(priceAssetId)
233+ else (privateGetAccountBalance(priceAssetId) - inPriceAssetAmt)
236234 let inAmountAssetAmtCalculated = privateCastToScaleOf(inAmountAssetAmt, scale8, amoutAssetDecimals)
237235 let inPriceAssetAmtCalculated = privateCastToScaleOf(inPriceAssetAmt, scale8, priceAssetDecimals)
238236 let userPrice = calculatePrice(inPriceAssetAmtCalculated, inAmountAssetAmtCalculated)
261259 else {
262260 let lpAmtByAmountAsset = fraction(poolLPBalance, inAmountAssetAmtCalculated, amountAssetPoolLockedAmt)
263261 let lpAmtByPriceAsset = fraction(poolLPBalance, inPriceAssetAmtCalculated, priceAssetPoolLockedAmt)
264- if ((lpAmtByPriceAsset > lpAmtByAmountAsset))
265- then lpAmtByAmountAsset
266- else lpAmtByPriceAsset
262+ if (true)
263+ then throw(((((((((((((("poolLPBalance=" + toString(poolLPBalance)) + " inAmountAssetAmtCalculated=") + toString(inAmountAssetAmtCalculated)) + " inPriceAssetAmtCalculated=") + toString(inPriceAssetAmtCalculated)) + " amountAssetPoolLockedAmt = ") + toString(amountAssetPoolLockedAmt)) + " priceAssetPoolLockedAmt=") + toString(priceAssetPoolLockedAmt)) + " lpAmtByAmountAsset =") + toString(lpAmtByAmountAsset)) + " lpAmtByPriceAsset=") + toString(lpAmtByPriceAsset)))
264+ else if ((lpAmtByPriceAsset > lpAmtByAmountAsset))
265+ then lpAmtByAmountAsset
266+ else lpAmtByPriceAsset
267267 }
268268 $Tuple13(outLpAmount, finalPrice, userAmountAssetBalance, userPriceAssetBalance, userLPBalance, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, amountAssetInternalId, priceAssetInternalId, lpAssetId, slippage, poolStatus)
269269 }
311311 let isOrderPriceValid = if ((order.orderType == Buy))
312312 then (currentPrice >= castedOrderPrice)
313313 else (castedOrderPrice >= currentPrice)
314-[if (if (if (isValidAssetPair)
314+ if (if (if (isValidAssetPair)
315315 then isValidMatcherSign
316316 else false)
317317 then isPoolStatusValid
318318 else false)
319319 then isOrderPriceValid
320- else false]
320+ else false
321321 }
322322
323323
335335 let inPriceAssetId = if (!(isDefined(pmtPriceAsset.assetId)))
336336 then fromBase58String("WAVES")
337337 else value(pmtPriceAsset.assetId)
338- let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, toBase58String(inAmountAssetId), inPriceAssetAmt, toBase58String(inPriceAssetId), toString(i.caller))
338+ let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, toBase58String(inAmountAssetId), inPriceAssetAmt, toBase58String(inPriceAssetId), toString(i.caller), false)
339339 let outLpAmount = estimatedPutResults._1
340340 let curentPrice = estimatedPutResults._2
341341 let userAmountAssetBalance = estimatedPutResults._3
468468 else calculatePrice(accountPriceAssetBalanceCasted, accountAmountAssetBalanceCasted)
469469 let inPriceAssetAmtCalculated = fraction(inAmountAssetAmt, curentPrice, scale8)
470470 let inPriceAssetAmt = privateCastToScaleOf(inPriceAssetAmtCalculated, priceAssetDecimals, scale8)
471- let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress)
471+ let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress, true)
472472 let outLpAmountCalc = estimatedPutResults._1
473473 let curentPriceCalc = estimatedPutResults._2
474474 let poolAmountAssetBalanceCalc = estimatedPutResults._6
503503 else calculatePrice(accountPriceAssetBalanceCasted, accountAmountAssetBalanceCasted)
504504 let inAmountAssetAmtCalculated = fraction(inPriceAssetAmtCalculatedTuple, scale8, curentPrice)
505505 let inAmountAssetAmt = privateCastToScaleOf(inAmountAssetAmtCalculated, amoutAssetDecimals, scale8)
506- let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress)
506+ let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress, true)
507507 let outLpAmountCalc = estimatedPutResults._1
508508 let curentPriceCalc = estimatedPutResults._2
509509 let poolAmountAssetBalanceCalc = estimatedPutResults._6
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let factoryContract = Address(base58'3MxueHaGvWmdk5crtn9HwtkSAAZScTWoHaC')
55
66 let lPdecimals = 8
77
88 let scale8 = 100000000
99
1010 let scale18 = toBigInt(1000000000000000000)
1111
1212 let SEP = "__"
1313
1414 let PoolActive = 1
1515
1616 let PoolPutDisabled = 2
1717
1818 let PoolMatcherDisabled = 3
1919
2020 let PoolShutdown = 4
2121
2222 let idxPoolAddress = 1
2323
2424 let idxPoolStatus = 2
2525
2626 let idxPoolLPAssetId = 3
2727
2828 let idxAmountAssetId = 4
2929
3030 let idxPriceAssetId = 5
3131
3232 let idxAmountAssetDecimals = 6
3333
3434 let idxPriceAssetDecimals = 7
3535
3636 let idxAmountAssetInternalId = 8
3737
3838 let idxPriceAssetInternalId = 9
3939
4040 let idxLPAssetDecimals = 10
4141
4242 let idxMatcherPublicKey = 11
4343
4444 let idxPoolAmountAssetAmt = 1
4545
4646 let idxPoolPriceAssetAmt = 2
4747
4848 let idxPoolLPAssetAmt = 3
4949
5050 let idxFactoryStakingContract = 1
5151
5252 let idxFactoryBoostingConfig = 2
5353
5454 func keyPriceLast () = "%s%s__price__last"
5555
5656
5757 func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
5858
5959
6060 func keyPoolLiquidity (internalAmountAsset,internalPriceAsset) = (((("%d%d%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__locked")
6161
6262
6363 func keyPoolLiquidityByUser (internalAmountAsset,internalPriceAsset,userAddress) = (((((("%d%d%s%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__") + userAddress) + "__locked")
6464
6565
6666 func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
6767
6868
6969 func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
7070
7171
7272 func keyAmountAsset () = "%s__amountAsset"
7373
7474
7575 func keyPriceAsset () = "%s__priceAsset"
7676
7777
7878 func keyFactoryConfig () = "%s__factoryConfig"
7979
8080
8181 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
8282
8383
8484 func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
8585
8686
8787 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
8888
8989
9090 func keyAllPoolsShutdown () = "%s__shutdown"
9191
9292
9393 func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
9494
9595
9696 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
9797
9898
9999 func getPoolConfig () = {
100100 let poolAmountAsset = valueOrErrorMessage(getString(this, keyAmountAsset()), "No config for amount asset found")
101101 let poolPriceAsset = valueOrErrorMessage(getString(this, keyPriceAsset()), "No config for price asset found")
102102 let poolPriceAssetInternal = valueOrErrorMessage(getInteger(factoryContract, keyMappingsBaseAsset2internalId(poolPriceAsset)), "No config for internal price asset found")
103103 let poolAmountAssetInternal = valueOrErrorMessage(getInteger(factoryContract, keyMappingsBaseAsset2internalId(poolAmountAsset)), "No config for internal amount asset found")
104104 split(valueOrErrorMessage(getString(factoryContract, keyPoolConfig(toString(poolAmountAssetInternal), toString(poolPriceAssetInternal))), "No factory config found for pool assets."), SEP)
105105 }
106106
107107
108108 func getFactoryConfig () = split(valueOrErrorMessage(getString(factoryContract, keyFactoryConfig()), "No factory config found."), SEP)
109109
110110
111111 func getPoolLiquidity (amountAssetInternalId,priceAssetInternalId) = {
112112 let currentPoolLiquidityValue = getString(this, keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId))
113113 if (isDefined(currentPoolLiquidityValue))
114114 then split(value(currentPoolLiquidityValue), SEP)
115115 else ["", "0", "0", "0"]
116116 }
117117
118118
119119 func getPoolLiquidityByUser (amountAssetInternalId,priceAssetInternalId,userAddress) = {
120120 let currentPoolLiquidityValue = getString(this, keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress))
121121 if (isDefined(currentPoolLiquidityValue))
122122 then split(value(currentPoolLiquidityValue), SEP)
123123 else ["", "0", "0", "0", "0"]
124124 }
125125
126126
127127 func dataPoolLiquidity (amountAssetLocked,priceAssetLocked,lpTokenLocked) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP)
128128
129129
130130 func dataPoolLiquidityByUser (amountAssetLocked,priceAssetLocked,lpTokenLocked,userAddress) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP)
131131
132132
133133 func dataPutActionInfo (inAmountAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,slippageToleranceReal,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d%d", toString(inAmountAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(slippageToleranceReal), toString(txHeight), toString(txTimestamp)], SEP)
134134
135135
136136 func dataGetActionInfo (outAmountAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmountAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
137137
138138
139139 func privateCastToScaleOf (amount,resultScale,currentScale) = fraction(amount, resultScale, currentScale)
140140
141141
142-func calculatePriceBigInt (priceAssetLockedAmt,amountAssetlLockedAmt) = {
143- let priceBigInt = fraction(toBigInt(priceAssetLockedAmt), scale18, toBigInt(amountAssetlLockedAmt))
144- toInt(fraction(priceBigInt, toBigInt(scale8), scale18))
145- }
146-
147-
148142 func calculatePrice (priceAssetLockedAmt,amountAssetlLockedAmt) = fraction(priceAssetLockedAmt, scale8, amountAssetlLockedAmt)
149143
150144
151145 func privateCalculatePrice (amoutAssetDecimals,priceAssetDecimals,amountAssetAmt,priceAssetAmt) = {
152146 let amountAssetAmtCasted = privateCastToScaleOf(amountAssetAmt, scale8, amoutAssetDecimals)
153147 let priceAssetAmtCasted = privateCastToScaleOf(priceAssetAmt, scale8, priceAssetDecimals)
154148 calculatePrice(priceAssetAmtCasted, amountAssetAmtCasted)
155149 }
156150
157151
158152 func privateGetAccountBalance (assetId) = if ((assetId == "WAVES"))
159153 then wavesBalance(this).available
160154 else assetBalance(this, fromBase58String(assetId))
161155
162156
163157 func calculatePrices (amountAssetAmt,priceAssetAmt,lpAmount) = {
164158 let poolConfigDataList = getPoolConfig()
165159 let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
166160 let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
167161 let poolPrice = privateCalculatePrice(amoutAssetDecimals, priceAssetDecimals, amountAssetAmt, priceAssetAmt)
168162 let amountAssetPoolLockedAmt = privateCastToScaleOf(amountAssetAmt, scale8, amoutAssetDecimals)
169163 let priceAssetPoolLockedAmt = privateCastToScaleOf(priceAssetAmt, scale8, priceAssetDecimals)
170164 let lpPriceInAmountAsset = calculatePrice(amountAssetPoolLockedAmt, lpAmount)
171165 let lpPriceInPriceAsset = calculatePrice(priceAssetPoolLockedAmt, lpAmount)
172166 [poolPrice, lpPriceInAmountAsset, lpPriceInPriceAsset]
173167 }
174168
175169
176170 func privateEstimateGetOperation (paymentLpAssetId,paymentLpAmount,userAddress) = {
177171 let poolConfigList = getPoolConfig()
178172 let lpAssetId = poolConfigList[idxPoolLPAssetId]
179173 let amountAssetId = poolConfigList[idxAmountAssetId]
180174 let priceAssetId = poolConfigList[idxPriceAssetId]
181175 let amountAssetInternalId = poolConfigList[idxAmountAssetInternalId]
182176 let priceAssetInternalId = poolConfigList[idxPriceAssetInternalId]
183177 let amoutAssetDecimals = parseIntValue(poolConfigList[idxAmountAssetDecimals])
184178 let priceAssetDecimals = parseIntValue(poolConfigList[idxPriceAssetDecimals])
185179 let poolStatus = poolConfigList[idxPoolStatus]
186180 let userLiquidityList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress)
187181 let userLPBalance = parseIntValue(userLiquidityList[idxPoolLPAssetAmt])
188182 let userAmountAssetBalance = parseIntValue(userLiquidityList[idxPoolAmountAssetAmt])
189183 let userPriceAssetBalance = parseIntValue(userLiquidityList[idxPoolPriceAssetAmt])
190184 let poolLiquidityList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
191185 let poolLPBalance = parseIntValue(poolLiquidityList[idxPoolLPAssetAmt])
192186 let poolAmountAssetBalance = parseIntValue(poolLiquidityList[idxPoolAmountAssetAmt])
193187 let poolPriceAssetBalance = parseIntValue(poolLiquidityList[idxPoolPriceAssetAmt])
194188 if ((lpAssetId != paymentLpAssetId))
195189 then throw("Invalid asset passed.")
196190 else {
197191 let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
198192 let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
199193 let amountAssetPoolLockedAmt = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals)
200194 let priceAssetPoolLockedAmt = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals)
201195 let outAmountAssetAmt = fraction(amountAssetPoolLockedAmt, paymentLpAmount, poolLPBalance)
202196 let outPriceAssetAmt = fraction(priceAssetPoolLockedAmt, paymentLpAmount, poolLPBalance)
203197 let outAmountAssetAmtFinal = privateCastToScaleOf(outAmountAssetAmt, amoutAssetDecimals, scale8)
204198 let outPriceAssetAmtFinal = privateCastToScaleOf(outPriceAssetAmt, priceAssetDecimals, scale8)
205199 let currentPrice = calculatePrice(priceAssetPoolLockedAmt, amountAssetPoolLockedAmt)
206200 $Tuple14(outAmountAssetAmtFinal, outPriceAssetAmtFinal, amountAssetInternalId, priceAssetInternalId, userAmountAssetBalance, amountAssetId, userPriceAssetBalance, priceAssetId, userLPBalance, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, currentPrice, poolStatus)
207201 }
208202 }
209203
210204
211-func privateEstimatePutOperation (slippageTolerance,inAmountAssetAmt,inAmountAssetId,inPriceAssetAmt,inPriceAssetId,userAddress) = {
205+func privateEstimatePutOperation (slippageTolerance,inAmountAssetAmt,inAmountAssetId,inPriceAssetAmt,inPriceAssetId,userAddress,isEvaluate) = {
212206 let poolConfigDataList = getPoolConfig()
213207 let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
214208 let amountAssetId = poolConfigDataList[idxAmountAssetId]
215209 let priceAssetId = poolConfigDataList[idxPriceAssetId]
216210 let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
217211 let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
218212 let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
219213 let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
220214 let poolStatus = poolConfigDataList[idxPoolStatus]
221215 let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
222216 let poolAmountAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolAmountAssetAmt])
223217 let poolPriceAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolPriceAssetAmt])
224218 let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
225219 let userLiquidityDataList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress)
226220 let userAmountAssetBalance = parseIntValue(userLiquidityDataList[idxPoolAmountAssetAmt])
227221 let userPriceAssetBalance = parseIntValue(userLiquidityDataList[idxPoolPriceAssetAmt])
228222 let userLPBalance = parseIntValue(userLiquidityDataList[idxPoolLPAssetAmt])
229223 if (if ((amountAssetId != inAmountAssetId))
230224 then true
231225 else (priceAssetId != inPriceAssetId))
232226 then throw("Invalid amount or price asset passed.")
233227 else {
234- let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
235- let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
228+ let accountAmountAssetBalance = if (isEvaluate)
229+ then privateGetAccountBalance(amountAssetId)
230+ else (privateGetAccountBalance(amountAssetId) - inAmountAssetAmt)
231+ let accountPriceAssetBalance = if (isEvaluate)
232+ then privateGetAccountBalance(priceAssetId)
233+ else (privateGetAccountBalance(priceAssetId) - inPriceAssetAmt)
236234 let inAmountAssetAmtCalculated = privateCastToScaleOf(inAmountAssetAmt, scale8, amoutAssetDecimals)
237235 let inPriceAssetAmtCalculated = privateCastToScaleOf(inPriceAssetAmt, scale8, priceAssetDecimals)
238236 let userPrice = calculatePrice(inPriceAssetAmtCalculated, inAmountAssetAmtCalculated)
239237 let amountAssetPoolLockedAmt = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals)
240238 let priceAssetPoolLockedAmt = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals)
241239 let curentPrice = if ((poolLPBalance == 0))
242240 then 0
243241 else calculatePrice(priceAssetPoolLockedAmt, amountAssetPoolLockedAmt)
244242 let slippage = if ((curentPrice == 0))
245243 then 0
246244 else if ((curentPrice > userPrice))
247245 then fraction((curentPrice - userPrice), 100, curentPrice)
248246 else fraction((userPrice - curentPrice), 100, curentPrice)
249247 if (if ((curentPrice != 0))
250248 then ((slippage * scale8) > slippageTolerance)
251249 else false)
252250 then throw(((("Price slippage " + toString((slippage * scale8))) + " exceeded the passed limit of ") + toString(slippageTolerance)))
253251 else {
254252 let finalPrice = calculatePrice((priceAssetPoolLockedAmt + inPriceAssetAmtCalculated), (amountAssetPoolLockedAmt + inAmountAssetAmtCalculated))
255253 let outLpAmount = if ((poolLPBalance == 0))
256254 then {
257255 let partA = pow(inAmountAssetAmtCalculated, 0, 5, 1, 0, DOWN)
258256 let partB = pow(inPriceAssetAmtCalculated, 0, 5, 1, 0, DOWN)
259257 (partA * partB)
260258 }
261259 else {
262260 let lpAmtByAmountAsset = fraction(poolLPBalance, inAmountAssetAmtCalculated, amountAssetPoolLockedAmt)
263261 let lpAmtByPriceAsset = fraction(poolLPBalance, inPriceAssetAmtCalculated, priceAssetPoolLockedAmt)
264- if ((lpAmtByPriceAsset > lpAmtByAmountAsset))
265- then lpAmtByAmountAsset
266- else lpAmtByPriceAsset
262+ if (true)
263+ then throw(((((((((((((("poolLPBalance=" + toString(poolLPBalance)) + " inAmountAssetAmtCalculated=") + toString(inAmountAssetAmtCalculated)) + " inPriceAssetAmtCalculated=") + toString(inPriceAssetAmtCalculated)) + " amountAssetPoolLockedAmt = ") + toString(amountAssetPoolLockedAmt)) + " priceAssetPoolLockedAmt=") + toString(priceAssetPoolLockedAmt)) + " lpAmtByAmountAsset =") + toString(lpAmtByAmountAsset)) + " lpAmtByPriceAsset=") + toString(lpAmtByPriceAsset)))
264+ else if ((lpAmtByPriceAsset > lpAmtByAmountAsset))
265+ then lpAmtByAmountAsset
266+ else lpAmtByPriceAsset
267267 }
268268 $Tuple13(outLpAmount, finalPrice, userAmountAssetBalance, userPriceAssetBalance, userLPBalance, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, amountAssetInternalId, priceAssetInternalId, lpAssetId, slippage, poolStatus)
269269 }
270270 }
271271 }
272272
273273
274274 func validateMatcherOrderAllowed (order) = {
275275 let poolConfigDataList = getPoolConfig()
276276 let amountAssetId = poolConfigDataList[idxAmountAssetId]
277277 let priceAssetId = poolConfigDataList[idxPriceAssetId]
278278 let poolStatus = parseIntValue(poolConfigDataList[idxPoolStatus])
279279 let matcherPublicKeyStr = poolConfigDataList[idxMatcherPublicKey]
280280 let amountAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
281281 let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
282282 let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
283283 let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
284284 let currentPrice = if ((order.orderType == Buy))
285285 then privateCalculatePrice(amountAssetDecimals, priceAssetDecimals, (accountAmountAssetBalance + order.amount), accountPriceAssetBalance)
286286 else privateCalculatePrice(amountAssetDecimals, priceAssetDecimals, (accountAmountAssetBalance + order.amount), accountPriceAssetBalance)
287287 let isPoolStatusValid = if (if (if (isGlobalShutdown())
288288 then true
289289 else (poolStatus == PoolMatcherDisabled))
290290 then true
291291 else (poolStatus == PoolShutdown))
292292 then false
293293 else true
294294 let isValidMatcherSign = true
295295 let orderAmountAsset = order.assetPair.amountAsset
296296 let orderAmountAssetStr = if ((orderAmountAsset == unit))
297297 then "WAVES"
298298 else toBase58String(value(orderAmountAsset))
299299 let orderPriceAsset = order.assetPair.priceAsset
300300 let orderPriceAssetStr = if ((orderPriceAsset == unit))
301301 then "WAVES"
302302 else toBase58String(value(orderPriceAsset))
303303 let isValidAssetPair = if (if ((orderAmountAssetStr != amountAssetId))
304304 then true
305305 else (orderPriceAssetStr != priceAssetId))
306306 then false
307307 else true
308308 let orderPrice = order.price
309309 let priceDecimals = fraction(scale8, priceAssetDecimals, amountAssetDecimals)
310310 let castedOrderPrice = privateCastToScaleOf(orderPrice, scale8, priceDecimals)
311311 let isOrderPriceValid = if ((order.orderType == Buy))
312312 then (currentPrice >= castedOrderPrice)
313313 else (castedOrderPrice >= currentPrice)
314-[if (if (if (isValidAssetPair)
314+ if (if (if (isValidAssetPair)
315315 then isValidMatcherSign
316316 else false)
317317 then isPoolStatusValid
318318 else false)
319319 then isOrderPriceValid
320- else false]
320+ else false
321321 }
322322
323323
324324 @Callable(i)
325325 func put (slippageTolerance,shouldAutoStake) = {
326326 let factoryConfigList = getFactoryConfig()
327327 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfigList[idxFactoryStakingContract]), "Error. Incorrect staking address.")
328328 let pmtAmountAsset = value(i.payments[0])
329329 let inAmountAssetAmt = pmtAmountAsset.amount
330330 let inAmountAssetId = if (!(isDefined(pmtAmountAsset.assetId)))
331331 then fromBase58String("WAVES")
332332 else value(pmtAmountAsset.assetId)
333333 let pmtPriceAsset = value(i.payments[1])
334334 let inPriceAssetAmt = pmtPriceAsset.amount
335335 let inPriceAssetId = if (!(isDefined(pmtPriceAsset.assetId)))
336336 then fromBase58String("WAVES")
337337 else value(pmtPriceAsset.assetId)
338- let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, toBase58String(inAmountAssetId), inPriceAssetAmt, toBase58String(inPriceAssetId), toString(i.caller))
338+ let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, toBase58String(inAmountAssetId), inPriceAssetAmt, toBase58String(inPriceAssetId), toString(i.caller), false)
339339 let outLpAmount = estimatedPutResults._1
340340 let curentPrice = estimatedPutResults._2
341341 let userAmountAssetBalance = estimatedPutResults._3
342342 let userPriceAssetBalance = estimatedPutResults._4
343343 let userLPBalance = estimatedPutResults._5
344344 let poolAmountAssetBalance = estimatedPutResults._6
345345 let poolPriceAssetBalance = estimatedPutResults._7
346346 let poolLPBalance = estimatedPutResults._8
347347 let amountAssetInternalId = estimatedPutResults._9
348348 let priceAssetInternalId = estimatedPutResults._10
349349 let lpAssetId = estimatedPutResults._11
350350 let slippageCalculated = estimatedPutResults._12
351351 let poolStatus = parseIntValue(estimatedPutResults._13)
352352 if (if (if (isGlobalShutdown())
353353 then true
354354 else (poolStatus == PoolPutDisabled))
355355 then true
356356 else (poolStatus == PoolShutdown))
357357 then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus)))
358358 else {
359359 let emitLPAssetOnFactory = invoke(factoryContract, "emit", [outLpAmount], nil)
360360 if ((emitLPAssetOnFactory == emitLPAssetOnFactory))
361361 then if ((emitLPAssetOnFactory != "success"))
362362 then throw("LP asset reissue failed during emit call on factory.")
363363 else {
364364 let results = [StringEntry(keyPriceLast(), ("%s__" + toString(curentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(curentPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, outLpAmount, curentPrice, slippageTolerance, slippageCalculated, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance + inAmountAssetAmt), (userPriceAssetBalance + inPriceAssetAmt), (userLPBalance + outLpAmount))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance + inAmountAssetAmt), (poolPriceAssetBalance + inPriceAssetAmt), (poolLPBalance + outLpAmount)))]
365365 if (shouldAutoStake)
366366 then {
367367 let stake = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, outLpAmount)])
368368 if ((stake == stake))
369369 then results
370370 else throw("Strict value is not equal to itself.")
371371 }
372372 else (results :+ ScriptTransfer(i.caller, outLpAmount, lpAssetId))
373373 }
374374 else throw("Strict value is not equal to itself.")
375375 }
376376 }
377377
378378
379379
380380 @Callable(i)
381381 func get () = {
382382 let pmtAmountAsset = value(i.payments[0])
383383 let pmtAssetId = value(pmtAmountAsset.assetId)
384384 let pmtAssetAmount = pmtAmountAsset.amount
385385 let results = privateEstimateGetOperation(toBase58String(pmtAssetId), pmtAssetAmount, toString(i.caller))
386386 let outAmountAssetAmt = results._1
387387 let outPriceAssetAmt = results._2
388388 let amountAssetInternalId = results._3
389389 let priceAssetInternalId = results._4
390390 let userAmountAssetBalance = results._5
391391 let amountAssetId = results._6
392392 let userPriceAssetBalance = results._7
393393 let priceAssetId = results._8
394394 let userLPBalance = results._9
395395 let poolAmountAssetBalance = results._10
396396 let poolPriceAssetBalance = results._11
397397 let poolLPBalance = results._12
398398 let currentPrice = results._13
399399 let poolStatus = parseIntValue(results._14)
400400 if (if (isGlobalShutdown())
401401 then true
402402 else (poolStatus == PoolShutdown))
403403 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
404404 else {
405405 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAssetAmount], [AttachedPayment(pmtAssetId, pmtAssetAmount)])
406406 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
407407 then if ((burnLPAssetOnFactory != "success"))
408408 then throw("LP asset burn failed during emit call on factory.")
409409 else [ScriptTransfer(i.caller, outAmountAssetAmt, if ((amountAssetId == "WAVES"))
410410 then unit
411411 else fromBase58String(amountAssetId)), ScriptTransfer(i.caller, outPriceAssetAmt, fromBase58String(priceAssetId)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance - outAmountAssetAmt), (userPriceAssetBalance - outPriceAssetAmt), (userLPBalance - pmtAssetAmount))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance - outAmountAssetAmt), (poolPriceAssetBalance - outPriceAssetAmt), (poolLPBalance - pmtAssetAmount))), StringEntry(keyGetActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataGetActionInfo(outAmountAssetAmt, outPriceAssetAmt, pmtAssetAmount, currentPrice, height, lastBlock.timestamp)), StringEntry(keyPriceLast(), ("%s__" + toString(currentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPrice)))]
412412 else throw("Strict value is not equal to itself.")
413413 }
414414 }
415415
416416
417417
418418 @Callable(i)
419419 func activate (amountAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
420420 then throw("permissions denied")
421421 else $Tuple2([StringEntry(keyAmountAsset(), amountAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success")
422422
423423
424424
425425 @Callable(i)
426426 func statsREADONLY () = {
427427 let poolConfigDataList = getPoolConfig()
428428 let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
429429 let amountAssetId = poolConfigDataList[idxAmountAssetId]
430430 let priceAssetId = poolConfigDataList[idxPriceAssetId]
431431 let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
432432 let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
433433 let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
434434 let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
435435 let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
436436 let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
437437 let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
438438 let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
439439 let pricesList = calculatePrices(accountAmountAssetBalance, accountPriceAssetBalance, poolLPBalance)
440440 let currentPrice = pricesList[0]
441441 let lpPriceInAmountAsset = pricesList[1]
442442 let lpPriceInPriceAsset = pricesList[2]
443443 let poolWeight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeight(toString(this))), "Pool doesn't have weight.")
444444 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accountAmountAssetBalance), toString(accountPriceAssetBalance), toString(poolLPBalance), toString(currentPrice), toString(lpPriceInAmountAsset), toString(lpPriceInPriceAsset), toString(poolWeight)], SEP))
445445 }
446446
447447
448448
449449 @Callable(i)
450450 func evaluatePutByAmountAssetREADONLY (slippageTolerance,inAmountAssetAmt,userAddress) = {
451451 let poolConfigDataList = getPoolConfig()
452452 let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
453453 let amountAssetId = poolConfigDataList[idxAmountAssetId]
454454 let priceAssetId = poolConfigDataList[idxPriceAssetId]
455455 let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
456456 let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
457457 let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
458458 let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
459459 let poolStatus = poolConfigDataList[idxPoolStatus]
460460 let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
461461 let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
462462 let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
463463 let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
464464 let accountAmountAssetBalanceCasted = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals)
465465 let accountPriceAssetBalanceCasted = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals)
466466 let curentPrice = if ((poolLPBalance == 0))
467467 then 0
468468 else calculatePrice(accountPriceAssetBalanceCasted, accountAmountAssetBalanceCasted)
469469 let inPriceAssetAmtCalculated = fraction(inAmountAssetAmt, curentPrice, scale8)
470470 let inPriceAssetAmt = privateCastToScaleOf(inPriceAssetAmtCalculated, priceAssetDecimals, scale8)
471- let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress)
471+ let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress, true)
472472 let outLpAmountCalc = estimatedPutResults._1
473473 let curentPriceCalc = estimatedPutResults._2
474474 let poolAmountAssetBalanceCalc = estimatedPutResults._6
475475 let poolPriceAssetBalanceCAlc = estimatedPutResults._7
476476 let poolLPBalanceCalc = estimatedPutResults._8
477477 let poolStatusCalc = parseIntValue(estimatedPutResults._13)
478478 $Tuple2(nil, makeString(["%d%d%d%d%d%d", toString(outLpAmountCalc), toString(curentPrice), toString(poolAmountAssetBalanceCalc), toString(poolPriceAssetBalanceCAlc), toString(poolLPBalanceCalc), toString(poolStatusCalc)], SEP))
479479 }
480480
481481
482482
483483 @Callable(i)
484484 func evaluatePutByPriceAssetREADONLY (slippageTolerance,inPriceAssetAmt,userAddress) = {
485485 let poolConfigDataList = getPoolConfig()
486486 let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
487487 let amountAssetId = poolConfigDataList[idxAmountAssetId]
488488 let priceAssetId = poolConfigDataList[idxPriceAssetId]
489489 let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
490490 let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
491491 let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
492492 let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
493493 let poolStatus = poolConfigDataList[idxPoolStatus]
494494 let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
495495 let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
496496 let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId)
497497 let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId)
498498 let accountAmountAssetBalanceCasted = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals)
499499 let accountPriceAssetBalanceCasted = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals)
500500 let inPriceAssetAmtCalculatedTuple = privateCastToScaleOf(inPriceAssetAmt, scale8, priceAssetDecimals)
501501 let curentPrice = if ((poolLPBalance == 0))
502502 then 0
503503 else calculatePrice(accountPriceAssetBalanceCasted, accountAmountAssetBalanceCasted)
504504 let inAmountAssetAmtCalculated = fraction(inPriceAssetAmtCalculatedTuple, scale8, curentPrice)
505505 let inAmountAssetAmt = privateCastToScaleOf(inAmountAssetAmtCalculated, amoutAssetDecimals, scale8)
506- let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress)
506+ let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress, true)
507507 let outLpAmountCalc = estimatedPutResults._1
508508 let curentPriceCalc = estimatedPutResults._2
509509 let poolAmountAssetBalanceCalc = estimatedPutResults._6
510510 let poolPriceAssetBalanceCAlc = estimatedPutResults._7
511511 let poolLPBalanceCalc = estimatedPutResults._8
512512 let poolStatusCalc = parseIntValue(estimatedPutResults._13)
513513 $Tuple2(nil, makeString(["%d%d%d%d%d%d", toString(outLpAmountCalc), toString(curentPrice), toString(poolAmountAssetBalanceCalc), toString(poolPriceAssetBalanceCAlc), toString(poolLPBalanceCalc), toString(poolStatusCalc)], SEP))
514514 }
515515
516516
517517
518518 @Callable(i)
519519 func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmount,userAddress) = {
520520 let results = privateEstimateGetOperation(paymentLpAssetId, paymentLpAmount, userAddress)
521521 let outAmountAssetAmt = results._1
522522 let outPriceAssetAmt = results._2
523523 let poolAmountAssetBalance = results._10
524524 let poolPriceAssetBalance = results._11
525525 let poolLPBalance = results._12
526526 let currentPrice = results._13
527527 let poolStatus = parseIntValue(results._14)
528528 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmountAssetAmt), toString(outPriceAssetAmt), toString(poolAmountAssetBalance), toString(poolPriceAssetBalance), toString(poolLPBalance), toString(currentPrice), toString(poolStatus)], SEP))
529529 }
530530
531531
532532
533533 @Callable(i)
534534 func hashREADONLY () = $Tuple2(nil, toBase64String(value(scriptHash(this))))
535535
536536
537537 @Verifier(tx)
538538 func verify () = match tx {
539539 case order: Order =>
540540 true
541541 case _ =>
542542 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
543543 }
544544

github/deemru/w8io/026f985 
66.46 ms