tx · abkJfdeV5VqA5gCDk44DuAwuiJVnLv3sDSzhKPtTzfz

3PQNn3RcXkRCHHrBYxhVvbeQLa8R8KMjoFa:  -0.07500000 Waves

2023.05.22 18:49 [3654889] smart account 3PQNn3RcXkRCHHrBYxhVvbeQLa8R8KMjoFa > SELF 0.00000000 Waves

{ "type": 13, "id": "abkJfdeV5VqA5gCDk44DuAwuiJVnLv3sDSzhKPtTzfz", "fee": 7500000, "feeAssetId": null, "timestamp": 1684770629117, "version": 2, "chainId": 87, "sender": "3PQNn3RcXkRCHHrBYxhVvbeQLa8R8KMjoFa", "senderPublicKey": "FMUD7Eo8pPt3UMp5vBW7GazCX7CeVEkf7xGZ3y5cJdaw", "proofs": [ "36o4jeyvtKJYJDQRdcr2tQvHNzK77aTcou2rpn642Fbis2NghncwH8WgXWJt55A4UMcwJWnuPv32Mk88bbAjHnXe" ], "script": "base64:BgKOAQgCEgASABIAEgASAwoBARIRCg8BAQEBAQEBAQEBAQEBAQESFgoUAQEBAQEBAQgICAEBAQEBAQEBAQESBwoFAQEBCAgSBAoCAQgSBQoDAQEIEgcKBQEBAQQIEgUKAwgBCBIDCgEIEgMKAQgSABIAEgMKAQgSBQoDCAEIEgMKAQESABIDCgEIEgASBAoCCAizAQAMa19iYXNlT3JhY2xlAgxrX2Jhc2VPcmFjbGUADWtfcXVvdGVPcmFjbGUCDWtfcXVvdGVPcmFjbGUACWtfYmFsYW5jZQIJa19iYWxhbmNlAAprX3NlcXVlbmNlAgprX3NlcXVlbmNlAA5rX3Bvc2l0aW9uU2l6ZQIOa19wb3NpdGlvblNpemUAEGtfcG9zaXRpb25NYXJnaW4CEGtfcG9zaXRpb25NYXJnaW4AFmtfcG9zaXRpb25PcGVuTm90aW9uYWwCFmtfcG9zaXRpb25PcGVuTm90aW9uYWwALmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24CEmtfcG9zaXRpb25GcmFjdGlvbgASa19wb3NpdGlvblNlcXVlbmNlAhJrX3Bvc2l0aW9uU2VxdWVuY2UADWtfcG9zaXRpb25GZWUCDWtfcG9zaXRpb25GZWUAHmtfcG9zaXRpb25MYXN0VXBkYXRlZFRpbWVzdGFtcAITa19wb3NpdGlvblRpbWVzdGFtcAANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAIa19wYXVzZWQCCGtfcGF1c2VkAAtrX2Nsb3NlT25seQILa19jbG9zZU9ubHkABWtfZmVlAgVrX2ZlZQANa19yb2xsb3ZlckZlZQIOa19yb2xsb3Zlcl9mZWUAD2tfZnVuZGluZ1BlcmlvZAIPa19mdW5kaW5nUGVyaW9kABFrX2luaXRNYXJnaW5SYXRpbwIRa19pbml0TWFyZ2luUmF0aW8AGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwIFa19tbXIAFWtfbGlxdWlkYXRpb25GZWVSYXRpbwIVa19saXF1aWRhdGlvbkZlZVJhdGlvABlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAhZrX3BhcnRMaXF1aWRhdGlvblJhdGlvAA1rX3NwcmVhZExpbWl0Ag1rX3NwcmVhZExpbWl0ABBrX21heFByaWNlSW1wYWN0AhBrX21heFByaWNlSW1wYWN0ABBrX21heFByaWNlU3ByZWFkAhBrX21heFByaWNlU3ByZWFkABFrX21heE9wZW5Ob3Rpb25hbAIRa19tYXhPcGVuTm90aW9uYWwAFWtfZmVlVG9TdGFrZXJzUGVyY2VudAIVa19mZWVUb1N0YWtlcnNQZXJjZW50ABBrX21heE9yYWNsZURlbGF5AhBrX21heE9yYWNsZURlbGF5AA1rX2Z1bmRpbmdNb2RlAg1rX2Z1bmRpbmdNb2RlAAxrX29yYWNsZU1vZGUCDGtfb3JhY2xlTW9kZQAla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIba19sYXRlc3RMb25nUHJlbWl1bUZyYWN0aW9uACZrX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIca19sYXRlc3RTaG9ydFByZW1pdW1GcmFjdGlvbgASa19uZXh0RnVuZGluZ0Jsb2NrAh5rX25leHRGdW5kaW5nQmxvY2tNaW5UaW1lc3RhbXAAEWtfbG9uZ0Z1bmRpbmdSYXRlAhFrX2xvbmdGdW5kaW5nUmF0ZQASa19zaG9ydEZ1bmRpbmdSYXRlAhJrX3Nob3J0RnVuZGluZ1JhdGUAE2tfcXVvdGVBc3NldFJlc2VydmUCCGtfcXRBc3RSABJrX2Jhc2VBc3NldFJlc2VydmUCCGtfYnNBc3RSABJrX3F1b3RlQXNzZXRXZWlnaHQCCGtfcXRBc3RXABFrX2Jhc2VBc3NldFdlaWdodAIIa19ic0FzdFcAE2tfdG90YWxQb3NpdGlvblNpemUCE2tfdG90YWxQb3NpdGlvblNpemUAF2tfdG90YWxMb25nUG9zaXRpb25TaXplAhdrX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAYa190b3RhbFNob3J0UG9zaXRpb25TaXplAhhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUAFmtfb3BlbkludGVyZXN0Tm90aW9uYWwCFmtfb3BlbkludGVyZXN0Tm90aW9uYWwAE2tfb3BlbkludGVyZXN0U2hvcnQCE2tfb3BlbkludGVyZXN0U2hvcnQAEmtfb3BlbkludGVyZXN0TG9uZwISa19vcGVuSW50ZXJlc3RMb25nAAhrX2xhc3RUeAIIa19sYXN0VHgAFGtfY29vcmRpbmF0b3JBZGRyZXNzAhRrX2Nvb3JkaW5hdG9yQWRkcmVzcwAPa192YXVsdF9hZGRyZXNzAg9rX3ZhdWx0X2FkZHJlc3MAD2tfYWRtaW5fYWRkcmVzcwIPa19hZG1pbl9hZGRyZXNzAA1rX3F1b3RlX2Fzc2V0Ag1rX3F1b3RlX2Fzc2V0ABFrX3N0YWtpbmdfYWRkcmVzcwIRa19zdGFraW5nX2FkZHJlc3MAD2tfbWluZXJfYWRkcmVzcwIPa19taW5lcl9hZGRyZXNzABBrX29yZGVyc19hZGRyZXNzAhBrX29yZGVyc19hZGRyZXNzABJrX3JlZmVycmFsX2FkZHJlc3MCEmtfcmVmZXJyYWxfYWRkcmVzcwAVa19uZnRfbWFuYWdlcl9hZGRyZXNzAhVrX25mdF9tYW5hZ2VyX2FkZHJlc3MBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBC2Nvb3JkaW5hdG9yAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAhNDb29yZGluYXRvciBub3Qgc2V0AQxhZG1pbkFkZHJlc3MACQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwEKcXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUNa19xdW90ZV9hc3NldAEOc3Rha2luZ0FkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAURa19zdGFraW5nX2FkZHJlc3MCD1N0YWtpbmcgbm90IHNldAEMdmF1bHRBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfdmF1bHRfYWRkcmVzcwINVmF1bHQgbm90IHNldAEMbWluZXJBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfbWluZXJfYWRkcmVzcwINTWluZXIgbm90IHNldAENb3JkZXJzQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRBrX29yZGVyc19hZGRyZXNzAg5PcmRlcnMgbm90IHNldAEPcmVmZXJyYWxBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEmtfcmVmZXJyYWxfYWRkcmVzcwIQUmVmZXJyYWwgbm90IHNldAERbmZ0TWFuYWdlckFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUVa19uZnRfbWFuYWdlcl9hZGRyZXNzAhNORlQgTWFuYWdlciBub3Qgc2V0AA1rX3Rva2VuX3BhcmFtAg1rX3Rva2VuX3BhcmFtAAxrX3Rva2VuX3R5cGUCDGtfdG9rZW5fdHlwZQAYRkVFX1JFRFVDVElPTl9UT0tFTl9UWVBFAg1mZWVfcmVkdWN0aW9uAAhESVJfTE9ORwABAAlESVJfU0hPUlQAAgAHU0VDT05EUwDoBwAPREVDSU1BTF9OVU1CRVJTAAYADERFQ0lNQUxfVU5JVAkAaAIAAQkAaAIJAGgCCQBoAgkAaAIJAGgCAAoACgAKAAoACgAKAA9NSU5VVEVTX0lOX1lFQVIJAGgCAKCKIAUMREVDSU1BTF9VTklUAAdPTkVfREFZCQBoAgCAowUFDERFQ0lNQUxfVU5JVAAPUE5MX09QVElPTl9TUE9UAAEAEVBOTF9PUFRJT05fT1JBQ0xFAAIAEkZVTkRJTkdfQVNZTU1FVFJJQwABABFGVU5ESU5HX1NZTU1FVFJJQwACAAxPUkFDTEVfUExBSU4AAQAKT1JBQ0xFX0pJVAACAQFzAQJfeAkArAICCQCkAwEFAl94AgEsAQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BBWJkaXZkAgJfeAJfeQkAvQIEBQJfeAkAtgIBBQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEFYm11bGQCAl94Al95CQC9AgQFAl94BQJfeQkAtgIBBQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAQNhYnMBAl94AwkAZgIFAl94AAAFAl94CQEBLQEFAl94AQR2bWF4AgJfeAJfeQMJAGcCBQJfeAUCX3kFAl94BQJfeQEDaW50AQFrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBawkArAICAg1ubyB2YWx1ZSBmb3IgBQFrAQVpbnRPcgIBawNkZWYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBawUDZGVmAQRzdHJBAghfYWRkcmVzcwRfa2V5BAN2YWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhfYWRkcmVzcwUEX2tleQkArAICAhFObyB2YWx1ZSBmb3Iga2V5IAUEX2tleQUDdmFsAQRpbnRBAghfYWRkcmVzcwRfa2V5BAN2YWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhfYWRkcmVzcwUEX2tleQkArAICAhFObyB2YWx1ZSBmb3Iga2V5IAUEX2tleQUDdmFsAQhjYmFsYW5jZQAJAQNpbnQBBQlrX2JhbGFuY2UBA2ZlZQAJAQNpbnQBBQVrX2ZlZQEPcm9sbG92ZXJGZWVSYXRlAAkBA2ludAEFDWtfcm9sbG92ZXJGZWUBD2luaXRNYXJnaW5SYXRpbwAJAQNpbnQBBRFrX2luaXRNYXJnaW5SYXRpbwEGcXRBc3RSAAkBA2ludAEFE2tfcXVvdGVBc3NldFJlc2VydmUBBmJzQXN0UgAJAQNpbnQBBRJrX2Jhc2VBc3NldFJlc2VydmUBBnF0QXN0VwAJAQVpbnRPcgIFEmtfcXVvdGVBc3NldFdlaWdodAUMREVDSU1BTF9VTklUAQZic0FzdFcACQEFaW50T3ICBRFrX2Jhc2VBc3NldFdlaWdodAUMREVDSU1BTF9VTklUARF0b3RhbFBvc2l0aW9uU2l6ZQAJAQNpbnQBBRNrX3RvdGFsUG9zaXRpb25TaXplARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAJAQNpbnQBBRZrX29wZW5JbnRlcmVzdE5vdGlvbmFsARFvcGVuSW50ZXJlc3RTaG9ydAAJAQNpbnQBBRNrX29wZW5JbnRlcmVzdFNob3J0ARBvcGVuSW50ZXJlc3RMb25nAAkBA2ludAEFEmtfb3BlbkludGVyZXN0TG9uZwEZbmV4dEZ1bmRpbmdCbG9ja1RpbWVzdGFtcAAJAQNpbnQBBRJrX25leHRGdW5kaW5nQmxvY2sBEGZ1bmRpbmdQZXJpb2RSYXcACQEDaW50AQUPa19mdW5kaW5nUGVyaW9kARRmdW5kaW5nUGVyaW9kRGVjaW1hbAAJAGgCCQEQZnVuZGluZ1BlcmlvZFJhdwAFDERFQ0lNQUxfVU5JVAEUZnVuZGluZ1BlcmlvZFNlY29uZHMACQBoAgkBEGZ1bmRpbmdQZXJpb2RSYXcABQdTRUNPTkRTARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAkBA2ludAEFGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwETbGlxdWlkYXRpb25GZWVSYXRpbwAJAQNpbnQBBRVrX2xpcXVpZGF0aW9uRmVlUmF0aW8BF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAkBA2ludAEFGWtfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8BC3NwcmVhZExpbWl0AAkBA2ludAEFDWtfc3ByZWFkTGltaXQBDm1heFByaWNlSW1wYWN0AAkBA2ludAEFEGtfbWF4UHJpY2VJbXBhY3QBDm1heFByaWNlU3ByZWFkAAkBA2ludAEFEGtfbWF4UHJpY2VTcHJlYWQBD21heE9wZW5Ob3Rpb25hbAAJAQNpbnQBBRFrX21heE9wZW5Ob3Rpb25hbAEjbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ACQEDaW50AQUla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAkBA2ludAEFJmtfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBA2ludAEFGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQEVdG90YWxMb25nUG9zaXRpb25TaXplAAkBA2ludAEFF2tfdG90YWxMb25nUG9zaXRpb25TaXplAQxsYXN0U2VxdWVuY2UACQEFaW50T3ICBQprX3NlcXVlbmNlAAABE2ZlZVRvU3Rha2Vyc1BlcmNlbnQACQEDaW50AQUVa19mZWVUb1N0YWtlcnNQZXJjZW50AQ5tYXhPcmFjbGVEZWxheQAJAQNpbnQBBRBrX21heE9yYWNsZURlbGF5AQtmdW5kaW5nTW9kZQAJAQVpbnRPcgIFDWtfZnVuZGluZ01vZGUFEkZVTkRJTkdfQVNZTU1FVFJJQwEKb3JhY2xlTW9kZQAJAQVpbnRPcgIFDGtfb3JhY2xlTW9kZQUMT1JBQ0xFX1BMQUlOAQ1sYXN0VGltZXN0YW1wAAgFCWxhc3RCbG9jawl0aW1lc3RhbXABD2dldEFjdHVhbENhbGxlcgEBaQkBC3ZhbHVlT3JFbHNlAgkAnQgCCQENb3JkZXJzQWRkcmVzcwACCGtfc2VuZGVyCQClCAEIBQFpBmNhbGxlcgEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMMX21hcmdpblJhdGlvEF9iYXNlTWFyZ2luUmF0aW8UX2xhcmdlclRoYW5PckVxdWFsVG8EFHJlbWFpbmluZ01hcmdpblJhdGlvCQBlAgUMX21hcmdpblJhdGlvBRBfYmFzZU1hcmdpblJhdGlvAwMFFF9sYXJnZXJUaGFuT3JFcXVhbFRvCQBmAgAABRRyZW1haW5pbmdNYXJnaW5SYXRpbwcJAAIBCQCsAgIJAKwCAgkArAICAhBJbnZhbGlkIG1hcmdpbjogCQCkAwEFDF9tYXJnaW5SYXRpbwIDIDwgCQCkAwEFEF9iYXNlTWFyZ2luUmF0aW8DAwkBASEBBRRfbGFyZ2VyVGhhbk9yRXF1YWxUbwkAZwIFFHJlbWFpbmluZ01hcmdpblJhdGlvAAAHCQACAQkArAICCQCsAgIJAKwCAgIQSW52YWxpZCBtYXJnaW46IAkApAMBBQxfbWFyZ2luUmF0aW8CAyA+IAkApAMBBRBfYmFzZU1hcmdpblJhdGlvBgEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgENX3Bvc2l0aW9uU2l6ZQMJAAACBQ1fcG9zaXRpb25TaXplAAAJAAIBAixTaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIF9wb3NpdGlvblNpemUgPT0gMAMJAGYCBQ1fcG9zaXRpb25TaXplAAAJASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAJASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24AAQtnZXRQb3NpdGlvbgIHX3RyYWRlcgpfZGlyZWN0aW9uBAtwb3NpdGlvbktleQkArAICCQCsAgIFB190cmFkZXICAV8JAKQDAQUKX2RpcmVjdGlvbgQPcG9zaXRpb25TaXplT3B0CQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQtwb3NpdGlvbktleQQHJG1hdGNoMAUPcG9zaXRpb25TaXplT3B0AwkAAQIFByRtYXRjaDACA0ludAQMcG9zaXRpb25TaXplBQckbWF0Y2gwCQCXCgUFDHBvc2l0aW9uU2l6ZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgULcG9zaXRpb25LZXkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFFmtfcG9zaXRpb25PcGVuTm90aW9uYWwFC3Bvc2l0aW9uS2V5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQtwb3NpdGlvbktleQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUea19wb3NpdGlvbkxhc3RVcGRhdGVkVGltZXN0YW1wBQtwb3NpdGlvbktleQkAlwoFAAAAAAAAAAAAAAEMZ2V0RGlyZWN0aW9uAQ1fcG9zaXRpb25TaXplAwkAZgIAAAUNX3Bvc2l0aW9uU2l6ZQUJRElSX1NIT1JUBQhESVJfTE9ORwEOZ2V0UG9zaXRpb25GZWUCB190cmFkZXIKX2RpcmVjdGlvbgQLcG9zaXRpb25LZXkJAKwCAgkArAICBQdfdHJhZGVyAgFfCQCkAwEFCl9kaXJlY3Rpb24EDnBvc2l0aW9uRmVlT3B0CQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDWtfcG9zaXRpb25GZWUFC3Bvc2l0aW9uS2V5BAckbWF0Y2gwBQ5wb3NpdGlvbkZlZU9wdAMJAAECBQckbWF0Y2gwAgNJbnQEC3Bvc2l0aW9uRmVlBQckbWF0Y2gwBQtwb3NpdGlvbkZlZQkBA2ZlZQABE3JlcXVpcmVPcGVuUG9zaXRpb24CB190cmFkZXIKX2RpcmVjdGlvbgMJAAACCAkBC2dldFBvc2l0aW9uAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgJfMQAACQACAQIQTm8gb3BlbiBwb3NpdGlvbgYBDWdldE9yYWNsZURhdGEBA2tleQQNb3JhY2xlRGF0YVN0cgkAnQgCBQR0aGlzBQNrZXkDAwkBCWlzRGVmaW5lZAEFDW9yYWNsZURhdGFTdHIJAQIhPQIJAQV2YWx1ZQEFDW9yYWNsZURhdGFTdHICAAcECm9yYWNsZURhdGEJALUJAgkBBXZhbHVlAQUNb3JhY2xlRGF0YVN0cgIBLAQNb3JhY2xlQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKb3JhY2xlRGF0YQAACQCsAgICG0ludmFsaWQgb3JhY2xlIGFkZHJlc3MgaW46IAkBBXZhbHVlAQUNb3JhY2xlRGF0YVN0cgQIcHJpY2VLZXkJAJEDAgUKb3JhY2xlRGF0YQABBAhibG9ja0tleQkAkQMCBQpvcmFjbGVEYXRhAAIEB29wZW5LZXkJAJEDAgUKb3JhY2xlRGF0YQADCQCWCgQFDW9yYWNsZUFkZHJlc3MFCHByaWNlS2V5BQhibG9ja0tleQUHb3BlbktleQUEdW5pdAELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHAQZwYXVzZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFCGtfcGF1c2VkBwEJY2xvc2VPbmx5AAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQtrX2Nsb3NlT25seQcBDXVwZGF0ZVJlc2VydmUDBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudBBfYmFzZUFzc2V0QW1vdW50AwUGX2lzQWRkBAduZXdCYXNlCQBlAgkBBmJzQXN0UgAFEF9iYXNlQXNzZXRBbW91bnQDCQBnAgAABQduZXdCYXNlCQACAQIqVHggbGVhZCB0byBiYXNlIGFzc2V0IHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQCVCgMJAGQCCQEGcXRBc3RSAAURX3F1b3RlQXNzZXRBbW91bnQFB25ld0Jhc2UJAGQCCQERdG90YWxQb3NpdGlvblNpemUABRBfYmFzZUFzc2V0QW1vdW50BAhuZXdRdW90ZQkAZQIJAQZxdEFzdFIABRFfcXVvdGVBc3NldEFtb3VudAMJAGcCAAAFCG5ld1F1b3RlCQACAQIqVHggbGVhZCB0byBiYXNlIHF1b3RlIHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQCVCgMFCG5ld1F1b3RlCQBkAgkBBmJzQXN0UgAFEF9iYXNlQXNzZXRBbW91bnQJAGUCCQERdG90YWxQb3NpdGlvblNpemUABRBfYmFzZUFzc2V0QW1vdW50AQ1jYWxjSW52YXJpYW50AgdfcXRBc3RSB19ic0FzdFIEB2JxdEFzdFIJALYCAQUHX3F0QXN0UgQHYmJzQXN0UgkAtgIBBQdfYnNBc3RSCQEFYm11bGQCBQdicXRBc3RSBQdiYnNBc3RSAQlzd2FwSW5wdXQCBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudAQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAdfcXRBc3RXCQEGcXRBc3RXAAQHX2JzQXN0VwkBBmJzQXN0VwAEGHF1b3RlQXNzZXRBbW91bnRBZGp1c3RlZAkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUHX3F0QXN0VwQBawkBDWNhbGNJbnZhcmlhbnQCBQdfcXRBc3RSBQdfYnNBc3RSBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyAwUGX2lzQWRkCQBkAgUHX3F0QXN0UgUYcXVvdGVBc3NldEFtb3VudEFkanVzdGVkCQBlAgUHX3F0QXN0UgUYcXVvdGVBc3NldEFtb3VudEFkanVzdGVkBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIJAKADAQkBBWJkaXZkAgUBawkAtgIBBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBBhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMJAQNhYnMBCQBlAgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQdfYnNBc3RSBBVhbW91bnRCYXNlQXNzZXRCb3VnaHQDBQZfaXNBZGQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwkBAS0BBRhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMEDSR0MDE1Nzg2MTU5NTYJAQ11cGRhdGVSZXNlcnZlAwUGX2lzQWRkBRhxdW90ZUFzc2V0QW1vdW50QWRqdXN0ZWQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEIBQ0kdDAxNTc4NjE1OTU2Al8xBBZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTU3ODYxNTk1NgJfMgQXdG90YWxQb3NpdGlvblNpemVBZnRlcjEIBQ0kdDAxNTc4NjE1OTU2Al8zBAtwcmljZUJlZm9yZQkBBGRpdmQCCQEEbXVsZAIFB19xdEFzdFIFB19xdEFzdFcJAQRtdWxkAgUHX2JzQXN0UgUHX2JzQXN0VwQLbWFya2V0UHJpY2UJAQRkaXZkAgURX3F1b3RlQXNzZXRBbW91bnQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQJcHJpY2VEaWZmCQEDYWJzAQkAZQIFC3ByaWNlQmVmb3JlBQttYXJrZXRQcmljZQQLcHJpY2VJbXBhY3QJAGUCBQxERUNJTUFMX1VOSVQJAQRkaXZkAgULcHJpY2VCZWZvcmUJAGQCBQtwcmljZUJlZm9yZQUJcHJpY2VEaWZmBBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QAAwkAZgIFC3ByaWNlSW1wYWN0BRNtYXhQcmljZUltcGFjdFZhbHVlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1QcmljZSBpbXBhY3QgCQCkAwEFC3ByaWNlSW1wYWN0AhQgPiBtYXggcHJpY2UgaW1wYWN0IAkApAMBBRNtYXhQcmljZUltcGFjdFZhbHVlAhUgYmVmb3JlIHF1b3RlIGFzc2V0OiAJAKQDAQUHX3F0QXN0UgIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQUHX2JzQXN0UgIhIHF1b3RlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEV9xdW90ZUFzc2V0QW1vdW50Ag8gcHJpY2UgYmVmb3JlOiAJAKQDAQULcHJpY2VCZWZvcmUCDiBtYXJrZXRQcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCWCgQFFWFtb3VudEJhc2VBc3NldEJvdWdodAUXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEFFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxAQ9jYWxjUm9sbG92ZXJGZWUCEl9vbGRQb3NpdGlvbk1hcmdpbiBfb2xkUG9zaXRpb25MYXN0VXBkYXRlZFRpbWVzdGFtcAQPcG9zaXRpb25NaW51dGVzCQBoAgkAaQIJAGkCCQBlAgkBDWxhc3RUaW1lc3RhbXAABSBfb2xkUG9zaXRpb25MYXN0VXBkYXRlZFRpbWVzdGFtcADoBwA8BQxERUNJTUFMX1VOSVQEC3JvbGxvdmVyRmVlCQEEZGl2ZAIJAQRtdWxkAgkBBG11bGQCBRJfb2xkUG9zaXRpb25NYXJnaW4FD3Bvc2l0aW9uTWludXRlcwkBD3JvbGxvdmVyRmVlUmF0ZQAFD01JTlVURVNfSU5fWUVBUgULcm9sbG92ZXJGZWUBMGNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnRBbmRSb2xsb3ZlckZlZQUQX29sZFBvc2l0aW9uU2l6ZRJfb2xkUG9zaXRpb25NYXJnaW4lX29sZFBvc2l0aW9uQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbiBfb2xkUG9zaXRpb25MYXN0VXBkYXRlZFRpbWVzdGFtcAxfbWFyZ2luRGVsdGEEDmZ1bmRpbmdQYXltZW50AwkBAiE9AgUQX29sZFBvc2l0aW9uU2l6ZQAABCBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBRBfb2xkUG9zaXRpb25TaXplCQEEbXVsZAIJAGUCBSBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUlX29sZFBvc2l0aW9uQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUQX29sZFBvc2l0aW9uU2l6ZQAABAtyb2xsb3ZlckZlZQkBD2NhbGNSb2xsb3ZlckZlZQIFEl9vbGRQb3NpdGlvbk1hcmdpbgUgX29sZFBvc2l0aW9uTGFzdFVwZGF0ZWRUaW1lc3RhbXAEDHNpZ25lZE1hcmdpbgkAZAIJAGUCCQBlAgUMX21hcmdpbkRlbHRhBQtyb2xsb3ZlckZlZQUOZnVuZGluZ1BheW1lbnQFEl9vbGRQb3NpdGlvbk1hcmdpbgQNJHQwMTg2MjMxODc1MAMJAGYCAAAFDHNpZ25lZE1hcmdpbgkAlAoCAAAJAQNhYnMBBQxzaWduZWRNYXJnaW4JAJQKAgkBA2FicwEFDHNpZ25lZE1hcmdpbgAABAxyZW1haW5NYXJnaW4IBQ0kdDAxODYyMzE4NzUwAl8xBAdiYWREZWJ0CAUNJHQwMTg2MjMxODc1MAJfMgkAlgoEBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFDmZ1bmRpbmdQYXltZW50BQtyb2xsb3ZlckZlZQEWc3dhcE91dHB1dFdpdGhSZXNlcnZlcwcGX2lzQWRkEF9iYXNlQXNzZXRBbW91bnQUX2NoZWNrTWF4UHJpY2VJbXBhY3QSX3F1b3RlQXNzZXRSZXNlcnZlEV9xdW90ZUFzc2V0V2VpZ2h0EV9iYXNlQXNzZXRSZXNlcnZlEF9iYXNlQXNzZXRXZWlnaHQEC3ByaWNlQmVmb3JlCQEEZGl2ZAIJAQRtdWxkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfcXVvdGVBc3NldFdlaWdodAkBBG11bGQCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUQX2Jhc2VBc3NldFdlaWdodAMJAAACBRBfYmFzZUFzc2V0QW1vdW50AAAJAAIBAhlJbnZhbGlkIGJhc2UgYXNzZXQgYW1vdW50BAFrCQENY2FsY0ludmFyaWFudAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUEGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgMFBl9pc0FkZAkAZAIFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0QW1vdW50CQBlAgURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRBbW91bnQED3F1b3RlQXNzZXRBZnRlcgkAoAMBCQEFYmRpdmQCBQFrCQC2AgEFGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgQPcXVvdGVBc3NldERlbHRhCQEDYWJzAQkAZQIFD3F1b3RlQXNzZXRBZnRlcgUSX3F1b3RlQXNzZXRSZXNlcnZlBA5xdW90ZUFzc2V0U29sZAkBBG11bGQCBQ9xdW90ZUFzc2V0RGVsdGEFEV9xdW90ZUFzc2V0V2VpZ2h0BBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QABA0kdDAyMDAxMjIwMTc0CQENdXBkYXRlUmVzZXJ2ZQMJAQEhAQUGX2lzQWRkBQ9xdW90ZUFzc2V0RGVsdGEFEF9iYXNlQXNzZXRBbW91bnQEF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMjAwMTIyMDE3NAJfMQQWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDIwMDEyMjAxNzQCXzIEF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxCAUNJHQwMjAwMTIyMDE3NAJfMwQLbWFya2V0UHJpY2UJAQRkaXZkAgUOcXVvdGVBc3NldFNvbGQFEF9iYXNlQXNzZXRBbW91bnQECXByaWNlRGlmZgkBA2FicwEJAGUCBQtwcmljZUJlZm9yZQULbWFya2V0UHJpY2UEC3ByaWNlSW1wYWN0CQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIFC3ByaWNlQmVmb3JlCQBkAgULcHJpY2VCZWZvcmUFCXByaWNlRGlmZgMDCQBmAgULcHJpY2VJbXBhY3QFE21heFByaWNlSW1wYWN0VmFsdWUFFF9jaGVja01heFByaWNlSW1wYWN0BwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgINUHJpY2UgaW1wYWN0IAkApAMBBQtwcmljZUltcGFjdAIUID4gbWF4IHByaWNlIGltcGFjdCAJAKQDAQUTbWF4UHJpY2VJbXBhY3RWYWx1ZQIVIGJlZm9yZSBxdW90ZSBhc3NldDogCQCkAwEFEl9xdW90ZUFzc2V0UmVzZXJ2ZQIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQURX2Jhc2VBc3NldFJlc2VydmUCICBiYXNlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEF9iYXNlQXNzZXRBbW91bnQCDyBwcmljZSBiZWZvcmU6IAkApAMBBQtwcmljZUJlZm9yZQIPIG1hcmtldCBwcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCZCgcFDnF1b3RlQXNzZXRTb2xkBRdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQUWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQUXdG90YWxQb3NpdGlvblNpemVBZnRlcjEJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMFBl9pc0FkZAkBA2FicwEFEF9iYXNlQXNzZXRBbW91bnQAAAkAZQIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAMJAQEhAQUGX2lzQWRkCQEDYWJzAQUQX2Jhc2VBc3NldEFtb3VudAAABQtwcmljZUltcGFjdAEKc3dhcE91dHB1dAMGX2lzQWRkEF9iYXNlQXNzZXRBbW91bnQUX2NoZWNrTWF4UHJpY2VJbXBhY3QJARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBwUGX2lzQWRkBRBfYmFzZUFzc2V0QW1vdW50BRRfY2hlY2tNYXhQcmljZUltcGFjdAkBBnF0QXN0UgAJAQZxdEFzdFcACQEGYnNBc3RSAAkBBmJzQXN0VwABE2dldE9yYWNsZVByaWNlVmFsdWUDBm9yYWNsZQhwcmljZUtleQhibG9ja0tleQQJbGFzdFZhbHVlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUGb3JhY2xlBQhwcmljZUtleQkArAICCQCsAgIJAKwCAgIiQ2FuIG5vdCBnZXQgb3JhY2xlIHByaWNlLiBPcmFjbGU6IAkApQgBBQZvcmFjbGUCBiBrZXk6IAUIcHJpY2VLZXkDCQECIT0CBQhibG9ja0tleQIABAxjdXJyZW50QmxvY2sFBmhlaWdodAQPbGFzdE9yYWNsZUJsb2NrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUGb3JhY2xlBQhibG9ja0tleQkArAICCQCsAgIJAKwCAgIiQ2FuIG5vdCBnZXQgb3JhY2xlIGJsb2NrLiBPcmFjbGU6IAkApQgBBQZvcmFjbGUCBiBrZXk6IAUIYmxvY2tLZXkDCQBmAgkAZQIFDGN1cnJlbnRCbG9jawUPbGFzdE9yYWNsZUJsb2NrCQEObWF4T3JhY2xlRGVsYXkACQACAQkArAICCQCsAgIJAKwCAgImT3JhY2xlIHN0YWxlIGRhdGEuIExhc3Qgb3JhY2xlIGJsb2NrOiAJAKQDAQUPbGFzdE9yYWNsZUJsb2NrAhAgY3VycmVudCBibG9jazogCQCkAwEFDGN1cnJlbnRCbG9jawUJbGFzdFZhbHVlBQlsYXN0VmFsdWUBDmdldE9yYWNsZVByaWNlAAQKYmFzZU9yYWNsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQENZ2V0T3JhY2xlRGF0YQEFDGtfYmFzZU9yYWNsZQIZTm8gYmFzZSBhc3NldCBvcmFjbGUgZGF0YQQPYmFzZU9yYWNsZVByaWNlCQETZ2V0T3JhY2xlUHJpY2VWYWx1ZQMIBQpiYXNlT3JhY2xlAl8xCAUKYmFzZU9yYWNsZQJfMggFCmJhc2VPcmFjbGUCXzMEC3F1b3RlT3JhY2xlCQENZ2V0T3JhY2xlRGF0YQEFDWtfcXVvdGVPcmFjbGUEEHF1b3RlT3JhY2xlUHJpY2UDCQEJaXNEZWZpbmVkAQULcXVvdGVPcmFjbGUEDHF1b3RlT3JhY2xlVgkBBXZhbHVlAQULcXVvdGVPcmFjbGUJARNnZXRPcmFjbGVQcmljZVZhbHVlAwgFDHF1b3RlT3JhY2xlVgJfMQgFDHF1b3RlT3JhY2xlVgJfMggFDHF1b3RlT3JhY2xlVgJfMwUMREVDSU1BTF9VTklUCQEEZGl2ZAIFD2Jhc2VPcmFjbGVQcmljZQUQcXVvdGVPcmFjbGVQcmljZQEOaXNNYXJrZXRDbG9zZWQABApiYXNlT3JhY2xlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQ1nZXRPcmFjbGVEYXRhAQUMa19iYXNlT3JhY2xlAhlObyBiYXNlIGFzc2V0IG9yYWNsZSBkYXRhBAZvcmFjbGUIBQpiYXNlT3JhY2xlAl8xBAdvcGVuS2V5CAUKYmFzZU9yYWNsZQJfNAMJAQIhPQIFB29wZW5LZXkCAAQGaXNPcGVuCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJsIAgUGb3JhY2xlBQdvcGVuS2V5CQCsAgIJAKwCAgkArAICAitDYW4gbm90IGdldCBvcmFjbGUgaXMgb3Blbi9jbG9zZWQuIE9yYWNsZTogCQClCAEFBm9yYWNsZQIGIGtleTogBQdvcGVuS2V5CQEBIQEFBmlzT3BlbgcBDGFic1ByaWNlRGlmZgUMX29yYWNsZVByaWNlEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQdfcXRBc3RXB19ic0FzdFcECnByaWNlQWZ0ZXIJAQRkaXZkAgkBBG11bGQCBRJfcXVvdGVBc3NldFJlc2VydmUFB19xdEFzdFcJAQRtdWxkAgURX2Jhc2VBc3NldFJlc2VydmUFB19ic0FzdFcEDGF2ZXJhZ2VQcmljZQkBBGRpdmQCCQBkAgUMX29yYWNsZVByaWNlBQpwcmljZUFmdGVyCQBoAgACBQxERUNJTUFMX1VOSVQEDGFic1ByaWNlRGlmZgkBBGRpdmQCCQEDYWJzAQkAZQIFDF9vcmFjbGVQcmljZQUKcHJpY2VBZnRlcgUMYXZlcmFnZVByaWNlBQxhYnNQcmljZURpZmYBGXJlcXVpcmVOb3RPdmVyU3ByZWFkTGltaXQCEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQQLb3JhY2xlUHJpY2UJAQ5nZXRPcmFjbGVQcmljZQAEB19xdEFzdFcJAQZxdEFzdFcABAdfYnNBc3RXCQEGYnNBc3RXAAQSYWJzUHJpY2VEaWZmQmVmb3JlCQEMYWJzUHJpY2VEaWZmBQULb3JhY2xlUHJpY2UJAQZxdEFzdFIACQEGYnNBc3RSAAUHX3F0QXN0VwUHX2JzQXN0VwQRYWJzUHJpY2VEaWZmQWZ0ZXIJAQxhYnNQcmljZURpZmYFBQtvcmFjbGVQcmljZQUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQUHX3F0QXN0VwUHX2JzQXN0VwMDCQBmAgURYWJzUHJpY2VEaWZmQWZ0ZXIJAQ5tYXhQcmljZVNwcmVhZAAJAGYCBRFhYnNQcmljZURpZmZBZnRlcgUSYWJzUHJpY2VEaWZmQmVmb3JlBwkAAgEJAKwCAgkArAICCQCsAgICDVByaWNlIHNwcmVhZCAJAKQDAQURYWJzUHJpY2VEaWZmQWZ0ZXICFCA+IG1heCBwcmljZSBzcHJlYWQgCQCkAwEJAQ5tYXhQcmljZVNwcmVhZAAGAR1yZXF1aXJlTm90T3Zlck1heE9wZW5Ob3Rpb25hbAIRX2xvbmdPcGVuTm90aW9uYWwSX3Nob3J0T3Blbk5vdGlvbmFsBBBfbWF4T3Blbk5vdGlvbmFsCQEPbWF4T3Blbk5vdGlvbmFsAAMJAGYCBRFfbG9uZ09wZW5Ob3Rpb25hbAUQX21heE9wZW5Ob3Rpb25hbAkAAgEJAKwCAgkArAICCQCsAgICE0xvbmcgb3BlbiBub3Rpb25hbCAJAKQDAQURX2xvbmdPcGVuTm90aW9uYWwCFSA+IG1heCBvcGVuIG5vdGlvbmFsIAkApAMBBRBfbWF4T3Blbk5vdGlvbmFsAwkAZgIFEl9zaG9ydE9wZW5Ob3Rpb25hbAUQX21heE9wZW5Ob3Rpb25hbAkAAgEJAKwCAgkArAICCQCsAgICFFNob3J0IG9wZW4gbm90aW9uYWwgCQCkAwEFEl9zaG9ydE9wZW5Ob3Rpb25hbAIVID4gbWF4IG9wZW4gbm90aW9uYWwgCQCkAwEFEF9tYXhPcGVuTm90aW9uYWwGAQxnZXRTcG90UHJpY2UABBJfcXVvdGVBc3NldFJlc2VydmUJAQZxdEFzdFIABBFfYmFzZUFzc2V0UmVzZXJ2ZQkBBmJzQXN0UgAEB19xdEFzdFcJAQZxdEFzdFcABAdfYnNBc3RXCQEGYnNBc3RXAAkBBGRpdmQCCQEEbXVsZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQUHX3F0QXN0VwkBBG11bGQCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUHX2JzQXN0VwEWaXNPdmVyRmx1Y3R1YXRpb25MaW1pdAAEC29yYWNsZVByaWNlCQEOZ2V0T3JhY2xlUHJpY2UABAxjdXJyZW50UHJpY2UJAQxnZXRTcG90UHJpY2UACQBmAgkBBGRpdmQCCQEDYWJzAQkAZQIFC29yYWNsZVByaWNlBQxjdXJyZW50UHJpY2UFC29yYWNsZVByaWNlCQELc3ByZWFkTGltaXQAAR9nZXRQb3NpdGlvbkFkanVzdGVkT3Blbk5vdGlvbmFsBg1fcG9zaXRpb25TaXplB19vcHRpb24SX3F1b3RlQXNzZXRSZXNlcnZlEV9xdW90ZUFzc2V0V2VpZ2h0EV9iYXNlQXNzZXRSZXNlcnZlEF9iYXNlQXNzZXRXZWlnaHQED3Bvc2l0aW9uU2l6ZUFicwkBA2FicwEFDV9wb3NpdGlvblNpemUEB2lzU2hvcnQJAGYCAAAFDV9wb3NpdGlvblNpemUEEHBvc2l0aW9uTm90aW9uYWwDCQAAAgUHX29wdGlvbgUPUE5MX09QVElPTl9TUE9UBBNvdXRQb3NpdGlvbk5vdGlvbmFsCAkBFnN3YXBPdXRwdXRXaXRoUmVzZXJ2ZXMHCQEBIQEFB2lzU2hvcnQFD3Bvc2l0aW9uU2l6ZUFicwcFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX3F1b3RlQXNzZXRXZWlnaHQFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0V2VpZ2h0Al8xBRNvdXRQb3NpdGlvbk5vdGlvbmFsCQEEbXVsZAIFD3Bvc2l0aW9uU2l6ZUFicwkBDmdldE9yYWNsZVByaWNlAAUQcG9zaXRpb25Ob3Rpb25hbAErZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmxCeVZhbHVlcwcNX3Bvc2l0aW9uU2l6ZRVfcG9zaXRpb25PcGVuTm90aW9uYWwSX3F1b3RlQXNzZXRSZXNlcnZlEV9xdW90ZUFzc2V0V2VpZ2h0EV9iYXNlQXNzZXRSZXNlcnZlEF9iYXNlQXNzZXRXZWlnaHQHX29wdGlvbgMJAAACBQ1fcG9zaXRpb25TaXplAAAJAAIBAhVJbnZhbGlkIHBvc2l0aW9uIHNpemUEB2lzU2hvcnQJAGYCAAAFDV9wb3NpdGlvblNpemUEEHBvc2l0aW9uTm90aW9uYWwJAR9nZXRQb3NpdGlvbkFkanVzdGVkT3Blbk5vdGlvbmFsBgUNX3Bvc2l0aW9uU2l6ZQUHX29wdGlvbgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfcXVvdGVBc3NldFdlaWdodAURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRXZWlnaHQEDXVucmVhbGl6ZWRQbmwDBQdpc1Nob3J0CQBlAgUVX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBRBwb3NpdGlvbk5vdGlvbmFsCQBlAgUQcG9zaXRpb25Ob3Rpb25hbAUVX3Bvc2l0aW9uT3Blbk5vdGlvbmFsCQCUCgIFEHBvc2l0aW9uTm90aW9uYWwFDXVucmVhbGl6ZWRQbmwBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAwdfdHJhZGVyCl9kaXJlY3Rpb24HX29wdGlvbgQNJHQwMjgwNTkyODE5OQkBC2dldFBvc2l0aW9uAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgQMcG9zaXRpb25TaXplCAUNJHQwMjgwNTkyODE5OQJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAyODA1OTI4MTk5Al8yBBRwb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDI4MDU5MjgxOTkCXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwMjgwNTkyODE5OQJfNAkBK2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sQnlWYWx1ZXMHBQxwb3NpdGlvblNpemUFFHBvc2l0aW9uT3Blbk5vdGlvbmFsCQEGcXRBc3RSAAkBBnF0QXN0VwAJAQZic0FzdFIACQEGYnNBc3RXAAUHX29wdGlvbgEPY2FsY01hcmdpblJhdGlvAw1fcmVtYWluTWFyZ2luCF9iYWREZWJ0EV9wb3NpdGlvbk5vdGlvbmFsCQEEZGl2ZAIJAGUCBQ1fcmVtYWluTWFyZ2luBQhfYmFkRGVidAURX3Bvc2l0aW9uTm90aW9uYWwBFmdldE1hcmdpblJhdGlvQnlPcHRpb24DB190cmFkZXIKX2RpcmVjdGlvbgdfb3B0aW9uBA0kdDAyODczMTI4ODg0CQELZ2V0UG9zaXRpb24CBQdfdHJhZGVyBQpfZGlyZWN0aW9uBAxwb3NpdGlvblNpemUIBQ0kdDAyODczMTI4ODg0Al8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDI4NzMxMjg4ODQCXzIEA3BvbggFDSR0MDI4NzMxMjg4ODQCXzMEFnBvc2l0aW9uTGFzdFVwZGF0ZWRDUEYIBQ0kdDAyODczMTI4ODg0Al80BBFwb3NpdGlvblRpbWVzdGFtcAgFDSR0MDI4NzMxMjg4ODQCXzUEDSR0MDI4ODkwMjg5OTUJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAMFB190cmFkZXIFCl9kaXJlY3Rpb24FB19vcHRpb24EEHBvc2l0aW9uTm90aW9uYWwIBQ0kdDAyODg5MDI4OTk1Al8xBA11bnJlYWxpemVkUG5sCAUNJHQwMjg4OTAyODk5NQJfMgQNJHQwMjkwMDAyOTIxMgkBMGNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnRBbmRSb2xsb3ZlckZlZQUFDHBvc2l0aW9uU2l6ZQUOcG9zaXRpb25NYXJnaW4FFnBvc2l0aW9uTGFzdFVwZGF0ZWRDUEYFEXBvc2l0aW9uVGltZXN0YW1wBQ11bnJlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDAyOTAwMDI5MjEyAl8xBAdiYWREZWJ0CAUNJHQwMjkwMDAyOTIxMgJfMgkBD2NhbGNNYXJnaW5SYXRpbwMFDHJlbWFpbk1hcmdpbgUHYmFkRGVidAUQcG9zaXRpb25Ob3Rpb25hbAEOZ2V0TWFyZ2luUmF0aW8CB190cmFkZXIKX2RpcmVjdGlvbgkBFmdldE1hcmdpblJhdGlvQnlPcHRpb24DBQdfdHJhZGVyBQpfZGlyZWN0aW9uBQ9QTkxfT1BUSU9OX1NQT1QBG2dldFBhcnRpYWxMaXF1aWRhdGlvbkFtb3VudAIHX3RyYWRlcg1fcG9zaXRpb25TaXplBAxtYXhpbXVtUmF0aW8JAQR2bWF4AgkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAkAZQIFDERFQ0lNQUxfVU5JVAkBBGRpdmQCCQEOZ2V0TWFyZ2luUmF0aW8CBQdfdHJhZGVyCQEMZ2V0RGlyZWN0aW9uAQUNX3Bvc2l0aW9uU2l6ZQkBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ABBhtYXhFeGNoYW5nZWRQb3NpdGlvblNpemUJAQRtdWxkAgkBA2FicwEFDV9wb3NpdGlvblNpemUFDG1heGltdW1SYXRpbwQKc3dhcFJlc3VsdAkBCnN3YXBPdXRwdXQDCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABRhtYXhFeGNoYW5nZWRQb3NpdGlvblNpemUHBBxtYXhFeGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAUKc3dhcFJlc3VsdAJfMQQLcHJpY2VJbXBhY3QIBQpzd2FwUmVzdWx0Al83AwkAZgIJAQ5tYXhQcmljZUltcGFjdAAFC3ByaWNlSW1wYWN0BRhtYXhFeGNoYW5nZWRQb3NpdGlvblNpemUJAQRtdWxkAgkBA2FicwEFDV9wb3NpdGlvblNpemUJARdwYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwABFWludGVybmFsQ2xvc2VQb3NpdGlvbggHX3RyYWRlcgpfZGlyZWN0aW9uBV9zaXplBF9mZWUUX21pblF1b3RlQXNzZXRBbW91bnQMX2FkZFRvTWFyZ2luFF9jaGVja01heFByaWNlSW1wYWN0Cl9saXF1aWRhdGUEDSR0MDMwMzc1MzA1NDMJAQtnZXRQb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24ED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDMwMzc1MzA1NDMCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwMzAzNzUzMDU0MwJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDAzMDM3NTMwNTQzAl8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDMwMzc1MzA1NDMCXzQEFG9sZFBvc2l0aW9uVGltZXN0YW1wCAUNJHQwMzAzNzUzMDU0MwJfNQQOaXNMb25nUG9zaXRpb24JAGYCBQ9vbGRQb3NpdGlvblNpemUAAAQSYWJzT2xkUG9zaXRpb25TaXplCQEDYWJzAQUPb2xkUG9zaXRpb25TaXplAwMJAGcCBRJhYnNPbGRQb3NpdGlvblNpemUFBV9zaXplCQBmAgUFX3NpemUAAAcEDmlzUGFydGlhbENsb3NlCQBmAgUSYWJzT2xkUG9zaXRpb25TaXplBQVfc2l6ZQQNJHQwMzA4MzUzMTI4NgkBCnN3YXBPdXRwdXQDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAFBV9zaXplBRRfY2hlY2tNYXhQcmljZUltcGFjdAQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDMwODM1MzEyODYCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzMDgzNTMxMjg2Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzMDgzNTMxMjg2Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwMzA4MzUzMTI4NgJfNAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAACQEBLQEFBV9zaXplBQVfc2l6ZQQNJHQwMzE1MDEzMTcyNQkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAwUHX3RyYWRlcgUKX2RpcmVjdGlvbgUPUE5MX09QVElPTl9TUE9UBBNvbGRQb3NpdGlvbk5vdGlvbmFsCAUNJHQwMzE1MDEzMTcyNQJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDMxNTAxMzE3MjUCXzIEDXJlYWxpemVkUmF0aW8JAQRkaXZkAgkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQUSYWJzT2xkUG9zaXRpb25TaXplBAtyZWFsaXplZFBubAkBBG11bGQCBQ11bnJlYWxpemVkUG5sBQ1yZWFsaXplZFJhdGlvBA0kdDAzMjA2NjMyMzEyCQEwY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudEFuZFJvbGxvdmVyRmVlBQUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFFG9sZFBvc2l0aW9uVGltZXN0YW1wBQ11bnJlYWxpemVkUG5sBBJyZW1haW5NYXJnaW5CZWZvcmUIBQ0kdDAzMjA2NjMyMzEyAl8xBAJ4MQgFDSR0MDMyMDY2MzIzMTICXzIEAngyCAUNJHQwMzIwNjYzMjMxMgJfMwQLcm9sbG92ZXJGZWUIBQ0kdDAzMjA2NjMyMzEyAl80BA9wb3NpdGlvbkJhZERlYnQICQEwY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudEFuZFJvbGxvdmVyRmVlBQUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFFG9sZFBvc2l0aW9uVGltZXN0YW1wBQtyZWFsaXplZFBubAJfMgQQcmVhbGl6ZWRDbG9zZUZlZQkBBG11bGQCCQEEbXVsZAIFE29sZFBvc2l0aW9uTm90aW9uYWwFDXJlYWxpemVkUmF0aW8FBF9mZWUEEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIFDXVucmVhbGl6ZWRQbmwFC3JlYWxpemVkUG5sBBJyZW1haW5PcGVuTm90aW9uYWwDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQBlAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkAZAIFEnVucmVhbGl6ZWRQbmxBZnRlcgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQPbmV3UG9zaXRpb25TaXplCQBkAgUPb2xkUG9zaXRpb25TaXplBRVleGNoYW5nZWRQb3NpdGlvblNpemUEDSR0MDMzNzE4MzQxMDQDCQAAAgUPbmV3UG9zaXRpb25TaXplAAAJAJQKAgAAAAAJAJQKAgkBA2FicwEFEnJlbWFpbk9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9uZXdQb3NpdGlvblNpemUEF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMzM3MTgzNDEwNAJfMQQUbmV3UG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDAzMzcxODM0MTA0Al8yBBFvcGVuTm90aW9uYWxEZWx0YQkAZQIFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAQLbWFyZ2luUmF0aW8JARZnZXRNYXJnaW5SYXRpb0J5T3B0aW9uAwUHX3RyYWRlcgUKX2RpcmVjdGlvbgUPUE5MX09QVElPTl9TUE9UBB5uZXdQb3NpdGlvbk1hcmdpbldpdGhTYW1lUmF0aW8DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQEEbXVsZAIJAGQCBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUSdW5yZWFsaXplZFBubEFmdGVyBQttYXJnaW5SYXRpbwUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkBBG11bGQCCQBlAgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFEnVucmVhbGl6ZWRQbmxBZnRlcgULbWFyZ2luUmF0aW8FEnVucmVhbGl6ZWRQbmxBZnRlcgQRbWFyZ2luVG9UcmFkZXJSYXcJAGUCCQBlAgUScmVtYWluTWFyZ2luQmVmb3JlCQBkAgUebmV3UG9zaXRpb25NYXJnaW5XaXRoU2FtZVJhdGlvBRJ1bnJlYWxpemVkUG5sQWZ0ZXIFEHJlYWxpemVkQ2xvc2VGZWUEDm1hcmdpblRvVHJhZGVyAwkAZgIAAAURbWFyZ2luVG9UcmFkZXJSYXcDBQpfbGlxdWlkYXRlAAAJAAIBAjdJbnZhbGlkIGludGVybmFsQ2xvc2VQb3NpdGlvbiBwYXJhbXM6IHVuYWJsZSB0byBwYXkgZmVlBRFtYXJnaW5Ub1RyYWRlclJhdwQRbmV3UG9zaXRpb25NYXJnaW4DBQxfYWRkVG9NYXJnaW4JAGQCBR5uZXdQb3NpdGlvbk1hcmdpbldpdGhTYW1lUmF0aW8FDm1hcmdpblRvVHJhZGVyBR5uZXdQb3NpdGlvbk1hcmdpbldpdGhTYW1lUmF0aW8DAwkBAiE9AgUUX21pblF1b3RlQXNzZXRBbW91bnQAAAkAZgIFFF9taW5RdW90ZUFzc2V0QW1vdW50BRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BwkAAgEJAKwCAgkArAICCQCsAgICDUxpbWl0IGVycm9yOiAJAKQDAQUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAIDIDwgCQCkAwEFFF9taW5RdW90ZUFzc2V0QW1vdW50CQCjChEFD25ld1Bvc2l0aW9uU2l6ZQURbmV3UG9zaXRpb25NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxzdFVwZENQRgUPcG9zaXRpb25CYWREZWJ0BQtyZWFsaXplZFBubAMDBQxfYWRkVG9NYXJnaW4FDmlzUGFydGlhbENsb3NlBwAABQ5tYXJnaW5Ub1RyYWRlcgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCQBlAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAURb3Blbk5vdGlvbmFsRGVsdGEJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMFDmlzTG9uZ1Bvc2l0aW9uCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQEBIQEFDmlzTG9uZ1Bvc2l0aW9uCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEQb3BlbkludGVyZXN0TG9uZwADBQ5pc0xvbmdQb3NpdGlvbgURb3Blbk5vdGlvbmFsRGVsdGEAAAkAZQIJARFvcGVuSW50ZXJlc3RTaG9ydAADCQEBIQEFDmlzTG9uZ1Bvc2l0aW9uBRFvcGVuTm90aW9uYWxEZWx0YQAACQBkAgUQcmVhbGl6ZWRDbG9zZUZlZQULcm9sbG92ZXJGZWUFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAj1JbnZhbGlkIGludGVybmFsQ2xvc2VQb3NpdGlvbiBwYXJhbXM6IGludmFsaWQgcG9zaXRpb24gc2l6ZTogCQCkAwEFBV9zaXplAgYgbWF4OiAJAKQDAQUSYWJzT2xkUG9zaXRpb25TaXplARNnZXRUZXJtaW5hbEFtbVN0YXRlAAQNX3Bvc2l0aW9uU2l6ZQkBEXRvdGFsUG9zaXRpb25TaXplAAMJAAACBQ1fcG9zaXRpb25TaXplAAAJAJQKAgkBBnF0QXN0UgAJAQZic0FzdFIABAlkaXJlY3Rpb24JAGYCBQ1fcG9zaXRpb25TaXplAAAEDSR0MDM3MzUxMzc1MzAJAQpzd2FwT3V0cHV0AwUJZGlyZWN0aW9uCQEDYWJzAQUNX3Bvc2l0aW9uU2l6ZQcEFWN1cnJlbnROZXRNYXJrZXRWYWx1ZQgFDSR0MDM3MzUxMzc1MzACXzEEGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUIBQ0kdDAzNzM1MTM3NTMwAl8yBBh0ZXJtaW5hbEJhc2VBc3NldFJlc2VydmUIBQ0kdDAzNzM1MTM3NTMwAl8zCQCUCgIFGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUFGHRlcm1pbmFsQmFzZUFzc2V0UmVzZXJ2ZQETZ2V0UXVvdGVBc3NldFdlaWdodAQQYmFzZUFzc2V0UmVzZXJ2ZRF0b3RhbFBvc2l0aW9uU2l6ZRFxdW90ZUFzc2V0UmVzZXJ2ZQt0YXJnZXRQcmljZQQBYgkAtgIBBRBiYXNlQXNzZXRSZXNlcnZlBAJzegkAtgIBBRF0b3RhbFBvc2l0aW9uU2l6ZQQBcQkAtgIBBRFxdW90ZUFzc2V0UmVzZXJ2ZQQBcAkAtgIBBQt0YXJnZXRQcmljZQQBawkBBWJtdWxkAgUBcQUBYgQEbmV3QgkAtwICBQFiBQJzegQEbmV3UQkBBWJkaXZkAgUBawUEbmV3QgQBegkBBWJkaXZkAgUEbmV3UQUEbmV3QgQGcmVzdWx0CQEFYmRpdmQCBQFwBQF6CQCgAwEFBnJlc3VsdAEUZ2V0U3luY1Rlcm1pbmFsUHJpY2UDDl90ZXJtaW5hbFByaWNlB19xdEFzdFIHX2JzQXN0UgQNX3Bvc2l0aW9uU2l6ZQkBEXRvdGFsUG9zaXRpb25TaXplAAMJAAACBQ1fcG9zaXRpb25TaXplAAAECW5ld1F0QXN0VwkBBGRpdmQCCQEEbXVsZAIFDl90ZXJtaW5hbFByaWNlBQdfYnNBc3RSBQdfcXRBc3RSCQCVCgMFCW5ld1F0QXN0VwUMREVDSU1BTF9VTklUAAAECWRpcmVjdGlvbgkAZgIFDV9wb3NpdGlvblNpemUAAAQVY3VycmVudE5ldE1hcmtldFZhbHVlCAkBCnN3YXBPdXRwdXQDBQlkaXJlY3Rpb24JAQNhYnMBBQ1fcG9zaXRpb25TaXplBwJfMQQJbmV3UXRBc3RXCQETZ2V0UXVvdGVBc3NldFdlaWdodAQFB19ic0FzdFIFDV9wb3NpdGlvblNpemUFB19xdEFzdFIFDl90ZXJtaW5hbFByaWNlBAluZXdCc0FzdFcFDERFQ0lNQUxfVU5JVAQNbWFyZ2luVG9WYXVsdAgJAStnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubEJ5VmFsdWVzBwUNX3Bvc2l0aW9uU2l6ZQUVY3VycmVudE5ldE1hcmtldFZhbHVlBQdfcXRBc3RSBQluZXdRdEFzdFcFB19ic0FzdFIFCW5ld0JzQXN0VwUPUE5MX09QVElPTl9TUE9UAl8yCQCVCgMFCW5ld1F0QXN0VwUJbmV3QnNBc3RXBQ1tYXJnaW5Ub1ZhdWx0AQpnZXRGdW5kaW5nAAQPdW5kZXJseWluZ1ByaWNlCQEOZ2V0T3JhY2xlUHJpY2UABAlzcG90UHJpY2UJAQxnZXRTcG90UHJpY2UABAdwcmVtaXVtCQBlAgUJc3BvdFByaWNlBQ91bmRlcmx5aW5nUHJpY2UDAwkBDmlzTWFya2V0Q2xvc2VkAAYDCQAAAgkBC2Z1bmRpbmdNb2RlAAUSRlVORElOR19BU1lNTUVUUklDAwkAAAIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAAABgkAAAIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAAAHCQCVCgMAAAAAAAADCQBmAgAABQdwcmVtaXVtBBRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCCQEEbXVsZAIFB3ByZW1pdW0JARRmdW5kaW5nUGVyaW9kRGVjaW1hbAAFB09ORV9EQVkDCQAAAgkBC2Z1bmRpbmdNb2RlAAUSRlVORElOR19BU1lNTUVUUklDBBNsb25nUHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAJAJUKAwUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FE2xvbmdQcmVtaXVtRnJhY3Rpb24AAAQZc2hvcnRUb3RhbFByZW1pdW1GcmFjdGlvbgkBA2FicwEJAQRtdWxkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAQYbG9uZ1RvdGFsUHJlbWl1bUZyYWN0aW9uCQEDYWJzAQkBBG11bGQCBRRzaG9ydFByZW1pdW1GcmFjdGlvbgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAEDnByZW1pdW1Ub1ZhdWx0CQBlAgUZc2hvcnRUb3RhbFByZW1pdW1GcmFjdGlvbgUYbG9uZ1RvdGFsUHJlbWl1bUZyYWN0aW9uCQCVCgMFFHNob3J0UHJlbWl1bUZyYWN0aW9uBRRzaG9ydFByZW1pdW1GcmFjdGlvbgUOcHJlbWl1bVRvVmF1bHQEE2xvbmdQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBQdwcmVtaXVtCQEUZnVuZGluZ1BlcmlvZERlY2ltYWwABQdPTkVfREFZAwkAAAIJAQtmdW5kaW5nTW9kZQAFEkZVTkRJTkdfQVNZTU1FVFJJQwQUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBRNsb25nUHJlbWl1bUZyYWN0aW9uCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUACQCVCgMFFHNob3J0UHJlbWl1bUZyYWN0aW9uBRNsb25nUHJlbWl1bUZyYWN0aW9uAAAEGGxvbmdUb3RhbFByZW1pdW1GcmFjdGlvbgkBA2FicwEJAQRtdWxkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAEGXNob3J0VG90YWxQcmVtaXVtRnJhY3Rpb24JAQNhYnMBCQEEbXVsZAIFE2xvbmdQcmVtaXVtRnJhY3Rpb24JARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAQOcHJlbWl1bVRvVmF1bHQJAGUCBRhsb25nVG90YWxQcmVtaXVtRnJhY3Rpb24FGXNob3J0VG90YWxQcmVtaXVtRnJhY3Rpb24JAJUKAwUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUOcHJlbWl1bVRvVmF1bHQBDmdldEFkanVzdGVkRmVlAgtfYXJ0aWZhY3RJZBBfYmFzZUZlZURpc2NvdW50BApiYXNlRmVlUmF3CQEDZmVlAAQHYmFzZUZlZQkBBG11bGQCBQpiYXNlRmVlUmF3BRBfYmFzZUZlZURpc2NvdW50BA0kdDA0MjE5NDQyNjg5AwkBAiE9AgULX2FydGlmYWN0SWQCAAQMYXJ0aWZhY3RLaW5kCQEEc3RyQQIJARFuZnRNYW5hZ2VyQWRkcmVzcwAJAQ50b0NvbXBvc2l0ZUtleQIFDGtfdG9rZW5fdHlwZQULX2FydGlmYWN0SWQDCQAAAgUMYXJ0aWZhY3RLaW5kBRhGRUVfUkVEVUNUSU9OX1RPS0VOX1RZUEUECXJlZHVjdGlvbgkBBGludEECCQERbmZ0TWFuYWdlckFkZHJlc3MACQEOdG9Db21wb3NpdGVLZXkCBQ1rX3Rva2VuX3BhcmFtBQtfYXJ0aWZhY3RJZAQLYWRqdXN0ZWRGZWUJAQRtdWxkAgUHYmFzZUZlZQUJcmVkdWN0aW9uCQCUCgIFC2FkanVzdGVkRmVlBgkAAgECGUludmFsaWQgYXR0YWNoZWQgYXJ0aWZhY3QJAJQKAgUHYmFzZUZlZQcEC2FkanVzdGVkRmVlCAUNJHQwNDIxOTQ0MjY4OQJfMQQMYnVybkFydGlmYWN0CAUNJHQwNDIxOTQ0MjY4OQJfMgkAlAoCBQthZGp1c3RlZEZlZQUMYnVybkFydGlmYWN0ARhnZXRGb3JUcmFkZXJXaXRoQXJ0aWZhY3QCB190cmFkZXILX2FydGlmYWN0SWQEEGRvR2V0RmVlRGlzY291bnQJAPwHBAkBDG1pbmVyQWRkcmVzcwACEmNvbXB1dGVGZWVEaXNjb3VudAkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBRBkb0dldEZlZURpc2NvdW50BRBkb0dldEZlZURpc2NvdW50BAtmZWVEaXNjb3VudAQHJG1hdGNoMAUQZG9HZXRGZWVEaXNjb3VudAMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgJAAIBAiFJbnZhbGlkIGNvbXB1dGVGZWVEaXNjb3VudCByZXN1bHQEDSR0MDQzMDM1NDMxMDkJAQ5nZXRBZGp1c3RlZEZlZQIFC19hcnRpZmFjdElkBQtmZWVEaXNjb3VudAQLYWRqdXN0ZWRGZWUIBQ0kdDA0MzAzNTQzMTA5Al8xBAxidXJuQXJ0aWZhY3QIBQ0kdDA0MzAzNTQzMTA5Al8yCQCUCgIFC2FkanVzdGVkRmVlBQxidXJuQXJ0aWZhY3QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWdldEFydGlmYWN0SWQBAWkECmFydGlmYWN0SWQDCQBmAgkAkAMBCAUBaQhwYXltZW50cwABCQDYBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkAhJJbnZhbGlkIGFydGlmYWN0SWQCAAUKYXJ0aWZhY3RJZAENZGlzdHJpYnV0ZUZlZQEKX2ZlZUFtb3VudAQMZmVlVG9TdGFrZXJzCQEEbXVsZAIFCl9mZWVBbW91bnQJARNmZWVUb1N0YWtlcnNQZXJjZW50AAQKZmVlVG9WYXVsdAkAZQIFCl9mZWVBbW91bnQFDGZlZVRvU3Rha2VycwkAlAoCBQxmZWVUb1N0YWtlcnMFCmZlZVRvVmF1bHQBDnVwZGF0ZVNldHRpbmdzDxBfaW5pdE1hcmdpblJhdGlvBF9tbXIUX2xpcXVpZGF0aW9uRmVlUmF0aW8OX2Z1bmRpbmdQZXJpb2QEX2ZlZQxfc3ByZWFkTGltaXQPX21heFByaWNlSW1wYWN0GF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbw9fbWF4UHJpY2VTcHJlYWQQX21heE9wZW5Ob3Rpb25hbBRfZmVlVG9TdGFrZXJzUGVyY2VudA9fbWF4T3JhY2xlRGVsYXkMX3JvbGxvdmVyRmVlDF9mdW5kaW5nTW9kZQtfb3JhY2xlTW9kZQkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19pbml0TWFyZ2luUmF0aW8FEF9pbml0TWFyZ2luUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwUEX21tcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa19saXF1aWRhdGlvbkZlZVJhdGlvBRRfbGlxdWlkYXRpb25GZWVSYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa19mdW5kaW5nUGVyaW9kBQ5fZnVuZGluZ1BlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUFa19mZWUFBF9mZWUJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfc3ByZWFkTGltaXQFDF9zcHJlYWRMaW1pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa19tYXhQcmljZUltcGFjdAUPX21heFByaWNlSW1wYWN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBRhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbWF4UHJpY2VTcHJlYWQFD19tYXhQcmljZVNwcmVhZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19tYXhPcGVuTm90aW9uYWwFEF9tYXhPcGVuTm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtfZmVlVG9TdGFrZXJzUGVyY2VudAUUX2ZlZVRvU3Rha2Vyc1BlcmNlbnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbWF4T3JhY2xlRGVsYXkFD19tYXhPcmFjbGVEZWxheQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa19yb2xsb3ZlckZlZQUMX3JvbGxvdmVyRmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rX2Z1bmRpbmdNb2RlBQxfZnVuZGluZ01vZGUJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtfb3JhY2xlTW9kZQULX29yYWNsZU1vZGUFA25pbAENdXBkYXRlRnVuZGluZwURX25leHRGdW5kaW5nQmxvY2skX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uJV9sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24QX2xvbmdGdW5kaW5nUmF0ZRFfc2hvcnRGdW5kaW5nUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19uZXh0RnVuZGluZ0Jsb2NrBRFfbmV4dEZ1bmRpbmdCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgUla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUkX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBSZrX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUlX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19sb25nRnVuZGluZ1JhdGUFEF9sb25nRnVuZGluZ1JhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfc2hvcnRGdW5kaW5nUmF0ZQURX3Nob3J0RnVuZGluZ1JhdGUFA25pbAEfaW5jcmVtZW50UG9zaXRpb25TZXF1ZW5jZU51bWJlcgMOX2lzTmV3UG9zaXRpb24HX3RyYWRlcgpfZGlyZWN0aW9uBAtwb3NpdGlvbktleQkArAICCQCsAgIFB190cmFkZXICAV8JAKQDAQUKX2RpcmVjdGlvbgMFDl9pc05ld1Bvc2l0aW9uBA9jdXJyZW50U2VxdWVuY2UJAQxsYXN0U2VxdWVuY2UACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRJrX3Bvc2l0aW9uU2VxdWVuY2UFC3Bvc2l0aW9uS2V5CQBkAgUPY3VycmVudFNlcXVlbmNlAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFCmtfc2VxdWVuY2UJAGQCBQ9jdXJyZW50U2VxdWVuY2UAAQUDbmlsBQNuaWwBEXVwZGF0ZVBvc2l0aW9uRmVlBA5faXNOZXdQb3NpdGlvbgdfdHJhZGVyCl9kaXJlY3Rpb24EX2ZlZQQLcG9zaXRpb25LZXkJAKwCAgkArAICBQdfdHJhZGVyAgFfCQCkAwEFCl9kaXJlY3Rpb24DBQ5faXNOZXdQb3NpdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUNa19wb3NpdGlvbkZlZQULcG9zaXRpb25LZXkFBF9mZWUFA25pbAUDbmlsAQ51cGRhdGVQb3NpdGlvbgYHX3RyYWRlcgVfc2l6ZQdfbWFyZ2luDV9vcGVuTm90aW9uYWwgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24QX2xhdGVzdFRpbWVzdGFtcAQJZGlyZWN0aW9uCQEMZ2V0RGlyZWN0aW9uAQUFX3NpemUEC3Bvc2l0aW9uS2V5CQCsAgIJAKwCAgUHX3RyYWRlcgIBXwkApAMBBQlkaXJlY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQtwb3NpdGlvbktleQUFX3NpemUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25NYXJnaW4FC3Bvc2l0aW9uS2V5BQdfbWFyZ2luCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQtwb3NpdGlvbktleQUNX29wZW5Ob3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgULcG9zaXRpb25LZXkFIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBR5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRUaW1lc3RhbXAFC3Bvc2l0aW9uS2V5BRBfbGF0ZXN0VGltZXN0YW1wBQNuaWwBEXVwZGF0ZUFtbVJlc2VydmVzAgdfcXRBc3RSB19ic0FzdFIDAwkAZgIAAAUHX3F0QXN0UgYJAGYCAAAFB19ic0FzdFIJAAIBAiFJbnZhbGlkIGFtb3VudCB0byB1cGRhdGUgcmVzZXJ2ZXMJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tfcXVvdGVBc3NldFJlc2VydmUFB19xdEFzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfYmFzZUFzc2V0UmVzZXJ2ZQUHX2JzQXN0UgUDbmlsARB1cGRhdGVBbW1XZWlnaHRzAgdfcXRBc3RXB19ic0FzdFcJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfcXVvdGVBc3NldFdlaWdodAUHX3F0QXN0VwkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19iYXNlQXNzZXRXZWlnaHQFB19ic0FzdFcFA25pbAEJdXBkYXRlQW1tCAdfcXRBc3RSB19ic0FzdFIXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIVX29wZW5JbnRlcmVzdE5vdGlvbmFsFl90b3RhbExvbmdQb3NpdGlvblNpemUXX3RvdGFsU2hvcnRQb3NpdGlvblNpemUWX3RvdGFsTG9uZ09wZW5Ob3Rpb25hbBdfdG90YWxTaG9ydE9wZW5Ob3Rpb25hbAQHX3F0QXN0VwkBBnF0QXN0VwAEB19ic0FzdFcJAQZic0FzdFcAAwkBAiE9AgkAZQIFFl90b3RhbExvbmdQb3NpdGlvblNpemUFF190b3RhbFNob3J0UG9zaXRpb25TaXplBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhhJbnZhbGlkIEFNTSBzdGF0ZSBkYXRhOiAJAKQDAQUWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQIEICsgIAkApAMBBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQIEICE9IAkApAMBBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAzggCCQERdXBkYXRlQW1tUmVzZXJ2ZXMCBQdfcXRBc3RSBQdfYnNBc3RSCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrX3RvdGFsUG9zaXRpb25TaXplBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUWa19vcGVuSW50ZXJlc3ROb3Rpb25hbAUVX29wZW5JbnRlcmVzdE5vdGlvbmFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRdrX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQUWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUYa190b3RhbFNob3J0UG9zaXRpb25TaXplBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19vcGVuSW50ZXJlc3RMb25nBRZfdG90YWxMb25nT3Blbk5vdGlvbmFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrX29wZW5JbnRlcmVzdFNob3J0BRdfdG90YWxTaG9ydE9wZW5Ob3Rpb25hbAUDbmlsAQ5kZWxldGVQb3NpdGlvbgIHX3RyYWRlcgpfZGlyZWN0aW9uBAtwb3NpdGlvbktleQkArAICCQCsAgIFB190cmFkZXICAV8JAKQDAQUKX2RpcmVjdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQULcG9zaXRpb25LZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgULcG9zaXRpb25LZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAULcG9zaXRpb25LZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgULcG9zaXRpb25LZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUNa19wb3NpdGlvbkZlZQULcG9zaXRpb25LZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUea19wb3NpdGlvbkxhc3RVcGRhdGVkVGltZXN0YW1wBQtwb3NpdGlvbktleQUDbmlsAQh3aXRoZHJhdwIIX2FkZHJlc3MHX2Ftb3VudAQHYmFsYW5jZQkA8AcCBQR0aGlzCQEKcXVvdGVBc3NldAADCQBmAgUHX2Ftb3VudAUHYmFsYW5jZQkAAgEJAKwCAgkArAICCQCsAgICE1VuYWJsZSB0byB3aXRoZHJhdyAJAKQDAQUHX2Ftb3VudAIXIGZyb20gY29udHJhY3QgYmFsYW5jZSAJAKQDAQUHYmFsYW5jZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhfYWRkcmVzcwUHX2Ftb3VudAkBCnF1b3RlQXNzZXQABQNuaWwBDXVwZGF0ZUJhbGFuY2UBAWkDCQBmAgAABQFpCQACAQIHQmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa19iYWxhbmNlBQFpBQNuaWwBC3RyYW5zZmVyRmVlAQFpCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQ5zdGFraW5nQWRkcmVzcwAFAWkJAQpxdW90ZUFzc2V0AAUDbmlsAQ5kb0J1cm5BcnRpZmFjdAINX2J1cm5BcnRpZmFjdAFpAwUNX2J1cm5BcnRpZmFjdAkAzAgCCQEEQnVybgIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkAhBJbnZhbGlkIGFydGlmYWN0AAEFA25pbAUDbmlsFwFpAQVwYXVzZQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIUSW52YWxpZCBwYXVzZSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCGtfcGF1c2VkBgUDbmlsAWkBB3VucGF1c2UAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECFkludmFsaWQgdW5wYXVzZSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCGtfcGF1c2VkBwUDbmlsAWkBDHNldENsb3NlT25seQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIbSW52YWxpZCBzZXRDbG9zZU9ubHkgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQtrX2Nsb3NlT25seQYFA25pbAFpAQ51bnNldENsb3NlT25seQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIdSW52YWxpZCB1bnNldENsb3NlT25seSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFC2tfY2xvc2VPbmx5BwUDbmlsAWkBD2NoYW5nZUxpcXVpZGl0eQERX3F1b3RlQXNzZXRBbW91bnQDAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAYJAAACBRFfcXVvdGVBc3NldEFtb3VudAAACQACAQIeSW52YWxpZCBjaGFuZ2VMaXF1aWRpdHkgcGFyYW1zBAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEB19xdEFzdFcJAQZxdEFzdFcABAdfYnNBc3RXCQEGYnNBc3RXAAQFcHJpY2UJAQRkaXZkAgkBBG11bGQCBQdfcXRBc3RSBQdfcXRBc3RXCQEEbXVsZAIFB19ic0FzdFIFB19ic0FzdFcEC3F0QXN0UkFmdGVyCQBkAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEFGJhc2VBc3NldEFtb3VudFRvQWRkCQBlAgkBBGRpdmQCCQEEbXVsZAIFC3F0QXN0UkFmdGVyBQdfcXRBc3RXBQVwcmljZQUHX2JzQXN0UgQLYnNBc3RSQWZ0ZXIJAGQCBQdfYnNBc3RSBRRiYXNlQXNzZXRBbW91bnRUb0FkZAQNJHQwNTE1NDM1MTY5NAkBFGdldFN5bmNUZXJtaW5hbFByaWNlAwkBDmdldE9yYWNsZVByaWNlAAULcXRBc3RSQWZ0ZXIFC2JzQXN0UkFmdGVyBBNuZXdRdW90ZUFzc2V0V2VpZ2h0CAUNJHQwNTE1NDM1MTY5NAJfMQQSbmV3QmFzZUFzc2V0V2VpZ2h0CAUNJHQwNTE1NDM1MTY5NAJfMgQNbWFyZ2luVG9WYXVsdAgFDSR0MDUxNTQzNTE2OTQCXzMEDWRvRXhjaGFuZ2VQbkwDCQECIT0CBQ1tYXJnaW5Ub1ZhdWx0AAAEDWRvRXhjaGFuZ2VQbkwJAPwHBAkBDHZhdWx0QWRkcmVzcwACFWV4Y2hhbmdlRnJlZUFuZExvY2tlZAkAzAgCBQ1tYXJnaW5Ub1ZhdWx0BQNuaWwFA25pbAMJAAACBQ1kb0V4Y2hhbmdlUG5MBQ1kb0V4Y2hhbmdlUG5MBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQ1kb0V4Y2hhbmdlUG5MBQ1kb0V4Y2hhbmdlUG5MCQDOCAIJARF1cGRhdGVBbW1SZXNlcnZlcwIFC3F0QXN0UkFmdGVyBQtic0FzdFJBZnRlcgkBEHVwZGF0ZUFtbVdlaWdodHMCBRNuZXdRdW90ZUFzc2V0V2VpZ2h0BRJuZXdCYXNlQXNzZXRXZWlnaHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY2hhbmdlU2V0dGluZ3MPEF9pbml0TWFyZ2luUmF0aW8EX21tchRfbGlxdWlkYXRpb25GZWVSYXRpbw5fZnVuZGluZ1BlcmlvZARfZmVlDF9zcHJlYWRMaW1pdA9fbWF4UHJpY2VJbXBhY3QYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvD19tYXhQcmljZVNwcmVhZBBfbWF4T3Blbk5vdGlvbmFsFF9mZWVUb1N0YWtlcnNQZXJjZW50D19tYXhPcmFjbGVEZWxheQxfcm9sbG92ZXJGZWUMX2Z1bmRpbmdNb2RlC19vcmFjbGVNb2RlAwMDAwMDAwMDAwMDAwMDAwMDCQBnAgAABQ5fZnVuZGluZ1BlcmlvZAYJAGcCAAAFEF9pbml0TWFyZ2luUmF0aW8GCQBnAgAABQRfbW1yBgkAZwIAAAUUX2xpcXVpZGF0aW9uRmVlUmF0aW8GCQBnAgAABQRfZmVlBgkAZwIAAAUMX3NwcmVhZExpbWl0BgkAZwIAAAUPX21heFByaWNlSW1wYWN0BgkAZwIAAAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBgkAZwIAAAUPX21heFByaWNlU3ByZWFkBgkAZwIAAAUQX21heE9wZW5Ob3Rpb25hbAYJAGcCAAAFFF9mZWVUb1N0YWtlcnNQZXJjZW50BgkAZgIFFF9mZWVUb1N0YWtlcnNQZXJjZW50BQxERUNJTUFMX1VOSVQGCQBnAgAABQ9fbWF4T3JhY2xlRGVsYXkGCQBnAgAABQxfcm9sbG92ZXJGZWUGAwkBAiE9AgUMX2Z1bmRpbmdNb2RlBRFGVU5ESU5HX1NZTU1FVFJJQwkBAiE9AgUMX2Z1bmRpbmdNb2RlBRJGVU5ESU5HX0FTWU1NRVRSSUMHBgMJAQIhPQIFC19vcmFjbGVNb2RlBQxPUkFDTEVfUExBSU4JAQIhPQIFC19vcmFjbGVNb2RlBQpPUkFDTEVfSklUBwYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAh1JbnZhbGlkIGNoYW5nZVNldHRpbmdzIHBhcmFtcwkBDnVwZGF0ZVNldHRpbmdzDwUQX2luaXRNYXJnaW5SYXRpbwUEX21tcgUUX2xpcXVpZGF0aW9uRmVlUmF0aW8FDl9mdW5kaW5nUGVyaW9kBQRfZmVlBQxfc3ByZWFkTGltaXQFD19tYXhQcmljZUltcGFjdAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBQ9fbWF4UHJpY2VTcHJlYWQFEF9tYXhPcGVuTm90aW9uYWwFFF9mZWVUb1N0YWtlcnNQZXJjZW50BQ9fbWF4T3JhY2xlRGVsYXkFDF9yb2xsb3ZlckZlZQUMX2Z1bmRpbmdNb2RlBQtfb3JhY2xlTW9kZQFpAQppbml0aWFsaXplFAdfcXRBc3RSB19ic0FzdFIOX2Z1bmRpbmdQZXJpb2QQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvBF9mZWUPX2Jhc2VPcmFjbGVEYXRhEF9xdW90ZU9yYWNsZURhdGEMX2Nvb3JkaW5hdG9yDF9zcHJlYWRMaW1pdA9fbWF4UHJpY2VJbXBhY3QYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvD19tYXhQcmljZVNwcmVhZBBfbWF4T3Blbk5vdGlvbmFsFF9mZWVUb1N0YWtlcnNQZXJjZW50D19tYXhPcmFjbGVEZWxheQxfcm9sbG92ZXJGZWUMX2Z1bmRpbmdNb2RlC19vcmFjbGVNb2RlAwMDAwMDAwMDAwMDAwMDAwMDAwMJAGcCAAAFB19xdEFzdFIGCQBnAgAABQdfYnNBc3RSBgkAZwIAAAUOX2Z1bmRpbmdQZXJpb2QGCQBnAgAABRBfaW5pdE1hcmdpblJhdGlvBgkAZwIAAAUEX21tcgYJAGcCAAAFFF9saXF1aWRhdGlvbkZlZVJhdGlvBgkAZwIAAAUEX2ZlZQYJAGcCAAAFDF9zcHJlYWRMaW1pdAYJAGcCAAAFD19tYXhQcmljZUltcGFjdAYJAGcCAAAFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwYJAGcCAAAFD19tYXhQcmljZVNwcmVhZAYJAGcCAAAFEF9tYXhPcGVuTm90aW9uYWwGCQBnAgAABRRfZmVlVG9TdGFrZXJzUGVyY2VudAYJAGYCBRRfZmVlVG9TdGFrZXJzUGVyY2VudAUMREVDSU1BTF9VTklUBgkAZgIAAAUPX21heE9yYWNsZURlbGF5BgkAZwIAAAUMX3JvbGxvdmVyRmVlBgMJAQIhPQIFDF9mdW5kaW5nTW9kZQURRlVORElOR19TWU1NRVRSSUMJAQIhPQIFDF9mdW5kaW5nTW9kZQUSRlVORElOR19BU1lNTUVUUklDBwYDCQECIT0CBQtfb3JhY2xlTW9kZQUMT1JBQ0xFX1BMQUlOCQECIT0CBQtfb3JhY2xlTW9kZQUKT1JBQ0xFX0pJVAcGCQELaW5pdGlhbGl6ZWQABgkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIdSW52YWxpZCBpbml0aWFsaXplIHBhcmFtZXRlcnMJAM4IAgkAzggCCQDOCAIJAM4IAgkBCXVwZGF0ZUFtbQgFB19xdEFzdFIFB19ic0FzdFIAAAAAAAAAAAAAAAAJAQ51cGRhdGVTZXR0aW5ncw8FEF9pbml0TWFyZ2luUmF0aW8FBF9tbXIFFF9saXF1aWRhdGlvbkZlZVJhdGlvBQ5fZnVuZGluZ1BlcmlvZAUEX2ZlZQUMX3NwcmVhZExpbWl0BQ9fbWF4UHJpY2VJbXBhY3QFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwUPX21heFByaWNlU3ByZWFkBRBfbWF4T3Blbk5vdGlvbmFsBRRfZmVlVG9TdGFrZXJzUGVyY2VudAUPX21heE9yYWNsZURlbGF5BQxfcm9sbG92ZXJGZWUFDF9mdW5kaW5nTW9kZQULX29yYWNsZU1vZGUJAQ11cGRhdGVGdW5kaW5nBQkAZAIJAQ1sYXN0VGltZXN0YW1wAAUOX2Z1bmRpbmdQZXJpb2QAAAAAAAAAAAkBDXVwZGF0ZUJhbGFuY2UBAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtfaW5pdGlhbGl6ZWQGCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtfYmFzZU9yYWNsZQUPX2Jhc2VPcmFjbGVEYXRhCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtfcXVvdGVPcmFjbGUFEF9xdW90ZU9yYWNsZURhdGEJAMwIAgkBC1N0cmluZ0VudHJ5AgUUa19jb29yZGluYXRvckFkZHJlc3MJAKUIAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUMX2Nvb3JkaW5hdG9yBQNuaWwBaQEQaW5jcmVhc2VQb3NpdGlvbgUKX2RpcmVjdGlvbglfbGV2ZXJhZ2UTX21pbkJhc2VBc3NldEFtb3VudAhfcmVmTGluawxfcHJpY2VVcGRhdGUEDHVwZGF0ZU9yYWNsZQkA/AcEBQR0aGlzAgx1cGRhdGVPcmFjbGUJAMwIAgUMX3ByaWNlVXBkYXRlBQNuaWwFA25pbAMJAAACBQx1cGRhdGVPcmFjbGUFDHVwZGF0ZU9yYWNsZQQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBBBlbnN1cmVDYWxsZWRPbmNlCQD8BwQFBHRoaXMCEGVuc3VyZUNhbGxlZE9uY2UFA25pbAUDbmlsAwkAAAIFEGVuc3VyZUNhbGxlZE9uY2UFEGVuc3VyZUNhbGxlZE9uY2UEB190cmFkZXIJAQ9nZXRBY3R1YWxDYWxsZXIBBQFpBApfcmF3QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQIX2Fzc2V0SWQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLX2Fzc2V0SWRTdHIJANgEAQkBBXZhbHVlAQUIX2Fzc2V0SWQEDGlzUXVvdGVBc3NldAkAAAIFCF9hc3NldElkCQEKcXVvdGVBc3NldAADAwMDAwMDAwMJAQIhPQIFCl9kaXJlY3Rpb24FCERJUl9MT05HCQECIT0CBQpfZGlyZWN0aW9uBQlESVJfU0hPUlQHBgkAZwIAAAUKX3Jhd0Ftb3VudAYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQUMaXNRdW90ZUFzc2V0BgkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMJAQRkaXZkAgUMREVDSU1BTF9VTklUBQlfbGV2ZXJhZ2UJAQ9pbml0TWFyZ2luUmF0aW8ABgYJAQZwYXVzZWQABgkBCWNsb3NlT25seQAGCQEOaXNNYXJrZXRDbG9zZWQACQACAQIjSW52YWxpZCBpbmNyZWFzZVBvc2l0aW9uIHBhcmFtZXRlcnMEDSR0MDU4MDcwNTgyMTkJARhnZXRGb3JUcmFkZXJXaXRoQXJ0aWZhY3QCBQdfdHJhZGVyCQENZ2V0QXJ0aWZhY3RJZAEFAWkEC2FkanVzdGVkRmVlCAUNJHQwNTgwNzA1ODIxOQJfMQQMYnVybkFydGlmYWN0CAUNJHQwNTgwNzA1ODIxOQJfMgQHX2Ftb3VudAkBBGRpdmQCBQpfcmF3QW1vdW50CQBkAgkBBG11bGQCBQthZGp1c3RlZEZlZQUJX2xldmVyYWdlBQxERUNJTUFMX1VOSVQEE2Rpc3RyaWJ1dGVGZWVBbW91bnQJAGUCBQpfcmF3QW1vdW50BQdfYW1vdW50BA5yZWZlcnJlckZlZUFueQkA/AcECQEPcmVmZXJyYWxBZGRyZXNzAAIVYWNjZXB0UGF5bWVudFdpdGhMaW5rCQDMCAIFB190cmFkZXIJAMwIAgUIX3JlZkxpbmsFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABRNkaXN0cmlidXRlRmVlQW1vdW50BQNuaWwDCQAAAgUOcmVmZXJyZXJGZWVBbnkFDnJlZmVycmVyRmVlQW55BAtyZWZlcnJlckZlZQQHJG1hdGNoMAUOcmVmZXJyZXJGZWVBbnkDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQITSW52YWxpZCByZWZlcnJlckZlZQQJZmVlQW1vdW50CQBlAgUTZGlzdHJpYnV0ZUZlZUFtb3VudAULcmVmZXJyZXJGZWUEDSR0MDU4NzE1NTg4OTUJAQtnZXRQb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24ED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDU4NzE1NTg4OTUCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNTg3MTU1ODg5NQJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA1ODcxNTU4ODk1Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDU4NzE1NTg4OTUCXzQEFG9sZFBvc2l0aW9uVGltZXN0YW1wCAUNJHQwNTg3MTU1ODg5NQJfNQQNaXNOZXdQb3NpdGlvbgkAAAIFD29sZFBvc2l0aW9uU2l6ZQAABA9pc1NhbWVEaXJlY3Rpb24DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwkAAAIFCl9kaXJlY3Rpb24FCURJUl9TSE9SVAQOZXhwYW5kRXhpc3RpbmcDCQEBIQEFDWlzTmV3UG9zaXRpb24FD2lzU2FtZURpcmVjdGlvbgcEBWlzQWRkCQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcEDSR0MDU5MTg0NjIzMTcDAwUNaXNOZXdQb3NpdGlvbgYFDmV4cGFuZEV4aXN0aW5nBAxvcGVuTm90aW9uYWwJAQRtdWxkAgUHX2Ftb3VudAUJX2xldmVyYWdlBA0kdDA1OTY5MzU5ODY2CQEJc3dhcElucHV0AgUFaXNBZGQFDG9wZW5Ob3Rpb25hbAQVYW1vdW50QmFzZUFzc2V0Qm91Z2h0CAUNJHQwNTk2OTM1OTg2NgJfMQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDU5NjkzNTk4NjYCXzIEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDU5NjkzNTk4NjYCXzMEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA1OTY5MzU5ODY2Al80AwMJAQIhPQIFE19taW5CYXNlQXNzZXRBbW91bnQAAAkAZgIFE19taW5CYXNlQXNzZXRBbW91bnQJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQHCQACAQkArAICCQCsAgIJAKwCAgINTGltaXQgZXJyb3I6IAkApAMBCQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AgMgPCAJAKQDAQUTX21pbkJhc2VBc3NldEFtb3VudAQPbmV3UG9zaXRpb25TaXplCQBkAgUPb2xkUG9zaXRpb25TaXplBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCQBkAgkBEG9wZW5JbnRlcmVzdExvbmcAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAABQxvcGVuTm90aW9uYWwAAAQbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQBkAgkBEW9wZW5JbnRlcmVzdFNob3J0AAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQUMb3Blbk5vdGlvbmFsAAAEDSR0MDYwNDEyNjA2ODcJATBjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50QW5kUm9sbG92ZXJGZWUFBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgUUb2xkUG9zaXRpb25UaW1lc3RhbXAFB19hbW91bnQEDHJlbWFpbk1hcmdpbggFDSR0MDYwNDEyNjA2ODcCXzEEAngxCAUNJHQwNjA0MTI2MDY4NwJfMgQCeDIIBQ0kdDA2MDQxMjYwNjg3Al8zBAtyb2xsb3ZlckZlZQgFDSR0MDYwNDEyNjA2ODcCXzQDCQEBIQEJARlyZXF1aXJlTm90T3ZlclNwcmVhZExpbWl0AgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCQACAQIVT3ZlciBtYXggc3ByZWFkIGxpbWl0AwkBASEBCQEdcmVxdWlyZU5vdE92ZXJNYXhPcGVuTm90aW9uYWwCBRp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcgUbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQACAQIWT3ZlciBtYXggb3BlbiBub3Rpb25hbAkAoAoOBQ9uZXdQb3NpdGlvblNpemUFDHJlbWFpbk1hcmdpbgkAZAIFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplCQENbGFzdFRpbWVzdGFtcAAFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgkAZAIJARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAFDG9wZW5Ob3Rpb25hbAkAZAIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AAAJAGQCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQAAAUadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIFG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcgULcm9sbG92ZXJGZWUEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDYyMDA1NjIxMzMJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAMJAKUIAQgFAWkGY2FsbGVyBQpfZGlyZWN0aW9uBQ9QTkxfT1BUSU9OX1NQT1QEE29sZFBvc2l0aW9uTm90aW9uYWwIBQ0kdDA2MjAwNTYyMTMzAl8xBA11bnJlYWxpemVkUG5sCAUNJHQwNjIwMDU2MjEzMwJfMgMJAGYCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAAIBAi5Vc2UgZGVjcmVhc2VQb3NpdGlvbiB0byBkZWNyZWFzZSBwb3NpdGlvbiBzaXplCQACAQIUQ2xvc2UgcG9zaXRpb24gZmlyc3QED25ld1Bvc2l0aW9uU2l6ZQgFDSR0MDU5MTg0NjIzMTcCXzEEF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luCAUNJHQwNTkxODQ2MjMxNwJfMgQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA1OTE4NDYyMzE3Al8zBBRuZXdQb3NpdGlvbkxhdGVzdENQRggFDSR0MDU5MTg0NjIzMTcCXzQEFG5ld1Bvc2l0aW9uVGltZXN0YW1wCAUNJHQwNTkxODQ2MjMxNwJfNQQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNTkxODQ2MjMxNwJfNgQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDU5MTg0NjIzMTcCXzcEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA1OTE4NDYyMzE3Al84BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCAUNJHQwNTkxODQ2MjMxNwJfOQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDA1OTE4NDYyMzE3A18xMAQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNTkxODQ2MjMxNwNfMTEEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNTkxODQ2MjMxNwNfMTIEG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDU5MTg0NjIzMTcDXzEzBAtyb2xsb3ZlckZlZQgFDSR0MDU5MTg0NjIzMTcDXzE0BA0kdDA2MjMyMzYyMzk0CQENZGlzdHJpYnV0ZUZlZQEJAGQCBQlmZWVBbW91bnQFC3JvbGxvdmVyRmVlBAxmZWVUb1N0YWtlcnMIBQ0kdDA2MjMyMzYyMzk0Al8xBApmZWVUb1ZhdWx0CAUNJHQwNjIzMjM2MjM5NAJfMgQFc3Rha2UDCQBnAgUHX2Ftb3VudAULcm9sbG92ZXJGZWUJAPwHBAkBDHZhdWx0QWRkcmVzcwACCWFkZExvY2tlZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAJAGUCBQdfYW1vdW50BQtyb2xsb3ZlckZlZQUDbmlsCQD8BwQJAQx2YXVsdEFkZHJlc3MAAg53aXRoZHJhd0xvY2tlZAkAzAgCCQBlAgULcm9sbG92ZXJGZWUFB19hbW91bnQFA25pbAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQQMZGVwb3NpdFZhdWx0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAgdhZGRGcmVlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUKZmVlVG9WYXVsdAUDbmlsAwkAAAIFDGRlcG9zaXRWYXVsdAUMZGVwb3NpdFZhdWx0BAlub3RpZnlGZWUJAPwHBAkBDG1pbmVyQWRkcmVzcwACCm5vdGlmeUZlZXMJAMwIAgUHX3RyYWRlcgkAzAgCBQlmZWVBbW91bnQFA25pbAUDbmlsAwkAAAIFCW5vdGlmeUZlZQUJbm90aWZ5RmVlBA5ub3RpZnlOb3Rpb25hbAkA/AcECQEMbWluZXJBZGRyZXNzAAIObm90aWZ5Tm90aW9uYWwJAMwIAgUHX3RyYWRlcgkAzAgCBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUDbmlsBQNuaWwDCQAAAgUObm90aWZ5Tm90aW9uYWwFDm5vdGlmeU5vdGlvbmFsCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQEOdXBkYXRlUG9zaXRpb24GBQdfdHJhZGVyBQ9uZXdQb3NpdGlvblNpemUFF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUUbmV3UG9zaXRpb25MYXRlc3RDUEYFFG5ld1Bvc2l0aW9uVGltZXN0YW1wCQEfaW5jcmVtZW50UG9zaXRpb25TZXF1ZW5jZU51bWJlcgMFDWlzTmV3UG9zaXRpb24FB190cmFkZXIFCl9kaXJlY3Rpb24JARF1cGRhdGVQb3NpdGlvbkZlZQQFDWlzTmV3UG9zaXRpb24FB190cmFkZXIFCl9kaXJlY3Rpb24FC2FkanVzdGVkRmVlCQEJdXBkYXRlQW1tCAUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyBRp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcgUbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAQ11cGRhdGVCYWxhbmNlAQkAZQIJAGQCCQEIY2JhbGFuY2UABQdfYW1vdW50BQtyb2xsb3ZlckZlZQkBDmRvQnVybkFydGlmYWN0AgUMYnVybkFydGlmYWN0BQFpCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWFkZE1hcmdpbgIKX2RpcmVjdGlvbgxfcHJpY2VVcGRhdGUEDHVwZGF0ZU9yYWNsZQkA/AcEBQR0aGlzAgx1cGRhdGVPcmFjbGUJAMwIAgUMX3ByaWNlVXBkYXRlBQNuaWwFA25pbAMJAAACBQx1cGRhdGVPcmFjbGUFDHVwZGF0ZU9yYWNsZQQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBBBlbnN1cmVDYWxsZWRPbmNlCQD8BwQFBHRoaXMCEGVuc3VyZUNhbGxlZE9uY2UFA25pbAUDbmlsAwkAAAIFEGVuc3VyZUNhbGxlZE9uY2UFEGVuc3VyZUNhbGxlZE9uY2UEB190cmFkZXIJAKUIAQgFAWkGY2FsbGVyBAdfYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQIX2Fzc2V0SWQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLX2Fzc2V0SWRTdHIJANgEAQkBBXZhbHVlAQUIX2Fzc2V0SWQEDGlzUXVvdGVBc3NldAkAAAIFCF9hc3NldElkCQEKcXVvdGVBc3NldAADAwMDAwkBASEBBQxpc1F1b3RlQXNzZXQGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAgkApQgBCAUBaQZjYWxsZXIFCl9kaXJlY3Rpb24GCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAYJAQ5pc01hcmtldENsb3NlZAAJAAIBAhxJbnZhbGlkIGFkZE1hcmdpbiBwYXJhbWV0ZXJzBA0kdDA2NDczNjY0OTE2CQELZ2V0UG9zaXRpb24CBQdfdHJhZGVyBQpfZGlyZWN0aW9uBA9vbGRQb3NpdGlvblNpemUIBQ0kdDA2NDczNjY0OTE2Al8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDY0NzM2NjQ5MTYCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNjQ3MzY2NDkxNgJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA2NDczNjY0OTE2Al80BBRvbGRQb3NpdGlvblRpbWVzdGFtcAgFDSR0MDY0NzM2NjQ5MTYCXzUEBXN0YWtlCQD8BwQJAQx2YXVsdEFkZHJlc3MAAglhZGRMb2NrZWQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQdfYW1vdW50BQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlBAtyb2xsb3ZlckZlZQkBD2NhbGNSb2xsb3ZlckZlZQIFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvblRpbWVzdGFtcAQWZG9UcmFuc2ZlckZlZVRvU3Rha2VycwMJAGYCBQtyb2xsb3ZlckZlZQAABA0kdDA2NTIwMTY1MjYwCQENZGlzdHJpYnV0ZUZlZQEFC3JvbGxvdmVyRmVlBAxmZWVUb1N0YWtlcnMIBQ0kdDA2NTIwMTY1MjYwAl8xBApmZWVUb1ZhdWx0CAUNJHQwNjUyMDE2NTI2MAJfMgQHdW5zdGFrZQkA/AcECQEMdmF1bHRBZGRyZXNzAAIOd2l0aGRyYXdMb2NrZWQJAMwIAgUMZmVlVG9TdGFrZXJzBQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBAtsb2NrQmFkRGVidAkA/AcECQEMdmF1bHRBZGRyZXNzAAIVZXhjaGFuZ2VGcmVlQW5kTG9ja2VkCQDMCAIJAQEtAQUKZmVlVG9WYXVsdAUDbmlsBQNuaWwDCQAAAgULbG9ja0JhZERlYnQFC2xvY2tCYWREZWJ0CQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBRZkb1RyYW5zZmVyRmVlVG9TdGFrZXJzBRZkb1RyYW5zZmVyRmVlVG9TdGFrZXJzCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBgUHX3RyYWRlcgUPb2xkUG9zaXRpb25TaXplCQBkAgkAZQIFEW9sZFBvc2l0aW9uTWFyZ2luBQtyb2xsb3ZlckZlZQUHX2Ftb3VudAUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwFFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCQENbGFzdFRpbWVzdGFtcAAJAQ11cGRhdGVCYWxhbmNlAQkAZQIJAGQCCQEIY2JhbGFuY2UABQdfYW1vdW50BQtyb2xsb3ZlckZlZQUWZG9UcmFuc2ZlckZlZVRvU3Rha2VycwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxyZW1vdmVNYXJnaW4DB19hbW91bnQKX2RpcmVjdGlvbgxfcHJpY2VVcGRhdGUEDHVwZGF0ZU9yYWNsZQkA/AcEBQR0aGlzAgx1cGRhdGVPcmFjbGUJAMwIAgUMX3ByaWNlVXBkYXRlBQNuaWwFA25pbAMJAAACBQx1cGRhdGVPcmFjbGUFDHVwZGF0ZU9yYWNsZQQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBBBlbnN1cmVDYWxsZWRPbmNlCQD8BwQFBHRoaXMCEGVuc3VyZUNhbGxlZE9uY2UFA25pbAUDbmlsAwkAAAIFEGVuc3VyZUNhbGxlZE9uY2UFEGVuc3VyZUNhbGxlZE9uY2UEB190cmFkZXIJAKUIAQgFAWkGY2FsbGVyAwMDAwMJAGcCAAAFB19hbW91bnQGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQABgkBDmlzTWFya2V0Q2xvc2VkAAkAAgECH0ludmFsaWQgcmVtb3ZlTWFyZ2luIHBhcmFtZXRlcnMEDSR0MDY2NzYxNjY5NDEJAQtnZXRQb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24ED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDY2NzYxNjY5NDECXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNjY3NjE2Njk0MQJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA2Njc2MTY2OTQxAl8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDY2NzYxNjY5NDECXzQEFG9sZFBvc2l0aW9uVGltZXN0YW1wCAUNJHQwNjY3NjE2Njk0MQJfNQQNJHQwNjY5NDc2NzE5NgkBMGNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnRBbmRSb2xsb3ZlckZlZQUFD29sZFBvc2l0aW9uU2l6ZQURb2xkUG9zaXRpb25NYXJnaW4FFG9sZFBvc2l0aW9uTHN0VXBkQ1BGBRRvbGRQb3NpdGlvblRpbWVzdGFtcAkBAS0BBQdfYW1vdW50BAxyZW1haW5NYXJnaW4IBQ0kdDA2Njk0NzY3MTk2Al8xBAdiYWREZWJ0CAUNJHQwNjY5NDc2NzE5NgJfMgQOZnVuZGluZ1BheW1lbnQIBQ0kdDA2Njk0NzY3MTk2Al8zBAtyb2xsb3ZlckZlZQgFDSR0MDY2OTQ3NjcxOTYCXzQDCQECIT0CBQdiYWREZWJ0AAAJAAIBAh1JbnZhbGlkIHJlbW92ZWQgbWFyZ2luIGFtb3VudAQLbWFyZ2luUmF0aW8JAQ9jYWxjTWFyZ2luUmF0aW8DBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsAwkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMFC21hcmdpblJhdGlvCQEPaW5pdE1hcmdpblJhdGlvAAYJAAIBCQCsAgIJAKwCAgkArAICAhlUb28gbXVjaCBtYXJnaW4gcmVtb3ZlZDogCQCkAwEFC21hcmdpblJhdGlvAgMgPCAJAKQDAQkBD2luaXRNYXJnaW5SYXRpbwAEDSR0MDY3NTgyNjc2NDEJAQ1kaXN0cmlidXRlRmVlAQULcm9sbG92ZXJGZWUEDGZlZVRvU3Rha2VycwgFDSR0MDY3NTgyNjc2NDECXzEECmZlZVRvVmF1bHQIBQ0kdDA2NzU4MjY3NjQxAl8yBBZkb1RyYW5zZmVyRmVlVG9TdGFrZXJzAwkAZgIFC3JvbGxvdmVyRmVlAAAEC2xvY2tCYWREZWJ0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAhVleGNoYW5nZUZyZWVBbmRMb2NrZWQJAMwIAgkBAS0BBQpmZWVUb1ZhdWx0BQNuaWwFA25pbAMJAAACBQtsb2NrQmFkRGVidAULbG9ja0JhZERlYnQJAQt0cmFuc2ZlckZlZQEFDGZlZVRvU3Rha2VycwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFFmRvVHJhbnNmZXJGZWVUb1N0YWtlcnMFFmRvVHJhbnNmZXJGZWVUb1N0YWtlcnMEB3Vuc3Rha2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACDndpdGhkcmF3TG9ja2VkCQDMCAIJAGQCBQdfYW1vdW50BQxmZWVUb1N0YWtlcnMFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgYFB190cmFkZXIFD29sZFBvc2l0aW9uU2l6ZQUMcmVtYWluTWFyZ2luBRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9vbGRQb3NpdGlvblNpemUJAQ1sYXN0VGltZXN0YW1wAAkBCHdpdGhkcmF3AggFAWkGY2FsbGVyBQdfYW1vdW50CQENdXBkYXRlQmFsYW5jZQEJAGUCCQBlAgkBCGNiYWxhbmNlAAUHX2Ftb3VudAULcm9sbG92ZXJGZWUFFmRvVHJhbnNmZXJGZWVUb1N0YWtlcnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENY2xvc2VQb3NpdGlvbgUFX3NpemUKX2RpcmVjdGlvbhRfbWluUXVvdGVBc3NldEFtb3VudAxfYWRkVG9NYXJnaW4MX3ByaWNlVXBkYXRlBAx1cGRhdGVPcmFjbGUJAPwHBAUEdGhpcwIMdXBkYXRlT3JhY2xlCQDMCAIFDF9wcmljZVVwZGF0ZQUDbmlsBQNuaWwDCQAAAgUMdXBkYXRlT3JhY2xlBQx1cGRhdGVPcmFjbGUEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQQZW5zdXJlQ2FsbGVkT25jZQkA/AcEBQR0aGlzAhBlbnN1cmVDYWxsZWRPbmNlBQNuaWwFA25pbAMJAAACBRBlbnN1cmVDYWxsZWRPbmNlBRBlbnN1cmVDYWxsZWRPbmNlBAdfdHJhZGVyCQEPZ2V0QWN0dWFsQ2FsbGVyAQUBaQQOX3RyYWRlckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQdfdHJhZGVyAg5JbnZhbGlkIGNhbGxlcgQLcG9zaXRpb25GZWUJAQ5nZXRQb3NpdGlvbkZlZQIFB190cmFkZXIFCl9kaXJlY3Rpb24DAwMDAwMJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24CBQdfdHJhZGVyBQpfZGlyZWN0aW9uBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAGCQBnAgAABQVfc2l6ZQYJAGYCAAAFFF9taW5RdW90ZUFzc2V0QW1vdW50BgkBDmlzTWFya2V0Q2xvc2VkAAkAAgECIEludmFsaWQgY2xvc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBBRvbGRQb3NpdGlvblRpbWVzdGFtcAgJAQtnZXRQb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24CXzUEDSR0MDY5OTc2NzA1NzkJARVpbnRlcm5hbENsb3NlUG9zaXRpb24IBQdfdHJhZGVyBQpfZGlyZWN0aW9uBQVfc2l6ZQULcG9zaXRpb25GZWUFFF9taW5RdW90ZUFzc2V0QW1vdW50BQxfYWRkVG9NYXJnaW4GBgQPbmV3UG9zaXRpb25TaXplCAUNJHQwNjk5NzY3MDU3OQJfMQQRbmV3UG9zaXRpb25NYXJnaW4IBQ0kdDA2OTk3NjcwNTc5Al8yBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDY5OTc2NzA1NzkCXzMEFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNjk5NzY3MDU3OQJfNAQPcG9zaXRpb25CYWREZWJ0CAUNJHQwNjk5NzY3MDU3OQJfNQQLcmVhbGl6ZWRQbmwIBQ0kdDA2OTk3NjcwNTc5Al82BA5tYXJnaW5Ub1RyYWRlcggFDSR0MDY5OTc2NzA1NzkCXzcEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA2OTk3NjcwNTc5Al84BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA2OTk3NjcwNTc5Al85BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNjk5NzY3MDU3OQNfMTAEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDA2OTk3NjcwNTc5A18xMQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDA2OTk3NjcwNTc5A18xMgQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNjk5NzY3MDU3OQNfMTMEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNjk5NzY3MDU3OQNfMTQEG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDY5OTc2NzA1NzkDXzE1BAtyZWFsaXplZEZlZQgFDSR0MDY5OTc2NzA1NzkDXzE2AwkAZgIFD3Bvc2l0aW9uQmFkRGVidAAACQACAQIqSW52YWxpZCBjbG9zZVBvc2l0aW9uIHBhcmFtZXRlcnM6IGJhZCBkZWJ0AwkAZwIFFG9sZFBvc2l0aW9uVGltZXN0YW1wCQENbGFzdFRpbWVzdGFtcAAJAAIBAlNJbnZhbGlkIGNsb3NlUG9zaXRpb24gcGFyYW1ldGVyczogd2FpdCBhdCBsZWFzdCAxIGJsb2NrIGJlZm9yZSBjbG9zaW5nIHRoZSBwb3NpdGlvbgQOaXNQYXJ0aWFsQ2xvc2UJAQIhPQIFD25ld1Bvc2l0aW9uU2l6ZQAABA53aXRoZHJhd0Ftb3VudAkAZAIFDm1hcmdpblRvVHJhZGVyBQtyZWFsaXplZEZlZQQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFDndpdGhkcmF3QW1vdW50BA1hbW1OZXdCYWxhbmNlAwkAZgIAAAUKYW1tQmFsYW5jZQAABQphbW1CYWxhbmNlBAd1bnN0YWtlCQD8BwQJAQx2YXVsdEFkZHJlc3MAAg53aXRoZHJhd0xvY2tlZAkAzAgCBQ53aXRoZHJhd0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQOcmVmZXJyZXJGZWVBbnkJAPwHBAkBD3JlZmVycmFsQWRkcmVzcwACDWFjY2VwdFBheW1lbnQJAMwIAgUHX3RyYWRlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFC3JlYWxpemVkRmVlBQNuaWwDCQAAAgUOcmVmZXJyZXJGZWVBbnkFDnJlZmVycmVyRmVlQW55BAtyZWZlcnJlckZlZQQHJG1hdGNoMAUOcmVmZXJyZXJGZWVBbnkDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQITSW52YWxpZCByZWZlcnJlckZlZQQNJHQwNzE1NTE3MTYyNAkBDWRpc3RyaWJ1dGVGZWUBCQBlAgULcmVhbGl6ZWRGZWUFC3JlZmVycmVyRmVlBAxmZWVUb1N0YWtlcnMIBQ0kdDA3MTU1MTcxNjI0Al8xBApmZWVUb1ZhdWx0CAUNJHQwNzE1NTE3MTYyNAJfMgQMZGVwb3NpdFZhdWx0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAgdhZGRGcmVlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUKZmVlVG9WYXVsdAUDbmlsAwkAAAIFDGRlcG9zaXRWYXVsdAUMZGVwb3NpdFZhdWx0BAlub3RpZnlGZWUJAPwHBAkBDG1pbmVyQWRkcmVzcwACCm5vdGlmeUZlZXMJAMwIAgUHX3RyYWRlcgkAzAgCBQtyZWFsaXplZEZlZQUDbmlsBQNuaWwDCQAAAgUJbm90aWZ5RmVlBQlub3RpZnlGZWUEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAM4IAgMFDmlzUGFydGlhbENsb3NlCQEOdXBkYXRlUG9zaXRpb24GBQdfdHJhZGVyBQ9uZXdQb3NpdGlvblNpemUFEW5ld1Bvc2l0aW9uTWFyZ2luBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUUbmV3UG9zaXRpb25Mc3RVcGRDUEYJAQ1sYXN0VGltZXN0YW1wAAkBDmRlbGV0ZVBvc2l0aW9uAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgkBCXVwZGF0ZUFtbQgFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgUadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIFG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcgMJAGYCBQ5tYXJnaW5Ub1RyYWRlcgAACQEId2l0aGRyYXcCBQ5fdHJhZGVyQWRkcmVzcwUObWFyZ2luVG9UcmFkZXIFA25pbAkBDXVwZGF0ZUJhbGFuY2UBBQ1hbW1OZXdCYWxhbmNlCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJbGlxdWlkYXRlAwdfdHJhZGVyCl9kaXJlY3Rpb24MX3ByaWNlVXBkYXRlBAx1cGRhdGVPcmFjbGUJAPwHBAUEdGhpcwIMdXBkYXRlT3JhY2xlCQDMCAIFDF9wcmljZVVwZGF0ZQUDbmlsBQNuaWwDCQAAAgUMdXBkYXRlT3JhY2xlBQx1cGRhdGVPcmFjbGUEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQPc3BvdE1hcmdpblJhdGlvCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgMFB190cmFkZXIFCl9kaXJlY3Rpb24FD1BOTF9PUFRJT05fU1BPVAQWbGlxdWlkYXRpb25NYXJnaW5SYXRpbwMJARZpc092ZXJGbHVjdHVhdGlvbkxpbWl0AAQRb3JhY2xlTWFyZ2luUmF0aW8JARZnZXRNYXJnaW5SYXRpb0J5T3B0aW9uAwUHX3RyYWRlcgUKX2RpcmVjdGlvbgURUE5MX09QVElPTl9PUkFDTEUJAQR2bWF4AgUPc3BvdE1hcmdpblJhdGlvBRFvcmFjbGVNYXJnaW5SYXRpbwUPc3BvdE1hcmdpblJhdGlvAwMDAwMJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DBRZsaXF1aWRhdGlvbk1hcmdpblJhdGlvCQEWbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAHBgkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24GCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAYJAQ5pc01hcmtldENsb3NlZAAJAAIBAhNVbmFibGUgdG8gbGlxdWlkYXRlBBRpc1BhcnRpYWxMaXF1aWRhdGlvbgMDCQBmAgUPc3BvdE1hcmdpblJhdGlvCQETbGlxdWlkYXRpb25GZWVSYXRpbwAJAGYCCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8AAAAHCQBmAgUMREVDSU1BTF9VTklUCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ABwQPb2xkUG9zaXRpb25TaXplCAkBC2dldFBvc2l0aW9uAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgJfMQQPcG9zaXRpb25TaXplQWJzCQEDYWJzAQUPb2xkUG9zaXRpb25TaXplBA0kdDA3NDIxNzc0NTQwAwUUaXNQYXJ0aWFsTGlxdWlkYXRpb24ED2xpcXVpZGF0aW9uU2l6ZQkBG2dldFBhcnRpYWxMaXF1aWRhdGlvbkFtb3VudAIFB190cmFkZXIFD29sZFBvc2l0aW9uU2l6ZQQQbGlxdWlkYXRpb25SYXRpbwkBBGRpdmQCCQEDYWJzAQUPbGlxdWlkYXRpb25TaXplBQ9wb3NpdGlvblNpemVBYnMJAJQKAgUQbGlxdWlkYXRpb25SYXRpbwkBA2FicwEFD2xpcXVpZGF0aW9uU2l6ZQkAlAoCAAAFD3Bvc2l0aW9uU2l6ZUFicwQQbGlxdWlkYXRpb25SYXRpbwgFDSR0MDc0MjE3NzQ1NDACXzEED2xpcXVpZGF0aW9uU2l6ZQgFDSR0MDc0MjE3NzQ1NDACXzIEDSR0MDc0NTQ2NzUyMDIJARVpbnRlcm5hbENsb3NlUG9zaXRpb24IBQdfdHJhZGVyBQpfZGlyZWN0aW9uAwUUaXNQYXJ0aWFsTGlxdWlkYXRpb24FD2xpcXVpZGF0aW9uU2l6ZQUPcG9zaXRpb25TaXplQWJzCQETbGlxdWlkYXRpb25GZWVSYXRpbwAAAAYHBgQPbmV3UG9zaXRpb25TaXplCAUNJHQwNzQ1NDY3NTIwMgJfMQQRbmV3UG9zaXRpb25NYXJnaW4IBQ0kdDA3NDU0Njc1MjAyAl8yBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDc0NTQ2NzUyMDICXzMEFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNzQ1NDY3NTIwMgJfNAQPcG9zaXRpb25CYWREZWJ0CAUNJHQwNzQ1NDY3NTIwMgJfNQQLcmVhbGl6ZWRQbmwIBQ0kdDA3NDU0Njc1MjAyAl82BA5tYXJnaW5Ub1RyYWRlcggFDSR0MDc0NTQ2NzUyMDICXzcEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA3NDU0Njc1MjAyAl84BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA3NDU0Njc1MjAyAl85BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNzQ1NDY3NTIwMgNfMTAEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDA3NDU0Njc1MjAyA18xMQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDA3NDU0Njc1MjAyA18xMgQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNzQ1NDY3NTIwMgNfMTMEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNzQ1NDY3NTIwMgNfMTQEG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDc0NTQ2NzUyMDIDXzE1BBJsaXF1aWRhdGlvblBlbmFsdHkIBQ0kdDA3NDU0Njc1MjAyA18xNgQPZmVlVG9MaXF1aWRhdG9yCQBpAgUSbGlxdWlkYXRpb25QZW5hbHR5AAIECmZlZVRvVmF1bHQJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFD2ZlZVRvTGlxdWlkYXRvcgQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNbmV3QW1tQmFsYW5jZQMJAGYCAAAFCmFtbUJhbGFuY2UAAAUKYW1tQmFsYW5jZQQLbG9ja0JhZERlYnQDCQBmAgUPcG9zaXRpb25CYWREZWJ0AAAEC2xvY2tCYWREZWJ0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAhVleGNoYW5nZUZyZWVBbmRMb2NrZWQJAMwIAgkAZAIFD3Bvc2l0aW9uQmFkRGVidAUSbGlxdWlkYXRpb25QZW5hbHR5BQNuaWwFA25pbAMJAAACBQtsb2NrQmFkRGVidAULbG9ja0JhZERlYnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFC2xvY2tCYWREZWJ0BQtsb2NrQmFkRGVidAQHdW5zdGFrZQkA/AcECQEMdmF1bHRBZGRyZXNzAAIOd2l0aGRyYXdMb2NrZWQJAMwIAgUSbGlxdWlkYXRpb25QZW5hbHR5BQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBBBkZXBvc2l0SW5zdXJhbmNlCQD8BwQJAQx2YXVsdEFkZHJlc3MAAgdhZGRGcmVlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUKZmVlVG9WYXVsdAUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIDBRRpc1BhcnRpYWxMaXF1aWRhdGlvbgkBDnVwZGF0ZVBvc2l0aW9uBgUHX3RyYWRlcgUPbmV3UG9zaXRpb25TaXplBRFuZXdQb3NpdGlvbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCQENbGFzdFRpbWVzdGFtcAAJAQ5kZWxldGVQb3NpdGlvbgIFB190cmFkZXIFCl9kaXJlY3Rpb24JAQl1cGRhdGVBbW0IBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIFGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyBRt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIJAQh3aXRoZHJhdwIIBQFpBmNhbGxlcgUPZmVlVG9MaXF1aWRhdG9yCQENdXBkYXRlQmFsYW5jZQEFDW5ld0FtbUJhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKcGF5RnVuZGluZwEMX3ByaWNlVXBkYXRlBAx1cGRhdGVPcmFjbGUJAPwHBAUEdGhpcwIMdXBkYXRlT3JhY2xlCQDMCAIFDF9wcmljZVVwZGF0ZQUDbmlsBQNuaWwDCQAAAgUMdXBkYXRlT3JhY2xlBQx1cGRhdGVPcmFjbGUEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCQEZbmV4dEZ1bmRpbmdCbG9ja1RpbWVzdGFtcAADAwMJAGYCBRVmdW5kaW5nQmxvY2tUaW1lc3RhbXAJAQ1sYXN0VGltZXN0YW1wAAYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQkArAICCQCsAgIJAKwCAgIhSW52YWxpZCBmdW5kaW5nIGJsb2NrIHRpbWVzdGFtcDogCQCkAwEJAQ1sYXN0VGltZXN0YW1wAAIDIDwgCQCkAwEFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAQPdW5kZXJseWluZ1ByaWNlCQEOZ2V0T3JhY2xlUHJpY2UABA0kdDA3NzQyMDc3NDk4CQEKZ2V0RnVuZGluZwAEFHNob3J0UHJlbWl1bUZyYWN0aW9uCAUNJHQwNzc0MjA3NzQ5OAJfMQQTbG9uZ1ByZW1pdW1GcmFjdGlvbggFDSR0MDc3NDIwNzc0OTgCXzIEDnByZW1pdW1Ub1ZhdWx0CAUNJHQwNzc0MjA3NzQ5OAJfMwQTZG9QYXlGdW5kaW5nVG9WYXVsdAMJAGYCBQ5wcmVtaXVtVG9WYXVsdAAABBNkb1BheUZ1bmRpbmdUb1ZhdWx0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAhVleGNoYW5nZUZyZWVBbmRMb2NrZWQJAMwIAgkBAS0BBQ5wcmVtaXVtVG9WYXVsdAUDbmlsBQNuaWwDCQAAAgUTZG9QYXlGdW5kaW5nVG9WYXVsdAUTZG9QYXlGdW5kaW5nVG9WYXVsdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUTZG9QYXlGdW5kaW5nVG9WYXVsdAUTZG9QYXlGdW5kaW5nVG9WYXVsdAkBDXVwZGF0ZUZ1bmRpbmcFCQBkAgUVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCQEUZnVuZGluZ1BlcmlvZFNlY29uZHMACQBkAgkBI2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAUTbG9uZ1ByZW1pdW1GcmFjdGlvbgkAZAIJASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ABRRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCBRNsb25nUHJlbWl1bUZyYWN0aW9uBQ91bmRlcmx5aW5nUHJpY2UJAQRkaXZkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FD3VuZGVybHlpbmdQcmljZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQx1cGRhdGVPcmFjbGUBDF9wcmljZVVwZGF0ZQMJAAACCQEKb3JhY2xlTW9kZQAFDE9SQUNMRV9QTEFJTgUDbmlsBAxwcmljZVVwZGF0ZXMJALwJAgUMX3ByaWNlVXBkYXRlAgI6OgQKYmFzZU9yYWNsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQENZ2V0T3JhY2xlRGF0YQEFDGtfYmFzZU9yYWNsZQIZTm8gYmFzZSBhc3NldCBvcmFjbGUgZGF0YQQRYmFzZU9yYWNsZUFkZHJlc3MIBQpiYXNlT3JhY2xlAl8xBBJkb1VwZGF0ZUJhc2VPcmFjbGUJAPwHBAURYmFzZU9yYWNsZUFkZHJlc3MCCnVwZGF0ZURhdGEJAMwIAgkAkQMCBQxwcmljZVVwZGF0ZXMAAAUDbmlsBQNuaWwDCQAAAgUSZG9VcGRhdGVCYXNlT3JhY2xlBRJkb1VwZGF0ZUJhc2VPcmFjbGUEC3F1b3RlT3JhY2xlCQENZ2V0T3JhY2xlRGF0YQEFDWtfcXVvdGVPcmFjbGUEE2RvVXBkYXRlUXVvdGVPcmFjbGUDCQEJaXNEZWZpbmVkAQULcXVvdGVPcmFjbGUEDHF1b3RlT3JhY2xlVgkBBXZhbHVlAQULcXVvdGVPcmFjbGUEEnF1b3RlT3JhY2xlQWRkcmVzcwgFDHF1b3RlT3JhY2xlVgJfMQQTZG9VcGRhdGVRdW90ZU9yYWNsZQkA/AcEBRJxdW90ZU9yYWNsZUFkZHJlc3MCCnVwZGF0ZURhdGEJAMwIAgkAkQMCBQxwcmljZVVwZGF0ZXMAAQUDbmlsBQNuaWwDCQAAAgUTZG9VcGRhdGVRdW90ZU9yYWNsZQUTZG9VcGRhdGVRdW90ZU9yYWNsZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUTZG9VcGRhdGVRdW90ZU9yYWNsZQUTZG9VcGRhdGVRdW90ZU9yYWNsZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGXN5bmNUZXJtaW5hbFByaWNlVG9PcmFjbGUABAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEDSR0MDc5MzIxNzk2ODcJARRnZXRTeW5jVGVybWluYWxQcmljZQMJAQ5nZXRPcmFjbGVQcmljZQAFB19xdEFzdFIFB19ic0FzdFIEE25ld1F1b3RlQXNzZXRXZWlnaHQIBQ0kdDA3OTMyMTc5Njg3Al8xBBJuZXdCYXNlQXNzZXRXZWlnaHQIBQ0kdDA3OTMyMTc5Njg3Al8yBA1tYXJnaW5Ub1ZhdWx0CAUNJHQwNzkzMjE3OTY4NwJfMwQQbWFyZ2luVG9WYXVsdEFkagMDCQBmAgAABQ1tYXJnaW5Ub1ZhdWx0CQBmAgkBA2FicwEFDW1hcmdpblRvVmF1bHQJAQhjYmFsYW5jZQAHCQEBLQEJAQhjYmFsYW5jZQAFDW1hcmdpblRvVmF1bHQEDWRvRXhjaGFuZ2VQbkwDCQECIT0CBRBtYXJnaW5Ub1ZhdWx0QWRqAAAEDWRvRXhjaGFuZ2VQbkwJAPwHBAkBDHZhdWx0QWRkcmVzcwACFWV4Y2hhbmdlRnJlZUFuZExvY2tlZAkAzAgCBRBtYXJnaW5Ub1ZhdWx0QWRqBQNuaWwFA25pbAMJAAACBQ1kb0V4Y2hhbmdlUG5MBQ1kb0V4Y2hhbmdlUG5MBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQ1kb0V4Y2hhbmdlUG5MBQ1kb0V4Y2hhbmdlUG5MCQDOCAIJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFEG1hcmdpblRvVmF1bHRBZGoJARB1cGRhdGVBbW1XZWlnaHRzAgUTbmV3UXVvdGVBc3NldFdlaWdodAUSbmV3QmFzZUFzc2V0V2VpZ2h0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGVuc3VyZUNhbGxlZE9uY2UAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIiSW52YWxpZCBzYXZlQ3VycmVudFR4SWQgcGFyYW1ldGVycwQEdHhJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAZsYXN0VHgJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUIa19sYXN0VHgCAAMJAQIhPQIFBmxhc3RUeAUEdHhJZAkAzAgCCQELU3RyaW5nRW50cnkCBQhrX2xhc3RUeAUEdHhJZAUDbmlsCQACAQIpQ2FuIG5vdCBjYWxsIHZBTU0gbWV0aG9kcyB0d2ljZSBpbiBvbmUgdHgBaQEPbWlncmF0ZVBvc2l0aW9uAQdfdHJhZGVyBA9wb3NpdGlvblNpemVPcHQJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFB190cmFkZXIDAwkBCWlzRGVmaW5lZAEFD3Bvc2l0aW9uU2l6ZU9wdAkBCWlzRGVmaW5lZAEJAKYIAQUHX3RyYWRlcgcEBXBTaXplCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQUHX3RyYWRlcgQHcE1hcmdpbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgUHX3RyYWRlcgQJcE5vdGlvbmFsCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQdfdHJhZGVyBAlwRnJhY3Rpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FB190cmFkZXIECnBUaW1lc3RhbXAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUea19wb3NpdGlvbkxhc3RVcGRhdGVkVGltZXN0YW1wBQdfdHJhZGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQEcEZlZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQ1rX3Bvc2l0aW9uRmVlBQdfdHJhZGVyCQEDZmVlAAQJcFNlcXVlbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRJrX3Bvc2l0aW9uU2VxdWVuY2UFB190cmFkZXIECnBEaXJlY3Rpb24JAQxnZXREaXJlY3Rpb24BBQVwU2l6ZQQLcG9zaXRpb25LZXkJAKwCAgkArAICBQdfdHJhZGVyAgFfCQCkAwEFCnBEaXJlY3Rpb24JAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFB190cmFkZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgUHX3RyYWRlcgkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQdfdHJhZGVyCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FB190cmFkZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUea19wb3NpdGlvbkxhc3RVcGRhdGVkVGltZXN0YW1wBQdfdHJhZGVyCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFDWtfcG9zaXRpb25GZWUFB190cmFkZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUSa19wb3NpdGlvblNlcXVlbmNlBQdfdHJhZGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQULcG9zaXRpb25LZXkFBXBTaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQtwb3NpdGlvbktleQUHcE1hcmdpbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAULcG9zaXRpb25LZXkFCXBOb3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgULcG9zaXRpb25LZXkFCXBGcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUea19wb3NpdGlvbkxhc3RVcGRhdGVkVGltZXN0YW1wBQtwb3NpdGlvbktleQUKcFRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUNa19wb3NpdGlvbkZlZQULcG9zaXRpb25LZXkFBHBGZWUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEmtfcG9zaXRpb25TZXF1ZW5jZQULcG9zaXRpb25LZXkFCXBTZXF1ZW5jZQUDbmlsCQACAQkArAICAhdOb3RoaW5nIHRvIG1pZ3JhdGUgZm9yIAUHX3RyYWRlcgFpASd2aWV3X2NhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQDB190cmFkZXIKX2RpcmVjdGlvbgxfcHJpY2VVcGRhdGUEDHVwZGF0ZU9yYWNsZQkA/AcEBQR0aGlzAgx1cGRhdGVPcmFjbGUJAMwIAgUMX3ByaWNlVXBkYXRlBQNuaWwFA25pbAMJAAACBQx1cGRhdGVPcmFjbGUFDHVwZGF0ZU9yYWNsZQQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBA0kdDA4MzQ4MTgzNjE3CQELZ2V0UG9zaXRpb24CBQdfdHJhZGVyBQpfZGlyZWN0aW9uBAxwb3NpdGlvblNpemUIBQ0kdDA4MzQ4MTgzNjE3Al8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDgzNDgxODM2MTcCXzIEA3BvbggFDSR0MDgzNDgxODM2MTcCXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwODM0ODE4MzYxNwJfNAQRcG9zaXRpb25UaW1lc3RhbXAIBQ0kdDA4MzQ4MTgzNjE3Al81BA0kdDA4MzYyMDgzNzMzCQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwDBQdfdHJhZGVyBQpfZGlyZWN0aW9uBQ9QTkxfT1BUSU9OX1NQT1QEEHBvc2l0aW9uTm90aW9uYWwIBQ0kdDA4MzYyMDgzNzMzAl8xBA11bnJlYWxpemVkUG5sCAUNJHQwODM2MjA4MzczMwJfMgQNJHQwODM3MzY4Mzk2MAkBMGNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnRBbmRSb2xsb3ZlckZlZQUFDHBvc2l0aW9uU2l6ZQUOcG9zaXRpb25NYXJnaW4FEXBvc2l0aW9uTHN0VXBkQ1BGBRFwb3NpdGlvblRpbWVzdGFtcAUNdW5yZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwODM3MzY4Mzk2MAJfMQQHYmFkRGVidAgFDSR0MDgzNzM2ODM5NjACXzIEDmZ1bmRpbmdQYXltZW50CAUNJHQwODM3MzY4Mzk2MAJfMwQLcm9sbG92ZXJGZWUIBQ0kdDA4MzczNjgzOTYwAl80CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkBAXMBBQxyZW1haW5NYXJnaW4JAQFzAQUOZnVuZGluZ1BheW1lbnQJAQFzAQkBDmdldE1hcmdpblJhdGlvAgUHX3RyYWRlcgUKX2RpcmVjdGlvbgkBAXMBBQ11bnJlYWxpemVkUG5sCQEBcwEFB2JhZERlYnQJAQFzAQUQcG9zaXRpb25Ob3Rpb25hbAkBAXMBBQtyb2xsb3ZlckZlZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARV2aWV3X2dldFBlZ0FkanVzdENvc3QBBl9wcmljZQQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAZyZXN1bHQJARRnZXRTeW5jVGVybWluYWxQcmljZQMFBl9wcmljZQUHX3F0QXN0UgUHX2JzQXN0UgkAAgEJAKQDAQgFBnJlc3VsdAJfMwFpARh2aWV3X2dldFRlcm1pbmFsQW1tUHJpY2UABA0kdDA4NDY5NTg0Nzc2CQETZ2V0VGVybWluYWxBbW1TdGF0ZQAEGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUIBQ0kdDA4NDY5NTg0Nzc2Al8xBBh0ZXJtaW5hbEJhc2VBc3NldFJlc2VydmUIBQ0kdDA4NDY5NTg0Nzc2Al8yBAVwcmljZQkBBGRpdmQCCQEEbXVsZAIFGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUJAQZxdEFzdFcACQEEbXVsZAIFGHRlcm1pbmFsQmFzZUFzc2V0UmVzZXJ2ZQkBBmJzQXN0VwAJAAIBCQCkAwEFBXByaWNlAWkBD3ZpZXdfZ2V0RnVuZGluZwEMX3ByaWNlVXBkYXRlBAx1cGRhdGVPcmFjbGUJAPwHBAUEdGhpcwIMdXBkYXRlT3JhY2xlCQDMCAIFDF9wcmljZVVwZGF0ZQUDbmlsBQNuaWwDCQAAAgUMdXBkYXRlT3JhY2xlBQx1cGRhdGVPcmFjbGUEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQPdW5kZXJseWluZ1ByaWNlCQEOZ2V0T3JhY2xlUHJpY2UABA0kdDA4NTQyODg1NTA2CQEKZ2V0RnVuZGluZwAEFHNob3J0UHJlbWl1bUZyYWN0aW9uCAUNJHQwODU0Mjg4NTUwNgJfMQQTbG9uZ1ByZW1pdW1GcmFjdGlvbggFDSR0MDg1NDI4ODU1MDYCXzIEDnByZW1pdW1Ub1ZhdWx0CAUNJHQwODU0Mjg4NTUwNgJfMwQLbG9uZ0Z1bmRpbmcJAQRkaXZkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlBAxzaG9ydEZ1bmRpbmcJAQRkaXZkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FD3VuZGVybHlpbmdQcmljZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkBAXMBBQtsb25nRnVuZGluZwkBAXMBBQxzaG9ydEZ1bmRpbmcJAQFzAQkBDGdldFNwb3RQcmljZQAJAQFzAQkBDmdldE9yYWNsZVByaWNlAAkBAXMBBQ5wcmVtaXVtVG9WYXVsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjb21wdXRlU3BvdFByaWNlAAQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBAZyZXN1bHQJAQxnZXRTcG90UHJpY2UACQCUCgIFA25pbAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBH2NvbXB1dGVGZWVGb3JUcmFkZXJXaXRoQXJ0aWZhY3QCB190cmFkZXILX2FydGlmYWN0SWQEBnJlc3VsdAkBGGdldEZvclRyYWRlcldpdGhBcnRpZmFjdAIFB190cmFkZXIFC19hcnRpZmFjdElkCQCUCgIFA25pbAUGcmVzdWx0AQJ0eAEGdmVyaWZ5AAQOY29vcmRpbmF0b3JTdHIJAJ0IAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MDCQEJaXNEZWZpbmVkAQUOY29vcmRpbmF0b3JTdHIEBWFkbWluCQCdCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFDmNvb3JkaW5hdG9yU3RyBQ9rX2FkbWluX2FkZHJlc3MDCQEJaXNEZWZpbmVkAQUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFYWRtaW4JAKwCAgkArAICCQCsAgICB3N0YXR1c18JAKUIAQUEdGhpcwIBXwkA2AQBCAUCdHgCaWQHCQACAQIudW5hYmxlIHRvIHZlcmlmeTogYWRtaW4gbm90IHNldCBpbiBjb29yZGluYXRvcgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQnYHyY=", "height": 3654889, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9U7qApWxbiXEPRsZaiLsm5Cuw1DqgRe71JK4GsxBeXh9 Next: 6pVmE6dSRATzR8iuMTkz6h9AagyZih5XF5xtA6aUAETT Diff:
OldNewDifferences
5757
5858 let B = "k_fundingMode"
5959
60-let C = "k_latestLongPremiumFraction"
60+let C = "k_oracleMode"
6161
62-let D = "k_latestShortPremiumFraction"
62+let D = "k_latestLongPremiumFraction"
6363
64-let E = "k_nextFundingBlockMinTimestamp"
64+let E = "k_latestShortPremiumFraction"
6565
66-let F = "k_longFundingRate"
66+let F = "k_nextFundingBlockMinTimestamp"
6767
68-let G = "k_shortFundingRate"
68+let G = "k_longFundingRate"
6969
70-let H = "k_qtAstR"
70+let H = "k_shortFundingRate"
7171
72-let I = "k_bsAstR"
72+let I = "k_qtAstR"
7373
74-let J = "k_qtAstW"
74+let J = "k_bsAstR"
7575
76-let K = "k_bsAstW"
76+let K = "k_qtAstW"
7777
78-let L = "k_totalPositionSize"
78+let L = "k_bsAstW"
7979
80-let M = "k_totalLongPositionSize"
80+let M = "k_totalPositionSize"
8181
82-let N = "k_totalShortPositionSize"
82+let N = "k_totalLongPositionSize"
8383
84-let O = "k_openInterestNotional"
84+let O = "k_totalShortPositionSize"
8585
86-let P = "k_openInterestShort"
86+let P = "k_openInterestNotional"
8787
88-let Q = "k_openInterestLong"
88+let Q = "k_openInterestShort"
8989
90-let R = "k_lastTx"
90+let R = "k_openInterestLong"
9191
92-let S = "k_coordinatorAddress"
92+let S = "k_lastTx"
9393
94-let T = "k_vault_address"
94+let T = "k_coordinatorAddress"
9595
96-let U = "k_admin_address"
96+let U = "k_vault_address"
9797
98-let V = "k_quote_asset"
98+let V = "k_admin_address"
9999
100-let W = "k_staking_address"
100+let W = "k_quote_asset"
101101
102-let X = "k_miner_address"
102+let X = "k_staking_address"
103103
104-let Y = "k_orders_address"
104+let Y = "k_miner_address"
105105
106-let Z = "k_referral_address"
106+let Z = "k_orders_address"
107107
108-let aa = "k_nft_manager_address"
108+let aa = "k_referral_address"
109109
110-func ab (ac,ad) = ((ac + "_") + ad)
110+let ab = "k_nft_manager_address"
111+
112+func ac (ad,ae) = ((ad + "_") + ae)
111113
112114
113-func ae () = valueOrErrorMessage(addressFromString(getStringValue(this, S)), "Coordinator not set")
115+func af () = valueOrErrorMessage(addressFromString(getStringValue(this, T)), "Coordinator not set")
114116
115117
116-func af () = addressFromString(getStringValue(ae(), U))
118+func ag () = addressFromString(getStringValue(af(), V))
117119
118120
119-func ag () = fromBase58String(getStringValue(ae(), V))
121+func ah () = fromBase58String(getStringValue(af(), W))
120122
121123
122-func ah () = valueOrErrorMessage(addressFromString(getStringValue(ae(), W)), "Staking not set")
124+func ai () = valueOrErrorMessage(addressFromString(getStringValue(af(), X)), "Staking not set")
123125
124126
125-func ai () = valueOrErrorMessage(addressFromString(getStringValue(ae(), T)), "Vault not set")
127+func aj () = valueOrErrorMessage(addressFromString(getStringValue(af(), U)), "Vault not set")
126128
127129
128-func aj () = valueOrErrorMessage(addressFromString(getStringValue(ae(), X)), "Miner not set")
130+func ak () = valueOrErrorMessage(addressFromString(getStringValue(af(), Y)), "Miner not set")
129131
130132
131-func ak () = valueOrErrorMessage(addressFromString(getStringValue(ae(), Y)), "Orders not set")
133+func al () = valueOrErrorMessage(addressFromString(getStringValue(af(), Z)), "Orders not set")
132134
133135
134-func al () = valueOrErrorMessage(addressFromString(getStringValue(ae(), Z)), "Referral not set")
136+func am () = valueOrErrorMessage(addressFromString(getStringValue(af(), aa)), "Referral not set")
135137
136138
137-func am () = valueOrErrorMessage(addressFromString(getStringValue(ae(), aa)), "NFT Manager not set")
139+func an () = valueOrErrorMessage(addressFromString(getStringValue(af(), ab)), "NFT Manager not set")
138140
139141
140-let an = "k_token_param"
142+let ao = "k_token_param"
141143
142-let ao = "k_token_type"
144+let ap = "k_token_type"
143145
144-let ap = "fee_reduction"
146+let aq = "fee_reduction"
145147
146-let aq = 1
148+let ar = 1
147149
148-let ar = 2
150+let as = 2
149151
150-let as = 1000
152+let at = 1000
151153
152-let at = 6
154+let au = 6
153155
154-let au = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
156+let av = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
155157
156-let av = (525600 * au)
158+let aw = (525600 * av)
157159
158-let aw = (86400 * au)
160+let ax = (86400 * av)
159161
160-let ax = 1
162+let ay = 1
161163
162-let ay = 2
164+let az = 2
163165
164-let az = 1
166+let aA = 1
165167
166-let aA = 2
168+let aB = 2
167169
168-func aB (aC) = (toString(aC) + ",")
170+let aC = 1
171+
172+let aD = 2
173+
174+func aE (aF) = (toString(aF) + ",")
169175
170176
171-func aD (aC,aE) = fraction(aC, au, aE, HALFEVEN)
177+func aG (aF,aH) = fraction(aF, av, aH, HALFEVEN)
172178
173179
174-func aF (aC,aE) = fraction(aC, aE, au, HALFEVEN)
180+func aI (aF,aH) = fraction(aF, aH, av, HALFEVEN)
175181
176182
177-func aG (aC,aE) = fraction(aC, toBigInt(au), aE, HALFEVEN)
183+func aJ (aF,aH) = fraction(aF, toBigInt(av), aH, HALFEVEN)
178184
179185
180-func aH (aC,aE) = fraction(aC, aE, toBigInt(au), HALFEVEN)
186+func aK (aF,aH) = fraction(aF, aH, toBigInt(av), HALFEVEN)
181187
182188
183-func aI (aC) = if ((aC > 0))
184- then aC
185- else -(aC)
189+func aL (aF) = if ((aF > 0))
190+ then aF
191+ else -(aF)
186192
187193
188-func aJ (aC,aE) = if ((aC >= aE))
189- then aC
190- else aE
194+func aM (aF,aH) = if ((aF >= aH))
195+ then aF
196+ else aH
191197
192198
193-func aK (aL) = valueOrErrorMessage(getInteger(this, aL), ("no value for " + aL))
199+func aN (aO) = valueOrErrorMessage(getInteger(this, aO), ("no value for " + aO))
194200
195201
196-func aM (aL,aN) = valueOrElse(getInteger(this, aL), aN)
202+func aP (aO,aQ) = valueOrElse(getInteger(this, aO), aQ)
197203
198204
199-func aO (ad,ac) = {
200- let aP = valueOrErrorMessage(getString(ad, ac), ("No value for key " + ac))
201- aP
205+func aR (ae,ad) = {
206+ let aS = valueOrErrorMessage(getString(ae, ad), ("No value for key " + ad))
207+ aS
202208 }
203209
204210
205-func aQ (ad,ac) = {
206- let aP = valueOrErrorMessage(getInteger(ad, ac), ("No value for key " + ac))
207- aP
211+func aT (ae,ad) = {
212+ let aS = valueOrErrorMessage(getInteger(ae, ad), ("No value for key " + ad))
213+ aS
208214 }
209215
210216
211-func aR () = aK(c)
217+func aU () = aN(c)
212218
213219
214-func aS () = aK(o)
220+func aV () = aN(o)
215221
216222
217-func aT () = aK(p)
223+func aW () = aN(p)
218224
219225
220-func aU () = aK(r)
226+func aX () = aN(r)
221227
222228
223-func aV () = aK(H)
229+func aY () = aN(I)
224230
225231
226-func aW () = aK(I)
232+func aZ () = aN(J)
227233
228234
229-func aX () = aM(J, au)
235+func ba () = aP(K, av)
230236
231237
232-func aY () = aM(K, au)
238+func bb () = aP(L, av)
233239
234240
235-func aZ () = aK(L)
241+func bc () = aN(M)
236242
237243
238-func ba () = aK(O)
244+func bd () = aN(P)
239245
240246
241-func bb () = aK(P)
247+func be () = aN(Q)
242248
243249
244-func bc () = aK(Q)
250+func bf () = aN(R)
245251
246252
247-func bd () = aK(E)
253+func bg () = aN(F)
248254
249255
250-func be () = aK(q)
256+func bh () = aN(q)
251257
252258
253-func bf () = (be() * au)
259+func bi () = (bh() * av)
254260
255261
256-func bg () = (be() * as)
262+func bj () = (bh() * at)
257263
258264
259-func bh () = aK(s)
265+func bk () = aN(s)
260266
261267
262-func bi () = aK(t)
268+func bl () = aN(t)
263269
264270
265-func bj () = aK(u)
271+func bm () = aN(u)
266272
267273
268-func bk () = aK(v)
274+func bn () = aN(v)
269275
270276
271-func bl () = aK(w)
277+func bo () = aN(w)
272278
273279
274-func bm () = aK(x)
280+func bp () = aN(x)
275281
276282
277-func bn () = aK(y)
283+func bq () = aN(y)
278284
279285
280-func bo () = aK(C)
286+func br () = aN(D)
281287
282288
283-func bp () = aK(D)
289+func bs () = aN(E)
284290
285291
286-func bq () = aK(N)
292+func bt () = aN(O)
287293
288294
289-func br () = aK(M)
295+func bu () = aN(N)
290296
291297
292-func bs () = aM(d, 0)
298+func bv () = aP(d, 0)
293299
294300
295-func bt () = aK(z)
301+func bw () = aN(z)
296302
297303
298-func bu () = aK(A)
304+func bx () = aN(A)
299305
300306
301-func bv () = aM(B, az)
307+func by () = aP(B, aA)
302308
303309
304-func bw () = lastBlock.timestamp
310+func bz () = aP(C, aC)
305311
306312
307-func bx (by) = valueOrElse(getString(ak(), "k_sender"), toString(by.caller))
313+func bA () = lastBlock.timestamp
308314
309315
310-func bz (bA,bB,bC) = {
311- let bD = (bA - bB)
312- if (if (bC)
313- then (0 > bD)
316+func bB (bC) = valueOrElse(getString(al(), "k_sender"), toString(bC.caller))
317+
318+
319+func bD (bE,bF,bG) = {
320+ let bH = (bE - bF)
321+ if (if (bG)
322+ then (0 > bH)
314323 else false)
315- then throw(((("Invalid margin: " + toString(bA)) + " < ") + toString(bB)))
316- else if (if (!(bC))
317- then (bD >= 0)
324+ then throw(((("Invalid margin: " + toString(bE)) + " < ") + toString(bF)))
325+ else if (if (!(bG))
326+ then (bH >= 0)
318327 else false)
319- then throw(((("Invalid margin: " + toString(bA)) + " > ") + toString(bB)))
328+ then throw(((("Invalid margin: " + toString(bE)) + " > ") + toString(bF)))
320329 else true
321330 }
322331
323332
324-func bE (bF) = if ((bF == 0))
333+func bI (bJ) = if ((bJ == 0))
325334 then throw("Should not be called with _positionSize == 0")
326- else if ((bF > 0))
327- then bo()
328- else bp()
335+ else if ((bJ > 0))
336+ then br()
337+ else bs()
329338
330339
331-func bG (bH,bI) = {
332- let bJ = ((bH + "_") + toString(bI))
333- let bK = getInteger(this, ab(e, bJ))
334- let bL = bK
335- if ($isInstanceOf(bL, "Int"))
340+func bK (bL,bM) = {
341+ let bN = ((bL + "_") + toString(bM))
342+ let bO = getInteger(this, ac(e, bN))
343+ let bP = bO
344+ if ($isInstanceOf(bP, "Int"))
336345 then {
337- let bM = bL
338- $Tuple5(bM, getIntegerValue(this, ab(f, bJ)), getIntegerValue(this, ab(g, bJ)), getIntegerValue(this, ab(h, bJ)), getIntegerValue(this, ab(k, bJ)))
346+ let bQ = bP
347+ $Tuple5(bQ, getIntegerValue(this, ac(f, bN)), getIntegerValue(this, ac(g, bN)), getIntegerValue(this, ac(h, bN)), getIntegerValue(this, ac(k, bN)))
339348 }
340349 else $Tuple5(0, 0, 0, 0, 0)
341350 }
342351
343352
344-func bN (bF) = if ((0 > bF))
345- then ar
346- else aq
353+func bR (bJ) = if ((0 > bJ))
354+ then as
355+ else ar
347356
348357
349-func bO (bH,bI) = {
350- let bJ = ((bH + "_") + toString(bI))
351- let bP = getInteger(this, ab(j, bJ))
352- let bL = bP
353- if ($isInstanceOf(bL, "Int"))
358+func bS (bL,bM) = {
359+ let bN = ((bL + "_") + toString(bM))
360+ let bT = getInteger(this, ac(j, bN))
361+ let bP = bT
362+ if ($isInstanceOf(bP, "Int"))
354363 then {
355- let bQ = bL
356- bQ
364+ let bU = bP
365+ bU
357366 }
358- else aS()
367+ else aV()
359368 }
360369
361370
362-func bR (bH,bI) = if ((bG(bH, bI)._1 == 0))
371+func bV (bL,bM) = if ((bK(bL, bM)._1 == 0))
363372 then throw("No open position")
364373 else true
365374
366375
367-func bS (bT) = {
368- let bU = getString(this, bT)
369- if (if (isDefined(bU))
370- then (value(bU) != "")
376+func bW (bX) = {
377+ let bY = getString(this, bX)
378+ if (if (isDefined(bY))
379+ then (value(bY) != "")
371380 else false)
372381 then {
373- let bV = split(value(bU), ",")
374- let bW = valueOrErrorMessage(addressFromString(bV[0]), ("Invalid oracle address in: " + value(bU)))
375- let bX = bV[1]
376- let bY = bV[2]
377- let bZ = bV[3]
378- $Tuple4(bW, bX, bY, bZ)
382+ let bZ = split(value(bY), ",")
383+ let ca = valueOrErrorMessage(addressFromString(bZ[0]), ("Invalid oracle address in: " + value(bY)))
384+ let cb = bZ[1]
385+ let cc = bZ[2]
386+ let cd = bZ[3]
387+ $Tuple4(ca, cb, cc, cd)
379388 }
380389 else unit
381390 }
382391
383392
384-func ca () = valueOrElse(getBoolean(this, l), false)
393+func ce () = valueOrElse(getBoolean(this, l), false)
385394
386395
387-func cb () = valueOrElse(getBoolean(this, m), false)
396+func cf () = valueOrElse(getBoolean(this, m), false)
388397
389398
390-func cc () = valueOrElse(getBoolean(this, n), false)
399+func cg () = valueOrElse(getBoolean(this, n), false)
391400
392401
393-func cd (ce,cf,cg) = if (ce)
402+func ch (ci,cj,ck) = if (ci)
394403 then {
395- let ch = (aW() - cg)
396- if ((0 >= ch))
404+ let cl = (aZ() - ck)
405+ if ((0 >= cl))
397406 then throw("Tx lead to base asset reserve <= 0, revert")
398- else $Tuple3((aV() + cf), ch, (aZ() + cg))
407+ else $Tuple3((aY() + cj), cl, (bc() + ck))
399408 }
400409 else {
401- let ci = (aV() - cf)
402- if ((0 >= ci))
410+ let cm = (aY() - cj)
411+ if ((0 >= cm))
403412 then throw("Tx lead to base quote reserve <= 0, revert")
404- else $Tuple3(ci, (aW() + cg), (aZ() - cg))
413+ else $Tuple3(cm, (aZ() + ck), (bc() - ck))
405414 }
406415
407416
408-func cj (ck,cl) = {
409- let cm = toBigInt(ck)
410- let cn = toBigInt(cl)
411- aH(cm, cn)
417+func cn (co,cp) = {
418+ let cq = toBigInt(co)
419+ let cr = toBigInt(cp)
420+ aK(cq, cr)
412421 }
413422
414423
415-func co (ce,cf) = {
416- let ck = aV()
417- let cl = aW()
418- let cp = aX()
419- let cq = aY()
420- let cr = aD(cf, cp)
421- let aL = cj(ck, cl)
422- let cs = if (ce)
423- then (ck + cr)
424- else (ck - cr)
425- let ct = toInt(aG(aL, toBigInt(cs)))
426- let cu = aI((ct - cl))
427- let cv = if (ce)
428- then cu
429- else -(cu)
430- let cw = cd(ce, cr, cu)
431- let cx = cw._1
432- let cy = cw._2
433- let cz = cw._3
434- let cA = aD(aF(ck, cp), aF(cl, cq))
435- let cB = aD(cf, cu)
436- let cC = aI((cA - cB))
437- let cD = (au - aD(cA, (cA + cC)))
438- let cE = bl()
439- if ((cD > cE))
440- then throw(((((((((((((("Price impact " + toString(cD)) + " > max price impact ") + toString(cE)) + " before quote asset: ") + toString(ck)) + " before base asset: ") + toString(cl)) + " quote asset amount to exchange: ") + toString(cf)) + " price before: ") + toString(cA)) + " marketPrice: ") + toString(cB)))
441- else $Tuple4(cv, cx, cy, cz)
424+func cs (ci,cj) = {
425+ let co = aY()
426+ let cp = aZ()
427+ let ct = ba()
428+ let cu = bb()
429+ let cv = aG(cj, ct)
430+ let aO = cn(co, cp)
431+ let cw = if (ci)
432+ then (co + cv)
433+ else (co - cv)
434+ let cx = toInt(aJ(aO, toBigInt(cw)))
435+ let cy = aL((cx - cp))
436+ let cz = if (ci)
437+ then cy
438+ else -(cy)
439+ let cA = ch(ci, cv, cy)
440+ let cB = cA._1
441+ let cC = cA._2
442+ let cD = cA._3
443+ let cE = aG(aI(co, ct), aI(cp, cu))
444+ let cF = aG(cj, cy)
445+ let cG = aL((cE - cF))
446+ let cH = (av - aG(cE, (cE + cG)))
447+ let cI = bo()
448+ if ((cH > cI))
449+ then throw(((((((((((((("Price impact " + toString(cH)) + " > max price impact ") + toString(cI)) + " before quote asset: ") + toString(co)) + " before base asset: ") + toString(cp)) + " quote asset amount to exchange: ") + toString(cj)) + " price before: ") + toString(cE)) + " marketPrice: ") + toString(cF)))
450+ else $Tuple4(cz, cB, cC, cD)
442451 }
443452
444453
445-func cF (cG,cH) = {
446- let cI = ((((bw() - cH) / 1000) / 60) * au)
447- let cJ = aD(aF(aF(cG, cI), aT()), av)
448- cJ
454+func cJ (cK,cL) = {
455+ let cM = ((((bA() - cL) / 1000) / 60) * av)
456+ let cN = aG(aI(aI(cK, cM), aW()), aw)
457+ cN
449458 }
450459
451460
452-func cK (cL,cG,cM,cH,cN) = {
453- let cO = if ((cL != 0))
461+func cO (cP,cK,cQ,cL,cR) = {
462+ let cS = if ((cP != 0))
454463 then {
455- let cP = bE(cL)
456- aF((cP - cM), cL)
464+ let cT = bI(cP)
465+ aI((cT - cQ), cP)
457466 }
458467 else 0
459- let cJ = cF(cG, cH)
460- let cQ = (((cN - cJ) - cO) + cG)
461- let cR = if ((0 > cQ))
462- then $Tuple2(0, aI(cQ))
463- else $Tuple2(aI(cQ), 0)
464- let cS = cR._1
465- let cT = cR._2
466- $Tuple4(cS, cT, cO, cJ)
468+ let cN = cJ(cK, cL)
469+ let cU = (((cR - cN) - cS) + cK)
470+ let cV = if ((0 > cU))
471+ then $Tuple2(0, aL(cU))
472+ else $Tuple2(aL(cU), 0)
473+ let cW = cV._1
474+ let cX = cV._2
475+ $Tuple4(cW, cX, cS, cN)
467476 }
468477
469478
470-func cU (ce,cg,cV,cW,cX,cY,cZ) = {
471- let cA = aD(aF(cW, cX), aF(cY, cZ))
472- if ((cg == 0))
479+func cY (ci,ck,cZ,da,db,dc,dd) = {
480+ let cE = aG(aI(da, db), aI(dc, dd))
481+ if ((ck == 0))
473482 then throw("Invalid base asset amount")
474483 else {
475- let aL = cj(cW, cY)
476- let da = if (ce)
477- then (cY + cg)
478- else (cY - cg)
479- let db = toInt(aG(aL, toBigInt(da)))
480- let dc = aI((db - cW))
481- let dd = aF(dc, cX)
482- let cE = bl()
483- let de = cd(!(ce), dc, cg)
484- let cx = de._1
485- let cy = de._2
486- let cz = de._3
487- let cB = aD(dd, cg)
488- let cC = aI((cA - cB))
489- let cD = (au - aD(cA, (cA + cC)))
490- if (if ((cD > cE))
491- then cV
484+ let aO = cn(da, dc)
485+ let de = if (ci)
486+ then (dc + ck)
487+ else (dc - ck)
488+ let df = toInt(aJ(aO, toBigInt(de)))
489+ let dg = aL((df - da))
490+ let dh = aI(dg, db)
491+ let cI = bo()
492+ let di = ch(!(ci), dg, ck)
493+ let cB = di._1
494+ let cC = di._2
495+ let cD = di._3
496+ let cF = aG(dh, ck)
497+ let cG = aL((cE - cF))
498+ let cH = (av - aG(cE, (cE + cG)))
499+ if (if ((cH > cI))
500+ then cZ
492501 else false)
493- then throw(((((((((((((("Price impact " + toString(cD)) + " > max price impact ") + toString(cE)) + " before quote asset: ") + toString(cW)) + " before base asset: ") + toString(cY)) + " base asset amount to exchange: ") + toString(cg)) + " price before: ") + toString(cA)) + " market price: ") + toString(cB)))
494- else $Tuple7(dd, cx, cy, cz, (br() - (if (ce)
495- then aI(cg)
496- else 0)), (bq() - (if (!(ce))
497- then aI(cg)
498- else 0)), cD)
502+ then throw(((((((((((((("Price impact " + toString(cH)) + " > max price impact ") + toString(cI)) + " before quote asset: ") + toString(da)) + " before base asset: ") + toString(dc)) + " base asset amount to exchange: ") + toString(ck)) + " price before: ") + toString(cE)) + " market price: ") + toString(cF)))
503+ else $Tuple7(dh, cB, cC, cD, (bu() - (if (ci)
504+ then aL(ck)
505+ else 0)), (bt() - (if (!(ci))
506+ then aL(ck)
507+ else 0)), cH)
499508 }
500509 }
501510
502511
503-func df (ce,cg,cV) = cU(ce, cg, cV, aV(), aX(), aW(), aY())
512+func dj (ci,ck,cZ) = cY(ci, ck, cZ, aY(), ba(), aZ(), bb())
504513
505514
506-func dg (dh,bX,bY) = {
507- let di = valueOrErrorMessage(getInteger(dh, bX), ((("Can not get oracle price. Oracle: " + toString(dh)) + " key: ") + bX))
508- if ((bY != ""))
515+func dk (dl,cb,cc) = {
516+ let dm = valueOrErrorMessage(getInteger(dl, cb), ((("Can not get oracle price. Oracle: " + toString(dl)) + " key: ") + cb))
517+ if ((cc != ""))
509518 then {
510- let dj = lastBlock.height
511- let dk = valueOrErrorMessage(getInteger(dh, bY), ((("Can not get oracle block. Oracle: " + toString(dh)) + " key: ") + bY))
512- if (((dj - dk) > bu()))
513- then throw(((("Oracle stale data. Last oracle block: " + toString(dk)) + " current block: ") + toString(dj)))
514- else di
519+ let dn = height
520+ let do = valueOrErrorMessage(getInteger(dl, cc), ((("Can not get oracle block. Oracle: " + toString(dl)) + " key: ") + cc))
521+ if (((dn - do) > bx()))
522+ then throw(((("Oracle stale data. Last oracle block: " + toString(do)) + " current block: ") + toString(dn)))
523+ else dm
515524 }
516- else di
525+ else dm
517526 }
518527
519528
520-func dl () = {
521- let dm = valueOrErrorMessage(bS(a), "No base asset oracle data")
522- let dn = dg(dm._1, dm._2, dm._3)
523- let do = bS(b)
524- let dp = if (isDefined(do))
529+func dp () = {
530+ let dq = valueOrErrorMessage(bW(a), "No base asset oracle data")
531+ let dr = dk(dq._1, dq._2, dq._3)
532+ let ds = bW(b)
533+ let dt = if (isDefined(ds))
525534 then {
526- let dq = value(do)
527- dg(dq._1, dq._2, dq._3)
535+ let du = value(ds)
536+ dk(du._1, du._2, du._3)
528537 }
529- else au
530- aD(dn, dp)
538+ else av
539+ aG(dr, dt)
531540 }
532541
533542
534-func dr () = {
535- let dm = valueOrErrorMessage(bS(a), "No base asset oracle data")
536- let dh = dm._1
537- let bZ = dm._4
538- if ((bZ != ""))
543+func dv () = {
544+ let dq = valueOrErrorMessage(bW(a), "No base asset oracle data")
545+ let dl = dq._1
546+ let cd = dq._4
547+ if ((cd != ""))
539548 then {
540- let ds = valueOrErrorMessage(getBoolean(dh, bZ), ((("Can not get oracle is open/closed. Oracle: " + toString(dh)) + " key: ") + bZ))
541- !(ds)
549+ let dw = valueOrErrorMessage(getBoolean(dl, cd), ((("Can not get oracle is open/closed. Oracle: " + toString(dl)) + " key: ") + cd))
550+ !(dw)
542551 }
543552 else false
544553 }
545554
546555
547-func dt (du,cW,cY,cp,cq) = {
548- let dv = aD(aF(cW, cp), aF(cY, cq))
549- let dw = aD((du + dv), (2 * au))
550- let dt = aD(aI((du - dv)), dw)
551- dt
556+func dx (dy,da,dc,ct,cu) = {
557+ let dz = aG(aI(da, ct), aI(dc, cu))
558+ let dA = aG((dy + dz), (2 * av))
559+ let dx = aG(aL((dy - dz)), dA)
560+ dx
552561 }
553562
554563
555-func dx (cW,cY) = {
556- let dy = dl()
557- let cp = aX()
558- let cq = aY()
559- let dz = dt(dy, aV(), aW(), cp, cq)
560- let dA = dt(dy, cW, cY, cp, cq)
561- if (if ((dA > bm()))
562- then (dA > dz)
564+func dB (da,dc) = {
565+ let dC = dp()
566+ let ct = ba()
567+ let cu = bb()
568+ let dD = dx(dC, aY(), aZ(), ct, cu)
569+ let dE = dx(dC, da, dc, ct, cu)
570+ if (if ((dE > bp()))
571+ then (dE > dD)
563572 else false)
564- then throw(((("Price spread " + toString(dA)) + " > max price spread ") + toString(bm())))
573+ then throw(((("Price spread " + toString(dE)) + " > max price spread ") + toString(bp())))
565574 else true
566575 }
567576
568577
569-func dB (dC,dD) = {
570- let dE = bn()
571- if ((dC > dE))
572- then throw(((("Long open notional " + toString(dC)) + " > max open notional ") + toString(dE)))
573- else if ((dD > dE))
574- then throw(((("Short open notional " + toString(dD)) + " > max open notional ") + toString(dE)))
578+func dF (dG,dH) = {
579+ let dI = bq()
580+ if ((dG > dI))
581+ then throw(((("Long open notional " + toString(dG)) + " > max open notional ") + toString(dI)))
582+ else if ((dH > dI))
583+ then throw(((("Short open notional " + toString(dH)) + " > max open notional ") + toString(dI)))
575584 else true
576585 }
577586
578587
579-func dF () = {
580- let cW = aV()
581- let cY = aW()
582- let cp = aX()
583- let cq = aY()
584- aD(aF(cW, cp), aF(cY, cq))
588+func dJ () = {
589+ let da = aY()
590+ let dc = aZ()
591+ let ct = ba()
592+ let cu = bb()
593+ aG(aI(da, ct), aI(dc, cu))
585594 }
586595
587596
588-func dG () = {
589- let dy = dl()
590- let dH = dF()
591- (aD(aI((dy - dH)), dy) > bk())
597+func dK () = {
598+ let dC = dp()
599+ let dL = dJ()
600+ (aG(aL((dC - dL)), dC) > bn())
592601 }
593602
594603
595-func dI (bF,dJ,cW,cX,cY,cZ) = {
596- let dK = aI(bF)
597- let dL = (0 > bF)
598- let dM = if ((dJ == ax))
604+func dM (bJ,dN,da,db,dc,dd) = {
605+ let dO = aL(bJ)
606+ let dP = (0 > bJ)
607+ let dQ = if ((dN == ay))
599608 then {
600- let dN = cU(!(dL), dK, false, cW, cX, cY, cZ)._1
601- dN
609+ let dR = cY(!(dP), dO, false, da, db, dc, dd)._1
610+ dR
602611 }
603- else aF(dK, dl())
604- dM
612+ else aI(dO, dp())
613+ dQ
605614 }
606615
607616
608-func dO (bF,dP,cW,cX,cY,cZ,dJ) = if ((bF == 0))
617+func dS (bJ,dT,da,db,dc,dd,dN) = if ((bJ == 0))
609618 then throw("Invalid position size")
610619 else {
611- let dL = (0 > bF)
612- let dM = dI(bF, dJ, cW, cX, cY, cZ)
613- let dQ = if (dL)
614- then (dP - dM)
615- else (dM - dP)
616- $Tuple2(dM, dQ)
620+ let dP = (0 > bJ)
621+ let dQ = dM(bJ, dN, da, db, dc, dd)
622+ let dU = if (dP)
623+ then (dT - dQ)
624+ else (dQ - dT)
625+ $Tuple2(dQ, dU)
617626 }
618627
619628
620-func dR (bH,bI,dJ) = {
621- let dS = bG(bH, bI)
622- let bM = dS._1
623- let dT = dS._2
624- let dU = dS._3
625- let dV = dS._4
626- dO(bM, dU, aV(), aX(), aW(), aY(), dJ)
629+func dV (bL,bM,dN) = {
630+ let dW = bK(bL, bM)
631+ let bQ = dW._1
632+ let dX = dW._2
633+ let dY = dW._3
634+ let dZ = dW._4
635+ dS(bQ, dY, aY(), ba(), aZ(), bb(), dN)
627636 }
628637
629638
630-func dW (dX,dY,dZ) = aD((dX - dY), dZ)
639+func ea (eb,ec,ed) = aG((eb - ec), ed)
631640
632641
633-func ea (bH,bI,dJ) = {
634- let eb = bG(bH, bI)
635- let bM = eb._1
636- let dT = eb._2
637- let ec = eb._3
638- let ed = eb._4
639- let ee = eb._5
640- let ef = dR(bH, bI, dJ)
641- let dM = ef._1
642- let dQ = ef._2
643- let eg = cK(bM, dT, ed, ee, dQ)
644- let cS = eg._1
645- let cT = eg._2
646- dW(cS, cT, dM)
642+func ee (bL,bM,dN) = {
643+ let ef = bK(bL, bM)
644+ let bQ = ef._1
645+ let dX = ef._2
646+ let eg = ef._3
647+ let eh = ef._4
648+ let ei = ef._5
649+ let ej = dV(bL, bM, dN)
650+ let dQ = ej._1
651+ let dU = ej._2
652+ let ek = cO(bQ, dX, eh, ei, dU)
653+ let cW = ek._1
654+ let cX = ek._2
655+ ea(cW, cX, dQ)
647656 }
648657
649658
650-func eh (bH,bI) = ea(bH, bI, ax)
659+func el (bL,bM) = ee(bL, bM, ay)
651660
652661
653-func ei (bH,bF) = {
654- let ej = aJ(bj(), (au - aD(eh(bH, bN(bF)), bh())))
655- let ek = aF(aI(bF), ej)
656- let el = df((bF > 0), ek, false)
657- let em = el._1
658- let cD = el._7
659- if ((bl() > cD))
660- then ek
661- else aF(aI(bF), bj())
662+func em (bL,bJ) = {
663+ let en = aM(bm(), (av - aG(el(bL, bR(bJ)), bk())))
664+ let eo = aI(aL(bJ), en)
665+ let ep = dj((bJ > 0), eo, false)
666+ let eq = ep._1
667+ let cH = ep._7
668+ if ((bo() > cH))
669+ then eo
670+ else aI(aL(bJ), bm())
662671 }
663672
664673
665-func en (bH,bI,eo,ep,eq,er,cV,es) = {
666- let et = bG(bH, bI)
667- let eu = et._1
668- let ev = et._2
669- let ew = et._3
670- let ex = et._4
671- let ey = et._5
672- let ez = (eu > 0)
673- let eA = aI(eu)
674- if (if ((eA >= eo))
675- then (eo > 0)
674+func er (bL,bM,es,et,eu,ev,cZ,ew) = {
675+ let ex = bK(bL, bM)
676+ let ey = ex._1
677+ let ez = ex._2
678+ let eA = ex._3
679+ let eB = ex._4
680+ let eC = ex._5
681+ let eD = (ey > 0)
682+ let eE = aL(ey)
683+ if (if ((eE >= es))
684+ then (es > 0)
676685 else false)
677686 then {
678- let eB = (eA > eo)
679- let eC = df((eu > 0), eo, cV)
680- let eD = eC._1
681- let cs = eC._2
682- let ct = eC._3
683- let eE = eC._4
684- let eF = if ((eu > 0))
685- then -(eo)
686- else eo
687- let eG = dR(bH, bI, ax)
687+ let eF = (eE > es)
688+ let eG = dj((ey > 0), es, cZ)
688689 let eH = eG._1
689- let dQ = eG._2
690- let eI = aD(aI(eF), eA)
691- let eJ = aF(dQ, eI)
692- let eK = cK(eu, ev, ex, ey, dQ)
690+ let cw = eG._2
691+ let cx = eG._3
692+ let eI = eG._4
693+ let eJ = if ((ey > 0))
694+ then -(es)
695+ else es
696+ let eK = dV(bL, bM, ay)
693697 let eL = eK._1
694- let eM = eK._2
695- let eN = eK._3
696- let cJ = eK._4
697- let eO = cK(eu, ev, ex, ey, eJ)._2
698- let eP = aF(aF(eH, eI), ep)
699- let eQ = (dQ - eJ)
700- let eR = if ((eu > 0))
701- then ((eH - eD) - eQ)
702- else ((eQ + eH) - eD)
703- let eS = (eu + eF)
704- let eT = if ((eS == 0))
698+ let dU = eK._2
699+ let eM = aG(aL(eJ), eE)
700+ let eN = aI(dU, eM)
701+ let eO = cO(ey, ez, eB, eC, dU)
702+ let eP = eO._1
703+ let eQ = eO._2
704+ let eR = eO._3
705+ let cN = eO._4
706+ let eS = cO(ey, ez, eB, eC, eN)._2
707+ let eT = aI(aI(eL, eM), et)
708+ let eU = (dU - eN)
709+ let eV = if ((ey > 0))
710+ then ((eL - eH) - eU)
711+ else ((eU + eL) - eH)
712+ let eW = (ey + eJ)
713+ let eX = if ((eW == 0))
705714 then $Tuple2(0, 0)
706- else $Tuple2(aI(eR), bE(eS))
707- let eU = eT._1
708- let eV = eT._2
709- let eW = (ew - eU)
710- let eX = ea(bH, bI, ax)
711- let eY = if ((eu > 0))
712- then (aF((eU + eQ), eX) - eQ)
713- else (aF((eU - eQ), eX) - eQ)
714- let eZ = ((eL - (eY + eQ)) - eP)
715- let fa = if ((0 > eZ))
716- then if (es)
715+ else $Tuple2(aL(eV), bI(eW))
716+ let eY = eX._1
717+ let eZ = eX._2
718+ let fa = (eA - eY)
719+ let fb = ee(bL, bM, ay)
720+ let fc = if ((ey > 0))
721+ then (aI((eY + eU), fb) - eU)
722+ else (aI((eY - eU), fb) - eU)
723+ let fd = ((eP - (fc + eU)) - eT)
724+ let fe = if ((0 > fd))
725+ then if (ew)
717726 then 0
718727 else throw("Invalid internalClosePosition params: unable to pay fee")
719- else eZ
720- let fb = if (er)
721- then (eY + fa)
722- else eY
723- if (if ((eq != 0))
724- then (eq > eD)
728+ else fd
729+ let ff = if (ev)
730+ then (fc + fe)
731+ else fc
732+ if (if ((eu != 0))
733+ then (eu > eH)
725734 else false)
726- then throw(((("Limit error: " + toString(eD)) + " < ") + toString(eq)))
727- else $Tuple17(eS, fb, eU, eV, eO, eJ, if (if (er)
728- then eB
735+ then throw(((("Limit error: " + toString(eH)) + " < ") + toString(eu)))
736+ else $Tuple17(eW, ff, eY, eZ, eS, eN, if (if (ev)
737+ then eF
729738 else false)
730739 then 0
731- else fa, cs, ct, eE, (ba() - eW), (br() - (if (ez)
732- then aI(eF)
733- else 0)), (bq() - (if (!(ez))
734- then aI(eF)
735- else 0)), (bc() - (if (ez)
736- then eW
737- else 0)), (bb() - (if (!(ez))
738- then eW
739- else 0)), (eP + cJ), eD)
740+ else fe, cw, cx, eI, (bd() - fa), (bu() - (if (eD)
741+ then aL(eJ)
742+ else 0)), (bt() - (if (!(eD))
743+ then aL(eJ)
744+ else 0)), (bf() - (if (eD)
745+ then fa
746+ else 0)), (be() - (if (!(eD))
747+ then fa
748+ else 0)), (eT + cN), eH)
740749 }
741- else throw(((("Invalid internalClosePosition params: invalid position size: " + toString(eo)) + " max: ") + toString(eA)))
750+ else throw(((("Invalid internalClosePosition params: invalid position size: " + toString(es)) + " max: ") + toString(eE)))
742751 }
743752
744753
745-func fc () = {
746- let bF = aZ()
747- if ((bF == 0))
748- then $Tuple2(aV(), aW())
754+func fg () = {
755+ let bJ = bc()
756+ if ((bJ == 0))
757+ then $Tuple2(aY(), aZ())
749758 else {
750- let fd = (bF > 0)
751- let fe = df(fd, aI(bF), false)
752- let ff = fe._1
753- let fg = fe._2
754- let fh = fe._3
755- $Tuple2(fg, fh)
759+ let fh = (bJ > 0)
760+ let fi = dj(fh, aL(bJ), false)
761+ let fj = fi._1
762+ let fk = fi._2
763+ let fl = fi._3
764+ $Tuple2(fk, fl)
756765 }
757766 }
758767
759768
760-func fi (fj,aZ,fk,fl) = {
761- let fm = toBigInt(fj)
762- let fn = toBigInt(aZ)
763- let fo = toBigInt(fk)
764- let fp = toBigInt(fl)
765- let aL = aH(fo, fm)
766- let fq = (fm + fn)
767- let fr = aG(aL, fq)
768- let fs = aG(fr, fq)
769- let ft = aG(fp, fs)
770- toInt(ft)
769+func fm (fn,bc,fo,fp) = {
770+ let fq = toBigInt(fn)
771+ let fr = toBigInt(bc)
772+ let fs = toBigInt(fo)
773+ let ft = toBigInt(fp)
774+ let aO = aK(fs, fq)
775+ let fu = (fq + fr)
776+ let fv = aJ(aO, fu)
777+ let fw = aJ(fv, fu)
778+ let fx = aJ(ft, fw)
779+ toInt(fx)
771780 }
772781
773782
774-func fu (fv,ck,cl) = {
775- let bF = aZ()
776- if ((bF == 0))
783+func fy (fz,co,cp) = {
784+ let bJ = bc()
785+ if ((bJ == 0))
777786 then {
778- let fw = aD(aF(fv, cl), ck)
779- $Tuple3(fw, au, 0)
787+ let fA = aG(aI(fz, cp), co)
788+ $Tuple3(fA, av, 0)
780789 }
781790 else {
782- let fd = (bF > 0)
783- let ff = df(fd, aI(bF), false)._1
784- let fw = fi(cl, bF, ck, fv)
785- let fx = au
786- let fy = dO(bF, ff, ck, fw, cl, fx, ax)._2
787- $Tuple3(fw, fx, fy)
791+ let fh = (bJ > 0)
792+ let fj = dj(fh, aL(bJ), false)._1
793+ let fA = fm(cp, bJ, co, fz)
794+ let fB = av
795+ let fC = dS(bJ, fj, co, fA, cp, fB, ay)._2
796+ $Tuple3(fA, fB, fC)
788797 }
789798 }
790799
791800
792-func fz () = {
793- let fA = dl()
794- let fB = dF()
795- let fC = (fB - fA)
796- if (if (if ((bq() == 0))
801+func fD () = {
802+ let fE = dp()
803+ let fF = dJ()
804+ let fG = (fF - fE)
805+ if (if (dv())
797806 then true
798- else (br() == 0))
799- then true
800- else dr())
807+ else if ((by() == aA))
808+ then if ((bt() == 0))
809+ then true
810+ else (bu() == 0)
811+ else false)
801812 then $Tuple3(0, 0, 0)
802- else if ((0 > fC))
813+ else if ((0 > fG))
803814 then {
804- let fD = aD(aF(fC, bf()), aw)
805- if ((bv() == az))
815+ let fH = aG(aI(fG, bi()), ax)
816+ if ((by() == aA))
806817 then {
807- let fE = aD(aF(fD, bq()), br())
808- $Tuple3(fD, fE, 0)
818+ let fI = aG(aI(fH, bt()), bu())
819+ $Tuple3(fH, fI, 0)
809820 }
810821 else {
811- let fF = aI(aF(fD, bq()))
812- let fG = aI(aF(fD, br()))
813- let fH = (fF - fG)
814- $Tuple3(fD, fD, fH)
822+ let fJ = aL(aI(fH, bt()))
823+ let fK = aL(aI(fH, bu()))
824+ let fL = (fJ - fK)
825+ $Tuple3(fH, fH, fL)
815826 }
816827 }
817828 else {
818- let fE = aD(aF(fC, bf()), aw)
819- if ((bv() == az))
829+ let fI = aG(aI(fG, bi()), ax)
830+ if ((by() == aA))
820831 then {
821- let fD = aD(aF(fE, br()), bq())
822- $Tuple3(fD, fE, 0)
832+ let fH = aG(aI(fI, bu()), bt())
833+ $Tuple3(fH, fI, 0)
823834 }
824835 else {
825- let fG = aI(aF(fE, br()))
826- let fF = aI(aF(fE, bq()))
827- let fH = (fG - fF)
828- $Tuple3(fE, fE, fH)
836+ let fK = aL(aI(fI, bu()))
837+ let fJ = aL(aI(fI, bt()))
838+ let fL = (fK - fJ)
839+ $Tuple3(fI, fI, fL)
829840 }
830841 }
831842 }
832843
833844
834-func fI (fJ,fK) = {
835- let fL = aS()
836- let fM = aF(fL, fK)
837- let fN = if ((fJ != ""))
845+func fM (fN,fO) = {
846+ let fP = aV()
847+ let fQ = aI(fP, fO)
848+ let fR = if ((fN != ""))
838849 then {
839- let fO = aO(am(), ab(ao, fJ))
840- if ((fO == ap))
850+ let fS = aR(an(), ac(ap, fN))
851+ if ((fS == aq))
841852 then {
842- let fP = aQ(am(), ab(an, fJ))
843- let fQ = aF(fM, fP)
844- $Tuple2(fQ, true)
853+ let fT = aT(an(), ac(ao, fN))
854+ let fU = aI(fQ, fT)
855+ $Tuple2(fU, true)
845856 }
846857 else throw("Invalid attached artifact")
847858 }
848- else $Tuple2(fM, false)
849- let fQ = fN._1
850- let fR = fN._2
851- $Tuple2(fQ, fR)
859+ else $Tuple2(fQ, false)
860+ let fU = fR._1
861+ let fV = fR._2
862+ $Tuple2(fU, fV)
852863 }
853864
854865
855-func fS (bH,fJ) = {
856- let fT = invoke(aj(), "computeFeeDiscount", [bH], nil)
857- if ((fT == fT))
866+func fW (bL,fN) = {
867+ let fX = invoke(ak(), "computeFeeDiscount", [bL], nil)
868+ if ((fX == fX))
858869 then {
859- let fU = {
860- let bL = fT
861- if ($isInstanceOf(bL, "Int"))
870+ let fY = {
871+ let bP = fX
872+ if ($isInstanceOf(bP, "Int"))
862873 then {
863- let fV = bL
864- fV
874+ let fZ = bP
875+ fZ
865876 }
866877 else throw("Invalid computeFeeDiscount result")
867878 }
868- let fW = fI(fJ, fU)
869- let fQ = fW._1
870- let fR = fW._2
871- $Tuple2(fQ, fR)
879+ let ga = fM(fN, fY)
880+ let fU = ga._1
881+ let fV = ga._2
882+ $Tuple2(fU, fV)
872883 }
873884 else throw("Strict value is not equal to itself.")
874885 }
875886
876887
877-func fX (by) = {
878- let fY = if ((size(by.payments) > 1))
879- then toBase58String(valueOrErrorMessage(by.payments[1].assetId, "Invalid artifactId"))
888+func gb (bC) = {
889+ let gc = if ((size(bC.payments) > 1))
890+ then toBase58String(valueOrErrorMessage(bC.payments[1].assetId, "Invalid artifactId"))
880891 else ""
881- fY
892+ gc
882893 }
883894
884895
885-func fZ (ga) = {
886- let gb = aF(ga, bt())
887- let gc = (ga - gb)
888- $Tuple2(gb, gc)
896+func gd (ge) = {
897+ let gf = aI(ge, bw())
898+ let gg = (ge - gf)
899+ $Tuple2(gf, gg)
889900 }
890901
891902
892-func gd (ge,gf,gg,gh,ep,gi,gj,gk,gl,dE,gm,gn,go,gp) = [IntegerEntry(r, ge), IntegerEntry(s, gf), IntegerEntry(t, gg), IntegerEntry(q, gh), IntegerEntry(o, ep), IntegerEntry(v, gi), IntegerEntry(w, gj), IntegerEntry(u, gk), IntegerEntry(x, gl), IntegerEntry(y, dE), IntegerEntry(z, gm), IntegerEntry(A, gm), IntegerEntry(p, go), IntegerEntry(B, gp)]
903+func gh (gi,gj,gk,gl,et,gm,gn,go,gp,dI,gq,gr,gs,gt,gu) = [IntegerEntry(r, gi), IntegerEntry(s, gj), IntegerEntry(t, gk), IntegerEntry(q, gl), IntegerEntry(o, et), IntegerEntry(v, gm), IntegerEntry(w, gn), IntegerEntry(u, go), IntegerEntry(x, gp), IntegerEntry(y, dI), IntegerEntry(z, gq), IntegerEntry(A, gr), IntegerEntry(p, gs), IntegerEntry(B, gt), IntegerEntry(C, gu)]
893904
894905
895-func gq (gr,gs,gt,gu,gv) = [IntegerEntry(E, gr), IntegerEntry(C, gs), IntegerEntry(D, gt), IntegerEntry(F, gu), IntegerEntry(G, gv)]
906+func gv (gw,gx,gy,gz,gA) = [IntegerEntry(F, gw), IntegerEntry(D, gx), IntegerEntry(E, gy), IntegerEntry(G, gz), IntegerEntry(H, gA)]
896907
897908
898-func gw (gx,bH,bI) = {
899- let bJ = ((bH + "_") + toString(bI))
900- if (gx)
909+func gB (gC,bL,bM) = {
910+ let bN = ((bL + "_") + toString(bM))
911+ if (gC)
901912 then {
902- let gy = bs()
903-[IntegerEntry(ab(i, bJ), (gy + 1)), IntegerEntry(d, (gy + 1))]
913+ let gD = bv()
914+[IntegerEntry(ac(i, bN), (gD + 1)), IntegerEntry(d, (gD + 1))]
904915 }
905916 else nil
906917 }
907918
908919
909-func gz (gx,bH,bI,ep) = {
910- let bJ = ((bH + "_") + toString(bI))
911- if (gx)
912- then [IntegerEntry(ab(j, bJ), ep)]
920+func gE (gC,bL,bM,et) = {
921+ let bN = ((bL + "_") + toString(bM))
922+ if (gC)
923+ then [IntegerEntry(ac(j, bN), et)]
913924 else nil
914925 }
915926
916927
917-func gA (bH,eo,gB,gC,cP,gD) = {
918- let fd = bN(eo)
919- let bJ = ((bH + "_") + toString(fd))
920-[IntegerEntry(ab(e, bJ), eo), IntegerEntry(ab(f, bJ), gB), IntegerEntry(ab(g, bJ), gC), IntegerEntry(ab(h, bJ), cP), IntegerEntry(ab(k, bJ), gD)]
928+func gF (bL,es,gG,gH,cT,gI) = {
929+ let fh = bR(es)
930+ let bN = ((bL + "_") + toString(fh))
931+[IntegerEntry(ac(e, bN), es), IntegerEntry(ac(f, bN), gG), IntegerEntry(ac(g, bN), gH), IntegerEntry(ac(h, bN), cT), IntegerEntry(ac(k, bN), gI)]
921932 }
922933
923934
924-func gE (ck,cl) = [IntegerEntry(H, ck), IntegerEntry(I, cl)]
935+func gJ (co,cp) = if (if ((0 > co))
936+ then true
937+ else (0 > cp))
938+ then throw("Invalid amount to update reserves")
939+ else [IntegerEntry(I, co), IntegerEntry(J, cp)]
925940
926941
927-func gF (cp,cq) = [IntegerEntry(J, cp), IntegerEntry(K, cq)]
942+func gK (ct,cu) = [IntegerEntry(K, ct), IntegerEntry(L, cu)]
928943
929944
930-func gG (ck,cl,gH,gI,gJ,gK,gL,gM) = {
931- let cp = aX()
932- let cq = aY()
933- if (((gJ - gK) != gH))
934- then throw(((((("Invalid AMM state data: " + toString(gJ)) + " + ") + toString(gK)) + " != ") + toString(gH)))
935- else (gE(ck, cl) ++ [IntegerEntry(L, gH), IntegerEntry(O, gI), IntegerEntry(M, gJ), IntegerEntry(N, gK), IntegerEntry(Q, gL), IntegerEntry(P, gM)])
945+func gL (co,cp,gM,gN,gO,gP,gQ,gR) = {
946+ let ct = ba()
947+ let cu = bb()
948+ if (((gO - gP) != gM))
949+ then throw(((((("Invalid AMM state data: " + toString(gO)) + " + ") + toString(gP)) + " != ") + toString(gM)))
950+ else (gJ(co, cp) ++ [IntegerEntry(M, gM), IntegerEntry(P, gN), IntegerEntry(N, gO), IntegerEntry(O, gP), IntegerEntry(R, gQ), IntegerEntry(Q, gR)])
936951 }
937952
938953
939-func gN (bH,bI) = {
940- let bJ = ((bH + "_") + toString(bI))
941-[DeleteEntry(ab(e, bJ)), DeleteEntry(ab(f, bJ)), DeleteEntry(ab(g, bJ)), DeleteEntry(ab(h, bJ)), DeleteEntry(ab(j, bJ)), DeleteEntry(ab(k, bJ))]
954+func gS (bL,bM) = {
955+ let bN = ((bL + "_") + toString(bM))
956+[DeleteEntry(ac(e, bN)), DeleteEntry(ac(f, bN)), DeleteEntry(ac(g, bN)), DeleteEntry(ac(h, bN)), DeleteEntry(ac(j, bN)), DeleteEntry(ac(k, bN))]
942957 }
943958
944959
945-func gO (ad,gP) = {
946- let gQ = assetBalance(this, ag())
947- if ((gP > gQ))
948- then throw(((("Unable to withdraw " + toString(gP)) + " from contract balance ") + toString(gQ)))
949- else [ScriptTransfer(ad, gP, ag())]
960+func gT (ae,gU) = {
961+ let gV = assetBalance(this, ah())
962+ if ((gU > gV))
963+ then throw(((("Unable to withdraw " + toString(gU)) + " from contract balance ") + toString(gV)))
964+ else [ScriptTransfer(ae, gU, ah())]
950965 }
951966
952967
953-func gR (by) = if ((0 > by))
968+func gW (bC) = if ((0 > bC))
954969 then throw("Balance")
955- else [IntegerEntry(c, by)]
970+ else [IntegerEntry(c, bC)]
956971
957972
958-func gS (by) = [ScriptTransfer(ah(), by, ag())]
973+func gX (bC) = [ScriptTransfer(ai(), bC, ah())]
959974
960975
961-func gT (gU,by) = if (gU)
962- then [Burn(valueOrErrorMessage(by.payments[1].assetId, "Invalid artifact"), 1)]
976+func gY (gZ,bC) = if (gZ)
977+ then [Burn(valueOrErrorMessage(bC.payments[1].assetId, "Invalid artifact"), 1)]
963978 else nil
964979
965980
966-@Callable(by)
967-func pause () = if ((by.caller != af()))
981+@Callable(bC)
982+func pause () = if ((bC.caller != ag()))
968983 then throw("Invalid pause params")
969984 else [BooleanEntry(m, true)]
970985
971986
972987
973-@Callable(by)
974-func unpause () = if ((by.caller != af()))
988+@Callable(bC)
989+func unpause () = if ((bC.caller != ag()))
975990 then throw("Invalid unpause params")
976991 else [BooleanEntry(m, false)]
977992
978993
979994
980-@Callable(by)
981-func setCloseOnly () = if ((by.caller != af()))
995+@Callable(bC)
996+func setCloseOnly () = if ((bC.caller != ag()))
982997 then throw("Invalid setCloseOnly params")
983998 else [BooleanEntry(n, true)]
984999
9851000
9861001
987-@Callable(by)
988-func unsetCloseOnly () = if ((by.caller != af()))
1002+@Callable(bC)
1003+func unsetCloseOnly () = if ((bC.caller != ag()))
9891004 then throw("Invalid unsetCloseOnly params")
9901005 else [BooleanEntry(n, false)]
9911006
9921007
9931008
994-@Callable(by)
995-func addLiquidity (cf) = if (if ((by.caller != af()))
1009+@Callable(bC)
1010+func changeLiquidity (cj) = if (if ((bC.caller != ag()))
9961011 then true
997- else (0 >= cf))
998- then throw("Invalid addLiquidity params")
1012+ else (cj == 0))
1013+ then throw("Invalid changeLiquidity params")
9991014 else {
1000- let ck = aV()
1001- let cl = aW()
1002- let cp = aX()
1003- let cq = aY()
1004- let gV = aD(aF(ck, cp), aF(cl, cq))
1005- let gW = (ck + cf)
1006- let gX = (aD(aF(gW, cp), gV) - cl)
1007- let gY = (cl + gX)
1008- let gZ = fu(dl(), gW, gY)
1009- let ha = gZ._1
1010- let hb = gZ._2
1011- let fy = gZ._3
1012- let hc = if ((fy != 0))
1015+ let co = aY()
1016+ let cp = aZ()
1017+ let ct = ba()
1018+ let cu = bb()
1019+ let ha = aG(aI(co, ct), aI(cp, cu))
1020+ let hb = (co + cj)
1021+ let hc = (aG(aI(hb, ct), ha) - cp)
1022+ let hd = (cp + hc)
1023+ let he = fy(dp(), hb, hd)
1024+ let hf = he._1
1025+ let hg = he._2
1026+ let fC = he._3
1027+ let hh = if ((fC != 0))
10131028 then {
1014- let hc = invoke(ai(), "exchangeFreeAndLocked", [fy], nil)
1015- if ((hc == hc))
1029+ let hh = invoke(aj(), "exchangeFreeAndLocked", [fC], nil)
1030+ if ((hh == hh))
10161031 then nil
10171032 else throw("Strict value is not equal to itself.")
10181033 }
10191034 else nil
1020- if ((hc == hc))
1021- then (gE(gW, gY) ++ gF(ha, hb))
1035+ if ((hh == hh))
1036+ then (gJ(hb, hd) ++ gK(hf, hg))
10221037 else throw("Strict value is not equal to itself.")
10231038 }
10241039
10251040
10261041
1027-@Callable(by)
1028-func removeLiquidity (cf) = if (if ((by.caller != af()))
1029- then true
1030- else (cf >= 0))
1031- then throw("Invalid removeLiquidity params")
1032- else {
1033- let ck = aV()
1034- let cl = aW()
1035- let cp = aX()
1036- let cq = aY()
1037- let gV = aD(aF(ck, cp), aF(cl, cq))
1038- let gW = (ck - cf)
1039- let hd = aI((aD(aF(gW, cp), gV) - cl))
1040- let gY = (cl - hd)
1041- let he = fu(dl(), gW, gY)
1042- let ha = he._1
1043- let hb = he._2
1044- let fy = he._3
1045- let hc = if ((fy != 0))
1046- then {
1047- let hc = invoke(ai(), "exchangeFreeAndLocked", [fy], nil)
1048- if ((hc == hc))
1049- then nil
1050- else throw("Strict value is not equal to itself.")
1051- }
1052- else nil
1053- if ((hc == hc))
1054- then (gE(gW, gY) ++ gF(ha, hb))
1055- else throw("Strict value is not equal to itself.")
1056- }
1057-
1058-
1059-
1060-@Callable(by)
1061-func changeSettings (ge,gf,gg,gh,ep,gi,gj,gk,gl,dE,gm,gn,go,gp) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= gh))
1062- then true
1063- else (0 >= ge))
1064- then true
1065- else (0 >= gf))
1066- then true
1067- else (0 >= gg))
1068- then true
1069- else (0 >= ep))
1042+@Callable(bC)
1043+func changeSettings (gi,gj,gk,gl,et,gm,gn,go,gp,dI,gq,gr,gs,gt,gu) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= gl))
10701044 then true
10711045 else (0 >= gi))
10721046 then true
10741048 then true
10751049 else (0 >= gk))
10761050 then true
1077- else (0 >= gl))
1078- then true
1079- else (0 >= dE))
1051+ else (0 >= et))
10801052 then true
10811053 else (0 >= gm))
1082- then true
1083- else (gm > au))
10841054 then true
10851055 else (0 >= gn))
10861056 then true
10871057 else (0 >= go))
10881058 then true
1089- else if ((gp != aA))
1090- then (gp != az)
1059+ else (0 >= gp))
1060+ then true
1061+ else (0 >= dI))
1062+ then true
1063+ else (0 >= gq))
1064+ then true
1065+ else (gq > av))
1066+ then true
1067+ else (0 >= gr))
1068+ then true
1069+ else (0 >= gs))
1070+ then true
1071+ else if ((gt != aB))
1072+ then (gt != aA)
10911073 else false)
10921074 then true
1093- else !(ca()))
1075+ else if ((gu != aC))
1076+ then (gu != aD)
1077+ else false)
10941078 then true
1095- else (by.caller != af()))
1079+ else !(ce()))
1080+ then true
1081+ else (bC.caller != ag()))
10961082 then throw("Invalid changeSettings params")
1097- else gd(ge, gf, gg, gh, ep, gi, gj, gk, gl, dE, gm, gn, go, gp)
1083+ else gh(gi, gj, gk, gl, et, gm, gn, go, gp, dI, gq, gr, gs, gt, gu)
10981084
10991085
11001086
1101-@Callable(by)
1102-func initialize (ck,cl,gh,ge,gf,gg,ep,hf,hg,hh,gi,gj,gk,gl,dE,gm,gn,go,gp) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= ck))
1087+@Callable(bC)
1088+func initialize (co,cp,gl,gi,gj,gk,et,hi,hj,hk,gm,gn,go,gp,dI,gq,gr,gs,gt,gu) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= co))
11031089 then true
1104- else (0 >= cl))
1090+ else (0 >= cp))
11051091 then true
1106- else (0 >= gh))
1107- then true
1108- else (0 >= ge))
1109- then true
1110- else (0 >= gf))
1111- then true
1112- else (0 >= gg))
1113- then true
1114- else (0 >= ep))
1092+ else (0 >= gl))
11151093 then true
11161094 else (0 >= gi))
11171095 then true
11191097 then true
11201098 else (0 >= gk))
11211099 then true
1122- else (0 >= gl))
1123- then true
1124- else (0 >= dE))
1100+ else (0 >= et))
11251101 then true
11261102 else (0 >= gm))
1127- then true
1128- else (gm > au))
11291103 then true
11301104 else (0 >= gn))
11311105 then true
11321106 else (0 >= go))
11331107 then true
1134- else if ((gp != aA))
1135- then (gp != az)
1108+ else (0 >= gp))
1109+ then true
1110+ else (0 >= dI))
1111+ then true
1112+ else (0 >= gq))
1113+ then true
1114+ else (gq > av))
1115+ then true
1116+ else (0 > gr))
1117+ then true
1118+ else (0 >= gs))
1119+ then true
1120+ else if ((gt != aB))
1121+ then (gt != aA)
11361122 else false)
11371123 then true
1138- else ca())
1124+ else if ((gu != aC))
1125+ then (gu != aD)
1126+ else false)
11391127 then true
1140- else (by.caller != this))
1128+ else ce())
1129+ then true
1130+ else (bC.caller != this))
11411131 then throw("Invalid initialize parameters")
1142- else ((((gG(ck, cl, 0, 0, 0, 0, 0, 0) ++ gd(ge, gf, gg, gh, ep, gi, gj, gk, gl, dE, gm, gn, go, gp)) ++ gq((bw() + gh), 0, 0, 0, 0)) ++ gR(0)) ++ [BooleanEntry(l, true), StringEntry(a, hf), StringEntry(b, hg), StringEntry(S, toString(addressFromStringValue(hh)))])
1132+ else ((((gL(co, cp, 0, 0, 0, 0, 0, 0) ++ gh(gi, gj, gk, gl, et, gm, gn, go, gp, dI, gq, gr, gs, gt, gu)) ++ gv((bA() + gl), 0, 0, 0, 0)) ++ gW(0)) ++ [BooleanEntry(l, true), StringEntry(a, hi), StringEntry(b, hj), StringEntry(T, toString(addressFromStringValue(hk)))])
11431133
11441134
11451135
1146-@Callable(by)
1147-func increasePosition (bI,hi,hj,hk) = {
1148- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1149- if ((hl == hl))
1136+@Callable(bC)
1137+func increasePosition (bM,hl,hm,hn,ho) = {
1138+ let hp = invoke(this, "updateOracle", [ho], nil)
1139+ if ((hp == hp))
11501140 then {
1151- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1152- if ((hm == hm))
1141+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1142+ if ((hq == hq))
11531143 then {
1154- let bH = bx(by)
1155- let hn = by.payments[0].amount
1156- let ho = by.payments[0].assetId
1157- let hp = toBase58String(value(ho))
1158- let hq = (ho == ag())
1159- if (if (if (if (if (if (if (if (if ((bI != aq))
1160- then (bI != ar)
1161- else false)
1162- then true
1163- else (0 >= hn))
1164- then true
1165- else !(ca()))
1166- then true
1167- else !(hq))
1168- then true
1169- else !(bz(aD(au, hi), aU(), true)))
1170- then true
1171- else cb())
1172- then true
1173- else cc())
1174- then true
1175- else dr())
1176- then throw("Invalid increasePosition parameters")
1177- else {
1178- let hr = fS(bH, fX(by))
1179- let fQ = hr._1
1180- let fR = hr._2
1181- let gP = aD(hn, (aF(fQ, hi) + au))
1182- let hs = (hn - gP)
1183- let ht = invoke(al(), "acceptPaymentWithLink", [bH, hk], [AttachedPayment(ag(), hs)])
1184- if ((ht == ht))
1185- then {
1186- let hu = {
1187- let bL = ht
1188- if ($isInstanceOf(bL, "Int"))
1189- then {
1190- let fV = bL
1191- fV
1144+ let hr = invoke(this, "ensureCalledOnce", nil, nil)
1145+ if ((hr == hr))
1146+ then {
1147+ let bL = bB(bC)
1148+ let hs = bC.payments[0].amount
1149+ let ht = bC.payments[0].assetId
1150+ let hu = toBase58String(value(ht))
1151+ let hv = (ht == ah())
1152+ if (if (if (if (if (if (if (if (if ((bM != ar))
1153+ then (bM != as)
1154+ else false)
1155+ then true
1156+ else (0 >= hs))
1157+ then true
1158+ else !(ce()))
1159+ then true
1160+ else !(hv))
1161+ then true
1162+ else !(bD(aG(av, hl), aX(), true)))
1163+ then true
1164+ else cf())
1165+ then true
1166+ else cg())
1167+ then true
1168+ else dv())
1169+ then throw("Invalid increasePosition parameters")
1170+ else {
1171+ let hw = fW(bL, gb(bC))
1172+ let fU = hw._1
1173+ let fV = hw._2
1174+ let gU = aG(hs, (aI(fU, hl) + av))
1175+ let hx = (hs - gU)
1176+ let hy = invoke(am(), "acceptPaymentWithLink", [bL, hn], [AttachedPayment(ah(), hx)])
1177+ if ((hy == hy))
1178+ then {
1179+ let hz = {
1180+ let bP = hy
1181+ if ($isInstanceOf(bP, "Int"))
1182+ then {
1183+ let fZ = bP
1184+ fZ
1185+ }
1186+ else throw("Invalid referrerFee")
11921187 }
1193- else throw("Invalid referrerFee")
1194- }
1195- let hv = (hs - hu)
1196- let hw = bG(bH, bI)
1197- let eu = hw._1
1198- let ev = hw._2
1199- let ew = hw._3
1200- let ex = hw._4
1201- let ey = hw._5
1202- let hx = (eu == 0)
1203- let hy = if ((eu > 0))
1204- then (bI == aq)
1205- else (bI == ar)
1206- let hz = if (!(hx))
1207- then hy
1208- else false
1209- let hA = (bI == aq)
1210- let hB = if (if (hx)
1211- then true
1212- else hz)
1188+ let hA = (hx - hz)
1189+ let hB = bK(bL, bM)
1190+ let ey = hB._1
1191+ let ez = hB._2
1192+ let eA = hB._3
1193+ let eB = hB._4
1194+ let eC = hB._5
1195+ let hC = (ey == 0)
1196+ let hD = if ((ey > 0))
1197+ then (bM == ar)
1198+ else (bM == as)
1199+ let hE = if (!(hC))
1200+ then hD
1201+ else false
1202+ let hF = (bM == ar)
1203+ let hG = if (if (hC)
1204+ then true
1205+ else hE)
1206+ then {
1207+ let hH = aI(gU, hl)
1208+ let hI = cs(hF, hH)
1209+ let cz = hI._1
1210+ let cw = hI._2
1211+ let cx = hI._3
1212+ let eI = hI._4
1213+ if (if ((hm != 0))
1214+ then (hm > aL(cz))
1215+ else false)
1216+ then throw(((("Limit error: " + toString(aL(cz))) + " < ") + toString(hm)))
1217+ else {
1218+ let eW = (ey + cz)
1219+ let hJ = (bf() + (if ((eW > 0))
1220+ then hH
1221+ else 0))
1222+ let hK = (be() + (if ((0 > eW))
1223+ then hH
1224+ else 0))
1225+ let hL = cO(ey, ez, eB, eC, gU)
1226+ let cW = hL._1
1227+ let eQ = hL._2
1228+ let eR = hL._3
1229+ let cN = hL._4
1230+ if (!(dB(cw, cx)))
1231+ then throw("Over max spread limit")
1232+ else if (!(dF(hJ, hK)))
1233+ then throw("Over max open notional")
1234+ else $Tuple14(eW, cW, (eA + hH), bI(eW), bA(), cx, cw, eI, (bd() + hH), (bu() + (if ((eW > 0))
1235+ then aL(cz)
1236+ else 0)), (bt() + (if ((0 > eW))
1237+ then aL(cz)
1238+ else 0)), hJ, hK, cN)
1239+ }
1240+ }
1241+ else {
1242+ let hH = aI(gU, hl)
1243+ let hM = dV(toString(bC.caller), bM, ay)
1244+ let eL = hM._1
1245+ let dU = hM._2
1246+ if ((eL > hH))
1247+ then throw("Use decreasePosition to decrease position size")
1248+ else throw("Close position first")
1249+ }
1250+ let eW = hG._1
1251+ let hN = hG._2
1252+ let eY = hG._3
1253+ let hO = hG._4
1254+ let hP = hG._5
1255+ let cx = hG._6
1256+ let cw = hG._7
1257+ let eI = hG._8
1258+ let hQ = hG._9
1259+ let hR = hG._10
1260+ let hS = hG._11
1261+ let hJ = hG._12
1262+ let hK = hG._13
1263+ let cN = hG._14
1264+ let hT = gd((hA + cN))
1265+ let gf = hT._1
1266+ let gg = hT._2
1267+ let hU = if ((gU >= cN))
1268+ then invoke(aj(), "addLocked", nil, [AttachedPayment(ah(), (gU - cN))])
1269+ else invoke(aj(), "withdrawLocked", [(cN - gU)], nil)
1270+ if ((hU == hU))
1271+ then {
1272+ let hV = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gg)])
1273+ if ((hV == hV))
1274+ then {
1275+ let hW = invoke(ak(), "notifyFees", [bL, hA], nil)
1276+ if ((hW == hW))
1277+ then {
1278+ let hX = invoke(ak(), "notifyNotional", [bL, eY], nil)
1279+ if ((hX == hX))
1280+ then ((((((gF(bL, eW, hN, eY, hO, hP) ++ gB(hC, bL, bM)) ++ gE(hC, bL, bM, fU)) ++ gL(cw, cx, eI, hQ, hR, hS, hJ, hK)) ++ gX(gf)) ++ gW(((aU() + gU) - cN))) ++ gY(fV, bC))
1281+ else throw("Strict value is not equal to itself.")
1282+ }
1283+ else throw("Strict value is not equal to itself.")
1284+ }
1285+ else throw("Strict value is not equal to itself.")
1286+ }
1287+ else throw("Strict value is not equal to itself.")
1288+ }
1289+ else throw("Strict value is not equal to itself.")
1290+ }
1291+ }
1292+ else throw("Strict value is not equal to itself.")
1293+ }
1294+ else throw("Strict value is not equal to itself.")
1295+ }
1296+ else throw("Strict value is not equal to itself.")
1297+ }
1298+
1299+
1300+
1301+@Callable(bC)
1302+func addMargin (bM,ho) = {
1303+ let hp = invoke(this, "updateOracle", [ho], nil)
1304+ if ((hp == hp))
1305+ then {
1306+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1307+ if ((hq == hq))
1308+ then {
1309+ let hr = invoke(this, "ensureCalledOnce", nil, nil)
1310+ if ((hr == hr))
1311+ then {
1312+ let bL = toString(bC.caller)
1313+ let gU = bC.payments[0].amount
1314+ let ht = bC.payments[0].assetId
1315+ let hu = toBase58String(value(ht))
1316+ let hv = (ht == ah())
1317+ if (if (if (if (if (!(hv))
1318+ then true
1319+ else !(bV(toString(bC.caller), bM)))
1320+ then true
1321+ else !(ce()))
1322+ then true
1323+ else cf())
1324+ then true
1325+ else dv())
1326+ then throw("Invalid addMargin parameters")
1327+ else {
1328+ let hY = bK(bL, bM)
1329+ let ey = hY._1
1330+ let ez = hY._2
1331+ let eA = hY._3
1332+ let eB = hY._4
1333+ let eC = hY._5
1334+ let hU = invoke(aj(), "addLocked", nil, [AttachedPayment(ah(), gU)])
1335+ if ((hU == hU))
12131336 then {
1214- let hC = aF(gP, hi)
1215- let hD = co(hA, hC)
1216- let cv = hD._1
1217- let cs = hD._2
1218- let ct = hD._3
1219- let eE = hD._4
1220- if (if ((hj != 0))
1221- then (hj > aI(cv))
1222- else false)
1223- then throw(((("Limit error: " + toString(aI(cv))) + " < ") + toString(hj)))
1337+ let cN = cJ(ez, eC)
1338+ let hZ = if ((cN > 0))
1339+ then {
1340+ let ia = gd(cN)
1341+ let gf = ia._1
1342+ let gg = ia._2
1343+ let ib = invoke(aj(), "withdrawLocked", [gf], nil)
1344+ if ((ib == ib))
1345+ then {
1346+ let ic = invoke(aj(), "exchangeFreeAndLocked", [-(gg)], nil)
1347+ if ((ic == ic))
1348+ then gX(gf)
1349+ else throw("Strict value is not equal to itself.")
1350+ }
1351+ else throw("Strict value is not equal to itself.")
1352+ }
1353+ else nil
1354+ if ((hZ == hZ))
1355+ then ((gF(bL, ey, ((ez - cN) + gU), eA, eB, bA()) ++ gW(((aU() + gU) - cN))) ++ hZ)
1356+ else throw("Strict value is not equal to itself.")
1357+ }
1358+ else throw("Strict value is not equal to itself.")
1359+ }
1360+ }
1361+ else throw("Strict value is not equal to itself.")
1362+ }
1363+ else throw("Strict value is not equal to itself.")
1364+ }
1365+ else throw("Strict value is not equal to itself.")
1366+ }
1367+
1368+
1369+
1370+@Callable(bC)
1371+func removeMargin (gU,bM,ho) = {
1372+ let hp = invoke(this, "updateOracle", [ho], nil)
1373+ if ((hp == hp))
1374+ then {
1375+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1376+ if ((hq == hq))
1377+ then {
1378+ let hr = invoke(this, "ensureCalledOnce", nil, nil)
1379+ if ((hr == hr))
1380+ then {
1381+ let bL = toString(bC.caller)
1382+ if (if (if (if (if ((0 >= gU))
1383+ then true
1384+ else !(bV(bL, bM)))
1385+ then true
1386+ else !(ce()))
1387+ then true
1388+ else cf())
1389+ then true
1390+ else dv())
1391+ then throw("Invalid removeMargin parameters")
1392+ else {
1393+ let id = bK(bL, bM)
1394+ let ey = id._1
1395+ let ez = id._2
1396+ let eA = id._3
1397+ let eB = id._4
1398+ let eC = id._5
1399+ let ie = cO(ey, ez, eB, eC, -(gU))
1400+ let cW = ie._1
1401+ let cX = ie._2
1402+ let cS = ie._3
1403+ let cN = ie._4
1404+ if ((cX != 0))
1405+ then throw("Invalid removed margin amount")
1406+ else {
1407+ let fb = ea(cW, cX, eA)
1408+ if (!(bD(fb, aX(), true)))
1409+ then throw(((("Too much margin removed: " + toString(fb)) + " < ") + toString(aX())))
12241410 else {
1225- let eS = (eu + cv)
1226- let hE = (bc() + (if ((eS > 0))
1227- then hC
1228- else 0))
1229- let hF = (bb() + (if ((0 > eS))
1230- then hC
1231- else 0))
1232- let hG = cK(eu, ev, ex, ey, gP)
1233- let cS = hG._1
1234- let eM = hG._2
1235- let eN = hG._3
1236- let cJ = hG._4
1237- if (!(dx(cs, ct)))
1238- then throw("Over max spread limit")
1239- else if (!(dB(hE, hF)))
1240- then throw("Over max open notional")
1241- else $Tuple14(eS, cS, (ew + hC), bE(eS), bw(), ct, cs, eE, (ba() + hC), (br() + (if ((eS > 0))
1242- then aI(cv)
1243- else 0)), (bq() + (if ((0 > eS))
1244- then aI(cv)
1245- else 0)), hE, hF, cJ)
1411+ let if = gd(cN)
1412+ let gf = if._1
1413+ let gg = if._2
1414+ let hZ = if ((cN > 0))
1415+ then {
1416+ let ic = invoke(aj(), "exchangeFreeAndLocked", [-(gg)], nil)
1417+ if ((ic == ic))
1418+ then gX(gf)
1419+ else throw("Strict value is not equal to itself.")
1420+ }
1421+ else nil
1422+ if ((hZ == hZ))
1423+ then {
1424+ let ib = invoke(aj(), "withdrawLocked", [(gU + gf)], nil)
1425+ if ((ib == ib))
1426+ then (((gF(bL, ey, cW, eA, bI(ey), bA()) ++ gT(bC.caller, gU)) ++ gW(((aU() - gU) - cN))) ++ hZ)
1427+ else throw("Strict value is not equal to itself.")
1428+ }
1429+ else throw("Strict value is not equal to itself.")
12461430 }
12471431 }
1248- else {
1249- let hC = aF(gP, hi)
1250- let hH = dR(toString(by.caller), bI, ax)
1251- let eH = hH._1
1252- let dQ = hH._2
1253- if ((eH > hC))
1254- then throw("Use decreasePosition to decrease position size")
1255- else throw("Close position first")
1256- }
1257- let eS = hB._1
1258- let hI = hB._2
1259- let eU = hB._3
1260- let hJ = hB._4
1261- let hK = hB._5
1262- let ct = hB._6
1263- let cs = hB._7
1264- let eE = hB._8
1265- let hL = hB._9
1266- let hM = hB._10
1267- let hN = hB._11
1268- let hE = hB._12
1269- let hF = hB._13
1270- let cJ = hB._14
1271- let hO = fZ((hv + cJ))
1272- let gb = hO._1
1273- let gc = hO._2
1274- let hP = if ((gP >= cJ))
1275- then invoke(ai(), "addLocked", nil, [AttachedPayment(ag(), (gP - cJ))])
1276- else invoke(ai(), "withdrawLocked", [(cJ - gP)], nil)
1277- if ((hP == hP))
1432+ }
1433+ }
1434+ else throw("Strict value is not equal to itself.")
1435+ }
1436+ else throw("Strict value is not equal to itself.")
1437+ }
1438+ else throw("Strict value is not equal to itself.")
1439+ }
1440+
1441+
1442+
1443+@Callable(bC)
1444+func closePosition (es,bM,eu,ev,ho) = {
1445+ let hp = invoke(this, "updateOracle", [ho], nil)
1446+ if ((hp == hp))
1447+ then {
1448+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1449+ if ((hq == hq))
1450+ then {
1451+ let hr = invoke(this, "ensureCalledOnce", nil, nil)
1452+ if ((hr == hr))
1453+ then {
1454+ let bL = bB(bC)
1455+ let ig = valueOrErrorMessage(addressFromString(bL), "Invalid caller")
1456+ let bU = bS(bL, bM)
1457+ if (if (if (if (if (if (!(bV(bL, bM)))
1458+ then true
1459+ else !(ce()))
1460+ then true
1461+ else cf())
1462+ then true
1463+ else (0 >= es))
1464+ then true
1465+ else (0 > eu))
1466+ then true
1467+ else dv())
1468+ then throw("Invalid closePosition parameters")
1469+ else {
1470+ let eC = bK(bL, bM)._5
1471+ let ih = er(bL, bM, es, bU, eu, ev, true, true)
1472+ let eW = ih._1
1473+ let ff = ih._2
1474+ let eY = ih._3
1475+ let eZ = ih._4
1476+ let eS = ih._5
1477+ let eN = ih._6
1478+ let fe = ih._7
1479+ let cw = ih._8
1480+ let cx = ih._9
1481+ let eI = ih._10
1482+ let hQ = ih._11
1483+ let hR = ih._12
1484+ let hS = ih._13
1485+ let hJ = ih._14
1486+ let hK = ih._15
1487+ let ii = ih._16
1488+ if ((eS > 0))
1489+ then throw("Invalid closePosition parameters: bad debt")
1490+ else if ((eC >= bA()))
1491+ then throw("Invalid closePosition parameters: wait at least 1 block before closing the position")
1492+ else {
1493+ let eF = (eW != 0)
1494+ let ij = (fe + ii)
1495+ let ik = (aU() - ij)
1496+ let il = if ((0 > ik))
1497+ then 0
1498+ else ik
1499+ let ib = invoke(aj(), "withdrawLocked", [ij], nil)
1500+ if ((ib == ib))
1501+ then {
1502+ let hy = invoke(am(), "acceptPayment", [bL], [AttachedPayment(ah(), ii)])
1503+ if ((hy == hy))
1504+ then {
1505+ let hz = {
1506+ let bP = hy
1507+ if ($isInstanceOf(bP, "Int"))
1508+ then {
1509+ let fZ = bP
1510+ fZ
1511+ }
1512+ else throw("Invalid referrerFee")
1513+ }
1514+ let im = gd((ii - hz))
1515+ let gf = im._1
1516+ let gg = im._2
1517+ let hV = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gg)])
1518+ if ((hV == hV))
1519+ then {
1520+ let hW = invoke(ak(), "notifyFees", [bL, ii], nil)
1521+ if ((hW == hW))
1522+ then {
1523+ let hX = invoke(ak(), "notifyNotional", [bL, eY], nil)
1524+ if ((hX == hX))
1525+ then (((((if (eF)
1526+ then gF(bL, eW, ff, eY, eZ, bA())
1527+ else gS(bL, bM)) ++ gL(cw, cx, eI, hQ, hR, hS, hJ, hK)) ++ (if ((fe > 0))
1528+ then gT(ig, fe)
1529+ else nil)) ++ gW(il)) ++ gX(gf))
1530+ else throw("Strict value is not equal to itself.")
1531+ }
1532+ else throw("Strict value is not equal to itself.")
1533+ }
1534+ else throw("Strict value is not equal to itself.")
1535+ }
1536+ else throw("Strict value is not equal to itself.")
1537+ }
1538+ else throw("Strict value is not equal to itself.")
1539+ }
1540+ }
1541+ }
1542+ else throw("Strict value is not equal to itself.")
1543+ }
1544+ else throw("Strict value is not equal to itself.")
1545+ }
1546+ else throw("Strict value is not equal to itself.")
1547+ }
1548+
1549+
1550+
1551+@Callable(bC)
1552+func liquidate (bL,bM,ho) = {
1553+ let hp = invoke(this, "updateOracle", [ho], nil)
1554+ if ((hp == hp))
1555+ then {
1556+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1557+ if ((hq == hq))
1558+ then {
1559+ let in = ee(bL, bM, ay)
1560+ let io = if (dK())
1561+ then {
1562+ let ip = ee(bL, bM, az)
1563+ aM(in, ip)
1564+ }
1565+ else in
1566+ if (if (if (if (if (!(bD(io, bk(), false)))
1567+ then true
1568+ else !(bV(bL, bM)))
1569+ then true
1570+ else !(ce()))
1571+ then true
1572+ else cf())
1573+ then true
1574+ else dv())
1575+ then throw("Unable to liquidate")
1576+ else {
1577+ let iq = if (if ((in > bl()))
1578+ then (bm() > 0)
1579+ else false)
1580+ then (av > bm())
1581+ else false
1582+ let ey = bK(bL, bM)._1
1583+ let dO = aL(ey)
1584+ let ir = if (iq)
1585+ then {
1586+ let is = em(bL, ey)
1587+ let it = aG(aL(is), dO)
1588+ $Tuple2(it, aL(is))
1589+ }
1590+ else $Tuple2(0, dO)
1591+ let it = ir._1
1592+ let is = ir._2
1593+ let iu = er(bL, bM, if (iq)
1594+ then is
1595+ else dO, bl(), 0, true, false, true)
1596+ let eW = iu._1
1597+ let ff = iu._2
1598+ let eY = iu._3
1599+ let eZ = iu._4
1600+ let eS = iu._5
1601+ let eN = iu._6
1602+ let fe = iu._7
1603+ let cw = iu._8
1604+ let cx = iu._9
1605+ let eI = iu._10
1606+ let hQ = iu._11
1607+ let hR = iu._12
1608+ let hS = iu._13
1609+ let hJ = iu._14
1610+ let hK = iu._15
1611+ let iv = iu._16
1612+ let iw = (iv / 2)
1613+ let gg = (iv - iw)
1614+ let ik = (aU() - iv)
1615+ let ix = if ((0 > ik))
1616+ then 0
1617+ else ik
1618+ let ic = if ((eS > 0))
1619+ then {
1620+ let ic = invoke(aj(), "exchangeFreeAndLocked", [(eS + iv)], nil)
1621+ if ((ic == ic))
1622+ then nil
1623+ else throw("Strict value is not equal to itself.")
1624+ }
1625+ else nil
1626+ if ((ic == ic))
1627+ then {
1628+ let ib = invoke(aj(), "withdrawLocked", [iv], nil)
1629+ if ((ib == ib))
12781630 then {
1279- let hQ = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1280- if ((hQ == hQ))
1631+ let iy = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gg)])
1632+ if ((iy == iy))
12811633 then {
1282- let hR = invoke(aj(), "notifyFees", [bH, hv], nil)
1283- if ((hR == hR))
1284- then {
1285- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1286- if ((hS == hS))
1287- then ((((((gA(bH, eS, hI, eU, hJ, hK) ++ gw(hx, bH, bI)) ++ gz(hx, bH, bI, fQ)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ gS(gb)) ++ gR(((aR() + gP) - cJ))) ++ gT(fR, by))
1288- else throw("Strict value is not equal to itself.")
1289- }
1634+ let hX = invoke(ak(), "notifyNotional", [bL, eY], nil)
1635+ if ((hX == hX))
1636+ then ((((if (iq)
1637+ then gF(bL, eW, ff, eY, eZ, bA())
1638+ else gS(bL, bM)) ++ gL(cw, cx, eI, hQ, hR, hS, hJ, hK)) ++ gT(bC.caller, iw)) ++ gW(ix))
12901639 else throw("Strict value is not equal to itself.")
12911640 }
12921641 else throw("Strict value is not equal to itself.")
13031652
13041653
13051654
1306-@Callable(by)
1307-func addMargin (bI) = {
1308- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1309- if ((hl == hl))
1655+@Callable(bC)
1656+func payFunding (ho) = {
1657+ let hp = invoke(this, "updateOracle", [ho], nil)
1658+ if ((hp == hp))
13101659 then {
1311- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1312- if ((hm == hm))
1660+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1661+ if ((hq == hq))
13131662 then {
1314- let bH = toString(by.caller)
1315- let gP = by.payments[0].amount
1316- let ho = by.payments[0].assetId
1317- let hp = toBase58String(value(ho))
1318- let hq = (ho == ag())
1319- if (if (if (if (if (!(hq))
1663+ let iz = bg()
1664+ if (if (if ((iz > bA()))
13201665 then true
1321- else !(bR(toString(by.caller), bI)))
1666+ else !(ce()))
13221667 then true
1323- else !(ca()))
1324- then true
1325- else cb())
1326- then true
1327- else dr())
1328- then throw("Invalid addMargin parameters")
1668+ else cf())
1669+ then throw(((("Invalid funding block timestamp: " + toString(bA())) + " < ") + toString(iz)))
13291670 else {
1330- let hT = bG(bH, bI)
1331- let eu = hT._1
1332- let ev = hT._2
1333- let ew = hT._3
1334- let ex = hT._4
1335- let ey = hT._5
1336- let hP = invoke(ai(), "addLocked", nil, [AttachedPayment(ag(), gP)])
1337- if ((hP == hP))
1671+ let fE = dp()
1672+ let iA = fD()
1673+ let fH = iA._1
1674+ let fI = iA._2
1675+ let fL = iA._3
1676+ let iB = if ((fL > 0))
13381677 then {
1339- let cJ = cF(ev, ey)
1340- let hU = if ((cJ > 0))
1341- then {
1342- let hV = fZ(cJ)
1343- let gb = hV._1
1344- let gc = hV._2
1345- let hW = invoke(ai(), "withdrawLocked", [gb], nil)
1346- if ((hW == hW))
1347- then {
1348- let hX = invoke(ai(), "exchangeFreeAndLocked", [-(gc)], nil)
1349- if ((hX == hX))
1350- then gS(gb)
1351- else throw("Strict value is not equal to itself.")
1352- }
1353- else throw("Strict value is not equal to itself.")
1354- }
1355- else nil
1356- if ((hU == hU))
1357- then ((gA(bH, eu, ((ev - cJ) + gP), ew, ex, bw()) ++ gR(((aR() + gP) - cJ))) ++ hU)
1678+ let iB = invoke(aj(), "exchangeFreeAndLocked", [-(fL)], nil)
1679+ if ((iB == iB))
1680+ then nil
13581681 else throw("Strict value is not equal to itself.")
13591682 }
1683+ else nil
1684+ if ((iB == iB))
1685+ then gv((iz + bj()), (br() + fI), (bs() + fH), aG(fI, fE), aG(fH, fE))
13601686 else throw("Strict value is not equal to itself.")
13611687 }
13621688 }
13671693
13681694
13691695
1370-@Callable(by)
1371-func removeMargin (gP,bI) = {
1372- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1373- if ((hl == hl))
1696+@Callable(bC)
1697+func updateOracle (ho) = if ((bz() == aC))
1698+ then nil
1699+ else {
1700+ let iC = split_4C(ho, "::")
1701+ let dq = valueOrErrorMessage(bW(a), "No base asset oracle data")
1702+ let iD = dq._1
1703+ let iE = invoke(iD, "updateData", [iC[0]], nil)
1704+ if ((iE == iE))
1705+ then {
1706+ let ds = bW(b)
1707+ let iF = if (isDefined(ds))
1708+ then {
1709+ let du = value(ds)
1710+ let iG = du._1
1711+ let iF = invoke(iG, "updateData", [iC[1]], nil)
1712+ if ((iF == iF))
1713+ then nil
1714+ else throw("Strict value is not equal to itself.")
1715+ }
1716+ else nil
1717+ if ((iF == iF))
1718+ then nil
1719+ else throw("Strict value is not equal to itself.")
1720+ }
1721+ else throw("Strict value is not equal to itself.")
1722+ }
1723+
1724+
1725+
1726+@Callable(bC)
1727+func syncTerminalPriceToOracle () = {
1728+ let co = aY()
1729+ let cp = aZ()
1730+ let iH = fy(dp(), co, cp)
1731+ let hf = iH._1
1732+ let hg = iH._2
1733+ let fC = iH._3
1734+ let iI = if (if ((0 > fC))
1735+ then (aL(fC) > aU())
1736+ else false)
1737+ then -(aU())
1738+ else fC
1739+ let hh = if ((iI != 0))
13741740 then {
1375- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1376- if ((hm == hm))
1741+ let hh = invoke(aj(), "exchangeFreeAndLocked", [iI], nil)
1742+ if ((hh == hh))
1743+ then nil
1744+ else throw("Strict value is not equal to itself.")
1745+ }
1746+ else nil
1747+ if ((hh == hh))
1748+ then (gW((aU() + iI)) ++ gK(hf, hg))
1749+ else throw("Strict value is not equal to itself.")
1750+ }
1751+
1752+
1753+
1754+@Callable(bC)
1755+func ensureCalledOnce () = if ((bC.caller != this))
1756+ then throw("Invalid saveCurrentTxId parameters")
1757+ else {
1758+ let iJ = toBase58String(bC.transactionId)
1759+ let iK = valueOrElse(getString(this, S), "")
1760+ if ((iK != iJ))
1761+ then [StringEntry(S, iJ)]
1762+ else throw("Can not call vAMM methods twice in one tx")
1763+ }
1764+
1765+
1766+
1767+@Callable(bC)
1768+func migratePosition (bL) = {
1769+ let bO = getInteger(this, ac(e, bL))
1770+ if (if (isDefined(bO))
1771+ then isDefined(addressFromString(bL))
1772+ else false)
1773+ then {
1774+ let iL = getIntegerValue(this, ac(e, bL))
1775+ let iM = getIntegerValue(this, ac(f, bL))
1776+ let iN = getIntegerValue(this, ac(g, bL))
1777+ let iO = getIntegerValue(this, ac(h, bL))
1778+ let iP = valueOrElse(getInteger(this, ac(k, bL)), lastBlock.timestamp)
1779+ let iQ = valueOrElse(getInteger(this, ac(j, bL)), aV())
1780+ let iR = getIntegerValue(this, ac(i, bL))
1781+ let iS = bR(iL)
1782+ let bN = ((bL + "_") + toString(iS))
1783+[DeleteEntry(ac(e, bL)), DeleteEntry(ac(f, bL)), DeleteEntry(ac(g, bL)), DeleteEntry(ac(h, bL)), DeleteEntry(ac(k, bL)), DeleteEntry(ac(j, bL)), DeleteEntry(ac(i, bL)), IntegerEntry(ac(e, bN), iL), IntegerEntry(ac(f, bN), iM), IntegerEntry(ac(g, bN), iN), IntegerEntry(ac(h, bN), iO), IntegerEntry(ac(k, bN), iP), IntegerEntry(ac(j, bN), iQ), IntegerEntry(ac(i, bN), iR)]
1784+ }
1785+ else throw(("Nothing to migrate for " + bL))
1786+ }
1787+
1788+
1789+
1790+@Callable(bC)
1791+func view_calcRemainMarginWithFundingPayment (bL,bM,ho) = {
1792+ let hp = invoke(this, "updateOracle", [ho], nil)
1793+ if ((hp == hp))
1794+ then {
1795+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1796+ if ((hq == hq))
13771797 then {
1378- let bH = toString(by.caller)
1379- if (if (if (if (if ((0 >= gP))
1380- then true
1381- else !(bR(bH, bI)))
1382- then true
1383- else !(ca()))
1384- then true
1385- else cb())
1386- then true
1387- else dr())
1388- then throw("Invalid removeMargin parameters")
1389- else {
1390- let hY = bG(bH, bI)
1391- let eu = hY._1
1392- let ev = hY._2
1393- let ew = hY._3
1394- let ex = hY._4
1395- let ey = hY._5
1396- let hZ = cK(eu, ev, ex, ey, -(gP))
1397- let cS = hZ._1
1398- let cT = hZ._2
1399- let cO = hZ._3
1400- let cJ = hZ._4
1401- if ((cT != 0))
1402- then throw("Invalid removed margin amount")
1403- else {
1404- let eX = dW(cS, cT, ew)
1405- if (!(bz(eX, aU(), true)))
1406- then throw(((("Too much margin removed: " + toString(eX)) + " < ") + toString(aU())))
1407- else {
1408- let ia = fZ(cJ)
1409- let gb = ia._1
1410- let gc = ia._2
1411- let hU = if ((cJ > 0))
1412- then {
1413- let hX = invoke(ai(), "exchangeFreeAndLocked", [-(gc)], nil)
1414- if ((hX == hX))
1415- then gS(gb)
1416- else throw("Strict value is not equal to itself.")
1417- }
1418- else nil
1419- if ((hU == hU))
1420- then {
1421- let hW = invoke(ai(), "withdrawLocked", [(gP + gb)], nil)
1422- if ((hW == hW))
1423- then (((gA(bH, eu, cS, ew, bE(eu), bw()) ++ gO(by.caller, gP)) ++ gR(((aR() - gP) - cJ))) ++ hU)
1424- else throw("Strict value is not equal to itself.")
1425- }
1426- else throw("Strict value is not equal to itself.")
1427- }
1428- }
1429- }
1798+ let iT = bK(bL, bM)
1799+ let bQ = iT._1
1800+ let dX = iT._2
1801+ let eg = iT._3
1802+ let dZ = iT._4
1803+ let ei = iT._5
1804+ let iU = dV(bL, bM, ay)
1805+ let dQ = iU._1
1806+ let dU = iU._2
1807+ let iV = cO(bQ, dX, dZ, ei, dU)
1808+ let cW = iV._1
1809+ let cX = iV._2
1810+ let cS = iV._3
1811+ let cN = iV._4
1812+ throw(((((((aE(cW) + aE(cS)) + aE(el(bL, bM))) + aE(dU)) + aE(cX)) + aE(dQ)) + aE(cN)))
14301813 }
14311814 else throw("Strict value is not equal to itself.")
14321815 }
14351818
14361819
14371820
1438-@Callable(by)
1439-func closePosition (eo,bI,eq,er) = {
1440- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1441- if ((hl == hl))
1821+@Callable(bC)
1822+func view_getPegAdjustCost (iW) = {
1823+ let co = aY()
1824+ let cp = aZ()
1825+ let fx = fy(iW, co, cp)
1826+ throw(toString(fx._3))
1827+ }
1828+
1829+
1830+
1831+@Callable(bC)
1832+func view_getTerminalAmmPrice () = {
1833+ let iX = fg()
1834+ let fk = iX._1
1835+ let fl = iX._2
1836+ let ha = aG(aI(fk, ba()), aI(fl, bb()))
1837+ throw(toString(ha))
1838+ }
1839+
1840+
1841+
1842+@Callable(bC)
1843+func view_getFunding (ho) = {
1844+ let hp = invoke(this, "updateOracle", [ho], nil)
1845+ if ((hp == hp))
14421846 then {
1443- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1444- if ((hm == hm))
1847+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1848+ if ((hq == hq))
14451849 then {
1446- let bH = bx(by)
1447- let ib = valueOrErrorMessage(addressFromString(bH), "Invalid caller")
1448- let bQ = bO(bH, bI)
1449- if (if (if (if (if (if (!(bR(bH, bI)))
1450- then true
1451- else !(ca()))
1452- then true
1453- else cb())
1454- then true
1455- else (0 >= eo))
1456- then true
1457- else (0 > eq))
1458- then true
1459- else dr())
1460- then throw("Invalid closePosition parameters")
1461- else {
1462- let ey = bG(bH, bI)._5
1463- let ic = en(bH, bI, eo, bQ, eq, er, true, true)
1464- let eS = ic._1
1465- let fb = ic._2
1466- let eU = ic._3
1467- let eV = ic._4
1468- let eO = ic._5
1469- let eJ = ic._6
1470- let fa = ic._7
1471- let cs = ic._8
1472- let ct = ic._9
1473- let eE = ic._10
1474- let hL = ic._11
1475- let hM = ic._12
1476- let hN = ic._13
1477- let hE = ic._14
1478- let hF = ic._15
1479- let id = ic._16
1480- if ((eO > 0))
1481- then throw("Invalid closePosition parameters: bad debt")
1482- else if ((ey >= bw()))
1483- then throw("Invalid closePosition parameters: wait at least 1 block before closing the position")
1484- else {
1485- let eB = (eS != 0)
1486- let ie = (fa + id)
1487- let if = (aR() - ie)
1488- let ig = if ((0 > if))
1489- then 0
1490- else if
1491- let hW = invoke(ai(), "withdrawLocked", [ie], nil)
1492- if ((hW == hW))
1493- then {
1494- let ht = invoke(al(), "acceptPayment", [bH], [AttachedPayment(ag(), id)])
1495- if ((ht == ht))
1496- then {
1497- let hu = {
1498- let bL = ht
1499- if ($isInstanceOf(bL, "Int"))
1500- then {
1501- let fV = bL
1502- fV
1503- }
1504- else throw("Invalid referrerFee")
1505- }
1506- let ih = fZ((id - hu))
1507- let gb = ih._1
1508- let gc = ih._2
1509- let hQ = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1510- if ((hQ == hQ))
1511- then {
1512- let hR = invoke(aj(), "notifyFees", [bH, id], nil)
1513- if ((hR == hR))
1514- then {
1515- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1516- if ((hS == hS))
1517- then (((((if (eB)
1518- then gA(bH, eS, fb, eU, eV, bw())
1519- else gN(bH, bI)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ (if ((fa > 0))
1520- then gO(ib, fa)
1521- else nil)) ++ gR(ig)) ++ gS(gb))
1522- else throw("Strict value is not equal to itself.")
1523- }
1524- else throw("Strict value is not equal to itself.")
1525- }
1526- else throw("Strict value is not equal to itself.")
1527- }
1528- else throw("Strict value is not equal to itself.")
1529- }
1530- else throw("Strict value is not equal to itself.")
1531- }
1532- }
1850+ let fE = dp()
1851+ let iY = fD()
1852+ let fH = iY._1
1853+ let fI = iY._2
1854+ let fL = iY._3
1855+ let iZ = aG(fI, fE)
1856+ let ja = aG(fH, fE)
1857+ throw(((((aE(iZ) + aE(ja)) + aE(dJ())) + aE(dp())) + aE(fL)))
15331858 }
15341859 else throw("Strict value is not equal to itself.")
15351860 }
15381863
15391864
15401865
1541-@Callable(by)
1542-func liquidate (bH,bI) = {
1543- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1544- if ((hl == hl))
1866+@Callable(bC)
1867+func computeSpotPrice () = {
1868+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1869+ if ((hq == hq))
15451870 then {
1546- let ii = ea(bH, bI, ax)
1547- let ij = if (dG())
1548- then {
1549- let ik = ea(bH, bI, ay)
1550- aJ(ii, ik)
1551- }
1552- else ii
1553- if (if (if (if (if (!(bz(ij, bh(), false)))
1554- then true
1555- else !(bR(bH, bI)))
1556- then true
1557- else !(ca()))
1558- then true
1559- else cb())
1560- then true
1561- else dr())
1562- then throw("Unable to liquidate")
1563- else {
1564- let il = if (if ((ii > bi()))
1565- then (bj() > 0)
1566- else false)
1567- then (au > bj())
1568- else false
1569- let eu = bG(bH, bI)._1
1570- let dK = aI(eu)
1571- let im = if (il)
1572- then {
1573- let in = ei(bH, eu)
1574- let io = aD(aI(in), dK)
1575- $Tuple2(io, aI(in))
1576- }
1577- else $Tuple2(0, dK)
1578- let io = im._1
1579- let in = im._2
1580- let ip = en(bH, bI, if (il)
1581- then in
1582- else dK, bi(), 0, true, false, true)
1583- let eS = ip._1
1584- let fb = ip._2
1585- let eU = ip._3
1586- let eV = ip._4
1587- let eO = ip._5
1588- let eJ = ip._6
1589- let fa = ip._7
1590- let cs = ip._8
1591- let ct = ip._9
1592- let eE = ip._10
1593- let hL = ip._11
1594- let hM = ip._12
1595- let hN = ip._13
1596- let hE = ip._14
1597- let hF = ip._15
1598- let iq = ip._16
1599- let ir = (iq / 2)
1600- let gc = (iq - ir)
1601- let if = (aR() - iq)
1602- let is = if ((0 > if))
1603- then 0
1604- else if
1605- let hX = if ((eO > 0))
1606- then {
1607- let hX = invoke(ai(), "exchangeFreeAndLocked", [(eO + iq)], nil)
1608- if ((hX == hX))
1609- then nil
1610- else throw("Strict value is not equal to itself.")
1611- }
1612- else nil
1613- if ((hX == hX))
1614- then {
1615- let hW = invoke(ai(), "withdrawLocked", [iq], nil)
1616- if ((hW == hW))
1617- then {
1618- let it = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1619- if ((it == it))
1620- then {
1621- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1622- if ((hS == hS))
1623- then ((((if (il)
1624- then gA(bH, eS, fb, eU, eV, bw())
1625- else gN(bH, bI)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ gO(by.caller, ir)) ++ gR(is))
1626- else throw("Strict value is not equal to itself.")
1627- }
1628- else throw("Strict value is not equal to itself.")
1629- }
1630- else throw("Strict value is not equal to itself.")
1631- }
1632- else throw("Strict value is not equal to itself.")
1633- }
1871+ let fx = dJ()
1872+ $Tuple2(nil, fx)
16341873 }
16351874 else throw("Strict value is not equal to itself.")
16361875 }
16371876
16381877
16391878
1640-@Callable(by)
1641-func payFunding () = {
1642- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1643- if ((hl == hl))
1644- then {
1645- let iu = bd()
1646- if (if (if ((iu > bw()))
1647- then true
1648- else !(ca()))
1649- then true
1650- else cb())
1651- then throw(((("Invalid funding block timestamp: " + toString(bw())) + " < ") + toString(iu)))
1652- else {
1653- let fA = dl()
1654- let iv = fz()
1655- let fD = iv._1
1656- let fE = iv._2
1657- let fH = iv._3
1658- let iw = if ((fH > 0))
1659- then {
1660- let iw = invoke(ai(), "exchangeFreeAndLocked", [-(fH)], nil)
1661- if ((iw == iw))
1662- then nil
1663- else throw("Strict value is not equal to itself.")
1664- }
1665- else nil
1666- if ((iw == iw))
1667- then gq((iu + bg()), (bo() + fE), (bp() + fD), aD(fE, fA), aD(fD, fA))
1668- else throw("Strict value is not equal to itself.")
1669- }
1670- }
1671- else throw("Strict value is not equal to itself.")
1879+@Callable(bC)
1880+func computeFeeForTraderWithArtifact (bL,fN) = {
1881+ let fx = fW(bL, fN)
1882+ $Tuple2(nil, fx)
16721883 }
16731884
16741885
1675-
1676-@Callable(by)
1677-func syncTerminalPriceToOracle () = {
1678- let ck = aV()
1679- let cl = aW()
1680- let ix = fu(dl(), ck, cl)
1681- let ha = ix._1
1682- let hb = ix._2
1683- let fy = ix._3
1684- let iy = if (if ((0 > fy))
1685- then (aI(fy) > aR())
1686- else false)
1687- then -(aR())
1688- else fy
1689- let hc = if ((iy != 0))
1886+@Verifier(jb)
1887+func jc () = {
1888+ let jd = getString(this, T)
1889+ if (isDefined(jd))
16901890 then {
1691- let hc = invoke(ai(), "exchangeFreeAndLocked", [iy], nil)
1692- if ((hc == hc))
1693- then nil
1694- else throw("Strict value is not equal to itself.")
1695- }
1696- else nil
1697- if ((hc == hc))
1698- then (gR((aR() + iy)) ++ gF(ha, hb))
1699- else throw("Strict value is not equal to itself.")
1700- }
1701-
1702-
1703-
1704-@Callable(by)
1705-func ensureCalledOnce () = if ((by.caller != this))
1706- then throw("Invalid saveCurrentTxId parameters")
1707- else {
1708- let iz = toBase58String(by.transactionId)
1709- let iA = valueOrElse(getString(this, R), "")
1710- if ((iA != iz))
1711- then [StringEntry(R, iz)]
1712- else throw("Can not call vAMM methods twice in one tx")
1713- }
1714-
1715-
1716-
1717-@Callable(by)
1718-func migratePosition (bH) = {
1719- let bK = getInteger(this, ab(e, bH))
1720- if (if (isDefined(bK))
1721- then isDefined(addressFromString(bH))
1722- else false)
1723- then {
1724- let iB = getIntegerValue(this, ab(e, bH))
1725- let iC = getIntegerValue(this, ab(f, bH))
1726- let iD = getIntegerValue(this, ab(g, bH))
1727- let iE = getIntegerValue(this, ab(h, bH))
1728- let iF = valueOrElse(getInteger(this, ab(k, bH)), lastBlock.timestamp)
1729- let iG = valueOrElse(getInteger(this, ab(j, bH)), aS())
1730- let iH = getIntegerValue(this, ab(i, bH))
1731- let iI = bN(iB)
1732- let bJ = ((bH + "_") + toString(iI))
1733-[DeleteEntry(ab(e, bH)), DeleteEntry(ab(f, bH)), DeleteEntry(ab(g, bH)), DeleteEntry(ab(h, bH)), DeleteEntry(ab(k, bH)), DeleteEntry(ab(j, bH)), DeleteEntry(ab(i, bH)), IntegerEntry(ab(e, bJ), iB), IntegerEntry(ab(f, bJ), iC), IntegerEntry(ab(g, bJ), iD), IntegerEntry(ab(h, bJ), iE), IntegerEntry(ab(k, bJ), iF), IntegerEntry(ab(j, bJ), iG), IntegerEntry(ab(i, bJ), iH)]
1734- }
1735- else throw(("Nothing to migrate for " + bH))
1736- }
1737-
1738-
1739-
1740-@Callable(by)
1741-func view_calcRemainMarginWithFundingPayment (bH,bI) = {
1742- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1743- if ((hl == hl))
1744- then {
1745- let iJ = bG(bH, bI)
1746- let bM = iJ._1
1747- let dT = iJ._2
1748- let ec = iJ._3
1749- let dV = iJ._4
1750- let ee = iJ._5
1751- let iK = dR(bH, bI, ax)
1752- let dM = iK._1
1753- let dQ = iK._2
1754- let iL = cK(bM, dT, dV, ee, dQ)
1755- let cS = iL._1
1756- let cT = iL._2
1757- let cO = iL._3
1758- let cJ = iL._4
1759- throw(((((((aB(cS) + aB(cO)) + aB(eh(bH, bI))) + aB(dQ)) + aB(cT)) + aB(dM)) + aB(cJ)))
1760- }
1761- else throw("Strict value is not equal to itself.")
1762- }
1763-
1764-
1765-
1766-@Callable(by)
1767-func view_getPegAdjustCost (iM) = {
1768- let ck = aV()
1769- let cl = aW()
1770- let ft = fu(iM, ck, cl)
1771- throw(toString(ft._3))
1772- }
1773-
1774-
1775-
1776-@Callable(by)
1777-func view_getTerminalAmmPrice () = {
1778- let iN = fc()
1779- let fg = iN._1
1780- let fh = iN._2
1781- let gV = aD(aF(fg, aX()), aF(fh, aY()))
1782- throw(toString(gV))
1783- }
1784-
1785-
1786-
1787-@Callable(by)
1788-func view_getFunding () = {
1789- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1790- if ((hl == hl))
1791- then {
1792- let fA = dl()
1793- let iO = fz()
1794- let fD = iO._1
1795- let fE = iO._2
1796- let fH = iO._3
1797- let iP = aD(fE, fA)
1798- let iQ = aD(fD, fA)
1799- throw(((((aB(iP) + aB(iQ)) + aB(dF())) + aB(dl())) + aB(fH)))
1800- }
1801- else throw("Strict value is not equal to itself.")
1802- }
1803-
1804-
1805-
1806-@Callable(by)
1807-func computeSpotPrice () = {
1808- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1809- if ((hl == hl))
1810- then {
1811- let ft = dF()
1812- $Tuple2(nil, ft)
1813- }
1814- else throw("Strict value is not equal to itself.")
1815- }
1816-
1817-
1818-
1819-@Callable(by)
1820-func computeFeeForTraderWithArtifact (bH,fJ) = {
1821- let ft = fS(bH, fJ)
1822- $Tuple2(nil, ft)
1823- }
1824-
1825-
1826-@Verifier(iR)
1827-func iS () = {
1828- let iT = getString(this, S)
1829- if (isDefined(iT))
1830- then {
1831- let iU = getString(addressFromStringValue(value(iT)), U)
1832- if (isDefined(iU))
1833- then valueOrElse(getBoolean(addressFromStringValue(value(iU)), ((("status_" + toString(this)) + "_") + toBase58String(iR.id))), false)
1891+ let je = getString(addressFromStringValue(value(jd)), V)
1892+ if (isDefined(je))
1893+ then valueOrElse(getBoolean(addressFromStringValue(value(je)), ((("status_" + toString(this)) + "_") + toBase58String(jb.id))), false)
18341894 else throw("unable to verify: admin not set in coordinator")
18351895 }
1836- else sigVerify(iR.bodyBytes, iR.proofs[0], iR.senderPublicKey)
1896+ else sigVerify(jb.bodyBytes, jb.proofs[0], jb.senderPublicKey)
18371897 }
18381898
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "k_baseOracle"
55
66 let b = "k_quoteOracle"
77
88 let c = "k_balance"
99
1010 let d = "k_sequence"
1111
1212 let e = "k_positionSize"
1313
1414 let f = "k_positionMargin"
1515
1616 let g = "k_positionOpenNotional"
1717
1818 let h = "k_positionFraction"
1919
2020 let i = "k_positionSequence"
2121
2222 let j = "k_positionFee"
2323
2424 let k = "k_positionTimestamp"
2525
2626 let l = "k_initialized"
2727
2828 let m = "k_paused"
2929
3030 let n = "k_closeOnly"
3131
3232 let o = "k_fee"
3333
3434 let p = "k_rollover_fee"
3535
3636 let q = "k_fundingPeriod"
3737
3838 let r = "k_initMarginRatio"
3939
4040 let s = "k_mmr"
4141
4242 let t = "k_liquidationFeeRatio"
4343
4444 let u = "k_partLiquidationRatio"
4545
4646 let v = "k_spreadLimit"
4747
4848 let w = "k_maxPriceImpact"
4949
5050 let x = "k_maxPriceSpread"
5151
5252 let y = "k_maxOpenNotional"
5353
5454 let z = "k_feeToStakersPercent"
5555
5656 let A = "k_maxOracleDelay"
5757
5858 let B = "k_fundingMode"
5959
60-let C = "k_latestLongPremiumFraction"
60+let C = "k_oracleMode"
6161
62-let D = "k_latestShortPremiumFraction"
62+let D = "k_latestLongPremiumFraction"
6363
64-let E = "k_nextFundingBlockMinTimestamp"
64+let E = "k_latestShortPremiumFraction"
6565
66-let F = "k_longFundingRate"
66+let F = "k_nextFundingBlockMinTimestamp"
6767
68-let G = "k_shortFundingRate"
68+let G = "k_longFundingRate"
6969
70-let H = "k_qtAstR"
70+let H = "k_shortFundingRate"
7171
72-let I = "k_bsAstR"
72+let I = "k_qtAstR"
7373
74-let J = "k_qtAstW"
74+let J = "k_bsAstR"
7575
76-let K = "k_bsAstW"
76+let K = "k_qtAstW"
7777
78-let L = "k_totalPositionSize"
78+let L = "k_bsAstW"
7979
80-let M = "k_totalLongPositionSize"
80+let M = "k_totalPositionSize"
8181
82-let N = "k_totalShortPositionSize"
82+let N = "k_totalLongPositionSize"
8383
84-let O = "k_openInterestNotional"
84+let O = "k_totalShortPositionSize"
8585
86-let P = "k_openInterestShort"
86+let P = "k_openInterestNotional"
8787
88-let Q = "k_openInterestLong"
88+let Q = "k_openInterestShort"
8989
90-let R = "k_lastTx"
90+let R = "k_openInterestLong"
9191
92-let S = "k_coordinatorAddress"
92+let S = "k_lastTx"
9393
94-let T = "k_vault_address"
94+let T = "k_coordinatorAddress"
9595
96-let U = "k_admin_address"
96+let U = "k_vault_address"
9797
98-let V = "k_quote_asset"
98+let V = "k_admin_address"
9999
100-let W = "k_staking_address"
100+let W = "k_quote_asset"
101101
102-let X = "k_miner_address"
102+let X = "k_staking_address"
103103
104-let Y = "k_orders_address"
104+let Y = "k_miner_address"
105105
106-let Z = "k_referral_address"
106+let Z = "k_orders_address"
107107
108-let aa = "k_nft_manager_address"
108+let aa = "k_referral_address"
109109
110-func ab (ac,ad) = ((ac + "_") + ad)
110+let ab = "k_nft_manager_address"
111+
112+func ac (ad,ae) = ((ad + "_") + ae)
111113
112114
113-func ae () = valueOrErrorMessage(addressFromString(getStringValue(this, S)), "Coordinator not set")
115+func af () = valueOrErrorMessage(addressFromString(getStringValue(this, T)), "Coordinator not set")
114116
115117
116-func af () = addressFromString(getStringValue(ae(), U))
118+func ag () = addressFromString(getStringValue(af(), V))
117119
118120
119-func ag () = fromBase58String(getStringValue(ae(), V))
121+func ah () = fromBase58String(getStringValue(af(), W))
120122
121123
122-func ah () = valueOrErrorMessage(addressFromString(getStringValue(ae(), W)), "Staking not set")
124+func ai () = valueOrErrorMessage(addressFromString(getStringValue(af(), X)), "Staking not set")
123125
124126
125-func ai () = valueOrErrorMessage(addressFromString(getStringValue(ae(), T)), "Vault not set")
127+func aj () = valueOrErrorMessage(addressFromString(getStringValue(af(), U)), "Vault not set")
126128
127129
128-func aj () = valueOrErrorMessage(addressFromString(getStringValue(ae(), X)), "Miner not set")
130+func ak () = valueOrErrorMessage(addressFromString(getStringValue(af(), Y)), "Miner not set")
129131
130132
131-func ak () = valueOrErrorMessage(addressFromString(getStringValue(ae(), Y)), "Orders not set")
133+func al () = valueOrErrorMessage(addressFromString(getStringValue(af(), Z)), "Orders not set")
132134
133135
134-func al () = valueOrErrorMessage(addressFromString(getStringValue(ae(), Z)), "Referral not set")
136+func am () = valueOrErrorMessage(addressFromString(getStringValue(af(), aa)), "Referral not set")
135137
136138
137-func am () = valueOrErrorMessage(addressFromString(getStringValue(ae(), aa)), "NFT Manager not set")
139+func an () = valueOrErrorMessage(addressFromString(getStringValue(af(), ab)), "NFT Manager not set")
138140
139141
140-let an = "k_token_param"
142+let ao = "k_token_param"
141143
142-let ao = "k_token_type"
144+let ap = "k_token_type"
143145
144-let ap = "fee_reduction"
146+let aq = "fee_reduction"
145147
146-let aq = 1
148+let ar = 1
147149
148-let ar = 2
150+let as = 2
149151
150-let as = 1000
152+let at = 1000
151153
152-let at = 6
154+let au = 6
153155
154-let au = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
156+let av = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
155157
156-let av = (525600 * au)
158+let aw = (525600 * av)
157159
158-let aw = (86400 * au)
160+let ax = (86400 * av)
159161
160-let ax = 1
162+let ay = 1
161163
162-let ay = 2
164+let az = 2
163165
164-let az = 1
166+let aA = 1
165167
166-let aA = 2
168+let aB = 2
167169
168-func aB (aC) = (toString(aC) + ",")
170+let aC = 1
171+
172+let aD = 2
173+
174+func aE (aF) = (toString(aF) + ",")
169175
170176
171-func aD (aC,aE) = fraction(aC, au, aE, HALFEVEN)
177+func aG (aF,aH) = fraction(aF, av, aH, HALFEVEN)
172178
173179
174-func aF (aC,aE) = fraction(aC, aE, au, HALFEVEN)
180+func aI (aF,aH) = fraction(aF, aH, av, HALFEVEN)
175181
176182
177-func aG (aC,aE) = fraction(aC, toBigInt(au), aE, HALFEVEN)
183+func aJ (aF,aH) = fraction(aF, toBigInt(av), aH, HALFEVEN)
178184
179185
180-func aH (aC,aE) = fraction(aC, aE, toBigInt(au), HALFEVEN)
186+func aK (aF,aH) = fraction(aF, aH, toBigInt(av), HALFEVEN)
181187
182188
183-func aI (aC) = if ((aC > 0))
184- then aC
185- else -(aC)
189+func aL (aF) = if ((aF > 0))
190+ then aF
191+ else -(aF)
186192
187193
188-func aJ (aC,aE) = if ((aC >= aE))
189- then aC
190- else aE
194+func aM (aF,aH) = if ((aF >= aH))
195+ then aF
196+ else aH
191197
192198
193-func aK (aL) = valueOrErrorMessage(getInteger(this, aL), ("no value for " + aL))
199+func aN (aO) = valueOrErrorMessage(getInteger(this, aO), ("no value for " + aO))
194200
195201
196-func aM (aL,aN) = valueOrElse(getInteger(this, aL), aN)
202+func aP (aO,aQ) = valueOrElse(getInteger(this, aO), aQ)
197203
198204
199-func aO (ad,ac) = {
200- let aP = valueOrErrorMessage(getString(ad, ac), ("No value for key " + ac))
201- aP
205+func aR (ae,ad) = {
206+ let aS = valueOrErrorMessage(getString(ae, ad), ("No value for key " + ad))
207+ aS
202208 }
203209
204210
205-func aQ (ad,ac) = {
206- let aP = valueOrErrorMessage(getInteger(ad, ac), ("No value for key " + ac))
207- aP
211+func aT (ae,ad) = {
212+ let aS = valueOrErrorMessage(getInteger(ae, ad), ("No value for key " + ad))
213+ aS
208214 }
209215
210216
211-func aR () = aK(c)
217+func aU () = aN(c)
212218
213219
214-func aS () = aK(o)
220+func aV () = aN(o)
215221
216222
217-func aT () = aK(p)
223+func aW () = aN(p)
218224
219225
220-func aU () = aK(r)
226+func aX () = aN(r)
221227
222228
223-func aV () = aK(H)
229+func aY () = aN(I)
224230
225231
226-func aW () = aK(I)
232+func aZ () = aN(J)
227233
228234
229-func aX () = aM(J, au)
235+func ba () = aP(K, av)
230236
231237
232-func aY () = aM(K, au)
238+func bb () = aP(L, av)
233239
234240
235-func aZ () = aK(L)
241+func bc () = aN(M)
236242
237243
238-func ba () = aK(O)
244+func bd () = aN(P)
239245
240246
241-func bb () = aK(P)
247+func be () = aN(Q)
242248
243249
244-func bc () = aK(Q)
250+func bf () = aN(R)
245251
246252
247-func bd () = aK(E)
253+func bg () = aN(F)
248254
249255
250-func be () = aK(q)
256+func bh () = aN(q)
251257
252258
253-func bf () = (be() * au)
259+func bi () = (bh() * av)
254260
255261
256-func bg () = (be() * as)
262+func bj () = (bh() * at)
257263
258264
259-func bh () = aK(s)
265+func bk () = aN(s)
260266
261267
262-func bi () = aK(t)
268+func bl () = aN(t)
263269
264270
265-func bj () = aK(u)
271+func bm () = aN(u)
266272
267273
268-func bk () = aK(v)
274+func bn () = aN(v)
269275
270276
271-func bl () = aK(w)
277+func bo () = aN(w)
272278
273279
274-func bm () = aK(x)
280+func bp () = aN(x)
275281
276282
277-func bn () = aK(y)
283+func bq () = aN(y)
278284
279285
280-func bo () = aK(C)
286+func br () = aN(D)
281287
282288
283-func bp () = aK(D)
289+func bs () = aN(E)
284290
285291
286-func bq () = aK(N)
292+func bt () = aN(O)
287293
288294
289-func br () = aK(M)
295+func bu () = aN(N)
290296
291297
292-func bs () = aM(d, 0)
298+func bv () = aP(d, 0)
293299
294300
295-func bt () = aK(z)
301+func bw () = aN(z)
296302
297303
298-func bu () = aK(A)
304+func bx () = aN(A)
299305
300306
301-func bv () = aM(B, az)
307+func by () = aP(B, aA)
302308
303309
304-func bw () = lastBlock.timestamp
310+func bz () = aP(C, aC)
305311
306312
307-func bx (by) = valueOrElse(getString(ak(), "k_sender"), toString(by.caller))
313+func bA () = lastBlock.timestamp
308314
309315
310-func bz (bA,bB,bC) = {
311- let bD = (bA - bB)
312- if (if (bC)
313- then (0 > bD)
316+func bB (bC) = valueOrElse(getString(al(), "k_sender"), toString(bC.caller))
317+
318+
319+func bD (bE,bF,bG) = {
320+ let bH = (bE - bF)
321+ if (if (bG)
322+ then (0 > bH)
314323 else false)
315- then throw(((("Invalid margin: " + toString(bA)) + " < ") + toString(bB)))
316- else if (if (!(bC))
317- then (bD >= 0)
324+ then throw(((("Invalid margin: " + toString(bE)) + " < ") + toString(bF)))
325+ else if (if (!(bG))
326+ then (bH >= 0)
318327 else false)
319- then throw(((("Invalid margin: " + toString(bA)) + " > ") + toString(bB)))
328+ then throw(((("Invalid margin: " + toString(bE)) + " > ") + toString(bF)))
320329 else true
321330 }
322331
323332
324-func bE (bF) = if ((bF == 0))
333+func bI (bJ) = if ((bJ == 0))
325334 then throw("Should not be called with _positionSize == 0")
326- else if ((bF > 0))
327- then bo()
328- else bp()
335+ else if ((bJ > 0))
336+ then br()
337+ else bs()
329338
330339
331-func bG (bH,bI) = {
332- let bJ = ((bH + "_") + toString(bI))
333- let bK = getInteger(this, ab(e, bJ))
334- let bL = bK
335- if ($isInstanceOf(bL, "Int"))
340+func bK (bL,bM) = {
341+ let bN = ((bL + "_") + toString(bM))
342+ let bO = getInteger(this, ac(e, bN))
343+ let bP = bO
344+ if ($isInstanceOf(bP, "Int"))
336345 then {
337- let bM = bL
338- $Tuple5(bM, getIntegerValue(this, ab(f, bJ)), getIntegerValue(this, ab(g, bJ)), getIntegerValue(this, ab(h, bJ)), getIntegerValue(this, ab(k, bJ)))
346+ let bQ = bP
347+ $Tuple5(bQ, getIntegerValue(this, ac(f, bN)), getIntegerValue(this, ac(g, bN)), getIntegerValue(this, ac(h, bN)), getIntegerValue(this, ac(k, bN)))
339348 }
340349 else $Tuple5(0, 0, 0, 0, 0)
341350 }
342351
343352
344-func bN (bF) = if ((0 > bF))
345- then ar
346- else aq
353+func bR (bJ) = if ((0 > bJ))
354+ then as
355+ else ar
347356
348357
349-func bO (bH,bI) = {
350- let bJ = ((bH + "_") + toString(bI))
351- let bP = getInteger(this, ab(j, bJ))
352- let bL = bP
353- if ($isInstanceOf(bL, "Int"))
358+func bS (bL,bM) = {
359+ let bN = ((bL + "_") + toString(bM))
360+ let bT = getInteger(this, ac(j, bN))
361+ let bP = bT
362+ if ($isInstanceOf(bP, "Int"))
354363 then {
355- let bQ = bL
356- bQ
364+ let bU = bP
365+ bU
357366 }
358- else aS()
367+ else aV()
359368 }
360369
361370
362-func bR (bH,bI) = if ((bG(bH, bI)._1 == 0))
371+func bV (bL,bM) = if ((bK(bL, bM)._1 == 0))
363372 then throw("No open position")
364373 else true
365374
366375
367-func bS (bT) = {
368- let bU = getString(this, bT)
369- if (if (isDefined(bU))
370- then (value(bU) != "")
376+func bW (bX) = {
377+ let bY = getString(this, bX)
378+ if (if (isDefined(bY))
379+ then (value(bY) != "")
371380 else false)
372381 then {
373- let bV = split(value(bU), ",")
374- let bW = valueOrErrorMessage(addressFromString(bV[0]), ("Invalid oracle address in: " + value(bU)))
375- let bX = bV[1]
376- let bY = bV[2]
377- let bZ = bV[3]
378- $Tuple4(bW, bX, bY, bZ)
382+ let bZ = split(value(bY), ",")
383+ let ca = valueOrErrorMessage(addressFromString(bZ[0]), ("Invalid oracle address in: " + value(bY)))
384+ let cb = bZ[1]
385+ let cc = bZ[2]
386+ let cd = bZ[3]
387+ $Tuple4(ca, cb, cc, cd)
379388 }
380389 else unit
381390 }
382391
383392
384-func ca () = valueOrElse(getBoolean(this, l), false)
393+func ce () = valueOrElse(getBoolean(this, l), false)
385394
386395
387-func cb () = valueOrElse(getBoolean(this, m), false)
396+func cf () = valueOrElse(getBoolean(this, m), false)
388397
389398
390-func cc () = valueOrElse(getBoolean(this, n), false)
399+func cg () = valueOrElse(getBoolean(this, n), false)
391400
392401
393-func cd (ce,cf,cg) = if (ce)
402+func ch (ci,cj,ck) = if (ci)
394403 then {
395- let ch = (aW() - cg)
396- if ((0 >= ch))
404+ let cl = (aZ() - ck)
405+ if ((0 >= cl))
397406 then throw("Tx lead to base asset reserve <= 0, revert")
398- else $Tuple3((aV() + cf), ch, (aZ() + cg))
407+ else $Tuple3((aY() + cj), cl, (bc() + ck))
399408 }
400409 else {
401- let ci = (aV() - cf)
402- if ((0 >= ci))
410+ let cm = (aY() - cj)
411+ if ((0 >= cm))
403412 then throw("Tx lead to base quote reserve <= 0, revert")
404- else $Tuple3(ci, (aW() + cg), (aZ() - cg))
413+ else $Tuple3(cm, (aZ() + ck), (bc() - ck))
405414 }
406415
407416
408-func cj (ck,cl) = {
409- let cm = toBigInt(ck)
410- let cn = toBigInt(cl)
411- aH(cm, cn)
417+func cn (co,cp) = {
418+ let cq = toBigInt(co)
419+ let cr = toBigInt(cp)
420+ aK(cq, cr)
412421 }
413422
414423
415-func co (ce,cf) = {
416- let ck = aV()
417- let cl = aW()
418- let cp = aX()
419- let cq = aY()
420- let cr = aD(cf, cp)
421- let aL = cj(ck, cl)
422- let cs = if (ce)
423- then (ck + cr)
424- else (ck - cr)
425- let ct = toInt(aG(aL, toBigInt(cs)))
426- let cu = aI((ct - cl))
427- let cv = if (ce)
428- then cu
429- else -(cu)
430- let cw = cd(ce, cr, cu)
431- let cx = cw._1
432- let cy = cw._2
433- let cz = cw._3
434- let cA = aD(aF(ck, cp), aF(cl, cq))
435- let cB = aD(cf, cu)
436- let cC = aI((cA - cB))
437- let cD = (au - aD(cA, (cA + cC)))
438- let cE = bl()
439- if ((cD > cE))
440- then throw(((((((((((((("Price impact " + toString(cD)) + " > max price impact ") + toString(cE)) + " before quote asset: ") + toString(ck)) + " before base asset: ") + toString(cl)) + " quote asset amount to exchange: ") + toString(cf)) + " price before: ") + toString(cA)) + " marketPrice: ") + toString(cB)))
441- else $Tuple4(cv, cx, cy, cz)
424+func cs (ci,cj) = {
425+ let co = aY()
426+ let cp = aZ()
427+ let ct = ba()
428+ let cu = bb()
429+ let cv = aG(cj, ct)
430+ let aO = cn(co, cp)
431+ let cw = if (ci)
432+ then (co + cv)
433+ else (co - cv)
434+ let cx = toInt(aJ(aO, toBigInt(cw)))
435+ let cy = aL((cx - cp))
436+ let cz = if (ci)
437+ then cy
438+ else -(cy)
439+ let cA = ch(ci, cv, cy)
440+ let cB = cA._1
441+ let cC = cA._2
442+ let cD = cA._3
443+ let cE = aG(aI(co, ct), aI(cp, cu))
444+ let cF = aG(cj, cy)
445+ let cG = aL((cE - cF))
446+ let cH = (av - aG(cE, (cE + cG)))
447+ let cI = bo()
448+ if ((cH > cI))
449+ then throw(((((((((((((("Price impact " + toString(cH)) + " > max price impact ") + toString(cI)) + " before quote asset: ") + toString(co)) + " before base asset: ") + toString(cp)) + " quote asset amount to exchange: ") + toString(cj)) + " price before: ") + toString(cE)) + " marketPrice: ") + toString(cF)))
450+ else $Tuple4(cz, cB, cC, cD)
442451 }
443452
444453
445-func cF (cG,cH) = {
446- let cI = ((((bw() - cH) / 1000) / 60) * au)
447- let cJ = aD(aF(aF(cG, cI), aT()), av)
448- cJ
454+func cJ (cK,cL) = {
455+ let cM = ((((bA() - cL) / 1000) / 60) * av)
456+ let cN = aG(aI(aI(cK, cM), aW()), aw)
457+ cN
449458 }
450459
451460
452-func cK (cL,cG,cM,cH,cN) = {
453- let cO = if ((cL != 0))
461+func cO (cP,cK,cQ,cL,cR) = {
462+ let cS = if ((cP != 0))
454463 then {
455- let cP = bE(cL)
456- aF((cP - cM), cL)
464+ let cT = bI(cP)
465+ aI((cT - cQ), cP)
457466 }
458467 else 0
459- let cJ = cF(cG, cH)
460- let cQ = (((cN - cJ) - cO) + cG)
461- let cR = if ((0 > cQ))
462- then $Tuple2(0, aI(cQ))
463- else $Tuple2(aI(cQ), 0)
464- let cS = cR._1
465- let cT = cR._2
466- $Tuple4(cS, cT, cO, cJ)
468+ let cN = cJ(cK, cL)
469+ let cU = (((cR - cN) - cS) + cK)
470+ let cV = if ((0 > cU))
471+ then $Tuple2(0, aL(cU))
472+ else $Tuple2(aL(cU), 0)
473+ let cW = cV._1
474+ let cX = cV._2
475+ $Tuple4(cW, cX, cS, cN)
467476 }
468477
469478
470-func cU (ce,cg,cV,cW,cX,cY,cZ) = {
471- let cA = aD(aF(cW, cX), aF(cY, cZ))
472- if ((cg == 0))
479+func cY (ci,ck,cZ,da,db,dc,dd) = {
480+ let cE = aG(aI(da, db), aI(dc, dd))
481+ if ((ck == 0))
473482 then throw("Invalid base asset amount")
474483 else {
475- let aL = cj(cW, cY)
476- let da = if (ce)
477- then (cY + cg)
478- else (cY - cg)
479- let db = toInt(aG(aL, toBigInt(da)))
480- let dc = aI((db - cW))
481- let dd = aF(dc, cX)
482- let cE = bl()
483- let de = cd(!(ce), dc, cg)
484- let cx = de._1
485- let cy = de._2
486- let cz = de._3
487- let cB = aD(dd, cg)
488- let cC = aI((cA - cB))
489- let cD = (au - aD(cA, (cA + cC)))
490- if (if ((cD > cE))
491- then cV
484+ let aO = cn(da, dc)
485+ let de = if (ci)
486+ then (dc + ck)
487+ else (dc - ck)
488+ let df = toInt(aJ(aO, toBigInt(de)))
489+ let dg = aL((df - da))
490+ let dh = aI(dg, db)
491+ let cI = bo()
492+ let di = ch(!(ci), dg, ck)
493+ let cB = di._1
494+ let cC = di._2
495+ let cD = di._3
496+ let cF = aG(dh, ck)
497+ let cG = aL((cE - cF))
498+ let cH = (av - aG(cE, (cE + cG)))
499+ if (if ((cH > cI))
500+ then cZ
492501 else false)
493- then throw(((((((((((((("Price impact " + toString(cD)) + " > max price impact ") + toString(cE)) + " before quote asset: ") + toString(cW)) + " before base asset: ") + toString(cY)) + " base asset amount to exchange: ") + toString(cg)) + " price before: ") + toString(cA)) + " market price: ") + toString(cB)))
494- else $Tuple7(dd, cx, cy, cz, (br() - (if (ce)
495- then aI(cg)
496- else 0)), (bq() - (if (!(ce))
497- then aI(cg)
498- else 0)), cD)
502+ then throw(((((((((((((("Price impact " + toString(cH)) + " > max price impact ") + toString(cI)) + " before quote asset: ") + toString(da)) + " before base asset: ") + toString(dc)) + " base asset amount to exchange: ") + toString(ck)) + " price before: ") + toString(cE)) + " market price: ") + toString(cF)))
503+ else $Tuple7(dh, cB, cC, cD, (bu() - (if (ci)
504+ then aL(ck)
505+ else 0)), (bt() - (if (!(ci))
506+ then aL(ck)
507+ else 0)), cH)
499508 }
500509 }
501510
502511
503-func df (ce,cg,cV) = cU(ce, cg, cV, aV(), aX(), aW(), aY())
512+func dj (ci,ck,cZ) = cY(ci, ck, cZ, aY(), ba(), aZ(), bb())
504513
505514
506-func dg (dh,bX,bY) = {
507- let di = valueOrErrorMessage(getInteger(dh, bX), ((("Can not get oracle price. Oracle: " + toString(dh)) + " key: ") + bX))
508- if ((bY != ""))
515+func dk (dl,cb,cc) = {
516+ let dm = valueOrErrorMessage(getInteger(dl, cb), ((("Can not get oracle price. Oracle: " + toString(dl)) + " key: ") + cb))
517+ if ((cc != ""))
509518 then {
510- let dj = lastBlock.height
511- let dk = valueOrErrorMessage(getInteger(dh, bY), ((("Can not get oracle block. Oracle: " + toString(dh)) + " key: ") + bY))
512- if (((dj - dk) > bu()))
513- then throw(((("Oracle stale data. Last oracle block: " + toString(dk)) + " current block: ") + toString(dj)))
514- else di
519+ let dn = height
520+ let do = valueOrErrorMessage(getInteger(dl, cc), ((("Can not get oracle block. Oracle: " + toString(dl)) + " key: ") + cc))
521+ if (((dn - do) > bx()))
522+ then throw(((("Oracle stale data. Last oracle block: " + toString(do)) + " current block: ") + toString(dn)))
523+ else dm
515524 }
516- else di
525+ else dm
517526 }
518527
519528
520-func dl () = {
521- let dm = valueOrErrorMessage(bS(a), "No base asset oracle data")
522- let dn = dg(dm._1, dm._2, dm._3)
523- let do = bS(b)
524- let dp = if (isDefined(do))
529+func dp () = {
530+ let dq = valueOrErrorMessage(bW(a), "No base asset oracle data")
531+ let dr = dk(dq._1, dq._2, dq._3)
532+ let ds = bW(b)
533+ let dt = if (isDefined(ds))
525534 then {
526- let dq = value(do)
527- dg(dq._1, dq._2, dq._3)
535+ let du = value(ds)
536+ dk(du._1, du._2, du._3)
528537 }
529- else au
530- aD(dn, dp)
538+ else av
539+ aG(dr, dt)
531540 }
532541
533542
534-func dr () = {
535- let dm = valueOrErrorMessage(bS(a), "No base asset oracle data")
536- let dh = dm._1
537- let bZ = dm._4
538- if ((bZ != ""))
543+func dv () = {
544+ let dq = valueOrErrorMessage(bW(a), "No base asset oracle data")
545+ let dl = dq._1
546+ let cd = dq._4
547+ if ((cd != ""))
539548 then {
540- let ds = valueOrErrorMessage(getBoolean(dh, bZ), ((("Can not get oracle is open/closed. Oracle: " + toString(dh)) + " key: ") + bZ))
541- !(ds)
549+ let dw = valueOrErrorMessage(getBoolean(dl, cd), ((("Can not get oracle is open/closed. Oracle: " + toString(dl)) + " key: ") + cd))
550+ !(dw)
542551 }
543552 else false
544553 }
545554
546555
547-func dt (du,cW,cY,cp,cq) = {
548- let dv = aD(aF(cW, cp), aF(cY, cq))
549- let dw = aD((du + dv), (2 * au))
550- let dt = aD(aI((du - dv)), dw)
551- dt
556+func dx (dy,da,dc,ct,cu) = {
557+ let dz = aG(aI(da, ct), aI(dc, cu))
558+ let dA = aG((dy + dz), (2 * av))
559+ let dx = aG(aL((dy - dz)), dA)
560+ dx
552561 }
553562
554563
555-func dx (cW,cY) = {
556- let dy = dl()
557- let cp = aX()
558- let cq = aY()
559- let dz = dt(dy, aV(), aW(), cp, cq)
560- let dA = dt(dy, cW, cY, cp, cq)
561- if (if ((dA > bm()))
562- then (dA > dz)
564+func dB (da,dc) = {
565+ let dC = dp()
566+ let ct = ba()
567+ let cu = bb()
568+ let dD = dx(dC, aY(), aZ(), ct, cu)
569+ let dE = dx(dC, da, dc, ct, cu)
570+ if (if ((dE > bp()))
571+ then (dE > dD)
563572 else false)
564- then throw(((("Price spread " + toString(dA)) + " > max price spread ") + toString(bm())))
573+ then throw(((("Price spread " + toString(dE)) + " > max price spread ") + toString(bp())))
565574 else true
566575 }
567576
568577
569-func dB (dC,dD) = {
570- let dE = bn()
571- if ((dC > dE))
572- then throw(((("Long open notional " + toString(dC)) + " > max open notional ") + toString(dE)))
573- else if ((dD > dE))
574- then throw(((("Short open notional " + toString(dD)) + " > max open notional ") + toString(dE)))
578+func dF (dG,dH) = {
579+ let dI = bq()
580+ if ((dG > dI))
581+ then throw(((("Long open notional " + toString(dG)) + " > max open notional ") + toString(dI)))
582+ else if ((dH > dI))
583+ then throw(((("Short open notional " + toString(dH)) + " > max open notional ") + toString(dI)))
575584 else true
576585 }
577586
578587
579-func dF () = {
580- let cW = aV()
581- let cY = aW()
582- let cp = aX()
583- let cq = aY()
584- aD(aF(cW, cp), aF(cY, cq))
588+func dJ () = {
589+ let da = aY()
590+ let dc = aZ()
591+ let ct = ba()
592+ let cu = bb()
593+ aG(aI(da, ct), aI(dc, cu))
585594 }
586595
587596
588-func dG () = {
589- let dy = dl()
590- let dH = dF()
591- (aD(aI((dy - dH)), dy) > bk())
597+func dK () = {
598+ let dC = dp()
599+ let dL = dJ()
600+ (aG(aL((dC - dL)), dC) > bn())
592601 }
593602
594603
595-func dI (bF,dJ,cW,cX,cY,cZ) = {
596- let dK = aI(bF)
597- let dL = (0 > bF)
598- let dM = if ((dJ == ax))
604+func dM (bJ,dN,da,db,dc,dd) = {
605+ let dO = aL(bJ)
606+ let dP = (0 > bJ)
607+ let dQ = if ((dN == ay))
599608 then {
600- let dN = cU(!(dL), dK, false, cW, cX, cY, cZ)._1
601- dN
609+ let dR = cY(!(dP), dO, false, da, db, dc, dd)._1
610+ dR
602611 }
603- else aF(dK, dl())
604- dM
612+ else aI(dO, dp())
613+ dQ
605614 }
606615
607616
608-func dO (bF,dP,cW,cX,cY,cZ,dJ) = if ((bF == 0))
617+func dS (bJ,dT,da,db,dc,dd,dN) = if ((bJ == 0))
609618 then throw("Invalid position size")
610619 else {
611- let dL = (0 > bF)
612- let dM = dI(bF, dJ, cW, cX, cY, cZ)
613- let dQ = if (dL)
614- then (dP - dM)
615- else (dM - dP)
616- $Tuple2(dM, dQ)
620+ let dP = (0 > bJ)
621+ let dQ = dM(bJ, dN, da, db, dc, dd)
622+ let dU = if (dP)
623+ then (dT - dQ)
624+ else (dQ - dT)
625+ $Tuple2(dQ, dU)
617626 }
618627
619628
620-func dR (bH,bI,dJ) = {
621- let dS = bG(bH, bI)
622- let bM = dS._1
623- let dT = dS._2
624- let dU = dS._3
625- let dV = dS._4
626- dO(bM, dU, aV(), aX(), aW(), aY(), dJ)
629+func dV (bL,bM,dN) = {
630+ let dW = bK(bL, bM)
631+ let bQ = dW._1
632+ let dX = dW._2
633+ let dY = dW._3
634+ let dZ = dW._4
635+ dS(bQ, dY, aY(), ba(), aZ(), bb(), dN)
627636 }
628637
629638
630-func dW (dX,dY,dZ) = aD((dX - dY), dZ)
639+func ea (eb,ec,ed) = aG((eb - ec), ed)
631640
632641
633-func ea (bH,bI,dJ) = {
634- let eb = bG(bH, bI)
635- let bM = eb._1
636- let dT = eb._2
637- let ec = eb._3
638- let ed = eb._4
639- let ee = eb._5
640- let ef = dR(bH, bI, dJ)
641- let dM = ef._1
642- let dQ = ef._2
643- let eg = cK(bM, dT, ed, ee, dQ)
644- let cS = eg._1
645- let cT = eg._2
646- dW(cS, cT, dM)
642+func ee (bL,bM,dN) = {
643+ let ef = bK(bL, bM)
644+ let bQ = ef._1
645+ let dX = ef._2
646+ let eg = ef._3
647+ let eh = ef._4
648+ let ei = ef._5
649+ let ej = dV(bL, bM, dN)
650+ let dQ = ej._1
651+ let dU = ej._2
652+ let ek = cO(bQ, dX, eh, ei, dU)
653+ let cW = ek._1
654+ let cX = ek._2
655+ ea(cW, cX, dQ)
647656 }
648657
649658
650-func eh (bH,bI) = ea(bH, bI, ax)
659+func el (bL,bM) = ee(bL, bM, ay)
651660
652661
653-func ei (bH,bF) = {
654- let ej = aJ(bj(), (au - aD(eh(bH, bN(bF)), bh())))
655- let ek = aF(aI(bF), ej)
656- let el = df((bF > 0), ek, false)
657- let em = el._1
658- let cD = el._7
659- if ((bl() > cD))
660- then ek
661- else aF(aI(bF), bj())
662+func em (bL,bJ) = {
663+ let en = aM(bm(), (av - aG(el(bL, bR(bJ)), bk())))
664+ let eo = aI(aL(bJ), en)
665+ let ep = dj((bJ > 0), eo, false)
666+ let eq = ep._1
667+ let cH = ep._7
668+ if ((bo() > cH))
669+ then eo
670+ else aI(aL(bJ), bm())
662671 }
663672
664673
665-func en (bH,bI,eo,ep,eq,er,cV,es) = {
666- let et = bG(bH, bI)
667- let eu = et._1
668- let ev = et._2
669- let ew = et._3
670- let ex = et._4
671- let ey = et._5
672- let ez = (eu > 0)
673- let eA = aI(eu)
674- if (if ((eA >= eo))
675- then (eo > 0)
674+func er (bL,bM,es,et,eu,ev,cZ,ew) = {
675+ let ex = bK(bL, bM)
676+ let ey = ex._1
677+ let ez = ex._2
678+ let eA = ex._3
679+ let eB = ex._4
680+ let eC = ex._5
681+ let eD = (ey > 0)
682+ let eE = aL(ey)
683+ if (if ((eE >= es))
684+ then (es > 0)
676685 else false)
677686 then {
678- let eB = (eA > eo)
679- let eC = df((eu > 0), eo, cV)
680- let eD = eC._1
681- let cs = eC._2
682- let ct = eC._3
683- let eE = eC._4
684- let eF = if ((eu > 0))
685- then -(eo)
686- else eo
687- let eG = dR(bH, bI, ax)
687+ let eF = (eE > es)
688+ let eG = dj((ey > 0), es, cZ)
688689 let eH = eG._1
689- let dQ = eG._2
690- let eI = aD(aI(eF), eA)
691- let eJ = aF(dQ, eI)
692- let eK = cK(eu, ev, ex, ey, dQ)
690+ let cw = eG._2
691+ let cx = eG._3
692+ let eI = eG._4
693+ let eJ = if ((ey > 0))
694+ then -(es)
695+ else es
696+ let eK = dV(bL, bM, ay)
693697 let eL = eK._1
694- let eM = eK._2
695- let eN = eK._3
696- let cJ = eK._4
697- let eO = cK(eu, ev, ex, ey, eJ)._2
698- let eP = aF(aF(eH, eI), ep)
699- let eQ = (dQ - eJ)
700- let eR = if ((eu > 0))
701- then ((eH - eD) - eQ)
702- else ((eQ + eH) - eD)
703- let eS = (eu + eF)
704- let eT = if ((eS == 0))
698+ let dU = eK._2
699+ let eM = aG(aL(eJ), eE)
700+ let eN = aI(dU, eM)
701+ let eO = cO(ey, ez, eB, eC, dU)
702+ let eP = eO._1
703+ let eQ = eO._2
704+ let eR = eO._3
705+ let cN = eO._4
706+ let eS = cO(ey, ez, eB, eC, eN)._2
707+ let eT = aI(aI(eL, eM), et)
708+ let eU = (dU - eN)
709+ let eV = if ((ey > 0))
710+ then ((eL - eH) - eU)
711+ else ((eU + eL) - eH)
712+ let eW = (ey + eJ)
713+ let eX = if ((eW == 0))
705714 then $Tuple2(0, 0)
706- else $Tuple2(aI(eR), bE(eS))
707- let eU = eT._1
708- let eV = eT._2
709- let eW = (ew - eU)
710- let eX = ea(bH, bI, ax)
711- let eY = if ((eu > 0))
712- then (aF((eU + eQ), eX) - eQ)
713- else (aF((eU - eQ), eX) - eQ)
714- let eZ = ((eL - (eY + eQ)) - eP)
715- let fa = if ((0 > eZ))
716- then if (es)
715+ else $Tuple2(aL(eV), bI(eW))
716+ let eY = eX._1
717+ let eZ = eX._2
718+ let fa = (eA - eY)
719+ let fb = ee(bL, bM, ay)
720+ let fc = if ((ey > 0))
721+ then (aI((eY + eU), fb) - eU)
722+ else (aI((eY - eU), fb) - eU)
723+ let fd = ((eP - (fc + eU)) - eT)
724+ let fe = if ((0 > fd))
725+ then if (ew)
717726 then 0
718727 else throw("Invalid internalClosePosition params: unable to pay fee")
719- else eZ
720- let fb = if (er)
721- then (eY + fa)
722- else eY
723- if (if ((eq != 0))
724- then (eq > eD)
728+ else fd
729+ let ff = if (ev)
730+ then (fc + fe)
731+ else fc
732+ if (if ((eu != 0))
733+ then (eu > eH)
725734 else false)
726- then throw(((("Limit error: " + toString(eD)) + " < ") + toString(eq)))
727- else $Tuple17(eS, fb, eU, eV, eO, eJ, if (if (er)
728- then eB
735+ then throw(((("Limit error: " + toString(eH)) + " < ") + toString(eu)))
736+ else $Tuple17(eW, ff, eY, eZ, eS, eN, if (if (ev)
737+ then eF
729738 else false)
730739 then 0
731- else fa, cs, ct, eE, (ba() - eW), (br() - (if (ez)
732- then aI(eF)
733- else 0)), (bq() - (if (!(ez))
734- then aI(eF)
735- else 0)), (bc() - (if (ez)
736- then eW
737- else 0)), (bb() - (if (!(ez))
738- then eW
739- else 0)), (eP + cJ), eD)
740+ else fe, cw, cx, eI, (bd() - fa), (bu() - (if (eD)
741+ then aL(eJ)
742+ else 0)), (bt() - (if (!(eD))
743+ then aL(eJ)
744+ else 0)), (bf() - (if (eD)
745+ then fa
746+ else 0)), (be() - (if (!(eD))
747+ then fa
748+ else 0)), (eT + cN), eH)
740749 }
741- else throw(((("Invalid internalClosePosition params: invalid position size: " + toString(eo)) + " max: ") + toString(eA)))
750+ else throw(((("Invalid internalClosePosition params: invalid position size: " + toString(es)) + " max: ") + toString(eE)))
742751 }
743752
744753
745-func fc () = {
746- let bF = aZ()
747- if ((bF == 0))
748- then $Tuple2(aV(), aW())
754+func fg () = {
755+ let bJ = bc()
756+ if ((bJ == 0))
757+ then $Tuple2(aY(), aZ())
749758 else {
750- let fd = (bF > 0)
751- let fe = df(fd, aI(bF), false)
752- let ff = fe._1
753- let fg = fe._2
754- let fh = fe._3
755- $Tuple2(fg, fh)
759+ let fh = (bJ > 0)
760+ let fi = dj(fh, aL(bJ), false)
761+ let fj = fi._1
762+ let fk = fi._2
763+ let fl = fi._3
764+ $Tuple2(fk, fl)
756765 }
757766 }
758767
759768
760-func fi (fj,aZ,fk,fl) = {
761- let fm = toBigInt(fj)
762- let fn = toBigInt(aZ)
763- let fo = toBigInt(fk)
764- let fp = toBigInt(fl)
765- let aL = aH(fo, fm)
766- let fq = (fm + fn)
767- let fr = aG(aL, fq)
768- let fs = aG(fr, fq)
769- let ft = aG(fp, fs)
770- toInt(ft)
769+func fm (fn,bc,fo,fp) = {
770+ let fq = toBigInt(fn)
771+ let fr = toBigInt(bc)
772+ let fs = toBigInt(fo)
773+ let ft = toBigInt(fp)
774+ let aO = aK(fs, fq)
775+ let fu = (fq + fr)
776+ let fv = aJ(aO, fu)
777+ let fw = aJ(fv, fu)
778+ let fx = aJ(ft, fw)
779+ toInt(fx)
771780 }
772781
773782
774-func fu (fv,ck,cl) = {
775- let bF = aZ()
776- if ((bF == 0))
783+func fy (fz,co,cp) = {
784+ let bJ = bc()
785+ if ((bJ == 0))
777786 then {
778- let fw = aD(aF(fv, cl), ck)
779- $Tuple3(fw, au, 0)
787+ let fA = aG(aI(fz, cp), co)
788+ $Tuple3(fA, av, 0)
780789 }
781790 else {
782- let fd = (bF > 0)
783- let ff = df(fd, aI(bF), false)._1
784- let fw = fi(cl, bF, ck, fv)
785- let fx = au
786- let fy = dO(bF, ff, ck, fw, cl, fx, ax)._2
787- $Tuple3(fw, fx, fy)
791+ let fh = (bJ > 0)
792+ let fj = dj(fh, aL(bJ), false)._1
793+ let fA = fm(cp, bJ, co, fz)
794+ let fB = av
795+ let fC = dS(bJ, fj, co, fA, cp, fB, ay)._2
796+ $Tuple3(fA, fB, fC)
788797 }
789798 }
790799
791800
792-func fz () = {
793- let fA = dl()
794- let fB = dF()
795- let fC = (fB - fA)
796- if (if (if ((bq() == 0))
801+func fD () = {
802+ let fE = dp()
803+ let fF = dJ()
804+ let fG = (fF - fE)
805+ if (if (dv())
797806 then true
798- else (br() == 0))
799- then true
800- else dr())
807+ else if ((by() == aA))
808+ then if ((bt() == 0))
809+ then true
810+ else (bu() == 0)
811+ else false)
801812 then $Tuple3(0, 0, 0)
802- else if ((0 > fC))
813+ else if ((0 > fG))
803814 then {
804- let fD = aD(aF(fC, bf()), aw)
805- if ((bv() == az))
815+ let fH = aG(aI(fG, bi()), ax)
816+ if ((by() == aA))
806817 then {
807- let fE = aD(aF(fD, bq()), br())
808- $Tuple3(fD, fE, 0)
818+ let fI = aG(aI(fH, bt()), bu())
819+ $Tuple3(fH, fI, 0)
809820 }
810821 else {
811- let fF = aI(aF(fD, bq()))
812- let fG = aI(aF(fD, br()))
813- let fH = (fF - fG)
814- $Tuple3(fD, fD, fH)
822+ let fJ = aL(aI(fH, bt()))
823+ let fK = aL(aI(fH, bu()))
824+ let fL = (fJ - fK)
825+ $Tuple3(fH, fH, fL)
815826 }
816827 }
817828 else {
818- let fE = aD(aF(fC, bf()), aw)
819- if ((bv() == az))
829+ let fI = aG(aI(fG, bi()), ax)
830+ if ((by() == aA))
820831 then {
821- let fD = aD(aF(fE, br()), bq())
822- $Tuple3(fD, fE, 0)
832+ let fH = aG(aI(fI, bu()), bt())
833+ $Tuple3(fH, fI, 0)
823834 }
824835 else {
825- let fG = aI(aF(fE, br()))
826- let fF = aI(aF(fE, bq()))
827- let fH = (fG - fF)
828- $Tuple3(fE, fE, fH)
836+ let fK = aL(aI(fI, bu()))
837+ let fJ = aL(aI(fI, bt()))
838+ let fL = (fK - fJ)
839+ $Tuple3(fI, fI, fL)
829840 }
830841 }
831842 }
832843
833844
834-func fI (fJ,fK) = {
835- let fL = aS()
836- let fM = aF(fL, fK)
837- let fN = if ((fJ != ""))
845+func fM (fN,fO) = {
846+ let fP = aV()
847+ let fQ = aI(fP, fO)
848+ let fR = if ((fN != ""))
838849 then {
839- let fO = aO(am(), ab(ao, fJ))
840- if ((fO == ap))
850+ let fS = aR(an(), ac(ap, fN))
851+ if ((fS == aq))
841852 then {
842- let fP = aQ(am(), ab(an, fJ))
843- let fQ = aF(fM, fP)
844- $Tuple2(fQ, true)
853+ let fT = aT(an(), ac(ao, fN))
854+ let fU = aI(fQ, fT)
855+ $Tuple2(fU, true)
845856 }
846857 else throw("Invalid attached artifact")
847858 }
848- else $Tuple2(fM, false)
849- let fQ = fN._1
850- let fR = fN._2
851- $Tuple2(fQ, fR)
859+ else $Tuple2(fQ, false)
860+ let fU = fR._1
861+ let fV = fR._2
862+ $Tuple2(fU, fV)
852863 }
853864
854865
855-func fS (bH,fJ) = {
856- let fT = invoke(aj(), "computeFeeDiscount", [bH], nil)
857- if ((fT == fT))
866+func fW (bL,fN) = {
867+ let fX = invoke(ak(), "computeFeeDiscount", [bL], nil)
868+ if ((fX == fX))
858869 then {
859- let fU = {
860- let bL = fT
861- if ($isInstanceOf(bL, "Int"))
870+ let fY = {
871+ let bP = fX
872+ if ($isInstanceOf(bP, "Int"))
862873 then {
863- let fV = bL
864- fV
874+ let fZ = bP
875+ fZ
865876 }
866877 else throw("Invalid computeFeeDiscount result")
867878 }
868- let fW = fI(fJ, fU)
869- let fQ = fW._1
870- let fR = fW._2
871- $Tuple2(fQ, fR)
879+ let ga = fM(fN, fY)
880+ let fU = ga._1
881+ let fV = ga._2
882+ $Tuple2(fU, fV)
872883 }
873884 else throw("Strict value is not equal to itself.")
874885 }
875886
876887
877-func fX (by) = {
878- let fY = if ((size(by.payments) > 1))
879- then toBase58String(valueOrErrorMessage(by.payments[1].assetId, "Invalid artifactId"))
888+func gb (bC) = {
889+ let gc = if ((size(bC.payments) > 1))
890+ then toBase58String(valueOrErrorMessage(bC.payments[1].assetId, "Invalid artifactId"))
880891 else ""
881- fY
892+ gc
882893 }
883894
884895
885-func fZ (ga) = {
886- let gb = aF(ga, bt())
887- let gc = (ga - gb)
888- $Tuple2(gb, gc)
896+func gd (ge) = {
897+ let gf = aI(ge, bw())
898+ let gg = (ge - gf)
899+ $Tuple2(gf, gg)
889900 }
890901
891902
892-func gd (ge,gf,gg,gh,ep,gi,gj,gk,gl,dE,gm,gn,go,gp) = [IntegerEntry(r, ge), IntegerEntry(s, gf), IntegerEntry(t, gg), IntegerEntry(q, gh), IntegerEntry(o, ep), IntegerEntry(v, gi), IntegerEntry(w, gj), IntegerEntry(u, gk), IntegerEntry(x, gl), IntegerEntry(y, dE), IntegerEntry(z, gm), IntegerEntry(A, gm), IntegerEntry(p, go), IntegerEntry(B, gp)]
903+func gh (gi,gj,gk,gl,et,gm,gn,go,gp,dI,gq,gr,gs,gt,gu) = [IntegerEntry(r, gi), IntegerEntry(s, gj), IntegerEntry(t, gk), IntegerEntry(q, gl), IntegerEntry(o, et), IntegerEntry(v, gm), IntegerEntry(w, gn), IntegerEntry(u, go), IntegerEntry(x, gp), IntegerEntry(y, dI), IntegerEntry(z, gq), IntegerEntry(A, gr), IntegerEntry(p, gs), IntegerEntry(B, gt), IntegerEntry(C, gu)]
893904
894905
895-func gq (gr,gs,gt,gu,gv) = [IntegerEntry(E, gr), IntegerEntry(C, gs), IntegerEntry(D, gt), IntegerEntry(F, gu), IntegerEntry(G, gv)]
906+func gv (gw,gx,gy,gz,gA) = [IntegerEntry(F, gw), IntegerEntry(D, gx), IntegerEntry(E, gy), IntegerEntry(G, gz), IntegerEntry(H, gA)]
896907
897908
898-func gw (gx,bH,bI) = {
899- let bJ = ((bH + "_") + toString(bI))
900- if (gx)
909+func gB (gC,bL,bM) = {
910+ let bN = ((bL + "_") + toString(bM))
911+ if (gC)
901912 then {
902- let gy = bs()
903-[IntegerEntry(ab(i, bJ), (gy + 1)), IntegerEntry(d, (gy + 1))]
913+ let gD = bv()
914+[IntegerEntry(ac(i, bN), (gD + 1)), IntegerEntry(d, (gD + 1))]
904915 }
905916 else nil
906917 }
907918
908919
909-func gz (gx,bH,bI,ep) = {
910- let bJ = ((bH + "_") + toString(bI))
911- if (gx)
912- then [IntegerEntry(ab(j, bJ), ep)]
920+func gE (gC,bL,bM,et) = {
921+ let bN = ((bL + "_") + toString(bM))
922+ if (gC)
923+ then [IntegerEntry(ac(j, bN), et)]
913924 else nil
914925 }
915926
916927
917-func gA (bH,eo,gB,gC,cP,gD) = {
918- let fd = bN(eo)
919- let bJ = ((bH + "_") + toString(fd))
920-[IntegerEntry(ab(e, bJ), eo), IntegerEntry(ab(f, bJ), gB), IntegerEntry(ab(g, bJ), gC), IntegerEntry(ab(h, bJ), cP), IntegerEntry(ab(k, bJ), gD)]
928+func gF (bL,es,gG,gH,cT,gI) = {
929+ let fh = bR(es)
930+ let bN = ((bL + "_") + toString(fh))
931+[IntegerEntry(ac(e, bN), es), IntegerEntry(ac(f, bN), gG), IntegerEntry(ac(g, bN), gH), IntegerEntry(ac(h, bN), cT), IntegerEntry(ac(k, bN), gI)]
921932 }
922933
923934
924-func gE (ck,cl) = [IntegerEntry(H, ck), IntegerEntry(I, cl)]
935+func gJ (co,cp) = if (if ((0 > co))
936+ then true
937+ else (0 > cp))
938+ then throw("Invalid amount to update reserves")
939+ else [IntegerEntry(I, co), IntegerEntry(J, cp)]
925940
926941
927-func gF (cp,cq) = [IntegerEntry(J, cp), IntegerEntry(K, cq)]
942+func gK (ct,cu) = [IntegerEntry(K, ct), IntegerEntry(L, cu)]
928943
929944
930-func gG (ck,cl,gH,gI,gJ,gK,gL,gM) = {
931- let cp = aX()
932- let cq = aY()
933- if (((gJ - gK) != gH))
934- then throw(((((("Invalid AMM state data: " + toString(gJ)) + " + ") + toString(gK)) + " != ") + toString(gH)))
935- else (gE(ck, cl) ++ [IntegerEntry(L, gH), IntegerEntry(O, gI), IntegerEntry(M, gJ), IntegerEntry(N, gK), IntegerEntry(Q, gL), IntegerEntry(P, gM)])
945+func gL (co,cp,gM,gN,gO,gP,gQ,gR) = {
946+ let ct = ba()
947+ let cu = bb()
948+ if (((gO - gP) != gM))
949+ then throw(((((("Invalid AMM state data: " + toString(gO)) + " + ") + toString(gP)) + " != ") + toString(gM)))
950+ else (gJ(co, cp) ++ [IntegerEntry(M, gM), IntegerEntry(P, gN), IntegerEntry(N, gO), IntegerEntry(O, gP), IntegerEntry(R, gQ), IntegerEntry(Q, gR)])
936951 }
937952
938953
939-func gN (bH,bI) = {
940- let bJ = ((bH + "_") + toString(bI))
941-[DeleteEntry(ab(e, bJ)), DeleteEntry(ab(f, bJ)), DeleteEntry(ab(g, bJ)), DeleteEntry(ab(h, bJ)), DeleteEntry(ab(j, bJ)), DeleteEntry(ab(k, bJ))]
954+func gS (bL,bM) = {
955+ let bN = ((bL + "_") + toString(bM))
956+[DeleteEntry(ac(e, bN)), DeleteEntry(ac(f, bN)), DeleteEntry(ac(g, bN)), DeleteEntry(ac(h, bN)), DeleteEntry(ac(j, bN)), DeleteEntry(ac(k, bN))]
942957 }
943958
944959
945-func gO (ad,gP) = {
946- let gQ = assetBalance(this, ag())
947- if ((gP > gQ))
948- then throw(((("Unable to withdraw " + toString(gP)) + " from contract balance ") + toString(gQ)))
949- else [ScriptTransfer(ad, gP, ag())]
960+func gT (ae,gU) = {
961+ let gV = assetBalance(this, ah())
962+ if ((gU > gV))
963+ then throw(((("Unable to withdraw " + toString(gU)) + " from contract balance ") + toString(gV)))
964+ else [ScriptTransfer(ae, gU, ah())]
950965 }
951966
952967
953-func gR (by) = if ((0 > by))
968+func gW (bC) = if ((0 > bC))
954969 then throw("Balance")
955- else [IntegerEntry(c, by)]
970+ else [IntegerEntry(c, bC)]
956971
957972
958-func gS (by) = [ScriptTransfer(ah(), by, ag())]
973+func gX (bC) = [ScriptTransfer(ai(), bC, ah())]
959974
960975
961-func gT (gU,by) = if (gU)
962- then [Burn(valueOrErrorMessage(by.payments[1].assetId, "Invalid artifact"), 1)]
976+func gY (gZ,bC) = if (gZ)
977+ then [Burn(valueOrErrorMessage(bC.payments[1].assetId, "Invalid artifact"), 1)]
963978 else nil
964979
965980
966-@Callable(by)
967-func pause () = if ((by.caller != af()))
981+@Callable(bC)
982+func pause () = if ((bC.caller != ag()))
968983 then throw("Invalid pause params")
969984 else [BooleanEntry(m, true)]
970985
971986
972987
973-@Callable(by)
974-func unpause () = if ((by.caller != af()))
988+@Callable(bC)
989+func unpause () = if ((bC.caller != ag()))
975990 then throw("Invalid unpause params")
976991 else [BooleanEntry(m, false)]
977992
978993
979994
980-@Callable(by)
981-func setCloseOnly () = if ((by.caller != af()))
995+@Callable(bC)
996+func setCloseOnly () = if ((bC.caller != ag()))
982997 then throw("Invalid setCloseOnly params")
983998 else [BooleanEntry(n, true)]
984999
9851000
9861001
987-@Callable(by)
988-func unsetCloseOnly () = if ((by.caller != af()))
1002+@Callable(bC)
1003+func unsetCloseOnly () = if ((bC.caller != ag()))
9891004 then throw("Invalid unsetCloseOnly params")
9901005 else [BooleanEntry(n, false)]
9911006
9921007
9931008
994-@Callable(by)
995-func addLiquidity (cf) = if (if ((by.caller != af()))
1009+@Callable(bC)
1010+func changeLiquidity (cj) = if (if ((bC.caller != ag()))
9961011 then true
997- else (0 >= cf))
998- then throw("Invalid addLiquidity params")
1012+ else (cj == 0))
1013+ then throw("Invalid changeLiquidity params")
9991014 else {
1000- let ck = aV()
1001- let cl = aW()
1002- let cp = aX()
1003- let cq = aY()
1004- let gV = aD(aF(ck, cp), aF(cl, cq))
1005- let gW = (ck + cf)
1006- let gX = (aD(aF(gW, cp), gV) - cl)
1007- let gY = (cl + gX)
1008- let gZ = fu(dl(), gW, gY)
1009- let ha = gZ._1
1010- let hb = gZ._2
1011- let fy = gZ._3
1012- let hc = if ((fy != 0))
1015+ let co = aY()
1016+ let cp = aZ()
1017+ let ct = ba()
1018+ let cu = bb()
1019+ let ha = aG(aI(co, ct), aI(cp, cu))
1020+ let hb = (co + cj)
1021+ let hc = (aG(aI(hb, ct), ha) - cp)
1022+ let hd = (cp + hc)
1023+ let he = fy(dp(), hb, hd)
1024+ let hf = he._1
1025+ let hg = he._2
1026+ let fC = he._3
1027+ let hh = if ((fC != 0))
10131028 then {
1014- let hc = invoke(ai(), "exchangeFreeAndLocked", [fy], nil)
1015- if ((hc == hc))
1029+ let hh = invoke(aj(), "exchangeFreeAndLocked", [fC], nil)
1030+ if ((hh == hh))
10161031 then nil
10171032 else throw("Strict value is not equal to itself.")
10181033 }
10191034 else nil
1020- if ((hc == hc))
1021- then (gE(gW, gY) ++ gF(ha, hb))
1035+ if ((hh == hh))
1036+ then (gJ(hb, hd) ++ gK(hf, hg))
10221037 else throw("Strict value is not equal to itself.")
10231038 }
10241039
10251040
10261041
1027-@Callable(by)
1028-func removeLiquidity (cf) = if (if ((by.caller != af()))
1029- then true
1030- else (cf >= 0))
1031- then throw("Invalid removeLiquidity params")
1032- else {
1033- let ck = aV()
1034- let cl = aW()
1035- let cp = aX()
1036- let cq = aY()
1037- let gV = aD(aF(ck, cp), aF(cl, cq))
1038- let gW = (ck - cf)
1039- let hd = aI((aD(aF(gW, cp), gV) - cl))
1040- let gY = (cl - hd)
1041- let he = fu(dl(), gW, gY)
1042- let ha = he._1
1043- let hb = he._2
1044- let fy = he._3
1045- let hc = if ((fy != 0))
1046- then {
1047- let hc = invoke(ai(), "exchangeFreeAndLocked", [fy], nil)
1048- if ((hc == hc))
1049- then nil
1050- else throw("Strict value is not equal to itself.")
1051- }
1052- else nil
1053- if ((hc == hc))
1054- then (gE(gW, gY) ++ gF(ha, hb))
1055- else throw("Strict value is not equal to itself.")
1056- }
1057-
1058-
1059-
1060-@Callable(by)
1061-func changeSettings (ge,gf,gg,gh,ep,gi,gj,gk,gl,dE,gm,gn,go,gp) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= gh))
1062- then true
1063- else (0 >= ge))
1064- then true
1065- else (0 >= gf))
1066- then true
1067- else (0 >= gg))
1068- then true
1069- else (0 >= ep))
1042+@Callable(bC)
1043+func changeSettings (gi,gj,gk,gl,et,gm,gn,go,gp,dI,gq,gr,gs,gt,gu) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= gl))
10701044 then true
10711045 else (0 >= gi))
10721046 then true
10731047 else (0 >= gj))
10741048 then true
10751049 else (0 >= gk))
10761050 then true
1077- else (0 >= gl))
1078- then true
1079- else (0 >= dE))
1051+ else (0 >= et))
10801052 then true
10811053 else (0 >= gm))
1082- then true
1083- else (gm > au))
10841054 then true
10851055 else (0 >= gn))
10861056 then true
10871057 else (0 >= go))
10881058 then true
1089- else if ((gp != aA))
1090- then (gp != az)
1059+ else (0 >= gp))
1060+ then true
1061+ else (0 >= dI))
1062+ then true
1063+ else (0 >= gq))
1064+ then true
1065+ else (gq > av))
1066+ then true
1067+ else (0 >= gr))
1068+ then true
1069+ else (0 >= gs))
1070+ then true
1071+ else if ((gt != aB))
1072+ then (gt != aA)
10911073 else false)
10921074 then true
1093- else !(ca()))
1075+ else if ((gu != aC))
1076+ then (gu != aD)
1077+ else false)
10941078 then true
1095- else (by.caller != af()))
1079+ else !(ce()))
1080+ then true
1081+ else (bC.caller != ag()))
10961082 then throw("Invalid changeSettings params")
1097- else gd(ge, gf, gg, gh, ep, gi, gj, gk, gl, dE, gm, gn, go, gp)
1083+ else gh(gi, gj, gk, gl, et, gm, gn, go, gp, dI, gq, gr, gs, gt, gu)
10981084
10991085
11001086
1101-@Callable(by)
1102-func initialize (ck,cl,gh,ge,gf,gg,ep,hf,hg,hh,gi,gj,gk,gl,dE,gm,gn,go,gp) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= ck))
1087+@Callable(bC)
1088+func initialize (co,cp,gl,gi,gj,gk,et,hi,hj,hk,gm,gn,go,gp,dI,gq,gr,gs,gt,gu) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= co))
11031089 then true
1104- else (0 >= cl))
1090+ else (0 >= cp))
11051091 then true
1106- else (0 >= gh))
1107- then true
1108- else (0 >= ge))
1109- then true
1110- else (0 >= gf))
1111- then true
1112- else (0 >= gg))
1113- then true
1114- else (0 >= ep))
1092+ else (0 >= gl))
11151093 then true
11161094 else (0 >= gi))
11171095 then true
11181096 else (0 >= gj))
11191097 then true
11201098 else (0 >= gk))
11211099 then true
1122- else (0 >= gl))
1123- then true
1124- else (0 >= dE))
1100+ else (0 >= et))
11251101 then true
11261102 else (0 >= gm))
1127- then true
1128- else (gm > au))
11291103 then true
11301104 else (0 >= gn))
11311105 then true
11321106 else (0 >= go))
11331107 then true
1134- else if ((gp != aA))
1135- then (gp != az)
1108+ else (0 >= gp))
1109+ then true
1110+ else (0 >= dI))
1111+ then true
1112+ else (0 >= gq))
1113+ then true
1114+ else (gq > av))
1115+ then true
1116+ else (0 > gr))
1117+ then true
1118+ else (0 >= gs))
1119+ then true
1120+ else if ((gt != aB))
1121+ then (gt != aA)
11361122 else false)
11371123 then true
1138- else ca())
1124+ else if ((gu != aC))
1125+ then (gu != aD)
1126+ else false)
11391127 then true
1140- else (by.caller != this))
1128+ else ce())
1129+ then true
1130+ else (bC.caller != this))
11411131 then throw("Invalid initialize parameters")
1142- else ((((gG(ck, cl, 0, 0, 0, 0, 0, 0) ++ gd(ge, gf, gg, gh, ep, gi, gj, gk, gl, dE, gm, gn, go, gp)) ++ gq((bw() + gh), 0, 0, 0, 0)) ++ gR(0)) ++ [BooleanEntry(l, true), StringEntry(a, hf), StringEntry(b, hg), StringEntry(S, toString(addressFromStringValue(hh)))])
1132+ else ((((gL(co, cp, 0, 0, 0, 0, 0, 0) ++ gh(gi, gj, gk, gl, et, gm, gn, go, gp, dI, gq, gr, gs, gt, gu)) ++ gv((bA() + gl), 0, 0, 0, 0)) ++ gW(0)) ++ [BooleanEntry(l, true), StringEntry(a, hi), StringEntry(b, hj), StringEntry(T, toString(addressFromStringValue(hk)))])
11431133
11441134
11451135
1146-@Callable(by)
1147-func increasePosition (bI,hi,hj,hk) = {
1148- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1149- if ((hl == hl))
1136+@Callable(bC)
1137+func increasePosition (bM,hl,hm,hn,ho) = {
1138+ let hp = invoke(this, "updateOracle", [ho], nil)
1139+ if ((hp == hp))
11501140 then {
1151- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1152- if ((hm == hm))
1141+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1142+ if ((hq == hq))
11531143 then {
1154- let bH = bx(by)
1155- let hn = by.payments[0].amount
1156- let ho = by.payments[0].assetId
1157- let hp = toBase58String(value(ho))
1158- let hq = (ho == ag())
1159- if (if (if (if (if (if (if (if (if ((bI != aq))
1160- then (bI != ar)
1161- else false)
1162- then true
1163- else (0 >= hn))
1164- then true
1165- else !(ca()))
1166- then true
1167- else !(hq))
1168- then true
1169- else !(bz(aD(au, hi), aU(), true)))
1170- then true
1171- else cb())
1172- then true
1173- else cc())
1174- then true
1175- else dr())
1176- then throw("Invalid increasePosition parameters")
1177- else {
1178- let hr = fS(bH, fX(by))
1179- let fQ = hr._1
1180- let fR = hr._2
1181- let gP = aD(hn, (aF(fQ, hi) + au))
1182- let hs = (hn - gP)
1183- let ht = invoke(al(), "acceptPaymentWithLink", [bH, hk], [AttachedPayment(ag(), hs)])
1184- if ((ht == ht))
1185- then {
1186- let hu = {
1187- let bL = ht
1188- if ($isInstanceOf(bL, "Int"))
1189- then {
1190- let fV = bL
1191- fV
1144+ let hr = invoke(this, "ensureCalledOnce", nil, nil)
1145+ if ((hr == hr))
1146+ then {
1147+ let bL = bB(bC)
1148+ let hs = bC.payments[0].amount
1149+ let ht = bC.payments[0].assetId
1150+ let hu = toBase58String(value(ht))
1151+ let hv = (ht == ah())
1152+ if (if (if (if (if (if (if (if (if ((bM != ar))
1153+ then (bM != as)
1154+ else false)
1155+ then true
1156+ else (0 >= hs))
1157+ then true
1158+ else !(ce()))
1159+ then true
1160+ else !(hv))
1161+ then true
1162+ else !(bD(aG(av, hl), aX(), true)))
1163+ then true
1164+ else cf())
1165+ then true
1166+ else cg())
1167+ then true
1168+ else dv())
1169+ then throw("Invalid increasePosition parameters")
1170+ else {
1171+ let hw = fW(bL, gb(bC))
1172+ let fU = hw._1
1173+ let fV = hw._2
1174+ let gU = aG(hs, (aI(fU, hl) + av))
1175+ let hx = (hs - gU)
1176+ let hy = invoke(am(), "acceptPaymentWithLink", [bL, hn], [AttachedPayment(ah(), hx)])
1177+ if ((hy == hy))
1178+ then {
1179+ let hz = {
1180+ let bP = hy
1181+ if ($isInstanceOf(bP, "Int"))
1182+ then {
1183+ let fZ = bP
1184+ fZ
1185+ }
1186+ else throw("Invalid referrerFee")
11921187 }
1193- else throw("Invalid referrerFee")
1194- }
1195- let hv = (hs - hu)
1196- let hw = bG(bH, bI)
1197- let eu = hw._1
1198- let ev = hw._2
1199- let ew = hw._3
1200- let ex = hw._4
1201- let ey = hw._5
1202- let hx = (eu == 0)
1203- let hy = if ((eu > 0))
1204- then (bI == aq)
1205- else (bI == ar)
1206- let hz = if (!(hx))
1207- then hy
1208- else false
1209- let hA = (bI == aq)
1210- let hB = if (if (hx)
1211- then true
1212- else hz)
1188+ let hA = (hx - hz)
1189+ let hB = bK(bL, bM)
1190+ let ey = hB._1
1191+ let ez = hB._2
1192+ let eA = hB._3
1193+ let eB = hB._4
1194+ let eC = hB._5
1195+ let hC = (ey == 0)
1196+ let hD = if ((ey > 0))
1197+ then (bM == ar)
1198+ else (bM == as)
1199+ let hE = if (!(hC))
1200+ then hD
1201+ else false
1202+ let hF = (bM == ar)
1203+ let hG = if (if (hC)
1204+ then true
1205+ else hE)
1206+ then {
1207+ let hH = aI(gU, hl)
1208+ let hI = cs(hF, hH)
1209+ let cz = hI._1
1210+ let cw = hI._2
1211+ let cx = hI._3
1212+ let eI = hI._4
1213+ if (if ((hm != 0))
1214+ then (hm > aL(cz))
1215+ else false)
1216+ then throw(((("Limit error: " + toString(aL(cz))) + " < ") + toString(hm)))
1217+ else {
1218+ let eW = (ey + cz)
1219+ let hJ = (bf() + (if ((eW > 0))
1220+ then hH
1221+ else 0))
1222+ let hK = (be() + (if ((0 > eW))
1223+ then hH
1224+ else 0))
1225+ let hL = cO(ey, ez, eB, eC, gU)
1226+ let cW = hL._1
1227+ let eQ = hL._2
1228+ let eR = hL._3
1229+ let cN = hL._4
1230+ if (!(dB(cw, cx)))
1231+ then throw("Over max spread limit")
1232+ else if (!(dF(hJ, hK)))
1233+ then throw("Over max open notional")
1234+ else $Tuple14(eW, cW, (eA + hH), bI(eW), bA(), cx, cw, eI, (bd() + hH), (bu() + (if ((eW > 0))
1235+ then aL(cz)
1236+ else 0)), (bt() + (if ((0 > eW))
1237+ then aL(cz)
1238+ else 0)), hJ, hK, cN)
1239+ }
1240+ }
1241+ else {
1242+ let hH = aI(gU, hl)
1243+ let hM = dV(toString(bC.caller), bM, ay)
1244+ let eL = hM._1
1245+ let dU = hM._2
1246+ if ((eL > hH))
1247+ then throw("Use decreasePosition to decrease position size")
1248+ else throw("Close position first")
1249+ }
1250+ let eW = hG._1
1251+ let hN = hG._2
1252+ let eY = hG._3
1253+ let hO = hG._4
1254+ let hP = hG._5
1255+ let cx = hG._6
1256+ let cw = hG._7
1257+ let eI = hG._8
1258+ let hQ = hG._9
1259+ let hR = hG._10
1260+ let hS = hG._11
1261+ let hJ = hG._12
1262+ let hK = hG._13
1263+ let cN = hG._14
1264+ let hT = gd((hA + cN))
1265+ let gf = hT._1
1266+ let gg = hT._2
1267+ let hU = if ((gU >= cN))
1268+ then invoke(aj(), "addLocked", nil, [AttachedPayment(ah(), (gU - cN))])
1269+ else invoke(aj(), "withdrawLocked", [(cN - gU)], nil)
1270+ if ((hU == hU))
1271+ then {
1272+ let hV = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gg)])
1273+ if ((hV == hV))
1274+ then {
1275+ let hW = invoke(ak(), "notifyFees", [bL, hA], nil)
1276+ if ((hW == hW))
1277+ then {
1278+ let hX = invoke(ak(), "notifyNotional", [bL, eY], nil)
1279+ if ((hX == hX))
1280+ then ((((((gF(bL, eW, hN, eY, hO, hP) ++ gB(hC, bL, bM)) ++ gE(hC, bL, bM, fU)) ++ gL(cw, cx, eI, hQ, hR, hS, hJ, hK)) ++ gX(gf)) ++ gW(((aU() + gU) - cN))) ++ gY(fV, bC))
1281+ else throw("Strict value is not equal to itself.")
1282+ }
1283+ else throw("Strict value is not equal to itself.")
1284+ }
1285+ else throw("Strict value is not equal to itself.")
1286+ }
1287+ else throw("Strict value is not equal to itself.")
1288+ }
1289+ else throw("Strict value is not equal to itself.")
1290+ }
1291+ }
1292+ else throw("Strict value is not equal to itself.")
1293+ }
1294+ else throw("Strict value is not equal to itself.")
1295+ }
1296+ else throw("Strict value is not equal to itself.")
1297+ }
1298+
1299+
1300+
1301+@Callable(bC)
1302+func addMargin (bM,ho) = {
1303+ let hp = invoke(this, "updateOracle", [ho], nil)
1304+ if ((hp == hp))
1305+ then {
1306+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1307+ if ((hq == hq))
1308+ then {
1309+ let hr = invoke(this, "ensureCalledOnce", nil, nil)
1310+ if ((hr == hr))
1311+ then {
1312+ let bL = toString(bC.caller)
1313+ let gU = bC.payments[0].amount
1314+ let ht = bC.payments[0].assetId
1315+ let hu = toBase58String(value(ht))
1316+ let hv = (ht == ah())
1317+ if (if (if (if (if (!(hv))
1318+ then true
1319+ else !(bV(toString(bC.caller), bM)))
1320+ then true
1321+ else !(ce()))
1322+ then true
1323+ else cf())
1324+ then true
1325+ else dv())
1326+ then throw("Invalid addMargin parameters")
1327+ else {
1328+ let hY = bK(bL, bM)
1329+ let ey = hY._1
1330+ let ez = hY._2
1331+ let eA = hY._3
1332+ let eB = hY._4
1333+ let eC = hY._5
1334+ let hU = invoke(aj(), "addLocked", nil, [AttachedPayment(ah(), gU)])
1335+ if ((hU == hU))
12131336 then {
1214- let hC = aF(gP, hi)
1215- let hD = co(hA, hC)
1216- let cv = hD._1
1217- let cs = hD._2
1218- let ct = hD._3
1219- let eE = hD._4
1220- if (if ((hj != 0))
1221- then (hj > aI(cv))
1222- else false)
1223- then throw(((("Limit error: " + toString(aI(cv))) + " < ") + toString(hj)))
1337+ let cN = cJ(ez, eC)
1338+ let hZ = if ((cN > 0))
1339+ then {
1340+ let ia = gd(cN)
1341+ let gf = ia._1
1342+ let gg = ia._2
1343+ let ib = invoke(aj(), "withdrawLocked", [gf], nil)
1344+ if ((ib == ib))
1345+ then {
1346+ let ic = invoke(aj(), "exchangeFreeAndLocked", [-(gg)], nil)
1347+ if ((ic == ic))
1348+ then gX(gf)
1349+ else throw("Strict value is not equal to itself.")
1350+ }
1351+ else throw("Strict value is not equal to itself.")
1352+ }
1353+ else nil
1354+ if ((hZ == hZ))
1355+ then ((gF(bL, ey, ((ez - cN) + gU), eA, eB, bA()) ++ gW(((aU() + gU) - cN))) ++ hZ)
1356+ else throw("Strict value is not equal to itself.")
1357+ }
1358+ else throw("Strict value is not equal to itself.")
1359+ }
1360+ }
1361+ else throw("Strict value is not equal to itself.")
1362+ }
1363+ else throw("Strict value is not equal to itself.")
1364+ }
1365+ else throw("Strict value is not equal to itself.")
1366+ }
1367+
1368+
1369+
1370+@Callable(bC)
1371+func removeMargin (gU,bM,ho) = {
1372+ let hp = invoke(this, "updateOracle", [ho], nil)
1373+ if ((hp == hp))
1374+ then {
1375+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1376+ if ((hq == hq))
1377+ then {
1378+ let hr = invoke(this, "ensureCalledOnce", nil, nil)
1379+ if ((hr == hr))
1380+ then {
1381+ let bL = toString(bC.caller)
1382+ if (if (if (if (if ((0 >= gU))
1383+ then true
1384+ else !(bV(bL, bM)))
1385+ then true
1386+ else !(ce()))
1387+ then true
1388+ else cf())
1389+ then true
1390+ else dv())
1391+ then throw("Invalid removeMargin parameters")
1392+ else {
1393+ let id = bK(bL, bM)
1394+ let ey = id._1
1395+ let ez = id._2
1396+ let eA = id._3
1397+ let eB = id._4
1398+ let eC = id._5
1399+ let ie = cO(ey, ez, eB, eC, -(gU))
1400+ let cW = ie._1
1401+ let cX = ie._2
1402+ let cS = ie._3
1403+ let cN = ie._4
1404+ if ((cX != 0))
1405+ then throw("Invalid removed margin amount")
1406+ else {
1407+ let fb = ea(cW, cX, eA)
1408+ if (!(bD(fb, aX(), true)))
1409+ then throw(((("Too much margin removed: " + toString(fb)) + " < ") + toString(aX())))
12241410 else {
1225- let eS = (eu + cv)
1226- let hE = (bc() + (if ((eS > 0))
1227- then hC
1228- else 0))
1229- let hF = (bb() + (if ((0 > eS))
1230- then hC
1231- else 0))
1232- let hG = cK(eu, ev, ex, ey, gP)
1233- let cS = hG._1
1234- let eM = hG._2
1235- let eN = hG._3
1236- let cJ = hG._4
1237- if (!(dx(cs, ct)))
1238- then throw("Over max spread limit")
1239- else if (!(dB(hE, hF)))
1240- then throw("Over max open notional")
1241- else $Tuple14(eS, cS, (ew + hC), bE(eS), bw(), ct, cs, eE, (ba() + hC), (br() + (if ((eS > 0))
1242- then aI(cv)
1243- else 0)), (bq() + (if ((0 > eS))
1244- then aI(cv)
1245- else 0)), hE, hF, cJ)
1411+ let if = gd(cN)
1412+ let gf = if._1
1413+ let gg = if._2
1414+ let hZ = if ((cN > 0))
1415+ then {
1416+ let ic = invoke(aj(), "exchangeFreeAndLocked", [-(gg)], nil)
1417+ if ((ic == ic))
1418+ then gX(gf)
1419+ else throw("Strict value is not equal to itself.")
1420+ }
1421+ else nil
1422+ if ((hZ == hZ))
1423+ then {
1424+ let ib = invoke(aj(), "withdrawLocked", [(gU + gf)], nil)
1425+ if ((ib == ib))
1426+ then (((gF(bL, ey, cW, eA, bI(ey), bA()) ++ gT(bC.caller, gU)) ++ gW(((aU() - gU) - cN))) ++ hZ)
1427+ else throw("Strict value is not equal to itself.")
1428+ }
1429+ else throw("Strict value is not equal to itself.")
12461430 }
12471431 }
1248- else {
1249- let hC = aF(gP, hi)
1250- let hH = dR(toString(by.caller), bI, ax)
1251- let eH = hH._1
1252- let dQ = hH._2
1253- if ((eH > hC))
1254- then throw("Use decreasePosition to decrease position size")
1255- else throw("Close position first")
1256- }
1257- let eS = hB._1
1258- let hI = hB._2
1259- let eU = hB._3
1260- let hJ = hB._4
1261- let hK = hB._5
1262- let ct = hB._6
1263- let cs = hB._7
1264- let eE = hB._8
1265- let hL = hB._9
1266- let hM = hB._10
1267- let hN = hB._11
1268- let hE = hB._12
1269- let hF = hB._13
1270- let cJ = hB._14
1271- let hO = fZ((hv + cJ))
1272- let gb = hO._1
1273- let gc = hO._2
1274- let hP = if ((gP >= cJ))
1275- then invoke(ai(), "addLocked", nil, [AttachedPayment(ag(), (gP - cJ))])
1276- else invoke(ai(), "withdrawLocked", [(cJ - gP)], nil)
1277- if ((hP == hP))
1432+ }
1433+ }
1434+ else throw("Strict value is not equal to itself.")
1435+ }
1436+ else throw("Strict value is not equal to itself.")
1437+ }
1438+ else throw("Strict value is not equal to itself.")
1439+ }
1440+
1441+
1442+
1443+@Callable(bC)
1444+func closePosition (es,bM,eu,ev,ho) = {
1445+ let hp = invoke(this, "updateOracle", [ho], nil)
1446+ if ((hp == hp))
1447+ then {
1448+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1449+ if ((hq == hq))
1450+ then {
1451+ let hr = invoke(this, "ensureCalledOnce", nil, nil)
1452+ if ((hr == hr))
1453+ then {
1454+ let bL = bB(bC)
1455+ let ig = valueOrErrorMessage(addressFromString(bL), "Invalid caller")
1456+ let bU = bS(bL, bM)
1457+ if (if (if (if (if (if (!(bV(bL, bM)))
1458+ then true
1459+ else !(ce()))
1460+ then true
1461+ else cf())
1462+ then true
1463+ else (0 >= es))
1464+ then true
1465+ else (0 > eu))
1466+ then true
1467+ else dv())
1468+ then throw("Invalid closePosition parameters")
1469+ else {
1470+ let eC = bK(bL, bM)._5
1471+ let ih = er(bL, bM, es, bU, eu, ev, true, true)
1472+ let eW = ih._1
1473+ let ff = ih._2
1474+ let eY = ih._3
1475+ let eZ = ih._4
1476+ let eS = ih._5
1477+ let eN = ih._6
1478+ let fe = ih._7
1479+ let cw = ih._8
1480+ let cx = ih._9
1481+ let eI = ih._10
1482+ let hQ = ih._11
1483+ let hR = ih._12
1484+ let hS = ih._13
1485+ let hJ = ih._14
1486+ let hK = ih._15
1487+ let ii = ih._16
1488+ if ((eS > 0))
1489+ then throw("Invalid closePosition parameters: bad debt")
1490+ else if ((eC >= bA()))
1491+ then throw("Invalid closePosition parameters: wait at least 1 block before closing the position")
1492+ else {
1493+ let eF = (eW != 0)
1494+ let ij = (fe + ii)
1495+ let ik = (aU() - ij)
1496+ let il = if ((0 > ik))
1497+ then 0
1498+ else ik
1499+ let ib = invoke(aj(), "withdrawLocked", [ij], nil)
1500+ if ((ib == ib))
1501+ then {
1502+ let hy = invoke(am(), "acceptPayment", [bL], [AttachedPayment(ah(), ii)])
1503+ if ((hy == hy))
1504+ then {
1505+ let hz = {
1506+ let bP = hy
1507+ if ($isInstanceOf(bP, "Int"))
1508+ then {
1509+ let fZ = bP
1510+ fZ
1511+ }
1512+ else throw("Invalid referrerFee")
1513+ }
1514+ let im = gd((ii - hz))
1515+ let gf = im._1
1516+ let gg = im._2
1517+ let hV = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gg)])
1518+ if ((hV == hV))
1519+ then {
1520+ let hW = invoke(ak(), "notifyFees", [bL, ii], nil)
1521+ if ((hW == hW))
1522+ then {
1523+ let hX = invoke(ak(), "notifyNotional", [bL, eY], nil)
1524+ if ((hX == hX))
1525+ then (((((if (eF)
1526+ then gF(bL, eW, ff, eY, eZ, bA())
1527+ else gS(bL, bM)) ++ gL(cw, cx, eI, hQ, hR, hS, hJ, hK)) ++ (if ((fe > 0))
1528+ then gT(ig, fe)
1529+ else nil)) ++ gW(il)) ++ gX(gf))
1530+ else throw("Strict value is not equal to itself.")
1531+ }
1532+ else throw("Strict value is not equal to itself.")
1533+ }
1534+ else throw("Strict value is not equal to itself.")
1535+ }
1536+ else throw("Strict value is not equal to itself.")
1537+ }
1538+ else throw("Strict value is not equal to itself.")
1539+ }
1540+ }
1541+ }
1542+ else throw("Strict value is not equal to itself.")
1543+ }
1544+ else throw("Strict value is not equal to itself.")
1545+ }
1546+ else throw("Strict value is not equal to itself.")
1547+ }
1548+
1549+
1550+
1551+@Callable(bC)
1552+func liquidate (bL,bM,ho) = {
1553+ let hp = invoke(this, "updateOracle", [ho], nil)
1554+ if ((hp == hp))
1555+ then {
1556+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1557+ if ((hq == hq))
1558+ then {
1559+ let in = ee(bL, bM, ay)
1560+ let io = if (dK())
1561+ then {
1562+ let ip = ee(bL, bM, az)
1563+ aM(in, ip)
1564+ }
1565+ else in
1566+ if (if (if (if (if (!(bD(io, bk(), false)))
1567+ then true
1568+ else !(bV(bL, bM)))
1569+ then true
1570+ else !(ce()))
1571+ then true
1572+ else cf())
1573+ then true
1574+ else dv())
1575+ then throw("Unable to liquidate")
1576+ else {
1577+ let iq = if (if ((in > bl()))
1578+ then (bm() > 0)
1579+ else false)
1580+ then (av > bm())
1581+ else false
1582+ let ey = bK(bL, bM)._1
1583+ let dO = aL(ey)
1584+ let ir = if (iq)
1585+ then {
1586+ let is = em(bL, ey)
1587+ let it = aG(aL(is), dO)
1588+ $Tuple2(it, aL(is))
1589+ }
1590+ else $Tuple2(0, dO)
1591+ let it = ir._1
1592+ let is = ir._2
1593+ let iu = er(bL, bM, if (iq)
1594+ then is
1595+ else dO, bl(), 0, true, false, true)
1596+ let eW = iu._1
1597+ let ff = iu._2
1598+ let eY = iu._3
1599+ let eZ = iu._4
1600+ let eS = iu._5
1601+ let eN = iu._6
1602+ let fe = iu._7
1603+ let cw = iu._8
1604+ let cx = iu._9
1605+ let eI = iu._10
1606+ let hQ = iu._11
1607+ let hR = iu._12
1608+ let hS = iu._13
1609+ let hJ = iu._14
1610+ let hK = iu._15
1611+ let iv = iu._16
1612+ let iw = (iv / 2)
1613+ let gg = (iv - iw)
1614+ let ik = (aU() - iv)
1615+ let ix = if ((0 > ik))
1616+ then 0
1617+ else ik
1618+ let ic = if ((eS > 0))
1619+ then {
1620+ let ic = invoke(aj(), "exchangeFreeAndLocked", [(eS + iv)], nil)
1621+ if ((ic == ic))
1622+ then nil
1623+ else throw("Strict value is not equal to itself.")
1624+ }
1625+ else nil
1626+ if ((ic == ic))
1627+ then {
1628+ let ib = invoke(aj(), "withdrawLocked", [iv], nil)
1629+ if ((ib == ib))
12781630 then {
1279- let hQ = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1280- if ((hQ == hQ))
1631+ let iy = invoke(aj(), "addFree", nil, [AttachedPayment(ah(), gg)])
1632+ if ((iy == iy))
12811633 then {
1282- let hR = invoke(aj(), "notifyFees", [bH, hv], nil)
1283- if ((hR == hR))
1284- then {
1285- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1286- if ((hS == hS))
1287- then ((((((gA(bH, eS, hI, eU, hJ, hK) ++ gw(hx, bH, bI)) ++ gz(hx, bH, bI, fQ)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ gS(gb)) ++ gR(((aR() + gP) - cJ))) ++ gT(fR, by))
1288- else throw("Strict value is not equal to itself.")
1289- }
1634+ let hX = invoke(ak(), "notifyNotional", [bL, eY], nil)
1635+ if ((hX == hX))
1636+ then ((((if (iq)
1637+ then gF(bL, eW, ff, eY, eZ, bA())
1638+ else gS(bL, bM)) ++ gL(cw, cx, eI, hQ, hR, hS, hJ, hK)) ++ gT(bC.caller, iw)) ++ gW(ix))
12901639 else throw("Strict value is not equal to itself.")
12911640 }
12921641 else throw("Strict value is not equal to itself.")
12931642 }
12941643 else throw("Strict value is not equal to itself.")
12951644 }
12961645 else throw("Strict value is not equal to itself.")
12971646 }
12981647 }
12991648 else throw("Strict value is not equal to itself.")
13001649 }
13011650 else throw("Strict value is not equal to itself.")
13021651 }
13031652
13041653
13051654
1306-@Callable(by)
1307-func addMargin (bI) = {
1308- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1309- if ((hl == hl))
1655+@Callable(bC)
1656+func payFunding (ho) = {
1657+ let hp = invoke(this, "updateOracle", [ho], nil)
1658+ if ((hp == hp))
13101659 then {
1311- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1312- if ((hm == hm))
1660+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1661+ if ((hq == hq))
13131662 then {
1314- let bH = toString(by.caller)
1315- let gP = by.payments[0].amount
1316- let ho = by.payments[0].assetId
1317- let hp = toBase58String(value(ho))
1318- let hq = (ho == ag())
1319- if (if (if (if (if (!(hq))
1663+ let iz = bg()
1664+ if (if (if ((iz > bA()))
13201665 then true
1321- else !(bR(toString(by.caller), bI)))
1666+ else !(ce()))
13221667 then true
1323- else !(ca()))
1324- then true
1325- else cb())
1326- then true
1327- else dr())
1328- then throw("Invalid addMargin parameters")
1668+ else cf())
1669+ then throw(((("Invalid funding block timestamp: " + toString(bA())) + " < ") + toString(iz)))
13291670 else {
1330- let hT = bG(bH, bI)
1331- let eu = hT._1
1332- let ev = hT._2
1333- let ew = hT._3
1334- let ex = hT._4
1335- let ey = hT._5
1336- let hP = invoke(ai(), "addLocked", nil, [AttachedPayment(ag(), gP)])
1337- if ((hP == hP))
1671+ let fE = dp()
1672+ let iA = fD()
1673+ let fH = iA._1
1674+ let fI = iA._2
1675+ let fL = iA._3
1676+ let iB = if ((fL > 0))
13381677 then {
1339- let cJ = cF(ev, ey)
1340- let hU = if ((cJ > 0))
1341- then {
1342- let hV = fZ(cJ)
1343- let gb = hV._1
1344- let gc = hV._2
1345- let hW = invoke(ai(), "withdrawLocked", [gb], nil)
1346- if ((hW == hW))
1347- then {
1348- let hX = invoke(ai(), "exchangeFreeAndLocked", [-(gc)], nil)
1349- if ((hX == hX))
1350- then gS(gb)
1351- else throw("Strict value is not equal to itself.")
1352- }
1353- else throw("Strict value is not equal to itself.")
1354- }
1355- else nil
1356- if ((hU == hU))
1357- then ((gA(bH, eu, ((ev - cJ) + gP), ew, ex, bw()) ++ gR(((aR() + gP) - cJ))) ++ hU)
1678+ let iB = invoke(aj(), "exchangeFreeAndLocked", [-(fL)], nil)
1679+ if ((iB == iB))
1680+ then nil
13581681 else throw("Strict value is not equal to itself.")
13591682 }
1683+ else nil
1684+ if ((iB == iB))
1685+ then gv((iz + bj()), (br() + fI), (bs() + fH), aG(fI, fE), aG(fH, fE))
13601686 else throw("Strict value is not equal to itself.")
13611687 }
13621688 }
13631689 else throw("Strict value is not equal to itself.")
13641690 }
13651691 else throw("Strict value is not equal to itself.")
13661692 }
13671693
13681694
13691695
1370-@Callable(by)
1371-func removeMargin (gP,bI) = {
1372- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1373- if ((hl == hl))
1696+@Callable(bC)
1697+func updateOracle (ho) = if ((bz() == aC))
1698+ then nil
1699+ else {
1700+ let iC = split_4C(ho, "::")
1701+ let dq = valueOrErrorMessage(bW(a), "No base asset oracle data")
1702+ let iD = dq._1
1703+ let iE = invoke(iD, "updateData", [iC[0]], nil)
1704+ if ((iE == iE))
1705+ then {
1706+ let ds = bW(b)
1707+ let iF = if (isDefined(ds))
1708+ then {
1709+ let du = value(ds)
1710+ let iG = du._1
1711+ let iF = invoke(iG, "updateData", [iC[1]], nil)
1712+ if ((iF == iF))
1713+ then nil
1714+ else throw("Strict value is not equal to itself.")
1715+ }
1716+ else nil
1717+ if ((iF == iF))
1718+ then nil
1719+ else throw("Strict value is not equal to itself.")
1720+ }
1721+ else throw("Strict value is not equal to itself.")
1722+ }
1723+
1724+
1725+
1726+@Callable(bC)
1727+func syncTerminalPriceToOracle () = {
1728+ let co = aY()
1729+ let cp = aZ()
1730+ let iH = fy(dp(), co, cp)
1731+ let hf = iH._1
1732+ let hg = iH._2
1733+ let fC = iH._3
1734+ let iI = if (if ((0 > fC))
1735+ then (aL(fC) > aU())
1736+ else false)
1737+ then -(aU())
1738+ else fC
1739+ let hh = if ((iI != 0))
13741740 then {
1375- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1376- if ((hm == hm))
1741+ let hh = invoke(aj(), "exchangeFreeAndLocked", [iI], nil)
1742+ if ((hh == hh))
1743+ then nil
1744+ else throw("Strict value is not equal to itself.")
1745+ }
1746+ else nil
1747+ if ((hh == hh))
1748+ then (gW((aU() + iI)) ++ gK(hf, hg))
1749+ else throw("Strict value is not equal to itself.")
1750+ }
1751+
1752+
1753+
1754+@Callable(bC)
1755+func ensureCalledOnce () = if ((bC.caller != this))
1756+ then throw("Invalid saveCurrentTxId parameters")
1757+ else {
1758+ let iJ = toBase58String(bC.transactionId)
1759+ let iK = valueOrElse(getString(this, S), "")
1760+ if ((iK != iJ))
1761+ then [StringEntry(S, iJ)]
1762+ else throw("Can not call vAMM methods twice in one tx")
1763+ }
1764+
1765+
1766+
1767+@Callable(bC)
1768+func migratePosition (bL) = {
1769+ let bO = getInteger(this, ac(e, bL))
1770+ if (if (isDefined(bO))
1771+ then isDefined(addressFromString(bL))
1772+ else false)
1773+ then {
1774+ let iL = getIntegerValue(this, ac(e, bL))
1775+ let iM = getIntegerValue(this, ac(f, bL))
1776+ let iN = getIntegerValue(this, ac(g, bL))
1777+ let iO = getIntegerValue(this, ac(h, bL))
1778+ let iP = valueOrElse(getInteger(this, ac(k, bL)), lastBlock.timestamp)
1779+ let iQ = valueOrElse(getInteger(this, ac(j, bL)), aV())
1780+ let iR = getIntegerValue(this, ac(i, bL))
1781+ let iS = bR(iL)
1782+ let bN = ((bL + "_") + toString(iS))
1783+[DeleteEntry(ac(e, bL)), DeleteEntry(ac(f, bL)), DeleteEntry(ac(g, bL)), DeleteEntry(ac(h, bL)), DeleteEntry(ac(k, bL)), DeleteEntry(ac(j, bL)), DeleteEntry(ac(i, bL)), IntegerEntry(ac(e, bN), iL), IntegerEntry(ac(f, bN), iM), IntegerEntry(ac(g, bN), iN), IntegerEntry(ac(h, bN), iO), IntegerEntry(ac(k, bN), iP), IntegerEntry(ac(j, bN), iQ), IntegerEntry(ac(i, bN), iR)]
1784+ }
1785+ else throw(("Nothing to migrate for " + bL))
1786+ }
1787+
1788+
1789+
1790+@Callable(bC)
1791+func view_calcRemainMarginWithFundingPayment (bL,bM,ho) = {
1792+ let hp = invoke(this, "updateOracle", [ho], nil)
1793+ if ((hp == hp))
1794+ then {
1795+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1796+ if ((hq == hq))
13771797 then {
1378- let bH = toString(by.caller)
1379- if (if (if (if (if ((0 >= gP))
1380- then true
1381- else !(bR(bH, bI)))
1382- then true
1383- else !(ca()))
1384- then true
1385- else cb())
1386- then true
1387- else dr())
1388- then throw("Invalid removeMargin parameters")
1389- else {
1390- let hY = bG(bH, bI)
1391- let eu = hY._1
1392- let ev = hY._2
1393- let ew = hY._3
1394- let ex = hY._4
1395- let ey = hY._5
1396- let hZ = cK(eu, ev, ex, ey, -(gP))
1397- let cS = hZ._1
1398- let cT = hZ._2
1399- let cO = hZ._3
1400- let cJ = hZ._4
1401- if ((cT != 0))
1402- then throw("Invalid removed margin amount")
1403- else {
1404- let eX = dW(cS, cT, ew)
1405- if (!(bz(eX, aU(), true)))
1406- then throw(((("Too much margin removed: " + toString(eX)) + " < ") + toString(aU())))
1407- else {
1408- let ia = fZ(cJ)
1409- let gb = ia._1
1410- let gc = ia._2
1411- let hU = if ((cJ > 0))
1412- then {
1413- let hX = invoke(ai(), "exchangeFreeAndLocked", [-(gc)], nil)
1414- if ((hX == hX))
1415- then gS(gb)
1416- else throw("Strict value is not equal to itself.")
1417- }
1418- else nil
1419- if ((hU == hU))
1420- then {
1421- let hW = invoke(ai(), "withdrawLocked", [(gP + gb)], nil)
1422- if ((hW == hW))
1423- then (((gA(bH, eu, cS, ew, bE(eu), bw()) ++ gO(by.caller, gP)) ++ gR(((aR() - gP) - cJ))) ++ hU)
1424- else throw("Strict value is not equal to itself.")
1425- }
1426- else throw("Strict value is not equal to itself.")
1427- }
1428- }
1429- }
1798+ let iT = bK(bL, bM)
1799+ let bQ = iT._1
1800+ let dX = iT._2
1801+ let eg = iT._3
1802+ let dZ = iT._4
1803+ let ei = iT._5
1804+ let iU = dV(bL, bM, ay)
1805+ let dQ = iU._1
1806+ let dU = iU._2
1807+ let iV = cO(bQ, dX, dZ, ei, dU)
1808+ let cW = iV._1
1809+ let cX = iV._2
1810+ let cS = iV._3
1811+ let cN = iV._4
1812+ throw(((((((aE(cW) + aE(cS)) + aE(el(bL, bM))) + aE(dU)) + aE(cX)) + aE(dQ)) + aE(cN)))
14301813 }
14311814 else throw("Strict value is not equal to itself.")
14321815 }
14331816 else throw("Strict value is not equal to itself.")
14341817 }
14351818
14361819
14371820
1438-@Callable(by)
1439-func closePosition (eo,bI,eq,er) = {
1440- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1441- if ((hl == hl))
1821+@Callable(bC)
1822+func view_getPegAdjustCost (iW) = {
1823+ let co = aY()
1824+ let cp = aZ()
1825+ let fx = fy(iW, co, cp)
1826+ throw(toString(fx._3))
1827+ }
1828+
1829+
1830+
1831+@Callable(bC)
1832+func view_getTerminalAmmPrice () = {
1833+ let iX = fg()
1834+ let fk = iX._1
1835+ let fl = iX._2
1836+ let ha = aG(aI(fk, ba()), aI(fl, bb()))
1837+ throw(toString(ha))
1838+ }
1839+
1840+
1841+
1842+@Callable(bC)
1843+func view_getFunding (ho) = {
1844+ let hp = invoke(this, "updateOracle", [ho], nil)
1845+ if ((hp == hp))
14421846 then {
1443- let hm = invoke(this, "ensureCalledOnce", nil, nil)
1444- if ((hm == hm))
1847+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1848+ if ((hq == hq))
14451849 then {
1446- let bH = bx(by)
1447- let ib = valueOrErrorMessage(addressFromString(bH), "Invalid caller")
1448- let bQ = bO(bH, bI)
1449- if (if (if (if (if (if (!(bR(bH, bI)))
1450- then true
1451- else !(ca()))
1452- then true
1453- else cb())
1454- then true
1455- else (0 >= eo))
1456- then true
1457- else (0 > eq))
1458- then true
1459- else dr())
1460- then throw("Invalid closePosition parameters")
1461- else {
1462- let ey = bG(bH, bI)._5
1463- let ic = en(bH, bI, eo, bQ, eq, er, true, true)
1464- let eS = ic._1
1465- let fb = ic._2
1466- let eU = ic._3
1467- let eV = ic._4
1468- let eO = ic._5
1469- let eJ = ic._6
1470- let fa = ic._7
1471- let cs = ic._8
1472- let ct = ic._9
1473- let eE = ic._10
1474- let hL = ic._11
1475- let hM = ic._12
1476- let hN = ic._13
1477- let hE = ic._14
1478- let hF = ic._15
1479- let id = ic._16
1480- if ((eO > 0))
1481- then throw("Invalid closePosition parameters: bad debt")
1482- else if ((ey >= bw()))
1483- then throw("Invalid closePosition parameters: wait at least 1 block before closing the position")
1484- else {
1485- let eB = (eS != 0)
1486- let ie = (fa + id)
1487- let if = (aR() - ie)
1488- let ig = if ((0 > if))
1489- then 0
1490- else if
1491- let hW = invoke(ai(), "withdrawLocked", [ie], nil)
1492- if ((hW == hW))
1493- then {
1494- let ht = invoke(al(), "acceptPayment", [bH], [AttachedPayment(ag(), id)])
1495- if ((ht == ht))
1496- then {
1497- let hu = {
1498- let bL = ht
1499- if ($isInstanceOf(bL, "Int"))
1500- then {
1501- let fV = bL
1502- fV
1503- }
1504- else throw("Invalid referrerFee")
1505- }
1506- let ih = fZ((id - hu))
1507- let gb = ih._1
1508- let gc = ih._2
1509- let hQ = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1510- if ((hQ == hQ))
1511- then {
1512- let hR = invoke(aj(), "notifyFees", [bH, id], nil)
1513- if ((hR == hR))
1514- then {
1515- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1516- if ((hS == hS))
1517- then (((((if (eB)
1518- then gA(bH, eS, fb, eU, eV, bw())
1519- else gN(bH, bI)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ (if ((fa > 0))
1520- then gO(ib, fa)
1521- else nil)) ++ gR(ig)) ++ gS(gb))
1522- else throw("Strict value is not equal to itself.")
1523- }
1524- else throw("Strict value is not equal to itself.")
1525- }
1526- else throw("Strict value is not equal to itself.")
1527- }
1528- else throw("Strict value is not equal to itself.")
1529- }
1530- else throw("Strict value is not equal to itself.")
1531- }
1532- }
1850+ let fE = dp()
1851+ let iY = fD()
1852+ let fH = iY._1
1853+ let fI = iY._2
1854+ let fL = iY._3
1855+ let iZ = aG(fI, fE)
1856+ let ja = aG(fH, fE)
1857+ throw(((((aE(iZ) + aE(ja)) + aE(dJ())) + aE(dp())) + aE(fL)))
15331858 }
15341859 else throw("Strict value is not equal to itself.")
15351860 }
15361861 else throw("Strict value is not equal to itself.")
15371862 }
15381863
15391864
15401865
1541-@Callable(by)
1542-func liquidate (bH,bI) = {
1543- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1544- if ((hl == hl))
1866+@Callable(bC)
1867+func computeSpotPrice () = {
1868+ let hq = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1869+ if ((hq == hq))
15451870 then {
1546- let ii = ea(bH, bI, ax)
1547- let ij = if (dG())
1548- then {
1549- let ik = ea(bH, bI, ay)
1550- aJ(ii, ik)
1551- }
1552- else ii
1553- if (if (if (if (if (!(bz(ij, bh(), false)))
1554- then true
1555- else !(bR(bH, bI)))
1556- then true
1557- else !(ca()))
1558- then true
1559- else cb())
1560- then true
1561- else dr())
1562- then throw("Unable to liquidate")
1563- else {
1564- let il = if (if ((ii > bi()))
1565- then (bj() > 0)
1566- else false)
1567- then (au > bj())
1568- else false
1569- let eu = bG(bH, bI)._1
1570- let dK = aI(eu)
1571- let im = if (il)
1572- then {
1573- let in = ei(bH, eu)
1574- let io = aD(aI(in), dK)
1575- $Tuple2(io, aI(in))
1576- }
1577- else $Tuple2(0, dK)
1578- let io = im._1
1579- let in = im._2
1580- let ip = en(bH, bI, if (il)
1581- then in
1582- else dK, bi(), 0, true, false, true)
1583- let eS = ip._1
1584- let fb = ip._2
1585- let eU = ip._3
1586- let eV = ip._4
1587- let eO = ip._5
1588- let eJ = ip._6
1589- let fa = ip._7
1590- let cs = ip._8
1591- let ct = ip._9
1592- let eE = ip._10
1593- let hL = ip._11
1594- let hM = ip._12
1595- let hN = ip._13
1596- let hE = ip._14
1597- let hF = ip._15
1598- let iq = ip._16
1599- let ir = (iq / 2)
1600- let gc = (iq - ir)
1601- let if = (aR() - iq)
1602- let is = if ((0 > if))
1603- then 0
1604- else if
1605- let hX = if ((eO > 0))
1606- then {
1607- let hX = invoke(ai(), "exchangeFreeAndLocked", [(eO + iq)], nil)
1608- if ((hX == hX))
1609- then nil
1610- else throw("Strict value is not equal to itself.")
1611- }
1612- else nil
1613- if ((hX == hX))
1614- then {
1615- let hW = invoke(ai(), "withdrawLocked", [iq], nil)
1616- if ((hW == hW))
1617- then {
1618- let it = invoke(ai(), "addFree", nil, [AttachedPayment(ag(), gc)])
1619- if ((it == it))
1620- then {
1621- let hS = invoke(aj(), "notifyNotional", [bH, eU], nil)
1622- if ((hS == hS))
1623- then ((((if (il)
1624- then gA(bH, eS, fb, eU, eV, bw())
1625- else gN(bH, bI)) ++ gG(cs, ct, eE, hL, hM, hN, hE, hF)) ++ gO(by.caller, ir)) ++ gR(is))
1626- else throw("Strict value is not equal to itself.")
1627- }
1628- else throw("Strict value is not equal to itself.")
1629- }
1630- else throw("Strict value is not equal to itself.")
1631- }
1632- else throw("Strict value is not equal to itself.")
1633- }
1871+ let fx = dJ()
1872+ $Tuple2(nil, fx)
16341873 }
16351874 else throw("Strict value is not equal to itself.")
16361875 }
16371876
16381877
16391878
1640-@Callable(by)
1641-func payFunding () = {
1642- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1643- if ((hl == hl))
1644- then {
1645- let iu = bd()
1646- if (if (if ((iu > bw()))
1647- then true
1648- else !(ca()))
1649- then true
1650- else cb())
1651- then throw(((("Invalid funding block timestamp: " + toString(bw())) + " < ") + toString(iu)))
1652- else {
1653- let fA = dl()
1654- let iv = fz()
1655- let fD = iv._1
1656- let fE = iv._2
1657- let fH = iv._3
1658- let iw = if ((fH > 0))
1659- then {
1660- let iw = invoke(ai(), "exchangeFreeAndLocked", [-(fH)], nil)
1661- if ((iw == iw))
1662- then nil
1663- else throw("Strict value is not equal to itself.")
1664- }
1665- else nil
1666- if ((iw == iw))
1667- then gq((iu + bg()), (bo() + fE), (bp() + fD), aD(fE, fA), aD(fD, fA))
1668- else throw("Strict value is not equal to itself.")
1669- }
1670- }
1671- else throw("Strict value is not equal to itself.")
1879+@Callable(bC)
1880+func computeFeeForTraderWithArtifact (bL,fN) = {
1881+ let fx = fW(bL, fN)
1882+ $Tuple2(nil, fx)
16721883 }
16731884
16741885
1675-
1676-@Callable(by)
1677-func syncTerminalPriceToOracle () = {
1678- let ck = aV()
1679- let cl = aW()
1680- let ix = fu(dl(), ck, cl)
1681- let ha = ix._1
1682- let hb = ix._2
1683- let fy = ix._3
1684- let iy = if (if ((0 > fy))
1685- then (aI(fy) > aR())
1686- else false)
1687- then -(aR())
1688- else fy
1689- let hc = if ((iy != 0))
1886+@Verifier(jb)
1887+func jc () = {
1888+ let jd = getString(this, T)
1889+ if (isDefined(jd))
16901890 then {
1691- let hc = invoke(ai(), "exchangeFreeAndLocked", [iy], nil)
1692- if ((hc == hc))
1693- then nil
1694- else throw("Strict value is not equal to itself.")
1695- }
1696- else nil
1697- if ((hc == hc))
1698- then (gR((aR() + iy)) ++ gF(ha, hb))
1699- else throw("Strict value is not equal to itself.")
1700- }
1701-
1702-
1703-
1704-@Callable(by)
1705-func ensureCalledOnce () = if ((by.caller != this))
1706- then throw("Invalid saveCurrentTxId parameters")
1707- else {
1708- let iz = toBase58String(by.transactionId)
1709- let iA = valueOrElse(getString(this, R), "")
1710- if ((iA != iz))
1711- then [StringEntry(R, iz)]
1712- else throw("Can not call vAMM methods twice in one tx")
1713- }
1714-
1715-
1716-
1717-@Callable(by)
1718-func migratePosition (bH) = {
1719- let bK = getInteger(this, ab(e, bH))
1720- if (if (isDefined(bK))
1721- then isDefined(addressFromString(bH))
1722- else false)
1723- then {
1724- let iB = getIntegerValue(this, ab(e, bH))
1725- let iC = getIntegerValue(this, ab(f, bH))
1726- let iD = getIntegerValue(this, ab(g, bH))
1727- let iE = getIntegerValue(this, ab(h, bH))
1728- let iF = valueOrElse(getInteger(this, ab(k, bH)), lastBlock.timestamp)
1729- let iG = valueOrElse(getInteger(this, ab(j, bH)), aS())
1730- let iH = getIntegerValue(this, ab(i, bH))
1731- let iI = bN(iB)
1732- let bJ = ((bH + "_") + toString(iI))
1733-[DeleteEntry(ab(e, bH)), DeleteEntry(ab(f, bH)), DeleteEntry(ab(g, bH)), DeleteEntry(ab(h, bH)), DeleteEntry(ab(k, bH)), DeleteEntry(ab(j, bH)), DeleteEntry(ab(i, bH)), IntegerEntry(ab(e, bJ), iB), IntegerEntry(ab(f, bJ), iC), IntegerEntry(ab(g, bJ), iD), IntegerEntry(ab(h, bJ), iE), IntegerEntry(ab(k, bJ), iF), IntegerEntry(ab(j, bJ), iG), IntegerEntry(ab(i, bJ), iH)]
1734- }
1735- else throw(("Nothing to migrate for " + bH))
1736- }
1737-
1738-
1739-
1740-@Callable(by)
1741-func view_calcRemainMarginWithFundingPayment (bH,bI) = {
1742- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1743- if ((hl == hl))
1744- then {
1745- let iJ = bG(bH, bI)
1746- let bM = iJ._1
1747- let dT = iJ._2
1748- let ec = iJ._3
1749- let dV = iJ._4
1750- let ee = iJ._5
1751- let iK = dR(bH, bI, ax)
1752- let dM = iK._1
1753- let dQ = iK._2
1754- let iL = cK(bM, dT, dV, ee, dQ)
1755- let cS = iL._1
1756- let cT = iL._2
1757- let cO = iL._3
1758- let cJ = iL._4
1759- throw(((((((aB(cS) + aB(cO)) + aB(eh(bH, bI))) + aB(dQ)) + aB(cT)) + aB(dM)) + aB(cJ)))
1760- }
1761- else throw("Strict value is not equal to itself.")
1762- }
1763-
1764-
1765-
1766-@Callable(by)
1767-func view_getPegAdjustCost (iM) = {
1768- let ck = aV()
1769- let cl = aW()
1770- let ft = fu(iM, ck, cl)
1771- throw(toString(ft._3))
1772- }
1773-
1774-
1775-
1776-@Callable(by)
1777-func view_getTerminalAmmPrice () = {
1778- let iN = fc()
1779- let fg = iN._1
1780- let fh = iN._2
1781- let gV = aD(aF(fg, aX()), aF(fh, aY()))
1782- throw(toString(gV))
1783- }
1784-
1785-
1786-
1787-@Callable(by)
1788-func view_getFunding () = {
1789- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1790- if ((hl == hl))
1791- then {
1792- let fA = dl()
1793- let iO = fz()
1794- let fD = iO._1
1795- let fE = iO._2
1796- let fH = iO._3
1797- let iP = aD(fE, fA)
1798- let iQ = aD(fD, fA)
1799- throw(((((aB(iP) + aB(iQ)) + aB(dF())) + aB(dl())) + aB(fH)))
1800- }
1801- else throw("Strict value is not equal to itself.")
1802- }
1803-
1804-
1805-
1806-@Callable(by)
1807-func computeSpotPrice () = {
1808- let hl = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1809- if ((hl == hl))
1810- then {
1811- let ft = dF()
1812- $Tuple2(nil, ft)
1813- }
1814- else throw("Strict value is not equal to itself.")
1815- }
1816-
1817-
1818-
1819-@Callable(by)
1820-func computeFeeForTraderWithArtifact (bH,fJ) = {
1821- let ft = fS(bH, fJ)
1822- $Tuple2(nil, ft)
1823- }
1824-
1825-
1826-@Verifier(iR)
1827-func iS () = {
1828- let iT = getString(this, S)
1829- if (isDefined(iT))
1830- then {
1831- let iU = getString(addressFromStringValue(value(iT)), U)
1832- if (isDefined(iU))
1833- then valueOrElse(getBoolean(addressFromStringValue(value(iU)), ((("status_" + toString(this)) + "_") + toBase58String(iR.id))), false)
1891+ let je = getString(addressFromStringValue(value(jd)), V)
1892+ if (isDefined(je))
1893+ then valueOrElse(getBoolean(addressFromStringValue(value(je)), ((("status_" + toString(this)) + "_") + toBase58String(jb.id))), false)
18341894 else throw("unable to verify: admin not set in coordinator")
18351895 }
1836- else sigVerify(iR.bodyBytes, iR.proofs[0], iR.senderPublicKey)
1896+ else sigVerify(jb.bodyBytes, jb.proofs[0], jb.senderPublicKey)
18371897 }
18381898

github/deemru/w8io/0e76f2f 
506.32 ms