tx · 4a438APKguMnigCvzEmrsyeq1KB7rxxAfRHvuvzzimr2

3PAph7xdg8VPNFdwaBnGBGSkGZ7Js9FB1h4:  -0.37000000 Waves

2022.11.25 20:46 [3398395] smart account 3PAph7xdg8VPNFdwaBnGBGSkGZ7Js9FB1h4 > SELF 0.00000000 Waves

{ "type": 13, "id": "4a438APKguMnigCvzEmrsyeq1KB7rxxAfRHvuvzzimr2", "fee": 37000000, "feeAssetId": null, "timestamp": 1669398423327, "version": 2, "chainId": 87, "sender": "3PAph7xdg8VPNFdwaBnGBGSkGZ7Js9FB1h4", "senderPublicKey": "4bu7KfUdw6VYG4bSXrmTRXDnFpikopM6Y9NZ1Mrba9Ag", "proofs": [ "5Pj78wZTeocjpfKDmwvTkJ4r4qDDnX7ezkGDQji9n5RbukxHyuTntboNcnVF7GSk8w9LLUxTZdJU9M7k7euHcPHH" ], "script": "base64:AAIFAAAAAAAAACgIAhIJCgcBAQEBAQgBEgASBAoCCAgSBAoCCAgSBAoCCAgSAwoBCBIAAAAAQAEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCIAAAABBQAAAANrZXkJAAEsAAAAAgkAASwAAAACAgAAAA9tYW5kYXRvcnkgdGhpcy4FAAAAA2tleQIAAAAPIGlzIG5vdCBkZWZpbmVkAAAAAANTRVACAAAAAl9fAAAAAAhCVUZTQ0FMRQkAATYAAAABAA3gtrOnZAAAAAAAAAZzY2FsZTgAAAAAAAX14QABAAAACHRocm93RXJyAAAAAQAAAANtc2cJAAACAAAAAQkABLkAAAACCQAETAAAAAICAAAACWlkby5yaWRlOgkABEwAAAACBQAAAANtc2cFAAAAA25pbAIAAAABIAEAAAAdY29udmVydFByaWNlQXNzZXRJbnRvSWRvQXNzZXQAAAAFAAAAEHByaWNlQXNzZXRBbW91bnQAAAAOcHJpY2VBc3NldE1VTFQAAAAFcHJpY2UAAAAJcHJpY2VNVUxUAAAADGlkb0Fzc2V0TVVMVAQAAAAPYlByaWNlQXNzZXRNVUxUCQABNgAAAAEFAAAADnByaWNlQXNzZXRNVUxUBAAAAA1iSWRvQXNzZXRNVUxUCQABNgAAAAEFAAAADGlkb0Fzc2V0TVVMVAQAAAAOYlByaWNlQXNzZXRCVUYJAAE8AAAAAwkAATYAAAABBQAAABBwcmljZUFzc2V0QW1vdW50BQAAAAhCVUZTQ0FMRQUAAAAPYlByaWNlQXNzZXRNVUxUBAAAAA9iQW1vdW50QXNzZXRCVUYJAAE8AAAAAwUAAAAOYlByaWNlQXNzZXRCVUYJAAE2AAAAAQUAAAAJcHJpY2VNVUxUCQABNgAAAAEFAAAABXByaWNlCQABoAAAAAEJAAE8AAAAAwUAAAAPYkFtb3VudEFzc2V0QlVGCQABNgAAAAEFAAAADGlkb0Fzc2V0TVVMVAUAAAAIQlVGU0NBTEUAAAAADklkeENmZ0lkb1N0YXJ0AAAAAAAAAAABAAAAABFJZHhDZmdJZG9EdXJhdGlvbgAAAAAAAAAAAgAAAAAQSWR4Q2ZnQ2xhaW1TdGFydAAAAAAAAAAAAwAAAAATSWR4Q2ZnQ2xhaW1EdXJhdGlvbgAAAAAAAAAABAAAAAALSWR4Q2ZnUHJpY2UAAAAAAAAAAAUAAAAAD0lkeENmZ1ByaWNlTXVsdAAAAAAAAAAABgAAAAAQSWR4Q2ZnSWRvQXNzZXRJZAAAAAAAAAAABwAAAAASSWR4Q2ZnSWRvQXNzZXRNdWx0AAAAAAAAAAAIAAAAABJJZHhDZmdQcmljZUFzc2V0SWQAAAAAAAAAAAkAAAAAFElkeENmZ1ByaWNlQXNzZXRNdWx0AAAAAAAAAAAKAAAAABVJZHhDZmdNaW5JbnZlc3RBbW91bnQAAAAAAAAAAAsBAAAADWZyb21hdENvbmZpZ1MAAAAMAAAACGlkb1N0YXJ0AAAAC2lkb0R1cmF0aW9uAAAACmNsYWltU3RhcnQAAAANY2xhaW1EdXJhdGlvbgAAAAVwcmljZQAAAAlwcmljZU11bHQAAAAMaWRvQXNzZXRJZDU4AAAADGlkb0Fzc2V0TXVsdAAAAA5wcmljZUFzc2V0SWQ1OAAAAA5wcmljZUFzc2V0TXVsdAAAAA9taW5JbnZlc3RBbW91bnQAAAATdG90YWxJZG9Bc3NldFRvU2VsbAkABLkAAAACCQAETAAAAAICAAAAGCVkJWQlZCVkJWQlZCVzJWQlcyVkJWQlZAkABEwAAAACBQAAAAhpZG9TdGFydAkABEwAAAACBQAAAAtpZG9EdXJhdGlvbgkABEwAAAACBQAAAApjbGFpbVN0YXJ0CQAETAAAAAIFAAAADWNsYWltRHVyYXRpb24JAARMAAAAAgUAAAAFcHJpY2UJAARMAAAAAgUAAAAJcHJpY2VNdWx0CQAETAAAAAIFAAAADGlkb0Fzc2V0SWQ1OAkABEwAAAACBQAAAAxpZG9Bc3NldE11bHQJAARMAAAAAgUAAAAOcHJpY2VBc3NldElkNTgJAARMAAAAAgUAAAAOcHJpY2VBc3NldE11bHQJAARMAAAAAgUAAAAPbWluSW52ZXN0QW1vdW50CQAETAAAAAIFAAAAE3RvdGFsSWRvQXNzZXRUb1NlbGwFAAAAA25pbAUAAAADU0VQAQAAAAxmcm9tYXRDb25maWcAAAAMAAAACGlkb1N0YXJ0AAAAC2lkb0R1cmF0aW9uAAAACmNsYWltU3RhcnQAAAANY2xhaW1EdXJhdGlvbgAAAAVwcmljZQAAAAlwcmljZU11bHQAAAAMaWRvQXNzZXRJZDU4AAAADGlkb0Fzc2V0TXVsdAAAAA5wcmljZUFzc2V0SWQ1OAAAAA5wcmljZUFzc2V0TXVsdAAAAA9taW5JbnZlc3RBbW91bnQAAAATdG90YWxJZG9Bc3NldFRvU2VsbAkBAAAADWZyb21hdENvbmZpZ1MAAAAMCQABpAAAAAEFAAAACGlkb1N0YXJ0CQABpAAAAAEFAAAAC2lkb0R1cmF0aW9uCQABpAAAAAEFAAAACmNsYWltU3RhcnQJAAGkAAAAAQUAAAANY2xhaW1EdXJhdGlvbgkAAaQAAAABBQAAAAVwcmljZQkAAaQAAAABBQAAAAlwcmljZU11bHQFAAAADGlkb0Fzc2V0SWQ1OAkAAaQAAAABBQAAAAxpZG9Bc3NldE11bHQFAAAADnByaWNlQXNzZXRJZDU4CQABpAAAAAEFAAAADnByaWNlQXNzZXRNdWx0CQABpAAAAAEFAAAAD21pbkludmVzdEFtb3VudAkAAaQAAAABBQAAABN0b3RhbElkb0Fzc2V0VG9TZWxsAAAAABFJZHhJbnZUb3RhbEFtb3VudAAAAAAAAAAAAQAAAAAVSWR4SW52UmVtYWluaW5nQW1vdW50AAAAAAAAAAACAAAAAB1JZHhJbnZDbGFpbWVkUHJpY2VBc3NldEFtb3VudAAAAAAAAAAAAwAAAAAbSWR4SW52Q2xhaW1lZElkb0Fzc2V0QW1vdW50AAAAAAAAAAAEAAAAABdJZHhJbnZMYXN0Q2xhaW1lZEhlaWdodAAAAAAAAAAABQEAAAAPZm9ybWF0SW52ZXN0b3JTAAAABQAAAAt0b3RhbEFtb3VudAAAAA9yZW1haW5pbmdBbW91bnQAAAAXY2xhaW1lZFByaWNlQXNzZXRBbW91bnQAAAAVY2xhaW1lZElkb0Fzc2V0QW1vdW50AAAAEWxhc3RDbGFpbWVkSGVpZ2h0CQAEuQAAAAIJAARMAAAAAgIAAAAKJWQlZCVkJWQlZAkABEwAAAACBQAAAAt0b3RhbEFtb3VudAkABEwAAAACBQAAAA9yZW1haW5pbmdBbW91bnQJAARMAAAAAgUAAAAXY2xhaW1lZFByaWNlQXNzZXRBbW91bnQJAARMAAAAAgUAAAAVY2xhaW1lZElkb0Fzc2V0QW1vdW50CQAETAAAAAIFAAAAEWxhc3RDbGFpbWVkSGVpZ2h0BQAAAANuaWwFAAAAA1NFUAEAAAAOZm9ybWF0SW52ZXN0b3IAAAAFAAAAC3RvdGFsQW1vdW50AAAAD3JlbWFpbmluZ0Ftb3VudAAAABdjbGFpbWVkUHJpY2VBc3NldEFtb3VudAAAABVjbGFpbWVkSWRvQXNzZXRBbW91bnQAAAARbGFzdENsYWltZWRIZWlnaHQJAQAAAA9mb3JtYXRJbnZlc3RvclMAAAAFCQABpAAAAAEFAAAAC3RvdGFsQW1vdW50CQABpAAAAAEFAAAAD3JlbWFpbmluZ0Ftb3VudAkAAaQAAAABBQAAABdjbGFpbWVkUHJpY2VBc3NldEFtb3VudAkAAaQAAAABBQAAABVjbGFpbWVkSWRvQXNzZXRBbW91bnQJAAGkAAAAAQUAAAARbGFzdENsYWltZWRIZWlnaHQBAAAAE2Zvcm1hdEhpc3RvcnlSZWNvcmQAAAACAAAAEHByaWNlQXNzZXRBbW91bnQAAAAOaWRvQXNzZXRBbW91bnQJAAS5AAAAAgkABEwAAAACAgAAAAglZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAABmhlaWdodAkABEwAAAACCQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAAGkAAAAAQUAAAAQcHJpY2VBc3NldEFtb3VudAkABEwAAAACCQABpAAAAAEFAAAADmlkb0Fzc2V0QW1vdW50BQAAAANuaWwFAAAAA1NFUAEAAAAJa2V5Q29uZmlnAAAAAAIAAAAKJXNfX2NvbmZpZwEAAAALa2V5SW52ZXN0b3IAAAABAAAAC3VzZXJBZGRyZXNzCQABLAAAAAICAAAABCVzX18FAAAAC3VzZXJBZGRyZXNzAQAAAAlrZXlUb3RhbHMAAAAAAgAAAAolc19fdG90YWxzAQAAABlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkAAAAAwAAAAR0eXBlAAAAC3VzZXJBZGRyZXNzAAAABnR4SWQ1OAkABLkAAAACCQAETAAAAAICAAAAESVzJXMlcyVzX19oaXN0b3J5CQAETAAAAAIFAAAABHR5cGUJAARMAAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgUA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ZXkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAIAAAAbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQAAAA9yZWFkQ29uZmlnQXJyYXkAAAAACQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABCQEAAAAJa2V5Q29uZmlnAAAAAAUAAAADU0VQAQAAACNyZWFkVG90YWxzQXJyYXlPckRlZmF1bHRCeUN1c3RvbUtleQAAAAEAAAAJY3VzdG9tS2V5CQAEtQAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQiAAAAAQUAAAAJY3VzdG9tS2V5CQEAAAAPZm9ybWF0SW52ZXN0b3JTAAAABQIAAAABMAIAAAABMAIAAAABMAIAAAABMAIAAAABMAUAAAADU0VQAQAAABhyZWFkVG90YWxzQXJyYXlPckRlZmF1bHQAAAAACQEAAAAjcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0QnlDdXN0b21LZXkAAAABCQEAAAAJa2V5VG90YWxzAAAAAAEAAAAacmVhZEludmVzdG9yQXJyYXlPckRlZmF1bHQAAAABAAAAC3VzZXJBZGRyZXNzCQEAAAAjcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0QnlDdXN0b21LZXkAAAABCQEAAAALa2V5SW52ZXN0b3IAAAABBQAAAAt1c2VyQWRkcmVzcwEAAAAXcmVhZEludmVzdG9yQXJyYXlPckZhaWwAAAABAAAAC3VzZXJBZGRyZXNzCQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABCQEAAAALa2V5SW52ZXN0b3IAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAADU0VQAAAAABVJZHhEaWZmVG90YWxJbmNyZW1lbnQAAAAAAAAAAAAAAAAAJElkeERpZmZSZW1haW5pbmdQcmljZUFtb3VudEluY3JlbWVudAAAAAAAAAAAAQAAAAAiSWR4RGlmZkNsYWltZWRQcmljZUFtb3VudEluY3JlbWVudAAAAAAAAAAAAgAAAAAlSWR4RGlmZkNsYWltZWRJZG9Bc3NldEFtb3VudEluY3JlbWVudAAAAAAAAAAAAwEAAAALVG90YWxzRW50cnkAAAAFAAAAA2tleQAAAAlvcmlnQXJyYXkAAAANaW5jcmVtZW50RGlmZgAAABRuZXdMYXN0Q2xhaW1lZEhlaWdodAAAABFwcmljZUFzc2V0QmFsYW5jZQQAAAALdG90YWxBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAlvcmlnQXJyYXkFAAAAEUlkeEludlRvdGFsQW1vdW50BAAAAA9yZW1haW5pbmdBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAlvcmlnQXJyYXkFAAAAFUlkeEludlJlbWFpbmluZ0Ftb3VudAQAAAAXY2xhaW1lZFByaWNlQXNzZXRBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAlvcmlnQXJyYXkFAAAAHUlkeEludkNsYWltZWRQcmljZUFzc2V0QW1vdW50BAAAABVjbGFpbWVkSWRvQXNzZXRBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAlvcmlnQXJyYXkFAAAAG0lkeEludkNsYWltZWRJZG9Bc3NldEFtb3VudAQAAAARbGFzdENsYWltZWRIZWlnaHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAlvcmlnQXJyYXkFAAAAF0lkeEludkxhc3RDbGFpbWVkSGVpZ2h0BAAAAA5uZXdUb3RhbEFtb3VudAkAAGQAAAACBQAAAAt0b3RhbEFtb3VudAkAAZEAAAACBQAAAA1pbmNyZW1lbnREaWZmBQAAABVJZHhEaWZmVG90YWxJbmNyZW1lbnQEAAAAEm5ld1JlbWFpbmluZ0Ftb3VudAkAAGQAAAACBQAAAA9yZW1haW5pbmdBbW91bnQJAAGRAAAAAgUAAAANaW5jcmVtZW50RGlmZgUAAAAkSWR4RGlmZlJlbWFpbmluZ1ByaWNlQW1vdW50SW5jcmVtZW50BAAAAAhjZmdBcnJheQkBAAAAD3JlYWRDb25maWdBcnJheQAAAAAEAAAADnByaWNlQXNzZXRJZDU4CQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABJJZHhDZmdQcmljZUFzc2V0SWQEAAAAEnByaWNlQXNzZXREZWNpbWFscwgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQkAAlkAAAABBQAAAA5wcmljZUFzc2V0SWQ1OAAAAAhkZWNpbWFscwQAAAAjcHJpY2VBc3NldEJhbGFuY2VQcmljZUFzc2V0RGVjaW1hbHMJAABrAAAAAwUAAAARcHJpY2VBc3NldEJhbGFuY2UFAAAABnNjYWxlOAkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAABQAAABJwcmljZUFzc2V0RGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04EAAAAGm5ld0NsYWltZWRQcmljZUFzc2V0QW1vdW50CQAAZQAAAAIJAABkAAAAAgUAAAAXY2xhaW1lZFByaWNlQXNzZXRBbW91bnQJAAGRAAAAAgUAAAANaW5jcmVtZW50RGlmZgUAAAAiSWR4RGlmZkNsYWltZWRQcmljZUFtb3VudEluY3JlbWVudAUAAAARcHJpY2VBc3NldEJhbGFuY2UEAAAAGG5ld0NsYWltZWRJZG9Bc3NldEFtb3VudAkAAGQAAAACCQAAZAAAAAIFAAAAFWNsYWltZWRJZG9Bc3NldEFtb3VudAkAAZEAAAACBQAAAA1pbmNyZW1lbnREaWZmBQAAACVJZHhEaWZmQ2xhaW1lZElkb0Fzc2V0QW1vdW50SW5jcmVtZW50BQAAACNwcmljZUFzc2V0QmFsYW5jZVByaWNlQXNzZXREZWNpbWFscwMJAABmAAAAAgAAAAAAAAAAAAUAAAASbmV3UmVtYWluaW5nQW1vdW50CQEAAAAIdGhyb3dFcnIAAAABCQAEuQAAAAIJAARMAAAAAgIAAAAMaW52YWxpZCBtYXRoCQAETAAAAAIJAAGkAAAAAQUAAAAPcmVtYWluaW5nQW1vdW50CQAETAAAAAIJAAGkAAAAAQkAAZEAAAACBQAAAA1pbmNyZW1lbnREaWZmBQAAACRJZHhEaWZmUmVtYWluaW5nUHJpY2VBbW91bnRJbmNyZW1lbnQJAARMAAAAAgkAAaQAAAABBQAAABJuZXdSZW1haW5pbmdBbW91bnQJAARMAAAAAgkAAaQAAAABCQABkQAAAAIFAAAADWluY3JlbWVudERpZmYFAAAAFUlkeERpZmZUb3RhbEluY3JlbWVudAUAAAADbmlsAgAAAAEgCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAANrZXkJAQAAAA5mb3JtYXRJbnZlc3RvcgAAAAUFAAAADm5ld1RvdGFsQW1vdW50BQAAABJuZXdSZW1haW5pbmdBbW91bnQFAAAAGm5ld0NsYWltZWRQcmljZUFzc2V0QW1vdW50BQAAABhuZXdDbGFpbWVkSWRvQXNzZXRBbW91bnQFAAAAFG5ld0xhc3RDbGFpbWVkSGVpZ2h0AQAAABtJbnZlc3RPcGVyYXRpb25IaXN0b3J5RW50cnkAAAAEAAAAC3VzZXJBZGRyZXNzAAAAEHByaWNlQXNzZXRBbW91bnQAAAAOaWRvQXNzZXRBbW91bnQAAAAEdHhJZAkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGWtleU9wZXJhdGlvbkhpc3RvcnlSZWNvcmQAAAADAgAAAAZpbnZlc3QFAAAAC3VzZXJBZGRyZXNzCQACWAAAAAEFAAAABHR4SWQJAQAAABNmb3JtYXRIaXN0b3J5UmVjb3JkAAAAAgUAAAAQcHJpY2VBc3NldEFtb3VudAUAAAAOaWRvQXNzZXRBbW91bnQBAAAAGkNsYWltT3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABAAAAAt1c2VyQWRkcmVzcwAAABBwcmljZUFzc2V0QW1vdW50AAAADmlkb0Fzc2V0QW1vdW50AAAABHR4SWQJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkAAAAAwIAAAAFY2xhaW0FAAAAC3VzZXJBZGRyZXNzCQACWAAAAAEFAAAABHR4SWQJAQAAABNmb3JtYXRIaXN0b3J5UmVjb3JkAAAAAgUAAAAQcHJpY2VBc3NldEFtb3VudAUAAAAOaWRvQXNzZXRBbW91bnQBAAAADWludGVybmFsQ2xhaW0AAAADAAAAEGNsYWltZWRBc3NldElkNTgAAAALdXNlckFkZHJlc3MAAAAEdHhJZAQAAAAIY2ZnQXJyYXkJAQAAAA9yZWFkQ29uZmlnQXJyYXkAAAAABAAAAApjbGFpbVN0YXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAEElkeENmZ0NsYWltU3RhcnQEAAAADWNsYWltRHVyYXRpb24JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAATSWR4Q2ZnQ2xhaW1EdXJhdGlvbgQAAAAIY2xhaW1FbmQJAABkAAAAAgUAAAAKY2xhaW1TdGFydAUAAAANY2xhaW1EdXJhdGlvbgQAAAAFcHJpY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAALSWR4Q2ZnUHJpY2UEAAAACXByaWNlTXVsdAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAAA9JZHhDZmdQcmljZU11bHQEAAAADGlkb0Fzc2V0SWQ1OAkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAQSWR4Q2ZnSWRvQXNzZXRJZAQAAAAKaWRvQXNzZXRJZAkAAlkAAAABBQAAAAxpZG9Bc3NldElkNTgEAAAADGlkb0Fzc2V0TXVsdAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABJJZHhDZmdJZG9Bc3NldE11bHQEAAAADnByaWNlQXNzZXRJZDU4CQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABJJZHhDZmdQcmljZUFzc2V0SWQEAAAADHByaWNlQXNzZXRJZAkAAlkAAAABBQAAAA5wcmljZUFzc2V0SWQ1OAQAAAAOcHJpY2VBc3NldE11bHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAUSWR4Q2ZnUHJpY2VBc3NldE11bHQEAAAADXVzZXJBZGRyZXNzNTgJAAQlAAAAAQUAAAALdXNlckFkZHJlc3MEAAAAD29yaWdJbnZlc3RBcnJheQkBAAAAF3JlYWRJbnZlc3RvckFycmF5T3JGYWlsAAAAAQUAAAANdXNlckFkZHJlc3M1OAQAAAARaW52ZXN0VG90YWxBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA9vcmlnSW52ZXN0QXJyYXkFAAAAEUlkeEludlRvdGFsQW1vdW50BAAAABppbnZlc3RMYXN0Q2xhaW1lZEhlaWdodFRNUAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD29yaWdJbnZlc3RBcnJheQUAAAAXSWR4SW52TGFzdENsYWltZWRIZWlnaHQEAAAAF2ludmVzdExhc3RDbGFpbWVkSGVpZ2h0AwkAAGcAAAACBQAAAApjbGFpbVN0YXJ0BQAAABppbnZlc3RMYXN0Q2xhaW1lZEhlaWdodFRNUAUAAAAKY2xhaW1TdGFydAUAAAAaaW52ZXN0TGFzdENsYWltZWRIZWlnaHRUTVAEAAAAFG5ld0NsYWltUGVyaW9kSGVpZ2h0AwkAAGYAAAACBQAAAAZoZWlnaHQFAAAACGNsYWltRW5kBQAAAAhjbGFpbUVuZAMJAABmAAAAAgUAAAAKY2xhaW1TdGFydAUAAAAGaGVpZ2h0BQAAAApjbGFpbVN0YXJ0BQAAAAZoZWlnaHQEAAAADmNsYWltaW5nQmxvY2tzCQAAZQAAAAIFAAAAFG5ld0NsYWltUGVyaW9kSGVpZ2h0BQAAABdpbnZlc3RMYXN0Q2xhaW1lZEhlaWdodAQAAAAYY2xhaW1pbmdQcmljZUFzc2V0QW1vdW50CQAAawAAAAMFAAAAEWludmVzdFRvdGFsQW1vdW50BQAAAA5jbGFpbWluZ0Jsb2NrcwUAAAANY2xhaW1EdXJhdGlvbgQAAAAFZXJyb3IJAQAAAAh0aHJvd0VycgAAAAEJAAS5AAAAAgkABEwAAAACCQABpAAAAAEFAAAABmhlaWdodAkABEwAAAACCQABpAAAAAEFAAAACmNsYWltU3RhcnQJAARMAAAAAgkAAaQAAAABBQAAAAhjbGFpbUVuZAkABEwAAAACCQABpAAAAAEFAAAAFG5ld0NsYWltUGVyaW9kSGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAAXaW52ZXN0TGFzdENsYWltZWRIZWlnaHQJAARMAAAAAgkAAaQAAAABBQAAABFpbnZlc3RUb3RhbEFtb3VudAkABEwAAAACCQABpAAAAAEFAAAADmNsYWltaW5nQmxvY2tzCQAETAAAAAIJAAGkAAAAAQUAAAANY2xhaW1EdXJhdGlvbgkABEwAAAACCQABpAAAAAEFAAAAGGNsYWltaW5nUHJpY2VBc3NldEFtb3VudAUAAAADbmlsAgAAAAEgAwkAAAAAAAACBQAAAAVlcnJvcgUAAAAFZXJyb3IEAAAAFmNsYWltaW5nSWRvQXNzZXRBbW91bnQJAQAAAB1jb252ZXJ0UHJpY2VBc3NldEludG9JZG9Bc3NldAAAAAUFAAAAGGNsYWltaW5nUHJpY2VBc3NldEFtb3VudAUAAAAOcHJpY2VBc3NldE11bHQFAAAABXByaWNlBQAAAAlwcmljZU11bHQFAAAADGlkb0Fzc2V0TXVsdAQAAAAGaXNVU0ROCQAAAAAAAAIFAAAAEGNsYWltZWRBc3NldElkNTgFAAAADnByaWNlQXNzZXRJZDU4BAAAABNpc1VTRE5DbGFpbURpc2FibGVkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEIAAAAAEJAQAAABRrZXlVU0ROQ2xhaW1EaXNhYmxlZAAAAAAHBAAAAAZjaGVja3MJAARMAAAAAgMJAQAAAAEhAAAAAQMFAAAABmlzVVNETgUAAAATaXNVU0ROQ2xhaW1EaXNhYmxlZAcGCQAAAgAAAAECAAAAFlVTRE4gY2xhaW0gaXMgZGlzYWJsZWQFAAAAA25pbAMJAAAAAAAAAgUAAAAGY2hlY2tzBQAAAAZjaGVja3MDCQAAAAAAAAIFAAAAEGNsYWltZWRBc3NldElkNTgFAAAADnByaWNlQXNzZXRJZDU4CQAFGAAAAAYJAARMAAAAAgAAAAAAAAAAAAkABEwAAAACCQEAAAABLQAAAAEFAAAAGGNsYWltaW5nUHJpY2VBc3NldEFtb3VudAkABEwAAAACBQAAABhjbGFpbWluZ1ByaWNlQXNzZXRBbW91bnQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAABhjbGFpbWluZ1ByaWNlQXNzZXRBbW91bnQFAAAADHByaWNlQXNzZXRJZAUAAAAPb3JpZ0ludmVzdEFycmF5BQAAABRuZXdDbGFpbVBlcmlvZEhlaWdodAkABEwAAAACBQAAABhjbGFpbWluZ1ByaWNlQXNzZXRBbW91bnQJAARMAAAAAgUAAAAWY2xhaW1pbmdJZG9Bc3NldEFtb3VudAUAAAADbmlsAwkAAAAAAAACBQAAABBjbGFpbWVkQXNzZXRJZDU4BQAAAAxpZG9Bc3NldElkNTgJAAUYAAAABgkABEwAAAACAAAAAAAAAAAACQAETAAAAAIJAQAAAAEtAAAAAQUAAAAYY2xhaW1pbmdQcmljZUFzc2V0QW1vdW50CQAETAAAAAIAAAAAAAAAAAAJAARMAAAAAgUAAAAWY2xhaW1pbmdJZG9Bc3NldEFtb3VudAUAAAADbmlsBQAAABZjbGFpbWluZ0lkb0Fzc2V0QW1vdW50BQAAAAppZG9Bc3NldElkBQAAAA9vcmlnSW52ZXN0QXJyYXkFAAAAFG5ld0NsYWltUGVyaW9kSGVpZ2h0CQAETAAAAAIFAAAAGGNsYWltaW5nUHJpY2VBc3NldEFtb3VudAkABEwAAAACBQAAABZjbGFpbWluZ0lkb0Fzc2V0QW1vdW50BQAAAANuaWwJAAACAAAAAQkAASwAAAACAgAAABV1bnN1cHBvcnRlZCBhc3NldElkOiAFAAAAEGNsYWltZWRBc3NldElkNTgJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEAAAAPaW50ZXJuYWxDbGFpbVYyAAAABAAAAA5wcmljZUFzc2V0SWQ1OAAAAA11c2VyQWRkcmVzczU4AAAACW91dEFtb3VudAAAABl0b3RhbFVzZXJBdmFpbGFibGVUb0NsYWltBAAAAB50b3RhbFBlcmlvZFByaWNlQXNzZXRBbGxvd2FuY2UJAQAAAAV2YWx1ZQAAAAEJAAQfAAAAAQkBAAAAF2tleVRvdGFsUGVyaW9kQWxsb3dhbmNlAAAAAQUAAAAOcHJpY2VBc3NldElkNTgEAAAAHXVzZXJQZXJpb2RQcmljZUFzc2V0QWxsb3dhbmNlCQEAAAAFdmFsdWUAAAABCQAEHwAAAAEJAQAAABZrZXlVc2VyUGVyaW9kQWxsb3dhbmNlAAAAAQUAAAAOcHJpY2VBc3NldElkNTgEAAAADHBlcmlvZExlbmd0aAkBAAAABXZhbHVlAAAAAQkABB8AAAABCQEAAAAPa2V5UGVyaW9kTGVuZ3RoAAAAAAQAAAANY3VycmVudFBlcmlvZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB8AAAABCQEAAAAQa2V5Q3VycmVudFBlcmlvZAAAAAAAAAAAAAAAAAAEAAAAG3plcm9QZXJpb2RFbmRIZWlnaElzRGVmaW5lZAkBAAAACWlzRGVmaW5lZAAAAAEJAAQfAAAAAQkBAAAAEmtleVBlcmlvZEVuZEhlaWdodAAAAAEAAAAAAAAAAAAEAAAADSR0MDEyODU0MTQ3MjQDCQAAZgAAAAIFAAAADWN1cnJlbnRQZXJpb2QAAAAAAAAAAAAEAAAAFWxhc3RQZXJpb2RTdGFydEhlaWdodAkBAAAABXZhbHVlAAAAAQkABB8AAAABCQEAAAAUa2V5UGVyaW9kU3RhcnRIZWlnaHQAAAABBQAAAA1jdXJyZW50UGVyaW9kBAAAABNsYXN0UGVyaW9kRW5kSGVpZ2h0CQEAAAAFdmFsdWUAAAABCQAEHwAAAAEJAQAAABJrZXlQZXJpb2RFbmRIZWlnaHQAAAABBQAAAA1jdXJyZW50UGVyaW9kBAAAAA0kdDAxMzExNDEzODE5AwkAAGYAAAACBQAAAAZoZWlnaHQFAAAAE2xhc3RQZXJpb2RFbmRIZWlnaHQEAAAAFHVwZGF0ZWRDdXJyZW50UGVyaW9kCQAAZAAAAAIFAAAADWN1cnJlbnRQZXJpb2QAAAAAAAAAAAEEAAAAC3BlcmlvZFN0YXJ0AwkAAGYAAAACBQAAAAZoZWlnaHQJAABkAAAAAgUAAAATbGFzdFBlcmlvZEVuZEhlaWdodAUAAAAMcGVyaW9kTGVuZ3RoBAAAABdibG9ja3NUb0xhc3RQZXJpb2RTdGFydAkAAGoAAAACCQAAZQAAAAIFAAAABmhlaWdodAUAAAATbGFzdFBlcmlvZEVuZEhlaWdodAUAAAAMcGVyaW9kTGVuZ3RoAwkAAAAAAAACBQAAABdibG9ja3NUb0xhc3RQZXJpb2RTdGFydAAAAAAAAAAAAAkAAGQAAAACCQAAZQAAAAIFAAAABmhlaWdodAUAAAAMcGVyaW9kTGVuZ3RoAAAAAAAAAAABCQAAZQAAAAIFAAAABmhlaWdodAUAAAAXYmxvY2tzVG9MYXN0UGVyaW9kU3RhcnQJAABkAAAAAgUAAAATbGFzdFBlcmlvZEVuZEhlaWdodAAAAAAAAAAAAQQAAAAJcGVyaW9kRW5kCQAAZQAAAAIJAABkAAAAAgUAAAALcGVyaW9kU3RhcnQFAAAADHBlcmlvZExlbmd0aAAAAAAAAAAAAQkABRUAAAADBQAAABR1cGRhdGVkQ3VycmVudFBlcmlvZAUAAAALcGVyaW9kU3RhcnQFAAAACXBlcmlvZEVuZAkABRUAAAADBQAAAA1jdXJyZW50UGVyaW9kBQAAABVsYXN0UGVyaW9kU3RhcnRIZWlnaHQFAAAAE2xhc3RQZXJpb2RFbmRIZWlnaHQEAAAAFHVwZGF0ZWRDdXJyZW50UGVyaW9kCAUAAAANJHQwMTMxMTQxMzgxOQAAAAJfMQQAAAALcGVyaW9kU3RhcnQIBQAAAA0kdDAxMzExNDEzODE5AAAAAl8yBAAAAAlwZXJpb2RFbmQIBQAAAA0kdDAxMzExNDEzODE5AAAAAl8zCQAFFQAAAAMFAAAAFHVwZGF0ZWRDdXJyZW50UGVyaW9kBQAAAAtwZXJpb2RTdGFydAUAAAAJcGVyaW9kRW5kAwUAAAAbemVyb1BlcmlvZEVuZEhlaWdoSXNEZWZpbmVkBAAAABV6ZXJvUGVyaW9kU3RhcnRIZWlnaHQJAQAAAAV2YWx1ZQAAAAEJAAQfAAAAAQkBAAAAFGtleVBlcmlvZFN0YXJ0SGVpZ2h0AAAAAQAAAAAAAAAAAAQAAAATemVyb1BlcmlvZEVuZEhlaWdodAkBAAAABXZhbHVlAAAAAQkABB8AAAABCQEAAAASa2V5UGVyaW9kRW5kSGVpZ2h0AAAAAQAAAAAAAAAAAAQAAAANJHQwMTQwNzQxNDQ1NgMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAABN6ZXJvUGVyaW9kRW5kSGVpZ2h0BAAAABR1cGRhdGVkQ3VycmVudFBlcmlvZAkAAGQAAAACBQAAAA1jdXJyZW50UGVyaW9kAAAAAAAAAAABBAAAAAtwZXJpb2RTdGFydAkAAGQAAAACBQAAABN6ZXJvUGVyaW9kRW5kSGVpZ2h0AAAAAAAAAAABBAAAAAlwZXJpb2RFbmQJAABlAAAAAgkAAGQAAAACBQAAAAtwZXJpb2RTdGFydAUAAAAMcGVyaW9kTGVuZ3RoAAAAAAAAAAABCQAFFQAAAAMFAAAAFHVwZGF0ZWRDdXJyZW50UGVyaW9kBQAAAAtwZXJpb2RTdGFydAUAAAAJcGVyaW9kRW5kCQAFFQAAAAMFAAAADWN1cnJlbnRQZXJpb2QFAAAAFXplcm9QZXJpb2RTdGFydEhlaWdodAUAAAATemVyb1BlcmlvZEVuZEhlaWdodAQAAAAUdXBkYXRlZEN1cnJlbnRQZXJpb2QIBQAAAA0kdDAxNDA3NDE0NDU2AAAAAl8xBAAAAAtwZXJpb2RTdGFydAgFAAAADSR0MDE0MDc0MTQ0NTYAAAACXzIEAAAACXBlcmlvZEVuZAgFAAAADSR0MDE0MDc0MTQ0NTYAAAACXzMJAAUVAAAAAwUAAAAUdXBkYXRlZEN1cnJlbnRQZXJpb2QFAAAAC3BlcmlvZFN0YXJ0BQAAAAlwZXJpb2RFbmQJAAUVAAAAAwUAAAANY3VycmVudFBlcmlvZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB8AAAABCQEAAAAUa2V5UGVyaW9kU3RhcnRIZWlnaHQAAAABBQAAAA1jdXJyZW50UGVyaW9kBQAAAAZoZWlnaHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQfAAAAAQkBAAAAEmtleVBlcmlvZEVuZEhlaWdodAAAAAEFAAAADWN1cnJlbnRQZXJpb2QJAABlAAAAAgkAAGQAAAACBQAAAAZoZWlnaHQFAAAADHBlcmlvZExlbmd0aAAAAAAAAAAAAQQAAAAUdXBkYXRlZEN1cnJlbnRQZXJpb2QIBQAAAA0kdDAxMjg1NDE0NzI0AAAAAl8xBAAAAAtwZXJpb2RTdGFydAgFAAAADSR0MDEyODU0MTQ3MjQAAAACXzIEAAAACXBlcmlvZEVuZAgFAAAADSR0MDEyODU0MTQ3MjQAAAACXzMEAAAAG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB8AAAABCQEAAAAea2V5UGVyaW9kVG90YWxBdmFpbGFibGVUb0NsYWltAAAAAgUAAAAOcHJpY2VBc3NldElkNTgFAAAAFHVwZGF0ZWRDdXJyZW50UGVyaW9kBQAAAB50b3RhbFBlcmlvZFByaWNlQXNzZXRBbGxvd2FuY2UEAAAAGnBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAAB1rZXlQZXJpb2RVc2VyQXZhaWxhYmxlVG9DbGFpbQAAAAMFAAAADnByaWNlQXNzZXRJZDU4BQAAABR1cGRhdGVkQ3VycmVudFBlcmlvZAUAAAANdXNlckFkZHJlc3M1OAUAAAAddXNlclBlcmlvZFByaWNlQXNzZXRBbGxvd2FuY2UEAAAAEXByaWNlQXNzZXRCYWxhbmNlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABRrZXlQcmljZUFzc2V0QmFsYW5jZQAAAAEFAAAADXVzZXJBZGRyZXNzNTgAAAAAAAAAAAAEAAAAGXBlcmlvZE1pbkF2YWlsYWJsZVRvQ2xhaW0JAAGXAAAAAQkABEwAAAACCQAAZAAAAAIFAAAACW91dEFtb3VudAUAAAARcHJpY2VBc3NldEJhbGFuY2UJAARMAAAAAgUAAAAbcGVyaW9kVG90YWxBdmFpbGFibGVUb0NsYWltCQAETAAAAAIFAAAAGnBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltBQAAAANuaWwEAAAAHHVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8JAQAAAAV2YWx1ZQAAAAEJAAQfAAAAAQkBAAAAH2tleVVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8AAAAABAAAABtwdXRPbmVUa25WMlByaWNlQXNzZXRBbW91bnQFAAAABnNjYWxlOAQAAAANJHQwMTU0NzkxNTczMgoAAAAAAUAJAAP8AAAABAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAABXZhbHVlAAAAAQkABCIAAAABCQEAAAAba2V5VXNkdFByaWNlQXNzZXRTdGFibGVQb29sAAAAAAIAAAAhcHV0T25lVGtuVjJXaXRob3V0VGFrZUZlZVJFQURPTkxZCQAETAAAAAIFAAAAG3B1dE9uZVRrblYyUHJpY2VBc3NldEFtb3VudAkABEwAAAACBQAAAA5wcmljZUFzc2V0SWQ1OAUAAAADbmlsBQAAAANuaWwDCQAAAQAAAAIFAAAAAUACAAAADyhJbnQsIEludCwgSW50KQUAAAABQAkAAAIAAAABAgAAACRDb3VsZG4ndCBjYXN0IEFueSB0byAoSW50LCBJbnQsIEludCkDCQAAAAAAAAIFAAAADSR0MDE1NDc5MTU3MzIFAAAADSR0MDE1NDc5MTU3MzIEAAAABWJvbnVzCAUAAAANJHQwMTU0NzkxNTczMgAAAAJfMwQAAAAJZmVlQW1vdW50CAUAAAANJHQwMTU0NzkxNTczMgAAAAJfMgQAAAAIbHBBbW91bnQIBQAAAA0kdDAxNTQ3OTE1NzMyAAAAAl8xBAAAAAt1c2R0QXNzZXRJZAkBAAAABXZhbHVlAAAAAQkABCIAAAABCQEAAAAOa2V5VXNkdEFzc2V0SWQAAAAABAAAAA0kdDAxNTc5NDE2MDEyCgAAAAABQAkAA/wAAAAECQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAFdmFsdWUAAAABCQAEIgAAAAEJAQAAABtrZXlVc2R0UHJpY2VBc3NldFN0YWJsZVBvb2wAAAAAAgAAABNnZXRPbmVUa25WMlJFQURPTkxZCQAETAAAAAIFAAAAC3VzZHRBc3NldElkCQAETAAAAAIFAAAACGxwQW1vdW50BQAAAANuaWwFAAAAA25pbAMJAAABAAAAAgUAAAABQAIAAAAKKEludCwgSW50KQUAAAABQAkAAAIAAAABAgAAAB9Db3VsZG4ndCBjYXN0IEFueSB0byAoSW50LCBJbnQpAwkAAAAAAAACBQAAAA0kdDAxNTc5NDE2MDEyBQAAAA0kdDAxNTc5NDE2MDEyBAAAABRnZXRPbmVUa25WMkZlZUFtb3VudAgFAAAADSR0MDE1Nzk0MTYwMTIAAAACXzIEAAAACnVzZHRBbW91bnQIBQAAAA0kdDAxNTc5NDE2MDEyAAAAAl8xBAAAABpjdXJyZW50VXNkdFByaWNlQXNzZXRSYXRpbwkAAGsAAAADBQAAABtwdXRPbmVUa25WMlByaWNlQXNzZXRBbW91bnQFAAAABnNjYWxlOAUAAAAKdXNkdEFtb3VudAQAAAATZW5kUGVyaW9kQmxvY2tzTGVmdAkAAGUAAAACBQAAAAlwZXJpb2RFbmQFAAAABmhlaWdodAkABRwAAAAKBQAAABlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltBQAAABtwZXJpb2RUb3RhbEF2YWlsYWJsZVRvQ2xhaW0FAAAAGnBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltBQAAABl0b3RhbFVzZXJBdmFpbGFibGVUb0NsYWltBQAAABx1c2R0UHJpY2VBc3NldEFsbG93YWJsZVJhdGlvBQAAABpjdXJyZW50VXNkdFByaWNlQXNzZXRSYXRpbwUAAAATZW5kUGVyaW9kQmxvY2tzTGVmdAUAAAAUdXBkYXRlZEN1cnJlbnRQZXJpb2QFAAAAC3BlcmlvZFN0YXJ0BQAAAAlwZXJpb2RFbmQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEAAAAWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAAEAAAAByRtYXRjaDAJAAQiAAAAAQkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAABcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAUAAAAEdW5pdAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAABAAAAAckbWF0Y2gwCQAEIgAAAAEJAQAAABprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAAFzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BQAAAAR1bml0CQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAttdXN0TWFuYWdlcgAAAAEAAAABaQQAAAACcGQJAAACAAAAAQIAAAARUGVybWlzc2lvbiBkZW5pZWQEAAAAByRtYXRjaDAJAQAAABZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACcGsFAAAAByRtYXRjaDADCQAAAAAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAACcGsGBQAAAAJwZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAMJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzBgUAAAACcGQJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IAAAAHAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAABwAAAAhpZG9TdGFydAAAAAtpZG9EdXJhdGlvbgAAAApjbGFpbVN0YXJ0AAAADWNsYWltRHVyYXRpb24AAAAFcHJpY2UAAAAOcHJpY2VBc3NldElkNTgAAAAPbWluSW52ZXN0QW1vdW50BAAAAAlwcmljZU11bHQJAABoAAAAAgkAAGgAAAACAAAAAAAAAABkAAAAAAAAAAPoAAAAAAAAAAPoBAAAAAZpZG9FbmQJAABkAAAAAgUAAAAIaWRvU3RhcnQFAAAAC2lkb0R1cmF0aW9uAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQiAAAAAQkBAAAACWtleUNvbmZpZwAAAAAJAAACAAAAAQIAAAATYWxyZWFkeSBpbml0aWFsaXplZAMJAQAAAAIhPQAAAAICAAAAIzNQTUVITHgxajZ6ZXJhclpUWWZzR3FEZWVacVFvTXB4cTVTCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAAA5ub3QgYXV0aG9yaXplZAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAMJAABnAAAAAgUAAAAGaWRvRW5kBQAAAApjbGFpbVN0YXJ0CQAAAgAAAAECAAAAJmNsYWltU3RhcnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gaWRvRW5kBAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACmlkb0Fzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAAMaWRvQXNzZXRJbmZvCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQUAAAAKaWRvQXNzZXRJZAIAAAAbZmFpbCB0byBsb2FkIGlkbyBhc3NldCBpbmZvBAAAAAxpZG9Bc3NldElkNTgJAAJYAAAAAQUAAAAKaWRvQXNzZXRJZAQAAAAMaWRvQXNzZXRNdWx0CQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAIBQAAAAxpZG9Bc3NldEluZm8AAAAIZGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04EAAAADHByaWNlQXNzZXRJZAkAAlkAAAABBQAAAA5wcmljZUFzc2V0SWQ1OAQAAAAOcHJpY2VBc3NldEluZm8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAxwcmljZUFzc2V0SWQCAAAAHWZhaWwgdG8gbG9hZCBwcmljZSBhc3NldCBpbmZvBAAAAA5wcmljZUFzc2V0TXVsdAkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAACAUAAAAOcHJpY2VBc3NldEluZm8AAAAIZGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04EAAAAD29yaWdUb3RhbHNBcnJheQkBAAAAGHJlYWRUb3RhbHNBcnJheU9yRGVmYXVsdAAAAAAEAAAACnRvdGFsc0RpZmYJAARMAAAAAgAAAAAAAAAAAAkABEwAAAACAAAAAAAAAAAACQAETAAAAAIAAAAAAAAAAAAJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAlrZXlDb25maWcAAAAACQEAAAAMZnJvbWF0Q29uZmlnAAAADAUAAAAIaWRvU3RhcnQFAAAAC2lkb0R1cmF0aW9uBQAAAApjbGFpbVN0YXJ0BQAAAA1jbGFpbUR1cmF0aW9uBQAAAAVwcmljZQUAAAAJcHJpY2VNdWx0BQAAAAxpZG9Bc3NldElkNTgFAAAADGlkb0Fzc2V0TXVsdAUAAAAOcHJpY2VBc3NldElkNTgFAAAADnByaWNlQXNzZXRNdWx0BQAAAA9taW5JbnZlc3RBbW91bnQIBQAAAANwbXQAAAAGYW1vdW50CQAETAAAAAIJAQAAAAtUb3RhbHNFbnRyeQAAAAUJAQAAAAlrZXlUb3RhbHMAAAAABQAAAA9vcmlnVG90YWxzQXJyYXkFAAAACnRvdGFsc0RpZmYFAAAACmNsYWltU3RhcnQAAAAAAAAAAAAFAAAAA25pbAAAAAFpAQAAAAZpbnZlc3QAAAAABAAAAAhjZmdBcnJheQkBAAAAD3JlYWRDb25maWdBcnJheQAAAAAEAAAACGlkb1N0YXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAADklkeENmZ0lkb1N0YXJ0BAAAAAtpZG9EdXJhdGlvbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABFJZHhDZmdJZG9EdXJhdGlvbgQAAAAGaWRvRW5kCQAAZAAAAAIFAAAACGlkb1N0YXJ0BQAAAAtpZG9EdXJhdGlvbgQAAAAKY2xhaW1TdGFydAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABBJZHhDZmdDbGFpbVN0YXJ0BAAAAA1jbGFpbUR1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAE0lkeENmZ0NsYWltRHVyYXRpb24EAAAABXByaWNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAC0lkeENmZ1ByaWNlBAAAAAlwcmljZU11bHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAPSWR4Q2ZnUHJpY2VNdWx0BAAAAAxpZG9Bc3NldElkNTgJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAEElkeENmZ0lkb0Fzc2V0SWQEAAAACmlkb0Fzc2V0SWQJAAJZAAAAAQUAAAAMaWRvQXNzZXRJZDU4BAAAAAxpZG9Bc3NldE11bHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAASSWR4Q2ZnSWRvQXNzZXRNdWx0BAAAAA5wcmljZUFzc2V0SWQ1OAkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAASSWR4Q2ZnUHJpY2VBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAJZAAAAAQUAAAAOcHJpY2VBc3NldElkNTgEAAAADnByaWNlQXNzZXRNdWx0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFElkeENmZ1ByaWNlQXNzZXRNdWx0BAAAAA5taW5JdmVzdEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABVJZHhDZmdNaW5JbnZlc3RBbW91bnQEAAAAC3VzZXJBZGRyZXNzCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAABmAAAAAgUAAAAIaWRvU3RhcnQFAAAABmhlaWdodAkAAAIAAAABAgAAABxpZG8gaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0AwkAAGYAAAACBQAAAAZoZWlnaHQFAAAABmlkb0VuZAkAAAIAAAABAgAAABppZG8gaGFzIGJlZW4gYWxyZWFkeSBlbmRlZAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdZXhhY3RseSAxIHBheW1lbnQgaXMgZXhwZWN0ZWQEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAKcG10QXNzZXRJZAkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAANwbXQAAAAGYW1vdW50AwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABppbnZhbGlkIHBheW1lbnQgYXNzZXQgaWQ6IAkAAlgAAAABBQAAAApwbXRBc3NldElkAgAAAAwgaXMgZXhwZWN0ZWQEAAAAEW9yaWdJbnZlc3RvckFycmF5CQEAAAAacmVhZEludmVzdG9yQXJyYXlPckRlZmF1bHQAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAAPb3JpZ1RvdGFsc0FycmF5CQEAAAAYcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0AAAAAAQAAAATbmV3UHJpY2VUb3RhbEFtb3VudAkAAGQAAAACCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPb3JpZ1RvdGFsc0FycmF5BQAAABFJZHhJbnZUb3RhbEFtb3VudAUAAAAJcG10QW1vdW50BAAAABZyZXF1aXJlZElkb0Fzc2V0QW1vdW50CQAAaAAAAAIFAAAAE25ld1ByaWNlVG90YWxBbW91bnQAAAAAAAAAAGQDCQAAZgAAAAIFAAAAFnJlcXVpcmVkSWRvQXNzZXRBbW91bnQJAAPwAAAAAgUAAAAEdGhpcwUAAAAKaWRvQXNzZXRJZAkAAAIAAAABAgAAADlJRE8gYXNzZXQgaGFzIGJlZW4gLSBzb2xkIGNvbnNpZGVyIHRvIHVzZSBzbWFsbGVyIHBheW1lbnQEAAAACnRvdGFsc0RpZmYJAARMAAAAAgUAAAAJcG10QW1vdW50CQAETAAAAAIFAAAACXBtdEFtb3VudAkABEwAAAACAAAAAAAAAAAACQAETAAAAAIAAAAAAAAAAAAFAAAAA25pbAkABEwAAAACCQEAAAALVG90YWxzRW50cnkAAAAFCQEAAAALa2V5SW52ZXN0b3IAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAARb3JpZ0ludmVzdG9yQXJyYXkFAAAACnRvdGFsc0RpZmYFAAAACmNsYWltU3RhcnQAAAAAAAAAAAAJAARMAAAAAgkBAAAAC1RvdGFsc0VudHJ5AAAABQkBAAAACWtleVRvdGFscwAAAAAFAAAAD29yaWdUb3RhbHNBcnJheQUAAAAKdG90YWxzRGlmZgUAAAAKY2xhaW1TdGFydAAAAAAAAAAAAAkABEwAAAACCQEAAAAbSW52ZXN0T3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABAUAAAALdXNlckFkZHJlc3MFAAAACXBtdEFtb3VudAAAAAAAAAAAAAgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAADbmlsAAAAAWkBAAAABWNsYWltAAAAAgAAABBjbGFpbWVkQXNzZXRJZDU4AAAADXVzZXJBZGRyZXNzNTgEAAAAD2NhbGxlckFkZHJlc3M1OAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQEAAAACIT0AAAACBQAAAA11c2VyQWRkcmVzczU4BQAAAA9jYWxsZXJBZGRyZXNzNTgJAAACAAAAAQIAAAAObm90IGF1dGhvcml6ZWQEAAAACGNmZ0FycmF5CQEAAAAPcmVhZENvbmZpZ0FycmF5AAAAAAQAAAAOcHJpY2VBc3NldElkNTgJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAEklkeENmZ1ByaWNlQXNzZXRJZAQAAAAQY2xhaW1SZXN1bHRUdXBsZQkBAAAADWludGVybmFsQ2xhaW0AAAADBQAAABBjbGFpbWVkQXNzZXRJZDU4CAUAAAABaQAAAAZjYWxsZXIIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAACnRvdGFsc0RpZmYIBQAAABBjbGFpbVJlc3VsdFR1cGxlAAAAAl8xBAAAAAlvdXRBbW91bnQIBQAAABBjbGFpbVJlc3VsdFR1cGxlAAAAAl8yBAAAAApvdXRBc3NldElkCAUAAAAQY2xhaW1SZXN1bHRUdXBsZQAAAAJfMwQAAAAPb3JpZ0ludmVzdEFycmF5CAUAAAAQY2xhaW1SZXN1bHRUdXBsZQAAAAJfNAQAAAAUbmV3Q2xhaW1QZXJpb2RIZWlnaHQIBQAAABBjbGFpbVJlc3VsdFR1cGxlAAAAAl81BAAAABpjbGFpbWVkUHJpY2VBbW91bnRGcm9tRGlmZgkAAZEAAAACBQAAAAp0b3RhbHNEaWZmBQAAACJJZHhEaWZmQ2xhaW1lZFByaWNlQW1vdW50SW5jcmVtZW50BAAAAB1jbGFpbWVkSWRvQXNzZXRBbW91bnRGcm9tRGlmZgkAAZEAAAACBQAAAAp0b3RhbHNEaWZmBQAAACVJZHhEaWZmQ2xhaW1lZElkb0Fzc2V0QW1vdW50SW5jcmVtZW50BAAAABFwcmljZUFzc2V0QmFsYW5jZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB8AAAABCQEAAAAUa2V5UHJpY2VBc3NldEJhbGFuY2UAAAABBQAAAA11c2VyQWRkcmVzczU4AAAAAAAAAAAABAAAABJwcmljZUFzc2V0RGVjaW1hbHMICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEJAAJZAAAAAQUAAAAOcHJpY2VBc3NldElkNTgAAAAIZGVjaW1hbHMEAAAAB2VudHJpZXMDCQAAAAAAAAIFAAAAEGNsYWltZWRBc3NldElkNTgFAAAADnByaWNlQXNzZXRJZDU4BAAAAA0kdDAyMTkyMTIyMzY1CQEAAAAPaW50ZXJuYWxDbGFpbVYyAAAABAUAAAAOcHJpY2VBc3NldElkNTgFAAAADXVzZXJBZGRyZXNzNTgFAAAACW91dEFtb3VudAkAAZEAAAACBQAAAAp0b3RhbHNEaWZmBQAAACJJZHhEaWZmQ2xhaW1lZFByaWNlQW1vdW50SW5jcmVtZW50BAAAABlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltCAUAAAANJHQwMjE5MjEyMjM2NQAAAAJfMQQAAAAbcGVyaW9kVG90YWxBdmFpbGFibGVUb0NsYWltCAUAAAANJHQwMjE5MjEyMjM2NQAAAAJfMgQAAAAacGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0IBQAAAA0kdDAyMTkyMTIyMzY1AAAAAl8zBAAAABl0b3RhbFVzZXJBdmFpbGFibGVUb0NsYWltCAUAAAANJHQwMjE5MjEyMjM2NQAAAAJfNAQAAAAcdXNkdFByaWNlQXNzZXRBbGxvd2FibGVSYXRpbwgFAAAADSR0MDIxOTIxMjIzNjUAAAACXzUEAAAAGmN1cnJlbnRVc2R0UHJpY2VBc3NldFJhdGlvCAUAAAANJHQwMjE5MjEyMjM2NQAAAAJfNgQAAAATZW5kUGVyaW9kQmxvY2tzTGVmdAgFAAAADSR0MDIxOTIxMjIzNjUAAAACXzcEAAAAFHVwZGF0ZWRDdXJyZW50UGVyaW9kCAUAAAANJHQwMjE5MjEyMjM2NQAAAAJfOAQAAAALcGVyaW9kU3RhcnQIBQAAAA0kdDAyMTkyMTIyMzY1AAAAAl85BAAAAAlwZXJpb2RFbmQIBQAAAA0kdDAyMTkyMTIyMzY1AAAAA18xMAQAAAAGY2hlY2tzCQAETAAAAAIDCQAAZgAAAAIFAAAAGnBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltAAAAAAAAAAAABgkBAAAACHRocm93RXJyAAAAAQIAAAA6dW5hdmFpbGFibGUgdG8gY2xhaW0gYmVjYXVzZSB1c2VyIHBlcmlvZCBhbGxvd2FuY2UgcmVhY2hlZAkABEwAAAACAwkAAGYAAAACBQAAABtwZXJpb2RUb3RhbEF2YWlsYWJsZVRvQ2xhaW0AAAAAAAAAAAAGCQEAAAAIdGhyb3dFcnIAAAABAgAAADt1bmF2YWlsYWJsZSB0byBjbGFpbSBiZWNhdXNlIHRvdGFsIHBlcmlvZCBhbGxvd2FuY2UgcmVhY2hlZAkABEwAAAACAwkAAGYAAAACBQAAABlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltAAAAAAAAAAAABgkBAAAACHRocm93RXJyAAAAAQIAAAAQbm90aGluZyB0byBjbGFpbQkABEwAAAACAwkAAGYAAAACBQAAABx1c2R0UHJpY2VBc3NldEFsbG93YWJsZVJhdGlvBQAAABpjdXJyZW50VXNkdFByaWNlQXNzZXRSYXRpbwYJAQAAAAh0aHJvd0VycgAAAAECAAAAT3VuYXZhaWxhYmxlIHRvIGNsYWltIGJlY2F1c2UgdXNkbiBwcmljZSBsb3dlciB0aGFuIHVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8FAAAAA25pbAMJAAAAAAAAAgUAAAAGY2hlY2tzBQAAAAZjaGVja3MEAAAAInVwZGF0ZWRQZXJpb2RUb3RhbEF2YWlsYWJsZVRvQ2xhaW0JAABlAAAAAgUAAAAbcGVyaW9kVG90YWxBdmFpbGFibGVUb0NsYWltBQAAABlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltBAAAACF1cGRhdGVkUGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0JAABlAAAAAgUAAAAacGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0FAAAAGXBlcmlvZE1pbkF2YWlsYWJsZVRvQ2xhaW0EAAAAB2VudHJpZXMDCQAAZwAAAAIFAAAAEXByaWNlQXNzZXRCYWxhbmNlBQAAABlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAZcGVyaW9kTWluQXZhaWxhYmxlVG9DbGFpbQUAAAAKb3V0QXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFGtleVByaWNlQXNzZXRCYWxhbmNlAAAAAQUAAAANdXNlckFkZHJlc3M1OAkAAGUAAAACBQAAABFwcmljZUFzc2V0QmFsYW5jZQUAAAAZcGVyaW9kTWluQXZhaWxhYmxlVG9DbGFpbQUAAAADbmlsBAAAABh1cGRhdGVkUHJpY2VBc3NldEJhbGFuY2UJAABlAAAAAgkAAGQAAAACBQAAABFwcmljZUFzc2V0QmFsYW5jZQUAAAAJb3V0QW1vdW50BQAAABlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltCQAETAAAAAIJAQAAAAtUb3RhbHNFbnRyeQAAAAUJAQAAAAtrZXlJbnZlc3RvcgAAAAEFAAAADXVzZXJBZGRyZXNzNTgFAAAAD29yaWdJbnZlc3RBcnJheQUAAAAKdG90YWxzRGlmZgUAAAAUbmV3Q2xhaW1QZXJpb2RIZWlnaHQAAAAAAAAAAAAJAARMAAAAAgkBAAAAC1RvdGFsc0VudHJ5AAAABQkBAAAACWtleVRvdGFscwAAAAAJAQAAABhyZWFkVG90YWxzQXJyYXlPckRlZmF1bHQAAAAABQAAAAp0b3RhbHNEaWZmBQAAABRuZXdDbGFpbVBlcmlvZEhlaWdodAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFGtleVByaWNlQXNzZXRCYWxhbmNlAAAAAQUAAAANdXNlckFkZHJlc3M1OAUAAAAYdXBkYXRlZFByaWNlQXNzZXRCYWxhbmNlCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAZcGVyaW9kTWluQXZhaWxhYmxlVG9DbGFpbQUAAAAKb3V0QXNzZXRJZAUAAAADbmlsCQAFFAAAAAIJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEGtleUN1cnJlbnRQZXJpb2QAAAAABQAAABR1cGRhdGVkQ3VycmVudFBlcmlvZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFGtleVBlcmlvZFN0YXJ0SGVpZ2h0AAAAAQUAAAAUdXBkYXRlZEN1cnJlbnRQZXJpb2QFAAAAC3BlcmlvZFN0YXJ0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASa2V5UGVyaW9kRW5kSGVpZ2h0AAAAAQUAAAAUdXBkYXRlZEN1cnJlbnRQZXJpb2QFAAAACXBlcmlvZEVuZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAHmtleVBlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQAAAAIFAAAADnByaWNlQXNzZXRJZDU4BQAAABR1cGRhdGVkQ3VycmVudFBlcmlvZAUAAAAidXBkYXRlZFBlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAHWtleVBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltAAAAAwUAAAAOcHJpY2VBc3NldElkNTgFAAAAFHVwZGF0ZWRDdXJyZW50UGVyaW9kBQAAAA11c2VyQWRkcmVzczU4BQAAACF1cGRhdGVkUGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0JAARMAAAAAgkBAAAAGkNsYWltT3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABAUAAAANdXNlckFkZHJlc3M1OAUAAAAZcGVyaW9kTWluQXZhaWxhYmxlVG9DbGFpbQUAAAAdY2xhaW1lZElkb0Fzc2V0QW1vdW50RnJvbURpZmYIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQFAAAAA25pbAUAAAAHZW50cmllcwUAAAAEdW5pdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAAAAHHByaWNlQXNzZXRCYWxhbmNlSWRvRGVjaW1hbHMJAABrAAAAAwUAAAARcHJpY2VBc3NldEJhbGFuY2UFAAAABnNjYWxlOAkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAABQAAABJwcmljZUFzc2V0RGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04JAAUUAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIJAABkAAAAAgUAAAAJb3V0QW1vdW50BQAAABxwcmljZUFzc2V0QmFsYW5jZUlkb0RlY2ltYWxzBQAAAApvdXRBc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAUa2V5UHJpY2VBc3NldEJhbGFuY2UAAAABBQAAAA11c2VyQWRkcmVzczU4AAAAAAAAAAAACQAETAAAAAIJAQAAAAtUb3RhbHNFbnRyeQAAAAUJAQAAAAtrZXlJbnZlc3RvcgAAAAEFAAAADXVzZXJBZGRyZXNzNTgFAAAAD29yaWdJbnZlc3RBcnJheQUAAAAKdG90YWxzRGlmZgUAAAAUbmV3Q2xhaW1QZXJpb2RIZWlnaHQFAAAAEXByaWNlQXNzZXRCYWxhbmNlCQAETAAAAAIJAQAAAAtUb3RhbHNFbnRyeQAAAAUJAQAAAAlrZXlUb3RhbHMAAAAACQEAAAAYcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0AAAAAAUAAAAKdG90YWxzRGlmZgUAAAAUbmV3Q2xhaW1QZXJpb2RIZWlnaHQFAAAAEXByaWNlQXNzZXRCYWxhbmNlCQAETAAAAAIJAQAAABpDbGFpbU9wZXJhdGlvbkhpc3RvcnlFbnRyeQAAAAQFAAAADXVzZXJBZGRyZXNzNTgFAAAAGmNsYWltZWRQcmljZUFtb3VudEZyb21EaWZmCQAAZAAAAAIFAAAAHWNsYWltZWRJZG9Bc3NldEFtb3VudEZyb21EaWZmBQAAABxwcmljZUFzc2V0QmFsYW5jZUlkb0RlY2ltYWxzCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAANuaWwFAAAABHVuaXQFAAAAB2VudHJpZXMAAAABaQEAAAANY2xhaW1SRUFET05MWQAAAAIAAAAQY2xhaW1lZEFzc2V0SWQ1OAAAAA11c2VyQWRkcmVzczU4BAAAABBjbGFpbVJlc3VsdFR1cGxlCQEAAAANaW50ZXJuYWxDbGFpbQAAAAMFAAAAEGNsYWltZWRBc3NldElkNTgJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADXVzZXJBZGRyZXNzNTgJAAJZAAAAAQIAAAAABAAAAAp0b3RhbHNEaWZmCAUAAAAQY2xhaW1SZXN1bHRUdXBsZQAAAAJfMQQAAAAJb3V0QW1vdW50CAUAAAAQY2xhaW1SZXN1bHRUdXBsZQAAAAJfMgQAAAAKb3V0QXNzZXRJZAgFAAAAEGNsYWltUmVzdWx0VHVwbGUAAAACXzMEAAAAD29yaWdJbnZlc3RBcnJheQgFAAAAEGNsYWltUmVzdWx0VHVwbGUAAAACXzQEAAAAFG5ld0NsYWltUGVyaW9kSGVpZ2h0CAUAAAAQY2xhaW1SZXN1bHRUdXBsZQAAAAJfNQQAAAAVYXZhaWxhYmxlVG9DbGFpbUFycmF5CAUAAAAQY2xhaW1SZXN1bHRUdXBsZQAAAAJfNgQAAAAbYXZhaWxhYmxlUHJpY2VBbW91bnRUb0NsYWltCQABkQAAAAIFAAAAFWF2YWlsYWJsZVRvQ2xhaW1BcnJheQAAAAAAAAAAAAQAAAAZYXZhaWxhYmxlSWRvQW1vdW50VG9DbGFpbQkAAZEAAAACBQAAABVhdmFpbGFibGVUb0NsYWltQXJyYXkAAAAAAAAAAAEJAAUUAAAAAgUAAAADbmlsCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlZCVkCQAETAAAAAIFAAAADXVzZXJBZGRyZXNzNTgJAARMAAAAAgkAAaQAAAABBQAAABthdmFpbGFibGVQcmljZUFtb3VudFRvQ2xhaW0JAARMAAAAAgkAAaQAAAABBQAAABlhdmFpbGFibGVJZG9BbW91bnRUb0NsYWltBQAAAANuaWwFAAAAA1NFUAAAAAFpAQAAAA9jbGFpbVYyUkVBRE9OTFkAAAACAAAAEGNsYWltZWRBc3NldElkNTgAAAANdXNlckFkZHJlc3M1OAQAAAAQY2xhaW1SZXN1bHRUdXBsZQkBAAAADWludGVybmFsQ2xhaW0AAAADBQAAABBjbGFpbWVkQXNzZXRJZDU4CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAA11c2VyQWRkcmVzczU4CQACWQAAAAECAAAAAAQAAAAKdG90YWxzRGlmZggFAAAAEGNsYWltUmVzdWx0VHVwbGUAAAACXzEEAAAACW91dEFtb3VudAgFAAAAEGNsYWltUmVzdWx0VHVwbGUAAAACXzIEAAAACm91dEFzc2V0SWQIBQAAABBjbGFpbVJlc3VsdFR1cGxlAAAAAl8zBAAAAA9vcmlnSW52ZXN0QXJyYXkIBQAAABBjbGFpbVJlc3VsdFR1cGxlAAAAAl80BAAAABRuZXdDbGFpbVBlcmlvZEhlaWdodAgFAAAAEGNsYWltUmVzdWx0VHVwbGUAAAACXzUEAAAAFWF2YWlsYWJsZVRvQ2xhaW1BcnJheQgFAAAAEGNsYWltUmVzdWx0VHVwbGUAAAACXzYEAAAAG2F2YWlsYWJsZVByaWNlQW1vdW50VG9DbGFpbQkAAZEAAAACBQAAABVhdmFpbGFibGVUb0NsYWltQXJyYXkAAAAAAAAAAAAEAAAAGWF2YWlsYWJsZUlkb0Ftb3VudFRvQ2xhaW0JAAGRAAAAAgUAAAAVYXZhaWxhYmxlVG9DbGFpbUFycmF5AAAAAAAAAAABBAAAAAhjZmdBcnJheQkBAAAAD3JlYWRDb25maWdBcnJheQAAAAAEAAAADnByaWNlQXNzZXRJZDU4CQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABJJZHhDZmdQcmljZUFzc2V0SWQEAAAAEXByaWNlQXNzZXRCYWxhbmNlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABRrZXlQcmljZUFzc2V0QmFsYW5jZQAAAAEFAAAADXVzZXJBZGRyZXNzNTgAAAAAAAAAAAAEAAAAHHByaWNlQXNzZXRCYWxhbmNlSWRvRGVjaW1hbHMJAABoAAAAAgUAAAARcHJpY2VBc3NldEJhbGFuY2UAAAAAAAAAAGQEAAAALmF2YWlsYWJsZUlkb0Ftb3VudFRvQ2xhaW1XaXRoUHJpY2VBc3NldEJhbGFuY2UJAABkAAAAAgUAAAAZYXZhaWxhYmxlSWRvQW1vdW50VG9DbGFpbQUAAAAccHJpY2VBc3NldEJhbGFuY2VJZG9EZWNpbWFscwQAAAANJHQwMjg2NTgyOTA3MAkBAAAAD2ludGVybmFsQ2xhaW1WMgAAAAQFAAAADnByaWNlQXNzZXRJZDU4BQAAAA11c2VyQWRkcmVzczU4BQAAAAlvdXRBbW91bnQJAAGRAAAAAgUAAAAKdG90YWxzRGlmZgUAAAAiSWR4RGlmZkNsYWltZWRQcmljZUFtb3VudEluY3JlbWVudAQAAAAZcGVyaW9kTWluQXZhaWxhYmxlVG9DbGFpbQgFAAAADSR0MDI4NjU4MjkwNzAAAAACXzEEAAAAG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQgFAAAADSR0MDI4NjU4MjkwNzAAAAACXzIEAAAAGnBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltCAUAAAANJHQwMjg2NTgyOTA3MAAAAAJfMwQAAAAZdG90YWxVc2VyQXZhaWxhYmxlVG9DbGFpbQgFAAAADSR0MDI4NjU4MjkwNzAAAAACXzQEAAAAHHVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8IBQAAAA0kdDAyODY1ODI5MDcwAAAAAl81BAAAABpjdXJyZW50VXNkdFByaWNlQXNzZXRSYXRpbwgFAAAADSR0MDI4NjU4MjkwNzAAAAACXzYEAAAAE2VuZFBlcmlvZEJsb2Nrc0xlZnQIBQAAAA0kdDAyODY1ODI5MDcwAAAAAl83BAAAABR1cGRhdGVkQ3VycmVudFBlcmlvZAgFAAAADSR0MDI4NjU4MjkwNzAAAAACXzgEAAAAC3BlcmlvZFN0YXJ0CAUAAAANJHQwMjg2NTgyOTA3MAAAAAJfOQQAAAAJcGVyaW9kRW5kCAUAAAANJHQwMjg2NTgyOTA3MAAAAANfMTAEAAAAFmN1cnJlbnRQZXJpb2RFbmRIZWlnaHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQfAAAAAQkBAAAAEmtleVBlcmlvZEVuZEhlaWdodAAAAAEFAAAAFHVwZGF0ZWRDdXJyZW50UGVyaW9kAAAAAAAAAAAABAAAABp1c2VyVG90YWxQcmljZUFzc2V0Q2xhaW1lZAkAAGUAAAACCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgkBAAAAF3JlYWRJbnZlc3RvckFycmF5T3JGYWlsAAAAAQUAAAANdXNlckFkZHJlc3M1OAUAAAAdSWR4SW52Q2xhaW1lZFByaWNlQXNzZXRBbW91bnQFAAAAEXByaWNlQXNzZXRCYWxhbmNlBAAAAAxyZXN1bHRTdHJpbmcDCQAAZgAAAAIFAAAABmhlaWdodAUAAAAWY3VycmVudFBlcmlvZEVuZEhlaWdodAQAAAAMcGVyaW9kTGVuZ2h0CQEAAAAFdmFsdWUAAAABCQAEHwAAAAEJAQAAAA9rZXlQZXJpb2RMZW5ndGgAAAAABAAAABN1c2VyUGVyaW9kQWxsb3dhbmNlCQEAAAAFdmFsdWUAAAABCQAEHwAAAAEJAQAAABZrZXlVc2VyUGVyaW9kQWxsb3dhbmNlAAAAAQUAAAAOcHJpY2VBc3NldElkNTgEAAAAFHRvdGFsUGVyaW9kQWxsb3dhbmNlCQEAAAAFdmFsdWUAAAABCQAEHwAAAAEJAQAAABdrZXlUb3RhbFBlcmlvZEFsbG93YW5jZQAAAAEFAAAADnByaWNlQXNzZXRJZDU4CQAEuQAAAAIJAARMAAAAAgIAAAAMJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAAuYXZhaWxhYmxlSWRvQW1vdW50VG9DbGFpbVdpdGhQcmljZUFzc2V0QmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAAE3VzZXJQZXJpb2RBbGxvd2FuY2UJAARMAAAAAgkAAaQAAAABBQAAABR0b3RhbFBlcmlvZEFsbG93YW5jZQkABEwAAAACCQABpAAAAAEFAAAAHHVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8JAARMAAAAAgkAAaQAAAABBQAAABpjdXJyZW50VXNkdFByaWNlQXNzZXRSYXRpbwkABEwAAAACCQABpAAAAAEFAAAADHBlcmlvZExlbmdodAkABEwAAAACCQABpAAAAAEFAAAAGnVzZXJUb3RhbFByaWNlQXNzZXRDbGFpbWVkBQAAAANuaWwFAAAAA1NFUAkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAALmF2YWlsYWJsZUlkb0Ftb3VudFRvQ2xhaW1XaXRoUHJpY2VBc3NldEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAABlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltCQAETAAAAAIJAAGkAAAAAQUAAAAbcGVyaW9kVG90YWxBdmFpbGFibGVUb0NsYWltCQAETAAAAAIJAAGkAAAAAQUAAAAcdXNkdFByaWNlQXNzZXRBbGxvd2FibGVSYXRpbwkABEwAAAACCQABpAAAAAEFAAAAGmN1cnJlbnRVc2R0UHJpY2VBc3NldFJhdGlvCQAETAAAAAIJAAGkAAAAAQUAAAATZW5kUGVyaW9kQmxvY2tzTGVmdAkABEwAAAACCQABpAAAAAEFAAAAGnVzZXJUb3RhbFByaWNlQXNzZXRDbGFpbWVkBQAAAANuaWwFAAAAA1NFUAkABRQAAAACBQAAAANuaWwFAAAADHJlc3VsdFN0cmluZwAAAAFpAQAAAApzZXRNYW5hZ2VyAAAAAQAAABdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQAAAALY2hlY2tDYWxsZXIJAQAAAAttdXN0TWFuYWdlcgAAAAEFAAAAAWkDCQAAAAAAAAIFAAAAC2NoZWNrQ2FsbGVyBQAAAAtjaGVja0NhbGxlcgQAAAAVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQACWQAAAAEFAAAAF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAAAAAACBQAAABVjaGVja01hbmFnZXJQdWJsaWNLZXkFAAAAFWNoZWNrTWFuYWdlclB1YmxpY0tleQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAAAABQAAABdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAOY29uZmlybU1hbmFnZXIAAAAABAAAAAJwbQkBAAAAHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAQAAAAFaGFzUE0DCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAACcG0GCQAAAgAAAAECAAAAEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAAAAAAAAgUAAAAFaGFzUE0FAAAABWhhc1BNBAAAAAdjaGVja1BNAwkAAAAAAAACCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAQAAAAV2YWx1ZQAAAAEFAAAAAnBtBgkAAAIAAAABAgAAABtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAAAAAAIFAAAAB2NoZWNrUE0FAAAAB2NoZWNrUE0JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAACQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEFAAAAAnBtCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAAAAAFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAAPdGFyZ2V0UHVibGljS2V5BAAAAAckbWF0Y2gwCQEAAAAWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAnBrBQAAAAckbWF0Y2gwBQAAAAJwawMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleQkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAAD3RhcmdldFB1YmxpY0tleQUOCE4=", "height": 3398395, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: F4VetHmUzdCWKc4dEtWo5dUewhm2dFsEJ8Jm8S6Ht48z Next: 59SaYYFrpy5r28Z5bHZRgwz5JAamTQeqJxyUfxg7tgUQ Diff:
OldNewDifferences
203203 else if ((claimStart > height))
204204 then claimStart
205205 else height
206- let error1 = throwErr(makeString([toString(height), toString(claimStart), toString(claimEnd), toString(newClaimPeriodHeight)], " "))
207- if ((error1 == error1))
206+ let claimingBlocks = (newClaimPeriodHeight - investLastClaimedHeight)
207+ let claimingPriceAssetAmount = fraction(investTotalAmount, claimingBlocks, claimDuration)
208+ let error = throwErr(makeString([toString(height), toString(claimStart), toString(claimEnd), toString(newClaimPeriodHeight), toString(investLastClaimedHeight), toString(investTotalAmount), toString(claimingBlocks), toString(claimDuration), toString(claimingPriceAssetAmount)], " "))
209+ if ((error == error))
208210 then {
209- let claimingBlocks = (newClaimPeriodHeight - investLastClaimedHeight)
210- let claimingPriceAssetAmount = fraction(investTotalAmount, claimingBlocks, claimDuration)
211- let error = throwErr(makeString([toString(investTotalAmount), toString(claimingBlocks), toString(claimDuration), toString(claimingPriceAssetAmount)], " "))
212- if ((error == error))
213- then {
214- let claimingIdoAssetAmount = convertPriceAssetIntoIdoAsset(claimingPriceAssetAmount, priceAssetMult, price, priceMult, idoAssetMult)
215- let isUSDN = (claimedAssetId58 == priceAssetId58)
216- let isUSDNClaimDisabled = valueOrElse(getBoolean(keyUSDNClaimDisabled()), false)
217- let checks = [if (!(if (isUSDN)
218- then isUSDNClaimDisabled
219- else false))
220- then true
221- else throw("USDN claim is disabled")]
222- if ((checks == checks))
223- then if ((claimedAssetId58 == priceAssetId58))
224- then $Tuple6([0, -(claimingPriceAssetAmount), claimingPriceAssetAmount, 0], claimingPriceAssetAmount, priceAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
225- else if ((claimedAssetId58 == idoAssetId58))
226- then $Tuple6([0, -(claimingPriceAssetAmount), 0, claimingIdoAssetAmount], claimingIdoAssetAmount, idoAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
227- else throw(("unsupported assetId: " + claimedAssetId58))
228- else throw("Strict value is not equal to itself.")
229- }
211+ let claimingIdoAssetAmount = convertPriceAssetIntoIdoAsset(claimingPriceAssetAmount, priceAssetMult, price, priceMult, idoAssetMult)
212+ let isUSDN = (claimedAssetId58 == priceAssetId58)
213+ let isUSDNClaimDisabled = valueOrElse(getBoolean(keyUSDNClaimDisabled()), false)
214+ let checks = [if (!(if (isUSDN)
215+ then isUSDNClaimDisabled
216+ else false))
217+ then true
218+ else throw("USDN claim is disabled")]
219+ if ((checks == checks))
220+ then if ((claimedAssetId58 == priceAssetId58))
221+ then $Tuple6([0, -(claimingPriceAssetAmount), claimingPriceAssetAmount, 0], claimingPriceAssetAmount, priceAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
222+ else if ((claimedAssetId58 == idoAssetId58))
223+ then $Tuple6([0, -(claimingPriceAssetAmount), 0, claimingIdoAssetAmount], claimingIdoAssetAmount, idoAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
224+ else throw(("unsupported assetId: " + claimedAssetId58))
230225 else throw("Strict value is not equal to itself.")
231226 }
232227 else throw("Strict value is not equal to itself.")
239234 let periodLength = value(getInteger(keyPeriodLength()))
240235 let currentPeriod = valueOrElse(getInteger(keyCurrentPeriod()), 0)
241236 let zeroPeriodEndHeighIsDefined = isDefined(getInteger(keyPeriodEndHeight(0)))
242- let $t01322215092 = if ((currentPeriod > 0))
237+ let $t01285414724 = if ((currentPeriod > 0))
243238 then {
244239 let lastPeriodStartHeight = value(getInteger(keyPeriodStartHeight(currentPeriod)))
245240 let lastPeriodEndHeight = value(getInteger(keyPeriodEndHeight(currentPeriod)))
246- let $t01348214187 = if ((height > lastPeriodEndHeight))
241+ let $t01311413819 = if ((height > lastPeriodEndHeight))
247242 then {
248243 let updatedCurrentPeriod = (currentPeriod + 1)
249244 let periodStart = if ((height > (lastPeriodEndHeight + periodLength)))
258253 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
259254 }
260255 else $Tuple3(currentPeriod, lastPeriodStartHeight, lastPeriodEndHeight)
261- let updatedCurrentPeriod = $t01348214187._1
262- let periodStart = $t01348214187._2
263- let periodEnd = $t01348214187._3
256+ let updatedCurrentPeriod = $t01311413819._1
257+ let periodStart = $t01311413819._2
258+ let periodEnd = $t01311413819._3
264259 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
265260 }
266261 else if (zeroPeriodEndHeighIsDefined)
267262 then {
268263 let zeroPeriodStartHeight = value(getInteger(keyPeriodStartHeight(0)))
269264 let zeroPeriodEndHeight = value(getInteger(keyPeriodEndHeight(0)))
270- let $t01444214824 = if ((height > zeroPeriodEndHeight))
265+ let $t01407414456 = if ((height > zeroPeriodEndHeight))
271266 then {
272267 let updatedCurrentPeriod = (currentPeriod + 1)
273268 let periodStart = (zeroPeriodEndHeight + 1)
275270 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
276271 }
277272 else $Tuple3(currentPeriod, zeroPeriodStartHeight, zeroPeriodEndHeight)
278- let updatedCurrentPeriod = $t01444214824._1
279- let periodStart = $t01444214824._2
280- let periodEnd = $t01444214824._3
273+ let updatedCurrentPeriod = $t01407414456._1
274+ let periodStart = $t01407414456._2
275+ let periodEnd = $t01407414456._3
281276 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
282277 }
283278 else $Tuple3(currentPeriod, valueOrElse(getInteger(keyPeriodStartHeight(currentPeriod)), height), valueOrElse(getInteger(keyPeriodEndHeight(currentPeriod)), ((height + periodLength) - 1)))
284- let updatedCurrentPeriod = $t01322215092._1
285- let periodStart = $t01322215092._2
286- let periodEnd = $t01322215092._3
279+ let updatedCurrentPeriod = $t01285414724._1
280+ let periodStart = $t01285414724._2
281+ let periodEnd = $t01285414724._3
287282 let periodTotalAvailableToClaim = valueOrElse(getInteger(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod)), totalPeriodPriceAssetAllowance)
288283 let periodUserAvailableToClaim = valueOrElse(getInteger(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58)), userPeriodPriceAssetAllowance)
289284 let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
290285 let periodMinAvailableToClaim = min([(outAmount + priceAssetBalance), periodTotalAvailableToClaim, periodUserAvailableToClaim])
291286 let usdtPriceAssetAllowableRatio = value(getInteger(keyUsdtPriceAssetAllowableRatio()))
292287 let putOneTknV2PriceAssetAmount = scale8
293- let $t01584716100 = {
288+ let $t01547915732 = {
294289 let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "putOneTknV2WithoutTakeFeeREADONLY", [putOneTknV2PriceAssetAmount, priceAssetId58], nil)
295290 if ($isInstanceOf(@, "(Int, Int, Int)"))
296291 then @
297292 else throw("Couldn't cast Any to (Int, Int, Int)")
298293 }
299- if (($t01584716100 == $t01584716100))
294+ if (($t01547915732 == $t01547915732))
300295 then {
301- let bonus = $t01584716100._3
302- let feeAmount = $t01584716100._2
303- let lpAmount = $t01584716100._1
296+ let bonus = $t01547915732._3
297+ let feeAmount = $t01547915732._2
298+ let lpAmount = $t01547915732._1
304299 let usdtAssetId = value(getString(keyUsdtAssetId()))
305- let $t01616216380 = {
300+ let $t01579416012 = {
306301 let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "getOneTknV2READONLY", [usdtAssetId, lpAmount], nil)
307302 if ($isInstanceOf(@, "(Int, Int)"))
308303 then @
309304 else throw("Couldn't cast Any to (Int, Int)")
310305 }
311- if (($t01616216380 == $t01616216380))
306+ if (($t01579416012 == $t01579416012))
312307 then {
313- let getOneTknV2FeeAmount = $t01616216380._2
314- let usdtAmount = $t01616216380._1
308+ let getOneTknV2FeeAmount = $t01579416012._2
309+ let usdtAmount = $t01579416012._1
315310 let currentUsdtPriceAssetRatio = fraction(putOneTknV2PriceAssetAmount, scale8, usdtAmount)
316311 let endPeriodBlocksLeft = (periodEnd - height)
317312 $Tuple10(periodMinAvailableToClaim, periodTotalAvailableToClaim, periodUserAvailableToClaim, totalUserAvailableToClaim, usdtPriceAssetAllowableRatio, currentUsdtPriceAssetRatio, endPeriodBlocksLeft, updatedCurrentPeriod, periodStart, periodEnd)
455450 let priceAssetDecimals = value(assetInfo(fromBase58String(priceAssetId58))).decimals
456451 let entries = if ((claimedAssetId58 == priceAssetId58))
457452 then {
458- let $t02228922733 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
459- let periodMinAvailableToClaim = $t02228922733._1
460- let periodTotalAvailableToClaim = $t02228922733._2
461- let periodUserAvailableToClaim = $t02228922733._3
462- let totalUserAvailableToClaim = $t02228922733._4
463- let usdtPriceAssetAllowableRatio = $t02228922733._5
464- let currentUsdtPriceAssetRatio = $t02228922733._6
465- let endPeriodBlocksLeft = $t02228922733._7
466- let updatedCurrentPeriod = $t02228922733._8
467- let periodStart = $t02228922733._9
468- let periodEnd = $t02228922733._10
453+ let $t02192122365 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
454+ let periodMinAvailableToClaim = $t02192122365._1
455+ let periodTotalAvailableToClaim = $t02192122365._2
456+ let periodUserAvailableToClaim = $t02192122365._3
457+ let totalUserAvailableToClaim = $t02192122365._4
458+ let usdtPriceAssetAllowableRatio = $t02192122365._5
459+ let currentUsdtPriceAssetRatio = $t02192122365._6
460+ let endPeriodBlocksLeft = $t02192122365._7
461+ let updatedCurrentPeriod = $t02192122365._8
462+ let periodStart = $t02192122365._9
463+ let periodEnd = $t02192122365._10
469464 let checks = [if ((periodUserAvailableToClaim > 0))
470465 then true
471466 else throwErr("unavailable to claim because user period allowance reached"), if ((periodTotalAvailableToClaim > 0))
531526 let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
532527 let priceAssetBalanceIdoDecimals = (priceAssetBalance * 100)
533528 let availableIdoAmountToClaimWithPriceAssetBalance = (availableIdoAmountToClaim + priceAssetBalanceIdoDecimals)
534- let $t02902629438 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
535- let periodMinAvailableToClaim = $t02902629438._1
536- let periodTotalAvailableToClaim = $t02902629438._2
537- let periodUserAvailableToClaim = $t02902629438._3
538- let totalUserAvailableToClaim = $t02902629438._4
539- let usdtPriceAssetAllowableRatio = $t02902629438._5
540- let currentUsdtPriceAssetRatio = $t02902629438._6
541- let endPeriodBlocksLeft = $t02902629438._7
542- let updatedCurrentPeriod = $t02902629438._8
543- let periodStart = $t02902629438._9
544- let periodEnd = $t02902629438._10
529+ let $t02865829070 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
530+ let periodMinAvailableToClaim = $t02865829070._1
531+ let periodTotalAvailableToClaim = $t02865829070._2
532+ let periodUserAvailableToClaim = $t02865829070._3
533+ let totalUserAvailableToClaim = $t02865829070._4
534+ let usdtPriceAssetAllowableRatio = $t02865829070._5
535+ let currentUsdtPriceAssetRatio = $t02865829070._6
536+ let endPeriodBlocksLeft = $t02865829070._7
537+ let updatedCurrentPeriod = $t02865829070._8
538+ let periodStart = $t02865829070._9
539+ let periodEnd = $t02865829070._10
545540 let currentPeriodEndHeight = valueOrElse(getInteger(keyPeriodEndHeight(updatedCurrentPeriod)), 0)
546541 let userTotalPriceAssetClaimed = (parseIntValue(readInvestorArrayOrFail(userAddress58)[IdxInvClaimedPriceAssetAmount]) - priceAssetBalance)
547542 let resultString = if ((height > currentPeriodEndHeight))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
55
66
77 let SEP = "__"
88
99 let BUFSCALE = toBigInt(1000000000000000000)
1010
1111 let scale8 = 100000000
1212
1313 func throwErr (msg) = throw(makeString(["ido.ride:", msg], " "))
1414
1515
1616 func convertPriceAssetIntoIdoAsset (priceAssetAmount,priceAssetMULT,price,priceMULT,idoAssetMULT) = {
1717 let bPriceAssetMULT = toBigInt(priceAssetMULT)
1818 let bIdoAssetMULT = toBigInt(idoAssetMULT)
1919 let bPriceAssetBUF = fraction(toBigInt(priceAssetAmount), BUFSCALE, bPriceAssetMULT)
2020 let bAmountAssetBUF = fraction(bPriceAssetBUF, toBigInt(priceMULT), toBigInt(price))
2121 toInt(fraction(bAmountAssetBUF, toBigInt(idoAssetMULT), BUFSCALE))
2222 }
2323
2424
2525 let IdxCfgIdoStart = 1
2626
2727 let IdxCfgIdoDuration = 2
2828
2929 let IdxCfgClaimStart = 3
3030
3131 let IdxCfgClaimDuration = 4
3232
3333 let IdxCfgPrice = 5
3434
3535 let IdxCfgPriceMult = 6
3636
3737 let IdxCfgIdoAssetId = 7
3838
3939 let IdxCfgIdoAssetMult = 8
4040
4141 let IdxCfgPriceAssetId = 9
4242
4343 let IdxCfgPriceAssetMult = 10
4444
4545 let IdxCfgMinInvestAmount = 11
4646
4747 func fromatConfigS (idoStart,idoDuration,claimStart,claimDuration,price,priceMult,idoAssetId58,idoAssetMult,priceAssetId58,priceAssetMult,minInvestAmount,totalIdoAssetToSell) = makeString(["%d%d%d%d%d%d%s%d%s%d%d%d", idoStart, idoDuration, claimStart, claimDuration, price, priceMult, idoAssetId58, idoAssetMult, priceAssetId58, priceAssetMult, minInvestAmount, totalIdoAssetToSell], SEP)
4848
4949
5050 func fromatConfig (idoStart,idoDuration,claimStart,claimDuration,price,priceMult,idoAssetId58,idoAssetMult,priceAssetId58,priceAssetMult,minInvestAmount,totalIdoAssetToSell) = fromatConfigS(toString(idoStart), toString(idoDuration), toString(claimStart), toString(claimDuration), toString(price), toString(priceMult), idoAssetId58, toString(idoAssetMult), priceAssetId58, toString(priceAssetMult), toString(minInvestAmount), toString(totalIdoAssetToSell))
5151
5252
5353 let IdxInvTotalAmount = 1
5454
5555 let IdxInvRemainingAmount = 2
5656
5757 let IdxInvClaimedPriceAssetAmount = 3
5858
5959 let IdxInvClaimedIdoAssetAmount = 4
6060
6161 let IdxInvLastClaimedHeight = 5
6262
6363 func formatInvestorS (totalAmount,remainingAmount,claimedPriceAssetAmount,claimedIdoAssetAmount,lastClaimedHeight) = makeString(["%d%d%d%d%d", totalAmount, remainingAmount, claimedPriceAssetAmount, claimedIdoAssetAmount, lastClaimedHeight], SEP)
6464
6565
6666 func formatInvestor (totalAmount,remainingAmount,claimedPriceAssetAmount,claimedIdoAssetAmount,lastClaimedHeight) = formatInvestorS(toString(totalAmount), toString(remainingAmount), toString(claimedPriceAssetAmount), toString(claimedIdoAssetAmount), toString(lastClaimedHeight))
6767
6868
6969 func formatHistoryRecord (priceAssetAmount,idoAssetAmount) = makeString(["%d%d%d%d", toString(height), toString(lastBlock.timestamp), toString(priceAssetAmount), toString(idoAssetAmount)], SEP)
7070
7171
7272 func keyConfig () = "%s__config"
7373
7474
7575 func keyInvestor (userAddress) = ("%s__" + userAddress)
7676
7777
7878 func keyTotals () = "%s__totals"
7979
8080
8181 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
8282
8383
8484 func keyUSDNClaimDisabled () = "%s__usdnClaimDisabled"
8585
8686
8787 func keyUSDNClaimEndHeight () = "%s__usdnClaimEndHeight"
8888
8989
9090 func keyPeriodLength () = makeString(["%s", "periodLength"], SEP)
9191
9292
9393 func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP)
9494
9595
9696 func keyPeriodStartHeight (periodNum) = makeString(["%s%s", "periodStartHeight", toString(periodNum)], SEP)
9797
9898
9999 func keyPeriodEndHeight (periodNum) = makeString(["%s%s", "periodEndHeight", toString(periodNum)], SEP)
100100
101101
102102 func keyUsdtPriceAssetAllowableRatio () = makeString(["%s", "usdtPriceAssetAllowableRatio"], SEP)
103103
104104
105105 func keyTotalPeriodAllowance (assetId) = makeString(["%s%s", "totalPeriodAllowance", assetId], SEP)
106106
107107
108108 func keyUserPeriodAllowance (assetId) = makeString(["%s%s", "userPeriodAllowance", assetId], SEP)
109109
110110
111111 func keyPeriodTotalAvailableToClaim (assetId,periodNum) = makeString(["%s%s%s", "periodTotalAvailableToClaim", assetId, toString(periodNum)], SEP)
112112
113113
114114 func keyPeriodUserAvailableToClaim (assetId,periodNum,userAddress) = makeString(["%s%s%s%s", "periodUserAvailableToClaim", assetId, toString(periodNum), userAddress], SEP)
115115
116116
117117 func keyUsdtPriceAssetStablePool () = makeString(["%s", "usdtPriceAssetStablePool"], SEP)
118118
119119
120120 func keyUsdtAssetId () = makeString(["%s", "usdtAssetId"], SEP)
121121
122122
123123 func keyPriceAssetBalance (address) = makeString(["%s%s", "priceAssetBalance", address], SEP)
124124
125125
126126 func keyManagerPublicKey () = "%s__managerPublicKey"
127127
128128
129129 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
130130
131131
132132 func readConfigArray () = split(getStringOrFail(keyConfig()), SEP)
133133
134134
135135 func readTotalsArrayOrDefaultByCustomKey (customKey) = split(valueOrElse(getString(customKey), formatInvestorS("0", "0", "0", "0", "0")), SEP)
136136
137137
138138 func readTotalsArrayOrDefault () = readTotalsArrayOrDefaultByCustomKey(keyTotals())
139139
140140
141141 func readInvestorArrayOrDefault (userAddress) = readTotalsArrayOrDefaultByCustomKey(keyInvestor(userAddress))
142142
143143
144144 func readInvestorArrayOrFail (userAddress) = split(getStringOrFail(keyInvestor(userAddress)), SEP)
145145
146146
147147 let IdxDiffTotalIncrement = 0
148148
149149 let IdxDiffRemainingPriceAmountIncrement = 1
150150
151151 let IdxDiffClaimedPriceAmountIncrement = 2
152152
153153 let IdxDiffClaimedIdoAssetAmountIncrement = 3
154154
155155 func TotalsEntry (key,origArray,incrementDiff,newLastClaimedHeight,priceAssetBalance) = {
156156 let totalAmount = parseIntValue(origArray[IdxInvTotalAmount])
157157 let remainingAmount = parseIntValue(origArray[IdxInvRemainingAmount])
158158 let claimedPriceAssetAmount = parseIntValue(origArray[IdxInvClaimedPriceAssetAmount])
159159 let claimedIdoAssetAmount = parseIntValue(origArray[IdxInvClaimedIdoAssetAmount])
160160 let lastClaimedHeight = parseIntValue(origArray[IdxInvLastClaimedHeight])
161161 let newTotalAmount = (totalAmount + incrementDiff[IdxDiffTotalIncrement])
162162 let newRemainingAmount = (remainingAmount + incrementDiff[IdxDiffRemainingPriceAmountIncrement])
163163 let cfgArray = readConfigArray()
164164 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
165165 let priceAssetDecimals = value(assetInfo(fromBase58String(priceAssetId58))).decimals
166166 let priceAssetBalancePriceAssetDecimals = fraction(priceAssetBalance, scale8, pow(10, 0, priceAssetDecimals, 0, 0, DOWN))
167167 let newClaimedPriceAssetAmount = ((claimedPriceAssetAmount + incrementDiff[IdxDiffClaimedPriceAmountIncrement]) - priceAssetBalance)
168168 let newClaimedIdoAssetAmount = ((claimedIdoAssetAmount + incrementDiff[IdxDiffClaimedIdoAssetAmountIncrement]) + priceAssetBalancePriceAssetDecimals)
169169 if ((0 > newRemainingAmount))
170170 then throwErr(makeString(["invalid math", toString(remainingAmount), toString(incrementDiff[IdxDiffRemainingPriceAmountIncrement]), toString(newRemainingAmount), toString(incrementDiff[IdxDiffTotalIncrement])], " "))
171171 else StringEntry(key, formatInvestor(newTotalAmount, newRemainingAmount, newClaimedPriceAssetAmount, newClaimedIdoAssetAmount, newLastClaimedHeight))
172172 }
173173
174174
175175 func InvestOperationHistoryEntry (userAddress,priceAssetAmount,idoAssetAmount,txId) = StringEntry(keyOperationHistoryRecord("invest", userAddress, toBase58String(txId)), formatHistoryRecord(priceAssetAmount, idoAssetAmount))
176176
177177
178178 func ClaimOperationHistoryEntry (userAddress,priceAssetAmount,idoAssetAmount,txId) = StringEntry(keyOperationHistoryRecord("claim", userAddress, toBase58String(txId)), formatHistoryRecord(priceAssetAmount, idoAssetAmount))
179179
180180
181181 func internalClaim (claimedAssetId58,userAddress,txId) = {
182182 let cfgArray = readConfigArray()
183183 let claimStart = parseIntValue(cfgArray[IdxCfgClaimStart])
184184 let claimDuration = parseIntValue(cfgArray[IdxCfgClaimDuration])
185185 let claimEnd = (claimStart + claimDuration)
186186 let price = parseIntValue(cfgArray[IdxCfgPrice])
187187 let priceMult = parseIntValue(cfgArray[IdxCfgPriceMult])
188188 let idoAssetId58 = cfgArray[IdxCfgIdoAssetId]
189189 let idoAssetId = fromBase58String(idoAssetId58)
190190 let idoAssetMult = parseIntValue(cfgArray[IdxCfgIdoAssetMult])
191191 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
192192 let priceAssetId = fromBase58String(priceAssetId58)
193193 let priceAssetMult = parseIntValue(cfgArray[IdxCfgPriceAssetMult])
194194 let userAddress58 = toString(userAddress)
195195 let origInvestArray = readInvestorArrayOrFail(userAddress58)
196196 let investTotalAmount = parseIntValue(origInvestArray[IdxInvTotalAmount])
197197 let investLastClaimedHeightTMP = parseIntValue(origInvestArray[IdxInvLastClaimedHeight])
198198 let investLastClaimedHeight = if ((claimStart >= investLastClaimedHeightTMP))
199199 then claimStart
200200 else investLastClaimedHeightTMP
201201 let newClaimPeriodHeight = if ((height > claimEnd))
202202 then claimEnd
203203 else if ((claimStart > height))
204204 then claimStart
205205 else height
206- let error1 = throwErr(makeString([toString(height), toString(claimStart), toString(claimEnd), toString(newClaimPeriodHeight)], " "))
207- if ((error1 == error1))
206+ let claimingBlocks = (newClaimPeriodHeight - investLastClaimedHeight)
207+ let claimingPriceAssetAmount = fraction(investTotalAmount, claimingBlocks, claimDuration)
208+ let error = throwErr(makeString([toString(height), toString(claimStart), toString(claimEnd), toString(newClaimPeriodHeight), toString(investLastClaimedHeight), toString(investTotalAmount), toString(claimingBlocks), toString(claimDuration), toString(claimingPriceAssetAmount)], " "))
209+ if ((error == error))
208210 then {
209- let claimingBlocks = (newClaimPeriodHeight - investLastClaimedHeight)
210- let claimingPriceAssetAmount = fraction(investTotalAmount, claimingBlocks, claimDuration)
211- let error = throwErr(makeString([toString(investTotalAmount), toString(claimingBlocks), toString(claimDuration), toString(claimingPriceAssetAmount)], " "))
212- if ((error == error))
213- then {
214- let claimingIdoAssetAmount = convertPriceAssetIntoIdoAsset(claimingPriceAssetAmount, priceAssetMult, price, priceMult, idoAssetMult)
215- let isUSDN = (claimedAssetId58 == priceAssetId58)
216- let isUSDNClaimDisabled = valueOrElse(getBoolean(keyUSDNClaimDisabled()), false)
217- let checks = [if (!(if (isUSDN)
218- then isUSDNClaimDisabled
219- else false))
220- then true
221- else throw("USDN claim is disabled")]
222- if ((checks == checks))
223- then if ((claimedAssetId58 == priceAssetId58))
224- then $Tuple6([0, -(claimingPriceAssetAmount), claimingPriceAssetAmount, 0], claimingPriceAssetAmount, priceAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
225- else if ((claimedAssetId58 == idoAssetId58))
226- then $Tuple6([0, -(claimingPriceAssetAmount), 0, claimingIdoAssetAmount], claimingIdoAssetAmount, idoAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
227- else throw(("unsupported assetId: " + claimedAssetId58))
228- else throw("Strict value is not equal to itself.")
229- }
211+ let claimingIdoAssetAmount = convertPriceAssetIntoIdoAsset(claimingPriceAssetAmount, priceAssetMult, price, priceMult, idoAssetMult)
212+ let isUSDN = (claimedAssetId58 == priceAssetId58)
213+ let isUSDNClaimDisabled = valueOrElse(getBoolean(keyUSDNClaimDisabled()), false)
214+ let checks = [if (!(if (isUSDN)
215+ then isUSDNClaimDisabled
216+ else false))
217+ then true
218+ else throw("USDN claim is disabled")]
219+ if ((checks == checks))
220+ then if ((claimedAssetId58 == priceAssetId58))
221+ then $Tuple6([0, -(claimingPriceAssetAmount), claimingPriceAssetAmount, 0], claimingPriceAssetAmount, priceAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
222+ else if ((claimedAssetId58 == idoAssetId58))
223+ then $Tuple6([0, -(claimingPriceAssetAmount), 0, claimingIdoAssetAmount], claimingIdoAssetAmount, idoAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
224+ else throw(("unsupported assetId: " + claimedAssetId58))
230225 else throw("Strict value is not equal to itself.")
231226 }
232227 else throw("Strict value is not equal to itself.")
233228 }
234229
235230
236231 func internalClaimV2 (priceAssetId58,userAddress58,outAmount,totalUserAvailableToClaim) = {
237232 let totalPeriodPriceAssetAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
238233 let userPeriodPriceAssetAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
239234 let periodLength = value(getInteger(keyPeriodLength()))
240235 let currentPeriod = valueOrElse(getInteger(keyCurrentPeriod()), 0)
241236 let zeroPeriodEndHeighIsDefined = isDefined(getInteger(keyPeriodEndHeight(0)))
242- let $t01322215092 = if ((currentPeriod > 0))
237+ let $t01285414724 = if ((currentPeriod > 0))
243238 then {
244239 let lastPeriodStartHeight = value(getInteger(keyPeriodStartHeight(currentPeriod)))
245240 let lastPeriodEndHeight = value(getInteger(keyPeriodEndHeight(currentPeriod)))
246- let $t01348214187 = if ((height > lastPeriodEndHeight))
241+ let $t01311413819 = if ((height > lastPeriodEndHeight))
247242 then {
248243 let updatedCurrentPeriod = (currentPeriod + 1)
249244 let periodStart = if ((height > (lastPeriodEndHeight + periodLength)))
250245 then {
251246 let blocksToLastPeriodStart = ((height - lastPeriodEndHeight) % periodLength)
252247 if ((blocksToLastPeriodStart == 0))
253248 then ((height - periodLength) + 1)
254249 else (height - blocksToLastPeriodStart)
255250 }
256251 else (lastPeriodEndHeight + 1)
257252 let periodEnd = ((periodStart + periodLength) - 1)
258253 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
259254 }
260255 else $Tuple3(currentPeriod, lastPeriodStartHeight, lastPeriodEndHeight)
261- let updatedCurrentPeriod = $t01348214187._1
262- let periodStart = $t01348214187._2
263- let periodEnd = $t01348214187._3
256+ let updatedCurrentPeriod = $t01311413819._1
257+ let periodStart = $t01311413819._2
258+ let periodEnd = $t01311413819._3
264259 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
265260 }
266261 else if (zeroPeriodEndHeighIsDefined)
267262 then {
268263 let zeroPeriodStartHeight = value(getInteger(keyPeriodStartHeight(0)))
269264 let zeroPeriodEndHeight = value(getInteger(keyPeriodEndHeight(0)))
270- let $t01444214824 = if ((height > zeroPeriodEndHeight))
265+ let $t01407414456 = if ((height > zeroPeriodEndHeight))
271266 then {
272267 let updatedCurrentPeriod = (currentPeriod + 1)
273268 let periodStart = (zeroPeriodEndHeight + 1)
274269 let periodEnd = ((periodStart + periodLength) - 1)
275270 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
276271 }
277272 else $Tuple3(currentPeriod, zeroPeriodStartHeight, zeroPeriodEndHeight)
278- let updatedCurrentPeriod = $t01444214824._1
279- let periodStart = $t01444214824._2
280- let periodEnd = $t01444214824._3
273+ let updatedCurrentPeriod = $t01407414456._1
274+ let periodStart = $t01407414456._2
275+ let periodEnd = $t01407414456._3
281276 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
282277 }
283278 else $Tuple3(currentPeriod, valueOrElse(getInteger(keyPeriodStartHeight(currentPeriod)), height), valueOrElse(getInteger(keyPeriodEndHeight(currentPeriod)), ((height + periodLength) - 1)))
284- let updatedCurrentPeriod = $t01322215092._1
285- let periodStart = $t01322215092._2
286- let periodEnd = $t01322215092._3
279+ let updatedCurrentPeriod = $t01285414724._1
280+ let periodStart = $t01285414724._2
281+ let periodEnd = $t01285414724._3
287282 let periodTotalAvailableToClaim = valueOrElse(getInteger(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod)), totalPeriodPriceAssetAllowance)
288283 let periodUserAvailableToClaim = valueOrElse(getInteger(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58)), userPeriodPriceAssetAllowance)
289284 let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
290285 let periodMinAvailableToClaim = min([(outAmount + priceAssetBalance), periodTotalAvailableToClaim, periodUserAvailableToClaim])
291286 let usdtPriceAssetAllowableRatio = value(getInteger(keyUsdtPriceAssetAllowableRatio()))
292287 let putOneTknV2PriceAssetAmount = scale8
293- let $t01584716100 = {
288+ let $t01547915732 = {
294289 let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "putOneTknV2WithoutTakeFeeREADONLY", [putOneTknV2PriceAssetAmount, priceAssetId58], nil)
295290 if ($isInstanceOf(@, "(Int, Int, Int)"))
296291 then @
297292 else throw("Couldn't cast Any to (Int, Int, Int)")
298293 }
299- if (($t01584716100 == $t01584716100))
294+ if (($t01547915732 == $t01547915732))
300295 then {
301- let bonus = $t01584716100._3
302- let feeAmount = $t01584716100._2
303- let lpAmount = $t01584716100._1
296+ let bonus = $t01547915732._3
297+ let feeAmount = $t01547915732._2
298+ let lpAmount = $t01547915732._1
304299 let usdtAssetId = value(getString(keyUsdtAssetId()))
305- let $t01616216380 = {
300+ let $t01579416012 = {
306301 let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "getOneTknV2READONLY", [usdtAssetId, lpAmount], nil)
307302 if ($isInstanceOf(@, "(Int, Int)"))
308303 then @
309304 else throw("Couldn't cast Any to (Int, Int)")
310305 }
311- if (($t01616216380 == $t01616216380))
306+ if (($t01579416012 == $t01579416012))
312307 then {
313- let getOneTknV2FeeAmount = $t01616216380._2
314- let usdtAmount = $t01616216380._1
308+ let getOneTknV2FeeAmount = $t01579416012._2
309+ let usdtAmount = $t01579416012._1
315310 let currentUsdtPriceAssetRatio = fraction(putOneTknV2PriceAssetAmount, scale8, usdtAmount)
316311 let endPeriodBlocksLeft = (periodEnd - height)
317312 $Tuple10(periodMinAvailableToClaim, periodTotalAvailableToClaim, periodUserAvailableToClaim, totalUserAvailableToClaim, usdtPriceAssetAllowableRatio, currentUsdtPriceAssetRatio, endPeriodBlocksLeft, updatedCurrentPeriod, periodStart, periodEnd)
318313 }
319314 else throw("Strict value is not equal to itself.")
320315 }
321316 else throw("Strict value is not equal to itself.")
322317 }
323318
324319
325320 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
326321 case s: String =>
327322 fromBase58String(s)
328323 case _: Unit =>
329324 unit
330325 case _ =>
331326 throw("Match error")
332327 }
333328
334329
335330 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
336331 case s: String =>
337332 fromBase58String(s)
338333 case _: Unit =>
339334 unit
340335 case _ =>
341336 throw("Match error")
342337 }
343338
344339
345340 func mustManager (i) = {
346341 let pd = throw("Permission denied")
347342 match managerPublicKeyOrUnit() {
348343 case pk: ByteVector =>
349344 if ((i.callerPublicKey == pk))
350345 then true
351346 else pd
352347 case _: Unit =>
353348 if ((i.caller == this))
354349 then true
355350 else pd
356351 case _ =>
357352 throw("Match error")
358353 }
359354 }
360355
361356
362357 @Callable(i)
363358 func constructor (idoStart,idoDuration,claimStart,claimDuration,price,priceAssetId58,minInvestAmount) = {
364359 let priceMult = ((100 * 1000) * 1000)
365360 let idoEnd = (idoStart + idoDuration)
366361 if (isDefined(getString(keyConfig())))
367362 then throw("already initialized")
368363 else if (("3PMEHLx1j6zerarZTYfsGqDeeZqQoMpxq5S" != toString(i.caller)))
369364 then throw("not authorized")
370365 else if ((size(i.payments) != 1))
371366 then throw("exactly 1 payment must be attached")
372367 else if ((idoEnd >= claimStart))
373368 then throw("claimStart must be greater than idoEnd")
374369 else {
375370 let pmt = value(i.payments[0])
376371 let idoAssetId = value(pmt.assetId)
377372 let idoAssetInfo = valueOrErrorMessage(assetInfo(idoAssetId), "fail to load ido asset info")
378373 let idoAssetId58 = toBase58String(idoAssetId)
379374 let idoAssetMult = pow(10, 0, idoAssetInfo.decimals, 0, 0, DOWN)
380375 let priceAssetId = fromBase58String(priceAssetId58)
381376 let priceAssetInfo = valueOrErrorMessage(assetInfo(priceAssetId), "fail to load price asset info")
382377 let priceAssetMult = pow(10, 0, priceAssetInfo.decimals, 0, 0, DOWN)
383378 let origTotalsArray = readTotalsArrayOrDefault()
384379 let totalsDiff = [0, 0, 0, 0]
385380 [StringEntry(keyConfig(), fromatConfig(idoStart, idoDuration, claimStart, claimDuration, price, priceMult, idoAssetId58, idoAssetMult, priceAssetId58, priceAssetMult, minInvestAmount, pmt.amount)), TotalsEntry(keyTotals(), origTotalsArray, totalsDiff, claimStart, 0)]
386381 }
387382 }
388383
389384
390385
391386 @Callable(i)
392387 func invest () = {
393388 let cfgArray = readConfigArray()
394389 let idoStart = parseIntValue(cfgArray[IdxCfgIdoStart])
395390 let idoDuration = parseIntValue(cfgArray[IdxCfgIdoDuration])
396391 let idoEnd = (idoStart + idoDuration)
397392 let claimStart = parseIntValue(cfgArray[IdxCfgClaimStart])
398393 let claimDuration = parseIntValue(cfgArray[IdxCfgClaimDuration])
399394 let price = parseIntValue(cfgArray[IdxCfgPrice])
400395 let priceMult = parseIntValue(cfgArray[IdxCfgPriceMult])
401396 let idoAssetId58 = cfgArray[IdxCfgIdoAssetId]
402397 let idoAssetId = fromBase58String(idoAssetId58)
403398 let idoAssetMult = parseIntValue(cfgArray[IdxCfgIdoAssetMult])
404399 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
405400 let priceAssetId = fromBase58String(priceAssetId58)
406401 let priceAssetMult = parseIntValue(cfgArray[IdxCfgPriceAssetMult])
407402 let minIvestAmount = parseIntValue(cfgArray[IdxCfgMinInvestAmount])
408403 let userAddress = toString(i.caller)
409404 if ((idoStart > height))
410405 then throw("ido has not been started yet")
411406 else if ((height > idoEnd))
412407 then throw("ido has been already ended")
413408 else if ((size(i.payments) != 1))
414409 then throw("exactly 1 payment is expected")
415410 else {
416411 let pmt = value(i.payments[0])
417412 let pmtAssetId = value(pmt.assetId)
418413 let pmtAmount = pmt.amount
419414 if ((pmtAssetId != priceAssetId))
420415 then throw((("invalid payment asset id: " + toBase58String(pmtAssetId)) + " is expected"))
421416 else {
422417 let origInvestorArray = readInvestorArrayOrDefault(userAddress)
423418 let origTotalsArray = readTotalsArrayOrDefault()
424419 let newPriceTotalAmount = (parseIntValue(origTotalsArray[IdxInvTotalAmount]) + pmtAmount)
425420 let requiredIdoAssetAmount = (newPriceTotalAmount * 100)
426421 if ((requiredIdoAssetAmount > assetBalance(this, idoAssetId)))
427422 then throw("IDO asset has been - sold consider to use smaller payment")
428423 else {
429424 let totalsDiff = [pmtAmount, pmtAmount, 0, 0]
430425 [TotalsEntry(keyInvestor(userAddress), origInvestorArray, totalsDiff, claimStart, 0), TotalsEntry(keyTotals(), origTotalsArray, totalsDiff, claimStart, 0), InvestOperationHistoryEntry(userAddress, pmtAmount, 0, i.transactionId)]
431426 }
432427 }
433428 }
434429 }
435430
436431
437432
438433 @Callable(i)
439434 func claim (claimedAssetId58,userAddress58) = {
440435 let callerAddress58 = toString(i.caller)
441436 if ((userAddress58 != callerAddress58))
442437 then throw("not authorized")
443438 else {
444439 let cfgArray = readConfigArray()
445440 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
446441 let claimResultTuple = internalClaim(claimedAssetId58, i.caller, i.transactionId)
447442 let totalsDiff = claimResultTuple._1
448443 let outAmount = claimResultTuple._2
449444 let outAssetId = claimResultTuple._3
450445 let origInvestArray = claimResultTuple._4
451446 let newClaimPeriodHeight = claimResultTuple._5
452447 let claimedPriceAmountFromDiff = totalsDiff[IdxDiffClaimedPriceAmountIncrement]
453448 let claimedIdoAssetAmountFromDiff = totalsDiff[IdxDiffClaimedIdoAssetAmountIncrement]
454449 let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
455450 let priceAssetDecimals = value(assetInfo(fromBase58String(priceAssetId58))).decimals
456451 let entries = if ((claimedAssetId58 == priceAssetId58))
457452 then {
458- let $t02228922733 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
459- let periodMinAvailableToClaim = $t02228922733._1
460- let periodTotalAvailableToClaim = $t02228922733._2
461- let periodUserAvailableToClaim = $t02228922733._3
462- let totalUserAvailableToClaim = $t02228922733._4
463- let usdtPriceAssetAllowableRatio = $t02228922733._5
464- let currentUsdtPriceAssetRatio = $t02228922733._6
465- let endPeriodBlocksLeft = $t02228922733._7
466- let updatedCurrentPeriod = $t02228922733._8
467- let periodStart = $t02228922733._9
468- let periodEnd = $t02228922733._10
453+ let $t02192122365 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
454+ let periodMinAvailableToClaim = $t02192122365._1
455+ let periodTotalAvailableToClaim = $t02192122365._2
456+ let periodUserAvailableToClaim = $t02192122365._3
457+ let totalUserAvailableToClaim = $t02192122365._4
458+ let usdtPriceAssetAllowableRatio = $t02192122365._5
459+ let currentUsdtPriceAssetRatio = $t02192122365._6
460+ let endPeriodBlocksLeft = $t02192122365._7
461+ let updatedCurrentPeriod = $t02192122365._8
462+ let periodStart = $t02192122365._9
463+ let periodEnd = $t02192122365._10
469464 let checks = [if ((periodUserAvailableToClaim > 0))
470465 then true
471466 else throwErr("unavailable to claim because user period allowance reached"), if ((periodTotalAvailableToClaim > 0))
472467 then true
473468 else throwErr("unavailable to claim because total period allowance reached"), if ((periodMinAvailableToClaim > 0))
474469 then true
475470 else throwErr("nothing to claim"), if ((usdtPriceAssetAllowableRatio > currentUsdtPriceAssetRatio))
476471 then true
477472 else throwErr("unavailable to claim because usdn price lower than usdtPriceAssetAllowableRatio")]
478473 if ((checks == checks))
479474 then {
480475 let updatedPeriodTotalAvailableToClaim = (periodTotalAvailableToClaim - periodMinAvailableToClaim)
481476 let updatedPeriodUserAvailableToClaim = (periodUserAvailableToClaim - periodMinAvailableToClaim)
482477 let entries = if ((priceAssetBalance >= periodMinAvailableToClaim))
483478 then [ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), IntegerEntry(keyPriceAssetBalance(userAddress58), (priceAssetBalance - periodMinAvailableToClaim))]
484479 else {
485480 let updatedPriceAssetBalance = ((priceAssetBalance + outAmount) - periodMinAvailableToClaim)
486481 [TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight, 0), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight, 0), IntegerEntry(keyPriceAssetBalance(userAddress58), updatedPriceAssetBalance), ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId)]
487482 }
488483 $Tuple2(([IntegerEntry(keyCurrentPeriod(), updatedCurrentPeriod), IntegerEntry(keyPeriodStartHeight(updatedCurrentPeriod), periodStart), IntegerEntry(keyPeriodEndHeight(updatedCurrentPeriod), periodEnd), IntegerEntry(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod), updatedPeriodTotalAvailableToClaim), IntegerEntry(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58), updatedPeriodUserAvailableToClaim), ClaimOperationHistoryEntry(userAddress58, periodMinAvailableToClaim, claimedIdoAssetAmountFromDiff, i.transactionId)] ++ entries), unit)
489484 }
490485 else throw("Strict value is not equal to itself.")
491486 }
492487 else {
493488 let priceAssetBalanceIdoDecimals = fraction(priceAssetBalance, scale8, pow(10, 0, priceAssetDecimals, 0, 0, DOWN))
494489 $Tuple2([ScriptTransfer(i.caller, (outAmount + priceAssetBalanceIdoDecimals), outAssetId), IntegerEntry(keyPriceAssetBalance(userAddress58), 0), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight, priceAssetBalance), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight, priceAssetBalance), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, (claimedIdoAssetAmountFromDiff + priceAssetBalanceIdoDecimals), i.transactionId)], unit)
495490 }
496491 entries
497492 }
498493 }
499494
500495
501496
502497 @Callable(i)
503498 func claimREADONLY (claimedAssetId58,userAddress58) = {
504499 let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
505500 let totalsDiff = claimResultTuple._1
506501 let outAmount = claimResultTuple._2
507502 let outAssetId = claimResultTuple._3
508503 let origInvestArray = claimResultTuple._4
509504 let newClaimPeriodHeight = claimResultTuple._5
510505 let availableToClaimArray = claimResultTuple._6
511506 let availablePriceAmountToClaim = availableToClaimArray[0]
512507 let availableIdoAmountToClaim = availableToClaimArray[1]
513508 $Tuple2(nil, makeString(["%s%d%d", userAddress58, toString(availablePriceAmountToClaim), toString(availableIdoAmountToClaim)], SEP))
514509 }
515510
516511
517512
518513 @Callable(i)
519514 func claimV2READONLY (claimedAssetId58,userAddress58) = {
520515 let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
521516 let totalsDiff = claimResultTuple._1
522517 let outAmount = claimResultTuple._2
523518 let outAssetId = claimResultTuple._3
524519 let origInvestArray = claimResultTuple._4
525520 let newClaimPeriodHeight = claimResultTuple._5
526521 let availableToClaimArray = claimResultTuple._6
527522 let availablePriceAmountToClaim = availableToClaimArray[0]
528523 let availableIdoAmountToClaim = availableToClaimArray[1]
529524 let cfgArray = readConfigArray()
530525 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
531526 let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
532527 let priceAssetBalanceIdoDecimals = (priceAssetBalance * 100)
533528 let availableIdoAmountToClaimWithPriceAssetBalance = (availableIdoAmountToClaim + priceAssetBalanceIdoDecimals)
534- let $t02902629438 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
535- let periodMinAvailableToClaim = $t02902629438._1
536- let periodTotalAvailableToClaim = $t02902629438._2
537- let periodUserAvailableToClaim = $t02902629438._3
538- let totalUserAvailableToClaim = $t02902629438._4
539- let usdtPriceAssetAllowableRatio = $t02902629438._5
540- let currentUsdtPriceAssetRatio = $t02902629438._6
541- let endPeriodBlocksLeft = $t02902629438._7
542- let updatedCurrentPeriod = $t02902629438._8
543- let periodStart = $t02902629438._9
544- let periodEnd = $t02902629438._10
529+ let $t02865829070 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
530+ let periodMinAvailableToClaim = $t02865829070._1
531+ let periodTotalAvailableToClaim = $t02865829070._2
532+ let periodUserAvailableToClaim = $t02865829070._3
533+ let totalUserAvailableToClaim = $t02865829070._4
534+ let usdtPriceAssetAllowableRatio = $t02865829070._5
535+ let currentUsdtPriceAssetRatio = $t02865829070._6
536+ let endPeriodBlocksLeft = $t02865829070._7
537+ let updatedCurrentPeriod = $t02865829070._8
538+ let periodStart = $t02865829070._9
539+ let periodEnd = $t02865829070._10
545540 let currentPeriodEndHeight = valueOrElse(getInteger(keyPeriodEndHeight(updatedCurrentPeriod)), 0)
546541 let userTotalPriceAssetClaimed = (parseIntValue(readInvestorArrayOrFail(userAddress58)[IdxInvClaimedPriceAssetAmount]) - priceAssetBalance)
547542 let resultString = if ((height > currentPeriodEndHeight))
548543 then {
549544 let periodLenght = value(getInteger(keyPeriodLength()))
550545 let userPeriodAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
551546 let totalPeriodAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
552547 makeString(["%d%d%d%d%d%d", toString(availableIdoAmountToClaimWithPriceAssetBalance), toString(userPeriodAllowance), toString(totalPeriodAllowance), toString(usdtPriceAssetAllowableRatio), toString(currentUsdtPriceAssetRatio), toString(periodLenght), toString(userTotalPriceAssetClaimed)], SEP)
553548 }
554549 else makeString(["%d%d%d%d%d%d", toString(availableIdoAmountToClaimWithPriceAssetBalance), toString(periodMinAvailableToClaim), toString(periodTotalAvailableToClaim), toString(usdtPriceAssetAllowableRatio), toString(currentUsdtPriceAssetRatio), toString(endPeriodBlocksLeft), toString(userTotalPriceAssetClaimed)], SEP)
555550 $Tuple2(nil, resultString)
556551 }
557552
558553
559554
560555 @Callable(i)
561556 func setManager (pendingManagerPublicKey) = {
562557 let checkCaller = mustManager(i)
563558 if ((checkCaller == checkCaller))
564559 then {
565560 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
566561 if ((checkManagerPublicKey == checkManagerPublicKey))
567562 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
568563 else throw("Strict value is not equal to itself.")
569564 }
570565 else throw("Strict value is not equal to itself.")
571566 }
572567
573568
574569
575570 @Callable(i)
576571 func confirmManager () = {
577572 let pm = pendingManagerPublicKeyOrUnit()
578573 let hasPM = if (isDefined(pm))
579574 then true
580575 else throw("No pending manager")
581576 if ((hasPM == hasPM))
582577 then {
583578 let checkPM = if ((i.callerPublicKey == value(pm)))
584579 then true
585580 else throw("You are not pending manager")
586581 if ((checkPM == checkPM))
587582 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
588583 else throw("Strict value is not equal to itself.")
589584 }
590585 else throw("Strict value is not equal to itself.")
591586 }
592587
593588
594589 @Verifier(tx)
595590 func verify () = {
596591 let targetPublicKey = match managerPublicKeyOrUnit() {
597592 case pk: ByteVector =>
598593 pk
599594 case _: Unit =>
600595 tx.senderPublicKey
601596 case _ =>
602597 throw("Match error")
603598 }
604599 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
605600 }
606601

github/deemru/w8io/3ef1775 
250.41 ms