tx · AJaFgiazFXzqBC6rLaRvMMuRP19zPPa7XBbT5NNsANQK

3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37:  -0.01400000 Waves

2021.09.20 09:52 [1711027] smart account 3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37 > SELF 0.00000000 Waves

{ "type": 13, "id": "AJaFgiazFXzqBC6rLaRvMMuRP19zPPa7XBbT5NNsANQK", "fee": 1400000, "feeAssetId": null, "timestamp": 1632120763534, "version": 2, "chainId": 84, "sender": "3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37", "senderPublicKey": "4bwUHdA4vTBJ1k43dYKiPYTDqm3QqiZXNGXoQstGAD1k", "proofs": [ "iznzZQXwoJsGuizFLXrHm5wyti2mfu9mtKkuv9JtraFA8K643ToEvf6RscSf28sLr3dvgsQXRpzagVwacoVT2xW", "akfEwZYZs9q73TVXoKNuNhvLPJVaYULH4dz9VBpRx5gcj7J6jMQ3uKkDCVX6DipGtnaz7souK35UgYSwrrcsToR" ], "script": "base64:AAIFAAAAAAAAACMIAhIDCgEIEgMKAQESAwoBARIAEgMKAQESABIAEgMKAQESAAAAAFgAAAAAB3ZlcnNpb24CAAAABTEuMC4wAAAAAAprZXlWZXJzaW9uAgAAAAd2ZXJzaW9uAAAAAAlrZXlBY3RpdmUCAAAABmFjdGl2ZQAAAAALa2V5QXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAAC2tleUFzc2V0SWRCAgAAAApCX2Fzc2V0X2lkAAAAAAtrZXlCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAtrZXlCYWxhbmNlQgIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAA9rZXlCYWxhbmNlSW5pdEECAAAADEFfYXNzZXRfaW5pdAAAAAAPa2V5QmFsYW5jZUluaXRCAgAAAAxCX2Fzc2V0X2luaXQAAAAAD2tleVNoYXJlQXNzZXRJZAIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAANa2V5Q29tbWlzc2lvbgIAAAAKY29tbWlzc2lvbgAAAAAba2V5Q29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAIa2V5Q2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA9rZXlGaXJzdEhhcnZlc3QCAAAADWZpcnN0X2hhcnZlc3QAAAAAFWtleUZpcnN0SGFydmVzdEhlaWdodAIAAAAUZmlyc3RfaGFydmVzdF9oZWlnaHQAAAAADWtleVNoYXJlTGltaXQCAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAADWtleUJhc2VQZXJpb2QCAAAAC2Jhc2VfcGVyaW9kAAAAAA9rZXlQZXJpb2RMZW5ndGgCAAAADXBlcmlvZF9sZW5ndGgAAAAADmtleVN0YXJ0SGVpZ2h0AgAAAAxzdGFydF9oZWlnaHQAAAAAFmtleU9yYWNsZUFzc2V0UHJpb3JpdHkCAAAAD2Fzc2V0X3ByaW9yaXR5XwAAAAATa2V5T3JhY2xlU2NyaXB0SGFzaAIAAAAQc2NyaXB0X2hhc2hfY3BtbQAAAAARa2V5SW5pdFBv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AAALa2V5QmFsYW5jZUEAAAAACGJhbGFuY2VCCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzBQAAAAtrZXlCYWxhbmNlQgAAAAAMc2hhcmVBc3NldElkCQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAAD2tleVNoYXJlQXNzZXRJZAAAAAAQc2hhcmVBc3NldFN1cHBseQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAATa2V5U2hhcmVBc3NldFN1cHBseQAAAAAKY29tbWlzc2lvbgAAAAAAAAALuAAAAAAUY29tbWlzc2lvbkdvdmVybmFuY2UAAAAAAAAABLAAAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgAAAAAAAA9CQAAAAAALc2NhbGVWYWx1ZTMAAAAAAAAAA+gAAAAAC3NjYWxlVmFsdWU4AAAAAAAF9eEAAAAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgAAAAAAAAAD6AAAAAARc2NhbGVWYWx1ZThEaWdpdHMAAAAAAAAAAAgAAAAAGWNvbWlzc2lvbkZvckluaXRhbGl6YXRpb24AAAAAADuaygABAAAADmFjY291bnRCYWxhbmNlAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAkAA/AAAAACBQAAAAR0aGlzBQAAAAJpZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAICQAD7wAAAAEFAAAABHRoaXMAAAAJYXZhaWxhYmxlCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAxzdGFrZWRBbW91bnQAAAABAAAAB2Fzc2V0SWQEAAAAFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAA2FJZAUAAAAHJG1hdGNoMAMDCQAAAAAAAAIFAAAAA2FJZAUAAAAEVVNETgYJAAAAAAAAAgUAAAADYUlkBQAAAAROU0JUCQAEGgAAAAIFAAAAFnN0YWtpbmdVU0ROTlNCVEFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADHJwZF9iYWxhbmNlXwkAAlgAAAABBQAAAANhSWQCAAAAAV8JAAQlAAAAAQUAAAAEdGhpcwMJAAAAAAAAAgUAAAADYUlkBQAAAARFVVJOCQAEGgAAAAIFAAAAEnN0YWtpbmdFVVJOQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAYJXMlcyVzX19zdGFraW5nQmFsYW5jZV9fCQACWAAAAAEFAAAAA2FJZAIAAAACX18JAAQlAAAAAQUAAAAEdGhpcwAAAAAAAAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAAAAAAAAAAAAAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgQAAAAHJG1hdGNoMAUAAAAWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFpBQAAAAckbWF0Y2gwBQAAAAFpAAAAAAAAAAAAAQAAAA5pc0FsbG93ZWRBc3NldAAAAAEAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDADAwkAAAAAAAACBQAAAAJpZAUAAAAEVVNETgYJAAAAAAAAAgUAAAACaWQFAAAABFNXT1AGBwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAGCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAAAAAA1zdGFrZWRBbW91bnRBCQEAAAAMc3Rha2VkQW1vdW50AAAAAQUAAAAIYXNzZXRJZEEAAAAADXN0YWtlZEFtb3VudEIJAQAAAAxzdGFrZWRBbW91bnQAAAABBQAAAAhhc3NldElkQgAAAAAKYXNzZXRJbml0QQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAPa2V5QmFsYW5jZUluaXRBAAAAAAphc3NldEluaXRCCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzBQAAAA9rZXlCYWxhbmNlSW5pdEIAAAAAEWF2YWlsYWJsZUJhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAA1zdGFrZWRBbW91bnRBAAAAABFhdmFpbGFibGVCYWxhbmNlQgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAANc3Rha2VkQW1vdW50QgAAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQkAAGQAAAACCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQQUAAAANc3Rha2VkQW1vdW50QQAAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgkAAGQAAAACCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQgUAAAANc3Rha2VkQW1vdW50QgAAAAAQaGFzRW5vdWdoQmFsYW5jZQMJAABnAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQUAAAAIYmFsYW5jZUEJAABnAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgUAAAAIYmFsYW5jZUIHAQAAAAxnZXRBc3NldEluZm8AAAABAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAmlkBQAAAAckbWF0Y2gwBAAAAAhzdHJpbmdJZAkAAlgAAAABBQAAAAJpZAQAAAAEaW5mbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEFAAAAAmlkCQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgBQAAAAhzdHJpbmdJZAIAAAAOIGRvZXNuJ3QgZXhpc3QJAAUVAAAAAwUAAAAIc3RyaW5nSWQIBQAAAARpbmZvAAAABG5hbWUIBQAAAARpbmZvAAAACGRlY2ltYWxzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAkABRUAAAADAgAAAAVXQVZFUwIAAAAFV0FWRVMAAAAAAAAAAAgJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAAFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcAAAABAAAACGFzc2V0U3RyAwkAAAAAAAACBQAAAAhhc3NldFN0cgIAAAAFV0FWRVMJAAUVAAAAAwIAAAAFV0FWRVMCAAAABVdBVkVTAAAAAAAAAAAIBAAAAAhzdHJpbmdJZAUAAAAIYXNzZXRTdHIEAAAAAmlkCQACWQAAAAEFAAAACGFzc2V0U3RyBAAAAARpbmZvCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQUAAAACaWQJAAEsAAAAAgkAASwAAAACAgAAAAZBc3NldCAFAAAACHN0cmluZ0lkAgAAAA4gZG9lc24ndCBleGlzdAkABRUAAAADBQAAAAhzdHJpbmdJZAgFAAAABGluZm8AAAAEbmFtZQgFAAAABGluZm8AAAAIZGVjaW1hbHMBAAAAB3N1c3BlbmQAAAABAAAABWNhdXNlCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUHCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACGtleUNhdXNlBQAAAAVjYXVzZQUAAAADbmlsAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwAAAAZhbW91bnQAAAAHYXNzZXRJZAAAAA1zZWNvbmRBc3NldElkAwMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAEVVNETgYJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAERVVSTgQAAAAJc3Rha2luRmVlAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAARVU0ROCQAAaAAAAAIFAAAAEHN0YWtpbmdGZWVJblVTRE4DCQAAAAAAAAIFAAAADXNlY29uZEFzc2V0SWQFAAAABE5TQlQAAAAAAAAAAAIAAAAAAAAAAAEDCQAAAAAAAAIFAAAAB2Fzc2V0SWQFAAAABEVVUk4FAAAAEHN0YWtpbmdGZWVJbkVVUk4AAAAAAAAAAAAEAAAABnJlc3VsdAkAAGUAAAACBQAAAAZhbW91bnQFAAAACXN0YWtpbkZlZQMJAABnAAAAAgAAAAAAAAAAAAUAAAAGcmVzdWx0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAUSW5zdWZmaWNpZW50IGFtb3VudCAJAAGkAAAAAQUAAAAGYW1vdW50AgAAABcgdG8gZGVkdWN0IHN0YWtpbmcgZmVlIAkAAaQAAAABBQAAAAlzdGFraW5GZWUCAAAACVVTRE4vRVVSTgUAAAAGcmVzdWx0BQAAAAZhbW91bnQBAAAADWdldFN0YWtpbmdGZWUAAAACAAAAB2Fzc2V0SWQAAAANc2Vjb25kQXNzZXRJZAMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAEVVNETgkAAGgAAAACBQAAABBzdGFraW5nRmVlSW5VU0ROAwkAAAAAAAACBQAAAA1zZWNvbmRBc3NldElkBQAAAAROU0JUAAAAAAAAAAACAAAAAAAAAAABAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAARFVVJOBQAAABBzdGFraW5nRmVlSW5FVVJOAAAAAAAAAAAAAQAAACF0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2UAAAADAAAABmFtb3VudAAAAAlhdmFpbGFibGUAAAAJYXNzZXROYW1lCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACFJbnN1ZmZpY2llbnQgREFwcCBiYWxhbmNlIHRvIHBheSAJAAGkAAAAAQUAAAAGYW1vdW50AgAAAAEgBQAAAAlhc3NldE5hbWUCAAAAHCBkdWUgdG8gc3Rha2luZy4gQXZhaWxhYmxlOiAJAAGkAAAAAQUAAAAJYXZhaWxhYmxlAgAAAAEgBQAAAAlhc3NldE5hbWUCAAAAQC4gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydCBpbiBUZWxlZ3JhbTogaHR0cHM6Ly90Lm1lL3N3b3BmaXN1cHBvcnQBAAAAInRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZXMAAAACAAAAB2Ftb3VudEEAAAAHYW1vdW50QgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAIUluc3VmZmljaWVudCBEQXBwIGJhbGFuY2UgdG8gcGF5IAkAAaQAAAABBQAAAAdhbW91bnRBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAUgYW5kIAkAAaQAAAABBQAAAAdhbW91bnRCAgAAAAEgBQAAAAphc3NldE5hbWVCAgAAABwgZHVlIHRvIHN0YWtpbmcuIEF2YWlsYWJsZTogCQABpAAAAAEFAAAAEWF2YWlsYWJsZUJhbGFuY2VBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAUgYW5kIAkAAaQAAAABBQAAABFhdmFpbGFibGVCYWxhbmNlQgIAAAABIAUAAAAKYXNzZXROYW1lQgIAAABALiBQbGVhc2UgY29udGFjdCBzdXBwb3J0IGluIFRlbGVncmFtOiBodHRwczovL3QubWUvc3dvcGZpc3VwcG9ydAEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAACQEAAAAHc3VzcGVuZAAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAI1N1c3BpY2lvdXMgc3RhdGUuIEFjdHVhbCBiYWxhbmNlczogCQABpAAAAAEFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEECAAAAASAFAAAACmFzc2V0TmFtZUECAAAAAiwgCQABpAAAAAEFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEICAAAAASAFAAAACmFzc2V0TmFtZUICAAAACS4gU3RhdGU6IAkAAaQAAAABBQAAAAhiYWxhbmNlQQIAAAABIAUAAAAKYXNzZXROYW1lQQIAAAACLCAJAAGkAAAAAQUAAAAIYmFsYW5jZUICAAAAASAFAAAACmFzc2V0TmFtZUIAAAAJAAAAAWkBAAAABGluaXQAAAABAAAADnVzZXJBZGRyZXNzU3RyBAAAAAskdDA4MzYwODQzNwkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACnBtdEFtb3VudDEIBQAAAAskdDA4MzYwODQzNwAAAAJfMQQAAAALcG10QXNzZXRJZDEIBQAAAAskdDA4MzYwODQzNwAAAAJfMgQAAAALJHQwODQ0Mjg1MTkJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAdhc3NldElkBAAAAApwbXRBbW91bnQyCAUAAAALJHQwODQ0Mjg1MTkAAAACXzEEAAAAC3BtdEFzc2V0SWQyCAUAAAALJHQwODQ0Mjg1MTkAAAACXzIEAAAACyR0MDg1MjQ4NjA3CQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAACAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAIAAAAHYXNzZXRJZAQAAAANcG10QW1vdW50U1dPUAgFAAAACyR0MDg1MjQ4NjA3AAAAAl8xBAAAAA5wbXRBc3NldElkU1dPUAgFAAAACyR0MDg1MjQ4NjA3AAAAAl8yBAAAAAVjaGVjawkABB4AAAABBQAAAAR0aGlzBAAAAA51c2VyU2NyaXB0SGFzaAkAA/EAAAABBQAAAAR0aGlzBAAAAAt1c2VyQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIEAAAADm9yYWNsZUNwbW1IYXNoCQEAAAAFdmFsdWUAAAABCQAEHAAAAAIFAAAABm9yYWNsZQUAAAATa2V5T3JhY2xlU2NyaXB0SGFzaAMJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAF1lvdSBjYW4ndCBjYWxsIHlvdXJzZWxmAwMJAQAAAAIhPQAAAAIFAAAADnBtdEFzc2V0SWRTV09QBQAAAARTV09QBgkBAAAAAiE9AAAAAgUAAAANcG10QW1vdW50U1dPUAUAAAAZY29taXNzaW9uRm9ySW5pdGFsaXphdGlvbgkAAAIAAAABAgAAACFZb3UgbmVlZCB0byBhdHRhY2ggMTAgU1dPUCB0b2tlbnMDAwkBAAAAASEAAAABCQEAAAAOaXNBbGxvd2VkQXNzZXQAAAABBQAAAAtwbXRBc3NldElkMQkBAAAAASEAAAABCQEAAAAOaXNBbGxvd2VkQXNzZXQAAAABBQAAAAtwbXRBc3NldElkMgcJAAACAAAAAQIAAAApT25lIG9mIGFzc2V0cyBtdXN0IGJlIFVTRE4sIFdBVkVTIG9yIFNXT1ADAwkBAAAAAiE9AAAAAgUAAAAOdXNlclNjcmlwdEhhc2gFAAAADm9yYWNsZUNwbW1IYXNoBgkBAAAAASEAAAABBQAAAAVjaGVjawkAAAIAAAABAgAAABxVbmV4cGVjdGVkIHNjcmlwdCB3YXMgZm91bmQuAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQbAAAAAgUAAAAEdGhpcwUAAAAJa2V5QWN0aXZlCQAAAgAAAAECAAAAFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQAAAAAAAAIFAAAAC3BtdEFzc2V0SWQxBQAAAAtwbXRBc3NldElkMgkAAAIAAAABAgAAABhBc3NldHMgbXVzdCBiZSBkaWZmZXJlbnQEAAAADnBtdFN0ckFzc2V0SWQxBAAAAAckbWF0Y2gwBQAAAAtwbXRBc3NldElkMQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDAJAAJYAAAAAQUAAAACaWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwAgAAAAVXQVZFUwkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgQAAAAOcG10U3RyQXNzZXRJZDIEAAAAByRtYXRjaDAFAAAAC3BtdEFzc2V0SWQyAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAkAAlgAAAABBQAAAAJpZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDACAAAABVdBVkVTCQAAAgAAAAECAAAAC01hdGNoIGVycm9yBAAAAA5hc3NldDFQcmlvcml0eQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAZvcmFjbGUJAAEsAAAAAgUAAAAWa2V5T3JhY2xlQXNzZXRQcmlvcml0eQUAAAAOcG10U3RyQXNzZXRJZDEAAAAAAAAPQj8EAAAADmFzc2V0MlByaW9yaXR5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACBQAAABZrZXlPcmFjbGVBc3NldFByaW9yaXR5BQAAAA5wbXRTdHJBc3NldElkMgAAAAAAAA9CPwQAAAANJHQwMTAwMDMxMDIzMAMJAABmAAAAAgUAAAAOYXNzZXQyUHJpb3JpdHkFAAAADmFzc2V0MVByaW9yaXR5CQAFFgAAAAQFAAAACnBtdEFtb3VudDIFAAAAC3BtdEFzc2V0SWQyBQAAAApwbXRBbW91bnQxBQAAAAtwbXRBc3NldElkMQkABRYAAAAEBQAAAApwbXRBbW91bnQxBQAAAAtwbXRBc3NldElkMQUAAAAKcG10QW1vdW50MgUAAAALcG10QXNzZXRJZDIEAAAACnBtdEFtb3VudEEIBQAAAA0kdDAxMDAwMzEwMjMwAAAAAl8xBAAAAAtwbXRBc3NldElkQQgFAAAADSR0MDEwMDAzMTAyMzAAAAACXzIEAAAACnBtdEFtb3VudEIIBQAAAA0kdDAxMDAwMzEwMjMwAAAAAl8zBAAAAAtwbXRBc3NldElkQggFAAAADSR0MDEwMDAzMTAyMzAAAAACXzQEAAAADSR0MDEwMjM5MTAzMTYJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQQQAAAAOcG10U3RyQXNzZXRJZEEIBQAAAA0kdDAxMDIzOTEwMzE2AAAAAl8xBAAAAA1wbXRBc3NldE5hbWVBCAUAAAANJHQwMTAyMzkxMDMxNgAAAAJfMgQAAAAMcG10RGVjaW1hbHNBCAUAAAANJHQwMTAyMzkxMDMxNgAAAAJfMwQAAAANJHQwMTAzMjUxMDQwMgkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRCBAAAAA5wbXRTdHJBc3NldElkQggFAAAADSR0MDEwMzI1MTA0MDIAAAACXzEEAAAADXBtdEFzc2V0TmFtZUIIBQAAAA0kdDAxMDMyNTEwNDAyAAAAAl8yBAAAAAxwbXREZWNpbWFsc0IIBQAAAA0kdDAxMDMyNTEwNDAyAAAAAl8zBAAAAAlhZGRQYXJhbXMJAARMAAAAAgkABCUAAAABBQAAAAR0aGlzCQAETAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAA1wbXRBc3NldE5hbWVBAgAAAAFfBQAAAA1wbXRBc3NldE5hbWVCCQAETAAAAAIFAAAADnBtdFN0ckFzc2V0SWRBCQAETAAAAAIFAAAADnBtdFN0ckFzc2V0SWRCBQAAAANuaWwEAAAAB2FkZFBvb2wJAAP8AAAABAUAAAAGb3JhY2xlAgAAAAdhZGRQb29sBQAAAAlhZGRQYXJhbXMFAAAAA25pbAMJAAAAAAAAAgUAAAAHYWRkUG9vbAUAAAAHYWRkUG9vbAMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAGb3JhY2xlCQABLAAAAAICAAAABXBvb2xfCQAEJQAAAAEFAAAABHRoaXMJAAACAAAAAQIAAAARUG9vbCBpcyBub3QgYWRkZWQEAAAACXNoYXJlTmFtZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAABcwkAAS8AAAACBQAAAA1wbXRBc3NldE5hbWVBAAAAAAAAAAAHAgAAAAFfCQABLwAAAAIFAAAADXBtdEFzc2V0TmFtZUIAAAAAAAAAAAcEAAAAEHNoYXJlRGVzY3JpcHRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQAAAA1wbXRBc3NldE5hbWVBAgAAAAUgYW5kIAUAAAANcG10QXNzZXROYW1lQgIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAABHRoaXMEAAAADXNoYXJlRGVjaW1hbHMJAABpAAAAAgkAAGQAAAACBQAAAAxwbXREZWNpbWFsc0EFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAAAgQAAAAEYXJnMQkAAGwAAAAGBQAAAApwbXRBbW91bnRBBQAAAAxwbXREZWNpbWFsc0EAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQQUAAAAERE9XTgQAAAAEYXJnMgkAAGwAAAAGBQAAAApwbXRBbW91bnRCBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQgUAAAAERE9XTgQAAAAEYXJnMwkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAABQAAAA1zaGFyZURlY2ltYWxzAAAAAAAAAAAAAAAAAAAAAAAABQAAAARET1dOBAAAABJzaGFyZUluaXRpYWxTdXBwbHkJAABrAAAAAwUAAAAEYXJnMQUAAAAEYXJnMgUAAAAEYXJnMwQAAAAKc2hhcmVJc3N1ZQkABEIAAAAFBQAAAAlzaGFyZU5hbWUFAAAAEHNoYXJlRGVzY3JpcHRpb24FAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAANc2hhcmVEZWNpbWFscwYEAAAADHNoYXJlSXNzdWVJZAkABDgAAAABBQAAAApzaGFyZUlzc3VlBAAAAAliYXNlRW50cnkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAKa2V5VmVyc2lvbgUAAAAHdmVyc2lvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAJa2V5QWN0aXZlBgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAtrZXlBc3NldElkQQUAAAAOcG10U3RyQXNzZXRJZEEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAALa2V5QXNzZXRJZEIFAAAADnBtdFN0ckFzc2V0SWRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADWtleUNvbW1pc3Npb24FAAAACmNvbW1pc3Npb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG2tleUNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyCQAETAAAAAIFAAAACnNoYXJlSXNzdWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAPa2V5U2hhcmVBc3NldElkCQACWAAAAAEFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrZXlJbml0UG9vbEhlaWdodAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAABJzaGFyZUluaXRpYWxTdXBwbHkFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13YWxsZXRBZGRyZXNzBQAAABljb21pc3Npb25Gb3JJbml0YWxpemF0aW9uBQAAAARTV09QBQAAAANuaWwFAAAACWJhc2VFbnRyeQkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAYa2VlcExpbWl0Rm9yRmlyc3RIYXJ2ZXN0AAAAAQAAAApzaGFyZUxpbWl0AwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABJhZG1pblB1YktleVN0YWtpbmcFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANa2V5U2hhcmVMaW1pdAUAAAAKc2hhcmVMaW1pdAUAAAADbmlsAAAAAWkBAAAAFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMAAAABAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAAtwbXRBc3NldElkQQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAALcG10QXNzZXRJZEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAACnBtdEFtb3VudEEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQQUAAAALcG10QXNzZXRJZEIEAAAACnBtdEFtb3VudEIJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQgUAAAALcG10QXNzZXRJZEEDAwkAAAAAAAACBQAAAAhiYWxhbmNlQQAAAAAAAAAAAAkAAAAAAAACBQAAAAhiYWxhbmNlQgAAAAAAAAAAAAcEAAAADSR0MDEzMzIyMTMzOTkJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQQQAAAAOcG10U3RyQXNzZXRJZEEIBQAAAA0kdDAxMzMyMjEzMzk5AAAAAl8xBAAAAA1wbXRBc3NldE5hbWVBCAUAAAANJHQwMTMzMjIxMzM5OQAAAAJfMgQAAAAMcG10RGVjaW1hbHNBCAUAAAANJHQwMTMzMjIxMzM5OQAAAAJfMwQAAAANJHQwMTM0MDgxMzQ4NQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRCBAAAAA5wbXRTdHJBc3NldElkQggFAAAADSR0MDEzNDA4MTM0ODUAAAACXzEEAAAADXBtdEFzc2V0TmFtZUIIBQAAAA0kdDAxMzQwODEzNDg1AAAAAl8yBAAAAAxwbXREZWNpbWFsc0IIBQAAAA0kdDAxMzQwODEzNDg1AAAAAl8zBAAAAAp0b2tlblJhdGlvCQAAawAAAAMJAABrAAAAAwUAAAAKYXNzZXRJbml0QQUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEEFAAAAC3NjYWxlVmFsdWUzCQAAawAAAAMFAAAACmFzc2V0SW5pdEIFAAAAC3NjYWxlVmFsdWU4BQAAAApwbXRBbW91bnRCAwkAAAAAAAACBQAAAAtwbXRBc3NldElkQQUAAAALcG10QXNzZXRJZEIJAAACAAAAAQIAAAAYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50BAAAAA1zaGFyZURlY2ltYWxzCQAAaQAAAAIJAABkAAAAAgUAAAAMcG10RGVjaW1hbHNBBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAIEAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkAAGsAAAADCQAAbAAAAAYFAAAACnBtdEFtb3VudEEFAAAADHBtdERlY2ltYWxzQQAAAAAAAAAABQAAAAAAAAAAAQUAAAAMcG10RGVjaW1hbHNBBQAAAARET1dOCQAAbAAAAAYFAAAACnBtdEFtb3VudEIFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAABQAAAAAAAAAAAQUAAAAMcG10RGVjaW1hbHNCBQAAAARET1dOCQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAFAAAADXNoYXJlRGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04DCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAAGYAAAACAAAAAAAAAAAABQAAABFzbGlwcGFnZVRvbGVyYW5jZQYJAABmAAAAAgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAKVNsaXBwYWdlIHRvbGVyYW5jZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgCQABpAAAAAEFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyAgAAABYgaW5jbHVzaXZlbHkuIEFjdHVhbDogCQABpAAAAAEFAAAAEXNsaXBwYWdlVG9sZXJhbmNlAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAgkAAAIAAAABAgAAABxUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAABmAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZQAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAACnRva2VuUmF0aW8GCQAAZgAAAAIFAAAACnRva2VuUmF0aW8JAABpAAAAAgkAAGgAAAACBQAAAAtzY2FsZVZhbHVlMwkAAGQAAAACBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAECAAAAPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DAwkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEEFAAAACGFzc2V0SWRBBgkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEIFAAAACGFzc2V0SWRCCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJUluY29ycmVjdCBhc3NldHMgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAC3N0ckFzc2V0SWRBAgAAAAUgYW5kIAUAAAALc3RyQXNzZXRJZEIDCQAAAAAAAAIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQAAAAAAAAAAAAkAAAIAAAABAgAAAB1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QQUAAAALcG10QXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRCBQAAAAtwbXRBc3NldElkQgUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAACQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAABJzaGFyZUluaXRpYWxTdXBwbHkGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAAMc2hhcmVBc3NldElkBQAAAANuaWwEAAAACnRva2VuUmF0aW8JAABrAAAAAwkAAGsAAAADBQAAAAhiYWxhbmNlQQUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEEFAAAAC3NjYWxlVmFsdWUzCQAAawAAAAMFAAAACGJhbGFuY2VCBQAAAAtzY2FsZVZhbHVlOAUAAAAKcG10QW1vdW50QgQAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkAAGsAAAADBQAAAApwbXRBbW91bnRBBQAAAAtzY2FsZVZhbHVlOAUAAAAIYmFsYW5jZUEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAAKcG10QW1vdW50QgUAAAALc2NhbGVWYWx1ZTgFAAAACGJhbGFuY2VCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAtzY2FsZVZhbHVlOAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBgkAAGYAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAApU2xpcHBhZ2UgdG9sZXJhbmNlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAJAAGkAAAAAQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXICAAAAFiBpbmNsdXNpdmVseS4gQWN0dWFsOiAJAAGkAAAAAQUAAAARc2xpcHBhZ2VUb2xlcmFuY2UDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAACCQAAAgAAAAECAAAAHFR3byBhdHRhY2hlZCBhc3NldHMgZXhwZWN0ZWQDAwkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEEFAAAACGFzc2V0SWRBBgkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEIFAAAACGFzc2V0SWRCCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJUluY29ycmVjdCBhc3NldHMgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAC3N0ckFzc2V0SWRBAgAAAAUgYW5kIAUAAAALc3RyQXNzZXRJZEIDAwkAAGYAAAACCQAAaQAAAAIJAABoAAAAAgUAAAALc2NhbGVWYWx1ZTMJAABlAAAAAgUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAAKdG9rZW5SYXRpbwYJAABmAAAAAgUAAAAKdG9rZW5SYXRpbwkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZAAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQIAAAA9SW5jb3JyZWN0IGFzc2V0cyBhbW91bnQ6IGFtb3VudHMgbXVzdCBoYXZlIHRoZSBjb250cmFjdCByYXRpbwMJAAAAAAAAAgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRBBQAAAAtwbXRBc3NldElkQQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACnBtdEFtb3VudEIFAAAAC3BtdEFzc2V0SWRCBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQkAAGQAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAACHdpdGhkcmF3AAAAAAQAAAANJHQwMTc4ODQxODAzNAkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE3ODg0MTgwMzQAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxNzg4NDE4MDM0AAAAAl8yBAAAAAxhbW91bnRUb1BheUEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAwkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAhhc3NldElkQQUAAAAIYXNzZXRJZEIEAAAADGFtb3VudFRvUGF5QgkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAADCQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAACGFzc2V0SWRCBQAAAAhhc3NldElkQQMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAACRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJAAJYAAAAAQUAAAAMc2hhcmVBc3NldElkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QQUAAAARYXZhaWxhYmxlQmFsYW5jZUEGCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QgUAAAARYXZhaWxhYmxlQmFsYW5jZUIJAQAAACJ0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2VzAAAAAgUAAAAMYW1vdW50VG9QYXlBBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkJAABlAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAMc2hhcmVBc3NldElkBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlCBQAAAAhhc3NldElkQgUAAAADbmlsAAAAAWkBAAAACGV4Y2hhbmdlAAAAAQAAABJtaW5BbW91bnRUb1JlY2VpdmUEAAAADSR0MDE5MjYwMTkzMzUJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxOTI2MDE5MzM1AAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTkyNjAxOTMzNQAAAAJfMgoBAAAADWNhbGN1bGF0ZUZlZXMAAAACAAAACXRva2VuRnJvbQAAAAd0b2tlblRvBAAAABBhbW91bnRXaXRob3V0RmVlCQAAawAAAAMFAAAAB3Rva2VuVG8FAAAACXBtdEFtb3VudAkAAGQAAAACBQAAAAlwbXRBbW91bnQFAAAACXRva2VuRnJvbQQAAAANYW1vdW50V2l0aEZlZQkAAGsAAAADBQAAABBhbW91bnRXaXRob3V0RmVlCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBAAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAawAAAAMFAAAAEGFtb3VudFdpdGhvdXRGZWUFAAAAFGNvbW1pc3Npb25Hb3Zlcm5hbmNlBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIDCQAAZgAAAAIFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAANYW1vdW50V2l0aEZlZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB1DYWxjdWxhdGVkIGFtb3VudCB0byByZWNlaXZlIAkAAaQAAAABBQAAAA1hbW91bnRXaXRoRmVlAgAAACAgaXMgbGVzcyB0aGFuIHNwZWNpZmllZCBtaW5pbXVtIAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUJAAUVAAAAAwUAAAAQYW1vdW50V2l0aG91dEZlZQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQAAAAAAAAIFAAAACGJhbGFuY2VBAAAAAAAAAAAABgkAAAAAAAACBQAAAAhiYWxhbmNlQgAAAAAAAAAAAAkAAAIAAAABAgAAACBDYW4ndCBleGNoYW5nZSB3aXRoIHplcm8gYmFsYW5jZQMJAABnAAAAAgAAAAAAAAAAAAUAAAASbWluQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgIAAAA0TWluaW1hbCBhbW91bnQgdG8gcmVjZWl2ZSBtdXN0IGJlIHBvc2l0aXZlLiBBY3R1YWw6IAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEEAAAAC2Fzc2V0SWRTZW5kBQAAAAhhc3NldElkQgQAAAANJHQwMjA2MDkyMDcwMAkBAAAADWNhbGN1bGF0ZUZlZXMAAAACBQAAAAhiYWxhbmNlQQUAAAAIYmFsYW5jZUIEAAAAEGFtb3VudFdpdGhvdXRGZWUIBQAAAA0kdDAyMDYwOTIwNzAwAAAAAl8xBAAAAA1hbW91bnRXaXRoRmVlCAUAAAANJHQwMjA2MDkyMDcwMAAAAAJfMgQAAAAQZ292ZXJuYW5jZVJld2FyZAgFAAAADSR0MDIwNjA5MjA3MDAAAAACXzMEAAAAC25ld0JhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VCCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudFdpdGhGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQDAwkAAGcAAAACBQAAAA1zdGFrZWRBbW91bnRBBQAAAAtuZXdCYWxhbmNlQQYJAABnAAAAAgUAAAANc3Rha2VkQW1vdW50QgUAAAALbmV3QmFsYW5jZUIJAQAAACF0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2UAAAADBQAAAA1hbW91bnRXaXRoRmVlBQAAABFhdmFpbGFibGVCYWxhbmNlQgUAAAAKYXNzZXROYW1lQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA1hbW91bnRXaXRoRmVlBQAAAAthc3NldElkU2VuZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA13YWxsZXRBZGRyZXNzBQAAABBnb3Zlcm5hbmNlUmV3YXJkBQAAAAthc3NldElkU2VuZAUAAAADbmlsAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQgQAAAALYXNzZXRJZFNlbmQFAAAACGFzc2V0SWRBBAAAAA0kdDAyMTUxOTIxNjEwCQEAAAANY2FsY3VsYXRlRmVlcwAAAAIFAAAACGJhbGFuY2VCBQAAAAhiYWxhbmNlQQQAAAAQYW1vdW50V2l0aG91dEZlZQgFAAAADSR0MDIxNTE5MjE2MTAAAAACXzEEAAAADWFtb3VudFdpdGhGZWUIBQAAAA0kdDAyMTUxOTIxNjEwAAAAAl8yBAAAABBnb3Zlcm5hbmNlUmV3YXJkCAUAAAANJHQwMjE1MTkyMTYxMAAAAAJfMwQAAAALbmV3QmFsYW5jZUEJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAQAAAALbmV3QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAMDCQAAZwAAAAIFAAAADXN0YWtlZEFtb3VudEEFAAAAC25ld0JhbGFuY2VBBgkAAGcAAAACBQAAAA1zdGFrZWRBbW91bnRCBQAAAAtuZXdCYWxhbmNlQgkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADWFtb3VudFdpdGhGZWUFAAAAEWF2YWlsYWJsZUJhbGFuY2VBBQAAAAphc3NldE5hbWVBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADWFtb3VudFdpdGhGZWUFAAAAC2Fzc2V0SWRTZW5kCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADXdhbGxldEFkZHJlc3MFAAAAEGdvdmVybmFuY2VSZXdhcmQFAAAAC2Fzc2V0SWRTZW5kBQAAAANuaWwJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogBQAAAAtzdHJBc3NldElkQQIAAAAEIG9yIAUAAAALc3RyQXNzZXRJZEIAAAABaQEAAAAIc2h1dGRvd24AAAAAAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABCQABLAAAAAICAAAAIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAIa2V5Q2F1c2UCAAAAGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABRhZG1pblB1YktleVN0YXJ0U3RvcAUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQEAAAAHc3VzcGVuZAAAAAECAAAAD1BhdXNlZCBieSBhZG1pbgAAAAFpAQAAAAhhY3RpdmF0ZQAAAAADBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAABZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABRhZG1pblB1YktleVN0YXJ0U3RvcAUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUGCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAACGtleUNhdXNlBQAAAANuaWwAAAABaQEAAAAZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwAAAAEAAAALYW1vdW50TGVhdmUEAAAAHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRBCQAAZQAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBBAAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QgkAAGUAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCBQAAAAhiYWxhbmNlQgQAAAANYW1vdW50RW5yb2xsQQkAAGUAAAACBQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQMJAAAAAAAAAgUAAAAIYXNzZXRJZEEFAAAABHVuaXQFAAAAC2Ftb3VudExlYXZlAAAAAAAAAAAABAAAAA1hbW91bnRFbnJvbGxCCQAAZQAAAAIFAAAAHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRCAwkAAAAAAAACBQAAAAhhc3NldElkQgUAAAAEdW5pdAUAAAALYW1vdW50TGVhdmUAAAAAAAAAAAADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAArT25seSB0aGUgREFwcCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAABmAAAAAgAAAAAAAAAAAAUAAAALYW1vdW50TGVhdmUJAAACAAAAAQkAASwAAAACAgAAADNBcmd1bWVudCAnYW1vdW50TGVhdmUnIGNhbm5vdCBiZSBuZWdhdGl2ZS4gQWN0dWFsOiAJAAGkAAAAAQUAAAALYW1vdW50TGVhdmUDAwkAAGYAAAACAAAAAAAAAAAABQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQYJAABmAAAAAgAAAAAAAAAAAAUAAAAddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEIJAQAAAAdzdXNwZW5kAAAAAQIAAAAWRW5yb2xsIGFtb3VudCBuZWdhdGl2ZQMDCQAAZgAAAAIAAAAAAAAAAAAFAAAADWFtb3VudEVucm9sbEEGCQAAZgAAAAIAAAAAAAAAAAAFAAAADWFtb3VudEVucm9sbEIJAAACAAAAAQIAAAAVVG9vIGxhcmdlIGFtb3VudExlYXZlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudEVucm9sbEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAMbGFzdF9pbmNvbWVfBQAAAAtzdHJBc3NldElkQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACAgAAAAxsYXN0X2luY29tZV8FAAAAC3N0ckFzc2V0SWRCBQAAAA1hbW91bnRFbnJvbGxCBQAAAANuaWwAAAABaQEAAAASZW5hYmxlRmlyc3RIYXJ2ZXN0AAAAAAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAPa2V5Rmlyc3RIYXJ2ZXN0BgkABEwAAAACCQEAAAAMSW50ZWdl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", "height": 1711027, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8JPZfJW9oMChr8rHqvf9neeS4JRbXM2aNxNaTK9yN4T7 Next: FoSco38YsY8cB83qsD7Vk1Qmdq6ZPZDcUK51nJXkDh3w Diff:
OldNewDifferences
305305 let check = isDataStorageUntouched(this)
306306 let userScriptHash = scriptHash(this)
307307 let userAddress = addressFromStringValue(userAddressStr)
308+ let oracleCpmmHash = value(getBinary(oracle, keyOracleScriptHash))
308309 if ((i.caller == this))
309310 then throw("You can't call yourself")
310311 else if (if ((pmtAssetIdSWOP != SWOP))
315316 then !(isAllowedAsset(pmtAssetId2))
316317 else false)
317318 then throw("One of assets must be USDN, WAVES or SWOP")
318- else if (if ((userScriptHash != value(getBinary(oracle, keyOracleScriptHash))))
319+ else if (if ((userScriptHash != oracleCpmmHash))
319320 then true
320321 else !(check))
321322 then throw("Unexpected script was found.")
342343 }
343344 let asset1Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId1)), 999999)
344345 let asset2Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId2)), 999999)
345- let $t0996310190 = if ((asset2Priority > asset1Priority))
346+ let $t01000310230 = if ((asset2Priority > asset1Priority))
346347 then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
347348 else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
348- let pmtAmountA = $t0996310190._1
349- let pmtAssetIdA = $t0996310190._2
350- let pmtAmountB = $t0996310190._3
351- let pmtAssetIdB = $t0996310190._4
352- let $t01019910276 = getAssetInfo(pmtAssetIdA)
353- let pmtStrAssetIdA = $t01019910276._1
354- let pmtAssetNameA = $t01019910276._2
355- let pmtDecimalsA = $t01019910276._3
356- let $t01028510362 = getAssetInfo(pmtAssetIdB)
357- let pmtStrAssetIdB = $t01028510362._1
358- let pmtAssetNameB = $t01028510362._2
359- let pmtDecimalsB = $t01028510362._3
349+ let pmtAmountA = $t01000310230._1
350+ let pmtAssetIdA = $t01000310230._2
351+ let pmtAmountB = $t01000310230._3
352+ let pmtAssetIdB = $t01000310230._4
353+ let $t01023910316 = getAssetInfo(pmtAssetIdA)
354+ let pmtStrAssetIdA = $t01023910316._1
355+ let pmtAssetNameA = $t01023910316._2
356+ let pmtDecimalsA = $t01023910316._3
357+ let $t01032510402 = getAssetInfo(pmtAssetIdB)
358+ let pmtStrAssetIdB = $t01032510402._1
359+ let pmtAssetNameB = $t01032510402._2
360+ let pmtDecimalsB = $t01032510402._3
360361 let addParams = [toString(this), ((pmtAssetNameA + "_") + pmtAssetNameB), pmtStrAssetIdA, pmtStrAssetIdB]
361362 let addPool = invoke(oracle, "addPool", addParams, nil)
362363 if ((addPool == addPool))
400401 then (balanceB == 0)
401402 else false)
402403 then {
403- let $t01328213359 = getAssetInfo(pmtAssetIdA)
404- let pmtStrAssetIdA = $t01328213359._1
405- let pmtAssetNameA = $t01328213359._2
406- let pmtDecimalsA = $t01328213359._3
407- let $t01336813445 = getAssetInfo(pmtAssetIdB)
408- let pmtStrAssetIdB = $t01336813445._1
409- let pmtAssetNameB = $t01336813445._2
410- let pmtDecimalsB = $t01336813445._3
404+ let $t01332213399 = getAssetInfo(pmtAssetIdA)
405+ let pmtStrAssetIdA = $t01332213399._1
406+ let pmtAssetNameA = $t01332213399._2
407+ let pmtDecimalsA = $t01332213399._3
408+ let $t01340813485 = getAssetInfo(pmtAssetIdB)
409+ let pmtStrAssetIdB = $t01340813485._1
410+ let pmtAssetNameB = $t01340813485._2
411+ let pmtDecimalsB = $t01340813485._3
411412 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
412413 if ((pmtAssetIdA == pmtAssetIdB))
413414 then throw("Assets must be different")
470471
471472 @Callable(i)
472473 func withdraw () = {
473- let $t01784417994 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474- let pmtAmount = $t01784417994._1
475- let pmtAssetId = $t01784417994._2
474+ let $t01788418034 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
475+ let pmtAmount = $t01788418034._1
476+ let pmtAssetId = $t01788418034._2
476477 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA, assetIdB)
477478 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB, assetIdA)
478479 if (!(isActive))
494495
495496 @Callable(i)
496497 func exchange (minAmountToReceive) = {
497- let $t01922019295 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
498- let pmtAmount = $t01922019295._1
499- let pmtAssetId = $t01922019295._2
498+ let $t01926019335 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
499+ let pmtAmount = $t01926019335._1
500+ let pmtAssetId = $t01926019335._2
500501 func calculateFees (tokenFrom,tokenTo) = {
501502 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
502503 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
521522 else if ((pmtAssetId == assetIdA))
522523 then {
523524 let assetIdSend = assetIdB
524- let $t02056920660 = calculateFees(balanceA, balanceB)
525- let amountWithoutFee = $t02056920660._1
526- let amountWithFee = $t02056920660._2
527- let governanceReward = $t02056920660._3
525+ let $t02060920700 = calculateFees(balanceA, balanceB)
526+ let amountWithoutFee = $t02060920700._1
527+ let amountWithFee = $t02060920700._2
528+ let governanceReward = $t02060920700._3
528529 let newBalanceA = (balanceA + pmtAmount)
529530 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
530531 if (if ((stakedAmountA >= newBalanceA))
536537 else if ((pmtAssetId == assetIdB))
537538 then {
538539 let assetIdSend = assetIdA
539- let $t02147921570 = calculateFees(balanceB, balanceA)
540- let amountWithoutFee = $t02147921570._1
541- let amountWithFee = $t02147921570._2
542- let governanceReward = $t02147921570._3
540+ let $t02151921610 = calculateFees(balanceB, balanceA)
541+ let amountWithoutFee = $t02151921610._1
542+ let amountWithFee = $t02151921610._2
543+ let governanceReward = $t02151921610._3
543544 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
544545 let newBalanceB = (balanceB + pmtAmount)
545546 if (if ((stakedAmountA >= newBalanceA))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
66 let keyVersion = "version"
77
88 let keyActive = "active"
99
1010 let keyAssetIdA = "A_asset_id"
1111
1212 let keyAssetIdB = "B_asset_id"
1313
1414 let keyBalanceA = "A_asset_balance"
1515
1616 let keyBalanceB = "B_asset_balance"
1717
1818 let keyBalanceInitA = "A_asset_init"
1919
2020 let keyBalanceInitB = "B_asset_init"
2121
2222 let keyShareAssetId = "share_asset_id"
2323
2424 let keyShareAssetSupply = "share_asset_supply"
2525
2626 let keyCommission = "commission"
2727
2828 let keyCommissionScaleDelimiter = "commission_scale_delimiter"
2929
3030 let keyCause = "shutdown_cause"
3131
3232 let keyFirstHarvest = "first_harvest"
3333
3434 let keyFirstHarvestHeight = "first_harvest_height"
3535
3636 let keyShareLimit = "share_limit_on_first_harvest"
3737
3838 let keyBasePeriod = "base_period"
3939
4040 let keyPeriodLength = "period_length"
4141
4242 let keyStartHeight = "start_height"
4343
4444 let keyOracleAssetPriority = "asset_priority_"
4545
4646 let keyOracleScriptHash = "script_hash_cpmm"
4747
4848 let keyInitPoolHeight = "init_pool_height"
4949
5050 let keyAdminPubKey1 = "admin_pub_1"
5151
5252 let keyAdminPubKey2 = "admin_pub_2"
5353
5454 let keyAdminPubKey3 = "admin_pub_3"
5555
5656 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
5757
5858 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
5959 case string: String =>
6060 fromBase58String(string)
6161 case nothing =>
6262 throw("Admin public key is empty")
6363 }
6464
6565
6666 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
6767
6868 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
6969
7070 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
7171
7272 let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7373
7474 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7575
7676 let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7777
7878 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
7979
8080 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
8181
8282 let NSBT = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
8383
8484 let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
8585
8686 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
8787
8888 let stakingUSDNNSBTAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
8989
9090 let stakingEURNAddress = Address(base58'3MyVqAbmKWh339gF6hy8faWw1jGeTV2wnGE')
9191
9292 let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
9393
9494 let USDNToNSBTExchanger = Address(base58'3Mye9wVR7d2mc6Y5ZJTu11svzgUQ7o8H9dA')
9595
9696 let stakingFeeInUSDN = 270000
9797
9898 let stakingFeeInEURN = 234000
9999
100100 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, keyBasePeriod), "Empty keyBasePeriod")
101101
102102 let startHeight = valueOrErrorMessage(getInteger(votingAddress, keyStartHeight), "Empty keyStartHeight")
103103
104104 let periodLength = valueOrErrorMessage(getInteger(votingAddress, keyPeriodLength), "Empty keyPeriodLength")
105105
106106 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 1)
107107
108108 let isActive = getBooleanValue(this, keyActive)
109109
110110 let strAssetIdA = getStringValue(this, keyAssetIdA)
111111
112112 let strAssetIdB = getStringValue(this, keyAssetIdB)
113113
114114 let assetIdA = if ((strAssetIdA == "WAVES"))
115115 then unit
116116 else fromBase58String(strAssetIdA)
117117
118118 let assetIdB = if ((strAssetIdB == "WAVES"))
119119 then unit
120120 else fromBase58String(strAssetIdB)
121121
122122 let assetNameA = match assetIdA {
123123 case id: ByteVector =>
124124 value(assetInfo(id)).name
125125 case waves: Unit =>
126126 "WAVES"
127127 case _ =>
128128 throw("Match error")
129129 }
130130
131131 let assetNameB = match assetIdB {
132132 case id: ByteVector =>
133133 value(assetInfo(id)).name
134134 case waves: Unit =>
135135 "WAVES"
136136 case _ =>
137137 throw("Match error")
138138 }
139139
140140 let balanceA = getIntegerValue(this, keyBalanceA)
141141
142142 let balanceB = getIntegerValue(this, keyBalanceB)
143143
144144 let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
145145
146146 let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
147147
148148 let commission = 3000
149149
150150 let commissionGovernance = 1200
151151
152152 let commissionScaleDelimiter = 1000000
153153
154154 let scaleValue3 = 1000
155155
156156 let scaleValue8 = 100000000
157157
158158 let slippageToleranceDelimiter = 1000
159159
160160 let scaleValue8Digits = 8
161161
162162 let comissionForInitalization = 1000000000
163163
164164 func accountBalance (assetId) = match assetId {
165165 case id: ByteVector =>
166166 assetBalance(this, id)
167167 case waves: Unit =>
168168 wavesBalance(this).available
169169 case _ =>
170170 throw("Match error")
171171 }
172172
173173
174174 func stakedAmount (assetId) = {
175175 let stakedAmountCalculated = match assetId {
176176 case aId: ByteVector =>
177177 if (if ((aId == USDN))
178178 then true
179179 else (aId == NSBT))
180180 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
181181 else if ((aId == EURN))
182182 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
183183 else 0
184184 case _: Unit =>
185185 0
186186 case _ =>
187187 throw("Match error")
188188 }
189189 match stakedAmountCalculated {
190190 case i: Int =>
191191 i
192192 case _ =>
193193 0
194194 }
195195 }
196196
197197
198198 func isAllowedAsset (assetId) = match assetId {
199199 case id: ByteVector =>
200200 if (if ((id == USDN))
201201 then true
202202 else (id == SWOP))
203203 then true
204204 else false
205205 case waves: Unit =>
206206 true
207207 case _ =>
208208 throw("Match error")
209209 }
210210
211211
212212 let stakedAmountA = stakedAmount(assetIdA)
213213
214214 let stakedAmountB = stakedAmount(assetIdB)
215215
216216 let assetInitA = getIntegerValue(this, keyBalanceInitA)
217217
218218 let assetInitB = getIntegerValue(this, keyBalanceInitB)
219219
220220 let availableBalanceA = (balanceA - stakedAmountA)
221221
222222 let availableBalanceB = (balanceB - stakedAmountB)
223223
224224 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
225225
226226 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
227227
228228 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
229229 then (accountBalanceWithStakedB >= balanceB)
230230 else false
231231
232232 func getAssetInfo (assetId) = match assetId {
233233 case id: ByteVector =>
234234 let stringId = toBase58String(id)
235235 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
236236 $Tuple3(stringId, info.name, info.decimals)
237237 case waves: Unit =>
238238 $Tuple3("WAVES", "WAVES", 8)
239239 case _ =>
240240 throw("Match error")
241241 }
242242
243243
244244 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
245245 then $Tuple3("WAVES", "WAVES", 8)
246246 else {
247247 let stringId = assetStr
248248 let id = fromBase58String(assetStr)
249249 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
250250 $Tuple3(stringId, info.name, info.decimals)
251251 }
252252
253253
254254 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
255255
256256
257257 func deductStakingFee (amount,assetId,secondAssetId) = if (if ((assetId == USDN))
258258 then true
259259 else (assetId == EURN))
260260 then {
261261 let stakinFee = if ((assetId == USDN))
262262 then (stakingFeeInUSDN * (if ((secondAssetId == NSBT))
263263 then 2
264264 else 1))
265265 else if ((assetId == EURN))
266266 then stakingFeeInEURN
267267 else 0
268268 let result = (amount - stakinFee)
269269 if ((0 >= result))
270270 then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakinFee)) + "USDN/EURN"))
271271 else result
272272 }
273273 else amount
274274
275275
276276 func getStakingFee (assetId,secondAssetId) = if ((assetId == USDN))
277277 then (stakingFeeInUSDN * (if ((secondAssetId == NSBT))
278278 then 2
279279 else 1))
280280 else if ((assetId == EURN))
281281 then stakingFeeInEURN
282282 else 0
283283
284284
285285 func throwInsufficientAvailableBalance (amount,available,assetName) = throw((((((((("Insufficient DApp balance to pay " + toString(amount)) + " ") + assetName) + " due to staking. Available: ") + toString(available)) + " ") + assetName) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
286286
287287
288288 func throwInsufficientAvailableBalances (amountA,amountB) = throw((((((((((((((((("Insufficient DApp balance to pay " + toString(amountA)) + " ") + assetNameA) + " and ") + toString(amountB)) + " ") + assetNameB) + " due to staking. Available: ") + toString(availableBalanceA)) + " ") + assetNameA) + " and ") + toString(availableBalanceB)) + " ") + assetNameB) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
289289
290290
291291 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
292292
293293
294294 @Callable(i)
295295 func init (userAddressStr) = {
296296 let $t083608437 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
297297 let pmtAmount1 = $t083608437._1
298298 let pmtAssetId1 = $t083608437._2
299299 let $t084428519 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
300300 let pmtAmount2 = $t084428519._1
301301 let pmtAssetId2 = $t084428519._2
302302 let $t085248607 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
303303 let pmtAmountSWOP = $t085248607._1
304304 let pmtAssetIdSWOP = $t085248607._2
305305 let check = isDataStorageUntouched(this)
306306 let userScriptHash = scriptHash(this)
307307 let userAddress = addressFromStringValue(userAddressStr)
308+ let oracleCpmmHash = value(getBinary(oracle, keyOracleScriptHash))
308309 if ((i.caller == this))
309310 then throw("You can't call yourself")
310311 else if (if ((pmtAssetIdSWOP != SWOP))
311312 then true
312313 else (pmtAmountSWOP != comissionForInitalization))
313314 then throw("You need to attach 10 SWOP tokens")
314315 else if (if (!(isAllowedAsset(pmtAssetId1)))
315316 then !(isAllowedAsset(pmtAssetId2))
316317 else false)
317318 then throw("One of assets must be USDN, WAVES or SWOP")
318- else if (if ((userScriptHash != value(getBinary(oracle, keyOracleScriptHash))))
319+ else if (if ((userScriptHash != oracleCpmmHash))
319320 then true
320321 else !(check))
321322 then throw("Unexpected script was found.")
322323 else if (isDefined(getBoolean(this, keyActive)))
323324 then throw("DApp is already active")
324325 else if ((pmtAssetId1 == pmtAssetId2))
325326 then throw("Assets must be different")
326327 else {
327328 let pmtStrAssetId1 = match pmtAssetId1 {
328329 case id: ByteVector =>
329330 toBase58String(id)
330331 case waves: Unit =>
331332 "WAVES"
332333 case _ =>
333334 throw("Match error")
334335 }
335336 let pmtStrAssetId2 = match pmtAssetId2 {
336337 case id: ByteVector =>
337338 toBase58String(id)
338339 case waves: Unit =>
339340 "WAVES"
340341 case _ =>
341342 throw("Match error")
342343 }
343344 let asset1Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId1)), 999999)
344345 let asset2Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId2)), 999999)
345- let $t0996310190 = if ((asset2Priority > asset1Priority))
346+ let $t01000310230 = if ((asset2Priority > asset1Priority))
346347 then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
347348 else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
348- let pmtAmountA = $t0996310190._1
349- let pmtAssetIdA = $t0996310190._2
350- let pmtAmountB = $t0996310190._3
351- let pmtAssetIdB = $t0996310190._4
352- let $t01019910276 = getAssetInfo(pmtAssetIdA)
353- let pmtStrAssetIdA = $t01019910276._1
354- let pmtAssetNameA = $t01019910276._2
355- let pmtDecimalsA = $t01019910276._3
356- let $t01028510362 = getAssetInfo(pmtAssetIdB)
357- let pmtStrAssetIdB = $t01028510362._1
358- let pmtAssetNameB = $t01028510362._2
359- let pmtDecimalsB = $t01028510362._3
349+ let pmtAmountA = $t01000310230._1
350+ let pmtAssetIdA = $t01000310230._2
351+ let pmtAmountB = $t01000310230._3
352+ let pmtAssetIdB = $t01000310230._4
353+ let $t01023910316 = getAssetInfo(pmtAssetIdA)
354+ let pmtStrAssetIdA = $t01023910316._1
355+ let pmtAssetNameA = $t01023910316._2
356+ let pmtDecimalsA = $t01023910316._3
357+ let $t01032510402 = getAssetInfo(pmtAssetIdB)
358+ let pmtStrAssetIdB = $t01032510402._1
359+ let pmtAssetNameB = $t01032510402._2
360+ let pmtDecimalsB = $t01032510402._3
360361 let addParams = [toString(this), ((pmtAssetNameA + "_") + pmtAssetNameB), pmtStrAssetIdA, pmtStrAssetIdB]
361362 let addPool = invoke(oracle, "addPool", addParams, nil)
362363 if ((addPool == addPool))
363364 then if (!(isDefined(getString(oracle, ("pool_" + toString(this))))))
364365 then throw("Pool is not added")
365366 else {
366367 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
367368 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
368369 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
369370 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
370371 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
371372 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
372373 let shareInitialSupply = fraction(arg1, arg2, arg3)
373374 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
374375 let shareIssueId = calculateAssetId(shareIssue)
375376 let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), IntegerEntry(keyInitPoolHeight, height), ScriptTransfer(userAddress, shareInitialSupply, shareIssueId), ScriptTransfer(walletAddress, comissionForInitalization, SWOP)]
376377 baseEntry
377378 }
378379 else throw("Strict value is not equal to itself.")
379380 }
380381 }
381382
382383
383384
384385 @Callable(i)
385386 func keepLimitForFirstHarvest (shareLimit) = if (!(isActive))
386387 then throw("DApp is inactive at this moment")
387388 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
388389 then throw("Only admin can call this function")
389390 else [IntegerEntry(keyShareLimit, shareLimit)]
390391
391392
392393
393394 @Callable(i)
394395 func replenishWithTwoTokens (slippageTolerance) = {
395396 let pmtAssetIdA = i.payments[0].assetId
396397 let pmtAssetIdB = i.payments[1].assetId
397398 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA, pmtAssetIdB)
398399 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB, pmtAssetIdA)
399400 if (if ((balanceA == 0))
400401 then (balanceB == 0)
401402 else false)
402403 then {
403- let $t01328213359 = getAssetInfo(pmtAssetIdA)
404- let pmtStrAssetIdA = $t01328213359._1
405- let pmtAssetNameA = $t01328213359._2
406- let pmtDecimalsA = $t01328213359._3
407- let $t01336813445 = getAssetInfo(pmtAssetIdB)
408- let pmtStrAssetIdB = $t01336813445._1
409- let pmtAssetNameB = $t01336813445._2
410- let pmtDecimalsB = $t01336813445._3
404+ let $t01332213399 = getAssetInfo(pmtAssetIdA)
405+ let pmtStrAssetIdA = $t01332213399._1
406+ let pmtAssetNameA = $t01332213399._2
407+ let pmtDecimalsA = $t01332213399._3
408+ let $t01340813485 = getAssetInfo(pmtAssetIdB)
409+ let pmtStrAssetIdB = $t01340813485._1
410+ let pmtAssetNameB = $t01340813485._2
411+ let pmtDecimalsB = $t01340813485._3
411412 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
412413 if ((pmtAssetIdA == pmtAssetIdB))
413414 then throw("Assets must be different")
414415 else {
415416 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
416417 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
417418 if (!(isActive))
418419 then throw("DApp is inactive at this moment")
419420 else if (if ((0 > slippageTolerance))
420421 then true
421422 else (slippageTolerance > slippageToleranceDelimiter))
422423 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
423424 else if ((size(i.payments) != 2))
424425 then throw("Two attached assets expected")
425426 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
426427 then true
427428 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
428429 then throw("Incorrect assets amount: amounts must have the contract ratio")
429430 else if (if ((pmtAssetIdA != assetIdA))
430431 then true
431432 else (pmtAssetIdB != assetIdB))
432433 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
433434 else if ((shareInitialSupply == 0))
434435 then throw("Too small amount to replenish")
435436 else if (!(hasEnoughBalance))
436437 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
437438 else [Reissue(shareAssetId, shareInitialSupply, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareAssetId)]
438439 }
439440 }
440441 else {
441442 let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
442443 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
443444 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
444445 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
445446 if (!(isActive))
446447 then throw("DApp is inactive at this moment")
447448 else if (if ((0 > slippageTolerance))
448449 then true
449450 else (slippageTolerance > slippageToleranceDelimiter))
450451 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
451452 else if ((size(i.payments) != 2))
452453 then throw("Two attached assets expected")
453454 else if (if ((pmtAssetIdA != assetIdA))
454455 then true
455456 else (pmtAssetIdB != assetIdB))
456457 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
457458 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
458459 then true
459460 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
460461 then throw("Incorrect assets amount: amounts must have the contract ratio")
461462 else if ((shareTokenToPayAmount == 0))
462463 then throw("Too small amount to replenish")
463464 else if (!(hasEnoughBalance))
464465 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
465466 else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
466467 }
467468 }
468469
469470
470471
471472 @Callable(i)
472473 func withdraw () = {
473- let $t01784417994 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474- let pmtAmount = $t01784417994._1
475- let pmtAssetId = $t01784417994._2
474+ let $t01788418034 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
475+ let pmtAmount = $t01788418034._1
476+ let pmtAssetId = $t01788418034._2
476477 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA, assetIdB)
477478 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB, assetIdA)
478479 if (!(isActive))
479480 then throw("DApp is inactive at this moment")
480481 else if ((size(i.payments) != 1))
481482 then throw("One attached payment expected")
482483 else if ((pmtAssetId != shareAssetId))
483484 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
484485 else if (!(hasEnoughBalance))
485486 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
486487 else if (if ((amountToPayA > availableBalanceA))
487488 then true
488489 else (amountToPayB > availableBalanceB))
489490 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
490491 else [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
491492 }
492493
493494
494495
495496 @Callable(i)
496497 func exchange (minAmountToReceive) = {
497- let $t01922019295 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
498- let pmtAmount = $t01922019295._1
499- let pmtAssetId = $t01922019295._2
498+ let $t01926019335 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
499+ let pmtAmount = $t01926019335._1
500+ let pmtAssetId = $t01926019335._2
500501 func calculateFees (tokenFrom,tokenTo) = {
501502 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
502503 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
503504 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
504505 if ((minAmountToReceive > amountWithFee))
505506 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
506507 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
507508 }
508509
509510 if (!(isActive))
510511 then throw("DApp is inactive at this moment")
511512 else if (if ((balanceA == 0))
512513 then true
513514 else (balanceB == 0))
514515 then throw("Can't exchange with zero balance")
515516 else if ((0 >= minAmountToReceive))
516517 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
517518 else if ((size(i.payments) != 1))
518519 then throw("One attached payment expected")
519520 else if (!(hasEnoughBalance))
520521 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
521522 else if ((pmtAssetId == assetIdA))
522523 then {
523524 let assetIdSend = assetIdB
524- let $t02056920660 = calculateFees(balanceA, balanceB)
525- let amountWithoutFee = $t02056920660._1
526- let amountWithFee = $t02056920660._2
527- let governanceReward = $t02056920660._3
525+ let $t02060920700 = calculateFees(balanceA, balanceB)
526+ let amountWithoutFee = $t02060920700._1
527+ let amountWithFee = $t02060920700._2
528+ let governanceReward = $t02060920700._3
528529 let newBalanceA = (balanceA + pmtAmount)
529530 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
530531 if (if ((stakedAmountA >= newBalanceA))
531532 then true
532533 else (stakedAmountB >= newBalanceB))
533534 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
534535 else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
535536 }
536537 else if ((pmtAssetId == assetIdB))
537538 then {
538539 let assetIdSend = assetIdA
539- let $t02147921570 = calculateFees(balanceB, balanceA)
540- let amountWithoutFee = $t02147921570._1
541- let amountWithFee = $t02147921570._2
542- let governanceReward = $t02147921570._3
540+ let $t02151921610 = calculateFees(balanceB, balanceA)
541+ let amountWithoutFee = $t02151921610._1
542+ let amountWithFee = $t02151921610._2
543+ let governanceReward = $t02151921610._3
543544 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
544545 let newBalanceB = (balanceB + pmtAmount)
545546 if (if ((stakedAmountA >= newBalanceA))
546547 then true
547548 else (stakedAmountB >= newBalanceB))
548549 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
549550 else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
550551 }
551552 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
552553 }
553554
554555
555556
556557 @Callable(i)
557558 func shutdown () = if (!(isActive))
558559 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
559560 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
560561 then throw("Only admin can call this function")
561562 else suspend("Paused by admin")
562563
563564
564565
565566 @Callable(i)
566567 func activate () = if (isActive)
567568 then throw("DApp is already active")
568569 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
569570 then throw("Only admin can call this function")
570571 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
571572
572573
573574
574575 @Callable(i)
575576 func takeIntoAccountExtraFunds (amountLeave) = {
576577 let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
577578 let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
578579 let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == unit))
579580 then amountLeave
580581 else 0))
581582 let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == unit))
582583 then amountLeave
583584 else 0))
584585 if (!(isActive))
585586 then throw("DApp is inactive at this moment")
586587 else if ((i.caller != this))
587588 then throw("Only the DApp itself can call this function")
588589 else if ((0 > amountLeave))
589590 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
590591 else if (if ((0 > uncountableAmountEnrollAssetA))
591592 then true
592593 else (0 > uncountableAmountEnrollAssetB))
593594 then suspend("Enroll amount negative")
594595 else if (if ((0 > amountEnrollA))
595596 then true
596597 else (0 > amountEnrollB))
597598 then throw("Too large amountLeave")
598599 else [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
599600 }
600601
601602
602603
603604 @Callable(i)
604605 func enableFirstHarvest () = [BooleanEntry(keyFirstHarvest, true), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]
605606
606607
607608 @Verifier(tx)
608609 func verify () = {
609610 let multiSignedByAdmins = {
610611 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
611612 then 1
612613 else 0
613614 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
614615 then 1
615616 else 0
616617 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
617618 then 1
618619 else 0
619620 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
620621 }
621622 match tx {
622623 case inv: InvokeScriptTransaction =>
623624 let callTakeIntoAccount = if ((inv.dApp == this))
624625 then (inv.function == "takeIntoAccountExtraFunds")
625626 else false
626627 let callEnableFirstHarvest = if ((inv.dApp == this))
627628 then (inv.function == "enableFirstHarvest")
628629 else false
629630 let callStaking = if (if ((inv.dApp == stakingUSDNNSBTAddress))
630631 then if (if (if ((inv.function == "lockNeutrino"))
631632 then (size(inv.payments) == 1)
632633 else false)
633634 then if ((inv.payments[0].assetId == USDN))
634635 then true
635636 else (inv.payments[0].assetId == NSBT)
636637 else false)
637638 then true
638639 else if ((inv.function == "unlockNeutrino"))
639640 then (size(inv.payments) == 0)
640641 else false
641642 else false)
642643 then true
643644 else if ((inv.dApp == stakingEURNAddress))
644645 then if (if (if ((inv.function == "startStaking"))
645646 then (size(inv.payments) == 1)
646647 else false)
647648 then (inv.payments[0].assetId == EURN)
648649 else false)
649650 then true
650651 else if ((inv.function == "stopStaking"))
651652 then (size(inv.payments) == 0)
652653 else false
653654 else false
654655 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
655656 then (inv.function == "exchange")
656657 else false)
657658 then (assetIdA == USDN)
658659 else false)
659660 then true
660661 else if (if ((assetIdB == USDN))
661662 then (size(inv.payments) == 1)
662663 else false)
663664 then (inv.payments[0].assetId == USDN)
664665 else false
665666 let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
666667 then (inv.function == "exchange")
667668 else false)
668669 then (assetIdA == NSBT)
669670 else false)
670671 then true
671672 else if (if ((assetIdB == NSBT))
672673 then (size(inv.payments) == 1)
673674 else false)
674675 then (inv.payments[0].assetId == USDN)
675676 else false
676677 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
677678 then true
678679 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
679680 then true
680681 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
681682 then true
682683 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
683684 if (if (if (if (if (if (callTakeIntoAccount)
684685 then true
685686 else callEnableFirstHarvest)
686687 then true
687688 else callStaking)
688689 then true
689690 else exchangeToWaves)
690691 then true
691692 else exchangeToNSBTs)
692693 then signedByAdmin
693694 else false)
694695 then true
695696 else multiSignedByAdmins
696697 case _ =>
697698 multiSignedByAdmins
698699 }
699700 }
700701

github/deemru/w8io/873ac7e 
95.92 ms