tx · 5XNh4ePEYR6x3AQF8QDp4tz7AbM2fQ28sfL9JeKAfE2C

3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS:  -0.54000000 Waves

2023.10.20 15:18 [2806893] smart account 3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS > SELF 0.00000000 Waves

{ "type": 13, "id": "5XNh4ePEYR6x3AQF8QDp4tz7AbM2fQ28sfL9JeKAfE2C", "fee": 54000000, "feeAssetId": null, "timestamp": 1697804321866, "version": 2, "chainId": 84, "sender": "3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS", "senderPublicKey": "HP8sssVq1866F7CaPQJwgFrt6fsqhQjKwM84cL1wjD2a", "proofs": [ "3g8UNC5THcy2aLp8jorY9VCKJRFyBx7rnh5rsHeU1WnciyuxmfPPUd7Nh4wb1DcFtqXpsNJEYeH9y2nsHyKAuTBg" ], "script": "base64:BgKiAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBQoDCAEIEgQKAggBEgYKBAEICAESBQoDAQgIEg8KDQgICAgICAgICAgICAgSAwoBCBIDCgEIEgUKAwgIARIGCgQIAQgIEgcKBQgICAEEEgUKAwgEARIMCgoICAgBAQEBAQEEEgkKBwgBAQEBAQESABIAEgASABIAEgASABIAEgMKAQgSAwoBCIgBAARDT05GCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgZjb25maWcAB1NGX1BPT0wCAlNGAAdXWF9QT09MAgJXWAAEQ1BNTQIEY3BtbQAERkxBVAIEZmxhdAAPQ0FQX0ZFRV9OT19MT0FOAgljYXBOb0xvYW4ADENBUF9GRUVfTE9BTgIHY2FwTG9hbgAUU1RPUExPU1NfRkVFX05PX0xPQU4CDnN0b3BMb3NzTm9Mb2FuAA1TVE9QTE9TU19MT0FOAgxzdG9wTG9zc0xvYW4ACExPQU5fRkVFAgRsb2FuAAtOT19MT0FOX0ZFRQIGbm9Mb2FuAAZOT19GRUUCBW5vRmVlAAZTQ0FMRTgAgMLXLwAHU0NBTEUxMACAyK+gJQAHU0NBTEUxNgkAtgIBAICAhP6m3uERAApGRUVfU0NBTEU2AMCEPQAUa1NGUG9vbEFBc3NldEJhbGFuY2UCD0FfYXNzZXRfYmFsYW5jZQAUa1NGUG9vbEJBc3NldEJhbGFuY2UCD0JfYXNzZXRfYmFsYW5jZQAPa1NGUG9vbEFBc3NldElkAgpBX2Fzc2V0X2lkAA9rU0ZQb29sQkFzc2V0SWQCCkJfYXNzZXRfaWQADmtTRlBvb2xTaGFyZUlkAg5zaGFyZV9hc3NldF9pZAASa1NGUG9vbFNoYXJlU3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkACmtTRlBvb2xGZWUCCmNvbW1pc3Npb24ADWtVc2VyUG9zaXRpb24CDV91c2VyUG9zaXRpb24AEWtVc2VyUG9zaXRpb25Qb29sAhFfdXNlclBvc2l0aW9uUG9vbAARa1VzZXJCb3Jyb3dBbW91bnQCGV91c2VyUG9zaXRpb25Cb3Jyb3dBbW91bnQAEmtVc2VyQm9ycm93QXNzZXRJZAIaX3VzZXJQb3NpdGlvbkJvcnJvd0Fzc2V0SWQAEGtVc2VyUG9zaXRpb25OdW0CE191c2VyUG9zaXRpb25OdW1iZXIAFWtVc2VyUG9zaXRpb25JbnRlcmVzdAIVX3VzZXJQb3NpdGlvbkludGVyZXN0AAprUG9vbFRvdGFsAgpfcG9vbFRvdGFsAA5rUG9vbFRvdGFsTG9hbgIOX3Bvb2xUb3RhbExvYW4AEWtQb29sSW50ZXJlc3RMb2FuAhFfcG9vbEludGVyZXN0TG9hbgATa1Bvb2xJbnRlcmVzdE5vTG9hbgITX3Bvb2xJbnRlcmVzdE5vTG9hbgAOa1Bvb2xDYW5Cb3Jyb3cCDl9wb29sQ2FuQm9ycm93ABVrQXhseUluRmVlV2l0aG91dExvYW4CDl9heGx5RmVlTm9Mb2FuABJrQXhseUluRmVlV2l0aExvYW4CEF9heGx5RmVlV2l0aExvYW4AEWtBeGx5Tm9Mb2FuQ2FwRmVlAhFfYXhseUZlZUNhcE5vTG9hbgATa0F4bHlXaXRoTG9hbkNhcEZlZQITX2F4bHlGZWVDYXBXaXRoTG9hbgAWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQIYX2F4bHlGZWVTdG9wbG9zc1dpdGhMb2FuABRrQXhseVN0b3BMb3NzTG9hbkZlZQIWX2F4bHlGZWVTdG9wbG9zc05vTG9hbgAKa1JlcXVlc3RJZAILX3JlcXVlc3RfaWQADGtSZXF1ZXN0SXRlcgINcmVxdWVzdHNfaXRlcgAFa1Bvb2wCBXBvb2xfAAlrUG9vbFR5cGUCCV9wb29sVHlwZQAKa1NoYXJlUG9vbAIMX3Bvb2xTaGFyZUlkAA5rUG9vbENhcENoYW5nZQIOX3Bvb2xDYXBDaGFuZ2UAD2tUb2tlbkxhc3RQcmljZQIKbGFzdF9wcmljZQAOa1ByaWNlSW5PcmFjbGUCB190d2FwNUIAB2tBY3RpdmUCBmFjdGl2ZQAMa0FjdGl2ZVVzZXJzAgthY3RpdmVVc2VycwALa0FjdGl2ZVNGV1gCB19hY3RpdmUAC2tQb29sQWN0aXZlAgtfYWN0aXZlUG9vbAANa1VzZXJTdG9wTG9zcwIJX3N0b3BMb3NzABdrRmFsbGJhY2tFeGNoYW5nZVN3b3BmaQIXX2ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkACWtNb25leUJveAIOYXhseV9tb25leV9ib3gADmtTRkZhcm1pbmdBZGRyAhNzd29wZmlfZmFybWluZ19hZGRyAAxrTGVuZFNlcnZpY2UCEWxlbmRfc2VydmljZV9hZGRyAA9rT3BlcmF0b3JDYWxsUEsCEmFkbWluX2NhbGxfcHViX2tleQAMa1ByaWNlT3JhY2xlAgxwcmljZV9vcmFjbGUAC2tFeENvbnRyYWN0AhFleGNoYW5nZV9jb250cmFjdAAPa1d4U3dhcENvbnRyYWN0AhB3eF9zd2FwX2NvbnRyYWN0AAdrV3hSZXN0Agx3eF9yZXN0X2FkZHIAB2tTd29wSWQCB3N3b3BfaWQABWtXeElkAgV3eF9pZAAPa0dyb3VwMUFkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQtrRXhDb250cmFjdAIcTm8gZXhjaGFuZ2UgY29udHJhY3QgYWRkcmVzcwAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGd3hSZXN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUHa1d4UmVzdAISTm8gd3ggcmVzdCBhZGRyZXNzAAZTV09QSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFB2tTd29wSWQCCk5vIHN3b3AgaWQABFdYSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFBWtXeElkAghObyB3eCBpZAAOZ3JvdXAxQWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tHcm91cDFBZG1pbjFQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjFQSwAOZ3JvdXAxQWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tHcm91cDFBZG1pbjJQSwIZQ2FuJ3QgZ2V0IGtHcm91cDFBZG1pbjJQSwAOZ3JvdXAyQWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDJBZG1pbjFQSwIZQ2FuJ3QgZ2V0IGtHcm91cDJBZG1pbjFQSwAOZ3JvdXAyQWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFD2tHcm91cDJBZG1pbjJQSwIZQ2FuJ3QgZ2V0IGtHcm91cDJBZG1pbjFQSwAKb3BlcmF0b3JQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUPa09wZXJhdG9yQ2FsbFBLAhRDYW4ndCBnZXQgb3BlcmF0b3JQSwEPdW5rbm93blBvb2xUeXBlAAkAAgECD1dyb25nIHBvb2wgdHlwZQEOZ2V0TGVuZFNydkFkZHIACQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa0xlbmRTZXJ2aWNlAhtDYW4ndCBnZXQgbGVuZCBzZXJ2aWNlIGFkZHIBDmlzT3BlcmF0b3JDYWxsAQFpAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUKb3BlcmF0b3JQSwUEdW5pdAkAAgECJE9ubHkgb3BlcmF0b3IgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgELaXNBZG1pbkNhbGwBAWkDAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4xUEsGCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQ5ncm91cDFBZG1pbjJQSwUEdW5pdAkAAgECKE9ubHkgYWRtaW4gZ3JvdXAxIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIJAQ5nZXRMZW5kU3J2QWRkcgAFBHVuaXQJAAIBAilPbmx5IGxhbmQgY29udHJhY3QgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEIaXNBY3RpdmUAAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYGBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEQaXNBY3RpdmVGb3JVc2VycwADAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAAIJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUMa0FjdGl2ZVVzZXJzBgYHBQR1bml0CQACAQIpREFwcCBpcyBpbmFjdGl2ZSBmb3IgdXNlcnMgYXQgdGhpcyBtb21lbnQBDGlzUG9vbEFjdGl2ZQIEcG9vbAR0eXBlBApXWFNGQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEdHlwZQULa0FjdGl2ZVNGV1gGBApwb29sQWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAULa1Bvb2xBY3RpdmUGAwMFCldYU0ZBY3RpdmUFCnBvb2xBY3RpdmUHBgcBDmFjY291bnRCYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHRoaXMFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yARFnZXRTRlBvb2xCYWxhbmNlcwEIcG9vbEFkZHIJAJQKAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQUFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBiYWxhbmNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xCQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGJhbGFuY2UBEWdldFdYUG9vbEJhbGFuY2VzAwhwb29sQWRkcgNhSWQDYklkCQCUCgIKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2FJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNiSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAEPZ2V0UG9vbEJhbGFuY2VzBAhwb29sQWRkcgR0eXBlA2FJZANiSWQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgUEdHlwZQUHV1hfUE9PTAkBEWdldFdYUG9vbEJhbGFuY2VzAwUIcG9vbEFkZHIFA2FJZAUDYklkCQEPdW5rbm93blBvb2xUeXBlAAENZ2V0U0ZQb29sRGF0YQEIcG9vbEFkZHIECyR0MDgyNzM4MzIyCQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQskdDA4MjczODMyMgULJHQwODI3MzgzMjIEBGJhbEIIBQskdDA4MjczODMyMgJfMgQEYmFsQQgFCyR0MDgyNzM4MzIyAl8xCQCXCgUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEFBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xCQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAUEYmFsQQUEYmFsQgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ5rU0ZQb29sU2hhcmVJZAIYQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IGlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ1nZXRXWFBvb2xEYXRhAQhwb29sQWRkcgQDY2ZnCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2NmZwUDY2ZnBANhSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAQDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkBANiSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAUDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBAdzaGFyZUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwADAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIaQ2FuJ3QgZ2V0IHBvb2wgTFAgYXNzZXQgaWQECyR0MDkwMTk5MDc4CQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQDCQAAAgULJHQwOTAxOTkwNzgFCyR0MDkwMTk5MDc4BARiYWxCCAULJHQwOTAxOTkwNzgCXzIEBGJhbEEIBQskdDA5MDE5OTA3OAJfMQkAlwoFBQNhSWQFA2JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELZ2V0UG9vbERhdGECCHBvb2xBZGRyBHR5cGUDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBDWdldFNGUG9vbERhdGEBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQENZ2V0V1hQb29sRGF0YQEFCHBvb2xBZGRyCQEPdW5rbm93blBvb2xUeXBlAAEOZ2V0U2hhcmVTdXBwbHkDCHBvb2xBZGRyBHR5cGUHc2hhcmVJZAMJAAACBQR0eXBlBQdTRl9QT09MCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFEmtTRlBvb2xTaGFyZVN1cHBseQIcQ2FuJ3QgZ2V0IHNoYXJlIGFzc2V0IHN1cHBseQMJAAACBQR0eXBlBQdXWF9QT09MCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUHc2hhcmVJZAINV3JvbmcgU2hhcmVJZAhxdWFudGl0eQkBD3Vua25vd25Qb29sVHlwZQABEWdldFBvb2xUb3RhbFNoYXJlAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAAAARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4AAAEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQR1c2VyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0AAAABAQpnZXRBeGx5RmVlAgRwb29sB2ZlZVR5cGUDCQAAAgUHZmVlVHlwZQUMQ0FQX0ZFRV9MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tBeGx5V2l0aExvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUPQ0FQX0ZFRV9OT19MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtBeGx5Tm9Mb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFCExPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEmtBeGx5SW5GZWVXaXRoTG9hbgMJAAACBQdmZWVUeXBlBQtOT19MT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRVrQXhseUluRmVlV2l0aG91dExvYW4DCQAAAgUHZmVlVHlwZQUGTk9fRkVFAAAJAAIBAg5Xcm9uZyBmZWUgdHlwZQEQZ2V0U0ZGYXJtaW5nQWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUOa1NGRmFybWluZ0FkZHICHUNhbid0IGdldCBzd29wZmkgZmFybWluZyBhZGRyARBnZXRXWEZhcm1pbmdBZGRyAQhwb29sQWRkcgQJZkNvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyAhMlc19fZmFjdG9yeUNvbnRyYWN0AiJDYW4ndCBnZXQgV1ggZmFjdG9yeSBjb250cmFjdCBhZGRyBApmYWN0cm95Q2ZnCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlmQ29udHJhY3QCESVzX19mYWN0b3J5Q29uZmlnAhhDYW4ndCBnZXQgV1ggZmFjdG9yeSBjZmcCAl9fCQEHQWRkcmVzcwEJANkEAQkAkQMCBQpmYWN0cm95Q2ZnAAEBDGFzc2V0SWRUb1N0cgEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA2AQBBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAIFV0FWRVMJAAIBAgxOb3QgQXNzZXQgaWQBDmFzc2V0SWRGcm9tU3RyAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBEGdldEFzc2V0RGVjaW1hbHMBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMACAQHJG1hdGNoMAkA7AcBCQDZBAEFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCAUFYXNzZXQIZGVjaW1hbHMJAAIBAhBDYW4ndCBmaW5kIGFzc2V0ARFnZXRBc3NldFByZWNpdGlvbgEHYXNzZXRJZAkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB2Fzc2V0SWQAAAAABQRET1dOAQ5nZXRBc3NldHNQcmljZQEIYXNzZXRJZHMKAQlnZXRQcmljZXMCAWEHYXNzZXRJZAQKYXNzZXRQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUA////////////AQkAzQgCBQFhBQphc3NldFByaWNlCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgENZ2V0U2hhcmVQcmljZQEHc2hhcmVJZAQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUHc2hhcmVJZAUKa1NoYXJlUG9vbAIgQ2FuJ3QgZmluZCBwb29sIGFkZHIgYnkgc2hhcmUgaWQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDEyMDY3MTIxMzIJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDYUlkCAUNJHQwMTIwNjcxMjEzMgJfMQQDYklkCAUNJHQwMTIwNjcxMjEzMgJfMgQIYUJhbGFuY2UIBQ0kdDAxMjA2NzEyMTMyAl8zBAhiQmFsYW5jZQgFDSR0MDEyMDY3MTIxMzICXzQEBnByaWNlcwkBDmdldEFzc2V0c1ByaWNlAQkAzAgCBQNhSWQJAMwIAgUDYklkBQNuaWwEB2RQcmljZUEJAJEDAgUGcHJpY2VzAAAEB2RQcmljZUIJAJEDAgUGcHJpY2VzAAEDAwkAZgIAAAUHZFByaWNlQQYJAGYCAAAFB2RQcmljZUIA////////////AQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBANzdW0JAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgkAawMFA3N1bQUOc2hhcmVQcmVjaXNpb24FC3NoYXJlU3VwcGx5AQ5nZXRTaGFyZVByaWNlcwEIc2hhcmVJZHMKAQlnZXRQcmljZXMCAWEHc2hhcmVJZAkAzQgCBQFhCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQKAAIkbAUIc2hhcmVJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAQ5nZXRDdXJzRW50cmllcwQDYUlkA2JJZAdzaGFyZUlkCHdBbW91bnRzBAxhc3NldHNQcmljZXMJAQ5nZXRBc3NldHNQcmljZQEJAMwIAgUDYUlkCQDMCAIFA2JJZAUDbmlsBApzaGFyZVByaWNlCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQEBnByaWNlcwkAzggCCQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAAkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAEJAMwIAgkApAMBBQpzaGFyZVByaWNlBQNuaWwFCHdBbW91bnRzCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tUb2tlbkxhc3RQcmljZQkAuQkCBQZwcmljZXMCASwFA25pbAEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCAVwVHlwZQhwb29sQWRkcgRwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEBHJlcGwKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIgY2FsY0xQUmVwbGVuaXNoVHdvVG9rZW5zUkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFBHBtdEEJAMwIAgkApAMBBQRwbXRCBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQRyZXBsBQRyZXBsCQCXCgUKAAFACQCRAwIFBHJlcGwAAwMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwABAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAQxhc3NldElkVG9TdHIBCQCRAwIFBHJlcGwAAgoAAUAJAJEDAgUEcmVwbAAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTM2NzYxMzkyNgkAlAoCCQC1CQIKAAFACQD8BwQFCHBvb2xBZGRyAiBldmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQkAzAgCBQRwbXRBBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fCQC1CQIKAAFACQD8BwQFCHBvb2xBZGRyAh9ldmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZCQDMCAIFBHBtdEIFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18DCQAAAgUNJHQwMTM2NzYxMzkyNgUNJHQwMTM2NzYxMzkyNgQKZXZhbFB1dEluQggFDSR0MDEzNjc2MTM5MjYCXzIECmV2YWxQdXRJbkEIBQ0kdDAxMzY3NjEzOTI2Al8xBAVscEluQQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEAAQQFbHBJbkIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5CAAEDCQBmAgUFbHBJbkIFBWxwSW5BBANwbXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5BAAgJAJcKBQUEcG10QQUDcG10CQBlAgUEcG10QgUDcG10BQNiSWQFBWxwSW5CBANwbXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5CAAcJAJcKBQUDcG10BQRwbXRCCQBlAgUEcG10QQUDcG10BQNhSWQFBWxwSW5BCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAEYcmVwbGVuaXNoVHdvVG9rZW5zQnlUeXBlBghwb29sQWRkcgVwVHlwZQRwbXRBA2FJZARwbXRCA2JJZAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2FJZAUEcG10QQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYklkBQRwbXRCBQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQDMCAIJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsBQNuaWwFCHBheW1lbnRzAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQFCHBvb2xBZGRyAgNwdXQJAMwIAgDAhD0JAMwIAgcFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQIcG9vbEFkZHIFcFR5cGUDcG10BXBtdElkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUFcG10SWQFA3BtdAUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIVcmVwbGVuaXNoV2l0aE9uZVRva2VuCQDMCAIJAMwIAgIBMAkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmZjAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQlrUG9vbFR5cGUCBGNwbW0FBEZMQVQCC3B1dE9uZVRrblYyAglwdXRPbmVUa24JAPwHBAUIcG9vbEFkZHIFAmZjCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABB3N0YWtlTFAEBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFB3NoYXJlSWQFBmFtb3VudAUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQJARBnZXRTRkZhcm1pbmdBZGRyAAIPbG9ja1NoYXJlVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgAABQNuaWwFCHBheW1lbnRzAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQJARBnZXRXWEZhcm1pbmdBZGRyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAIFc3Rha2UFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAAQl1bnN0YWtlTFAEBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQEDSR0MDE1NzA0MTYwNTQDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAJUKAwkBEGdldFNGRmFybWluZ0FkZHIAAhN3aXRoZHJhd1NoYXJlVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAJUKAwkBEGdldFdYRmFybWluZ0FkZHIBCQEHQWRkcmVzcwEJANkEAQUEcG9vbAIHdW5zdGFrZQkAzAgCBQdzaGFyZUlkCQDMCAIFBmFtb3VudAUDbmlsCQEPdW5rbm93blBvb2xUeXBlAAQIZmFybUFkZHIIBQ0kdDAxNTcwNDE2MDU0Al8xBAVmTmFtZQgFDSR0MDE1NzA0MTYwNTQCXzIEBnBhcmFtcwgFDSR0MDE1NzA0MTYwNTQCXzMEA2ludgkA/AcEBQhmYXJtQWRkcgUFZk5hbWUFBnBhcmFtcwUDbmlsAwkAAAIFA2ludgUDaW52BQZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEWNhbGNBbW91bnRUb1BheVNGBwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAlmZWVTY2FsZTYAwIQ9BANmZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFCHBvb2xBZGRyBQprU0ZQb29sRmVlBAxhbW50R2V0Tm9GZWUJAG4EBRBhbW91bnRUb2tlblRvR2V0BQlmZWVTY2FsZTYJAGUCBQlmZWVTY2FsZTYFA2ZlZQUHQ0VJTElORwQNJHQwMTY0NzYxNjc4MgMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBAthbW91bnRUb1BheQkAbgQFDGFtbnRHZXROb0ZlZQUEYmFsQgkAZQIFBGJhbEEFDGFtbnRHZXROb0ZlZQUHQ0VJTElORwkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEIEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxBCQBlAgUEYmFsQgUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQQQLYW1vdW50VG9QYXkIBQ0kdDAxNjQ3NjE2NzgyAl8xBAphc3NldFRvUGF5CAUNJHQwMTY0NzYxNjc4MgJfMgkAlAoCBQphc3NldFRvUGF5BQthbW91bnRUb1BheQENZ2V0V1hTd2FwRmVlcwEEcG9vbAQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wECWZDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyAhMlc19fZmFjdG9yeUNvbnRyYWN0AiJDYW4ndCBnZXQgV1ggZmFjdG9yeSBjb250cmFjdCBhZGRyBA5wb29sRmVlRGVmYXVsdAkBBXZhbHVlAQkAmggCBQ53eFN3YXBDb250cmFjdAILJXNfX3Bvb2xGZWUEEnByb3RvY29sRmVlRGVmYXVsdAkBBXZhbHVlAQkAmggCBQ53eFN3YXBDb250cmFjdAIPJXNfX3Byb3RvY29sRmVlBAckbWF0Y2gwCQD8BwQFCWZDb250cmFjdAISZ2V0U3dhcEZlZVJFQURPTkxZCQDMCAIJAKUIAQUIcG9vbEFkZHIFA25pbAUDbmlsAwkAAQIFByRtYXRjaDACCihJbnQsIEludCkEBGZlZXMFByRtYXRjaDAJAJQKAggFBGZlZXMCXzEIBQRmZWVzAl8yCQCUCgIFDnBvb2xGZWVEZWZhdWx0BRJwcm90b2NvbEZlZURlZmF1bHQBEWNhbGNBbW91bnRUb1BheVdYBwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQNJHQwMTc1MjIxNzU2MQkBDWdldFdYU3dhcEZlZXMBBQRwb29sBARwRmVlCAUNJHQwMTc1MjIxNzU2MQJfMQQFcHJGZWUIBQ0kdDAxNzUyMjE3NTYxAl8yBAhmZWVTY2FsZQkAtgIBAIDC1y8EDSR0MDE3NjAxMTc5MDkDCQAAAgUPYXNzZXRUb2tlblRvR2V0BQhhc3NldElkQQQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxCCQBlAgUEYmFsQQUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEIEC2Ftb3VudFRvUGF5CQBrAwUQYW1vdW50VG9rZW5Ub0dldAUEYmFsQQkAZQIFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE3NjAxMTc5MDkCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNzYwMTE3OTA5Al8yBBJhbW91bnRUb1BheVdpdGhGZWUJAKADAQkAvQIECQC2AgEFC2Ftb3VudFRvUGF5BQhmZWVTY2FsZQkAuAICBQhmZWVTY2FsZQkAtgIBCQBkAgUFcHJGZWUFBHBGZWUFB0NFSUxJTkcJAJQKAgUKYXNzZXRUb1BheQUSYW1vdW50VG9QYXlXaXRoRmVlARBleGNoYW5nZURpcmVjdGx5CAVwVHlwZQRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQGcG9vbEZCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCAAMDCQAAAgUFcFR5cGUFB1NGX1BPT0wGCQECIT0CBQZwb29sRkICAAQNJHQwMTgzNTAxODU2MgMJAAACBQZwb29sRkICAAkAlQoDBQRiYWxBBQRiYWxCBQRwb29sBA0kdDAxODQ1NjE4NTI5CQERZ2V0U0ZQb29sQmFsYW5jZXMBCQERQGV4dHJOYXRpdmUoMTA2MikBBQZwb29sRkIEBnNmQmFsQQgFDSR0MDE4NDU2MTg1MjkCXzEEBnNmQmFsQggFDSR0MDE4NDU2MTg1MjkCXzIJAJUKAwUGc2ZCYWxBBQZzZkJhbEIFBnBvb2xGQgQFcEJhbEEIBQ0kdDAxODM1MDE4NTYyAl8xBAVwQmFsQggFDSR0MDE4MzUwMTg1NjICXzIEBmV4UG9vbAgFDSR0MDE4MzUwMTg1NjICXzMEDSR0MDE4NTY3MTg2OTMJARFjYWxjQW1vdW50VG9QYXlTRgcFBmV4UG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQVwQmFsQQUFcEJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDE4NTY3MTg2OTMCXzEEC2Ftb3VudFRvUGF5CAUNJHQwMTg1NjcxODY5MwJfMgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQZleFBvb2wCDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIJAKQDAQUQYW1vdW50VG9rZW5Ub0dldAUDbmlsBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwDCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDE4ODk1MTkwMTcJARFjYWxjQW1vdW50VG9QYXlXWAcFBHBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUEYmFsQQUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMTg4OTUxOTAxNwJfMQQLYW1vdW50VG9QYXkIBQ0kdDAxODg5NTE5MDE3Al8yCQD8BwQFDnd4U3dhcENvbnRyYWN0AgRzd2FwCQDMCAIFEGFtb3VudFRva2VuVG9HZXQJAMwIAgUPYXNzZXRUb2tlblRvR2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsCQEPdW5rbm93blBvb2xUeXBlAAEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECHBvb2xBZGRyBXBUeXBlB3NoYXJlSWQPdXNlckNhbldpdGhkcmF3BA0kdDAxOTMwNDIwNTM5AwkAAAIFBXBUeXBlBQdTRl9QT09MBANpbnYKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIQd2l0aGRyYXdSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQNpbnYFA2ludgkAlAoCCgABQAkAkQMCBQNpbnYAAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFA2ludgABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAMJAAACCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgkApQgBBQhwb29sQWRkcgUJa1Bvb2xUeXBlAgRjcG1tBQRGTEFUBANpbnYJAPwHBAUIcG9vbEFkZHICI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZCQDMCAICAAkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BA0kdDAxOTc5NzIwMjk0BAckbWF0Y2gwBQNpbnYDAwMJAAECCAUHJG1hdGNoMAJfMQIDSW50AwkAAQIIBQckbWF0Y2gwAl8yAgNJbnQDCQABAggFByRtYXRjaDACXzUCA0ludAMJAAECCAUHJG1hdGNoMAJfNgIDSW50AwkAAQIIBQckbWF0Y2gwAl83AgNJbnQDCQABAggFByRtYXRjaDACXzgCBlN0cmluZwkAAQIIBQckbWF0Y2gwAl85AgZTdHJpbmcHBwcHBwcJAAACCQDGCgEFByRtYXRjaDAACgcECG91dEFtQW10CAUHJG1hdGNoMAJfMQQIb3V0UHJBbXQIBQckbWF0Y2gwAl8yBAlhbUJhbGFuY2UIBQckbWF0Y2gwAl81BAlwckJhbGFuY2UIBQckbWF0Y2gwAl82BApscEVtaXNzaW9uCAUHJG1hdGNoMAJfNwQIY3VyUHJpY2UIBQckbWF0Y2gwAl84BApwb29sU3RhdHVzCAUHJG1hdGNoMAJfOQkAmQoHBQhvdXRBbUFtdAUIb3V0UHJBbXQFCWFtQmFsYW5jZQUJcHJCYWxhbmNlBQpscEVtaXNzaW9uBQhjdXJQcmljZQUKcG9vbFN0YXR1cwkAAgECE0NvdWxkbid0IGNhc3QgdHlwZXMECG91dEFtQW10CAUNJHQwMTk3OTcyMDI5NAJfMQQIb3V0UHJBbXQIBQ0kdDAxOTc5NzIwMjk0Al8yBAlhbUJhbGFuY2UIBQ0kdDAxOTc5NzIwMjk0Al8zBAlwckJhbGFuY2UIBQ0kdDAxOTc5NzIwMjk0Al80BApscEVtaXNzaW9uCAUNJHQwMTk3OTcyMDI5NAJfNQQIY3VyUHJpY2UIBQ0kdDAxOTc5NzIwMjk0Al82BApwb29sU3RhdHVzCAUNJHQwMTk3OTcyMDI5NAJfNwkAlAoCBQhvdXRBbUFtdAUIb3V0UHJBbXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EA2ludgkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgITZXZhbHVhdGVHZXRSRUFET05MWQkAzAgCBQdzaGFyZUlkCQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNpbnYFA2ludgkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDaW52AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQAEB2Ftb3VudEEIBQ0kdDAxOTMwNDIwNTM5Al8xBAdhbW91bnRCCAUNJHQwMTkzMDQyMDUzOQJfMgkAlAoCBQdhbW91bnRBBQdhbW91bnRCAQtjbGFpbUZhcm1lZAIFcFR5cGUEcG9vbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACBWNsYWltCQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQZTV09QSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDIwOTA3MjA5ODYJAQ1nZXRXWFBvb2xEYXRhAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQDYUlkCAUNJHQwMjA5MDcyMDk4NgJfMQQDYklkCAUNJHQwMjA5MDcyMDk4NgJfMgQEYUJhbAgFDSR0MDIwOTA3MjA5ODYCXzMEBGJCYWwIBQ0kdDAyMDkwNzIwOTg2Al80BARscElkCAUNJHQwMjA5MDcyMDk4NgJfNQQJYmFsQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQRXWElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgdjbGFpbVd4CQDMCAIFBGxwSWQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUEV1hJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQABD3JlcGxlbmlzaEJ5VHlwZQoFcFR5cGUEcG9vbAdmZWVUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGJhbEEEYmFsQgRMUElkBA9scEJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAMJAAACBQ9scEJhbGFuY2VCZWZvcmUFD2xwQmFsYW5jZUJlZm9yZQQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEDSR0MDIxNTg0MjIwMDADAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcEDSR0MDIxNjUwMjE3NjYJARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMIBQVwVHlwZQUIcG9vbEFkZHIFBHBtdEEFA2FJZAUEcG10QgUDYklkBQRiYWxBBQRiYWxCBAZwbXRJbkEIBQ0kdDAyMTY1MDIxNzY2Al8xBAZwbXRJbkIIBQ0kdDAyMTY1MDIxNzY2Al8yBAZjaGFuZ2UIBQ0kdDAyMTY1MDIxNzY2Al8zBAhjaGFuZ2VJZAgFDSR0MDIxNjUwMjE3NjYCXzQEA2ludgkBGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYFCHBvb2xBZGRyBQVwVHlwZQUGcG10SW5BBQNhSWQFBnBtdEluQgUDYklkAwkAAAIFA2ludgUDaW52CQCUCgIFBmNoYW5nZQUIY2hhbmdlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQBmAgUEcG10QQAACQCUCgIFBHBtdEEFA2FJZAMJAGYCBQRwbXRCAAAJAJQKAgUEcG10QgUDYklkCQACAQIQcG10cyBtdXN0IGJlID4gMAQGY2hhbmdlCAUNJHQwMjE1ODQyMjAwMAJfMQQIY2hhbmdlSWQIBQ0kdDAyMTU4NDIyMDAwAl8yBANpbnYDCQBmAgUGY2hhbmdlAAAJARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQFCHBvb2xBZGRyBQVwVHlwZQUGY2hhbmdlBQhjaGFuZ2VJZAUDbmlsAwkAAAIFA2ludgUDaW52BA5scEJhbGFuY2VBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkBAt0b3RhbFN0YWtlZAkAZQIFDmxwQmFsYW5jZUFmdGVyBQ9scEJhbGFuY2VCZWZvcmUEDWF4bHlGZWVBbW91bnQJAGsDBQt0b3RhbFN0YWtlZAkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2BBF1c2VyU2hhcmVGb3JTdGFrZQkAZQIFC3RvdGFsU3Rha2VkBQ1heGx5RmVlQW1vdW50AwkAZwIAAAURdXNlclNoYXJlRm9yU3Rha2UJAAIBAihhbW91bnQgb2Ygc3Rha2VkIHNoYXJldG9rZW5zIG11c3QgYmUgPiAwBAVpbnZMUAkBB3N0YWtlTFAEBQRwb29sBQVwVHlwZQUETFBJZAURdXNlclNoYXJlRm9yU3Rha2UDCQAAAgUFaW52TFAFBWludkxQCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARByZXBsZW5pc2hFbnRyaWVzCARwb29sBHVzZXIMc3Rha2VkQW1vdW50DWF4bHlGZWVBbW91bnQGcG9zTnVtB3NoYXJlSWQEdHlwZQh3aXRoTG9hbgQLdG90YWxBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wED3RvdGFsQW1vdW50TG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBA0kdDAyMjg1NzIzMDk1AwUId2l0aExvYW4JAJQKAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkAZAIFD3RvdGFsQW1vdW50TG9hbgUMc3Rha2VkQW1vdW50CQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgUPdG90YWxBbW91bnRMb2FuBA9jdXJQb29sSW50ZXJlc3QIBQ0kdDAyMjg1NzIzMDk1Al8xBBN0b3RhbFN0YWtlZFdpdGhMb2FuCAUNJHQwMjI4NTcyMzA5NQJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgULdG90YWxBbW91bnQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgUTdG90YWxTdGFrZWRXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBQ1rVXNlclBvc2l0aW9uBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUVa1VzZXJQb3NpdGlvbkludGVyZXN0BQ9jdXJQb29sSW50ZXJlc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyUG9zaXRpb25Qb29sBQRwb29sCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0FBnBvc051bQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAUNYXhseUZlZUFtb3VudAkA2QQBBQdzaGFyZUlkBQNuaWwBCWxpc3RUb0ludAIBYQRpdGVtCQDNCAIFAWEJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQEQZGlyZWN0U3dvcGZpQ1BNTQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlblRvAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANwbXQJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEJAJEDAgUEcG10UAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEcG10UAABBQNuaWwEC21pblRvUmVjaXZlCQCRAwIFBXJBcmdzAAMEA2ludgkA/AcEBQRkQXBwAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCBQttaW5Ub1JlY2l2ZQUDbmlsBQNuaWwFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZGlyZWN0Um91dGluZ1N3b3BmaQIFckFyZ3MHdG9rZW5UbwQEZEFwcAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQVyQXJncwABBBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAQEcG10UAkAtQkCCQCRAwIFBXJBcmdzAAICAXwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQEYXJncwQFZUFyZ3MJALUJAgkAkQMCBQVyQXJncwADAgF8BApleGNoYW5nZXJzCQC1CQIJAJEDAgUFZUFyZ3MAAAIBLAQOZXhjaGFuZ2Vyc1R5cGUJALUJAgkAkQMCBQVlQXJncwABAgEsBAVhcmdzMQoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAgIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADBAVhcmdzMgoAAiRsCQC1CQIJAJEDAgUFZUFyZ3MAAwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJbGlzdFRvSW50AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAzCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADBBFyb3V0aW5nQXNzZXRzS2V5cwkAtQkCCQCRAwIFBWVBcmdzAAQCASwEC21pblRvUmVjaXZlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFZUFyZ3MABQkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFC21pblRvUmVjaXZlBQNuaWwEA2ludgkA/AcEBQRkQXBwAgxyb3V0aW5nVHJhZGUFBGFyZ3MFA3BtdAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQQEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDI1MjAyMjUyNjgJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwMjUyMDIyNTI2OAJfMQQDQklkCAUNJHQwMjUyMDIyNTI2OAJfMgQEYmFsQQgFDSR0MDI1MjAyMjUyNjgCXzMEBGJhbEIIBQ0kdDAyNTIwMjI1MjY4Al80BAdzaGFyZUlkCAUNJHQwMjUyMDIyNTI2OAJfNQMDCQECIT0CBQd0b2tlbklkBQNBSWQJAQIhPQIFB3Rva2VuSWQFA0JJZAcJAAIBAgtXcm9uZyBhc3NldAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAMJAAACBRB0b3RhbFNoYXJlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFC3Rva2VuQW1vdW50CQDZBAEFB3Rva2VuSWQFA25pbAQYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEC2xvYW5QZXJjZW50CQBrAwUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQZTQ0FMRTgFEHRvdGFsU2hhcmVBbW91bnQEEHRva2Vuc0ZvckZlZUxvYW4JAGsDBQt0b2tlbkFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQSdG9rZW5zRm9yRmVlTm9Mb2FuCQBlAgULdG9rZW5BbW91bnQFEHRva2Vuc0ZvckZlZUxvYW4EC2F4bHlGZWVMb2FuCQBrAwUQdG9rZW5zRm9yRmVlTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQxDQVBfRkVFX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlGZWVOb0xvYW4JAGsDBRJ0b2tlbnNGb3JGZWVOb0xvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUPQ0FQX0ZFRV9OT19MT0FOBQpGRUVfU0NBTEU2BAdheGx5RmVlCQBkAgULYXhseUZlZUxvYW4FDWF4bHlGZWVOb0xvYW4EDSR0MDI2MDEzMjYxMTMDCQAAAgUHdG9rZW5JZAUDQUlkCQCUCgIJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQAACQCUCgIAAAkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlBARwbXRBCAUNJHQwMjYwMTMyNjExMwJfMQQEcG10QggFDSR0MDI2MDEzMjYxMTMCXzIEDSR0MDI2MTE2MjYyMjAJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQMc3Rha2VkQW1vdW50CAUNJHQwMjYxMTYyNjIyMAJfMQQCbmYIBQ0kdDAyNjExNjI2MjIwAl8yBBNjdXJQb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABApzdGFrZWRMb2FuCQBrAwUMc3Rha2VkQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BAxzdGFrZWROb0xvYW4JAGUCBQxzdGFrZWRBbW91bnQFCnN0YWtlZExvYW4ED25ld0ludGVyZXN0TG9hbgMJAGYCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFE2N1clBvb2xJbnRlcmVzdExvYW4JAGsDBQpzdGFrZWRMb2FuBQdTQ0FMRTEwBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAQRbmV3SW50ZXJlc3ROb0xvYW4DCQBmAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQBrAwUMc3Rha2VkTm9Mb2FuBQdTQ0FMRTEwCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgUPbmV3SW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FEW5ld0ludGVyZXN0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBRB0b3RhbFNoYXJlQW1vdW50BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGQCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4FCnN0YWtlZExvYW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFB2F4bHlGZWUJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuSWQFA25pbAkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQFA25pbAEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAR1c2VyBHBvb2wFcG9zSWQIYm9ycm93ZWQEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QEDHBvb2xJbnRlcmVzdAMFCGJvcnJvd2VkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4JAGQCBQdwQW1vdW50CQBrAwUHcEFtb3VudAkAZQIFDHBvb2xJbnRlcmVzdAUMdXNlckludGVyZXN0BQdTQ0FMRTEwAQ9jYWxjU3RvcExvc3NGZWUEBHBvb2wKaXNCb3Jyb3dlZAhzdG9wTG9zcwpscFdpdGhkcmF3BAdmZWVUeXBlAwUKaXNCb3Jyb3dlZAUNU1RPUExPU1NfTE9BTgUUU1RPUExPU1NfRkVFX05PX0xPQU4DBQhzdG9wTG9zcwkAawMFCmxwV2l0aGRyYXcJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgAAAQ53aXRoZHJhd1RvVXNlcgQEdXNlcgRwb29sBXBvc0lkCHN0b3BMb3NzBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAppc0JvcnJvd2VkCQBmAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AAAAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQFCmlzQm9ycm93ZWQEDnBvb2xUb3RhbFNoYXJlCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBJwb29sVG90YWxTaGFyZUxvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDAyODc0OTI4ODIxCQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDI4NzQ5Mjg4MjECXzEEBmlkQlN0cggFDSR0MDI4NzQ5Mjg4MjECXzIEBGJhbEEIBQ0kdDAyODc0OTI4ODIxAl8zBARiYWxCCAUNJHQwMjg3NDkyODgyMQJfNAQHc2hhcmVJZAgFDSR0MDI4NzQ5Mjg4MjECXzUEDSR0MDI4ODI0Mjg4OTEJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDI4ODI0Mjg4OTECXzEEA2lkQggFDSR0MDI4ODI0Mjg4OTECXzIEC3N0b3BMb3NzRmVlCQEPY2FsY1N0b3BMb3NzRmVlBAUEcG9vbAUKaXNCb3Jyb3dlZAUIc3RvcExvc3MFD3VzZXJDYW5XaXRoZHJhdwQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQBkAgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDAyOTU4NjI5Njc1CQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwMjk1ODYyOTY3NQJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDI5NTg2Mjk2NzUCXzIEDSR0MDI5Njc4MzA5MTQDBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDAyOTY3ODMwOTE0Al8xBAd0b1VzZXJCCAUNJHQwMjk2NzgzMDkxNAJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkAZQIFEnBvb2xUb3RhbFNoYXJlTG9hbgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQUDbmlsBQNuaWwEB2VudHJpZXMJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJBBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFB3RvVXNlckIFA2lkQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULc3RvcExvc3NGZWUJANkEAQUHc2hhcmVJZAUDbmlsBRRwb29sVG90YWxMb2FuRW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAkAlAoCBQdlbnRyaWVzCQDMCAIFB3RvVXNlckEJAMwIAgUHdG9Vc2VyQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxwYXJzZVJlcXVlc3QBCXJlcXVlc3RJZAQHcmVxdWVzdAkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQJAKwCAgITTm8gcmVxdWVzdCB3aXRoIGlkIAUJcmVxdWVzdElkAgEsBAR1c2VyCQCRAwIFB3JlcXVlc3QAAAQEcG9vbAkAkQMCBQdyZXF1ZXN0AAEEBHBtdEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAIEA0FJZAkAkQMCBQdyZXF1ZXN0AAMEBHBtdEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAQEA0JJZAkAkQMCBQdyZXF1ZXN0AAUEBGJhbEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAYEBGJhbEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAcEB3NoYXJlSWQJAJEDAgUHcmVxdWVzdAAIBAdid0Fzc2V0CQCRAwIFB3JlcXVlc3QACQQIYndBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAoJAJ0KCwUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50ARBjYWxjQm9ycm93QW1vdW50BgRwbXRBBHBtdEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAMDCQECIT0CBQhib3Jyb3dJZAUDYUlkCQECIT0CBQhib3Jyb3dJZAUDYklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQHZFByaWNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2FJZAUOa1ByaWNlSW5PcmFjbGUEB2RQcmljZUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNiSWQFDmtQcmljZUluT3JhY2xlBAZkZWNQckEJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBAZkZWNQckIJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBAxwYXlkSW5Eb2xsYXIJAGQCCQBrAwUHZFByaWNlQQUEcG10QQUGZGVjUHJBCQBrAwUHZFByaWNlQgUEcG10QgUGZGVjUHJCBA0kdDAzMjg5NjMyOTkzAwkAAAIFCGJvcnJvd0lkBQNhSWQJAJQKAgUHZFByaWNlQQUGZGVjUHJBCQCUCgIFB2RQcmljZUIFBmRlY1ByQgQLYm9ycm93UHJpY2UIBQ0kdDAzMjg5NjMyOTkzAl8xBAtib3Jyb3dEZWNQcggFDSR0MDMyODk2MzI5OTMCXzIJAGsDCQBrAwUMcGF5ZEluRG9sbGFyCQBlAgUIbGV2ZXJhZ2UAZABkBQtib3Jyb3dEZWNQcgULYm9ycm93UHJpY2UBEnBhcnNlUmVwbGVuaXNoUG10cwMEcG10cwNBSWQDQklkAwkAAAIJAJADAQUEcG10cwACAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEEDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwABB2Fzc2V0SWQFA0JJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQgkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50CAkAkQMCBQRwbXRzAAEGYW1vdW50AwkAAAIJAJADAQUEcG10cwABAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQAAAMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0JJZAkAlAoCAAAICQCRAwIFBHBtdHMAAAZhbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50CQACAQIcT25lIG9yIHR3byBwYXltZW50cyBleHBlY3RlZAEPY2FsY1ByaWNlSW1wYWN0BARiYWxBBGJhbEIHbmV3QmFsQQduZXdCYWxCBANwcmkJAGgCCQBlAgUGU0NBTEU4CQBrAwkAawMFBGJhbEIFBlNDQUxFOAUEYmFsQQUGU0NBTEU4CQBrAwUHbmV3QmFsQgUGU0NBTEU4BQduZXdCYWxBAGQDCQBmAgAABQNwcmkJAGgCBQNwcmkA////////////AQUDcHJpARFjbGFpbUFuZENoZWNrQW1udAUEcG9vbAVwVHlwZQVjbGFpbQZhbW91bnQGY2hhbmdlBA0kdDAzMzk5MzM0MjU1AwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBXBUeXBlBQRwb29sBAxjbGFpbWVkQXNzZXQDCQAAAgUFcFR5cGUFB1NGX1BPT0wFBlNXT1BJRAMJAAACBQVwVHlwZQUHV1hfUE9PTAUEV1hJRAkBD3Vua25vd25Qb29sVHlwZQAJAJQKAgUGYW1vdW50BQxjbGFpbWVkQXNzZXQDCQAAAgUNJHQwMzM5OTMzNDI1NQUNJHQwMzM5OTMzNDI1NQQKY2xhaW1Bc3NldAgFDSR0MDMzOTkzMzQyNTUCXzIEC2NsYWltQW1vdW50CAUNJHQwMzM5OTMzNDI1NQJfMQQDYmFsCQEOYWNjb3VudEJhbGFuY2UBBQpjbGFpbUFzc2V0AwkAAAIFA2JhbAUDYmFsAwkAZgIFBmFtb3VudAUDYmFsCQACAQIZVG8gYmlnIGFtb3VudCB0byBleGNoYW5nZQkAlAoCBQtjbGFpbUFtb3VudAUKY2xhaW1Bc3NldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhsBaQETZ2V0UG9vbEluZm9SRUFET05MWQEEcG9vbAQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzNDYyMjM0NzEyCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM0NjIyMzQ3MTICXzEEA0JJZAgFDSR0MDM0NjIyMzQ3MTICXzIEBGJhbEEIBQ0kdDAzNDYyMjM0NzEyAl8zBARiYWxCCAUNJHQwMzQ2MjIzNDcxMgJfNAQHc2hhcmVJZAgFDSR0MDM0NjIyMzQ3MTICXzUEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQJAJQKAgUDbmlsCQCYCgYFA0FJZAUDQklkBQdzaGFyZUlkBQRiYWxBBQRiYWxCBQtzaGFyZVN1cHBseQFpARpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQEHc2hhcmVJZAQLc2hhcmVQcmljZXMJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAkAlAoCBQNuaWwFC3NoYXJlUHJpY2VzAWkBImdldFVzZXJQb3NpdGlvblNoYXJlQW1vdW50UkVBRE9OTFkCBHVzZXIGcG9zTnVtBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAIQVW5rbm93biBwb3NpdGlvbgQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUGcG9zTnVtCQBmAgUMYm9ycm93QW1vdW50AAAJAJQKAgUDbmlsBQ91c2VyQ2FuV2l0aGRyYXcBaQEXZ2V0VXNlclBvc2l0aW9uUkVBRE9OTFkDBHVzZXIFcG9vbHMGcG9zTnVtCgEHdXNlclBvcwIBYQRwb29sBA0kdDAzNTU4NTM1NjU1BQFhBAl3QW1vdW50c0EIBQ0kdDAzNTU4NTM1NjU1Al8xBAl3QW1vdW50c0IIBQ0kdDAzNTU4NTM1NjU1Al8yBAVkZWJ0cwgFDSR0MDM1NTg1MzU2NTUCXzMEC2VxV0Ftb3VudHNBCAUNJHQwMzU1ODUzNTY1NQJfNAQLZXFXQW1vdW50c0IIBQ0kdDAzNTU4NTM1NjU1Al81BAVpbmRleAgFDSR0MDM1NTg1MzU2NTUCXzYDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFDWtVc2VyUG9zaXRpb24JAJgKBgkAzQgCBQl3QW1vdW50c0EAAAkAzQgCBQl3QW1vdW50c0IAAAkAzQgCBQVkZWJ0cwAACQDNCAIFC2VxV0Ftb3VudHNBAAAJAM0IAgULZXFXQW1vdW50c0IAAAkAZAIFBWluZGV4AAEEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzNTkzNDM2MDI0CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM1OTM0MzYwMjQCXzEEA0JJZAgFDSR0MDM1OTM0MzYwMjQCXzIEBGJhbEEIBQ0kdDAzNTkzNDM2MDI0Al8zBARiYWxCCAUNJHQwMzU5MzQzNjAyNAJfNAQHc2hhcmVJZAgFDSR0MDM1OTM0MzYwMjQCXzUEDGJvcnJvd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRFrVXNlckJvcnJvd0Ftb3VudAAABA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sCQCRAwIFBnBvc051bQUFaW5kZXgJAGYCBQxib3Jyb3dBbW91bnQAAAQNJHQwMzYyNDAzNjM2MAkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcECHdBbW91bnRBCAUNJHQwMzYyNDAzNjM2MAJfMQQId0Ftb3VudEIIBQ0kdDAzNjI0MDM2MzYwAl8yAwkAZgIFDGJvcnJvd0Ftb3VudAAABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFBGRlYnQFBGRlYnQEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAGYCBQRkZWJ0BQh3QW1vdW50QQcJAGUCBQRkZWJ0BQh3QW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFA0JJZAkAZgIFBGRlYnQFCHdBbW91bnRCBwkAZQIFBGRlYnQFCHdBbW91bnRCAAAEC2Ftb3VudFRvUGF5AwkAZgIFDWFtb3VudFRvR2V0RXgAAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlTRgcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yAwkAAAIFBXBUeXBlBQdXWF9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIJAQ91bmtub3duUG9vbFR5cGUAAAAEDSR0MDM3MjcyMzc0OTEDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAlAoCCQBlAgkAZAIFCHdBbW91bnRBBQ1hbW91bnRUb0dldEV4BQRkZWJ0CQBlAgUId0Ftb3VudEIFC2Ftb3VudFRvUGF5CQCUCgIJAGUCBQh3QW1vdW50QQULYW1vdW50VG9QYXkJAGUCCQBkAgUId0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFBGRlYnQECmVxV0Ftb3VudEEIBQ0kdDAzNzI3MjM3NDkxAl8xBAplcVdBbW91bnRCCAUNJHQwMzcyNzIzNzQ5MQJfMgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAzQgCBQVkZWJ0cwUEZGVidAkAzQgCBQtlcVdBbW91bnRzQQUKZXFXQW1vdW50QQkAzQgCBQtlcVdBbW91bnRzQgUKZXFXQW1vdW50QgkAZAIFBWluZGV4AAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIFBWRlYnRzCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAZAIFBWluZGV4AAEEDSR0MDM3NzQ2Mzc4NTcKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCYCgYFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3VzZXJQb3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQJd0Ftb3VudHNBCAUNJHQwMzc3NDYzNzg1NwJfMQQJd0Ftb3VudHNCCAUNJHQwMzc3NDYzNzg1NwJfMgQFZGVidHMIBQ0kdDAzNzc0NjM3ODU3Al8zBAtlcVdBbW91bnRzQQgFDSR0MDM3NzQ2Mzc4NTcCXzQEC2VxV0Ftb3VudHNCCAUNJHQwMzc3NDYzNzg1NwJfNQkAlAoCBQNuaWwJAJcKBQUJd0Ftb3VudHNBBQl3QW1vdW50c0IFBWRlYnRzBQtlcVdBbW91bnRzQQULZXFXQW1vdW50c0IBaQEJcmVwbGVuaXNoAwRwb29sCGxldmVyYWdlCGJvcnJvd0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDAwkAZgIAZAUIbGV2ZXJhZ2UGCQBmAgUIbGV2ZXJhZ2UArAIJAAIBAh9MZXZlcmFnZSBjYW4ndCBiZSA8MTAwIGFuZCA+MzAwAwMJAQEhAQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhbkJvcnJvdwkAZgIFCGxldmVyYWdlAGQHCQACAQIdWW91IGNhbid0IGJvcnJvdyBpbiB0aGlzIHBvb2wEDSR0MDM4NDU1Mzg1NDUJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwMzg0NTUzODU0NQJfMQQDQklkCAUNJHQwMzg0NTUzODU0NQJfMgQEYmFsQQgFDSR0MDM4NDU1Mzg1NDUCXzMEBGJhbEIIBQ0kdDAzODQ1NTM4NTQ1Al80BAdzaGFyZUlkCAUNJHQwMzg0NTUzODU0NQJfNQMDCQECIT0CBQhib3Jyb3dJZAUDQUlkCQECIT0CBQhib3Jyb3dJZAUDQklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQNJHQwMzg2MjYzODY4NQkBEnBhcnNlUmVwbGVuaXNoUG10cwMIBQFpCHBheW1lbnRzBQNBSWQFA0JJZAQEcG10QQgFDSR0MDM4NjI2Mzg2ODUCXzEEBHBtdEIIBQ0kdDAzODYyNjM4Njg1Al8yBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQJbmV3UG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50BgUEcG10QQUEcG10QgUDQUlkBQNCSWQFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQCkAwEFBHBtdEEJAMwIAgUDQUlkCQDMCAIJAKQDAQUEcG10QgkAzAgCBQNCSWQJAMwIAgkApAMBBQRiYWxBCQDMCAIJAKQDAQUEYmFsQgkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIJAKQDAQUMYm9ycm93QW1vdW50BQNuaWwCASwEDG5ld1JlcXVlc3RJZAoAAUAJAPwHBAUEdGhpcwIQY3JlYXRlTmV3UmVxdWVzdAkAzAgCBQdyZXF1ZXN0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUMbmV3UmVxdWVzdElkBQxuZXdSZXF1ZXN0SWQEBGFyZ3MJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgUMYm9ycm93QW1vdW50CQDMCAIJAKUIAQUEdGhpcwkAzAgCAhFyZXBsZW5pc2hGcm9tTGFuZAkAzAgCCQCkAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUMbmV3UmVxdWVzdElkAhhDYW4ndCBjcmVhdGUgbmV3IHJlcXVlc3QFA25pbAQDaW52CQD9BwQJAQ5nZXRMZW5kU3J2QWRkcgACDWZsYXNoUG9zaXRpb24FBGFyZ3MFA25pbAMJAAACBQNpbnYFA2ludgQKdXNlclN0YWtlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtBQ1rVXNlclBvc2l0aW9uBA0kdDAzOTY3NDM5NzY4CQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDAzOTY3NDM5NzY4BQ0kdDAzOTY3NDM5NzY4BAduZXdCYWxCCAUNJHQwMzk2NzQzOTc2OAJfMgQHbmV3QmFsQQgFDSR0MDM5Njc0Mzk3NjgCXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwMzk4MzgzOTk1MwkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDM5ODM4Mzk5NTMCXzEECHdBbW91bnRCCAUNJHQwMzk4MzgzOTk1MwJfMgkAlAoCBQNuaWwJAMwIAgUIcHJJbXBhY3QJAMwIAgUId0Ftb3VudEEJAMwIAgUId0Ftb3VudEIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNDAwMDY0MDEyMQkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQtOT19MT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQDCQAAAgUNJHQwNDAwMDY0MDEyMQUNJHQwNDAwMDY0MDEyMQQHYXhseUZlZQgFDSR0MDQwMDA2NDAxMjECXzIECnVzZXJTdGFrZWQIBQ0kdDA0MDAwNjQwMTIxAl8xBA0kdDA0MDEyNzQwMjIxCQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDA0MDEyNzQwMjIxBQ0kdDA0MDEyNzQwMjIxBAduZXdCYWxCCAUNJHQwNDAxMjc0MDIyMQJfMgQHbmV3QmFsQQgFDSR0MDQwMTI3NDAyMjECXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwNDAyOTE0MDQwNgkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDQwMjkxNDA0MDYCXzEECHdBbW91bnRCCAUNJHQwNDAyOTE0MDQwNgJfMgkAlAoCCQDOCAIJARByZXBsZW5pc2hFbnRyaWVzCAUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUJbmV3UG9zTnVtBQdzaGFyZUlkBQVwVHlwZQcJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCBHBvb2wFcG9zSWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAkBDndpdGhkcmF3VG9Vc2VyBAkApQgBCAUBaQZjYWxsZXIFBHBvb2wJAKQDAQUFcG9zSWQHAWkBFGNyZWF0ZVVwZGF0ZVN0b3BMb3NzBAVwb3NJZAZwb29sSWQHYXNzZXRJZAVwcmljZQkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABBB0b2tlbk9yYWNsZVByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUHYXNzZXRJZAUOa1ByaWNlSW5PcmFjbGUEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGcG9vbElkAgFfCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAAgECGlRoZXJlIGFyZSBubyB1c2VyIHBvc2l0aW9uAwkAZwIAAAUFcHJpY2UJAAIBAhxQcmljZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIFBXByaWNlBRB0b2tlbk9yYWNsZVByaWNlCQACAQIrUHJpY2UgbXVzdCBiZSBsZXNzIHRoYW4gY3VycmVudCB0b2tlbiBwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQVwcmljZQUDbmlsAWkBDmRlbGV0ZVN0b3BMb3NzAwVwb3NJZAZwb29sSWQHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCQACAQIITm8gZW50cnkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQVwb3NJZAIBXwUGcG9vbElkAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzBQNuaWwBaQEEaW5pdA0MbW9uZXlCb3hBZGRyDXNmRmFybWluZ0FkZHIIbGVuZEFkZHIPcHJpY2VPcmFjbGVBZGRyEGtlZXBlckV4Q29udHJhY3QOd3hTd2FwQ29udHJhY3QLc3dvcEFzc2V0SWQJd3hBc3NldElkDm9wZXJhdG9yUHViS2V5Emdyb3VwMUFkbWluMVB1YktleRJncm91cDFBZG1pbjJQdWJLZXkSZ3JvdXAyQWRtaW4xUHViS2V5Emdyb3VwMkFkbWluMlB1YktleQkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBCWlzRGVmaW5lZAEJAKIIAQUPa09wZXJhdG9yQ2FsbFBLCQACAQIOQWxyZWFkeSBpbml0ZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDG1vbmV5Qm94QWRkcgkAAgECI21vbmV5Qm94QWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ1zZkZhcm1pbmdBZGRyCQACAQIkc2ZGYXJtaW5nQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQhsZW5kQWRkcgkAAgECH2xlbmRBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFD3ByaWNlT3JhY2xlQWRkcgkAAgECJnByaWNlT3JhY2xlQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRBrZWVwZXJFeENvbnRyYWN0CQACAQIna2VlcGVyRXhDb250cmFjdCBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFC3N3b3BBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQUJd3hBc3NldElkCQACAQIjc3dvcEFzc2V0SWQgaXMgbm90IGNvcnJlY3QgYXNzZXQgaWQDCQECIT0CCQDIAQEJANkEAQUOb3BlcmF0b3JQdWJLZXkAIAkAAgECHW9wZXJhdG9yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMUFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAxQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMVB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFEmdyb3VwMkFkbWluMlB1YktleQAgCQACAQIhZ3JvdXAyQWRtaW4yUHViS2V5IGlzIG5vdCBjb3JyZWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtNb25leUJveAUMbW9uZXlCb3hBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDmtTRkZhcm1pbmdBZGRyBQ1zZkZhcm1pbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtMZW5kU2VydmljZQUIbGVuZEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa1ByaWNlT3JhY2xlBQ9wcmljZU9yYWNsZUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa0V4Q29udHJhY3QFEGtlZXBlckV4Q29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa1d4U3dhcENvbnRyYWN0BQ53eFN3YXBDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQdrU3dvcElkBQtzd29wQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQVrV3hJZAUJd3hBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tPcGVyYXRvckNhbGxQSwUOb3BlcmF0b3JQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMVBLBRJncm91cDFBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMUFkbWluMlBLBRJncm91cDFBZG1pbjJQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMVBLBRJncm91cDJBZG1pbjFQdWJLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa0dyb3VwMkFkbWluMlBLBRJncm91cDJBZG1pbjJQdWJLZXkFA25pbAFpARBjcmVhdGVOZXdSZXF1ZXN0AQZwYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQMbmV3UmVxdWVzdElkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQxrUmVxdWVzdEl0ZXIAAAABCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCkAwEFDG5ld1JlcXVlc3RJZAUKa1JlcXVlc3RJZAUGcGFyYW1zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrUmVxdWVzdEl0ZXIFDG5ld1JlcXVlc3RJZAUDbmlsBQxuZXdSZXF1ZXN0SWQBaQERcmVwbGVuaXNoRnJvbUxhbmQBCXJlcXVlc3RJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBA0kdDA0NTI0NTQ1MzQ5CQEMcGFyc2VSZXF1ZXN0AQUJcmVxdWVzdElkBAR1c2VyCAUNJHQwNDUyNDU0NTM0OQJfMQQEcG9vbAgFDSR0MDQ1MjQ1NDUzNDkCXzIEBHBtdEEIBQ0kdDA0NTI0NTQ1MzQ5Al8zBANBSWQIBQ0kdDA0NTI0NTQ1MzQ5Al80BARwbXRCCAUNJHQwNDUyNDU0NTM0OQJfNQQDQklkCAUNJHQwNDUyNDU0NTM0OQJfNgQEYmFsQQgFDSR0MDQ1MjQ1NDUzNDkCXzcEBGJhbEIIBQ0kdDA0NTI0NTQ1MzQ5Al84BAdzaGFyZUlkCAUNJHQwNDUyNDU0NTM0OQJfOQQHYndBc3NldAgFDSR0MDQ1MjQ1NDUzNDkDXzEwBAhid0Ftb3VudAgFDSR0MDQ1MjQ1NDUzNDkDXzExAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQISV3JvbmcgcGF5bWVudCBzaXplAwMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2J3QXNzZXQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIYndBbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50BA0kdDA0NTUzOTQ1NjM5AwkAAAIFA0FJZAUHYndBc3NldAkAlAoCCQBkAgUEcG10QQUIYndBbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIFCGJ3QW1vdW50BAdwbXRBbGxBCAUNJHQwNDU1Mzk0NTYzOQJfMQQHcG10QWxsQggFDSR0MDQ1NTM5NDU2MzkCXzIEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA0NTcyMTQ1ODM2CQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFCExPQU5fRkVFBQdwbXRBbGxBBQNBSWQFB3BtdEFsbEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQKdXNlclN0YWtlZAgFDSR0MDQ1NzIxNDU4MzYCXzEEB2F4bHlGZWUIBQ0kdDA0NTcyMTQ1ODM2Al8yBAZwb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyBA1ib3Jyb3dFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BQhid0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEmtVc2VyQm9ycm93QXNzZXRJZAUHYndBc3NldAUDbmlsBAdlbnRyaWVzCQEQcmVwbGVuaXNoRW50cmllcwgFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFBnBvc051bQUHc2hhcmVJZAUFcFR5cGUGBA0kdDA0NjE5NjQ2MzExCQEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFCnVzZXJTdGFrZWQECHdBbW91bnRBCAUNJHQwNDYxOTY0NjMxMQJfMQQId0Ftb3VudEIIBQ0kdDA0NjE5NjQ2MzExAl8yCQCUCgIJAM0IAgkAzggCCQDOCAIFB2VudHJpZXMJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsBQ1ib3Jyb3dFbnRyaWVzCQELRGVsZXRlRW50cnkBCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAUKdXNlclN0YWtlZAFpAQlsaXF1aWRhdGUDBHVzZXIFcG9zSWQPbGlxdWlkYXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwNDY4MzI0NjkyMgkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA0NjgzMjQ2OTIyAl8xBANCSWQIBQ0kdDA0NjgzMjQ2OTIyAl8yBARiYWxBCAUNJHQwNDY4MzI0NjkyMgJfMwQEYmFsQggFDSR0MDQ2ODMyNDY5MjICXzQEB3NoYXJlSWQIBQ0kdDA0NjgzMjQ2OTIyAl81BAZhbW91bnQJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPbGlxdWlkYXRlQW1vdW50BAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQJAGYCBQxib3Jyb3dBbW91bnQAAAMJAGYCBQ9saXF1aWRhdGVBbW91bnQFD3VzZXJDYW5XaXRoZHJhdwkAAgECJ1lvdSBjYW4ndCBsaXF1aWRhdGUgbW9yZSB0aGFuIHVzZXIgaGF2ZQMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQBlAgUPdXNlckNhbldpdGhkcmF3BQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBA1zdG9wTG9zc1ByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzAghObyBlbnRyeQMJAGYCBRB0b2tlbk9yYWNsZVByaWNlBQ1zdG9wTG9zc1ByaWNlCQACAQIjVG9rZW4gcHJpY2UgZ3JlYXRlciBzdG9wIGxvc3MgcHJpY2UEA3JlcwkBDndpdGhkcmF3VG9Vc2VyBAUEdXNlcgUEcG9vbAkApAMBBQVwb3NJZAYJAJQKAgkAzQgCCAUDcmVzAl8xCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MIBQNyZXMCXzIBaQEMY2FwaXRhbGl6ZUV4BQRwb29sBXJvdXRlCXRva2VuVG9JZBBhbW91bnRUb0V4Y2hhbmdlBWNsYWltCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAQNJHQwNDg4OTI0ODk5NAkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRBhbW91bnRUb0V4Y2hhbmdlBQZjaGFuZ2UDCQAAAgUNJHQwNDg4OTI0ODk5NAUNJHQwNDg4OTI0ODk5NAQMY2xhaW1lZEFzc2V0CAUNJHQwNDg4OTI0ODk5NAJfMgQNY2xhaW1lZEFtb3VudAgFDSR0MDQ4ODkyNDg5OTQCXzEEBXJBcmdzCQC1CQIFBXJvdXRlAgJfXwQPZXhjaGFuZ2VkQW1vdW50AwkAAAIJAJEDAgUFckFyZ3MAAAIQZGlyZWN0U3dvcGZpQ1BNTQkBEGRpcmVjdFN3b3BmaUNQTU0CBQVyQXJncwUJdG9rZW5Ub0lkAwkAAAIJAJEDAgUFckFyZ3MAAAINcm91dGluZ1N3b3BmaQkBE2RpcmVjdFJvdXRpbmdTd29wZmkCBQVyQXJncwUJdG9rZW5Ub0lkCQACAQILV3Jvbmcgcm91dGUDCQAAAgUPZXhjaGFuZ2VkQW1vdW50BQ9leGNoYW5nZWRBbW91bnQECW5ld0NoYW5nZQkAZQIJAGQCBQ1jbGFpbWVkQW1vdW50BQZjaGFuZ2UFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZwIFCW5ld0NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlBQluZXdDaGFuZ2UFA25pbAUDbmlsCQDOCAIJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jYXBpdGFsaXplTm9FeAMEcG9vbAVjbGFpbRFhbW91bnRGcm9tQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEDSR0MDQ5Njc4NDk3NzYJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQURYW1vdW50RnJvbUJhbGFuY2UAAAMJAAACBQ0kdDA0OTY3ODQ5Nzc2BQ0kdDA0OTY3ODQ5Nzc2BAxjbGFpbWVkQXNzZXQIBQ0kdDA0OTY3ODQ5Nzc2Al8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNDk2Nzg0OTc3NgJfMQkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQkBDGFzc2V0SWRUb1N0cgEFDGNsYWltZWRBc3NldAkAZAIFDWNsYWltZWRBbW91bnQFEWFtb3VudEZyb21CYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2luaXROZXdQb29sCgR0eXBlCHBvb2xUeXBlCHBvb2xBZGRyC2luRmVlTm9Mb2FuCWluRmVlTG9hbgxjYXBGZWVOb0xvYW4OY2FwRmVlV2l0aExvYW4Rc3RvcGxvc3NGZWVOb0xvYW4Tc3RvcGxvc3NGZWVXaXRoTG9hbgljYW5Cb3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDAwkBAiE9AgUEdHlwZQUHU0ZfUE9PTAkBAiE9AgUEdHlwZQUHV1hfUE9PTAcJAAIBAgpXcm9uZyB0eXBlAwMJAQIhPQIFCHBvb2xUeXBlBQRDUE1NCQECIT0CBQhwb29sVHlwZQUERkxBVAcJAAIBAg9Xcm9uZyBwb29sIHR5cGUEDSR0MDUwMjk3NTAzOTEJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQhwb29sQWRkcgUEdHlwZQQDYUlkCAUNJHQwNTAyOTc1MDM5MQJfMQQDYklkCAUNJHQwNTAyOTc1MDM5MQJfMgQEYUJhbAgFDSR0MDUwMjk3NTAzOTECXzMEBGJCYWwIBQ0kdDA1MDI5NzUwMzkxAl80BAdzaGFyZUlkCAUNJHQwNTAyOTc1MDM5MQJfNQMJAGYCAAAFC2luRmVlTm9Mb2FuCQACAQIiaW5GZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCWluRmVlTG9hbgkAAgECIGluRmVlTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUMY2FwRmVlTm9Mb2FuCQACAQIjY2FwRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQ5jYXBGZWVXaXRoTG9hbgkAAgECJWNhcEZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRFzdG9wbG9zc0ZlZU5vTG9hbgkAAgECKHN0b3Bsb3NzRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQACAQIqc3RvcGxvc3NGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRVrQXhseUluRmVlV2l0aG91dExvYW4FC2luRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRJrQXhseUluRmVlV2l0aExvYW4FCWluRmVlTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa0F4bHlOb0xvYW5DYXBGZWUFDGNhcEZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa0F4bHlXaXRoTG9hbkNhcEZlZQUOY2FwRmVlV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUFEXN0b3Bsb3NzRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRRrQXhseVN0b3BMb3NzTG9hbkZlZQUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgURa1Bvb2xJbnRlcmVzdExvYW4AAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUIcG9vbEFkZHIFCWtQb29sVHlwZQUIcG9vbFR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sBQhwb29sQWRkcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQhwb29sQWRkcgUOa1Bvb2xDYW5Cb3Jyb3cFCWNhbkJvcnJvdwUDbmlsAWkBDnVwZGF0ZVBvb2xGZWVzBwhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyCQACAQkArAICAhpDYW4ndCBmaW5kIHBvb2wgd2l0aCBhZGRyIAUIcG9vbEFkZHIDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4FA25pbAFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQITZEFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYFA25pbAFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhVkQXBwIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHBQNuaWwBaQEQYWN0aXZhdGVGb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh1kQXBwIGFscmVhZHkgYWN0aXZlIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBgUDbmlsAWkBEHNodXRkb3duRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh9kQXBwIGFscmVhZHkgc2h1dGRvd24gZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMHBQNuaWwBaQEKYWN0aXZhdGVTRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIVU1dPUEZJIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIXU1dPUEZJIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEKYWN0aXZhdGVXWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIRV1ggYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25XWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhNXWCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBDGFjdGl2YXRlUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhNQb29sIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgUDbmlsAWkBDHNodXRkb3duUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECFVBvb2wgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQcFA25pbAECdHgBBnZlcmlmeQAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEBmlzU2VsZgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQQKaXNSaWdodEZlZQMJAAACCAUDaW52A2ZlZQCg9zYJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHBAppc0luaXRDYWxsCQAAAggFA2ludghmdW5jdGlvbgIEaW5pdAQMaXNub1BheW1lbnRzCQAAAgkAkAMBCAUDaW52CHBheW1lbnRzAAADAwMFCmlzUmlnaHRGZWUFCmlzSW5pdENhbGwHBQZpc1NlbGYHBQxpc25vUGF5bWVudHMHBAxncm91cDFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ5ncm91cDFBZG1pbjFQSwABCQBkAgAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUOZ3JvdXAxQWRtaW4yUEsAAQAABAxncm91cDJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQ5ncm91cDJBZG1pbjFQSwABCQBkAgAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUOZ3JvdXAyQWRtaW4yUEsAAQAACQAAAgkAZAIFDGdyb3VwMVNpZ25lZAUMZ3JvdXAyU2lnbmVkAAIW/HdF", "height": 2806893, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 71ZBgz93Z1nyQaB7fPCbPmjCrZzSAjAeDTumkK46pxSz Next: 9xen3XhdXaU3SrhxQvgjmu2C2FMfQ4mick9keM1Ce2N4 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let CONF = addressFromStringValue(getStringValue(this, "config"))
5+
46 let SF_POOL = "SF"
57
68 let WX_POOL = "WX"
121123
122124 let kWxSwapContract = "wx_swap_contract"
123125
126+let kWxRest = "wx_rest_addr"
127+
124128 let kSwopId = "swop_id"
125129
126130 let kWxId = "wx_id"
133137
134138 let kGroup2Admin2PK = "group2_admin2_pub_key"
135139
136-let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
140+let moneyBox = addressFromStringValue(valueOrErrorMessage(getString(CONF, kMoneyBox), "No axly moneyBox address"))
137141
138-let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
142+let exContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kExContract), "No exchange contract address"))
139143
140-let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
144+let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPriceOracle), "No price oracle address"))
141145
142-let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
146+let wxSwapContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxSwapContract), "No wx swap address"))
143147
144-let SWOPID = fromBase58String(valueOrErrorMessage(getString(this, kSwopId), "No swop id"))
148+let wxRest = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxRest), "No wx rest address"))
145149
146-let WXID = fromBase58String(valueOrErrorMessage(getString(this, kWxId), "No wx id"))
150+let SWOPID = fromBase58String(valueOrErrorMessage(getString(CONF, kSwopId), "No swop id"))
147151
148-let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
152+let WXID = fromBase58String(valueOrErrorMessage(getString(CONF, kWxId), "No wx id"))
149153
150-let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
154+let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
155+
156+let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
151157
152158 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
153159
154160 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
155161
156-let operatorPK = fromBase58String(valueOrErrorMessage(getString(this, kOperatorCallPK), "Can't get operatorPK"))
162+let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
157163
158164 func unknownPoolType () = throw("Wrong pool type")
159165
160166
161-func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
167+func getLendSrvAddr () = addressFromStringValue(valueOrErrorMessage(getString(CONF, kLendService), "Can't get lend service addr"))
162168
163169
164170 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
240246
241247
242248 func getSFPoolData (poolAddr) = {
243- let $t080898138 = getSFPoolBalances(poolAddr)
244- if (($t080898138 == $t080898138))
249+ let $t082738322 = getSFPoolBalances(poolAddr)
250+ if (($t082738322 == $t082738322))
245251 then {
246- let balB = $t080898138._2
247- let balA = $t080898138._1
252+ let balB = $t082738322._2
253+ let balA = $t082738322._1
248254 $Tuple5(valueOrErrorMessage(getString(poolAddr, kSFPoolAAssetId), "Can't get pool A asset id"), valueOrErrorMessage(getString(poolAddr, kSFPoolBAssetId), "Can't get pool B asset id"), balA, balB, valueOrErrorMessage(getString(poolAddr, kSFPoolShareId), "Can't get share asset id"))
249255 }
250256 else throw("Strict value is not equal to itself.")
278284 then @
279285 else unit
280286 }, "Can't get pool LP asset id")
281- let $t088358894 = getWXPoolBalances(poolAddr, aId, bId)
282- if (($t088358894 == $t088358894))
287+ let $t090199078 = getWXPoolBalances(poolAddr, aId, bId)
288+ if (($t090199078 == $t090199078))
283289 then {
284- let balB = $t088358894._2
285- let balA = $t088358894._1
290+ let balB = $t090199078._2
291+ let balA = $t090199078._1
286292 $Tuple5(aId, bId, balA, balB, shareId)
287293 }
288294 else throw("Strict value is not equal to itself.")
390396 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
391397 let poolAddr = Address(fromBase58String(pool))
392398 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
393- let $t01188311948 = getPoolData(poolAddr, pType)
394- let aId = $t01188311948._1
395- let bId = $t01188311948._2
396- let aBalance = $t01188311948._3
397- let bBalance = $t01188311948._4
399+ let $t01206712132 = getPoolData(poolAddr, pType)
400+ let aId = $t01206712132._1
401+ let bId = $t01206712132._2
402+ let aBalance = $t01206712132._3
403+ let bBalance = $t01206712132._4
398404 let prices = getAssetsPrice([aId, bId])
399405 let dPriceA = prices[0]
400406 let dPriceB = prices[1]
473479 }
474480 else if ((pType == WX_POOL))
475481 then {
476- let $t01349213742 = $Tuple2(split({
482+ let $t01367613926 = $Tuple2(split({
477483 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
478484 if ($isInstanceOf(@, "String"))
479485 then @
484490 then @
485491 else throw(($getType(@) + " couldn't be cast to String"))
486492 }, "__"))
487- if (($t01349213742 == $t01349213742))
493+ if (($t01367613926 == $t01367613926))
488494 then {
489- let evalPutInB = $t01349213742._2
490- let evalPutInA = $t01349213742._1
495+ let evalPutInB = $t01367613926._2
496+ let evalPutInA = $t01367613926._1
491497 let lpInA = parseIntValue(evalPutInA[1])
492498 let lpInB = parseIntValue(evalPutInB[1])
493499 if ((lpInB > lpInA))
541547
542548
543549 func unstakeLP (pool,pType,shareId,amount) = {
544- let $t01552015870 = if ((pType == SF_POOL))
550+ let $t01570416054 = if ((pType == SF_POOL))
545551 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
546552 else if ((pType == WX_POOL))
547553 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
548554 else unknownPoolType()
549- let farmAddr = $t01552015870._1
550- let fName = $t01552015870._2
551- let params = $t01552015870._3
555+ let farmAddr = $t01570416054._1
556+ let fName = $t01570416054._2
557+ let params = $t01570416054._3
552558 let inv = invoke(farmAddr, fName, params, nil)
553559 if ((inv == inv))
554560 then amount
561567 let feeScale6 = 1000000
562568 let fee = getIntegerValue(poolAddr, kSFPoolFee)
563569 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
564- let $t01629216598 = if ((assetTokenToGet == assetIdA))
570+ let $t01647616782 = if ((assetTokenToGet == assetIdA))
565571 then {
566572 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
567573 $Tuple2(amountToPay, assetIdB)
570576 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
571577 $Tuple2(amountToPay, assetIdA)
572578 }
573- let amountToPay = $t01629216598._1
574- let assetToPay = $t01629216598._2
579+ let amountToPay = $t01647616782._1
580+ let assetToPay = $t01647616782._2
575581 $Tuple2(assetToPay, amountToPay)
576582 }
577583
591597
592598
593599 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
594- let $t01733817377 = getWXSwapFees(pool)
595- let pFee = $t01733817377._1
596- let prFee = $t01733817377._2
600+ let $t01752217561 = getWXSwapFees(pool)
601+ let pFee = $t01752217561._1
602+ let prFee = $t01752217561._2
597603 let feeScale = toBigInt(100000000)
598- let $t01741717725 = if ((assetTokenToGet == assetIdA))
604+ let $t01760117909 = if ((assetTokenToGet == assetIdA))
599605 then {
600606 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
601607 $Tuple2(amountToPay, assetIdB)
604610 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
605611 $Tuple2(amountToPay, assetIdA)
606612 }
607- let amountToPay = $t01741717725._1
608- let assetToPay = $t01741717725._2
613+ let amountToPay = $t01760117909._1
614+ let assetToPay = $t01760117909._2
609615 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
610616 $Tuple2(assetToPay, amountToPayWithFee)
611617 }
617623 then true
618624 else (poolFB != ""))
619625 then {
620- let $t01816618378 = if ((poolFB == ""))
626+ let $t01835018562 = if ((poolFB == ""))
621627 then $Tuple3(balA, balB, pool)
622628 else {
623- let $t01827218345 = getSFPoolBalances(addressFromStringValue(poolFB))
624- let sfBalA = $t01827218345._1
625- let sfBalB = $t01827218345._2
629+ let $t01845618529 = getSFPoolBalances(addressFromStringValue(poolFB))
630+ let sfBalA = $t01845618529._1
631+ let sfBalB = $t01845618529._2
626632 $Tuple3(sfBalA, sfBalB, poolFB)
627633 }
628- let pBalA = $t01816618378._1
629- let pBalB = $t01816618378._2
630- let exPool = $t01816618378._3
631- let $t01838318509 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
632- let assetToPay = $t01838318509._1
633- let amountToPay = $t01838318509._2
634+ let pBalA = $t01835018562._1
635+ let pBalB = $t01835018562._2
636+ let exPool = $t01835018562._3
637+ let $t01856718693 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
638+ let assetToPay = $t01856718693._1
639+ let amountToPay = $t01856718693._2
634640 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
635641 }
636642 else if ((pType == WX_POOL))
637643 then {
638- let $t01871118833 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
639- let assetToPay = $t01871118833._1
640- let amountToPay = $t01871118833._2
644+ let $t01889519017 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
645+ let assetToPay = $t01889519017._1
646+ let amountToPay = $t01889519017._2
641647 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
642648 }
643649 else unknownPoolType()
645651
646652
647653 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
648- let $t01912020355 = if ((pType == SF_POOL))
654+ let $t01930420539 = if ((pType == SF_POOL))
649655 then {
650656 let inv = {
651657 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
673679 let inv = invoke(poolAddr, "estimateGetOperationWrapperREADONLY", ["", shareId, userCanWithdraw, toString(this)], nil)
674680 if ((inv == inv))
675681 then {
676- let $t01961320110 = match inv {
682+ let $t01979720294 = match inv {
677683 case _ =>
678684 if (if (if ($isInstanceOf($match0._1, "Int"))
679685 then if ($isInstanceOf($match0._2, "Int"))
702708 }
703709 else throw("Couldn't cast types")
704710 }
705- let outAmAmt = $t01961320110._1
706- let outPrAmt = $t01961320110._2
707- let amBalance = $t01961320110._3
708- let prBalance = $t01961320110._4
709- let lpEmission = $t01961320110._5
710- let curPrice = $t01961320110._6
711- let poolStatus = $t01961320110._7
711+ let outAmAmt = $t01979720294._1
712+ let outPrAmt = $t01979720294._2
713+ let amBalance = $t01979720294._3
714+ let prBalance = $t01979720294._4
715+ let lpEmission = $t01979720294._5
716+ let curPrice = $t01979720294._6
717+ let poolStatus = $t01979720294._7
712718 $Tuple2(outAmAmt, outPrAmt)
713719 }
714720 else throw("Strict value is not equal to itself.")
725731 else throw("Strict value is not equal to itself.")
726732 }
727733 else unknownPoolType()
728- let amountA = $t01912020355._1
729- let amountB = $t01912020355._2
734+ let amountA = $t01930420539._1
735+ let amountB = $t01930420539._2
730736 $Tuple2(amountA, amountB)
731737 }
732738
748754 }
749755 else if ((pType == WX_POOL))
750756 then {
751- let $t02072320802 = getWXPoolData(addressFromStringValue(pool))
752- let aId = $t02072320802._1
753- let bId = $t02072320802._2
754- let aBal = $t02072320802._3
755- let bBal = $t02072320802._4
756- let lpId = $t02072320802._5
757+ let $t02090720986 = getWXPoolData(addressFromStringValue(pool))
758+ let aId = $t02090720986._1
759+ let bId = $t02090720986._2
760+ let aBal = $t02090720986._3
761+ let bBal = $t02090720986._4
762+ let lpId = $t02090720986._5
757763 let balBefore = accountBalance(WXID)
758764 if ((balBefore == balBefore))
759765 then {
775781 if ((lpBalanceBefore == lpBalanceBefore))
776782 then {
777783 let poolAddr = addressFromStringValue(pool)
778- let $t02140021816 = if (if ((pmtA > 0))
784+ let $t02158422000 = if (if ((pmtA > 0))
779785 then (pmtB > 0)
780786 else false)
781787 then {
782- let $t02146621582 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
783- let pmtInA = $t02146621582._1
784- let pmtInB = $t02146621582._2
785- let change = $t02146621582._3
786- let changeId = $t02146621582._4
788+ let $t02165021766 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
789+ let pmtInA = $t02165021766._1
790+ let pmtInB = $t02165021766._2
791+ let change = $t02165021766._3
792+ let changeId = $t02165021766._4
787793 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
788794 if ((inv == inv))
789795 then $Tuple2(change, changeId)
794800 else if ((pmtB > 0))
795801 then $Tuple2(pmtB, bId)
796802 else throw("pmts must be > 0")
797- let change = $t02140021816._1
798- let changeId = $t02140021816._2
803+ let change = $t02158422000._1
804+ let changeId = $t02158422000._2
799805 let inv = if ((change > 0))
800806 then replenishOneTokenByType(poolAddr, pType, change, changeId)
801807 else nil
823829 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
824830 let totalAmount = getPoolTotalShare(pool)
825831 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
826- let $t02267322911 = if (withLoan)
832+ let $t02285723095 = if (withLoan)
827833 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
828834 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
829- let curPoolInterest = $t02267322911._1
830- let totalStakedWithLoan = $t02267322911._2
835+ let curPoolInterest = $t02285723095._1
836+ let totalStakedWithLoan = $t02285723095._2
831837 [IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), totalStakedWithLoan), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPosition), stakedAmount), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInterest), curPoolInterest), StringEntry((((user + "_") + toString(posNum)) + kUserPositionPool), pool), IntegerEntry((user + kUserPositionNum), posNum), ScriptTransfer(moneyBox, axlyFeeAmount, fromBase58String(shareId))]
832838 }
833839
908914
909915 func capitalize (pool,pType,tokenId,tokenAmount) = {
910916 let poolAddr = Address(fromBase58String(pool))
911- let $t02501825084 = getPoolData(poolAddr, pType)
912- let AId = $t02501825084._1
913- let BId = $t02501825084._2
914- let balA = $t02501825084._3
915- let balB = $t02501825084._4
916- let shareId = $t02501825084._5
917+ let $t02520225268 = getPoolData(poolAddr, pType)
918+ let AId = $t02520225268._1
919+ let BId = $t02520225268._2
920+ let balA = $t02520225268._3
921+ let balB = $t02520225268._4
922+ let shareId = $t02520225268._5
917923 if (if ((tokenId != AId))
918924 then (tokenId != BId)
919925 else false)
930936 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
931937 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
932938 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
933- let $t02582925929 = if ((tokenId == AId))
939+ let $t02601326113 = if ((tokenId == AId))
934940 then $Tuple2((tokenAmount - axlyFee), 0)
935941 else $Tuple2(0, (tokenAmount - axlyFee))
936- let pmtA = $t02582925929._1
937- let pmtB = $t02582925929._2
938- let $t02593226036 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
939- let stakedAmount = $t02593226036._1
940- let nf = $t02593226036._2
942+ let pmtA = $t02601326113._1
943+ let pmtB = $t02601326113._2
944+ let $t02611626220 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
945+ let stakedAmount = $t02611626220._1
946+ let nf = $t02611626220._2
941947 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
942948 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
943949 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
983989 let userAddr = Address(fromBase58String(user))
984990 let poolAddr = Address(fromBase58String(pool))
985991 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
986- let $t02856528637 = getPoolData(poolAddr, pType)
987- let idAStr = $t02856528637._1
988- let idBStr = $t02856528637._2
989- let balA = $t02856528637._3
990- let balB = $t02856528637._4
991- let shareId = $t02856528637._5
992- let $t02864028707 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
993- let idA = $t02864028707._1
994- let idB = $t02864028707._2
992+ let $t02874928821 = getPoolData(poolAddr, pType)
993+ let idAStr = $t02874928821._1
994+ let idBStr = $t02874928821._2
995+ let balA = $t02874928821._3
996+ let balB = $t02874928821._4
997+ let shareId = $t02874928821._5
998+ let $t02882428891 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
999+ let idA = $t02882428891._1
1000+ let idB = $t02882428891._2
9951001 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
9961002 let cBalABefore = accountBalance(idA)
9971003 if ((cBalABefore == cBalABefore))
10221028 let cBalBAfter = accountBalance(idB)
10231029 if ((cBalBAfter == cBalBAfter))
10241030 then {
1025- let $t02940229491 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1026- let tokensAmountA = $t02940229491._1
1027- let tokensAmountB = $t02940229491._2
1028- let $t02949430730 = if (isBorrowed)
1031+ let $t02958629675 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1032+ let tokensAmountA = $t02958629675._1
1033+ let tokensAmountB = $t02958629675._2
1034+ let $t02967830914 = if (isBorrowed)
10291035 then {
10301036 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
10311037 let debt = {
10741080 else throw("Strict value is not equal to itself.")
10751081 }
10761082 else $Tuple2(tokensAmountA, tokensAmountB)
1077- let toUserA = $t02949430730._1
1078- let toUserB = $t02949430730._2
1083+ let toUserA = $t02967830914._1
1084+ let toUserB = $t02967830914._2
10791085 let poolTotalLoanEntries = if (isBorrowed)
10801086 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10811087 else nil
11211127 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
11221128 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
11231129 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1124- let $t03271232809 = if ((borrowId == aId))
1130+ let $t03289632993 = if ((borrowId == aId))
11251131 then $Tuple2(dPriceA, decPrA)
11261132 else $Tuple2(dPriceB, decPrB)
1127- let borrowPrice = $t03271232809._1
1128- let borrowDecPr = $t03271232809._2
1133+ let borrowPrice = $t03289632993._1
1134+ let borrowDecPr = $t03289632993._2
11291135 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
11301136 }
11311137
11541160
11551161
11561162 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1157- let $t03380934071 = if (claim)
1163+ let $t03399334255 = if (claim)
11581164 then claimFarmed(pType, pool)
11591165 else {
11601166 let claimedAsset = if ((pType == SF_POOL))
11641170 else unknownPoolType()
11651171 $Tuple2(amount, claimedAsset)
11661172 }
1167- if (($t03380934071 == $t03380934071))
1173+ if (($t03399334255 == $t03399334255))
11681174 then {
1169- let claimAsset = $t03380934071._2
1170- let claimAmount = $t03380934071._1
1175+ let claimAsset = $t03399334255._2
1176+ let claimAmount = $t03399334255._1
11711177 let bal = accountBalance(claimAsset)
11721178 if ((bal == bal))
11731179 then if ((amount > bal))
11831189 func getPoolInfoREADONLY (pool) = {
11841190 let poolAddr = addressFromStringValue(pool)
11851191 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1186- let $t03443834528 = getPoolData(Address(fromBase58String(pool)), pType)
1187- let AId = $t03443834528._1
1188- let BId = $t03443834528._2
1189- let balA = $t03443834528._3
1190- let balB = $t03443834528._4
1191- let shareId = $t03443834528._5
1192+ let $t03462234712 = getPoolData(Address(fromBase58String(pool)), pType)
1193+ let AId = $t03462234712._1
1194+ let BId = $t03462234712._2
1195+ let balA = $t03462234712._3
1196+ let balB = $t03462234712._4
1197+ let shareId = $t03462234712._5
11921198 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11931199 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11941200 }
12161222 @Callable(i)
12171223 func getUserPositionREADONLY (user,pools,posNum) = {
12181224 func userPos (a,pool) = {
1219- let $t03540135471 = a
1220- let wAmountsA = $t03540135471._1
1221- let wAmountsB = $t03540135471._2
1222- let debts = $t03540135471._3
1223- let eqWAmountsA = $t03540135471._4
1224- let eqWAmountsB = $t03540135471._5
1225- let index = $t03540135471._6
1225+ let $t03558535655 = a
1226+ let wAmountsA = $t03558535655._1
1227+ let wAmountsB = $t03558535655._2
1228+ let debts = $t03558535655._3
1229+ let eqWAmountsA = $t03558535655._4
1230+ let eqWAmountsB = $t03558535655._5
1231+ let index = $t03558535655._6
12261232 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
12271233 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
12281234 else {
12291235 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1230- let $t03575035840 = getPoolData(Address(fromBase58String(pool)), pType)
1231- let AId = $t03575035840._1
1232- let BId = $t03575035840._2
1233- let balA = $t03575035840._3
1234- let balB = $t03575035840._4
1235- let shareId = $t03575035840._5
1236+ let $t03593436024 = getPoolData(Address(fromBase58String(pool)), pType)
1237+ let AId = $t03593436024._1
1238+ let BId = $t03593436024._2
1239+ let balA = $t03593436024._3
1240+ let balB = $t03593436024._4
1241+ let shareId = $t03593436024._5
12361242 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
12371243 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1238- let $t03605636176 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1239- let wAmountA = $t03605636176._1
1240- let wAmountB = $t03605636176._2
1244+ let $t03624036360 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1245+ let wAmountA = $t03624036360._1
1246+ let wAmountB = $t03624036360._2
12411247 if ((borrowAmount > 0))
12421248 then {
12431249 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12711277 }
12721278 else unknownPoolType()
12731279 else 0
1274- let $t03708837307 = if ((borrowAsset == AId))
1280+ let $t03727237491 = if ((borrowAsset == AId))
12751281 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12761282 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1277- let eqWAmountA = $t03708837307._1
1278- let eqWAmountB = $t03708837307._2
1283+ let eqWAmountA = $t03727237491._1
1284+ let eqWAmountB = $t03727237491._2
12791285 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12801286 }
12811287 else throw("Strict value is not equal to itself.")
12841290 }
12851291 }
12861292
1287- let $t03756237673 = {
1293+ let $t03774637857 = {
12881294 let $l = pools
12891295 let $s = size($l)
12901296 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12981304
12991305 $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($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), 16), 17), 18), 19), 20)
13001306 }
1301- let wAmountsA = $t03756237673._1
1302- let wAmountsB = $t03756237673._2
1303- let debts = $t03756237673._3
1304- let eqWAmountsA = $t03756237673._4
1305- let eqWAmountsB = $t03756237673._5
1307+ let wAmountsA = $t03774637857._1
1308+ let wAmountsB = $t03774637857._2
1309+ let debts = $t03774637857._3
1310+ let eqWAmountsA = $t03774637857._4
1311+ let eqWAmountsB = $t03774637857._5
13061312 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
13071313 }
13081314
13221328 else false)
13231329 then throw("You can't borrow in this pool")
13241330 else {
1325- let $t03827138361 = getPoolData(Address(fromBase58String(pool)), pType)
1326- let AId = $t03827138361._1
1327- let BId = $t03827138361._2
1328- let balA = $t03827138361._3
1329- let balB = $t03827138361._4
1330- let shareId = $t03827138361._5
1331+ let $t03845538545 = getPoolData(Address(fromBase58String(pool)), pType)
1332+ let AId = $t03845538545._1
1333+ let BId = $t03845538545._2
1334+ let balA = $t03845538545._3
1335+ let balB = $t03845538545._4
1336+ let shareId = $t03845538545._5
13311337 if (if ((borrowId != AId))
13321338 then (borrowId != BId)
13331339 else false)
13341340 then throw("Wrong borrow asset")
13351341 else {
1336- let $t03844238501 = parseReplenishPmts(i.payments, AId, BId)
1337- let pmtA = $t03844238501._1
1338- let pmtB = $t03844238501._2
1342+ let $t03862638685 = parseReplenishPmts(i.payments, AId, BId)
1343+ let pmtA = $t03862638685._1
1344+ let pmtB = $t03862638685._2
13391345 let user = toString(i.caller)
13401346 let newPosNum = getNewUserPositionNumber(user)
13411347 if ((leverage > 100))
13551361 if ((inv == inv))
13561362 then {
13571363 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1358- let $t03949039584 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1359- if (($t03949039584 == $t03949039584))
1364+ let $t03967439768 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1365+ if (($t03967439768 == $t03967439768))
13601366 then {
1361- let newBalB = $t03949039584._2
1362- let newBalA = $t03949039584._1
1367+ let newBalB = $t03967439768._2
1368+ let newBalA = $t03967439768._1
13631369 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1364- let $t03965439769 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1365- let wAmountA = $t03965439769._1
1366- let wAmountB = $t03965439769._2
1370+ let $t03983839953 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1371+ let wAmountA = $t03983839953._1
1372+ let wAmountB = $t03983839953._2
13671373 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13681374 }
13691375 else throw("Strict value is not equal to itself.")
13731379 else throw("Strict value is not equal to itself.")
13741380 }
13751381 else {
1376- let $t03982239937 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1377- if (($t03982239937 == $t03982239937))
1382+ let $t04000640121 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1383+ if (($t04000640121 == $t04000640121))
13781384 then {
1379- let axlyFee = $t03982239937._2
1380- let userStaked = $t03982239937._1
1381- let $t03994340037 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1382- if (($t03994340037 == $t03994340037))
1385+ let axlyFee = $t04000640121._2
1386+ let userStaked = $t04000640121._1
1387+ let $t04012740221 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1388+ if (($t04012740221 == $t04012740221))
13831389 then {
1384- let newBalB = $t03994340037._2
1385- let newBalA = $t03994340037._1
1390+ let newBalB = $t04012740221._2
1391+ let newBalA = $t04012740221._1
13861392 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1387- let $t04010740222 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1388- let wAmountA = $t04010740222._1
1389- let wAmountB = $t04010740222._2
1393+ let $t04029140406 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1394+ let wAmountA = $t04029140406._1
1395+ let wAmountB = $t04029140406._2
13901396 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13911397 }
13921398 else throw("Strict value is not equal to itself.")
14791485
14801486 @Callable(i)
14811487 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1482- let $t04506145165 = parseRequest(requestId)
1483- let user = $t04506145165._1
1484- let pool = $t04506145165._2
1485- let pmtA = $t04506145165._3
1486- let AId = $t04506145165._4
1487- let pmtB = $t04506145165._5
1488- let BId = $t04506145165._6
1489- let balA = $t04506145165._7
1490- let balB = $t04506145165._8
1491- let shareId = $t04506145165._9
1492- let bwAsset = $t04506145165._10
1493- let bwAmount = $t04506145165._11
1488+ let $t04524545349 = parseRequest(requestId)
1489+ let user = $t04524545349._1
1490+ let pool = $t04524545349._2
1491+ let pmtA = $t04524545349._3
1492+ let AId = $t04524545349._4
1493+ let pmtB = $t04524545349._5
1494+ let BId = $t04524545349._6
1495+ let balA = $t04524545349._7
1496+ let balB = $t04524545349._8
1497+ let shareId = $t04524545349._9
1498+ let bwAsset = $t04524545349._10
1499+ let bwAmount = $t04524545349._11
14941500 if ((size(i.payments) != 1))
14951501 then throw("Wrong payment size")
14961502 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14981504 else (i.payments[0].amount != bwAmount))
14991505 then throw("Wrong payment")
15001506 else {
1501- let $t04535545455 = if ((AId == bwAsset))
1507+ let $t04553945639 = if ((AId == bwAsset))
15021508 then $Tuple2((pmtA + bwAmount), pmtB)
15031509 else $Tuple2(pmtA, (pmtB + bwAmount))
1504- let pmtAllA = $t04535545455._1
1505- let pmtAllB = $t04535545455._2
1510+ let pmtAllA = $t04553945639._1
1511+ let pmtAllB = $t04553945639._2
15061512 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1507- let $t04553745652 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1508- let userStaked = $t04553745652._1
1509- let axlyFee = $t04553745652._2
1513+ let $t04572145836 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1514+ let userStaked = $t04572145836._1
1515+ let axlyFee = $t04572145836._2
15101516 let posNum = getNewUserPositionNumber(user)
15111517 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
15121518 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1513- let $t04601246127 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1514- let wAmountA = $t04601246127._1
1515- let wAmountB = $t04601246127._2
1519+ let $t04619646311 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1520+ let wAmountA = $t04619646311._1
1521+ let wAmountB = $t04619646311._2
15161522 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
15171523 }
15181524 }))
15231529 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
15241530 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
15251531 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1526- let $t04664846738 = getPoolData(Address(fromBase58String(pool)), pType)
1527- let AId = $t04664846738._1
1528- let BId = $t04664846738._2
1529- let balA = $t04664846738._3
1530- let balB = $t04664846738._4
1531- let shareId = $t04664846738._5
1532+ let $t04683246922 = getPoolData(Address(fromBase58String(pool)), pType)
1533+ let AId = $t04683246922._1
1534+ let BId = $t04683246922._2
1535+ let balA = $t04683246922._3
1536+ let balB = $t04683246922._4
1537+ let shareId = $t04683246922._5
15321538 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
15331539 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
15341540 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15601566 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15611567 let pType = getStringValue(this, (kPool + pool))
15621568 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1563- let $t04870848810 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1564- if (($t04870848810 == $t04870848810))
1569+ let $t04889248994 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1570+ if (($t04889248994 == $t04889248994))
15651571 then {
1566- let claimedAsset = $t04870848810._2
1567- let claimedAmount = $t04870848810._1
1572+ let claimedAsset = $t04889248994._2
1573+ let claimedAmount = $t04889248994._1
15681574 let rArgs = split(route, "__")
15691575 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15701576 then directSwopfiCPMM(rArgs, tokenToId)
15891595 @Callable(i)
15901596 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15911597 let pType = getStringValue(this, (kPool + pool))
1592- let $t04949449592 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1593- if (($t04949449592 == $t04949449592))
1598+ let $t04967849776 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1599+ if (($t04967849776 == $t04967849776))
15941600 then {
1595- let claimedAsset = $t04949449592._2
1596- let claimedAmount = $t04949449592._1
1601+ let claimedAsset = $t04967849776._2
1602+ let claimedAmount = $t04967849776._1
15971603 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15981604 }
15991605 else throw("Strict value is not equal to itself.")
16111617 else false)
16121618 then throw("Wrong pool type")
16131619 else {
1614- let $t05011350207 = getPoolData(Address(fromBase58String(poolAddr)), type)
1615- let aId = $t05011350207._1
1616- let bId = $t05011350207._2
1617- let aBal = $t05011350207._3
1618- let bBal = $t05011350207._4
1619- let shareId = $t05011350207._5
1620+ let $t05029750391 = getPoolData(Address(fromBase58String(poolAddr)), type)
1621+ let aId = $t05029750391._1
1622+ let bId = $t05029750391._2
1623+ let aBal = $t05029750391._3
1624+ let bBal = $t05029750391._4
1625+ let shareId = $t05029750391._5
16201626 if ((0 > inFeeNoLoan))
16211627 then throw("inFeeNoLoan must be greater than 0")
16221628 else if ((0 > inFeeLoan))
17261732 else [BooleanEntry((pool + kPoolActive), false)])
17271733
17281734
1735+@Verifier(tx)
1736+func verify () = match tx {
1737+ case inv: InvokeScriptTransaction =>
1738+ let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
1739+ let isRightFee = if ((inv.fee == 900000))
1740+ then (inv.feeAssetId == unit)
1741+ else false
1742+ let isInitCall = (inv.function == "init")
1743+ let isnoPayments = (size(inv.payments) == 0)
1744+ if (if (if (isRightFee)
1745+ then isInitCall
1746+ else false)
1747+ then isSelf
1748+ else false)
1749+ then isnoPayments
1750+ else false
1751+ case _ =>
1752+ let group1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
1753+ then 1
1754+ else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin2PK))
1755+ then 1
1756+ else 0))
1757+ let group2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin1PK))
1758+ then 1
1759+ else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin2PK))
1760+ then 1
1761+ else 0))
1762+ ((group1Signed + group2Signed) == 2)
1763+}
1764+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let CONF = addressFromStringValue(getStringValue(this, "config"))
5+
46 let SF_POOL = "SF"
57
68 let WX_POOL = "WX"
79
810 let CPMM = "cpmm"
911
1012 let FLAT = "flat"
1113
1214 let CAP_FEE_NO_LOAN = "capNoLoan"
1315
1416 let CAP_FEE_LOAN = "capLoan"
1517
1618 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1719
1820 let STOPLOSS_LOAN = "stopLossLoan"
1921
2022 let LOAN_FEE = "loan"
2123
2224 let NO_LOAN_FEE = "noLoan"
2325
2426 let NO_FEE = "noFee"
2527
2628 let SCALE8 = 100000000
2729
2830 let SCALE10 = 10000000000
2931
3032 let SCALE16 = toBigInt(10000000000000000)
3133
3234 let FEE_SCALE6 = 1000000
3335
3436 let kSFPoolAAssetBalance = "A_asset_balance"
3537
3638 let kSFPoolBAssetBalance = "B_asset_balance"
3739
3840 let kSFPoolAAssetId = "A_asset_id"
3941
4042 let kSFPoolBAssetId = "B_asset_id"
4143
4244 let kSFPoolShareId = "share_asset_id"
4345
4446 let kSFPoolShareSupply = "share_asset_supply"
4547
4648 let kSFPoolFee = "commission"
4749
4850 let kUserPosition = "_userPosition"
4951
5052 let kUserPositionPool = "_userPositionPool"
5153
5254 let kUserBorrowAmount = "_userPositionBorrowAmount"
5355
5456 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5557
5658 let kUserPositionNum = "_userPositionNumber"
5759
5860 let kUserPositionInterest = "_userPositionInterest"
5961
6062 let kPoolTotal = "_poolTotal"
6163
6264 let kPoolTotalLoan = "_poolTotalLoan"
6365
6466 let kPoolInterestLoan = "_poolInterestLoan"
6567
6668 let kPoolInterestNoLoan = "_poolInterestNoLoan"
6769
6870 let kPoolCanBorrow = "_poolCanBorrow"
6971
7072 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
7173
7274 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
7375
7476 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7577
7678 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
7779
7880 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
7981
8082 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
8183
8284 let kRequestId = "_request_id"
8385
8486 let kRequestIter = "requests_iter"
8587
8688 let kPool = "pool_"
8789
8890 let kPoolType = "_poolType"
8991
9092 let kSharePool = "_poolShareId"
9193
9294 let kPoolCapChange = "_poolCapChange"
9395
9496 let kTokenLastPrice = "last_price"
9597
9698 let kPriceInOracle = "_twap5B"
9799
98100 let kActive = "active"
99101
100102 let kActiveUsers = "activeUsers"
101103
102104 let kActiveSFWX = "_active"
103105
104106 let kPoolActive = "_activePool"
105107
106108 let kUserStopLoss = "_stopLoss"
107109
108110 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
109111
110112 let kMoneyBox = "axly_money_box"
111113
112114 let kSFFarmingAddr = "swopfi_farming_addr"
113115
114116 let kLendService = "lend_service_addr"
115117
116118 let kOperatorCallPK = "admin_call_pub_key"
117119
118120 let kPriceOracle = "price_oracle"
119121
120122 let kExContract = "exchange_contract"
121123
122124 let kWxSwapContract = "wx_swap_contract"
123125
126+let kWxRest = "wx_rest_addr"
127+
124128 let kSwopId = "swop_id"
125129
126130 let kWxId = "wx_id"
127131
128132 let kGroup1Admin1PK = "group1_admin1_pub_key"
129133
130134 let kGroup1Admin2PK = "group1_admin2_pub_key"
131135
132136 let kGroup2Admin1PK = "group2_admin1_pub_key"
133137
134138 let kGroup2Admin2PK = "group2_admin2_pub_key"
135139
136-let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
140+let moneyBox = addressFromStringValue(valueOrErrorMessage(getString(CONF, kMoneyBox), "No axly moneyBox address"))
137141
138-let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
142+let exContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kExContract), "No exchange contract address"))
139143
140-let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
144+let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPriceOracle), "No price oracle address"))
141145
142-let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
146+let wxSwapContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxSwapContract), "No wx swap address"))
143147
144-let SWOPID = fromBase58String(valueOrErrorMessage(getString(this, kSwopId), "No swop id"))
148+let wxRest = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxRest), "No wx rest address"))
145149
146-let WXID = fromBase58String(valueOrErrorMessage(getString(this, kWxId), "No wx id"))
150+let SWOPID = fromBase58String(valueOrErrorMessage(getString(CONF, kSwopId), "No swop id"))
147151
148-let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
152+let WXID = fromBase58String(valueOrErrorMessage(getString(CONF, kWxId), "No wx id"))
149153
150-let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
154+let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
155+
156+let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
151157
152158 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
153159
154160 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
155161
156-let operatorPK = fromBase58String(valueOrErrorMessage(getString(this, kOperatorCallPK), "Can't get operatorPK"))
162+let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
157163
158164 func unknownPoolType () = throw("Wrong pool type")
159165
160166
161-func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
167+func getLendSrvAddr () = addressFromStringValue(valueOrErrorMessage(getString(CONF, kLendService), "Can't get lend service addr"))
162168
163169
164170 func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
165171 then unit
166172 else throw("Only operator can call this function")
167173
168174
169175 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
170176 then true
171177 else (i.callerPublicKey == group1Admin2PK))
172178 then unit
173179 else throw("Only admin group1 can call this function")
174180
175181
176182 func isSelfCall (i) = if ((i.caller == this))
177183 then unit
178184 else throw("Only contract itself can call this function")
179185
180186
181187 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
182188 then unit
183189 else throw("Only land contract can call this function")
184190
185191
186192 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
187193 then unit
188194 else throw("DApp is inactive at this moment")
189195
190196
191197 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
192198 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
193199 else false)
194200 then unit
195201 else throw("DApp is inactive for users at this moment")
196202
197203
198204 func isPoolActive (pool,type) = {
199205 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
200206 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
201207 if (if (WXSFActive)
202208 then poolActive
203209 else false)
204210 then true
205211 else false
206212 }
207213
208214
209215 func accountBalance (assetId) = match assetId {
210216 case id: ByteVector =>
211217 assetBalance(this, id)
212218 case waves: Unit =>
213219 wavesBalance(this).available
214220 case _ =>
215221 throw("Match error")
216222 }
217223
218224
219225 func getSFPoolBalances (poolAddr) = $Tuple2(valueOrErrorMessage(getInteger(poolAddr, kSFPoolAAssetBalance), "Can't get pool A asset balance"), valueOrErrorMessage(getInteger(poolAddr, kSFPoolBAssetBalance), "Can't get pool B asset balance"))
220226
221227
222228 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
223229 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
224230 if ($isInstanceOf(@, "Int"))
225231 then @
226232 else throw(($getType(@) + " couldn't be cast to Int"))
227233 }, {
228234 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
229235 if ($isInstanceOf(@, "Int"))
230236 then @
231237 else throw(($getType(@) + " couldn't be cast to Int"))
232238 })
233239
234240
235241 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
236242 then getSFPoolBalances(poolAddr)
237243 else if ((type == WX_POOL))
238244 then getWXPoolBalances(poolAddr, aId, bId)
239245 else unknownPoolType()
240246
241247
242248 func getSFPoolData (poolAddr) = {
243- let $t080898138 = getSFPoolBalances(poolAddr)
244- if (($t080898138 == $t080898138))
249+ let $t082738322 = getSFPoolBalances(poolAddr)
250+ if (($t082738322 == $t082738322))
245251 then {
246- let balB = $t080898138._2
247- let balA = $t080898138._1
252+ let balB = $t082738322._2
253+ let balA = $t082738322._1
248254 $Tuple5(valueOrErrorMessage(getString(poolAddr, kSFPoolAAssetId), "Can't get pool A asset id"), valueOrErrorMessage(getString(poolAddr, kSFPoolBAssetId), "Can't get pool B asset id"), balA, balB, valueOrErrorMessage(getString(poolAddr, kSFPoolShareId), "Can't get share asset id"))
249255 }
250256 else throw("Strict value is not equal to itself.")
251257 }
252258
253259
254260 func getWXPoolData (poolAddr) = {
255261 let cfg = {
256262 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
257263 if ($isInstanceOf(@, "List[Any]"))
258264 then @
259265 else throw(($getType(@) + " couldn't be cast to List[Any]"))
260266 }
261267 if ((cfg == cfg))
262268 then {
263269 let aId = valueOrErrorMessage({
264270 let @ = cfg[4]
265271 if ($isInstanceOf(@, "String"))
266272 then @
267273 else unit
268274 }, "Can't get pool A asset id")
269275 let bId = valueOrErrorMessage({
270276 let @ = cfg[5]
271277 if ($isInstanceOf(@, "String"))
272278 then @
273279 else unit
274280 }, "Can't get pool B asset id")
275281 let shareId = valueOrErrorMessage({
276282 let @ = cfg[3]
277283 if ($isInstanceOf(@, "String"))
278284 then @
279285 else unit
280286 }, "Can't get pool LP asset id")
281- let $t088358894 = getWXPoolBalances(poolAddr, aId, bId)
282- if (($t088358894 == $t088358894))
287+ let $t090199078 = getWXPoolBalances(poolAddr, aId, bId)
288+ if (($t090199078 == $t090199078))
283289 then {
284- let balB = $t088358894._2
285- let balA = $t088358894._1
290+ let balB = $t090199078._2
291+ let balA = $t090199078._1
286292 $Tuple5(aId, bId, balA, balB, shareId)
287293 }
288294 else throw("Strict value is not equal to itself.")
289295 }
290296 else throw("Strict value is not equal to itself.")
291297 }
292298
293299
294300 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
295301 then getSFPoolData(poolAddr)
296302 else if ((type == WX_POOL))
297303 then getWXPoolData(poolAddr)
298304 else unknownPoolType()
299305
300306
301307 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
302308 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
303309 else if ((type == WX_POOL))
304310 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
305311 else unknownPoolType()
306312
307313
308314 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
309315
310316
311317 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
312318
313319
314320 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
315321
316322
317323 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
318324 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
319325 else if ((feeType == CAP_FEE_NO_LOAN))
320326 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
321327 else if ((feeType == LOAN_FEE))
322328 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
323329 else if ((feeType == NO_LOAN_FEE))
324330 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
325331 else if ((feeType == NO_FEE))
326332 then 0
327333 else throw("Wrong fee type")
328334
329335
330336 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
331337
332338
333339 func getWXFarmingAddr (poolAddr) = {
334340 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
335341 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
336342 Address(fromBase58String(factroyCfg[1]))
337343 }
338344
339345
340346 func assetIdToStr (assetId) = match assetId {
341347 case id: ByteVector =>
342348 toBase58String(id)
343349 case waves: Unit =>
344350 "WAVES"
345351 case _ =>
346352 throw("Not Asset id")
347353 }
348354
349355
350356 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
351357 then unit
352358 else fromBase58String(assetId)
353359
354360
355361 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
356362 then 8
357363 else match assetInfo(fromBase58String(assetId)) {
358364 case asset: Asset =>
359365 asset.decimals
360366 case _ =>
361367 throw("Can't find asset")
362368 }
363369
364370
365371 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
366372
367373
368374 func getAssetsPrice (assetIds) = {
369375 func getPrices (a,assetId) = {
370376 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
371377 (a :+ assetPrice)
372378 }
373379
374380 let $l = assetIds
375381 let $s = size($l)
376382 let $acc0 = nil
377383 func $f0_1 ($a,$i) = if (($i >= $s))
378384 then $a
379385 else getPrices($a, $l[$i])
380386
381387 func $f0_2 ($a,$i) = if (($i >= $s))
382388 then $a
383389 else throw("List size exceeds 50")
384390
385391 $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($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($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($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), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
386392 }
387393
388394
389395 func getSharePrice (shareId) = {
390396 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
391397 let poolAddr = Address(fromBase58String(pool))
392398 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
393- let $t01188311948 = getPoolData(poolAddr, pType)
394- let aId = $t01188311948._1
395- let bId = $t01188311948._2
396- let aBalance = $t01188311948._3
397- let bBalance = $t01188311948._4
399+ let $t01206712132 = getPoolData(poolAddr, pType)
400+ let aId = $t01206712132._1
401+ let bId = $t01206712132._2
402+ let aBalance = $t01206712132._3
403+ let bBalance = $t01206712132._4
398404 let prices = getAssetsPrice([aId, bId])
399405 let dPriceA = prices[0]
400406 let dPriceB = prices[1]
401407 if (if ((0 > dPriceA))
402408 then true
403409 else (0 > dPriceB))
404410 then -1
405411 else {
406412 let shareSupply = getShareSupply(poolAddr, pType, shareId)
407413 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
408414 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
409415 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
410416 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
411417 fraction(sum, sharePrecision, shareSupply)
412418 }
413419 }
414420
415421
416422 func getSharePrices (shareIds) = {
417423 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
418424
419425 let $l = shareIds
420426 let $s = size($l)
421427 let $acc0 = nil
422428 func $f0_1 ($a,$i) = if (($i >= $s))
423429 then $a
424430 else getPrices($a, $l[$i])
425431
426432 func $f0_2 ($a,$i) = if (($i >= $s))
427433 then $a
428434 else throw("List size exceeds 20")
429435
430436 $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($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), 16), 17), 18), 19), 20)
431437 }
432438
433439
434440 func getCursEntries (aId,bId,shareId,wAmounts) = {
435441 let assetsPrices = getAssetsPrice([aId, bId])
436442 let sharePrice = getSharePrice(shareId)
437443 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
438444 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
439445 }
440446
441447
442448 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
443449 then {
444450 let repl = {
445451 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
446452 if ($isInstanceOf(@, "List[Any]"))
447453 then @
448454 else throw(($getType(@) + " couldn't be cast to List[Any]"))
449455 }
450456 if ((repl == repl))
451457 then $Tuple5({
452458 let @ = repl[3]
453459 if ($isInstanceOf(@, "Int"))
454460 then @
455461 else throw(($getType(@) + " couldn't be cast to Int"))
456462 }, {
457463 let @ = repl[4]
458464 if ($isInstanceOf(@, "Int"))
459465 then @
460466 else throw(($getType(@) + " couldn't be cast to Int"))
461467 }, {
462468 let @ = repl[1]
463469 if ($isInstanceOf(@, "Int"))
464470 then @
465471 else throw(($getType(@) + " couldn't be cast to Int"))
466472 }, assetIdToStr(repl[2]), {
467473 let @ = repl[0]
468474 if ($isInstanceOf(@, "Int"))
469475 then @
470476 else throw(($getType(@) + " couldn't be cast to Int"))
471477 })
472478 else throw("Strict value is not equal to itself.")
473479 }
474480 else if ((pType == WX_POOL))
475481 then {
476- let $t01349213742 = $Tuple2(split({
482+ let $t01367613926 = $Tuple2(split({
477483 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
478484 if ($isInstanceOf(@, "String"))
479485 then @
480486 else throw(($getType(@) + " couldn't be cast to String"))
481487 }, "__"), split({
482488 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
483489 if ($isInstanceOf(@, "String"))
484490 then @
485491 else throw(($getType(@) + " couldn't be cast to String"))
486492 }, "__"))
487- if (($t01349213742 == $t01349213742))
493+ if (($t01367613926 == $t01367613926))
488494 then {
489- let evalPutInB = $t01349213742._2
490- let evalPutInA = $t01349213742._1
495+ let evalPutInB = $t01367613926._2
496+ let evalPutInA = $t01367613926._1
491497 let lpInA = parseIntValue(evalPutInA[1])
492498 let lpInB = parseIntValue(evalPutInB[1])
493499 if ((lpInB > lpInA))
494500 then {
495501 let pmt = parseIntValue(evalPutInA[8])
496502 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
497503 }
498504 else {
499505 let pmt = parseIntValue(evalPutInB[7])
500506 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
501507 }
502508 }
503509 else throw("Strict value is not equal to itself.")
504510 }
505511 else unknownPoolType()
506512
507513
508514 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
509515 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
510516 if ((pType == SF_POOL))
511517 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
512518 else if ((pType == WX_POOL))
513519 then invoke(poolAddr, "put", [1000000, false], payments)
514520 else unknownPoolType()
515521 }
516522
517523
518524 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
519525 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
520526 if ((pType == SF_POOL))
521527 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
522528 else if ((pType == WX_POOL))
523529 then {
524530 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
525531 then "putOneTknV2"
526532 else "putOneTkn"
527533 invoke(poolAddr, fc, [0, false], payments)
528534 }
529535 else unknownPoolType()
530536 }
531537
532538
533539 func stakeLP (pool,pType,shareId,amount) = {
534540 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
535541 if ((pType == SF_POOL))
536542 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
537543 else if ((pType == WX_POOL))
538544 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
539545 else unknownPoolType()
540546 }
541547
542548
543549 func unstakeLP (pool,pType,shareId,amount) = {
544- let $t01552015870 = if ((pType == SF_POOL))
550+ let $t01570416054 = if ((pType == SF_POOL))
545551 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
546552 else if ((pType == WX_POOL))
547553 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
548554 else unknownPoolType()
549- let farmAddr = $t01552015870._1
550- let fName = $t01552015870._2
551- let params = $t01552015870._3
555+ let farmAddr = $t01570416054._1
556+ let fName = $t01570416054._2
557+ let params = $t01570416054._3
552558 let inv = invoke(farmAddr, fName, params, nil)
553559 if ((inv == inv))
554560 then amount
555561 else throw("Strict value is not equal to itself.")
556562 }
557563
558564
559565 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
560566 let poolAddr = Address(fromBase58String(pool))
561567 let feeScale6 = 1000000
562568 let fee = getIntegerValue(poolAddr, kSFPoolFee)
563569 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
564- let $t01629216598 = if ((assetTokenToGet == assetIdA))
570+ let $t01647616782 = if ((assetTokenToGet == assetIdA))
565571 then {
566572 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
567573 $Tuple2(amountToPay, assetIdB)
568574 }
569575 else {
570576 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
571577 $Tuple2(amountToPay, assetIdA)
572578 }
573- let amountToPay = $t01629216598._1
574- let assetToPay = $t01629216598._2
579+ let amountToPay = $t01647616782._1
580+ let assetToPay = $t01647616782._2
575581 $Tuple2(assetToPay, amountToPay)
576582 }
577583
578584
579585 func getWXSwapFees (pool) = {
580586 let poolAddr = addressFromStringValue(pool)
581587 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
582588 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
583589 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
584590 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
585591 case fees: (Int, Int) =>
586592 $Tuple2(fees._1, fees._2)
587593 case _ =>
588594 $Tuple2(poolFeeDefault, protocolFeeDefault)
589595 }
590596 }
591597
592598
593599 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
594- let $t01733817377 = getWXSwapFees(pool)
595- let pFee = $t01733817377._1
596- let prFee = $t01733817377._2
600+ let $t01752217561 = getWXSwapFees(pool)
601+ let pFee = $t01752217561._1
602+ let prFee = $t01752217561._2
597603 let feeScale = toBigInt(100000000)
598- let $t01741717725 = if ((assetTokenToGet == assetIdA))
604+ let $t01760117909 = if ((assetTokenToGet == assetIdA))
599605 then {
600606 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
601607 $Tuple2(amountToPay, assetIdB)
602608 }
603609 else {
604610 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
605611 $Tuple2(amountToPay, assetIdA)
606612 }
607- let amountToPay = $t01741717725._1
608- let assetToPay = $t01741717725._2
613+ let amountToPay = $t01760117909._1
614+ let assetToPay = $t01760117909._2
609615 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
610616 $Tuple2(assetToPay, amountToPayWithFee)
611617 }
612618
613619
614620 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
615621 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
616622 if (if ((pType == SF_POOL))
617623 then true
618624 else (poolFB != ""))
619625 then {
620- let $t01816618378 = if ((poolFB == ""))
626+ let $t01835018562 = if ((poolFB == ""))
621627 then $Tuple3(balA, balB, pool)
622628 else {
623- let $t01827218345 = getSFPoolBalances(addressFromStringValue(poolFB))
624- let sfBalA = $t01827218345._1
625- let sfBalB = $t01827218345._2
629+ let $t01845618529 = getSFPoolBalances(addressFromStringValue(poolFB))
630+ let sfBalA = $t01845618529._1
631+ let sfBalB = $t01845618529._2
626632 $Tuple3(sfBalA, sfBalB, poolFB)
627633 }
628- let pBalA = $t01816618378._1
629- let pBalB = $t01816618378._2
630- let exPool = $t01816618378._3
631- let $t01838318509 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
632- let assetToPay = $t01838318509._1
633- let amountToPay = $t01838318509._2
634+ let pBalA = $t01835018562._1
635+ let pBalB = $t01835018562._2
636+ let exPool = $t01835018562._3
637+ let $t01856718693 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
638+ let assetToPay = $t01856718693._1
639+ let amountToPay = $t01856718693._2
634640 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
635641 }
636642 else if ((pType == WX_POOL))
637643 then {
638- let $t01871118833 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
639- let assetToPay = $t01871118833._1
640- let amountToPay = $t01871118833._2
644+ let $t01889519017 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
645+ let assetToPay = $t01889519017._1
646+ let amountToPay = $t01889519017._2
641647 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
642648 }
643649 else unknownPoolType()
644650 }
645651
646652
647653 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
648- let $t01912020355 = if ((pType == SF_POOL))
654+ let $t01930420539 = if ((pType == SF_POOL))
649655 then {
650656 let inv = {
651657 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
652658 if ($isInstanceOf(@, "List[Any]"))
653659 then @
654660 else throw(($getType(@) + " couldn't be cast to List[Any]"))
655661 }
656662 if ((inv == inv))
657663 then $Tuple2({
658664 let @ = inv[0]
659665 if ($isInstanceOf(@, "Int"))
660666 then @
661667 else throw(($getType(@) + " couldn't be cast to Int"))
662668 }, {
663669 let @ = inv[1]
664670 if ($isInstanceOf(@, "Int"))
665671 then @
666672 else throw(($getType(@) + " couldn't be cast to Int"))
667673 })
668674 else throw("Strict value is not equal to itself.")
669675 }
670676 else if ((pType == WX_POOL))
671677 then if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
672678 then {
673679 let inv = invoke(poolAddr, "estimateGetOperationWrapperREADONLY", ["", shareId, userCanWithdraw, toString(this)], nil)
674680 if ((inv == inv))
675681 then {
676- let $t01961320110 = match inv {
682+ let $t01979720294 = match inv {
677683 case _ =>
678684 if (if (if ($isInstanceOf($match0._1, "Int"))
679685 then if ($isInstanceOf($match0._2, "Int"))
680686 then if ($isInstanceOf($match0._5, "Int"))
681687 then if ($isInstanceOf($match0._6, "Int"))
682688 then if ($isInstanceOf($match0._7, "Int"))
683689 then if ($isInstanceOf($match0._8, "String"))
684690 then $isInstanceOf($match0._9, "String")
685691 else false
686692 else false
687693 else false
688694 else false
689695 else false
690696 else false)
691697 then (size($match0) == 10)
692698 else false)
693699 then {
694700 let outAmAmt = $match0._1
695701 let outPrAmt = $match0._2
696702 let amBalance = $match0._5
697703 let prBalance = $match0._6
698704 let lpEmission = $match0._7
699705 let curPrice = $match0._8
700706 let poolStatus = $match0._9
701707 $Tuple7(outAmAmt, outPrAmt, amBalance, prBalance, lpEmission, curPrice, poolStatus)
702708 }
703709 else throw("Couldn't cast types")
704710 }
705- let outAmAmt = $t01961320110._1
706- let outPrAmt = $t01961320110._2
707- let amBalance = $t01961320110._3
708- let prBalance = $t01961320110._4
709- let lpEmission = $t01961320110._5
710- let curPrice = $t01961320110._6
711- let poolStatus = $t01961320110._7
711+ let outAmAmt = $t01979720294._1
712+ let outPrAmt = $t01979720294._2
713+ let amBalance = $t01979720294._3
714+ let prBalance = $t01979720294._4
715+ let lpEmission = $t01979720294._5
716+ let curPrice = $t01979720294._6
717+ let poolStatus = $t01979720294._7
712718 $Tuple2(outAmAmt, outPrAmt)
713719 }
714720 else throw("Strict value is not equal to itself.")
715721 }
716722 else {
717723 let inv = split({
718724 let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
719725 if ($isInstanceOf(@, "String"))
720726 then @
721727 else throw(($getType(@) + " couldn't be cast to String"))
722728 }, "__")
723729 if ((inv == inv))
724730 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
725731 else throw("Strict value is not equal to itself.")
726732 }
727733 else unknownPoolType()
728- let amountA = $t01912020355._1
729- let amountB = $t01912020355._2
734+ let amountA = $t01930420539._1
735+ let amountB = $t01930420539._2
730736 $Tuple2(amountA, amountB)
731737 }
732738
733739
734740 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
735741 then {
736742 let balBefore = accountBalance(SWOPID)
737743 if ((balBefore == balBefore))
738744 then {
739745 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
740746 if ((inv == inv))
741747 then {
742748 let balAfter = accountBalance(SWOPID)
743749 $Tuple2((balAfter - balBefore), SWOPID)
744750 }
745751 else throw("Strict value is not equal to itself.")
746752 }
747753 else throw("Strict value is not equal to itself.")
748754 }
749755 else if ((pType == WX_POOL))
750756 then {
751- let $t02072320802 = getWXPoolData(addressFromStringValue(pool))
752- let aId = $t02072320802._1
753- let bId = $t02072320802._2
754- let aBal = $t02072320802._3
755- let bBal = $t02072320802._4
756- let lpId = $t02072320802._5
757+ let $t02090720986 = getWXPoolData(addressFromStringValue(pool))
758+ let aId = $t02090720986._1
759+ let bId = $t02090720986._2
760+ let aBal = $t02090720986._3
761+ let bBal = $t02090720986._4
762+ let lpId = $t02090720986._5
757763 let balBefore = accountBalance(WXID)
758764 if ((balBefore == balBefore))
759765 then {
760766 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
761767 if ((inv == inv))
762768 then {
763769 let balAfter = accountBalance(WXID)
764770 $Tuple2((balAfter - balBefore), WXID)
765771 }
766772 else throw("Strict value is not equal to itself.")
767773 }
768774 else throw("Strict value is not equal to itself.")
769775 }
770776 else unknownPoolType()
771777
772778
773779 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
774780 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
775781 if ((lpBalanceBefore == lpBalanceBefore))
776782 then {
777783 let poolAddr = addressFromStringValue(pool)
778- let $t02140021816 = if (if ((pmtA > 0))
784+ let $t02158422000 = if (if ((pmtA > 0))
779785 then (pmtB > 0)
780786 else false)
781787 then {
782- let $t02146621582 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
783- let pmtInA = $t02146621582._1
784- let pmtInB = $t02146621582._2
785- let change = $t02146621582._3
786- let changeId = $t02146621582._4
788+ let $t02165021766 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
789+ let pmtInA = $t02165021766._1
790+ let pmtInB = $t02165021766._2
791+ let change = $t02165021766._3
792+ let changeId = $t02165021766._4
787793 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
788794 if ((inv == inv))
789795 then $Tuple2(change, changeId)
790796 else throw("Strict value is not equal to itself.")
791797 }
792798 else if ((pmtA > 0))
793799 then $Tuple2(pmtA, aId)
794800 else if ((pmtB > 0))
795801 then $Tuple2(pmtB, bId)
796802 else throw("pmts must be > 0")
797- let change = $t02140021816._1
798- let changeId = $t02140021816._2
803+ let change = $t02158422000._1
804+ let changeId = $t02158422000._2
799805 let inv = if ((change > 0))
800806 then replenishOneTokenByType(poolAddr, pType, change, changeId)
801807 else nil
802808 if ((inv == inv))
803809 then {
804810 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
805811 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
806812 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
807813 let userShareForStake = (totalStaked - axlyFeeAmount)
808814 if ((0 >= userShareForStake))
809815 then throw("amount of staked sharetokens must be > 0")
810816 else {
811817 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
812818 if ((invLP == invLP))
813819 then $Tuple2(userShareForStake, axlyFeeAmount)
814820 else throw("Strict value is not equal to itself.")
815821 }
816822 }
817823 else throw("Strict value is not equal to itself.")
818824 }
819825 else throw("Strict value is not equal to itself.")
820826 }
821827
822828
823829 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
824830 let totalAmount = getPoolTotalShare(pool)
825831 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
826- let $t02267322911 = if (withLoan)
832+ let $t02285723095 = if (withLoan)
827833 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
828834 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
829- let curPoolInterest = $t02267322911._1
830- let totalStakedWithLoan = $t02267322911._2
835+ let curPoolInterest = $t02285723095._1
836+ let totalStakedWithLoan = $t02285723095._2
831837 [IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), totalStakedWithLoan), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPosition), stakedAmount), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInterest), curPoolInterest), StringEntry((((user + "_") + toString(posNum)) + kUserPositionPool), pool), IntegerEntry((user + kUserPositionNum), posNum), ScriptTransfer(moneyBox, axlyFeeAmount, fromBase58String(shareId))]
832838 }
833839
834840
835841 func listToInt (a,item) = (a :+ parseIntValue(item))
836842
837843
838844 func directSwopfiCPMM (rArgs,tokenTo) = {
839845 let dApp = addressFromStringValue(rArgs[1])
840846 let pmtP = split(rArgs[2], "|")
841847 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
842848 if ((tokenBalanceBefore == tokenBalanceBefore))
843849 then {
844850 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
845851 let minToRecive = rArgs[3]
846852 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
847853 if ((inv == inv))
848854 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
849855 else throw("Strict value is not equal to itself.")
850856 }
851857 else throw("Strict value is not equal to itself.")
852858 }
853859
854860
855861 func directRoutingSwopfi (rArgs,tokenTo) = {
856862 let dApp = addressFromStringValue(rArgs[1])
857863 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
858864 if ((tokenBalanceBefore == tokenBalanceBefore))
859865 then {
860866 let pmt = {
861867 let pmtP = split(rArgs[2], "|")
862868 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
863869 }
864870 let args = {
865871 let eArgs = split(rArgs[3], "|")
866872 let exchangers = split(eArgs[0], ",")
867873 let exchangersType = split(eArgs[1], ",")
868874 let args1 = {
869875 let $l = split(eArgs[2], ",")
870876 let $s = size($l)
871877 let $acc0 = nil
872878 func $f0_1 ($a,$i) = if (($i >= $s))
873879 then $a
874880 else listToInt($a, $l[$i])
875881
876882 func $f0_2 ($a,$i) = if (($i >= $s))
877883 then $a
878884 else throw("List size exceeds 3")
879885
880886 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
881887 }
882888 let args2 = {
883889 let $l = split(eArgs[3], ",")
884890 let $s = size($l)
885891 let $acc0 = nil
886892 func $f1_1 ($a,$i) = if (($i >= $s))
887893 then $a
888894 else listToInt($a, $l[$i])
889895
890896 func $f1_2 ($a,$i) = if (($i >= $s))
891897 then $a
892898 else throw("List size exceeds 3")
893899
894900 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
895901 }
896902 let routingAssetsKeys = split(eArgs[4], ",")
897903 let minToRecive = parseIntValue(eArgs[5])
898904 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
899905 }
900906 let inv = invoke(dApp, "routingTrade", args, pmt)
901907 if ((inv == inv))
902908 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
903909 else throw("Strict value is not equal to itself.")
904910 }
905911 else throw("Strict value is not equal to itself.")
906912 }
907913
908914
909915 func capitalize (pool,pType,tokenId,tokenAmount) = {
910916 let poolAddr = Address(fromBase58String(pool))
911- let $t02501825084 = getPoolData(poolAddr, pType)
912- let AId = $t02501825084._1
913- let BId = $t02501825084._2
914- let balA = $t02501825084._3
915- let balB = $t02501825084._4
916- let shareId = $t02501825084._5
917+ let $t02520225268 = getPoolData(poolAddr, pType)
918+ let AId = $t02520225268._1
919+ let BId = $t02520225268._2
920+ let balA = $t02520225268._3
921+ let balB = $t02520225268._4
922+ let shareId = $t02520225268._5
917923 if (if ((tokenId != AId))
918924 then (tokenId != BId)
919925 else false)
920926 then throw("Wrong asset")
921927 else {
922928 let totalShareAmount = getPoolTotalShare(pool)
923929 if ((totalShareAmount == 0))
924930 then [ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))]
925931 else {
926932 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
927933 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
928934 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
929935 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
930936 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
931937 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
932938 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
933- let $t02582925929 = if ((tokenId == AId))
939+ let $t02601326113 = if ((tokenId == AId))
934940 then $Tuple2((tokenAmount - axlyFee), 0)
935941 else $Tuple2(0, (tokenAmount - axlyFee))
936- let pmtA = $t02582925929._1
937- let pmtB = $t02582925929._2
938- let $t02593226036 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
939- let stakedAmount = $t02593226036._1
940- let nf = $t02593226036._2
942+ let pmtA = $t02601326113._1
943+ let pmtB = $t02601326113._2
944+ let $t02611626220 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
945+ let stakedAmount = $t02611626220._1
946+ let nf = $t02611626220._2
941947 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
942948 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
943949 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
944950 let stakedNoLoan = (stakedAmount - stakedLoan)
945951 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
946952 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
947953 else 0
948954 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
949955 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
950956 else 0
951957 ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
952958 }
953959 }
954960 }
955961
956962
957963 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
958964 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
959965 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
960966 let poolInterest = if (borrowed)
961967 then getIntegerValue(this, (pool + kPoolInterestLoan))
962968 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
963969 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
964970 }
965971
966972
967973 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
968974 let feeType = if (isBorrowed)
969975 then STOPLOSS_LOAN
970976 else STOPLOSS_FEE_NO_LOAN
971977 if (stopLoss)
972978 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
973979 else 0
974980 }
975981
976982
977983 func withdrawToUser (user,pool,posId,stopLoss) = {
978984 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
979985 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
980986 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
981987 let poolTotalShare = getPoolTotalShare(pool)
982988 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
983989 let userAddr = Address(fromBase58String(user))
984990 let poolAddr = Address(fromBase58String(pool))
985991 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
986- let $t02856528637 = getPoolData(poolAddr, pType)
987- let idAStr = $t02856528637._1
988- let idBStr = $t02856528637._2
989- let balA = $t02856528637._3
990- let balB = $t02856528637._4
991- let shareId = $t02856528637._5
992- let $t02864028707 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
993- let idA = $t02864028707._1
994- let idB = $t02864028707._2
992+ let $t02874928821 = getPoolData(poolAddr, pType)
993+ let idAStr = $t02874928821._1
994+ let idBStr = $t02874928821._2
995+ let balA = $t02874928821._3
996+ let balB = $t02874928821._4
997+ let shareId = $t02874928821._5
998+ let $t02882428891 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
999+ let idA = $t02882428891._1
1000+ let idB = $t02882428891._2
9951001 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
9961002 let cBalABefore = accountBalance(idA)
9971003 if ((cBalABefore == cBalABefore))
9981004 then {
9991005 let cBalBBefore = accountBalance(idB)
10001006 if ((cBalBBefore == cBalBBefore))
10011007 then {
10021008 let inv = if ((pType == SF_POOL))
10031009 then {
10041010 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
10051011 if ((inv == inv))
10061012 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
10071013 else throw("Strict value is not equal to itself.")
10081014 }
10091015 else if ((pType == WX_POOL))
10101016 then {
10111017 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
10121018 if ((inv == inv))
10131019 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
10141020 else throw("Strict value is not equal to itself.")
10151021 }
10161022 else unknownPoolType()
10171023 if ((inv == inv))
10181024 then {
10191025 let cBalAAfter = accountBalance(idA)
10201026 if ((cBalAAfter == cBalAAfter))
10211027 then {
10221028 let cBalBAfter = accountBalance(idB)
10231029 if ((cBalBAfter == cBalBAfter))
10241030 then {
1025- let $t02940229491 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1026- let tokensAmountA = $t02940229491._1
1027- let tokensAmountB = $t02940229491._2
1028- let $t02949430730 = if (isBorrowed)
1031+ let $t02958629675 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1032+ let tokensAmountA = $t02958629675._1
1033+ let tokensAmountB = $t02958629675._2
1034+ let $t02967830914 = if (isBorrowed)
10291035 then {
10301036 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
10311037 let debt = {
10321038 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
10331039 if ($isInstanceOf(@, "Int"))
10341040 then @
10351041 else throw(($getType(@) + " couldn't be cast to Int"))
10361042 }
10371043 if ((debt == debt))
10381044 then {
10391045 let amountToGetEx = if (if ((borrowAsset == idAStr))
10401046 then (debt > tokensAmountA)
10411047 else false)
10421048 then (debt - tokensAmountA)
10431049 else if (if ((borrowAsset == idBStr))
10441050 then (debt > tokensAmountB)
10451051 else false)
10461052 then (debt - tokensAmountB)
10471053 else 0
10481054 let exInv = if ((amountToGetEx > 0))
10491055 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
10501056 else nil
10511057 if ((exInv == exInv))
10521058 then {
10531059 let cBalAAfterRepay = accountBalance(idA)
10541060 if ((cBalAAfterRepay == cBalAAfterRepay))
10551061 then {
10561062 let cBalBAfterRepay = accountBalance(idB)
10571063 if ((cBalBAfterRepay == cBalBAfterRepay))
10581064 then {
10591065 let closeDbtInv = if ((debt > 0))
10601066 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
10611067 else 0
10621068 if ((closeDbtInv == closeDbtInv))
10631069 then if ((borrowAsset == idAStr))
10641070 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
10651071 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
10661072 else throw("Strict value is not equal to itself.")
10671073 }
10681074 else throw("Strict value is not equal to itself.")
10691075 }
10701076 else throw("Strict value is not equal to itself.")
10711077 }
10721078 else throw("Strict value is not equal to itself.")
10731079 }
10741080 else throw("Strict value is not equal to itself.")
10751081 }
10761082 else $Tuple2(tokensAmountA, tokensAmountB)
1077- let toUserA = $t02949430730._1
1078- let toUserB = $t02949430730._2
1083+ let toUserA = $t02967830914._1
1084+ let toUserB = $t02967830914._2
10791085 let poolTotalLoanEntries = if (isBorrowed)
10801086 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
10811087 else nil
10821088 let entries = (([DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition)), DeleteEntry((((user + "_") + posId) + kUserPositionPool)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest)), IntegerEntry((pool + kPoolTotal), ((poolTotalShare - userCanWithdraw) - stopLossFee)), ScriptTransfer(userAddr, toUserA, idA), ScriptTransfer(userAddr, toUserB, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
10831089 $Tuple2(entries, [toUserA, toUserB])
10841090 }
10851091 else throw("Strict value is not equal to itself.")
10861092 }
10871093 else throw("Strict value is not equal to itself.")
10881094 }
10891095 else throw("Strict value is not equal to itself.")
10901096 }
10911097 else throw("Strict value is not equal to itself.")
10921098 }
10931099 else throw("Strict value is not equal to itself.")
10941100 }
10951101
10961102
10971103 func parseRequest (requestId) = {
10981104 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
10991105 let user = request[0]
11001106 let pool = request[1]
11011107 let pmtA = parseIntValue(request[2])
11021108 let AId = request[3]
11031109 let pmtB = parseIntValue(request[4])
11041110 let BId = request[5]
11051111 let balA = parseIntValue(request[6])
11061112 let balB = parseIntValue(request[7])
11071113 let shareId = request[8]
11081114 let bwAsset = request[9]
11091115 let bwAmount = parseIntValue(request[10])
11101116 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
11111117 }
11121118
11131119
11141120 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
11151121 then (borrowId != bId)
11161122 else false)
11171123 then throw("Wrong borrow asset")
11181124 else {
11191125 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
11201126 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
11211127 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
11221128 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
11231129 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1124- let $t03271232809 = if ((borrowId == aId))
1130+ let $t03289632993 = if ((borrowId == aId))
11251131 then $Tuple2(dPriceA, decPrA)
11261132 else $Tuple2(dPriceB, decPrB)
1127- let borrowPrice = $t03271232809._1
1128- let borrowDecPr = $t03271232809._2
1133+ let borrowPrice = $t03289632993._1
1134+ let borrowDecPr = $t03289632993._2
11291135 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
11301136 }
11311137
11321138
11331139 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
11341140 then if ((assetIdToStr(pmts[0].assetId) != AId))
11351141 then throw("Wrong payment asset A")
11361142 else if ((assetIdToStr(pmts[1].assetId) != BId))
11371143 then throw("Wrong payment asset B")
11381144 else $Tuple2(pmts[0].amount, pmts[1].amount)
11391145 else if ((size(pmts) == 1))
11401146 then if ((assetIdToStr(pmts[0].assetId) == AId))
11411147 then $Tuple2(pmts[0].amount, 0)
11421148 else if ((assetIdToStr(pmts[0].assetId) == BId))
11431149 then $Tuple2(0, pmts[0].amount)
11441150 else throw("Wrong payment")
11451151 else throw("One or two payments expected")
11461152
11471153
11481154 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
11491155 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
11501156 if ((0 > pri))
11511157 then (pri * -1)
11521158 else pri
11531159 }
11541160
11551161
11561162 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1157- let $t03380934071 = if (claim)
1163+ let $t03399334255 = if (claim)
11581164 then claimFarmed(pType, pool)
11591165 else {
11601166 let claimedAsset = if ((pType == SF_POOL))
11611167 then SWOPID
11621168 else if ((pType == WX_POOL))
11631169 then WXID
11641170 else unknownPoolType()
11651171 $Tuple2(amount, claimedAsset)
11661172 }
1167- if (($t03380934071 == $t03380934071))
1173+ if (($t03399334255 == $t03399334255))
11681174 then {
1169- let claimAsset = $t03380934071._2
1170- let claimAmount = $t03380934071._1
1175+ let claimAsset = $t03399334255._2
1176+ let claimAmount = $t03399334255._1
11711177 let bal = accountBalance(claimAsset)
11721178 if ((bal == bal))
11731179 then if ((amount > bal))
11741180 then throw("To big amount to exchange")
11751181 else $Tuple2(claimAmount, claimAsset)
11761182 else throw("Strict value is not equal to itself.")
11771183 }
11781184 else throw("Strict value is not equal to itself.")
11791185 }
11801186
11811187
11821188 @Callable(i)
11831189 func getPoolInfoREADONLY (pool) = {
11841190 let poolAddr = addressFromStringValue(pool)
11851191 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1186- let $t03443834528 = getPoolData(Address(fromBase58String(pool)), pType)
1187- let AId = $t03443834528._1
1188- let BId = $t03443834528._2
1189- let balA = $t03443834528._3
1190- let balB = $t03443834528._4
1191- let shareId = $t03443834528._5
1192+ let $t03462234712 = getPoolData(Address(fromBase58String(pool)), pType)
1193+ let AId = $t03462234712._1
1194+ let BId = $t03462234712._2
1195+ let balA = $t03462234712._3
1196+ let balB = $t03462234712._4
1197+ let shareId = $t03462234712._5
11921198 let shareSupply = getShareSupply(poolAddr, pType, shareId)
11931199 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
11941200 }
11951201
11961202
11971203
11981204 @Callable(i)
11991205 func getShareAssetPriceREADONLY (shareId) = {
12001206 let sharePrices = getSharePrice(shareId)
12011207 $Tuple2(nil, sharePrices)
12021208 }
12031209
12041210
12051211
12061212 @Callable(i)
12071213 func getUserPositionShareAmountREADONLY (user,posNum) = {
12081214 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
12091215 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
12101216 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
12111217 $Tuple2(nil, userCanWithdraw)
12121218 }
12131219
12141220
12151221
12161222 @Callable(i)
12171223 func getUserPositionREADONLY (user,pools,posNum) = {
12181224 func userPos (a,pool) = {
1219- let $t03540135471 = a
1220- let wAmountsA = $t03540135471._1
1221- let wAmountsB = $t03540135471._2
1222- let debts = $t03540135471._3
1223- let eqWAmountsA = $t03540135471._4
1224- let eqWAmountsB = $t03540135471._5
1225- let index = $t03540135471._6
1225+ let $t03558535655 = a
1226+ let wAmountsA = $t03558535655._1
1227+ let wAmountsB = $t03558535655._2
1228+ let debts = $t03558535655._3
1229+ let eqWAmountsA = $t03558535655._4
1230+ let eqWAmountsB = $t03558535655._5
1231+ let index = $t03558535655._6
12261232 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
12271233 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
12281234 else {
12291235 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1230- let $t03575035840 = getPoolData(Address(fromBase58String(pool)), pType)
1231- let AId = $t03575035840._1
1232- let BId = $t03575035840._2
1233- let balA = $t03575035840._3
1234- let balB = $t03575035840._4
1235- let shareId = $t03575035840._5
1236+ let $t03593436024 = getPoolData(Address(fromBase58String(pool)), pType)
1237+ let AId = $t03593436024._1
1238+ let BId = $t03593436024._2
1239+ let balA = $t03593436024._3
1240+ let balB = $t03593436024._4
1241+ let shareId = $t03593436024._5
12361242 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
12371243 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1238- let $t03605636176 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1239- let wAmountA = $t03605636176._1
1240- let wAmountB = $t03605636176._2
1244+ let $t03624036360 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1245+ let wAmountA = $t03624036360._1
1246+ let wAmountB = $t03624036360._2
12411247 if ((borrowAmount > 0))
12421248 then {
12431249 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
12441250 let debt = {
12451251 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
12461252 if ($isInstanceOf(@, "Int"))
12471253 then @
12481254 else throw(($getType(@) + " couldn't be cast to Int"))
12491255 }
12501256 if ((debt == debt))
12511257 then {
12521258 let amountToGetEx = if (if ((borrowAsset == AId))
12531259 then (debt > wAmountA)
12541260 else false)
12551261 then (debt - wAmountA)
12561262 else if (if ((borrowAsset == BId))
12571263 then (debt > wAmountB)
12581264 else false)
12591265 then (debt - wAmountB)
12601266 else 0
12611267 let amountToPay = if ((amountToGetEx > 0))
12621268 then if ((pType == SF_POOL))
12631269 then {
12641270 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12651271 ex._2
12661272 }
12671273 else if ((pType == WX_POOL))
12681274 then {
12691275 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
12701276 ex._2
12711277 }
12721278 else unknownPoolType()
12731279 else 0
1274- let $t03708837307 = if ((borrowAsset == AId))
1280+ let $t03727237491 = if ((borrowAsset == AId))
12751281 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
12761282 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1277- let eqWAmountA = $t03708837307._1
1278- let eqWAmountB = $t03708837307._2
1283+ let eqWAmountA = $t03727237491._1
1284+ let eqWAmountB = $t03727237491._2
12791285 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
12801286 }
12811287 else throw("Strict value is not equal to itself.")
12821288 }
12831289 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
12841290 }
12851291 }
12861292
1287- let $t03756237673 = {
1293+ let $t03774637857 = {
12881294 let $l = pools
12891295 let $s = size($l)
12901296 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
12911297 func $f0_1 ($a,$i) = if (($i >= $s))
12921298 then $a
12931299 else userPos($a, $l[$i])
12941300
12951301 func $f0_2 ($a,$i) = if (($i >= $s))
12961302 then $a
12971303 else throw("List size exceeds 20")
12981304
12991305 $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($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), 16), 17), 18), 19), 20)
13001306 }
1301- let wAmountsA = $t03756237673._1
1302- let wAmountsB = $t03756237673._2
1303- let debts = $t03756237673._3
1304- let eqWAmountsA = $t03756237673._4
1305- let eqWAmountsB = $t03756237673._5
1307+ let wAmountsA = $t03774637857._1
1308+ let wAmountsB = $t03774637857._2
1309+ let debts = $t03774637857._3
1310+ let eqWAmountsA = $t03774637857._4
1311+ let eqWAmountsB = $t03774637857._5
13061312 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
13071313 }
13081314
13091315
13101316
13111317 @Callable(i)
13121318 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
13131319 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
13141320 if (!(isPoolActive(pool, pType)))
13151321 then throw("Pool not active at this moment")
13161322 else if (if ((100 > leverage))
13171323 then true
13181324 else (leverage > 300))
13191325 then throw("Leverage can't be <100 and >300")
13201326 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
13211327 then (leverage > 100)
13221328 else false)
13231329 then throw("You can't borrow in this pool")
13241330 else {
1325- let $t03827138361 = getPoolData(Address(fromBase58String(pool)), pType)
1326- let AId = $t03827138361._1
1327- let BId = $t03827138361._2
1328- let balA = $t03827138361._3
1329- let balB = $t03827138361._4
1330- let shareId = $t03827138361._5
1331+ let $t03845538545 = getPoolData(Address(fromBase58String(pool)), pType)
1332+ let AId = $t03845538545._1
1333+ let BId = $t03845538545._2
1334+ let balA = $t03845538545._3
1335+ let balB = $t03845538545._4
1336+ let shareId = $t03845538545._5
13311337 if (if ((borrowId != AId))
13321338 then (borrowId != BId)
13331339 else false)
13341340 then throw("Wrong borrow asset")
13351341 else {
1336- let $t03844238501 = parseReplenishPmts(i.payments, AId, BId)
1337- let pmtA = $t03844238501._1
1338- let pmtB = $t03844238501._2
1342+ let $t03862638685 = parseReplenishPmts(i.payments, AId, BId)
1343+ let pmtA = $t03862638685._1
1344+ let pmtB = $t03862638685._2
13391345 let user = toString(i.caller)
13401346 let newPosNum = getNewUserPositionNumber(user)
13411347 if ((leverage > 100))
13421348 then {
13431349 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
13441350 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
13451351 let newRequestId = {
13461352 let @ = invoke(this, "createNewRequest", [request], nil)
13471353 if ($isInstanceOf(@, "Int"))
13481354 then @
13491355 else throw(($getType(@) + " couldn't be cast to Int"))
13501356 }
13511357 if ((newRequestId == newRequestId))
13521358 then {
13531359 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
13541360 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
13551361 if ((inv == inv))
13561362 then {
13571363 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1358- let $t03949039584 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1359- if (($t03949039584 == $t03949039584))
1364+ let $t03967439768 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1365+ if (($t03967439768 == $t03967439768))
13601366 then {
1361- let newBalB = $t03949039584._2
1362- let newBalA = $t03949039584._1
1367+ let newBalB = $t03967439768._2
1368+ let newBalA = $t03967439768._1
13631369 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1364- let $t03965439769 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1365- let wAmountA = $t03965439769._1
1366- let wAmountB = $t03965439769._2
1370+ let $t03983839953 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1371+ let wAmountA = $t03983839953._1
1372+ let wAmountB = $t03983839953._2
13671373 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
13681374 }
13691375 else throw("Strict value is not equal to itself.")
13701376 }
13711377 else throw("Strict value is not equal to itself.")
13721378 }
13731379 else throw("Strict value is not equal to itself.")
13741380 }
13751381 else {
1376- let $t03982239937 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1377- if (($t03982239937 == $t03982239937))
1382+ let $t04000640121 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1383+ if (($t04000640121 == $t04000640121))
13781384 then {
1379- let axlyFee = $t03982239937._2
1380- let userStaked = $t03982239937._1
1381- let $t03994340037 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1382- if (($t03994340037 == $t03994340037))
1385+ let axlyFee = $t04000640121._2
1386+ let userStaked = $t04000640121._1
1387+ let $t04012740221 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1388+ if (($t04012740221 == $t04012740221))
13831389 then {
1384- let newBalB = $t03994340037._2
1385- let newBalA = $t03994340037._1
1390+ let newBalB = $t04012740221._2
1391+ let newBalA = $t04012740221._1
13861392 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1387- let $t04010740222 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1388- let wAmountA = $t04010740222._1
1389- let wAmountB = $t04010740222._2
1393+ let $t04029140406 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1394+ let wAmountA = $t04029140406._1
1395+ let wAmountB = $t04029140406._2
13901396 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
13911397 }
13921398 else throw("Strict value is not equal to itself.")
13931399 }
13941400 else throw("Strict value is not equal to itself.")
13951401 }
13961402 }
13971403 }
13981404 })
13991405
14001406
14011407
14021408 @Callable(i)
14031409 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
14041410 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
14051411 if (!(isPoolActive(pool, pType)))
14061412 then throw("Pool not active at this moment")
14071413 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
14081414 })
14091415
14101416
14111417
14121418 @Callable(i)
14131419 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
14141420 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
14151421 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
14161422 if (!(isPoolActive(poolId, pType)))
14171423 then throw("Pool not active at this moment")
14181424 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
14191425 then throw("There are no user position")
14201426 else if ((0 >= price))
14211427 then throw("Price must be greater than 0")
14221428 else if ((price > tokenOraclePrice))
14231429 then throw("Price must be less than current token price")
14241430 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
14251431 })
14261432
14271433
14281434
14291435 @Callable(i)
14301436 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
14311437 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
14321438 if (!(isPoolActive(poolId, pType)))
14331439 then throw("Pool not active at this moment")
14341440 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
14351441 then throw("No entry")
14361442 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
14371443 })
14381444
14391445
14401446
14411447 @Callable(i)
14421448 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
14431449 then throw("Already inited")
14441450 else if (!(isDefined(addressFromString(moneyBoxAddr))))
14451451 then throw("moneyBoxAddr is not correct address")
14461452 else if (!(isDefined(addressFromString(sfFarmingAddr))))
14471453 then throw("sfFarmingAddr is not correct address")
14481454 else if (!(isDefined(addressFromString(lendAddr))))
14491455 then throw("lendAddr is not correct address")
14501456 else if (!(isDefined(addressFromString(priceOracleAddr))))
14511457 then throw("priceOracleAddr is not correct address")
14521458 else if (!(isDefined(addressFromString(keeperExContract))))
14531459 then throw("keeperExContract is not correct address")
14541460 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
14551461 then throw("swopAssetId is not correct asset id")
14561462 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
14571463 then throw("swopAssetId is not correct asset id")
14581464 else if ((size(fromBase58String(operatorPubKey)) != 32))
14591465 then throw("operatorPubKey is not correct")
14601466 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
14611467 then throw("group1Admin1PubKey is not correct")
14621468 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
14631469 then throw("group1Admin2PubKey is not correct")
14641470 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
14651471 then throw("group2Admin1PubKey is not correct")
14661472 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
14671473 then throw("group2Admin2PubKey is not correct")
14681474 else [StringEntry(kMoneyBox, moneyBoxAddr), StringEntry(kSFFarmingAddr, sfFarmingAddr), StringEntry(kLendService, lendAddr), StringEntry(kPriceOracle, priceOracleAddr), StringEntry(kExContract, keeperExContract), StringEntry(kWxSwapContract, wxSwapContract), StringEntry(kSwopId, swopAssetId), StringEntry(kWxId, wxAssetId), StringEntry(kOperatorCallPK, operatorPubKey), StringEntry(kGroup1Admin1PK, group1Admin1PubKey), StringEntry(kGroup1Admin2PK, group1Admin2PubKey), StringEntry(kGroup2Admin1PK, group2Admin1PubKey), StringEntry(kGroup2Admin2PK, group2Admin2PubKey)])
14691475
14701476
14711477
14721478 @Callable(i)
14731479 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
14741480 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
14751481 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
14761482 })
14771483
14781484
14791485
14801486 @Callable(i)
14811487 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1482- let $t04506145165 = parseRequest(requestId)
1483- let user = $t04506145165._1
1484- let pool = $t04506145165._2
1485- let pmtA = $t04506145165._3
1486- let AId = $t04506145165._4
1487- let pmtB = $t04506145165._5
1488- let BId = $t04506145165._6
1489- let balA = $t04506145165._7
1490- let balB = $t04506145165._8
1491- let shareId = $t04506145165._9
1492- let bwAsset = $t04506145165._10
1493- let bwAmount = $t04506145165._11
1488+ let $t04524545349 = parseRequest(requestId)
1489+ let user = $t04524545349._1
1490+ let pool = $t04524545349._2
1491+ let pmtA = $t04524545349._3
1492+ let AId = $t04524545349._4
1493+ let pmtB = $t04524545349._5
1494+ let BId = $t04524545349._6
1495+ let balA = $t04524545349._7
1496+ let balB = $t04524545349._8
1497+ let shareId = $t04524545349._9
1498+ let bwAsset = $t04524545349._10
1499+ let bwAmount = $t04524545349._11
14941500 if ((size(i.payments) != 1))
14951501 then throw("Wrong payment size")
14961502 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
14971503 then true
14981504 else (i.payments[0].amount != bwAmount))
14991505 then throw("Wrong payment")
15001506 else {
1501- let $t04535545455 = if ((AId == bwAsset))
1507+ let $t04553945639 = if ((AId == bwAsset))
15021508 then $Tuple2((pmtA + bwAmount), pmtB)
15031509 else $Tuple2(pmtA, (pmtB + bwAmount))
1504- let pmtAllA = $t04535545455._1
1505- let pmtAllB = $t04535545455._2
1510+ let pmtAllA = $t04553945639._1
1511+ let pmtAllB = $t04553945639._2
15061512 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1507- let $t04553745652 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1508- let userStaked = $t04553745652._1
1509- let axlyFee = $t04553745652._2
1513+ let $t04572145836 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1514+ let userStaked = $t04572145836._1
1515+ let axlyFee = $t04572145836._2
15101516 let posNum = getNewUserPositionNumber(user)
15111517 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
15121518 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1513- let $t04601246127 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1514- let wAmountA = $t04601246127._1
1515- let wAmountB = $t04601246127._2
1519+ let $t04619646311 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1520+ let wAmountA = $t04619646311._1
1521+ let wAmountB = $t04619646311._2
15161522 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
15171523 }
15181524 }))
15191525
15201526
15211527
15221528 @Callable(i)
15231529 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
15241530 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
15251531 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1526- let $t04664846738 = getPoolData(Address(fromBase58String(pool)), pType)
1527- let AId = $t04664846738._1
1528- let BId = $t04664846738._2
1529- let balA = $t04664846738._3
1530- let balB = $t04664846738._4
1531- let shareId = $t04664846738._5
1532+ let $t04683246922 = getPoolData(Address(fromBase58String(pool)), pType)
1533+ let AId = $t04683246922._1
1534+ let BId = $t04683246922._2
1535+ let balA = $t04683246922._3
1536+ let balB = $t04683246922._4
1537+ let shareId = $t04683246922._5
15321538 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
15331539 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
15341540 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
15351541 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
15361542 if ((liquidateAmount > userCanWithdraw))
15371543 then throw("You can't liquidate more than user have")
15381544 else if ((borrowAmount == 0))
15391545 then throw("You can't liquidate position without borrow")
15401546 else [IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest), getIntegerValue(this, (pool + kPoolInterestLoan))), IntegerEntry((pool + kPoolTotalLoan), (getPoolTotalShareWithLoan(pool) - liquidateAmount)), IntegerEntry((pool + kPoolTotal), (getPoolTotalShare(pool) - liquidateAmount)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition), (userCanWithdraw - liquidateAmount)), ScriptTransfer(i.caller, amount, fromBase58String(shareId))]
15411547 }))
15421548
15431549
15441550
15451551 @Callable(i)
15461552 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15471553 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
15481554 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
15491555 if ((tokenOraclePrice > stopLossPrice))
15501556 then throw("Token price greater stop loss price")
15511557 else {
15521558 let res = withdrawToUser(user, pool, toString(posId), true)
15531559 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
15541560 }
15551561 }))
15561562
15571563
15581564
15591565 @Callable(i)
15601566 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15611567 let pType = getStringValue(this, (kPool + pool))
15621568 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1563- let $t04870848810 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1564- if (($t04870848810 == $t04870848810))
1569+ let $t04889248994 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1570+ if (($t04889248994 == $t04889248994))
15651571 then {
1566- let claimedAsset = $t04870848810._2
1567- let claimedAmount = $t04870848810._1
1572+ let claimedAsset = $t04889248994._2
1573+ let claimedAmount = $t04889248994._1
15681574 let rArgs = split(route, "__")
15691575 let exchangedAmount = if ((rArgs[0] == "directSwopfiCPMM"))
15701576 then directSwopfiCPMM(rArgs, tokenToId)
15711577 else if ((rArgs[0] == "routingSwopfi"))
15721578 then directRoutingSwopfi(rArgs, tokenToId)
15731579 else throw("Wrong route")
15741580 if ((exchangedAmount == exchangedAmount))
15751581 then {
15761582 let newChange = ((claimedAmount + change) - amountToExchange)
15771583 let changeEntry = if ((newChange >= 0))
15781584 then [IntegerEntry((pool + kPoolCapChange), newChange)]
15791585 else nil
15801586 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
15811587 }
15821588 else throw("Strict value is not equal to itself.")
15831589 }
15841590 else throw("Strict value is not equal to itself.")
15851591 }))
15861592
15871593
15881594
15891595 @Callable(i)
15901596 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
15911597 let pType = getStringValue(this, (kPool + pool))
1592- let $t04949449592 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1593- if (($t04949449592 == $t04949449592))
1598+ let $t04967849776 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1599+ if (($t04967849776 == $t04967849776))
15941600 then {
1595- let claimedAsset = $t04949449592._2
1596- let claimedAmount = $t04949449592._1
1601+ let claimedAsset = $t04967849776._2
1602+ let claimedAmount = $t04967849776._1
15971603 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
15981604 }
15991605 else throw("Strict value is not equal to itself.")
16001606 }))
16011607
16021608
16031609
16041610 @Callable(i)
16051611 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
16061612 then (type != WX_POOL)
16071613 else false)
16081614 then throw("Wrong type")
16091615 else if (if ((poolType != CPMM))
16101616 then (poolType != FLAT)
16111617 else false)
16121618 then throw("Wrong pool type")
16131619 else {
1614- let $t05011350207 = getPoolData(Address(fromBase58String(poolAddr)), type)
1615- let aId = $t05011350207._1
1616- let bId = $t05011350207._2
1617- let aBal = $t05011350207._3
1618- let bBal = $t05011350207._4
1619- let shareId = $t05011350207._5
1620+ let $t05029750391 = getPoolData(Address(fromBase58String(poolAddr)), type)
1621+ let aId = $t05029750391._1
1622+ let bId = $t05029750391._2
1623+ let aBal = $t05029750391._3
1624+ let bBal = $t05029750391._4
1625+ let shareId = $t05029750391._5
16201626 if ((0 > inFeeNoLoan))
16211627 then throw("inFeeNoLoan must be greater than 0")
16221628 else if ((0 > inFeeLoan))
16231629 then throw("inFeeLoan must be greater than 0")
16241630 else if ((0 > capFeeNoLoan))
16251631 then throw("capFeeNoLoan must be greater than 0")
16261632 else if ((0 > capFeeWithLoan))
16271633 then throw("capFeeWithLoan must be greater than 0")
16281634 else if ((0 > stoplossFeeNoLoan))
16291635 then throw("stoplossFeeNoLoan must be greater than 0")
16301636 else if ((0 > stoplossFeeWithLoan))
16311637 then throw("stoplossFeeWithLoan must be greater than 0")
16321638 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((poolAddr + kPoolType), poolType), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
16331639 }))
16341640
16351641
16361642
16371643 @Callable(i)
16381644 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
16391645 then throw(("Can't find pool with addr " + poolAddr))
16401646 else if ((0 > inFeeNoLoan))
16411647 then throw("inFeeNoLoan must be greater than 0")
16421648 else if ((0 > inFeeLoan))
16431649 then throw("inFeeLoan must be greater than 0")
16441650 else if ((0 > capFeeNoLoan))
16451651 then throw("capFeeNoLoan must be greater than 0")
16461652 else if ((0 > capFeeWithLoan))
16471653 then throw("capFeeWithLoan must be greater than 0")
16481654 else if ((0 > stoplossFeeNoLoan))
16491655 then throw("stoplossFeeNoLoan must be greater than 0")
16501656 else if ((0 > stoplossFeeWithLoan))
16511657 then throw("stoplossFeeWithLoan must be greater than 0")
16521658 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan)]))
16531659
16541660
16551661
16561662 @Callable(i)
16571663 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
16581664 then throw("dApp already active")
16591665 else [BooleanEntry(kActive, true)])
16601666
16611667
16621668
16631669 @Callable(i)
16641670 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
16651671 then throw("dApp already shutdown")
16661672 else [BooleanEntry(kActive, false)])
16671673
16681674
16691675
16701676 @Callable(i)
16711677 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
16721678 then throw("dApp already active for users")
16731679 else [BooleanEntry(kActiveUsers, true)])
16741680
16751681
16761682
16771683 @Callable(i)
16781684 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
16791685 then throw("dApp already shutdown for users")
16801686 else [BooleanEntry(kActiveUsers, false)])
16811687
16821688
16831689
16841690 @Callable(i)
16851691 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
16861692 then throw("SWOPFI already active")
16871693 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
16881694
16891695
16901696
16911697 @Callable(i)
16921698 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
16931699 then throw("SWOPFI already shutdown")
16941700 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
16951701
16961702
16971703
16981704 @Callable(i)
16991705 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
17001706 then throw("WX already active")
17011707 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
17021708
17031709
17041710
17051711 @Callable(i)
17061712 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
17071713 then throw("WX already shutdown")
17081714 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
17091715
17101716
17111717
17121718 @Callable(i)
17131719 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
17141720 then throw("Unknown pool")
17151721 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
17161722 then throw("Pool already active")
17171723 else [BooleanEntry((pool + kPoolActive), true)])
17181724
17191725
17201726
17211727 @Callable(i)
17221728 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
17231729 then throw("Unknown pool")
17241730 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
17251731 then throw("Pool already shutdown")
17261732 else [BooleanEntry((pool + kPoolActive), false)])
17271733
17281734
1735+@Verifier(tx)
1736+func verify () = match tx {
1737+ case inv: InvokeScriptTransaction =>
1738+ let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
1739+ let isRightFee = if ((inv.fee == 900000))
1740+ then (inv.feeAssetId == unit)
1741+ else false
1742+ let isInitCall = (inv.function == "init")
1743+ let isnoPayments = (size(inv.payments) == 0)
1744+ if (if (if (isRightFee)
1745+ then isInitCall
1746+ else false)
1747+ then isSelf
1748+ else false)
1749+ then isnoPayments
1750+ else false
1751+ case _ =>
1752+ let group1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
1753+ then 1
1754+ else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin2PK))
1755+ then 1
1756+ else 0))
1757+ let group2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin1PK))
1758+ then 1
1759+ else (0 + (if (sigVerify(tx.bodyBytes, tx.proofs[1], group2Admin2PK))
1760+ then 1
1761+ else 0))
1762+ ((group1Signed + group2Signed) == 2)
1763+}
1764+

github/deemru/w8io/026f985 
332.02 ms