tx · 6HLrMu99hjovDsZLTVLYoZjC2G2fSaVg8B564SxNAN5H

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.03700000 Waves

2022.12.26 17:02 [2377335] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "6HLrMu99hjovDsZLTVLYoZjC2G2fSaVg8B564SxNAN5H", "fee": 3700000, "feeAssetId": null, "timestamp": 1672063332811, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "539Wkxfbmtdmx4GiMwtqwhePaJisK5PzsQMWrMFK8xd7yBu5KT33hb3n7X2qQkXjgkLNbNhopgCHRKZnQ6U1a1Ug" ], "script": "base64:BgKwKQgCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIAEgQKAggBEgQKAggBEgQKAgEBEgMKAQESBQoDAQEBEgUKAwEIARIECgIBCBIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgRiaWczIgRiaWc0IgpzbGlwcGFnZTREIgt3YXZlc1N0cmluZyIFQW11bHQiBURjb252IgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIgpQb29sUHV0RGlzIg5Qb29sTWF0Y2hlckRpcyIMUG9vbFNodXRkb3duIg5pZHhQb29sQWRkcmVzcyIJaWR4UG9vbFN0IglpZHhMUEFzSWQiCWlkeEFtQXNJZCIJaWR4UHJBc0lkIgtpZHhBbXRBc0RjbSINaWR4UHJpY2VBc0RjbSILaWR4SUFtdEFzSWQiDWlkeElQcmljZUFzSWQiD2lkeEZhY3RTdGFrQ250ciISaWR4RmFjdG9yeVJlc3RDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciIKZmVlRGVmYXVsdCICdDEiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiAmYxIgN2YWwiD3Jlc3VsdFNjYWxlTXVsdCIMZnJvbVgxOFJvdW5kIgVyb3VuZCICdHMiA2FtdCIIcmVzU2NhbGUiCGN1clNjYWxlIgNhYnMiCWFic0JpZ0ludCICZmMiA21wayIEcG1wayICcGwiAnBoIgFoIgF0IgNwYXUiAnVhIgR0eElkIgNnYXUiAmFhIgJwYSIDYW1wIgNhZGEiBmtleUZlZSIDZmVlIgZrZXlETHAiFWtleURMcFJlZnJlc2hlZEhlaWdodCISa2V5RExwUmVmcmVzaERlbGF5IhZkTHBSZWZyZXNoRGVsYXlEZWZhdWx0Ig9kTHBSZWZyZXNoRGVsYXkiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiA3RvZSIDb3JWIgZzZW5kclYiBm1hdGNoViIEc3RyZiIEYWRkciIDa2V5IgRpbnRmIgh0aHJvd0VyciIDbXNnIgZmbXRFcnIiA2ZjYSIBQSIDaWdzIgJtcCITZmVlQ29sbGVjdG9yQWRkcmVzcyIDZ3BjIgVhbXRBcyIHcHJpY2VBcyIIaVByaWNlQXMiDHBhcnNlQXNzZXRJZCIFaW5wdXQiD2Fzc2V0SWRUb1N0cmluZyIPcGFyc2VQb29sQ29uZmlnIgpwb29sQ29uZmlnIhBwb29sQ29uZmlnUGFyc2VkIgskdDA3MzgzNzYxMiIOY2ZnUG9vbEFkZHJlc3MiDWNmZ1Bvb2xTdGF0dXMiDGNmZ0xwQXNzZXRJZCIQY2ZnQW1vdW50QXNzZXRJZCIPY2ZnUHJpY2VBc3NldElkIhZjZmdBbW91bnRBc3NldERlY2ltYWxzIhVjZmdQcmljZUFzc2V0RGVjaW1hbHMiEmNmZ0luQW1vdW50QXNzZWRJZCIRY2ZnSW5QcmljZUFzc2V0SWQiA2dmYyINZmFjdG9yeUNvbmZpZyIPc3Rha2luZ0NvbnRyYWN0Ig9zbGlwYWdlQ29udHJhY3QiC2d3eENvbnRyYWN0IgxyZXN0Q29udHJhY3QiEWRhdGFQdXRBY3Rpb25JbmZvIg1pbkFtdEFzc2V0QW10Ig9pblByaWNlQXNzZXRBbXQiCG91dExwQW10IgVwcmljZSIKc2xpcEJ5VXNlciIMc2xpcHBhZ2VSZWFsIgh0eEhlaWdodCILdHhUaW1lc3RhbXAiDHNsaXBhZ2VBbUFtdCIMc2xpcGFnZVByQW10IhFkYXRhR2V0QWN0aW9uSW5mbyIOb3V0QW10QXNzZXRBbXQiEG91dFByaWNlQXNzZXRBbXQiB2luTHBBbXQiDWdldEFjY0JhbGFuY2UiB2Fzc2V0SWQiBGNwYmkiCHByQW10WDE4IghhbUFtdFgxOCIFY3BiaXIiA3ZhZCICQTEiAkEyIghzbGlwcGFnZSIEZGlmZiIEcGFzcyICdmQiAkQxIgJEMCIEc2xwZyIEZmFpbCIDcGNwIgphbUFzc2V0RGNtIgpwckFzc2V0RGNtIgVhbUFtdCIFcHJBbXQiC2FtdEFzQW10WDE4IgpwckFzQW10WDE4IgpjYWxjUHJpY2VzIgVscEFtdCIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIgd0YWtlRmVlIgZhbW91bnQiCWZlZUFtb3VudCIDZWdvIgZ0eElkNTgiCnBtdEFzc2V0SWQiCHBtdExwQW10Igt1c2VyQWRkcmVzcyIEbHBJZCIEYW1JZCIEcHJJZCIFYW1EY20iBXByRGNtIgNzdHMiB2xwRW1pc3MiCWFtQmFsYW5jZSIMYW1CYWxhbmNlWDE4IglwckJhbGFuY2UiDHByQmFsYW5jZVgxOCILY3VyUHJpY2VYMTgiCGN1clByaWNlIgtwbXRMcEFtdFgxOCIKbHBFbWlzc1gxOCILb3V0QW1BbXRYMTgiC291dFByQW10WDE4IghvdXRBbUFtdCIIb3V0UHJBbXQiBXN0YXRlIgNlcG8iB2luQW1BbXQiBmluQW1JZCIHaW5QckFtdCIGaW5QcklkIgZpc0V2YWwiBmVtaXRMcCIKaXNPbmVBc3NldCIQdmFsaWRhdGVTbGlwcGFnZSIGcG10QW10IgVwbXRJZCIHYW1JZFN0ciIHcHJJZFN0ciIJaW5BbUlkU3RyIglpblBySWRTdHIiBmFtdERjbSIIcHJpY2VEY20iBGxwRW0iD2luQW1Bc3NldEFtdFgxOCIPaW5QckFzc2V0QW10WDE4Igx1c2VyUHJpY2VYMTgiAXIiC3NsaXBwYWdlWDE4Ig9zbGlwcGFnZVJlYWxYMTgiDWxwRW1pc3Npb25YMTgiCnByVmlhQW1YMTgiCmFtVmlhUHJYMTgiDGV4cGVjdGVkQW10cyIRZXhwQW10QXNzZXRBbXRYMTgiE2V4cFByaWNlQXNzZXRBbXRYMTgiCWNhbGNMcEFtdCIOY2FsY0FtQXNzZXRQbXQiDmNhbGNQckFzc2V0UG10IgxzbGlwcGFnZUNhbGMiCWVtaXRMcEFtdCIGYW1EaWZmIgZwckRpZmYiDSR0MDE4Mzg0MTg3MjkiCndyaXRlQW1BbXQiCndyaXRlUHJBbXQiC2NvbW1vblN0YXRlIgRnZXREIgJ4cCIDeHAwIgN4cDEiAXMiAWEiA2FubiILeHAwX3hwMV9uX24iBWFubl9zIgVhbm5fMSIJY2FsY0ROZXh0IgFkIgJkZCIDZGRkIgJkcCIEY2FsYyIDYWNjIgFpIgVkTmV4dCIIZERpZmZSYXciBWREaWZmIgNhcnIiDSR0MDIwNjU3MjA3MDUiAiRsIgIkcyIFJGFjYzAiBSRmMF8xIgIkYSICJGkiBSRmMF8yIgVmb3VuZCIHZ2V0RE9sZCIBbiIKYVByZWNpc2lvbiIQYW5uX3NfYVByZWNpc2lvbiIOYW5uX2FQcmVjaXNpb24iAm4xIgNjdXIiDSR0MDIxMzM0MjEzNTQiDSR0MDIxNzc1MjE4MjIiBWdldFlEIgFEIgF4IgFjIgFiIg0kdDAyMjMyMjIyMzQyIgF5IgV5TmV4dCIFeURpZmYiDSR0MDIyNjQ5MjI2OTYiB2NhbGNETHAiDWFtb3VudEJhbGFuY2UiDHByaWNlQmFsYW5jZSIKbHBFbWlzc2lvbiIKdXBkYXRlZERMcCIOY2FsY0N1cnJlbnRETHAiEGFtb3VudEFzc2V0RGVsdGEiD3ByaWNlQXNzZXREZWx0YSIUbHBBc3NldEVtaXNzaW9uRGVsdGEiEmFtb3VudEFzc2V0QmFsYW5jZSIRcHJpY2VBc3NldEJhbGFuY2UiD2xwQXNzZXRFbWlzc2lvbiIKY3VycmVudERMcCIScmVmcmVzaERMcEludGVybmFsIhdhbW91bnRBc3NldEJhbGFuY2VEZWx0YSIWcHJpY2VBc3NldEJhbGFuY2VEZWx0YSIHYWN0aW9ucyISdmFsaWRhdGVVcGRhdGVkRExwIgZvbGRETHAiG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZCIFb3JkZXIiEWFtb3VudEFzc2V0QW1vdW50IhBwcmljZUFzc2V0QW1vdW50Ig0kdDAyNDYzNTI0ODQ3IgNkTHAiDSR0MDI1MTc3MjUyNzciDXVudXNlZEFjdGlvbnMiBmRMcE5ldyIMaXNPcmRlclZhbGlkIgJjZyIDcG10IgJjcCIGY2FsbGVyIgdhbUFzUG10IgdwckFzUG10Ig1jYWxjUHV0T25lVGtuIglwbXRBbXRSYXciC3dpdGhUYWtlRmVlIg1jaGVjaEVtaXNzaW9uIg0kdDAyNzU0MzI4MDA1IgxhbUJhbGFuY2VPbGQiDHByQmFsYW5jZU9sZCINJHQwMjgwMTEyODE4NyILYW1BbW91bnRSYXciC3ByQW1vdW50UmF3Ig0kdDAyODE5MTI4NDMwIghhbUFtb3VudCIIcHJBbW91bnQiDGFtQmFsYW5jZU5ldyIMcHJCYWxhbmNlTmV3IgZjaGVja0QiCGxwQW1vdW50Ig5wb29sUHJvcG9ydGlvbiIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIJbHBBbXRCb3RoIgVib251cyITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAzMDQ4MDMwNTkxIgFAIgh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDMwNzgxMzEwODgiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIhFvdXRBc3NldElkT3JXYXZlcyIQc2VuZEZlZVRvTWF0Y2hlciIEYnVybiINJHQwMzE4NzMzMjIyMyIQZmVlQW1vdW50Rm9yQ2FsYyIQb3V0SW5BbW91bnRBc3NldCINJHQwMzIyMjYzMjMzNCIRcmVmcmVzaERMcEFjdGlvbnMiEWlzVXBkYXRlZERMcFZhbGlkIgFtIgckbWF0Y2gwIgJwbSICcGQiCWlzTWFuYWdlciICcGsiAm1tIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSICY20iA2hwbSIDY3BtIgRzbGlwIglhdXRvU3Rha2UiB2ZhY3RDZmciC3N0YWtpbmdDbnRyIghzbGlwQ250ciIKYW1Bc3NldFBtdCIKcHJBc3NldFBtdCIBZSIJbHBBc3NldElkIgJlbCIGbGVnYWN5IgJzYSICc3AiCGxwVHJuc2ZyIgJzcyINJHQwMzY0ODMzNjYyNSIFY2hlY2siFGxwQXNzZXRFbWlzc2lvbkFmdGVyIiBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCINaXNQdXREaXNhYmxlZCIGY2hlY2tzIg0kdDAzODUzMTM4Njg5Igdlc3RpbUxQIg0kdDAzOTUwNDM5ODUzIhRwYXltZW50SW5BbW91bnRBc3NldCINJHQwMzk4NTYzOTk2NCIHbWF4U2xwZyIGZXN0UHV0Ig0kdDA0MDk5NDQxMDU5IglvdXRBbXRBbXQiDSR0MDQyMjMyNDIzMTQiDWlzR2V0RGlzYWJsZWQiDSR0MDQyOTMyNDMwODciGGxhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCIdY2hlY2tMYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQiDSR0MDQzNjExNDM2NzUiEGRMcFVwZGF0ZUFjdGlvbnMiDWxwQXNzZXRBbW91bnQiBWluZGV4IgRuZXdZIgJkeSILdG90YWxHZXRSYXciDSR0MDQ0NjA1NDQ2NTQiDSR0MDQ1MDI5NDUxNDQiDnN1bU9mR2V0QXNzZXRzIhJub0xlc3NUaGVuQW10QXNzZXQiFG5vTGVzc1RoZW5QcmljZUFzc2V0IgNhYWIiA3BhYiIDbGFlIgRsYWVhIhRidXJuTFBBc3NldE9uRmFjdG9yeSINJHQwNDY2ODM0Njc2NCINY2hlY2tQYXltZW50cyIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiDSR0MDQ3Nzg4NDc4NjkiDXVuc3Rha2VBbW91bnQiFW5vTGVzc1RoZW5BbW91bnRBc3NldCIDcmVzIgxjaGVja0Ftb3VudHMiDSR0MDQ5MTE3NDkxOTgiDSR0MDUwMDkzNTAyODEiEHBheW1lbnRBbW91bnRSYXciDnBheW1lbnRBc3NldElkIg0kdDA1MDQwOTUwNTEyIg0kdDA1MDY2MDUwNzY0IghhbXRBc1N0ciIHcHJBc1N0ciIBayICcHIiDHJlc1NjYWxlTXVsdCIHdXNyQWRkciIHcG10QXNJZCICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5IgptYXRjaGVyUHViIgpvcmRlclZhbGlkIgtzZW5kZXJWYWxpZCIMbWF0Y2hlclZhbGlkIgduZXdIYXNoIgthbGxvd2VkSGFzaCILY3VycmVudEhhc2h9AAFhAIDC1y8AAWIJALYCAQCAwtcvAAFjCQC2AgEAgICQu7rWrfANAAFkCQC2AgEAAAABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEAAgABaAkAtgIBAAMAAWkJALYCAQAEAAFqCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABawIFV0FWRVMAAWwCAzEwMAABbQIBMQABbgICX18AAW8CAAABcAABAAFxAAIAAXIAAwABcwAEAAF0AAEAAXUAAgABdgADAAF3AAQAAXgABQABeQAGAAF6AAcAAUEACAABQgAJAAFDAAEAAUQABgABRQAHAAFGAAoAAUcJAGsDAAoFAWEAkE4BAUgCAUkBSgkAvAIDCQC2AgEFAUkFAWMJALYCAQUBSgEBSwIBTAFNCQCgAwEJALwCAwUBTAkAtgIBBQFNBQFjAQFOAwFMAU0BTwkAoAMBCQC9AgQFAUwJALYCAQUBTQUBYwUBTwEBUAMBUQFSAVMJAGsDBQFRBQFSBQFTAQFUAQFMAwkAvwICBQFkBQFMCQC+AgEFAUwFAUwBAVUBAUwDCQC/AgIFAWQFAUwJAL4CAQUBTAUBTAEBVgACEyVzX19mYWN0b3J5Q29udHJhY3QBAVcAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBWAACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBWQACESVzJXNfX3ByaWNlX19sYXN0AQFaAgJhYQJhYgkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAmFhCQDMCAIJAKQDAQUCYWIFA25pbAUBbgECYWMCAmFkAmFlCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUCYWQCAl9fBQJhZQECYWYCAmFkAmFlCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX0dfXwUCYWQCAl9fBQJhZQECYWcAAg8lc19fYW1vdW50QXNzZXQBAmFoAAIOJXNfX3ByaWNlQXNzZXQBAmFpAAIHJXNfX2FtcAECYWoAAg0lc19fYWRkb25BZGRyAAJhawIHJXNfX2ZlZQACYWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWsFAUcAAmFtCQC5CQIJAMwIAgICJXMJAMwIAgIDZExwBQNuaWwFAW4AAmFuCQC5CQIJAMwIAgICJXMJAMwIAgISZExwUmVmcmVzaGVkSGVpZ2h0BQNuaWwFAW4AAmFvCQC5CQIJAMwIAgICJXMJAMwIAgIPcmVmcmVzaERMcERlbGF5BQNuaWwFAW4AAmFwAAEAAmFxCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFvBQJhcAECYXIAAhElc19fZmFjdG9yeUNvbmZpZwECYXMAAhglcyVzX19tYXRjaGVyX19wdWJsaWNLZXkBAmF0AgJhdQJhdgkArAICCQCsAgIJAKwCAgkArAICAgglZCVkJXNfXwUCYXUCAl9fBQJhdgIIX19jb25maWcBAmF3AQJheAkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQJheAECYXkAAgwlc19fc2h1dGRvd24BAmF6AAIdJXNfX2FsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gBAmFBAAIXJXNfX2ZlZUNvbGxlY3RvckFkZHJlc3MBAmFCAwJhQwJhRAJhRQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhFGYWlsZWQ6IG9yZFZhbGlkPQkApQMBBQJhQwILIHNuZHJWYWxpZD0JAKUDAQUCYUQCDCBtdGNoclZhbGlkPQkApQMBBQJhRQECYUYCAmFHAmFICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYUcFAmFICQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmFHCQDMCAICAS4JAMwIAgUCYUgJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUkCAmFHAmFICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYUcFAmFICQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmFHCQDMCAICAS4JAMwIAgUCYUgJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUoBAmFLCQACAQkAuQkCCQDMCAICD2xwX3N0YWJsZS5yaWRlOgkAzAgCBQJhSwUDbmlsAgEgAQJhTAECYUsJALkJAgkAzAgCAg9scF9zdGFibGUucmlkZToJAMwIAgUCYUsFA25pbAIBIAACYU0JARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhRgIFBHRoaXMJAQFWAAACYU4JAQJhRgIFBHRoaXMJAQJhaQABAmFPAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhTQkBAmF5AAcBAmFQAAkA2QQBCQECYUYCBQJhTQkBAmFzAAACYVEJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhRgIFAmFNCQECYUEAAQJhUgAEAmFTCQECYUYCBQR0aGlzCQECYWcABAJhVAkBAmFGAgUEdGhpcwkBAmFoAAQCYVUJAQJhSQIFAmFNCQECYXcBBQJhVAQCYXUJAQJhSQIFAmFNCQECYXcBBQJhUwkAtQkCCQECYUYCBQJhTQkBAmF0AgkApAMBBQJhdQkApAMBBQJhVQUBbgECYVYBAmFXAwkAAAIFAmFXBQFrBQR1bml0CQDZBAEFAmFXAQJhWAECYVcDCQAAAgUCYVcFBHVuaXQFAWsJANgEAQkBBXZhbHVlAQUCYVcBAmFZAQJhWgkAmwoJCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFaBQF0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYVoFAXUJANkEAQkAkQMCBQJhWgUBdgkBAmFWAQkAkQMCBQJhWgUBdwkBAmFWAQkAkQMCBQJhWgUBeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFaBQF5CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYVoFAXoJANkEAQkAkQMCBQJhWgUBQQkA2QQBCQCRAwIFAmFaBQFCAAJiYQkBAmFZAQkBAmFSAAACYmIFAmJhAAJiYwgFAmJiAl8xAAJiZAgFAmJiAl8yAAJiZQgFAmJiAl8zAAJiZggFAmJiAl80AAJiZwgFAmJiAl81AAJiaAgFAmJiAl82AAJiaQgFAmJiAl83AAJiaggFAmJiAl84AAJiawgFAmJiAl85AQJibAAJALUJAgkBAmFGAgUCYU0JAQJhcgAFAW4AAmJtCQECYmwAAAJibgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYm0FAUMCIEludmFsaWQgc3Rha2luZyBjb250cmFjdCBhZGRyZXNzAAJibwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYm0FAUUCIEludmFsaWQgc2xpcGFnZSBjb250cmFjdCBhZGRyZXNzAAJicAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYm0FAUYCHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MAAmJxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJibQUBRAIcSW52YWxpZCBnd3ggY29udHJhY3QgYWRkcmVzcwECYnIKAmJzAmJ0AmJ1AmJ2AmJ3AmJ4AmJ5AmJ6AmJBAmJCCQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJicwkAzAgCCQCkAwEFAmJ0CQDMCAIJAKQDAQUCYnUJAMwIAgkApAMBBQJidgkAzAgCCQCkAwEFAmJ3CQDMCAIJAKQDAQUCYngJAMwIAgkApAMBBQJieQkAzAgCCQCkAwEFAmJ6CQDMCAIJAKQDAQUCYkEJAMwIAgkApAMBBQJiQgUDbmlsBQFuAQJiQwYCYkQCYkUCYkYCYnYCYnkCYnoJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJiRAkAzAgCCQCkAwEFAmJFCQDMCAIJAKQDAQUCYkYJAMwIAgkApAMBBQJidgkAzAgCCQCkAwEFAmJ5CQDMCAIJAKQDAQUCYnoFA25pbAUBbgECYkcBAmJIAwkAAAIFAmJIAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQJiSAECYkkCAmJKAmJLCQC8AgMFAmJKBQFjBQJiSwECYkwDAmJKAmJLAU8JAL0CBAUCYkoFAWMFAmJLBQFPAQJiTQMCYk4CYk8CYlAEAmJRCQC8AgMJALgCAgUCYk4FAmJPBQFiBQJiTwQCYlIJAL8CAgkAuAICBQJiUAkBAVQBBQJiUQUBZAMJAQEhAQUCYlIJAAIBCQCsAgICCkJpZyBzbHBnOiAJAKYDAQUCYlEJAJQKAgUCYlIJAJkDAQkAzAgCBQJiTgkAzAgCBQJiTwUDbmlsAQJiUwMCYlQCYlUCYlYEAmJRCQC8AgMFAmJVBQFiBQJiVAQCYlcJAL8CAgUCYlYFAmJRAwMFAmJXBgkAvwICBQJiVQUCYlQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCmAwEFAmJVAgEgCQCmAwEFAmJUAgEgCQCmAwEFAmJRAgEgCQCmAwEFAmJWBQJiVwECYlgEAmJZAmJaAmNhAmNiBAJjYwkBAUgCBQJjYQUCYlkEAmNkCQEBSAIFAmNiBQJiWgkBAmJJAgUCY2QFAmNjAQJjZQMCY2ECY2ICY2YEAmNnBQJiaAQCY2gFAmJpBAJjaQkBAmJYBAUCY2cFAmNoBQJjYQUCY2IEAmJLCQEBSAIFAmNhBQJjZwQCYkoJAQFIAgUCY2IFAmNoBAJjagkBAUgCBQJjZgUBYQQCY2sJAQJiSQIFAmJLBQJjagQCY2wJAQJiSQIFAmJKBQJjagkAzAgCBQJjaQkAzAgCBQJjawkAzAgCBQJjbAUDbmlsAQJjbQMCY2ECY2ICY2YEAmNuCQECY2UDBQJjYQUCY2IFAmNmCQDMCAIJAQFLAgkAkQMCBQJjbgAABQFhCQDMCAIJAQFLAgkAkQMCBQJjbgABBQFhCQDMCAIJAQFLAgkAkQMCBQJjbgACBQFhBQNuaWwBAmNvAQJjcAQCY3EJAGsDBQJjcAUCYWwFAWEJAJQKAgkAZQIFAmNwBQJjcQUCY3EBAmNyBAJjcwJjdAJjdQJjdgQCY3cFAmJlBAJjeAkA2AQBCQEFdmFsdWUBBQJiZgQCY3kJANgEAQkBBXZhbHVlAQUCYmcEAmN6BQJiaAQCY0EFAmJpBAJjQgkApAMBBQJiZAQCY0MICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCY3cCC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgkA2AQBBQJjdwUCY3QJAAIBAg9Xcm9uZyBwbXQgYXNzZXQEAmNECQECYkcBBQJjeAQCY0UJAQFIAgUCY0QFAmN6BAJjRgkBAmJHAQUCY3kEAmNHCQEBSAIFAmNGBQJjQQQCY0gJAQJiSQIFAmNHBQJjRQQCY0kJAQFLAgUCY0gFAWEEAmNKCQEBSAIFAmN1BQFhBAJjSwkBAUgCBQJjQwUBYQQCY0wJALwCAwUCY0UFAmNKBQJjSwQCY00JALwCAwUCY0cFAmNKBQJjSwQCY04JAQFOAwUCY0wFAmN6BQVGTE9PUgQCY08JAQFOAwUCY00FAmNBBQVGTE9PUgQCY1ADCQAAAgUCY3MCAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmN2BQJjTgMJAAACBQJjeAIFV0FWRVMFBHVuaXQJANkEAQUCY3gJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY3YFAmNPAwkAAAIFAmN5AgVXQVZFUwUEdW5pdAkA2QQBBQJjeQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWYCCQClCAEFAmN2BQJjcwkBAmJDBgUCY04FAmNPBQJjdQUCY0kFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFZAAUCY0kJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFaAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY0kFA25pbAkAnAoKBQJjTgUCY08FAmN4BQJjeQUCY0QFAmNGBQJjQwUCY0gFAmNCBQJjUAECY1ENAmNzAmJQAmNSAmNTAmNUAmNVAmN2AmNWAmNXAmNYAmNZAmNaAmRhBAJjdwUCYmUEAmRiCQDYBAEJAQV2YWx1ZQEFAmJmBAJkYwkA2AQBCQEFdmFsdWUBBQJiZwQCZGQFAmJqBAJkZQUCYmsEAmRmBQJiaAQCZGcFAmJpBAJjQgkApAMBBQJiZAQCZGgICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCY3cCCFdyIGxwIGFzCHF1YW50aXR5BAJjRAMFAmNWCQECYkcBBQJkYgMDBQJjWAkAAAIFAmRhBQJkYgcJAGUCCQECYkcBBQJkYgUCY1oDBQJjWAkBAmJHAQUCZGIJAGUCCQECYkcBBQJkYgUCY1IEAmNGAwUCY1YJAQJiRwEFAmRjAwMFAmNYCQAAAgUCZGEFAmRjBwkAZQIJAQJiRwEFAmRjBQJjWgMFAmNYCQECYkcBBQJkYwkAZQIJAQJiRwEFAmRjBQJjVAQCZGkJAQFIAgUCY1IFAmRmBAJkagkBAUgCBQJjVAUCZGcEAmRrCQECYkkCBQJkagUCZGkEAmNFCQEBSAIFAmNEBQJkZgQCY0cJAQFIAgUCY0YFAmRnBAJkbAMJAAACBQJkaAAABAJjSAUBZAQCZG0FAWQEAmNqCQB2BgkAuQICBQJkaQUCZGoAAAkAtgIBAAUAAQAABQRET1dOCQCXCgUJAQFLAgUCY2oFAWEJAQFLAgUCZGkFAmRmCQEBSwIFAmRqBQJkZwkBAmJJAgkAtwICBQJjRwUCZGoJALcCAgUCY0UFAmRpBQJkbQQCY0gJAQJiSQIFAmNHBQJjRQQCZG4JALwCAwkBAVQBCQC4AgIFAmNIBQJkawUBYwUCY0gEAmRtCQEBSAIFAmJQBQFhAwMDBQJjWQkBAiE9AgUCY0gFAWQHCQC/AgIFAmRuBQJkbQcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUCZG4CAyA+IAkApgMBBQJkbQQCZG8JAQFIAgUCZGgFAWEEAmRwCQC9AgQFAmRpCQECYkwDBQJjRwUCY0UFB0NFSUxJTkcFAWMFB0NFSUxJTkcEAmRxCQC9AgQFAmRqBQFjCQECYkwDBQJjRwUCY0UFBUZMT09SBQdDRUlMSU5HBAJkcgMJAL8CAgUCZHAFAmRqCQCUCgIFAmRxBQJkagkAlAoCBQJkaQUCZHAEAmRzCAUCZHICXzEEAmR0CAUCZHICXzIEAmNqCQC9AgQFAmRvBQJkdAUCY0cFBUZMT09SCQCXCgUJAQFOAwUCY2oFAWEFBUZMT09SCQEBTgMFAmRzBQJkZgUHQ0VJTElORwkBAU4DBQJkdAUCZGcFB0NFSUxJTkcFAmNIBQJkbQQCZHUIBQJkbAJfMQQCZHYIBQJkbAJfMgQCZHcIBQJkbAJfMwQCY0kJAQFLAggFAmRsAl80BQFhBAJkeAkBAUsCCAUCZGwCXzUFAWEDCQBnAgAABQJkdQkAAgECB0xQIDw9IDAEAmR5AwkBASEBBQJjVwAABQJkdQQCZHoJAGUCBQJjUgUCZHYEAmRBCQBlAgUCY1QFAmR3BAJkQgMDBQJjWAkAAAIFAmRhBQJkYgcJAJQKAgUCY1oAAAMDBQJjWAkAAAIFAmRhBQJkYwcJAJQKAgAABQJjWgkAlAoCBQJkdgUCZHcEAmRDCAUCZEICXzEEAmRECAUCZEICXzIEAmRFCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWQAFAmNJCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNJCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwIFAmN2BQJjcwkBAmJyCgUCZEMFAmREBQJkeQUCY0kFAmJQBQJkeAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZHoFAmRBBQNuaWwJAJ8KDQUCZHUFAmR5BQJjSQUCY0QFAmNGBQJkaAUCY3cFAmNCBQJkRQUCZHoFAmRBBQJjUwUCY1UBAmRGAQJkRwQCZEgJAJEDAgUCZEcAAAQCZEkJAJEDAgUCZEcAAQQCZEoJALcCAgUCZEgFAmRJAwkAAAIFAmRKBQFlBQFlBAJkSwkBDXBhcnNlSW50VmFsdWUBBQJhTgQCZEwJAGgCBQJkSwACBAJjbgkAvAIDBQJkSAUCZEkFAWYEAmRNCQC8AgMFAmNuBQFpBQFmBAJkTgkAvAIDCQC2AgEFAmRMBQJkSgUBZgQCZE8JALYCAQkAZQIFAmRMAAEKAQJkUAECZFEEAmRSCQC8AgMFAmRRBQJkUQUBZgQCZFMJALwCAwUCZFIFAmRRBQFmBAJkVAkAvAIDBQJkUwUBZgUCZE0JAL0CBAkAtwICBQJkTgkAvAIDBQJkVAUBZwUBZgUCZFEJALcCAgkAvAIDBQJkTwUCZFEFAWYJALwCAwUBaAUCZFQFAWYFB0NFSUxJTkcKAQJkVQICZFYCZFcDCAUCZFYCXzIFAmRWBAJkUQgFAmRWAl8xBAJkWAkBAmRQAQUCZFEEAmRZCQCgAwEJALgCAgUCZFgJAQV2YWx1ZQEFAmRRBAJkWgMJAGYCAAAFAmRZCQEBLQEFAmRZBQJkWQMJAGcCAAEFAmRaCQCUCgIFAmRYBgkAlAoCBQJkWAcEAmVhCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwEAmViCgACZWMFAmVhCgACZWQJAJADAQUCZWMKAAJlZQkAlAoCBQJkSgcKAQJlZgICZWcCZWgDCQBnAgUCZWgFAmVkBQJlZwkBAmRVAgUCZWcJAJEDAgUCZWMFAmVoCgECZWkCAmVnAmVoAwkAZwIFAmVoBQJlZAUCZWcJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmVpAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgUCZWUAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZFEIBQJlYgJfMQQCZWoIBQJlYgJfMgMFAmVqBQJkUQkAAgEJAKwCAgIZRCBjYWxjdWxhdGlvbiBlcnJvciwgRCA9IAkApgMBBQJkUQECZWsBAmRHBAJlbAUBZwQCZEgJAJEDAgUCZEcAAAQCZEkJAJEDAgUCZEcAAQQCZW0JAKcDAQUBbAQCZEsJALkCAgkApwMBBQJhTgUCZW0EAmRKCQC3AgIFAmRIBQJkSQMJAAACBQJkSgUBZQUBZQQCZEwJALkCAgUCZEsFAmVsBAJkTQkAuQICCQC5AgIJALkCAgUCZEgFAmRJBQJlbAUCZWwEAmVuCQC6AgIJALkCAgUCZEwFAmRKBQJlbQQCZW8JALgCAgUCZEwFAmVtBAJlcAkAtwICBQJlbAUBZgoBAmRVAgJkVgJlcQQCZXIFAmRWBAJkUQgFAmVyAl8xBAJlaggFAmVyAl8yAwkBAiE9AgUCZWoFBHVuaXQFAmRWBAJkVAkAugICCQC5AgIJALkCAgUCZFEFAmRRBQJkUQUCZE0EAmRYCQC6AgIJALkCAgkAtwICBQJlbgkAuQICBQJkVAUCZWwFAmRRCQC3AgIJALoCAgkAuQICBQJlbwUCZFEFAmVtCQC5AgIFAmVwBQJkVAQCZFoJAQFVAQkAuAICBQJkWAkBBXZhbHVlAQUCZFEDCQDAAgIFAWYFAmRaCQCUCgIFAmRYBQJlcQkAlAoCBQJkWAUEdW5pdAQCZWEJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZXMKAAJlYwUCZWEKAAJlZAkAkAMBBQJlYwoAAmVlCQCUCgIFAmRKBQR1bml0CgECZWYCAmVnAmVoAwkAZwIFAmVoBQJlZAUCZWcJAQJkVQIFAmVnCQCRAwIFAmVjBQJlaAoBAmVpAgJlZwJlaAMJAGcCBQJlaAUCZWQFAmVnCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJlaQIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIJAQJlZgIFAmVlAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmRRCAUCZXMCXzEEAmVqCAUCZXMCXzIDCQECIT0CBQJlagUEdW5pdAUCZFEJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUCZFEBAmV0AwJkRwJkVwJldQQCZWwFAWcEAmV2CQCRAwIFAmRHAwkAAAIFAmRXAAAAAQAABAJlbQkApwMBBQFsBAJkSwkAuQICCQCnAwEFAmFOBQJlbQQCZEoFAmV2BAJkTAkAuQICBQJkSwUCZWwEAmV3CQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUCZXUFAmV1CQC5AgIFAmV2BQJlbAUCZXUFAmVtCQC5AgIFAmRMBQJlbAQCZXgJALgCAgkAtwICBQJkSgkAugICCQC5AgIFAmV1BQJlbQUCZEwFAmV1CgECZFUCAmRWAmVxBAJleQUCZFYEAmV6CAUCZXkCXzEEAmVqCAUCZXkCXzIDCQECIT0CBQJlagUEdW5pdAUCZFYEAmVBCQC6AgIJALcCAgkAuQICBQJlegUCZXoFAmV3CQC3AgIJALkCAgUBZwUCZXoFAmV4BAJlQgkBAVUBCQC4AgIFAmVBCQEFdmFsdWUBBQJlegMJAMACAgUBZgUCZUIJAJQKAgUCZUEFAmVxCQCUCgIFAmVBBQR1bml0BAJlYQkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlQwoAAmVjBQJlYQoAAmVkCQCQAwEFAmVjCgACZWUJAJQKAgUCZXUFBHVuaXQKAQJlZgICZWcCZWgDCQBnAgUCZWgFAmVkBQJlZwkBAmRVAgUCZWcJAJEDAgUCZWMFAmVoCgECZWkCAmVnAmVoAwkAZwIFAmVoBQJlZAUCZWcJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmVpAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgkBAmVmAgUCZWUAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZXoIBQJlQwJfMQQCZWoIBQJlQwJfMgMJAQIhPQIFAmVqBQR1bml0BQJlegkAAgEJAKwCAgIZWSBjYWxjdWxhdGlvbiBlcnJvciwgWSA9IAkApgMBBQJlegECZUQDAmVFAmVGAmVHBAJlSAkAvAIDCQECZEYBCQDMCAIFAmVFCQDMCAIFAmVGBQNuaWwFAWMFAmVHAwkAAAIFAmVHBQFlBQFlBQJlSAECZUkDAmVKAmVLAmVMBAJlTQkAuAICCQC2AgEJAQJiRwEJAQJhWAEFAmJmBQJlSgQCZU4JALgCAgkAtgIBCQECYkcBCQECYVgBBQJiZwUCZUsEAmVPCQC4AgIJALYCAQgJAQV2YWx1ZQEJAOwHAQUCYmUIcXVhbnRpdHkFAmVMBAJlUAkBAmVEAwUCZU0FAmVOBQJlTwUCZVABAmVRAwJlUgJlUwJlTAQCZU0JAGQCCQECYkcBCQECYVgBBQJiZgUCZVIEAmVOCQBkAgkBAmJHAQkBAmFYAQUCYmcFAmVTBAJlTwkAZAIICQEFdmFsdWUBCQDsBwEFAmJlCHF1YW50aXR5BQJlTAQCZUgJAQJlRAMJALYCAQUCZU0JALYCAQUCZU4JALYCAQUCZU8EAmVUCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJhbgUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIFAmFtCQCmAwEFAmVIBQNuaWwJAJQKAgUCZVQFAmVIAQJlVQICZVYCZUgDCQDAAgIFAmVIBQJlVgYJAQJhSgECInVwZGF0ZWQgRExwIGxvd2VyIHRoYW4gY3VycmVudCBETHABAmVXAQJlWAQCZVkIBQJlWAZhbW91bnQEAmVaCQBuBAgFAmVYBmFtb3VudAgFAmVYBXByaWNlBQFhBQVGTE9PUgQCZmEDCQAAAggFAmVYCW9yZGVyVHlwZQUDQnV5CQCUCgIFAmVZCQEBLQEFAmVaCQCUCgIJAQEtAQUCZVkFAmVaBAJlUggFAmZhAl8xBAJlUwgFAmZhAl8yAwMDCQECYU8ABgkAAAIFAmJkBQFyBgkAAAIFAmJkBQFzCQACAQINQWRtaW4gYmxvY2tlZAMDCQECIT0CCAgFAmVYCWFzc2V0UGFpcgthbW91bnRBc3NldAUCYmYGCQECIT0CCAgFAmVYCWFzc2V0UGFpcgpwcmljZUFzc2V0BQJiZwkAAgECCVdyIGFzc2V0cwQCZmIJAKcDAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUCYW0EAmZjCQECZVEDBQJlUgUCZVMAAAQCZmQIBQJmYwJfMQQCZmUIBQJmYwJfMgQCZmYJAMACAgUCZmUFAmZiBQJmZgECZmcBAmRXAwkBAiE9AgkAkAMBCAUCZFcIcGF5bWVudHMAAQkAAgECCjEgcG1udCBleHAEAmZoCQEFdmFsdWUBCQCRAwIIBQJkVwhwYXltZW50cwAABAJjdAkBBXZhbHVlAQgFAmZoB2Fzc2V0SWQEAmNaCAUCZmgGYW1vdW50BAJkbAkBAmNyBAkA2AQBCAUCZFcNdHJhbnNhY3Rpb25JZAkA2AQBBQJjdAUCY1oIBQJkVwZjYWxsZXIEAmNOCAUCZGwCXzEEAmNPCAUCZGwCXzIEAmNCCQENcGFyc2VJbnRWYWx1ZQEIBQJkbAJfOQQCY1AIBQJkbANfMTADAwkBAmFPAAYJAAACBQJjQgUBcwkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmNCCQCXCgUFAmNOBQJjTwUCY1oFAmN0BQJjUAECZmkKAmZqAmFlAmZrAmZsAmJQAmNXAmNYAmNZAmNaAmRhBAJkbAkBAmNRDQUCYWUFAmJQCAkBBXZhbHVlAQUCZmsGYW1vdW50CAkBBXZhbHVlAQUCZmsHYXNzZXRJZAgJAQV2YWx1ZQEFAmZsBmFtb3VudAgJAQV2YWx1ZQEFAmZsB2Fzc2V0SWQFAmZqCQAAAgUCYWUCAAUCY1cFAmNYBQJjWQUCY1oFAmRhBAJjQgkBDXBhcnNlSW50VmFsdWUBCAUCZGwCXzgDAwMJAQJhTwAGCQAAAgUCY0IFAXEGCQAAAgUCY0IFAXMJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmNCBQJkbAECZm0FAmZuAmN0AmN2AmFlAmZvBAJjeAkA2AQBCQEFdmFsdWUBBQJiZgQCY3kJANgEAQkBBXZhbHVlAQUCYmcEAmN3BQJiZQQCZGYFAmJoBAJkZwUCYmkEAmVPCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCY3cCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmZwAwkAvwICBQJlTwUBZQYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFAmZwBQJmcAQCY0QJAQJiRwEFAmN4BAJjRgkBAmJHAQUCY3kEAmZxAwkAAAIFAmFlAgAJAJQKAgUCY0QFAmNGAwkAAAIFAmN0BQJjeAMJAGYCBQJmbgUCY0QJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIJAGUCBQJjRAUCZm4FAmNGAwkAAAIFAmN0BQJjeQMJAGYCBQJmbgUCY0YJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIFAmNECQBlAgUCY0YFAmZuCQACAQIQd3JvbmcgcG10QXNzZXRJZAQCZnIIBQJmcQJfMQQCZnMIBQJmcQJfMgQCZnQDCQAAAgUCY3QFAmN4CQCUCgIFAmZuAAADCQAAAgUCY3QFAmN5CQCUCgIAAAUCZm4JAAIBAg9pbnZhbGlkIHBheW1lbnQEAmZ1CAUCZnQCXzEEAmZ2CAUCZnQCXzIEAmZ3AwUCZm8JAJUKAwgJAQJjbwEFAmZ1Al8xCAkBAmNvAQUCZnYCXzEICQECY28BBQJmbgJfMgkAlQoDBQJmdQUCZnYAAAQCZngIBQJmdwJfMQQCZnkIBQJmdwJfMgQCY3EIBQJmdwJfMwQCZnoJAGQCBQJmcgUCZngEAmZBCQBkAgUCZnMFAmZ5BAJiVQkBAmRGAQkAzAgCCQC2AgEFAmZyCQDMCAIJALYCAQUCZnMFA25pbAQCYlQJAQJkRgEJAMwIAgkAtgIBBQJmegkAzAgCCQC2AgEFAmZBBQNuaWwEAmZCAwkAvwICBQJiVAUCYlUGCQEFdGhyb3cAAwkAAAIFAmZCBQJmQgQCZkMJAL0CBAUCZU8JALgCAgUCYlQFAmJVBQJiVQUFRkxPT1IEAmNJCQEBSwIJAQJiSQIJAQFIAgUCZkEFAmRnCQEBSAIFAmZ6BQJkZgUBYQQCZEUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFZAAUCY0kJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFaAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY0kJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFjAgUCY3YFAmFlCQECYnIKBQJmdQUCZnYJAKADAQUCZkMFAmNJAAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQCZkQJAGsDBQJmcwUBYQUCZnIEAmZFCQBrAwUCZm4FAWEJAGQCBQJmRAUBYQQCZkYJAGUCBQJmbgUCZkUEAmZHCQC8AgMFAmVPCQC2AgEFAmZGCQC2AgEFAmZzBAJmSAkAoAMBCQC8AgMJALgCAgUCZkMFAmZHBQFiBQJmRwkAlgoECQCgAwEFAmZDBQJkRQUCY3EFAmZICQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmSQYCZkoCZksCZkwCZmoCZk0CZk4EAmN3CQDYBAEJAQV2YWx1ZQEFAmJlBAJjeAkA2AQBCQEFdmFsdWUBBQJiZgQCY3kJANgEAQkBBXZhbHVlAQUCYmcEAmZPBQJiaAQCZlAFAmJpBAJmUQUCYmQEAmN2AwkAAAIFAmZqBQJicQUCZk0FAmZqBAJmaAkBBXZhbHVlAQkAkQMCBQJmTAAABAJjdAkBBXZhbHVlAQgFAmZoB2Fzc2V0SWQEAmNaCAUCZmgGYW1vdW50BAJlUAkBAmVJAwUBZQUBZQUBZQMJAAACBQJlUAUCZVAEAmNzCQDYBAEFAmZOAwkBAiE9AgUCY3cJANgEAQUCY3QJAAIBAghXcm9uZyBMUAQCY0QJAQJiRwEFAmN4BAJjRgkBAmJHAQUCY3kEAmZSCgACZlMJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJmSgkAzAgCBQJjWgUDbmlsBQNuaWwDCQABAgUCZlMCCihJbnQsIEludCkFAmZTCQACAQkArAICCQADAQUCZlMCHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkDCQAAAgUCZlIFAmZSBAJjcQgFAmZSAl8yBAJmVAgFAmZSAl8xBAJmVQMDCQBmAgUCZksAAAkAZgIFAmZLBQJmVAcJAQJhSgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZksFA25pbAIABQJmVAQCZlYDCQAAAgUCZkoFAmN4CQCWCgQFAmZVAAAJAGUCCQBlAgUCY0QFAmZVBQJjcQUCY0YDCQAAAgUCZkoFAmN5CQCWCgQAAAUCZlUFAmNECQBlAgkAZQIFAmNGBQJmVQUCY3EJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCZlcIBQJmVgJfMQQCZlgIBQJmVgJfMgQCZnoIBQJmVgJfMwQCZkEIBQJmVgJfNAQCZlkJAQJiSQIJAQFIAgUCZkEFAmZQCQEBSAIFAmZ6BQJmTwQCZloJAQFLAgUCZlkFAWEEAmdhAwkAAAIFAmZKAgVXQVZFUwUEdW5pdAkA2QQBBQJmSgQCZ2IDCQBmAgUCY3EAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhUQUCY3EFAmdhBQNuaWwFA25pbAQCY1AJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjdgUCZlUFAmdhCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZgIJAKUIAQUCY3YFAmNzCQECYkMGBQJmVwUCZlgFAmNaBQJmWgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVkABQJmWgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVoCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJmWgUDbmlsBQJnYgMJAAACBQJjUAUCY1AEAmdjCQD8BwQFAmFNAgRidXJuCQDMCAIFAmNaBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmN0BQJjWgUDbmlsAwkAAAIFAmdjBQJnYwQCZ2QEAmdlAwkAAAIFBHRoaXMFAmFRAAAFAmNxBAJnZgMJAAACCQECYVYBBQJmSgUCYmYGBwMFAmdmCQCUCgIJAQEtAQkAZAIFAmZUBQJnZQAACQCUCgIAAAkBAS0BCQBkAgUCZlQFAmdlBAJlUggFAmdkAl8xBAJlUwgFAmdkAl8yBAJnZwkBAmVRAwUCZVIFAmVTAAAEAmdoCAUCZ2cCXzEEAmVICAUCZ2cCXzIEAmdpCQECZVUCBQJlUAUCZUgDCQAAAgUCZ2kFAmdpCQCUCgIJAM4IAgUCY1AFAmdoBQJmVQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZ2oABAJnawkAoggBCQEBVwADCQABAgUCZ2sCBlN0cmluZwQCZEoFAmdrCQDZBAEFAmRKAwkAAQIFAmdrAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmdsAAQCZ2sJAKIIAQkBAVgAAwkAAQIFAmdrAgZTdHJpbmcEAmRKBQJnawkA2QQBBQJkSgMJAAECBQJnawIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJnbQkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJnbgECZFcEAmdrCQECZ2oAAwkAAQIFAmdrAgpCeXRlVmVjdG9yBAJnbwUCZ2sJAAACCAUCZFcPY2FsbGVyUHVibGljS2V5BQJnbwMJAAECBQJnawIEVW5pdAkAAAIIBQJkVwZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgECZ3ABAmRXBAJnawkBAmdqAAMJAAECBQJnawIKQnl0ZVZlY3RvcgQCZ28FAmdrAwkAAAIIBQJkVw9jYWxsZXJQdWJsaWNLZXkFAmdvBgUCZ20DCQABAgUCZ2sCBFVuaXQDCQAAAggFAmRXBmNhbGxlcgUEdGhpcwYFAmdtCQACAQILTWF0Y2ggZXJyb3IdAmRXAQtjb25zdHJ1Y3RvcgEBVgQCZXcJAQJncAEFAmRXAwkAAAIFAmV3BQJldwkAzAgCCQELU3RyaW5nRW50cnkCCQEBVgAFAVYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVwEKc2V0TWFuYWdlcgECZ3EEAmV3CQECZ3ABBQJkVwMJAAACBQJldwUCZXcEAmdyCQDZBAEFAmdxAwkAAAIFAmdyBQJncgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWAAFAmdxBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZFcBDmNvbmZpcm1NYW5hZ2VyAAQCY24JAQJnbAAEAmdzAwkBCWlzRGVmaW5lZAEFAmNuBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJncwUCZ3MEAmd0AwkAAAIIBQJkVw9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmNuBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJndAUCZ3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVcACQDYBAEJAQV2YWx1ZQEFAmNuCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFYAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRXAQNwdXQCAmd1Amd2BAJndwkBAmJsAAQCZ3gJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmd3BQFDAgpXciBzdCBhZGRyBAJneQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZ3cFAUUCCldyIHNsIGFkZHIDCQBmAgAABQJndQkAAgECDldyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUCZFcIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQCZ3oJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmRXCHBheW1lbnRzAAAGYW1vdW50BAJnQQkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZFcIcGF5bWVudHMAAQZhbW91bnQEAmVNCQC4AgIJALYCAQkBAmJHAQkBAmFYAQUCYmYFAmd6AwkAAAIFAmVNBQJlTQQCZU4JALgCAgkAtgIBCQECYkcBCQECYVgBBQJiZwUCZ0EDCQAAAgUCZU4FAmVOBAJlTwkAtgIBCAkBBXZhbHVlAQkA7AcBBQJiZQhxdWFudGl0eQMJAAACBQJlTwUCZU8EAmVQCQECZUkDBQJnegUCZ0EJALYCAQAAAwkAAAIFAmVQBQJlUAQCZ0IJAQJmaQoJAKUIAQgFAmRXBmNhbGxlcgkA2AQBCAUCZFcNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJkVwhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJkVwhwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZFcIcGF5bWVudHMAAQUCZ3UGBwYAAAIABAJkeQgFAmdCAl8yBAJnQwgFAmdCAl83BAJjUAgFAmdCAl85BAJkeggFAmdCA18xMAQCZEEIBQJnQgNfMTEEAmN4CAUCZ0IDXzEyBAJjeQgFAmdCA18xMwQCZGwJAPwHBAUCYU0CBGVtaXQJAMwIAgUCZHkFA25pbAUDbmlsAwkAAAIFAmRsBQJkbAQCZ0QEAmdrBQJkbAMJAAECBQJnawIHQWRkcmVzcwQCZ0UFAmdrCQD8BwQFAmdFAgRlbWl0CQDMCAIFAmR5BQNuaWwFA25pbAUEdW5pdAMJAAACBQJnRAUCZ0QEAmdGAwkAZgIFAmR6AAAJAPwHBAUCZ3kCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjeAUCZHoFA25pbAUDbmlsAwkAAAIFAmdGBQJnRgQCZ0cDCQBmAgUCZEEAAAkA/AcEBQJneQIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmN5BQJkQQUDbmlsBQNuaWwDCQAAAgUCZ0cFAmdHBAJnSAMFAmd2BAJnSQkA/AcEBQJneAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ0MFAmR5BQNuaWwDCQAAAgUCZ0kFAmdJBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRXBmNhbGxlcgUCZHkFAmdDBQNuaWwEAmdKCQECZVEDAAAAAAAABAJnaAgFAmdKAl8xBAJlSAgFAmdKAl8yBAJnSwMJAMACAgUCZUgFAmVQBgkBAmFKAQkAuQkCCQDMCAICInVwZGF0ZWQgRExwIGxvd2VyIHRoYW4gY3VycmVudCBETHAJAMwIAgkApgMBBQJlTQkAzAgCCQCmAwEFAmVOCQDMCAIJAKYDAQUCZU8JAMwIAgkApgMBBQJlUAkAzAgCCQCmAwEFAmVIBQNuaWwCASADCQAAAgUCZ0sFAmdLBAJnTAgJAQV2YWx1ZQEJAOwHAQUCYmUIcXVhbnRpdHkDCQAAAgUCZ0wFAmdMCQDOCAIJAM4IAgUCY1AFAmdIBQJnaAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVwELcHV0T25lVGtuVjICAmZLAmd2BAJnTQoAAmZTCQD8BwQFAmFNAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCZlMCB0Jvb2xlYW4FAmZTCQACAQkArAICCQADAQUCZlMCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmdOAwMDCQECYU8ABgkAAAIFAmJkBQFxBgkAAAIFAmJkBQFzBgUCZ00EAmdPCQDMCAIDAwkBASEBBQJnTgYJAQJnbgEFAmRXBgkBAmFKAQIhcHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZFcIcGF5bWVudHMAAQYJAQJhSgECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdPBQJnTwQCY3gJANgEAQkBBXZhbHVlAQUCYmYEAmN5CQDYBAEJAQV2YWx1ZQEFAmJnBAJjdwUCYmUEAmZPBQJiaAQCZlAFAmJpBAJjdgMJAAACCAUCZFcGY2FsbGVyBQR0aGlzCAUCZFcMb3JpZ2luQ2FsbGVyCAUCZFcGY2FsbGVyBAJmaAkBBXZhbHVlAQkAkQMCCAUCZFcIcGF5bWVudHMAAAQCY3QJANgEAQkBBXZhbHVlAQgFAmZoB2Fzc2V0SWQEAmNaCAUCZmgGYW1vdW50BAJlUAMJAAACCAUCZmgHYXNzZXRJZAUCYmYJAQJlSQMJALYCAQUCY1oJALYCAQAACQC2AgEAAAkBAmVJAwkAtgIBAAAJALYCAQUCY1oJALYCAQAAAwkAAAIFAmVQBQJlUAQCZ1AJAQJmbQUFAmNaBQJjdAkApQgBBQJjdgkA2AQBCAUCZFcNdHJhbnNhY3Rpb25JZAYDCQAAAgUCZ1AFAmdQBAJjcQgFAmdQAl8zBAJjUAgFAmdQAl8yBAJnUQgFAmdQAl8xBAJkeQMDCQBmAgUCZksAAAkAZgIFAmZLBQJnUQcJAQJhSgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZksFA25pbAIABQJnUQQCZ0IJAPwHBAUCYU0CBGVtaXQJAMwIAgUCZHkFA25pbAUDbmlsAwkAAAIFAmdCBQJnQgQCZ0QEAmdrBQJnQgMJAAECBQJnawIHQWRkcmVzcwQCZ0UFAmdrCQD8BwQFAmdFAgRlbWl0CQDMCAIFAmR5BQNuaWwFA25pbAUEdW5pdAMJAAACBQJnRAUCZ0QEAmdIAwUCZ3YEAmdJCQD8BwQFAmJuAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjdwUCZHkFA25pbAMJAAACBQJnSQUCZ0kFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZFcGY2FsbGVyBQJkeQUCY3cFA25pbAQCZ2IDCQBmAgUCY3EAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhUQUCY3EJANkEAQUCY3QFA25pbAUDbmlsBAJnUgMJAAACBQR0aGlzBQJhUQkAlAoCAAAAAAQCZ1MDCQAAAggFAmZoB2Fzc2V0SWQFAmJmBgcDBQJnUwkAlAoCCQEBLQEFAmNxAAAJAJQKAgAACQEBLQEFAmNxBAJlUggFAmdSAl8xBAJlUwgFAmdSAl8yBAJnVAkBAmVRAwUCZVIFAmVTAAAEAmdoCAUCZ1QCXzEEAmVICAUCZ1QCXzIEAmdpCQECZVUCBQJlUAUCZUgDCQAAAgUCZ2kFAmdpCQCUCgIJAM4IAgkAzggCCQDOCAIFAmNQBQJnSAUCZ2IFAmdoBQJkeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVwEKcHV0Rm9yRnJlZQECZ1UDCQBmAgAABQJnVQkAAgECCldyb25nIHNscGcDCQECIT0CCQCQAwEIBQJkVwhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJnVgkBAmZpCgkApQgBCAUCZFcGY2FsbGVyCQDYBAEIBQJkVw10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmRXCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmRXCHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJkVwhwYXltZW50cwABBQJnVQcHBgAAAgAEAmNQCAUCZ1YCXzkEAmd6CQC2AgEICQEFdmFsdWUBCQCRAwIIBQJkVwhwYXltZW50cwAABmFtb3VudAQCZ0EJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmRXCHBheW1lbnRzAAEGYW1vdW50BAJlUAkBAmVJAwUCZ3oFAmdBCQC2AgEAAAMJAAACBQJlUAUCZVAEAmdXCQECZVEDAAAAAAAABAJnaAgFAmdXAl8xBAJlSAgFAmdXAl8yBAJnaQkBAmVVAgUCZVAFAmVIAwkAAAIFAmdpBQJnaQkAzggCBQJjUAUCZ2gJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZFcBA2dldAAEAmVQCQECZUkDCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmVQBQJlUAQCZGwJAQJmZwEFAmRXBAJnWAgFAmRsAl8xBAJjTwgFAmRsAl8yBAJjWggFAmRsAl8zBAJjdAgFAmRsAl80BAJjUAgFAmRsAl81BAJleAkA/AcEBQJhTQIEYnVybgkAzAgCBQJjWgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjdAUCY1oFA25pbAMJAAACBQJleAUCZXgEAmdZCQECZVEDCQEBLQEFAmdYCQEBLQEFAmNPAAAEAmdoCAUCZ1kCXzEEAmVICAUCZ1kCXzIEAmdpCQECZVUCBQJlUAUCZUgDCQAAAgUCZ2kFAmdpCQDOCAIFAmNQBQJnaAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVwELZ2V0T25lVGtuVjICAmZKAmZLBAJnTQoAAmZTCQD8BwQFAmFNAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCZlMCB0Jvb2xlYW4FAmZTCQACAQkArAICCQADAQUCZlMCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmdaAwMJAQJhTwAGCQAAAgUCYmQFAXMGBQJnTQQCZ08JAMwIAgMDCQEBIQEFAmdaBgkBAmduAQUCZFcGCQECYUoBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkVwhwYXltZW50cwABBgkBAmFKAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ08FAmdPBAJoYQkBAmZJBgUCZkoFAmZLCAUCZFcIcGF5bWVudHMIBQJkVwZjYWxsZXIIBQJkVwxvcmlnaW5DYWxsZXIIBQJkVw10cmFuc2FjdGlvbklkBAJjUAgFAmhhAl8xBAJmVQgFAmhhAl8yCQCUCgIFAmNQBQJmVQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVwEKcmVmcmVzaERMcAAEAmhiCQELdmFsdWVPckVsc2UCCQCfCAEFAmFuAAAEAmhjAwkAZwIJAGUCBQZoZWlnaHQFAmhiBQJhcQUEdW5pdAkBAmFKAQkAuQkCCQDMCAIJAKQDAQUCYXEJAMwIAgIvIGJsb2NrcyBoYXZlIG5vdCBwYXNzZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwFA25pbAIAAwkAAAIFAmhjBQJoYwQCZmIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAmFtAgEwCQECYUwBAgtpbnZhbGlkIGRMcAQCaGQJAQJlUQMAAAAAAAAEAmhlCAUCaGQCXzEEAmVICAUCaGQCXzIEAmVUAwkBAiE9AgUCZmIFAmVIBQJoZQkBAmFKAQISbm90aGluZyB0byByZWZyZXNoCQCUCgIFAmVUCQCmAwEFAmVICQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRXARNnZXRPbmVUa25WMlJFQURPTkxZAgJmSgJoZgQCY3gJANgEAQkBBXZhbHVlAQUCYmYEAmN5CQDYBAEJAQV2YWx1ZQEFAmJnBAJjdwkA2AQBCQEFdmFsdWUBBQJiZQQCZEcJAMwIAgkAtgIBCQECYkcBBQJjeAkAzAgCCQC2AgEJAQJiRwEFAmN5BQNuaWwEAmVHCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJjdwIQaW52YWxpZCBscCBhc3NldAhxdWFudGl0eQQCYlUJAQJkRgEFAmRHBAJiVAkAuAICBQJiVQkAvAIDCQC2AgEFAmhmBQJiVQUCZUcEAmhnAwkAAAIFAmZKBQJjeAAAAwkAAAIFAmZKBQJjeQABCQACAQIUaW52YWxpZCBvdXQgYXNzZXQgaWQEAmhoCQECZXQDBQJkRwUCaGcFAmJUBAJoaQkAuAICCQCRAwIFAmRHBQJoZwUCaGgEAmhqCQCWAwEJAMwIAgAACQDMCAIJAKADAQkAuAICBQJoaQUBZgUDbmlsBAJoawkBAmNvAQUCaGoEAmZUCAUCaGsCXzEEAmNxCAUCaGsCXzIJAJQKAgUDbmlsCQCUCgIFAmZUBQJjcQJkVwEcZ2V0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICZkoCaGYEAmN4CQDYBAEJAQV2YWx1ZQEFAmJmBAJjeQkA2AQBCQEFdmFsdWUBBQJiZwQCY3cJANgEAQkBBXZhbHVlAQUCYmUEAmNECQECYkcBBQJjeAQCY0YJAQJiRwEFAmN5BAJobAoAAmZTCQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZkoJAMwIAgUCaGYFA25pbAUDbmlsAwkAAQIFAmZTAgooSW50LCBJbnQpBQJmUwkAAgEJAKwCAgkAAwEFAmZTAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpBAJmVAgFAmhsAl8xBAJjcQgFAmhsAl8yBAJkbAkBAmNyBAIABQJjdwUCaGYFBHRoaXMEAmNOCAUCZGwCXzEEAmNPCAUCZGwCXzIEAmhtCQBkAgUCY04FAmNPBAJmSAMJAAACBQJobQAAAwkAAAIFAmZUAAAAAAkAAgECF2JvbnVzIGNhbGN1bGF0aW9uIGVycm9yCQBrAwkAZQIFAmZUBQJobQUBYQUCaG0JAJQKAgUDbmlsCQCVCgMFAmZUBQJjcQUCZkgCZFcBCWdldE5vTGVzcwICaG4CaG8EAmhwCQC2AgEJAQJiRwEJAQJhWAEFAmJmAwkAAAIFAmhwBQJocAQCaHEJALYCAQkBAmJHAQkBAmFYAQUCYmcDCQAAAgUCaHEFAmhxBAJocgkAtgIBCAkBBXZhbHVlAQkA7AcBBQJiZQhxdWFudGl0eQMJAAACBQJocgUCaHIEAmhzCQC4AgIFAmhyCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJkVwhwYXltZW50cwAABmFtb3VudAMJAAACBQJocwUCaHMEAmRsCQECZmcBBQJkVwQCY04IBQJkbAJfMQQCY08IBQJkbAJfMgQCY1oIBQJkbAJfMwQCY3QIBQJkbAJfNAQCY1AIBQJkbAJfNQMJAGYCBQJobgUCY04JAAIBCQCsAgIJAKwCAgkArAICAglGYWlsZWQ6ICAJAKQDAQUCY04CAyA8IAkApAMBBQJobgMJAGYCBQJobwUCY08JAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJjTwIDIDwgCQCkAwEFAmhvBAJlUAkBAmVJAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJlUAUCZVAEAmh0CQD8BwQFAmFNAgRidXJuCQDMCAIFAmNaBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmN0BQJjWgUDbmlsAwkAAAIFAmh0BQJodAQCaHUJAQJlUQMJAQEtAQUCY04JAQEtAQUCY08AAAQCZ2gIBQJodQJfMQQCZUgIBQJodQJfMgQCZ2kJAQJlVQIFAmVQBQJlSAMJAAACBQJnaQUCZ2kJAM4IAgUCY1AFAmdoCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRXAQ11bnN0YWtlQW5kR2V0AQJjcAQCaHYDCQECIT0CCQCQAwEIBQJkVwhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCaHYFAmh2BAJodwkBAmJsAAQCZ0MFAmJlBAJoeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCaHcFAUMCCldyIHN0IGFkZHIEAmVQCQECZUkDCQC2AgEAAAkAtgIBAAAJALYCAQAABAJoeQkA/AcEBQJoeAIHdW5zdGFrZQkAzAgCCQDYBAEFAmdDCQDMCAIFAmNwBQNuaWwFA25pbAMJAAACBQJoeQUCaHkEAmRsCQECY3IECQDYBAEIBQJkVw10cmFuc2FjdGlvbklkCQDYBAEFAmdDBQJjcAgFAmRXBmNhbGxlcgQCY04IBQJkbAJfMQQCY08IBQJkbAJfMgQCY0IJAQ1wYXJzZUludFZhbHVlAQgFAmRsAl85BAJjUAgFAmRsA18xMAQCaHoDAwkBAmFPAAYJAAACBQJjQgUBcwkAAgEJAKwCAgIJQmxvY2tlZDogCQCkAwEFAmNCBgMJAAACBQJoegUCaHoEAmhBCQD8BwQFAmFNAgRidXJuCQDMCAIFAmNwBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdDBQJjcAUDbmlsAwkAAAIFAmhBBQJoQQQCaEIJAQJlUQMJAQEtAQUCY04JAQEtAQUCY08AAAQCZ2gIBQJoQgJfMQQCZUgIBQJoQgJfMgQCZ2kJAQJlVQIFAmVQBQJlSAMJAAACBQJnaQUCZ2kJAM4IAgUCY1AFAmdoCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRXARN1bnN0YWtlQW5kR2V0Tm9MZXNzAwJoQwJoRAJobwQCZ1oDCQECYU8ABgkAAAIFAmJkBQFzBAJnTwkAzAgCAwkBASEBBQJnWgYJAAIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkVwhwYXltZW50cwAABgkAAgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdPBQJnTwQCZVAJAQJlSQMJALYCAQAACQC2AgEAAAkAtgIBAAAEAmh5CQD8BwQFAmJuAgd1bnN0YWtlCQDMCAIJANgEAQUCYmUJAMwIAgUCaEMFA25pbAUDbmlsAwkAAAIFAmh5BQJoeQQCaEUJAQJjcgQJANgEAQgFAmRXDXRyYW5zYWN0aW9uSWQJANgEAQUCYmUFAmhDCAUCZFcGY2FsbGVyBAJjTggFAmhFAl8xBAJjTwgFAmhFAl8yBAJjUAgFAmhFA18xMAQCaEYJAMwIAgMJAGcCBQJjTgUCaEQGCQACAQkAuQkCCQDMCAICLGFtb3VudCBhc3NldCBhbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCaEQFA25pbAIACQDMCAIDCQBnAgUCY08FAmhvBgkAAgEJALkJAgkAzAgCAitwcmljZSBhc3NldCBhbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCaG8FA25pbAIABQNuaWwDCQAAAgUCaEYFAmhGBAJodAkA/AcEBQJhTQIEYnVybgkAzAgCBQJoQwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiZQUCaEMFA25pbAMJAAACBQJodAUCaHQEAmhHCQECZVEDCQEBLQEFAmNOCQEBLQEFAmNPAAAEAmdoCAUCaEcCXzEEAmVICAUCaEcCXzIEAmdpCQECZVUCBQJlUAUCZUgDCQAAAgUCZ2kFAmdpCQDOCAIFAmNQBQJnaAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVwEVdW5zdGFrZUFuZEdldE9uZVRrblYyAwJoQwJmSgJmSwQCZ00KAAJmUwkA/AcEBQJhTQIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmZTAgdCb29sZWFuBQJmUwkAAgEJAKwCAgkAAwEFAmZTAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJnWgMDCQECYU8ABgkAAAIFAmJkBQFzBgUCZ00EAmdPCQDMCAIDAwkBASEBBQJnWgYJAQJnbgEFAmRXBgkBAmFKAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZFcIcGF5bWVudHMAAAYJAQJhSgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdPBQJnTwQCaHcJAQJibAAEAmdDBQJiZQQCaHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmh3BQFDAgpXciBzdCBhZGRyBAJoeQkA/AcEBQJoeAIHdW5zdGFrZQkAzAgCCQDYBAEFAmdDCQDMCAIFAmhDBQNuaWwFA25pbAMJAAACBQJoeQUCaHkEAmhICQECZkkGBQJmSgUCZksJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdDBQJoQwUDbmlsCAUCZFcGY2FsbGVyCAUCZFcMb3JpZ2luQ2FsbGVyCAUCZFcNdHJhbnNhY3Rpb25JZAQCY1AIBQJoSAJfMQQCZlUIBQJoSAJfMgkAlAoCBQJjUAUCZlUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZFcBHHB1dE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCAmhJAmhKBAJoSwkBAmZtBQUCaEkFAmhKAgACAAYEAmZDCAUCaEsCXzEEAmNQCAUCaEsCXzIEAmNxCAUCaEsCXzMEAmZICAUCaEsCXzQJAJQKAgUDbmlsCQCVCgMFAmZDBQJjcQUCZkgCZFcBIXB1dE9uZVRrblYyV2l0aG91dFRha2VGZWVSRUFET05MWQICaEkCaEoEAmhMCQECZm0FBQJoSQUCaEoCAAIABwQCZkMIBQJoTAJfMQQCY1AIBQJoTAJfMgQCY3EIBQJoTAJfMwQCZkgIBQJoTAJfNAkAlAoCBQNuaWwJAJUKAwUCZkMFAmNxBQJmSAJkVwEIYWN0aXZhdGUCAmhNAmhOAwkBAiE9AgkApQgBCAUCZFcGY2FsbGVyCQClCAEFAmFNCQACAQIGZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFnAAUCaE0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFoAAUCaE4FA25pbAIHc3VjY2VzcwJkVwEEc2V0UwICaE8CaHoDCQECIT0CCQClCAEIBQJkVwZjYWxsZXIJAQJhRgIFBHRoaXMJAQJhagAFAmdtCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmhPBQJoegUDbmlsAmRXAQRzZXRJAgJoTwJoegMJAQIhPQIJAKUIAQgFAmRXBmNhbGxlcgkBAmFGAgUEdGhpcwkBAmFqAAUCZ20JAMwIAgkBDEludGVnZXJFbnRyeQIFAmhPBQJoegUDbmlsAmRXARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQJhUgACZFcBHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkBAmJICQCUCgIFA25pbAkBAmJHAQUCYkgCZFcBGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkDAmNhAmNiAmNmBAJoUAkBAmNlAwUCY2EFAmNiBQJjZgkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAmhQAAAJAMwIAgkApgMBCQCRAwIFAmhQAAEJAMwIAgkApgMBCQCRAwIFAmhQAAIFA25pbAJkVwEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIBTAJoUQkAlAoCBQNuaWwJAQFLAgkApwMBBQFMBQJoUQJkVwEUdG9YMThXcmFwcGVyUkVBRE9OTFkCAUkBSgkAlAoCBQNuaWwJAKYDAQkBAUgCBQFJBQFKAmRXAR5jYWxjUHJpY2VCaWdJbnRXcmFwcGVyUkVBRE9OTFkCAmJKAmJLCQCUCgIFA25pbAkApgMBCQECYkkCCQCnAwEFAmJKCQCnAwEFAmJLAmRXASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkCY3MCYlACY1ICY1MCY1QCY1UCaFICY1YCY1cJAJQKAgUDbmlsCQECY1ENBQJjcwUCYlAFAmNSBQJjUwUCY1QFAmNVBQJoUgUCY1YFAmNXBgcAAAIAAmRXASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQCY3MCaFMCY3UCaFIEAmRsCQECY3IEBQJjcwUCaFMFAmN1CQERQGV4dHJOYXRpdmUoMTA2MikBBQJoUgkAlAoCBQNuaWwJAJwKCggFAmRsAl8xCAUCZGwCXzIIBQJkbAJfMwgFAmRsAl80CAUCZGwCXzUIBQJkbAJfNggFAmRsAl83CQCmAwEIBQJkbAJfOAgFAmRsAl85CAUCZGwDXzEwAmRXAQ5nZXRGZWVSRUFET05MWQAJAJQKAgUDbmlsBQJhbAECaFQBAmhVAAQCaFYEAmdrCQECZ2oAAwkAAQIFAmdrAgpCeXRlVmVjdG9yBAJnbwUCZ2sFAmdvAwkAAQIFAmdrAgRVbml0CAUCaFQPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IEAmdrBQJoVAMJAAECBQJnawIFT3JkZXIEAmVYBQJnawQCaFcJAQJhUAAEAmhYCQECZVcBBQJlWAQCaFkJAPQDAwgFAmVYCWJvZHlCeXRlcwkAkQMCCAUCZVgGcHJvb2ZzAAAIBQJlWA9zZW5kZXJQdWJsaWNLZXkEAmhaCQD0AwMIBQJlWAlib2R5Qnl0ZXMJAJEDAggFAmVYBnByb29mcwABBQJoVwMDAwUCaFgFAmhZBwUCaFoHBgkBAmFCAwUCaFgFAmhZBQJoWgMJAAECBQJnawIUU2V0U2NyaXB0VHJhbnNhY3Rpb24EAmRKBQJnawQCaWEJAPYDAQkBBXZhbHVlAQgFAmRKBnNjcmlwdAQCaWIJANsEAQkBBXZhbHVlAQkAnQgCBQJhTQkBAmF6AAQCaWMJAPEHAQUEdGhpcwMDCQAAAgUCaWIFAmlhCQECIT0CBQJpYwUCaWEHBgkA9AMDCAUCaFQJYm9keUJ5dGVzCQCRAwIIBQJoVAZwcm9vZnMAAAUCaFYJAPQDAwgFAmhUCWJvZHlCeXRlcwkAkQMCCAUCaFQGcHJvb2ZzAAAFAmhWEB+pZQ==", "chainId": 84, "height": 2377335, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DSgqLqm5gyjG4nCW4Yp2o63V5YWufPD2WQuWovGFDYXx Next: 2FTBjH4MW7F1nwESy5FLDnyasZXGieHqKAGRPvYemTtQ Diff:
OldNewDifferences
386386 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
387387 }
388388 else {
389- let curPriceX18 = cpbir(prBalanceX18, amBalanceX18, CEILING)
389+ let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
390390 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
391391 let slippageX18 = t1(slippage, scale8)
392392 if (if (if (validateSlippage)
397397 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
398398 else {
399399 let lpEmissionX18 = t1(lpEm, scale8)
400- let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18, CEILING)
401- let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18, CEILING)
400+ let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
401+ let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
402402 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
403403 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
404404 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
405405 let expAmtAssetAmtX18 = expectedAmts._1
406406 let expPriceAssetAmtX18 = expectedAmts._2
407- let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
407+ let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
408408 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
409409 }
410410 }
421421 else calcLpAmt
422422 let amDiff = (inAmAmt - calcAmAssetPmt)
423423 let prDiff = (inPrAmt - calcPrAssetPmt)
424- let $t01832718672 = if (if (isOneAsset)
424+ let $t01838418729 = if (if (isOneAsset)
425425 then (pmtId == amIdStr)
426426 else false)
427427 then $Tuple2(pmtAmt, 0)
430430 else false)
431431 then $Tuple2(0, pmtAmt)
432432 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
433- let writeAmAmt = $t01832718672._1
434- let writePrAmt = $t01832718672._2
433+ let writeAmAmt = $t01838418729._1
434+ let writePrAmt = $t01838418729._2
435435 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
436436 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
437437 }
473473 }
474474
475475 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
476- let $t02060020648 = {
476+ let $t02065720705 = {
477477 let $l = arr
478478 let $s = size($l)
479479 let $acc0 = $Tuple2(s, false)
487487
488488 $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($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
489489 }
490- let d = $t02060020648._1
491- let found = $t02060020648._2
490+ let d = $t02065720705._1
491+ let found = $t02065720705._2
492492 if (found)
493493 then d
494494 else throw(("D calculation error, D = " + toString(d)))
512512 let ann_aPrecision = (ann - aPrecision)
513513 let n1 = (n + big1)
514514 func calc (acc,cur) = {
515- let $t02127721297 = acc
516- let d = $t02127721297._1
517- let found = $t02127721297._2
515+ let $t02133421354 = acc
516+ let d = $t02133421354._1
517+ let found = $t02133421354._2
518518 if ((found != unit))
519519 then acc
520520 else {
528528 }
529529
530530 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
531- let $t02171821765 = {
531+ let $t02177521822 = {
532532 let $l = arr
533533 let $s = size($l)
534534 let $acc0 = $Tuple2(s, unit)
542542
543543 $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($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
544544 }
545- let d = $t02171821765._1
546- let found = $t02171821765._2
545+ let d = $t02177521822._1
546+ let found = $t02177521822._2
547547 if ((found != unit))
548548 then d
549549 else throw(("D calculation error, D = " + toString(d)))
563563 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
564564 let b = ((s + ((D * aPrecision) / ann)) - D)
565565 func calc (acc,cur) = {
566- let $t02226522285 = acc
567- let y = $t02226522285._1
568- let found = $t02226522285._2
566+ let $t02232222342 = acc
567+ let y = $t02232222342._1
568+ let found = $t02232222342._2
569569 if ((found != unit))
570570 then acc
571571 else {
578578 }
579579
580580 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
581- let $t02259222639 = {
581+ let $t02264922696 = {
582582 let $l = arr
583583 let $s = size($l)
584584 let $acc0 = $Tuple2(D, unit)
592592
593593 $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($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
594594 }
595- let y = $t02259222639._1
596- let found = $t02259222639._2
595+ let y = $t02264922696._1
596+ let found = $t02264922696._2
597597 if ((found != unit))
598598 then y
599599 else throw(("Y calculation error, Y = " + toString(y)))
635635 func validateMatcherOrderAllowed (order) = {
636636 let amountAssetAmount = order.amount
637637 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
638- let $t02457824790 = if ((order.orderType == Buy))
638+ let $t02463524847 = if ((order.orderType == Buy))
639639 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
640640 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
641- let amountAssetBalanceDelta = $t02457824790._1
642- let priceAssetBalanceDelta = $t02457824790._2
641+ let amountAssetBalanceDelta = $t02463524847._1
642+ let priceAssetBalanceDelta = $t02463524847._2
643643 if (if (if (igs())
644644 then true
645645 else (cfgPoolStatus == PoolMatcherDis))
652652 then throw("Wr assets")
653653 else {
654654 let dLp = parseBigIntValue(getStringValue(this, keyDLp))
655- let $t02512025220 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
656- let unusedActions = $t02512025220._1
657- let dLpNew = $t02512025220._2
655+ let $t02517725277 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
656+ let unusedActions = $t02517725277._1
657+ let dLpNew = $t02517725277._2
658658 let isOrderValid = (dLpNew >= dLp)
659659 isOrderValid
660660 }
707707 then {
708708 let amBalance = getAccBalance(amId)
709709 let prBalance = getAccBalance(prId)
710- let $t02748627948 = if ((txId == ""))
710+ let $t02754328005 = if ((txId == ""))
711711 then $Tuple2(amBalance, prBalance)
712712 else if ((pmtAssetId == amId))
713713 then if ((pmtAmtRaw > amBalance))
718718 then throw("invalid payment amount")
719719 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
720720 else throw("wrong pmtAssetId")
721- let amBalanceOld = $t02748627948._1
722- let prBalanceOld = $t02748627948._2
723- let $t02795428130 = if ((pmtAssetId == amId))
721+ let amBalanceOld = $t02754328005._1
722+ let prBalanceOld = $t02754328005._2
723+ let $t02801128187 = if ((pmtAssetId == amId))
724724 then $Tuple2(pmtAmtRaw, 0)
725725 else if ((pmtAssetId == prId))
726726 then $Tuple2(0, pmtAmtRaw)
727727 else throw("invalid payment")
728- let amAmountRaw = $t02795428130._1
729- let prAmountRaw = $t02795428130._2
730- let $t02813428373 = if (withTakeFee)
728+ let amAmountRaw = $t02801128187._1
729+ let prAmountRaw = $t02801128187._2
730+ let $t02819128430 = if (withTakeFee)
731731 then $Tuple3(takeFee(amAmountRaw)._1, takeFee(prAmountRaw)._1, takeFee(pmtAmtRaw)._2)
732732 else $Tuple3(amAmountRaw, prAmountRaw, 0)
733- let amAmount = $t02813428373._1
734- let prAmount = $t02813428373._2
735- let feeAmount = $t02813428373._3
733+ let amAmount = $t02819128430._1
734+ let prAmount = $t02819128430._2
735+ let feeAmount = $t02819128430._3
736736 let amBalanceNew = (amBalanceOld + amAmount)
737737 let prBalanceNew = (prBalanceOld + prAmount)
738738 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
780780 else {
781781 let amBalance = getAccBalance(amId)
782782 let prBalance = getAccBalance(prId)
783- let $t03042330534 = {
783+ let $t03048030591 = {
784784 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
785785 if ($isInstanceOf(@, "(Int, Int)"))
786786 then @
787787 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
788788 }
789- if (($t03042330534 == $t03042330534))
789+ if (($t03048030591 == $t03048030591))
790790 then {
791- let feeAmount = $t03042330534._2
792- let totalGet = $t03042330534._1
791+ let feeAmount = $t03048030591._2
792+ let totalGet = $t03048030591._1
793793 let totalAmount = if (if ((minOutAmount > 0))
794794 then (minOutAmount > totalGet)
795795 else false)
796796 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
797797 else totalGet
798- let $t03072431031 = if ((outAssetId == amId))
798+ let $t03078131088 = if ((outAssetId == amId))
799799 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
800800 else if ((outAssetId == prId))
801801 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
802802 else throw("invalid out asset id")
803- let outAm = $t03072431031._1
804- let outPr = $t03072431031._2
805- let amBalanceNew = $t03072431031._3
806- let prBalanceNew = $t03072431031._4
803+ let outAm = $t03078131088._1
804+ let outPr = $t03078131088._2
805+ let amBalanceNew = $t03078131088._3
806+ let prBalanceNew = $t03078131088._4
807807 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
808808 let curPr = f1(curPrX18, scale8)
809809 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
818818 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
819819 if ((burn == burn))
820820 then {
821- let $t03181632166 = {
821+ let $t03187332223 = {
822822 let feeAmountForCalc = if ((this == feeCollectorAddress))
823823 then 0
824824 else feeAmount
829829 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
830830 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
831831 }
832- let amountAssetBalanceDelta = $t03181632166._1
833- let priceAssetBalanceDelta = $t03181632166._2
834- let $t03216932277 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
835- let refreshDLpActions = $t03216932277._1
836- let updatedDLp = $t03216932277._2
832+ let amountAssetBalanceDelta = $t03187332223._1
833+ let priceAssetBalanceDelta = $t03187332223._2
834+ let $t03222632334 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
835+ let refreshDLpActions = $t03222632334._1
836+ let updatedDLp = $t03222632334._2
837837 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
838838 if ((isUpdatedDLpValid == isUpdatedDLpValid))
839839 then $Tuple2((state ++ refreshDLpActions), totalAmount)
10021002 else throw("Strict value is not equal to itself.")
10031003 }
10041004 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1005- let $t03642636568 = refreshDLpInternal(0, 0, 0)
1006- let refreshDLpActions = $t03642636568._1
1007- let updatedDLp = $t03642636568._2
1005+ let $t03648336625 = refreshDLpInternal(0, 0, 0)
1006+ let refreshDLpActions = $t03648336625._1
1007+ let updatedDLp = $t03648336625._2
10081008 let check = if ((updatedDLp >= currentDLp))
10091009 then true
10101010 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp)], " "))
10771077 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
10781078 if ((currentDLp == currentDLp))
10791079 then {
1080- let $t03836938527 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1081- if (($t03836938527 == $t03836938527))
1080+ let $t03853138689 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1081+ if (($t03853138689 == $t03853138689))
10821082 then {
1083- let feeAmount = $t03836938527._3
1084- let state = $t03836938527._2
1085- let estimLP = $t03836938527._1
1083+ let feeAmount = $t03853138689._3
1084+ let state = $t03853138689._2
1085+ let estimLP = $t03853138689._1
10861086 let emitLpAmt = if (if ((minOutAmount > 0))
10871087 then (minOutAmount > estimLP)
10881088 else false)
11101110 let sendFeeToMatcher = if ((feeAmount > 0))
11111111 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
11121112 else nil
1113- let $t03934239691 = if ((this == feeCollectorAddress))
1113+ let $t03950439853 = if ((this == feeCollectorAddress))
11141114 then $Tuple2(0, 0)
11151115 else {
11161116 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
11201120 then $Tuple2(-(feeAmount), 0)
11211121 else $Tuple2(0, -(feeAmount))
11221122 }
1123- let amountAssetBalanceDelta = $t03934239691._1
1124- let priceAssetBalanceDelta = $t03934239691._2
1125- let $t03969439802 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1126- let refreshDLpActions = $t03969439802._1
1127- let updatedDLp = $t03969439802._2
1123+ let amountAssetBalanceDelta = $t03950439853._1
1124+ let priceAssetBalanceDelta = $t03950439853._2
1125+ let $t03985639964 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1126+ let refreshDLpActions = $t03985639964._1
1127+ let updatedDLp = $t03985639964._2
11281128 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11291129 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11301130 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
11561156 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11571157 if ((currentDLp == currentDLp))
11581158 then {
1159- let $t04083240897 = refreshDLpInternal(0, 0, 0)
1160- let refreshDLpActions = $t04083240897._1
1161- let updatedDLp = $t04083240897._2
1159+ let $t04099441059 = refreshDLpInternal(0, 0, 0)
1160+ let refreshDLpActions = $t04099441059._1
1161+ let updatedDLp = $t04099441059._2
11621162 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11631163 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11641164 then (state ++ refreshDLpActions)
11831183 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11841184 if ((b == b))
11851185 then {
1186- let $t04207042152 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1187- let refreshDLpActions = $t04207042152._1
1188- let updatedDLp = $t04207042152._2
1186+ let $t04223242314 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1187+ let refreshDLpActions = $t04223242314._1
1188+ let updatedDLp = $t04223242314._2
11891189 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11901190 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11911191 then (state ++ refreshDLpActions)
12201220 else throwErr("exactly 1 payment are expected")]
12211221 if ((checks == checks))
12221222 then {
1223- let $t04277042925 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1224- let state = $t04277042925._1
1225- let totalAmount = $t04277042925._2
1223+ let $t04293243087 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1224+ let state = $t04293243087._1
1225+ let totalAmount = $t04293243087._2
12261226 $Tuple2(state, totalAmount)
12271227 }
12281228 else throw("Strict value is not equal to itself.")
12391239 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
12401240 then {
12411241 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1242- let $t04344943513 = refreshDLpInternal(0, 0, 0)
1243- let dLpUpdateActions = $t04344943513._1
1244- let updatedDLp = $t04344943513._2
1242+ let $t04361143675 = refreshDLpInternal(0, 0, 0)
1243+ let dLpUpdateActions = $t04361143675._1
1244+ let updatedDLp = $t04361143675._2
12451245 let actions = if ((dLp != updatedDLp))
12461246 then dLpUpdateActions
12471247 else throwErr("nothing to refresh")
12691269 let newY = getYD(xp, index, D1)
12701270 let dy = (xp[index] - newY)
12711271 let totalGetRaw = max([0, toInt((dy - big1))])
1272- let $t04444344492 = takeFee(totalGetRaw)
1273- let totalGet = $t04444344492._1
1274- let feeAmount = $t04444344492._2
1272+ let $t04460544654 = takeFee(totalGetRaw)
1273+ let totalGet = $t04460544654._1
1274+ let feeAmount = $t04460544654._2
12751275 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
12761276 }
12771277
12841284 let lpId = toBase58String(value(cfgLpAssetId))
12851285 let amBalance = getAccBalance(amId)
12861286 let prBalance = getAccBalance(prId)
1287- let $t04486744982 = {
1287+ let $t04502945144 = {
12881288 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
12891289 if ($isInstanceOf(@, "(Int, Int)"))
12901290 then @
12911291 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
12921292 }
1293- let totalGet = $t04486744982._1
1294- let feeAmount = $t04486744982._2
1293+ let totalGet = $t04502945144._1
1294+ let feeAmount = $t04502945144._2
12951295 let r = ego("", lpId, lpAssetAmount, this)
12961296 let outAmAmt = r._1
12971297 let outPrAmt = r._2
13371337 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13381338 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13391339 then {
1340- let $t04652146602 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1341- let refreshDLpActions = $t04652146602._1
1342- let updatedDLp = $t04652146602._2
1340+ let $t04668346764 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1341+ let refreshDLpActions = $t04668346764._1
1342+ let updatedDLp = $t04668346764._2
13431343 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13441344 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13451345 then (state ++ refreshDLpActions)
13901390 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
13911391 if ((burnA == burnA))
13921392 then {
1393- let $t04762647707 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1394- let refreshDLpActions = $t04762647707._1
1395- let updatedDLp = $t04762647707._2
1393+ let $t04778847869 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1394+ let refreshDLpActions = $t04778847869._1
1395+ let updatedDLp = $t04778847869._2
13961396 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13971397 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13981398 then (state ++ refreshDLpActions)
14391439 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
14401440 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14411441 then {
1442- let $t04895549036 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1443- let refreshDLpActions = $t04895549036._1
1444- let updatedDLp = $t04895549036._2
1442+ let $t04911749198 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1443+ let refreshDLpActions = $t04911749198._1
1444+ let updatedDLp = $t04911749198._2
14451445 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
14461446 if ((isUpdatedDLpValid == isUpdatedDLpValid))
14471447 then (state ++ refreshDLpActions)
14861486 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
14871487 if ((unstakeInv == unstakeInv))
14881488 then {
1489- let $t04993150119 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1490- let state = $t04993150119._1
1491- let totalAmount = $t04993150119._2
1489+ let $t05009350281 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1490+ let state = $t05009350281._1
1491+ let totalAmount = $t05009350281._2
14921492 $Tuple2(state, totalAmount)
14931493 }
14941494 else throw("Strict value is not equal to itself.")
15001500
15011501 @Callable(i)
15021502 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1503- let $t05024750350 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1504- let lpAmount = $t05024750350._1
1505- let state = $t05024750350._2
1506- let feeAmount = $t05024750350._3
1507- let bonus = $t05024750350._4
1503+ let $t05040950512 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1504+ let lpAmount = $t05040950512._1
1505+ let state = $t05040950512._2
1506+ let feeAmount = $t05040950512._3
1507+ let bonus = $t05040950512._4
15081508 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
15091509 }
15101510
15121512
15131513 @Callable(i)
15141514 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1515- let $t05049850602 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1516- let lpAmount = $t05049850602._1
1517- let state = $t05049850602._2
1518- let feeAmount = $t05049850602._3
1519- let bonus = $t05049850602._4
1515+ let $t05066050764 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1516+ let lpAmount = $t05066050764._1
1517+ let state = $t05066050764._2
1518+ let feeAmount = $t05066050764._3
1519+ let bonus = $t05066050764._4
15201520 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
15211521 }
15221522
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
1717
1818 let big3 = toBigInt(3)
1919
2020 let big4 = toBigInt(4)
2121
2222 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
2323
2424 let wavesString = "WAVES"
2525
2626 let Amult = "100"
2727
2828 let Dconv = "1"
2929
3030 let SEP = "__"
3131
3232 let EMPTY = ""
3333
3434 let PoolActive = 1
3535
3636 let PoolPutDis = 2
3737
3838 let PoolMatcherDis = 3
3939
4040 let PoolShutdown = 4
4141
4242 let idxPoolAddress = 1
4343
4444 let idxPoolSt = 2
4545
4646 let idxLPAsId = 3
4747
4848 let idxAmAsId = 4
4949
5050 let idxPrAsId = 5
5151
5252 let idxAmtAsDcm = 6
5353
5454 let idxPriceAsDcm = 7
5555
5656 let idxIAmtAsId = 8
5757
5858 let idxIPriceAsId = 9
5959
6060 let idxFactStakCntr = 1
6161
6262 let idxFactoryRestCntr = 6
6363
6464 let idxFactSlippCntr = 7
6565
6666 let idxFactGwxRewCntr = 10
6767
6868 let feeDefault = fraction(10, scale8, 10000)
6969
7070 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7171
7272
7373 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7474
7575
7676 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
7777
7878
7979 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
8080
8181
8282 func abs (val) = if ((zeroBigInt > val))
8383 then -(val)
8484 else val
8585
8686
8787 func absBigInt (val) = if ((zeroBigInt > val))
8888 then -(val)
8989 else val
9090
9191
9292 func fc () = "%s__factoryContract"
9393
9494
9595 func mpk () = "%s__managerPublicKey"
9696
9797
9898 func pmpk () = "%s__pendingManagerPublicKey"
9999
100100
101101 func pl () = "%s%s__price__last"
102102
103103
104104 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
105105
106106
107107 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
108108
109109
110110 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
111111
112112
113113 func aa () = "%s__amountAsset"
114114
115115
116116 func pa () = "%s__priceAsset"
117117
118118
119119 func amp () = "%s__amp"
120120
121121
122122 func ada () = "%s__addonAddr"
123123
124124
125125 let keyFee = "%s__fee"
126126
127127 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
128128
129129 let keyDLp = makeString(["%s", "dLp"], SEP)
130130
131131 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
132132
133133 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
134134
135135 let dLpRefreshDelayDefault = 1
136136
137137 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
138138
139139 func fcfg () = "%s__factoryConfig"
140140
141141
142142 func mtpk () = "%s%s__matcher__publicKey"
143143
144144
145145 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
146146
147147
148148 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
149149
150150
151151 func aps () = "%s__shutdown"
152152
153153
154154 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
155155
156156
157157 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
158158
159159
160160 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
161161
162162
163163 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
164164
165165
166166 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
167167
168168
169169 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
170170
171171
172172 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
173173
174174
175175 let fca = addressFromStringValue(strf(this, fc()))
176176
177177 let A = strf(this, amp())
178178
179179 func igs () = valueOrElse(getBoolean(fca, aps()), false)
180180
181181
182182 func mp () = fromBase58String(strf(fca, mtpk()))
183183
184184
185185 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
186186
187187 func gpc () = {
188188 let amtAs = strf(this, aa())
189189 let priceAs = strf(this, pa())
190190 let iPriceAs = intf(fca, mba(priceAs))
191191 let iAmtAs = intf(fca, mba(amtAs))
192192 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
193193 }
194194
195195
196196 func parseAssetId (input) = if ((input == wavesString))
197197 then unit
198198 else fromBase58String(input)
199199
200200
201201 func assetIdToString (input) = if ((input == unit))
202202 then wavesString
203203 else toBase58String(value(input))
204204
205205
206206 func parsePoolConfig (poolConfig) = $Tuple9(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]), fromBase58String(poolConfig[idxIAmtAsId]), fromBase58String(poolConfig[idxIPriceAsId]))
207207
208208
209209 let poolConfigParsed = parsePoolConfig(gpc())
210210
211211 let $t073837612 = poolConfigParsed
212212
213213 let cfgPoolAddress = $t073837612._1
214214
215215 let cfgPoolStatus = $t073837612._2
216216
217217 let cfgLpAssetId = $t073837612._3
218218
219219 let cfgAmountAssetId = $t073837612._4
220220
221221 let cfgPriceAssetId = $t073837612._5
222222
223223 let cfgAmountAssetDecimals = $t073837612._6
224224
225225 let cfgPriceAssetDecimals = $t073837612._7
226226
227227 let cfgInAmountAssedId = $t073837612._8
228228
229229 let cfgInPriceAssetId = $t073837612._9
230230
231231 func gfc () = split(strf(fca, fcfg()), SEP)
232232
233233
234234 let factoryConfig = gfc()
235235
236236 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
237237
238238 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
239239
240240 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
241241
242242 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
243243
244244 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
245245
246246
247247 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
248248
249249
250250 func getAccBalance (assetId) = if ((assetId == "WAVES"))
251251 then wavesBalance(this).available
252252 else assetBalance(this, fromBase58String(assetId))
253253
254254
255255 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
256256
257257
258258 func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
259259
260260
261261 func vad (A1,A2,slippage) = {
262262 let diff = fraction((A1 - A2), scale8BigInt, A2)
263263 let pass = ((slippage - abs(diff)) > zeroBigInt)
264264 if (!(pass))
265265 then throw(("Big slpg: " + toString(diff)))
266266 else $Tuple2(pass, min([A1, A2]))
267267 }
268268
269269
270270 func vd (D1,D0,slpg) = {
271271 let diff = fraction(D0, scale8BigInt, D1)
272272 let fail = (slpg > diff)
273273 if (if (fail)
274274 then true
275275 else (D0 > D1))
276276 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
277277 else fail
278278 }
279279
280280
281281 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
282282 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
283283 let prAsAmtX18 = t1(prAmt, prAssetDcm)
284284 cpbi(prAsAmtX18, amtAsAmtX18)
285285 }
286286
287287
288288 func calcPrices (amAmt,prAmt,lpAmt) = {
289289 let amtAsDcm = cfgAmountAssetDecimals
290290 let prAsDcm = cfgPriceAssetDecimals
291291 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
292292 let amAmtX18 = t1(amAmt, amtAsDcm)
293293 let prAmtX18 = t1(prAmt, prAsDcm)
294294 let lpAmtX18 = t1(lpAmt, scale8)
295295 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
296296 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
297297 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
298298 }
299299
300300
301301 func calculatePrices (amAmt,prAmt,lpAmt) = {
302302 let p = calcPrices(amAmt, prAmt, lpAmt)
303303 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
304304 }
305305
306306
307307 func takeFee (amount) = {
308308 let feeAmount = fraction(amount, fee, scale8)
309309 $Tuple2((amount - feeAmount), feeAmount)
310310 }
311311
312312
313313 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
314314 let lpId = cfgLpAssetId
315315 let amId = toBase58String(value(cfgAmountAssetId))
316316 let prId = toBase58String(value(cfgPriceAssetId))
317317 let amDcm = cfgAmountAssetDecimals
318318 let prDcm = cfgPriceAssetDecimals
319319 let sts = toString(cfgPoolStatus)
320320 let lpEmiss = valueOrErrorMessage(assetInfo(lpId), "Wrong LP id").quantity
321321 if ((toBase58String(lpId) != pmtAssetId))
322322 then throw("Wrong pmt asset")
323323 else {
324324 let amBalance = getAccBalance(amId)
325325 let amBalanceX18 = t1(amBalance, amDcm)
326326 let prBalance = getAccBalance(prId)
327327 let prBalanceX18 = t1(prBalance, prDcm)
328328 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
329329 let curPrice = f1(curPriceX18, scale8)
330330 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
331331 let lpEmissX18 = t1(lpEmiss, scale8)
332332 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
333333 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
334334 let outAmAmt = fromX18Round(outAmAmtX18, amDcm, FLOOR)
335335 let outPrAmt = fromX18Round(outPrAmtX18, prDcm, FLOOR)
336336 let state = if ((txId58 == ""))
337337 then nil
338338 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
339339 then unit
340340 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
341341 then unit
342342 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
343343 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
344344 }
345345 }
346346
347347
348348 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
349349 let lpId = cfgLpAssetId
350350 let amIdStr = toBase58String(value(cfgAmountAssetId))
351351 let prIdStr = toBase58String(value(cfgPriceAssetId))
352352 let inAmIdStr = cfgInAmountAssedId
353353 let inPrIdStr = cfgInPriceAssetId
354354 let amtDcm = cfgAmountAssetDecimals
355355 let priceDcm = cfgPriceAssetDecimals
356356 let sts = toString(cfgPoolStatus)
357357 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
358358 let amBalance = if (isEval)
359359 then getAccBalance(amIdStr)
360360 else if (if (isOneAsset)
361361 then (pmtId == amIdStr)
362362 else false)
363363 then (getAccBalance(amIdStr) - pmtAmt)
364364 else if (isOneAsset)
365365 then getAccBalance(amIdStr)
366366 else (getAccBalance(amIdStr) - inAmAmt)
367367 let prBalance = if (isEval)
368368 then getAccBalance(prIdStr)
369369 else if (if (isOneAsset)
370370 then (pmtId == prIdStr)
371371 else false)
372372 then (getAccBalance(prIdStr) - pmtAmt)
373373 else if (isOneAsset)
374374 then getAccBalance(prIdStr)
375375 else (getAccBalance(prIdStr) - inPrAmt)
376376 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
377377 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
378378 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
379379 let amBalanceX18 = t1(amBalance, amtDcm)
380380 let prBalanceX18 = t1(prBalance, priceDcm)
381381 let r = if ((lpEm == 0))
382382 then {
383383 let curPriceX18 = zeroBigInt
384384 let slippageX18 = zeroBigInt
385385 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
386386 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
387387 }
388388 else {
389- let curPriceX18 = cpbir(prBalanceX18, amBalanceX18, CEILING)
389+ let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
390390 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
391391 let slippageX18 = t1(slippage, scale8)
392392 if (if (if (validateSlippage)
393393 then (curPriceX18 != zeroBigInt)
394394 else false)
395395 then (slippageRealX18 > slippageX18)
396396 else false)
397397 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
398398 else {
399399 let lpEmissionX18 = t1(lpEm, scale8)
400- let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18, CEILING)
401- let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18, CEILING)
400+ let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
401+ let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
402402 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
403403 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
404404 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
405405 let expAmtAssetAmtX18 = expectedAmts._1
406406 let expPriceAssetAmtX18 = expectedAmts._2
407- let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
407+ let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
408408 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
409409 }
410410 }
411411 let calcLpAmt = r._1
412412 let calcAmAssetPmt = r._2
413413 let calcPrAssetPmt = r._3
414414 let curPrice = f1(r._4, scale8)
415415 let slippageCalc = f1(r._5, scale8)
416416 if ((0 >= calcLpAmt))
417417 then throw("LP <= 0")
418418 else {
419419 let emitLpAmt = if (!(emitLp))
420420 then 0
421421 else calcLpAmt
422422 let amDiff = (inAmAmt - calcAmAssetPmt)
423423 let prDiff = (inPrAmt - calcPrAssetPmt)
424- let $t01832718672 = if (if (isOneAsset)
424+ let $t01838418729 = if (if (isOneAsset)
425425 then (pmtId == amIdStr)
426426 else false)
427427 then $Tuple2(pmtAmt, 0)
428428 else if (if (isOneAsset)
429429 then (pmtId == prIdStr)
430430 else false)
431431 then $Tuple2(0, pmtAmt)
432432 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
433- let writeAmAmt = $t01832718672._1
434- let writePrAmt = $t01832718672._2
433+ let writeAmAmt = $t01838418729._1
434+ let writePrAmt = $t01838418729._2
435435 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
436436 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
437437 }
438438 }
439439
440440
441441 func getD (xp) = {
442442 let xp0 = xp[0]
443443 let xp1 = xp[1]
444444 let s = (xp0 + xp1)
445445 if ((s == big0))
446446 then big0
447447 else {
448448 let a = parseIntValue(A)
449449 let ann = (a * 2)
450450 let p = fraction(xp0, xp1, big1)
451451 let xp0_xp1_n_n = fraction(p, big4, big1)
452452 let ann_s = fraction(toBigInt(ann), s, big1)
453453 let ann_1 = toBigInt((ann - 1))
454454 func calcDNext (d) = {
455455 let dd = fraction(d, d, big1)
456456 let ddd = fraction(dd, d, big1)
457457 let dp = fraction(ddd, big1, xp0_xp1_n_n)
458458 fraction((ann_s + fraction(dp, big2, big1)), d, (fraction(ann_1, d, big1) + fraction(big3, dp, big1)), CEILING)
459459 }
460460
461461 func calc (acc,i) = if (acc._2)
462462 then acc
463463 else {
464464 let d = acc._1
465465 let dNext = calcDNext(d)
466466 let dDiffRaw = toInt((dNext - value(d)))
467467 let dDiff = if ((0 > dDiffRaw))
468468 then -(dDiffRaw)
469469 else dDiffRaw
470470 if ((1 >= dDiff))
471471 then $Tuple2(dNext, true)
472472 else $Tuple2(dNext, false)
473473 }
474474
475475 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
476- let $t02060020648 = {
476+ let $t02065720705 = {
477477 let $l = arr
478478 let $s = size($l)
479479 let $acc0 = $Tuple2(s, false)
480480 func $f0_1 ($a,$i) = if (($i >= $s))
481481 then $a
482482 else calc($a, $l[$i])
483483
484484 func $f0_2 ($a,$i) = if (($i >= $s))
485485 then $a
486486 else throw("List size exceeds 15")
487487
488488 $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($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
489489 }
490- let d = $t02060020648._1
491- let found = $t02060020648._2
490+ let d = $t02065720705._1
491+ let found = $t02065720705._2
492492 if (found)
493493 then d
494494 else throw(("D calculation error, D = " + toString(d)))
495495 }
496496 }
497497
498498
499499 func getDOld (xp) = {
500500 let n = big2
501501 let xp0 = xp[0]
502502 let xp1 = xp[1]
503503 let aPrecision = parseBigIntValue(Amult)
504504 let a = (parseBigIntValue(A) * aPrecision)
505505 let s = (xp0 + xp1)
506506 if ((s == big0))
507507 then big0
508508 else {
509509 let ann = (a * n)
510510 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
511511 let ann_s_aPrecision = ((ann * s) / aPrecision)
512512 let ann_aPrecision = (ann - aPrecision)
513513 let n1 = (n + big1)
514514 func calc (acc,cur) = {
515- let $t02127721297 = acc
516- let d = $t02127721297._1
517- let found = $t02127721297._2
515+ let $t02133421354 = acc
516+ let d = $t02133421354._1
517+ let found = $t02133421354._2
518518 if ((found != unit))
519519 then acc
520520 else {
521521 let dp = (((d * d) * d) / xp0_xp1_n_n)
522522 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
523523 let dDiff = absBigInt((dNext - value(d)))
524524 if ((big1 >= dDiff))
525525 then $Tuple2(dNext, cur)
526526 else $Tuple2(dNext, unit)
527527 }
528528 }
529529
530530 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
531- let $t02171821765 = {
531+ let $t02177521822 = {
532532 let $l = arr
533533 let $s = size($l)
534534 let $acc0 = $Tuple2(s, unit)
535535 func $f0_1 ($a,$i) = if (($i >= $s))
536536 then $a
537537 else calc($a, $l[$i])
538538
539539 func $f0_2 ($a,$i) = if (($i >= $s))
540540 then $a
541541 else throw("List size exceeds 15")
542542
543543 $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($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
544544 }
545- let d = $t02171821765._1
546- let found = $t02171821765._2
545+ let d = $t02177521822._1
546+ let found = $t02177521822._2
547547 if ((found != unit))
548548 then d
549549 else throw(("D calculation error, D = " + toString(d)))
550550 }
551551 }
552552
553553
554554 func getYD (xp,i,D) = {
555555 let n = big2
556556 let x = xp[if ((i == 0))
557557 then 1
558558 else 0]
559559 let aPrecision = parseBigIntValue(Amult)
560560 let a = (parseBigIntValue(A) * aPrecision)
561561 let s = x
562562 let ann = (a * n)
563563 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
564564 let b = ((s + ((D * aPrecision) / ann)) - D)
565565 func calc (acc,cur) = {
566- let $t02226522285 = acc
567- let y = $t02226522285._1
568- let found = $t02226522285._2
566+ let $t02232222342 = acc
567+ let y = $t02232222342._1
568+ let found = $t02232222342._2
569569 if ((found != unit))
570570 then acc
571571 else {
572572 let yNext = (((y * y) + c) / ((big2 * y) + b))
573573 let yDiff = absBigInt((yNext - value(y)))
574574 if ((big1 >= yDiff))
575575 then $Tuple2(yNext, cur)
576576 else $Tuple2(yNext, unit)
577577 }
578578 }
579579
580580 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
581- let $t02259222639 = {
581+ let $t02264922696 = {
582582 let $l = arr
583583 let $s = size($l)
584584 let $acc0 = $Tuple2(D, unit)
585585 func $f0_1 ($a,$i) = if (($i >= $s))
586586 then $a
587587 else calc($a, $l[$i])
588588
589589 func $f0_2 ($a,$i) = if (($i >= $s))
590590 then $a
591591 else throw("List size exceeds 15")
592592
593593 $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($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
594594 }
595- let y = $t02259222639._1
596- let found = $t02259222639._2
595+ let y = $t02264922696._1
596+ let found = $t02264922696._2
597597 if ((found != unit))
598598 then y
599599 else throw(("Y calculation error, Y = " + toString(y)))
600600 }
601601
602602
603603 func calcDLp (amountBalance,priceBalance,lpEmission) = {
604604 let updatedDLp = fraction(getD([amountBalance, priceBalance]), scale18, lpEmission)
605605 if ((lpEmission == big0))
606606 then big0
607607 else updatedDLp
608608 }
609609
610610
611611 func calcCurrentDLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
612612 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
613613 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
614614 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
615615 let currentDLp = calcDLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
616616 currentDLp
617617 }
618618
619619
620620 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
621621 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
622622 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
623623 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
624624 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
625625 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
626626 $Tuple2(actions, updatedDLp)
627627 }
628628
629629
630630 func validateUpdatedDLp (oldDLp,updatedDLp) = if ((updatedDLp >= oldDLp))
631631 then true
632632 else throwErr("updated DLp lower than current DLp")
633633
634634
635635 func validateMatcherOrderAllowed (order) = {
636636 let amountAssetAmount = order.amount
637637 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
638- let $t02457824790 = if ((order.orderType == Buy))
638+ let $t02463524847 = if ((order.orderType == Buy))
639639 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
640640 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
641- let amountAssetBalanceDelta = $t02457824790._1
642- let priceAssetBalanceDelta = $t02457824790._2
641+ let amountAssetBalanceDelta = $t02463524847._1
642+ let priceAssetBalanceDelta = $t02463524847._2
643643 if (if (if (igs())
644644 then true
645645 else (cfgPoolStatus == PoolMatcherDis))
646646 then true
647647 else (cfgPoolStatus == PoolShutdown))
648648 then throw("Admin blocked")
649649 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
650650 then true
651651 else (order.assetPair.priceAsset != cfgPriceAssetId))
652652 then throw("Wr assets")
653653 else {
654654 let dLp = parseBigIntValue(getStringValue(this, keyDLp))
655- let $t02512025220 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
656- let unusedActions = $t02512025220._1
657- let dLpNew = $t02512025220._2
655+ let $t02517725277 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
656+ let unusedActions = $t02517725277._1
657+ let dLpNew = $t02517725277._2
658658 let isOrderValid = (dLpNew >= dLp)
659659 isOrderValid
660660 }
661661 }
662662
663663
664664 func cg (i) = if ((size(i.payments) != 1))
665665 then throw("1 pmnt exp")
666666 else {
667667 let pmt = value(i.payments[0])
668668 let pmtAssetId = value(pmt.assetId)
669669 let pmtAmt = pmt.amount
670670 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
671671 let outAmAmt = r._1
672672 let outPrAmt = r._2
673673 let sts = parseIntValue(r._9)
674674 let state = r._10
675675 if (if (igs())
676676 then true
677677 else (sts == PoolShutdown))
678678 then throw(("Admin blocked: " + toString(sts)))
679679 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
680680 }
681681
682682
683683 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
684684 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
685685 let sts = parseIntValue(r._8)
686686 if (if (if (igs())
687687 then true
688688 else (sts == PoolPutDis))
689689 then true
690690 else (sts == PoolShutdown))
691691 then throw(("Blocked:" + toString(sts)))
692692 else r
693693 }
694694
695695
696696 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
697697 let amId = toBase58String(value(cfgAmountAssetId))
698698 let prId = toBase58String(value(cfgPriceAssetId))
699699 let lpId = cfgLpAssetId
700700 let amtDcm = cfgAmountAssetDecimals
701701 let priceDcm = cfgPriceAssetDecimals
702702 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(lpId), "invalid lp asset").quantity)
703703 let chechEmission = if ((lpAssetEmission > big0))
704704 then true
705705 else throw("initial deposit requires all coins")
706706 if ((chechEmission == chechEmission))
707707 then {
708708 let amBalance = getAccBalance(amId)
709709 let prBalance = getAccBalance(prId)
710- let $t02748627948 = if ((txId == ""))
710+ let $t02754328005 = if ((txId == ""))
711711 then $Tuple2(amBalance, prBalance)
712712 else if ((pmtAssetId == amId))
713713 then if ((pmtAmtRaw > amBalance))
714714 then throw("invalid payment amount")
715715 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
716716 else if ((pmtAssetId == prId))
717717 then if ((pmtAmtRaw > prBalance))
718718 then throw("invalid payment amount")
719719 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
720720 else throw("wrong pmtAssetId")
721- let amBalanceOld = $t02748627948._1
722- let prBalanceOld = $t02748627948._2
723- let $t02795428130 = if ((pmtAssetId == amId))
721+ let amBalanceOld = $t02754328005._1
722+ let prBalanceOld = $t02754328005._2
723+ let $t02801128187 = if ((pmtAssetId == amId))
724724 then $Tuple2(pmtAmtRaw, 0)
725725 else if ((pmtAssetId == prId))
726726 then $Tuple2(0, pmtAmtRaw)
727727 else throw("invalid payment")
728- let amAmountRaw = $t02795428130._1
729- let prAmountRaw = $t02795428130._2
730- let $t02813428373 = if (withTakeFee)
728+ let amAmountRaw = $t02801128187._1
729+ let prAmountRaw = $t02801128187._2
730+ let $t02819128430 = if (withTakeFee)
731731 then $Tuple3(takeFee(amAmountRaw)._1, takeFee(prAmountRaw)._1, takeFee(pmtAmtRaw)._2)
732732 else $Tuple3(amAmountRaw, prAmountRaw, 0)
733- let amAmount = $t02813428373._1
734- let prAmount = $t02813428373._2
735- let feeAmount = $t02813428373._3
733+ let amAmount = $t02819128430._1
734+ let prAmount = $t02819128430._2
735+ let feeAmount = $t02819128430._3
736736 let amBalanceNew = (amBalanceOld + amAmount)
737737 let prBalanceNew = (prBalanceOld + prAmount)
738738 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
739739 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
740740 let checkD = if ((D1 > D0))
741741 then true
742742 else throw()
743743 if ((checkD == checkD))
744744 then {
745745 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0, FLOOR)
746746 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
747747 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId), dataPutActionInfo(amAmountRaw, prAmountRaw, toInt(lpAmount), curPrice, 0, 0, height, lastBlock.timestamp, 0, 0))]
748748 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
749749 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
750750 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
751751 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
752752 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
753753 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
754754 }
755755 else throw("Strict value is not equal to itself.")
756756 }
757757 else throw("Strict value is not equal to itself.")
758758 }
759759
760760
761761 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
762762 let lpId = toBase58String(value(cfgLpAssetId))
763763 let amId = toBase58String(value(cfgAmountAssetId))
764764 let prId = toBase58String(value(cfgPriceAssetId))
765765 let amDecimals = cfgAmountAssetDecimals
766766 let prDecimals = cfgPriceAssetDecimals
767767 let poolStatus = cfgPoolStatus
768768 let userAddress = if ((caller == restContract))
769769 then originCaller
770770 else caller
771771 let pmt = value(payments[0])
772772 let pmtAssetId = value(pmt.assetId)
773773 let pmtAmt = pmt.amount
774774 let currentDLp = calcCurrentDLp(big0, big0, big0)
775775 if ((currentDLp == currentDLp))
776776 then {
777777 let txId58 = toBase58String(transactionId)
778778 if ((lpId != toBase58String(pmtAssetId)))
779779 then throw("Wrong LP")
780780 else {
781781 let amBalance = getAccBalance(amId)
782782 let prBalance = getAccBalance(prId)
783- let $t03042330534 = {
783+ let $t03048030591 = {
784784 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
785785 if ($isInstanceOf(@, "(Int, Int)"))
786786 then @
787787 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
788788 }
789- if (($t03042330534 == $t03042330534))
789+ if (($t03048030591 == $t03048030591))
790790 then {
791- let feeAmount = $t03042330534._2
792- let totalGet = $t03042330534._1
791+ let feeAmount = $t03048030591._2
792+ let totalGet = $t03048030591._1
793793 let totalAmount = if (if ((minOutAmount > 0))
794794 then (minOutAmount > totalGet)
795795 else false)
796796 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
797797 else totalGet
798- let $t03072431031 = if ((outAssetId == amId))
798+ let $t03078131088 = if ((outAssetId == amId))
799799 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
800800 else if ((outAssetId == prId))
801801 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
802802 else throw("invalid out asset id")
803- let outAm = $t03072431031._1
804- let outPr = $t03072431031._2
805- let amBalanceNew = $t03072431031._3
806- let prBalanceNew = $t03072431031._4
803+ let outAm = $t03078131088._1
804+ let outPr = $t03078131088._2
805+ let amBalanceNew = $t03078131088._3
806+ let prBalanceNew = $t03078131088._4
807807 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
808808 let curPr = f1(curPrX18, scale8)
809809 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
810810 then unit
811811 else fromBase58String(outAssetId)
812812 let sendFeeToMatcher = if ((feeAmount > 0))
813813 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
814814 else nil
815815 let state = ([ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)] ++ sendFeeToMatcher)
816816 if ((state == state))
817817 then {
818818 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
819819 if ((burn == burn))
820820 then {
821- let $t03181632166 = {
821+ let $t03187332223 = {
822822 let feeAmountForCalc = if ((this == feeCollectorAddress))
823823 then 0
824824 else feeAmount
825825 let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
826826 then true
827827 else false
828828 if (outInAmountAsset)
829829 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
830830 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
831831 }
832- let amountAssetBalanceDelta = $t03181632166._1
833- let priceAssetBalanceDelta = $t03181632166._2
834- let $t03216932277 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
835- let refreshDLpActions = $t03216932277._1
836- let updatedDLp = $t03216932277._2
832+ let amountAssetBalanceDelta = $t03187332223._1
833+ let priceAssetBalanceDelta = $t03187332223._2
834+ let $t03222632334 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
835+ let refreshDLpActions = $t03222632334._1
836+ let updatedDLp = $t03222632334._2
837837 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
838838 if ((isUpdatedDLpValid == isUpdatedDLpValid))
839839 then $Tuple2((state ++ refreshDLpActions), totalAmount)
840840 else throw("Strict value is not equal to itself.")
841841 }
842842 else throw("Strict value is not equal to itself.")
843843 }
844844 else throw("Strict value is not equal to itself.")
845845 }
846846 else throw("Strict value is not equal to itself.")
847847 }
848848 }
849849 else throw("Strict value is not equal to itself.")
850850 }
851851
852852
853853 func m () = match getString(mpk()) {
854854 case s: String =>
855855 fromBase58String(s)
856856 case _: Unit =>
857857 unit
858858 case _ =>
859859 throw("Match error")
860860 }
861861
862862
863863 func pm () = match getString(pmpk()) {
864864 case s: String =>
865865 fromBase58String(s)
866866 case _: Unit =>
867867 unit
868868 case _ =>
869869 throw("Match error")
870870 }
871871
872872
873873 let pd = throw("Permission denied")
874874
875875 func isManager (i) = match m() {
876876 case pk: ByteVector =>
877877 (i.callerPublicKey == pk)
878878 case _: Unit =>
879879 (i.caller == this)
880880 case _ =>
881881 throw("Match error")
882882 }
883883
884884
885885 func mm (i) = match m() {
886886 case pk: ByteVector =>
887887 if ((i.callerPublicKey == pk))
888888 then true
889889 else pd
890890 case _: Unit =>
891891 if ((i.caller == this))
892892 then true
893893 else pd
894894 case _ =>
895895 throw("Match error")
896896 }
897897
898898
899899 @Callable(i)
900900 func constructor (fc) = {
901901 let c = mm(i)
902902 if ((c == c))
903903 then [StringEntry(fc(), fc)]
904904 else throw("Strict value is not equal to itself.")
905905 }
906906
907907
908908
909909 @Callable(i)
910910 func setManager (pendingManagerPublicKey) = {
911911 let c = mm(i)
912912 if ((c == c))
913913 then {
914914 let cm = fromBase58String(pendingManagerPublicKey)
915915 if ((cm == cm))
916916 then [StringEntry(pmpk(), pendingManagerPublicKey)]
917917 else throw("Strict value is not equal to itself.")
918918 }
919919 else throw("Strict value is not equal to itself.")
920920 }
921921
922922
923923
924924 @Callable(i)
925925 func confirmManager () = {
926926 let p = pm()
927927 let hpm = if (isDefined(p))
928928 then true
929929 else throw("No pending manager")
930930 if ((hpm == hpm))
931931 then {
932932 let cpm = if ((i.callerPublicKey == value(p)))
933933 then true
934934 else throw("You are not pending manager")
935935 if ((cpm == cpm))
936936 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
937937 else throw("Strict value is not equal to itself.")
938938 }
939939 else throw("Strict value is not equal to itself.")
940940 }
941941
942942
943943
944944 @Callable(i)
945945 func put (slip,autoStake) = {
946946 let factCfg = gfc()
947947 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
948948 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
949949 if ((0 > slip))
950950 then throw("Wrong slippage")
951951 else if ((size(i.payments) != 2))
952952 then throw("2 pmnts expd")
953953 else {
954954 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
955955 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
956956 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amAssetPmt)
957957 if ((amountAssetBalance == amountAssetBalance))
958958 then {
959959 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - prAssetPmt)
960960 if ((priceAssetBalance == priceAssetBalance))
961961 then {
962962 let lpAssetEmission = toBigInt(value(assetInfo(cfgLpAssetId)).quantity)
963963 if ((lpAssetEmission == lpAssetEmission))
964964 then {
965965 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
966966 if ((currentDLp == currentDLp))
967967 then {
968968 let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, true, 0, "")
969969 let emitLpAmt = e._2
970970 let lpAssetId = e._7
971971 let state = e._9
972972 let amDiff = e._10
973973 let prDiff = e._11
974974 let amId = e._12
975975 let prId = e._13
976976 let r = invoke(fca, "emit", [emitLpAmt], nil)
977977 if ((r == r))
978978 then {
979979 let el = match r {
980980 case legacy: Address =>
981981 invoke(legacy, "emit", [emitLpAmt], nil)
982982 case _ =>
983983 unit
984984 }
985985 if ((el == el))
986986 then {
987987 let sa = if ((amDiff > 0))
988988 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
989989 else nil
990990 if ((sa == sa))
991991 then {
992992 let sp = if ((prDiff > 0))
993993 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
994994 else nil
995995 if ((sp == sp))
996996 then {
997997 let lpTrnsfr = if (autoStake)
998998 then {
999999 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
10001000 if ((ss == ss))
10011001 then nil
10021002 else throw("Strict value is not equal to itself.")
10031003 }
10041004 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1005- let $t03642636568 = refreshDLpInternal(0, 0, 0)
1006- let refreshDLpActions = $t03642636568._1
1007- let updatedDLp = $t03642636568._2
1005+ let $t03648336625 = refreshDLpInternal(0, 0, 0)
1006+ let refreshDLpActions = $t03648336625._1
1007+ let updatedDLp = $t03648336625._2
10081008 let check = if ((updatedDLp >= currentDLp))
10091009 then true
10101010 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp)], " "))
10111011 if ((check == check))
10121012 then {
10131013 let lpAssetEmissionAfter = value(assetInfo(cfgLpAssetId)).quantity
10141014 if ((lpAssetEmissionAfter == lpAssetEmissionAfter))
10151015 then ((state ++ lpTrnsfr) ++ refreshDLpActions)
10161016 else throw("Strict value is not equal to itself.")
10171017 }
10181018 else throw("Strict value is not equal to itself.")
10191019 }
10201020 else throw("Strict value is not equal to itself.")
10211021 }
10221022 else throw("Strict value is not equal to itself.")
10231023 }
10241024 else throw("Strict value is not equal to itself.")
10251025 }
10261026 else throw("Strict value is not equal to itself.")
10271027 }
10281028 else throw("Strict value is not equal to itself.")
10291029 }
10301030 else throw("Strict value is not equal to itself.")
10311031 }
10321032 else throw("Strict value is not equal to itself.")
10331033 }
10341034 else throw("Strict value is not equal to itself.")
10351035 }
10361036 }
10371037
10381038
10391039
10401040 @Callable(i)
10411041 func putOneTknV2 (minOutAmount,autoStake) = {
10421042 let isPoolOneTokenOperationsDisabled = {
10431043 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
10441044 if ($isInstanceOf(@, "Boolean"))
10451045 then @
10461046 else throw(($getType(@) + " couldn't be cast to Boolean"))
10471047 }
10481048 let isPutDisabled = if (if (if (igs())
10491049 then true
10501050 else (cfgPoolStatus == PoolPutDis))
10511051 then true
10521052 else (cfgPoolStatus == PoolShutdown))
10531053 then true
10541054 else isPoolOneTokenOperationsDisabled
10551055 let checks = [if (if (!(isPutDisabled))
10561056 then true
10571057 else isManager(i))
10581058 then true
10591059 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
10601060 then true
10611061 else throwErr("exactly 1 payment are expected")]
10621062 if ((checks == checks))
10631063 then {
10641064 let amId = toBase58String(value(cfgAmountAssetId))
10651065 let prId = toBase58String(value(cfgPriceAssetId))
10661066 let lpId = cfgLpAssetId
10671067 let amDecimals = cfgAmountAssetDecimals
10681068 let prDecimals = cfgPriceAssetDecimals
10691069 let userAddress = if ((i.caller == this))
10701070 then i.originCaller
10711071 else i.caller
10721072 let pmt = value(i.payments[0])
10731073 let pmtAssetId = toBase58String(value(pmt.assetId))
10741074 let pmtAmt = pmt.amount
10751075 let currentDLp = if ((pmt.assetId == cfgAmountAssetId))
10761076 then calcCurrentDLp(toBigInt(pmtAmt), toBigInt(0), toBigInt(0))
10771077 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
10781078 if ((currentDLp == currentDLp))
10791079 then {
1080- let $t03836938527 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1081- if (($t03836938527 == $t03836938527))
1080+ let $t03853138689 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1081+ if (($t03853138689 == $t03853138689))
10821082 then {
1083- let feeAmount = $t03836938527._3
1084- let state = $t03836938527._2
1085- let estimLP = $t03836938527._1
1083+ let feeAmount = $t03853138689._3
1084+ let state = $t03853138689._2
1085+ let estimLP = $t03853138689._1
10861086 let emitLpAmt = if (if ((minOutAmount > 0))
10871087 then (minOutAmount > estimLP)
10881088 else false)
10891089 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
10901090 else estimLP
10911091 let e = invoke(fca, "emit", [emitLpAmt], nil)
10921092 if ((e == e))
10931093 then {
10941094 let el = match e {
10951095 case legacy: Address =>
10961096 invoke(legacy, "emit", [emitLpAmt], nil)
10971097 case _ =>
10981098 unit
10991099 }
11001100 if ((el == el))
11011101 then {
11021102 let lpTrnsfr = if (autoStake)
11031103 then {
11041104 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
11051105 if ((ss == ss))
11061106 then nil
11071107 else throw("Strict value is not equal to itself.")
11081108 }
11091109 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
11101110 let sendFeeToMatcher = if ((feeAmount > 0))
11111111 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
11121112 else nil
1113- let $t03934239691 = if ((this == feeCollectorAddress))
1113+ let $t03950439853 = if ((this == feeCollectorAddress))
11141114 then $Tuple2(0, 0)
11151115 else {
11161116 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
11171117 then true
11181118 else false
11191119 if (paymentInAmountAsset)
11201120 then $Tuple2(-(feeAmount), 0)
11211121 else $Tuple2(0, -(feeAmount))
11221122 }
1123- let amountAssetBalanceDelta = $t03934239691._1
1124- let priceAssetBalanceDelta = $t03934239691._2
1125- let $t03969439802 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1126- let refreshDLpActions = $t03969439802._1
1127- let updatedDLp = $t03969439802._2
1123+ let amountAssetBalanceDelta = $t03950439853._1
1124+ let priceAssetBalanceDelta = $t03950439853._2
1125+ let $t03985639964 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1126+ let refreshDLpActions = $t03985639964._1
1127+ let updatedDLp = $t03985639964._2
11281128 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11291129 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11301130 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
11311131 else throw("Strict value is not equal to itself.")
11321132 }
11331133 else throw("Strict value is not equal to itself.")
11341134 }
11351135 else throw("Strict value is not equal to itself.")
11361136 }
11371137 else throw("Strict value is not equal to itself.")
11381138 }
11391139 else throw("Strict value is not equal to itself.")
11401140 }
11411141 else throw("Strict value is not equal to itself.")
11421142 }
11431143
11441144
11451145
11461146 @Callable(i)
11471147 func putForFree (maxSlpg) = if ((0 > maxSlpg))
11481148 then throw("Wrong slpg")
11491149 else if ((size(i.payments) != 2))
11501150 then throw("2 pmnts expd")
11511151 else {
11521152 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
11531153 let state = estPut._9
11541154 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11551155 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11561156 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11571157 if ((currentDLp == currentDLp))
11581158 then {
1159- let $t04083240897 = refreshDLpInternal(0, 0, 0)
1160- let refreshDLpActions = $t04083240897._1
1161- let updatedDLp = $t04083240897._2
1159+ let $t04099441059 = refreshDLpInternal(0, 0, 0)
1160+ let refreshDLpActions = $t04099441059._1
1161+ let updatedDLp = $t04099441059._2
11621162 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11631163 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11641164 then (state ++ refreshDLpActions)
11651165 else throw("Strict value is not equal to itself.")
11661166 }
11671167 else throw("Strict value is not equal to itself.")
11681168 }
11691169
11701170
11711171
11721172 @Callable(i)
11731173 func get () = {
11741174 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
11751175 if ((currentDLp == currentDLp))
11761176 then {
11771177 let r = cg(i)
11781178 let outAmtAmt = r._1
11791179 let outPrAmt = r._2
11801180 let pmtAmt = r._3
11811181 let pmtAssetId = r._4
11821182 let state = r._5
11831183 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11841184 if ((b == b))
11851185 then {
1186- let $t04207042152 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1187- let refreshDLpActions = $t04207042152._1
1188- let updatedDLp = $t04207042152._2
1186+ let $t04223242314 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1187+ let refreshDLpActions = $t04223242314._1
1188+ let updatedDLp = $t04223242314._2
11891189 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11901190 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11911191 then (state ++ refreshDLpActions)
11921192 else throw("Strict value is not equal to itself.")
11931193 }
11941194 else throw("Strict value is not equal to itself.")
11951195 }
11961196 else throw("Strict value is not equal to itself.")
11971197 }
11981198
11991199
12001200
12011201 @Callable(i)
12021202 func getOneTknV2 (outAssetId,minOutAmount) = {
12031203 let isPoolOneTokenOperationsDisabled = {
12041204 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12051205 if ($isInstanceOf(@, "Boolean"))
12061206 then @
12071207 else throw(($getType(@) + " couldn't be cast to Boolean"))
12081208 }
12091209 let isGetDisabled = if (if (igs())
12101210 then true
12111211 else (cfgPoolStatus == PoolShutdown))
12121212 then true
12131213 else isPoolOneTokenOperationsDisabled
12141214 let checks = [if (if (!(isGetDisabled))
12151215 then true
12161216 else isManager(i))
12171217 then true
12181218 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
12191219 then true
12201220 else throwErr("exactly 1 payment are expected")]
12211221 if ((checks == checks))
12221222 then {
1223- let $t04277042925 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1224- let state = $t04277042925._1
1225- let totalAmount = $t04277042925._2
1223+ let $t04293243087 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1224+ let state = $t04293243087._1
1225+ let totalAmount = $t04293243087._2
12261226 $Tuple2(state, totalAmount)
12271227 }
12281228 else throw("Strict value is not equal to itself.")
12291229 }
12301230
12311231
12321232
12331233 @Callable(i)
12341234 func refreshDLp () = {
12351235 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
12361236 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
12371237 then unit
12381238 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
12391239 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
12401240 then {
12411241 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1242- let $t04344943513 = refreshDLpInternal(0, 0, 0)
1243- let dLpUpdateActions = $t04344943513._1
1244- let updatedDLp = $t04344943513._2
1242+ let $t04361143675 = refreshDLpInternal(0, 0, 0)
1243+ let dLpUpdateActions = $t04361143675._1
1244+ let updatedDLp = $t04361143675._2
12451245 let actions = if ((dLp != updatedDLp))
12461246 then dLpUpdateActions
12471247 else throwErr("nothing to refresh")
12481248 $Tuple2(actions, toString(updatedDLp))
12491249 }
12501250 else throw("Strict value is not equal to itself.")
12511251 }
12521252
12531253
12541254
12551255 @Callable(i)
12561256 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
12571257 let amId = toBase58String(value(cfgAmountAssetId))
12581258 let prId = toBase58String(value(cfgPriceAssetId))
12591259 let lpId = toBase58String(value(cfgLpAssetId))
12601260 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
12611261 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
12621262 let D0 = getD(xp)
12631263 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
12641264 let index = if ((outAssetId == amId))
12651265 then 0
12661266 else if ((outAssetId == prId))
12671267 then 1
12681268 else throw("invalid out asset id")
12691269 let newY = getYD(xp, index, D1)
12701270 let dy = (xp[index] - newY)
12711271 let totalGetRaw = max([0, toInt((dy - big1))])
1272- let $t04444344492 = takeFee(totalGetRaw)
1273- let totalGet = $t04444344492._1
1274- let feeAmount = $t04444344492._2
1272+ let $t04460544654 = takeFee(totalGetRaw)
1273+ let totalGet = $t04460544654._1
1274+ let feeAmount = $t04460544654._2
12751275 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
12761276 }
12771277
12781278
12791279
12801280 @Callable(i)
12811281 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
12821282 let amId = toBase58String(value(cfgAmountAssetId))
12831283 let prId = toBase58String(value(cfgPriceAssetId))
12841284 let lpId = toBase58String(value(cfgLpAssetId))
12851285 let amBalance = getAccBalance(amId)
12861286 let prBalance = getAccBalance(prId)
1287- let $t04486744982 = {
1287+ let $t04502945144 = {
12881288 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
12891289 if ($isInstanceOf(@, "(Int, Int)"))
12901290 then @
12911291 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
12921292 }
1293- let totalGet = $t04486744982._1
1294- let feeAmount = $t04486744982._2
1293+ let totalGet = $t04502945144._1
1294+ let feeAmount = $t04502945144._2
12951295 let r = ego("", lpId, lpAssetAmount, this)
12961296 let outAmAmt = r._1
12971297 let outPrAmt = r._2
12981298 let sumOfGetAssets = (outAmAmt + outPrAmt)
12991299 let bonus = if ((sumOfGetAssets == 0))
13001300 then if ((totalGet == 0))
13011301 then 0
13021302 else throw("bonus calculation error")
13031303 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
13041304 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
13051305 }
13061306
13071307
13081308
13091309 @Callable(i)
13101310 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
13111311 let aab = toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId)))
13121312 if ((aab == aab))
13131313 then {
13141314 let pab = toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId)))
13151315 if ((pab == pab))
13161316 then {
13171317 let lae = toBigInt(value(assetInfo(cfgLpAssetId)).quantity)
13181318 if ((lae == lae))
13191319 then {
13201320 let laea = (lae - toBigInt(value(i.payments[0]).amount))
13211321 if ((laea == laea))
13221322 then {
13231323 let r = cg(i)
13241324 let outAmAmt = r._1
13251325 let outPrAmt = r._2
13261326 let pmtAmt = r._3
13271327 let pmtAssetId = r._4
13281328 let state = r._5
13291329 if ((noLessThenAmtAsset > outAmAmt))
13301330 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
13311331 else if ((noLessThenPriceAsset > outPrAmt))
13321332 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
13331333 else {
13341334 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13351335 if ((currentDLp == currentDLp))
13361336 then {
13371337 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13381338 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13391339 then {
1340- let $t04652146602 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1341- let refreshDLpActions = $t04652146602._1
1342- let updatedDLp = $t04652146602._2
1340+ let $t04668346764 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1341+ let refreshDLpActions = $t04668346764._1
1342+ let updatedDLp = $t04668346764._2
13431343 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13441344 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13451345 then (state ++ refreshDLpActions)
13461346 else throw("Strict value is not equal to itself.")
13471347 }
13481348 else throw("Strict value is not equal to itself.")
13491349 }
13501350 else throw("Strict value is not equal to itself.")
13511351 }
13521352 }
13531353 else throw("Strict value is not equal to itself.")
13541354 }
13551355 else throw("Strict value is not equal to itself.")
13561356 }
13571357 else throw("Strict value is not equal to itself.")
13581358 }
13591359 else throw("Strict value is not equal to itself.")
13601360 }
13611361
13621362
13631363
13641364 @Callable(i)
13651365 func unstakeAndGet (amount) = {
13661366 let checkPayments = if ((size(i.payments) != 0))
13671367 then throw("No pmnts expd")
13681368 else true
13691369 if ((checkPayments == checkPayments))
13701370 then {
13711371 let factoryCfg = gfc()
13721372 let lpAssetId = cfgLpAssetId
13731373 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
13741374 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13751375 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
13761376 if ((unstakeInv == unstakeInv))
13771377 then {
13781378 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
13791379 let outAmAmt = r._1
13801380 let outPrAmt = r._2
13811381 let sts = parseIntValue(r._9)
13821382 let state = r._10
13831383 let v = if (if (igs())
13841384 then true
13851385 else (sts == PoolShutdown))
13861386 then throw(("Blocked: " + toString(sts)))
13871387 else true
13881388 if ((v == v))
13891389 then {
13901390 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
13911391 if ((burnA == burnA))
13921392 then {
1393- let $t04762647707 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1394- let refreshDLpActions = $t04762647707._1
1395- let updatedDLp = $t04762647707._2
1393+ let $t04778847869 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1394+ let refreshDLpActions = $t04778847869._1
1395+ let updatedDLp = $t04778847869._2
13961396 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13971397 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13981398 then (state ++ refreshDLpActions)
13991399 else throw("Strict value is not equal to itself.")
14001400 }
14011401 else throw("Strict value is not equal to itself.")
14021402 }
14031403 else throw("Strict value is not equal to itself.")
14041404 }
14051405 else throw("Strict value is not equal to itself.")
14061406 }
14071407 else throw("Strict value is not equal to itself.")
14081408 }
14091409
14101410
14111411
14121412 @Callable(i)
14131413 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
14141414 let isGetDisabled = if (igs())
14151415 then true
14161416 else (cfgPoolStatus == PoolShutdown)
14171417 let checks = [if (!(isGetDisabled))
14181418 then true
14191419 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
14201420 then true
14211421 else throw("no payments are expected")]
14221422 if ((checks == checks))
14231423 then {
14241424 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
14251425 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
14261426 if ((unstakeInv == unstakeInv))
14271427 then {
14281428 let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
14291429 let outAmAmt = res._1
14301430 let outPrAmt = res._2
14311431 let state = res._10
14321432 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
14331433 then true
14341434 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
14351435 then true
14361436 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
14371437 if ((checkAmounts == checkAmounts))
14381438 then {
14391439 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
14401440 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14411441 then {
1442- let $t04895549036 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1443- let refreshDLpActions = $t04895549036._1
1444- let updatedDLp = $t04895549036._2
1442+ let $t04911749198 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1443+ let refreshDLpActions = $t04911749198._1
1444+ let updatedDLp = $t04911749198._2
14451445 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
14461446 if ((isUpdatedDLpValid == isUpdatedDLpValid))
14471447 then (state ++ refreshDLpActions)
14481448 else throw("Strict value is not equal to itself.")
14491449 }
14501450 else throw("Strict value is not equal to itself.")
14511451 }
14521452 else throw("Strict value is not equal to itself.")
14531453 }
14541454 else throw("Strict value is not equal to itself.")
14551455 }
14561456 else throw("Strict value is not equal to itself.")
14571457 }
14581458
14591459
14601460
14611461 @Callable(i)
14621462 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
14631463 let isPoolOneTokenOperationsDisabled = {
14641464 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
14651465 if ($isInstanceOf(@, "Boolean"))
14661466 then @
14671467 else throw(($getType(@) + " couldn't be cast to Boolean"))
14681468 }
14691469 let isGetDisabled = if (if (igs())
14701470 then true
14711471 else (cfgPoolStatus == PoolShutdown))
14721472 then true
14731473 else isPoolOneTokenOperationsDisabled
14741474 let checks = [if (if (!(isGetDisabled))
14751475 then true
14761476 else isManager(i))
14771477 then true
14781478 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
14791479 then true
14801480 else throwErr("no payments are expected")]
14811481 if ((checks == checks))
14821482 then {
14831483 let factoryCfg = gfc()
14841484 let lpAssetId = cfgLpAssetId
14851485 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
14861486 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
14871487 if ((unstakeInv == unstakeInv))
14881488 then {
1489- let $t04993150119 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1490- let state = $t04993150119._1
1491- let totalAmount = $t04993150119._2
1489+ let $t05009350281 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1490+ let state = $t05009350281._1
1491+ let totalAmount = $t05009350281._2
14921492 $Tuple2(state, totalAmount)
14931493 }
14941494 else throw("Strict value is not equal to itself.")
14951495 }
14961496 else throw("Strict value is not equal to itself.")
14971497 }
14981498
14991499
15001500
15011501 @Callable(i)
15021502 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1503- let $t05024750350 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1504- let lpAmount = $t05024750350._1
1505- let state = $t05024750350._2
1506- let feeAmount = $t05024750350._3
1507- let bonus = $t05024750350._4
1503+ let $t05040950512 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1504+ let lpAmount = $t05040950512._1
1505+ let state = $t05040950512._2
1506+ let feeAmount = $t05040950512._3
1507+ let bonus = $t05040950512._4
15081508 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
15091509 }
15101510
15111511
15121512
15131513 @Callable(i)
15141514 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1515- let $t05049850602 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1516- let lpAmount = $t05049850602._1
1517- let state = $t05049850602._2
1518- let feeAmount = $t05049850602._3
1519- let bonus = $t05049850602._4
1515+ let $t05066050764 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1516+ let lpAmount = $t05066050764._1
1517+ let state = $t05066050764._2
1518+ let feeAmount = $t05066050764._3
1519+ let bonus = $t05066050764._4
15201520 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
15211521 }
15221522
15231523
15241524
15251525 @Callable(i)
15261526 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
15271527 then throw("denied")
15281528 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
15291529
15301530
15311531
15321532 @Callable(i)
15331533 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
15341534 then pd
15351535 else [StringEntry(k, v)]
15361536
15371537
15381538
15391539 @Callable(i)
15401540 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
15411541 then pd
15421542 else [IntegerEntry(k, v)]
15431543
15441544
15451545
15461546 @Callable(i)
15471547 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
15481548
15491549
15501550
15511551 @Callable(i)
15521552 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
15531553
15541554
15551555
15561556 @Callable(i)
15571557 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
15581558 let pr = calcPrices(amAmt, prAmt, lpAmt)
15591559 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
15601560 }
15611561
15621562
15631563
15641564 @Callable(i)
15651565 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
15661566
15671567
15681568
15691569 @Callable(i)
15701570 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
15711571
15721572
15731573
15741574 @Callable(i)
15751575 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
15761576
15771577
15781578
15791579 @Callable(i)
15801580 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
15811581
15821582
15831583
15841584 @Callable(i)
15851585 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
15861586 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
15871587 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
15881588 }
15891589
15901590
15911591
15921592 @Callable(i)
15931593 func getFeeREADONLY () = $Tuple2(nil, fee)
15941594
15951595
15961596 @Verifier(tx)
15971597 func verify () = {
15981598 let targetPublicKey = match m() {
15991599 case pk: ByteVector =>
16001600 pk
16011601 case _: Unit =>
16021602 tx.senderPublicKey
16031603 case _ =>
16041604 throw("Match error")
16051605 }
16061606 match tx {
16071607 case order: Order =>
16081608 let matcherPub = mp()
16091609 let orderValid = validateMatcherOrderAllowed(order)
16101610 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
16111611 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
16121612 if (if (if (orderValid)
16131613 then senderValid
16141614 else false)
16151615 then matcherValid
16161616 else false)
16171617 then true
16181618 else toe(orderValid, senderValid, matcherValid)
16191619 case s: SetScriptTransaction =>
16201620 let newHash = blake2b256(value(s.script))
16211621 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
16221622 let currentHash = scriptHash(this)
16231623 if (if ((allowedHash == newHash))
16241624 then (currentHash != newHash)
16251625 else false)
16261626 then true
16271627 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
16281628 case _ =>
16291629 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
16301630 }
16311631 }
16321632

github/deemru/w8io/03bedc9 
205.83 ms