tx · 6xAmrfNDskKsWfLj4Yoj1WR1g7EHXYz2mofxX5gnBeui 3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk: -0.02700000 Waves 2023.10.11 01:07 [3858967] smart account 3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk > SELF 0.00000000 Waves
{ "type": 13, "id": "6xAmrfNDskKsWfLj4Yoj1WR1g7EHXYz2mofxX5gnBeui", "fee": 2700000, "feeAssetId": null, "timestamp": 1696975653211, "version": 1, "sender": "3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk", "senderPublicKey": "46pxd1r6gmScNqdp82uEJMs2AZ1F9q2z1VtXZPFAtHYy", "proofs": [ "2LrMxi1RPeahgj8MVZogZx9aawePTQEn1scui8xmyrMKAY4GC2Zx78SPAUrzb4WgYtuKFkQx7WvyHgBibpZ1g3q6" ], "script": "base64:BwICCAI1AAVXYXZlcwIFV0FWRVMABlNjYWxlNgDAhD0ABlNjYWxlOACAwtcvAAlTY2FsZThCaWcJALYCAQCAwtcvAAdTY2FsZTEwAIDIr6AlAAdTY2FsZTE2AICAhP6m3uERAApTY2FsZTE2QmlnCQC2AgEAgICE/qbe4REACWRheUJsb2NrcwCgCwAKeWVhckJsb2NrcwCgiiAADXllYXJCbG9ja3NCaWcJALYCAQCgiiAAC3Jlc2VydmVGdW5kABQABWFycjEyCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALBQNuaWwACXVzZHRJZFN0cgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kACXVzZGNJZFN0cgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cADW9yYWNsZUFkZHJlc3MJAQdBZGRyZXNzAQEaAVdJZtDL84r1V3qt/CFvccVbiYgr0IGzsX8AC2F4bHlBZGRyZXNzCQEHQWRkcmVzcwEBGgFXz8h13gt2/Imb93uvCUhEZwkqUEc/D0ItAAdheGx5TFBzCQDMCAICLDdLWmJKclZvcHdKaGtkd2JlMWVGREJiZXg0ZGtZNjNNeGpUTmpxWHRyemoxCQDMCAICLEJ0dzNHMWo0d1FnZHA0OVBUeGFGa052bjc1ZFF0cUdETTdlalFwcEhuV0MxCQDMCAICLEJpU3pGZThuU0w3OG9aYWViZm9pbjV2Qlo1UHplNmQ3a2FlaWpMcXI1eFplCQDMCAICLEYyQUtrQTUxM2s1eUhFSmtMc1U2dld4Q1lZazgxMUdwakxod0V2MldHd1o5CQDMCAICLDRDUTVDUEdMWExiV0JVczJKQmpLVWFScUY0OUNtS0hrd3p2UGdTdlFwQVFWCQDMCAICLDZpTUI2TEtTcmd2OXdhRXZFbk42WWR5eDdkZnhQbkdjVHc4MzE4V1ZtNWJSBQNuaWwBDGdldFJhdGVDdXJ2ZQEKYXNzZXRJZFN0cgQHJG1hdGNoMAUKYXNzZXRJZFN0cgMJAAACAiw5d2MzTFhOQTRURUJzWHlLdG9MRTltcmJERDdXTUhYdlhyQ2padmFiTEFzaQUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixIR2dhYlRxVVM4V3RWRlVKemZtclRETWdFY2NKdVpMQlBoRmdRRnh2bnNvVwUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiwzNE45WWNFRVRMV245M3FZUTY0RXNQMXg4OXRTcnVKVTQ0UnJFTVNYWEVQSgUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiw2WHRIanBYYnM5UlJKUDJTcjlHVXlWcXpBQ2NieTlUa1RoSFhualZDNUNESgUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixBanNvNm5UVGpwdHUyVUhMeDZoZlNYVnRIRnRSQkpDa0tZZDVTQXlqN3pmNQUHJG1hdGNoMAkAlgoEAICJegCAtIkTAIDokiYAgKPDRwMJAAACAixIRUI4UWF3OXhyV3BXczh0SHNpQVRZR0JXREJ0UDJTN2tjUEFMck11NDNBUwUHJG1hdGNoMAkAlgoEAAAAgMLXLwCA6JImAICI3r4BAwkAAAICBVdBVkVTBQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCAlfUqAwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gwCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAUHJG1hdGNoMAkAlgoEAAAAgNrECQCA6JImAIDC1y8DCQAAAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEFByRtYXRjaDAJAJYKBAAAAICHpw4AgOiSJgCAtIkTAwkAAAICLEF0OEQ2TkZGcGhlQ2J2S1ZualZvZUxMODRFbzhOWm42b3ZNYW54ZkxhRldMBQckbWF0Y2gwCQCWCgQAAADA8PULAIDokiYAgLSJEwMJAAACAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw0NzRqVGVZeDJyMlZhMzU3OTR0Q1NjQVhXSkc5aFUySGNneHpNb3dhWlVudQUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw1VVlCUHBxNFdvVTVuNE13cEZrZ0puVzNGcTRCMXUzdWtwSzMzaWs0UWVyUgUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiwydGhzQUN1SG16RE11TmV6UE0zMndnOWEzQndVekJXRGVTS2FrZ3ozY3cyMQUHJG1hdGNoMAkAlgoEAICJegCAtIkTAIDokiYAgMLXLwMJAAACAitZaU5ib2ZGekMxN2pFSEhDTXdyUmNweTlNcnJqYWJNTUxaeGc4ZzV4bWY3BQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCA6JImAwkAAAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBQckbWF0Y2gwCQCWCgQAAACA4esXAIDokiYAgISvXwMJAAACAiwzVnVWNVdUbUR6NDdEbWRuM1FwY1lqemJTZGlwalFFNEpNZE5lMXhacFgxMwUHJG1hdGNoMAkAlgoEAAAAgMLXLwCA6JImAICI3r4BCQCWCgQAAACA2sQJAIDokiYAgOiSJgEDc3VtAgRzaXplBGRhdGEKAQRmb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFBHNpemUFBWFjY3VtCQBkAgUFYWNjdW0JAJEDAgUEZGF0YQUEbmV4dAoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwBDmdldFNldHVwVG9rZW5zAQ1tYXJrZXRBZGRyZXNzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCDHNldHVwX3Rva2VucwIBLAENZ2V0VG9rZW5QcmljZQEKYXNzZXRJZFN0cgMDCQAAAgUKYXNzZXRJZFN0cgUJdXNkdElkU3RyBgkAAAIFCmFzc2V0SWRTdHIFCXVzZGNJZFN0cgDAhD0DCQEPY29udGFpbnNFbGVtZW50AgUHYXhseUxQcwUKYXNzZXRJZFN0cgoAAUAJAPwHBAULYXhseUFkZHJlc3MCGmdldFNoYXJlQXNzZXRQcmljZVJFQURPTkxZCQDMCAIFCmFzc2V0SWRTdHIFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQFcHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDW9yYWNsZUFkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgUFcHJpY2UBDWdldEFzc2V0U2NhbGUBCmFzc2V0SWRTdHIECGRlY2ltYWxzAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTAAgICQEFdmFsdWUBCQDsBwEJANkEAQUKYXNzZXRJZFN0cghkZWNpbWFscwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04BEWdldExhc3RSYXRlSGVpZ2h0AQ1tYXJrZXRBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MCDmxhc3RSYXRlSGVpZ2h0AAABFmdldE91dGRhdGVkVG90YWxTdXBwbHkCDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgAAARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93Ag1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIAAAEQZ2V0T3V0ZGF0ZWRTUmF0ZQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIGX3NSYXRlAAABEGdldE91dGRhdGVkQlJhdGUCDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgIFCmFzc2V0SWRTdHICBl9iUmF0ZQAAAQ1nZXRPdXRkYXRlZFVyBBNvdXRkYXRlZFRvdGFsU3VwcGx5E291dGRhdGVkVG90YWxCb3Jyb3cNb3V0ZGF0ZWRTUmF0ZQ1vdXRkYXRlZEJSYXRlBARkb3duCQBrAwUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUNb3V0ZGF0ZWRTUmF0ZQUHU2NhbGUxNgMJAAACBQRkb3duAAAAAAkAawMFBlNjYWxlOAkAawMFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkQlJhdGUFB1NjYWxlMTYFBGRvd24BB2dldFJhdGUCCm91dGRhdGVkVXIKYXNzZXRJZFN0cgQFY3VydmUJAQxnZXRSYXRlQ3VydmUBBQphc3NldElkU3RyCQBkAggFBWN1cnZlAl8xAwkAZwIIBQVjdXJ2ZQJfMwUKb3V0ZGF0ZWRVcgkAawMFCm91dGRhdGVkVXIIBQVjdXJ2ZQJfMggFBWN1cnZlAl8zCQBkAggFBWN1cnZlAl8yCQBrAwkAZQIFCm91dGRhdGVkVXIIBQVjdXJ2ZQJfMwgFBWN1cnZlAl80CQBlAgCAwtcvCAUFY3VydmUCXzMBC2dldEludGVyZXN0AQRyYXRlCQCWAwEJAMwIAgkAawMFBHJhdGUFBlNjYWxlOAUKeWVhckJsb2NrcwkAzAgCAAEFA25pbAENZ2V0QXNzZXRJbmRleAILc2V0dXBUb2tlbnMKYXNzZXRJZFN0cgkBBXZhbHVlAQkAzwgCBQtzZXR1cFRva2VucwUKYXNzZXRJZFN0cgERZ2V0QXNzZXRQYXJhbXRlcnMCEG1hcmtldFBhcmFtZXRlcnMKYXNzZXRJbmRleAkAlQoDCQCRAwIIBRBtYXJrZXRQYXJhbWV0ZXJzAl8xBQphc3NldEluZGV4CQCRAwIIBRBtYXJrZXRQYXJhbWV0ZXJzAl8yBQphc3NldEluZGV4CQCRAwIIBRBtYXJrZXRQYXJhbWV0ZXJzAl8zBQphc3NldEluZGV4ARNnZXRNYXJrZXRQYXJhbWV0ZXJzAg1tYXJrZXRBZGRyZXNzC3NldHVwVG9rZW5zBAdzZXR1cENmCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCCnNldHVwX2x0dnMCASwEB3NldHVwTHQJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIJc2V0dXBfbHRzAgEsBAxzZXR1cFBlbmFsdHkJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIPc2V0dXBfcGVuYWx0aWVzAgEsBAp0b2tlbnNTaXplCQCQAwEFC3NldHVwVG9rZW5zCgEEZm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQp0b2tlbnNTaXplBQVhY2N1bQkAlQoDCQDNCAIIBQVhY2N1bQJfMQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwQ2YFBG5leHQJAM0IAggFBWFjY3VtAl8yCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBMdAUEbmV4dAkAzQgCCAUFYWNjdW0CXzMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxzZXR1cFBlbmFsdHkFBG5leHQKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAQxnZXRNYXhTdXBwbHkCDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgkBDXBhcnNlSW50VmFsdWUBCQELdmFsdWVPckVsc2UCCQCdCAIFDW1hcmtldEFkZHJlc3MJAKwCAgIQc2V0dXBfbWF4U3VwcGx5XwUKYXNzZXRJZFN0cgIBMAEOZ2V0QWN0dWFsU1JhdGUEDmxhc3RSYXRlSGVpZ2h0CGludGVyZXN0Cm91dGRhdGVkVXINb3V0ZGF0ZWRTUmF0ZQQJbGFzdFNSYXRlCQCWAwEJAMwIAgUNb3V0ZGF0ZWRTUmF0ZQkAzAgCBQdTY2FsZTE2BQNuaWwECG5ld1NSYXRlCQBkAgUJbGFzdFNSYXRlCQBpAgkAaAIJAGgCCQBlAgUGaGVpZ2h0BQ5sYXN0UmF0ZUhlaWdodAkAawMFCGludGVyZXN0BQpvdXRkYXRlZFVyBQZTY2FsZTgJAGUCAGQFC3Jlc2VydmVGdW5kAGQFCG5ld1NSYXRlAQ5nZXRBY3R1YWxCUmF0ZQMObGFzdFJhdGVIZWlnaHQIaW50ZXJlc3QNb3V0ZGF0ZWRCUmF0ZQQJbGFzdEJSYXRlCQCWAwEJAMwIAgUNb3V0ZGF0ZWRCUmF0ZQkAzAgCBQdTY2FsZTE2BQNuaWwECG5ld0JSYXRlCQBkAgUJbGFzdEJSYXRlCQBoAgkAZQIFBmhlaWdodAUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQhuZXdCUmF0ZQELZ2V0QWN0dWFsVXICDGFjdHVhbFN1cHBseQxhY3R1YWxCb3Jyb3cJAGsDBQxhY3R1YWxCb3Jyb3cFBlNjYWxlOAUMYWN0dWFsU3VwcGx5AQ9nZXRBY3R1YWxBbW91bnQCDm91dGRhdGVkQW1vdW50CmFjdHVhbFJhdGUJAGsDBQ5vdXRkYXRlZEFtb3VudAUKYWN0dWFsUmF0ZQUHU2NhbGUxNgEIZ2V0SW5Vc2QDDGFjdHVhbEFtb3VudAphc3NldFNjYWxlBXByaWNlCQBrAwUMYWN0dWFsQW1vdW50BQVwcmljZQUKYXNzZXRTY2FsZQEMZ2V0U3VwcGx5QXB5AgRyYXRlCGFjdHVhbFVyBApzdXBwbHlSYXRlCQBrAwkAawMFBHJhdGUAUABkBQhhY3R1YWxVcgUGU2NhbGU4CQBlAgkAoAMBCQB2BgkAtwICBQpTY2FsZTE2QmlnCQC8AgMJALYCAQUKc3VwcGx5UmF0ZQUJU2NhbGU4QmlnBQ15ZWFyQmxvY2tzQmlnABAFDXllYXJCbG9ja3NCaWcAAAAIBQRET1dOBQZTY2FsZTgBDGdldEJvcnJvd0FweQEEcmF0ZQkAZQIJAKADAQkAdgYJALcCAgUKU2NhbGUxNkJpZwkAvAIDCQC2AgEFBHJhdGUFCVNjYWxlOEJpZwUNeWVhckJsb2Nrc0JpZwAQBQ15ZWFyQmxvY2tzQmlnAAAACAUERE9XTgUGU2NhbGU4AQ9nZXRXYWxsZXRTdXBwbHkEDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgZ3YWxsZXQLYWN0dWFsU1JhdGUEFG91dGRhdGVkV2FsbGV0U3VwcGx5CQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgkArAICBQZ3YWxsZXQCCl9zdXBwbGllZF8FCmFzc2V0SWRTdHIAAAkBD2dldEFjdHVhbEFtb3VudAIFFG91dGRhdGVkV2FsbGV0U3VwcGx5BQthY3R1YWxTUmF0ZQEPZ2V0V2FsbGV0Qm9ycm93BA1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIGd2FsbGV0C2FjdHVhbEJSYXRlBBRvdXRkYXRlZFdhbGxldEJvcnJvdwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgIJAKwCAgUGd2FsbGV0AgpfYm9ycm93ZWRfBQphc3NldElkU3RyAAAJAQ9nZXRBY3R1YWxBbW91bnQCBRRvdXRkYXRlZFdhbGxldEJvcnJvdwULYWN0dWFsQlJhdGUBEGdldERhaWx5UGVyY2VudHMCA2FweQhxdWFudGl0eQkAawMJAGsDCQBlAgkAoAMBCQB2BgkAtwICBQlTY2FsZThCaWcJALYCAQUDYXB5AAgJALoCAgUKU2NhbGUxNkJpZwUNeWVhckJsb2Nrc0JpZwAQABAFBERPV04FB1NjYWxlMTYFCWRheUJsb2NrcwUGU2NhbGU4BQhxdWFudGl0eQUGU2NhbGU4ARBnZXRBY2NvdW50SGVhbHRoAht0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkAwkAAAIFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAAABQZTY2FsZTgJAGUCBQZTY2FsZTgJAGsDBRt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QFBlNjYWxlOAUbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkAQlnZXROZXRBcHkDFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QWdG90YWxXYWxsZXRCb3Jyb3dJblVzZBZ0b3RhbFdhbGxldE1hcmdpbkluVXNkAwkAAAIFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QAAAAAAwkAZgIFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QAAAkAawMFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QFBlNjYWxlOAUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAkAawMFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QFBlNjYWxlOAUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAELYXNzZXRUb0pzb24CCmFzc2V0SWRTdHIIcXVhbnRpdHkECyR0MDkyMjY5NDQxAwkAAAIFCmFzc2V0SWRTdHIFBVdhdmVzCQCUCgIACAIFV0FWRVMEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUKYXNzZXRJZFN0cgkAlAoCCAUFYXNzZXQIZGVjaW1hbHMIBQVhc3NldARuYW1lBAhkZWNpbWFscwgFCyR0MDkyMjY5NDQxAl8xBARuYW1lCAULJHQwOTIyNjk0NDECXzIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgx7InF1YW50aXR5IjoJAKQDAQUIcXVhbnRpdHkCDCwiZGVjaW1hbHMiOgkApAMBBQhkZWNpbWFscwIJLCJuYW1lIjoiBQRuYW1lAggiLCJpZCI6IgUKYXNzZXRJZFN0cgICIn0BD2Ftb3VudFRvRGVjaW1hbAIGYW1vdW50CmFzc2V0U2NhbGUEB2ludFBhcnQJAGkCBQZhbW91bnQFCmFzc2V0U2NhbGUECWZsb2F0UGFydAkAagIFBmFtb3VudAUKYXNzZXRTY2FsZQkArAICCQCsAgIJAKQDAQUHaW50UGFydAIBLgkApAMBBQlmbG9hdFBhcnQBDWdldE1hcmtldERhdGEBDW1hcmtldEFkZHJlc3MECW1hcmtldFN0cgkApQgBBQ1tYXJrZXRBZGRyZXNzBAptYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUJbWFya2V0U3RyBA9tYXJrZXRTaG9ydE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIRbWFya2V0X3Nob3J0bmFtZV8FCW1hcmtldFN0cgQLc2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFDW1hcmtldEFkZHJlc3MEB3NldHVwQ2YJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIKc2V0dXBfbHR2cwIBLAQHc2V0dXBMdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAglzZXR1cF9sdHMCASwEDHNldHVwUGVuYWx0eQkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAg9zZXR1cF9wZW5hbHRpZXMCASwEDmxhc3RSYXRlSGVpZ2h0CQERZ2V0TGFzdFJhdGVIZWlnaHQBBQ1tYXJrZXRBZGRyZXNzBAthc3NldHNDb3VudAkAkAMBBQtzZXR1cFRva2VucwoBBGZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAULYXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAJjZgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwQ2YFBG5leHQEAmx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBMdAUEbmV4dAQHcGVuYWx0eQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHNldHVwUGVuYWx0eQUEbmV4dAQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAQUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBAltYXhTdXBwbHkJAQxnZXRNYXhTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECm91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRTUmF0ZQUNb3V0ZGF0ZWRCUmF0ZQQEcmF0ZQkBB2dldFJhdGUCBQpvdXRkYXRlZFVyBQphc3NldElkU3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUKb3V0ZGF0ZWRVcgUNb3V0ZGF0ZWRTUmF0ZQQFYlJhdGUJAQ5nZXRBY3R1YWxCUmF0ZQMFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQGc3VwcGx5CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUFc1JhdGUEBmJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxCb3Jyb3cFBWJSYXRlBAtzdXBwbHlJblVzZAkBCGdldEluVXNkAwUGc3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQLYm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFBmJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UECHJlc2VydmVzCQBlAgUGc3VwcGx5BQZib3Jyb3cEDXJlc2VydmVzSW5Vc2QJAQhnZXRJblVzZAMFCHJlc2VydmVzBQphc3NldFNjYWxlBQVwcmljZQQCdXIJAQtnZXRBY3R1YWxVcgIFBnN1cHBseQUGYm9ycm93BAlzdXBwbHlBcHkJAQxnZXRTdXBwbHlBcHkCBQRyYXRlBQJ1cgQJYm9ycm93QXB5CQEMZ2V0Qm9ycm93QXB5AQUEcmF0ZQkApAoSCQDNCAIIBQVhY2N1bQJfMQUKYXNzZXRJZFN0cgkAzQgCCAUFYWNjdW0CXzIFAmNmCQDNCAIIBQVhY2N1bQJfMwUCbHQJAM0IAggFBWFjY3VtAl80BQdwZW5hbHR5CQDNCAIIBQVhY2N1bQJfNQUFcHJpY2UJAM0IAggFBWFjY3VtAl82BQphc3NldFNjYWxlCQDNCAIIBQVhY2N1bQJfNwUJbWF4U3VwcGx5CQDNCAIIBQVhY2N1bQJfOAUFc1JhdGUJAM0IAggFBWFjY3VtAl85BQViUmF0ZQkAzQgCCAUFYWNjdW0DXzEwBQZzdXBwbHkJAM0IAggFBWFjY3VtA18xMQULc3VwcGx5SW5Vc2QJAM0IAggFBWFjY3VtA18xMgUGYm9ycm93CQDNCAIIBQVhY2N1bQNfMTMFC2JvcnJvd0luVXNkCQDNCAIIBQVhY2N1bQNfMTQFCHJlc2VydmVzCQDNCAIIBQVhY2N1bQNfMTUFDXJlc2VydmVzSW5Vc2QJAM0IAggFBWFjY3VtA18xNgUCdXIJAM0IAggFBWFjY3VtA18xNwUJc3VwcGx5QXB5CQDNCAIIBQVhY2N1bQNfMTgFCWJvcnJvd0FweQQGYXNzZXRzCgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkApAoSBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQQdG90YWxTdXBwbHlJblVzZAkBA3N1bQIFC2Fzc2V0c0NvdW50CAUGYXNzZXRzA18xMQQQdG90YWxCb3Jyb3dJblVzZAkBA3N1bQIFC2Fzc2V0c0NvdW50CAUGYXNzZXRzA18xMwQSdG90YWxSZXNlcnZlc0luVXNkCQEDc3VtAgULYXNzZXRzQ291bnQIBQZhc3NldHMDXzE1CQCZCgcFBmFzc2V0cwULYXNzZXRzQ291bnQFCm1hcmtldE5hbWUFD21hcmtldFNob3J0TmFtZQUQdG90YWxTdXBwbHlJblVzZAUQdG90YWxCb3Jyb3dJblVzZAUSdG90YWxSZXNlcnZlc0luVXNkAQ1nZXRXYWxsZXREYXRhDA1tYXJrZXRBZGRyZXNzBndhbGxldAthc3NldHNDb3VudAphc3NldHNMaXN0BmNmTGlzdAZsdExpc3QJcHJpY2VMaXN0DmFzc2V0U2NhbGVMaXN0CXNSYXRlTGlzdAliUmF0ZUxpc3QNc3VwcGx5QXB5TGlzdA1ib3Jyb3dBcHlMaXN0CgEEZm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQthc3NldHNDb3VudAUFYWNjdW0ECmFzc2V0SWRTdHIJAJEDAgUKYXNzZXRzTGlzdAUEbmV4dAQCY2YJAJEDAgUGY2ZMaXN0BQRuZXh0BAJsdAkAkQMCBQZsdExpc3QFBG5leHQEBXByaWNlCQCRAwIFCXByaWNlTGlzdAUEbmV4dAQKYXNzZXRTY2FsZQkAkQMCBQ5hc3NldFNjYWxlTGlzdAUEbmV4dAQFc1JhdGUJAJEDAgUJc1JhdGVMaXN0BQRuZXh0BAViUmF0ZQkAkQMCBQliUmF0ZUxpc3QFBG5leHQECXN1cHBseUFweQkAkQMCBQ1zdXBwbHlBcHlMaXN0BQRuZXh0BAlib3Jyb3dBcHkJAJEDAgUNYm9ycm93QXB5TGlzdAUEbmV4dAQMd2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQVzUmF0ZQQRd2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldFN1cHBseQUKYXNzZXRTY2FsZQUFcHJpY2UEEXdhbGxldERhaWx5SW5jb21lCQEQZ2V0RGFpbHlQZXJjZW50cwIFCXN1cHBseUFweQUMd2FsbGV0U3VwcGx5BBZ3YWxsZXREYWlseUluY29tZUluVXNkCQEIZ2V0SW5Vc2QDBRF3YWxsZXREYWlseUluY29tZQUKYXNzZXRTY2FsZQUFcHJpY2UEDHdhbGxldEJvcnJvdwkBD2dldFdhbGxldEJvcnJvdwQFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFYlJhdGUEEXdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRCb3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBBd3YWxsZXREYWlseUxvYW5QZXJjZW50cwkBEGdldERhaWx5UGVyY2VudHMCBQlib3Jyb3dBcHkFDHdhbGxldEJvcnJvdwQcd2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAkBCGdldEluVXNkAwUXd2FsbGV0RGFpbHlMb2FuUGVyY2VudHMFCmFzc2V0U2NhbGUFBXByaWNlBBZ3YWxsZXRCb3Jyb3dMaW1pdEluVXNkCQBrAwURd2FsbGV0U3VwcGx5SW5Vc2QFAmNmBQZTY2FsZTgEFndhbGxldEJvcnJvd1VzYWdlSW5Vc2QJAGsDBRF3YWxsZXRCb3Jyb3dJblVzZAUGU2NhbGU4BQJsdAQRd2FsbGV0TWFyZ2luSW5Vc2QJAGUCCQBrAwURd2FsbGV0U3VwcGx5SW5Vc2QFCXN1cHBseUFweQUGU2NhbGU4CQBrAwURd2FsbGV0Qm9ycm93SW5Vc2QFCWJvcnJvd0FweQUGU2NhbGU4BAxiYWREZWJ0SW5Vc2QDCQBmAgURd2FsbGV0Qm9ycm93SW5Vc2QFEXdhbGxldFN1cHBseUluVXNkCQBlAgURd2FsbGV0Qm9ycm93SW5Vc2QFEXdhbGxldFN1cHBseUluVXNkAAAJAJ4KDAkAzQgCCAUFYWNjdW0CXzEFDHdhbGxldFN1cHBseQkAzQgCCAUFYWNjdW0CXzIFEXdhbGxldFN1cHBseUluVXNkCQDNCAIIBQVhY2N1bQJfMwURd2FsbGV0RGFpbHlJbmNvbWUJAM0IAggFBWFjY3VtAl80BRZ3YWxsZXREYWlseUluY29tZUluVXNkCQDNCAIIBQVhY2N1bQJfNQUMd2FsbGV0Qm9ycm93CQDNCAIIBQVhY2N1bQJfNgURd2FsbGV0Qm9ycm93SW5Vc2QJAM0IAggFBWFjY3VtAl83BRd3YWxsZXREYWlseUxvYW5QZXJjZW50cwkAzQgCCAUFYWNjdW0CXzgFHHdhbGxldERhaWx5TG9hblBlcmNlbnRzSW5Vc2QJAM0IAggFBWFjY3VtAl85BRZ3YWxsZXRCb3Jyb3dMaW1pdEluVXNkCQDNCAIIBQVhY2N1bQNfMTAFFndhbGxldEJvcnJvd1VzYWdlSW5Vc2QJAM0IAggFBWFjY3VtA18xMQURd2FsbGV0TWFyZ2luSW5Vc2QJAM0IAggFBWFjY3VtA18xMgUMYmFkRGVidEluVXNkBAZhc3NldHMKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCeCgwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQEDc3VtAgULYXNzZXRzQ291bnQIBQZhc3NldHMCXzIEG3RvdGFsV2FsbGV0RGFpbHlJbmNvbWVJblVzZAkBA3N1bQIFC2Fzc2V0c0NvdW50CAUGYXNzZXRzAl80BBZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCQEDc3VtAgULYXNzZXRzQ291bnQIBQZhc3NldHMCXzYEIXRvdGFsV2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAkBA3N1bQIFC2Fzc2V0c0NvdW50CAUGYXNzZXRzAl84BBt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAQNzdW0CBQthc3NldHNDb3VudAgFBmFzc2V0cwJfOQQbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkCQEDc3VtAgULYXNzZXRzQ291bnQIBQZhc3NldHMDXzEwBBZ0b3RhbFdhbGxldE1hcmdpbkluVXNkCQEDc3VtAgULYXNzZXRzQ291bnQIBQZhc3NldHMDXzExBA1hY2NvdW50SGVhbHRoCQEQZ2V0QWNjb3VudEhlYWx0aAIFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAUbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkBAZuZXRBcHkJAQlnZXROZXRBcHkDBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkBRZ0b3RhbFdhbGxldE1hcmdpbkluVXNkCQCZCgcFBmFzc2V0cwUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAUbdG90YWxXYWxsZXREYWlseUluY29tZUluVXNkBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkBSF0b3RhbFdhbGxldERhaWx5TG9hblBlcmNlbnRzSW5Vc2QFDWFjY291bnRIZWFsdGgFBm5ldEFweQENZ2V0TWFya2V0SnNvbgMJbWFya2V0U3RyBndhbGxldAVkZWJ1ZwQNbWFya2V0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbWFya2V0U3RyBAptYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUJbWFya2V0U3RyBAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAKAIAQIMc2V0dXBfYWN0aXZlBgQLc2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFDW1hcmtldEFkZHJlc3MEC2Fzc2V0c0NvdW50CQCQAwEFC3NldHVwVG9rZW5zBA5sYXN0UmF0ZUhlaWdodAkBEWdldExhc3RSYXRlSGVpZ2h0AQUNbWFya2V0QWRkcmVzcwoBCmFzc2V0c0ZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAULYXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAVwcmljZQkBDWdldFRva2VuUHJpY2UBBQphc3NldElkU3RyBAphc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxTdXBwbHkJARZnZXRPdXRkYXRlZFRvdGFsU3VwcGx5AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbEJvcnJvdwkBFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkQlJhdGUJARBnZXRPdXRkYXRlZEJSYXRlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKb3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRNvdXRkYXRlZFRvdGFsU3VwcGx5BRNvdXRkYXRlZFRvdGFsQm9ycm93BQ1vdXRkYXRlZFNSYXRlBQ1vdXRkYXRlZEJSYXRlBARyYXRlCQEHZ2V0UmF0ZQIFCm91dGRhdGVkVXIFCmFzc2V0SWRTdHIECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQRyYXRlBAVzUmF0ZQkBDmdldEFjdHVhbFNSYXRlBAUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEC3N1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQZzdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAtib3Jyb3dJblVzZAkBCGdldEluVXNkAwUGYm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQIcmVzZXJ2ZXMJAGUCBQZzdXBwbHkFBmJvcnJvdwQNcmVzZXJ2ZXNJblVzZAkBCGdldEluVXNkAwUIcmVzZXJ2ZXMFCmFzc2V0U2NhbGUFBXByaWNlBAJ1cgkBC2dldEFjdHVhbFVyAgUGc3VwcGx5BQZib3Jyb3cECXN1cHBseUFweQkBDGdldFN1cHBseUFweQIFBHJhdGUFAnVyBAlib3Jyb3dBcHkJAQxnZXRCb3Jyb3dBcHkBBQRyYXRlBAltYXhTdXBwbHkJAQxnZXRNYXhTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA9tYXJrZXRBc3NldEpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCSJzdXBwbHkiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUGc3VwcGx5Ag8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgULc3VwcGx5SW5Vc2QCCiwiYm9ycm93IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFBmJvcnJvdwIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFC2JvcnJvd0luVXNkAgwsInJlc2VydmVzIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFCHJlc2VydmVzAhEsInJlc2VydmVzSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQ1yZXNlcnZlc0luVXNkAgksInByaWNlIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUFcHJpY2UCDSwic3VwcGx5QXB5IjoJAQ9hbW91bnRUb0RlY2ltYWwCBQlzdXBwbHlBcHkFBlNjYWxlOAINLCJib3Jyb3dBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCWJvcnJvd0FweQUGU2NhbGU4AhQsInV0aWxpemF0aW9uUmF0aW8iOgkBD2Ftb3VudFRvRGVjaW1hbAIFAnVyBQZTY2FsZTgCDSwibWF4U3VwcGx5IjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUJbWF4U3VwcGx5AgksInNSYXRlIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQVzUmF0ZQUHU2NhbGUxNgIJLCJiUmF0ZSI6CQEPYW1vdW50VG9EZWNpbWFsAgUFYlJhdGUFB1NjYWxlMTYCAX0JAJYKBAkAZAIIBQVhY2N1bQJfMQULc3VwcGx5SW5Vc2QJAGQCCAUFYWNjdW0CXzIFC2JvcnJvd0luVXNkCQBkAggFBWFjY3VtAl8zBQ1yZXNlcnZlc0luVXNkCQDNCAIIBQVhY2N1bQJfNAUPbWFya2V0QXNzZXRKc29uBA0kdDAxOTY5NTE5ODAzCgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmFzc2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBAtzdXBwbHlJblVzZAgFDSR0MDE5Njk1MTk4MDMCXzEEC2JvcnJvd0luVXNkCAUNJHQwMTk2OTUxOTgwMwJfMgQNcmVzZXJ2ZXNJblVzZAgFDSR0MDE5Njk1MTk4MDMCXzMEEG1hcmtldEFzc2V0c0pzb24IBQ0kdDAxOTY5NTE5ODAzAl80BAxtYXJrZXRzQ291bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQECB21hcmtldHMKAQttYXJrZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQxtYXJrZXRzQ291bnQFBWFjY3VtBBdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFBG5leHQEEWN1cnJlbnRNYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUXY3VycmVudE1hcmtldEFkZHJlc3NTdHIECnNpbXBsZUpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AggibmFtZSI6IgURY3VycmVudE1hcmtldE5hbWUCASICDywic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyAAACESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAgAABQZTY2FsZTgCAX0DCQAAAgUGd2FsbGV0AgAJAM0IAgUFYWNjdW0FCnNpbXBsZUpzb24EFGN1cnJlbnRNYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgQSY3VycmVudFNldHVwVG9rZW5zCQEOZ2V0U2V0dXBUb2tlbnMBBRRjdXJyZW50TWFya2V0QWRkcmVzcwQSY3VycmVudEFzc2V0c0NvdW50CQCQAwEFEmN1cnJlbnRTZXR1cFRva2VucwQWY3VycmVudE1hcmtldFNob3J0TmFtZQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAhFtYXJrZXRfc2hvcnRuYW1lXwUXY3VycmVudE1hcmtldEFkZHJlc3NTdHIEB3NldHVwQ2YJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUUY3VycmVudE1hcmtldEFkZHJlc3MCCnNldHVwX2x0dnMCASwEB3NldHVwTHQJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUUY3VycmVudE1hcmtldEFkZHJlc3MCCXNldHVwX2x0cwIBLAQVY3VycmVudExhc3RSYXRlSGVpZ2h0CQERZ2V0TGFzdFJhdGVIZWlnaHQBBRRjdXJyZW50TWFya2V0QWRkcmVzcwoBEG1hcmtldEFzc2V0c0ZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAUSY3VycmVudEFzc2V0c0NvdW50BQVhY2N1bQQKYXNzZXRJZFN0cgkAkQMCBRJjdXJyZW50U2V0dXBUb2tlbnMFBG5leHQEAmNmCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBDZgUEbmV4dAQCbHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cEx0BQRuZXh0BAVwcmljZQkBDWdldFRva2VuUHJpY2UBBQphc3NldElkU3RyBAphc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxTdXBwbHkJARZnZXRPdXRkYXRlZFRvdGFsU3VwcGx5AgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkU1JhdGUJARBnZXRPdXRkYXRlZFNSYXRlAgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkQlJhdGUJARBnZXRPdXRkYXRlZEJSYXRlAgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECm91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRTUmF0ZQUNb3V0ZGF0ZWRCUmF0ZQQEcmF0ZQkBB2dldFJhdGUCBQpvdXRkYXRlZFVyBQphc3NldElkU3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCm91dGRhdGVkVXIFDW91dGRhdGVkU1JhdGUEBWJSYXRlCQEOZ2V0QWN0dWFsQlJhdGUDBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAx3YWxsZXRTdXBwbHkJAQ9nZXRXYWxsZXRTdXBwbHkEBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQVzUmF0ZQQRd2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldFN1cHBseQUKYXNzZXRTY2FsZQUFcHJpY2UEDHdhbGxldEJvcnJvdwkBD2dldFdhbGxldEJvcnJvdwQFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBQZ3YWxsZXQFBWJSYXRlBBF3YWxsZXRCb3Jyb3dJblVzZAkBCGdldEluVXNkAwUMd2FsbGV0Qm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQWd2FsbGV0Qm9ycm93TGltaXRJblVzZAkAawMFEXdhbGxldFN1cHBseUluVXNkBQJjZgUGU2NhbGU4BBZ3YWxsZXRCb3Jyb3dVc2FnZUluVXNkCQBrAwURd2FsbGV0Qm9ycm93SW5Vc2QFBlNjYWxlOAUCbHQJAJUKAwkAZAIIBQVhY2N1bQJfMQURd2FsbGV0U3VwcGx5SW5Vc2QJAGQCCAUFYWNjdW0CXzIFFndhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAGQCCAUFYWNjdW0CXzMFFndhbGxldEJvcnJvd1VzYWdlSW5Vc2QEDSR0MDIyODM4MjI5NzEKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAAAAAAKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEG1hcmtldEFzc2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBZ0b3RhbFdhbGxldFN1cHBseUluVXNkCAUNJHQwMjI4MzgyMjk3MQJfMQQbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkCAUNJHQwMjI4MzgyMjk3MQJfMgQbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkCAUNJHQwMjI4MzgyMjk3MQJfMwQNYWNjb3VudEhlYWx0aAkBEGdldEFjY291bnRIZWFsdGgCBRt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QFG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAQIZnVsbEpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AggibmFtZSI6IgUWY3VycmVudE1hcmtldFNob3J0TmFtZQIBIgIPLCJzdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QCESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAgUNYWNjb3VudEhlYWx0aAUGU2NhbGU4AgF9CQDNCAIFBWFjY3VtBQhmdWxsSnNvbgQLbWFya2V0c0pzb24KAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC21hcmtldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIIm5hbWUiOiIFCm1hcmtldE5hbWUCASICCiwiYWN0aXZlIjoJAKUDAQUGYWN0aXZlAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgULc3VwcGx5SW5Vc2QCDywiYm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQtib3Jyb3dJblVzZAIRLCJyZXNlcnZlc0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUNcmVzZXJ2ZXNJblVzZAILLCJhc3NldHMiOlsJALsJAgUQbWFya2V0QXNzZXRzSnNvbgIBLAIBXQIMLCJtYXJrZXRzIjpbCQC7CQIFC21hcmtldHNKc29uAgEsAgFdAgF9AwUFZGVidWcJAAIBBQRqc29uBQRqc29uAQtnZXRNZW51SnNvbgEFZGVidWcEDG1hcmtldHNDb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQIHbWFya2V0cwoBC21hcmtldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFDG1hcmtldHNDb3VudAUFYWNjdW0ECW1hcmtldFN0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFBG5leHQEDW1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW1hcmtldFN0cgQLc2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFDW1hcmtldEFkZHJlc3MEC2Fzc2V0c0NvdW50CQCQAwEFC3NldHVwVG9rZW5zBA5sYXN0UmF0ZUhlaWdodAkBEWdldExhc3RSYXRlSGVpZ2h0AQUNbWFya2V0QWRkcmVzcwoBCmFzc2V0c0ZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAULYXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAVwcmljZQkBDWdldFRva2VuUHJpY2UBBQphc3NldElkU3RyBAphc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxTdXBwbHkJARZnZXRPdXRkYXRlZFRvdGFsU3VwcGx5AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbEJvcnJvdwkBFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkQlJhdGUJARBnZXRPdXRkYXRlZEJSYXRlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKb3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRNvdXRkYXRlZFRvdGFsU3VwcGx5BRNvdXRkYXRlZFRvdGFsQm9ycm93BQ1vdXRkYXRlZFNSYXRlBQ1vdXRkYXRlZEJSYXRlBARyYXRlCQEHZ2V0UmF0ZQIFCm91dGRhdGVkVXIFCmFzc2V0SWRTdHIECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQRyYXRlBAVzUmF0ZQkBDmdldEFjdHVhbFNSYXRlBAUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEC3N1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQZzdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAtib3Jyb3dJblVzZAkBCGdldEluVXNkAwUGYm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQIcmVzZXJ2ZXMJAGUCBQZzdXBwbHkFBmJvcnJvdwQNcmVzZXJ2ZXNJblVzZAkBCGdldEluVXNkAwUIcmVzZXJ2ZXMFCmFzc2V0U2NhbGUFBXByaWNlBA9tYXJrZXRBc3NldEpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCCJhc3NldCI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyAAACCSwicHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQVwcmljZQIJLCJzUmF0ZSI6CQEPYW1vdW50VG9EZWNpbWFsAgUFc1JhdGUFB1NjYWxlMTYCCSwiYlJhdGUiOgkBD2Ftb3VudFRvRGVjaW1hbAIFBWJSYXRlBQdTY2FsZTE2AgF9CQCWCgQJAGQCCAUFYWNjdW0CXzEFC3N1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBQtib3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUNcmVzZXJ2ZXNJblVzZAkAzQgCCAUFYWNjdW0CXzQFD21hcmtldEFzc2V0SnNvbgQNJHQwMjYzMzgyNjQ0NgoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQphc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQLc3VwcGx5SW5Vc2QIBQ0kdDAyNjMzODI2NDQ2Al8xBAtib3Jyb3dJblVzZAgFDSR0MDI2MzM4MjY0NDYCXzIEDXJlc2VydmVzSW5Vc2QIBQ0kdDAyNjMzODI2NDQ2Al8zBBBtYXJrZXRBc3NldHNKc29uCAUNJHQwMjYzMzgyNjQ0NgJfNAQKbWFya2V0SnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AgsiYWRkcmVzcyI6IgUJbWFya2V0U3RyAgEiAgssImFzc2V0cyI6WwkAuwkCBRBtYXJrZXRBc3NldHNKc29uAgEsAgFdAgF9CQCWCgQJAGQCCAUFYWNjdW0CXzEFC3N1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBQtib3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUNcmVzZXJ2ZXNJblVzZAkAzQgCCAUFYWNjdW0CXzQFCm1hcmtldEpzb24EDSR0MDI2Nzk0MjY5MTMKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAAAAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELbWFya2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBB0b3RhbFN1cHBseUluVXNkCAUNJHQwMjY3OTQyNjkxMwJfMQQQdG90YWxCb3Jyb3dJblVzZAgFDSR0MDI2Nzk0MjY5MTMCXzIEEnRvdGFsUmVzZXJ2ZXNJblVzZAgFDSR0MDI2Nzk0MjY5MTMCXzMEC21hcmtldHNKc29uCAUNJHQwMjY3OTQyNjkxMwJfNAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7Ag4ic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRB0b3RhbFN1cHBseUluVXNkAg8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUQdG90YWxCb3Jyb3dJblVzZAIRLCJyZXNlcnZlc0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUSdG90YWxSZXNlcnZlc0luVXNkAgwsIm1hcmtldHMiOlsJALsJAgULbWFya2V0c0pzb24CASwCAV0CAX0DBQVkZWJ1ZwkAAgEFBGpzb24FBGpzb24BF2dldFdhbGxldE9wZXJhdGlvbnNKc29uBAZtYXJrZXQKYXNzZXRJZFN0cgZ3YWxsZXQFZGVidWcEDW1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBm1hcmtldAQKbWFya2V0RGF0YQkBDWdldE1hcmtldERhdGEBBQ1tYXJrZXRBZGRyZXNzBAp3YWxsZXREYXRhCQENZ2V0V2FsbGV0RGF0YQwFDW1hcmtldEFkZHJlc3MFBndhbGxldAgFCm1hcmtldERhdGECXzIICAUKbWFya2V0RGF0YQJfMQJfMQgIBQptYXJrZXREYXRhAl8xAl8yCAgFCm1hcmtldERhdGECXzECXzMICAUKbWFya2V0RGF0YQJfMQJfNQgIBQptYXJrZXREYXRhAl8xAl82CAgFCm1hcmtldERhdGECXzECXzgICAUKbWFya2V0RGF0YQJfMQJfOQgIBQptYXJrZXREYXRhAl8xA18xNwgIBQptYXJrZXREYXRhAl8xA18xOAQKYXNzZXRJbmRleAkBDWdldEFzc2V0SW5kZXgCCAgFCm1hcmtldERhdGECXzECXzEFCmFzc2V0SWRTdHIEBGpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIKIm1hcmtldCI6IggFCm1hcmtldERhdGECXzMCASICDiwiYXNzZXRQcmljZSI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIJAJEDAggIBQptYXJrZXREYXRhAl8xAl81BQphc3NldEluZGV4AgosInN1cHBseSI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyCQCRAwIICAUKbWFya2V0RGF0YQJfMQNfMTAFCmFzc2V0SW5kZXgCDywic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyCQCRAwIICAUKbWFya2V0RGF0YQJfMQNfMTEFCmFzc2V0SW5kZXgCDSwic3VwcGx5QXB5IjoJAQ9hbW91bnRUb0RlY2ltYWwCCQCRAwIICAUKbWFya2V0RGF0YQJfMQNfMTcFCmFzc2V0SW5kZXgFBlNjYWxlOAIKLCJib3Jyb3ciOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgkAkQMCCAgFCm1hcmtldERhdGECXzEDXzEyBQphc3NldEluZGV4Ag8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgkAkQMCCAgFCm1hcmtldERhdGECXzEDXzEzBQphc3NldEluZGV4Ag0sImJvcnJvd0FweSI6CQEPYW1vdW50VG9EZWNpbWFsAgkAkQMCCAgFCm1hcmtldERhdGECXzEDXzE4BQphc3NldEluZGV4BQZTY2FsZTgCDCwicmVzZXJ2ZXMiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgkAkQMCCAgFCm1hcmtldERhdGECXzEDXzE0BQphc3NldEluZGV4AhEsInJlc2VydmVzSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyCQCRAwIICAUKbWFya2V0RGF0YQJfMQNfMTUFCmFzc2V0SW5kZXgCFCwidXRpbGl6YXRpb25SYXRpbyI6CQEPYW1vdW50VG9EZWNpbWFsAgkAkQMCCAgFCm1hcmtldERhdGECXzEDXzE2BQphc3NldEluZGV4BQZTY2FsZTgCFCwiY29sbGF0ZXJhbEZhY3RvciI6CQEPYW1vdW50VG9EZWNpbWFsAgkAkQMCCAgFCm1hcmtldERhdGECXzECXzIFCmFzc2V0SW5kZXgFBlNjYWxlOAIYLCJsaXF1aWRhdGlvblRocmVzaG9sZCI6CQEPYW1vdW50VG9EZWNpbWFsAgkAkQMCCAgFCm1hcmtldERhdGECXzECXzMFCmFzc2V0SW5kZXgFBlNjYWxlOAIWLCJsaXF1aWRhdGlvblBlbmFsdHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIJAJEDAggIBQptYXJrZXREYXRhAl8xAl80BQphc3NldEluZGV4BQZTY2FsZTgCDSwibWF4U3VwcGx5IjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgkAkQMCCAgFCm1hcmtldERhdGECXzECXzcFCmFzc2V0SW5kZXgCECwid2FsbGV0U3VwcGx5IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIJAJEDAggIBQp3YWxsZXREYXRhAl8xAl8xBQphc3NldEluZGV4AhUsIndhbGxldFN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgkAkQMCCAgFCndhbGxldERhdGECXzECXzIFCmFzc2V0SW5kZXgCFSwid2FsbGV0RGFpbHlJbmNvbWUiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgkAkQMCCAgFCndhbGxldERhdGECXzECXzMFCmFzc2V0SW5kZXgCGiwid2FsbGV0RGFpbHlJbmNvbWVJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIJAJEDAggIBQp3YWxsZXREYXRhAl8xAl80BQphc3NldEluZGV4AhAsIndhbGxldEJvcnJvdyI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyCQCRAwIICAUKd2FsbGV0RGF0YQJfMQJfNQUKYXNzZXRJbmRleAIVLCJ3YWxsZXRCb3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIJAJEDAggIBQp3YWxsZXREYXRhAl8xAl82BQphc3NldEluZGV4AhssIndhbGxldERhaWx5TG9hbkludGVyZXN0IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIJAJEDAggIBQp3YWxsZXREYXRhAl8xAl83BQphc3NldEluZGV4AiAsIndhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyCQCRAwIICAUKd2FsbGV0RGF0YQJfMQJfOAUKYXNzZXRJbmRleAIRLCJhY2NvdW50SGVhbHRoIjoJAQ9hbW91bnRUb0RlY2ltYWwCCAUKd2FsbGV0RGF0YQJfNgUGU2NhbGU4AgosIm5ldEFweSI6CQEPYW1vdW50VG9EZWNpbWFsAggFCndhbGxldERhdGECXzcFBlNjYWxlOAIBfQMFBWRlYnVnCQACAQUEanNvbgUEanNvbgAA71t4gw==", "chainId": 87, "height": 3858967, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 67CEoSqAHkn4PYQuEEYLbyefPuJX4kwZbnZ3DZTQfbNA Next: 2y31LgN4MdN9pwAHjQnZJvDHqhdq91ZekdmxYyhKZmwP Diff:
Old | New | Differences | |
---|---|---|---|
424 | 424 | let supplyApy = getSupplyApy(rate, ur) | |
425 | 425 | let borrowApy = getBorrowApy(rate) | |
426 | 426 | let maxSupply = getMaxSupply(marketAddress, assetIdStr) | |
427 | - | let marketAssetJson = ((((((((((((((((((((((((((("{" + " | |
427 | + | let marketAssetJson = ((((((((((((((((((((((((((("{" + "\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, Scale8)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, Scale8)) + ",\"utilizationRatio\":") + amountToDecimal(ur, Scale8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"sRate\":") + amountToDecimal(sRate, Scale16)) + ",\"bRate\":") + amountToDecimal(bRate, Scale16)) + "}") | |
428 | 428 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson)) | |
429 | 429 | } | |
430 | 430 | ||
431 | - | let $ | |
431 | + | let $t01969519803 = { | |
432 | 432 | let $l = arr12 | |
433 | 433 | let $s = size($l) | |
434 | 434 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
442 | 442 | ||
443 | 443 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
444 | 444 | } | |
445 | - | let supplyInUsd = $ | |
446 | - | let borrowInUsd = $ | |
447 | - | let reservesInUsd = $ | |
448 | - | let marketAssetsJson = $ | |
445 | + | let supplyInUsd = $t01969519803._1 | |
446 | + | let borrowInUsd = $t01969519803._2 | |
447 | + | let reservesInUsd = $t01969519803._3 | |
448 | + | let marketAssetsJson = $t01969519803._4 | |
449 | 449 | let marketsCount = getIntegerValue("markets") | |
450 | 450 | func marketsFold (accum,next) = if ((next >= marketsCount)) | |
451 | 451 | then accum | |
489 | 489 | $Tuple3((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowLimitInUsd), (accum._3 + walletBorrowUsageInUsd)) | |
490 | 490 | } | |
491 | 491 | ||
492 | - | let $ | |
492 | + | let $t02283822971 = { | |
493 | 493 | let $l = arr12 | |
494 | 494 | let $s = size($l) | |
495 | 495 | let $acc0 = $Tuple3(0, 0, 0) | |
503 | 503 | ||
504 | 504 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
505 | 505 | } | |
506 | - | let totalWalletSupplyInUsd = $ | |
507 | - | let totalWalletBorrowLimitInUsd = $ | |
508 | - | let totalWalletBorrowUsageInUsd = $ | |
506 | + | let totalWalletSupplyInUsd = $t02283822971._1 | |
507 | + | let totalWalletBorrowLimitInUsd = $t02283822971._2 | |
508 | + | let totalWalletBorrowUsageInUsd = $t02283822971._3 | |
509 | 509 | let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd) | |
510 | - | let | |
511 | - | accum | |
510 | + | let fullJson = (((((((("{" + "\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, Scale8)) + "}") | |
511 | + | (accum :+ fullJson) | |
512 | 512 | } | |
513 | 513 | } | |
514 | 514 | ||
568 | 568 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson)) | |
569 | 569 | } | |
570 | 570 | ||
571 | - | let $ | |
571 | + | let $t02633826446 = { | |
572 | 572 | let $l = arr12 | |
573 | 573 | let $s = size($l) | |
574 | 574 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
582 | 582 | ||
583 | 583 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
584 | 584 | } | |
585 | - | let supplyInUsd = $ | |
586 | - | let borrowInUsd = $ | |
587 | - | let reservesInUsd = $ | |
588 | - | let marketAssetsJson = $ | |
585 | + | let supplyInUsd = $t02633826446._1 | |
586 | + | let borrowInUsd = $t02633826446._2 | |
587 | + | let reservesInUsd = $t02633826446._3 | |
588 | + | let marketAssetsJson = $t02633826446._4 | |
589 | 589 | let marketJson = ((((((("{" + "\"address\":\"") + marketStr) + "\"") + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + "}") | |
590 | 590 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketJson)) | |
591 | 591 | } | |
592 | 592 | ||
593 | - | let $ | |
593 | + | let $t02679426913 = { | |
594 | 594 | let $l = arr12 | |
595 | 595 | let $s = size($l) | |
596 | 596 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
604 | 604 | ||
605 | 605 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
606 | 606 | } | |
607 | - | let totalSupplyInUsd = $ | |
608 | - | let totalBorrowInUsd = $ | |
609 | - | let totalReservesInUsd = $ | |
610 | - | let marketsJson = $ | |
607 | + | let totalSupplyInUsd = $t02679426913._1 | |
608 | + | let totalBorrowInUsd = $t02679426913._2 | |
609 | + | let totalReservesInUsd = $t02679426913._3 | |
610 | + | let marketsJson = $t02679426913._4 | |
611 | 611 | let json = (((((((((("{" + "\"supplyInUsd\":") + assetToJson(usdtIdStr, totalSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalBorrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, totalReservesInUsd)) + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}") | |
612 | 612 | if (debug) | |
613 | 613 | then throw(json) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 7 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let Waves = "WAVES" | |
5 | 5 | ||
6 | 6 | let Scale6 = 1000000 | |
7 | 7 | ||
8 | 8 | let Scale8 = 100000000 | |
9 | 9 | ||
10 | 10 | let Scale8Big = toBigInt(100000000) | |
11 | 11 | ||
12 | 12 | let Scale10 = 10000000000 | |
13 | 13 | ||
14 | 14 | let Scale16 = 10000000000000000 | |
15 | 15 | ||
16 | 16 | let Scale16Big = toBigInt(10000000000000000) | |
17 | 17 | ||
18 | 18 | let dayBlocks = 1440 | |
19 | 19 | ||
20 | 20 | let yearBlocks = 525600 | |
21 | 21 | ||
22 | 22 | let yearBlocksBig = toBigInt(525600) | |
23 | 23 | ||
24 | 24 | let reserveFund = 20 | |
25 | 25 | ||
26 | 26 | let arr12 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
27 | 27 | ||
28 | 28 | let usdtIdStr = "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" | |
29 | 29 | ||
30 | 30 | let usdcIdStr = "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" | |
31 | 31 | ||
32 | 32 | let oracleAddress = Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t') | |
33 | 33 | ||
34 | 34 | let axlyAddress = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW') | |
35 | 35 | ||
36 | 36 | let axlyLPs = ["7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1", "Btw3G1j4wQgdp49PTxaFkNvn75dQtqGDM7ejQppHnWC1", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9", "4CQ5CPGLXLbWBUs2JBjKUaRqF49CmKHkwzvPgSvQpAQV", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR"] | |
37 | 37 | ||
38 | 38 | func getRateCurve (assetIdStr) = match assetIdStr { | |
39 | 39 | case _ => | |
40 | 40 | if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match0)) | |
41 | 41 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
42 | 42 | else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match0)) | |
43 | 43 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
44 | 44 | else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match0)) | |
45 | 45 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
46 | 46 | else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match0)) | |
47 | 47 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
48 | 48 | else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match0)) | |
49 | 49 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
50 | 50 | else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match0)) | |
51 | 51 | then $Tuple4(2000000, 40000000, 80000000, 150000000) | |
52 | 52 | else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match0)) | |
53 | 53 | then $Tuple4(0, 100000000, 80000000, 400000000) | |
54 | 54 | else if (("WAVES" == $match0)) | |
55 | 55 | then $Tuple4(2000000, 30000000, 80000000, 90000000) | |
56 | 56 | else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match0)) | |
57 | 57 | then $Tuple4(0, 20000000, 80000000, 40000000) | |
58 | 58 | else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match0)) | |
59 | 59 | then $Tuple4(0, 20000000, 80000000, 100000000) | |
60 | 60 | else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match0)) | |
61 | 61 | then $Tuple4(0, 30000000, 80000000, 40000000) | |
62 | 62 | else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match0)) | |
63 | 63 | then $Tuple4(0, 25000000, 80000000, 40000000) | |
64 | 64 | else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match0)) | |
65 | 65 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
66 | 66 | else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match0)) | |
67 | 67 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
68 | 68 | else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match0)) | |
69 | 69 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
70 | 70 | else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match0)) | |
71 | 71 | then $Tuple4(2000000, 40000000, 80000000, 100000000) | |
72 | 72 | else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match0)) | |
73 | 73 | then $Tuple4(2000000, 30000000, 80000000, 80000000) | |
74 | 74 | else if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match0)) | |
75 | 75 | then $Tuple4(0, 50000000, 80000000, 200000000) | |
76 | 76 | else if (("3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" == $match0)) | |
77 | 77 | then $Tuple4(0, 100000000, 80000000, 400000000) | |
78 | 78 | else $Tuple4(0, 20000000, 80000000, 80000000) | |
79 | 79 | } | |
80 | 80 | ||
81 | 81 | ||
82 | 82 | func sum (size,data) = { | |
83 | 83 | func fold (accum,next) = if ((next >= size)) | |
84 | 84 | then accum | |
85 | 85 | else (accum + data[next]) | |
86 | 86 | ||
87 | 87 | let $l = arr12 | |
88 | 88 | let $s = size($l) | |
89 | 89 | let $acc0 = 0 | |
90 | 90 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
91 | 91 | then $a | |
92 | 92 | else fold($a, $l[$i]) | |
93 | 93 | ||
94 | 94 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
95 | 95 | then $a | |
96 | 96 | else throw("List size exceeds 12") | |
97 | 97 | ||
98 | 98 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
99 | 99 | } | |
100 | 100 | ||
101 | 101 | ||
102 | 102 | func getSetupTokens (marketAddress) = split(getStringValue(marketAddress, "setup_tokens"), ",") | |
103 | 103 | ||
104 | 104 | ||
105 | 105 | func getTokenPrice (assetIdStr) = if (if ((assetIdStr == usdtIdStr)) | |
106 | 106 | then true | |
107 | 107 | else (assetIdStr == usdcIdStr)) | |
108 | 108 | then 1000000 | |
109 | 109 | else if (containsElement(axlyLPs, assetIdStr)) | |
110 | 110 | then { | |
111 | 111 | let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil) | |
112 | 112 | if ($isInstanceOf(@, "Int")) | |
113 | 113 | then @ | |
114 | 114 | else throw(($getType(@) + " couldn't be cast to Int")) | |
115 | 115 | } | |
116 | 116 | else { | |
117 | 117 | let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B")) | |
118 | 118 | price | |
119 | 119 | } | |
120 | 120 | ||
121 | 121 | ||
122 | 122 | func getAssetScale (assetIdStr) = { | |
123 | 123 | let decimals = if ((assetIdStr == "WAVES")) | |
124 | 124 | then 8 | |
125 | 125 | else value(assetInfo(fromBase58String(assetIdStr))).decimals | |
126 | 126 | pow(10, 0, decimals, 0, 0, DOWN) | |
127 | 127 | } | |
128 | 128 | ||
129 | 129 | ||
130 | 130 | func getLastRateHeight (marketAddress) = valueOrElse(getInteger(marketAddress, "lastRateHeight"), 0) | |
131 | 131 | ||
132 | 132 | ||
133 | 133 | func getOutdatedTotalSupply (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_supplied_" + assetIdStr)), 0) | |
134 | 134 | ||
135 | 135 | ||
136 | 136 | func getOutdatedTotalBorrow (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_borrowed_" + assetIdStr)), 0) | |
137 | 137 | ||
138 | 138 | ||
139 | 139 | func getOutdatedSRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_sRate")), 0) | |
140 | 140 | ||
141 | 141 | ||
142 | 142 | func getOutdatedBRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_bRate")), 0) | |
143 | 143 | ||
144 | 144 | ||
145 | 145 | func getOutdatedUr (outdatedTotalSupply,outdatedTotalBorrow,outdatedSRate,outdatedBRate) = { | |
146 | 146 | let down = fraction(outdatedTotalSupply, outdatedSRate, Scale16) | |
147 | 147 | if ((down == 0)) | |
148 | 148 | then 0 | |
149 | 149 | else fraction(Scale8, fraction(outdatedTotalBorrow, outdatedBRate, Scale16), down) | |
150 | 150 | } | |
151 | 151 | ||
152 | 152 | ||
153 | 153 | func getRate (outdatedUr,assetIdStr) = { | |
154 | 154 | let curve = getRateCurve(assetIdStr) | |
155 | 155 | (curve._1 + (if ((curve._3 >= outdatedUr)) | |
156 | 156 | then fraction(outdatedUr, curve._2, curve._3) | |
157 | 157 | else (curve._2 + fraction((outdatedUr - curve._3), curve._4, (100000000 - curve._3))))) | |
158 | 158 | } | |
159 | 159 | ||
160 | 160 | ||
161 | 161 | func getInterest (rate) = max([fraction(rate, Scale8, yearBlocks), 1]) | |
162 | 162 | ||
163 | 163 | ||
164 | 164 | func getAssetIndex (setupTokens,assetIdStr) = value(indexOf(setupTokens, assetIdStr)) | |
165 | 165 | ||
166 | 166 | ||
167 | 167 | func getAssetParamters (marketParameters,assetIndex) = $Tuple3(marketParameters._1[assetIndex], marketParameters._2[assetIndex], marketParameters._3[assetIndex]) | |
168 | 168 | ||
169 | 169 | ||
170 | 170 | func getMarketParameters (marketAddress,setupTokens) = { | |
171 | 171 | let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",") | |
172 | 172 | let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",") | |
173 | 173 | let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",") | |
174 | 174 | let tokensSize = size(setupTokens) | |
175 | 175 | func fold (accum,next) = if ((next >= tokensSize)) | |
176 | 176 | then accum | |
177 | 177 | else $Tuple3((accum._1 :+ parseIntValue(setupCf[next])), (accum._2 :+ parseIntValue(setupLt[next])), (accum._3 :+ parseIntValue(setupPenalty[next]))) | |
178 | 178 | ||
179 | 179 | let $l = arr12 | |
180 | 180 | let $s = size($l) | |
181 | 181 | let $acc0 = $Tuple3(nil, nil, nil) | |
182 | 182 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
183 | 183 | then $a | |
184 | 184 | else fold($a, $l[$i]) | |
185 | 185 | ||
186 | 186 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
187 | 187 | then $a | |
188 | 188 | else throw("List size exceeds 12") | |
189 | 189 | ||
190 | 190 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
191 | 191 | } | |
192 | 192 | ||
193 | 193 | ||
194 | 194 | func getMaxSupply (marketAddress,assetIdStr) = parseIntValue(valueOrElse(getString(marketAddress, ("setup_maxSupply_" + assetIdStr)), "0")) | |
195 | 195 | ||
196 | 196 | ||
197 | 197 | func getActualSRate (lastRateHeight,interest,outdatedUr,outdatedSRate) = { | |
198 | 198 | let lastSRate = max([outdatedSRate, Scale16]) | |
199 | 199 | let newSRate = (lastSRate + ((((height - lastRateHeight) * fraction(interest, outdatedUr, Scale8)) * (100 - reserveFund)) / 100)) | |
200 | 200 | newSRate | |
201 | 201 | } | |
202 | 202 | ||
203 | 203 | ||
204 | 204 | func getActualBRate (lastRateHeight,interest,outdatedBRate) = { | |
205 | 205 | let lastBRate = max([outdatedBRate, Scale16]) | |
206 | 206 | let newBRate = (lastBRate + ((height - lastRateHeight) * interest)) | |
207 | 207 | newBRate | |
208 | 208 | } | |
209 | 209 | ||
210 | 210 | ||
211 | 211 | func getActualUr (actualSupply,actualBorrow) = fraction(actualBorrow, Scale8, actualSupply) | |
212 | 212 | ||
213 | 213 | ||
214 | 214 | func getActualAmount (outdatedAmount,actualRate) = fraction(outdatedAmount, actualRate, Scale16) | |
215 | 215 | ||
216 | 216 | ||
217 | 217 | func getInUsd (actualAmount,assetScale,price) = fraction(actualAmount, price, assetScale) | |
218 | 218 | ||
219 | 219 | ||
220 | 220 | func getSupplyApy (rate,actualUr) = { | |
221 | 221 | let supplyRate = fraction(fraction(rate, 80, 100), actualUr, Scale8) | |
222 | 222 | (toInt(pow((Scale16Big + fraction(toBigInt(supplyRate), Scale8Big, yearBlocksBig)), 16, yearBlocksBig, 0, 8, DOWN)) - Scale8) | |
223 | 223 | } | |
224 | 224 | ||
225 | 225 | ||
226 | 226 | func getBorrowApy (rate) = (toInt(pow((Scale16Big + fraction(toBigInt(rate), Scale8Big, yearBlocksBig)), 16, yearBlocksBig, 0, 8, DOWN)) - Scale8) | |
227 | 227 | ||
228 | 228 | ||
229 | 229 | func getWalletSupply (marketAddress,assetIdStr,wallet,actualSRate) = { | |
230 | 230 | let outdatedWalletSupply = valueOrElse(getInteger(marketAddress, ((wallet + "_supplied_") + assetIdStr)), 0) | |
231 | 231 | getActualAmount(outdatedWalletSupply, actualSRate) | |
232 | 232 | } | |
233 | 233 | ||
234 | 234 | ||
235 | 235 | func getWalletBorrow (marketAddress,assetIdStr,wallet,actualBRate) = { | |
236 | 236 | let outdatedWalletBorrow = valueOrElse(getInteger(marketAddress, ((wallet + "_borrowed_") + assetIdStr)), 0) | |
237 | 237 | getActualAmount(outdatedWalletBorrow, actualBRate) | |
238 | 238 | } | |
239 | 239 | ||
240 | 240 | ||
241 | 241 | func getDailyPercents (apy,quantity) = fraction(fraction((toInt(pow((Scale8Big + toBigInt(apy)), 8, (Scale16Big / yearBlocksBig), 16, 16, DOWN)) - Scale16), dayBlocks, Scale8), quantity, Scale8) | |
242 | 242 | ||
243 | 243 | ||
244 | 244 | func getAccountHealth (totalWalletBorrowLimitInUsd,totalWalletBorrowUsageInUsd) = if ((totalWalletBorrowLimitInUsd == 0)) | |
245 | 245 | then Scale8 | |
246 | 246 | else (Scale8 - fraction(totalWalletBorrowUsageInUsd, Scale8, totalWalletBorrowLimitInUsd)) | |
247 | 247 | ||
248 | 248 | ||
249 | 249 | func getNetApy (totalWalletSupplyInUsd,totalWalletBorrowInUsd,totalWalletMarginInUsd) = if ((totalWalletMarginInUsd == 0)) | |
250 | 250 | then 0 | |
251 | 251 | else if ((totalWalletMarginInUsd > 0)) | |
252 | 252 | then fraction(totalWalletMarginInUsd, Scale8, totalWalletSupplyInUsd) | |
253 | 253 | else fraction(totalWalletMarginInUsd, Scale8, totalWalletBorrowInUsd) | |
254 | 254 | ||
255 | 255 | ||
256 | 256 | func assetToJson (assetIdStr,quantity) = { | |
257 | 257 | let $t092269441 = if ((assetIdStr == Waves)) | |
258 | 258 | then $Tuple2(8, "WAVES") | |
259 | 259 | else { | |
260 | 260 | let asset = value(assetInfo(fromBase58String(assetIdStr))) | |
261 | 261 | $Tuple2(asset.decimals, asset.name) | |
262 | 262 | } | |
263 | 263 | let decimals = $t092269441._1 | |
264 | 264 | let name = $t092269441._2 | |
265 | 265 | (((((((("{\"quantity\":" + toString(quantity)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"") + name) + "\",\"id\":\"") + assetIdStr) + "\"}") | |
266 | 266 | } | |
267 | 267 | ||
268 | 268 | ||
269 | 269 | func amountToDecimal (amount,assetScale) = { | |
270 | 270 | let intPart = (amount / assetScale) | |
271 | 271 | let floatPart = (amount % assetScale) | |
272 | 272 | ((toString(intPart) + ".") + toString(floatPart)) | |
273 | 273 | } | |
274 | 274 | ||
275 | 275 | ||
276 | 276 | func getMarketData (marketAddress) = { | |
277 | 277 | let marketStr = toString(marketAddress) | |
278 | 278 | let marketName = getStringValue(("market_name_" + marketStr)) | |
279 | 279 | let marketShortName = getStringValue(("market_shortname_" + marketStr)) | |
280 | 280 | let setupTokens = getSetupTokens(marketAddress) | |
281 | 281 | let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",") | |
282 | 282 | let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",") | |
283 | 283 | let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",") | |
284 | 284 | let lastRateHeight = getLastRateHeight(marketAddress) | |
285 | 285 | let assetsCount = size(setupTokens) | |
286 | 286 | func fold (accum,next) = if ((next >= assetsCount)) | |
287 | 287 | then accum | |
288 | 288 | else { | |
289 | 289 | let assetIdStr = setupTokens[next] | |
290 | 290 | let cf = parseIntValue(setupCf[next]) | |
291 | 291 | let lt = parseIntValue(setupLt[next]) | |
292 | 292 | let penalty = parseIntValue(setupPenalty[next]) | |
293 | 293 | let price = getTokenPrice(assetIdStr) | |
294 | 294 | let assetScale = getAssetScale(assetIdStr) | |
295 | 295 | let maxSupply = getMaxSupply(marketAddress, assetIdStr) | |
296 | 296 | let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr) | |
297 | 297 | let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr) | |
298 | 298 | let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr) | |
299 | 299 | let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr) | |
300 | 300 | let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate) | |
301 | 301 | let rate = getRate(outdatedUr, assetIdStr) | |
302 | 302 | let interest = getInterest(rate) | |
303 | 303 | let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate) | |
304 | 304 | let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate) | |
305 | 305 | let supply = getActualAmount(outdatedTotalSupply, sRate) | |
306 | 306 | let borrow = getActualAmount(outdatedTotalBorrow, bRate) | |
307 | 307 | let supplyInUsd = getInUsd(supply, assetScale, price) | |
308 | 308 | let borrowInUsd = getInUsd(borrow, assetScale, price) | |
309 | 309 | let reserves = (supply - borrow) | |
310 | 310 | let reservesInUsd = getInUsd(reserves, assetScale, price) | |
311 | 311 | let ur = getActualUr(supply, borrow) | |
312 | 312 | let supplyApy = getSupplyApy(rate, ur) | |
313 | 313 | let borrowApy = getBorrowApy(rate) | |
314 | 314 | $Tuple18((accum._1 :+ assetIdStr), (accum._2 :+ cf), (accum._3 :+ lt), (accum._4 :+ penalty), (accum._5 :+ price), (accum._6 :+ assetScale), (accum._7 :+ maxSupply), (accum._8 :+ sRate), (accum._9 :+ bRate), (accum._10 :+ supply), (accum._11 :+ supplyInUsd), (accum._12 :+ borrow), (accum._13 :+ borrowInUsd), (accum._14 :+ reserves), (accum._15 :+ reservesInUsd), (accum._16 :+ ur), (accum._17 :+ supplyApy), (accum._18 :+ borrowApy)) | |
315 | 315 | } | |
316 | 316 | ||
317 | 317 | let assets = { | |
318 | 318 | let $l = arr12 | |
319 | 319 | let $s = size($l) | |
320 | 320 | let $acc0 = $Tuple18(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) | |
321 | 321 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
322 | 322 | then $a | |
323 | 323 | else fold($a, $l[$i]) | |
324 | 324 | ||
325 | 325 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
326 | 326 | then $a | |
327 | 327 | else throw("List size exceeds 12") | |
328 | 328 | ||
329 | 329 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
330 | 330 | } | |
331 | 331 | let totalSupplyInUsd = sum(assetsCount, assets._11) | |
332 | 332 | let totalBorrowInUsd = sum(assetsCount, assets._13) | |
333 | 333 | let totalReservesInUsd = sum(assetsCount, assets._15) | |
334 | 334 | $Tuple7(assets, assetsCount, marketName, marketShortName, totalSupplyInUsd, totalBorrowInUsd, totalReservesInUsd) | |
335 | 335 | } | |
336 | 336 | ||
337 | 337 | ||
338 | 338 | func getWalletData (marketAddress,wallet,assetsCount,assetsList,cfList,ltList,priceList,assetScaleList,sRateList,bRateList,supplyApyList,borrowApyList) = { | |
339 | 339 | func fold (accum,next) = if ((next >= assetsCount)) | |
340 | 340 | then accum | |
341 | 341 | else { | |
342 | 342 | let assetIdStr = assetsList[next] | |
343 | 343 | let cf = cfList[next] | |
344 | 344 | let lt = ltList[next] | |
345 | 345 | let price = priceList[next] | |
346 | 346 | let assetScale = assetScaleList[next] | |
347 | 347 | let sRate = sRateList[next] | |
348 | 348 | let bRate = bRateList[next] | |
349 | 349 | let supplyApy = supplyApyList[next] | |
350 | 350 | let borrowApy = borrowApyList[next] | |
351 | 351 | let walletSupply = getWalletSupply(marketAddress, assetIdStr, wallet, sRate) | |
352 | 352 | let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price) | |
353 | 353 | let walletDailyIncome = getDailyPercents(supplyApy, walletSupply) | |
354 | 354 | let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price) | |
355 | 355 | let walletBorrow = getWalletBorrow(marketAddress, assetIdStr, wallet, bRate) | |
356 | 356 | let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price) | |
357 | 357 | let walletDailyLoanPercents = getDailyPercents(borrowApy, walletBorrow) | |
358 | 358 | let walletDailyLoanPercentsInUsd = getInUsd(walletDailyLoanPercents, assetScale, price) | |
359 | 359 | let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8) | |
360 | 360 | let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt) | |
361 | 361 | let walletMarginInUsd = (fraction(walletSupplyInUsd, supplyApy, Scale8) - fraction(walletBorrowInUsd, borrowApy, Scale8)) | |
362 | 362 | let badDebtInUsd = if ((walletBorrowInUsd > walletSupplyInUsd)) | |
363 | 363 | then (walletBorrowInUsd - walletSupplyInUsd) | |
364 | 364 | else 0 | |
365 | 365 | $Tuple12((accum._1 :+ walletSupply), (accum._2 :+ walletSupplyInUsd), (accum._3 :+ walletDailyIncome), (accum._4 :+ walletDailyIncomeInUsd), (accum._5 :+ walletBorrow), (accum._6 :+ walletBorrowInUsd), (accum._7 :+ walletDailyLoanPercents), (accum._8 :+ walletDailyLoanPercentsInUsd), (accum._9 :+ walletBorrowLimitInUsd), (accum._10 :+ walletBorrowUsageInUsd), (accum._11 :+ walletMarginInUsd), (accum._12 :+ badDebtInUsd)) | |
366 | 366 | } | |
367 | 367 | ||
368 | 368 | let assets = { | |
369 | 369 | let $l = arr12 | |
370 | 370 | let $s = size($l) | |
371 | 371 | let $acc0 = $Tuple12(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) | |
372 | 372 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
373 | 373 | then $a | |
374 | 374 | else fold($a, $l[$i]) | |
375 | 375 | ||
376 | 376 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
377 | 377 | then $a | |
378 | 378 | else throw("List size exceeds 12") | |
379 | 379 | ||
380 | 380 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
381 | 381 | } | |
382 | 382 | let totalWalletSupplyInUsd = sum(assetsCount, assets._2) | |
383 | 383 | let totalWalletDailyIncomeInUsd = sum(assetsCount, assets._4) | |
384 | 384 | let totalWalletBorrowInUsd = sum(assetsCount, assets._6) | |
385 | 385 | let totalWalletDailyLoanPercentsInUsd = sum(assetsCount, assets._8) | |
386 | 386 | let totalWalletBorrowLimitInUsd = sum(assetsCount, assets._9) | |
387 | 387 | let totalWalletBorrowUsageInUsd = sum(assetsCount, assets._10) | |
388 | 388 | let totalWalletMarginInUsd = sum(assetsCount, assets._11) | |
389 | 389 | let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd) | |
390 | 390 | let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd) | |
391 | 391 | $Tuple7(assets, totalWalletSupplyInUsd, totalWalletDailyIncomeInUsd, totalWalletBorrowInUsd, totalWalletDailyLoanPercentsInUsd, accountHealth, netApy) | |
392 | 392 | } | |
393 | 393 | ||
394 | 394 | ||
395 | 395 | func getMarketJson (marketStr,wallet,debug) = { | |
396 | 396 | let marketAddress = addressFromStringValue(marketStr) | |
397 | 397 | let marketName = getStringValue(("market_name_" + marketStr)) | |
398 | 398 | let active = valueOrElse(getBoolean("setup_active"), true) | |
399 | 399 | let setupTokens = getSetupTokens(marketAddress) | |
400 | 400 | let assetsCount = size(setupTokens) | |
401 | 401 | let lastRateHeight = getLastRateHeight(marketAddress) | |
402 | 402 | func assetsFold (accum,next) = if ((next >= assetsCount)) | |
403 | 403 | then accum | |
404 | 404 | else { | |
405 | 405 | let assetIdStr = setupTokens[next] | |
406 | 406 | let price = getTokenPrice(assetIdStr) | |
407 | 407 | let assetScale = getAssetScale(assetIdStr) | |
408 | 408 | let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr) | |
409 | 409 | let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr) | |
410 | 410 | let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr) | |
411 | 411 | let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr) | |
412 | 412 | let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate) | |
413 | 413 | let rate = getRate(outdatedUr, assetIdStr) | |
414 | 414 | let interest = getInterest(rate) | |
415 | 415 | let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate) | |
416 | 416 | let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate) | |
417 | 417 | let supply = getActualAmount(outdatedTotalSupply, sRate) | |
418 | 418 | let borrow = getActualAmount(outdatedTotalBorrow, bRate) | |
419 | 419 | let supplyInUsd = getInUsd(supply, assetScale, price) | |
420 | 420 | let borrowInUsd = getInUsd(borrow, assetScale, price) | |
421 | 421 | let reserves = (supply - borrow) | |
422 | 422 | let reservesInUsd = getInUsd(reserves, assetScale, price) | |
423 | 423 | let ur = getActualUr(supply, borrow) | |
424 | 424 | let supplyApy = getSupplyApy(rate, ur) | |
425 | 425 | let borrowApy = getBorrowApy(rate) | |
426 | 426 | let maxSupply = getMaxSupply(marketAddress, assetIdStr) | |
427 | - | let marketAssetJson = ((((((((((((((((((((((((((("{" + " | |
427 | + | let marketAssetJson = ((((((((((((((((((((((((((("{" + "\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, Scale8)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, Scale8)) + ",\"utilizationRatio\":") + amountToDecimal(ur, Scale8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"sRate\":") + amountToDecimal(sRate, Scale16)) + ",\"bRate\":") + amountToDecimal(bRate, Scale16)) + "}") | |
428 | 428 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson)) | |
429 | 429 | } | |
430 | 430 | ||
431 | - | let $ | |
431 | + | let $t01969519803 = { | |
432 | 432 | let $l = arr12 | |
433 | 433 | let $s = size($l) | |
434 | 434 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
435 | 435 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
436 | 436 | then $a | |
437 | 437 | else assetsFold($a, $l[$i]) | |
438 | 438 | ||
439 | 439 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
440 | 440 | then $a | |
441 | 441 | else throw("List size exceeds 12") | |
442 | 442 | ||
443 | 443 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
444 | 444 | } | |
445 | - | let supplyInUsd = $ | |
446 | - | let borrowInUsd = $ | |
447 | - | let reservesInUsd = $ | |
448 | - | let marketAssetsJson = $ | |
445 | + | let supplyInUsd = $t01969519803._1 | |
446 | + | let borrowInUsd = $t01969519803._2 | |
447 | + | let reservesInUsd = $t01969519803._3 | |
448 | + | let marketAssetsJson = $t01969519803._4 | |
449 | 449 | let marketsCount = getIntegerValue("markets") | |
450 | 450 | func marketsFold (accum,next) = if ((next >= marketsCount)) | |
451 | 451 | then accum | |
452 | 452 | else { | |
453 | 453 | let currentMarketAddressStr = getStringValue(("market_" + toString(next))) | |
454 | 454 | let currentMarketName = getStringValue(("market_name_" + currentMarketAddressStr)) | |
455 | 455 | let simpleJson = (((((((("{" + "\"name\":\"") + currentMarketName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, 0)) + ",\"accountHealth\":") + amountToDecimal(0, Scale8)) + "}") | |
456 | 456 | if ((wallet == "")) | |
457 | 457 | then (accum :+ simpleJson) | |
458 | 458 | else { | |
459 | 459 | let currentMarketAddress = addressFromStringValue(currentMarketAddressStr) | |
460 | 460 | let currentSetupTokens = getSetupTokens(currentMarketAddress) | |
461 | 461 | let currentAssetsCount = size(currentSetupTokens) | |
462 | 462 | let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr)) | |
463 | 463 | let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",") | |
464 | 464 | let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",") | |
465 | 465 | let currentLastRateHeight = getLastRateHeight(currentMarketAddress) | |
466 | 466 | func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount)) | |
467 | 467 | then accum | |
468 | 468 | else { | |
469 | 469 | let assetIdStr = currentSetupTokens[next] | |
470 | 470 | let cf = parseIntValue(setupCf[next]) | |
471 | 471 | let lt = parseIntValue(setupLt[next]) | |
472 | 472 | let price = getTokenPrice(assetIdStr) | |
473 | 473 | let assetScale = getAssetScale(assetIdStr) | |
474 | 474 | let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr) | |
475 | 475 | let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr) | |
476 | 476 | let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr) | |
477 | 477 | let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr) | |
478 | 478 | let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate) | |
479 | 479 | let rate = getRate(outdatedUr, assetIdStr) | |
480 | 480 | let interest = getInterest(rate) | |
481 | 481 | let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate) | |
482 | 482 | let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate) | |
483 | 483 | let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate) | |
484 | 484 | let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price) | |
485 | 485 | let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate) | |
486 | 486 | let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price) | |
487 | 487 | let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8) | |
488 | 488 | let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt) | |
489 | 489 | $Tuple3((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowLimitInUsd), (accum._3 + walletBorrowUsageInUsd)) | |
490 | 490 | } | |
491 | 491 | ||
492 | - | let $ | |
492 | + | let $t02283822971 = { | |
493 | 493 | let $l = arr12 | |
494 | 494 | let $s = size($l) | |
495 | 495 | let $acc0 = $Tuple3(0, 0, 0) | |
496 | 496 | func $f1_1 ($a,$i) = if (($i >= $s)) | |
497 | 497 | then $a | |
498 | 498 | else marketAssetsFold($a, $l[$i]) | |
499 | 499 | ||
500 | 500 | func $f1_2 ($a,$i) = if (($i >= $s)) | |
501 | 501 | then $a | |
502 | 502 | else throw("List size exceeds 12") | |
503 | 503 | ||
504 | 504 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
505 | 505 | } | |
506 | - | let totalWalletSupplyInUsd = $ | |
507 | - | let totalWalletBorrowLimitInUsd = $ | |
508 | - | let totalWalletBorrowUsageInUsd = $ | |
506 | + | let totalWalletSupplyInUsd = $t02283822971._1 | |
507 | + | let totalWalletBorrowLimitInUsd = $t02283822971._2 | |
508 | + | let totalWalletBorrowUsageInUsd = $t02283822971._3 | |
509 | 509 | let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd) | |
510 | - | let | |
511 | - | accum | |
510 | + | let fullJson = (((((((("{" + "\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, Scale8)) + "}") | |
511 | + | (accum :+ fullJson) | |
512 | 512 | } | |
513 | 513 | } | |
514 | 514 | ||
515 | 515 | let marketsJson = { | |
516 | 516 | let $l = arr12 | |
517 | 517 | let $s = size($l) | |
518 | 518 | let $acc0 = nil | |
519 | 519 | func $f1_1 ($a,$i) = if (($i >= $s)) | |
520 | 520 | then $a | |
521 | 521 | else marketsFold($a, $l[$i]) | |
522 | 522 | ||
523 | 523 | func $f1_2 ($a,$i) = if (($i >= $s)) | |
524 | 524 | then $a | |
525 | 525 | else throw("List size exceeds 12") | |
526 | 526 | ||
527 | 527 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
528 | 528 | } | |
529 | 529 | let json = (((((((((((((((((("{" + "\"name\":\"") + marketName) + "\"") + ",\"active\":") + toString(active)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}") | |
530 | 530 | if (debug) | |
531 | 531 | then throw(json) | |
532 | 532 | else json | |
533 | 533 | } | |
534 | 534 | ||
535 | 535 | ||
536 | 536 | func getMenuJson (debug) = { | |
537 | 537 | let marketsCount = getIntegerValue("markets") | |
538 | 538 | func marketsFold (accum,next) = if ((next >= marketsCount)) | |
539 | 539 | then accum | |
540 | 540 | else { | |
541 | 541 | let marketStr = getStringValue(("market_" + toString(next))) | |
542 | 542 | let marketAddress = addressFromStringValue(marketStr) | |
543 | 543 | let setupTokens = getSetupTokens(marketAddress) | |
544 | 544 | let assetsCount = size(setupTokens) | |
545 | 545 | let lastRateHeight = getLastRateHeight(marketAddress) | |
546 | 546 | func assetsFold (accum,next) = if ((next >= assetsCount)) | |
547 | 547 | then accum | |
548 | 548 | else { | |
549 | 549 | let assetIdStr = setupTokens[next] | |
550 | 550 | let price = getTokenPrice(assetIdStr) | |
551 | 551 | let assetScale = getAssetScale(assetIdStr) | |
552 | 552 | let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr) | |
553 | 553 | let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr) | |
554 | 554 | let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr) | |
555 | 555 | let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr) | |
556 | 556 | let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate) | |
557 | 557 | let rate = getRate(outdatedUr, assetIdStr) | |
558 | 558 | let interest = getInterest(rate) | |
559 | 559 | let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate) | |
560 | 560 | let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate) | |
561 | 561 | let supply = getActualAmount(outdatedTotalSupply, sRate) | |
562 | 562 | let borrow = getActualAmount(outdatedTotalBorrow, bRate) | |
563 | 563 | let supplyInUsd = getInUsd(supply, assetScale, price) | |
564 | 564 | let borrowInUsd = getInUsd(borrow, assetScale, price) | |
565 | 565 | let reserves = (supply - borrow) | |
566 | 566 | let reservesInUsd = getInUsd(reserves, assetScale, price) | |
567 | 567 | let marketAssetJson = ((((((((("{" + "\"asset\":") + assetToJson(assetIdStr, 0)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"sRate\":") + amountToDecimal(sRate, Scale16)) + ",\"bRate\":") + amountToDecimal(bRate, Scale16)) + "}") | |
568 | 568 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson)) | |
569 | 569 | } | |
570 | 570 | ||
571 | - | let $ | |
571 | + | let $t02633826446 = { | |
572 | 572 | let $l = arr12 | |
573 | 573 | let $s = size($l) | |
574 | 574 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
575 | 575 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
576 | 576 | then $a | |
577 | 577 | else assetsFold($a, $l[$i]) | |
578 | 578 | ||
579 | 579 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
580 | 580 | then $a | |
581 | 581 | else throw("List size exceeds 12") | |
582 | 582 | ||
583 | 583 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
584 | 584 | } | |
585 | - | let supplyInUsd = $ | |
586 | - | let borrowInUsd = $ | |
587 | - | let reservesInUsd = $ | |
588 | - | let marketAssetsJson = $ | |
585 | + | let supplyInUsd = $t02633826446._1 | |
586 | + | let borrowInUsd = $t02633826446._2 | |
587 | + | let reservesInUsd = $t02633826446._3 | |
588 | + | let marketAssetsJson = $t02633826446._4 | |
589 | 589 | let marketJson = ((((((("{" + "\"address\":\"") + marketStr) + "\"") + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + "}") | |
590 | 590 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketJson)) | |
591 | 591 | } | |
592 | 592 | ||
593 | - | let $ | |
593 | + | let $t02679426913 = { | |
594 | 594 | let $l = arr12 | |
595 | 595 | let $s = size($l) | |
596 | 596 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
597 | 597 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
598 | 598 | then $a | |
599 | 599 | else marketsFold($a, $l[$i]) | |
600 | 600 | ||
601 | 601 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
602 | 602 | then $a | |
603 | 603 | else throw("List size exceeds 12") | |
604 | 604 | ||
605 | 605 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
606 | 606 | } | |
607 | - | let totalSupplyInUsd = $ | |
608 | - | let totalBorrowInUsd = $ | |
609 | - | let totalReservesInUsd = $ | |
610 | - | let marketsJson = $ | |
607 | + | let totalSupplyInUsd = $t02679426913._1 | |
608 | + | let totalBorrowInUsd = $t02679426913._2 | |
609 | + | let totalReservesInUsd = $t02679426913._3 | |
610 | + | let marketsJson = $t02679426913._4 | |
611 | 611 | let json = (((((((((("{" + "\"supplyInUsd\":") + assetToJson(usdtIdStr, totalSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalBorrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, totalReservesInUsd)) + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}") | |
612 | 612 | if (debug) | |
613 | 613 | then throw(json) | |
614 | 614 | else json | |
615 | 615 | } | |
616 | 616 | ||
617 | 617 | ||
618 | 618 | func getWalletOperationsJson (market,assetIdStr,wallet,debug) = { | |
619 | 619 | let marketAddress = addressFromStringValue(market) | |
620 | 620 | let marketData = getMarketData(marketAddress) | |
621 | 621 | let walletData = getWalletData(marketAddress, wallet, marketData._2, marketData._1._1, marketData._1._2, marketData._1._3, marketData._1._5, marketData._1._6, marketData._1._8, marketData._1._9, marketData._1._17, marketData._1._18) | |
622 | 622 | let assetIndex = getAssetIndex(marketData._1._1, assetIdStr) | |
623 | 623 | let json = (((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"market\":\"") + marketData._3) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, marketData._1._5[assetIndex])) + ",\"supply\":") + assetToJson(assetIdStr, marketData._1._10[assetIndex])) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, marketData._1._11[assetIndex])) + ",\"supplyApy\":") + amountToDecimal(marketData._1._17[assetIndex], Scale8)) + ",\"borrow\":") + assetToJson(assetIdStr, marketData._1._12[assetIndex])) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, marketData._1._13[assetIndex])) + ",\"borrowApy\":") + amountToDecimal(marketData._1._18[assetIndex], Scale8)) + ",\"reserves\":") + assetToJson(assetIdStr, marketData._1._14[assetIndex])) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, marketData._1._15[assetIndex])) + ",\"utilizationRatio\":") + amountToDecimal(marketData._1._16[assetIndex], Scale8)) + ",\"collateralFactor\":") + amountToDecimal(marketData._1._2[assetIndex], Scale8)) + ",\"liquidationThreshold\":") + amountToDecimal(marketData._1._3[assetIndex], Scale8)) + ",\"liquidationPenalty\":") + amountToDecimal(marketData._1._4[assetIndex], Scale8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, marketData._1._7[assetIndex])) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletData._1._1[assetIndex])) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletData._1._2[assetIndex])) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletData._1._3[assetIndex])) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletData._1._4[assetIndex])) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletData._1._5[assetIndex])) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletData._1._6[assetIndex])) + ",\"walletDailyLoanInterest\":") + assetToJson(assetIdStr, walletData._1._7[assetIndex])) + ",\"walletDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletData._1._8[assetIndex])) + ",\"accountHealth\":") + amountToDecimal(walletData._6, Scale8)) + ",\"netApy\":") + amountToDecimal(walletData._7, Scale8)) + "}") | |
624 | 624 | if (debug) | |
625 | 625 | then throw(json) | |
626 | 626 | else json | |
627 | 627 | } | |
628 | 628 | ||
629 | 629 | ||
630 | 630 |
github/deemru/w8io/3ef1775 103.03 ms ◑