tx · DdWkR7ZZsbA5Y1groDktXxQ1dwBZpP3a5abCkKLiEFV8

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.02800000 Waves

2022.10.24 11:22 [2286247] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "DdWkR7ZZsbA5Y1groDktXxQ1dwBZpP3a5abCkKLiEFV8", "fee": 2800000, "feeAssetId": null, "timestamp": 1666599860586, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "31puUpPXW7v1eJj96ow2zLFDzPN3xBTVqX6NS5EbwqXrbTNqT662stqXTTU43SsSxipKqXzSCCpQvrh9tyDEBDkv" ], "script": "base64:BgKKHwgCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIECgIIARIECgIIARIECgIBARIDCgEBEgUKAwEIARIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgpzbGlwcGFnZTREIgVBbXVsdCIFRGNvbnYiA1NFUCIFRU1QVFkiClBvb2xBY3RpdmUiClBvb2xQdXREaXMiDlBvb2xNYXRjaGVyRGlzIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIglpZHhQb29sU3QiCWlkeExQQXNJZCIJaWR4QW1Bc0lkIglpZHhQckFzSWQiC2lkeEFtdEFzRGNtIg1pZHhQcmljZUFzRGNtIgtpZHhJQW10QXNJZCINaWR4SVByaWNlQXNJZCIPaWR4RmFjdFN0YWtDbnRyIhJpZHhGYWN0b3J5UmVzdENudHIiEGlkeEZhY3RTbGlwcENudHIiEWlkeEZhY3RHd3hSZXdDbnRyIgpmZWVEZWZhdWx0IgJ0MSIHb3JpZ1ZhbCINb3JpZ1NjYWxlTXVsdCICZjEiA3ZhbCIPcmVzdWx0U2NhbGVNdWx0IgJ0cyIDYW10IghyZXNTY2FsZSIIY3VyU2NhbGUiA2FicyIJYWJzQmlnSW50IgJmYyIDbXBrIgRwbXBrIgJwbCICcGgiAWgiAXQiA3BhdSICdWEiBHR4SWQiA2dhdSICYWEiAnBhIgNhbXAiA2FkYSIGa2V5RmVlIgNmZWUiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiA3RvZSIDb3JWIgZzZW5kclYiBm1hdGNoViIDc3RyIgckbWF0Y2gwIgZ2YWxTdHIiBHN0cmYiBGFkZHIiA2tleSIEaW50ZiIDZmNhIgFBIgNpZ3MiAm1wIhNmZWVDb2xsZWN0b3JBZGRyZXNzIgNncGMiBWFtdEFzIgdwcmljZUFzIghpUHJpY2VBcyIDZ2ZjIg1mYWN0b3J5Q29uZmlnIg9zdGFraW5nQ29udHJhY3QiD3NsaXBhZ2VDb250cmFjdCILZ3d4Q29udHJhY3QiDHJlc3RDb250cmFjdCIRZGF0YVB1dEFjdGlvbkluZm8iDWluQW10QXNzZXRBbXQiD2luUHJpY2VBc3NldEFtdCIIb3V0THBBbXQiBXByaWNlIgpzbGlwQnlVc2VyIgxzbGlwcGFnZVJlYWwiCHR4SGVpZ2h0Igt0eFRpbWVzdGFtcCIMc2xpcGFnZUFtQW10IgxzbGlwYWdlUHJBbXQiEWRhdGFHZXRBY3Rpb25JbmZvIg5vdXRBbXRBc3NldEFtdCIQb3V0UHJpY2VBc3NldEFtdCIHaW5McEFtdCINZ2V0QWNjQmFsYW5jZSIHYXNzZXRJZCIEY3BiaSIIcHJBbXRYMTgiCGFtQW10WDE4IgN2YWQiAkExIgJBMiIIc2xpcHBhZ2UiBGRpZmYiBHBhc3MiAnZkIgJEMSICRDAiBHNscGciBGZhaWwiA3BjcCIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10IgthbXRBc0FtdFgxOCIKcHJBc0FtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiA2NmZyIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIgd0YWtlRmVlIgZhbW91bnQiCWZlZUFtb3VudCIDZWdvIgZ0eElkNTgiCnBtdEFzc2V0SWQiCHBtdExwQW10Igt1c2VyQWRkcmVzcyIEbHBJZCIEYW1JZCIEcHJJZCIFYW1EY20iBXByRGNtIgNzdHMiB2xwRW1pc3MiCWFtQmFsYW5jZSIMYW1CYWxhbmNlWDE4IglwckJhbGFuY2UiDHByQmFsYW5jZVgxOCILY3VyUHJpY2VYMTgiCGN1clByaWNlIgtwbXRMcEFtdFgxOCIKbHBFbWlzc1gxOCILb3V0QW1BbXRYMTgiC291dFByQW10WDE4IghvdXRBbUFtdCIIb3V0UHJBbXQiBXN0YXRlIgNlcG8iB2luQW1BbXQiBmluQW1JZCIHaW5QckFtdCIGaW5QcklkIgZpc0V2YWwiBmVtaXRMcCIKaXNPbmVBc3NldCIQdmFsaWRhdGVTbGlwcGFnZSIGcG10QW10IgVwbXRJZCIHYW1JZFN0ciIHcHJJZFN0ciIJaW5BbUlkU3RyIglpblBySWRTdHIiBmFtdERjbSIIcHJpY2VEY20iBGxwRW0iD2luQW1Bc3NldEFtdFgxOCIPaW5QckFzc2V0QW10WDE4Igx1c2VyUHJpY2VYMTgiAXIiC3NsaXBwYWdlWDE4Ig9zbGlwcGFnZVJlYWxYMTgiDWxwRW1pc3Npb25YMTgiCnByVmlhQW1YMTgiCmFtVmlhUHJYMTgiDGV4cGVjdGVkQW10cyIRZXhwQW10QXNzZXRBbXRYMTgiE2V4cFByaWNlQXNzZXRBbXRYMTgiCWNhbGNMcEFtdCIOY2FsY0FtQXNzZXRQbXQiDmNhbGNQckFzc2V0UG10IgxzbGlwcGFnZUNhbGMiCWVtaXRMcEFtdCIGYW1EaWZmIgZwckRpZmYiDSR0MDE2NTA5MTY4NTQiCndyaXRlQW1BbXQiCndyaXRlUHJBbXQiC2NvbW1vblN0YXRlIgNtb2EiBW9yZGVyIgdhbXRBc0lkIgZwckFzSWQiD2FjY0FtdEFzQmFsYW5jZSIOYWNjUHJBc0JhbGFuY2UiCm9yQW10QXNzZXQiCm9yQW10QXNTdHIiCW9yUHJBc3NldCIJb3JQckFzU3RyIgpvcmRlclByaWNlIg5jYXN0T3JkZXJQcmljZSIRaXNPcmRlclByaWNlVmFsaWQiAmNnIgFpIgNwbXQiAmNwIgZjYWxsZXIiB2FtQXNQbXQiB3ByQXNQbXQiBGdldEQiAnhwIgFuIgN4cDAiA3hwMSIKYVByZWNpc2lvbiIBYSIBcyIDYW5uIgt4cDBfeHAxX25fbiIQYW5uX3NfYVByZWNpc2lvbiIOYW5uX2FQcmVjaXNpb24iAm4xIgRjYWxjIgNhY2MiA2N1ciINJHQwMjE0MDYyMTQyNiIBZCIFZm91bmQiAmRwIgVkTmV4dCIFZERpZmYiA2FyciINJHQwMjE4NDcyMTg5NCICJGwiAiRzIgUkYWNjMCIFJGYwXzEiAiRhIgIkaSIFJGYwXzIiBWdldFlEIgFEIgF4IgFjIgFiIg0kdDAyMjM5NDIyNDE0IgF5IgV5TmV4dCIFeURpZmYiDSR0MDIyNzIxMjI3NjgiDWNhbGNQdXRPbmVUa24iCXBtdEFtdFJhdyIKcG9vbENvbmZpZyIPbHBBc3NldEVtaXNzaW9uIg1jaGVjaEVtaXNzaW9uIg0kdDAyMzUyNzIzOTg5IgxhbUJhbGFuY2VPbGQiDHByQmFsYW5jZU9sZCINJHQwMjM5OTUyNDE3MSILYW1BbW91bnRSYXciC3ByQW1vdW50UmF3IghhbUFtb3VudCIIcHJBbW91bnQiDGFtQmFsYW5jZU5ldyIMcHJCYWxhbmNlTmV3IgZjaGVja0QiCGxwQW1vdW50Ig5wb29sUHJvcG9ydGlvbiIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIJbHBBbXRCb3RoIgVib251cyITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAyNjM1ODI2NDY2IgFAIgh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDI2NjUzMjY5NjAiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIhFvdXRBc3NldElkT3JXYXZlcyIQc2VuZEZlZVRvTWF0Y2hlciIEYnVybiIBbSICcG0iAnBkIgJtbSICcGsiF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5IgJjbSIDaHBtIgNjcG0iBHNsaXAiCWF1dG9TdGFrZSIHZmFjdENmZyILc3Rha2luZ0NudHIiCHNsaXBDbnRyIgFlIglscEFzc2V0SWQiAmVsIgZsZWdhY3kiAnNhIgJzcCIIbHBUcm5zZnIiAnNzIg0kdDAzMTc3NDMxODk5Igdlc3RpbUxQIgdtYXhTbHBnIgZlc3RQdXQiCW91dEFtdEFtdCINJHQwMzQwODIzNDIzNyINbHBBc3NldEFtb3VudCIKbHBFbWlzc2lvbiIFaW5kZXgiBG5ld1kiAmR5Igt0b3RhbEdldFJhdyINJHQwMzUwMTYzNTA2NSINY2hlY2tUb3RhbEdldCINJHQwMzU0NzYzNTU5MSIOc3VtT2ZHZXRBc3NldHMiEm5vTGVzc1RoZW5BbXRBc3NldCIUbm9MZXNzVGhlblByaWNlQXNzZXQiFGJ1cm5MUEFzc2V0T25GYWN0b3J5Ig1jaGVja1BheW1lbnRzIgpmYWN0b3J5Q2ZnIgdzdGFraW5nIgp1bnN0YWtlSW52IgF2IgVidXJuQSINdW5zdGFrZUFtb3VudCINJHQwMzc5ODczODE3NSIQcGF5bWVudEFtb3VudFJhdyIOcGF5bWVudEFzc2V0SWQiDSR0MDM4NDM0Mzg1MzEiCGFtdEFzU3RyIgdwckFzU3RyIgFrIgJwciIMcmVzU2NhbGVNdWx0Igd1c3JBZGRyIgdwbXRBc0lkIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXkiCm1hdGNoZXJQdWIiCm9yZGVyVmFsaWQiC3NlbmRlclZhbGlkIgxtYXRjaGVyVmFsaWQiB25ld0hhc2giC2FsbG93ZWRIYXNoIgtjdXJyZW50SGFzaF4AAWEAgMLXLwABYgkAtgIBAIDC1y8AAWMJALYCAQCAgJC7utat8A0AAWQJALYCAQAAAAFlCQC2AgEAAAABZgkAtgIBAAEAAWcJALYCAQACAAFoCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABaQIDMTAwAAFqAgExAAFrAgJfXwABbAIAAAFtAAEAAW4AAgABbwADAAFwAAQAAXEAAQABcgACAAFzAAMAAXQABAABdQAFAAF2AAYAAXcABwABeAAIAAF5AAkAAXoAAQABQQAGAAFCAAcAAUMACgABRAkAawMABQUBYQCQTgEBRQIBRgFHCQC8AgMJALYCAQUBRgUBYwkAtgIBBQFHAQFIAgFJAUoJAKADAQkAvAIDBQFJCQC2AgEFAUoFAWMBAUsDAUwBTQFOCQBrAwUBTAUBTQUBTgEBTwEBSQMJAL8CAgUBZAUBSQkAvgIBBQFJBQFJAQFQAQFJAwkAvwICBQFkBQFJCQC+AgEFAUkFAUkBAVEAAhMlc19fZmFjdG9yeUNvbnRyYWN0AQFSAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAVMAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAVQAAhElcyVzX19wcmljZV9fbGFzdAEBVQIBVgFXCQC5CQIJAMwIAgIYJXMlcyVkJWRfX3ByaWNlX19oaXN0b3J5CQDMCAIJAKQDAQUBVgkAzAgCCQCkAwEFAVcFA25pbAUBawEBWAIBWQFaCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUBWQICX18FAVoBAmFhAgFZAVoJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQFZAgJfXwUBWgECYWIAAg8lc19fYW1vdW50QXNzZXQBAmFjAAIOJXNfX3ByaWNlQXNzZXQBAmFkAAIHJXNfX2FtcAECYWUAAg0lc19fYWRkb25BZGRyAAJhZgIHJXNfX2ZlZQACYWcJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWYFAUQBAmFoAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFpAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhagICYWsCYWwJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFrAgJfXwUCYWwCCF9fY29uZmlnAQJhbQECYW4JAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYW4BAmFvAAIMJXNfX3NodXRkb3duAQJhcAACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAQJhcQACFyVzX19mZWVDb2xsZWN0b3JBZGRyZXNzAQJhcgMCYXMCYXQCYXUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIRRmFpbGVkOiBvcmRWYWxpZD0JAKUDAQUCYXMCCyBzbmRyVmFsaWQ9CQClAwEFAmF0AgwgbXRjaHJWYWxpZD0JAKUDAQUCYXUBAmF2AQFJBAJhdwUBSQMJAAECBQJhdwIGU3RyaW5nBAJheAUCYXcFAmF4CQACAQITZmFpbCBjYXN0IHRvIFN0cmluZwECYXkCAmF6AmFBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYXoFAmFBCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF6CQDMCAICAS4JAMwIAgUCYUEJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUICAmF6AmFBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYXoFAmFBCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF6CQDMCAICAS4JAMwIAgUCYUEJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAACYUMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJheQIFBHRoaXMJAQFRAAACYUQJAQJheQIFBHRoaXMJAQJhZAABAmFFAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhQwkBAmFvAAcBAmFGAAkA2QQBCQECYXkCBQJhQwkBAmFpAAACYUcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJheQIFAmFDCQECYXEAAQJhSAAEAmFJCQECYXkCBQR0aGlzCQECYWIABAJhSgkBAmF5AgUEdGhpcwkBAmFjAAQCYUsJAQJhQgIFAmFDCQECYW0BBQJhSgQCYWsJAQJhQgIFAmFDCQECYW0BBQJhSQkAtQkCCQECYXkCBQJhQwkBAmFqAgkApAMBBQJhawkApAMBBQJhSwUBawECYUwACQC1CQIJAQJheQIFAmFDCQECYWgABQFrAAJhTQkBAmFMAAACYU4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFNBQF6AiBJbnZhbGlkIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcwACYU8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFNBQFCAiBJbnZhbGlkIHNsaXBhZ2UgY29udHJhY3QgYWRkcmVzcwACYVAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFNBQFDAhxJbnZhbGlkIGd3eCBjb250cmFjdCBhZGRyZXNzAAJhUQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYU0FAUECHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MBAmFSCgJhUwJhVAJhVQJhVgJhVwJhWAJhWQJhWgJiYQJiYgkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYVMJAMwIAgkApAMBBQJhVAkAzAgCCQCkAwEFAmFVCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJhVwkAzAgCCQCkAwEFAmFYCQDMCAIJAKQDAQUCYVkJAMwIAgkApAMBBQJhWgkAzAgCCQCkAwEFAmJhCQDMCAIJAKQDAQUCYmIFA25pbAUBawECYmMGAmJkAmJlAmJmAmFWAmFZAmFaCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYmQJAMwIAgkApAMBBQJiZQkAzAgCCQCkAwEFAmJmCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJhWQkAzAgCCQCkAwEFAmFaBQNuaWwFAWsBAmJnAQJiaAMJAAACBQJiaAIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYmgBAmJpAgJiagJiawkAvAIDBQJiagUBYwUCYmsBAmJsAwJibQJibgJibwQCYnAJALwCAwkAuAICBQJibQUCYm4FAWIFAmJuBAJicQkAvwICCQC4AgIFAmJvCQEBTwEFAmJwBQFkAwkBASEBBQJicQkAAgEJAKwCAgIKQmlnIHNscGc6IAkApgMBBQJicAkAlAoCBQJicQkAmQMBCQDMCAIFAmJtCQDMCAIFAmJuBQNuaWwBAmJyAwJicwJidAJidQQCYnAJALwCAwUCYnQFAWIFAmJzBAJidgkAvwICBQJidQUCYnADAwUCYnYGCQC/AgIFAmJ0BQJicwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKYDAQUCYnQCASAJAKYDAQUCYnMCASAJAKYDAQUCYnACASAJAKYDAQUCYnUFAmJ2AQJidwQCYngCYnkCYnoCYkEEAmJCCQEBRQIFAmJ6BQJieAQCYkMJAQFFAgUCYkEFAmJ5CQECYmkCBQJiQwUCYkIBAmJEAwJiegJiQQJiRQQCYkYJAQJhSAAEAmJHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXYEAmJICQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXcEAmJJCQECYncEBQJiRwUCYkgFAmJ6BQJiQQQCYmsJAQFFAgUCYnoFAmJHBAJiagkBAUUCBQJiQQUCYkgEAmJKCQEBRQIFAmJFBQFhBAJiSwkBAmJpAgUCYmsFAmJKBAJiTAkBAmJpAgUCYmoFAmJKCQDMCAIFAmJJCQDMCAIFAmJLCQDMCAIFAmJMBQNuaWwBAmJNAwJiegJiQQJiRQQCYk4JAQJiRAMFAmJ6BQJiQQUCYkUJAMwIAgkBAUgCCQCRAwIFAmJOAAAFAWEJAMwIAgkBAUgCCQCRAwIFAmJOAAEFAWEJAMwIAgkBAUgCCQCRAwIFAmJOAAIFAWEFA25pbAECYk8BAmJQBAJiUQkAawMFAmJQBQJhZwUBYQkAlAoCCQBlAgUCYlAFAmJRBQJiUQECYlIEAmJTAmJUAmJVAmJWBAJiRgkBAmFIAAQCYlcJAJEDAgUCYkYFAXMEAmJYCQCRAwIFAmJGBQF0BAJiWQkAkQMCBQJiRgUBdQQCYloJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdgQCY2EJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdwQCY2IJAJEDAgUCYkYFAXIEAmNjCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCYlcCC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgUCYlcFAmJUCQACAQIPV3JvbmcgcG10IGFzc2V0BAJjZAkBAmJnAQUCYlgEAmNlCQEBRQIFAmNkBQJiWgQCY2YJAQJiZwEFAmJZBAJjZwkBAUUCBQJjZgUCY2EEAmNoCQECYmkCBQJjZwUCY2UEAmNpCQEBSAIFAmNoBQFhBAJjagkBAUUCBQJiVQUBYQQCY2sJAQFFAgUCY2MFAWEEAmNsCQC8AgMFAmNlBQJjagUCY2sEAmNtCQC8AgMFAmNnBQJjagUCY2sEAmNuCQEBSAIFAmNsBQJiWgQCY28JAQFIAgUCY20FAmNhBAJjcAMJAAACBQJiUwIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYlYFAmNuAwkAAAIFAmJYAgVXQVZFUwUEdW5pdAkA2QQBBQJiWAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiVgUCY28DCQAAAgUCYlkCBVdBVkVTBQR1bml0CQDZBAEFAmJZCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIJAKUIAQUCYlYFAmJTCQECYmMGBQJjbgUCY28FAmJVBQJjaQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVQABQJjaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjaQUDbmlsCQCcCgoFAmNuBQJjbwUCYlgFAmJZBQJjZAUCY2YFAmNjBQJjaAUCY2IFAmNwAQJjcQ0CYlMCYm8CY3ICY3MCY3QCY3UCYlYCY3YCY3cCY3gCY3kCY3oCY0EEAmJGCQECYUgABAJiVwkA2QQBCQCRAwIFAmJGBQFzBAJjQgkAkQMCBQJiRgUBdAQCY0MJAJEDAgUCYkYFAXUEAmNECQCRAwIFAmJGBQF4BAJjRQkAkQMCBQJiRgUBeQQCY0YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdgQCY0cJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdwQCY2IJAJEDAgUCYkYFAXIEAmNICAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmJXAghXciBscCBhcwhxdWFudGl0eQQCY2QDBQJjdgkBAmJnAQUCY0IDAwUCY3gJAAACBQJjQQUCY0IHCQBlAgkBAmJnAQUCY0IFAmN6AwUCY3gJAQJiZwEFAmNCCQBlAgkBAmJnAQUCY0IFAmNyBAJjZgMFAmN2CQECYmcBBQJjQwMDBQJjeAkAAAIFAmNBBQJjQwcJAGUCCQECYmcBBQJjQwUCY3oDBQJjeAkBAmJnAQUCY0MJAGUCCQECYmcBBQJjQwUCY3QEAmNJCQEBRQIFAmNyBQJjRgQCY0oJAQFFAgUCY3QFAmNHBAJjSwkBAmJpAgUCY0oFAmNJBAJjZQkBAUUCBQJjZAUCY0YEAmNnCQEBRQIFAmNmBQJjRwQCY0wDCQAAAgUCY0gAAAQCY2gFAWQEAmNNBQFkBAJiSgkAdgYJALkCAgUCY0kFAmNKAAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEBSAIFAmJKBQFhCQEBSAIFAmNJBQJjRgkBAUgCBQJjSgUCY0cJAQJiaQIJALcCAgUCY2cFAmNKCQC3AgIFAmNlBQJjSQUCY00EAmNoCQECYmkCBQJjZwUCY2UEAmNOCQC8AgMJAQFPAQkAuAICBQJjaAUCY0sFAWMFAmNoBAJjTQkBAUUCBQJibwUBYQMDAwUCY3kJAQIhPQIFAmNoBQFkBwkAvwICBQJjTgUCY00HCQACAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFAmNOAgMgPiAJAKYDAQUCY00EAmNPCQEBRQIFAmNIBQFhBAJjUAkAvAIDBQJjSQUCY2gFAWMEAmNRCQC8AgMFAmNKBQFjBQJjaAQCY1IDCQC/AgIFAmNQBQJjSgkAlAoCBQJjUQUCY0oJAJQKAgUCY0kFAmNQBAJjUwgFAmNSAl8xBAJjVAgFAmNSAl8yBAJiSgkAvAIDBQJjTwUCY1QFAmNnCQCXCgUJAQFIAgUCYkoFAWEJAQFIAgUCY1MFAmNGCQEBSAIFAmNUBQJjRwUCY2gFAmNNBAJjVQgFAmNMAl8xBAJjVggFAmNMAl8yBAJjVwgFAmNMAl8zBAJjaQkBAUgCCAUCY0wCXzQFAWEEAmNYCQEBSAIIBQJjTAJfNQUBYQMJAGcCAAAFAmNVCQACAQIHTFAgPD0gMAQCY1kDCQEBIQEFAmN3AAAFAmNVBAJjWgkAZQIFAmNyBQJjVgQCZGEJAGUCBQJjdAUCY1cEAmRiAwMFAmN4CQAAAgUCY0EFAmNCBwkAlAoCBQJjegAAAwMFAmN4CQAAAgUCY0EFAmNDBwkAlAoCAAAFAmN6CQCUCgIFAmNWBQJjVwQCZGMIBQJkYgJfMQQCZGQIBQJkYgJfMgQCZGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFUAAUCY2kJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFVAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY2kJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVgCBQJiVgUCYlMJAQJhUgoFAmRjBQJkZAUCY1kFAmNpBQJibwUCY1gFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNaBQJkYQUDbmlsCQCfCg0FAmNVBQJjWQUCY2kFAmNkBQJjZgUCY0gFAmJXBQJjYgUCZGUFAmNaBQJkYQUCY3MFAmN1AQJkZgECZGcEAmJGCQECYUgABAJkaAkAkQMCBQJiRgUBdAQCZGkJAJEDAgUCYkYFAXUEAmNiCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXIEAmJHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXYEAmJICQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXcEAmRqCQECYmcBBQJkaAQCZGsJAQJiZwEFAmRpBAJjaAMJAAACCAUCZGcJb3JkZXJUeXBlBQNCdXkJAQJidwQFAmJHBQJiSAkAZAIFAmRqCAUCZGcGYW1vdW50BQJkawkBAmJ3BAUCYkcFAmJICQBlAgUCZGoIBQJkZwZhbW91bnQFAmRrBAJjaQkBAUgCBQJjaAUBYQMDAwkBAmFFAAYJAAACBQJjYgUBbwYJAAACBQJjYgUBcAkAAgECDUFkbWluIGJsb2NrZWQEAmRsCAgFAmRnCWFzc2V0UGFpcgthbW91bnRBc3NldAQCZG0DCQAAAgUCZGwFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRsBAJkbggIBQJkZwlhc3NldFBhaXIKcHJpY2VBc3NldAQCZG8DCQAAAgUCZG4FBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRuAwMJAQIhPQIFAmRtBQJkaAYJAQIhPQIFAmRvBQJkaQkAAgECCVdyIGFzc2V0cwQCZHAIBQJkZwVwcmljZQQCY0cJAGsDBQFhBQJiSAUCYkcEAmRxCQEBSwMFAmRwBQFhBQJjRwQCZHIDCQAAAggFAmRnCW9yZGVyVHlwZQUDQnV5CQBnAgUCY2kFAmRxCQBnAgUCZHEFAmNpBgECZHMBAmR0AwkBAiE9AgkAkAMBCAUCZHQIcGF5bWVudHMAAQkAAgECCjEgcG1udCBleHAEAmR1CQEFdmFsdWUBCQCRAwIIBQJkdAhwYXltZW50cwAABAJiVAkBBXZhbHVlAQgFAmR1B2Fzc2V0SWQEAmN6CAUCZHUGYW1vdW50BAJjTAkBAmJSBAkA2AQBCAUCZHQNdHJhbnNhY3Rpb25JZAkA2AQBBQJiVAUCY3oIBQJkdAZjYWxsZXIEAmNuCAUCY0wCXzEEAmNvCAUCY0wCXzIEAmNiCQENcGFyc2VJbnRWYWx1ZQEIBQJjTAJfOQQCY3AIBQJjTANfMTADAwkBAmFFAAYJAAACBQJjYgUBcAkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmNiCQCXCgUFAmNuBQJjbwUCY3oFAmJUBQJjcAECZHYKAmR3AVoCZHgCZHkCYm8CY3cCY3gCY3kCY3oCY0EEAmNMCQECY3ENBQFaBQJibwgJAQV2YWx1ZQEFAmR4BmFtb3VudAgJAQV2YWx1ZQEFAmR4B2Fzc2V0SWQICQEFdmFsdWUBBQJkeQZhbW91bnQICQEFdmFsdWUBBQJkeQdhc3NldElkBQJkdwkAAAIFAVoCAAUCY3cFAmN4BQJjeQUCY3oFAmNBBAJjYgkBDXBhcnNlSW50VmFsdWUBCAUCY0wCXzgDAwMJAQJhRQAGCQAAAgUCY2IFAW4GCQAAAgUCY2IFAXAJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmNiBQJjTAECZHoBAmRBBAJkQgUBZwQCZEMJAJEDAgUCZEEAAAQCZEQJAJEDAgUCZEEAAQQCZEUJAKcDAQUBaQQCZEYJALkCAgkApwMBBQJhRAUCZEUEAmRHCQC3AgIFAmRDBQJkRAMJAAACBQJkRwUBZQUBZQQCZEgJALkCAgUCZEYFAmRCBAJkSQkAuQICCQC5AgIJALkCAgUCZEMFAmREBQJkQgUCZEIEAmRKCQC6AgIJALkCAgUCZEgFAmRHBQJkRQQCZEsJALgCAgUCZEgFAmRFBAJkTAkAtwICBQJkQgUBZgoBAmRNAgJkTgJkTwQCZFAFAmROBAJkUQgFAmRQAl8xBAJkUggFAmRQAl8yAwkBAiE9AgUCZFIFBHVuaXQFAmROBAJkUwkAugICCQC5AgIJALkCAgUCZFEFAmRRBQJkUQUCZEkEAmRUCQC6AgIJALkCAgkAtwICBQJkSgkAuQICBQJkUwUCZEIFAmRRCQC3AgIJALoCAgkAuQICBQJkSwUCZFEFAmRFCQC5AgIFAmRMBQJkUwQCZFUJAQFQAQkAuAICBQJkVAkBBXZhbHVlAQUCZFEDCQDAAgIFAWYFAmRVCQCUCgIFAmRUBQJkTwkAlAoCBQJkVAUEdW5pdAQCZFYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZFcKAAJkWAUCZFYKAAJkWQkAkAMBBQJkWAoAAmRaCQCUCgIFAmRHBQR1bml0CgECZWECAmViAmVjAwkAZwIFAmVjBQJkWQUCZWIJAQJkTQIFAmViCQCRAwIFAmRYBQJlYwoBAmVkAgJlYgJlYwMJAGcCBQJlYwUCZFkFAmViCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJlZAIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIFAmRaAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmRRCAUCZFcCXzEEAmRSCAUCZFcCXzIDCQECIT0CBQJkUgUEdW5pdAUCZFEJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUCZFEBAmVlAwJkQQJkdAJlZgQCZEIFAWcEAmVnCQCRAwIFAmRBAwkAAAIFAmR0AAAAAQAABAJkRQkApwMBBQFpBAJkRgkAuQICCQCnAwEFAmFEBQJkRQQCZEcFAmVnBAJkSAkAuQICBQJkRgUCZEIEAmVoCQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUCZWYFAmVmCQC5AgIFAmVnBQJkQgUCZWYFAmRFCQC5AgIFAmRIBQJkQgQCZWkJALgCAgkAtwICBQJkRwkAugICCQC5AgIFAmVmBQJkRQUCZEgFAmVmCgECZE0CAmROAmRPBAJlagUCZE4EAmVrCAUCZWoCXzEEAmRSCAUCZWoCXzIDCQECIT0CBQJkUgUEdW5pdAUCZE4EAmVsCQC6AgIJALcCAgkAuQICBQJlawUCZWsFAmVoCQC3AgIJALkCAgUBZwUCZWsFAmVpBAJlbQkBAVABCQC4AgIFAmVsCQEFdmFsdWUBBQJlawMJAMACAgUBZgUCZW0JAJQKAgUCZWwFAmRPCQCUCgIFAmVsBQR1bml0BAJkVgkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlbgoAAmRYBQJkVgoAAmRZCQCQAwEFAmRYCgACZFoJAJQKAgUCZWYFBHVuaXQKAQJlYQICZWICZWMDCQBnAgUCZWMFAmRZBQJlYgkBAmRNAgUCZWIJAJEDAgUCZFgFAmVjCgECZWQCAmViAmVjAwkAZwIFAmVjBQJkWQUCZWIJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmVkAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgUCZFoAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZWsIBQJlbgJfMQQCZFIIBQJlbgJfMgMJAQIhPQIFAmRSBQR1bml0BQJlawkAAgEJAKwCAgIZWSBjYWxjdWxhdGlvbiBlcnJvciwgWSA9IAkApgMBBQJlawECZW8EAmVwAmJUAmJWAVoEAmVxCQECYUgABAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmJXCQCRAwIFAmVxBQFzBAJjRgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVxBQF2BAJjRwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVxBQF3BAJlcgkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCYlcCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmVzAwkAvwICBQJlcgUBZQYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFAmVzBQJlcwQCY2QJAQJiZwEFAmJYBAJjZgkBAmJnAQUCYlkEAmV0AwkAAAIFAVoCAAkAlAoCBQJjZAUCY2YDCQAAAgUCYlQFAmJYAwkAZgIFAmVwBQJjZAkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJQKAgkAZQIFAmNkBQJlcAUCY2YDCQAAAgUCYlQFAmJZAwkAZgIFAmVwBQJjZgkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJQKAgUCY2QJAGUCBQJjZgUCZXAJAAIBAhB3cm9uZyBwbXRBc3NldElkBAJldQgFAmV0Al8xBAJldggFAmV0Al8yBAJldwMJAAACBQJiVAUCYlgJAJQKAgUCZXAAAAMJAAACBQJiVAUCYlkJAJQKAgAABQJlcAkAAgECD2ludmFsaWQgcGF5bWVudAQCZXgIBQJldwJfMQQCZXkIBQJldwJfMgQCZXoICQECYk8BBQJleAJfMQQCZUEICQECYk8BBQJleQJfMQQCYlEICQECYk8BBQJlcAJfMgQCZUIJAGQCBQJldQUCZXoEAmVDCQBkAgUCZXYFAmVBBAJidAkBAmR6AQkAzAgCCQC2AgEFAmV1CQDMCAIJALYCAQUCZXYFA25pbAQCYnMJAQJkegEJAMwIAgkAtgIBBQJlQgkAzAgCCQC2AgEFAmVDBQNuaWwEAmVEAwkAvwICBQJicwUCYnQGCQEFdGhyb3cAAwkAAAIFAmVEBQJlRAQCZUUJALwCAwUCZXIJALgCAgUCYnMFAmJ0BQJidAQCY2kJAQFIAgkBAmJpAgkBAUUCBQJlQwUCY0cJAQFFAgUCZUIFAmNGBQFhBAJkZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVQABQJjaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjaQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWAIFAmJWBQFaCQECYVIKBQJleAUCZXkJAKADAQUCZUUFAmNpAAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQCZUYJAGsDBQJldgUBYQUCZXUEAmVHCQBrAwUCZXAFAWEJAGQCBQJlRgUBYQQCZUgJAGUCBQJlcAUCZUcEAmVJCQC8AgMFAmVyCQC2AgEFAmVICQC2AgEFAmV2BAJlSgkAoAMBCQC8AgMJALgCAgUCZUUFAmVJBQFiBQJlSQkAlgoECQCgAwEFAmVFBQJkZQUCYlEFAmVKCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJlSwYCZUwCZU0CZU4CZHcCZU8CZVADCQECIT0CCQCQAwEFAmVOAAEJAAIBAgsxIHBtbnQgZXhwZAQCZXEJAQJhSAAEAmJXCQCRAwIFAmVxBQFzBAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmVRCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZXEFAXYEAmVSCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZXEFAXcEAmVTCQCRAwIFAmVxBQFyBAJiVgMJAAACBQJkdwUCYVEFAmVPBQJkdwQCZHUJAQV2YWx1ZQEJAJEDAgUCZU4AAAQCYlQJAQV2YWx1ZQEIBQJkdQdhc3NldElkBAJjeggFAmR1BmFtb3VudAQCYlMJANgEAQUCZVADCQECIT0CBQJiVwkA2AQBBQJiVAkAAgECCFdyb25nIExQBAJjZAkBAmJnAQUCYlgEAmNmCQECYmcBBQJiWQQCZVQKAAJlVQkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmVMCQDMCAIFAmN6BQNuaWwFA25pbAMJAAECBQJlVQIKKEludCwgSW50KQUCZVUJAAIBCQCsAgIJAAMBBQJlVQIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQCZVYIBQJlVAJfMQQCYlEIBQJlVAJfMgQCZVcDAwkAZgIFAmVNAAAJAGYCBQJlTQUCZVYHCQACAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJlTQUDbmlsAgAFAmVWBAJlWAMJAAACBQJlTAUCYlgJAJYKBAUCZVcAAAkAZQIJAGUCBQJjZAUCZVcFAmJRBQJjZgMJAAACBQJlTAUCYlkJAJYKBAAABQJlVwUCY2QJAGUCCQBlAgUCY2YFAmVXBQJiUQkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJlWQgFAmVYAl8xBAJlWggFAmVYAl8yBAJlQggFAmVYAl8zBAJlQwgFAmVYAl80BAJmYQkBAmJpAgkBAUUCBQJlQwUCZVIJAQFFAgUCZUIFAmVRBAJmYgkBAUgCBQJmYQUBYQQCZmMDCQAAAgUCZUwCBVdBVkVTBQR1bml0CQDZBAEFAmVMBAJmZAMJAGYCBQJiUQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFHBQJiUQUCZmMFA25pbAUDbmlsBAJjcAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJWBQJlVwUCZmMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgkApQgBBQJiVgUCYlMJAQJiYwYFAmVZBQJlWgUCY3oFAmZiBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVAAFAmZiCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVQIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmZiBQNuaWwFAmZkAwkAAAIFAmNwBQJjcAQCZmUJAPwHBAUCYUMCBGJ1cm4JAMwIAgUCY3oFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYlQFAmN6BQNuaWwDCQAAAgUCZmUFAmZlCQCUCgIFAmNwBQJlVwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZmYABAJhdwkAoggBCQEBUgADCQABAgUCYXcCBlN0cmluZwQCZEcFAmF3CQDZBAEFAmRHAwkAAQIFAmF3AgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmZnAAQCYXcJAKIIAQkBAVMAAwkAAQIFAmF3AgZTdHJpbmcEAmRHBQJhdwkA2QQBBQJkRwMJAAECBQJhdwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJmaAkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJmaQECZHQEAmF3CQECZmYAAwkAAQIFAmF3AgpCeXRlVmVjdG9yBAJmagUCYXcDCQAAAggFAmR0D2NhbGxlclB1YmxpY0tleQUCZmoGBQJmaAMJAAECBQJhdwIEVW5pdAMJAAACCAUCZHQGY2FsbGVyBQR0aGlzBgUCZmgJAAIBAgtNYXRjaCBlcnJvchoCZHQBC2NvbnN0cnVjdG9yAQFRBAJlaAkBAmZpAQUCZHQDCQAAAgUCZWgFAmVoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAAUBUQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmR0AQpzZXRNYW5hZ2VyAQJmawQCZWgJAQJmaQEFAmR0AwkAAAIFAmVoBQJlaAQCZmwJANkEAQUCZmsDCQAAAgUCZmwFAmZsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFTAAUCZmsFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkdAEOY29uZmlybU1hbmFnZXIABAJiTgkBAmZnAAQCZm0DCQEJaXNEZWZpbmVkAQUCYk4GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmZtBQJmbQQCZm4DCQAAAggFAmR0D2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCYk4GCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmZuBQJmbgkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgAJANgEAQkBBXZhbHVlAQUCYk4JAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVMABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHQBA3B1dAICZm8CZnAEAmZxCQECYUwABAJmcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZnEFAXoCCldyIHN0IGFkZHIEAmZzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJmcQUBQgIKV3Igc2wgYWRkcgMJAGYCAAAFAmZvCQACAQIOV3Jvbmcgc2xpcHBhZ2UDCQECIT0CCQCQAwEIBQJkdAhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJmdAkBAmR2CgkApQgBCAUCZHQGY2FsbGVyCQDYBAEIBQJkdA10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmR0CHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmR0CHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJkdAhwYXltZW50cwABBQJmbwYHBgAAAgAEAmNZCAUCZnQCXzIEAmZ1CAUCZnQCXzcEAmNwCAUCZnQCXzkEAmNaCAUCZnQDXzEwBAJkYQgFAmZ0A18xMQQCYlgIBQJmdANfMTIEAmJZCAUCZnQDXzEzBAJjTAkA/AcEBQJhQwIEZW1pdAkAzAgCBQJjWQUDbmlsBQNuaWwDCQAAAgUCY0wFAmNMBAJmdgQCYXcFAmNMAwkAAQIFAmF3AgdBZGRyZXNzBAJmdwUCYXcJAPwHBAUCZncCBGVtaXQJAMwIAgUCY1kFA25pbAUDbmlsBQR1bml0AwkAAAIFAmZ2BQJmdgQCZngDCQBmAgUCY1oAAAkA/AcEBQJmcwIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJYBQJjWgUDbmlsBQNuaWwDCQAAAgUCZngFAmZ4BAJmeQMJAGYCBQJkYQAACQD8BwQFAmZzAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYlkFAmRhBQNuaWwFA25pbAMJAAACBQJmeQUCZnkEAmZ6AwUCZnAEAmZBCQD8BwQFAmZyAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJmdQUCY1kFA25pbAMJAAACBQJmQQUCZkEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZHQGY2FsbGVyBQJjWQUCZnUFA25pbAkAzggCBQJjcAUCZnoJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHQBC3B1dE9uZVRrblYyAgJlTQJmcAMJAQIhPQIJAJADAQgFAmR0CHBheW1lbnRzAAEJAAIBAgsxIHBtbnQgZXhwZAQCZXEJAQJhSAAEAmJYCQCRAwIFAmVxBQF0BAJiWQkAkQMCBQJlcQUBdQQCYlcJANkEAQkAkQMCBQJlcQUBcwQCZVEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJlcQUBdgQCZVIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJlcQUBdwQCYlYDCQAAAggFAmR0BmNhbGxlcgUEdGhpcwgFAmR0DG9yaWdpbkNhbGxlcggFAmR0BmNhbGxlcgQCZHUJAQV2YWx1ZQEJAJEDAggFAmR0CHBheW1lbnRzAAAEAmJUCQDYBAEJAQV2YWx1ZQEIBQJkdQdhc3NldElkBAJjeggFAmR1BmFtb3VudAQCZkIJAQJlbwQFAmN6BQJiVAkApQgBBQJiVgkA2AQBCAUCZHQNdHJhbnNhY3Rpb25JZAQCZkMIBQJmQgJfMQQCY3AIBQJmQgJfMgQCYlEIBQJmQgJfMwQCY1kDAwkAZgIFAmVNAAAJAGYCBQJlTQUCZkMHCQACAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJlTQUDbmlsAgAFAmZDBAJmdAkA/AcEBQJhQwIEZW1pdAkAzAgCBQJjWQUDbmlsBQNuaWwDCQAAAgUCZnQFAmZ0BAJmdgQCYXcFAmZ0AwkAAQIFAmF3AgdBZGRyZXNzBAJmdwUCYXcJAPwHBAUCZncCBGVtaXQJAMwIAgUCY1kFA25pbAUDbmlsBQR1bml0AwkAAAIFAmZ2BQJmdgQCZnoDBQJmcAQCZkEJAPwHBAUCYU4CBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJXBQJjWQUDbmlsAwkAAAIFAmZBBQJmQQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJkdAZjYWxsZXIFAmNZBQJiVwUDbmlsBAJmZAMJAGYCBQJiUQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFHBQJiUQkA2QQBBQJiVAUDbmlsBQNuaWwJAJQKAgkAzggCCQDOCAIFAmNwBQJmegUCZmQFAmNZCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmR0AQpwdXRGb3JGcmVlAQJmRAMJAGYCAAAFAmZECQACAQIKV3Jvbmcgc2xwZwMJAQIhPQIJAJADAQgFAmR0CHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmZFCQECZHYKCQClCAEIBQJkdAZjYWxsZXIJANgEAQgFAmR0DXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZHQIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZHQIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmR0CHBheW1lbnRzAAEFAmZEBwcGAAACAAgFAmZFAl85AmR0AQNnZXQABAJjTAkBAmRzAQUCZHQEAmZGCAUCY0wCXzEEAmNvCAUCY0wCXzIEAmN6CAUCY0wCXzMEAmJUCAUCY0wCXzQEAmNwCAUCY0wCXzUEAmVpCQD8BwQFAmFDAgRidXJuCQDMCAIFAmN6BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJUBQJjegUDbmlsAwkAAAIFAmVpBQJlaQUCY3AJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHQBC2dldE9uZVRrblYyAgJlTAJlTQQCZkcJAQJlSwYFAmVMBQJlTQgFAmR0CHBheW1lbnRzCAUCZHQGY2FsbGVyCAUCZHQMb3JpZ2luQ2FsbGVyCAUCZHQNdHJhbnNhY3Rpb25JZAQCY3AIBQJmRwJfMQQCZVcIBQJmRwJfMgkAlAoCBQJjcAUCZVcCZHQBE2dldE9uZVRrblYyUkVBRE9OTFkCAmVMAmZIBAJlcQkBAmFIAAQCYlgJAJEDAgUCZXEFAXQEAmJZCQCRAwIFAmVxBQF1BAJiVwkAkQMCBQJlcQUBcwQCZEEJAMwIAgkAtgIBCQECYmcBBQJiWAkAzAgCCQC2AgEJAQJiZwEFAmJZBQNuaWwEAmZJCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJiVwIQaW52YWxpZCBscCBhc3NldAhxdWFudGl0eQQCYnQJAQJkegEFAmRBBAJicwkAuAICBQJidAkAvAIDCQC2AgEFAmZIBQJidAUCZkkEAmZKAwkAAAIFAmVMBQJiWAAAAwkAAAIFAmVMBQJiWQABCQACAQIUaW52YWxpZCBvdXQgYXNzZXQgaWQEAmZLCQECZWUDBQJkQQUCZkoFAmJzBAJmTAkAuAICCQCRAwIFAmRBBQJmSgUCZksEAmZNCQCgAwEJALgCAgUCZkwFAWYEAmZOCQECYk8BBQJmTQQCZVYIBQJmTgJfMQQCYlEIBQJmTgJfMgQCZk8DCQBmAgUCZVYAAAYJAAIBAg5ub3RoaW5nIHRvIGdldAMJAAACBQJmTwUCZk8JAJQKAgUDbmlsCQCUCgIFAmVWBQJiUQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkdAEcZ2V0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICZUwCZkgEAmVxCQECYUgABAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmJXCQCRAwIFAmVxBQFzBAJjZAkBAmJnAQUCYlgEAmNmCQECYmcBBQJiWQQCZlAKAAJlVQkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmVMCQDMCAIFAmZIBQNuaWwFA25pbAMJAAECBQJlVQIKKEludCwgSW50KQUCZVUJAAIBCQCsAgIJAAMBBQJlVQIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQCZVYIBQJmUAJfMQQCYlEIBQJmUAJfMgQCY0wJAQJiUgQCAAUCYlcFAmZIBQR0aGlzBAJjbggFAmNMAl8xBAJjbwgFAmNMAl8yBAJmUQkAZAIFAmNuBQJjbwQCZUoDCQAAAgUCZlEAAAkAAgECF2JvbnVzIGNhbGN1bGF0aW9uIGVycm9yCQBrAwkAZQIFAmVWBQJmUQUBYQUCZlEJAJQKAgUDbmlsCQCVCgMFAmVWBQJiUQUCZUoCZHQBCWdldE5vTGVzcwICZlICZlMEAmNMCQECZHMBBQJkdAQCY24IBQJjTAJfMQQCY28IBQJjTAJfMgQCY3oIBQJjTAJfMwQCYlQIBQJjTAJfNAQCY3AIBQJjTAJfNQMJAGYCBQJmUgUCY24JAAIBCQCsAgIJAKwCAgkArAICAglGYWlsZWQ6ICAJAKQDAQUCY24CAyA8IAkApAMBBQJmUgMJAGYCBQJmUwUCY28JAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJjbwIDIDwgCQCkAwEFAmZTBAJmVAkA/AcEBQJhQwIEYnVybgkAzAgCBQJjegUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiVAUCY3oFA25pbAMJAAACBQJmVAUCZlQFAmNwCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmR0AQ11bnN0YWtlQW5kR2V0AQJiUAQCZlUDCQECIT0CCQCQAwEIBQJkdAhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCZlUFAmZVBAJiRgkBAmFIAAQCZlYJAQJhTAAEAmZ1CQDZBAEJAJEDAgUCYkYFAXMEAmZXCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJmVgUBegIKV3Igc3QgYWRkcgQCZlgJAPwHBAUCZlcCB3Vuc3Rha2UJAMwIAgkA2AQBBQJmdQkAzAgCBQJiUAUDbmlsBQNuaWwDCQAAAgUCZlgFAmZYBAJjTAkBAmJSBAkA2AQBCAUCZHQNdHJhbnNhY3Rpb25JZAkA2AQBBQJmdQUCYlAIBQJkdAZjYWxsZXIEAmNiCQENcGFyc2VJbnRWYWx1ZQEIBQJjTAJfOQQCY3AIBQJjTANfMTAEAmZZAwMJAQJhRQAGCQAAAgUCY2IFAXAJAAIBCQCsAgICCUJsb2NrZWQ6IAkApAMBBQJjYgYDCQAAAgUCZlkFAmZZBAJmWgkA/AcEBQJhQwIEYnVybgkAzAgCBQJiUAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJmdQUCYlAFA25pbAMJAAACBQJmWgUCZloFAmNwCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmR0ARV1bnN0YWtlQW5kR2V0T25lVGtuVjIDAmdhAmVMAmVNBAJmVQMJAQIhPQIJAJADAQgFAmR0CHBheW1lbnRzAAAJAAIBAg1ObyBwbW50cyBleHBkBgMJAAACBQJmVQUCZlUEAmJGCQECYUgABAJmVgkBAmFMAAQCZnUJANkEAQkAkQMCBQJiRgUBcwQCZlcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmZWBQF6AgpXciBzdCBhZGRyBAJmWAkA/AcEBQJmVwIHdW5zdGFrZQkAzAgCCQDYBAEFAmZ1CQDMCAIFAmdhBQNuaWwFA25pbAMJAAACBQJmWAUCZlgEAmdiCQECZUsGBQJlTAUCZU0JAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmZ1BQJnYQUDbmlsCAUCZHQGY2FsbGVyCAUCZHQMb3JpZ2luQ2FsbGVyCAUCZHQNdHJhbnNhY3Rpb25JZAQCY3AIBQJnYgJfMQQCZVcIBQJnYgJfMgkAlAoCBQJjcAUCZVcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHQBHHB1dE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCAmdjAmdkBAJlcQkBAmFIAAQCYlgJAJEDAgUCZXEFAXQEAmJZCQCRAwIFAmVxBQF1BAJiVwkAkQMCBQJlcQUBcwQCZ2UJAQJlbwQFAmdjBQJnZAIAAgAEAmVFCAUCZ2UCXzEEAmNwCAUCZ2UCXzIEAmJRCAUCZ2UCXzMEAmVKCAUCZ2UCXzQJAJQKAgUDbmlsCQCVCgMFAmVFBQJiUQUCZUoCZHQBCGFjdGl2YXRlAgJnZgJnZwMJAQIhPQIJAKUIAQgFAmR0BmNhbGxlcgkApQgBBQJhQwkAAgECBmRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgAFAmdmCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwAFAmdnBQNuaWwCB3N1Y2Nlc3MCZHQBBHNldFMCAmdoAmZZAwkBAiE9AgkApQgBCAUCZHQGY2FsbGVyCQECYXkCBQR0aGlzCQECYWUABQJmaAkAzAgCCQELU3RyaW5nRW50cnkCBQJnaAUCZlkFA25pbAJkdAEEc2V0SQICZ2gCZlkDCQECIT0CCQClCAEIBQJkdAZjYWxsZXIJAQJheQIFBHRoaXMJAQJhZQAFAmZoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJnaAUCZlkFA25pbAJkdAEcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQAJAJQKAgUDbmlsCQECYUgAAmR0ARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQJiaAkAlAoCBQNuaWwJAQJiZwEFAmJoAmR0ARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwJiegJiQQJiRQQCZ2kJAQJiRAMFAmJ6BQJiQQUCYkUJAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQJnaQAACQDMCAIJAKYDAQkAkQMCBQJnaQABCQDMCAIJAKYDAQkAkQMCBQJnaQACBQNuaWwCZHQBFmZyb21YMThXcmFwcGVyUkVBRE9OTFkCAUkCZ2oJAJQKAgUDbmlsCQEBSAIJAKcDAQUBSQUCZ2oCZHQBFHRvWDE4V3JhcHBlclJFQURPTkxZAgFGAUcJAJQKAgUDbmlsCQCmAwEJAQFFAgUBRgUBRwJkdAEeY2FsY1ByaWNlQmlnSW50V3JhcHBlclJFQURPTkxZAgJiagJiawkAlAoCBQNuaWwJAKYDAQkBAmJpAgkApwMBBQJiagkApwMBBQJiawJkdAEjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJAmJTAmJvAmNyAmNzAmN0AmN1AmdrAmN2AmN3CQCUCgIFA25pbAkBAmNxDQUCYlMFAmJvBQJjcgUCY3MFAmN0BQJjdQUCZ2sFAmN2BQJjdwYHAAACAAJkdAEjZXN0aW1hdGVHZXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkEAmJTAmdsAmJVAmdrBAJjTAkBAmJSBAUCYlMFAmdsBQJiVQkBEUBleHRyTmF0aXZlKDEwNjIpAQUCZ2sJAJQKAgUDbmlsCQCcCgoIBQJjTAJfMQgFAmNMAl8yCAUCY0wCXzMIBQJjTAJfNAgFAmNMAl81CAUCY0wCXzYIBQJjTAJfNwkApgMBCAUCY0wCXzgIBQJjTAJfOQgFAmNMA18xMAJkdAEOZ2V0RmVlUkVBRE9OTFkACQCUCgIFA25pbAUCYWcBAmdtAQJnbgAEAmdvBAJhdwkBAmZmAAMJAAECBQJhdwIKQnl0ZVZlY3RvcgQCZmoFAmF3BQJmagMJAAECBQJhdwIEVW5pdAgFAmdtD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yBAJhdwUCZ20DCQABAgUCYXcCBU9yZGVyBAJkZwUCYXcEAmdwCQECYUYABAJncQkBAmRmAQUCZGcEAmdyCQD0AwMIBQJkZwlib2R5Qnl0ZXMJAJEDAggFAmRnBnByb29mcwAACAUCZGcPc2VuZGVyUHVibGljS2V5BAJncwkA9AMDCAUCZGcJYm9keUJ5dGVzCQCRAwIIBQJkZwZwcm9vZnMAAQUCZ3ADAwMFAmdxBQJncgcFAmdzBwYJAQJhcgMFAmdxBQJncgUCZ3MDCQABAgUCYXcCFFNldFNjcmlwdFRyYW5zYWN0aW9uBAJkRwUCYXcEAmd0CQD2AwEJAQV2YWx1ZQEIBQJkRwZzY3JpcHQEAmd1CQDbBAEJAQV2YWx1ZQEJAJ0IAgUCYUMJAQJhcAAEAmd2CQDxBwEFBHRoaXMDAwkAAAIFAmd1BQJndAkBAiE9AgUCZ3YFAmd0BwYJAPQDAwgFAmdtCWJvZHlCeXRlcwkAkQMCCAUCZ20GcHJvb2ZzAAAFAmdvCQD0AwMIBQJnbQlib2R5Qnl0ZXMJAJEDAggFAmdtBnByb29mcwAABQJnb+FP+M8=", "chainId": 84, "height": 2286247, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2VciSbEQiT3HEJ9G6rzoZDjoRDCdNqssfFGKgVBaYw1t Next: BCXfQsLPed7gabn5SBQ7FqkQ3qJKujVDSNxzX9U6Gi8D Diff:
OldNewDifferences
952952 let $t03501635065 = takeFee(totalGetRaw)
953953 let totalGet = $t03501635065._1
954954 let feeAmount = $t03501635065._2
955- $Tuple2(nil, $Tuple2(totalGet, feeAmount))
955+ let checkTotalGet = if ((totalGet > 0))
956+ then true
957+ else throw("nothing to get")
958+ if ((checkTotalGet == checkTotalGet))
959+ then $Tuple2(nil, $Tuple2(totalGet, feeAmount))
960+ else throw("Strict value is not equal to itself.")
956961 }
957962
958963
965970 let lpId = poolConfig[idxLPAsId]
966971 let amBalance = getAccBalance(amId)
967972 let prBalance = getAccBalance(prId)
968- let $t03541035525 = {
973+ let $t03547635591 = {
969974 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
970975 if ($isInstanceOf(@, "(Int, Int)"))
971976 then @
972977 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
973978 }
974- let totalGet = $t03541035525._1
975- let feeAmount = $t03541035525._2
979+ let totalGet = $t03547635591._1
980+ let feeAmount = $t03547635591._2
976981 let r = ego("", lpId, lpAssetAmount, this)
977982 let outAmAmt = r._1
978983 let outPrAmt = r._2
10591064 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10601065 if ((unstakeInv == unstakeInv))
10611066 then {
1062- let $t03792138109 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1063- let state = $t03792138109._1
1064- let totalAmount = $t03792138109._2
1067+ let $t03798738175 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1068+ let state = $t03798738175._1
1069+ let totalAmount = $t03798738175._2
10651070 $Tuple2(state, totalAmount)
10661071 }
10671072 else throw("Strict value is not equal to itself.")
10771082 let amId = poolConfig[idxAmAsId]
10781083 let prId = poolConfig[idxPrAsId]
10791084 let lpId = poolConfig[idxLPAsId]
1080- let $t03836838465 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1081- let lpAmount = $t03836838465._1
1082- let state = $t03836838465._2
1083- let feeAmount = $t03836838465._3
1084- let bonus = $t03836838465._4
1085+ let $t03843438531 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1086+ let lpAmount = $t03843438531._1
1087+ let state = $t03843438531._2
1088+ let feeAmount = $t03843438531._3
1089+ let bonus = $t03843438531._4
10851090 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10861091 }
10871092
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 slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1919
2020 let Amult = "100"
2121
2222 let Dconv = "1"
2323
2424 let SEP = "__"
2525
2626 let EMPTY = ""
2727
2828 let PoolActive = 1
2929
3030 let PoolPutDis = 2
3131
3232 let PoolMatcherDis = 3
3333
3434 let PoolShutdown = 4
3535
3636 let idxPoolAddress = 1
3737
3838 let idxPoolSt = 2
3939
4040 let idxLPAsId = 3
4141
4242 let idxAmAsId = 4
4343
4444 let idxPrAsId = 5
4545
4646 let idxAmtAsDcm = 6
4747
4848 let idxPriceAsDcm = 7
4949
5050 let idxIAmtAsId = 8
5151
5252 let idxIPriceAsId = 9
5353
5454 let idxFactStakCntr = 1
5555
5656 let idxFactoryRestCntr = 6
5757
5858 let idxFactSlippCntr = 7
5959
6060 let idxFactGwxRewCntr = 10
6161
6262 let feeDefault = fraction(5, scale8, 10000)
6363
6464 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6565
6666
6767 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6868
6969
7070 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7171
7272
7373 func abs (val) = if ((zeroBigInt > val))
7474 then -(val)
7575 else val
7676
7777
7878 func absBigInt (val) = if ((zeroBigInt > val))
7979 then -(val)
8080 else val
8181
8282
8383 func fc () = "%s__factoryContract"
8484
8585
8686 func mpk () = "%s__managerPublicKey"
8787
8888
8989 func pmpk () = "%s__pendingManagerPublicKey"
9090
9191
9292 func pl () = "%s%s__price__last"
9393
9494
9595 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
9696
9797
9898 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9999
100100
101101 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
102102
103103
104104 func aa () = "%s__amountAsset"
105105
106106
107107 func pa () = "%s__priceAsset"
108108
109109
110110 func amp () = "%s__amp"
111111
112112
113113 func ada () = "%s__addonAddr"
114114
115115
116116 let keyFee = "%s__fee"
117117
118118 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
119119
120120 func fcfg () = "%s__factoryConfig"
121121
122122
123123 func mtpk () = "%s%s__matcher__publicKey"
124124
125125
126126 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
127127
128128
129129 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
130130
131131
132132 func aps () = "%s__shutdown"
133133
134134
135135 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
136136
137137
138138 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
139139
140140
141141 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
142142
143143
144144 func str (val) = match val {
145145 case valStr: String =>
146146 valStr
147147 case _ =>
148148 throw("fail cast to String")
149149 }
150150
151151
152152 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
153153
154154
155155 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
156156
157157
158158 let fca = addressFromStringValue(strf(this, fc()))
159159
160160 let A = strf(this, amp())
161161
162162 func igs () = valueOrElse(getBoolean(fca, aps()), false)
163163
164164
165165 func mp () = fromBase58String(strf(fca, mtpk()))
166166
167167
168168 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
169169
170170 func gpc () = {
171171 let amtAs = strf(this, aa())
172172 let priceAs = strf(this, pa())
173173 let iPriceAs = intf(fca, mba(priceAs))
174174 let iAmtAs = intf(fca, mba(amtAs))
175175 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
176176 }
177177
178178
179179 func gfc () = split(strf(fca, fcfg()), SEP)
180180
181181
182182 let factoryConfig = gfc()
183183
184184 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
185185
186186 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
187187
188188 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
189189
190190 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
191191
192192 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)
193193
194194
195195 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)
196196
197197
198198 func getAccBalance (assetId) = if ((assetId == "WAVES"))
199199 then wavesBalance(this).available
200200 else assetBalance(this, fromBase58String(assetId))
201201
202202
203203 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
204204
205205
206206 func vad (A1,A2,slippage) = {
207207 let diff = fraction((A1 - A2), scale8BigInt, A2)
208208 let pass = ((slippage - abs(diff)) > zeroBigInt)
209209 if (!(pass))
210210 then throw(("Big slpg: " + toString(diff)))
211211 else $Tuple2(pass, min([A1, A2]))
212212 }
213213
214214
215215 func vd (D1,D0,slpg) = {
216216 let diff = fraction(D0, scale8BigInt, D1)
217217 let fail = (slpg > diff)
218218 if (if (fail)
219219 then true
220220 else (D0 > D1))
221221 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
222222 else fail
223223 }
224224
225225
226226 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
227227 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
228228 let prAsAmtX18 = t1(prAmt, prAssetDcm)
229229 cpbi(prAsAmtX18, amtAsAmtX18)
230230 }
231231
232232
233233 func calcPrices (amAmt,prAmt,lpAmt) = {
234234 let cfg = gpc()
235235 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
236236 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
237237 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
238238 let amAmtX18 = t1(amAmt, amtAsDcm)
239239 let prAmtX18 = t1(prAmt, prAsDcm)
240240 let lpAmtX18 = t1(lpAmt, scale8)
241241 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
242242 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
243243 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
244244 }
245245
246246
247247 func calculatePrices (amAmt,prAmt,lpAmt) = {
248248 let p = calcPrices(amAmt, prAmt, lpAmt)
249249 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
250250 }
251251
252252
253253 func takeFee (amount) = {
254254 let feeAmount = fraction(amount, fee, scale8)
255255 $Tuple2((amount - feeAmount), feeAmount)
256256 }
257257
258258
259259 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
260260 let cfg = gpc()
261261 let lpId = cfg[idxLPAsId]
262262 let amId = cfg[idxAmAsId]
263263 let prId = cfg[idxPrAsId]
264264 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
265265 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
266266 let sts = cfg[idxPoolSt]
267267 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
268268 if ((lpId != pmtAssetId))
269269 then throw("Wrong pmt asset")
270270 else {
271271 let amBalance = getAccBalance(amId)
272272 let amBalanceX18 = t1(amBalance, amDcm)
273273 let prBalance = getAccBalance(prId)
274274 let prBalanceX18 = t1(prBalance, prDcm)
275275 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
276276 let curPrice = f1(curPriceX18, scale8)
277277 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
278278 let lpEmissX18 = t1(lpEmiss, scale8)
279279 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
280280 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
281281 let outAmAmt = f1(outAmAmtX18, amDcm)
282282 let outPrAmt = f1(outPrAmtX18, prDcm)
283283 let state = if ((txId58 == ""))
284284 then nil
285285 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
286286 then unit
287287 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
288288 then unit
289289 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)]
290290 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
291291 }
292292 }
293293
294294
295295 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
296296 let cfg = gpc()
297297 let lpId = fromBase58String(cfg[idxLPAsId])
298298 let amIdStr = cfg[idxAmAsId]
299299 let prIdStr = cfg[idxPrAsId]
300300 let inAmIdStr = cfg[idxIAmtAsId]
301301 let inPrIdStr = cfg[idxIPriceAsId]
302302 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
303303 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
304304 let sts = cfg[idxPoolSt]
305305 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
306306 let amBalance = if (isEval)
307307 then getAccBalance(amIdStr)
308308 else if (if (isOneAsset)
309309 then (pmtId == amIdStr)
310310 else false)
311311 then (getAccBalance(amIdStr) - pmtAmt)
312312 else if (isOneAsset)
313313 then getAccBalance(amIdStr)
314314 else (getAccBalance(amIdStr) - inAmAmt)
315315 let prBalance = if (isEval)
316316 then getAccBalance(prIdStr)
317317 else if (if (isOneAsset)
318318 then (pmtId == prIdStr)
319319 else false)
320320 then (getAccBalance(prIdStr) - pmtAmt)
321321 else if (isOneAsset)
322322 then getAccBalance(prIdStr)
323323 else (getAccBalance(prIdStr) - inPrAmt)
324324 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
325325 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
326326 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
327327 let amBalanceX18 = t1(amBalance, amtDcm)
328328 let prBalanceX18 = t1(prBalance, priceDcm)
329329 let r = if ((lpEm == 0))
330330 then {
331331 let curPriceX18 = zeroBigInt
332332 let slippageX18 = zeroBigInt
333333 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
334334 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
335335 }
336336 else {
337337 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
338338 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
339339 let slippageX18 = t1(slippage, scale8)
340340 if (if (if (validateSlippage)
341341 then (curPriceX18 != zeroBigInt)
342342 else false)
343343 then (slippageRealX18 > slippageX18)
344344 else false)
345345 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
346346 else {
347347 let lpEmissionX18 = t1(lpEm, scale8)
348348 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
349349 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
350350 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
351351 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
352352 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
353353 let expAmtAssetAmtX18 = expectedAmts._1
354354 let expPriceAssetAmtX18 = expectedAmts._2
355355 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
356356 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
357357 }
358358 }
359359 let calcLpAmt = r._1
360360 let calcAmAssetPmt = r._2
361361 let calcPrAssetPmt = r._3
362362 let curPrice = f1(r._4, scale8)
363363 let slippageCalc = f1(r._5, scale8)
364364 if ((0 >= calcLpAmt))
365365 then throw("LP <= 0")
366366 else {
367367 let emitLpAmt = if (!(emitLp))
368368 then 0
369369 else calcLpAmt
370370 let amDiff = (inAmAmt - calcAmAssetPmt)
371371 let prDiff = (inPrAmt - calcPrAssetPmt)
372372 let $t01650916854 = if (if (isOneAsset)
373373 then (pmtId == amIdStr)
374374 else false)
375375 then $Tuple2(pmtAmt, 0)
376376 else if (if (isOneAsset)
377377 then (pmtId == prIdStr)
378378 else false)
379379 then $Tuple2(0, pmtAmt)
380380 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
381381 let writeAmAmt = $t01650916854._1
382382 let writePrAmt = $t01650916854._2
383383 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))]
384384 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
385385 }
386386 }
387387
388388
389389 func moa (order) = {
390390 let cfg = gpc()
391391 let amtAsId = cfg[idxAmAsId]
392392 let prAsId = cfg[idxPrAsId]
393393 let sts = parseIntValue(cfg[idxPoolSt])
394394 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
395395 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
396396 let accAmtAsBalance = getAccBalance(amtAsId)
397397 let accPrAsBalance = getAccBalance(prAsId)
398398 let curPriceX18 = if ((order.orderType == Buy))
399399 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
400400 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
401401 let curPrice = f1(curPriceX18, scale8)
402402 if (if (if (igs())
403403 then true
404404 else (sts == PoolMatcherDis))
405405 then true
406406 else (sts == PoolShutdown))
407407 then throw("Admin blocked")
408408 else {
409409 let orAmtAsset = order.assetPair.amountAsset
410410 let orAmtAsStr = if ((orAmtAsset == unit))
411411 then "WAVES"
412412 else toBase58String(value(orAmtAsset))
413413 let orPrAsset = order.assetPair.priceAsset
414414 let orPrAsStr = if ((orPrAsset == unit))
415415 then "WAVES"
416416 else toBase58String(value(orPrAsset))
417417 if (if ((orAmtAsStr != amtAsId))
418418 then true
419419 else (orPrAsStr != prAsId))
420420 then throw("Wr assets")
421421 else {
422422 let orderPrice = order.price
423423 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
424424 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
425425 let isOrderPriceValid = if ((order.orderType == Buy))
426426 then (curPrice >= castOrderPrice)
427427 else (castOrderPrice >= curPrice)
428428 true
429429 }
430430 }
431431 }
432432
433433
434434 func cg (i) = if ((size(i.payments) != 1))
435435 then throw("1 pmnt exp")
436436 else {
437437 let pmt = value(i.payments[0])
438438 let pmtAssetId = value(pmt.assetId)
439439 let pmtAmt = pmt.amount
440440 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
441441 let outAmAmt = r._1
442442 let outPrAmt = r._2
443443 let sts = parseIntValue(r._9)
444444 let state = r._10
445445 if (if (igs())
446446 then true
447447 else (sts == PoolShutdown))
448448 then throw(("Admin blocked: " + toString(sts)))
449449 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
450450 }
451451
452452
453453 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
454454 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
455455 let sts = parseIntValue(r._8)
456456 if (if (if (igs())
457457 then true
458458 else (sts == PoolPutDis))
459459 then true
460460 else (sts == PoolShutdown))
461461 then throw(("Blocked:" + toString(sts)))
462462 else r
463463 }
464464
465465
466466 func getD (xp) = {
467467 let n = big2
468468 let xp0 = xp[0]
469469 let xp1 = xp[1]
470470 let aPrecision = parseBigIntValue(Amult)
471471 let a = (parseBigIntValue(A) * aPrecision)
472472 let s = (xp0 + xp1)
473473 if ((s == big0))
474474 then big0
475475 else {
476476 let ann = (a * n)
477477 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
478478 let ann_s_aPrecision = ((ann * s) / aPrecision)
479479 let ann_aPrecision = (ann - aPrecision)
480480 let n1 = (n + big1)
481481 func calc (acc,cur) = {
482482 let $t02140621426 = acc
483483 let d = $t02140621426._1
484484 let found = $t02140621426._2
485485 if ((found != unit))
486486 then acc
487487 else {
488488 let dp = (((d * d) * d) / xp0_xp1_n_n)
489489 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
490490 let dDiff = absBigInt((dNext - value(d)))
491491 if ((big1 >= dDiff))
492492 then $Tuple2(dNext, cur)
493493 else $Tuple2(dNext, unit)
494494 }
495495 }
496496
497497 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
498498 let $t02184721894 = {
499499 let $l = arr
500500 let $s = size($l)
501501 let $acc0 = $Tuple2(s, unit)
502502 func $f0_1 ($a,$i) = if (($i >= $s))
503503 then $a
504504 else calc($a, $l[$i])
505505
506506 func $f0_2 ($a,$i) = if (($i >= $s))
507507 then $a
508508 else throw("List size exceeds 15")
509509
510510 $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)
511511 }
512512 let d = $t02184721894._1
513513 let found = $t02184721894._2
514514 if ((found != unit))
515515 then d
516516 else throw(("D calculation error, D = " + toString(d)))
517517 }
518518 }
519519
520520
521521 func getYD (xp,i,D) = {
522522 let n = big2
523523 let x = xp[if ((i == 0))
524524 then 1
525525 else 0]
526526 let aPrecision = parseBigIntValue(Amult)
527527 let a = (parseBigIntValue(A) * aPrecision)
528528 let s = x
529529 let ann = (a * n)
530530 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
531531 let b = ((s + ((D * aPrecision) / ann)) - D)
532532 func calc (acc,cur) = {
533533 let $t02239422414 = acc
534534 let y = $t02239422414._1
535535 let found = $t02239422414._2
536536 if ((found != unit))
537537 then acc
538538 else {
539539 let yNext = (((y * y) + c) / ((big2 * y) + b))
540540 let yDiff = absBigInt((yNext - value(y)))
541541 if ((big1 >= yDiff))
542542 then $Tuple2(yNext, cur)
543543 else $Tuple2(yNext, unit)
544544 }
545545 }
546546
547547 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
548548 let $t02272122768 = {
549549 let $l = arr
550550 let $s = size($l)
551551 let $acc0 = $Tuple2(D, unit)
552552 func $f0_1 ($a,$i) = if (($i >= $s))
553553 then $a
554554 else calc($a, $l[$i])
555555
556556 func $f0_2 ($a,$i) = if (($i >= $s))
557557 then $a
558558 else throw("List size exceeds 15")
559559
560560 $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)
561561 }
562562 let y = $t02272122768._1
563563 let found = $t02272122768._2
564564 if ((found != unit))
565565 then y
566566 else throw(("Y calculation error, Y = " + toString(y)))
567567 }
568568
569569
570570 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId) = {
571571 let poolConfig = gpc()
572572 let amId = poolConfig[idxAmAsId]
573573 let prId = poolConfig[idxPrAsId]
574574 let lpId = poolConfig[idxLPAsId]
575575 let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
576576 let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
577577 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
578578 let chechEmission = if ((lpAssetEmission > big0))
579579 then true
580580 else throw("initial deposit requires all coins")
581581 if ((chechEmission == chechEmission))
582582 then {
583583 let amBalance = getAccBalance(amId)
584584 let prBalance = getAccBalance(prId)
585585 let $t02352723989 = if ((txId == ""))
586586 then $Tuple2(amBalance, prBalance)
587587 else if ((pmtAssetId == amId))
588588 then if ((pmtAmtRaw > amBalance))
589589 then throw("invalid payment amount")
590590 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
591591 else if ((pmtAssetId == prId))
592592 then if ((pmtAmtRaw > prBalance))
593593 then throw("invalid payment amount")
594594 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
595595 else throw("wrong pmtAssetId")
596596 let amBalanceOld = $t02352723989._1
597597 let prBalanceOld = $t02352723989._2
598598 let $t02399524171 = if ((pmtAssetId == amId))
599599 then $Tuple2(pmtAmtRaw, 0)
600600 else if ((pmtAssetId == prId))
601601 then $Tuple2(0, pmtAmtRaw)
602602 else throw("invalid payment")
603603 let amAmountRaw = $t02399524171._1
604604 let prAmountRaw = $t02399524171._2
605605 let amAmount = takeFee(amAmountRaw)._1
606606 let prAmount = takeFee(prAmountRaw)._1
607607 let feeAmount = takeFee(pmtAmtRaw)._2
608608 let amBalanceNew = (amBalanceOld + amAmount)
609609 let prBalanceNew = (prBalanceOld + prAmount)
610610 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
611611 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
612612 let checkD = if ((D1 > D0))
613613 then true
614614 else throw()
615615 if ((checkD == checkD))
616616 then {
617617 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
618618 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
619619 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))]
620620 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
621621 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
622622 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
623623 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
624624 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
625625 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
626626 }
627627 else throw("Strict value is not equal to itself.")
628628 }
629629 else throw("Strict value is not equal to itself.")
630630 }
631631
632632
633633 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = if ((size(payments) != 1))
634634 then throw("1 pmnt expd")
635635 else {
636636 let poolConfig = gpc()
637637 let lpId = poolConfig[idxLPAsId]
638638 let amId = poolConfig[idxAmAsId]
639639 let prId = poolConfig[idxPrAsId]
640640 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
641641 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
642642 let poolStatus = poolConfig[idxPoolSt]
643643 let userAddress = if ((caller == restContract))
644644 then originCaller
645645 else caller
646646 let pmt = value(payments[0])
647647 let pmtAssetId = value(pmt.assetId)
648648 let pmtAmt = pmt.amount
649649 let txId58 = toBase58String(transactionId)
650650 if ((lpId != toBase58String(pmtAssetId)))
651651 then throw("Wrong LP")
652652 else {
653653 let amBalance = getAccBalance(amId)
654654 let prBalance = getAccBalance(prId)
655655 let $t02635826466 = {
656656 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
657657 if ($isInstanceOf(@, "(Int, Int)"))
658658 then @
659659 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
660660 }
661661 let totalGet = $t02635826466._1
662662 let feeAmount = $t02635826466._2
663663 let totalAmount = if (if ((minOutAmount > 0))
664664 then (minOutAmount > totalGet)
665665 else false)
666666 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
667667 else totalGet
668668 let $t02665326960 = if ((outAssetId == amId))
669669 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
670670 else if ((outAssetId == prId))
671671 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
672672 else throw("invalid out asset id")
673673 let outAm = $t02665326960._1
674674 let outPr = $t02665326960._2
675675 let amBalanceNew = $t02665326960._3
676676 let prBalanceNew = $t02665326960._4
677677 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
678678 let curPr = f1(curPrX18, scale8)
679679 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
680680 then unit
681681 else fromBase58String(outAssetId)
682682 let sendFeeToMatcher = if ((feeAmount > 0))
683683 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
684684 else nil
685685 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)
686686 if ((state == state))
687687 then {
688688 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
689689 if ((burn == burn))
690690 then $Tuple2(state, totalAmount)
691691 else throw("Strict value is not equal to itself.")
692692 }
693693 else throw("Strict value is not equal to itself.")
694694 }
695695 }
696696
697697
698698 func m () = match getString(mpk()) {
699699 case s: String =>
700700 fromBase58String(s)
701701 case _: Unit =>
702702 unit
703703 case _ =>
704704 throw("Match error")
705705 }
706706
707707
708708 func pm () = match getString(pmpk()) {
709709 case s: String =>
710710 fromBase58String(s)
711711 case _: Unit =>
712712 unit
713713 case _ =>
714714 throw("Match error")
715715 }
716716
717717
718718 let pd = throw("Permission denied")
719719
720720 func mm (i) = match m() {
721721 case pk: ByteVector =>
722722 if ((i.callerPublicKey == pk))
723723 then true
724724 else pd
725725 case _: Unit =>
726726 if ((i.caller == this))
727727 then true
728728 else pd
729729 case _ =>
730730 throw("Match error")
731731 }
732732
733733
734734 @Callable(i)
735735 func constructor (fc) = {
736736 let c = mm(i)
737737 if ((c == c))
738738 then [StringEntry(fc(), fc)]
739739 else throw("Strict value is not equal to itself.")
740740 }
741741
742742
743743
744744 @Callable(i)
745745 func setManager (pendingManagerPublicKey) = {
746746 let c = mm(i)
747747 if ((c == c))
748748 then {
749749 let cm = fromBase58String(pendingManagerPublicKey)
750750 if ((cm == cm))
751751 then [StringEntry(pmpk(), pendingManagerPublicKey)]
752752 else throw("Strict value is not equal to itself.")
753753 }
754754 else throw("Strict value is not equal to itself.")
755755 }
756756
757757
758758
759759 @Callable(i)
760760 func confirmManager () = {
761761 let p = pm()
762762 let hpm = if (isDefined(p))
763763 then true
764764 else throw("No pending manager")
765765 if ((hpm == hpm))
766766 then {
767767 let cpm = if ((i.callerPublicKey == value(p)))
768768 then true
769769 else throw("You are not pending manager")
770770 if ((cpm == cpm))
771771 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
772772 else throw("Strict value is not equal to itself.")
773773 }
774774 else throw("Strict value is not equal to itself.")
775775 }
776776
777777
778778
779779 @Callable(i)
780780 func put (slip,autoStake) = {
781781 let factCfg = gfc()
782782 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
783783 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
784784 if ((0 > slip))
785785 then throw("Wrong slippage")
786786 else if ((size(i.payments) != 2))
787787 then throw("2 pmnts expd")
788788 else {
789789 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, "")
790790 let emitLpAmt = e._2
791791 let lpAssetId = e._7
792792 let state = e._9
793793 let amDiff = e._10
794794 let prDiff = e._11
795795 let amId = e._12
796796 let prId = e._13
797797 let r = invoke(fca, "emit", [emitLpAmt], nil)
798798 if ((r == r))
799799 then {
800800 let el = match r {
801801 case legacy: Address =>
802802 invoke(legacy, "emit", [emitLpAmt], nil)
803803 case _ =>
804804 unit
805805 }
806806 if ((el == el))
807807 then {
808808 let sa = if ((amDiff > 0))
809809 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
810810 else nil
811811 if ((sa == sa))
812812 then {
813813 let sp = if ((prDiff > 0))
814814 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
815815 else nil
816816 if ((sp == sp))
817817 then {
818818 let lpTrnsfr = if (autoStake)
819819 then {
820820 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
821821 if ((ss == ss))
822822 then nil
823823 else throw("Strict value is not equal to itself.")
824824 }
825825 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
826826 (state ++ lpTrnsfr)
827827 }
828828 else throw("Strict value is not equal to itself.")
829829 }
830830 else throw("Strict value is not equal to itself.")
831831 }
832832 else throw("Strict value is not equal to itself.")
833833 }
834834 else throw("Strict value is not equal to itself.")
835835 }
836836 }
837837
838838
839839
840840 @Callable(i)
841841 func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
842842 then throw("1 pmnt expd")
843843 else {
844844 let poolConfig = gpc()
845845 let amId = poolConfig[idxAmAsId]
846846 let prId = poolConfig[idxPrAsId]
847847 let lpId = fromBase58String(poolConfig[idxLPAsId])
848848 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
849849 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
850850 let userAddress = if ((i.caller == this))
851851 then i.originCaller
852852 else i.caller
853853 let pmt = value(i.payments[0])
854854 let pmtAssetId = toBase58String(value(pmt.assetId))
855855 let pmtAmt = pmt.amount
856856 let $t03177431899 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
857857 let estimLP = $t03177431899._1
858858 let state = $t03177431899._2
859859 let feeAmount = $t03177431899._3
860860 let emitLpAmt = if (if ((minOutAmount > 0))
861861 then (minOutAmount > estimLP)
862862 else false)
863863 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
864864 else estimLP
865865 let e = invoke(fca, "emit", [emitLpAmt], nil)
866866 if ((e == e))
867867 then {
868868 let el = match e {
869869 case legacy: Address =>
870870 invoke(legacy, "emit", [emitLpAmt], nil)
871871 case _ =>
872872 unit
873873 }
874874 if ((el == el))
875875 then {
876876 let lpTrnsfr = if (autoStake)
877877 then {
878878 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
879879 if ((ss == ss))
880880 then nil
881881 else throw("Strict value is not equal to itself.")
882882 }
883883 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
884884 let sendFeeToMatcher = if ((feeAmount > 0))
885885 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
886886 else nil
887887 $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
888888 }
889889 else throw("Strict value is not equal to itself.")
890890 }
891891 else throw("Strict value is not equal to itself.")
892892 }
893893
894894
895895
896896 @Callable(i)
897897 func putForFree (maxSlpg) = if ((0 > maxSlpg))
898898 then throw("Wrong slpg")
899899 else if ((size(i.payments) != 2))
900900 then throw("2 pmnts expd")
901901 else {
902902 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, "")
903903 estPut._9
904904 }
905905
906906
907907
908908 @Callable(i)
909909 func get () = {
910910 let r = cg(i)
911911 let outAmtAmt = r._1
912912 let outPrAmt = r._2
913913 let pmtAmt = r._3
914914 let pmtAssetId = r._4
915915 let state = r._5
916916 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
917917 if ((b == b))
918918 then state
919919 else throw("Strict value is not equal to itself.")
920920 }
921921
922922
923923
924924 @Callable(i)
925925 func getOneTknV2 (outAssetId,minOutAmount) = {
926926 let $t03408234237 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
927927 let state = $t03408234237._1
928928 let totalAmount = $t03408234237._2
929929 $Tuple2(state, totalAmount)
930930 }
931931
932932
933933
934934 @Callable(i)
935935 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
936936 let poolConfig = gpc()
937937 let amId = poolConfig[idxAmAsId]
938938 let prId = poolConfig[idxPrAsId]
939939 let lpId = poolConfig[idxLPAsId]
940940 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
941941 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
942942 let D0 = getD(xp)
943943 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
944944 let index = if ((outAssetId == amId))
945945 then 0
946946 else if ((outAssetId == prId))
947947 then 1
948948 else throw("invalid out asset id")
949949 let newY = getYD(xp, index, D1)
950950 let dy = (xp[index] - newY)
951951 let totalGetRaw = toInt((dy - big1))
952952 let $t03501635065 = takeFee(totalGetRaw)
953953 let totalGet = $t03501635065._1
954954 let feeAmount = $t03501635065._2
955- $Tuple2(nil, $Tuple2(totalGet, feeAmount))
955+ let checkTotalGet = if ((totalGet > 0))
956+ then true
957+ else throw("nothing to get")
958+ if ((checkTotalGet == checkTotalGet))
959+ then $Tuple2(nil, $Tuple2(totalGet, feeAmount))
960+ else throw("Strict value is not equal to itself.")
956961 }
957962
958963
959964
960965 @Callable(i)
961966 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
962967 let poolConfig = gpc()
963968 let amId = poolConfig[idxAmAsId]
964969 let prId = poolConfig[idxPrAsId]
965970 let lpId = poolConfig[idxLPAsId]
966971 let amBalance = getAccBalance(amId)
967972 let prBalance = getAccBalance(prId)
968- let $t03541035525 = {
973+ let $t03547635591 = {
969974 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
970975 if ($isInstanceOf(@, "(Int, Int)"))
971976 then @
972977 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
973978 }
974- let totalGet = $t03541035525._1
975- let feeAmount = $t03541035525._2
979+ let totalGet = $t03547635591._1
980+ let feeAmount = $t03547635591._2
976981 let r = ego("", lpId, lpAssetAmount, this)
977982 let outAmAmt = r._1
978983 let outPrAmt = r._2
979984 let sumOfGetAssets = (outAmAmt + outPrAmt)
980985 let bonus = if ((sumOfGetAssets == 0))
981986 then throw("bonus calculation error")
982987 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
983988 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
984989 }
985990
986991
987992
988993 @Callable(i)
989994 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
990995 let r = cg(i)
991996 let outAmAmt = r._1
992997 let outPrAmt = r._2
993998 let pmtAmt = r._3
994999 let pmtAssetId = r._4
9951000 let state = r._5
9961001 if ((noLessThenAmtAsset > outAmAmt))
9971002 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
9981003 else if ((noLessThenPriceAsset > outPrAmt))
9991004 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
10001005 else {
10011006 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10021007 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
10031008 then state
10041009 else throw("Strict value is not equal to itself.")
10051010 }
10061011 }
10071012
10081013
10091014
10101015 @Callable(i)
10111016 func unstakeAndGet (amount) = {
10121017 let checkPayments = if ((size(i.payments) != 0))
10131018 then throw("No pmnts expd")
10141019 else true
10151020 if ((checkPayments == checkPayments))
10161021 then {
10171022 let cfg = gpc()
10181023 let factoryCfg = gfc()
10191024 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10201025 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10211026 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
10221027 if ((unstakeInv == unstakeInv))
10231028 then {
10241029 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
10251030 let sts = parseIntValue(r._9)
10261031 let state = r._10
10271032 let v = if (if (igs())
10281033 then true
10291034 else (sts == PoolShutdown))
10301035 then throw(("Blocked: " + toString(sts)))
10311036 else true
10321037 if ((v == v))
10331038 then {
10341039 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
10351040 if ((burnA == burnA))
10361041 then state
10371042 else throw("Strict value is not equal to itself.")
10381043 }
10391044 else throw("Strict value is not equal to itself.")
10401045 }
10411046 else throw("Strict value is not equal to itself.")
10421047 }
10431048 else throw("Strict value is not equal to itself.")
10441049 }
10451050
10461051
10471052
10481053 @Callable(i)
10491054 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
10501055 let checkPayments = if ((size(i.payments) != 0))
10511056 then throw("No pmnts expd")
10521057 else true
10531058 if ((checkPayments == checkPayments))
10541059 then {
10551060 let cfg = gpc()
10561061 let factoryCfg = gfc()
10571062 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10581063 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10591064 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10601065 if ((unstakeInv == unstakeInv))
10611066 then {
1062- let $t03792138109 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1063- let state = $t03792138109._1
1064- let totalAmount = $t03792138109._2
1067+ let $t03798738175 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1068+ let state = $t03798738175._1
1069+ let totalAmount = $t03798738175._2
10651070 $Tuple2(state, totalAmount)
10661071 }
10671072 else throw("Strict value is not equal to itself.")
10681073 }
10691074 else throw("Strict value is not equal to itself.")
10701075 }
10711076
10721077
10731078
10741079 @Callable(i)
10751080 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
10761081 let poolConfig = gpc()
10771082 let amId = poolConfig[idxAmAsId]
10781083 let prId = poolConfig[idxPrAsId]
10791084 let lpId = poolConfig[idxLPAsId]
1080- let $t03836838465 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1081- let lpAmount = $t03836838465._1
1082- let state = $t03836838465._2
1083- let feeAmount = $t03836838465._3
1084- let bonus = $t03836838465._4
1085+ let $t03843438531 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1086+ let lpAmount = $t03843438531._1
1087+ let state = $t03843438531._2
1088+ let feeAmount = $t03843438531._3
1089+ let bonus = $t03843438531._4
10851090 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10861091 }
10871092
10881093
10891094
10901095 @Callable(i)
10911096 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
10921097 then throw("denied")
10931098 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
10941099
10951100
10961101
10971102 @Callable(i)
10981103 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
10991104 then pd
11001105 else [StringEntry(k, v)]
11011106
11021107
11031108
11041109 @Callable(i)
11051110 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
11061111 then pd
11071112 else [IntegerEntry(k, v)]
11081113
11091114
11101115
11111116 @Callable(i)
11121117 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
11131118
11141119
11151120
11161121 @Callable(i)
11171122 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
11181123
11191124
11201125
11211126 @Callable(i)
11221127 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
11231128 let pr = calcPrices(amAmt, prAmt, lpAmt)
11241129 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
11251130 }
11261131
11271132
11281133
11291134 @Callable(i)
11301135 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
11311136
11321137
11331138
11341139 @Callable(i)
11351140 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
11361141
11371142
11381143
11391144 @Callable(i)
11401145 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
11411146
11421147
11431148
11441149 @Callable(i)
11451150 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, ""))
11461151
11471152
11481153
11491154 @Callable(i)
11501155 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
11511156 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
11521157 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
11531158 }
11541159
11551160
11561161
11571162 @Callable(i)
11581163 func getFeeREADONLY () = $Tuple2(nil, fee)
11591164
11601165
11611166 @Verifier(tx)
11621167 func verify () = {
11631168 let targetPublicKey = match m() {
11641169 case pk: ByteVector =>
11651170 pk
11661171 case _: Unit =>
11671172 tx.senderPublicKey
11681173 case _ =>
11691174 throw("Match error")
11701175 }
11711176 match tx {
11721177 case order: Order =>
11731178 let matcherPub = mp()
11741179 let orderValid = moa(order)
11751180 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
11761181 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
11771182 if (if (if (orderValid)
11781183 then senderValid
11791184 else false)
11801185 then matcherValid
11811186 else false)
11821187 then true
11831188 else toe(orderValid, senderValid, matcherValid)
11841189 case s: SetScriptTransaction =>
11851190 let newHash = blake2b256(value(s.script))
11861191 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
11871192 let currentHash = scriptHash(this)
11881193 if (if ((allowedHash == newHash))
11891194 then (currentHash != newHash)
11901195 else false)
11911196 then true
11921197 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
11931198 case _ =>
11941199 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
11951200 }
11961201 }
11971202

github/deemru/w8io/169f3d6 
117.56 ms