tx · 2SsnougSRD2cfKNZdF4Ev8TmcfP2HJ8WwVUy4nVLJRJy

3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW:  -0.07600000 Waves

2024.04.08 11:23 [4119489] smart account 3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW > SELF 0.00000000 Waves

{ "type": 13, "id": "2SsnougSRD2cfKNZdF4Ev8TmcfP2HJ8WwVUy4nVLJRJy", "fee": 7600000, "feeAssetId": null, "timestamp": 1712564600531, "version": 2, "chainId": 87, "sender": "3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW", "senderPublicKey": "9D3NMf2PEttfNTb8Hk2nbXukn2b2xmoTsZSqQrhvyeN", "proofs": [ "", "3ntYKQQmK4RzY9ju4yiaj8ywRP1jhBTSfB9MuEdVn6VSgUJio2JYsNrmWVpYZHWKCFBr6JByzgjNfCaCDuioBx1w", "2x56SQivXzsnptb4ViVBpMu55xTdYBxhVVfyTywXxJXxpsWVMpNBk1oJU61FW6TbrwnbRaGBPwqpw2HkMKKFyo1n" ], "script": "base64:BgKsAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBgoECAEIBBIECgIIARIFCgMIAQgSBgoEAQgIARIFCgMBCAgSDwoNCAgICAgICAgICAgICBIDCgEIEgMKAQgSBQoDCAgBEgYKBAgBCAgSBwoFCAgIAQQSBQoDCAQBEg4KDAgICAEBAQEBAQQECBIJCgcIAQEBAQEBEgASABIAEgASABIAEgASABIDCgEIEgMKAQibAQAEQ09ORgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIGY29uZmlnAAdTRl9QT09MAgJTRgAHV1hfUE9PTAICV1gABENQTU0CBGNwbW0ABEZMQVQCBGZsYXQAD0NBUF9GRUVfTk9fTE9BTgIJY2FwTm9Mb2FuAAxDQVBfRkVFX0xPQU4CB2NhcExvYW4AFFNUT1BMT1NTX0ZFRV9OT19MT0FOAg5zdG9wTG9zc05vTG9hbgANU1RPUExPU1NfTE9BTgIMc3RvcExvc3NMb2FuAAhMT0FOX0ZFRQIEbG9hbgALTk9fTE9BTl9GRUUCBm5vTG9hbgAGTk9fRkVFAgVub0ZlZQAGU0NBTEU4AIDC1y8AB1NDQUxFMTAAgMivoCUAB1NDQUxFMTYJALYCAQCAgIT+pt7hEQAKRkVFX1NDQUxFNgDAhD0AFGtTRlBvb2xBQXNzZXRCYWxhbmNlAg9BX2Fzc2V0X2JhbGFuY2UAFGtTRlBvb2xCQXNzZXRCYWxhbmNlAg9CX2Fzc2V0X2JhbGFuY2UAD2tTRlBvb2xBQXNzZXRJZAIKQV9hc3NldF9pZAAPa1NGUG9vbEJBc3NldElkAgpCX2Fzc2V0X2lkAA5rU0ZQb29sU2hhcmVJZAIOc2hhcmVfYXNzZXRfaWQAEmtTRlBvb2xTaGFyZVN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AAprU0ZQb29sRmVlAgpjb21taXNzaW9uAA1rVXNlclBvc2l0aW9uAg1fdXNlclBvc2l0aW9uABFrVXNlclBvc2l0aW9uUG9vbAIRX3VzZXJQb3NpdGlvblBvb2wAEWtVc2VyQm9ycm93QW1vdW50AhlfdXNlclBvc2l0aW9uQm9ycm93QW1vdW50ABJrVXNlckJvcnJvd0Fzc2V0SWQCGl91c2VyUG9zaXRpb25Cb3Jyb3dBc3NldElkABBrVXNlclBvc2l0aW9uTnVtAhNfdXNlclBvc2l0aW9uTnVtYmVyABVrVXNlclBvc2l0aW9uSW50ZXJlc3QCFV91c2VyUG9zaXRpb25JbnRlcmVzdAAWa1VzZXJQb3NpdGlvbkluUE1hcmtldAIUX3VzZXJQb3NpdGlvblBNYXJrZXQACmtQb29sVG90YWwCCl9wb29sVG90YWwADmtQb29sVG90YWxMb2FuAg5fcG9vbFRvdGFsTG9hbgAQa1Bvb2xUb3RhbE1hcmtldAIQX3Bvb2xUb3RhbE1hcmtldAAUa1Bvb2xUb3RhbE1hcmtldExvYW4CFF9wb29sVG90YWxNYXJrZXRMb2FuABFrUG9vbEludGVyZXN0TG9hbgIRX3Bvb2xJbnRlcmVzdExvYW4AE2tQb29sSW50ZXJlc3ROb0xvYW4CE19wb29sSW50ZXJlc3ROb0xvYW4AF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAhdfcG9vbEludGVyZXN0TWFya2V0TG9hbgAZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgIZX3Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgAYa1Bvb2xBbGxvd2VkQm9ycm93QXNzZXRzAhhfcG9vbEFsbG93ZWRCb3Jyb3dBc3NldHMADmtQb29sQ2FuQm9ycm93Ag5fcG9vbENhbkJvcnJvdwAMa1Bvb2xQTUFya2V0AhFfcG9vbFB1enpsZU1hcmtldAAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAg5fYXhseUZlZU5vTG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhBfYXhseUZlZVdpdGhMb2FuABFrQXhseU5vTG9hbkNhcEZlZQIRX2F4bHlGZWVDYXBOb0xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCE19heGx5RmVlQ2FwV2l0aExvYW4AFmtBeGx5U3RvcExvc3NOb0xvYW5GZWUCGF9heGx5RmVlU3RvcGxvc3NXaXRoTG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCFl9heGx5RmVlU3RvcGxvc3NOb0xvYW4ACmtSZXF1ZXN0SWQCC19yZXF1ZXN0X2lkAAxrUmVxdWVzdEl0ZXICDXJlcXVlc3RzX2l0ZXIABWtQb29sAgVwb29sXwAJa1Bvb2xUeXBlAglfcG9vbFR5cGUACmtTaGFyZVBvb2wCDF9wb29sU2hhcmVJZAAOa1Bvb2xDYXBDaGFuZ2UCDl9wb29sQ2FwQ2hhbmdlAA9rVG9rZW5MYXN0UHJpY2UCCmxhc3RfcHJpY2UADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCAAdrQWN0aXZlAgZhY3RpdmUADGtBY3RpdmVVc2VycwILYWN0aXZlVXNlcnMAC2tBY3RpdmVTRldYAgdfYWN0aXZlAAtrUG9vbEFjdGl2ZQILX2FjdGl2ZVBvb2wADWtVc2VyU3RvcExvc3MCCV9zdG9wTG9zcwAXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCF19mYWxsYmFja0V4Y2hhbmdlU3dvcGZpAA5rUG9vbFByb3h5QWRkcgIRX3Bvb2xQcm94eUFkZHJlc3MACWtNb25leUJveAIOYXhseV9tb25leV9ib3gADmtTRkZhcm1pbmdBZGRyAhNzd29wZmlfZmFybWluZ19hZGRyAAxrTGVuZFNlcnZpY2UCEWxlbmRfc2VydmljZV9hZGRyAA9rT3BlcmF0b3JDYWxsUEsCEmFkbWluX2NhbGxfcHViX2tleQAMa1ByaWNlT3JhY2xlAgxwcmljZV9vcmFjbGUAC2tFeENvbnRyYWN0AhFleGNoYW5nZV9jb250cmFjdAAPa1d4U3dhcENvbnRyYWN0AhB3eF9zd2FwX2NvbnRyYWN0AAdrV3hSZXN0Agx3eF9yZXN0X2FkZHIAB2tTd29wSWQCB3N3b3BfaWQABWtXeElkAgV3eF9pZAAMa1BNYXJrZXRBZGRyAhVwdXp6bGVfbWFya2V0X2FkZHJlc3MAEGtQTWFya2V0UmVzdEFkZHICGnB1enpsZV9tYXJrZXRfcmVzdF9hZGRyZXNzAA9rR3JvdXAxQWRtaW4xUEsCFWdyb3VwMV9hZG1pbjFfcHViX2tleQAPa0dyb3VwMUFkbWluMlBLAhVncm91cDFfYWRtaW4yX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjNQSwIVZ3JvdXAxX2FkbWluM19wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQtrRXhDb250cmFjdAIcTm8gZXhjaGFuZ2UgY29udHJhY3QgYWRkcmVzcwAPcHJpY2VPcmFjbGVBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGd3hSZXN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUHa1d4UmVzdAISTm8gd3ggcmVzdCBhZGRyZXNzAAZTV09QSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFB2tTd29wSWQCCk5vIHN3b3AgaWQABFdYSUQJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFBWtXeElkAghObyB3eCBpZAALcE1hcmtldEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQxrUE1hcmtldEFkZHICGE5vIHB1enpsZSBtYXJrZXQgYWRkcmVzcwAPcE1hcmtldFJlc3RBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEQ09ORgUQa1BNYXJrZXRSZXN0QWRkcgIdTm8gcHV6emxlIG1hcmtldCByZXN0IGFkZHJlc3MADmdyb3VwMUFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4xUEsADmdyb3VwMUFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4yUEsADmdyb3VwMUFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ9rR3JvdXAxQWRtaW4zUEsCGUNhbid0IGdldCBrR3JvdXAxQWRtaW4zUEsADmdyb3VwMkFkbWluMVBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4xUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsADmdyb3VwMkFkbWluMlBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rR3JvdXAyQWRtaW4yUEsCGUNhbid0IGdldCBrR3JvdXAyQWRtaW4xUEsACm9wZXJhdG9yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFD2tPcGVyYXRvckNhbGxQSwIUQ2FuJ3QgZ2V0IG9wZXJhdG9yUEsBD3Vua25vd25Qb29sVHlwZQAJAAIBAg9Xcm9uZyBwb29sIHR5cGUBDmdldExlbmRTcnZBZGRyAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBENPTkYFDGtMZW5kU2VydmljZQIbQ2FuJ3QgZ2V0IGxlbmQgc2VydmljZSBhZGRyAQ5pc09wZXJhdG9yQ2FsbAEBaQMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQpvcGVyYXRvclBLBgkAAAIIBQFpBmNhbGxlcgUIbW9uZXlCb3gFBHVuaXQJAAIBAiRPbmx5IG9wZXJhdG9yIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BC2lzQWRtaW5DYWxsAQFpAwMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFDmdyb3VwMUFkbWluMVBLBgkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUOZ3JvdXAxQWRtaW4yUEsFBHVuaXQJAAIBAihPbmx5IGFkbWluIGdyb3VwMSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzTGFuZENhbGwBAWkDCQAAAggFAWkGY2FsbGVyCQEOZ2V0TGVuZFNydkFkZHIABQR1bml0CQACAQIpT25seSBsYW5kIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCGlzQWN0aXZlAAMJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGBgUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBEGlzQWN0aXZlRm9yVXNlcnMAAwMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAACCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYGBwUEdW5pdAkAAgECKURBcHAgaXMgaW5hY3RpdmUgZm9yIHVzZXJzIGF0IHRoaXMgbW9tZW50AQxpc1Bvb2xBY3RpdmUCBHBvb2wEdHlwZQQKV1hTRkFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHR5cGUFC2tBY3RpdmVTRldYBgQKcG9vbEFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgMDBQpXWFNGQWN0aXZlBQpwb29sQWN0aXZlBwYHAQ5hY2NvdW50QmFsYW5jZQEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA8AcCBQR0aGlzBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAAIBAgtNYXRjaCBlcnJvcgERZ2V0U0ZQb29sQmFsYW5jZXMBCHBvb2xBZGRyCQCUCgIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEFBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEEgYXNzZXQgYmFsYW5jZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQkFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBiYWxhbmNlARFnZXRXWFBvb2xCYWxhbmNlcwMIcG9vbEFkZHIDYUlkA2JJZAkAlAoCCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNhSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYklkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBD2dldFBvb2xCYWxhbmNlcwQIcG9vbEFkZHIEdHlwZQNhSWQDYklkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAkBD3Vua25vd25Qb29sVHlwZQABDWdldFNGUG9vbERhdGEBCHBvb2xBZGRyBAskdDA5NzM5OTc4OAkBEWdldFNGUG9vbEJhbGFuY2VzAQUIcG9vbEFkZHIDCQAAAgULJHQwOTczOTk3ODgFCyR0MDk3Mzk5Nzg4BARiYWxCCAULJHQwOTczOTk3ODgCXzIEBGJhbEEIBQskdDA5NzM5OTc4OAJfMQkAlwoFCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xBQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQkFzc2V0SWQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQFBGJhbEEFBGJhbEIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUOa1NGUG9vbFNoYXJlSWQCGENhbid0IGdldCBzaGFyZSBhc3NldCBpZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgENZ2V0V1hQb29sRGF0YQEIcG9vbEFkZHIEA2NmZwoAAUAJAPwHBAUIcG9vbEFkZHICHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQNjZmcFA2NmZwQDYUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAEAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAQDYklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAFAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAQHc2hhcmVJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcAAwMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGkNhbid0IGdldCBwb29sIExQIGFzc2V0IGlkBA0kdDAxMDQ4NTEwNTQ0CQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQDCQAAAgUNJHQwMTA0ODUxMDU0NAUNJHQwMTA0ODUxMDU0NAQEYmFsQggFDSR0MDEwNDg1MTA1NDQCXzIEBGJhbEEIBQ0kdDAxMDQ4NTEwNTQ0Al8xCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAQ91bmtub3duUG9vbFR5cGUAAQ5nZXRTaGFyZVN1cHBseQMIcG9vbEFkZHIEdHlwZQdzaGFyZUlkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUSa1NGUG9vbFNoYXJlU3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5AwkAAAIFBHR5cGUFB1dYX1BPT0wICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQdzaGFyZUlkAg1Xcm9uZyBTaGFyZUlkCHF1YW50aXR5CQEPdW5rbm93blBvb2xUeXBlAAERZ2V0UG9vbFRvdGFsU2hhcmUBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQprUG9vbFRvdGFsAAABGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgAAARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQAAAAEBCmdldEF4bHlGZWUCBHBvb2wHZmVlVHlwZQMJAAACBQdmZWVUeXBlBQxDQVBfRkVFX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa0F4bHlXaXRoTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQ9DQVBfRkVFX05PX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa0F4bHlOb0xvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUITE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUSa0F4bHlJbkZlZVdpdGhMb2FuAwkAAAIFB2ZlZVR5cGUFC05PX0xPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgMJAAACBQdmZWVUeXBlBQZOT19GRUUAAAkAAgECDldyb25nIGZlZSB0eXBlARBnZXRTRkZhcm1pbmdBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRDT05GBQ5rU0ZGYXJtaW5nQWRkcgIdQ2FuJ3QgZ2V0IHN3b3BmaSBmYXJtaW5nIGFkZHIBEGdldFdYRmFybWluZ0FkZHIBCHBvb2xBZGRyBAlmQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIECmZhY3Ryb3lDZmcJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCWZDb250cmFjdAIRJXNfX2ZhY3RvcnlDb25maWcCGENhbid0IGdldCBXWCBmYWN0b3J5IGNmZwICX18JAQdBZGRyZXNzAQkA2QQBCQCRAwIFCmZhY3Ryb3lDZmcAAQEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BCQDNCAIFAWEFCmFzc2V0UHJpY2UKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAQ1nZXRTaGFyZVByaWNlAQdzaGFyZUlkBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sAiBDYW4ndCBmaW5kIHBvb2wgYWRkciBieSBzaGFyZSBpZAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMTM1MzMxMzU5OAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANhSWQIBQ0kdDAxMzUzMzEzNTk4Al8xBANiSWQIBQ0kdDAxMzUzMzEzNTk4Al8yBAhhQmFsYW5jZQgFDSR0MDEzNTMzMTM1OTgCXzMECGJCYWxhbmNlCAUNJHQwMTM1MzMxMzU5OAJfNAQGcHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQHZFByaWNlQQkAkQMCBQZwcmljZXMAAAQHZFByaWNlQgkAkQMCBQZwcmljZXMAAQQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkBANzdW0DAwkAZgIFB2RQcmljZUEAAAkAZgIFB2RQcmljZUIAAAcJAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgMJAGYCBQdkUHJpY2VBAAAJAGgCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24AAgMJAGYCBQdkUHJpY2VCAAAJAGgCCQBrAwUIYkJhbGFuY2UFB2RQcmljZUIFCkJQcmVjaXNpb24AAgD///////////8BAwkAZgIAAAUDc3VtAP///////////wEJAGsDBQNzdW0FDnNoYXJlUHJlY2lzaW9uBQtzaGFyZVN1cHBseQEOZ2V0U2hhcmVQcmljZXMBCHNoYXJlSWRzCgEJZ2V0UHJpY2VzAgFhB3NoYXJlSWQJAM0IAgUBYQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkCgACJGwFCHNoYXJlSWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlnZXRQcmljZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAEOZ2V0Q3Vyc0VudHJpZXMEA2FJZANiSWQHc2hhcmVJZAh3QW1vdW50cwQMYXNzZXRzUHJpY2VzCQEOZ2V0QXNzZXRzUHJpY2UBCQDMCAIFA2FJZAkAzAgCBQNiSWQFA25pbAQKc2hhcmVQcmljZQkBDWdldFNoYXJlUHJpY2UBBQdzaGFyZUlkBAZwcmljZXMJAM4IAgkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAAJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwABCQDMCAIJAKQDAQUKc2hhcmVQcmljZQUDbmlsBQh3QW1vdW50cwkAzAgCCQELU3RyaW5nRW50cnkCBQ9rVG9rZW5MYXN0UHJpY2UJALkJAgUGcHJpY2VzAgEsBQNuaWwBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwkFcFR5cGUIcG9vbEFkZHIETFBJZARwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEBHJlcGwKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIgY2FsY0xQUmVwbGVuaXNoVHdvVG9rZW5zUkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFBHBtdEEJAMwIAgkApAMBBQRwbXRCBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQRyZXBsBQRyZXBsCQCXCgUKAAFACQCRAwIFBHJlcGwAAwMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwABAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAQxhc3NldElkVG9TdHIBCQCRAwIFBHJlcGwAAgoAAUAJAJEDAgUEcmVwbAAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTUzNTMxNTYxOQkAlAoCCQC1CQIKAAFACQD8BwQFBnd4UmVzdAIkcG9vbEV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwkAtQkCCgABQAkA/AcEBQZ3eFJlc3QCI3Bvb2xFdmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZCQDMCAIFBExQSWQJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxNTM1MzE1NjE5BQ0kdDAxNTM1MzE1NjE5BApldmFsUHV0SW5CCAUNJHQwMTUzNTMxNTYxOQJfMgQKZXZhbFB1dEluQQgFDSR0MDE1MzUzMTU2MTkCXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIABwkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUHCHBvb2xBZGRyBXBUeXBlBHBtdEEDYUlkBHBtdEIDYklkBGxwSWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNhSWQFBHBtdEEJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2JJZAUEcG10QgUDbmlsBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQ5rUG9vbFByb3h5QWRkcgIAAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwkAzAgCCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhwb29sQWRkcgIDcHV0CQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgIUd3hSZXBsZW5pc2hUd29Ub2tlbnMJAMwIAgkApQgBBQhwb29sQWRkcgkAzAgCBQRscElkCQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUFCHBvb2xBZGRyBXBUeXBlA3BtdAVwbXRJZARscElkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUFcG10SWQFA3BtdAUDbmlsBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQ5rUG9vbFByb3h5QWRkcgIAAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIVcmVwbGVuaXNoV2l0aE9uZVRva2VuCQDMCAIJAMwIAgIBMAkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wEAmZjAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQClCAEFCHBvb2xBZGRyBQlrUG9vbFR5cGUCBGNwbW0FBEZMQVQCC3B1dE9uZVRrblYyAglwdXRPbmVUa24DCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIcG9vbEFkZHIFAmZjCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICE3d4UmVwbGVuaXNoT25lVG9rZW4JAMwIAgkApQgBBQhwb29sQWRkcgkAzAgCBQRscElkCQDMCAIFAmZjCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwkBD3Vua25vd25Qb29sVHlwZQABB3N0YWtlTFAFBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQNc3Rha2VUb01hcmtldAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAUGYW1vdW50BQNuaWwECXByb3h5QWRkcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sUHJveHlBZGRyAgADBQ1zdGFrZVRvTWFya2V0CQD8BwQFC3BNYXJrZXRBZGRyAgZzdXBwbHkFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAg9sb2NrU2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCAAAFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wECGZhcm1BZGRyCQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIZmFybUFkZHICBXN0YWtlBQNuaWwFCHBheW1lbnRzCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXByb3h5QWRkcgIJd3hTdGFrZUxwCQDMCAIJAKUIAQUIZmFybUFkZHIFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAAQl1bnN0YWtlTFAFBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQKZnJvbU1hcmtldAQJcHJveHlBZGRyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xQcm94eUFkZHICAAQNJHQwMTgzNTYxOTAzOAMFCmZyb21NYXJrZXQJAJUKAwULcE1hcmtldEFkZHICCHdpdGhkcmF3CQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAJUKAwkBEGdldFNGRmFybWluZ0FkZHIAAhN3aXRoZHJhd1NoYXJlVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgUGYW1vdW50BQNuaWwDCQAAAgUFcFR5cGUFB1dYX1BPT0wECGZhcm1BZGRyCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAwkAAAIFCXByb3h5QWRkcgIACQCVCgMFCGZhcm1BZGRyAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAJUKAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAgt3eFVuc3Rha2VMcAkAzAgCCQClCAEFCGZhcm1BZGRyCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAQ91bmtub3duUG9vbFR5cGUABAhmYXJtQWRkcggFDSR0MDE4MzU2MTkwMzgCXzEEBWZOYW1lCAUNJHQwMTgzNTYxOTAzOAJfMgQGcGFyYW1zCAUNJHQwMTgzNTYxOTAzOAJfMwQDaW52CQD8BwQFCGZhcm1BZGRyBQVmTmFtZQUGcGFyYW1zBQNuaWwDCQAAAgUDaW52BQNpbnYFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAbgQFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBQdDRUlMSU5HBA0kdDAxOTQ2MDE5NzY2AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBuBAUMYW1udEdldE5vRmVlBQRiYWxCCQBlAgUEYmFsQQUMYW1udEdldE5vRmVlBQdDRUlMSU5HCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEEJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE5NDYwMTk3NjYCXzEECmFzc2V0VG9QYXkIBQ0kdDAxOTQ2MDE5NzY2Al8yCQCUCgIFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5AQ1nZXRXWFN3YXBGZWVzAQRwb29sBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDnBvb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQScHJvdG9jb2xGZWVEZWZhdWx0CQEFdmFsdWUBCQCaCAIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEByRtYXRjaDAJAPwHBAUJZkNvbnRyYWN0AhJnZXRTd2FwRmVlUkVBRE9OTFkJAMwIAgkApQgBBQhwb29sQWRkcgUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIKKEludCwgSW50KQQEZmVlcwUHJG1hdGNoMAkAlAoCCAUEZmVlcwJfMQgFBGZlZXMCXzIJAJQKAgUOcG9vbEZlZURlZmF1bHQFEnByb3RvY29sRmVlRGVmYXVsdAEQZ2V0V1hQb29sUmV2ZXJzZQMIcG9vbEFkZHIHYXNzZXRJbghhc3NldE91dAQJZkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIEDGxwTm9uUmV2ZXJzZQoAAUAJAPwHBAUJZkNvbnRyYWN0AiBnZXRMcEFzc2V0RnJvbVBvb2xBc3NldHNSRUFET05MWQkAzAgCBQdhc3NldEluCQDMCAIFCGFzc2V0T3V0BQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQECWxwUmV2ZXJzZQoAAUAJAPwHBAUJZkNvbnRyYWN0AiBnZXRMcEFzc2V0RnJvbVBvb2xBc3NldHNSRUFET05MWQkAzAgCBQhhc3NldE91dAkAzAgCBQdhc3NldEluBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQDCQECIT0CBQxscE5vblJldmVyc2UFBHVuaXQHAwkBAiE9AgUJbHBSZXZlcnNlBQR1bml0BgkAAgECEVBvb2wgaXMgbm90IGV4aXN0AQ1jYWxjRmxhdFRvUGF5BwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQHYXNzZXRJbgMJAAACBQ9hc3NldFRva2VuVG9HZXQFCGFzc2V0SWRBBQhhc3NldElkQgUIYXNzZXRJZEEECGFtb3V0R2V0CgABQAkA/AcEBQ53eFN3YXBDb250cmFjdAIVc3dhcENhbGN1bGF0ZVJFQURPTkxZCQDMCAIFEGFtb3VudFRva2VuVG9HZXQJAMwIAgUHYXNzZXRJbgkAzAgCBQ9hc3NldFRva2VuVG9HZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQhhbW91dEdldAUIYW1vdXRHZXQDCQAAAgUIYW1vdXRHZXQFEGFtb3VudFRva2VuVG9HZXQJAJQKAgUHYXNzZXRJbgUQYW1vdW50VG9rZW5Ub0dldAQOYW1vdW50VG9QYXlNYXgEA2FQTQMJAGYCBRBhbW91bnRUb2tlblRvR2V0BQhhbW91dEdldAkAawMFEGFtb3VudFRva2VuVG9HZXQAbgBkCQBrAwUQYW1vdW50VG9rZW5Ub0dldABaAGQEDGFtb3VudEdldE1heAoAAUAJAPwHBAUOd3hTd2FwQ29udHJhY3QCFXN3YXBDYWxjdWxhdGVSRUFET05MWQkAzAgCBQNhUE0JAMwIAgUHYXNzZXRJbgkAzAgCBQ9hc3NldFRva2VuVG9HZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQxhbW91bnRHZXRNYXgFDGFtb3VudEdldE1heAMJAGYCBQhhbW91dEdldAUMYW1vdW50R2V0TWF4CQBrAwUDYVBNAG4AZAUDYVBNCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCgEDaGRtAgFhBWluZGV4BA0kdDAyMTgzMjIxODUzBQFhBANwYXkIBQ0kdDAyMTgzMjIxODUzAl8xBAZwYXlNYXgIBQ0kdDAyMTgzMjIxODUzAl8yBAdwYXlOZXh0CQBpAgkAZAIFA3BheQUGcGF5TWF4AAIEDWFtb3VudEdldE5leHQKAAFACQD8BwQFDnd4U3dhcENvbnRyYWN0AhVzd2FwQ2FsY3VsYXRlUkVBRE9OTFkJAMwIAgUHcGF5TmV4dAkAzAgCBQdhc3NldEluCQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDWFtb3VudEdldE5leHQFDWFtb3VudEdldE5leHQDCQBmAgUQYW1vdW50VG9rZW5Ub0dldAUNYW1vdW50R2V0TmV4dAkAlAoCBQdwYXlOZXh0BQZwYXlNYXgJAJQKAgUDcGF5BQdwYXlOZXh0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAxyZXNBbW50VG9QYXkKAAIkbAkAzAgCAAEJAMwIAgACBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFEGFtb3VudFRva2VuVG9HZXQFDmFtb3VudFRvUGF5TWF4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNoZG0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACBAthbW91bnRUb1BheQMJAGYCBRBhbW91bnRUb2tlblRvR2V0BQhhbW91dEdldAgFDHJlc0FtbnRUb1BheQJfMggFDHJlc0FtbnRUb1BheQJfMQkAlAoCBQdhc3NldEluBQthbW91bnRUb1BheQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgERY2FsY0Ftb3VudFRvUGF5V1gHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BA0kdDAyMjQ1MTIyNDkwCQENZ2V0V1hTd2FwRmVlcwEFBHBvb2wEBHBGZWUIBQ0kdDAyMjQ1MTIyNDkwAl8xBAVwckZlZQgFDSR0MDIyNDUxMjI0OTACXzIECHBvb2xUeXBlCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUJa1Bvb2xUeXBlBQRDUE1NBAhmZWVTY2FsZQkAtgIBAIDC1y8DCQAAAgUIcG9vbFR5cGUFBEZMQVQJAQ1jYWxjRmxhdFRvUGF5BwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQEDSR0MDIyNzIzMjMwMzEDCQAAAgUPYXNzZXRUb2tlblRvR2V0BQhhc3NldElkQQQLYW1vdW50VG9QYXkJAGsDBRBhbW91bnRUb2tlblRvR2V0BQRiYWxCCQBlAgUEYmFsQQUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEIEC2Ftb3VudFRvUGF5CQBrAwUQYW1vdW50VG9rZW5Ub0dldAUEYmFsQQkAZQIFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDIyNzIzMjMwMzECXzEECmFzc2V0VG9QYXkIBQ0kdDAyMjcyMzIzMDMxAl8yBBJhbW91bnRUb1BheVdpdGhGZWUJAKADAQkAvQIECQC2AgEFC2Ftb3VudFRvUGF5BQhmZWVTY2FsZQkAuAICBQhmZWVTY2FsZQkAtgIBCQBkAgUFcHJGZWUFBHBGZWUFB0NFSUxJTkcJAJQKAgUKYXNzZXRUb1BheQUSYW1vdW50VG9QYXlXaXRoRmVlARBleGNoYW5nZURpcmVjdGx5CAVwVHlwZQRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQGcG9vbEZCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCAAMDCQAAAgUFcFR5cGUFB1NGX1BPT0wGCQECIT0CBQZwb29sRkICAAQNJHQwMjM0NzIyMzY4NAMJAAACBQZwb29sRkICAAkAlQoDBQRiYWxBBQRiYWxCBQRwb29sBA0kdDAyMzU3ODIzNjUxCQERZ2V0U0ZQb29sQmFsYW5jZXMBCQERQGV4dHJOYXRpdmUoMTA2MikBBQZwb29sRkIEBnNmQmFsQQgFDSR0MDIzNTc4MjM2NTECXzEEBnNmQmFsQggFDSR0MDIzNTc4MjM2NTECXzIJAJUKAwUGc2ZCYWxBBQZzZkJhbEIFBnBvb2xGQgQFcEJhbEEIBQ0kdDAyMzQ3MjIzNjg0Al8xBAVwQmFsQggFDSR0MDIzNDcyMjM2ODQCXzIEBmV4UG9vbAgFDSR0MDIzNDcyMjM2ODQCXzMEDSR0MDIzNjg5MjM4MTUJARFjYWxjQW1vdW50VG9QYXlTRgcFBmV4UG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQVwQmFsQQUFcEJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDIzNjg5MjM4MTUCXzEEC2Ftb3VudFRvUGF5CAUNJHQwMjM2ODkyMzgxNQJfMgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQZleFBvb2wCDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIJAKQDAQUQYW1vdW50VG9rZW5Ub0dldAUDbmlsBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwDCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDI0MDE3MjQxMzkJARFjYWxjQW1vdW50VG9QYXlXWAcFBHBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUEYmFsQQUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMjQwMTcyNDEzOQJfMQQLYW1vdW50VG9QYXkIBQ0kdDAyNDAxNzI0MTM5Al8yCQD8BwQFDnd4U3dhcENvbnRyYWN0AgRzd2FwCQDMCAIFEGFtb3VudFRva2VuVG9HZXQJAMwIAgUPYXNzZXRUb2tlblRvR2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsCQEPdW5rbm93blBvb2xUeXBlAAEVZXhjaGFuZ2VEaXJlY3RseU5vTGltBQVwVHlwZQRwb29sDWFtb3VudFRva2VuRXgOYXNzZXRUb2tlblRvRXgPYXNzZXRUb2tlblRvR2V0BAliYWxCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFD2Fzc2V0VG9rZW5Ub0dldAMJAAACBQliYWxCZWZvcmUFCWJhbEJlZm9yZQQGcG9vbEZCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUXa0ZhbGxiYWNrRXhjaGFuZ2VTd29wZmkCAAQDaW52AwMJAAACBQVwVHlwZQUHU0ZfUE9PTAYJAQIhPQIFBnBvb2xGQgIABAZleFBvb2wDCQAAAgUGcG9vbEZCAgAFBHBvb2wFBnBvb2xGQgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQZleFBvb2wCDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAICATEFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQ5hc3NldFRva2VuVG9FeAUNYW1vdW50VG9rZW5FeAUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQFDnd4U3dhcENvbnRyYWN0AgRzd2FwCQDMCAIAAQkAzAgCBQ9hc3NldFRva2VuVG9HZXQJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFDmFzc2V0VG9rZW5Ub0V4BQ1hbW91bnRUb2tlbkV4BQNuaWwJAQ91bmtub3duUG9vbFR5cGUAAwkAAAIFA2ludgUDaW52BAhiYWxBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUPYXNzZXRUb2tlblRvR2V0AwkAAAIFCGJhbEFmdGVyBQhiYWxBZnRlcgkAZQIFCGJhbEFmdGVyBQliYWxCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAhwb29sQWRkcgVwVHlwZQdzaGFyZUlkD3VzZXJDYW5XaXRoZHJhdwQNJHQwMjUyNjgyNTczOQMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CgABQAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICEHdpdGhkcmF3UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDaW52BQNpbnYJAJQKAgoAAUAJAJEDAgUDaW52AAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQNpbnYAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkAtQkCCgABQAkA/AcEBQZ3eFJlc3QCF3Bvb2xFdmFsdWF0ZUdldFJFQURPTkxZCQDMCAIFB3NoYXJlSWQJAMwIAgUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fAwkAAAIFA2ludgUDaW52CQCUCgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2ludgACCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAQHYW1vdW50QQgFDSR0MDI1MjY4MjU3MzkCXzEEB2Ftb3VudEIIBQ0kdDAyNTI2ODI1NzM5Al8yCQCUCgIFB2Ftb3VudEEFB2Ftb3VudEIBC2NsYWltRmFybWVkAgVwVHlwZQRwb29sBAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIAAwkAAAIFBXBUeXBlBQdTRl9QT09MBAliYWxCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFBlNXT1BJRAMJAAACBQliYWxCZWZvcmUFCWJhbEJlZm9yZQQDaW52CQD8BwQJARBnZXRTRkZhcm1pbmdBZGRyAAIFY2xhaW0JAMwIAgUEcG9vbAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQJAJQKAgkAZQIFCGJhbEFmdGVyBQliYWxCZWZvcmUFBlNXT1BJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMjYxNzkyNjI1OAkBDWdldFdYUG9vbERhdGEBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBANhSWQIBQ0kdDAyNjE3OTI2MjU4Al8xBANiSWQIBQ0kdDAyNjE3OTI2MjU4Al8yBARhQmFsCAUNJHQwMjYxNzkyNjI1OAJfMwQEYkJhbAgFDSR0MDI2MTc5MjYyNTgCXzQEBGxwSWQIBQ0kdDAyNjE3OTI2MjU4Al81BAliYWxCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFBFdYSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUECGZhcm1BZGRyCQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEA2ludgMJAAACBQlwcm94eUFkZHICAAkA/AcEBQhmYXJtQWRkcgIHY2xhaW1XeAkAzAgCBQRscElkBQNuaWwFA25pbAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICDXd4Q2xhaW1GYXJtZWQJAMwIAgkApQgBBQhmYXJtQWRkcgkAzAgCBQRscElkBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFBFdYSUQJAJQKAgkAZQIFCGJhbEFmdGVyBQliYWxCZWZvcmUFBFdYSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUAAQ9yZXBsZW5pc2hCeVR5cGULBXBUeXBlBHBvb2wHZmVlVHlwZQRwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIETFBJZAtzdGFrZU1hcmtldAQPbHBCYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQDCQAAAgUPbHBCYWxhbmNlQmVmb3JlBQ9scEJhbGFuY2VCZWZvcmUECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBA0kdDAyNzA2MzI3NDkxAwMJAGYCBQRwbXRBAAAJAGYCBQRwbXRCAAAHBA0kdDAyNzEyOTI3MjUxCQEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCQUFcFR5cGUFCHBvb2xBZGRyBQRMUElkBQRwbXRBBQNhSWQFBHBtdEIFA2JJZAUEYmFsQQUEYmFsQgQGcG10SW5BCAUNJHQwMjcxMjkyNzI1MQJfMQQGcG10SW5CCAUNJHQwMjcxMjkyNzI1MQJfMgQGY2hhbmdlCAUNJHQwMjcxMjkyNzI1MQJfMwQIY2hhbmdlSWQIBQ0kdDAyNzEyOTI3MjUxAl80BANpbnYJARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUHBQhwb29sQWRkcgUFcFR5cGUFBnBtdEluQQUDYUlkBQZwbXRJbkIFA2JJZAUETFBJZAMJAAACBQNpbnYFA2ludgkAlAoCBQZjaGFuZ2UFCGNoYW5nZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAZgIFBHBtdEEAAAkAlAoCBQRwbXRBBQNhSWQDCQBmAgUEcG10QgAACQCUCgIFBHBtdEIFA2JJZAkAAgECEHBtdHMgbXVzdCBiZSA+IDAEBmNoYW5nZQgFDSR0MDI3MDYzMjc0OTECXzEECGNoYW5nZUlkCAUNJHQwMjcwNjMyNzQ5MQJfMgQDaW52AwkAZgIFBmNoYW5nZQAACQEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUFBQhwb29sQWRkcgUFcFR5cGUFBmNoYW5nZQUIY2hhbmdlSWQFBExQSWQFA25pbAMJAAACBQNpbnYFA2ludgQObHBCYWxhbmNlQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAQLdG90YWxTdGFrZWQJAGUCBQ5scEJhbGFuY2VBZnRlcgUPbHBCYWxhbmNlQmVmb3JlBA1heGx5RmVlQW1vdW50CQBrAwULdG90YWxTdGFrZWQJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgQRdXNlclNoYXJlRm9yU3Rha2UJAGUCBQt0b3RhbFN0YWtlZAUNYXhseUZlZUFtb3VudAMJAGcCAAAFEXVzZXJTaGFyZUZvclN0YWtlCQACAQIoYW1vdW50IG9mIHN0YWtlZCBzaGFyZXRva2VucyBtdXN0IGJlID4gMAQFaW52TFAJAQdzdGFrZUxQBQUEcG9vbAUFcFR5cGUFBExQSWQFEXVzZXJTaGFyZUZvclN0YWtlBQtzdGFrZU1hcmtldAMJAAACBQVpbnZMUAUFaW52TFAJAJQKAgURdXNlclNoYXJlRm9yU3Rha2UFDWF4bHlGZWVBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEHJlcGxlbmlzaEVudHJpZXMJBHBvb2wEdXNlcgxzdGFrZWRBbW91bnQNYXhseUZlZUFtb3VudAZwb3NOdW0Hc2hhcmVJZAR0eXBlCHdpdGhMb2FuDXN0YWtlVG9NYXJrZXQEC3RvdGFsQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBA90b3RhbEFtb3VudExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQRdG90YWxBbW91bnRNYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEFXRvdGFsQW1vdW50TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuAAAEEnBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQQcG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEGHBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFGWtQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4AAAQWcG9vbEludGVyZXN0TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAAAEDSR0MDI4OTUyMjk3NzcDBQh3aXRoTG9hbgMFDXN0YWtlVG9NYXJrZXQJAJQKAgUWcG9vbEludGVyZXN0TWFya2V0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0CQBkAgURdG90YWxBbW91bnRNYXJrZXQFDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgkAZAIFFXRvdGFsQW1vdW50TWFya2V0TG9hbgUMc3Rha2VkQW1vdW50CQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FFmtVc2VyUG9zaXRpb25JblBNYXJrZXQGBQNuaWwJAJQKAgUQcG9vbEludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZAIFD3RvdGFsQW1vdW50TG9hbgUMc3Rha2VkQW1vdW50BQNuaWwDBQ1zdGFrZVRvTWFya2V0CQCUCgIFGHBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0CQBkAgURdG90YWxBbW91bnRNYXJrZXQFDHN0YWtlZEFtb3VudAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BgUDbmlsCQCUCgIFEnBvb2xJbnRlcmVzdE5vTG9hbgUDbmlsBA9jdXJQb29sSW50ZXJlc3QIBQ0kdDAyODk1MjI5Nzc3Al8xBAdhZEVudHJ5CAUNJHQwMjg5NTIyOTc3NwJfMgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBQt0b3RhbEFtb3VudAUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FDWtVc2VyUG9zaXRpb24FDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QFD2N1clBvb2xJbnRlcmVzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBnBvc051bQURa1VzZXJQb3NpdGlvblBvb2wFBHBvb2wJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQUGcG9zTnVtCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQ1heGx5RmVlQW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAUHYWRFbnRyeQEJbGlzdFRvSW50AgFhBGl0ZW0JAM0IAgUBYQkBDXBhcnNlSW50VmFsdWUBBQRpdGVtARBkaXJlY3RTd29wZmlDUE1NAgVyQXJncwd0b2tlblRvBARkQXBwCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBXJBcmdzAAEEBHBtdFAJALUJAgkAkQMCBQVyQXJncwACAgF8BBJ0b2tlbkJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3Rva2VuVG8DCQAAAgUSdG9rZW5CYWxhbmNlQmVmb3JlBRJ0b2tlbkJhbGFuY2VCZWZvcmUEA3BtdAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQkAkQMCBQRwbXRQAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRwbXRQAAEFA25pbAQLbWluVG9SZWNpdmUJAJEDAgUFckFyZ3MAAwQDaW52CQD8BwQFBGRBcHACDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIFC21pblRvUmVjaXZlBQNuaWwFA25pbAUDcG10AwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARNkaXJlY3RSb3V0aW5nU3dvcGZpAgVyQXJncwd0b2tlblRvBARkQXBwCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBXJBcmdzAAEEEnRva2VuQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwMJAAACBRJ0b2tlbkJhbGFuY2VCZWZvcmUFEnRva2VuQmFsYW5jZUJlZm9yZQQDcG10BARwbXRQCQC1CQIJAJEDAgUFckFyZ3MAAgIBfAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBCQCRAwIFBHBtdFAAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBHBtdFAAAQUDbmlsBARhcmdzBAVlQXJncwkAtQkCCQCRAwIFBXJBcmdzAAMCAXwECmV4Y2hhbmdlcnMJALUJAgkAkQMCBQVlQXJncwAAAgEsBA5leGNoYW5nZXJzVHlwZQkAtQkCCQCRAwIFBWVBcmdzAAECASwEBWFyZ3MxCgACJGwJALUJAgkAkQMCBQVlQXJncwACAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlsaXN0VG9JbnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMEBWFyZ3MyCgACJGwJALUJAgkAkQMCBQVlQXJncwADAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlsaXN0VG9JbnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDMJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMEEXJvdXRpbmdBc3NldHNLZXlzCQC1CQIJAJEDAgUFZUFyZ3MABAIBLAQLbWluVG9SZWNpdmUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVlQXJncwAFCQDMCAIFCmV4Y2hhbmdlcnMJAMwIAgUOZXhjaGFuZ2Vyc1R5cGUJAMwIAgUFYXJnczEJAMwIAgUFYXJnczIJAMwIAgURcm91dGluZ0Fzc2V0c0tleXMJAMwIAgULbWluVG9SZWNpdmUFA25pbAQDaW52CQD8BwQFBGRBcHACDHJvdXRpbmdUcmFkZQUEYXJncwUDcG10AwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9rZW5UbwUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQpjYXBpdGFsaXplCQRwb29sBXBUeXBlB3Rva2VuSWQLdG9rZW5BbW91bnQDQUlkA0JJZARiYWxBBGJhbEIHc2hhcmVJZAMDCQECIT0CBQd0b2tlbklkBQNBSWQJAQIhPQIFB3Rva2VuSWQFA0JJZAcJAAIBAgtXcm9uZyBhc3NldAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAMJAAACBRB0b3RhbFNoYXJlQW1vdW50AAAJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULdG9rZW5BbW91bnQJANkEAQUHdG9rZW5JZAUDbmlsAAAEGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBBF0b3RhbE1hcmtldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAMJAGYCAAAJAGUCCQBlAgUQdG90YWxTaGFyZUFtb3VudAURdG90YWxNYXJrZXRBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgkAAgECQ0Vycm9yIHdpdGggc2hhcmUgYW1vdW50IHRvdGFsU2hhcmVBbW91bnQgPCB0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4EC2xvYW5QZXJjZW50CQBrAwUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQZTQ0FMRTgJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRF0b3RhbE1hcmtldEFtb3VudAQQdG9rZW5zRm9yRmVlTG9hbgkAawMFC3Rva2VuQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BBJ0b2tlbnNGb3JGZWVOb0xvYW4JAGUCBQt0b2tlbkFtb3VudAUQdG9rZW5zRm9yRmVlTG9hbgQLYXhseUZlZUxvYW4JAGsDBRB0b2tlbnNGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQNYXhseUZlZU5vTG9hbgkAawMFEnRva2Vuc0ZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEB2F4bHlGZWUJAGQCBQtheGx5RmVlTG9hbgUNYXhseUZlZU5vTG9hbgQNJHQwMzI4NTUzMjk1NQMJAAACBQd0b2tlbklkBQNBSWQJAJQKAgkAZQIFC3Rva2VuQW1vdW50BQdheGx5RmVlAAAJAJQKAgAACQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUEBHBtdEEIBQ0kdDAzMjg1NTMyOTU1Al8xBARwbXRCCAUNJHQwMzI4NTUzMjk1NQJfMgQNJHQwMzI5NTgzMzA2OQkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQZOT19GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBwQMc3Rha2VkQW1vdW50CAUNJHQwMzI5NTgzMzA2OQJfMQQCbmYIBQ0kdDAzMjk1ODMzMDY5Al8yBBNjdXJQb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABApzdGFrZWRMb2FuCQBrAwUMc3Rha2VkQW1vdW50BQtsb2FuUGVyY2VudAUGU0NBTEU4BAxzdGFrZWROb0xvYW4JAGUCBQxzdGFrZWRBbW91bnQFCnN0YWtlZExvYW4ED25ld0ludGVyZXN0TG9hbgMJAGYCBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFE2N1clBvb2xJbnRlcmVzdExvYW4JAGsDBQpzdGFrZWRMb2FuBQdTQ0FMRTEwBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAQRbmV3SW50ZXJlc3ROb0xvYW4DCQBmAgkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQBkAgUVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQBrAwUMc3Rha2VkTm9Mb2FuBQdTQ0FMRTEwCQBlAgUQdG90YWxTaGFyZUFtb3VudAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgUPbmV3SW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FEW5ld0ludGVyZXN0Tm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBkAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQpzdGFrZWRMb2FuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQdheGx5RmVlCQEOYXNzZXRJZEZyb21TdHIBBQd0b2tlbklkBQNuaWwFDHN0YWtlZEFtb3VudAEWY2FwaXRhbGl6ZVB1enpsZU1hcmtldAMEcG9vbAVwVHlwZQdzaGFyZUlkBBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBA1tYXJrZXRCYWxhbmNlCQDwBwIFC3BNYXJrZXRBZGRyCQDZBAEFB3NoYXJlSWQDCQAAAgUNbWFya2V0QmFsYW5jZQUNbWFya2V0QmFsYW5jZQQPbWFya2V0QXZhaWxhYmxlCgABQAkA/AcEBQ9wTWFya2V0UmVzdEFkZHICHGFzc2V0U3VwcGx5QnlBZGRyZXNzUkVBRE9OTFkJAMwIAgkApQgBBQtwTWFya2V0QWRkcgkAzAgCBQdzaGFyZUlkCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFD21hcmtldEF2YWlsYWJsZQUPbWFya2V0QXZhaWxhYmxlBBF0b3RhbE1hcmtldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEGtQb29sVG90YWxNYXJrZXQAAAQZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtQb29sVG90YWxNYXJrZXRMb2FuAAADAwkAAAIFEXRvdGFsTWFya2V0QW1vdW50AAAJAGYCBQ9tYXJrZXRBdmFpbGFibGUAAAcEDnVuc3Rha2VkQW1vdW50CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD21hcmtldEF2YWlsYWJsZQYDCQAAAgUOdW5zdGFrZWRBbW91bnQFDnVuc3Rha2VkQW1vdW50AwkAZgIFDW1hcmtldEJhbGFuY2UFDnVuc3Rha2VkQW1vdW50CQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDnVuc3Rha2VkQW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAAACQCUCgIFA25pbAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAljYXBBbW91bnQJAGUCBQ9tYXJrZXRBdmFpbGFibGUFEXRvdGFsTWFya2V0QW1vdW50AwkAZwIAAAUJY2FwQW1vdW50CQCUCgIFA25pbAAABBFtYXJrZXRMb2FuUGVyY2VudAkAawMFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4FBlNDQUxFOAURdG90YWxNYXJrZXRBbW91bnQEFnRva2Vuc01hcmtldEZvckZlZUxvYW4JAGsDBQljYXBBbW91bnQFEW1hcmtldExvYW5QZXJjZW50BQZTQ0FMRTgEG3Rva2Vuc01hcmtldEZvckZvckZlZU5vTG9hbgkAZQIFCWNhcEFtb3VudAUWdG9rZW5zTWFya2V0Rm9yRmVlTG9hbgQRYXhseU1hcmtldEZlZUxvYW4JAGsDBRZ0b2tlbnNNYXJrZXRGb3JGZWVMb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFDENBUF9GRUVfTE9BTgUKRkVFX1NDQUxFNgQTYXhseU1hcmtldEZlZU5vTG9hbgkAawMFG3Rva2Vuc01hcmtldEZvckZvckZlZU5vTG9hbgkBCmdldEF4bHlGZWUCBQRwb29sBQ9DQVBfRkVFX05PX0xPQU4FCkZFRV9TQ0FMRTYEDWF4bHlNYXJrZXRGZWUJAGQCBRFheGx5TWFya2V0RmVlTG9hbgUTYXhseU1hcmtldEZlZU5vTG9hbgMJAGYCBQ1heGx5TWFya2V0RmVlBQ1tYXJrZXRCYWxhbmNlCQCUCgIFA25pbAAABBJzdGFrZWRNYXJrZXRBbW91bnQJAGUCBQljYXBBbW91bnQFDWF4bHlNYXJrZXRGZWUEEHN0YWtlZE1hcmtldExvYW4JAGsDBRJzdGFrZWRNYXJrZXRBbW91bnQFEW1hcmtldExvYW5QZXJjZW50BQZTQ0FMRTgEEnN0YWtlZE1hcmtldE5vTG9hbgkAZQIFEnN0YWtlZE1hcmtldEFtb3VudAUQc3Rha2VkTWFya2V0TG9hbgQZY3VyUG9vbEludGVyZXN0TWFya2V0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFF2tQb29sSW50ZXJlc3RNYXJrZXRMb2FuAAAEG2N1clBvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFGWtQb29sSW50ZXJlc3RNYXJrZXROb0xvYW4AAAQVbmV3SW50ZXJlc3RNYXJrZXRMb2FuAwkAZgIFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAkAZAIFGWN1clBvb2xJbnRlcmVzdE1hcmtldExvYW4JAGsDBRBzdGFrZWRNYXJrZXRMb2FuBQdTQ0FMRTEwBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuAAAEF25ld0ludGVyZXN0TWFya2V0Tm9Mb2FuAwkAZgIJAGUCBRF0b3RhbE1hcmtldEFtb3VudAUZdG90YWxNYXJrZXRBbW91bnRXaXRoTG9hbgAACQBkAgUbY3VyUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQBrAwUSc3Rha2VkTWFya2V0Tm9Mb2FuBQdTQ0FMRTEwCQBlAgURdG90YWxNYXJrZXRBbW91bnQFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4AAAQOdW5zdGFrZWRBbW91bnQJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUNYXhseU1hcmtldEZlZQYDCQAAAgUOdW5zdGFrZWRBbW91bnQFDnVuc3Rha2VkQW1vdW50CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4FFW5ld0ludGVyZXN0TWFya2V0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRlrUG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuBRduZXdJbnRlcmVzdE1hcmtldE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0CQBkAgURdG90YWxNYXJrZXRBbW91bnQFEnN0YWtlZE1hcmtldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgkAZAIFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4FEHN0YWtlZE1hcmtldExvYW4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDWF4bHlNYXJrZXRGZWUJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFA25pbAUSc3Rha2VkTWFya2V0QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMFBHVzZXIEcG9vbAVwb3NJZAhib3Jyb3dlZAtpc01hcmtldFBvcwQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQMdXNlckludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAQScG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABBBwb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQYcG9vbEludGVyZXN0TWFya2V0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUZa1Bvb2xJbnRlcmVzdE1hcmtldE5vTG9hbgAABBZwb29sSW50ZXJlc3RNYXJrZXRMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUXa1Bvb2xJbnRlcmVzdE1hcmtldExvYW4AAAQMcG9vbEludGVyZXN0AwUIYm9ycm93ZWQDBQtpc01hcmtldFBvcwUWcG9vbEludGVyZXN0TWFya2V0TG9hbgUQcG9vbEludGVyZXN0TG9hbgMFC2lzTWFya2V0UG9zBRhwb29sSW50ZXJlc3RNYXJrZXROb0xvYW4FEnBvb2xJbnRlcmVzdE5vTG9hbgkAZAIFB3BBbW91bnQJAGsDBQdwQW1vdW50CQBlAgUMcG9vbEludGVyZXN0BQx1c2VySW50ZXJlc3QFB1NDQUxFMTABD2NhbGNTdG9wTG9zc0ZlZQQEcG9vbAppc0JvcnJvd2VkCHN0b3BMb3NzCmxwV2l0aGRyYXcEB2ZlZVR5cGUDBQppc0JvcnJvd2VkBQ1TVE9QTE9TU19MT0FOBRRTVE9QTE9TU19GRUVfTk9fTE9BTgMFCHN0b3BMb3NzCQBrAwUKbHBXaXRoZHJhdwkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2AAABDndpdGhkcmF3VG9Vc2VyBQR1c2VyBHBvb2wFcG9zSWQIc3RvcExvc3MNd2l0aGRyYXdUb2tlbgQHcEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgIQVW5rbm93biBwb3NpdGlvbgQKZnJvbU1hcmtldAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFmtVc2VyUG9zaXRpb25JblBNYXJrZXQHBAppc0JvcnJvd2VkCQBmAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AAAAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQUEdXNlcgUEcG9vbAUFcG9zSWQFCmlzQm9ycm93ZWQFCmZyb21NYXJrZXQEDnBvb2xUb3RhbFNoYXJlCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBJwb29sVG90YWxTaGFyZUxvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQRdG90YWxNYXJrZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0AAAEGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgAABAh1c2VyQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHVzZXIECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAgxVbmtub3duIHBvb2wEDSR0MDM5MTIzMzkxOTUJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQGaWRBU3RyCAUNJHQwMzkxMjMzOTE5NQJfMQQGaWRCU3RyCAUNJHQwMzkxMjMzOTE5NQJfMgQEYmFsQQgFDSR0MDM5MTIzMzkxOTUCXzMEBGJhbEIIBQ0kdDAzOTEyMzM5MTk1Al80BAdzaGFyZUlkCAUNJHQwMzkxMjMzOTE5NQJfNQQNJHQwMzkxOTgzOTI2NQkAlAoCCQEOYXNzZXRJZEZyb21TdHIBBQZpZEFTdHIJAQ5hc3NldElkRnJvbVN0cgEFBmlkQlN0cgQDaWRBCAUNJHQwMzkxOTgzOTI2NQJfMQQDaWRCCAUNJHQwMzkxOTgzOTI2NQJfMgQLc3RvcExvc3NGZWUJAQ9jYWxjU3RvcExvc3NGZWUEBQRwb29sBQppc0JvcnJvd2VkBQhzdG9wTG9zcwUPdXNlckNhbldpdGhkcmF3BAlwcm94eUFkZHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABAtjQmFsQUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFC2NCYWxBQmVmb3JlBQtjQmFsQUJlZm9yZQQLY0JhbEJCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQtjQmFsQkJlZm9yZQULY0JhbEJCZWZvcmUEA2ludgMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CQEJdW5zdGFrZUxQBQUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFC3N0b3BMb3NzRmVlBQpmcm9tTWFya2V0AwkAAAIFA2ludgUDaW52CQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEJAGUCBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlBQNuaWwFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAkAZAIFD3VzZXJDYW5XaXRoZHJhdwULc3RvcExvc3NGZWUFCmZyb21NYXJrZXQDCQAAAgUDaW52BQNpbnYDCQAAAgUJcHJveHlBZGRyAgAJAPwHBAUIcG9vbEFkZHICA2dldAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQlwcm94eUFkZHICE3d4V2l0aGRyYXdUd29Ub2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZpZEFTdHIJAMwIAgUGaWRCU3RyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDA0MDI3MzQwMzYyCQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwNDAyNzM0MDM2MgJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDQwMjczNDAzNjICXzIEDSR0MDQwMzY1NDE2MTADBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAkAzAgCBQdzaGFyZUlkBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFC2JvcnJvd0Fzc2V0BQRkZWJ0BQNuaWwAAAMJAAACBQtjbG9zZURidEludgULY2xvc2VEYnRJbnYDCQAAAgULYm9ycm93QXNzZXQFBmlkQVN0cgkAlAoCCQBlAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUFBGRlYnQJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlCQCUCgIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlCQBlAgkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUFBGRlYnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUNdG9rZW5zQW1vdW50QQUNdG9rZW5zQW1vdW50QgQHdG9Vc2VyQQgFDSR0MDQwMzY1NDE2MTACXzEEB3RvVXNlckIIBQ0kdDA0MDM2NTQxNjEwAl8yBBRwb29sVG90YWxMb2FuRW50cmllcwMFCmlzQm9ycm93ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCBRJwb29sVG90YWxTaGFyZUxvYW4FD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwEFnBvb2xUb3RhbE1hcmtldEVudHJpZXMDBQpmcm9tTWFya2V0CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAkAZQIFEXRvdGFsTWFya2V0QW1vdW50BQ91c2VyQ2FuV2l0aGRyYXcFA25pbAMFCmlzQm9ycm93ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4JAGUCBRl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwEDSR0MDQyMDIzNDI0MTgDAwkAAAIFDXdpdGhkcmF3VG9rZW4FBmlkQVN0cgkAZgIFB3RvVXNlckIAAAcEBmFtdEdldAkBFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFBXBUeXBlBQRwb29sBQd0b1VzZXJCBQZpZEJTdHIFBmlkQVN0cgMJAAACBQZhbXRHZXQFBmFtdEdldAkAlAoCCQBkAgUHdG9Vc2VyQQUGYW10R2V0AAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DAwkAAAIFDXdpdGhkcmF3VG9rZW4FBmlkQlN0cgkAZgIFB3RvVXNlckEAAAcEBmFtdEdldAkBFWV4Y2hhbmdlRGlyZWN0bHlOb0xpbQUFBXBUeXBlBQRwb29sBQd0b1VzZXJBBQZpZEFTdHIFBmlkQlN0cgMJAAACBQZhbXRHZXQFBmFtdEdldAkAlAoCAAAJAGQCBQd0b1VzZXJCBQZhbXRHZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUHdG9Vc2VyQQUHdG9Vc2VyQgQLdG9Vc2VyQUNhbGMIBQ0kdDA0MjAyMzQyNDE4Al8xBAt0b1VzZXJCQ2FsYwgFDSR0MDQyMDIzNDI0MTgCXzIEB2VudHJpZXMJAM4IAgkAzggCCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkBRFrVXNlclBvc2l0aW9uUG9vbAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUSa1VzZXJCb3Jyb3dBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUWa1VzZXJQb3NpdGlvbkluUE1hcmtldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgUOcG9vbFRvdGFsU2hhcmUFD3VzZXJDYW5XaXRoZHJhdwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgULdG9Vc2VyQUNhbGMFA2lkQQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgULdG9Vc2VyQkNhbGMFA2lkQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULc3RvcExvc3NGZWUJANkEAQUHc2hhcmVJZAUDbmlsBRRwb29sVG90YWxMb2FuRW50cmllcwUWcG9vbFRvdGFsTWFya2V0RW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAkAlAoCBQdlbnRyaWVzCQDMCAIFC3RvVXNlckFDYWxjCQDMCAIFC3RvVXNlckJDYWxjBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGxpcXVpZGF0ZVBvcwQGY2FsbGVyBHVzZXIFcG9zSWQHbEFtb3VudAQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkBRFrVXNlclBvc2l0aW9uUG9vbAILbm8gcG9zaXRpb24EDGJvcnJvd0Ftb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQCHFRoZXJlIGFyZSBubyBib3Jyb3cgcG9zaXRpb24EB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24ECmZyb21NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BwQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQUEdXNlcgUEcG9vbAUFcG9zSWQGBQpmcm9tTWFya2V0BA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQScG9vbFRvdGFsU2hhcmVMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEEXRvdGFsTWFya2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUQa1Bvb2xUb3RhbE1hcmtldAAABBl0b3RhbE1hcmtldEFtb3VudFdpdGhMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUUa1Bvb2xUb3RhbE1hcmtldExvYW4AAAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDA0NDM0MzQ0NDE1CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDQ0MzQzNDQ0MTUCXzEEBmlkQlN0cggFDSR0MDQ0MzQzNDQ0MTUCXzIEBGJhbEEIBQ0kdDA0NDM0MzQ0NDE1Al8zBARiYWxCCAUNJHQwNDQzNDM0NDQxNQJfNAQHc2hhcmVJZAgFDSR0MDQ0MzQzNDQ0MTUCXzUEDSR0MDQ0NDE4NDQ0ODUJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDQ0NDE4NDQ0ODUCXzEEA2lkQggFDSR0MDQ0NDE4NDQ0ODUCXzIECXByb3h5QWRkcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sUHJveHlBZGRyAgAEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQQcG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEFnBvb2xJbnRlcmVzdE1hcmtldExvYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRdrUG9vbEludGVyZXN0TWFya2V0TG9hbgAAAwkAAAIFDGJvcnJvd0Ftb3VudAAACQACAQIrWW91IGNhbid0IGxpcXVpZGF0ZSBwb3NpdGlvbiB3aXRob3V0IGJvcnJvdwQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAgh3aXRoZHJhdwkAzAgCCQDMCAIJAKQDAQUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MBANpbnYJAQl1bnN0YWtlTFAFBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQpmcm9tTWFya2V0AwkAAAIFA2ludgUDaW52AwkAAAIFCXByb3h5QWRkcgIACQD8BwQFCHBvb2xBZGRyAgNnZXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BQNuaWwJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUJcHJveHlBZGRyAhN3eFdpdGhkcmF3VHdvVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgUGaWRBU3RyCQDMCAIFBmlkQlN0cgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBD3Vua25vd25Qb29sVHlwZQADCQAAAgUDaW52BQNpbnYECmNCYWxBQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQpjQmFsQUFmdGVyBQpjQmFsQUFmdGVyBApjQmFsQkFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgUKY0JhbEJBZnRlcgUKY0JhbEJBZnRlcgQNJHQwNDU2Njk0NTc1OAkAlAoCCQBlAgUKY0JhbEFBZnRlcgULY0JhbEFCZWZvcmUJAGUCBQpjQmFsQkFmdGVyBQtjQmFsQkJlZm9yZQQNdG9rZW5zQW1vdW50QQgFDSR0MDQ1NjY5NDU3NTgCXzEEDXRva2Vuc0Ftb3VudEIIBQ0kdDA0NTY2OTQ1NzU4Al8yBA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QQcJAGUCBQdsQW1vdW50BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUHbEFtb3VudAUNdG9rZW5zQW1vdW50QgcJAGUCBQdsQW1vdW50BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQNJHQwNDYyNjQ0NjQ5MQMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQCUCgIJAGUCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQUHbEFtb3VudAkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUJAJQKAgkAZQIFD2NCYWxBQWZ0ZXJSZXBheQULY0JhbEFCZWZvcmUJAGUCCQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQUHbEFtb3VudAQHdG9Vc2VyQQgFDSR0MDQ2MjY0NDY0OTECXzEEB3RvVXNlckIIBQ0kdDA0NjI2NDQ2NDkxAl8yBA0kdDA0NjQ5NDQ2NTcxCQEPZ2V0UG9vbEJhbGFuY2VzBAUIcG9vbEFkZHIFBXBUeXBlBQZpZEFTdHIFBmlkQlN0cgQJYmFsQUFmdGVyCAUNJHQwNDY0OTQ0NjU3MQJfMQQJYmFsQkFmdGVyCAUNJHQwNDY0OTQ0NjU3MQJfMgQNJHQwNDY1NzQ0NjcwNQkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQZOT19GRUUFB3RvVXNlckEFBmlkQVN0cgUHdG9Vc2VyQgUGaWRCU3RyBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQpmcm9tTWFya2V0BAp1c2VyU3Rha2VkCAUNJHQwNDY1NzQ0NjcwNQJfMQQHYXhseUZlZQgFDSR0MDQ2NTc0NDY3MDUCXzIED3VzZXJMcExpcXVkYXRlZAkAZQIFD3VzZXJDYW5XaXRoZHJhdwUKdXNlclN0YWtlZAQNJHQwNDY3NjQ0NzEwOQMFCmZyb21NYXJrZXQJAJQKAgUWcG9vbEludGVyZXN0TWFya2V0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRBrUG9vbFRvdGFsTWFya2V0CQBlAgURdG90YWxNYXJrZXRBbW91bnQFD3VzZXJMcExpcXVkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrUG9vbFRvdGFsTWFya2V0TG9hbgkAZQIFGXRvdGFsTWFya2V0QW1vdW50V2l0aExvYW4FD3VzZXJMcExpcXVkYXRlZAUDbmlsCQCUCgIFEHBvb2xJbnRlcmVzdExvYW4FA25pbAQPY3VyUG9vbEludGVyZXN0CAUNJHQwNDY3NjQ0NzEwOQJfMQQWcG9vbFRvdGFsTWFya2V0RW50cmllcwgFDSR0MDQ2NzY0NDcxMDkCXzIJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyTHBMaXF1ZGF0ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCBRJwb29sVG90YWxTaGFyZUxvYW4FD3VzZXJMcExpcXVkYXRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQBlAgUHcEFtb3VudAUPdXNlckxwTGlxdWRhdGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAUPY3VyUG9vbEludGVyZXN0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUHbEFtb3VudAkBDmFzc2V0SWRGcm9tU3RyAQULYm9ycm93QXNzZXQFA25pbAUWcG9vbFRvdGFsTWFya2V0RW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAUPdXNlckxwTGlxdWRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxwYXJzZVJlcXVlc3QBCXJlcXVlc3RJZAQHcmVxdWVzdAkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQJAKwCAgITTm8gcmVxdWVzdCB3aXRoIGlkIAUJcmVxdWVzdElkAgEsBAR1c2VyCQCRAwIFB3JlcXVlc3QAAAQEcG9vbAkAkQMCBQdyZXF1ZXN0AAEEBHBtdEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAIEA0FJZAkAkQMCBQdyZXF1ZXN0AAMEBHBtdEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAQEA0JJZAkAkQMCBQdyZXF1ZXN0AAUEBGJhbEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAYEBGJhbEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAcEB3NoYXJlSWQJAJEDAgUHcmVxdWVzdAAIBAdid0Fzc2V0CQCRAwIFB3JlcXVlc3QACQQIYndBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAoEDXN0YWtlVG9NYXJrZXQJAAACCQCRAwIFB3JlcXVlc3QACwIEdHJ1ZQkAngoMBQR1c2VyBQRwb29sBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAUHYndBc3NldAUIYndBbW91bnQFDXN0YWtlVG9NYXJrZXQBEGNhbGNCb3Jyb3dBbW91bnQIBHBtdEEEcG10QgRiYWxBBGJhbEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAQMcHJpY2VPcmFjbGVBCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNhSWQFDmtQcmljZUluT3JhY2xlAP///////////wEEDHByaWNlT3JhY2xlQgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYklkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BAwMJAQIhPQIFCGJvcnJvd0lkBQNhSWQJAQIhPQIFCGJvcnJvd0lkBQNiSWQHCQACAQISV3JvbmcgYm9ycm93IGFzc2V0AwMJAAACBQxwcmljZU9yYWNsZUEA////////////AQkAAAIFDHByaWNlT3JhY2xlQgD///////////8BBwkAAgECM0Nhbid0IGNhbGMgZGVwb3NpdCBwcmljZSwgbm8gdG9rZW4gcHJpY2VzIGluIG9yYWNsZQQGZGVjUHJBCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYUlkAAAAAAUERE9XTgQGZGVjUHJCCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUDYklkAAAAAAUERE9XTgQHZFByaWNlQQMJAQIhPQIFDHByaWNlT3JhY2xlQQD///////////8BBQxwcmljZU9yYWNsZUEJAGsDCQBrAwUEYmFsQgUGZGVjUHJBBQRiYWxBBQxwcmljZU9yYWNsZUIFBmRlY1ByQgQHZFByaWNlQgMJAQIhPQIFDHByaWNlT3JhY2xlQgD///////////8BBQxwcmljZU9yYWNsZUIJAGsDCQBrAwUEYmFsQQUGZGVjUHJCBQRiYWxCBQxwcmljZU9yYWNsZUEFBmRlY1ByQQQMcGF5ZEluRG9sbGFyCQBkAgkAawMFB2RQcmljZUEFBHBtdEEFBmRlY1ByQQkAawMFB2RQcmljZUIFBHBtdEIFBmRlY1ByQgQNJHQwNDkyNTM0OTM1MAMJAAACBQhib3Jyb3dJZAUDYUlkCQCUCgIFB2RQcmljZUEFBmRlY1ByQQkAlAoCBQdkUHJpY2VCBQZkZWNQckIEC2JvcnJvd1ByaWNlCAUNJHQwNDkyNTM0OTM1MAJfMQQLYm9ycm93RGVjUHIIBQ0kdDA0OTI1MzQ5MzUwAl8yCQBrAwkAawMFDHBheWRJbkRvbGxhcgkAZQIFCGxldmVyYWdlAGQAZAULYm9ycm93RGVjUHIFC2JvcnJvd1ByaWNlARJwYXJzZVJlcGxlbmlzaFBtdHMDBHBtdHMDQUlkA0JJZAMJAAACCQCQAwEFBHBtdHMAAgMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBBAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAQdhc3NldElkBQNCSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEIJAJQKAggJAJEDAgUEcG10cwAABmFtb3VudAgJAJEDAgUEcG10cwABBmFtb3VudAMJAAACCQCQAwEFBHBtdHMAAQMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0FJZAkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50AAADCQAAAgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNCSWQJAJQKAgAACAkAkQMCBQRwbXRzAAAGYW1vdW50CQACAQINV3JvbmcgcGF5bWVudAkAAgECHE9uZSBvciB0d28gcGF5bWVudHMgZXhwZWN0ZWQBD2NhbGNQcmljZUltcGFjdAQEYmFsQQRiYWxCB25ld0JhbEEHbmV3QmFsQgQDcHJpCQBoAgkAZQIFBlNDQUxFOAkAawMJAGsDBQRiYWxCBQZTQ0FMRTgFBGJhbEEFBlNDQUxFOAkAawMFB25ld0JhbEIFBlNDQUxFOAUHbmV3QmFsQQBkAwkAZgIAAAUDcHJpCQBoAgUDcHJpAP///////////wEFA3ByaQERY2xhaW1BbmRDaGVja0FtbnQFBHBvb2wFcFR5cGUFY2xhaW0QYW1vdW50VG9FeGNoYW5nZRFhbW91bnRGcm9tQmFsYW5jZQQNJHQwNTAzNzE1MTIyMgMFBWNsYWltBAdjbGFpbWVkCQELY2xhaW1GYXJtZWQCBQVwVHlwZQUEcG9vbAMJAGYCBRBhbW91bnRUb0V4Y2hhbmdlAAAJAJQKAgUQYW1vdW50VG9FeGNoYW5nZQgFB2NsYWltZWQCXzIJAJQKAgkAZAIIBQdjbGFpbWVkAl8xBRFhbW91bnRGcm9tQmFsYW5jZQgFB2NsYWltZWQCXzIEDGNsYWltZWRBc3NldAMJAAACBQVwVHlwZQUHU0ZfUE9PTAUGU1dPUElEAwkAAAIFBXBUeXBlBQdXWF9QT09MBAxwcm94eUFkZHJTdHIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFByb3h5QWRkcgIABANpbnYDCQECIT0CBQxwcm94eUFkZHJTdHICAAQJcHJveHlBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQxwcm94eUFkZHJTdHIEDHByb3h5QmFsYW5jZQkA8AcCBQlwcm94eUFkZHIFBFdYSUQDCQBmAgUMcHJveHlCYWxhbmNlAAAJAPwHBAUJcHJveHlBZGRyAhB3eENsYWltRmluYWxpemVkCQDMCAIFDHByb3h5QmFsYW5jZQUDbmlsBQNuaWwFBHVuaXQFBHVuaXQDCQAAAgUDaW52BQNpbnYFBFdYSUQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAQ91bmtub3duUG9vbFR5cGUACQCUCgIJAGQCBRBhbW91bnRUb0V4Y2hhbmdlBRFhbW91bnRGcm9tQmFsYW5jZQUMY2xhaW1lZEFzc2V0AwkAAAIFDSR0MDUwMzcxNTEyMjIFDSR0MDUwMzcxNTEyMjIEBWFzc2V0CAUNJHQwNTAzNzE1MTIyMgJfMgQGYW1vdW50CAUNJHQwNTAzNzE1MTIyMgJfMQQDYmFsCQEOYWNjb3VudEJhbGFuY2UBBQVhc3NldAMJAAACBQNiYWwFA2JhbAMJAGYCBQZhbW91bnQFA2JhbAkAAgECGVRvIGJpZyBhbW91bnQgdG8gZXhjaGFuZ2UJAJQKAgUGYW1vdW50BQVhc3NldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhwBaQETZ2V0UG9vbEluZm9SRUFET05MWQEEcG9vbAQIcG9vbEFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDA1MTU3NDUxNjY0CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDUxNTc0NTE2NjQCXzEEA0JJZAgFDSR0MDUxNTc0NTE2NjQCXzIEBGJhbEEIBQ0kdDA1MTU3NDUxNjY0Al8zBARiYWxCCAUNJHQwNTE1NzQ1MTY2NAJfNAQHc2hhcmVJZAgFDSR0MDUxNTc0NTE2NjQCXzUEC3NoYXJlU3VwcGx5CQEOZ2V0U2hhcmVTdXBwbHkDBQhwb29sQWRkcgUFcFR5cGUFB3NoYXJlSWQJAJQKAgUDbmlsCQCYCgYFA0FJZAUDQklkBQdzaGFyZUlkBQRiYWxBBQRiYWxCBQtzaGFyZVN1cHBseQFpARpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQEHc2hhcmVJZAQLc2hhcmVQcmljZXMJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAkAlAoCBQNuaWwFC3NoYXJlUHJpY2VzAWkBImdldFVzZXJQb3NpdGlvblNoYXJlQW1vdW50UkVBRE9OTFkCBHVzZXIGcG9zTnVtBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAIQVW5rbm93biBwb3NpdGlvbgQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAQKZnJvbU1hcmtldAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRZrVXNlclBvc2l0aW9uSW5QTWFya2V0BwQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBQUEdXNlcgUEcG9vbAUGcG9zTnVtCQBmAgUMYm9ycm93QW1vdW50AAAFCmZyb21NYXJrZXQJAJQKAgUDbmlsBQ91c2VyQ2FuV2l0aGRyYXcBaQEXZ2V0VXNlclBvc2l0aW9uUkVBRE9OTFkDBHVzZXIFcG9vbHMGcG9zTnVtCgEHdXNlclBvcwIBYQRwb29sBA0kdDA1MjY2MjUyNzMyBQFhBAl3QW1vdW50c0EIBQ0kdDA1MjY2MjUyNzMyAl8xBAl3QW1vdW50c0IIBQ0kdDA1MjY2MjUyNzMyAl8yBAVkZWJ0cwgFDSR0MDUyNjYyNTI3MzICXzMEC2VxV0Ftb3VudHNBCAUNJHQwNTI2NjI1MjczMgJfNAQLZXFXQW1vdW50c0IIBQ0kdDA1MjY2MjUyNzMyAl81BAVpbmRleAgFDSR0MDUyNjYyNTI3MzICXzYDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFDWtVc2VyUG9zaXRpb24JAJgKBgkAzQgCBQl3QW1vdW50c0EAAAkAzQgCBQl3QW1vdW50c0IAAAkAzQgCBQVkZWJ0cwAACQDNCAIFC2VxV0Ftb3VudHNBAAAJAM0IAgULZXFXQW1vdW50c0IAAAkAZAIFBWluZGV4AAEEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDA1MzAxMTUzMTAxCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDUzMDExNTMxMDECXzEEA0JJZAgFDSR0MDUzMDExNTMxMDECXzIEBGJhbEEIBQ0kdDA1MzAxMTUzMTAxAl8zBARiYWxCCAUNJHQwNTMwMTE1MzEwMQJfNAQHc2hhcmVJZAgFDSR0MDUzMDExNTMxMDECXzUEDGJvcnJvd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRFrVXNlckJvcnJvd0Ftb3VudAAABApmcm9tTWFya2V0CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFFmtVc2VyUG9zaXRpb25JblBNYXJrZXQHBA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMFBQR1c2VyBQRwb29sCQCRAwIFBnBvc051bQUFaW5kZXgJAGYCBQxib3Jyb3dBbW91bnQAAAUKZnJvbU1hcmtldAQNJHQwNTM0NTE1MzU3MQkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQ91c2VyQ2FuV2l0aGRyYXcECHdBbW91bnRBCAUNJHQwNTM0NTE1MzU3MQJfMQQId0Ftb3VudEIIBQ0kdDA1MzQ1MTUzNTcxAl8yAwkAZgIFDGJvcnJvd0Ftb3VudAAABAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFBGRlYnQFBGRlYnQEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAGYCBQRkZWJ0BQh3QW1vdW50QQcJAGUCBQRkZWJ0BQh3QW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFA0JJZAkAZgIFBGRlYnQFCHdBbW91bnRCBwkAZQIFBGRlYnQFCHdBbW91bnRCAAAEC2Ftb3VudFRvUGF5AwkAZgIFDWFtb3VudFRvR2V0RXgAAAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlTRgcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yAwkAAAIFBXBUeXBlBQdXWF9QT09MBAJleAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFC2JvcnJvd0Fzc2V0CAUCZXgCXzIJAQ91bmtub3duUG9vbFR5cGUAAAAEDSR0MDU0NDgzNTQ3MDIDCQAAAgULYm9ycm93QXNzZXQFA0FJZAkAlAoCCQBlAgkAZAIFCHdBbW91bnRBBQ1hbW91bnRUb0dldEV4BQRkZWJ0CQBlAgUId0Ftb3VudEIFC2Ftb3VudFRvUGF5CQCUCgIJAGUCBQh3QW1vdW50QQULYW1vdW50VG9QYXkJAGUCCQBkAgUId0Ftb3VudEIFDWFtb3VudFRvR2V0RXgFBGRlYnQECmVxV0Ftb3VudEEIBQ0kdDA1NDQ4MzU0NzAyAl8xBAplcVdBbW91bnRCCAUNJHQwNTQ0ODM1NDcwMgJfMgkAmAoGCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAzQgCBQVkZWJ0cwUEZGVidAkAzQgCBQtlcVdBbW91bnRzQQUKZXFXQW1vdW50QQkAzQgCBQtlcVdBbW91bnRzQgUKZXFXQW1vdW50QgkAZAIFBWluZGV4AAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIFBWRlYnRzCQDNCAIFCXdBbW91bnRzQQUId0Ftb3VudEEJAM0IAgUJd0Ftb3VudHNCBQh3QW1vdW50QgkAZAIFBWluZGV4AAEEDSR0MDU0OTU3NTUwNjgKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCYCgYFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3VzZXJQb3MCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQJd0Ftb3VudHNBCAUNJHQwNTQ5NTc1NTA2OAJfMQQJd0Ftb3VudHNCCAUNJHQwNTQ5NTc1NTA2OAJfMgQFZGVidHMIBQ0kdDA1NDk1NzU1MDY4Al8zBAtlcVdBbW91bnRzQQgFDSR0MDU0OTU3NTUwNjgCXzQEC2VxV0Ftb3VudHNCCAUNJHQwNTQ5NTc1NTA2OAJfNQkAlAoCBQNuaWwJAJcKBQUJd0Ftb3VudHNBBQl3QW1vdW50c0IFBWRlYnRzBQtlcVdBbW91bnRzQQULZXFXQW1vdW50c0IBaQEJcmVwbGVuaXNoBARwb29sCGxldmVyYWdlCGJvcnJvd0lkDXN0YWtlVG9NYXJrZXQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDmFsbG93ZWRCQXNzZXRzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgUEcG9vbAUYa1Bvb2xBbGxvd2VkQm9ycm93QXNzZXRzAgADCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQRwb29sBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQBmAgBkBQhsZXZlcmFnZQYJAGYCBQhsZXZlcmFnZQCsAgkAAgECH0xldmVyYWdlIGNhbid0IGJlIDwxMDAgYW5kID4zMDADAwkBASEBCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQ2FuQm9ycm93CQBmAgUIbGV2ZXJhZ2UAZAcJAAIBAh1Zb3UgY2FuJ3QgYm9ycm93IGluIHRoaXMgcG9vbAMDAwkAZgIFCGxldmVyYWdlAGQJAQIhPQIFDmFsbG93ZWRCQXNzZXRzAgAHCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQC1CQIFDmFsbG93ZWRCQXNzZXRzAgEsBQhib3Jyb3dJZAcJAAIBAhtZb3UgY2FuJ3QgYm9ycm93IHRoaXMgYXNzZXQDAwUNc3Rha2VUb01hcmtldAkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAUMa1Bvb2xQTUFya2V0BwcJAAIBAiZUaGlzIHBvb2wgY2FuJ3Qgc3Rha2UgdG8gcHV6emxlIG1hcmtldAQNJHQwNTYwNjE1NjE1MQkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDA1NjA2MTU2MTUxAl8xBANCSWQIBQ0kdDA1NjA2MTU2MTUxAl8yBARiYWxBCAUNJHQwNTYwNjE1NjE1MQJfMwQEYmFsQggFDSR0MDU2MDYxNTYxNTECXzQEB3NoYXJlSWQIBQ0kdDA1NjA2MTU2MTUxAl81AwMJAQIhPQIFCGJvcnJvd0lkBQNBSWQJAQIhPQIFCGJvcnJvd0lkBQNCSWQHCQACAQISV3JvbmcgYm9ycm93IGFzc2V0BA0kdDA1NjIzMjU2MjkxCQEScGFyc2VSZXBsZW5pc2hQbXRzAwgFAWkIcGF5bWVudHMFA0FJZAUDQklkBARwbXRBCAUNJHQwNTYyMzI1NjI5MQJfMQQEcG10QggFDSR0MDU2MjMyNTYyOTECXzIEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAluZXdQb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyAwkAZgIFCGxldmVyYWdlAGQEDGJvcnJvd0Ftb3VudAkBEGNhbGNCb3Jyb3dBbW91bnQIBQRwbXRBBQRwbXRCBQRiYWxBBQRiYWxCBQNBSWQFA0JJZAUIbGV2ZXJhZ2UFCGJvcnJvd0lkBAdyZXF1ZXN0CQC5CQIJAMwIAgUEdXNlcgkAzAgCBQRwb29sCQDMCAIJAKQDAQUEcG10QQkAzAgCBQNBSWQJAMwIAgkApAMBBQRwbXRCCQDMCAIFA0JJZAkAzAgCCQCkAwEFBGJhbEEJAMwIAgkApAMBBQRiYWxCCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgkApAMBBQxib3Jyb3dBbW91bnQJAMwIAgkApQMBBQ1zdGFrZVRvTWFya2V0BQNuaWwCASwEDG5ld1JlcXVlc3RJZAoAAUAJAPwHBAUEdGhpcwIQY3JlYXRlTmV3UmVxdWVzdAkAzAgCBQdyZXF1ZXN0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUMbmV3UmVxdWVzdElkBQxuZXdSZXF1ZXN0SWQEBGFyZ3MJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtCQDMCAIFB3NoYXJlSWQJAMwIAgUIYm9ycm93SWQJAMwIAgUMYm9ycm93QW1vdW50CQDMCAIJAKUIAQUEdGhpcwkAzAgCAhFyZXBsZW5pc2hGcm9tTGFuZAkAzAgCCQCkAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUMbmV3UmVxdWVzdElkAhhDYW4ndCBjcmVhdGUgbmV3IHJlcXVlc3QFA25pbAQDaW52CQD9BwQJAQ5nZXRMZW5kU3J2QWRkcgACDWZsYXNoUG9zaXRpb24FBGFyZ3MFA25pbAMJAAACBQNpbnYFA2ludgQKdXNlclN0YWtlZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUJbmV3UG9zTnVtBQ1rVXNlclBvc2l0aW9uBA0kdDA1NzMyNjU3NDIwCQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDA1NzMyNjU3NDIwBQ0kdDA1NzMyNjU3NDIwBAduZXdCYWxCCAUNJHQwNTczMjY1NzQyMAJfMgQHbmV3QmFsQQgFDSR0MDU3MzI2NTc0MjACXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwNTc0OTA1NzYwNQkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDU3NDkwNTc2MDUCXzEECHdBbW91bnRCCAUNJHQwNTc0OTA1NzYwNQJfMgQPZnV0dXJlQm9ycm93QXB5CQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACFmNhbGN1bGF0ZVRva2VuSW50ZXJlc3QJAMwIAgUIYm9ycm93SWQJAMwIAgcFA25pbAUDbmlsAwkAAAIFD2Z1dHVyZUJvcnJvd0FweQUPZnV0dXJlQm9ycm93QXB5CQCUCgIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgkAzAgCBQ9mdXR1cmVCb3Jyb3dBcHkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNTc3Nzc1NzkwNwkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQtOT19MT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFDXN0YWtlVG9NYXJrZXQDCQAAAgUNJHQwNTc3Nzc1NzkwNwUNJHQwNTc3Nzc1NzkwNwQHYXhseUZlZQgFDSR0MDU3Nzc3NTc5MDcCXzIECnVzZXJTdGFrZWQIBQ0kdDA1Nzc3NzU3OTA3Al8xBA0kdDA1NzkxMzU4MDA3CQEPZ2V0UG9vbEJhbGFuY2VzBAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQNBSWQFA0JJZAMJAAACBQ0kdDA1NzkxMzU4MDA3BQ0kdDA1NzkxMzU4MDA3BAduZXdCYWxCCAUNJHQwNTc5MTM1ODAwNwJfMgQHbmV3QmFsQQgFDSR0MDU3OTEzNTgwMDcCXzEECHBySW1wYWN0CQEPY2FsY1ByaWNlSW1wYWN0BAUEYmFsQQUEYmFsQgUHbmV3QmFsQQUHbmV3QmFsQgQNJHQwNTgwNzc1ODE5MgkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDU4MDc3NTgxOTICXzEECHdBbW91bnRCCAUNJHQwNTgwNzc1ODE5MgJfMgkAlAoCCQDOCAIJARByZXBsZW5pc2hFbnRyaWVzCQUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUJbmV3UG9zTnVtBQdzaGFyZUlkBQVwVHlwZQcFDXN0YWtlVG9NYXJrZXQJAQ5nZXRDdXJzRW50cmllcwQFA0FJZAUDQklkBQdzaGFyZUlkCQDMCAIJAKQDAQUId0Ftb3VudEEJAMwIAgkApAMBBQh3QW1vdW50QgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCCQDMCAIAAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AgRwb29sBXBvc0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQJAQ53aXRoZHJhd1RvVXNlcgUJAKUIAQgFAWkGY2FsbGVyBQRwb29sCQCkAwEFBXBvc0lkBwIAAWkBEHdpdGhkcmF3T25lVG9rZW4DBHBvb2wFcG9zSWQHdG9rZW5JZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50CQEOd2l0aGRyYXdUb1VzZXIFCQClCAEIBQFpBmNhbGxlcgUEcG9vbAkApAMBBQVwb3NJZAcFB3Rva2VuSWQBaQEUY3JlYXRlVXBkYXRlU3RvcExvc3MEBXBvc0lkBnBvb2xJZAdhc3NldElkBXByaWNlCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEEHRva2VuT3JhY2xlUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZwb29sSWQCAV8JAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQACAQIaVGhlcmUgYXJlIG5vIHVzZXIgcG9zaXRpb24DCQBnAgAABQVwcmljZQkAAgECHFByaWNlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgUFcHJpY2UFEHRva2VuT3JhY2xlUHJpY2UJAAIBAitQcmljZSBtdXN0IGJlIGxlc3MgdGhhbiBjdXJyZW50IHRva2VuIHByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFBXByaWNlBQNuaWwBaQEOZGVsZXRlU3RvcExvc3MDBXBvc0lkBnBvb2xJZAdhc3NldElkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUGcG9vbElkAhJQb29sIGlzIG5vdCBpbml0ZWQDCQEBIQEJAQxpc1Bvb2xBY3RpdmUCBQZwb29sSWQFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MJAAIBAghObyBlbnRyeQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFA25pbAFpAQRpbml0DQxtb25leUJveEFkZHINc2ZGYXJtaW5nQWRkcghsZW5kQWRkcg9wcmljZU9yYWNsZUFkZHIQa2VlcGVyRXhDb250cmFjdA53eFN3YXBDb250cmFjdAtzd29wQXNzZXRJZAl3eEFzc2V0SWQOb3BlcmF0b3JQdWJLZXkSZ3JvdXAxQWRtaW4xUHViS2V5Emdyb3VwMUFkbWluMlB1YktleRJncm91cDJBZG1pbjFQdWJLZXkSZ3JvdXAyQWRtaW4yUHViS2V5CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkDCQEJaXNEZWZpbmVkAQkAoggBBQ9rT3BlcmF0b3JDYWxsUEsJAAIBAg5BbHJlYWR5IGluaXRlZAMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUMbW9uZXlCb3hBZGRyCQACAQIjbW9uZXlCb3hBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFDXNmRmFybWluZ0FkZHIJAAIBAiRzZkZhcm1pbmdBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFCGxlbmRBZGRyCQACAQIfbGVuZEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUPcHJpY2VPcmFjbGVBZGRyCQACAQImcHJpY2VPcmFjbGVBZGRyIGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFEGtlZXBlckV4Q29udHJhY3QJAAIBAidrZWVwZXJFeENvbnRyYWN0IGlzIG5vdCBjb3JyZWN0IGFkZHJlc3MDCQEBIQEJAQlpc0RlZmluZWQBCQDsBwEJANkEAQULc3dvcEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQl3eEFzc2V0SWQJAAIBAiNzd29wQXNzZXRJZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQIhPQIJAMgBAQkA2QQBBQ5vcGVyYXRvclB1YktleQAgCQACAQIdb3BlcmF0b3JQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAxQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDFBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4xUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUSZ3JvdXAyQWRtaW4yUHViS2V5ACAJAAIBAiFncm91cDJBZG1pbjJQdWJLZXkgaXMgbm90IGNvcnJlY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa01vbmV5Qm94BQxtb25leUJveEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUOa1NGRmFybWluZ0FkZHIFDXNmRmFybWluZ0FkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa0xlbmRTZXJ2aWNlBQhsZW5kQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrUHJpY2VPcmFjbGUFD3ByaWNlT3JhY2xlQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQtrRXhDb250cmFjdAUQa2VlcGVyRXhDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rV3hTd2FwQ29udHJhY3QFDnd4U3dhcENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tTd29wSWQFC3N3b3BBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWtXeElkBQl3eEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa09wZXJhdG9yQ2FsbFBLBQ5vcGVyYXRvclB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4xUEsFEmdyb3VwMUFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAxQWRtaW4yUEsFEmdyb3VwMUFkbWluMlB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4xUEsFEmdyb3VwMkFkbWluMVB1YktleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rR3JvdXAyQWRtaW4yUEsFEmdyb3VwMkFkbWluMlB1YktleQUDbmlsAWkBEGNyZWF0ZU5ld1JlcXVlc3QBBnBhcmFtcwkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpBAxuZXdSZXF1ZXN0SWQJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDGtSZXF1ZXN0SXRlcgAAAAEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQUMbmV3UmVxdWVzdElkBQprUmVxdWVzdElkBQZwYXJhbXMJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtSZXF1ZXN0SXRlcgUMbmV3UmVxdWVzdElkBQNuaWwFDG5ld1JlcXVlc3RJZAFpARFyZXBsZW5pc2hGcm9tTGFuZAEJcmVxdWVzdElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEDSR0MDYzNDE1NjM1MzQJAQxwYXJzZVJlcXVlc3QBBQlyZXF1ZXN0SWQEBHVzZXIIBQ0kdDA2MzQxNTYzNTM0Al8xBARwb29sCAUNJHQwNjM0MTU2MzUzNAJfMgQEcG10QQgFDSR0MDYzNDE1NjM1MzQCXzMEA0FJZAgFDSR0MDYzNDE1NjM1MzQCXzQEBHBtdEIIBQ0kdDA2MzQxNTYzNTM0Al81BANCSWQIBQ0kdDA2MzQxNTYzNTM0Al82BARiYWxBCAUNJHQwNjM0MTU2MzUzNAJfNwQEYmFsQggFDSR0MDYzNDE1NjM1MzQCXzgEB3NoYXJlSWQIBQ0kdDA2MzQxNTYzNTM0Al85BAdid0Fzc2V0CAUNJHQwNjM0MTU2MzUzNANfMTAECGJ3QW1vdW50CAUNJHQwNjM0MTU2MzUzNANfMTEEDXN0YWtlVG9NYXJrZXQIBQ0kdDA2MzQxNTYzNTM0A18xMgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECEldyb25nIHBheW1lbnQgc2l6ZQMDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdid0Fzc2V0BgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFCGJ3QW1vdW50CQACAQINV3JvbmcgcGF5bWVudAQNJHQwNjM3MjQ2MzgyNAMJAAACBQNBSWQFB2J3QXNzZXQJAJQKAgkAZAIFBHBtdEEFCGJ3QW1vdW50BQRwbXRCCQCUCgIFBHBtdEEJAGQCBQRwbXRCBQhid0Ftb3VudAQHcG10QWxsQQgFDSR0MDYzNzI0NjM4MjQCXzEEB3BtdEFsbEIIBQ0kdDA2MzcyNDYzODI0Al8yBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNjM5MDY2NDAzNgkBD3JlcGxlbmlzaEJ5VHlwZQsFBXBUeXBlBQRwb29sBQhMT0FOX0ZFRQUHcG10QWxsQQUDQUlkBQdwbXRBbGxCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFDXN0YWtlVG9NYXJrZXQECnVzZXJTdGFrZWQIBQ0kdDA2MzkwNjY0MDM2Al8xBAdheGx5RmVlCAUNJHQwNjM5MDY2NDAzNgJfMgQGcG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgQNYm9ycm93RW50cmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAUIYndBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRJrVXNlckJvcnJvd0Fzc2V0SWQFB2J3QXNzZXQFA25pbAQHZW50cmllcwkBEHJlcGxlbmlzaEVudHJpZXMJBQRwb29sBQR1c2VyBQp1c2VyU3Rha2VkBQdheGx5RmVlBQZwb3NOdW0FB3NoYXJlSWQFBXBUeXBlBgUNc3Rha2VUb01hcmtldAQNJHQwNjQ0MTE2NDUyNgkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDY0NDExNjQ1MjYCXzEECHdBbW91bnRCCAUNJHQwNjQ0MTE2NDUyNgJfMgkAlAoCCQDNCAIJAM4IAgkAzggCBQdlbnRyaWVzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAUNYm9ycm93RW50cmllcwkBC0RlbGV0ZUVudHJ5AQkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFCnVzZXJTdGFrZWQBaQEJbGlxdWlkYXRlAwR1c2VyBXBvc0lkD2xpcXVpZGF0ZUFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpCQEMbGlxdWlkYXRlUG9zBAgFAWkGY2FsbGVyBQR1c2VyBQVwb3NJZAUPbGlxdWlkYXRlQW1vdW50AWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBA1zdG9wTG9zc1ByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzAghObyBlbnRyeQMJAGYCBRB0b2tlbk9yYWNsZVByaWNlBQ1zdG9wTG9zc1ByaWNlCQACAQIjVG9rZW4gcHJpY2UgZ3JlYXRlciBzdG9wIGxvc3MgcHJpY2UEA3JlcwkBDndpdGhkcmF3VG9Vc2VyBQUEdXNlcgUEcG9vbAkApAMBBQVwb3NJZAYCAAkAlAoCCQDNCAIIBQNyZXMCXzEJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwgFA3JlcwJfMgFpAQxjYXBpdGFsaXplRXgFBHBvb2wFcm91dGUJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDY1OTQyNjYwMDgJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwNjU5NDI2NjAwOAJfMQQDQklkCAUNJHQwNjU5NDI2NjAwOAJfMgQEYmFsQQgFDSR0MDY1OTQyNjYwMDgCXzMEBGJhbEIIBQ0kdDA2NTk0MjY2MDA4Al80BAdzaGFyZUlkCAUNJHQwNjU5NDI2NjAwOAJfNQQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQMaXNNYXJrZXRQb29sCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUEcG9vbAUMa1Bvb2xQTUFya2V0BwQNJHQwNjYxMzc2Njk2MwMJAGYCBRBhbW91bnRUb0V4Y2hhbmdlAAAEDSR0MDY2MTk5NjYyOTYJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQUQYW1vdW50VG9FeGNoYW5nZQAAAwkAAAIFDSR0MDY2MTk5NjYyOTYFDSR0MDY2MTk5NjYyOTYEDGNsYWltZWRBc3NldAgFDSR0MDY2MTk5NjYyOTYCXzIEDWNsYWltZWRBbW91bnQIBQ0kdDA2NjE5OTY2Mjk2Al8xBAVyQXJncwkAtQkCBQVyb3V0ZQICX18ED2V4Y2hhbmdlZEFtb3VudAMJAGYCBRBhbW91bnRUb0V4Y2hhbmdlAAADCQAAAgkAkQMCBQVyQXJncwAAAhBkaXJlY3RTd29wZmlDUE1NCQEQZGlyZWN0U3dvcGZpQ1BNTQIFBXJBcmdzBQl0b2tlblRvSWQDCQAAAgkAkQMCBQVyQXJncwAAAg1yb3V0aW5nU3dvcGZpCQETZGlyZWN0Um91dGluZ1N3b3BmaQIFBXJBcmdzBQl0b2tlblRvSWQJAAIBAgtXcm9uZyByb3V0ZQAAAwkAAAIFD2V4Y2hhbmdlZEFtb3VudAUPZXhjaGFuZ2VkQW1vdW50BAluZXdDaGFuZ2UJAGUCCQBkAgUNY2xhaW1lZEFtb3VudAUGY2hhbmdlBRBhbW91bnRUb0V4Y2hhbmdlBAtjaGFuZ2VFbnRyeQMJAGcCBQluZXdDaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQUJbmV3Q2hhbmdlBQNuaWwFA25pbAQNJHQwNjY3OTM2NjkwMwkBCmNhcGl0YWxpemUJBQRwb29sBQVwVHlwZQUJdG9rZW5Ub0lkBQ9leGNoYW5nZWRBbW91bnQFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAtjYXBFbnRlcmlzZQgFDSR0MDY2NzkzNjY5MDMCXzEEBnN0YWtlZAgFDSR0MDY2NzkzNjY5MDMCXzIJAJQKAgkAzggCBQtjYXBFbnRlcmlzZQULY2hhbmdlRW50cnkFBnN0YWtlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQNuaWwAAAQLY2FwRW50ZXJpc2UIBQ0kdDA2NjEzNzY2OTYzAl8xBAZzdGFrZWQIBQ0kdDA2NjEzNzY2OTYzAl8yBA0kdDA2Njk2NjY3MDgzAwUMaXNNYXJrZXRQb29sCQEWY2FwaXRhbGl6ZVB1enpsZU1hcmtldAMFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQCUCgIFA25pbAAABBBtYXJrZXRDYXBFbnRlcmlzCAUNJHQwNjY5NjY2NzA4MwJfMQQMc3Rha2VkTWFya2V0CAUNJHQwNjY5NjY2NzA4MwJfMgkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgkAZAIFEHRvdGFsU2hhcmVBbW91bnQFBnN0YWtlZAUMc3Rha2VkTWFya2V0BQNuaWwFC2NhcEVudGVyaXNlBRBtYXJrZXRDYXBFbnRlcmlzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAUDbmlsAWkBDmNhcGl0YWxpemVOb0V4AwRwb29sBWNsYWltEWFtb3VudEZyb21CYWxhbmNlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBA0kdDA2NzUxODY3NTg0CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA0FJZAgFDSR0MDY3NTE4Njc1ODQCXzEEA0JJZAgFDSR0MDY3NTE4Njc1ODQCXzIEBGJhbEEIBQ0kdDA2NzUxODY3NTg0Al8zBARiYWxCCAUNJHQwNjc1MTg2NzU4NAJfNAQHc2hhcmVJZAgFDSR0MDY3NTE4Njc1ODQCXzUEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wEDSR0MDY3NjM2Njc3MzQJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQAABRFhbW91bnRGcm9tQmFsYW5jZQMJAAACBQ0kdDA2NzYzNjY3NzM0BQ0kdDA2NzYzNjY3NzM0BAxjbGFpbWVkQXNzZXQIBQ0kdDA2NzYzNjY3NzM0Al8yBA1jbGFpbWVkQW1vdW50CAUNJHQwNjc2MzY2NzczNAJfMQQNJHQwNjc3Mzc2Nzg2MwkBCmNhcGl0YWxpemUJBQRwb29sBQVwVHlwZQkBDGFzc2V0SWRUb1N0cgEFDGNsYWltZWRBc3NldAUNY2xhaW1lZEFtb3VudAUDQUlkBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQEC2NhcEVudGVyaXNlCAUNJHQwNjc3Mzc2Nzg2MwJfMQQGc3Rha2VkCAUNJHQwNjc3Mzc2Nzg2MwJfMgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFEHRvdGFsU2hhcmVBbW91bnQFBnN0YWtlZAUDbmlsBQtjYXBFbnRlcmlzZQkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtpbml0TmV3UG9vbAwEdHlwZQhwb29sVHlwZQhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JY2FuQm9ycm93CmNhblBNYXJrZXQTYWxsb3dlZEJvcnJvd0Fzc2V0cwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMDCQECIT0CBQR0eXBlBQdTRl9QT09MCQECIT0CBQR0eXBlBQdXWF9QT09MBwkAAgECCldyb25nIHR5cGUDAwkBAiE9AgUIcG9vbFR5cGUFBENQTU0JAQIhPQIFCHBvb2xUeXBlBQRGTEFUBwkAAgECD1dyb25nIHBvb2wgdHlwZQQNJHQwNjg1MTc2ODYxMQkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFCHBvb2xBZGRyBQR0eXBlBANhSWQIBQ0kdDA2ODUxNzY4NjExAl8xBANiSWQIBQ0kdDA2ODUxNzY4NjExAl8yBARhQmFsCAUNJHQwNjg1MTc2ODYxMQJfMwQEYkJhbAgFDSR0MDY4NTE3Njg2MTECXzQEB3NoYXJlSWQIBQ0kdDA2ODUxNzY4NjExAl81AwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAEGGFsbG93ZWRCb3Jyb3dBc3NldHNFbnRyeQMJAQIhPQIFE2FsbG93ZWRCb3Jyb3dBc3NldHMCAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFCHBvb2xBZGRyBRhrUG9vbEFsbG93ZWRCb3Jyb3dBc3NldHMFE2FsbG93ZWRCb3Jyb3dBc3NldHMFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrUG9vbEludGVyZXN0TG9hbgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQVrUG9vbAUIcG9vbEFkZHIFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQhwb29sQWRkcgUJa1Bvb2xUeXBlBQhwb29sVHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wFCHBvb2xBZGRyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQ5rUG9vbENhbkJvcnJvdwUJY2FuQm9ycm93CQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFCHBvb2xBZGRyBQxrUG9vbFBNQXJrZXQFCmNhblBNYXJrZXQFA25pbAUYYWxsb3dlZEJvcnJvd0Fzc2V0c0VudHJ5AWkBDnVwZGF0ZVBvb2xGZWVzBwhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyCQACAQkArAICAhpDYW4ndCBmaW5kIHBvb2wgd2l0aCBhZGRyIAUIcG9vbEFkZHIDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4FA25pbAFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQITZEFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYFA25pbAFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhVkQXBwIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHBQNuaWwBaQEQYWN0aXZhdGVGb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh1kQXBwIGFscmVhZHkgYWN0aXZlIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBgUDbmlsAWkBEHNodXRkb3duRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh9kQXBwIGFscmVhZHkgc2h1dGRvd24gZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMHBQNuaWwBaQEKYWN0aXZhdGVTRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIVU1dPUEZJIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIXU1dPUEZJIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEKYWN0aXZhdGVXWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIRV1ggYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25XWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhNXWCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBDGFjdGl2YXRlUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhNQb29sIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgUDbmlsAWkBDHNodXRkb3duUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECFVBvb2wgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQcFA25pbAECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDmdyb3VwMUFkbWluMVBLAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUOZ3JvdXAxQWRtaW4yUEsAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQ5ncm91cDFBZG1pbjNQSwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgUTbXVsdGlTaWduZWRCeUFkbWluc54ipwc=", "height": 4119489, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7n2fwDchrRppM8kdPnoeNzKsbKaT7DWkZyQE3iXgqHFv Next: DhqQtkKkCNLR2zhKL1w7xxKA6VsT3gYVxv4ZrSCA9uL9 Diff:
OldNewDifferences
688688 then if ((amoutGet == amountTokenToGet))
689689 then $Tuple2(assetIn, amountTokenToGet)
690690 else {
691- let amountToPayMax = if ((amountTokenToGet > amoutGet))
692- then fraction(amountTokenToGet, 110, 100)
693- else fraction(amountTokenToGet, 90, 100)
694- let amountGetMax = {
695- let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [amountToPayMax, assetIn, assetTokenToGet], nil)
696- if ($isInstanceOf(@, "Int"))
697- then @
698- else throw(($getType(@) + " couldn't be cast to Int"))
691+ let amountToPayMax = {
692+ let aPM = if ((amountTokenToGet > amoutGet))
693+ then fraction(amountTokenToGet, 110, 100)
694+ else fraction(amountTokenToGet, 90, 100)
695+ let amountGetMax = {
696+ let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [aPM, assetIn, assetTokenToGet], nil)
697+ if ($isInstanceOf(@, "Int"))
698+ then @
699+ else throw(($getType(@) + " couldn't be cast to Int"))
700+ }
701+ if ((amountGetMax == amountGetMax))
702+ then if ((amoutGet > amountGetMax))
703+ then fraction(aPM, 110, 100)
704+ else aPM
705+ else throw("Strict value is not equal to itself.")
699706 }
700- if ((amountGetMax == amountGetMax))
701- then {
702- func hdm (a,index) = {
703- let $t02172121742 = a
704- let pay = $t02172121742._1
705- let payMax = $t02172121742._2
706- let payNext = ((pay + payMax) / 2)
707- let amountGetNext = {
708- let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [payNext, assetIn, assetTokenToGet], nil)
709- if ($isInstanceOf(@, "Int"))
710- then @
711- else throw(($getType(@) + " couldn't be cast to Int"))
712- }
713- if ((amountGetNext == amountGetNext))
714- then if ((amountTokenToGet > amountGetNext))
715- then $Tuple2(payNext, payMax)
716- else $Tuple2(pay, payNext)
717- else throw("Strict value is not equal to itself.")
718- }
719-
720- let resAmntToPay = {
721- let $l = [1, 2]
722- let $s = size($l)
723- let $acc0 = $Tuple2(amountTokenToGet, amountToPayMax)
724- func $f0_1 ($a,$i) = if (($i >= $s))
725- then $a
726- else hdm($a, $l[$i])
727-
728- func $f0_2 ($a,$i) = if (($i >= $s))
729- then $a
730- else throw("List size exceeds 2")
731-
732- $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
733- }
734- let amountToPay = if ((amountTokenToGet > amoutGet))
735- then resAmntToPay._2
736- else resAmntToPay._1
737- $Tuple2(assetIn, amountToPay)
707+ func hdm (a,index) = {
708+ let $t02183221853 = a
709+ let pay = $t02183221853._1
710+ let payMax = $t02183221853._2
711+ let payNext = ((pay + payMax) / 2)
712+ let amountGetNext = {
713+ let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [payNext, assetIn, assetTokenToGet], nil)
714+ if ($isInstanceOf(@, "Int"))
715+ then @
716+ else throw(($getType(@) + " couldn't be cast to Int"))
738717 }
739- else throw("Strict value is not equal to itself.")
718+ if ((amountGetNext == amountGetNext))
719+ then if ((amountTokenToGet > amountGetNext))
720+ then $Tuple2(payNext, payMax)
721+ else $Tuple2(pay, payNext)
722+ else throw("Strict value is not equal to itself.")
723+ }
724+
725+ let resAmntToPay = {
726+ let $l = [1, 2]
727+ let $s = size($l)
728+ let $acc0 = $Tuple2(amountTokenToGet, amountToPayMax)
729+ func $f0_1 ($a,$i) = if (($i >= $s))
730+ then $a
731+ else hdm($a, $l[$i])
732+
733+ func $f0_2 ($a,$i) = if (($i >= $s))
734+ then $a
735+ else throw("List size exceeds 2")
736+
737+ $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
738+ }
739+ let amountToPay = if ((amountTokenToGet > amoutGet))
740+ then resAmntToPay._2
741+ else resAmntToPay._1
742+ $Tuple2(assetIn, amountToPay)
740743 }
741744 else throw("Strict value is not equal to itself.")
742745 }
743746
744747
745748 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
746- let $t02234022379 = getWXSwapFees(pool)
747- let pFee = $t02234022379._1
748- let prFee = $t02234022379._2
749+ let $t02245122490 = getWXSwapFees(pool)
750+ let pFee = $t02245122490._1
751+ let prFee = $t02245122490._2
749752 let poolType = valueOrElse(getString(this, (pool + kPoolType)), CPMM)
750753 let feeScale = toBigInt(100000000)
751754 if ((poolType == FLAT))
752755 then calcFlatToPay(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
753756 else {
754- let $t02261222920 = if ((assetTokenToGet == assetIdA))
757+ let $t02272323031 = if ((assetTokenToGet == assetIdA))
755758 then {
756759 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
757760 $Tuple2(amountToPay, assetIdB)
760763 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
761764 $Tuple2(amountToPay, assetIdA)
762765 }
763- let amountToPay = $t02261222920._1
764- let assetToPay = $t02261222920._2
766+ let amountToPay = $t02272323031._1
767+ let assetToPay = $t02272323031._2
765768 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
766769 $Tuple2(assetToPay, amountToPayWithFee)
767770 }
774777 then true
775778 else (poolFB != ""))
776779 then {
777- let $t02336123573 = if ((poolFB == ""))
780+ let $t02347223684 = if ((poolFB == ""))
778781 then $Tuple3(balA, balB, pool)
779782 else {
780- let $t02346723540 = getSFPoolBalances(addressFromStringValue(poolFB))
781- let sfBalA = $t02346723540._1
782- let sfBalB = $t02346723540._2
783+ let $t02357823651 = getSFPoolBalances(addressFromStringValue(poolFB))
784+ let sfBalA = $t02357823651._1
785+ let sfBalB = $t02357823651._2
783786 $Tuple3(sfBalA, sfBalB, poolFB)
784787 }
785- let pBalA = $t02336123573._1
786- let pBalB = $t02336123573._2
787- let exPool = $t02336123573._3
788- let $t02357823704 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
789- let assetToPay = $t02357823704._1
790- let amountToPay = $t02357823704._2
788+ let pBalA = $t02347223684._1
789+ let pBalB = $t02347223684._2
790+ let exPool = $t02347223684._3
791+ let $t02368923815 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
792+ let assetToPay = $t02368923815._1
793+ let amountToPay = $t02368923815._2
791794 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
792795 }
793796 else if ((pType == WX_POOL))
794797 then {
795- let $t02390624028 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
796- let assetToPay = $t02390624028._1
797- let amountToPay = $t02390624028._2
798+ let $t02401724139 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
799+ let assetToPay = $t02401724139._1
800+ let amountToPay = $t02401724139._2
798801 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
799802 }
800803 else unknownPoolType()
832835
833836
834837 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
835- let $t02515725628 = if ((pType == SF_POOL))
838+ let $t02526825739 = if ((pType == SF_POOL))
836839 then {
837840 let inv = {
838841 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
867870 else throw("Strict value is not equal to itself.")
868871 }
869872 else unknownPoolType()
870- let amountA = $t02515725628._1
871- let amountB = $t02515725628._2
873+ let amountA = $t02526825739._1
874+ let amountB = $t02526825739._2
872875 $Tuple2(amountA, amountB)
873876 }
874877
892895 }
893896 else if ((pType == WX_POOL))
894897 then {
895- let $t02606826147 = getWXPoolData(addressFromStringValue(pool))
896- let aId = $t02606826147._1
897- let bId = $t02606826147._2
898- let aBal = $t02606826147._3
899- let bBal = $t02606826147._4
900- let lpId = $t02606826147._5
898+ let $t02617926258 = getWXPoolData(addressFromStringValue(pool))
899+ let aId = $t02617926258._1
900+ let bId = $t02617926258._2
901+ let aBal = $t02617926258._3
902+ let bBal = $t02617926258._4
903+ let lpId = $t02617926258._5
901904 let balBefore = accountBalance(WXID)
902905 if ((balBefore == balBefore))
903906 then {
923926 if ((lpBalanceBefore == lpBalanceBefore))
924927 then {
925928 let poolAddr = addressFromStringValue(pool)
926- let $t02695227380 = if (if ((pmtA > 0))
929+ let $t02706327491 = if (if ((pmtA > 0))
927930 then (pmtB > 0)
928931 else false)
929932 then {
930- let $t02701827140 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
931- let pmtInA = $t02701827140._1
932- let pmtInB = $t02701827140._2
933- let change = $t02701827140._3
934- let changeId = $t02701827140._4
933+ let $t02712927251 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
934+ let pmtInA = $t02712927251._1
935+ let pmtInB = $t02712927251._2
936+ let change = $t02712927251._3
937+ let changeId = $t02712927251._4
935938 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId, LPId)
936939 if ((inv == inv))
937940 then $Tuple2(change, changeId)
942945 else if ((pmtB > 0))
943946 then $Tuple2(pmtB, bId)
944947 else throw("pmts must be > 0")
945- let change = $t02695227380._1
946- let changeId = $t02695227380._2
948+ let change = $t02706327491._1
949+ let changeId = $t02706327491._2
947950 let inv = if ((change > 0))
948951 then replenishOneTokenByType(poolAddr, pType, change, changeId, LPId)
949952 else nil
977980 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
978981 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
979982 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
980- let $t02884129666 = if (withLoan)
983+ let $t02895229777 = if (withLoan)
981984 then if (stakeToMarket)
982985 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
983986 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
984987 else if (stakeToMarket)
985988 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
986989 else $Tuple2(poolInterestNoLoan, nil)
987- let curPoolInterest = $t02884129666._1
988- let adEntry = $t02884129666._2
990+ let curPoolInterest = $t02895229777._1
991+ let adEntry = $t02895229777._2
989992 ([IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), 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))] ++ adEntry)
990993 }
991994
10841087 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10851088 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10861089 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
1087- let $t03274432844 = if ((tokenId == AId))
1090+ let $t03285532955 = if ((tokenId == AId))
10881091 then $Tuple2((tokenAmount - axlyFee), 0)
10891092 else $Tuple2(0, (tokenAmount - axlyFee))
1090- let pmtA = $t03274432844._1
1091- let pmtB = $t03274432844._2
1092- let $t03284732958 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1093- let stakedAmount = $t03284732958._1
1094- let nf = $t03284732958._2
1093+ let pmtA = $t03285532955._1
1094+ let pmtB = $t03285532955._2
1095+ let $t03295833069 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1096+ let stakedAmount = $t03295833069._1
1097+ let nf = $t03295833069._2
10951098 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
10961099 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
10971100 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
12131216 let userAddr = Address(fromBase58String(user))
12141217 let poolAddr = Address(fromBase58String(pool))
12151218 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1216- let $t03901239084 = getPoolData(poolAddr, pType)
1217- let idAStr = $t03901239084._1
1218- let idBStr = $t03901239084._2
1219- let balA = $t03901239084._3
1220- let balB = $t03901239084._4
1221- let shareId = $t03901239084._5
1222- let $t03908739154 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1223- let idA = $t03908739154._1
1224- let idB = $t03908739154._2
1219+ let $t03912339195 = getPoolData(poolAddr, pType)
1220+ let idAStr = $t03912339195._1
1221+ let idBStr = $t03912339195._2
1222+ let balA = $t03912339195._3
1223+ let balB = $t03912339195._4
1224+ let shareId = $t03912339195._5
1225+ let $t03919839265 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1226+ let idA = $t03919839265._1
1227+ let idB = $t03919839265._2
12251228 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
12261229 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
12271230 let cBalABefore = accountBalance(idA)
12551258 let cBalBAfter = accountBalance(idB)
12561259 if ((cBalBAfter == cBalBAfter))
12571260 then {
1258- let $t04016240251 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1259- let tokensAmountA = $t04016240251._1
1260- let tokensAmountB = $t04016240251._2
1261- let $t04025441499 = if (isBorrowed)
1261+ let $t04027340362 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1262+ let tokensAmountA = $t04027340362._1
1263+ let tokensAmountB = $t04027340362._2
1264+ let $t04036541610 = if (isBorrowed)
12621265 then {
12631266 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12641267 let debt = {
13071310 else throw("Strict value is not equal to itself.")
13081311 }
13091312 else $Tuple2(tokensAmountA, tokensAmountB)
1310- let toUserA = $t04025441499._1
1311- let toUserB = $t04025441499._2
1313+ let toUserA = $t04036541610._1
1314+ let toUserB = $t04036541610._2
13121315 let poolTotalLoanEntries = if (isBorrowed)
13131316 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
13141317 else nil
13171320 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
13181321 else nil))
13191322 else nil
1320- let $t04191242307 = if (if ((withdrawToken == idAStr))
1323+ let $t04202342418 = if (if ((withdrawToken == idAStr))
13211324 then (toUserB > 0)
13221325 else false)
13231326 then {
13361339 else throw("Strict value is not equal to itself.")
13371340 }
13381341 else $Tuple2(toUserA, toUserB)
1339- let toUserACalc = $t04191242307._1
1340- let toUserBCalc = $t04191242307._2
1342+ let toUserACalc = $t04202342418._1
1343+ let toUserBCalc = $t04202342418._2
13411344 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)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), IntegerEntry((pool + kPoolTotal), (poolTotalShare - userCanWithdraw)), ScriptTransfer(userAddr, toUserACalc, idA), ScriptTransfer(userAddr, toUserBCalc, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ poolTotalMarketEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
13421345 $Tuple2(entries, [toUserACalc, toUserBCalc])
13431346 }
13661369 let userAddr = Address(fromBase58String(user))
13671370 let poolAddr = Address(fromBase58String(pool))
13681371 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1369- let $t04423244304 = getPoolData(poolAddr, pType)
1370- let idAStr = $t04423244304._1
1371- let idBStr = $t04423244304._2
1372- let balA = $t04423244304._3
1373- let balB = $t04423244304._4
1374- let shareId = $t04423244304._5
1375- let $t04430744374 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1376- let idA = $t04430744374._1
1377- let idB = $t04430744374._2
1372+ let $t04434344415 = getPoolData(poolAddr, pType)
1373+ let idAStr = $t04434344415._1
1374+ let idBStr = $t04434344415._2
1375+ let balA = $t04434344415._3
1376+ let balB = $t04434344415._4
1377+ let shareId = $t04434344415._5
1378+ let $t04441844485 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1379+ let idA = $t04441844485._1
1380+ let idB = $t04441844485._2
13781381 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
13791382 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13801383 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
14081411 let cBalBAfter = accountBalance(idB)
14091412 if ((cBalBAfter == cBalBAfter))
14101413 then {
1411- let $t04555845647 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1412- let tokensAmountA = $t04555845647._1
1413- let tokensAmountB = $t04555845647._2
1414+ let $t04566945758 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1415+ let tokensAmountA = $t04566945758._1
1416+ let tokensAmountB = $t04566945758._2
14141417 let amountToGetEx = if (if ((borrowAsset == idAStr))
14151418 then (lAmount > tokensAmountA)
14161419 else false)
14311434 let cBalBAfterRepay = accountBalance(idB)
14321435 if ((cBalBAfterRepay == cBalBAfterRepay))
14331436 then {
1434- let $t04615346380 = if ((borrowAsset == idAStr))
1437+ let $t04626446491 = if ((borrowAsset == idAStr))
14351438 then $Tuple2(((cBalAAfterRepay - cBalABefore) - lAmount), (cBalBAfterRepay - cBalBBefore))
14361439 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - lAmount))
1437- let toUserA = $t04615346380._1
1438- let toUserB = $t04615346380._2
1439- let $t04638346460 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1440- let balAAfter = $t04638346460._1
1441- let balBAfter = $t04638346460._2
1442- let $t04646346594 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1443- let userStaked = $t04646346594._1
1444- let axlyFee = $t04646346594._2
1440+ let toUserA = $t04626446491._1
1441+ let toUserB = $t04626446491._2
1442+ let $t04649446571 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1443+ let balAAfter = $t04649446571._1
1444+ let balBAfter = $t04649446571._2
1445+ let $t04657446705 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1446+ let userStaked = $t04657446705._1
1447+ let axlyFee = $t04657446705._2
14451448 let userLpLiqudated = (userCanWithdraw - userStaked)
1446- let $t04665346998 = if (fromMarket)
1449+ let $t04676447109 = if (fromMarket)
14471450 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userLpLiqudated)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userLpLiqudated))])
14481451 else $Tuple2(poolInterestLoan, nil)
1449- let curPoolInterest = $t04665346998._1
1450- let poolTotalMarketEntries = $t04665346998._2
1452+ let curPoolInterest = $t04676447109._1
1453+ let poolTotalMarketEntries = $t04676447109._2
14511454 $Tuple2((([IntegerEntry((pool + kPoolTotal), (poolTotalShare - userLpLiqudated)), IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userLpLiqudated)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition), (pAmount - userLpLiqudated)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest), curPoolInterest), ScriptTransfer(caller, lAmount, assetIdFromStr(borrowAsset))] ++ poolTotalMarketEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil)), userLpLiqudated)
14521455 }
14531456 else throw("Strict value is not equal to itself.")
14871490 }
14881491
14891492
1490-func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
1491- then (borrowId != bId)
1492- else false)
1493- then throw("Wrong borrow asset")
1494- else {
1495- let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
1496- let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
1497- let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
1498- let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
1499- let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1500- let $t04872648823 = if ((borrowId == aId))
1501- then $Tuple2(dPriceA, decPrA)
1502- else $Tuple2(dPriceB, decPrB)
1503- let borrowPrice = $t04872648823._1
1504- let borrowDecPr = $t04872648823._2
1505- fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
1506- }
1493+func calcBorrowAmount (pmtA,pmtB,balA,balB,aId,bId,leverage,borrowId) = {
1494+ let priceOracleA = valueOrElse(getInteger(priceOracleAddr, (aId + kPriceInOracle)), -1)
1495+ let priceOracleB = valueOrElse(getInteger(priceOracleAddr, (bId + kPriceInOracle)), -1)
1496+ if (if ((borrowId != aId))
1497+ then (borrowId != bId)
1498+ else false)
1499+ then throw("Wrong borrow asset")
1500+ else if (if ((priceOracleA == -1))
1501+ then (priceOracleB == -1)
1502+ else false)
1503+ then throw("Can't calc deposit price, no token prices in oracle")
1504+ else {
1505+ let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
1506+ let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
1507+ let dPriceA = if ((priceOracleA != -1))
1508+ then priceOracleA
1509+ else fraction(fraction(balB, decPrA, balA), priceOracleB, decPrB)
1510+ let dPriceB = if ((priceOracleB != -1))
1511+ then priceOracleB
1512+ else fraction(fraction(balA, decPrB, balB), priceOracleA, decPrA)
1513+ let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1514+ let $t04925349350 = if ((borrowId == aId))
1515+ then $Tuple2(dPriceA, decPrA)
1516+ else $Tuple2(dPriceB, decPrB)
1517+ let borrowPrice = $t04925349350._1
1518+ let borrowDecPr = $t04925349350._2
1519+ fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
1520+ }
1521+ }
15071522
15081523
15091524 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
15301545
15311546
15321547 func claimAndCheckAmnt (pool,pType,claim,amountToExchange,amountFromBalance) = {
1533- let $t04984450695 = if (claim)
1548+ let $t05037151222 = if (claim)
15341549 then {
15351550 let claimed = claimFarmed(pType, pool)
15361551 if ((amountToExchange > 0))
15591574 else unknownPoolType()
15601575 $Tuple2((amountToExchange + amountFromBalance), claimedAsset)
15611576 }
1562- if (($t04984450695 == $t04984450695))
1577+ if (($t05037151222 == $t05037151222))
15631578 then {
1564- let asset = $t04984450695._2
1565- let amount = $t04984450695._1
1579+ let asset = $t05037151222._2
1580+ let amount = $t05037151222._1
15661581 let bal = accountBalance(asset)
15671582 if ((bal == bal))
15681583 then if ((amount > bal))
15781593 func getPoolInfoREADONLY (pool) = {
15791594 let poolAddr = addressFromStringValue(pool)
15801595 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1581- let $t05104751137 = getPoolData(Address(fromBase58String(pool)), pType)
1582- let AId = $t05104751137._1
1583- let BId = $t05104751137._2
1584- let balA = $t05104751137._3
1585- let balB = $t05104751137._4
1586- let shareId = $t05104751137._5
1596+ let $t05157451664 = getPoolData(Address(fromBase58String(pool)), pType)
1597+ let AId = $t05157451664._1
1598+ let BId = $t05157451664._2
1599+ let balA = $t05157451664._3
1600+ let balB = $t05157451664._4
1601+ let shareId = $t05157451664._5
15871602 let shareSupply = getShareSupply(poolAddr, pType, shareId)
15881603 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
15891604 }
16121627 @Callable(i)
16131628 func getUserPositionREADONLY (user,pools,posNum) = {
16141629 func userPos (a,pool) = {
1615- let $t05213552205 = a
1616- let wAmountsA = $t05213552205._1
1617- let wAmountsB = $t05213552205._2
1618- let debts = $t05213552205._3
1619- let eqWAmountsA = $t05213552205._4
1620- let eqWAmountsB = $t05213552205._5
1621- let index = $t05213552205._6
1630+ let $t05266252732 = a
1631+ let wAmountsA = $t05266252732._1
1632+ let wAmountsB = $t05266252732._2
1633+ let debts = $t05266252732._3
1634+ let eqWAmountsA = $t05266252732._4
1635+ let eqWAmountsB = $t05266252732._5
1636+ let index = $t05266252732._6
16221637 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
16231638 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
16241639 else {
16251640 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1626- let $t05248452574 = getPoolData(Address(fromBase58String(pool)), pType)
1627- let AId = $t05248452574._1
1628- let BId = $t05248452574._2
1629- let balA = $t05248452574._3
1630- let balB = $t05248452574._4
1631- let shareId = $t05248452574._5
1641+ let $t05301153101 = getPoolData(Address(fromBase58String(pool)), pType)
1642+ let AId = $t05301153101._1
1643+ let BId = $t05301153101._2
1644+ let balA = $t05301153101._3
1645+ let balB = $t05301153101._4
1646+ let shareId = $t05301153101._5
16321647 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
16331648 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
16341649 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1635- let $t05292453044 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1636- let wAmountA = $t05292453044._1
1637- let wAmountB = $t05292453044._2
1650+ let $t05345153571 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1651+ let wAmountA = $t05345153571._1
1652+ let wAmountB = $t05345153571._2
16381653 if ((borrowAmount > 0))
16391654 then {
16401655 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
16681683 }
16691684 else unknownPoolType()
16701685 else 0
1671- let $t05395654175 = if ((borrowAsset == AId))
1686+ let $t05448354702 = if ((borrowAsset == AId))
16721687 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
16731688 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1674- let eqWAmountA = $t05395654175._1
1675- let eqWAmountB = $t05395654175._2
1689+ let eqWAmountA = $t05448354702._1
1690+ let eqWAmountB = $t05448354702._2
16761691 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
16771692 }
16781693 else throw("Strict value is not equal to itself.")
16811696 }
16821697 }
16831698
1684- let $t05443054541 = {
1699+ let $t05495755068 = {
16851700 let $l = pools
16861701 let $s = size($l)
16871702 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
16951710
16961711 $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)
16971712 }
1698- let wAmountsA = $t05443054541._1
1699- let wAmountsB = $t05443054541._2
1700- let debts = $t05443054541._3
1701- let eqWAmountsA = $t05443054541._4
1702- let eqWAmountsB = $t05443054541._5
1713+ let wAmountsA = $t05495755068._1
1714+ let wAmountsB = $t05495755068._2
1715+ let debts = $t05495755068._3
1716+ let eqWAmountsA = $t05495755068._4
1717+ let eqWAmountsB = $t05495755068._5
17031718 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
17041719 }
17051720
17301745 else false)
17311746 then throw("This pool can't stake to puzzle market")
17321747 else {
1733- let $t05553455624 = getPoolData(Address(fromBase58String(pool)), pType)
1734- let AId = $t05553455624._1
1735- let BId = $t05553455624._2
1736- let balA = $t05553455624._3
1737- let balB = $t05553455624._4
1738- let shareId = $t05553455624._5
1748+ let $t05606156151 = getPoolData(Address(fromBase58String(pool)), pType)
1749+ let AId = $t05606156151._1
1750+ let BId = $t05606156151._2
1751+ let balA = $t05606156151._3
1752+ let balB = $t05606156151._4
1753+ let shareId = $t05606156151._5
17391754 if (if ((borrowId != AId))
17401755 then (borrowId != BId)
17411756 else false)
17421757 then throw("Wrong borrow asset")
17431758 else {
1744- let $t05570555764 = parseReplenishPmts(i.payments, AId, BId)
1745- let pmtA = $t05570555764._1
1746- let pmtB = $t05570555764._2
1759+ let $t05623256291 = parseReplenishPmts(i.payments, AId, BId)
1760+ let pmtA = $t05623256291._1
1761+ let pmtB = $t05623256291._2
17471762 let user = toString(i.caller)
17481763 let newPosNum = getNewUserPositionNumber(user)
17491764 if ((leverage > 100))
17501765 then {
1751- let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
1766+ let borrowAmount = calcBorrowAmount(pmtA, pmtB, balA, balB, AId, BId, leverage, borrowId)
17521767 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount), toString(stakeToMarket)], ",")
17531768 let newRequestId = {
17541769 let @ = invoke(this, "createNewRequest", [request], nil)
17631778 if ((inv == inv))
17641779 then {
17651780 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1766- let $t05678756881 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1767- if (($t05678756881 == $t05678756881))
1781+ let $t05732657420 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1782+ if (($t05732657420 == $t05732657420))
17681783 then {
1769- let newBalB = $t05678756881._2
1770- let newBalA = $t05678756881._1
1784+ let newBalB = $t05732657420._2
1785+ let newBalA = $t05732657420._1
17711786 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1772- let $t05695157066 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1773- let wAmountA = $t05695157066._1
1774- let wAmountB = $t05695157066._2
1787+ let $t05749057605 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1788+ let wAmountA = $t05749057605._1
1789+ let wAmountB = $t05749057605._2
17751790 let futureBorrowApy = invoke(getLendSrvAddr(), "calculateTokenInterest", [borrowId, false], nil)
17761791 if ((futureBorrowApy == futureBorrowApy))
17771792 then $Tuple2(nil, [prImpact, wAmountA, wAmountB, futureBorrowApy])
17841799 else throw("Strict value is not equal to itself.")
17851800 }
17861801 else {
1787- let $t05723857368 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1788- if (($t05723857368 == $t05723857368))
1802+ let $t05777757907 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1803+ if (($t05777757907 == $t05777757907))
17891804 then {
1790- let axlyFee = $t05723857368._2
1791- let userStaked = $t05723857368._1
1792- let $t05737457468 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1793- if (($t05737457468 == $t05737457468))
1805+ let axlyFee = $t05777757907._2
1806+ let userStaked = $t05777757907._1
1807+ let $t05791358007 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1808+ if (($t05791358007 == $t05791358007))
17941809 then {
1795- let newBalB = $t05737457468._2
1796- let newBalA = $t05737457468._1
1810+ let newBalB = $t05791358007._2
1811+ let newBalA = $t05791358007._1
17971812 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1798- let $t05753857653 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1799- let wAmountA = $t05753857653._1
1800- let wAmountB = $t05753857653._2
1813+ let $t05807758192 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1814+ let wAmountA = $t05807758192._1
1815+ let wAmountB = $t05807758192._2
18011816 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB, 0])
18021817 }
18031818 else throw("Strict value is not equal to itself.")
19001915
19011916 @Callable(i)
19021917 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1903- let $t06287662995 = parseRequest(requestId)
1904- let user = $t06287662995._1
1905- let pool = $t06287662995._2
1906- let pmtA = $t06287662995._3
1907- let AId = $t06287662995._4
1908- let pmtB = $t06287662995._5
1909- let BId = $t06287662995._6
1910- let balA = $t06287662995._7
1911- let balB = $t06287662995._8
1912- let shareId = $t06287662995._9
1913- let bwAsset = $t06287662995._10
1914- let bwAmount = $t06287662995._11
1915- let stakeToMarket = $t06287662995._12
1918+ let $t06341563534 = parseRequest(requestId)
1919+ let user = $t06341563534._1
1920+ let pool = $t06341563534._2
1921+ let pmtA = $t06341563534._3
1922+ let AId = $t06341563534._4
1923+ let pmtB = $t06341563534._5
1924+ let BId = $t06341563534._6
1925+ let balA = $t06341563534._7
1926+ let balB = $t06341563534._8
1927+ let shareId = $t06341563534._9
1928+ let bwAsset = $t06341563534._10
1929+ let bwAmount = $t06341563534._11
1930+ let stakeToMarket = $t06341563534._12
19161931 if ((size(i.payments) != 1))
19171932 then throw("Wrong payment size")
19181933 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
19201935 else (i.payments[0].amount != bwAmount))
19211936 then throw("Wrong payment")
19221937 else {
1923- let $t06318563285 = if ((AId == bwAsset))
1938+ let $t06372463824 = if ((AId == bwAsset))
19241939 then $Tuple2((pmtA + bwAmount), pmtB)
19251940 else $Tuple2(pmtA, (pmtB + bwAmount))
1926- let pmtAllA = $t06318563285._1
1927- let pmtAllB = $t06318563285._2
1941+ let pmtAllA = $t06372463824._1
1942+ let pmtAllB = $t06372463824._2
19281943 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1929- let $t06336763497 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1930- let userStaked = $t06336763497._1
1931- let axlyFee = $t06336763497._2
1944+ let $t06390664036 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1945+ let userStaked = $t06390664036._1
1946+ let axlyFee = $t06390664036._2
19321947 let posNum = getNewUserPositionNumber(user)
19331948 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
19341949 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1935- let $t06387263987 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1936- let wAmountA = $t06387263987._1
1937- let wAmountB = $t06387263987._2
1950+ let $t06441164526 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1951+ let wAmountA = $t06441164526._1
1952+ let wAmountB = $t06441164526._2
19381953 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
19391954 }
19401955 }))
19651980 let pType = getStringValue(this, (kPool + pool))
19661981 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
19671982 let poolAddr = Address(fromBase58String(pool))
1968- let $t06540365469 = getPoolData(poolAddr, pType)
1969- let AId = $t06540365469._1
1970- let BId = $t06540365469._2
1971- let balA = $t06540365469._3
1972- let balB = $t06540365469._4
1973- let shareId = $t06540365469._5
1983+ let $t06594266008 = getPoolData(poolAddr, pType)
1984+ let AId = $t06594266008._1
1985+ let BId = $t06594266008._2
1986+ let balA = $t06594266008._3
1987+ let balB = $t06594266008._4
1988+ let shareId = $t06594266008._5
19741989 let totalShareAmount = getPoolTotalShare(pool)
19751990 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1976- let $t06559866424 = if ((amountToExchange > 0))
1991+ let $t06613766963 = if ((amountToExchange > 0))
19771992 then {
1978- let $t06566065757 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1979- if (($t06566065757 == $t06566065757))
1993+ let $t06619966296 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1994+ if (($t06619966296 == $t06619966296))
19801995 then {
1981- let claimedAsset = $t06566065757._2
1982- let claimedAmount = $t06566065757._1
1996+ let claimedAsset = $t06619966296._2
1997+ let claimedAmount = $t06619966296._1
19831998 let rArgs = split(route, "__")
19841999 let exchangedAmount = if ((amountToExchange > 0))
19852000 then if ((rArgs[0] == "directSwopfiCPMM"))
19942009 let changeEntry = if ((newChange >= 0))
19952010 then [IntegerEntry((pool + kPoolCapChange), newChange)]
19962011 else nil
1997- let $t06625466364 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1998- let capEnterise = $t06625466364._1
1999- let staked = $t06625466364._2
2012+ let $t06679366903 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
2013+ let capEnterise = $t06679366903._1
2014+ let staked = $t06679366903._2
20002015 $Tuple2((capEnterise ++ changeEntry), staked)
20012016 }
20022017 else throw("Strict value is not equal to itself.")
20042019 else throw("Strict value is not equal to itself.")
20052020 }
20062021 else $Tuple2(nil, 0)
2007- let capEnterise = $t06559866424._1
2008- let staked = $t06559866424._2
2009- let $t06642766544 = if (isMarketPool)
2022+ let capEnterise = $t06613766963._1
2023+ let staked = $t06613766963._2
2024+ let $t06696667083 = if (isMarketPool)
20102025 then capitalizePuzzleMarket(pool, pType, shareId)
20112026 else $Tuple2(nil, 0)
2012- let marketCapEnteris = $t06642766544._1
2013- let stakedMarket = $t06642766544._2
2027+ let marketCapEnteris = $t06696667083._1
2028+ let stakedMarket = $t06696667083._2
20142029 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
20152030 }))
20162031
20202035 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
20212036 let pType = getStringValue(this, (kPool + pool))
20222037 let poolAddr = Address(fromBase58String(pool))
2023- let $t06697967045 = getPoolData(poolAddr, pType)
2024- let AId = $t06697967045._1
2025- let BId = $t06697967045._2
2026- let balA = $t06697967045._3
2027- let balB = $t06697967045._4
2028- let shareId = $t06697967045._5
2038+ let $t06751867584 = getPoolData(poolAddr, pType)
2039+ let AId = $t06751867584._1
2040+ let BId = $t06751867584._2
2041+ let balA = $t06751867584._3
2042+ let balB = $t06751867584._4
2043+ let shareId = $t06751867584._5
20292044 let totalShareAmount = getPoolTotalShare(pool)
2030- let $t06709767195 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2031- if (($t06709767195 == $t06709767195))
2045+ let $t06763667734 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2046+ if (($t06763667734 == $t06763667734))
20322047 then {
2033- let claimedAsset = $t06709767195._2
2034- let claimedAmount = $t06709767195._1
2035- let $t06719867324 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2036- let capEnterise = $t06719867324._1
2037- let staked = $t06719867324._2
2048+ let claimedAsset = $t06763667734._2
2049+ let claimedAmount = $t06763667734._1
2050+ let $t06773767863 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2051+ let capEnterise = $t06773767863._1
2052+ let staked = $t06773767863._2
20382053 (([IntegerEntry((pool + kPoolTotal), (totalShareAmount + staked))] ++ capEnterise) ++ getCursEntries(AId, BId, shareId, nil))
20392054 }
20402055 else throw("Strict value is not equal to itself.")
20522067 else false)
20532068 then throw("Wrong pool type")
20542069 else {
2055- let $t06797868072 = getPoolData(Address(fromBase58String(poolAddr)), type)
2056- let aId = $t06797868072._1
2057- let bId = $t06797868072._2
2058- let aBal = $t06797868072._3
2059- let bBal = $t06797868072._4
2060- let shareId = $t06797868072._5
2070+ let $t06851768611 = getPoolData(Address(fromBase58String(poolAddr)), type)
2071+ let aId = $t06851768611._1
2072+ let bId = $t06851768611._2
2073+ let aBal = $t06851768611._3
2074+ let bBal = $t06851768611._4
2075+ let shareId = $t06851768611._5
20612076 if ((0 > inFeeNoLoan))
20622077 then throw("inFeeNoLoan must be greater than 0")
20632078 else if ((0 > inFeeLoan))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let CONF = addressFromStringValue(getStringValue(this, "config"))
55
66 let SF_POOL = "SF"
77
88 let WX_POOL = "WX"
99
1010 let CPMM = "cpmm"
1111
1212 let FLAT = "flat"
1313
1414 let CAP_FEE_NO_LOAN = "capNoLoan"
1515
1616 let CAP_FEE_LOAN = "capLoan"
1717
1818 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1919
2020 let STOPLOSS_LOAN = "stopLossLoan"
2121
2222 let LOAN_FEE = "loan"
2323
2424 let NO_LOAN_FEE = "noLoan"
2525
2626 let NO_FEE = "noFee"
2727
2828 let SCALE8 = 100000000
2929
3030 let SCALE10 = 10000000000
3131
3232 let SCALE16 = toBigInt(10000000000000000)
3333
3434 let FEE_SCALE6 = 1000000
3535
3636 let kSFPoolAAssetBalance = "A_asset_balance"
3737
3838 let kSFPoolBAssetBalance = "B_asset_balance"
3939
4040 let kSFPoolAAssetId = "A_asset_id"
4141
4242 let kSFPoolBAssetId = "B_asset_id"
4343
4444 let kSFPoolShareId = "share_asset_id"
4545
4646 let kSFPoolShareSupply = "share_asset_supply"
4747
4848 let kSFPoolFee = "commission"
4949
5050 let kUserPosition = "_userPosition"
5151
5252 let kUserPositionPool = "_userPositionPool"
5353
5454 let kUserBorrowAmount = "_userPositionBorrowAmount"
5555
5656 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5757
5858 let kUserPositionNum = "_userPositionNumber"
5959
6060 let kUserPositionInterest = "_userPositionInterest"
6161
6262 let kUserPositionInPMarket = "_userPositionPMarket"
6363
6464 let kPoolTotal = "_poolTotal"
6565
6666 let kPoolTotalLoan = "_poolTotalLoan"
6767
6868 let kPoolTotalMarket = "_poolTotalMarket"
6969
7070 let kPoolTotalMarketLoan = "_poolTotalMarketLoan"
7171
7272 let kPoolInterestLoan = "_poolInterestLoan"
7373
7474 let kPoolInterestNoLoan = "_poolInterestNoLoan"
7575
7676 let kPoolInterestMarketLoan = "_poolInterestMarketLoan"
7777
7878 let kPoolInterestMarketNoLoan = "_poolInterestMarketNoLoan"
7979
8080 let kPoolAllowedBorrowAssets = "_poolAllowedBorrowAssets"
8181
8282 let kPoolCanBorrow = "_poolCanBorrow"
8383
8484 let kPoolPMArket = "_poolPuzzleMarket"
8585
8686 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
8787
8888 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
8989
9090 let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
9191
9292 let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
9393
9494 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
9595
9696 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
9797
9898 let kRequestId = "_request_id"
9999
100100 let kRequestIter = "requests_iter"
101101
102102 let kPool = "pool_"
103103
104104 let kPoolType = "_poolType"
105105
106106 let kSharePool = "_poolShareId"
107107
108108 let kPoolCapChange = "_poolCapChange"
109109
110110 let kTokenLastPrice = "last_price"
111111
112112 let kPriceInOracle = "_twap5B"
113113
114114 let kActive = "active"
115115
116116 let kActiveUsers = "activeUsers"
117117
118118 let kActiveSFWX = "_active"
119119
120120 let kPoolActive = "_activePool"
121121
122122 let kUserStopLoss = "_stopLoss"
123123
124124 let kFallbackExchangeSwopfi = "_fallbackExchangeSwopfi"
125125
126126 let kPoolProxyAddr = "_poolProxyAddress"
127127
128128 let kMoneyBox = "axly_money_box"
129129
130130 let kSFFarmingAddr = "swopfi_farming_addr"
131131
132132 let kLendService = "lend_service_addr"
133133
134134 let kOperatorCallPK = "admin_call_pub_key"
135135
136136 let kPriceOracle = "price_oracle"
137137
138138 let kExContract = "exchange_contract"
139139
140140 let kWxSwapContract = "wx_swap_contract"
141141
142142 let kWxRest = "wx_rest_addr"
143143
144144 let kSwopId = "swop_id"
145145
146146 let kWxId = "wx_id"
147147
148148 let kPMarketAddr = "puzzle_market_address"
149149
150150 let kPMarketRestAddr = "puzzle_market_rest_address"
151151
152152 let kGroup1Admin1PK = "group1_admin1_pub_key"
153153
154154 let kGroup1Admin2PK = "group1_admin2_pub_key"
155155
156156 let kGroup1Admin3PK = "group1_admin3_pub_key"
157157
158158 let kGroup2Admin1PK = "group2_admin1_pub_key"
159159
160160 let kGroup2Admin2PK = "group2_admin2_pub_key"
161161
162162 let moneyBox = addressFromStringValue(valueOrErrorMessage(getString(CONF, kMoneyBox), "No axly moneyBox address"))
163163
164164 let exContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kExContract), "No exchange contract address"))
165165
166166 let priceOracleAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPriceOracle), "No price oracle address"))
167167
168168 let wxSwapContract = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxSwapContract), "No wx swap address"))
169169
170170 let wxRest = addressFromStringValue(valueOrErrorMessage(getString(CONF, kWxRest), "No wx rest address"))
171171
172172 let SWOPID = fromBase58String(valueOrErrorMessage(getString(CONF, kSwopId), "No swop id"))
173173
174174 let WXID = fromBase58String(valueOrErrorMessage(getString(CONF, kWxId), "No wx id"))
175175
176176 let pMarketAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketAddr), "No puzzle market address"))
177177
178178 let pMarketRestAddr = addressFromStringValue(valueOrErrorMessage(getString(CONF, kPMarketRestAddr), "No puzzle market rest address"))
179179
180180 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
181181
182182 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
183183
184184 let group1Admin3PK = fromBase58String(valueOrErrorMessage(getString(CONF, kGroup1Admin3PK), "Can't get kGroup1Admin3PK"))
185185
186186 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
187187
188188 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
189189
190190 let operatorPK = fromBase58String(valueOrErrorMessage(getString(CONF, kOperatorCallPK), "Can't get operatorPK"))
191191
192192 func unknownPoolType () = throw("Wrong pool type")
193193
194194
195195 func getLendSrvAddr () = addressFromStringValue(valueOrErrorMessage(getString(CONF, kLendService), "Can't get lend service addr"))
196196
197197
198198 func isOperatorCall (i) = if (if ((i.callerPublicKey == operatorPK))
199199 then true
200200 else (i.caller == moneyBox))
201201 then unit
202202 else throw("Only operator can call this function")
203203
204204
205205 func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
206206 then true
207207 else (i.callerPublicKey == group1Admin2PK))
208208 then unit
209209 else throw("Only admin group1 can call this function")
210210
211211
212212 func isSelfCall (i) = if ((i.caller == this))
213213 then unit
214214 else throw("Only contract itself can call this function")
215215
216216
217217 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
218218 then unit
219219 else throw("Only land contract can call this function")
220220
221221
222222 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
223223 then unit
224224 else throw("DApp is inactive at this moment")
225225
226226
227227 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
228228 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
229229 else false)
230230 then unit
231231 else throw("DApp is inactive for users at this moment")
232232
233233
234234 func isPoolActive (pool,type) = {
235235 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
236236 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
237237 if (if (WXSFActive)
238238 then poolActive
239239 else false)
240240 then true
241241 else false
242242 }
243243
244244
245245 func accountBalance (assetId) = match assetId {
246246 case id: ByteVector =>
247247 assetBalance(this, id)
248248 case waves: Unit =>
249249 wavesBalance(this).available
250250 case _ =>
251251 throw("Match error")
252252 }
253253
254254
255255 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"))
256256
257257
258258 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
259259 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
260260 if ($isInstanceOf(@, "Int"))
261261 then @
262262 else throw(($getType(@) + " couldn't be cast to Int"))
263263 }, {
264264 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
265265 if ($isInstanceOf(@, "Int"))
266266 then @
267267 else throw(($getType(@) + " couldn't be cast to Int"))
268268 })
269269
270270
271271 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
272272 then getSFPoolBalances(poolAddr)
273273 else if ((type == WX_POOL))
274274 then getWXPoolBalances(poolAddr, aId, bId)
275275 else unknownPoolType()
276276
277277
278278 func getSFPoolData (poolAddr) = {
279279 let $t097399788 = getSFPoolBalances(poolAddr)
280280 if (($t097399788 == $t097399788))
281281 then {
282282 let balB = $t097399788._2
283283 let balA = $t097399788._1
284284 $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"))
285285 }
286286 else throw("Strict value is not equal to itself.")
287287 }
288288
289289
290290 func getWXPoolData (poolAddr) = {
291291 let cfg = {
292292 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
293293 if ($isInstanceOf(@, "List[Any]"))
294294 then @
295295 else throw(($getType(@) + " couldn't be cast to List[Any]"))
296296 }
297297 if ((cfg == cfg))
298298 then {
299299 let aId = valueOrErrorMessage({
300300 let @ = cfg[4]
301301 if ($isInstanceOf(@, "String"))
302302 then @
303303 else unit
304304 }, "Can't get pool A asset id")
305305 let bId = valueOrErrorMessage({
306306 let @ = cfg[5]
307307 if ($isInstanceOf(@, "String"))
308308 then @
309309 else unit
310310 }, "Can't get pool B asset id")
311311 let shareId = valueOrErrorMessage({
312312 let @ = cfg[3]
313313 if ($isInstanceOf(@, "String"))
314314 then @
315315 else unit
316316 }, "Can't get pool LP asset id")
317317 let $t01048510544 = getWXPoolBalances(poolAddr, aId, bId)
318318 if (($t01048510544 == $t01048510544))
319319 then {
320320 let balB = $t01048510544._2
321321 let balA = $t01048510544._1
322322 $Tuple5(aId, bId, balA, balB, shareId)
323323 }
324324 else throw("Strict value is not equal to itself.")
325325 }
326326 else throw("Strict value is not equal to itself.")
327327 }
328328
329329
330330 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
331331 then getSFPoolData(poolAddr)
332332 else if ((type == WX_POOL))
333333 then getWXPoolData(poolAddr)
334334 else unknownPoolType()
335335
336336
337337 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
338338 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
339339 else if ((type == WX_POOL))
340340 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
341341 else unknownPoolType()
342342
343343
344344 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
345345
346346
347347 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
348348
349349
350350 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
351351
352352
353353 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
354354 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
355355 else if ((feeType == CAP_FEE_NO_LOAN))
356356 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
357357 else if ((feeType == LOAN_FEE))
358358 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
359359 else if ((feeType == NO_LOAN_FEE))
360360 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
361361 else if ((feeType == NO_FEE))
362362 then 0
363363 else throw("Wrong fee type")
364364
365365
366366 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(CONF, kSFFarmingAddr), "Can't get swopfi farming addr")))
367367
368368
369369 func getWXFarmingAddr (poolAddr) = {
370370 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
371371 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
372372 Address(fromBase58String(factroyCfg[1]))
373373 }
374374
375375
376376 func assetIdToStr (assetId) = match assetId {
377377 case id: ByteVector =>
378378 toBase58String(id)
379379 case waves: Unit =>
380380 "WAVES"
381381 case _ =>
382382 throw("Not Asset id")
383383 }
384384
385385
386386 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
387387 then unit
388388 else fromBase58String(assetId)
389389
390390
391391 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
392392 then 8
393393 else match assetInfo(fromBase58String(assetId)) {
394394 case asset: Asset =>
395395 asset.decimals
396396 case _ =>
397397 throw("Can't find asset")
398398 }
399399
400400
401401 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
402402
403403
404404 func getAssetsPrice (assetIds) = {
405405 func getPrices (a,assetId) = {
406406 let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
407407 (a :+ assetPrice)
408408 }
409409
410410 let $l = assetIds
411411 let $s = size($l)
412412 let $acc0 = nil
413413 func $f0_1 ($a,$i) = if (($i >= $s))
414414 then $a
415415 else getPrices($a, $l[$i])
416416
417417 func $f0_2 ($a,$i) = if (($i >= $s))
418418 then $a
419419 else throw("List size exceeds 50")
420420
421421 $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)
422422 }
423423
424424
425425 func getSharePrice (shareId) = {
426426 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
427427 let poolAddr = Address(fromBase58String(pool))
428428 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
429429 let $t01353313598 = getPoolData(poolAddr, pType)
430430 let aId = $t01353313598._1
431431 let bId = $t01353313598._2
432432 let aBalance = $t01353313598._3
433433 let bBalance = $t01353313598._4
434434 let prices = getAssetsPrice([aId, bId])
435435 let dPriceA = prices[0]
436436 let dPriceB = prices[1]
437437 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
438438 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
439439 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
440440 let shareSupply = getShareSupply(poolAddr, pType, shareId)
441441 let sum = if (if ((dPriceA > 0))
442442 then (dPriceB > 0)
443443 else false)
444444 then (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
445445 else if ((dPriceA > 0))
446446 then (fraction(aBalance, dPriceA, APrecision) * 2)
447447 else if ((dPriceB > 0))
448448 then (fraction(bBalance, dPriceB, BPrecision) * 2)
449449 else -1
450450 if ((0 > sum))
451451 then -1
452452 else fraction(sum, sharePrecision, shareSupply)
453453 }
454454
455455
456456 func getSharePrices (shareIds) = {
457457 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
458458
459459 let $l = shareIds
460460 let $s = size($l)
461461 let $acc0 = nil
462462 func $f0_1 ($a,$i) = if (($i >= $s))
463463 then $a
464464 else getPrices($a, $l[$i])
465465
466466 func $f0_2 ($a,$i) = if (($i >= $s))
467467 then $a
468468 else throw("List size exceeds 20")
469469
470470 $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)
471471 }
472472
473473
474474 func getCursEntries (aId,bId,shareId,wAmounts) = {
475475 let assetsPrices = getAssetsPrice([aId, bId])
476476 let sharePrice = getSharePrice(shareId)
477477 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
478478 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
479479 }
480480
481481
482482 func calcReplenishByTwoTokens (pType,poolAddr,LPId,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
483483 then {
484484 let repl = {
485485 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
486486 if ($isInstanceOf(@, "List[Any]"))
487487 then @
488488 else throw(($getType(@) + " couldn't be cast to List[Any]"))
489489 }
490490 if ((repl == repl))
491491 then $Tuple5({
492492 let @ = repl[3]
493493 if ($isInstanceOf(@, "Int"))
494494 then @
495495 else throw(($getType(@) + " couldn't be cast to Int"))
496496 }, {
497497 let @ = repl[4]
498498 if ($isInstanceOf(@, "Int"))
499499 then @
500500 else throw(($getType(@) + " couldn't be cast to Int"))
501501 }, {
502502 let @ = repl[1]
503503 if ($isInstanceOf(@, "Int"))
504504 then @
505505 else throw(($getType(@) + " couldn't be cast to Int"))
506506 }, assetIdToStr(repl[2]), {
507507 let @ = repl[0]
508508 if ($isInstanceOf(@, "Int"))
509509 then @
510510 else throw(($getType(@) + " couldn't be cast to Int"))
511511 })
512512 else throw("Strict value is not equal to itself.")
513513 }
514514 else if ((pType == WX_POOL))
515515 then {
516516 let $t01535315619 = $Tuple2(split({
517517 let @ = invoke(wxRest, "poolEvaluatePutByAmountAssetREADONLY", [LPId, pmtA], nil)
518518 if ($isInstanceOf(@, "String"))
519519 then @
520520 else throw(($getType(@) + " couldn't be cast to String"))
521521 }, "__"), split({
522522 let @ = invoke(wxRest, "poolEvaluatePutByPriceAssetREADONLY", [LPId, pmtB], nil)
523523 if ($isInstanceOf(@, "String"))
524524 then @
525525 else throw(($getType(@) + " couldn't be cast to String"))
526526 }, "__"))
527527 if (($t01535315619 == $t01535315619))
528528 then {
529529 let evalPutInB = $t01535315619._2
530530 let evalPutInA = $t01535315619._1
531531 let lpInA = parseIntValue(evalPutInA[1])
532532 let lpInB = parseIntValue(evalPutInB[1])
533533 if ((lpInB > lpInA))
534534 then {
535535 let pmt = parseIntValue(evalPutInA[8])
536536 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
537537 }
538538 else {
539539 let pmt = parseIntValue(evalPutInB[7])
540540 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
541541 }
542542 }
543543 else throw("Strict value is not equal to itself.")
544544 }
545545 else unknownPoolType()
546546
547547
548548 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId,lpId) = {
549549 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
550550 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
551551 if ((pType == SF_POOL))
552552 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
553553 else if ((pType == WX_POOL))
554554 then if ((proxyAddr == ""))
555555 then invoke(poolAddr, "put", [1000000, false], payments)
556556 else invoke(addressFromStringValue(proxyAddr), "wxReplenishTwoTokens", [toString(poolAddr), lpId, 1000000, false], payments)
557557 else unknownPoolType()
558558 }
559559
560560
561561 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId,lpId) = {
562562 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
563563 let proxyAddr = valueOrElse(getString(this, (toString(poolAddr) + kPoolProxyAddr)), "")
564564 if ((pType == SF_POOL))
565565 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
566566 else if ((pType == WX_POOL))
567567 then {
568568 let fc = if ((valueOrElse(getString(this, (toString(poolAddr) + kPoolType)), "cpmm") == FLAT))
569569 then "putOneTknV2"
570570 else "putOneTkn"
571571 if ((proxyAddr == ""))
572572 then invoke(poolAddr, fc, [0, false], payments)
573573 else invoke(addressFromStringValue(proxyAddr), "wxReplenishOneToken", [toString(poolAddr), lpId, fc, 0, false], payments)
574574 }
575575 else unknownPoolType()
576576 }
577577
578578
579579 func stakeLP (pool,pType,shareId,amount,stakeToMarket) = {
580580 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
581581 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
582582 if (stakeToMarket)
583583 then invoke(pMarketAddr, "supply", nil, payments)
584584 else if ((pType == SF_POOL))
585585 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
586586 else if ((pType == WX_POOL))
587587 then {
588588 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
589589 if ((proxyAddr == ""))
590590 then invoke(farmAddr, "stake", nil, payments)
591591 else invoke(addressFromStringValue(proxyAddr), "wxStakeLp", [toString(farmAddr)], payments)
592592 }
593593 else unknownPoolType()
594594 }
595595
596596
597597 func unstakeLP (pool,pType,shareId,amount,fromMarket) = {
598598 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
599599 let $t01835619038 = if (fromMarket)
600600 then $Tuple3(pMarketAddr, "withdraw", [shareId, amount])
601601 else if ((pType == SF_POOL))
602602 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
603603 else if ((pType == WX_POOL))
604604 then {
605605 let farmAddr = getWXFarmingAddr(Address(fromBase58String(pool)))
606606 if ((proxyAddr == ""))
607607 then $Tuple3(farmAddr, "unstake", [shareId, amount])
608608 else $Tuple3(addressFromStringValue(proxyAddr), "wxUnstakeLp", [toString(farmAddr), shareId, amount])
609609 }
610610 else unknownPoolType()
611611 let farmAddr = $t01835619038._1
612612 let fName = $t01835619038._2
613613 let params = $t01835619038._3
614614 let inv = invoke(farmAddr, fName, params, nil)
615615 if ((inv == inv))
616616 then amount
617617 else throw("Strict value is not equal to itself.")
618618 }
619619
620620
621621 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
622622 let poolAddr = Address(fromBase58String(pool))
623623 let feeScale6 = 1000000
624624 let fee = getIntegerValue(poolAddr, kSFPoolFee)
625625 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
626626 let $t01946019766 = if ((assetTokenToGet == assetIdA))
627627 then {
628628 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
629629 $Tuple2(amountToPay, assetIdB)
630630 }
631631 else {
632632 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
633633 $Tuple2(amountToPay, assetIdA)
634634 }
635635 let amountToPay = $t01946019766._1
636636 let assetToPay = $t01946019766._2
637637 $Tuple2(assetToPay, amountToPay)
638638 }
639639
640640
641641 func getWXSwapFees (pool) = {
642642 let poolAddr = addressFromStringValue(pool)
643643 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
644644 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
645645 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
646646 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
647647 case fees: (Int, Int) =>
648648 $Tuple2(fees._1, fees._2)
649649 case _ =>
650650 $Tuple2(poolFeeDefault, protocolFeeDefault)
651651 }
652652 }
653653
654654
655655 func getWXPoolReverse (poolAddr,assetIn,assetOut) = {
656656 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
657657 let lpNonReverse = {
658658 let @ = invoke(fContract, "getLpAssetFromPoolAssetsREADONLY", [assetIn, assetOut], nil)
659659 if ($isInstanceOf(@, "String"))
660660 then @
661661 else unit
662662 }
663663 let lpReverse = {
664664 let @ = invoke(fContract, "getLpAssetFromPoolAssetsREADONLY", [assetOut, assetIn], nil)
665665 if ($isInstanceOf(@, "String"))
666666 then @
667667 else unit
668668 }
669669 if ((lpNonReverse != unit))
670670 then false
671671 else if ((lpReverse != unit))
672672 then true
673673 else throw("Pool is not exist")
674674 }
675675
676676
677677 func calcFlatToPay (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
678678 let assetIn = if ((assetTokenToGet == assetIdA))
679679 then assetIdB
680680 else assetIdA
681681 let amoutGet = {
682682 let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [amountTokenToGet, assetIn, assetTokenToGet], nil)
683683 if ($isInstanceOf(@, "Int"))
684684 then @
685685 else throw(($getType(@) + " couldn't be cast to Int"))
686686 }
687687 if ((amoutGet == amoutGet))
688688 then if ((amoutGet == amountTokenToGet))
689689 then $Tuple2(assetIn, amountTokenToGet)
690690 else {
691- let amountToPayMax = if ((amountTokenToGet > amoutGet))
692- then fraction(amountTokenToGet, 110, 100)
693- else fraction(amountTokenToGet, 90, 100)
694- let amountGetMax = {
695- let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [amountToPayMax, assetIn, assetTokenToGet], nil)
696- if ($isInstanceOf(@, "Int"))
697- then @
698- else throw(($getType(@) + " couldn't be cast to Int"))
691+ let amountToPayMax = {
692+ let aPM = if ((amountTokenToGet > amoutGet))
693+ then fraction(amountTokenToGet, 110, 100)
694+ else fraction(amountTokenToGet, 90, 100)
695+ let amountGetMax = {
696+ let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [aPM, assetIn, assetTokenToGet], nil)
697+ if ($isInstanceOf(@, "Int"))
698+ then @
699+ else throw(($getType(@) + " couldn't be cast to Int"))
700+ }
701+ if ((amountGetMax == amountGetMax))
702+ then if ((amoutGet > amountGetMax))
703+ then fraction(aPM, 110, 100)
704+ else aPM
705+ else throw("Strict value is not equal to itself.")
699706 }
700- if ((amountGetMax == amountGetMax))
701- then {
702- func hdm (a,index) = {
703- let $t02172121742 = a
704- let pay = $t02172121742._1
705- let payMax = $t02172121742._2
706- let payNext = ((pay + payMax) / 2)
707- let amountGetNext = {
708- let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [payNext, assetIn, assetTokenToGet], nil)
709- if ($isInstanceOf(@, "Int"))
710- then @
711- else throw(($getType(@) + " couldn't be cast to Int"))
712- }
713- if ((amountGetNext == amountGetNext))
714- then if ((amountTokenToGet > amountGetNext))
715- then $Tuple2(payNext, payMax)
716- else $Tuple2(pay, payNext)
717- else throw("Strict value is not equal to itself.")
718- }
719-
720- let resAmntToPay = {
721- let $l = [1, 2]
722- let $s = size($l)
723- let $acc0 = $Tuple2(amountTokenToGet, amountToPayMax)
724- func $f0_1 ($a,$i) = if (($i >= $s))
725- then $a
726- else hdm($a, $l[$i])
727-
728- func $f0_2 ($a,$i) = if (($i >= $s))
729- then $a
730- else throw("List size exceeds 2")
731-
732- $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
733- }
734- let amountToPay = if ((amountTokenToGet > amoutGet))
735- then resAmntToPay._2
736- else resAmntToPay._1
737- $Tuple2(assetIn, amountToPay)
707+ func hdm (a,index) = {
708+ let $t02183221853 = a
709+ let pay = $t02183221853._1
710+ let payMax = $t02183221853._2
711+ let payNext = ((pay + payMax) / 2)
712+ let amountGetNext = {
713+ let @ = invoke(wxSwapContract, "swapCalculateREADONLY", [payNext, assetIn, assetTokenToGet], nil)
714+ if ($isInstanceOf(@, "Int"))
715+ then @
716+ else throw(($getType(@) + " couldn't be cast to Int"))
738717 }
739- else throw("Strict value is not equal to itself.")
718+ if ((amountGetNext == amountGetNext))
719+ then if ((amountTokenToGet > amountGetNext))
720+ then $Tuple2(payNext, payMax)
721+ else $Tuple2(pay, payNext)
722+ else throw("Strict value is not equal to itself.")
723+ }
724+
725+ let resAmntToPay = {
726+ let $l = [1, 2]
727+ let $s = size($l)
728+ let $acc0 = $Tuple2(amountTokenToGet, amountToPayMax)
729+ func $f0_1 ($a,$i) = if (($i >= $s))
730+ then $a
731+ else hdm($a, $l[$i])
732+
733+ func $f0_2 ($a,$i) = if (($i >= $s))
734+ then $a
735+ else throw("List size exceeds 2")
736+
737+ $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
738+ }
739+ let amountToPay = if ((amountTokenToGet > amoutGet))
740+ then resAmntToPay._2
741+ else resAmntToPay._1
742+ $Tuple2(assetIn, amountToPay)
740743 }
741744 else throw("Strict value is not equal to itself.")
742745 }
743746
744747
745748 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
746- let $t02234022379 = getWXSwapFees(pool)
747- let pFee = $t02234022379._1
748- let prFee = $t02234022379._2
749+ let $t02245122490 = getWXSwapFees(pool)
750+ let pFee = $t02245122490._1
751+ let prFee = $t02245122490._2
749752 let poolType = valueOrElse(getString(this, (pool + kPoolType)), CPMM)
750753 let feeScale = toBigInt(100000000)
751754 if ((poolType == FLAT))
752755 then calcFlatToPay(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
753756 else {
754- let $t02261222920 = if ((assetTokenToGet == assetIdA))
757+ let $t02272323031 = if ((assetTokenToGet == assetIdA))
755758 then {
756759 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
757760 $Tuple2(amountToPay, assetIdB)
758761 }
759762 else {
760763 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
761764 $Tuple2(amountToPay, assetIdA)
762765 }
763- let amountToPay = $t02261222920._1
764- let assetToPay = $t02261222920._2
766+ let amountToPay = $t02272323031._1
767+ let assetToPay = $t02272323031._2
765768 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
766769 $Tuple2(assetToPay, amountToPayWithFee)
767770 }
768771 }
769772
770773
771774 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
772775 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
773776 if (if ((pType == SF_POOL))
774777 then true
775778 else (poolFB != ""))
776779 then {
777- let $t02336123573 = if ((poolFB == ""))
780+ let $t02347223684 = if ((poolFB == ""))
778781 then $Tuple3(balA, balB, pool)
779782 else {
780- let $t02346723540 = getSFPoolBalances(addressFromStringValue(poolFB))
781- let sfBalA = $t02346723540._1
782- let sfBalB = $t02346723540._2
783+ let $t02357823651 = getSFPoolBalances(addressFromStringValue(poolFB))
784+ let sfBalA = $t02357823651._1
785+ let sfBalB = $t02357823651._2
783786 $Tuple3(sfBalA, sfBalB, poolFB)
784787 }
785- let pBalA = $t02336123573._1
786- let pBalB = $t02336123573._2
787- let exPool = $t02336123573._3
788- let $t02357823704 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
789- let assetToPay = $t02357823704._1
790- let amountToPay = $t02357823704._2
788+ let pBalA = $t02347223684._1
789+ let pBalB = $t02347223684._2
790+ let exPool = $t02347223684._3
791+ let $t02368923815 = calcAmountToPaySF(exPool, assetIdA, assetIdB, pBalA, pBalB, amountTokenToGet, assetTokenToGet)
792+ let assetToPay = $t02368923815._1
793+ let amountToPay = $t02368923815._2
791794 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
792795 }
793796 else if ((pType == WX_POOL))
794797 then {
795- let $t02390624028 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
796- let assetToPay = $t02390624028._1
797- let amountToPay = $t02390624028._2
798+ let $t02401724139 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
799+ let assetToPay = $t02401724139._1
800+ let amountToPay = $t02401724139._2
798801 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
799802 }
800803 else unknownPoolType()
801804 }
802805
803806
804807 func exchangeDirectlyNoLim (pType,pool,amountTokenEx,assetTokenToEx,assetTokenToGet) = {
805808 let balBefore = accountBalance(assetIdFromStr(assetTokenToGet))
806809 if ((balBefore == balBefore))
807810 then {
808811 let poolFB = valueOrElse(getString(this, (pool + kFallbackExchangeSwopfi)), "")
809812 let inv = if (if ((pType == SF_POOL))
810813 then true
811814 else (poolFB != ""))
812815 then {
813816 let exPool = if ((poolFB == ""))
814817 then pool
815818 else poolFB
816819 invoke(addressFromStringValue(exPool), "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
817820 }
818821 else if ((pType == WX_POOL))
819822 then invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetTokenToEx), amountTokenEx)])
820823 else unknownPoolType()
821824 if ((inv == inv))
822825 then {
823826 let balAfter = accountBalance(assetIdFromStr(assetTokenToGet))
824827 if ((balAfter == balAfter))
825828 then (balAfter - balBefore)
826829 else throw("Strict value is not equal to itself.")
827830 }
828831 else throw("Strict value is not equal to itself.")
829832 }
830833 else throw("Strict value is not equal to itself.")
831834 }
832835
833836
834837 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
835- let $t02515725628 = if ((pType == SF_POOL))
838+ let $t02526825739 = if ((pType == SF_POOL))
836839 then {
837840 let inv = {
838841 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
839842 if ($isInstanceOf(@, "List[Any]"))
840843 then @
841844 else throw(($getType(@) + " couldn't be cast to List[Any]"))
842845 }
843846 if ((inv == inv))
844847 then $Tuple2({
845848 let @ = inv[0]
846849 if ($isInstanceOf(@, "Int"))
847850 then @
848851 else throw(($getType(@) + " couldn't be cast to Int"))
849852 }, {
850853 let @ = inv[1]
851854 if ($isInstanceOf(@, "Int"))
852855 then @
853856 else throw(($getType(@) + " couldn't be cast to Int"))
854857 })
855858 else throw("Strict value is not equal to itself.")
856859 }
857860 else if ((pType == WX_POOL))
858861 then {
859862 let inv = split({
860863 let @ = invoke(wxRest, "poolEvaluateGetREADONLY", [shareId, userCanWithdraw], nil)
861864 if ($isInstanceOf(@, "String"))
862865 then @
863866 else throw(($getType(@) + " couldn't be cast to String"))
864867 }, "__")
865868 if ((inv == inv))
866869 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
867870 else throw("Strict value is not equal to itself.")
868871 }
869872 else unknownPoolType()
870- let amountA = $t02515725628._1
871- let amountB = $t02515725628._2
873+ let amountA = $t02526825739._1
874+ let amountB = $t02526825739._2
872875 $Tuple2(amountA, amountB)
873876 }
874877
875878
876879 func claimFarmed (pType,pool) = {
877880 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
878881 if ((pType == SF_POOL))
879882 then {
880883 let balBefore = accountBalance(SWOPID)
881884 if ((balBefore == balBefore))
882885 then {
883886 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
884887 if ((inv == inv))
885888 then {
886889 let balAfter = accountBalance(SWOPID)
887890 $Tuple2((balAfter - balBefore), SWOPID)
888891 }
889892 else throw("Strict value is not equal to itself.")
890893 }
891894 else throw("Strict value is not equal to itself.")
892895 }
893896 else if ((pType == WX_POOL))
894897 then {
895- let $t02606826147 = getWXPoolData(addressFromStringValue(pool))
896- let aId = $t02606826147._1
897- let bId = $t02606826147._2
898- let aBal = $t02606826147._3
899- let bBal = $t02606826147._4
900- let lpId = $t02606826147._5
898+ let $t02617926258 = getWXPoolData(addressFromStringValue(pool))
899+ let aId = $t02617926258._1
900+ let bId = $t02617926258._2
901+ let aBal = $t02617926258._3
902+ let bBal = $t02617926258._4
903+ let lpId = $t02617926258._5
901904 let balBefore = accountBalance(WXID)
902905 if ((balBefore == balBefore))
903906 then {
904907 let farmAddr = getWXFarmingAddr(addressFromStringValue(pool))
905908 let inv = if ((proxyAddr == ""))
906909 then invoke(farmAddr, "claimWx", [lpId], nil)
907910 else invoke(addressFromStringValue(proxyAddr), "wxClaimFarmed", [toString(farmAddr), lpId], nil)
908911 if ((inv == inv))
909912 then {
910913 let balAfter = accountBalance(WXID)
911914 $Tuple2((balAfter - balBefore), WXID)
912915 }
913916 else throw("Strict value is not equal to itself.")
914917 }
915918 else throw("Strict value is not equal to itself.")
916919 }
917920 else unknownPoolType()
918921 }
919922
920923
921924 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId,stakeMarket) = {
922925 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
923926 if ((lpBalanceBefore == lpBalanceBefore))
924927 then {
925928 let poolAddr = addressFromStringValue(pool)
926- let $t02695227380 = if (if ((pmtA > 0))
929+ let $t02706327491 = if (if ((pmtA > 0))
927930 then (pmtB > 0)
928931 else false)
929932 then {
930- let $t02701827140 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
931- let pmtInA = $t02701827140._1
932- let pmtInB = $t02701827140._2
933- let change = $t02701827140._3
934- let changeId = $t02701827140._4
933+ let $t02712927251 = calcReplenishByTwoTokens(pType, poolAddr, LPId, pmtA, aId, pmtB, bId, balA, balB)
934+ let pmtInA = $t02712927251._1
935+ let pmtInB = $t02712927251._2
936+ let change = $t02712927251._3
937+ let changeId = $t02712927251._4
935938 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId, LPId)
936939 if ((inv == inv))
937940 then $Tuple2(change, changeId)
938941 else throw("Strict value is not equal to itself.")
939942 }
940943 else if ((pmtA > 0))
941944 then $Tuple2(pmtA, aId)
942945 else if ((pmtB > 0))
943946 then $Tuple2(pmtB, bId)
944947 else throw("pmts must be > 0")
945- let change = $t02695227380._1
946- let changeId = $t02695227380._2
948+ let change = $t02706327491._1
949+ let changeId = $t02706327491._2
947950 let inv = if ((change > 0))
948951 then replenishOneTokenByType(poolAddr, pType, change, changeId, LPId)
949952 else nil
950953 if ((inv == inv))
951954 then {
952955 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
953956 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
954957 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
955958 let userShareForStake = (totalStaked - axlyFeeAmount)
956959 if ((0 >= userShareForStake))
957960 then throw("amount of staked sharetokens must be > 0")
958961 else {
959962 let invLP = stakeLP(pool, pType, LPId, userShareForStake, stakeMarket)
960963 if ((invLP == invLP))
961964 then $Tuple2(userShareForStake, axlyFeeAmount)
962965 else throw("Strict value is not equal to itself.")
963966 }
964967 }
965968 else throw("Strict value is not equal to itself.")
966969 }
967970 else throw("Strict value is not equal to itself.")
968971 }
969972
970973
971974 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan,stakeToMarket) = {
972975 let totalAmount = getPoolTotalShare(pool)
973976 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
974977 let totalAmountMarket = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
975978 let totalAmountMarketLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
976979 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
977980 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
978981 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
979982 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
980- let $t02884129666 = if (withLoan)
983+ let $t02895229777 = if (withLoan)
981984 then if (stakeToMarket)
982985 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalAmountMarketLoan + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
983986 else $Tuple2(poolInterestLoan, [IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount))])
984987 else if (stakeToMarket)
985988 then $Tuple2(poolInterestMarketNoLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalAmountMarket + stakedAmount)), BooleanEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInPMarket), true)])
986989 else $Tuple2(poolInterestNoLoan, nil)
987- let curPoolInterest = $t02884129666._1
988- let adEntry = $t02884129666._2
990+ let curPoolInterest = $t02895229777._1
991+ let adEntry = $t02895229777._2
989992 ([IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), 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))] ++ adEntry)
990993 }
991994
992995
993996 func listToInt (a,item) = (a :+ parseIntValue(item))
994997
995998
996999 func directSwopfiCPMM (rArgs,tokenTo) = {
9971000 let dApp = addressFromStringValue(rArgs[1])
9981001 let pmtP = split(rArgs[2], "|")
9991002 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
10001003 if ((tokenBalanceBefore == tokenBalanceBefore))
10011004 then {
10021005 let pmt = [AttachedPayment(assetIdFromStr(pmtP[0]), parseIntValue(pmtP[1]))]
10031006 let minToRecive = rArgs[3]
10041007 let inv = invoke(dApp, "callFunction", ["exchange", [minToRecive]], pmt)
10051008 if ((inv == inv))
10061009 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
10071010 else throw("Strict value is not equal to itself.")
10081011 }
10091012 else throw("Strict value is not equal to itself.")
10101013 }
10111014
10121015
10131016 func directRoutingSwopfi (rArgs,tokenTo) = {
10141017 let dApp = addressFromStringValue(rArgs[1])
10151018 let tokenBalanceBefore = accountBalance(assetIdFromStr(tokenTo))
10161019 if ((tokenBalanceBefore == tokenBalanceBefore))
10171020 then {
10181021 let pmt = {
10191022 let pmtP = split(rArgs[2], "|")
10201023 [AttachedPayment(fromBase58String(pmtP[0]), parseIntValue(pmtP[1]))]
10211024 }
10221025 let args = {
10231026 let eArgs = split(rArgs[3], "|")
10241027 let exchangers = split(eArgs[0], ",")
10251028 let exchangersType = split(eArgs[1], ",")
10261029 let args1 = {
10271030 let $l = split(eArgs[2], ",")
10281031 let $s = size($l)
10291032 let $acc0 = nil
10301033 func $f0_1 ($a,$i) = if (($i >= $s))
10311034 then $a
10321035 else listToInt($a, $l[$i])
10331036
10341037 func $f0_2 ($a,$i) = if (($i >= $s))
10351038 then $a
10361039 else throw("List size exceeds 3")
10371040
10381041 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
10391042 }
10401043 let args2 = {
10411044 let $l = split(eArgs[3], ",")
10421045 let $s = size($l)
10431046 let $acc0 = nil
10441047 func $f1_1 ($a,$i) = if (($i >= $s))
10451048 then $a
10461049 else listToInt($a, $l[$i])
10471050
10481051 func $f1_2 ($a,$i) = if (($i >= $s))
10491052 then $a
10501053 else throw("List size exceeds 3")
10511054
10521055 $f1_2($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3)
10531056 }
10541057 let routingAssetsKeys = split(eArgs[4], ",")
10551058 let minToRecive = parseIntValue(eArgs[5])
10561059 [exchangers, exchangersType, args1, args2, routingAssetsKeys, minToRecive]
10571060 }
10581061 let inv = invoke(dApp, "routingTrade", args, pmt)
10591062 if ((inv == inv))
10601063 then (accountBalance(assetIdFromStr(tokenTo)) - tokenBalanceBefore)
10611064 else throw("Strict value is not equal to itself.")
10621065 }
10631066 else throw("Strict value is not equal to itself.")
10641067 }
10651068
10661069
10671070 func capitalize (pool,pType,tokenId,tokenAmount,AId,BId,balA,balB,shareId) = if (if ((tokenId != AId))
10681071 then (tokenId != BId)
10691072 else false)
10701073 then throw("Wrong asset")
10711074 else {
10721075 let totalShareAmount = getPoolTotalShare(pool)
10731076 if ((totalShareAmount == 0))
10741077 then $Tuple2([ScriptTransfer(moneyBox, tokenAmount, fromBase58String(tokenId))], 0)
10751078 else {
10761079 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
10771080 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
10781081 if ((0 > ((totalShareAmount - totalMarketAmount) - totalShareAmountWithLoan)))
10791082 then throw("Error with share amount totalShareAmount < totalShareAmountWithLoan")
10801083 else {
10811084 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, (totalShareAmount - totalMarketAmount))
10821085 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
10831086 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
10841087 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
10851088 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
10861089 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
1087- let $t03274432844 = if ((tokenId == AId))
1090+ let $t03285532955 = if ((tokenId == AId))
10881091 then $Tuple2((tokenAmount - axlyFee), 0)
10891092 else $Tuple2(0, (tokenAmount - axlyFee))
1090- let pmtA = $t03274432844._1
1091- let pmtB = $t03274432844._2
1092- let $t03284732958 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1093- let stakedAmount = $t03284732958._1
1094- let nf = $t03284732958._2
1093+ let pmtA = $t03285532955._1
1094+ let pmtB = $t03285532955._2
1095+ let $t03295833069 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, false)
1096+ let stakedAmount = $t03295833069._1
1097+ let nf = $t03295833069._2
10951098 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
10961099 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
10971100 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
10981101 let stakedNoLoan = (stakedAmount - stakedLoan)
10991102 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
11001103 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
11011104 else 0
11021105 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
11031106 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
11041107 else 0
11051108 $Tuple2([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, assetIdFromStr(tokenId))], stakedAmount)
11061109 }
11071110 }
11081111 }
11091112
11101113
11111114 func capitalizePuzzleMarket (pool,pType,shareId) = {
11121115 let totalShareAmount = getPoolTotalShare(pool)
11131116 let marketBalance = assetBalance(pMarketAddr, fromBase58String(shareId))
11141117 if ((marketBalance == marketBalance))
11151118 then {
11161119 let marketAvailable = {
11171120 let @ = invoke(pMarketRestAddr, "assetSupplyByAddressREADONLY", [toString(pMarketAddr), shareId, toString(this)], nil)
11181121 if ($isInstanceOf(@, "Int"))
11191122 then @
11201123 else throw(($getType(@) + " couldn't be cast to Int"))
11211124 }
11221125 if ((marketAvailable == marketAvailable))
11231126 then {
11241127 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
11251128 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
11261129 if (if ((totalMarketAmount == 0))
11271130 then (marketAvailable > 0)
11281131 else false)
11291132 then {
11301133 let unstakedAmount = unstakeLP(pool, pType, shareId, marketAvailable, true)
11311134 if ((unstakedAmount == unstakedAmount))
11321135 then if ((marketBalance > unstakedAmount))
11331136 then $Tuple2([ScriptTransfer(moneyBox, unstakedAmount, fromBase58String(shareId))], 0)
11341137 else $Tuple2(nil, 0)
11351138 else throw("Strict value is not equal to itself.")
11361139 }
11371140 else {
11381141 let capAmount = (marketAvailable - totalMarketAmount)
11391142 if ((0 >= capAmount))
11401143 then $Tuple2(nil, 0)
11411144 else {
11421145 let marketLoanPercent = fraction(totalMarketAmountWithLoan, SCALE8, totalMarketAmount)
11431146 let tokensMarketForFeeLoan = fraction(capAmount, marketLoanPercent, SCALE8)
11441147 let tokensMarketForForFeeNoLoan = (capAmount - tokensMarketForFeeLoan)
11451148 let axlyMarketFeeLoan = fraction(tokensMarketForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
11461149 let axlyMarketFeeNoLoan = fraction(tokensMarketForForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
11471150 let axlyMarketFee = (axlyMarketFeeLoan + axlyMarketFeeNoLoan)
11481151 if ((axlyMarketFee > marketBalance))
11491152 then $Tuple2(nil, 0)
11501153 else {
11511154 let stakedMarketAmount = (capAmount - axlyMarketFee)
11521155 let stakedMarketLoan = fraction(stakedMarketAmount, marketLoanPercent, SCALE8)
11531156 let stakedMarketNoLoan = (stakedMarketAmount - stakedMarketLoan)
11541157 let curPoolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
11551158 let curPoolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
11561159 let newInterestMarketLoan = if ((totalMarketAmountWithLoan > 0))
11571160 then (curPoolInterestMarketLoan + fraction(stakedMarketLoan, SCALE10, totalMarketAmountWithLoan))
11581161 else 0
11591162 let newInterestMarketNoLoan = if (((totalMarketAmount - totalMarketAmountWithLoan) > 0))
11601163 then (curPoolInterestMarketNoLoan + fraction(stakedMarketNoLoan, SCALE10, (totalMarketAmount - totalMarketAmountWithLoan)))
11611164 else 0
11621165 let unstakedAmount = unstakeLP(pool, pType, shareId, axlyMarketFee, true)
11631166 if ((unstakedAmount == unstakedAmount))
11641167 then $Tuple2([IntegerEntry((pool + kPoolInterestMarketLoan), newInterestMarketLoan), IntegerEntry((pool + kPoolInterestMarketNoLoan), newInterestMarketNoLoan), IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount + stakedMarketAmount)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan + stakedMarketLoan)), ScriptTransfer(moneyBox, axlyMarketFee, assetIdFromStr(shareId))], stakedMarketAmount)
11651168 else throw("Strict value is not equal to itself.")
11661169 }
11671170 }
11681171 }
11691172 }
11701173 else throw("Strict value is not equal to itself.")
11711174 }
11721175 else throw("Strict value is not equal to itself.")
11731176 }
11741177
11751178
11761179 func userCanWithdrawShareCalc (user,pool,posId,borrowed,isMarketPos) = {
11771180 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
11781181 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
11791182 let poolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
11801183 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
11811184 let poolInterestMarketNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketNoLoan)), 0)
11821185 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
11831186 let poolInterest = if (borrowed)
11841187 then if (isMarketPos)
11851188 then poolInterestMarketLoan
11861189 else poolInterestLoan
11871190 else if (isMarketPos)
11881191 then poolInterestMarketNoLoan
11891192 else poolInterestNoLoan
11901193 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
11911194 }
11921195
11931196
11941197 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
11951198 let feeType = if (isBorrowed)
11961199 then STOPLOSS_LOAN
11971200 else STOPLOSS_FEE_NO_LOAN
11981201 if (stopLoss)
11991202 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
12001203 else 0
12011204 }
12021205
12031206
12041207 func withdrawToUser (user,pool,posId,stopLoss,withdrawToken) = {
12051208 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
12061209 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
12071210 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
12081211 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed, fromMarket)
12091212 let poolTotalShare = getPoolTotalShare(pool)
12101213 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
12111214 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
12121215 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
12131216 let userAddr = Address(fromBase58String(user))
12141217 let poolAddr = Address(fromBase58String(pool))
12151218 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1216- let $t03901239084 = getPoolData(poolAddr, pType)
1217- let idAStr = $t03901239084._1
1218- let idBStr = $t03901239084._2
1219- let balA = $t03901239084._3
1220- let balB = $t03901239084._4
1221- let shareId = $t03901239084._5
1222- let $t03908739154 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1223- let idA = $t03908739154._1
1224- let idB = $t03908739154._2
1219+ let $t03912339195 = getPoolData(poolAddr, pType)
1220+ let idAStr = $t03912339195._1
1221+ let idBStr = $t03912339195._2
1222+ let balA = $t03912339195._3
1223+ let balB = $t03912339195._4
1224+ let shareId = $t03912339195._5
1225+ let $t03919839265 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1226+ let idA = $t03919839265._1
1227+ let idB = $t03919839265._2
12251228 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
12261229 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
12271230 let cBalABefore = accountBalance(idA)
12281231 if ((cBalABefore == cBalABefore))
12291232 then {
12301233 let cBalBBefore = accountBalance(idB)
12311234 if ((cBalBBefore == cBalBBefore))
12321235 then {
12331236 let inv = if ((pType == SF_POOL))
12341237 then {
12351238 let inv = unstakeLP(pool, pType, shareId, stopLossFee, fromMarket)
12361239 if ((inv == inv))
12371240 then invoke(poolAddr, "callFunction", ["withdraw", [toString((userCanWithdraw - stopLossFee))]], nil)
12381241 else throw("Strict value is not equal to itself.")
12391242 }
12401243 else if ((pType == WX_POOL))
12411244 then {
12421245 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee), fromMarket)
12431246 if ((inv == inv))
12441247 then if ((proxyAddr == ""))
12451248 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12461249 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
12471250 else throw("Strict value is not equal to itself.")
12481251 }
12491252 else unknownPoolType()
12501253 if ((inv == inv))
12511254 then {
12521255 let cBalAAfter = accountBalance(idA)
12531256 if ((cBalAAfter == cBalAAfter))
12541257 then {
12551258 let cBalBAfter = accountBalance(idB)
12561259 if ((cBalBAfter == cBalBAfter))
12571260 then {
1258- let $t04016240251 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1259- let tokensAmountA = $t04016240251._1
1260- let tokensAmountB = $t04016240251._2
1261- let $t04025441499 = if (isBorrowed)
1261+ let $t04027340362 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1262+ let tokensAmountA = $t04027340362._1
1263+ let tokensAmountB = $t04027340362._2
1264+ let $t04036541610 = if (isBorrowed)
12621265 then {
12631266 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12641267 let debt = {
12651268 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
12661269 if ($isInstanceOf(@, "Int"))
12671270 then @
12681271 else throw(($getType(@) + " couldn't be cast to Int"))
12691272 }
12701273 if ((debt == debt))
12711274 then {
12721275 let amountToGetEx = if (if ((borrowAsset == idAStr))
12731276 then (debt > tokensAmountA)
12741277 else false)
12751278 then (debt - tokensAmountA)
12761279 else if (if ((borrowAsset == idBStr))
12771280 then (debt > tokensAmountB)
12781281 else false)
12791282 then (debt - tokensAmountB)
12801283 else 0
12811284 let exInv = if ((amountToGetEx > 0))
12821285 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
12831286 else nil
12841287 if ((exInv == exInv))
12851288 then {
12861289 let cBalAAfterRepay = accountBalance(idA)
12871290 if ((cBalAAfterRepay == cBalAAfterRepay))
12881291 then {
12891292 let cBalBAfterRepay = accountBalance(idB)
12901293 if ((cBalBAfterRepay == cBalBAfterRepay))
12911294 then {
12921295 let closeDbtInv = if ((debt > 0))
12931296 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId), shareId], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
12941297 else 0
12951298 if ((closeDbtInv == closeDbtInv))
12961299 then if ((borrowAsset == idAStr))
12971300 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
12981301 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
12991302 else throw("Strict value is not equal to itself.")
13001303 }
13011304 else throw("Strict value is not equal to itself.")
13021305 }
13031306 else throw("Strict value is not equal to itself.")
13041307 }
13051308 else throw("Strict value is not equal to itself.")
13061309 }
13071310 else throw("Strict value is not equal to itself.")
13081311 }
13091312 else $Tuple2(tokensAmountA, tokensAmountB)
1310- let toUserA = $t04025441499._1
1311- let toUserB = $t04025441499._2
1313+ let toUserA = $t04036541610._1
1314+ let toUserB = $t04036541610._2
13121315 let poolTotalLoanEntries = if (isBorrowed)
13131316 then [IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userCanWithdraw))]
13141317 else nil
13151318 let poolTotalMarketEntries = if (fromMarket)
13161319 then ([IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userCanWithdraw))] ++ (if (isBorrowed)
13171320 then [IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userCanWithdraw))]
13181321 else nil))
13191322 else nil
1320- let $t04191242307 = if (if ((withdrawToken == idAStr))
1323+ let $t04202342418 = if (if ((withdrawToken == idAStr))
13211324 then (toUserB > 0)
13221325 else false)
13231326 then {
13241327 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserB, idBStr, idAStr)
13251328 if ((amtGet == amtGet))
13261329 then $Tuple2((toUserA + amtGet), 0)
13271330 else throw("Strict value is not equal to itself.")
13281331 }
13291332 else if (if ((withdrawToken == idBStr))
13301333 then (toUserA > 0)
13311334 else false)
13321335 then {
13331336 let amtGet = exchangeDirectlyNoLim(pType, pool, toUserA, idAStr, idBStr)
13341337 if ((amtGet == amtGet))
13351338 then $Tuple2(0, (toUserB + amtGet))
13361339 else throw("Strict value is not equal to itself.")
13371340 }
13381341 else $Tuple2(toUserA, toUserB)
1339- let toUserACalc = $t04191242307._1
1340- let toUserBCalc = $t04191242307._2
1342+ let toUserACalc = $t04202342418._1
1343+ let toUserBCalc = $t04202342418._2
13411344 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)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), IntegerEntry((pool + kPoolTotal), (poolTotalShare - userCanWithdraw)), ScriptTransfer(userAddr, toUserACalc, idA), ScriptTransfer(userAddr, toUserBCalc, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ poolTotalMarketEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
13421345 $Tuple2(entries, [toUserACalc, toUserBCalc])
13431346 }
13441347 else throw("Strict value is not equal to itself.")
13451348 }
13461349 else throw("Strict value is not equal to itself.")
13471350 }
13481351 else throw("Strict value is not equal to itself.")
13491352 }
13501353 else throw("Strict value is not equal to itself.")
13511354 }
13521355 else throw("Strict value is not equal to itself.")
13531356 }
13541357
13551358
13561359 func liquidatePos (caller,user,posId,lAmount) = {
13571360 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
13581361 let borrowAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), "There are no borrow position")
13591362 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
13601363 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInPMarket)), false)
13611364 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, true, fromMarket)
13621365 let poolTotalShare = getPoolTotalShare(pool)
13631366 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
13641367 let totalMarketAmount = valueOrElse(getInteger(this, (pool + kPoolTotalMarket)), 0)
13651368 let totalMarketAmountWithLoan = valueOrElse(getInteger(this, (pool + kPoolTotalMarketLoan)), 0)
13661369 let userAddr = Address(fromBase58String(user))
13671370 let poolAddr = Address(fromBase58String(pool))
13681371 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1369- let $t04423244304 = getPoolData(poolAddr, pType)
1370- let idAStr = $t04423244304._1
1371- let idBStr = $t04423244304._2
1372- let balA = $t04423244304._3
1373- let balB = $t04423244304._4
1374- let shareId = $t04423244304._5
1375- let $t04430744374 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1376- let idA = $t04430744374._1
1377- let idB = $t04430744374._2
1372+ let $t04434344415 = getPoolData(poolAddr, pType)
1373+ let idAStr = $t04434344415._1
1374+ let idBStr = $t04434344415._2
1375+ let balA = $t04434344415._3
1376+ let balB = $t04434344415._4
1377+ let shareId = $t04434344415._5
1378+ let $t04441844485 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
1379+ let idA = $t04441844485._1
1380+ let idB = $t04441844485._2
13781381 let proxyAddr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
13791382 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13801383 let poolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
13811384 let poolInterestMarketLoan = valueOrElse(getInteger(this, (pool + kPoolInterestMarketLoan)), 0)
13821385 if ((borrowAmount == 0))
13831386 then throw("You can't liquidate position without borrow")
13841387 else {
13851388 let cBalABefore = accountBalance(idA)
13861389 if ((cBalABefore == cBalABefore))
13871390 then {
13881391 let cBalBBefore = accountBalance(idB)
13891392 if ((cBalBBefore == cBalBBefore))
13901393 then {
13911394 let inv = if ((pType == SF_POOL))
13921395 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
13931396 else if ((pType == WX_POOL))
13941397 then {
13951398 let inv = unstakeLP(pool, pType, shareId, userCanWithdraw, fromMarket)
13961399 if ((inv == inv))
13971400 then if ((proxyAddr == ""))
13981401 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
13991402 else invoke(addressFromStringValue(proxyAddr), "wxWithdrawTwoTokens", [pool, idAStr, idBStr], [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
14001403 else throw("Strict value is not equal to itself.")
14011404 }
14021405 else unknownPoolType()
14031406 if ((inv == inv))
14041407 then {
14051408 let cBalAAfter = accountBalance(idA)
14061409 if ((cBalAAfter == cBalAAfter))
14071410 then {
14081411 let cBalBAfter = accountBalance(idB)
14091412 if ((cBalBAfter == cBalBAfter))
14101413 then {
1411- let $t04555845647 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1412- let tokensAmountA = $t04555845647._1
1413- let tokensAmountB = $t04555845647._2
1414+ let $t04566945758 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
1415+ let tokensAmountA = $t04566945758._1
1416+ let tokensAmountB = $t04566945758._2
14141417 let amountToGetEx = if (if ((borrowAsset == idAStr))
14151418 then (lAmount > tokensAmountA)
14161419 else false)
14171420 then (lAmount - tokensAmountA)
14181421 else if (if ((borrowAsset == idBStr))
14191422 then (lAmount > tokensAmountB)
14201423 else false)
14211424 then (lAmount - tokensAmountB)
14221425 else 0
14231426 let exInv = if ((amountToGetEx > 0))
14241427 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
14251428 else nil
14261429 if ((exInv == exInv))
14271430 then {
14281431 let cBalAAfterRepay = accountBalance(idA)
14291432 if ((cBalAAfterRepay == cBalAAfterRepay))
14301433 then {
14311434 let cBalBAfterRepay = accountBalance(idB)
14321435 if ((cBalBAfterRepay == cBalBAfterRepay))
14331436 then {
1434- let $t04615346380 = if ((borrowAsset == idAStr))
1437+ let $t04626446491 = if ((borrowAsset == idAStr))
14351438 then $Tuple2(((cBalAAfterRepay - cBalABefore) - lAmount), (cBalBAfterRepay - cBalBBefore))
14361439 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - lAmount))
1437- let toUserA = $t04615346380._1
1438- let toUserB = $t04615346380._2
1439- let $t04638346460 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1440- let balAAfter = $t04638346460._1
1441- let balBAfter = $t04638346460._2
1442- let $t04646346594 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1443- let userStaked = $t04646346594._1
1444- let axlyFee = $t04646346594._2
1440+ let toUserA = $t04626446491._1
1441+ let toUserB = $t04626446491._2
1442+ let $t04649446571 = getPoolBalances(poolAddr, pType, idAStr, idBStr)
1443+ let balAAfter = $t04649446571._1
1444+ let balBAfter = $t04649446571._2
1445+ let $t04657446705 = replenishByType(pType, pool, NO_FEE, toUserA, idAStr, toUserB, idBStr, balA, balB, shareId, fromMarket)
1446+ let userStaked = $t04657446705._1
1447+ let axlyFee = $t04657446705._2
14451448 let userLpLiqudated = (userCanWithdraw - userStaked)
1446- let $t04665346998 = if (fromMarket)
1449+ let $t04676447109 = if (fromMarket)
14471450 then $Tuple2(poolInterestMarketLoan, [IntegerEntry((pool + kPoolTotalMarket), (totalMarketAmount - userLpLiqudated)), IntegerEntry((pool + kPoolTotalMarketLoan), (totalMarketAmountWithLoan - userLpLiqudated))])
14481451 else $Tuple2(poolInterestLoan, nil)
1449- let curPoolInterest = $t04665346998._1
1450- let poolTotalMarketEntries = $t04665346998._2
1452+ let curPoolInterest = $t04676447109._1
1453+ let poolTotalMarketEntries = $t04676447109._2
14511454 $Tuple2((([IntegerEntry((pool + kPoolTotal), (poolTotalShare - userLpLiqudated)), IntegerEntry((pool + kPoolTotalLoan), (poolTotalShareLoan - userLpLiqudated)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition), (pAmount - userLpLiqudated)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest), curPoolInterest), ScriptTransfer(caller, lAmount, assetIdFromStr(borrowAsset))] ++ poolTotalMarketEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil)), userLpLiqudated)
14521455 }
14531456 else throw("Strict value is not equal to itself.")
14541457 }
14551458 else throw("Strict value is not equal to itself.")
14561459 }
14571460 else throw("Strict value is not equal to itself.")
14581461 }
14591462 else throw("Strict value is not equal to itself.")
14601463 }
14611464 else throw("Strict value is not equal to itself.")
14621465 }
14631466 else throw("Strict value is not equal to itself.")
14641467 }
14651468 else throw("Strict value is not equal to itself.")
14661469 }
14671470 else throw("Strict value is not equal to itself.")
14681471 }
14691472 }
14701473
14711474
14721475 func parseRequest (requestId) = {
14731476 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
14741477 let user = request[0]
14751478 let pool = request[1]
14761479 let pmtA = parseIntValue(request[2])
14771480 let AId = request[3]
14781481 let pmtB = parseIntValue(request[4])
14791482 let BId = request[5]
14801483 let balA = parseIntValue(request[6])
14811484 let balB = parseIntValue(request[7])
14821485 let shareId = request[8]
14831486 let bwAsset = request[9]
14841487 let bwAmount = parseIntValue(request[10])
14851488 let stakeToMarket = (request[11] == "true")
14861489 $Tuple12(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount, stakeToMarket)
14871490 }
14881491
14891492
1490-func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
1491- then (borrowId != bId)
1492- else false)
1493- then throw("Wrong borrow asset")
1494- else {
1495- let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
1496- let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
1497- let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
1498- let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
1499- let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1500- let $t04872648823 = if ((borrowId == aId))
1501- then $Tuple2(dPriceA, decPrA)
1502- else $Tuple2(dPriceB, decPrB)
1503- let borrowPrice = $t04872648823._1
1504- let borrowDecPr = $t04872648823._2
1505- fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
1506- }
1493+func calcBorrowAmount (pmtA,pmtB,balA,balB,aId,bId,leverage,borrowId) = {
1494+ let priceOracleA = valueOrElse(getInteger(priceOracleAddr, (aId + kPriceInOracle)), -1)
1495+ let priceOracleB = valueOrElse(getInteger(priceOracleAddr, (bId + kPriceInOracle)), -1)
1496+ if (if ((borrowId != aId))
1497+ then (borrowId != bId)
1498+ else false)
1499+ then throw("Wrong borrow asset")
1500+ else if (if ((priceOracleA == -1))
1501+ then (priceOracleB == -1)
1502+ else false)
1503+ then throw("Can't calc deposit price, no token prices in oracle")
1504+ else {
1505+ let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
1506+ let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
1507+ let dPriceA = if ((priceOracleA != -1))
1508+ then priceOracleA
1509+ else fraction(fraction(balB, decPrA, balA), priceOracleB, decPrB)
1510+ let dPriceB = if ((priceOracleB != -1))
1511+ then priceOracleB
1512+ else fraction(fraction(balA, decPrB, balB), priceOracleA, decPrA)
1513+ let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1514+ let $t04925349350 = if ((borrowId == aId))
1515+ then $Tuple2(dPriceA, decPrA)
1516+ else $Tuple2(dPriceB, decPrB)
1517+ let borrowPrice = $t04925349350._1
1518+ let borrowDecPr = $t04925349350._2
1519+ fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
1520+ }
1521+ }
15071522
15081523
15091524 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
15101525 then if ((assetIdToStr(pmts[0].assetId) != AId))
15111526 then throw("Wrong payment asset A")
15121527 else if ((assetIdToStr(pmts[1].assetId) != BId))
15131528 then throw("Wrong payment asset B")
15141529 else $Tuple2(pmts[0].amount, pmts[1].amount)
15151530 else if ((size(pmts) == 1))
15161531 then if ((assetIdToStr(pmts[0].assetId) == AId))
15171532 then $Tuple2(pmts[0].amount, 0)
15181533 else if ((assetIdToStr(pmts[0].assetId) == BId))
15191534 then $Tuple2(0, pmts[0].amount)
15201535 else throw("Wrong payment")
15211536 else throw("One or two payments expected")
15221537
15231538
15241539 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
15251540 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
15261541 if ((0 > pri))
15271542 then (pri * -1)
15281543 else pri
15291544 }
15301545
15311546
15321547 func claimAndCheckAmnt (pool,pType,claim,amountToExchange,amountFromBalance) = {
1533- let $t04984450695 = if (claim)
1548+ let $t05037151222 = if (claim)
15341549 then {
15351550 let claimed = claimFarmed(pType, pool)
15361551 if ((amountToExchange > 0))
15371552 then $Tuple2(amountToExchange, claimed._2)
15381553 else $Tuple2((claimed._1 + amountFromBalance), claimed._2)
15391554 }
15401555 else {
15411556 let claimedAsset = if ((pType == SF_POOL))
15421557 then SWOPID
15431558 else if ((pType == WX_POOL))
15441559 then {
15451560 let proxyAddrStr = valueOrElse(getString(this, (pool + kPoolProxyAddr)), "")
15461561 let inv = if ((proxyAddrStr != ""))
15471562 then {
15481563 let proxyAddr = addressFromStringValue(proxyAddrStr)
15491564 let proxyBalance = assetBalance(proxyAddr, WXID)
15501565 if ((proxyBalance > 0))
15511566 then invoke(proxyAddr, "wxClaimFinalized", [proxyBalance], nil)
15521567 else unit
15531568 }
15541569 else unit
15551570 if ((inv == inv))
15561571 then WXID
15571572 else throw("Strict value is not equal to itself.")
15581573 }
15591574 else unknownPoolType()
15601575 $Tuple2((amountToExchange + amountFromBalance), claimedAsset)
15611576 }
1562- if (($t04984450695 == $t04984450695))
1577+ if (($t05037151222 == $t05037151222))
15631578 then {
1564- let asset = $t04984450695._2
1565- let amount = $t04984450695._1
1579+ let asset = $t05037151222._2
1580+ let amount = $t05037151222._1
15661581 let bal = accountBalance(asset)
15671582 if ((bal == bal))
15681583 then if ((amount > bal))
15691584 then throw("To big amount to exchange")
15701585 else $Tuple2(amount, asset)
15711586 else throw("Strict value is not equal to itself.")
15721587 }
15731588 else throw("Strict value is not equal to itself.")
15741589 }
15751590
15761591
15771592 @Callable(i)
15781593 func getPoolInfoREADONLY (pool) = {
15791594 let poolAddr = addressFromStringValue(pool)
15801595 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1581- let $t05104751137 = getPoolData(Address(fromBase58String(pool)), pType)
1582- let AId = $t05104751137._1
1583- let BId = $t05104751137._2
1584- let balA = $t05104751137._3
1585- let balB = $t05104751137._4
1586- let shareId = $t05104751137._5
1596+ let $t05157451664 = getPoolData(Address(fromBase58String(pool)), pType)
1597+ let AId = $t05157451664._1
1598+ let BId = $t05157451664._2
1599+ let balA = $t05157451664._3
1600+ let balB = $t05157451664._4
1601+ let shareId = $t05157451664._5
15871602 let shareSupply = getShareSupply(poolAddr, pType, shareId)
15881603 $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
15891604 }
15901605
15911606
15921607
15931608 @Callable(i)
15941609 func getShareAssetPriceREADONLY (shareId) = {
15951610 let sharePrices = getSharePrice(shareId)
15961611 $Tuple2(nil, sharePrices)
15971612 }
15981613
15991614
16001615
16011616 @Callable(i)
16021617 func getUserPositionShareAmountREADONLY (user,posNum) = {
16031618 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
16041619 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
16051620 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum) + kUserPositionInPMarket)), false)
16061621 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0), fromMarket)
16071622 $Tuple2(nil, userCanWithdraw)
16081623 }
16091624
16101625
16111626
16121627 @Callable(i)
16131628 func getUserPositionREADONLY (user,pools,posNum) = {
16141629 func userPos (a,pool) = {
1615- let $t05213552205 = a
1616- let wAmountsA = $t05213552205._1
1617- let wAmountsB = $t05213552205._2
1618- let debts = $t05213552205._3
1619- let eqWAmountsA = $t05213552205._4
1620- let eqWAmountsB = $t05213552205._5
1621- let index = $t05213552205._6
1630+ let $t05266252732 = a
1631+ let wAmountsA = $t05266252732._1
1632+ let wAmountsB = $t05266252732._2
1633+ let debts = $t05266252732._3
1634+ let eqWAmountsA = $t05266252732._4
1635+ let eqWAmountsB = $t05266252732._5
1636+ let index = $t05266252732._6
16221637 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
16231638 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
16241639 else {
16251640 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1626- let $t05248452574 = getPoolData(Address(fromBase58String(pool)), pType)
1627- let AId = $t05248452574._1
1628- let BId = $t05248452574._2
1629- let balA = $t05248452574._3
1630- let balB = $t05248452574._4
1631- let shareId = $t05248452574._5
1641+ let $t05301153101 = getPoolData(Address(fromBase58String(pool)), pType)
1642+ let AId = $t05301153101._1
1643+ let BId = $t05301153101._2
1644+ let balA = $t05301153101._3
1645+ let balB = $t05301153101._4
1646+ let shareId = $t05301153101._5
16321647 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
16331648 let fromMarket = valueOrElse(getBoolean(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPositionInPMarket)), false)
16341649 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0), fromMarket)
1635- let $t05292453044 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1636- let wAmountA = $t05292453044._1
1637- let wAmountB = $t05292453044._2
1650+ let $t05345153571 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1651+ let wAmountA = $t05345153571._1
1652+ let wAmountB = $t05345153571._2
16381653 if ((borrowAmount > 0))
16391654 then {
16401655 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
16411656 let debt = {
16421657 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
16431658 if ($isInstanceOf(@, "Int"))
16441659 then @
16451660 else throw(($getType(@) + " couldn't be cast to Int"))
16461661 }
16471662 if ((debt == debt))
16481663 then {
16491664 let amountToGetEx = if (if ((borrowAsset == AId))
16501665 then (debt > wAmountA)
16511666 else false)
16521667 then (debt - wAmountA)
16531668 else if (if ((borrowAsset == BId))
16541669 then (debt > wAmountB)
16551670 else false)
16561671 then (debt - wAmountB)
16571672 else 0
16581673 let amountToPay = if ((amountToGetEx > 0))
16591674 then if ((pType == SF_POOL))
16601675 then {
16611676 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
16621677 ex._2
16631678 }
16641679 else if ((pType == WX_POOL))
16651680 then {
16661681 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
16671682 ex._2
16681683 }
16691684 else unknownPoolType()
16701685 else 0
1671- let $t05395654175 = if ((borrowAsset == AId))
1686+ let $t05448354702 = if ((borrowAsset == AId))
16721687 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
16731688 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1674- let eqWAmountA = $t05395654175._1
1675- let eqWAmountB = $t05395654175._2
1689+ let eqWAmountA = $t05448354702._1
1690+ let eqWAmountB = $t05448354702._2
16761691 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
16771692 }
16781693 else throw("Strict value is not equal to itself.")
16791694 }
16801695 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
16811696 }
16821697 }
16831698
1684- let $t05443054541 = {
1699+ let $t05495755068 = {
16851700 let $l = pools
16861701 let $s = size($l)
16871702 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
16881703 func $f0_1 ($a,$i) = if (($i >= $s))
16891704 then $a
16901705 else userPos($a, $l[$i])
16911706
16921707 func $f0_2 ($a,$i) = if (($i >= $s))
16931708 then $a
16941709 else throw("List size exceeds 20")
16951710
16961711 $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)
16971712 }
1698- let wAmountsA = $t05443054541._1
1699- let wAmountsB = $t05443054541._2
1700- let debts = $t05443054541._3
1701- let eqWAmountsA = $t05443054541._4
1702- let eqWAmountsB = $t05443054541._5
1713+ let wAmountsA = $t05495755068._1
1714+ let wAmountsB = $t05495755068._2
1715+ let debts = $t05495755068._3
1716+ let eqWAmountsA = $t05495755068._4
1717+ let eqWAmountsB = $t05495755068._5
17031718 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
17041719 }
17051720
17061721
17071722
17081723 @Callable(i)
17091724 func replenish (pool,leverage,borrowId,stakeToMarket) = valueOrElse(isActiveForUsers(), {
17101725 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
17111726 let allowedBAssets = valueOrElse(getString(this, (pool + kPoolAllowedBorrowAssets)), "")
17121727 if (!(isPoolActive(pool, pType)))
17131728 then throw("Pool not active at this moment")
17141729 else if (if ((100 > leverage))
17151730 then true
17161731 else (leverage > 300))
17171732 then throw("Leverage can't be <100 and >300")
17181733 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
17191734 then (leverage > 100)
17201735 else false)
17211736 then throw("You can't borrow in this pool")
17221737 else if (if (if ((leverage > 100))
17231738 then (allowedBAssets != "")
17241739 else false)
17251740 then !(containsElement(split(allowedBAssets, ","), borrowId))
17261741 else false)
17271742 then throw("You can't borrow this asset")
17281743 else if (if (stakeToMarket)
17291744 then !(valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false))
17301745 else false)
17311746 then throw("This pool can't stake to puzzle market")
17321747 else {
1733- let $t05553455624 = getPoolData(Address(fromBase58String(pool)), pType)
1734- let AId = $t05553455624._1
1735- let BId = $t05553455624._2
1736- let balA = $t05553455624._3
1737- let balB = $t05553455624._4
1738- let shareId = $t05553455624._5
1748+ let $t05606156151 = getPoolData(Address(fromBase58String(pool)), pType)
1749+ let AId = $t05606156151._1
1750+ let BId = $t05606156151._2
1751+ let balA = $t05606156151._3
1752+ let balB = $t05606156151._4
1753+ let shareId = $t05606156151._5
17391754 if (if ((borrowId != AId))
17401755 then (borrowId != BId)
17411756 else false)
17421757 then throw("Wrong borrow asset")
17431758 else {
1744- let $t05570555764 = parseReplenishPmts(i.payments, AId, BId)
1745- let pmtA = $t05570555764._1
1746- let pmtB = $t05570555764._2
1759+ let $t05623256291 = parseReplenishPmts(i.payments, AId, BId)
1760+ let pmtA = $t05623256291._1
1761+ let pmtB = $t05623256291._2
17471762 let user = toString(i.caller)
17481763 let newPosNum = getNewUserPositionNumber(user)
17491764 if ((leverage > 100))
17501765 then {
1751- let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
1766+ let borrowAmount = calcBorrowAmount(pmtA, pmtB, balA, balB, AId, BId, leverage, borrowId)
17521767 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount), toString(stakeToMarket)], ",")
17531768 let newRequestId = {
17541769 let @ = invoke(this, "createNewRequest", [request], nil)
17551770 if ($isInstanceOf(@, "Int"))
17561771 then @
17571772 else throw(($getType(@) + " couldn't be cast to Int"))
17581773 }
17591774 if ((newRequestId == newRequestId))
17601775 then {
17611776 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
17621777 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
17631778 if ((inv == inv))
17641779 then {
17651780 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1766- let $t05678756881 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1767- if (($t05678756881 == $t05678756881))
1781+ let $t05732657420 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1782+ if (($t05732657420 == $t05732657420))
17681783 then {
1769- let newBalB = $t05678756881._2
1770- let newBalA = $t05678756881._1
1784+ let newBalB = $t05732657420._2
1785+ let newBalA = $t05732657420._1
17711786 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1772- let $t05695157066 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1773- let wAmountA = $t05695157066._1
1774- let wAmountB = $t05695157066._2
1787+ let $t05749057605 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1788+ let wAmountA = $t05749057605._1
1789+ let wAmountB = $t05749057605._2
17751790 let futureBorrowApy = invoke(getLendSrvAddr(), "calculateTokenInterest", [borrowId, false], nil)
17761791 if ((futureBorrowApy == futureBorrowApy))
17771792 then $Tuple2(nil, [prImpact, wAmountA, wAmountB, futureBorrowApy])
17781793 else throw("Strict value is not equal to itself.")
17791794 }
17801795 else throw("Strict value is not equal to itself.")
17811796 }
17821797 else throw("Strict value is not equal to itself.")
17831798 }
17841799 else throw("Strict value is not equal to itself.")
17851800 }
17861801 else {
1787- let $t05723857368 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1788- if (($t05723857368 == $t05723857368))
1802+ let $t05777757907 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId, stakeToMarket)
1803+ if (($t05777757907 == $t05777757907))
17891804 then {
1790- let axlyFee = $t05723857368._2
1791- let userStaked = $t05723857368._1
1792- let $t05737457468 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1793- if (($t05737457468 == $t05737457468))
1805+ let axlyFee = $t05777757907._2
1806+ let userStaked = $t05777757907._1
1807+ let $t05791358007 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1808+ if (($t05791358007 == $t05791358007))
17941809 then {
1795- let newBalB = $t05737457468._2
1796- let newBalA = $t05737457468._1
1810+ let newBalB = $t05791358007._2
1811+ let newBalA = $t05791358007._1
17971812 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1798- let $t05753857653 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1799- let wAmountA = $t05753857653._1
1800- let wAmountB = $t05753857653._2
1813+ let $t05807758192 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1814+ let wAmountA = $t05807758192._1
1815+ let wAmountB = $t05807758192._2
18011816 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false, stakeToMarket) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB, 0])
18021817 }
18031818 else throw("Strict value is not equal to itself.")
18041819 }
18051820 else throw("Strict value is not equal to itself.")
18061821 }
18071822 }
18081823 }
18091824 })
18101825
18111826
18121827
18131828 @Callable(i)
18141829 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
18151830 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
18161831 if (!(isPoolActive(pool, pType)))
18171832 then throw("Pool not active at this moment")
18181833 else withdrawToUser(toString(i.caller), pool, toString(posId), false, "")
18191834 })
18201835
18211836
18221837
18231838 @Callable(i)
18241839 func withdrawOneToken (pool,posId,tokenId) = valueOrElse(isActiveForUsers(), {
18251840 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
18261841 if (!(isPoolActive(pool, pType)))
18271842 then throw("Pool not active at this moment")
18281843 else withdrawToUser(toString(i.caller), pool, toString(posId), false, tokenId)
18291844 })
18301845
18311846
18321847
18331848 @Callable(i)
18341849 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
18351850 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
18361851 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
18371852 if (!(isPoolActive(poolId, pType)))
18381853 then throw("Pool not active at this moment")
18391854 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
18401855 then throw("There are no user position")
18411856 else if ((0 >= price))
18421857 then throw("Price must be greater than 0")
18431858 else if ((price > tokenOraclePrice))
18441859 then throw("Price must be less than current token price")
18451860 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
18461861 })
18471862
18481863
18491864
18501865 @Callable(i)
18511866 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
18521867 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
18531868 if (!(isPoolActive(poolId, pType)))
18541869 then throw("Pool not active at this moment")
18551870 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
18561871 then throw("No entry")
18571872 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
18581873 })
18591874
18601875
18611876
18621877 @Callable(i)
18631878 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
18641879 then throw("Already inited")
18651880 else if (!(isDefined(addressFromString(moneyBoxAddr))))
18661881 then throw("moneyBoxAddr is not correct address")
18671882 else if (!(isDefined(addressFromString(sfFarmingAddr))))
18681883 then throw("sfFarmingAddr is not correct address")
18691884 else if (!(isDefined(addressFromString(lendAddr))))
18701885 then throw("lendAddr is not correct address")
18711886 else if (!(isDefined(addressFromString(priceOracleAddr))))
18721887 then throw("priceOracleAddr is not correct address")
18731888 else if (!(isDefined(addressFromString(keeperExContract))))
18741889 then throw("keeperExContract is not correct address")
18751890 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
18761891 then throw("swopAssetId is not correct asset id")
18771892 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
18781893 then throw("swopAssetId is not correct asset id")
18791894 else if ((size(fromBase58String(operatorPubKey)) != 32))
18801895 then throw("operatorPubKey is not correct")
18811896 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
18821897 then throw("group1Admin1PubKey is not correct")
18831898 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
18841899 then throw("group1Admin2PubKey is not correct")
18851900 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
18861901 then throw("group2Admin1PubKey is not correct")
18871902 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
18881903 then throw("group2Admin2PubKey is not correct")
18891904 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)])
18901905
18911906
18921907
18931908 @Callable(i)
18941909 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
18951910 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
18961911 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
18971912 })
18981913
18991914
19001915
19011916 @Callable(i)
19021917 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1903- let $t06287662995 = parseRequest(requestId)
1904- let user = $t06287662995._1
1905- let pool = $t06287662995._2
1906- let pmtA = $t06287662995._3
1907- let AId = $t06287662995._4
1908- let pmtB = $t06287662995._5
1909- let BId = $t06287662995._6
1910- let balA = $t06287662995._7
1911- let balB = $t06287662995._8
1912- let shareId = $t06287662995._9
1913- let bwAsset = $t06287662995._10
1914- let bwAmount = $t06287662995._11
1915- let stakeToMarket = $t06287662995._12
1918+ let $t06341563534 = parseRequest(requestId)
1919+ let user = $t06341563534._1
1920+ let pool = $t06341563534._2
1921+ let pmtA = $t06341563534._3
1922+ let AId = $t06341563534._4
1923+ let pmtB = $t06341563534._5
1924+ let BId = $t06341563534._6
1925+ let balA = $t06341563534._7
1926+ let balB = $t06341563534._8
1927+ let shareId = $t06341563534._9
1928+ let bwAsset = $t06341563534._10
1929+ let bwAmount = $t06341563534._11
1930+ let stakeToMarket = $t06341563534._12
19161931 if ((size(i.payments) != 1))
19171932 then throw("Wrong payment size")
19181933 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
19191934 then true
19201935 else (i.payments[0].amount != bwAmount))
19211936 then throw("Wrong payment")
19221937 else {
1923- let $t06318563285 = if ((AId == bwAsset))
1938+ let $t06372463824 = if ((AId == bwAsset))
19241939 then $Tuple2((pmtA + bwAmount), pmtB)
19251940 else $Tuple2(pmtA, (pmtB + bwAmount))
1926- let pmtAllA = $t06318563285._1
1927- let pmtAllB = $t06318563285._2
1941+ let pmtAllA = $t06372463824._1
1942+ let pmtAllB = $t06372463824._2
19281943 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1929- let $t06336763497 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1930- let userStaked = $t06336763497._1
1931- let axlyFee = $t06336763497._2
1944+ let $t06390664036 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId, stakeToMarket)
1945+ let userStaked = $t06390664036._1
1946+ let axlyFee = $t06390664036._2
19321947 let posNum = getNewUserPositionNumber(user)
19331948 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
19341949 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true, stakeToMarket)
1935- let $t06387263987 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1936- let wAmountA = $t06387263987._1
1937- let wAmountB = $t06387263987._2
1950+ let $t06441164526 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1951+ let wAmountA = $t06441164526._1
1952+ let wAmountB = $t06441164526._2
19381953 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
19391954 }
19401955 }))
19411956
19421957
19431958
19441959 @Callable(i)
19451960 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), liquidatePos(i.caller, user, posId, liquidateAmount)))
19461961
19471962
19481963
19491964 @Callable(i)
19501965 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
19511966 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
19521967 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
19531968 if ((tokenOraclePrice > stopLossPrice))
19541969 then throw("Token price greater stop loss price")
19551970 else {
19561971 let res = withdrawToUser(user, pool, toString(posId), true, "")
19571972 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
19581973 }
19591974 }))
19601975
19611976
19621977
19631978 @Callable(i)
19641979 func capitalizeEx (pool,route,tokenToId,amountToExchange,claim) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
19651980 let pType = getStringValue(this, (kPool + pool))
19661981 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
19671982 let poolAddr = Address(fromBase58String(pool))
1968- let $t06540365469 = getPoolData(poolAddr, pType)
1969- let AId = $t06540365469._1
1970- let BId = $t06540365469._2
1971- let balA = $t06540365469._3
1972- let balB = $t06540365469._4
1973- let shareId = $t06540365469._5
1983+ let $t06594266008 = getPoolData(poolAddr, pType)
1984+ let AId = $t06594266008._1
1985+ let BId = $t06594266008._2
1986+ let balA = $t06594266008._3
1987+ let balB = $t06594266008._4
1988+ let shareId = $t06594266008._5
19741989 let totalShareAmount = getPoolTotalShare(pool)
19751990 let isMarketPool = valueOrElse(getBoolean(this, (pool + kPoolPMArket)), false)
1976- let $t06559866424 = if ((amountToExchange > 0))
1991+ let $t06613766963 = if ((amountToExchange > 0))
19771992 then {
1978- let $t06566065757 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1979- if (($t06566065757 == $t06566065757))
1993+ let $t06619966296 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, 0)
1994+ if (($t06619966296 == $t06619966296))
19801995 then {
1981- let claimedAsset = $t06566065757._2
1982- let claimedAmount = $t06566065757._1
1996+ let claimedAsset = $t06619966296._2
1997+ let claimedAmount = $t06619966296._1
19831998 let rArgs = split(route, "__")
19841999 let exchangedAmount = if ((amountToExchange > 0))
19852000 then if ((rArgs[0] == "directSwopfiCPMM"))
19862001 then directSwopfiCPMM(rArgs, tokenToId)
19872002 else if ((rArgs[0] == "routingSwopfi"))
19882003 then directRoutingSwopfi(rArgs, tokenToId)
19892004 else throw("Wrong route")
19902005 else 0
19912006 if ((exchangedAmount == exchangedAmount))
19922007 then {
19932008 let newChange = ((claimedAmount + change) - amountToExchange)
19942009 let changeEntry = if ((newChange >= 0))
19952010 then [IntegerEntry((pool + kPoolCapChange), newChange)]
19962011 else nil
1997- let $t06625466364 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
1998- let capEnterise = $t06625466364._1
1999- let staked = $t06625466364._2
2012+ let $t06679366903 = capitalize(pool, pType, tokenToId, exchangedAmount, AId, BId, balA, balB, shareId)
2013+ let capEnterise = $t06679366903._1
2014+ let staked = $t06679366903._2
20002015 $Tuple2((capEnterise ++ changeEntry), staked)
20012016 }
20022017 else throw("Strict value is not equal to itself.")
20032018 }
20042019 else throw("Strict value is not equal to itself.")
20052020 }
20062021 else $Tuple2(nil, 0)
2007- let capEnterise = $t06559866424._1
2008- let staked = $t06559866424._2
2009- let $t06642766544 = if (isMarketPool)
2022+ let capEnterise = $t06613766963._1
2023+ let staked = $t06613766963._2
2024+ let $t06696667083 = if (isMarketPool)
20102025 then capitalizePuzzleMarket(pool, pType, shareId)
20112026 else $Tuple2(nil, 0)
2012- let marketCapEnteris = $t06642766544._1
2013- let stakedMarket = $t06642766544._2
2027+ let marketCapEnteris = $t06696667083._1
2028+ let stakedMarket = $t06696667083._2
20142029 ((([IntegerEntry((pool + kPoolTotal), ((totalShareAmount + staked) + stakedMarket))] ++ capEnterise) ++ marketCapEnteris) ++ getCursEntries(AId, BId, shareId, nil))
20152030 }))
20162031
20172032
20182033
20192034 @Callable(i)
20202035 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
20212036 let pType = getStringValue(this, (kPool + pool))
20222037 let poolAddr = Address(fromBase58String(pool))
2023- let $t06697967045 = getPoolData(poolAddr, pType)
2024- let AId = $t06697967045._1
2025- let BId = $t06697967045._2
2026- let balA = $t06697967045._3
2027- let balB = $t06697967045._4
2028- let shareId = $t06697967045._5
2038+ let $t06751867584 = getPoolData(poolAddr, pType)
2039+ let AId = $t06751867584._1
2040+ let BId = $t06751867584._2
2041+ let balA = $t06751867584._3
2042+ let balB = $t06751867584._4
2043+ let shareId = $t06751867584._5
20292044 let totalShareAmount = getPoolTotalShare(pool)
2030- let $t06709767195 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2031- if (($t06709767195 == $t06709767195))
2045+ let $t06763667734 = claimAndCheckAmnt(pool, pType, claim, 0, amountFromBalance)
2046+ if (($t06763667734 == $t06763667734))
20322047 then {
2033- let claimedAsset = $t06709767195._2
2034- let claimedAmount = $t06709767195._1
2035- let $t06719867324 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2036- let capEnterise = $t06719867324._1
2037- let staked = $t06719867324._2
2048+ let claimedAsset = $t06763667734._2
2049+ let claimedAmount = $t06763667734._1
2050+ let $t06773767863 = capitalize(pool, pType, assetIdToStr(claimedAsset), claimedAmount, AId, BId, balA, balB, shareId)
2051+ let capEnterise = $t06773767863._1
2052+ let staked = $t06773767863._2
20382053 (([IntegerEntry((pool + kPoolTotal), (totalShareAmount + staked))] ++ capEnterise) ++ getCursEntries(AId, BId, shareId, nil))
20392054 }
20402055 else throw("Strict value is not equal to itself.")
20412056 }))
20422057
20432058
20442059
20452060 @Callable(i)
20462061 func initNewPool (type,poolType,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow,canPMarket,allowedBorrowAssets) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
20472062 then (type != WX_POOL)
20482063 else false)
20492064 then throw("Wrong type")
20502065 else if (if ((poolType != CPMM))
20512066 then (poolType != FLAT)
20522067 else false)
20532068 then throw("Wrong pool type")
20542069 else {
2055- let $t06797868072 = getPoolData(Address(fromBase58String(poolAddr)), type)
2056- let aId = $t06797868072._1
2057- let bId = $t06797868072._2
2058- let aBal = $t06797868072._3
2059- let bBal = $t06797868072._4
2060- let shareId = $t06797868072._5
2070+ let $t06851768611 = getPoolData(Address(fromBase58String(poolAddr)), type)
2071+ let aId = $t06851768611._1
2072+ let bId = $t06851768611._2
2073+ let aBal = $t06851768611._3
2074+ let bBal = $t06851768611._4
2075+ let shareId = $t06851768611._5
20612076 if ((0 > inFeeNoLoan))
20622077 then throw("inFeeNoLoan must be greater than 0")
20632078 else if ((0 > inFeeLoan))
20642079 then throw("inFeeLoan must be greater than 0")
20652080 else if ((0 > capFeeNoLoan))
20662081 then throw("capFeeNoLoan must be greater than 0")
20672082 else if ((0 > capFeeWithLoan))
20682083 then throw("capFeeWithLoan must be greater than 0")
20692084 else if ((0 > stoplossFeeNoLoan))
20702085 then throw("stoplossFeeNoLoan must be greater than 0")
20712086 else if ((0 > stoplossFeeWithLoan))
20722087 then throw("stoplossFeeWithLoan must be greater than 0")
20732088 else {
20742089 let allowedBorrowAssetsEntry = if ((allowedBorrowAssets != ""))
20752090 then [StringEntry((poolAddr + kPoolAllowedBorrowAssets), allowedBorrowAssets)]
20762091 else nil
20772092 ([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), BooleanEntry((poolAddr + kPoolPMArket), canPMarket)] ++ allowedBorrowAssetsEntry)
20782093 }
20792094 }))
20802095
20812096
20822097
20832098 @Callable(i)
20842099 func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
20852100 then throw(("Can't find pool with addr " + poolAddr))
20862101 else if ((0 > inFeeNoLoan))
20872102 then throw("inFeeNoLoan must be greater than 0")
20882103 else if ((0 > inFeeLoan))
20892104 then throw("inFeeLoan must be greater than 0")
20902105 else if ((0 > capFeeNoLoan))
20912106 then throw("capFeeNoLoan must be greater than 0")
20922107 else if ((0 > capFeeWithLoan))
20932108 then throw("capFeeWithLoan must be greater than 0")
20942109 else if ((0 > stoplossFeeNoLoan))
20952110 then throw("stoplossFeeNoLoan must be greater than 0")
20962111 else if ((0 > stoplossFeeWithLoan))
20972112 then throw("stoplossFeeWithLoan must be greater than 0")
20982113 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)]))
20992114
21002115
21012116
21022117 @Callable(i)
21032118 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
21042119 then throw("dApp already active")
21052120 else [BooleanEntry(kActive, true)])
21062121
21072122
21082123
21092124 @Callable(i)
21102125 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
21112126 then throw("dApp already shutdown")
21122127 else [BooleanEntry(kActive, false)])
21132128
21142129
21152130
21162131 @Callable(i)
21172132 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
21182133 then throw("dApp already active for users")
21192134 else [BooleanEntry(kActiveUsers, true)])
21202135
21212136
21222137
21232138 @Callable(i)
21242139 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
21252140 then throw("dApp already shutdown for users")
21262141 else [BooleanEntry(kActiveUsers, false)])
21272142
21282143
21292144
21302145 @Callable(i)
21312146 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
21322147 then throw("SWOPFI already active")
21332148 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
21342149
21352150
21362151
21372152 @Callable(i)
21382153 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
21392154 then throw("SWOPFI already shutdown")
21402155 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
21412156
21422157
21432158
21442159 @Callable(i)
21452160 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
21462161 then throw("WX already active")
21472162 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
21482163
21492164
21502165
21512166 @Callable(i)
21522167 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
21532168 then throw("WX already shutdown")
21542169 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
21552170
21562171
21572172
21582173 @Callable(i)
21592174 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
21602175 then throw("Unknown pool")
21612176 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
21622177 then throw("Pool already active")
21632178 else [BooleanEntry((pool + kPoolActive), true)])
21642179
21652180
21662181
21672182 @Callable(i)
21682183 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
21692184 then throw("Unknown pool")
21702185 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
21712186 then throw("Pool already shutdown")
21722187 else [BooleanEntry((pool + kPoolActive), false)])
21732188
21742189
21752190 @Verifier(tx)
21762191 func verify () = {
21772192 let multiSignedByAdmins = {
21782193 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], group1Admin1PK))
21792194 then 1
21802195 else 0
21812196 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], group1Admin2PK))
21822197 then 1
21832198 else 0
21842199 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], group1Admin3PK))
21852200 then 1
21862201 else 0
21872202 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
21882203 }
21892204 multiSignedByAdmins
21902205 }
21912206

github/deemru/w8io/3ef1775 
308.98 ms