tx · HXmoTDMH1hQ66unyF9uZAB4DsfdZ6oFb6WbwETYnMBTR

3MsHk4t1vpYbvsDWWwj2cm8gqG7GERaviUF:  -0.06200000 Waves

2023.11.07 13:22 [2832808] smart account 3MsHk4t1vpYbvsDWWwj2cm8gqG7GERaviUF > SELF 0.00000000 Waves

{ "type": 13, "id": "HXmoTDMH1hQ66unyF9uZAB4DsfdZ6oFb6WbwETYnMBTR", "fee": 6200000, "feeAssetId": null, "timestamp": 1699352527014, "version": 2, "chainId": 84, "sender": "3MsHk4t1vpYbvsDWWwj2cm8gqG7GERaviUF", "senderPublicKey": "6sLckkgqPVBTaF1VsERJTmHJVcTFKGxiB1vwY6hUC2T7", "proofs": [ "JFP6DiwgJDz5Ay18TmXYCwUrejj5XLbkcXx8QVyUD8G3PU2ovELxvgERkxMQaWe36k11NB1pBkoHvfYh9QyB2Ln" ], "script": "base64:BgJ3CAISEAoOGBgBAQgIAQEBAQEIAQgSAwoBARIDCgEBEgASBAoCCAESBAoCCAESAwoBARIECgIIARIDCgEBEgQKAggBEgUKAwgIARIDCgEIEgASABIDCgEIEgASAwoBARIDCgEIEgASABIDCgEIEgQKAggBEgMKAQh7AANTRVACAl9fAAVXQVZFUwIFd2F2ZXMAB01BWF9JTlQA//////////9/AAdNQVhfRkVFAMCEPQANTUFYX0FNUExJRklFUgDAhD0AFE1BWF9XRUlHSFRfQU1QTElGSUVSAMCEPQAKTUFYX1dFSUdIVADAhD0AFFNMSVBQQUdFX1JBVEVfRkFDVE9SAMCEPQAPRkVFX1JBVEVfRkFDVE9SAMCEPQALUkFURV9GQUNUT1IAwIQ9AA5QRVJDRU5UX0ZBQ1RPUgkAtgIBAICAkLu61q3wDQAQWkVST19JTlRfTElTVF8xMAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAAQWkVST19JTlRfTElTVF8xMQkAzQgCBRBaRVJPX0lOVF9MSVNUXzEwAAAAC1pFUk9fQklHSU5UCQC2AgEAAAATWkVST19CSUdJTlRfTElTVF8xMQkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAUDbmlsAAxJTlRfREVDSU1BTFMACAAPQklHSU5UX0RFQ0lNQUxTABIAB0xJU1RfNjQJAL0JAgJ/MF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMAIBXwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX1NUT1JBR0UCB1NUT1JBR0UACktFWV9BU1NFVFMCBkFTU0VUUwASS0VZX0FTU0VUX0JBTEFOQ0VTAg5BU1NFVF9CQUxBTkNFUwARS0VZX0FTU0VUX1dFSUdIVFMCDUFTU0VUX1dFSUdIVFMACktFWV9MUF9GRUUCBkxQX0ZFRQAQS0VZX1BST1RPQ09MX0ZFRQIMUFJPVE9DT0xfRkVFAA1LRVlfUFJFQ0lTSU9OAglQUkVDSVNJT04AFEtFWV9TSUdNQV9GRUVfUEVSX0xQAhBTSUdNQV9GRUVfUEVSX0xQABlLRVlfVVNFUl9TSUdNQV9GRUVfUEVSX0xQAhVVU0VSX1NJR01BX0ZFRV9QRVJfTFAAC0tFWV9VU0VSX0xQAgdVU0VSX0xQAAxLRVlfVE9UQUxfTFACCFRPVEFMX0xQABBLRVlfVVNFUl9QUk9GSVRTAgxVU0VSX1BST0ZJVFMADEtFWV9XQVRDSERPRwIIV0FUQ0hET0cAE0tFWV9XQVRDSERPR19PRkZTRVQCD1dBVENIRE9HX09GRlNFVAATS0VZX1dBVENIRE9HX0hFSUdIVAIPV0FUQ0hET0dfSEVJR0hUARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ1fdmFsaWRhdGVCb29sAwR2YWxfB3RhcmdldF8EZXJyXwMJAQIhPQIFBHZhbF8FB3RhcmdldF8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBXZhbDFfBXZhbDJfBGVycl8DCQAAAgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBEF92YWxpZGF0ZUludExpc3QEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQHJG1hdGNoMAkAtgkBBQRlbGVtAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAMFA2FjYwkBDF92YWxpZGF0ZUludAQFAWEFDmxvd2VyQm91bmRhcnlfBQ51cHBlckJvdW5kYXJ5XwUEZXJyXwcJAAIBBQRlcnJfCgACJGwFBHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBD192YWxpZGF0ZUFzc2V0cwIHYXNzZXRzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwUDYWNjCQEOX3ZhbGlkYXRlQXNzZXQCBQRlbGVtBQRlcnJfBwoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJfdmFsaWRhdGVJbnRFcXVhbHMDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgESX3ZhbGlkYXRlVG9rZW5OYW1lAgR2YWxfBGVycl8DAwkAZgIABAkAsQIBBQR2YWxfBgkAZgIJALECAQUEdmFsXwAQCQACAQUEZXJyXwYBE192YWxpZGF0ZVRva2VuRGVzY3ICBHZhbF8EZXJyXwMJAGYCCQCxAgEFBHZhbF8A6AcJAAIBBQRlcnJfBgERX3ZhbGlkYXRlRGVjaW1hbHMCBHZhbF8EZXJyXwMDCQBmAgAABQR2YWxfBgkAZgIFBHZhbF8ACAkAAgEFBGVycl8GARBfdmFsaWRhdGVQYXltZW50BAhwYXltZW50Xwhhc3NldElkXw9yZXF1aXJlZEFtb3VudF8EZXJyXwQHJG1hdGNoMAgFCHBheW1lbnRfB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAMJAQIhPQIFCGFzc2V0SWRfCQDYBAEFAWEJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQDCQBmAgUPcmVxdWlyZWRBbW91bnRfCAUIcGF5bWVudF8GYW1vdW50CQACAQkArAICBQRlcnJfAgg6IGFtb3VudAYJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFbGlzdF8EdmFsXwRlcnJfAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUFbGlzdF8FBHZhbF8JAAIBBQRlcnJfBgELX2Fzc2V0VG9TdHIBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQUFV0FWRVMBC19zdHJUb0Fzc2V0AQZhc3NldF8DAwkAAAIFBmFzc2V0XwUFV0FWRVMGCQAAAgUGYXNzZXRfAgAFBHVuaXQJANkEAQUGYXNzZXRfAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDF9sb2FkU3RvcmFnZQAEByRtYXRjaDAJAKIIAQULS0VZX1NUT1JBR0UDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUDU0VQCQCcCgoJANkEAQkAkQMCBQZzdHJ1Y3QAAAkAAAIJAJEDAgUGc3RydWN0AAECATEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQZzdHJ1Y3QACQkAnAoKAQAHAAAAAAAAAAAAAAAAAAAJAQdBZGRyZXNzAQEAAQxfc2F2ZVN0b3JhZ2UBCHN0b3JhZ2VfCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9TVE9SQUdFCQC5CQIJAMwIAgkA2AQBCAUIc3RvcmFnZV8CXzEJAMwIAgMIBQhzdG9yYWdlXwJfMgIBMQIBMAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfMwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNQkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNgkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOQkAzAgCCQClCAEIBQhzdG9yYWdlXwNfMTAFA25pbAUDU0VQBQNuaWwBC19sb2FkQXNzZXRzAAQHJG1hdGNoMAkAoggBBQpLRVlfQVNTRVRTAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAkAvQkCBQFhBQNTRVAFA25pbAUDbmlsAQtfc2F2ZUFzc2V0cwEHYXNzZXRzXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfQVNTRVRTCQC7CQIFB2Fzc2V0c18FA1NFUAUDbmlsARJfbG9hZEFzc2V0QmFsYW5jZXMACgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAdiYWxhbmNlCQENcGFyc2VJbnRWYWx1ZQEFBGVsZW0JAJQKAgkAzQgCCAUDYWNjAl8xBQdiYWxhbmNlCQBkAggFA2FjYwJfMgUHYmFsYW5jZQQHJG1hdGNoMAkAoggBBRJLRVlfQVNTRVRfQkFMQU5DRVMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACgACJGwJAL0JAgUBYQUDU0VQCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8x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CgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFA1NFUAUDbmlsAQ1fbG9hZFdhdGNoZG9nAAQHJG1hdGNoMAkAoggBBQxLRVlfV0FUQ0hET0cDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVXYXRjaGRvZwEJd2F0Y2hkb2dfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9XQVRDSERPRwkApQgBBQl3YXRjaGRvZ18FA25pbAETX2xvYWRXYXRjaGRvZ09mZnNldAAEByRtYXRjaDAJAJ8IAQUTS0VZX1dBVENIRE9HX09GRlNFVAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAETX3NhdmVXYXRjaGRvZ09mZnNldAEHb2Zmc2V0XwkAzAgCCQEMSW50ZWdlckVudHJ5AgUTS0VZX1dBVENIRE9HX09GRlNFVAUHb2Zmc2V0XwUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAMJAQIhPQIIBQdzdG9yYWdlAl8xAQAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQAAAggFB3N0b3JhZ2UCXzEBAAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEOX2NoZWNrV2F0Y2hkb2cABAJ3ZAQHJG1hdGNoMAkAmggCCQENX2xvYWRXYXRjaGRvZwAFE0tFWV9XQVRDSERPR19IRUlHSFQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwCQBkAgUBYQkBE19sb2FkV2F0Y2hkb2dPZmZzZXQAAAADCQBmAgUGaGVpZ2h0BQJ3ZAkAAgECFl9jaGVja1dhdGNoZG9nOiByZXZlcnQGAQxfZ2V0RGVjaW1hbHMBCGFzc2V0SWRfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAIBQFhCGRlY2ltYWxzCQACAQkArAICAhdfZ2V0RGVjaW1hbHM6IG5vIGFzc2V0PQUIYXNzZXRJZF8BEl9ub3JtYWxpemVEZWNpbWFscwQHYW1vdW50Xw9zb3VyY2VEZWNpbWFsc18PdGFyZ2V0RGVjaW1hbHNfBnJvdW5kXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAbgQFB2Ftb3VudF8AAQkAbAYACgAACQBlAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18AAAAABQRET1dOBQZyb3VuZF8JAGgCBQdhbW91bnRfCQBsBgAKAAAJAGUCBQ90YXJnZXREZWNpbWFsc18FD3NvdXJjZURlY2ltYWxzXwAAAAAFBERPV04BFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEHYXNzZXRzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MAAAoAAiRsBQdh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XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCCAUGcmVzdWx0Al8yCAUGcmVzdWx0Al8zARxfaW5jcmVtZW50QmFsYW5jZXNCeVBheW1lbnRzBQliYWxhbmNlc18JcGF5bWVudHNfB2Fzc2V0c18JZGVjaW1hbHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBAdwYXltZW50CQCRAwIFCXBheW1lbnRzXwUFaW5kZXgED3BheW1lbnRBc3NldFN0cgkBC19hc3NldFRvU3RyAQgFB3BheW1lbnQHYXNzZXRJZAQDZXJyAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyCQCRAwIFB2Fzc2V0c18FBWluZGV4CQACAQkArAICCQCsAgIFBGVycl8CCDogaW5kZXg9CQCkAwEFBWluZGV4BQR1bml0AwkAAAIFA2VycgUDZXJyBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUPcGF5bWVudEFzc2V0U3RyBApuZXdCYWxhbmNlCQBkAgUEZWxlbQkBEl9ub3JtYWxpemVEZWNpbWFscwQICQCRAwIFCXBheW1lbnRzXwUFaW5kZXgGYW1vdW50BQ1hc3NldERlY2ltYWxzBQlkZWNpbWFsc18FBERPV04JAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUKbmV3QmFsYW5jZQkAZAIIBQNhY2MCXzMFCm5ld0JhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBnJlc3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmls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BQhiYWxhbmNlXwxlcXVpbGlicml1bV8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfAwkAZgIFDGVxdWlsaWJyaXVtXwUIYmFsYW5jZV8ECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZQIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAxtYXhEZXZpYXRpb24JAGUCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAdmZWVSYXRlCQBrAwkAawMFDG1heERldmlhdGlvbgUNc2xpcHBhZ2VSYXRlXwUUU0xJUFBBR0VfUkFURV9GQUNUT1IFD0ZFRV9SQVRFX0ZBQ1RPUgUMZXF1aWxpYnJpdW1fAwkAZgIFB2ZlZVJhdGUFC2ZlZU1heFJhdGVfCQBrAwUMbWF4RGV2aWF0aW9uBQtmZWVNYXhSYXRlXwUPRkVFX1JBVEVfRkFDVE9SCQBrAwUMbWF4RGV2aWF0aW9uBQdmZWVSYXRlBQ9GRUVfUkFURV9GQUNUT1IAAAQJdGhyZXNob2xkCQBrAwUMZXF1aWxpYnJpdW1fCQBkAgUUTUFYX1dFSUdIVF9BTVBMSUZJRVIFEHdlaWdodEFtcGxpZmllcl8FFE1BWF9XRUlHSFRfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEDG1heERldmlhdGlvbgkAZQIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEB2ZlZVJhdGUJAGsDCQBrAwUMbWF4RGV2aWF0aW9uBQ1zbGlwcGFnZVJhdGVfBRRTTElQUEFHRV9SQVRFX0ZBQ1RPUgUPRkVFX1JBVEVfRkFDVE9SBQxlcXVpbGlicml1bV8DCQBmAgUHZmVlUmF0ZQULZmVlTWF4UmF0ZV8JAGsDBQxtYXhEZXZpYXRpb24FC2ZlZU1heFJhdGVfBQ9GRUVfUkFURV9GQUNUT1IJAGsDBQxtYXhEZXZpYXRpb24FB2ZlZVJhdGUFD0ZFRV9SQVRFX0ZBQ1RPUgAAAQ1fY2FsY3VsYXRlRmVlBwliYWxhbmNlc18SYXNzZXRzVG90YWxTdXBwbHlfCHdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8AAAEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CxJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZMcFRvdGFsU3VwcGx5Xw5scFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8DAwkAAAIFEnByZXZMcFRvdGFsU3VwcGx5XwAABgkAAAIFDmxwVG90YWxTdXBwbHlfAAAGBA5wcmV2QXNzZXRzUmF0ZQkAawMJAGUCBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUScHJldkFzc2V0QmFsYW5jZXNfBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8FC1JBVEVfRkFDVE9SBRJwcmV2THBUb3RhbFN1cHBseV8EDW5ld0Fzc2V0c1JhdGUJAGsDCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBQtSQVRFX0ZBQ1RPUgUObHBUb3RhbFN1cHBseV8EBGRpZmYJAGUCBQ1uZXdBc3NldHNSYXRlBQ5wcmV2QXNzZXRzUmF0ZQMDCQBnAgAABQRkaWZmCQBmAgkAaAIA////////////AQkBDl9sb2FkUHJlY2lzaW9uAAUEZGlmZgcJAAIBCQCsAgICKl92YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApAMBBQRkaWZmBgEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8ECHByZXZVdGlsCQBlAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAduZXdVdGlsCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBARkaWZmCQBlAgUHbmV3VXRpbAUIcHJldlV0aWwDAwkAZwIAAAUEZGlmZgkAZgIJAGgCAP///////////wEJAQ5fbG9hZFByZWNpc2lvbgAFBGRpZmYHCQACAQkArAICAiVfdmFsaWRhdGVTd2FwSW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCkAwEFBGRpZmYGARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HCGJhbGFuY2VfEWFzc2V0VG90YWxTdXBwbHlfDHByZXZCYWxhbmNlXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8Hd2VpZ2h0XwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBAtlcXVpbGlicml1bQkAawMFEWFzc2V0VG90YWxTdXBwbHlfBQd3ZWlnaHRfBQxzaWdtYVdlaWdodF8EEG1heEFsbG9jYXRpb25BbXADCQBmAgUIYmFsYW5jZV8FC2VxdWlsaWJyaXVtCQBkAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfCQBlAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfBA1tYXhBbGxvY2F0aW9uCQBrAwULZXF1aWxpYnJpdW0FEG1heEFsbG9jYXRpb25BbXAFDU1BWF9BTVBMSUZJRVIEEXByZXZNYXhBbGxvY2F0aW9uCQBrAwkAawMFFXByZXZBc3NldFRvdGFsU3VwcGx5XwUHd2VpZ2h0XwUMc2lnbWFXZWlnaHRfBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQMJAGYCBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgMJAGYCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIgX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgdXADCQBmAgkAZQIFCGJhbGFuY2VfBQ1tYXhBbGxvY2F0aW9uCQBlAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgdXAGBgMJAGYCBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwMJAGYCBQxwcmV2QmFsYW5jZV8FEXByZXZNYXhBbGxvY2F0aW9uCQACAQIiX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgZG93bgMJAGYCCQBlAgUNbWF4QWxsb2NhdGlvbgUIYmFsYW5jZV8JAGUCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIkX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBzdGlsbCBkb3duBgYBE192YWxpZGF0ZUFsbG9jYXRpb24HDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBgELX2NoZWNrcG9pbnQBBXVzZXJfBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBXVzZXJfBAt1c2VyUHJvZml0cwkBEF9sb2FkVXNlclByb2ZpdHMBBQV1c2VyXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEEXVzZXJTaWdtYUZlZVBlckxwCQEWX2xvYWRVc2VyU2lnbWFGZWVQZXJMcAEFBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQNcHJvZml0VXBkYXRlZAkAZAIJAJEDAgULdXNlclByb2ZpdHMFBWluZGV4CQCgAwEJALwCAwkAtgIBBQZ1c2VyTHAJALgCAgkAkQMCBQ1zaWdtYUZlZVBlckxwBQVpbmRleAkAkQMCBRF1c2VyU2lnbWFGZWVQZXJMcAUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFDXByb2ZpdFVwZGF0ZWQEDSR0MDI1NzcxMjU4NDQKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI1NzcxMjU4NDQCXzEEDnByb2ZpdHNVcGRhdGVkCAUNJHQwMjU3NzEyNTg0NAJfMgkAlAoCCQDOCAIJARBfc2F2ZVVzZXJQcm9maXRzAgUFdXNlcl8FDnByb2ZpdHNVcGRhdGVkCQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFBXVzZXJfBQ1zaWdtYUZlZVBlckxwBQ5wcm9maXRzVXBkYXRlZAEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEDnNpZ21hRmVlUGVyTHBfCHRvdGFsTHBfBmluZGV4XwZscEZlZV8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQZpbmRleF8FBWluZGV4CQC3AgIJAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQC8AgMJALYCAQUGbHBGZWVfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQh0b3RhbExwXwkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQEDSR0MDI2NDk0MjY1NzMKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI2NDk0MjY1NzMCXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMjY0OTQyNjU3MwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQLYXNzZXRJbmRleF8HYW1vdW50XwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjY3OTQyNzA2OQMJAAACBQd0b3RhbExwAAAJAJQKAgAACQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwUHTUFYX0ZFRQkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUEBWxwRmVlCAUNJHQwMjY3OTQyNzA2OQJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNjc5NDI3MDY5Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQVscEZlZQAABQ1zaWdtYUZlZVBlckxwCQEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEBQ1zaWdtYUZlZVBlckxwBQd0b3RhbExwBQthc3NldEluZGV4XwUFbHBGZWUJAJUKAwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAELX2RlcG9zaXRBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjc1NzgyNzYzMQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjc1NzgyNzYzMQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyNzU3ODI3NjMxAl8yBA0kdDAyNzYzNjI3NzA0CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyNzYzNjI3NzA0Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI3NjM2Mjc3MDQCXzIEDSR0MDI3NzEwMjg5NDADCQAAAgUUcHJldkFzc2V0VG90YWxTdXBwbHkAAAoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAawMJAJEDAgUMYXNzZXRXZWlnaHRzBQVpbmRleAUHYW1vdW50XwULc2lnbWFXZWlnaHQJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyODE1MjI4MjI2CgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyODE1MjI4MjI2Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjgxNTIyODIyNgJfMgkAlAoCBQdhbW91bnRfBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBAVyYXRpbwkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFFHByZXZBc3NldFRvdGFsU3VwcGx5CgEJZm9sZEZ1bmMxAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAoAMBCQC8AgMFBXJhdGlvCQC2AgEJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI4NzY5Mjg4NDQKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZm9sZEZ1bmMxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyODc2OTI4ODQ0Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjg3NjkyODg0NAJfMgkAlAoCCQBrAwUHYW1vdW50XwUNbHBUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMjc3MTAyODk0MAJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI3NzEwMjg5NDACXzIEDSR0MDI4OTQ2MjkwNTkJARtfaW5jcmVtZW50QmFsYW5jZXNCeUFtb3VudHMCBRFwcmV2QXNzZXRCYWxhbmNlcwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQNYXNzZXRCYWxhbmNlcwgFDSR0MDI4OTQ2MjkwNTkCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODk0NjI5MDU5Al8yBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb01pbnQFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCF9kZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjk4MjIyOTg3NQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjk4MjIyOTg3NQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyOTgyMjI5ODc1Al8yBA0kdDAyOTg4MDI5OTk0CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyOTg4MDI5OTk0Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI5ODgwMjk5OTQCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBQdhbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQBkAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB2Ftb3VudF8EBGVycjIJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgMJAAACBQRlcnIyBQRlcnIyBAdwcmV2RmVlCQENX2NhbGN1bGF0ZUZlZQcFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQObHBUb2tlbnNUb01pbnQDCQAAAgUNbHBUb3RhbFN1cHBseQAACQACAQIUX2RlcG9zaXQ6IGVtcHR5IHBvb2wECWFzc2V0RGlmZgkAZQIFEGFzc2V0VG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BAdmZWVEaWZmCQBlAgUDZmVlBQdwcmV2RmVlBBN1dGlsaXR5Q2hhbmdlRmFjdG9yCQBrAwkAZQIFCWFzc2V0RGlmZgUHZmVlRGlmZgULUkFURV9GQUNUT1IJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHcHJldkZlZQQTbHBUb2tlbnNUb01pbnRJbm5lcgkAawMFDWxwVG90YWxTdXBwbHkFE3V0aWxpdHlDaGFuZ2VGYWN0b3IFC1JBVEVfRkFDVE9SBARlcnIzCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUTbHBUb2tlbnNUb01pbnRJbm5lcgUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDCQAAAgUEZXJyMwUEZXJyMwUTbHBUb2tlbnNUb01pbnRJbm5lcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzE2NTYzMTc4NwkBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQAAAUObHBUb2tlbnNUb01pbnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDMxNjU2MzE3ODcCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzE2NTYzMTc4NwJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzMTY1NjMxNzg3Al8zCQCXCgUFDmxwVG9rZW5zVG9NaW50BQ1hc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwMzIxMjEzMjE4OQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzIxMjEzMjE4OQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMjEyMTMyMTg5Al8yBA0kdDAzMjE5NDMyMjQ3CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMjE5NDMyMjQ3Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMyMTk0MzIyNDcCXzIEDmxwVG9rZW5zVG9CdXJuBQdhbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQdNQVhfSU5UAihfd2l0aGRyYXdBbGw6IGxwVG9rZW5zVG9CdXJuIGxlc3MgdGhhbiAwAwkAAAIFA2VycgUDZXJyBA0kdDAzMjM4OTMyNTIyCQEcX2RlY3JlbWVudEJhbGFuY2VzQnlMcEFtb3VudAMFEXByZXZBc3NldEJhbGFuY2VzBQ5scFRva2Vuc1RvQnVybgUNbHBUb3RhbFN1cHBseQQNYXNzZXRCYWxhbmNlcwgFDSR0MDMyMzg5MzI1MjICXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMjM4OTMyNTIyAl8yBA1iYWxhbmNlc1RvUGF5CAUNJHQwMzIzODkzMjUyMgJfMwQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9CdXJuBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCVCgMFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfCWxwQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAlwcmVjaXNpb24JAQ5fbG9hZFByZWNpc2lvbgAEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMzMzMTQzMzM4MgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzMzMTQzMzM4MgJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMzMxNDMzMzgyAl8yBA0kdDAzMzM4NzMzNDQwCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMzM4NzMzNDQwAl8xBAtzaWdtYVdlaWdodAgFDSR0MDMzMzg3MzM0NDACXzIEEHRhcmdldEFzc2V0SW5kZXgJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUEAWsJALwCAwkAtgIBCQBlAgUNbHBUb3RhbFN1cHBseQUJbHBBbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BBJwcmV2VXRpbFZhbHVlV2l0aEsJAKADAQkAvAIDCQC2AgEFDXByZXZVdGlsVmFsdWUFAWsFDlBFUkNFTlRfRkFDVE9SBBJwcmV2VXRpbFZhbHVlRGl2THAJAL0CBAkAtgIBBQ1wcmV2VXRpbFZhbHVlBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BQdDRUlMSU5HCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBApzdGFydElubmVyCAUDYWNjAl8yBAlzdG9wSW5uZXIIBQNhY2MCXzMEDWN1cnJlbnRBbW91bnQJAGkCCQBkAgUJc3RvcElubmVyBQpzdGFydElubmVyAAIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFDWN1cnJlbnRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWN1cnJlbnRBbW91bnQECXV0aWxWYWx1ZQkAZQIFFHRlbXBBc3NldFRvdGFsU3VwcGx5CQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDAwkAZgIJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAaAIA////////////AQUJcHJlY2lzaW9uCQBmAgUJcHJlY2lzaW9uCQBlAgUJdXRpbFZhbHVlBRJwcmV2VXRpbFZhbHVlV2l0aEsHCQCXCgUGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwMJAGYCAAAJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAlwoFBwUKc3RhcnRJbm5lcgUNY3VycmVudEFtb3VudAUNY3VycmVudEFtb3VudAkAZQIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwQMdGFyZ2V0QW1vdW50BARzdG9wCQCgAwEJAL0CBAkAtgIBCQBkAgUJbHBBbW91bnRfBQdwcmV2RmVlBRJwcmV2VXRpbFZhbHVlRGl2THAFDlBFUkNFTlRfRkFDVE9SBQdDRUlMSU5HBA0kdDAzNTMwNjM1NDE4CgACJGwFB0xJU1RfNjQKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUHAAAFBHN0b3AAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNjQJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQAQHc3VjY2VzcwgFDSR0MDM1MzA2MzU0MTgCXzEECHN0YXJ0T3V0CAUNJHQwMzUzMDYzNTQxOAJfMgQHc3RvcE91dAgFDSR0MDM1MzA2MzU0MTgCXzMED3RhcmdldEFtb3VudE91dAgFDSR0MDM1MzA2MzU0MTgCXzQEB2RpZmZPdXQIBQ0kdDAzNTMwNjM1NDE4Al81AwkBASEBBQdzdWNjZXNzCQACAQkArAICCQCsAgIJAKwCAgIoX3dpdGhkcmF3OiBjYW4ndCBjYWxjdWxhdGUgdGFyZ2V0QW1vdW50PQkApAMBBQ90YXJnZXRBbW91bnRPdXQCBixkaWZmPQkApAMBBQdkaWZmT3V0BQ90YXJnZXRBbW91bnRPdXQEEmZpbmFsQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BQx0YXJnZXRBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFCWxwQW1vdW50XwUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUHAwkAAAIFBGVycjEFBGVycjEEDSR0MDM2NDEwMzY1NTgJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgUQdGFyZ2V0QXNzZXRJbmRleAABBQx0YXJnZXRBbW91bnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDM2NDEwMzY1NTgCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzY0MTAzNjU1OAJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzNjQxMDM2NTU4Al8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQVfc3dhcAMRc291cmNlQXNzZXRJbmRleF8RdGFyZ2V0QXNzZXRJbmRleF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkECXByZWNpc2lvbgkBDl9sb2FkUHJlY2lzaW9uAAQNJHQwMzcxNDAzNzIwOAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzcxNDAzNzIwOAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzNzE0MDM3MjA4Al8yBA0kdDAzNzIxMzM3MjY2CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzNzIxMzM3MjY2Al8xBAtzaWdtYVdlaWdodAgFDSR0MDM3MjEzMzcyNjYCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FDXNvdXJjZUFtb3VudF8EEGFzc2V0VG90YWxTdXBwbHkJAGQCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNc291cmNlQW1vdW50XwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUKAQhmb2xkRnVuYwIDYWNjBGVsZW0DCAUDYWNjAl8xBQNhY2MECnN0YXJ0SW5uZXIIBQNhY2MCXzIECXN0b3BJbm5lcggFA2FjYwJfMwQNY3VycmVudEFtb3VudAkAaQIJAGQCBQlzdG9wSW5uZXIFCnN0YXJ0SW5uZXIAAgQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUNY3VycmVudEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQ1jdXJyZW50QW1vdW50BAl1dGlsVmFsdWUJAGUCBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwMJAGYCCQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQBoAgD///////////8BBQlwcmVjaXNpb24JAGYCBQlwcmVjaXNpb24JAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUHCQCXCgUGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUDCQBmAgAACQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCXCgUHBQpzdGFydElubmVyBQ1jdXJyZW50QW1vdW50BQ1jdXJyZW50QW1vdW50CQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUEDHRhcmdldEFtb3VudAQMdGFyZ2V0QW1vdW50BQ1zb3VyY2VBbW91bnRfBBF0ZW1wQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFDWFzc2V0QmFsYW5jZXMFEXRhcmdldEFzc2V0SW5kZXhfBQx0YXJnZXRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUQYXNzZXRUb3RhbFN1cHBseQUMdGFyZ2V0QW1vdW50BANmZWUJAQ1fY2FsY3VsYXRlRmVlBwURdGVtcEFzc2V0QmFsYW5jZXMFFHRlbXBBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQHZmVlRGlmZgkAZQIFA2ZlZQUHcHJldkZlZQMJAAACBQdmZWVEaWZmAAAFDHRhcmdldEFtb3VudAQNJHQwMzkyMzkzOTM3MAoAAiRsBQdMSVNUXzY0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlwoFBwAACQBkAgUNc291cmNlQW1vdW50XwUHcHJldkZlZQAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2NAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBABAdzdWNjZXNzCAUNJHQwMzkyMzkzOTM3MAJfMQQIc3RhcnRPdXQIBQ0kdDAzOTIzOTM5MzcwAl8yBAdzdG9wT3V0CAUNJHQwMzkyMzkzOTM3MAJfMwQPdGFyZ2V0QW1vdW50T3V0CAUNJHQwMzkyMzkzOTM3MAJfNAQHZGlmZk91dAgFDSR0MDM5MjM5MzkzNzACXzUDCQEBIQEFB3N1Y2Nlc3MJAAIBCQCsAgIJAKwCAgkArAICAiRfc3dhcDogY2FuJ3QgY2FsY3VsYXRlIHRhcmdldEFtb3VudD0JAKQDAQUPdGFyZ2V0QW1vdW50T3V0AgYsZGlmZj0JAKQDAQUHZGlmZk91dAUPdGFyZ2V0QW1vdW50T3V0BBJmaW5hbEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBVmaW5hbEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDA0MDIxNzQwMzU4CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEXRhcmdldEFzc2V0SW5kZXhfAAEFDHRhcmdldEFtb3VudAUJbHBGZWVSYXRlBQ9wcm90b2NvbEZlZVJhdGUEBWxwRmVlCAUNJHQwNDAyMTc0MDM1OAJfMQQLcHJvdG9jb2xGZWUIBQ0kdDA0MDIxNzQwMzU4Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQwMjE3NDAzNTgCXzMJAJcKBQUMdGFyZ2V0QW1vdW50BRJmaW5hbEFzc2V0QmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4XAWkBBGluaXQOB2Fzc2V0c18NYXNzZXRXZWlnaHRzXwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8MbHBUb2tlbk5hbWVfDWxwVG9rZW5EZXNjcl8QbHBUb2tlbkRlY2ltYWxzXxdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8UcHJvdG9jb2xGZWVDb250cmFjdF8KcHJlY2lzaW9uXwdwYXVzZXJfBANlcnIDAwMDAwMDAwMDAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQETX3doZW5Ob3RJbml0aWFsaXplZAAHCQEQX3doZW5NdWx0aXNpZ1NldAAHCQEPX3ZhbGlkYXRlQXNzZXRzAgUHYXNzZXRzXwIUaW5pdDogaW52YWxpZCBhc3NldHMHCQEQX3ZhbGlkYXRlSW50TGlzdAQFDWFzc2V0V2VpZ2h0c18AAQUKTUFYX1dFSUdIVAIaaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBBQdhc3NldHNfCQCQAwEFDWFzc2V0V2VpZ2h0c18CH2luaXQ6IGludmFsaWQgYXNzZXRXZWlnaHRzIHNpemUHCQEMX3ZhbGlkYXRlSW50BAUKbHBGZWVSYXRlXwAABQdNQVhfRkVFAhRpbml0OiBpbnZhbGlkIGxwIGZlZQcJAQxfdmFsaWRhdGVJbnQEBRBwcm90b2NvbEZlZVJhdGVfAAAFB01BWF9GRUUCGmluaXQ6IGludmFsaWQgcHJvdG9jb2wgZmVlBwkBEl92YWxpZGF0ZVRva2VuTmFtZQIFDGxwVG9rZW5OYW1lXwISaW5pdDogaW52YWxpZCBuYW1lBwkBE192YWxpZGF0ZVRva2VuRGVzY3ICBQ1scFRva2VuRGVzY3JfAhNpbml0OiBpbnZhbGlkIGRlc2NyBwkBEV92YWxpZGF0ZURlY2ltYWxzAgUQbHBUb2tlbkRlY2ltYWxzXwIWaW5pdDogaW52YWxpZCBkZWNpbWFscwcJAQxfdmFsaWRhdGVJbnQEBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwAABQ1NQVhfQU1QTElGSUVSAiRpbml0OiBpbnZhbGlkIG1heEFsbG9jYXRpb25BbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQd2VpZ2h0QW1wbGlmaWVyXwAABRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwIdaW5pdDogaW52YWxpZCB3ZWlnaHRBbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUNc2xpcHBhZ2VSYXRlXwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHNsaXBwYWdlUmF0ZQcJAQxfdmFsaWRhdGVJbnQEBQtmZWVNYXhSYXRlXwAABQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIGZlZU1heFJhdGUHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFFHByb3RvY29sRmVlQ29udHJhY3RfAiFpbml0OiBpbnZhbGlkIHByb3RvY29sRmVlQ29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAUKcHJlY2lzaW9uXwABBQdNQVhfSU5UAhdpbml0OiBpbnZhbGlkIHByZWNpc2lvbgcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIUaW5pdDogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyBA0kdDA0MjIyMTQyMjkwCQEUX3ByZXBhcmVBc3NldFdlaWdodHMBBQ1hc3NldFdlaWdodHNfBAxhc3NldFdlaWdodHMIBQ0kdDA0MjIyMTQyMjkwAl8xBAtzaWdtYVdlaWdodAgFDSR0MDQyMjIxNDIyOTACXzIEDWFzc2V0QmFsYW5jZXMJARVfcHJlcGFyZUFzc2V0QmFsYW5jZXMBBQdhc3NldHNfBAVpc3N1ZQkAwggFBQxscFRva2VuTmFtZV8FDWxwVG9rZW5EZXNjcl8AAAUQbHBUb2tlbkRlY2ltYWxzXwYECWxwQXNzZXRJZAkAuAgBBQVpc3N1ZQQOc3RvcmFnZVVwZGF0ZWQJAJwKCgUJbHBBc3NldElkBgAABQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8JARFAZXh0ck5hdGl2ZSgxMDYyKQEFFHByb3RvY29sRmVlQ29udHJhY3RfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCBQVpc3N1ZQUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJAQtfc2F2ZUFzc2V0cwEFB2Fzc2V0c18JARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQERX3NhdmVBc3NldFdlaWdodHMBBQxhc3NldFdlaWdodHMJAQ5fc2F2ZVByZWNpc2lvbgEFCnByZWNpc2lvbl8JARJfc2F2ZVNpZ21hRmVlUGVyTHABCQESX2xvYWRTaWdtYUZlZVBlckxwAAkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpkZXBvc2l0QWxsAQdhbW91bnRfBANlcnIDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIaZGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDQ0MDQwNDQxMjUJAQtfZGVwb3NpdEFsbAEFB2Ftb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNDQwNDA0NDEyNQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDQ0MDQwNDQxMjUCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0NDA0MDQ0MTI1Al8zCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAQUcGF5bWVudEFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAkQMCBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQVpbmRleAQOcmVxdWlyZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFFHBheW1lbnRBc3NldERlY2ltYWxzBQdDRUlMSU5HBARlcnIxAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyBQRlbGVtCQACAQkArAICAiNkZXBvc2l0QWxsOiBpbnZhbGlkIHBheW1lbnQ6IGluZGV4PQkApAMBBQVpbmRleAMJAGcCAAAFDnJlcXVpcmVkQW1vdW50CQACAQImZGVwb3NpdEFsbDogdG9vIGxpdHRsZSBhbW91bnQgcmVxdWlyZWQFBHVuaXQDCQAAAgUEZXJyMQUEZXJyMQQGY2hhbmdlAwkAZgIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAUDbmlsAwkAZgIFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIoZGVwb3NpdEFsbDogaW5zdWZmaWNpZW50IHBheW1lbnQsIGluZGV4PQkApAMBBQVpbmRleAILLCByZXF1aXJlZD0JAKQDAQUOcmVxdWlyZWRBbW91bnQFA25pbAkAlAoCCQBkAgUFaW5kZXgAAQkAzggCCAUDYWNjAl8yBQZjaGFuZ2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDQ1MjY4NDUzMzAKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDQ1MjY4NDUzMzACXzEEDWNoYW5nZUFjdGlvbnMIBQ0kdDA0NTI2ODQ1MzMwAl8yBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvTWludAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFDWNoYW5nZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAEMbWluTHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQxtaW5McEFtb3VudF8AAAUHTUFYX0lOVAIeZGVwb3NpdDogaW52YWxpZCBtaW4gbHAgYW1vdW50AwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBGVycjEDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl9jaGVja1dhdGNoZG9nAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNDY3NzA0Njg4NgkBCF9kZXBvc2l0AgUIYXNzZXRTdHIFEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNDY3NzA0Njg4NgJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ2NzcwNDY4ODYCXzIEBWxwRmVlCAUNJHQwNDY3NzA0Njg4NgJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0Njc3MDQ2ODg2Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ2NzcwNDY4ODYCXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUEBGVycjIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvU2VuZAUMbWluTHBBbW91bnRfBQdNQVhfSU5UAhZkZXBvc2l0OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjIFBGVycjIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvU2VuZAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUMbHBBc3NldElkU3RyCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUMbHBBc3NldElkU3RyCQEQX3NhdmVQcm90b2NvbEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDGxwQXNzZXRJZFN0cgkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3dpdGhkcmF3QWxsAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkA2AQBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiN3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ4MzQ3NDg0MzQJAQxfd2l0aGRyYXdBbGwBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQObHBUb2tlbnNUb0J1cm4IBQ0kdDA0ODM0NzQ4NDM0Al8xBA1iYWxhbmNlc1RvUGF5CAUNJHQwNDgzNDc0ODQzNAJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ4MzQ3NDg0MzQCXzMEDnBheW1lbnRBY3Rpb25zCQEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAUGYXNzZXRzBQ1iYWxhbmNlc1RvUGF5CAUBaQZjYWxsZXIFCmxwRGVjaW1hbHMEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvQnVybggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBBEJ1cm4CBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9CdXJuBQNuaWwFDnBheW1lbnRBY3Rpb25zCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Aghhc3NldElkXwptaW5BbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEOX2NoZWNrV2F0Y2hkb2cABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAh93aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEFB01BWF9JTlQCIHdpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFBmFzc2V0cwUIYXNzZXRJZF8CGXdpdGhkcmF3OiBpbnZhbGlkIGFzc2V0SWQHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAht3aXRoZHJhdzogaW52YWxpZCBtaW5BbW91bnQHAwkAAAIFA2VycgUDZXJyBA0kdDA0OTc4ODQ5OTIyCQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNDk3ODg0OTkyMgJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNDk3ODg0OTkyMgJfMgQFbHBGZWUIBQ0kdDA0OTc4ODQ5OTIyAl8zBAtwcm90b2NvbEZlZQgFDSR0MDQ5Nzg4NDk5MjICXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDk3ODg0OTkyMgJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCF3dpdGhkcmF3OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjEFBGVycjEEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQRCdXJuAgUJbHBBc3NldElkCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQhhc3NldElkXwUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBRJmaW5hbEFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUIYXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQhhc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQhhc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFCGFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEc3dhcAIOdGFyZ2V0QXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA5zb3VyY2VBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fY2hlY2tXYXRjaGRvZwAHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAh9zd2FwOiBpbnZhbGlkIG1pbiB0YXJnZXQgYW1vdW50BwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50BwkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRTdHIFDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECG3N3YXA6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEDSR0MDUyMDM1NTIxOTMJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1MjAzNTUyMTkzAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1MjAzNTUyMTkzAl8yBAVscEZlZQgFDSR0MDUyMDM1NTIxOTMCXzMEC3Byb3RvY29sRmVlCAUNJHQwNTIwMzU1MjE5MwJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1MjAzNTUyMTkzAl81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDnRhcmdldEFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04EBGVycjEJAQxfdmFsaWRhdGVJbnQEBQtmaW5hbEFtb3VudAUKbWluQW1vdW50XwUHTUFYX0lOVAITc3dhcDogbGVzcyB0aGFuIG1pbgMJAAACBQRlcnIxBQRlcnIxCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQ50YXJnZXRBc3NldElkXwUDbmlsCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQ50YXJnZXRBc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWdldERlcG9zaXRBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAEFB01BWF9JTlQCHWdldERlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1MzMxMzUzNDAwCQELX2RlcG9zaXRBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNTMzMTM1MzQwMAJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDUzMzEzNTM0MDACXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MzMxMzUzNDAwAl8zCQCUCgIFA25pbAkAlAoCBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpnZXREZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGWdldERlcG9zaXQ6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCGmdldERlcG9zaXQ6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAUHYW1vdW50XwUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNTQxNTk1NDI3NQkBCF9kZXBvc2l0AgUIYXNzZXRJZF8FEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNTQxNTk1NDI3NQJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDU0MTU5NTQyNzUCXzIEBWxwRmVlCAUNJHQwNTQxNTk1NDI3NQJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1NDE1OTU0Mjc1Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDU0MTU5NTQyNzUCXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUJAJQKAgUDbmlsBQ5scFRva2Vuc1RvU2VuZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5nZXRXaXRoZHJhd0FsbAEJbHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQlscEFtb3VudF8AAAUHTUFYX0lOVAIeZ2V0V2l0aGRyYXdBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1NDcxNDU0NzkwCQEMX3dpdGhkcmF3QWxsAQUJbHBBbW91bnRfBA5scFRva2Vuc1RvQnVybggFDSR0MDU0NzE0NTQ3OTACXzEEDWJhbGFuY2VzVG9HZXQIBQ0kdDA1NDcxNDU0NzkwAl8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNTQ3MTQ1NDc5MAJfMwkAlAoCBQNuaWwFDWJhbGFuY2VzVG9HZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELZ2V0V2l0aGRyYXcCCGFzc2V0SWRfB2Ftb3VudF8EA2VycgMJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMABQhhc3NldElkXwIaZ2V0V2l0aGRyYXc6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCG2dldFdpdGhkcmF3OiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDSR0MDU1NDQxNTU1NTcJAQlfd2l0aGRyYXcCBQhhc3NldElkXwUHYW1vdW50XwQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU1NDQxNTU1NTcCXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1NTQ0MTU1NTU3Al8yBAVscEZlZQgFDSR0MDU1NDQxNTU1NTcCXzMEC3Byb3RvY29sRmVlCAUNJHQwNTU0NDE1NTU1NwJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1NTQ0MTU1NTU3Al81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdnZXRTd2FwAw5zb3VyY2VBc3NldElkXw50YXJnZXRBc3NldElkXw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQFDXNvdXJjZUFtb3VudF8JAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldElkXwUKbHBEZWNpbWFscwUERE9XTgQDZXJyAwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50CQEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBQ5zb3VyY2VBc3NldElkXwUOdGFyZ2V0QXNzZXRJZF8CEXN3YXA6IHNhbWUgYXNzZXRzBwMJAAACBQNlcnIFA2VycgQNJHQwNTY5Njc1NzEyNQkBBV9zd2FwAwUQc291cmNlQXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU2OTY3NTcxMjUCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDU2OTY3NTcxMjUCXzIEBWxwRmVlCAUNJHQwNTY5Njc1NzEyNQJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1Njk2NzU3MTI1Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDU2OTY3NTcxMjUCXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgkAlAoCBQNuaWwFC2ZpbmFsQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGdldENsYWltAQV1c2VyXwQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIWZ2V0Q2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBA0kdDA1Nzc2NzU3ODIzCQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU3NzY3NTc4MjMCXzEEC3VzZXJQcm9maXRzCAUNJHQwNTc3Njc1NzgyMwJfMgkAlAoCBQNuaWwFC3VzZXJQcm9maXRzAWkBC2dldFV0aWxGdW5jAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwNTgxNTY1ODIxNgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1ODE1NjU4MjE2Al8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwNTgxNTY1ODIxNgJfMgQNJHQwNTgyMjE1ODI3NAkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwNTgyMjE1ODI3NAJfMQQLc2lnbWFXZWlnaHQIBQ0kdDA1ODIyMTU4Mjc0Al8yBANmZWUJAQ1fY2FsY3VsYXRlRmVlBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUECXV0aWxWYWx1ZQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQkAlAoCBQNuaWwJAJQKAgUJdXRpbFZhbHVlBQ1scFRvdGFsU3VwcGx5AWkBCmdldEZlZUZ1bmMABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEDSR0MDU4NzA2NTg3NjYJARJfbG9hZEFzc2V0QmFsYW5jZXMABA1hc3NldEJhbGFuY2VzCAUNJHQwNTg3MDY1ODc2NgJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDU4NzA2NTg3NjYCXzIEDSR0MDU4NzcxNTg4MjQJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDU4NzcxNTg4MjQCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwNTg3NzE1ODgyNAJfMgQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlCQCUCgIFA25pbAUDZmVlAWkBCmNoZWNrcG9pbnQBBXVzZXJfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhhjaGVja3BvaW50OiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgkBC19jaGVja3BvaW50AQUEdXNlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEIBQdzdG9yYWdlAl8xBARlcnIxAwMJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHHN0YWtlOiBpbnZhbGlkIHBheW1lbnRzIHNpemUJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhxzdGFrZTogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBA0kdDA1OTgzMjU5ODkyCQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTk4MzI1OTg5MgJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1OTgzMjU5ODkyAl8yCQCUCgIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBkAgkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9zYXZlVG90YWxMcAEJAGQCCQEMX2xvYWRUb3RhbExwAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5zdGFrZQEHYW1vdW50XwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQZ1c2VyTHACF3Vuc3Rha2U6IGludmFsaWQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEDSR0MDYwNDAzNjA0NjMJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA2MDQwMzYwNDYzAl8xBAt1c2VyUHJvZml0cwgFDSR0MDYwNDAzNjA0NjMCXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FCWxwQXNzZXRJZAUDbmlsBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBlAgUGdXNlckxwBQdhbW91bnRfCQEMX3NhdmVUb3RhbExwAQkAZQIJAQxfbG9hZFRvdGFsTHAABQdhbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwITY2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQGdXNlckxwCQELX2xvYWRVc2VyTHABBQR1c2VyBA0kdDA2MTE4NjYxMjQyCQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDYxMTg2NjEyNDICXzEEC3VzZXJQcm9maXRzCAUNJHQwNjExODY2MTI0MgJfMgoBCGZvbGRGdW5jAgNhY2MGcHJvZml0BAVpbmRleAgFA2FjYwJfMQMDCQBnAgUIbWF4SW5kZXgFBWluZGV4CQBmAgUGcHJvZml0AAAHBAVhc3NldAkAkQMCBQZhc3NldHMFBWluZGV4CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQEOU2NyaXB0VHJhbnNmZXIDBQR1c2VyBQZwcm9maXQJAQtfc3RyVG9Bc3NldAEFBWFzc2V0CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBnByb2ZpdAgFA2FjYwJfMwQNJHQwNjE2MjA2MTcxMQoAAiRsBQt1c2VyUHJvZml0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwNjE2MjA2MTcxMQJfMQQSdXNlclByb2ZpdHNVcGRhdGVkCAUNJHQwNjE2MjA2MTcxMQJfMgQNcHJvZml0QWN0aW9ucwgFDSR0MDYxNjIwNjE3MTECXzMJAJQKAgkAzggCCQDOCAIFDXByb2ZpdEFjdGlvbnMJANEIAgURY2hlY2twb2ludEFjdGlvbnMAAAkBEF9zYXZlVXNlclByb2ZpdHMCBQR1c2VyBRJ1c2VyUHJvZml0c1VwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEGBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VucGF1c2UABANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQELX3doZW5QYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEHBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVBhdXNlcgEHcGF1c2VyXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhx1cGRhdGVQYXVzZXI6IGludmFsaWQgcGF1c2VyBwMJAAACBQNlcnIFA2VycgkAlAoCCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDnVwZGF0ZVdhdGNoZG9nAgl3YXRjaGRvZ18Hb2Zmc2V0XwQDZXJyAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUJd2F0Y2hkb2dfAiB1cGRhdGVXYXRjaGRvZzogaW52YWxpZCB3YXRjaGRvZwcJAQxfdmFsaWRhdGVJbnQEBQdvZmZzZXRfAAAFB01BWF9JTlQCHnVwZGF0ZVdhdGNoZG9nOiBpbnZhbGlkIG9mZnNldAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQENX3NhdmVXYXRjaGRvZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXdhdGNoZG9nXwkBE19zYXZlV2F0Y2hkb2dPZmZzZXQBBQdvZmZzZXRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF92YWxpZGF0ZUFkZHJlc3MCBQltdWx0aXNpZ18CHXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQNTRVAHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V59DUqCw==", "height": 2832808, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 329GTkeQum7yM56m64n1Tsev8G55JGgzoHNwyzZegTvi Next: 3dhuSvHErDJWxEVQR76hrvJy5ZkkZNUQUm4uo7WE2PCd Diff:
OldNewDifferences
870870 func _decrementBalanceByIndex (balances_,index_,amount_) = {
871871 func foldFunc (acc,elem) = {
872872 let index = acc._1
873- if ((index == index_))
874- then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
875- else $Tuple2((index + 1), (acc._2 :+ elem))
873+ if (if ((index == index_))
874+ then (amount_ > elem)
875+ else false)
876+ then throw("insufficient balance")
877+ else if (if ((index == index_))
878+ then (elem >= amount_)
879+ else false)
880+ then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
881+ else $Tuple2((index + 1), (acc._2 :+ elem))
876882 }
877883
878884 let result = {
898904 func foldFunc (acc,elem) = {
899905 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
900906 let deltaBalance = (elem - newBalance)
901- $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
907+ if ((0 > deltaBalance))
908+ then throw("insufficient delta balance")
909+ else $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
902910 }
903911
904912 let $l = balances_
10371045 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10381046 }
10391047
1040- let $t02555825631 = {
1048+ let $t02577125844 = {
10411049 let $l = ZERO_INT_LIST_11
10421050 let $s = size($l)
10431051 let $acc0 = $Tuple2(0, nil)
10511059
10521060 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10531061 }
1054- let idx = $t02555825631._1
1055- let profitsUpdated = $t02555825631._2
1062+ let idx = $t02577125844._1
1063+ let profitsUpdated = $t02577125844._2
10561064 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10571065 }
10581066
10661074 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10671075 }
10681076
1069- let $t02628126360 = {
1077+ let $t02649426573 = {
10701078 let $l = ZERO_INT_LIST_11
10711079 let $s = size($l)
10721080 let $acc0 = $Tuple2(0, nil)
10801088
10811089 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10821090 }
1083- let idx = $t02628126360._1
1084- let sigmaFeePerLpUpdated = $t02628126360._2
1091+ let idx = $t02649426573._1
1092+ let sigmaFeePerLpUpdated = $t02649426573._2
10851093 sigmaFeePerLpUpdated
10861094 }
10871095
10891097 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10901098 let sigmaFeePerLp = _loadSigmaFeePerLp()
10911099 let totalLp = _loadTotalLp()
1092- let $t02658126856 = if ((totalLp == 0))
1100+ let $t02679427069 = if ((totalLp == 0))
10931101 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10941102 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1095- let lpFee = $t02658126856._1
1096- let protocolFee = $t02658126856._2
1103+ let lpFee = $t02679427069._1
1104+ let protocolFee = $t02679427069._2
10971105 let sigmaFeePerLpUpdated = if ((lpFee == 0))
10981106 then sigmaFeePerLp
10991107 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11081116 let slippageRate = storage._8
11091117 let feeMaxRate = storage._9
11101118 let assets = _loadAssets()
1111- let $t02736527418 = _loadAssetWeights()
1112- let assetWeights = $t02736527418._1
1113- let sigmaWeight = $t02736527418._2
1114- let $t02742327491 = _loadAssetBalances()
1115- let prevAssetBalances = $t02742327491._1
1116- let prevAssetTotalSupply = $t02742327491._2
1117- let $t02749728727 = if ((prevAssetTotalSupply == 0))
1119+ let $t02757827631 = _loadAssetWeights()
1120+ let assetWeights = $t02757827631._1
1121+ let sigmaWeight = $t02757827631._2
1122+ let $t02763627704 = _loadAssetBalances()
1123+ let prevAssetBalances = $t02763627704._1
1124+ let prevAssetTotalSupply = $t02763627704._2
1125+ let $t02771028940 = if ((prevAssetTotalSupply == 0))
11181126 then {
11191127 func foldFunc (acc,elem) = {
11201128 let index = acc._1
11221130 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11231131 }
11241132
1125- let $t02793928013 = {
1133+ let $t02815228226 = {
11261134 let $l = assets
11271135 let $s = size($l)
11281136 let $acc0 = $Tuple2(0, nil)
11361144
11371145 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11381146 }
1139- let idx = $t02793928013._1
1140- let requiredAmountsNormalized = $t02793928013._2
1147+ let idx = $t02815228226._1
1148+ let requiredAmountsNormalized = $t02815228226._2
11411149 $Tuple2(amount_, requiredAmountsNormalized)
11421150 }
11431151 else {
11481156 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11491157 }
11501158
1151- let $t02855628631 = {
1159+ let $t02876928844 = {
11521160 let $l = assets
11531161 let $s = size($l)
11541162 let $acc0 = $Tuple2(0, nil)
11621170
11631171 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11641172 }
1165- let idx = $t02855628631._1
1166- let requiredAmountsNormalized = $t02855628631._2
1173+ let idx = $t02876928844._1
1174+ let requiredAmountsNormalized = $t02876928844._2
11671175 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11681176 }
1169- let lpTokensToMint = $t02749728727._1
1170- let requiredAmountsNormalized = $t02749728727._2
1171- let $t02873328846 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1172- let assetBalances = $t02873328846._1
1173- let assetTotalSupply = $t02873328846._2
1177+ let lpTokensToMint = $t02771028940._1
1178+ let requiredAmountsNormalized = $t02771028940._2
1179+ let $t02894629059 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1180+ let assetBalances = $t02894629059._1
1181+ let assetTotalSupply = $t02894629059._2
11741182 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11751183 if ((err2 == err2))
11761184 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11881196 let slippageRate = storage._8
11891197 let feeMaxRate = storage._9
11901198 let assets = _loadAssets()
1191- let $t02960929662 = _loadAssetWeights()
1192- let assetWeights = $t02960929662._1
1193- let sigmaWeight = $t02960929662._2
1194- let $t02966729781 = _loadAssetBalances()
1195- let prevAssetBalances = $t02966729781._1
1196- let prevAssetTotalSupply = $t02966729781._2
1199+ let $t02982229875 = _loadAssetWeights()
1200+ let assetWeights = $t02982229875._1
1201+ let sigmaWeight = $t02982229875._2
1202+ let $t02988029994 = _loadAssetBalances()
1203+ let prevAssetBalances = $t02988029994._1
1204+ let prevAssetTotalSupply = $t02988029994._2
11971205 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
11981206 let assetTotalSupply = (prevAssetTotalSupply + amount_)
11991207 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12131221 then lpTokensToMintInner
12141222 else throw("Strict value is not equal to itself.")
12151223 }
1216- let $t03144331574 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1217- let lpFee = $t03144331574._1
1218- let protocolFee = $t03144331574._2
1219- let sigmaFeePerLpUpdated = $t03144331574._3
1224+ let $t03165631787 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1225+ let lpFee = $t03165631787._1
1226+ let protocolFee = $t03165631787._2
1227+ let sigmaFeePerLpUpdated = $t03165631787._3
12201228 $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12211229 }
12221230 else throw("Strict value is not equal to itself.")
12301238 let weightAmplifier = storage._7
12311239 let slippageRate = storage._8
12321240 let feeMaxRate = storage._9
1233- let $t03190831976 = _loadAssetBalances()
1234- let prevAssetBalances = $t03190831976._1
1235- let prevAssetTotalSupply = $t03190831976._2
1236- let $t03198132034 = _loadAssetWeights()
1237- let assetWeights = $t03198132034._1
1238- let sigmaWeight = $t03198132034._2
1241+ let $t03212132189 = _loadAssetBalances()
1242+ let prevAssetBalances = $t03212132189._1
1243+ let prevAssetTotalSupply = $t03212132189._2
1244+ let $t03219432247 = _loadAssetWeights()
1245+ let assetWeights = $t03219432247._1
1246+ let sigmaWeight = $t03219432247._2
12391247 let lpTokensToBurn = amount_
12401248 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12411249 if ((err == err))
12421250 then {
1243- let $t03217632309 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1244- let assetBalances = $t03217632309._1
1245- let assetTotalSupply = $t03217632309._2
1246- let balancesToPay = $t03217632309._3
1251+ let $t03238932522 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1252+ let assetBalances = $t03238932522._1
1253+ let assetTotalSupply = $t03238932522._2
1254+ let balancesToPay = $t03238932522._3
12471255 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12481256 if ((err2 == err2))
12491257 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12641272 let feeMaxRate = storage._9
12651273 let precision = _loadPrecision()
12661274 let assets = _loadAssets()
1267- let $t03310133169 = _loadAssetBalances()
1268- let prevAssetBalances = $t03310133169._1
1269- let prevAssetTotalSupply = $t03310133169._2
1270- let $t03317433227 = _loadAssetWeights()
1271- let assetWeights = $t03317433227._1
1272- let sigmaWeight = $t03317433227._2
1275+ let $t03331433382 = _loadAssetBalances()
1276+ let prevAssetBalances = $t03331433382._1
1277+ let prevAssetTotalSupply = $t03331433382._2
1278+ let $t03338733440 = _loadAssetWeights()
1279+ let assetWeights = $t03338733440._1
1280+ let sigmaWeight = $t03338733440._2
12731281 let targetAssetIndex = value(indexOf(assets, assetId_))
12741282 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12751283 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12961304
12971305 let targetAmount = {
12981306 let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1299- let $t03509335205 = {
1307+ let $t03530635418 = {
13001308 let $l = LIST_64
13011309 let $s = size($l)
13021310 let $acc0 = $Tuple5(false, 0, stop, 0, 0)
13101318
13111319 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
13121320 }
1313- let success = $t03509335205._1
1314- let startOut = $t03509335205._2
1315- let stopOut = $t03509335205._3
1316- let targetAmountOut = $t03509335205._4
1317- let diffOut = $t03509335205._5
1321+ let success = $t03530635418._1
1322+ let startOut = $t03530635418._2
1323+ let stopOut = $t03530635418._3
1324+ let targetAmountOut = $t03530635418._4
1325+ let diffOut = $t03530635418._5
13181326 if (!(success))
13191327 then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
13201328 else targetAmountOut
13261334 else false
13271335 if ((err1 == err1))
13281336 then {
1329- let $t03619736345 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1330- let lpFee = $t03619736345._1
1331- let protocolFee = $t03619736345._2
1332- let sigmaFeePerLpUpdated = $t03619736345._3
1337+ let $t03641036558 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1338+ let lpFee = $t03641036558._1
1339+ let protocolFee = $t03641036558._2
1340+ let sigmaFeePerLpUpdated = $t03641036558._3
13331341 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13341342 }
13351343 else throw("Strict value is not equal to itself.")
13481356 let slippageRate = storage._8
13491357 let feeMaxRate = storage._9
13501358 let precision = _loadPrecision()
1351- let $t03692736995 = _loadAssetBalances()
1352- let prevAssetBalances = $t03692736995._1
1353- let prevAssetTotalSupply = $t03692736995._2
1354- let $t03700037053 = _loadAssetWeights()
1355- let assetWeights = $t03700037053._1
1356- let sigmaWeight = $t03700037053._2
1359+ let $t03714037208 = _loadAssetBalances()
1360+ let prevAssetBalances = $t03714037208._1
1361+ let prevAssetTotalSupply = $t03714037208._2
1362+ let $t03721337266 = _loadAssetWeights()
1363+ let assetWeights = $t03721337266._1
1364+ let sigmaWeight = $t03721337266._2
13571365 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13581366 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13591367 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13851393 if ((feeDiff == 0))
13861394 then targetAmount
13871395 else {
1388- let $t03902639157 = {
1396+ let $t03923939370 = {
13891397 let $l = LIST_64
13901398 let $s = size($l)
13911399 let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
13991407
14001408 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
14011409 }
1402- let success = $t03902639157._1
1403- let startOut = $t03902639157._2
1404- let stopOut = $t03902639157._3
1405- let targetAmountOut = $t03902639157._4
1406- let diffOut = $t03902639157._5
1410+ let success = $t03923939370._1
1411+ let startOut = $t03923939370._2
1412+ let stopOut = $t03923939370._3
1413+ let targetAmountOut = $t03923939370._4
1414+ let diffOut = $t03923939370._5
14071415 if (!(success))
14081416 then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
14091417 else targetAmountOut
14161424 else false
14171425 if ((err1 == err1))
14181426 then {
1419- let $t04000440145 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1420- let lpFee = $t04000440145._1
1421- let protocolFee = $t04000440145._2
1422- let sigmaFeePerLpUpdated = $t04000440145._3
1427+ let $t04021740358 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1428+ let lpFee = $t04021740358._1
1429+ let protocolFee = $t04021740358._2
1430+ let sigmaFeePerLpUpdated = $t04021740358._3
14231431 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14241432 }
14251433 else throw("Strict value is not equal to itself.")
14651473 else false
14661474 if ((err == err))
14671475 then {
1468- let $t04200842077 = _prepareAssetWeights(assetWeights_)
1469- let assetWeights = $t04200842077._1
1470- let sigmaWeight = $t04200842077._2
1476+ let $t04222142290 = _prepareAssetWeights(assetWeights_)
1477+ let assetWeights = $t04222142290._1
1478+ let sigmaWeight = $t04222142290._2
14711479 let assetBalances = _prepareAssetBalances(assets_)
14721480 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14731481 let lpAssetId = calculateAssetId(issue)
14921500 let lpAssetId = storage._1
14931501 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14941502 let assets = _loadAssets()
1495- let $t04382743912 = _depositAll(amount_)
1496- let lpTokensToMint = $t04382743912._1
1497- let requiredAmountsNormalized = $t04382743912._2
1498- let assetBalances = $t04382743912._3
1503+ let $t04404044125 = _depositAll(amount_)
1504+ let lpTokensToMint = $t04404044125._1
1505+ let requiredAmountsNormalized = $t04404044125._2
1506+ let assetBalances = $t04404044125._3
14991507 func foldFunc (acc,elem) = {
15001508 let index = acc._1
15011509 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15191527 else throw("Strict value is not equal to itself.")
15201528 }
15211529
1522- let $t04505545117 = {
1530+ let $t04526845330 = {
15231531 let $l = assets
15241532 let $s = size($l)
15251533 let $acc0 = $Tuple2(0, nil)
15331541
15341542 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
15351543 }
1536- let idx = $t04505545117._1
1537- let changeActions = $t04505545117._2
1544+ let idx = $t04526845330._1
1545+ let changeActions = $t04526845330._2
15381546 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15391547 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15401548 }
15681576 let assetStr = _assetToStr(i.payments[0].assetId)
15691577 let assetDecimals = _getDecimals(assetStr)
15701578 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1571- let $t04655746673 = _deposit(assetStr, amountNormalized)
1572- let lpTokensToMint = $t04655746673._1
1573- let assetBalances = $t04655746673._2
1574- let lpFee = $t04655746673._3
1575- let protocolFee = $t04655746673._4
1576- let sigmaFeePerLpUpdated = $t04655746673._5
1579+ let $t04677046886 = _deposit(assetStr, amountNormalized)
1580+ let lpTokensToMint = $t04677046886._1
1581+ let assetBalances = $t04677046886._2
1582+ let lpFee = $t04677046886._3
1583+ let protocolFee = $t04677046886._4
1584+ let sigmaFeePerLpUpdated = $t04677046886._5
15771585 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15781586 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15791587 if ((err2 == err2))
16061614 else false
16071615 if ((err == err))
16081616 then {
1609- let $t04813448221 = _withdrawAll(i.payments[0].amount)
1610- let lpTokensToBurn = $t04813448221._1
1611- let balancesToPay = $t04813448221._2
1612- let assetBalances = $t04813448221._3
1617+ let $t04834748434 = _withdrawAll(i.payments[0].amount)
1618+ let lpTokensToBurn = $t04834748434._1
1619+ let balancesToPay = $t04834748434._2
1620+ let assetBalances = $t04834748434._3
16131621 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16141622 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16151623 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16431651 else false
16441652 if ((err == err))
16451653 then {
1646- let $t04957549709 = _withdraw(assetId_, i.payments[0].amount)
1647- let targetAmountNormalized = $t04957549709._1
1648- let finalAssetBalances = $t04957549709._2
1649- let lpFee = $t04957549709._3
1650- let protocolFee = $t04957549709._4
1651- let sigmaFeePerLpUpdated = $t04957549709._5
1654+ let $t04978849922 = _withdraw(assetId_, i.payments[0].amount)
1655+ let targetAmountNormalized = $t04978849922._1
1656+ let finalAssetBalances = $t04978849922._2
1657+ let lpFee = $t04978849922._3
1658+ let protocolFee = $t04978849922._4
1659+ let sigmaFeePerLpUpdated = $t04978849922._5
16521660 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16531661 let targetDecimals = _getDecimals(assetId_)
16541662 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16941702 else false
16951703 if ((err == err))
16961704 then {
1697- let $t05182251980 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1698- let targetAmountNormalized = $t05182251980._1
1699- let finalAssetBalances = $t05182251980._2
1700- let lpFee = $t05182251980._3
1701- let protocolFee = $t05182251980._4
1702- let sigmaFeePerLpUpdated = $t05182251980._5
1705+ let $t05203552193 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1706+ let targetAmountNormalized = $t05203552193._1
1707+ let finalAssetBalances = $t05203552193._2
1708+ let lpFee = $t05203552193._3
1709+ let protocolFee = $t05203552193._4
1710+ let sigmaFeePerLpUpdated = $t05203552193._5
17031711 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17041712 let targetDecimals = _getDecimals(targetAssetId_)
17051713 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17221730 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17231731 if ((err == err))
17241732 then {
1725- let $t05310053187 = _depositAll(lpAmount_)
1726- let lpTokensToMint = $t05310053187._1
1727- let requiredAmountsNormalized = $t05310053187._2
1728- let assetBalances = $t05310053187._3
1733+ let $t05331353400 = _depositAll(lpAmount_)
1734+ let lpTokensToMint = $t05331353400._1
1735+ let requiredAmountsNormalized = $t05331353400._2
1736+ let assetBalances = $t05331353400._3
17291737 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17301738 }
17311739 else throw("Strict value is not equal to itself.")
17451753 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17461754 let assetDecimals = _getDecimals(assetId_)
17471755 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1748- let $t05394654062 = _deposit(assetId_, amountNormalized)
1749- let lpTokensToMint = $t05394654062._1
1750- let assetBalances = $t05394654062._2
1751- let lpFee = $t05394654062._3
1752- let protocolFee = $t05394654062._4
1753- let sigmaFeePerLpUpdated = $t05394654062._5
1756+ let $t05415954275 = _deposit(assetId_, amountNormalized)
1757+ let lpTokensToMint = $t05415954275._1
1758+ let assetBalances = $t05415954275._2
1759+ let lpFee = $t05415954275._3
1760+ let protocolFee = $t05415954275._4
1761+ let sigmaFeePerLpUpdated = $t05415954275._5
17541762 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17551763 $Tuple2(nil, lpTokensToSend)
17561764 }
17641772 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17651773 if ((err == err))
17661774 then {
1767- let $t05450154577 = _withdrawAll(lpAmount_)
1768- let lpTokensToBurn = $t05450154577._1
1769- let balancesToGet = $t05450154577._2
1770- let assetBalances = $t05450154577._3
1775+ let $t05471454790 = _withdrawAll(lpAmount_)
1776+ let lpTokensToBurn = $t05471454790._1
1777+ let balancesToGet = $t05471454790._2
1778+ let assetBalances = $t05471454790._3
17711779 $Tuple2(nil, balancesToGet)
17721780 }
17731781 else throw("Strict value is not equal to itself.")
17851793 let storage = _loadStorage()
17861794 let lpAssetId = storage._1
17871795 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1788- let $t05522855344 = _withdraw(assetId_, amount_)
1789- let targetAmountNormalized = $t05522855344._1
1790- let assetBalances = $t05522855344._2
1791- let lpFee = $t05522855344._3
1792- let protocolFee = $t05522855344._4
1793- let sigmaFeePerLpUpdated = $t05522855344._5
1796+ let $t05544155557 = _withdraw(assetId_, amount_)
1797+ let targetAmountNormalized = $t05544155557._1
1798+ let assetBalances = $t05544155557._2
1799+ let lpFee = $t05544155557._3
1800+ let protocolFee = $t05544155557._4
1801+ let sigmaFeePerLpUpdated = $t05544155557._5
17941802 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17951803 let targetDecimals = _getDecimals(assetId_)
17961804 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18191827 else false
18201828 if ((err == err))
18211829 then {
1822- let $t05675456912 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1823- let targetAmountNormalized = $t05675456912._1
1824- let finalAssetBalances = $t05675456912._2
1825- let lpFee = $t05675456912._3
1826- let protocolFee = $t05675456912._4
1827- let sigmaFeePerLpUpdated = $t05675456912._5
1830+ let $t05696757125 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1831+ let targetAmountNormalized = $t05696757125._1
1832+ let finalAssetBalances = $t05696757125._2
1833+ let lpFee = $t05696757125._3
1834+ let protocolFee = $t05696757125._4
1835+ let sigmaFeePerLpUpdated = $t05696757125._5
18281836 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18291837 let targetDecimals = _getDecimals(targetAssetId_)
18301838 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18441852 let user = if ((size(user_) > 0))
18451853 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18461854 else i.caller
1847- let $t05755457610 = _checkpoint(user)
1848- let checkpointActions = $t05755457610._1
1849- let userProfits = $t05755457610._2
1855+ let $t05776757823 = _checkpoint(user)
1856+ let checkpointActions = $t05776757823._1
1857+ let userProfits = $t05776757823._2
18501858 $Tuple2(nil, userProfits)
18511859 }
18521860
18591867 let weightAmplifier = storage._7
18601868 let slippageRate = storage._8
18611869 let feeMaxRate = storage._9
1862- let $t05794358003 = _loadAssetBalances()
1863- let assetBalances = $t05794358003._1
1864- let assetTotalSupply = $t05794358003._2
1865- let $t05800858061 = _loadAssetWeights()
1866- let assetWeights = $t05800858061._1
1867- let sigmaWeight = $t05800858061._2
1870+ let $t05815658216 = _loadAssetBalances()
1871+ let assetBalances = $t05815658216._1
1872+ let assetTotalSupply = $t05815658216._2
1873+ let $t05822158274 = _loadAssetWeights()
1874+ let assetWeights = $t05822158274._1
1875+ let sigmaWeight = $t05822158274._2
18681876 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18691877 let utilValue = (assetTotalSupply - fee)
18701878 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18781886 let weightAmplifier = storage._7
18791887 let slippageRate = storage._8
18801888 let feeMaxRate = storage._9
1881- let $t05849358553 = _loadAssetBalances()
1882- let assetBalances = $t05849358553._1
1883- let assetTotalSupply = $t05849358553._2
1884- let $t05855858611 = _loadAssetWeights()
1885- let assetWeights = $t05855858611._1
1886- let sigmaWeight = $t05855858611._2
1889+ let $t05870658766 = _loadAssetBalances()
1890+ let assetBalances = $t05870658766._1
1891+ let assetTotalSupply = $t05870658766._2
1892+ let $t05877158824 = _loadAssetWeights()
1893+ let assetWeights = $t05877158824._1
1894+ let sigmaWeight = $t05877158824._2
18871895 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18881896 $Tuple2(nil, fee)
18891897 }
19231931 else false
19241932 if ((err1 == err1))
19251933 then {
1926- let $t05961959679 = _checkpoint(i.caller)
1927- let checkpointActions = $t05961959679._1
1928- let userProfits = $t05961959679._2
1934+ let $t05983259892 = _checkpoint(i.caller)
1935+ let checkpointActions = $t05983259892._1
1936+ let userProfits = $t05983259892._2
19291937 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19301938 }
19311939 else throw("Strict value is not equal to itself.")
19481956 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19491957 if ((err1 == err1))
19501958 then {
1951- let $t06019060250 = _checkpoint(i.caller)
1952- let checkpointActions = $t06019060250._1
1953- let userProfits = $t06019060250._2
1959+ let $t06040360463 = _checkpoint(i.caller)
1960+ let checkpointActions = $t06040360463._1
1961+ let userProfits = $t06040360463._2
19541962 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19551963 }
19561964 else throw("Strict value is not equal to itself.")
19761984 let assets = [lpAssetIdStr, _loadAssets()]
19771985 let maxIndex = (size(assets) - 1)
19781986 let userLp = _loadUserLp(user)
1979- let $t06097361029 = _checkpoint(user)
1980- let checkpointActions = $t06097361029._1
1981- let userProfits = $t06097361029._2
1987+ let $t06118661242 = _checkpoint(user)
1988+ let checkpointActions = $t06118661242._1
1989+ let userProfits = $t06118661242._2
19821990 func foldFunc (acc,profit) = {
19831991 let index = acc._1
19841992 if (if ((maxIndex >= index))
19911999 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19922000 }
19932001
1994- let $t06140761498 = {
2002+ let $t06162061711 = {
19952003 let $l = userProfits
19962004 let $s = size($l)
19972005 let $acc0 = $Tuple3(0, nil, nil)
20052013
20062014 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
20072015 }
2008- let idx = $t06140761498._1
2009- let userProfitsUpdated = $t06140761498._2
2010- let profitActions = $t06140761498._3
2016+ let idx = $t06162061711._1
2017+ let userProfitsUpdated = $t06162061711._2
2018+ let profitActions = $t06162061711._3
20112019 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
20122020 }
20132021 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let WAVES = "waves"
77
88 let MAX_INT = 9223372036854775807
99
1010 let MAX_FEE = 1000000
1111
1212 let MAX_AMPLIFIER = 1000000
1313
1414 let MAX_WEIGHT_AMPLIFIER = 1000000
1515
1616 let MAX_WEIGHT = 1000000
1717
1818 let SLIPPAGE_RATE_FACTOR = 1000000
1919
2020 let FEE_RATE_FACTOR = 1000000
2121
2222 let RATE_FACTOR = 1000000
2323
2424 let PERCENT_FACTOR = toBigInt(1000000000000000000)
2525
2626 let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2727
2828 let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
2929
3030 let ZERO_BIGINT = toBigInt(0)
3131
3232 let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
3333
3434 let INT_DECIMALS = 8
3535
3636 let BIGINT_DECIMALS = 18
3737
3838 let LIST_64 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
3939
4040 let KEY_MULTISIG = "MULTISIG"
4141
4242 let KEY_STATUS = "STATUS"
4343
4444 let KEY_PAUSED = "PAUSED"
4545
4646 let KEY_PAUSER = "PAUSER"
4747
4848 let KEY_STORAGE = "STORAGE"
4949
5050 let KEY_ASSETS = "ASSETS"
5151
5252 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
5353
5454 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5555
5656 let KEY_LP_FEE = "LP_FEE"
5757
5858 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
5959
6060 let KEY_PRECISION = "PRECISION"
6161
6262 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6363
6464 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6565
6666 let KEY_USER_LP = "USER_LP"
6767
6868 let KEY_TOTAL_LP = "TOTAL_LP"
6969
7070 let KEY_USER_PROFITS = "USER_PROFITS"
7171
7272 let KEY_WATCHDOG = "WATCHDOG"
7373
7474 let KEY_WATCHDOG_OFFSET = "WATCHDOG_OFFSET"
7575
7676 let KEY_WATCHDOG_HEIGHT = "WATCHDOG_HEIGHT"
7777
7878 func _validateAddress (address_,err_) = match addressFromString(address_) {
7979 case a: Address =>
8080 true
8181 case _ =>
8282 throw(err_)
8383 }
8484
8585
8686 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
8787 then true
8888 else match assetInfo(fromBase58String(assetId_)) {
8989 case a: Asset =>
9090 true
9191 case _ =>
9292 throw(err_)
9393 }
9494
9595
9696 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
9797 then true
9898 else (val_ > upperBoundary_))
9999 then throw(err_)
100100 else true
101101
102102
103103 func _validateBool (val_,target_,err_) = if ((val_ != target_))
104104 then throw(err_)
105105 else true
106106
107107
108108 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
109109 then throw(err_)
110110 else true
111111
112112
113113 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
114114 then throw(err_)
115115 else true
116116
117117
118118 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
119119 func foldFunc (acc,elem) = match parseInt(elem) {
120120 case a: Int =>
121121 if (acc)
122122 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
123123 else false
124124 case _ =>
125125 throw(err_)
126126 }
127127
128128 let $l = val_
129129 let $s = size($l)
130130 let $acc0 = true
131131 func $f0_1 ($a,$i) = if (($i >= $s))
132132 then $a
133133 else foldFunc($a, $l[$i])
134134
135135 func $f0_2 ($a,$i) = if (($i >= $s))
136136 then $a
137137 else throw("List size exceeds 10")
138138
139139 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
140140 }
141141
142142
143143 func _validateAssets (assets_,err_) = {
144144 func foldFunc (acc,elem) = if (acc)
145145 then _validateAsset(elem, err_)
146146 else false
147147
148148 let $l = assets_
149149 let $s = size($l)
150150 let $acc0 = true
151151 func $f0_1 ($a,$i) = if (($i >= $s))
152152 then $a
153153 else foldFunc($a, $l[$i])
154154
155155 func $f0_2 ($a,$i) = if (($i >= $s))
156156 then $a
157157 else throw("List size exceeds 10")
158158
159159 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
160160 }
161161
162162
163163 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
164164 then throw(err_)
165165 else true
166166
167167
168168 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
169169 then true
170170 else (size(val_) > 16))
171171 then throw(err_)
172172 else true
173173
174174
175175 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
176176 then throw(err_)
177177 else true
178178
179179
180180 func _validateDecimals (val_,err_) = if (if ((0 > val_))
181181 then true
182182 else (val_ > 8))
183183 then throw(err_)
184184 else true
185185
186186
187187 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
188188 case a: ByteVector =>
189189 if ((assetId_ != toBase58String(a)))
190190 then throw((err_ + ": asset"))
191191 else if ((requiredAmount_ > payment_.amount))
192192 then throw((err_ + ": amount"))
193193 else true
194194 case _ =>
195195 throw((err_ + ": asset"))
196196 }
197197
198198
199199 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
200200 then throw(err_)
201201 else true
202202
203203
204204 func _assetToStr (asset_) = match asset_ {
205205 case a: ByteVector =>
206206 toBase58String(a)
207207 case _ =>
208208 WAVES
209209 }
210210
211211
212212 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
213213 then true
214214 else (asset_ == ""))
215215 then unit
216216 else fromBase58String(asset_)
217217
218218
219219 func _loadPause () = match getBoolean(KEY_PAUSED) {
220220 case a: Boolean =>
221221 a
222222 case _ =>
223223 false
224224 }
225225
226226
227227 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
228228
229229
230230 func _loadPauser () = match getString(KEY_PAUSER) {
231231 case a: String =>
232232 addressFromStringValue(a)
233233 case _ =>
234234 Address(base58'')
235235 }
236236
237237
238238 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
239239
240240
241241 func _loadMultisig () = match getString(KEY_MULTISIG) {
242242 case a: String =>
243243 addressFromStringValue(a)
244244 case _ =>
245245 Address(base58'')
246246 }
247247
248248
249249 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
250250
251251
252252 func _loadStorage () = match getString(KEY_STORAGE) {
253253 case a: String =>
254254 let struct = split(a, SEP)
255255 $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), parseIntValue(struct[6]), parseIntValue(struct[7]), parseIntValue(struct[8]), addressFromStringValue(struct[9]))
256256 case _ =>
257257 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
258258 }
259259
260260
261261 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
262262 then "1"
263263 else "0", toString(storage_._3), toString(storage_._4), toString(storage_._5), toString(storage_._6), toString(storage_._7), toString(storage_._8), toString(storage_._9), toString(storage_._10)], SEP))]
264264
265265
266266 func _loadAssets () = match getString(KEY_ASSETS) {
267267 case a: String =>
268268 if ((size(a) > 0))
269269 then split_51C(a, SEP)
270270 else nil
271271 case _ =>
272272 nil
273273 }
274274
275275
276276 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
277277
278278
279279 func _loadAssetBalances () = {
280280 func foldFunc (acc,elem) = {
281281 let balance = parseIntValue(elem)
282282 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
283283 }
284284
285285 match getString(KEY_ASSET_BALANCES) {
286286 case a: String =>
287287 if ((size(a) > 0))
288288 then {
289289 let $l = split_51C(a, SEP)
290290 let $s = size($l)
291291 let $acc0 = $Tuple2(nil, 0)
292292 func $f0_1 ($a,$i) = if (($i >= $s))
293293 then $a
294294 else foldFunc($a, $l[$i])
295295
296296 func $f0_2 ($a,$i) = if (($i >= $s))
297297 then $a
298298 else throw("List size exceeds 10")
299299
300300 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
301301 }
302302 else $Tuple2(ZERO_INT_LIST_10, 0)
303303 case _ =>
304304 $Tuple2(ZERO_INT_LIST_10, 0)
305305 }
306306 }
307307
308308
309309 func _saveAssetBalances (balances_) = {
310310 func foldFunc (acc,elem) = (acc :+ toString(elem))
311311
312312 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
313313 let $l = balances_
314314 let $s = size($l)
315315 let $acc0 = nil
316316 func $f0_1 ($a,$i) = if (($i >= $s))
317317 then $a
318318 else foldFunc($a, $l[$i])
319319
320320 func $f0_2 ($a,$i) = if (($i >= $s))
321321 then $a
322322 else throw("List size exceeds 10")
323323
324324 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
325325 }, SEP))]
326326 }
327327
328328
329329 func _loadAssetWeights () = {
330330 func foldFunc (acc,elem) = {
331331 let weight = parseIntValue(elem)
332332 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
333333 }
334334
335335 match getString(KEY_ASSET_WEIGHTS) {
336336 case a: String =>
337337 if ((size(a) > 0))
338338 then {
339339 let $l = split_51C(a, SEP)
340340 let $s = size($l)
341341 let $acc0 = $Tuple2(nil, 0)
342342 func $f0_1 ($a,$i) = if (($i >= $s))
343343 then $a
344344 else foldFunc($a, $l[$i])
345345
346346 func $f0_2 ($a,$i) = if (($i >= $s))
347347 then $a
348348 else throw("List size exceeds 10")
349349
350350 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
351351 }
352352 else $Tuple2(ZERO_INT_LIST_10, 0)
353353 case _ =>
354354 $Tuple2(ZERO_INT_LIST_10, 0)
355355 }
356356 }
357357
358358
359359 func _saveAssetWeights (weights_) = {
360360 func foldFunc (acc,elem) = (acc :+ toString(elem))
361361
362362 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
363363 let $l = weights_
364364 let $s = size($l)
365365 let $acc0 = nil
366366 func $f0_1 ($a,$i) = if (($i >= $s))
367367 then $a
368368 else foldFunc($a, $l[$i])
369369
370370 func $f0_2 ($a,$i) = if (($i >= $s))
371371 then $a
372372 else throw("List size exceeds 10")
373373
374374 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
375375 }, SEP))]
376376 }
377377
378378
379379 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
380380 case a: Int =>
381381 a
382382 case _ =>
383383 0
384384 }
385385
386386
387387 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
388388
389389
390390 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
391391 case a: Int =>
392392 a
393393 case _ =>
394394 0
395395 }
396396
397397
398398 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
399399
400400
401401 func _loadPrecision () = match getInteger(KEY_PRECISION) {
402402 case a: Int =>
403403 a
404404 case _ =>
405405 0
406406 }
407407
408408
409409 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
410410
411411
412412 func _loadSigmaFeePerLp () = {
413413 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
414414
415415 match getString(KEY_SIGMA_FEE_PER_LP) {
416416 case a: String =>
417417 if ((size(a) > 0))
418418 then {
419419 let $l = split_51C(a, SEP)
420420 let $s = size($l)
421421 let $acc0 = nil
422422 func $f0_1 ($a,$i) = if (($i >= $s))
423423 then $a
424424 else foldFunc($a, $l[$i])
425425
426426 func $f0_2 ($a,$i) = if (($i >= $s))
427427 then $a
428428 else throw("List size exceeds 11")
429429
430430 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
431431 }
432432 else ZERO_BIGINT_LIST_11
433433 case _ =>
434434 ZERO_BIGINT_LIST_11
435435 }
436436 }
437437
438438
439439 func _saveSigmaFeePerLp (val_) = {
440440 func foldFunc (acc,elem) = (acc :+ toString(elem))
441441
442442 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
443443 let $l = val_
444444 let $s = size($l)
445445 let $acc0 = nil
446446 func $f0_1 ($a,$i) = if (($i >= $s))
447447 then $a
448448 else foldFunc($a, $l[$i])
449449
450450 func $f0_2 ($a,$i) = if (($i >= $s))
451451 then $a
452452 else throw("List size exceeds 11")
453453
454454 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
455455 }, SEP))]
456456 }
457457
458458
459459 func _loadUserSigmaFeePerLp (user_) = {
460460 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
461461
462462 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
463463 case a: String =>
464464 if ((size(a) > 0))
465465 then {
466466 let $l = split_51C(a, SEP)
467467 let $s = size($l)
468468 let $acc0 = nil
469469 func $f0_1 ($a,$i) = if (($i >= $s))
470470 then $a
471471 else foldFunc($a, $l[$i])
472472
473473 func $f0_2 ($a,$i) = if (($i >= $s))
474474 then $a
475475 else throw("List size exceeds 11")
476476
477477 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
478478 }
479479 else ZERO_BIGINT_LIST_11
480480 case _ =>
481481 ZERO_BIGINT_LIST_11
482482 }
483483 }
484484
485485
486486 func _saveUserSigmaFeePerLp (user_,val_) = {
487487 func foldFunc (acc,elem) = (acc :+ toString(elem))
488488
489489 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
490490 let $l = val_
491491 let $s = size($l)
492492 let $acc0 = nil
493493 func $f0_1 ($a,$i) = if (($i >= $s))
494494 then $a
495495 else foldFunc($a, $l[$i])
496496
497497 func $f0_2 ($a,$i) = if (($i >= $s))
498498 then $a
499499 else throw("List size exceeds 11")
500500
501501 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
502502 }, SEP))]
503503 }
504504
505505
506506 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
507507 case a: Int =>
508508 a
509509 case _ =>
510510 0
511511 }
512512
513513
514514 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
515515
516516
517517 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
518518 case a: Int =>
519519 a
520520 case _ =>
521521 0
522522 }
523523
524524
525525 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
526526
527527
528528 func _loadUserProfits (user_) = {
529529 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
530530
531531 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
532532 case a: String =>
533533 if ((size(a) > 0))
534534 then {
535535 let $l = split_51C(a, SEP)
536536 let $s = size($l)
537537 let $acc0 = nil
538538 func $f0_1 ($a,$i) = if (($i >= $s))
539539 then $a
540540 else foldFunc($a, $l[$i])
541541
542542 func $f0_2 ($a,$i) = if (($i >= $s))
543543 then $a
544544 else throw("List size exceeds 11")
545545
546546 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
547547 }
548548 else ZERO_INT_LIST_11
549549 case _ =>
550550 ZERO_INT_LIST_11
551551 }
552552 }
553553
554554
555555 func _saveUserProfits (user_,val_) = {
556556 func foldFunc (acc,elem) = (acc :+ toString(elem))
557557
558558 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
559559 let $l = val_
560560 let $s = size($l)
561561 let $acc0 = nil
562562 func $f0_1 ($a,$i) = if (($i >= $s))
563563 then $a
564564 else foldFunc($a, $l[$i])
565565
566566 func $f0_2 ($a,$i) = if (($i >= $s))
567567 then $a
568568 else throw("List size exceeds 11")
569569
570570 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
571571 }, SEP))]
572572 }
573573
574574
575575 func _loadWatchdog () = match getString(KEY_WATCHDOG) {
576576 case a: String =>
577577 addressFromStringValue(a)
578578 case _ =>
579579 Address(base58'')
580580 }
581581
582582
583583 func _saveWatchdog (watchdog_) = [StringEntry(KEY_WATCHDOG, toString(watchdog_))]
584584
585585
586586 func _loadWatchdogOffset () = match getInteger(KEY_WATCHDOG_OFFSET) {
587587 case a: Int =>
588588 a
589589 case _ =>
590590 0
591591 }
592592
593593
594594 func _saveWatchdogOffset (offset_) = [IntegerEntry(KEY_WATCHDOG_OFFSET, offset_)]
595595
596596
597597 func _onlyThisContract (caller_) = if ((caller_ != this))
598598 then throw("_onlyThisContract: revert")
599599 else true
600600
601601
602602 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
603603 then throw("_whenMultisigSet: revert")
604604 else true
605605
606606
607607 func _whenNotInitialized () = {
608608 let storage = _loadStorage()
609609 if ((storage._1 != base58''))
610610 then throw("_whenNotInitialized: revert")
611611 else true
612612 }
613613
614614
615615 func _whenInitialized () = {
616616 let storage = _loadStorage()
617617 if ((storage._1 == base58''))
618618 then throw("_whenInitialized: revert")
619619 else true
620620 }
621621
622622
623623 func _whenNotPaused () = if (_loadPause())
624624 then throw("_whenNotPaused: revert")
625625 else true
626626
627627
628628 func _whenPaused () = if (!(_loadPause()))
629629 then throw("_whenPaused: revert")
630630 else true
631631
632632
633633 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
634634 then throw("_onlyPauser: revert")
635635 else true
636636
637637
638638 func _checkWatchdog () = {
639639 let wd = match getInteger(_loadWatchdog(), KEY_WATCHDOG_HEIGHT) {
640640 case a: Int =>
641641 (a + _loadWatchdogOffset())
642642 case _ =>
643643 0
644644 }
645645 if ((height > wd))
646646 then throw("_checkWatchdog: revert")
647647 else true
648648 }
649649
650650
651651 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
652652 case a: Asset =>
653653 a.decimals
654654 case _ =>
655655 throw(("_getDecimals: no asset=" + assetId_))
656656 }
657657
658658
659659 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
660660 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
661661 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
662662
663663
664664 func _prepareAssetBalances (assets_) = {
665665 func foldFunc (acc,elem) = (acc :+ 0)
666666
667667 let $l = assets_
668668 let $s = size($l)
669669 let $acc0 = nil
670670 func $f0_1 ($a,$i) = if (($i >= $s))
671671 then $a
672672 else foldFunc($a, $l[$i])
673673
674674 func $f0_2 ($a,$i) = if (($i >= $s))
675675 then $a
676676 else throw("List size exceeds 10")
677677
678678 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
679679 }
680680
681681
682682 func _prepareAssetWeights (assetWeights_) = {
683683 func foldFunc (acc,elem) = {
684684 let weight = parseIntValue(elem)
685685 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
686686 }
687687
688688 let $l = assetWeights_
689689 let $s = size($l)
690690 let $acc0 = $Tuple2(nil, 0)
691691 func $f0_1 ($a,$i) = if (($i >= $s))
692692 then $a
693693 else foldFunc($a, $l[$i])
694694
695695 func $f0_2 ($a,$i) = if (($i >= $s))
696696 then $a
697697 else throw("List size exceeds 10")
698698
699699 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
700700 }
701701
702702
703703 func _getAssetBalances (assets_,decimals_) = {
704704 func foldFunc (acc,elem) = {
705705 let assetDecimals = _getDecimals(elem)
706706 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
707707 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
708708 }
709709
710710 let $l = assets_
711711 let $s = size($l)
712712 let $acc0 = $Tuple2(nil, 0)
713713 func $f0_1 ($a,$i) = if (($i >= $s))
714714 then $a
715715 else foldFunc($a, $l[$i])
716716
717717 func $f0_2 ($a,$i) = if (($i >= $s))
718718 then $a
719719 else throw("List size exceeds 10")
720720
721721 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
722722 }
723723
724724
725725 func _listIntToString (assets_) = {
726726 func foldFunc (acc,elem) = (acc :+ toString(elem))
727727
728728 makeString({
729729 let $l = assets_
730730 let $s = size($l)
731731 let $acc0 = nil
732732 func $f0_1 ($a,$i) = if (($i >= $s))
733733 then $a
734734 else foldFunc($a, $l[$i])
735735
736736 func $f0_2 ($a,$i) = if (($i >= $s))
737737 then $a
738738 else throw("List size exceeds 11")
739739
740740 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
741741 }, SEP)
742742 }
743743
744744
745745 func _listBigIntToString (assets_) = {
746746 func foldFunc (acc,elem) = (acc :+ toString(elem))
747747
748748 makeString({
749749 let $l = assets_
750750 let $s = size($l)
751751 let $acc0 = nil
752752 func $f0_1 ($a,$i) = if (($i >= $s))
753753 then $a
754754 else foldFunc($a, $l[$i])
755755
756756 func $f0_2 ($a,$i) = if (($i >= $s))
757757 then $a
758758 else throw("List size exceeds 11")
759759
760760 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
761761 }, SEP)
762762 }
763763
764764
765765 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
766766 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
767767
768768 let $l = weights_
769769 let $s = size($l)
770770 let $acc0 = nil
771771 func $f0_1 ($a,$i) = if (($i >= $s))
772772 then $a
773773 else foldFunc($a, $l[$i])
774774
775775 func $f0_2 ($a,$i) = if (($i >= $s))
776776 then $a
777777 else throw("List size exceeds 10")
778778
779779 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
780780 }
781781
782782
783783 func _incrementBalancesByAmounts (balances_,amounts_) = {
784784 func foldFunc (acc,elem) = {
785785 let index = acc._1
786786 let amount = amounts_[index]
787787 let newBalance = (elem + amount)
788788 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
789789 }
790790
791791 let result = {
792792 let $l = balances_
793793 let $s = size($l)
794794 let $acc0 = $Tuple3(0, nil, 0)
795795 func $f0_1 ($a,$i) = if (($i >= $s))
796796 then $a
797797 else foldFunc($a, $l[$i])
798798
799799 func $f0_2 ($a,$i) = if (($i >= $s))
800800 then $a
801801 else throw("List size exceeds 10")
802802
803803 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
804804 }
805805 $Tuple2(result._2, result._3)
806806 }
807807
808808
809809 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
810810 func foldFunc (acc,elem) = {
811811 let index = acc._1
812812 let payment = payments_[index]
813813 let paymentAssetStr = _assetToStr(payment.assetId)
814814 let err = if ((paymentAssetStr != assets_[index]))
815815 then throw(((err_ + ": index=") + toString(index)))
816816 else unit
817817 if ((err == err))
818818 then {
819819 let assetDecimals = _getDecimals(paymentAssetStr)
820820 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
821821 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
822822 }
823823 else throw("Strict value is not equal to itself.")
824824 }
825825
826826 let result = {
827827 let $l = balances_
828828 let $s = size($l)
829829 let $acc0 = $Tuple3(0, nil, 0)
830830 func $f0_1 ($a,$i) = if (($i >= $s))
831831 then $a
832832 else foldFunc($a, $l[$i])
833833
834834 func $f0_2 ($a,$i) = if (($i >= $s))
835835 then $a
836836 else throw("List size exceeds 10")
837837
838838 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
839839 }
840840 $Tuple2(result._2, result._3)
841841 }
842842
843843
844844 func _incrementBalanceByIndex (balances_,index_,amount_) = {
845845 func foldFunc (acc,elem) = {
846846 let index = acc._1
847847 if ((index == index_))
848848 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
849849 else $Tuple2((index + 1), (acc._2 :+ elem))
850850 }
851851
852852 let result = {
853853 let $l = balances_
854854 let $s = size($l)
855855 let $acc0 = $Tuple2(0, nil)
856856 func $f0_1 ($a,$i) = if (($i >= $s))
857857 then $a
858858 else foldFunc($a, $l[$i])
859859
860860 func $f0_2 ($a,$i) = if (($i >= $s))
861861 then $a
862862 else throw("List size exceeds 10")
863863
864864 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
865865 }
866866 result._2
867867 }
868868
869869
870870 func _decrementBalanceByIndex (balances_,index_,amount_) = {
871871 func foldFunc (acc,elem) = {
872872 let index = acc._1
873- if ((index == index_))
874- then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
875- else $Tuple2((index + 1), (acc._2 :+ elem))
873+ if (if ((index == index_))
874+ then (amount_ > elem)
875+ else false)
876+ then throw("insufficient balance")
877+ else if (if ((index == index_))
878+ then (elem >= amount_)
879+ else false)
880+ then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
881+ else $Tuple2((index + 1), (acc._2 :+ elem))
876882 }
877883
878884 let result = {
879885 let $l = balances_
880886 let $s = size($l)
881887 let $acc0 = $Tuple2(0, nil)
882888 func $f0_1 ($a,$i) = if (($i >= $s))
883889 then $a
884890 else foldFunc($a, $l[$i])
885891
886892 func $f0_2 ($a,$i) = if (($i >= $s))
887893 then $a
888894 else throw("List size exceeds 10")
889895
890896 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
891897 }
892898 result._2
893899 }
894900
895901
896902 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
897903 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
898904 func foldFunc (acc,elem) = {
899905 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
900906 let deltaBalance = (elem - newBalance)
901- $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
907+ if ((0 > deltaBalance))
908+ then throw("insufficient delta balance")
909+ else $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
902910 }
903911
904912 let $l = balances_
905913 let $s = size($l)
906914 let $acc0 = $Tuple3(nil, 0, nil)
907915 func $f0_1 ($a,$i) = if (($i >= $s))
908916 then $a
909917 else foldFunc($a, $l[$i])
910918
911919 func $f0_2 ($a,$i) = if (($i >= $s))
912920 then $a
913921 else throw("List size exceeds 10")
914922
915923 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
916924 }
917925
918926
919927 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
920928 func foldFunc (acc,elem) = {
921929 let index = acc._1
922930 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
923931 }
924932
925933 let result = {
926934 let $l = assets_
927935 let $s = size($l)
928936 let $acc0 = $Tuple2(0, nil)
929937 func $f0_1 ($a,$i) = if (($i >= $s))
930938 then $a
931939 else foldFunc($a, $l[$i])
932940
933941 func $f0_2 ($a,$i) = if (($i >= $s))
934942 then $a
935943 else throw("List size exceeds 10")
936944
937945 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
938946 }
939947 result._2
940948 }
941949
942950
943951 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
944952 then {
945953 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
946954 if ((threshold > balance_))
947955 then {
948956 let maxDeviation = (threshold - balance_)
949957 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
950958 if ((feeRate > feeMaxRate_))
951959 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
952960 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
953961 }
954962 else 0
955963 }
956964 else {
957965 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
958966 if ((balance_ > threshold))
959967 then {
960968 let maxDeviation = (balance_ - threshold)
961969 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
962970 if ((feeRate > feeMaxRate_))
963971 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
964972 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
965973 }
966974 else 0
967975 }
968976
969977
970978 func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = 0
971979
972980
973981 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
974982 then true
975983 else (lpTotalSupply_ == 0))
976984 then true
977985 else {
978986 let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
979987 let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
980988 let diff = (newAssetsRate - prevAssetsRate)
981989 if (if ((0 >= diff))
982990 then ((-1 * _loadPrecision()) > diff)
983991 else false)
984992 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
985993 else true
986994 }
987995
988996
989997 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
990998 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
991999 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
9921000 let diff = (newUtil - prevUtil)
9931001 if (if ((0 >= diff))
9941002 then ((-1 * _loadPrecision()) > diff)
9951003 else false)
9961004 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
9971005 else true
9981006 }
9991007
10001008
10011009 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
10021010 let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
10031011 let maxAllocationAmp = if ((balance_ > equilibrium))
10041012 then (MAX_AMPLIFIER + maxAllocAmp_)
10051013 else (MAX_AMPLIFIER - maxAllocAmp_)
10061014 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
10071015 let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
10081016 if ((balance_ > equilibrium))
10091017 then if ((balance_ > maxAllocation))
10101018 then if ((prevMaxAllocation > prevBalance_))
10111019 then throw("_validateAssetAllocation: new up")
10121020 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
10131021 then throw("_validateAssetAllocation: still up")
10141022 else true
10151023 else true
10161024 else if ((maxAllocation > balance_))
10171025 then if ((prevBalance_ > prevMaxAllocation))
10181026 then throw("_validateAssetAllocation: new down")
10191027 else if (((maxAllocation - balance_) > (prevMaxAllocation - prevBalance_)))
10201028 then throw("_validateAssetAllocation: still down")
10211029 else true
10221030 else true
10231031 }
10241032
10251033
10261034 func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = true
10271035
10281036
10291037 func _checkpoint (user_) = {
10301038 let userLp = _loadUserLp(user_)
10311039 let userProfits = _loadUserProfits(user_)
10321040 let sigmaFeePerLp = _loadSigmaFeePerLp()
10331041 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10341042 func foldFunc (acc,elem) = {
10351043 let index = acc._1
10361044 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10371045 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10381046 }
10391047
1040- let $t02555825631 = {
1048+ let $t02577125844 = {
10411049 let $l = ZERO_INT_LIST_11
10421050 let $s = size($l)
10431051 let $acc0 = $Tuple2(0, nil)
10441052 func $f0_1 ($a,$i) = if (($i >= $s))
10451053 then $a
10461054 else foldFunc($a, $l[$i])
10471055
10481056 func $f0_2 ($a,$i) = if (($i >= $s))
10491057 then $a
10501058 else throw("List size exceeds 11")
10511059
10521060 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10531061 }
1054- let idx = $t02555825631._1
1055- let profitsUpdated = $t02555825631._2
1062+ let idx = $t02577125844._1
1063+ let profitsUpdated = $t02577125844._2
10561064 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10571065 }
10581066
10591067
10601068 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10611069 func foldFunc (acc,elem) = {
10621070 let index = acc._1
10631071 let sigmaFeePerLpUpdated = if ((index_ == index))
10641072 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10651073 else sigmaFeePerLp_[index]
10661074 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10671075 }
10681076
1069- let $t02628126360 = {
1077+ let $t02649426573 = {
10701078 let $l = ZERO_INT_LIST_11
10711079 let $s = size($l)
10721080 let $acc0 = $Tuple2(0, nil)
10731081 func $f0_1 ($a,$i) = if (($i >= $s))
10741082 then $a
10751083 else foldFunc($a, $l[$i])
10761084
10771085 func $f0_2 ($a,$i) = if (($i >= $s))
10781086 then $a
10791087 else throw("List size exceeds 11")
10801088
10811089 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10821090 }
1083- let idx = $t02628126360._1
1084- let sigmaFeePerLpUpdated = $t02628126360._2
1091+ let idx = $t02649426573._1
1092+ let sigmaFeePerLpUpdated = $t02649426573._2
10851093 sigmaFeePerLpUpdated
10861094 }
10871095
10881096
10891097 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10901098 let sigmaFeePerLp = _loadSigmaFeePerLp()
10911099 let totalLp = _loadTotalLp()
1092- let $t02658126856 = if ((totalLp == 0))
1100+ let $t02679427069 = if ((totalLp == 0))
10931101 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10941102 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1095- let lpFee = $t02658126856._1
1096- let protocolFee = $t02658126856._2
1103+ let lpFee = $t02679427069._1
1104+ let protocolFee = $t02679427069._2
10971105 let sigmaFeePerLpUpdated = if ((lpFee == 0))
10981106 then sigmaFeePerLp
10991107 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11001108 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11011109 }
11021110
11031111
11041112 func _depositAll (amount_) = {
11051113 let storage = _loadStorage()
11061114 let lpTotalSupply = storage._3
11071115 let weightAmplifier = storage._7
11081116 let slippageRate = storage._8
11091117 let feeMaxRate = storage._9
11101118 let assets = _loadAssets()
1111- let $t02736527418 = _loadAssetWeights()
1112- let assetWeights = $t02736527418._1
1113- let sigmaWeight = $t02736527418._2
1114- let $t02742327491 = _loadAssetBalances()
1115- let prevAssetBalances = $t02742327491._1
1116- let prevAssetTotalSupply = $t02742327491._2
1117- let $t02749728727 = if ((prevAssetTotalSupply == 0))
1119+ let $t02757827631 = _loadAssetWeights()
1120+ let assetWeights = $t02757827631._1
1121+ let sigmaWeight = $t02757827631._2
1122+ let $t02763627704 = _loadAssetBalances()
1123+ let prevAssetBalances = $t02763627704._1
1124+ let prevAssetTotalSupply = $t02763627704._2
1125+ let $t02771028940 = if ((prevAssetTotalSupply == 0))
11181126 then {
11191127 func foldFunc (acc,elem) = {
11201128 let index = acc._1
11211129 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11221130 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11231131 }
11241132
1125- let $t02793928013 = {
1133+ let $t02815228226 = {
11261134 let $l = assets
11271135 let $s = size($l)
11281136 let $acc0 = $Tuple2(0, nil)
11291137 func $f0_1 ($a,$i) = if (($i >= $s))
11301138 then $a
11311139 else foldFunc($a, $l[$i])
11321140
11331141 func $f0_2 ($a,$i) = if (($i >= $s))
11341142 then $a
11351143 else throw("List size exceeds 10")
11361144
11371145 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11381146 }
1139- let idx = $t02793928013._1
1140- let requiredAmountsNormalized = $t02793928013._2
1147+ let idx = $t02815228226._1
1148+ let requiredAmountsNormalized = $t02815228226._2
11411149 $Tuple2(amount_, requiredAmountsNormalized)
11421150 }
11431151 else {
11441152 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11451153 func foldFunc1 (acc,elem) = {
11461154 let index = acc._1
11471155 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11481156 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11491157 }
11501158
1151- let $t02855628631 = {
1159+ let $t02876928844 = {
11521160 let $l = assets
11531161 let $s = size($l)
11541162 let $acc0 = $Tuple2(0, nil)
11551163 func $f0_1 ($a,$i) = if (($i >= $s))
11561164 then $a
11571165 else foldFunc1($a, $l[$i])
11581166
11591167 func $f0_2 ($a,$i) = if (($i >= $s))
11601168 then $a
11611169 else throw("List size exceeds 10")
11621170
11631171 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11641172 }
1165- let idx = $t02855628631._1
1166- let requiredAmountsNormalized = $t02855628631._2
1173+ let idx = $t02876928844._1
1174+ let requiredAmountsNormalized = $t02876928844._2
11671175 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11681176 }
1169- let lpTokensToMint = $t02749728727._1
1170- let requiredAmountsNormalized = $t02749728727._2
1171- let $t02873328846 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1172- let assetBalances = $t02873328846._1
1173- let assetTotalSupply = $t02873328846._2
1177+ let lpTokensToMint = $t02771028940._1
1178+ let requiredAmountsNormalized = $t02771028940._2
1179+ let $t02894629059 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1180+ let assetBalances = $t02894629059._1
1181+ let assetTotalSupply = $t02894629059._2
11741182 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11751183 if ((err2 == err2))
11761184 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11771185 else throw("Strict value is not equal to itself.")
11781186 }
11791187
11801188
11811189 func _deposit (assetId_,amount_) = {
11821190 let storage = _loadStorage()
11831191 let lpTotalSupply = storage._3
11841192 let lpFeeRate = storage._4
11851193 let protocolFeeRate = storage._5
11861194 let maxAllocAmplifier = storage._6
11871195 let weightAmplifier = storage._7
11881196 let slippageRate = storage._8
11891197 let feeMaxRate = storage._9
11901198 let assets = _loadAssets()
1191- let $t02960929662 = _loadAssetWeights()
1192- let assetWeights = $t02960929662._1
1193- let sigmaWeight = $t02960929662._2
1194- let $t02966729781 = _loadAssetBalances()
1195- let prevAssetBalances = $t02966729781._1
1196- let prevAssetTotalSupply = $t02966729781._2
1199+ let $t02982229875 = _loadAssetWeights()
1200+ let assetWeights = $t02982229875._1
1201+ let sigmaWeight = $t02982229875._2
1202+ let $t02988029994 = _loadAssetBalances()
1203+ let prevAssetBalances = $t02988029994._1
1204+ let prevAssetTotalSupply = $t02988029994._2
11971205 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
11981206 let assetTotalSupply = (prevAssetTotalSupply + amount_)
11991207 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12001208 if ((err2 == err2))
12011209 then {
12021210 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12031211 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12041212 let lpTokensToMint = if ((lpTotalSupply == 0))
12051213 then throw("_deposit: empty pool")
12061214 else {
12071215 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12081216 let feeDiff = (fee - prevFee)
12091217 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12101218 let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
12111219 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12121220 if ((err3 == err3))
12131221 then lpTokensToMintInner
12141222 else throw("Strict value is not equal to itself.")
12151223 }
1216- let $t03144331574 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1217- let lpFee = $t03144331574._1
1218- let protocolFee = $t03144331574._2
1219- let sigmaFeePerLpUpdated = $t03144331574._3
1224+ let $t03165631787 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1225+ let lpFee = $t03165631787._1
1226+ let protocolFee = $t03165631787._2
1227+ let sigmaFeePerLpUpdated = $t03165631787._3
12201228 $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12211229 }
12221230 else throw("Strict value is not equal to itself.")
12231231 }
12241232
12251233
12261234 func _withdrawAll (amount_) = {
12271235 let storage = _loadStorage()
12281236 let lpTotalSupply = storage._3
12291237 let maxAllocAmplifier = storage._6
12301238 let weightAmplifier = storage._7
12311239 let slippageRate = storage._8
12321240 let feeMaxRate = storage._9
1233- let $t03190831976 = _loadAssetBalances()
1234- let prevAssetBalances = $t03190831976._1
1235- let prevAssetTotalSupply = $t03190831976._2
1236- let $t03198132034 = _loadAssetWeights()
1237- let assetWeights = $t03198132034._1
1238- let sigmaWeight = $t03198132034._2
1241+ let $t03212132189 = _loadAssetBalances()
1242+ let prevAssetBalances = $t03212132189._1
1243+ let prevAssetTotalSupply = $t03212132189._2
1244+ let $t03219432247 = _loadAssetWeights()
1245+ let assetWeights = $t03219432247._1
1246+ let sigmaWeight = $t03219432247._2
12391247 let lpTokensToBurn = amount_
12401248 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12411249 if ((err == err))
12421250 then {
1243- let $t03217632309 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1244- let assetBalances = $t03217632309._1
1245- let assetTotalSupply = $t03217632309._2
1246- let balancesToPay = $t03217632309._3
1251+ let $t03238932522 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1252+ let assetBalances = $t03238932522._1
1253+ let assetTotalSupply = $t03238932522._2
1254+ let balancesToPay = $t03238932522._3
12471255 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12481256 if ((err2 == err2))
12491257 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12501258 else throw("Strict value is not equal to itself.")
12511259 }
12521260 else throw("Strict value is not equal to itself.")
12531261 }
12541262
12551263
12561264 func _withdraw (assetId_,lpAmount_) = {
12571265 let storage = _loadStorage()
12581266 let lpTotalSupply = storage._3
12591267 let lpFeeRate = storage._4
12601268 let protocolFeeRate = storage._5
12611269 let maxAllocAmplifier = storage._6
12621270 let weightAmplifier = storage._7
12631271 let slippageRate = storage._8
12641272 let feeMaxRate = storage._9
12651273 let precision = _loadPrecision()
12661274 let assets = _loadAssets()
1267- let $t03310133169 = _loadAssetBalances()
1268- let prevAssetBalances = $t03310133169._1
1269- let prevAssetTotalSupply = $t03310133169._2
1270- let $t03317433227 = _loadAssetWeights()
1271- let assetWeights = $t03317433227._1
1272- let sigmaWeight = $t03317433227._2
1275+ let $t03331433382 = _loadAssetBalances()
1276+ let prevAssetBalances = $t03331433382._1
1277+ let prevAssetTotalSupply = $t03331433382._2
1278+ let $t03338733440 = _loadAssetWeights()
1279+ let assetWeights = $t03338733440._1
1280+ let sigmaWeight = $t03338733440._2
12731281 let targetAssetIndex = value(indexOf(assets, assetId_))
12741282 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12751283 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12761284 let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
12771285 let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
12781286 let prevUtilValueDivLp = fraction(toBigInt(prevUtilValue), PERCENT_FACTOR, toBigInt(lpTotalSupply), CEILING)
12791287 func foldFunc (acc,elem) = if (acc._1)
12801288 then acc
12811289 else {
12821290 let startInner = acc._2
12831291 let stopInner = acc._3
12841292 let currentAmount = ((stopInner + startInner) / 2)
12851293 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
12861294 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
12871295 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
12881296 if (if (((utilValue - prevUtilValueWithK) > (-1 * precision)))
12891297 then (precision > (utilValue - prevUtilValueWithK))
12901298 else false)
12911299 then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
12921300 else if ((0 > (utilValue - prevUtilValueWithK)))
12931301 then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValueWithK))
12941302 else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
12951303 }
12961304
12971305 let targetAmount = {
12981306 let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1299- let $t03509335205 = {
1307+ let $t03530635418 = {
13001308 let $l = LIST_64
13011309 let $s = size($l)
13021310 let $acc0 = $Tuple5(false, 0, stop, 0, 0)
13031311 func $f0_1 ($a,$i) = if (($i >= $s))
13041312 then $a
13051313 else foldFunc($a, $l[$i])
13061314
13071315 func $f0_2 ($a,$i) = if (($i >= $s))
13081316 then $a
13091317 else throw("List size exceeds 64")
13101318
13111319 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
13121320 }
1313- let success = $t03509335205._1
1314- let startOut = $t03509335205._2
1315- let stopOut = $t03509335205._3
1316- let targetAmountOut = $t03509335205._4
1317- let diffOut = $t03509335205._5
1321+ let success = $t03530635418._1
1322+ let startOut = $t03530635418._2
1323+ let stopOut = $t03530635418._3
1324+ let targetAmountOut = $t03530635418._4
1325+ let diffOut = $t03530635418._5
13181326 if (!(success))
13191327 then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
13201328 else targetAmountOut
13211329 }
13221330 let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13231331 let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
13241332 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
13251333 then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13261334 else false
13271335 if ((err1 == err1))
13281336 then {
1329- let $t03619736345 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1330- let lpFee = $t03619736345._1
1331- let protocolFee = $t03619736345._2
1332- let sigmaFeePerLpUpdated = $t03619736345._3
1337+ let $t03641036558 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1338+ let lpFee = $t03641036558._1
1339+ let protocolFee = $t03641036558._2
1340+ let sigmaFeePerLpUpdated = $t03641036558._3
13331341 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13341342 }
13351343 else throw("Strict value is not equal to itself.")
13361344 }
13371345
13381346
13391347 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13401348 let storage = _loadStorage()
13411349 let lpAssetId = storage._1
13421350 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13431351 let lpTotalSupply = storage._3
13441352 let lpFeeRate = storage._4
13451353 let protocolFeeRate = storage._5
13461354 let maxAllocAmplifier = storage._6
13471355 let weightAmplifier = storage._7
13481356 let slippageRate = storage._8
13491357 let feeMaxRate = storage._9
13501358 let precision = _loadPrecision()
1351- let $t03692736995 = _loadAssetBalances()
1352- let prevAssetBalances = $t03692736995._1
1353- let prevAssetTotalSupply = $t03692736995._2
1354- let $t03700037053 = _loadAssetWeights()
1355- let assetWeights = $t03700037053._1
1356- let sigmaWeight = $t03700037053._2
1359+ let $t03714037208 = _loadAssetBalances()
1360+ let prevAssetBalances = $t03714037208._1
1361+ let prevAssetTotalSupply = $t03714037208._2
1362+ let $t03721337266 = _loadAssetWeights()
1363+ let assetWeights = $t03721337266._1
1364+ let sigmaWeight = $t03721337266._2
13571365 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13581366 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13591367 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13601368 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13611369 func foldFunc (acc,elem) = if (acc._1)
13621370 then acc
13631371 else {
13641372 let startInner = acc._2
13651373 let stopInner = acc._3
13661374 let currentAmount = ((stopInner + startInner) / 2)
13671375 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
13681376 let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
13691377 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
13701378 if (if (((utilValue - prevUtilValue) > (-1 * precision)))
13711379 then (precision > (utilValue - prevUtilValue))
13721380 else false)
13731381 then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValue))
13741382 else if ((0 > (utilValue - prevUtilValue)))
13751383 then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValue))
13761384 else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValue))
13771385 }
13781386
13791387 let targetAmount = {
13801388 let targetAmount = sourceAmount_
13811389 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
13821390 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
13831391 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13841392 let feeDiff = (fee - prevFee)
13851393 if ((feeDiff == 0))
13861394 then targetAmount
13871395 else {
1388- let $t03902639157 = {
1396+ let $t03923939370 = {
13891397 let $l = LIST_64
13901398 let $s = size($l)
13911399 let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
13921400 func $f0_1 ($a,$i) = if (($i >= $s))
13931401 then $a
13941402 else foldFunc($a, $l[$i])
13951403
13961404 func $f0_2 ($a,$i) = if (($i >= $s))
13971405 then $a
13981406 else throw("List size exceeds 64")
13991407
14001408 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
14011409 }
1402- let success = $t03902639157._1
1403- let startOut = $t03902639157._2
1404- let stopOut = $t03902639157._3
1405- let targetAmountOut = $t03902639157._4
1406- let diffOut = $t03902639157._5
1410+ let success = $t03923939370._1
1411+ let startOut = $t03923939370._2
1412+ let stopOut = $t03923939370._3
1413+ let targetAmountOut = $t03923939370._4
1414+ let diffOut = $t03923939370._5
14071415 if (!(success))
14081416 then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
14091417 else targetAmountOut
14101418 }
14111419 }
14121420 let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
14131421 let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
14141422 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
14151423 then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14161424 else false
14171425 if ((err1 == err1))
14181426 then {
1419- let $t04000440145 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1420- let lpFee = $t04000440145._1
1421- let protocolFee = $t04000440145._2
1422- let sigmaFeePerLpUpdated = $t04000440145._3
1427+ let $t04021740358 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1428+ let lpFee = $t04021740358._1
1429+ let protocolFee = $t04021740358._2
1430+ let sigmaFeePerLpUpdated = $t04021740358._3
14231431 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14241432 }
14251433 else throw("Strict value is not equal to itself.")
14261434 }
14271435
14281436
14291437 @Callable(i)
14301438 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
14311439 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14321440 then _whenNotInitialized()
14331441 else false)
14341442 then _whenMultisigSet()
14351443 else false)
14361444 then _validateAssets(assets_, "init: invalid assets")
14371445 else false)
14381446 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
14391447 else false)
14401448 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
14411449 else false)
14421450 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
14431451 else false)
14441452 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
14451453 else false)
14461454 then _validateTokenName(lpTokenName_, "init: invalid name")
14471455 else false)
14481456 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
14491457 else false)
14501458 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14511459 else false)
14521460 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
14531461 else false)
14541462 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14551463 else false)
14561464 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
14571465 else false)
14581466 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14591467 else false)
14601468 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14611469 else false)
14621470 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
14631471 else false)
14641472 then _validateAddress(pauser_, "init: invalid pauser")
14651473 else false
14661474 if ((err == err))
14671475 then {
1468- let $t04200842077 = _prepareAssetWeights(assetWeights_)
1469- let assetWeights = $t04200842077._1
1470- let sigmaWeight = $t04200842077._2
1476+ let $t04222142290 = _prepareAssetWeights(assetWeights_)
1477+ let assetWeights = $t04222142290._1
1478+ let sigmaWeight = $t04222142290._2
14711479 let assetBalances = _prepareAssetBalances(assets_)
14721480 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14731481 let lpAssetId = calculateAssetId(issue)
14741482 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
14751483 $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14761484 }
14771485 else throw("Strict value is not equal to itself.")
14781486 }
14791487
14801488
14811489
14821490 @Callable(i)
14831491 func depositAll (amount_) = {
14841492 let err = if (if (_whenInitialized())
14851493 then _whenNotPaused()
14861494 else false)
14871495 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14881496 else false
14891497 if ((err == err))
14901498 then {
14911499 let storage = _loadStorage()
14921500 let lpAssetId = storage._1
14931501 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14941502 let assets = _loadAssets()
1495- let $t04382743912 = _depositAll(amount_)
1496- let lpTokensToMint = $t04382743912._1
1497- let requiredAmountsNormalized = $t04382743912._2
1498- let assetBalances = $t04382743912._3
1503+ let $t04404044125 = _depositAll(amount_)
1504+ let lpTokensToMint = $t04404044125._1
1505+ let requiredAmountsNormalized = $t04404044125._2
1506+ let assetBalances = $t04404044125._3
14991507 func foldFunc (acc,elem) = {
15001508 let index = acc._1
15011509 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15021510 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15031511 let requiredAmountNormalized = requiredAmountsNormalized[index]
15041512 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
15051513 let err1 = if ((paymentAssetStr != elem))
15061514 then throw(("depositAll: invalid payment: index=" + toString(index)))
15071515 else if ((0 >= requiredAmount))
15081516 then throw("depositAll: too little amount required")
15091517 else unit
15101518 if ((err1 == err1))
15111519 then {
15121520 let change = if ((i.payments[index].amount > requiredAmount))
15131521 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
15141522 else if ((requiredAmount > i.payments[index].amount))
15151523 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
15161524 else nil
15171525 $Tuple2((index + 1), (acc._2 ++ change))
15181526 }
15191527 else throw("Strict value is not equal to itself.")
15201528 }
15211529
1522- let $t04505545117 = {
1530+ let $t04526845330 = {
15231531 let $l = assets
15241532 let $s = size($l)
15251533 let $acc0 = $Tuple2(0, nil)
15261534 func $f0_1 ($a,$i) = if (($i >= $s))
15271535 then $a
15281536 else foldFunc($a, $l[$i])
15291537
15301538 func $f0_2 ($a,$i) = if (($i >= $s))
15311539 then $a
15321540 else throw("List size exceeds 10")
15331541
15341542 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
15351543 }
1536- let idx = $t04505545117._1
1537- let changeActions = $t04505545117._2
1544+ let idx = $t04526845330._1
1545+ let changeActions = $t04526845330._2
15381546 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15391547 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15401548 }
15411549 else throw("Strict value is not equal to itself.")
15421550 }
15431551
15441552
15451553
15461554 @Callable(i)
15471555 func deposit (minLpAmount_) = {
15481556 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
15491557 if ((err == err))
15501558 then {
15511559 let storage = _loadStorage()
15521560 let lpAssetId = storage._1
15531561 let lpAssetIdStr = _assetToStr(lpAssetId)
15541562 let lpDecimals = _getDecimals(lpAssetIdStr)
15551563 let err1 = if (if (if (if (if (_whenInitialized())
15561564 then _whenNotPaused()
15571565 else false)
15581566 then _checkWatchdog()
15591567 else false)
15601568 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15611569 else false)
15621570 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15631571 else false)
15641572 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
15651573 else false
15661574 if ((err1 == err1))
15671575 then {
15681576 let assetStr = _assetToStr(i.payments[0].assetId)
15691577 let assetDecimals = _getDecimals(assetStr)
15701578 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1571- let $t04655746673 = _deposit(assetStr, amountNormalized)
1572- let lpTokensToMint = $t04655746673._1
1573- let assetBalances = $t04655746673._2
1574- let lpFee = $t04655746673._3
1575- let protocolFee = $t04655746673._4
1576- let sigmaFeePerLpUpdated = $t04655746673._5
1579+ let $t04677046886 = _deposit(assetStr, amountNormalized)
1580+ let lpTokensToMint = $t04677046886._1
1581+ let assetBalances = $t04677046886._2
1582+ let lpFee = $t04677046886._3
1583+ let protocolFee = $t04677046886._4
1584+ let sigmaFeePerLpUpdated = $t04677046886._5
15771585 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15781586 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15791587 if ((err2 == err2))
15801588 then {
15811589 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15821590 $Tuple2(((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15831591 }
15841592 else throw("Strict value is not equal to itself.")
15851593 }
15861594 else throw("Strict value is not equal to itself.")
15871595 }
15881596 else throw("Strict value is not equal to itself.")
15891597 }
15901598
15911599
15921600
15931601 @Callable(i)
15941602 func withdrawAll () = {
15951603 let storage = _loadStorage()
15961604 let lpAssetId = storage._1
15971605 let lpAssetIdStr = toBase58String(lpAssetId)
15981606 let lpDecimals = _getDecimals(lpAssetIdStr)
15991607 let assets = _loadAssets()
16001608 let err = if (if (if (_whenInitialized())
16011609 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
16021610 else false)
16031611 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
16041612 else false)
16051613 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
16061614 else false
16071615 if ((err == err))
16081616 then {
1609- let $t04813448221 = _withdrawAll(i.payments[0].amount)
1610- let lpTokensToBurn = $t04813448221._1
1611- let balancesToPay = $t04813448221._2
1612- let assetBalances = $t04813448221._3
1617+ let $t04834748434 = _withdrawAll(i.payments[0].amount)
1618+ let lpTokensToBurn = $t04834748434._1
1619+ let balancesToPay = $t04834748434._2
1620+ let assetBalances = $t04834748434._3
16131621 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16141622 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16151623 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16161624 }
16171625 else throw("Strict value is not equal to itself.")
16181626 }
16191627
16201628
16211629
16221630 @Callable(i)
16231631 func withdraw (assetId_,minAmount_) = {
16241632 let storage = _loadStorage()
16251633 let lpAssetId = storage._1
16261634 let lpAssetIdStr = toBase58String(lpAssetId)
16271635 let lpDecimals = _getDecimals(lpAssetIdStr)
16281636 let assets = _loadAssets()
16291637 let err = if (if (if (if (if (if (if (_whenInitialized())
16301638 then _whenNotPaused()
16311639 else false)
16321640 then _checkWatchdog()
16331641 else false)
16341642 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16351643 else false)
16361644 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
16371645 else false)
16381646 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
16391647 else false)
16401648 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
16411649 else false)
16421650 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
16431651 else false
16441652 if ((err == err))
16451653 then {
1646- let $t04957549709 = _withdraw(assetId_, i.payments[0].amount)
1647- let targetAmountNormalized = $t04957549709._1
1648- let finalAssetBalances = $t04957549709._2
1649- let lpFee = $t04957549709._3
1650- let protocolFee = $t04957549709._4
1651- let sigmaFeePerLpUpdated = $t04957549709._5
1654+ let $t04978849922 = _withdraw(assetId_, i.payments[0].amount)
1655+ let targetAmountNormalized = $t04978849922._1
1656+ let finalAssetBalances = $t04978849922._2
1657+ let lpFee = $t04978849922._3
1658+ let protocolFee = $t04978849922._4
1659+ let sigmaFeePerLpUpdated = $t04978849922._5
16521660 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16531661 let targetDecimals = _getDecimals(assetId_)
16541662 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16551663 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: less than min")
16561664 if ((err1 == err1))
16571665 then {
16581666 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - i.payments[0].amount), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16591667 $Tuple2(((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16601668 }
16611669 else throw("Strict value is not equal to itself.")
16621670 }
16631671 else throw("Strict value is not equal to itself.")
16641672 }
16651673
16661674
16671675
16681676 @Callable(i)
16691677 func swap (targetAssetId_,minAmount_) = {
16701678 let storage = _loadStorage()
16711679 let lpAssetId = storage._1
16721680 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16731681 let assets = _loadAssets()
16741682 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16751683 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16761684 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16771685 if ((sourceAssetIndex == sourceAssetIndex))
16781686 then {
16791687 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16801688 if ((targetAssetIndex == targetAssetIndex))
16811689 then {
16821690 let err = if (if (if (if (if (if (_whenInitialized())
16831691 then _whenNotPaused()
16841692 else false)
16851693 then _checkWatchdog()
16861694 else false)
16871695 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16881696 else false)
16891697 then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
16901698 else false)
16911699 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16921700 else false)
16931701 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
16941702 else false
16951703 if ((err == err))
16961704 then {
1697- let $t05182251980 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1698- let targetAmountNormalized = $t05182251980._1
1699- let finalAssetBalances = $t05182251980._2
1700- let lpFee = $t05182251980._3
1701- let protocolFee = $t05182251980._4
1702- let sigmaFeePerLpUpdated = $t05182251980._5
1705+ let $t05203552193 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1706+ let targetAmountNormalized = $t05203552193._1
1707+ let finalAssetBalances = $t05203552193._2
1708+ let lpFee = $t05203552193._3
1709+ let protocolFee = $t05203552193._4
1710+ let sigmaFeePerLpUpdated = $t05203552193._5
17031711 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17041712 let targetDecimals = _getDecimals(targetAssetId_)
17051713 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17061714 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
17071715 if ((err1 == err1))
17081716 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
17091717 else throw("Strict value is not equal to itself.")
17101718 }
17111719 else throw("Strict value is not equal to itself.")
17121720 }
17131721 else throw("Strict value is not equal to itself.")
17141722 }
17151723 else throw("Strict value is not equal to itself.")
17161724 }
17171725
17181726
17191727
17201728 @Callable(i)
17211729 func getDepositAll (lpAmount_) = {
17221730 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17231731 if ((err == err))
17241732 then {
1725- let $t05310053187 = _depositAll(lpAmount_)
1726- let lpTokensToMint = $t05310053187._1
1727- let requiredAmountsNormalized = $t05310053187._2
1728- let assetBalances = $t05310053187._3
1733+ let $t05331353400 = _depositAll(lpAmount_)
1734+ let lpTokensToMint = $t05331353400._1
1735+ let requiredAmountsNormalized = $t05331353400._2
1736+ let assetBalances = $t05331353400._3
17291737 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17301738 }
17311739 else throw("Strict value is not equal to itself.")
17321740 }
17331741
17341742
17351743
17361744 @Callable(i)
17371745 func getDeposit (assetId_,amount_) = {
17381746 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
17391747 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
17401748 else false
17411749 if ((err == err))
17421750 then {
17431751 let storage = _loadStorage()
17441752 let lpAssetId = storage._1
17451753 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17461754 let assetDecimals = _getDecimals(assetId_)
17471755 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1748- let $t05394654062 = _deposit(assetId_, amountNormalized)
1749- let lpTokensToMint = $t05394654062._1
1750- let assetBalances = $t05394654062._2
1751- let lpFee = $t05394654062._3
1752- let protocolFee = $t05394654062._4
1753- let sigmaFeePerLpUpdated = $t05394654062._5
1756+ let $t05415954275 = _deposit(assetId_, amountNormalized)
1757+ let lpTokensToMint = $t05415954275._1
1758+ let assetBalances = $t05415954275._2
1759+ let lpFee = $t05415954275._3
1760+ let protocolFee = $t05415954275._4
1761+ let sigmaFeePerLpUpdated = $t05415954275._5
17541762 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17551763 $Tuple2(nil, lpTokensToSend)
17561764 }
17571765 else throw("Strict value is not equal to itself.")
17581766 }
17591767
17601768
17611769
17621770 @Callable(i)
17631771 func getWithdrawAll (lpAmount_) = {
17641772 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17651773 if ((err == err))
17661774 then {
1767- let $t05450154577 = _withdrawAll(lpAmount_)
1768- let lpTokensToBurn = $t05450154577._1
1769- let balancesToGet = $t05450154577._2
1770- let assetBalances = $t05450154577._3
1775+ let $t05471454790 = _withdrawAll(lpAmount_)
1776+ let lpTokensToBurn = $t05471454790._1
1777+ let balancesToGet = $t05471454790._2
1778+ let assetBalances = $t05471454790._3
17711779 $Tuple2(nil, balancesToGet)
17721780 }
17731781 else throw("Strict value is not equal to itself.")
17741782 }
17751783
17761784
17771785
17781786 @Callable(i)
17791787 func getWithdraw (assetId_,amount_) = {
17801788 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17811789 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
17821790 else false
17831791 if ((err == err))
17841792 then {
17851793 let storage = _loadStorage()
17861794 let lpAssetId = storage._1
17871795 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1788- let $t05522855344 = _withdraw(assetId_, amount_)
1789- let targetAmountNormalized = $t05522855344._1
1790- let assetBalances = $t05522855344._2
1791- let lpFee = $t05522855344._3
1792- let protocolFee = $t05522855344._4
1793- let sigmaFeePerLpUpdated = $t05522855344._5
1796+ let $t05544155557 = _withdraw(assetId_, amount_)
1797+ let targetAmountNormalized = $t05544155557._1
1798+ let assetBalances = $t05544155557._2
1799+ let lpFee = $t05544155557._3
1800+ let protocolFee = $t05544155557._4
1801+ let sigmaFeePerLpUpdated = $t05544155557._5
17941802 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17951803 let targetDecimals = _getDecimals(assetId_)
17961804 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17971805 $Tuple2(nil, finalAmount)
17981806 }
17991807 else throw("Strict value is not equal to itself.")
18001808 }
18011809
18021810
18031811
18041812 @Callable(i)
18051813 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
18061814 let storage = _loadStorage()
18071815 let lpAssetId = storage._1
18081816 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
18091817 let assets = _loadAssets()
18101818 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
18111819 if ((sourceAssetIndex == sourceAssetIndex))
18121820 then {
18131821 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
18141822 if ((targetAssetIndex == targetAssetIndex))
18151823 then {
18161824 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
18171825 let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
18181826 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18191827 else false
18201828 if ((err == err))
18211829 then {
1822- let $t05675456912 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1823- let targetAmountNormalized = $t05675456912._1
1824- let finalAssetBalances = $t05675456912._2
1825- let lpFee = $t05675456912._3
1826- let protocolFee = $t05675456912._4
1827- let sigmaFeePerLpUpdated = $t05675456912._5
1830+ let $t05696757125 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1831+ let targetAmountNormalized = $t05696757125._1
1832+ let finalAssetBalances = $t05696757125._2
1833+ let lpFee = $t05696757125._3
1834+ let protocolFee = $t05696757125._4
1835+ let sigmaFeePerLpUpdated = $t05696757125._5
18281836 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18291837 let targetDecimals = _getDecimals(targetAssetId_)
18301838 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18311839 $Tuple2(nil, finalAmount)
18321840 }
18331841 else throw("Strict value is not equal to itself.")
18341842 }
18351843 else throw("Strict value is not equal to itself.")
18361844 }
18371845 else throw("Strict value is not equal to itself.")
18381846 }
18391847
18401848
18411849
18421850 @Callable(i)
18431851 func getClaim (user_) = {
18441852 let user = if ((size(user_) > 0))
18451853 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18461854 else i.caller
1847- let $t05755457610 = _checkpoint(user)
1848- let checkpointActions = $t05755457610._1
1849- let userProfits = $t05755457610._2
1855+ let $t05776757823 = _checkpoint(user)
1856+ let checkpointActions = $t05776757823._1
1857+ let userProfits = $t05776757823._2
18501858 $Tuple2(nil, userProfits)
18511859 }
18521860
18531861
18541862
18551863 @Callable(i)
18561864 func getUtilFunc () = {
18571865 let storage = _loadStorage()
18581866 let lpTotalSupply = storage._3
18591867 let weightAmplifier = storage._7
18601868 let slippageRate = storage._8
18611869 let feeMaxRate = storage._9
1862- let $t05794358003 = _loadAssetBalances()
1863- let assetBalances = $t05794358003._1
1864- let assetTotalSupply = $t05794358003._2
1865- let $t05800858061 = _loadAssetWeights()
1866- let assetWeights = $t05800858061._1
1867- let sigmaWeight = $t05800858061._2
1870+ let $t05815658216 = _loadAssetBalances()
1871+ let assetBalances = $t05815658216._1
1872+ let assetTotalSupply = $t05815658216._2
1873+ let $t05822158274 = _loadAssetWeights()
1874+ let assetWeights = $t05822158274._1
1875+ let sigmaWeight = $t05822158274._2
18681876 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18691877 let utilValue = (assetTotalSupply - fee)
18701878 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18711879 }
18721880
18731881
18741882
18751883 @Callable(i)
18761884 func getFeeFunc () = {
18771885 let storage = _loadStorage()
18781886 let weightAmplifier = storage._7
18791887 let slippageRate = storage._8
18801888 let feeMaxRate = storage._9
1881- let $t05849358553 = _loadAssetBalances()
1882- let assetBalances = $t05849358553._1
1883- let assetTotalSupply = $t05849358553._2
1884- let $t05855858611 = _loadAssetWeights()
1885- let assetWeights = $t05855858611._1
1886- let sigmaWeight = $t05855858611._2
1889+ let $t05870658766 = _loadAssetBalances()
1890+ let assetBalances = $t05870658766._1
1891+ let assetTotalSupply = $t05870658766._2
1892+ let $t05877158824 = _loadAssetWeights()
1893+ let assetWeights = $t05877158824._1
1894+ let sigmaWeight = $t05877158824._2
18871895 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18881896 $Tuple2(nil, fee)
18891897 }
18901898
18911899
18921900
18931901 @Callable(i)
18941902 func checkpoint (user_) = {
18951903 let err = if (_whenInitialized())
18961904 then _whenNotPaused()
18971905 else false
18981906 if ((err == err))
18991907 then {
19001908 let user = if ((size(user_) > 0))
19011909 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
19021910 else i.caller
19031911 _checkpoint(user)
19041912 }
19051913 else throw("Strict value is not equal to itself.")
19061914 }
19071915
19081916
19091917
19101918 @Callable(i)
19111919 func stake () = {
19121920 let err = if (_whenInitialized())
19131921 then _whenNotPaused()
19141922 else false
19151923 if ((err == err))
19161924 then {
19171925 let storage = _loadStorage()
19181926 let lpAssetIdStr = _assetToStr(storage._1)
19191927 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
19201928 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
19211929 else false)
19221930 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
19231931 else false
19241932 if ((err1 == err1))
19251933 then {
1926- let $t05961959679 = _checkpoint(i.caller)
1927- let checkpointActions = $t05961959679._1
1928- let userProfits = $t05961959679._2
1934+ let $t05983259892 = _checkpoint(i.caller)
1935+ let checkpointActions = $t05983259892._1
1936+ let userProfits = $t05983259892._2
19291937 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19301938 }
19311939 else throw("Strict value is not equal to itself.")
19321940 }
19331941 else throw("Strict value is not equal to itself.")
19341942 }
19351943
19361944
19371945
19381946 @Callable(i)
19391947 func unstake (amount_) = {
19401948 let err = if (_whenInitialized())
19411949 then _whenNotPaused()
19421950 else false
19431951 if ((err == err))
19441952 then {
19451953 let storage = _loadStorage()
19461954 let lpAssetId = storage._1
19471955 let userLp = _loadUserLp(i.caller)
19481956 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19491957 if ((err1 == err1))
19501958 then {
1951- let $t06019060250 = _checkpoint(i.caller)
1952- let checkpointActions = $t06019060250._1
1953- let userProfits = $t06019060250._2
1959+ let $t06040360463 = _checkpoint(i.caller)
1960+ let checkpointActions = $t06040360463._1
1961+ let userProfits = $t06040360463._2
19541962 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19551963 }
19561964 else throw("Strict value is not equal to itself.")
19571965 }
19581966 else throw("Strict value is not equal to itself.")
19591967 }
19601968
19611969
19621970
19631971 @Callable(i)
19641972 func claim (user_) = {
19651973 let err = if (_whenInitialized())
19661974 then _whenNotPaused()
19671975 else false
19681976 if ((err == err))
19691977 then {
19701978 let user = if ((size(user_) > 0))
19711979 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
19721980 else i.caller
19731981 let storage = _loadStorage()
19741982 let lpAssetId = storage._1
19751983 let lpAssetIdStr = _assetToStr(lpAssetId)
19761984 let assets = [lpAssetIdStr, _loadAssets()]
19771985 let maxIndex = (size(assets) - 1)
19781986 let userLp = _loadUserLp(user)
1979- let $t06097361029 = _checkpoint(user)
1980- let checkpointActions = $t06097361029._1
1981- let userProfits = $t06097361029._2
1987+ let $t06118661242 = _checkpoint(user)
1988+ let checkpointActions = $t06118661242._1
1989+ let userProfits = $t06118661242._2
19821990 func foldFunc (acc,profit) = {
19831991 let index = acc._1
19841992 if (if ((maxIndex >= index))
19851993 then (profit > 0)
19861994 else false)
19871995 then {
19881996 let asset = assets[index]
19891997 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
19901998 }
19911999 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19922000 }
19932001
1994- let $t06140761498 = {
2002+ let $t06162061711 = {
19952003 let $l = userProfits
19962004 let $s = size($l)
19972005 let $acc0 = $Tuple3(0, nil, nil)
19982006 func $f0_1 ($a,$i) = if (($i >= $s))
19992007 then $a
20002008 else foldFunc($a, $l[$i])
20012009
20022010 func $f0_2 ($a,$i) = if (($i >= $s))
20032011 then $a
20042012 else throw("List size exceeds 11")
20052013
20062014 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
20072015 }
2008- let idx = $t06140761498._1
2009- let userProfitsUpdated = $t06140761498._2
2010- let profitActions = $t06140761498._3
2016+ let idx = $t06162061711._1
2017+ let userProfitsUpdated = $t06162061711._2
2018+ let profitActions = $t06162061711._3
20112019 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
20122020 }
20132021 else throw("Strict value is not equal to itself.")
20142022 }
20152023
20162024
20172025
20182026 @Callable(i)
20192027 func pause () = {
20202028 let err = if (if (_onlyPauser(i.caller))
20212029 then _whenInitialized()
20222030 else false)
20232031 then _whenNotPaused()
20242032 else false
20252033 if ((err == err))
20262034 then $Tuple2(_savePause(true), unit)
20272035 else throw("Strict value is not equal to itself.")
20282036 }
20292037
20302038
20312039
20322040 @Callable(i)
20332041 func unpause () = {
20342042 let err = if (if (_onlyThisContract(i.caller))
20352043 then _whenInitialized()
20362044 else false)
20372045 then _whenPaused()
20382046 else false
20392047 if ((err == err))
20402048 then $Tuple2(_savePause(false), unit)
20412049 else throw("Strict value is not equal to itself.")
20422050 }
20432051
20442052
20452053
20462054 @Callable(i)
20472055 func updatePauser (pauser_) = {
20482056 let err = if (if (_onlyThisContract(i.caller))
20492057 then _whenInitialized()
20502058 else false)
20512059 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20522060 else false
20532061 if ((err == err))
20542062 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
20552063 else throw("Strict value is not equal to itself.")
20562064 }
20572065
20582066
20592067
20602068 @Callable(i)
20612069 func updateWatchdog (watchdog_,offset_) = {
20622070 let err = if (if (if (_onlyThisContract(i.caller))
20632071 then _whenInitialized()
20642072 else false)
20652073 then _validateAddress(watchdog_, "updateWatchdog: invalid watchdog")
20662074 else false)
20672075 then _validateInt(offset_, 0, MAX_INT, "updateWatchdog: invalid offset")
20682076 else false
20692077 if ((err == err))
20702078 then $Tuple2((_saveWatchdog(addressFromStringValue(watchdog_)) ++ _saveWatchdogOffset(offset_)), unit)
20712079 else throw("Strict value is not equal to itself.")
20722080 }
20732081
20742082
20752083
20762084 @Callable(i)
20772085 func setMultisig (multisig_) = {
20782086 let err = if (_onlyThisContract(i.caller))
20792087 then _validateAddress(multisig_, "setMultisig: invalid multisig")
20802088 else false
20812089 if ((err == err))
20822090 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
20832091 else throw("Strict value is not equal to itself.")
20842092 }
20852093
20862094
20872095 @Verifier(tx)
20882096 func verify () = match getString(KEY_MULTISIG) {
20892097 case multisig: String =>
20902098 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
20912099 case _ =>
20922100 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
20932101 }
20942102

github/deemru/w8io/873ac7e 
341.23 ms