tx · F1vVxQvSLefpedwH8scZKUaaciRW1S2YYqbcssG7oR6J

3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy:  -0.01000000 Waves

2021.12.01 20:47 [1815532] smart account 3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy > SELF 0.00000000 Waves

{ "type": 13, "id": "F1vVxQvSLefpedwH8scZKUaaciRW1S2YYqbcssG7oR6J", "fee": 1000000, "feeAssetId": null, "timestamp": 1638380868366, "version": 1, "sender": "3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy", "senderPublicKey": "9W33iCCNfmFxUbiC6XZcH5x7f6xfwC7Jb3BoExT5q2PV", "proofs": [ "4HaRW9CGU5mEBVX24YBAcXgZzR8CXeUkyAyj7fTstB2bE1F6defmPB5RJbPxj3e9N53Lnb36YdaFfsyEQihzvsbv" ], "script": "base64:AAIFAAAAAAAAACoIAhIICgYICAEBAQgSAwoBARIDCgEBEgMKAQgSAwoBCBIDCgEIEgMKAQgAAABUAAAAAANTRVACAAAAAl9fAAAAAAZTQ0FMRTgAAAAAAAAAAAgAAAAABU1VTFQ4AAAAAAAF9eEAAAAAAA9CT09TVE1BWERJVklERVIAAAAAAAAPQkABAAAAD2dldFN0cmluZ09yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACAgAAAA9tYW5kYXRvcnkgdGhpcy4FAAAAA2tleQIAAAAPIGlzIG5vdCBkZWZpbmVkAQAAAAxnZXRJbnRPclplcm8AAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQAAAAAAAAAAAAEAAAAPZ2V0SW50T3JEZWZhdWx0AAAAAwAAAAdhZGRyZXNzAAAAA2tleQAAAApkZWZhdWx0VmFsCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQUAAAAKZGVmYXVsdFZhbAEAAAAMZ2V0SW50T3JGYWlsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAICAAAAD21hbmRhdG9yeSB0aGlzLgUAAAADa2V5AgAAAA8gaXMgbm90IGRlZmluZWQBAAAACWFzQW55TGlzdAAAAAEAAAADdmFsBAAAAAckbWF0Y2gwBQAAAAN2YWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACUxpc3RbQW55XQQAAAAKdmFsQW55THlzdAUAAAAHJG1hdGNoMAUAAAAKdmFsQW55THlzdAkAAAIAAAABAgAAABtmYWlsIHRvIGNhc3QgaW50byBMaXN0W0FueV0BAAAABWFzSW50AAAAAQAAAAN2YWwEAAAAByRtYXRjaDAFAAAAA3ZhbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAZ2YWxJbnQFAAAAByRtYXRjaDAFAAAABnZhbEludAkAAAIAAAABAgAAABVmYWlsIHRvIGNhc3QgaW50byBJbnQBAAAAEWtleUZhY3RvcnlBZGRyZXNzAAAAAAIAAAAcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwAAAAAYSWR4RmFjdG9yeUNmZ1N0YWtpbmdEYXBwAAAAAAAAAAABAAAAABlJZHhGYWN0b3J5Q2ZnQm9vc3RpbmdEYXBwAAAAAAAAAAACAAAAABRJZHhGYWN0b3J5Q2ZnSWRvRGFwcAAAAAAAAAAAAwAAAAAVSWR4RmFjdG9yeUNmZ1RlYW1EYXBwAAAAAAAAAAAEAAAAABlJZHhGYWN0b3J5Q2ZnRW1pc3Npb25EYXBwAAAAAAAAAAAFAAAAABVJZHhGYWN0b3J5Q2ZnUmVzdERhcHAAAAAAAAAAAAYAAAAAGUlkeEZhY3RvcnlDZmdTbGlwcGFnZURhcHAAAAAAAAAAAAcBAAAADWtleUZhY3RvcnlDZmcAAAAAAgAAABElc19fZmFjdG9yeUNvbmZpZwEAAAAaa2V5RmFjdG9yeUxwMkFzc2V0c01hcHBpbmcAAAABAAAACmxwQXNzZXRTdHIJAAS5AAAAAgkABEwAAAACAgAAAAYlcyVzJXMJAARMAAAAAgUAAAAKbHBBc3NldFN0cgkABEwAAAACAgAAAB5tYXBwaW5nc19fbHBBc3NldDJQb29sQ29udHJhY3QFAAAAA25pbAUAAAADU0VQAQAAABBrZXlGYWN0b3J5THBMaXN0AAAAAAIAAAAQJXNfX2xwVG9rZW5zTGlzdAEAAAAma2V5RmFjdG9yeUxwQXNzZXRUb1Bvb2xDb250cmFjdEFkZHJlc3MAAAABAAAACmxwQXNzZXRTdHIJAAS5AAAAAgkABEwAAAACAgAAAAYlcyVzJXMJAARMAAAAAgUAAAAKbHBBc3NldFN0cgkABEwAAAACAgAAAB5tYXBwaW5nc19fbHBBc3NldDJQb29sQ29udHJhY3QFAAAAA25pbAUAAAADU0VQAQAAABRrZXlGYWN0b3J5UG9vbFdlaWdodAAAAAEAAAAPY29udHJhY3RBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAEJXMlcwkABEwAAAACAgAAAApwb29sV2VpZ2h0CQAETAAAAAIFAAAAD2NvbnRyYWN0QWRkcmVzcwUAAAADbmlsBQAAAANTRVABAAAAGHJlYWRGYWN0b3J5QWRkcmVzc09yRmFpbAAAAAAJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAR0aGlzCQEAAAARa2V5RmFjdG9yeUFkZHJlc3MAAAAAAQAAAApyZWFkTHBMaXN0AAAAAAkABLUAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIJAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAACQEAAAAQa2V5RmFjdG9yeUxwTGlzdAAAAAACAAAAAAUAAAADU0VQAQAAABRyZWFkRmFjdG9yeUNmZ09yRmFpbAAAAAEAAAAHZmFjdG9yeQkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAHZmFjdG9yeQkBAAAADWtleUZhY3RvcnlDZmcAAAAABQAAAANTRVABAAAAGGdldEJvb3N0aW5nQWRkcmVzc09yRmFpbAAAAAEAAAAKZmFjdG9yeUNmZwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAApmYWN0b3J5Q2ZnBQAAABlJZHhGYWN0b3J5Q2ZnQm9vc3RpbmdEYXBwAQAAABhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwAAAABAAAACmZhY3RvcnlDZmcJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZmFjdG9yeUNmZwUAAAAZSWR4RmFjdG9yeUNmZ0VtaXNzaW9uRGFwcAEAAAAXZ2V0U3Rha2luZ0FkZHJlc3NPckZhaWwAAAABAAAACmZhY3RvcnlDZmcJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZmFjdG9yeUNmZwUAAAAYSWR4RmFjdG9yeUNmZ1N0YWtpbmdEYXBwAQAAAB5rZXlFbWlzc2lvblJhdGVQZXJCbG9ja0N1cnJlbnQAAAAAAgAAABslcyVzX19yYXRlUGVyQmxvY2tfX2N1cnJlbnQBAAAAIWtleUVtaXNzaW9uUmF0ZVBlckJsb2NrTWF4Q3VycmVudAAAAAACAAAAHiVzJXNfX3JhdGVQZXJCbG9ja01heF9fY3VycmVudAEAAAAVa2V5RW1pc3Npb25TdGFydEJsb2NrAAAAAAIAAAAaJXMlc19fZW1pc3Npb25fX3N0YXJ0QmxvY2sBAAAAG2tleUVtaXNzaW9uRHVyYXRpb25JbkJsb2NrcwAAAAACAAAAGCVzJXNfX2VtaXNzaW9uX19kdXJhdGlvbgEAAAATa2V5RW1pc3Npb25FbmRCbG9jawAAAAACAAAAGCVzJXNfX2VtaXNzaW9uX19lbmRCbG9jawAAAAANSWR4Q2ZnQXNzZXRJZAAAAAAAAAAAAQAAAAATSWR4Q2ZnTWluTG9ja0Ftb3VudAAAAAAAAAAAAgAAAAAVSWR4Q2ZnTWluTG9ja0R1cmF0aW9uAAAAAAAAAAADAAAAABVJZHhDZmdNYXhMb2NrRHVyYXRpb24AAAAAAAAAAAQAAAAAEklkeENmZ01hdGhDb250cmFjdAAAAAAAAAAABQEAAAAJa2V5Q29uZmlnAAAAAAIAAAAKJXNfX2NvbmZpZwEAAAAVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAAAAAkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAACWtleUNvbmZpZwAAAAAFAAAAA1NFUAEAAAANZm9ybWF0Q29uZmlnUwAAAAUAAAAHYXNzZXRJZAAAAA1taW5Mb2NrQW1vdW50AAAAD21pbkxvY2tEdXJhdGlvbgAAAA9tYXhMb2NrRHVyYXRpb24AAAAMbWF0aENvbnRyYWN0CQAEuQAAAAIJAARMAAAAAgIAAAAIJXMlZCVkJWQJAARMAAAAAgUAAAAHYXNzZXRJZAkABEwAAAACBQAAAA1taW5Mb2NrQW1vdW50CQAETAAAAAIFAAAAD21pbkxvY2tEdXJhdGlvbgkABEwAAAACBQAAAA9tYXhMb2NrRHVyYXRpb24JAARMAAAAAgUAAAAMbWF0aENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAMZm9ybWF0Q29uZmlnAAAABQAAAAdhc3NldElkAAAADW1pbkxvY2tBbW91bnQAAAAPbWluTG9ja0R1cmF0aW9uAAAAD21heExvY2tEdXJhdGlvbgAAAAxtYXRoQ29udHJhY3QJAQAAAA1mb3JtYXRDb25maWdTAAAABQUAAAAHYXNzZXRJZAkAAaQAAAABBQAAAA1taW5Mb2NrQW1vdW50CQABpAAAAAEFAAAAD21pbkxvY2tEdXJhdGlvbgkAAaQAAAABBQAAAA9tYXhMb2NrRHVyYXRpb24FAAAADG1hdGhDb250cmFjdAAAAAAOSWR4TG9ja1VzZXJOdW0AAAAAAAAAAAEAAAAADUlkeExvY2tBbW91bnQAAAAAAAAAAAIAAAAADElkeExvY2tTdGFydAAAAAAAAAAAAwAAAAAPSWR4TG9ja0R1cmF0aW9uAAAAAAAAAAAEAAAAAA1JZHhMb2NrUGFyYW1LAAAAAAAAAAAFAAAAAA1JZHhMb2NrUGFyYW1CAAAAAAAAAAAGAQAAABNrZXlMb2NrUGFyYW1zUmVjb3JkAAAAAQAAAAt1c2VyQWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAACiVzJXNfX2xvY2sJAARMAAAAAgUAAAALdXNlckFkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAABpyZWFkTG9ja1BhcmFtc1JlY29yZE9yRmFpbAAAAAEAAAALdXNlckFkZHJlc3MJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAABHRoaXMJAQAAABNrZXlMb2NrUGFyYW1zUmVjb3JkAAAAAQUAAAALdXNlckFkZHJlc3MFAAAAA1NFUAEAAAAXZm9ybWF0TG9ja1BhcmFtc1JlY29yZFMAAAAIAAAAB3VzZXJOdW0AAAAGYW1vdW50AAAABXN0YXJ0AAAACGR1cmF0aW9uAAAABnBhcmFtSwAAAAZwYXJhbUIAAAAQbGFzdFVwZFRpbWVzdGFtcAAAAAlnd3hBbW91bnQJAAS5AAAAAgkABEwAAAACAgAAABAlZCVkJWQlZCVkJWQlZCVkCQAETAAAAAIFAAAAB3VzZXJOdW0JAARMAAAAAgUAAAAGYW1vdW50CQAETAAAAAIFAAAABXN0YXJ0CQAETAAAAAIFAAAACGR1cmF0aW9uCQAETAAAAAIFAAAABnBhcmFtSwkABEwAAAACBQAAAAZwYXJhbUIJAARMAAAAAgUAAAAQbGFzdFVwZFRpbWVzdGFtcAkABEwAAAACBQAAAAlnd3hBbW91bnQFAAAAA25pbAUAAAADU0VQAQAAABZmb3JtYXRMb2NrUGFyYW1zUmVjb3JkAAAABwAAAAd1c2VyTnVtAAAABmFtb3VudAAAAAVzdGFydAAAAAhkdXJhdGlvbgAAAAZwYXJhbUsAAAAGcGFyYW1CAAAACWd3eEFtb3VudAkBAAAAF2Zvcm1hdExvY2tQYXJhbXNSZWNvcmRTAAAACAUAAAAHdXNlck51bQkAAaQAAAABBQAAAAZhbW91bnQJAAGkAAAAAQUAAAAFc3RhcnQJAAGkAAAAAQUAAAAIZHVyYXRpb24JAAGkAAAAAQUAAAAGcGFyYW1LCQABpAAAAAEFAAAABnBhcmFtQgkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkAAaQAAAABBQAAAAlnd3hBbW91bnQBAAAADmtleU5leHRVc2VyTnVtAAAAAAIAAAAPJXNfX25leHRVc2VyTnVtAQAAABJrZXlVc2VyMk51bU1hcHBpbmcAAAABAAAAC3VzZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAZJXMlcyVzX19tYXBwaW5nX191c2VyMm51bQkABEwAAAACBQAAAAt1c2VyQWRkcmVzcwUAAAADbmlsBQAAAANTRVABAAAAEmtleU51bTJVc2VyTWFwcGluZwAAAAEAAAADbnVtCQAEuQAAAAIJAARMAAAAAgIAAAAZJXMlcyVzX19tYXBwaW5nX19udW0ydXNlcgkABEwAAAACBQAAAANudW0FAAAAA25pbAUAAAADU0VQAQAAABZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AAAAAQAAAAd1c2VyTnVtCQAEuQAAAAIJAARMAAAAAgIAAAAWJXMlZCVzX19wYXJhbUJ5VXNlck51bQkABEwAAAACBQAAAAd1c2VyTnVtCQAETAAAAAICAAAABmFtb3VudAUAAAADbmlsBQAAAANTRVABAAAAFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAABYlcyVkJXNfX3BhcmFtQnlVc2VyTnVtCQAETAAAAAIFAAAAB3VzZXJOdW0JAARMAAAAAgIAAAAFc3RhcnQFAAAAA25pbAUAAAADU0VQAQAAABRrZXlMb2NrUGFyYW1EdXJhdGlvbgAAAAEAAAAHdXNlck51bQkABLkAAAACCQAETAAAAAICAAAAFiVzJWQlc19fcGFyYW1CeVVzZXJOdW0JAARMAAAAAgUAAAAHdXNlck51bQkABEwAAAACAgAAAAhkdXJhdGlvbgUAAAADbmlsBQAAAANTRVABAAAADWtleUxvY2tQYXJhbUsAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAABYlcyVkJXNfX3BhcmFtQnlVc2VyTnVtCQAETAAAAAIFAAAAB3VzZXJOdW0JAARMAAAAAgIAAAABawUAAAADbmlsBQAAAANTRVABAAAADWtleUxvY2tQYXJhbUIAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAABYlcyVkJXNfX3BhcmFtQnlVc2VyTnVtCQAETAAAAAIFAAAAB3VzZXJOdW0JAARMAAAAAgIAAAABYgUAAAADbmlsBQAAAANTRVABAAAAFWtleUxvY2tQYXJhbUJ5UGVyaW9kSwAAAAIAAAAHdXNlck51bQAAAAZwZXJpb2QJAAS5AAAAAgkABEwAAAACAgAAABclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkABEwAAAACBQAAAAd1c2VyTnVtCQAETAAAAAICAAAAAWsJAARMAAAAAgUAAAAGcGVyaW9kBQAAAANuaWwFAAAAA1NFUAEAAAAVa2V5TG9ja1BhcmFtQnlQZXJpb2RCAAAAAgAAAAd1c2VyTnVtAAAABnBlcmlvZAkABLkAAAACCQAETAAAAAICAAAAFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQAETAAAAAIFAAAAB3VzZXJOdW0JAARMAAAAAgIAAAABYgkABEwAAAACBQAAAAZwZXJpb2QFAAAAA25pbAUAAAADU0VQAQAAABdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAAAAACAAAAHiVzJXNfX3N0YXRzX19hY3RpdmVUb3RhbExvY2tlZAEAAAAga2V5U3RhdHNMb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3MAAAAAAgAAACUlcyVzX19zdGF0c19fbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAAAgAAABclcyVzX19zdGF0c19fbG9ja3NDb3VudAEAAAASa2V5U3RhdHNVc2Vyc0NvdW50AAAAAAIAAAAdJXMlc19fc3RhdHNfX2FjdGl2ZVVzZXJzQ291bnQBAAAAIGtleVVzZXJCb29zdEVtaXNzaW9uTGFzdElOVEVHUkFMAAAAAQAAAAd1c2VyTnVtCQAEuQAAAAIJAARMAAAAAgIAAAAeJXMlZF9fdXNlckJvb3N0RW1pc3Npb25MYXN0SW50CQAETAAAAAIFAAAAB3VzZXJOdW0FAAAAA25pbAUAAAADU0VQAQAAABdrZXlVc2VyTWF4Qm9vc3RJTlRFR1JBTAAAAAEAAAAHdXNlck51bQkABLkAAAACCQAETAAAAAICAAAAESVzJWRfX21heEJvb3N0SW50CQAETAAAAAIFAAAAB3VzZXJOdW0FAAAAA25pbAUAAAADU0VQAQAAABhrZXlUb3RhbE1heEJvb3N0SU5URUdSQUwAAAAAAgAAABglcyVzX19tYXhCb29zdEludF9fdG90YWwBAAAAIWtleVVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbAAAAAEAAAAHdXNlck51bQkABLkAAAACCQAETAAAAAICAAAAJCVzJWRfX3VzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkABEwAAAACBQAAAAd1c2VyTnVtBQAAAANuaWwFAAAAA1NFUAEAAAATa2V5VXNlckJvb3N0Q2xhaW1lZAAAAAEAAAAHdXNlck51bQkABLkAAAACCQAETAAAAAICAAAAFiVzJWRfX3VzZXJCb29zdENsYWltZWQJAARMAAAAAgUAAAAHdXNlck51bQUAAAADbmlsBQAAAANTRVABAAAAE2tleU1heEJvb3N0TWlncmF0ZWQAAAABAAAADnVzZXJOdW1PclRvdGFsCQAEuQAAAAIJAARMAAAAAgIAAAAZJXMlc19fbWF4Qm9vc3RJbnRNaWdyYXRlZAkABEwAAAACBQAAAA51c2VyTnVtT3JUb3RhbAUAAAADbmlsBQAAAANTRVAAAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAGHJlYWRGYWN0b3J5QWRkcmVzc09yRmFpbAAAAAAAAAAACmZhY3RvcnlDZmcJAQAAABRyZWFkRmFjdG9yeUNmZ09yRmFpbAAAAAEFAAAAD2ZhY3RvcnlDb250cmFjdAAAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAGGdldEVtaXNzaW9uQWRkcmVzc09yRmFpbAAAAAEFAAAACmZhY3RvcnlDZmcAAAAAD3N0YWtpbmdDb250cmFjdAkBAAAAF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsAAAAAQUAAAAKZmFjdG9yeUNmZwEAAAAMSGlzdG9yeUVudHJ5AAAACAAAAAR0eXBlAAAABHVzZXIAAAAGYW1vdW50AAAACWxvY2tTdGFydAAAAAhkdXJhdGlvbgAAAAFrAAAAAWIAAAABaQQAAAAKaGlzdG9yeUtFWQkABLkAAAACCQAETAAAAAICAAAAESVzJXMlcyVzX19oaXN0b3J5CQAETAAAAAIFAAAABHR5cGUJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQFAAAAA25pbAUAAAADU0VQBAAAAAtoaXN0b3J5REFUQQkABLkAAAACCQAETAAAAAICAAAADiVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAZoZWlnaHQJAARMAAAAAgkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQABpAAAAAEFAAAABmFtb3VudAkABEwAAAACCQABpAAAAAEFAAAACWxvY2tTdGFydAkABEwAAAACCQABpAAAAAEFAAAACGR1cmF0aW9uCQAETAAAAAIJAAGkAAAAAQUAAAABawkABEwAAAACCQABpAAAAAEFAAAAAWIFAAAAA25pbAUAAAADU0VQCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAApoaXN0b3J5S0VZBQAAAAtoaXN0b3J5REFUQQEAAAAKU3RhdHNFbnRyeQAAAAQAAAAOdG90YWxMb2NrZWRJbmMAAAALZHVyYXRpb25JbmMAAAAMbG9ja0NvdW50SW5jAAAADXVzZXJzQ291bnRJbmMEAAAAG2xvY2tzRHVyYXRpb25TdW1JbkJsb2Nrc0tFWQkBAAAAIGtleVN0YXRzTG9ja3NEdXJhdGlvblN1bUluQmxvY2tzAAAAAAQAAAANbG9ja3NDb3VudEtFWQkBAAAAEmtleVN0YXRzTG9ja3NDb3VudAAAAAAEAAAADXVzZXJzQ291bnRLRVkJAQAAABJrZXlTdGF0c1VzZXJzQ291bnQAAAAABAAAAA50b3RhbEFtb3VudEtFWQkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAQAAAAYbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAbbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzS0VZBAAAAApsb2Nrc0NvdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAANbG9ja3NDb3VudEtFWQQAAAAKdXNlcnNDb3VudAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAADXVzZXJzQ291bnRLRVkEAAAAC3RvdGFsQW1vdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAOdG90YWxBbW91bnRLRVkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG2xvY2tzRHVyYXRpb25TdW1JbkJsb2Nrc0tFWQkAAGQAAAACBQAAABhsb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3MFAAAAC2R1cmF0aW9uSW5jCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1sb2Nrc0NvdW50S0VZCQAAZAAAAAIFAAAACmxvY2tzQ291bnQFAAAADGxvY2tDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANdXNlcnNDb3VudEtFWQkAAGQAAAACBQAAAAp1c2Vyc0NvdW50BQAAAA11c2Vyc0NvdW50SW5jCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA50b3RhbEFtb3VudEtFWQkAAGQAAAACBQAAAAt0b3RhbEFtb3VudAUAAAAOdG90YWxMb2NrZWRJbmMFAAAAA25pbAEAAAANY2FsY0d3eEFtb3VudAAAAAMAAAAEa1JhdwAAAARiUmF3AAAAAWgEAAAABVNDQUxFAAAAAAAAAAPoCQAAaQAAAAIJAABkAAAAAgkAAGgAAAACBQAAAARrUmF3BQAAAAFoBQAAAARiUmF3BQAAAAVTQ0FMRQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAACAAAAAt1c2VyQWRkcmVzcwAAAAd1c2VyTnVtAAAABmFtb3VudAAAAAVzdGFydAAAAAhkdXJhdGlvbgAAAAFrAAAAAWIAAAAGcGVyaW9kBAAAAA11c2VyQW1vdW50S0VZCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAAB3VzZXJOdW0EAAAADXN0YXJ0QmxvY2tLRVkJAQAAABZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAAAAAQUAAAAHdXNlck51bQQAAAALZHVyYXRpb25LRVkJAQAAABRrZXlMb2NrUGFyYW1EdXJhdGlvbgAAAAEFAAAAB3VzZXJOdW0EAAAABGtLRVkJAQAAAA1rZXlMb2NrUGFyYW1LAAAAAQUAAAAHdXNlck51bQQAAAAEYktFWQkBAAAADWtleUxvY2tQYXJhbUIAAAABBQAAAAd1c2VyTnVtBAAAAAtrQnlQZXJpb0tFWQkBAAAAFWtleUxvY2tQYXJhbUJ5UGVyaW9kSwAAAAIFAAAAB3VzZXJOdW0FAAAABnBlcmlvZAQAAAAMYkJ5UGVyaW9kS0VZCQEAAAAVa2V5TG9ja1BhcmFtQnlQZXJpb2RCAAAAAgUAAAAHdXNlck51bQUAAAAGcGVyaW9kBAAAAAlnd3hBbW91bnQJAQAAAA1jYWxjR3d4QW1vdW50AAAAAwUAAAABawUAAAABYgUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA11c2VyQW1vdW50S0VZBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADXN0YXJ0QmxvY2tLRVkFAAAABXN0YXJ0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtkdXJhdGlvbktFWQUAAAAIZHVyYXRpb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGtLRVkFAAAAAWsJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGJLRVkFAAAAAWIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tCeVBlcmlvS0VZBQAAAAFrCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAxiQnlQZXJpb2RLRVkFAAAAAWIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleUxvY2tQYXJhbXNSZWNvcmQAAAABBQAAAAt1c2VyQWRkcmVzcwkBAAAAFmZvcm1hdExvY2tQYXJhbXNSZWNvcmQAAAAHBQAAAAd1c2VyTnVtBQAAAAZhbW91bnQFAAAABXN0YXJ0BQAAAAhkdXJhdGlvbgUAAAABawUAAAABYgUAAAAJZ3d4QW1vdW50BQAAAANuaWwBAAAAImV4dHJhY3RPcHRpb25hbFBheW1lbnRBbW91bnRPckZhaWwAAAACAAAAAWkAAAAPZXhwZWN0ZWRBc3NldElkAwkAAGYAAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAG29ubHkgb25lIHBheW1lbnQgaXMgYWxsb3dlZAMJAAAAAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAAAAAAAAAQAAAADcG10CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAwkBAAAAAiE9AAAAAgkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBQAAAA9leHBlY3RlZEFzc2V0SWQJAAACAAAAAQIAAAAbaW52YWxpZCBhc3NldCBpZCBpbiBwYXltZW50CAUAAAADcG10AAAABmFtb3VudAEAAAAUY2FsY0N1cnJlbnRHd3hBbW91bnQAAAABAAAAC3VzZXJBZGRyZXNzBAAAAAVFTVBUWQIAAAAFZW1wdHkEAAAAEnVzZXIyTnVtTWFwcGluZ0tFWQkBAAAAEmtleVVzZXIyTnVtTWFwcGluZwAAAAEFAAAAC3VzZXJBZGRyZXNzBAAAAAd1c2VyTnVtCQEAAAALdmFsdWVPckVsc2UAAAACCQAEIgAAAAEFAAAAEnVzZXIyTnVtTWFwcGluZ0tFWQUAAAAFRU1QVFkEAAAAAWsJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQfAAAAAQkBAAAADWtleUxvY2tQYXJhbUsAAAABBQAAAAd1c2VyTnVtAAAAAAAAAAAABAAAAAFiCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAAA1rZXlMb2NrUGFyYW1CAAAAAQUAAAAHdXNlck51bQAAAAAAAAAAAAQAAAANZ3d4QW1vdW50Q2FsYwkBAAAADWNhbGNHd3hBbW91bnQAAAADBQAAAAFrBQAAAAFiBQAAAAZoZWlnaHQEAAAACWd3eEFtb3VudAMJAABmAAAAAgAAAAAAAAAAAAUAAAANZ3d4QW1vdW50Q2FsYwAAAAAAAAAAAAUAAAANZ3d4QW1vdW50Q2FsYwUAAAAJZ3d4QW1vdW50AQAAABRpbnRlcm5hbENsYWltV3hCb29zdAAAAAEAAAAOdXNlckFkZHJlc3NTdHIEAAAABUVNUFRZAgAAAAVFTVBUWQQAAAARdXNlclJlY29yZE9yRW1wdHkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAE2tleUxvY2tQYXJhbXNSZWNvcmQAAAABBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAFRU1QVFkDCQAAAAAAAAIFAAAAEXVzZXJSZWNvcmRPckVtcHR5BQAAAAVFTVBUWQkABRUAAAADAAAAAAAAAAAABQAAAANuaWwCAAAAFXVzZXJSZWNvcmQ6OmlzOjplbXB0eQQAAAAPdXNlclJlY29yZEFycmF5CQAEtQAAAAIFAAAAEXVzZXJSZWNvcmRPckVtcHR5BQAAAANTRVAEAAAACnVzZXJOdW1TdHIJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAA5JZHhMb2NrVXNlck51bQQAAAASd3hFbWlzc2lvblBlckJsb2NrCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAHmtleUVtaXNzaW9uUmF0ZVBlckJsb2NrQ3VycmVudAAAAAAEAAAADWVtaXNzaW9uU3RhcnQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAVa2V5RW1pc3Npb25TdGFydEJsb2NrAAAAAAQAAAALZW1pc3Npb25FbmQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAATa2V5RW1pc3Npb25FbmRCbG9jawAAAAAEAAAAAWgDCQAAZgAAAAIFAAAABmhlaWdodAUAAAALZW1pc3Npb25FbmQFAAAAC2VtaXNzaW9uRW5kBQAAAAZoZWlnaHQEAAAAAmRoCQABlgAAAAEJAARMAAAAAgkAAGUAAAACBQAAAAFoBQAAAA1lbWlzc2lvblN0YXJ0CQAETAAAAAIAAAAAAAAAAAAFAAAAA25pbAQAAAAgdXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWxLRVkJAQAAACBrZXlVc2VyQm9vc3RFbWlzc2lvbkxhc3RJTlRFR1JBTAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAHXVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAgdXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWxLRVkEAAAAFWJvb3N0RW1pc3Npb25JbnRlZ3JhbAkAAGkAAAACCQAAaAAAAAIJAABoAAAAAgUAAAASd3hFbWlzc2lvblBlckJsb2NrBQAAAAJkaAAAAAAAAAAAAgAAAAAAAAAAAwQAAAAZdXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbAkAAGUAAAACBQAAABVib29zdEVtaXNzaW9uSW50ZWdyYWwFAAAAHXVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsAwkAAGYAAAACAAAAAAAAAAAABQAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsCQAAAgAAAAECAAAAEndyb25nIGNhbGN1bGF0aW9ucwQAAAAfdXNlck1heEJvb3N0SW50ZWdyYWxNaWdyYXRlZEtFWQkBAAAAE2tleU1heEJvb3N0TWlncmF0ZWQAAAABBQAAAAp1c2VyTnVtU3RyBAAAABx1c2VyTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAH3VzZXJNYXhCb29zdEludGVncmFsTWlncmF0ZWRLRVkAAAAAAAAAAAAEAAAAE3VzZXJNYXhCb29zdERpdmlkZXIDCQAAAAAAAAIFAAAAHHVzZXJNYXhCb29zdEludGVncmFsTWlncmF0ZWQAAAAAAAAAAAAFAAAAD0JPT1NUTUFYRElWSURFUgAAAAAAAAAAAQQAAAAgdG90YWxNYXhCb29zdEludGVncmFsTWlncmF0ZWRLRVkJAQAAABNrZXlNYXhCb29zdE1pZ3JhdGVkAAAAAQIAAAAFdG90YWwEAAAAHXRvdGFsTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAIHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkS0VZAAAAAAAAAAAABAAAABR0b3RhbE1heEJvb3N0RGl2aWRlcgMJAAAAAAAAAgUAAAAddG90YWxNYXhCb29zdEludGVncmFsTWlncmF0ZWQAAAAAAAAAAAAFAAAAD0JPT1NUTUFYRElWSURFUgAAAAAAAAAAAQQAAAAXdXNlck1heEJvb3N0SW50ZWdyYWxLRVkJAQAAABdrZXlVc2VyTWF4Qm9vc3RJTlRFR1JBTAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWQkBAAAAGGtleVRvdGFsTWF4Qm9vc3RJTlRFR1JBTAAAAAAEAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQkBAAAAIWtleVVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAD3VzZXJNYXhCb29zdEludAkAAGkAAAACCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAXdXNlck1heEJvb3N0SW50ZWdyYWxLRVkFAAAAE3VzZXJNYXhCb29zdERpdmlkZXIEAAAAEHRvdGFsTWF4Qm9vc3RJbnQJAABpAAAAAgkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWQUAAAAUdG90YWxNYXhCb29zdERpdmlkZXIEAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQQAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3CQAAZAAAAAIFAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkAAGsAAAADBQAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsBQAAAA91c2VyTWF4Qm9vc3RJbnQFAAAAEHRvdGFsTWF4Qm9vc3RJbnQEAAAAE3VzZXJCb29zdENsYWltZWRLRVkJAQAAABNrZXlVc2VyQm9vc3RDbGFpbWVkAAAAAQUAAAAKdXNlck51bVN0cgQAAAAQdXNlckJvb3N0Q2xhaW1lZAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAE3VzZXJCb29zdENsYWltZWRLRVkEAAAAEnVzZXJCb29zdEF2YWlsYWJsZQkAAGUAAAACBQAAACF1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXcFAAAAEHVzZXJCb29zdENsYWltZWQEAAAACWRhdGFTdGF0ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAhdXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsS0VZBQAAACF1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIHVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZBQAAABVib29zdEVtaXNzaW9uSW50ZWdyYWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkS0VZAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAB91c2VyTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkS0VZAAAAAAAAAAABBQAAAANuaWwEAAAABWRlYnVnCQAEuQAAAAIJAARMAAAAAgkAASwAAAACAgAAAB51c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbD0JAAGkAAAAAQUAAAAddXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWwJAARMAAAAAgkAASwAAAACAgAAABp1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsPQkAAaQAAAABBQAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsCQAETAAAAAIJAAEsAAAAAgIAAAAQdXNlck1heEJvb3N0SW50PQkAAaQAAAABBQAAAA91c2VyTWF4Qm9vc3RJbnQJAARMAAAAAgkAASwAAAACAgAAABF0b3RhbE1heEJvb3N0SW50PQkAAaQAAAABBQAAABB0b3RhbE1heEJvb3N0SW50CQAETAAAAAIJAAEsAAAAAgIAAAAfdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsPQkAAaQAAAABBQAAAB51c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWwJAARMAAAAAgkAASwAAAACAgAAACJ1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXc9CQABpAAAAAEFAAAAIXVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbE5ldwkABEwAAAACCQABLAAAAAICAAAAEXVzZXJCb29zdENsYWltZWQ9CQABpAAAAAEFAAAAEHVzZXJCb29zdENsYWltZWQJAARMAAAAAgkAASwAAAACAgAAABN1c2VyQm9vc3RBdmFpbGFibGU9CQABpAAAAAEFAAAAEnVzZXJCb29zdEF2YWlsYWJsZQUAAAADbmlsAgAAAAI6OgkABRUAAAADBQAAABJ1c2VyQm9vc3RBdmFpbGFibGUFAAAACWRhdGFTdGF0ZQUAAAAFZGVidWcAAAAHAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAABgAAABFmYWN0b3J5QWRkcmVzc1N0cgAAAA5sb2NrQXNzZXRJZFN0cgAAAA1taW5Mb2NrQW1vdW50AAAAC21pbkR1cmF0aW9uAAAAC21heER1cmF0aW9uAAAADG1hdGhDb250cmFjdAMJAQAAAAIhPQAAAAIFAAAABHRoaXMIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAAA5ub3QgYXV0aG9yaXplZAkABE4AAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOa2V5TmV4dFVzZXJOdW0AAAAAAAAAAAAAAAAACQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAlrZXlDb25maWcAAAAACQEAAAAMZm9ybWF0Q29uZmlnAAAABQUAAAAObG9ja0Fzc2V0SWRTdHIFAAAADW1pbkxvY2tBbW91bnQFAAAAC21pbkR1cmF0aW9uBQAAAAttYXhEdXJhdGlvbgUAAAAMbWF0aENvbnRyYWN0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAAFAAAAEWZhY3RvcnlBZGRyZXNzU3RyBQAAAANuaWwJAQAAAApTdGF0c0VudHJ5AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpAQAAAARsb2NrAAAAAQAAAAhkdXJhdGlvbgQAAAAIY2ZnQXJyYXkJAQAAABVyZWFkQ29uZmlnQXJyYXlPckZhaWwAAAAABAAAAAphc3NldElkU3RyCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAAA1JZHhDZmdBc3NldElkBAAAAAdhc3NldElkCQACWQAAAAEFAAAACmFzc2V0SWRTdHIEAAAADW1pbkxvY2tBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAATSWR4Q2ZnTWluTG9ja0Ftb3VudAQAAAAPbWluTG9ja0R1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFUlkeENmZ01pbkxvY2tEdXJhdGlvbgQAAAAPbWF4TG9ja0R1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFUlkeENmZ01heExvY2tEdXJhdGlvbgQAAAAMbWF0aENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABJJZHhDZmdNYXRoQ29udHJhY3QDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAANGludmFsaWQgcGF5bWVudCAtIGV4YWN0IG9uZSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEAAAAA3BtdAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAJcG10QW1vdW50CAUAAAADcG10AAAABmFtb3VudAMJAQAAAAIhPQAAAAIFAAAAB2Fzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAeaW52YWxpZCBhc3NldCBpcyBpbiBwYXltZW50IC0gBQAAAAphc3NldElkU3RyAgAAAAwgaXMgZXhwZWN0ZWQEAAAADm5leHRVc2VyTnVtS0VZCQEAAAAOa2V5TmV4dFVzZXJOdW0AAAAABAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAADnVzZXJJc0V4aXN0aW5nCQEAAAAJaXNEZWZpbmVkAAAAAQkABCIAAAABCQEAAAASa2V5VXNlcjJOdW1NYXBwaW5nAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIEAAAACnVzZXJOdW1TdHIDBQAAAA51c2VySXNFeGlzdGluZwkBAAAABXZhbHVlAAAAAQkABCIAAAABCQEAAAASa2V5VXNlcjJOdW1NYXBwaW5nAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIJAAGkAAAAAQkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAADm5leHRVc2VyTnVtS0VZBAAAAAd1c2VyTnVtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEFAAAACnVzZXJOdW1TdHIEAAAACWxvY2tTdGFydAUAAAAGaGVpZ2h0BAAAAA1zdGFydEJsb2NrS0VZCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAACnVzZXJOdW1TdHIEAAAAC2R1cmF0aW9uS0VZCQEAAAAUa2V5TG9ja1BhcmFtRHVyYXRpb24AAAABBQAAAAp1c2VyTnVtU3RyBAAAAA11c2VyQW1vdW50S0VZCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAACnVzZXJOdW1TdHIDCQAAZgAAAAIFAAAADW1pbkxvY2tBbW91bnQFAAAACXBtdEFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAImFtb3VudCBpcyBsZXNzIHRoZW4gbWluTG9ja0Ftb3VudD0JAAGkAAAAAQUAAAANbWluTG9ja0Ftb3VudAMJAABmAAAAAgUAAAAPbWluTG9ja0R1cmF0aW9uBQAAAAhkdXJhdGlvbgkAAAIAAAABCQABLAAAAAICAAAALXBhc3NlZCBkdXJhdGlvbiBpcyBsZXNzIHRoZW4gbWluTG9ja0R1cmF0aW9uPQkAAaQAAAABBQAAAA9taW5Mb2NrRHVyYXRpb24DCQAAZgAAAAIFAAAACGR1cmF0aW9uBQAAAA9tYXhMb2NrRHVyYXRpb24JAAACAAAAAQkAASwAAAACAgAAADBwYXNzZWQgZHVyYXRpb24gaXMgZ3JlYXRlciB0aGVuIG1heExvY2tEdXJhdGlvbj0JAAGkAAAAAQUAAAAPbWF4TG9ja0R1cmF0aW9uAwMFAAAADnVzZXJJc0V4aXN0aW5nCQAAZwAAAAIJAABkAAAAAgkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAADXN0YXJ0QmxvY2tLRVkJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAAtkdXJhdGlvbktFWQUAAAAJbG9ja1N0YXJ0BwkAAAIAAAABAgAAADZ0aGVyZSBpcyBhbiBhY3RpdmUgbG9jayAtIGNvbnNpZGVyIHRvIHVzZSBpbmNyZWFzZUxvY2sEAAAAB2NvZWZmWDgJAABrAAAAAwUAAAAIZHVyYXRpb24FAAAABU1VTFQ4BQAAAA9tYXhMb2NrRHVyYXRpb24EAAAADmdXeEFtb3VudFN0YXJ0CQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAHY29lZmZYOAUAAAAFTVVMVDgEAAAAE2dXeFBhcmFtc1Jlc3VsdExpc3QJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAVY2FsY0d3eFBhcmFtc1JFQURPTkxZCQAETAAAAAIFAAAADmdXeEFtb3VudFN0YXJ0CQAETAAAAAIFAAAACWxvY2tTdGFydAkABEwAAAACBQAAAAhkdXJhdGlvbgUAAAADbmlsBQAAAANuaWwEAAAAAWsJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAAAAAAAAAAAAAQAAAABYgkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAABNnV3hQYXJhbXNSZXN1bHRMaXN0AAAAAAAAAAABBAAAAAZwZXJpb2QJAAGkAAAAAQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAABNnV3hQYXJhbXNSZXN1bHRMaXN0AAAAAAAAAAACBAAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAQAAAANZW1pc3Npb25TdGFydAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABAAAAAtlbWlzc2lvbkVuZAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABNrZXlFbWlzc2lvbkVuZEJsb2NrAAAAAAQAAAABaAMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAAtlbWlzc2lvbkVuZAUAAAALZW1pc3Npb25FbmQFAAAABmhlaWdodAQAAAACZGgJAAGWAAAAAQkABEwAAAACCQAAZQAAAAIFAAAAAWgFAAAADWVtaXNzaW9uU3RhcnQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBAAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQkBAAAAIGtleVVzZXJCb29zdEVtaXNzaW9uTGFzdElOVEVHUkFMAAAAAQUAAAAKdXNlck51bVN0cgQAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsCQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAABJ3eEVtaXNzaW9uUGVyQmxvY2sFAAAAAmRoAAAAAAAAAAACAAAAAAAAAAADBAAAABd1c2VyTWF4Qm9vc3RJbnRlZ3JhbEtFWQkBAAAAF2tleVVzZXJNYXhCb29zdElOVEVHUkFMAAAAAQUAAAAKdXNlck51bVN0cgQAAAAYdG90YWxNYXhCb29zdEludGVncmFsS0VZCQEAAAAYa2V5VG90YWxNYXhCb29zdElOVEVHUkFMAAAAAAQAAAAgdG90YWxNYXhCb29zdEludGVncmFsTWlncmF0ZWRLRVkJAQAAABNrZXlNYXhCb29zdE1pZ3JhdGVkAAAAAQIAAAAFdG90YWwEAAAAHXRvdGFsTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAIHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkS0VZAAAAAAAAAAAABAAAABR0b3RhbE1heEJvb3N0RGl2aWRlcgMJAAAAAAAAAgUAAAAddG90YWxNYXhCb29zdEludGVncmFsTWlncmF0ZWQAAAAAAAAAAAAFAAAAD0JPT1NUTUFYRElWSURFUgAAAAAAAAAAAQQAAAAPdXNlck1heEJvb3N0SW50CQAAawAAAAMFAAAADmdXeEFtb3VudFN0YXJ0BQAAAAhkdXJhdGlvbgkAAGgAAAACAAAAAAAAAAACBQAAAA9CT09TVE1BWERJVklERVIEAAAAEHRvdGFsTWF4Qm9vc3RJbnQJAABpAAAAAgkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWQUAAAAUdG90YWxNYXhCb29zdERpdmlkZXIEAAAAA2FycgMFAAAADnVzZXJJc0V4aXN0aW5nBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADm5leHRVc2VyTnVtS0VZCQAAZAAAAAIFAAAAB3VzZXJOdW0AAAAAAAAAAAEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleVVzZXIyTnVtTWFwcGluZwAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAp1c2VyTnVtU3RyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlOdW0yVXNlck1hcHBpbmcAAAABBQAAAAp1c2VyTnVtU3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAADbmlsCQAETgAAAAIJAARNAAAAAgkABE4AAAACCQAETgAAAAIFAAAAA2FycgkBAAAAD0xvY2tQYXJhbXNFbnRyeQAAAAgFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAp1c2VyTnVtU3RyBQAAAAlwbXRBbW91bnQFAAAACWxvY2tTdGFydAUAAAAIZHVyYXRpb24FAAAAAWsFAAAAAWIFAAAABnBlcmlvZAkBAAAAClN0YXRzRW50cnkAAAAEBQAAAAlwbXRBbW91bnQFAAAACGR1cmF0aW9uAAAAAAAAAAABAwUAAAAOdXNlcklzRXhpc3RpbmcAAAAAAAAAAAAAAAAAAAAAAAEJAQAAAAxIaXN0b3J5RW50cnkAAAAIAgAAAARsb2NrBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAJcG10QW1vdW50BQAAAAlsb2NrU3RhcnQFAAAACGR1cmF0aW9uBQAAAAFrBQAAAAFiBQAAAAFpCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQUAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABd1c2VyTWF4Qm9vc3RJbnRlZ3JhbEtFWQUAAAAPdXNlck1heEJvb3N0SW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABh0b3RhbE1heEJvb3N0SW50ZWdyYWxLRVkJAABkAAAAAgUAAAAQdG90YWxNYXhCb29zdEludAUAAAAPdXNlck1heEJvb3N0SW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAACB0b3RhbE1heEJvb3N0SW50ZWdyYWxNaWdyYXRlZEtFWQAAAAAAAAAAAQUAAAADbmlsAAAAAWkBAAAADGluY3JlYXNlTG9jawAAAAEAAAANZGVsdGFEdXJhdGlvbgQAAAAIY2ZnQXJyYXkJAQAAABVyZWFkQ29uZmlnQXJyYXlPckZhaWwAAAAABAAAAAphc3NldElkU3RyCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAAA1JZHhDZmdBc3NldElkBAAAAAdhc3NldElkCQACWQAAAAEFAAAACmFzc2V0SWRTdHIEAAAAD21pbkxvY2tEdXJhdGlvbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABVJZHhDZmdNaW5Mb2NrRHVyYXRpb24EAAAAD21heExvY2tEdXJhdGlvbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABVJZHhDZmdNYXhMb2NrRHVyYXRpb24EAAAADG1hdGhDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAASSWR4Q2ZnTWF0aENvbnRyYWN0BAAAAAlwbXRBbW91bnQJAQAAACJleHRyYWN0T3B0aW9uYWxQYXltZW50QW1vdW50T3JGYWlsAAAAAgUAAAABaQUAAAAHYXNzZXRJZAQAAAAOdXNlckFkZHJlc3NTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA91c2VyUmVjb3JkQXJyYXkJAQAAABpyZWFkTG9ja1BhcmFtc1JlY29yZE9yRmFpbAAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAAp1c2VyTnVtU3RyCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAOSWR4TG9ja1VzZXJOdW0EAAAACnVzZXJBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA91c2VyUmVjb3JkQXJyYXkFAAAADUlkeExvY2tBbW91bnQEAAAACWxvY2tTdGFydAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAMSWR4TG9ja1N0YXJ0BAAAAAxsb2NrRHVyYXRpb24JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA91c2VyUmVjb3JkQXJyYXkFAAAAD0lkeExvY2tEdXJhdGlvbgQAAAAHbG9ja0VuZAkAAGQAAAACBQAAAAlsb2NrU3RhcnQFAAAADGxvY2tEdXJhdGlvbgQAAAARcmVtYWluaW5nRHVyYXRpb24JAAGWAAAAAQkABEwAAAACCQAAZQAAAAIFAAAAB2xvY2tFbmQFAAAABmhlaWdodAkABEwAAAACAAAAAAAAAAAABQAAAANuaWwEAAAADXVzZXJBbW91bnROZXcJAABkAAAAAgUAAAAKdXNlckFtb3VudAUAAAAJcG10QW1vdW50BAAAAA9sb2NrRHVyYXRpb25OZXcJAABkAAAAAgUAAAARcmVtYWluaW5nRHVyYXRpb24FAAAADWRlbHRhRHVyYXRpb24DCQAAZgAAAAIAAAAAAAAAAAAFAAAADWRlbHRhRHVyYXRpb24JAAACAAAAAQIAAAAaZHVyYXRpb24gaXMgbGVzcyB0aGVuIHplcm8DCQAAZgAAAAIFAAAAD21pbkxvY2tEdXJhdGlvbgUAAAAPbG9ja0R1cmF0aW9uTmV3CQAAAgAAAAEJAAEsAAAAAgIAAAAtbG9ja0R1cmF0aW9uTmV3IGlzIGxlc3MgdGhlbiBtaW5Mb2NrRHVyYXRpb249CQABpAAAAAEFAAAAD21pbkxvY2tEdXJhdGlvbgMJAABmAAAAAgUAAAAPbG9ja0R1cmF0aW9uTmV3BQAAAA9tYXhMb2NrRHVyYXRpb24JAAACAAAAAQkAASwAAAACAgAAAERkZWx0YUR1cmF0aW9uICsgZXhpc3RlZExvY2tEdXJhdGlvbiBpcyBncmVhdGVyIHRoZW4gbWF4TG9ja0R1cmF0aW9uPQkAAaQAAAABBQAAAA9tYXhMb2NrRHVyYXRpb24DAwkAAGcAAAACBQAAAAZoZWlnaHQFAAAAB2xvY2tFbmQJAABmAAAAAgUAAAAKdXNlckFtb3VudAAAAAAAAAAAAAcJAAACAAAAAQIAAAA5dGhlcmUgaXMgYW4gZXhwaXJlZCBsb2NrIC0gbmVlZCB0byB1bmxvY2sgYmVmb3JlIG5ldyBsb2NrBAAAAAdjb2VmZlg4CQAAawAAAAMFAAAAD2xvY2tEdXJhdGlvbk5ldwUAAAAFTVVMVDgFAAAAD21heExvY2tEdXJhdGlvbgQAAAAOZ1d4QW1vdW50U3RhcnQJAABrAAAAAwUAAAANdXNlckFtb3VudE5ldwUAAAAHY29lZmZYOAUAAAAFTVVMVDgEAAAAE2dXeFBhcmFtc1Jlc3VsdExpc3QJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAVY2FsY0d3eFBhcmFtc1JFQURPTkxZCQAETAAAAAIFAAAADmdXeEFtb3VudFN0YXJ0CQAETAAAAAIFAAAABmhlaWdodAkABEwAAAACBQAAAA9sb2NrRHVyYXRpb25OZXcFAAAAA25pbAUAAAADbmlsBAAAAAFrCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAE2dXeFBhcmFtc1Jlc3VsdExpc3QAAAAAAAAAAAAEAAAAAWIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAAAAAAAAAAAAQQAAAAGcGVyaW9kCQABpAAAAAEJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAAAAAAAAAAAAgQAAAASd3hFbWlzc2lvblBlckJsb2NrCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAHmtleUVtaXNzaW9uUmF0ZVBlckJsb2NrQ3VycmVudAAAAAAEAAAADWVtaXNzaW9uU3RhcnQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAVa2V5RW1pc3Npb25TdGFydEJsb2NrAAAAAAQAAAALZW1pc3Npb25FbmQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAATa2V5RW1pc3Npb25FbmRCbG9jawAAAAAEAAAAAWgDCQAAZgAAAAIFAAAABmhlaWdodAUAAAALZW1pc3Npb25FbmQFAAAAC2VtaXNzaW9uRW5kBQAAAAZoZWlnaHQEAAAAAmRoCQABlgAAAAEJAARMAAAAAgkAAGUAAAACBQAAAAFoBQAAAA1lbWlzc2lvblN0YXJ0CQAETAAAAAIAAAAAAAAAAAAFAAAAA25pbAQAAAAgdXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWxLRVkJAQAAACBrZXlVc2VyQm9vc3RFbWlzc2lvbkxhc3RJTlRFR1JBTAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAHXVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAgdXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWxLRVkEAAAAFWJvb3N0RW1pc3Npb25JbnRlZ3JhbAkAAGkAAAACCQAAaAAAAAIJAABoAAAAAgUAAAASd3hFbWlzc2lvblBlckJsb2NrBQAAAAJkaAAAAAAAAAAAAgAAAAAAAAAAAwQAAAAZdXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbAkAAGUAAAACBQAAABVib29zdEVtaXNzaW9uSW50ZWdyYWwFAAAAHXVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsAwkAAGYAAAACAAAAAAAAAAAABQAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsCQAAAgAAAAECAAAAEndyb25nIGNhbGN1bGF0aW9ucwQAAAAfdXNlck1heEJvb3N0SW50ZWdyYWxNaWdyYXRlZEtFWQkBAAAAE2tleU1heEJvb3N0TWlncmF0ZWQAAAABBQAAAAp1c2VyTnVtU3RyBAAAABx1c2VyTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAH3VzZXJNYXhCb29zdEludGVncmFsTWlncmF0ZWRLRVkAAAAAAAAAAAAEAAAAE3VzZXJNYXhCb29zdERpdmlkZXIDCQAAAAAAAAIFAAAAHHVzZXJNYXhCb29zdEludGVncmFsTWlncmF0ZWQAAAAAAAAAAAAFAAAAD0JPT1NUTUFYRElWSURFUgAAAAAAAAAAAQQAAAAgdG90YWxNYXhCb29zdEludGVncmFsTWlncmF0ZWRLRVkJAQAAABNrZXlNYXhCb29zdE1pZ3JhdGVkAAAAAQIAAAAFdG90YWwEAAAAHXRvdGFsTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAIHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkS0VZAAAAAAAAAAAABAAAABR0b3RhbE1heEJvb3N0RGl2aWRlcgMJAAAAAAAAAgUAAAAddG90YWxNYXhCb29zdEludGVncmFsTWlncmF0ZWQAAAAAAAAAAAAFAAAAD0JPT1NUTUFYRElWSURFUgAAAAAAAAAAAQQAAAAXdXNlck1heEJvb3N0SW50ZWdyYWxLRVkJAQAAABdrZXlVc2VyTWF4Qm9vc3RJTlRFR1JBTAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWQkBAAAAGGtleVRvdGFsTWF4Qm9vc3RJTlRFR1JBTAAAAAAEAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQkBAAAAIWtleVVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAD3VzZXJNYXhCb29zdEludAkAAGkAAAACCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAXdXNlck1heEJvb3N0SW50ZWdyYWxLRVkFAAAAE3VzZXJNYXhCb29zdERpdmlkZXIEAAAAEHRvdGFsTWF4Qm9vc3RJbnQJAABpAAAAAgkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWQUAAAAUdG90YWxNYXhCb29zdERpdmlkZXIEAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQQAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3CQAAZAAAAAIFAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkAAGsAAAADBQAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsBQAAAA91c2VyTWF4Qm9vc3RJbnQFAAAAEHRvdGFsTWF4Qm9vc3RJbnQEAAAAEnVzZXJNYXhCb29zdEludE5ldwkAAGsAAAADBQAAAA5nV3hBbW91bnRTdGFydAUAAAAPbG9ja0R1cmF0aW9uTmV3CQAAaAAAAAIAAAAAAAAAAAIFAAAAD0JPT1NUTUFYRElWSURFUgQAAAALY3VyclVzZXJHd3gJAQAAABRjYWxjQ3VycmVudEd3eEFtb3VudAAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAABhyZW1haW5pbmdVc2VyTWF4Qm9vc3RJbnQJAABrAAAAAwUAAAALY3VyclVzZXJHd3gFAAAAEXJlbWFpbmluZ0R1cmF0aW9uCQAAaAAAAAIAAAAAAAAAAAIFAAAAD0JPT1NUTUFYRElWSURFUgQAAAATdXNlck1heEJvb3N0SW50RGlmZgkAAGUAAAACBQAAABJ1c2VyTWF4Qm9vc3RJbnROZXcFAAAAGHJlbWFpbmluZ1VzZXJNYXhCb29zdEludAMJAABmAAAAAgAAAAAAAAAAAAUAAAATdXNlck1heEJvb3N0SW50RGlmZgkAAAIAAAABAgAAABJ3cm9uZyBjYWxjdWxhdGlvbnMJAAROAAAAAgkABE0AAAACCQAETgAAAAIJAQAAAA9Mb2NrUGFyYW1zRW50cnkAAAAIBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAKdXNlck51bVN0cgUAAAANdXNlckFtb3VudE5ldwUAAAAJbG9ja1N0YXJ0BQAAAA9sb2NrRHVyYXRpb25OZXcFAAAAAWsFAAAAAWIFAAAABnBlcmlvZAkBAAAAClN0YXRzRW50cnkAAAAEBQAAAAlwbXRBbW91bnQFAAAADWRlbHRhRHVyYXRpb24AAAAAAAAAAAAAAAAAAAAAAAAJAQAAAAxIaXN0b3J5RW50cnkAAAAIAgAAAARsb2NrBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAJcG10QW1vdW50BQAAAAlsb2NrU3RhcnQFAAAAD2xvY2tEdXJhdGlvbk5ldwUAAAABawUAAAABYgUAAAABaQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAXdXNlck1heEJvb3N0SW50ZWdyYWxLRVkJAABkAAAAAgUAAAAPdXNlck1heEJvb3N0SW50BQAAABN1c2VyTWF4Qm9vc3RJbnREaWZmCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABh0b3RhbE1heEJvb3N0SW50ZWdyYWxLRVkJAABkAAAAAgUAAAAQdG90YWxNYXhCb29zdEludAUAAAATdXNlck1heEJvb3N0SW50RGlmZgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAhdXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsS0VZBQAAACF1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIHVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZBQAAABVib29zdEVtaXNzaW9uSW50ZWdyYWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkS0VZAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAB91c2VyTWF4Qm9vc3RJbnRlZ3JhbE1pZ3JhdGVkS0VZAAAAAAAAAAABBQAAAANuaWwAAAABaQEAAAAMY2xhaW1XeEJvb3N0AAAAAQAAAA51c2VyQWRkcmVzc1N0cgMJAQAAAAIhPQAAAAIFAAAAD3N0YWtpbmdDb250cmFjdAgFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAAEnBlcm1pc3Npb25zIGRlbmllZAQAAAANJHQwMjQ2MTUyNDY5NgkBAAAAFGludGVybmFsQ2xhaW1XeEJvb3N0AAAAAQUAAAAOdXNlckFkZHJlc3NTdHIEAAAAEnVzZXJCb29zdEF2YWlsYWJsZQgFAAAADSR0MDI0NjE1MjQ2OTYAAAACXzEEAAAACWRhdGFTdGF0ZQgFAAAADSR0MDI0NjE1MjQ2OTYAAAACXzIEAAAABWRlYnVnCAUAAAANJHQwMjQ2MTUyNDY5NgAAAAJfMwkABRQAAAACBQAAAAlkYXRhU3RhdGUJAARMAAAAAgUAAAASdXNlckJvb3N0QXZhaWxhYmxlBQAAAANuaWwAAAABaQEAAAAUY2xhaW1XeEJvb3N0UkVBRE9OTFkAAAABAAAADnVzZXJBZGRyZXNzU3RyBAAAAA0kdDAyNDgwNjI0ODg3CQEAAAAUaW50ZXJuYWxDbGFpbVd4Qm9vc3QAAAABBQAAAA51c2VyQWRkcmVzc1N0cgQAAAASdXNlckJvb3N0QXZhaWxhYmxlCAUAAAANJHQwMjQ4MDYyNDg4NwAAAAJfMQQAAAAJZGF0YVN0YXRlCAUAAAANJHQwMjQ4MDYyNDg4NwAAAAJfMgQAAAAFZGVidWcIBQAAAA0kdDAyNDgwNjI0ODg3AAAAAl8zCQAFFAAAAAIFAAAAA25pbAkABEwAAAACBQAAABJ1c2VyQm9vc3RBdmFpbGFibGUJAARMAAAAAgUAAAAFZGVidWcFAAAAA25pbAAAAAFpAQAAAAZ1bmxvY2sAAAABAAAAC3VzZXJBZGRyZXNzBAAAAA91c2VyUmVjb3JkQXJyYXkJAQAAABpyZWFkTG9ja1BhcmFtc1JlY29yZE9yRmFpbAAAAAEFAAAAC3VzZXJBZGRyZXNzBAAAAAp1c2VyTnVtU3RyCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAOSWR4TG9ja1VzZXJOdW0EAAAACnVzZXJBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA91c2VyUmVjb3JkQXJyYXkFAAAADUlkeExvY2tBbW91bnQEAAAACWxvY2tTdGFydAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAMSWR4TG9ja1N0YXJ0BAAAAAxsb2NrRHVyYXRpb24JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA91c2VyUmVjb3JkQXJyYXkFAAAAD0lkeExvY2tEdXJhdGlvbgQAAAAHbG9ja0VuZAkAAGQAAAACBQAAAAlsb2NrU3RhcnQFAAAADGxvY2tEdXJhdGlvbgQAAAAIY2ZnQXJyYXkJAQAAABVyZWFkQ29uZmlnQXJyYXlPckZhaWwAAAAABAAAAAdhc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAADUlkeENmZ0Fzc2V0SWQDCQAAZwAAAAIFAAAAB2xvY2tFbmQFAAAABmhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAFd2FpdCAJAAGkAAAAAQUAAAAHbG9ja0VuZAIAAAAKIHRvIHVubG9jawMJAABnAAAAAgAAAAAAAAAAAAUAAAAKdXNlckFtb3VudAkAAAIAAAABAgAAABFub3RoaW5nIHRvIHVubG9jawQAAAAGcGVyaW9kAgAAAAEwCQAETQAAAAIJAARNAAAAAgkABE4AAAACCQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAACAUAAAALdXNlckFkZHJlc3MFAAAACnVzZXJOdW1TdHIAAAAAAAAAAAAFAAAACWxvY2tTdGFydAUAAAAMbG9ja0R1cmF0aW9uAAAAAAAAAAAAAAAAAAAAAAAABQAAAAZwZXJpb2QJAQAAAApTdGF0c0VudHJ5AAAABAkBAAAAAS0AAAABBQAAAAp1c2VyQW1vdW50AAAAAAAAAAAAAAAAAAAAAAAAAP//////////CQEAAAAMSGlzdG9yeUVudHJ5AAAACAIAAAAGdW5sb2NrBQAAAAt1c2VyQWRkcmVzcwUAAAAKdXNlckFtb3VudAUAAAAJbG9ja1N0YXJ0BQAAAAxsb2NrRHVyYXRpb24AAAAAAAAAAAAAAAAAAAAAAAAFAAAAAWkJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAp1c2VyQW1vdW50BQAAAAdhc3NldElkAAAAAWkBAAAAE2d3eFVzZXJJbmZvUkVBRE9OTFkAAAABAAAAC3VzZXJBZGRyZXNzBAAAAAlnd3hBbW91bnQJAQAAABRjYWxjQ3VycmVudEd3eEFtb3VudAAAAAEFAAAAC3VzZXJBZGRyZXNzCQAFFAAAAAIFAAAAA25pbAkABEwAAAACBQAAAAlnd3hBbW91bnQFAAAAA25pbAAAAABkFaBb", "chainId": 84, "height": 1815532, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HkyardZ4QNajpqsrmZL5KVmdKcPU3Exz8Ae6gfffDNp1 Next: 47cv55MygCNmNYyPgvAm1DNtSE9ReSK36nEurVb5pTGs Diff:
OldNewDifferences
399399 let totalMaxBoostDivider = if ((totalMaxBoostIntegralMigrated == 0))
400400 then BOOSTMAXDIVIDER
401401 else 1
402- let userMaxBoostInt = ((gWxAmountStart * duration) / (2 * BOOSTMAXDIVIDER))
402+ let userMaxBoostInt = fraction(gWxAmountStart, duration, (2 * BOOSTMAXDIVIDER))
403403 let totalMaxBoostInt = (getIntOrZero(this, totalMaxBoostIntegralKEY) / totalMaxBoostDivider)
404404 let arr = if (userIsExisting)
405405 then nil
481481 let totalMaxBoostInt = (getIntOrZero(this, totalMaxBoostIntegralKEY) / totalMaxBoostDivider)
482482 let userBoostAvaliableToClaimTotal = getIntOrZero(this, userBoostAvalaibleToClaimTotalKEY)
483483 let userBoostAvaliableToClaimTotalNew = (userBoostAvaliableToClaimTotal + fraction(userBoostEmissionIntegral, userMaxBoostInt, totalMaxBoostInt))
484- let userMaxBoostIntNew = ((gWxAmountStart * lockDurationNew) / 2)
484+ let userMaxBoostIntNew = fraction(gWxAmountStart, lockDurationNew, (2 * BOOSTMAXDIVIDER))
485485 let currUserGwx = calcCurrentGwxAmount(userAddressStr)
486- let remainingUserMaxBoostInt = ((currUserGwx * remainingDuration) / 2)
486+ let remainingUserMaxBoostInt = fraction(currUserGwx, remainingDuration, (2 * BOOSTMAXDIVIDER))
487487 let userMaxBoostIntDiff = (userMaxBoostIntNew - remainingUserMaxBoostInt)
488488 if ((0 > userMaxBoostIntDiff))
489489 then throw("wrong calculations")
498498 func claimWxBoost (userAddressStr) = if ((stakingContract != i.caller))
499499 then throw("permissions denied")
500500 else {
501- let $t02456124642 = internalClaimWxBoost(userAddressStr)
502- let userBoostAvailable = $t02456124642._1
503- let dataState = $t02456124642._2
504- let debug = $t02456124642._3
501+ let $t02461524696 = internalClaimWxBoost(userAddressStr)
502+ let userBoostAvailable = $t02461524696._1
503+ let dataState = $t02461524696._2
504+ let debug = $t02461524696._3
505505 $Tuple2(dataState, [userBoostAvailable])
506506 }
507507
509509
510510 @Callable(i)
511511 func claimWxBoostREADONLY (userAddressStr) = {
512- let $t02475224833 = internalClaimWxBoost(userAddressStr)
513- let userBoostAvailable = $t02475224833._1
514- let dataState = $t02475224833._2
515- let debug = $t02475224833._3
512+ let $t02480624887 = internalClaimWxBoost(userAddressStr)
513+ let userBoostAvailable = $t02480624887._1
514+ let dataState = $t02480624887._2
515+ let debug = $t02480624887._3
516516 $Tuple2(nil, [userBoostAvailable, debug])
517517 }
518518
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let SCALE8 = 8
77
88 let MULT8 = 100000000
99
1010 let BOOSTMAXDIVIDER = 1000000
1111
1212 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("mandatory this." + key) + " is not defined"))
1313
1414
1515 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
1616
1717
1818 func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
1919
2020
2121 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
2222
2323
2424 func asAnyList (val) = match val {
2525 case valAnyLyst: List[Any] =>
2626 valAnyLyst
2727 case _ =>
2828 throw("fail to cast into List[Any]")
2929 }
3030
3131
3232 func asInt (val) = match val {
3333 case valInt: Int =>
3434 valInt
3535 case _ =>
3636 throw("fail to cast into Int")
3737 }
3838
3939
4040 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4141
4242
4343 let IdxFactoryCfgStakingDapp = 1
4444
4545 let IdxFactoryCfgBoostingDapp = 2
4646
4747 let IdxFactoryCfgIdoDapp = 3
4848
4949 let IdxFactoryCfgTeamDapp = 4
5050
5151 let IdxFactoryCfgEmissionDapp = 5
5252
5353 let IdxFactoryCfgRestDapp = 6
5454
5555 let IdxFactoryCfgSlippageDapp = 7
5656
5757 func keyFactoryCfg () = "%s__factoryConfig"
5858
5959
6060 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
6161
6262
6363 func keyFactoryLpList () = "%s__lpTokensList"
6464
6565
6666 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
6767
6868
6969 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
7070
7171
7272 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(this, keyFactoryAddress()))
7373
7474
7575 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
7676
7777
7878 func readFactoryCfgOrFail (factory) = split(getStringOrFail(factory, keyFactoryCfg()), SEP)
7979
8080
8181 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
8282
8383
8484 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
8585
8686
8787 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
8888
8989
9090 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
9191
9292
9393 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
9494
9595
9696 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
9797
9898
9999 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
100100
101101
102102 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
103103
104104
105105 let IdxCfgAssetId = 1
106106
107107 let IdxCfgMinLockAmount = 2
108108
109109 let IdxCfgMinLockDuration = 3
110110
111111 let IdxCfgMaxLockDuration = 4
112112
113113 let IdxCfgMathContract = 5
114114
115115 func keyConfig () = "%s__config"
116116
117117
118118 func readConfigArrayOrFail () = split(getStringOrFail(this, keyConfig()), SEP)
119119
120120
121121 func formatConfigS (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = makeString(["%s%d%d%d", assetId, minLockAmount, minLockDuration, maxLockDuration, mathContract], SEP)
122122
123123
124124 func formatConfig (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = formatConfigS(assetId, toString(minLockAmount), toString(minLockDuration), toString(maxLockDuration), mathContract)
125125
126126
127127 let IdxLockUserNum = 1
128128
129129 let IdxLockAmount = 2
130130
131131 let IdxLockStart = 3
132132
133133 let IdxLockDuration = 4
134134
135135 let IdxLockParamK = 5
136136
137137 let IdxLockParamB = 6
138138
139139 func keyLockParamsRecord (userAddress) = makeString(["%s%s__lock", userAddress], SEP)
140140
141141
142142 func readLockParamsRecordOrFail (userAddress) = split(getStringOrFail(this, keyLockParamsRecord(userAddress)), SEP)
143143
144144
145145 func formatLockParamsRecordS (userNum,amount,start,duration,paramK,paramB,lastUpdTimestamp,gwxAmount) = makeString(["%d%d%d%d%d%d%d%d", userNum, amount, start, duration, paramK, paramB, lastUpdTimestamp, gwxAmount], SEP)
146146
147147
148148 func formatLockParamsRecord (userNum,amount,start,duration,paramK,paramB,gwxAmount) = formatLockParamsRecordS(userNum, toString(amount), toString(start), toString(duration), toString(paramK), toString(paramB), toString(lastBlock.timestamp), toString(gwxAmount))
149149
150150
151151 func keyNextUserNum () = "%s__nextUserNum"
152152
153153
154154 func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
155155
156156
157157 func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
158158
159159
160160 func keyLockParamUserAmount (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "amount"], SEP)
161161
162162
163163 func keyLockParamStartBlock (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "start"], SEP)
164164
165165
166166 func keyLockParamDuration (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "duration"], SEP)
167167
168168
169169 func keyLockParamK (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "k"], SEP)
170170
171171
172172 func keyLockParamB (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "b"], SEP)
173173
174174
175175 func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "k", period], SEP)
176176
177177
178178 func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "b", period], SEP)
179179
180180
181181 func keyLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
182182
183183
184184 func keyStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
185185
186186
187187 func keyStatsLocksCount () = "%s%s__stats__locksCount"
188188
189189
190190 func keyStatsUsersCount () = "%s%s__stats__activeUsersCount"
191191
192192
193193 func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastInt", userNum], SEP)
194194
195195
196196 func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", userNum], SEP)
197197
198198
199199 func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
200200
201201
202202 func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", userNum], SEP)
203203
204204
205205 func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", userNum], SEP)
206206
207207
208208 func keyMaxBoostMigrated (userNumOrTotal) = makeString(["%s%s__maxBoostIntMigrated", userNumOrTotal], SEP)
209209
210210
211211 let factoryContract = readFactoryAddressOrFail()
212212
213213 let factoryCfg = readFactoryCfgOrFail(factoryContract)
214214
215215 let emissionContract = getEmissionAddressOrFail(factoryCfg)
216216
217217 let stakingContract = getStakingAddressOrFail(factoryCfg)
218218
219219 func HistoryEntry (type,user,amount,lockStart,duration,k,b,i) = {
220220 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
221221 let historyDATA = makeString(["%d%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount), toString(lockStart), toString(duration), toString(k), toString(b)], SEP)
222222 StringEntry(historyKEY, historyDATA)
223223 }
224224
225225
226226 func StatsEntry (totalLockedInc,durationInc,lockCountInc,usersCountInc) = {
227227 let locksDurationSumInBlocksKEY = keyStatsLocksDurationSumInBlocks()
228228 let locksCountKEY = keyStatsLocksCount()
229229 let usersCountKEY = keyStatsUsersCount()
230230 let totalAmountKEY = keyLockParamTotalAmount()
231231 let locksDurationSumInBlocks = getIntOrZero(this, locksDurationSumInBlocksKEY)
232232 let locksCount = getIntOrZero(this, locksCountKEY)
233233 let usersCount = getIntOrZero(this, usersCountKEY)
234234 let totalAmount = getIntOrZero(this, totalAmountKEY)
235235 [IntegerEntry(locksDurationSumInBlocksKEY, (locksDurationSumInBlocks + durationInc)), IntegerEntry(locksCountKEY, (locksCount + lockCountInc)), IntegerEntry(usersCountKEY, (usersCount + usersCountInc)), IntegerEntry(totalAmountKEY, (totalAmount + totalLockedInc))]
236236 }
237237
238238
239239 func calcGwxAmount (kRaw,bRaw,h) = {
240240 let SCALE = 1000
241241 (((kRaw * h) + bRaw) / SCALE)
242242 }
243243
244244
245245 func LockParamsEntry (userAddress,userNum,amount,start,duration,k,b,period) = {
246246 let userAmountKEY = keyLockParamUserAmount(userNum)
247247 let startBlockKEY = keyLockParamStartBlock(userNum)
248248 let durationKEY = keyLockParamDuration(userNum)
249249 let kKEY = keyLockParamK(userNum)
250250 let bKEY = keyLockParamB(userNum)
251251 let kByPerioKEY = keyLockParamByPeriodK(userNum, period)
252252 let bByPeriodKEY = keyLockParamByPeriodB(userNum, period)
253253 let gwxAmount = calcGwxAmount(k, b, height)
254254 [IntegerEntry(userAmountKEY, amount), IntegerEntry(startBlockKEY, start), IntegerEntry(durationKEY, duration), IntegerEntry(kKEY, k), IntegerEntry(bKEY, b), IntegerEntry(kByPerioKEY, k), IntegerEntry(bByPeriodKEY, b), StringEntry(keyLockParamsRecord(userAddress), formatLockParamsRecord(userNum, amount, start, duration, k, b, gwxAmount))]
255255 }
256256
257257
258258 func extractOptionalPaymentAmountOrFail (i,expectedAssetId) = if ((size(i.payments) > 1))
259259 then throw("only one payment is allowed")
260260 else if ((size(i.payments) == 0))
261261 then 0
262262 else {
263263 let pmt = i.payments[0]
264264 if ((value(pmt.assetId) != expectedAssetId))
265265 then throw("invalid asset id in payment")
266266 else pmt.amount
267267 }
268268
269269
270270 func calcCurrentGwxAmount (userAddress) = {
271271 let EMPTY = "empty"
272272 let user2NumMappingKEY = keyUser2NumMapping(userAddress)
273273 let userNum = valueOrElse(getString(user2NumMappingKEY), EMPTY)
274274 let k = valueOrElse(getInteger(keyLockParamK(userNum)), 0)
275275 let b = valueOrElse(getInteger(keyLockParamB(userNum)), 0)
276276 let gwxAmountCalc = calcGwxAmount(k, b, height)
277277 let gwxAmount = if ((0 > gwxAmountCalc))
278278 then 0
279279 else gwxAmountCalc
280280 gwxAmount
281281 }
282282
283283
284284 func internalClaimWxBoost (userAddressStr) = {
285285 let EMPTY = "EMPTY"
286286 let userRecordOrEmpty = valueOrElse(getString(this, keyLockParamsRecord(userAddressStr)), EMPTY)
287287 if ((userRecordOrEmpty == EMPTY))
288288 then $Tuple3(0, nil, "userRecord::is::empty")
289289 else {
290290 let userRecordArray = split(userRecordOrEmpty, SEP)
291291 let userNumStr = userRecordArray[IdxLockUserNum]
292292 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
293293 let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
294294 let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
295295 let h = if ((height > emissionEnd))
296296 then emissionEnd
297297 else height
298298 let dh = max([(h - emissionStart), 0])
299299 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
300300 let userBoostEmissionLastIntegral = getIntOrZero(this, userBoostEmissionLastIntegralKEY)
301301 let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
302302 let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
303303 if ((0 > userBoostEmissionIntegral))
304304 then throw("wrong calculations")
305305 else {
306306 let userMaxBoostIntegralMigratedKEY = keyMaxBoostMigrated(userNumStr)
307307 let userMaxBoostIntegralMigrated = valueOrElse(getInteger(this, userMaxBoostIntegralMigratedKEY), 0)
308308 let userMaxBoostDivider = if ((userMaxBoostIntegralMigrated == 0))
309309 then BOOSTMAXDIVIDER
310310 else 1
311311 let totalMaxBoostIntegralMigratedKEY = keyMaxBoostMigrated("total")
312312 let totalMaxBoostIntegralMigrated = valueOrElse(getInteger(this, totalMaxBoostIntegralMigratedKEY), 0)
313313 let totalMaxBoostDivider = if ((totalMaxBoostIntegralMigrated == 0))
314314 then BOOSTMAXDIVIDER
315315 else 1
316316 let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
317317 let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
318318 let userBoostAvalaibleToClaimTotalKEY = keyUserBoostAvalaibleToClaimTotal(userNumStr)
319319 let userMaxBoostInt = (getIntOrZero(this, userMaxBoostIntegralKEY) / userMaxBoostDivider)
320320 let totalMaxBoostInt = (getIntOrZero(this, totalMaxBoostIntegralKEY) / totalMaxBoostDivider)
321321 let userBoostAvaliableToClaimTotal = getIntOrZero(this, userBoostAvalaibleToClaimTotalKEY)
322322 let userBoostAvaliableToClaimTotalNew = (userBoostAvaliableToClaimTotal + fraction(userBoostEmissionIntegral, userMaxBoostInt, totalMaxBoostInt))
323323 let userBoostClaimedKEY = keyUserBoostClaimed(userNumStr)
324324 let userBoostClaimed = getIntOrZero(this, userBoostClaimedKEY)
325325 let userBoostAvailable = (userBoostAvaliableToClaimTotalNew - userBoostClaimed)
326326 let dataState = [IntegerEntry(userBoostAvalaibleToClaimTotalKEY, userBoostAvaliableToClaimTotalNew), IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral), IntegerEntry(totalMaxBoostIntegralMigratedKEY, 1), IntegerEntry(userMaxBoostIntegralMigratedKEY, 1)]
327327 let debug = makeString([("userBoostEmissionLastIntegral=" + toString(userBoostEmissionLastIntegral)), ("userBoostEmissionIntegral=" + toString(userBoostEmissionIntegral)), ("userMaxBoostInt=" + toString(userMaxBoostInt)), ("totalMaxBoostInt=" + toString(totalMaxBoostInt)), ("userBoostAvaliableToClaimTotal=" + toString(userBoostAvaliableToClaimTotal)), ("userBoostAvaliableToClaimTotalNew=" + toString(userBoostAvaliableToClaimTotalNew)), ("userBoostClaimed=" + toString(userBoostClaimed)), ("userBoostAvailable=" + toString(userBoostAvailable))], "::")
328328 $Tuple3(userBoostAvailable, dataState, debug)
329329 }
330330 }
331331 }
332332
333333
334334 @Callable(i)
335335 func constructor (factoryAddressStr,lockAssetIdStr,minLockAmount,minDuration,maxDuration,mathContract) = if ((this != i.caller))
336336 then throw("not authorized")
337337 else ([IntegerEntry(keyNextUserNum(), 0), StringEntry(keyConfig(), formatConfig(lockAssetIdStr, minLockAmount, minDuration, maxDuration, mathContract)), StringEntry(keyFactoryAddress(), factoryAddressStr)] ++ StatsEntry(0, 0, 0, 0))
338338
339339
340340
341341 @Callable(i)
342342 func lock (duration) = {
343343 let cfgArray = readConfigArrayOrFail()
344344 let assetIdStr = cfgArray[IdxCfgAssetId]
345345 let assetId = fromBase58String(assetIdStr)
346346 let minLockAmount = parseIntValue(cfgArray[IdxCfgMinLockAmount])
347347 let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
348348 let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
349349 let mathContract = addressFromStringValue(cfgArray[IdxCfgMathContract])
350350 if ((size(i.payments) != 1))
351351 then throw("invalid payment - exact one payment must be attached")
352352 else {
353353 let pmt = i.payments[0]
354354 let pmtAmount = pmt.amount
355355 if ((assetId != value(pmt.assetId)))
356356 then throw((("invalid asset is in payment - " + assetIdStr) + " is expected"))
357357 else {
358358 let nextUserNumKEY = keyNextUserNum()
359359 let userAddressStr = toString(i.caller)
360360 let userIsExisting = isDefined(getString(keyUser2NumMapping(userAddressStr)))
361361 let userNumStr = if (userIsExisting)
362362 then value(getString(keyUser2NumMapping(userAddressStr)))
363363 else toString(getIntOrFail(this, nextUserNumKEY))
364364 let userNum = parseIntValue(userNumStr)
365365 let lockStart = height
366366 let startBlockKEY = keyLockParamStartBlock(userNumStr)
367367 let durationKEY = keyLockParamDuration(userNumStr)
368368 let userAmountKEY = keyLockParamUserAmount(userNumStr)
369369 if ((minLockAmount > pmtAmount))
370370 then throw(("amount is less then minLockAmount=" + toString(minLockAmount)))
371371 else if ((minLockDuration > duration))
372372 then throw(("passed duration is less then minLockDuration=" + toString(minLockDuration)))
373373 else if ((duration > maxLockDuration))
374374 then throw(("passed duration is greater then maxLockDuration=" + toString(maxLockDuration)))
375375 else if (if (userIsExisting)
376376 then ((getIntOrFail(this, startBlockKEY) + getIntOrFail(this, durationKEY)) >= lockStart)
377377 else false)
378378 then throw("there is an active lock - consider to use increaseLock")
379379 else {
380380 let coeffX8 = fraction(duration, MULT8, maxLockDuration)
381381 let gWxAmountStart = fraction(pmtAmount, coeffX8, MULT8)
382382 let gWxParamsResultList = asAnyList(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, lockStart, duration], nil))
383383 let k = asInt(gWxParamsResultList[0])
384384 let b = asInt(gWxParamsResultList[1])
385385 let period = toString(asInt(gWxParamsResultList[2]))
386386 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
387387 let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
388388 let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
389389 let h = if ((height > emissionEnd))
390390 then emissionEnd
391391 else height
392392 let dh = max([(h - emissionStart), 0])
393393 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
394394 let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
395395 let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
396396 let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
397397 let totalMaxBoostIntegralMigratedKEY = keyMaxBoostMigrated("total")
398398 let totalMaxBoostIntegralMigrated = valueOrElse(getInteger(this, totalMaxBoostIntegralMigratedKEY), 0)
399399 let totalMaxBoostDivider = if ((totalMaxBoostIntegralMigrated == 0))
400400 then BOOSTMAXDIVIDER
401401 else 1
402- let userMaxBoostInt = ((gWxAmountStart * duration) / (2 * BOOSTMAXDIVIDER))
402+ let userMaxBoostInt = fraction(gWxAmountStart, duration, (2 * BOOSTMAXDIVIDER))
403403 let totalMaxBoostInt = (getIntOrZero(this, totalMaxBoostIntegralKEY) / totalMaxBoostDivider)
404404 let arr = if (userIsExisting)
405405 then nil
406406 else [IntegerEntry(nextUserNumKEY, (userNum + 1)), StringEntry(keyUser2NumMapping(userAddressStr), userNumStr), StringEntry(keyNum2UserMapping(userNumStr), userAddressStr)]
407407 ((((arr ++ LockParamsEntry(userAddressStr, userNumStr, pmtAmount, lockStart, duration, k, b, period)) ++ StatsEntry(pmtAmount, duration, 1, if (userIsExisting)
408408 then 0
409409 else 1)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, duration, k, b, i)) ++ [IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral), IntegerEntry(userMaxBoostIntegralKEY, userMaxBoostInt), IntegerEntry(totalMaxBoostIntegralKEY, (totalMaxBoostInt + userMaxBoostInt)), IntegerEntry(totalMaxBoostIntegralMigratedKEY, 1)])
410410 }
411411 }
412412 }
413413 }
414414
415415
416416
417417 @Callable(i)
418418 func increaseLock (deltaDuration) = {
419419 let cfgArray = readConfigArrayOrFail()
420420 let assetIdStr = cfgArray[IdxCfgAssetId]
421421 let assetId = fromBase58String(assetIdStr)
422422 let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
423423 let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
424424 let mathContract = addressFromStringValue(cfgArray[IdxCfgMathContract])
425425 let pmtAmount = extractOptionalPaymentAmountOrFail(i, assetId)
426426 let userAddressStr = toString(i.caller)
427427 let userRecordArray = readLockParamsRecordOrFail(userAddressStr)
428428 let userNumStr = userRecordArray[IdxLockUserNum]
429429 let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
430430 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
431431 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
432432 let lockEnd = (lockStart + lockDuration)
433433 let remainingDuration = max([(lockEnd - height), 0])
434434 let userAmountNew = (userAmount + pmtAmount)
435435 let lockDurationNew = (remainingDuration + deltaDuration)
436436 if ((0 > deltaDuration))
437437 then throw("duration is less then zero")
438438 else if ((minLockDuration > lockDurationNew))
439439 then throw(("lockDurationNew is less then minLockDuration=" + toString(minLockDuration)))
440440 else if ((lockDurationNew > maxLockDuration))
441441 then throw(("deltaDuration + existedLockDuration is greater then maxLockDuration=" + toString(maxLockDuration)))
442442 else if (if ((height >= lockEnd))
443443 then (userAmount > 0)
444444 else false)
445445 then throw("there is an expired lock - need to unlock before new lock")
446446 else {
447447 let coeffX8 = fraction(lockDurationNew, MULT8, maxLockDuration)
448448 let gWxAmountStart = fraction(userAmountNew, coeffX8, MULT8)
449449 let gWxParamsResultList = asAnyList(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, height, lockDurationNew], nil))
450450 let k = asInt(gWxParamsResultList[0])
451451 let b = asInt(gWxParamsResultList[1])
452452 let period = toString(asInt(gWxParamsResultList[2]))
453453 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
454454 let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
455455 let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
456456 let h = if ((height > emissionEnd))
457457 then emissionEnd
458458 else height
459459 let dh = max([(h - emissionStart), 0])
460460 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
461461 let userBoostEmissionLastIntegral = getIntOrZero(this, userBoostEmissionLastIntegralKEY)
462462 let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
463463 let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
464464 if ((0 > userBoostEmissionIntegral))
465465 then throw("wrong calculations")
466466 else {
467467 let userMaxBoostIntegralMigratedKEY = keyMaxBoostMigrated(userNumStr)
468468 let userMaxBoostIntegralMigrated = valueOrElse(getInteger(this, userMaxBoostIntegralMigratedKEY), 0)
469469 let userMaxBoostDivider = if ((userMaxBoostIntegralMigrated == 0))
470470 then BOOSTMAXDIVIDER
471471 else 1
472472 let totalMaxBoostIntegralMigratedKEY = keyMaxBoostMigrated("total")
473473 let totalMaxBoostIntegralMigrated = valueOrElse(getInteger(this, totalMaxBoostIntegralMigratedKEY), 0)
474474 let totalMaxBoostDivider = if ((totalMaxBoostIntegralMigrated == 0))
475475 then BOOSTMAXDIVIDER
476476 else 1
477477 let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
478478 let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
479479 let userBoostAvalaibleToClaimTotalKEY = keyUserBoostAvalaibleToClaimTotal(userNumStr)
480480 let userMaxBoostInt = (getIntOrZero(this, userMaxBoostIntegralKEY) / userMaxBoostDivider)
481481 let totalMaxBoostInt = (getIntOrZero(this, totalMaxBoostIntegralKEY) / totalMaxBoostDivider)
482482 let userBoostAvaliableToClaimTotal = getIntOrZero(this, userBoostAvalaibleToClaimTotalKEY)
483483 let userBoostAvaliableToClaimTotalNew = (userBoostAvaliableToClaimTotal + fraction(userBoostEmissionIntegral, userMaxBoostInt, totalMaxBoostInt))
484- let userMaxBoostIntNew = ((gWxAmountStart * lockDurationNew) / 2)
484+ let userMaxBoostIntNew = fraction(gWxAmountStart, lockDurationNew, (2 * BOOSTMAXDIVIDER))
485485 let currUserGwx = calcCurrentGwxAmount(userAddressStr)
486- let remainingUserMaxBoostInt = ((currUserGwx * remainingDuration) / 2)
486+ let remainingUserMaxBoostInt = fraction(currUserGwx, remainingDuration, (2 * BOOSTMAXDIVIDER))
487487 let userMaxBoostIntDiff = (userMaxBoostIntNew - remainingUserMaxBoostInt)
488488 if ((0 > userMaxBoostIntDiff))
489489 then throw("wrong calculations")
490490 else (((LockParamsEntry(userAddressStr, userNumStr, userAmountNew, lockStart, lockDurationNew, k, b, period) ++ StatsEntry(pmtAmount, deltaDuration, 0, 0)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, lockDurationNew, k, b, i)) ++ [IntegerEntry(userMaxBoostIntegralKEY, (userMaxBoostInt + userMaxBoostIntDiff)), IntegerEntry(totalMaxBoostIntegralKEY, (totalMaxBoostInt + userMaxBoostIntDiff)), IntegerEntry(userBoostAvalaibleToClaimTotalKEY, userBoostAvaliableToClaimTotalNew), IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral), IntegerEntry(totalMaxBoostIntegralMigratedKEY, 1), IntegerEntry(userMaxBoostIntegralMigratedKEY, 1)])
491491 }
492492 }
493493 }
494494
495495
496496
497497 @Callable(i)
498498 func claimWxBoost (userAddressStr) = if ((stakingContract != i.caller))
499499 then throw("permissions denied")
500500 else {
501- let $t02456124642 = internalClaimWxBoost(userAddressStr)
502- let userBoostAvailable = $t02456124642._1
503- let dataState = $t02456124642._2
504- let debug = $t02456124642._3
501+ let $t02461524696 = internalClaimWxBoost(userAddressStr)
502+ let userBoostAvailable = $t02461524696._1
503+ let dataState = $t02461524696._2
504+ let debug = $t02461524696._3
505505 $Tuple2(dataState, [userBoostAvailable])
506506 }
507507
508508
509509
510510 @Callable(i)
511511 func claimWxBoostREADONLY (userAddressStr) = {
512- let $t02475224833 = internalClaimWxBoost(userAddressStr)
513- let userBoostAvailable = $t02475224833._1
514- let dataState = $t02475224833._2
515- let debug = $t02475224833._3
512+ let $t02480624887 = internalClaimWxBoost(userAddressStr)
513+ let userBoostAvailable = $t02480624887._1
514+ let dataState = $t02480624887._2
515+ let debug = $t02480624887._3
516516 $Tuple2(nil, [userBoostAvailable, debug])
517517 }
518518
519519
520520
521521 @Callable(i)
522522 func unlock (userAddress) = {
523523 let userRecordArray = readLockParamsRecordOrFail(userAddress)
524524 let userNumStr = userRecordArray[IdxLockUserNum]
525525 let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
526526 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
527527 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
528528 let lockEnd = (lockStart + lockDuration)
529529 let cfgArray = readConfigArrayOrFail()
530530 let assetId = fromBase58String(cfgArray[IdxCfgAssetId])
531531 if ((lockEnd >= height))
532532 then throw((("wait " + toString(lockEnd)) + " to unlock"))
533533 else if ((0 >= userAmount))
534534 then throw("nothing to unlock")
535535 else {
536536 let period = "0"
537537 (((LockParamsEntry(userAddress, userNumStr, 0, lockStart, lockDuration, 0, 0, period) ++ StatsEntry(-(userAmount), 0, 0, -1)) :+ HistoryEntry("unlock", userAddress, userAmount, lockStart, lockDuration, 0, 0, i)) :+ ScriptTransfer(addressFromStringValue(userAddress), userAmount, assetId))
538538 }
539539 }
540540
541541
542542
543543 @Callable(i)
544544 func gwxUserInfoREADONLY (userAddress) = {
545545 let gwxAmount = calcCurrentGwxAmount(userAddress)
546546 $Tuple2(nil, [gwxAmount])
547547 }
548548
549549

github/deemru/w8io/169f3d6 
74.54 ms