tx · H6AeCvESMQok6P1maJaRLvKVKRZasoYnB1wMXrwLVvPv

3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk:  -0.06100000 Waves

2023.08.09 18:34 [3768854] smart account 3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk > SELF 0.00000000 Waves

{ "type": 13, "id": "H6AeCvESMQok6P1maJaRLvKVKRZasoYnB1wMXrwLVvPv", "fee": 6100000, "feeAssetId": null, "timestamp": 1691595271292, "version": 2, "chainId": 87, "sender": "3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk", "senderPublicKey": "DGuDyEBiewoZje46attYBabwJWnk7PPwtLi6yBjzctPV", "proofs": [ "4RXkguWSb6rVLyRg36u3ZA4jZTXXeAYM5n2PaAy2kDkPdDAHTsLN8Vy4EGyih2KFcPEkH9qGfzyJrYKKFzkKveNF" ], "script": "base64:BgJvCAISEAoOGBgBAQgIAQEBAQEIAQgSAwoBARIDCgEBEgASBAoCCAESBAoCCAESAwoBARIECgIIARIDCgEBEgQKAggBEgUKAwgIARIDCgEIEgASAwoBCBIAEgMKAQESAwoBCBIAEgASAwoBCBIDCgEIdQADU0VQAgJfXwAFV0FWRVMCBXdhdmVzAAdNQVhfSU5UAP//////////fwAHTUFYX0ZFRQDAhD0ADU1BWF9BTVBMSUZJRVIJALYCAQDAhD0AFE1BWF9XRUlHSFRfQU1QTElGSUVSCQC2AgEAwIQ9AApNQVhfV0VJR0hUAMCEPQAUU0xJUFBBR0VfUkFURV9GQUNUT1IJALYCAQDAhD0AD0ZFRV9SQVRFX0ZBQ1RPUgkAtgIBAMCEPQALUkFURV9GQUNUT1IJALYCAQDAhD0ADlBFUkNFTlRfRkFDVE9SCQC2AgEAgICQu7rWrfANABBaRVJPX0lOVF9MSVNUXzEwCQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAUDbmlsABBaRVJPX0lOVF9MSVNUXzExCQDNCAIFEFpFUk9fSU5UX0xJU1RfMTAAAAALWkVST19CSUdJTlQJALYCAQAAABNaRVJPX0JJR0lOVF9MSVNUXzEwCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UBQNuaWwAE1pFUk9fQklHSU5UX0xJU1RfMTEJAM0IAgUTWkVST19CSUdJTlRfTElTVF8xMAULWkVST19CSUdJTlQADElOVF9ERUNJTUFMUwAIAA9CSUdJTlRfREVDSU1BTFMAEgAHTElTVF82NAkAvQkCAn8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wAgFfAAdMSVNUXzQ2CQC9CQICWzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzACAV8ADEtFWV9NVUxUSVNJRwIITVVMVElTSUcACktFWV9TVEFUVVMCBlNUQVRVUwAKS0VZX1BBVVNFRAIGUEFVU0VEAApLRVlfUEFVU0VSAgZQQVVTRVIAC0tFWV9TVE9SQUdFAgdTVE9SQUdFAApLRVlfQVNTRVRTAgZBU1NFVFMAEktFWV9BU1NFVF9CQUxBTkNFUwIOQVNTRVRfQkFMQU5DRVMAEUtFWV9BU1NFVF9XRUlHSFRTAg1BU1NFVF9XRUlHSFRTAApLRVlfTFBfRkVFAgZMUF9GRUUAEEtFWV9QUk9UT0NPTF9GRUUCDFBST1RPQ09MX0ZFRQANS0VZX1BSRUNJU0lPTgIJUFJFQ0lTSU9OABRLRVlfU0lHTUFfRkVFX1BFUl9MUAIQU0lHTUFfRkVFX1BFUl9MUAAZS0VZX1VTRVJfU0lHTUFfRkVFX1BFUl9MUAIVVVNFUl9TSUdNQV9GRUVfUEVSX0xQAAtLRVlfVVNFUl9MUAIHVVNFUl9MUAAMS0VZX1RPVEFMX0xQAghUT1RBTF9MUAAQS0VZX1VTRVJfUFJPRklUUwIMVVNFUl9QUk9GSVRTARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ1fdmFsaWRhdGVCb29sAwR2YWxfB3RhcmdldF8EZXJyXwMJAQIhPQIFBHZhbF8FB3RhcmdldF8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBXZhbDFfBXZhbDJfBGVycl8DCQAAAgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBEF92YWxpZGF0ZUludExpc3QEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQHJG1hdGNoMAkAtgkBBQRlbGVtAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAMFA2FjYwkBDF92YWxpZGF0ZUludAQFAWEFDmxvd2VyQm91bmRhcnlfBQ51cHBlckJvdW5kYXJ5XwUEZXJyXwcJAAIBBQRlcnJfCgACJGwFBHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBD192YWxpZGF0ZUFzc2V0cwIHYXNzZXRzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwUDYWNjCQEOX3ZhbGlkYXRlQXNzZXQCBQRlbGVtBQRlcnJfBwoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJfdmFsaWRhdGVJbnRFcXVhbHMDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgESX3ZhbGlkYXRlVG9rZW5OYW1lAgR2YWxfBGVycl8DAwkAZgIABAkAsQIBBQR2YWxfBgkAZgIJALECAQUEdmFsXwAQCQACAQUEZXJyXwYBE192YWxpZGF0ZVRva2VuRGVzY3ICBHZhbF8EZXJyXwMJAGYCCQCxAgEFBHZhbF8A6AcJAAIBBQRlcnJfBgERX3ZhbGlkYXRlRGVjaW1hbHMCBHZhbF8EZXJyXwMDCQBmAgAABQR2YWxfBgkAZgIFBHZhbF8ACAkAAgEFBGVycl8GARBfdmFsaWRhdGVQYXltZW50BAhwYXltZW50Xwhhc3NldElkXw9yZXF1aXJlZEFtb3VudF8EZXJyXwQHJG1hdGNoMAgFCHBheW1lbnRfB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAMJAQIhPQIFCGFzc2V0SWRfCQDYBAEFAWEJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQDCQBmAgUPcmVxdWlyZWRBbW91bnRfCAUIcGF5bWVudF8GYW1vdW50CQACAQkArAICBQRlcnJfAgg6IGFtb3VudAYJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFbGlzdF8EdmFsXwRlcnJfAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUFbGlzdF8FBHZhbF8JAAIBBQRlcnJfBgELX2Fzc2V0VG9TdHIBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQUFV0FWRVMBC19zdHJUb0Fzc2V0AQZhc3NldF8DAwkAAAIFBmFzc2V0XwUFV0FWRVMGCQAAAgUGYXNzZXRfAgAFBHVuaXQJANkEAQUGYXNzZXRfAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDF9sb2FkU3RvcmFnZQAEByRtYXRjaDAJAKIIAQULS0VZX1NUT1JBR0UDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUDU0VQCQCcCgoJANkEAQkAkQMCBQZzdHJ1Y3QAAAkAAAIJAJEDAgUGc3RydWN0AAECATEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAQJAKcDAQkAkQMCBQZzdHJ1Y3QABQkApwMBCQCRAwIFBnN0cnVjdAAGCQCnAwEJAJEDAgUGc3RydWN0AAcJAKcDAQkAkQMCBQZzdHJ1Y3QACAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQZzdHJ1Y3QACQkAnAoKAQAHAAAAAAAABQtaRVJPX0JJR0lOVAULWkVST19CSUdJTlQFC1pFUk9fQklHSU5UBQtaRVJPX0JJR0lOVAkBB0FkZHJlc3MBAQABDF9zYXZlU3RvcmFnZQEIc3RvcmFnZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgULS0VZX1NUT1JBR0UJALkJAgkAzAgCCQDYBAEIBQhzdG9yYWdlXwJfMQkAzAgCAwgFCHN0b3JhZ2VfAl8yAgExAgEwCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl8zCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl80CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl81CQDMCAIJAKYDAQgFCHN0b3JhZ2VfAl82CQDMCAIJAKYDAQgFCHN0b3JhZ2VfAl83CQDMCAIJAKYDAQgFCHN0b3JhZ2VfAl84CQDMCAIJAKYDAQgFCHN0b3JhZ2VfAl85CQDMCAIJAKUIAQgFCHN0b3JhZ2VfA18xMAUDbmlsBQNTRVAFA25pbAELX2xvYWRBc3NldHMABAckbWF0Y2gwCQCiCAEFCktFWV9BU1NFVFMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACQC9CQIFAWEFA1NFUAUDbmlsBQNuaWwBC19zYXZlQXNzZXRzAQdhc3NldHNfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9BU1NFVFMJALsJAgUHYXNzZXRzXwUDU0VQBQNuaWwBEl9sb2FkQXNzZXRCYWxhbmNlcwAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EB2JhbGFuY2UJAKcDAQUEZWxlbQkAlAoCCQDNCAIIBQNhY2MCXzEFB2JhbGFuY2UJALcCAggFA2FjYwJfMgUHYmFsYW5jZQQHJG1hdGNoMAkAoggBBRJLRVlfQVNTRVRfQkFMQU5DRVMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACgACJGwJ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BHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFA1NFUAUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAMJAQIhPQIIBQdzdG9yYWdlAl8xAQAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQAAAggFB3N0b3JhZ2UCXzEBAAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEMX2dldERlY2ltYWxzAQhhc3NldElkXwQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwCAUBYQhkZWNpbWFscwkAAgEJAKwCAgIXX2dldERlY2ltYWxzOiBubyBhc3NldD0FCGFzc2V0SWRfAQZfcG93MTABCWV4cG9uZW50XwQHJG1hdGNoMAUJZXhwb25lbnRfAwkAAAIACAUHJG1hdGNoMACAwtcvAwkAAAIABwUHJG1hdGNoMACAreIEAwkAAAIABgUHJG1hdGNoMADAhD0DCQAAAgAFBQckbWF0Y2gwAKCNBgMJAAACAAQFByRtYXRjaDAAkE4DCQAAAgADBQckbWF0Y2gwAOgHAwkAAAIAAgUHJG1hdGNoMABkAwkAAAIAAQUHJG1hdGNoMAAKAwkAAAIAAAUHJG1hdGNoMAABCQACAQkArAICAhBfcG93MTA6IHJldmVydDogCQCkAwEFCWV4cG9uZW50XwESX25vcm1hbGl6ZURlY2ltYWxzBAdhbW91bnRfD3NvdXJjZURlY2ltYWxzXw90YXJnZXREZWNpbWFsc18Gcm91bmRfAwkAZwIFD3NvdXJjZURlY2ltYWxzXwUPdGFyZ2V0RGVjaW1hbHNfCQC9AgQFB2Ftb3VudF8JALYCAQABCQC2AgEJAQZfcG93MTABCQBlAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18FBnJvdW5kXwkAuQICBQdhbW91bnRfCQC2AgEJAQZfcG93MTABCQBlAgUPdGFyZ2V0RGVjaW1hbHNfBQ9zb3VyY2VEZWNpbWFsc18BFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEHYXNzZXRzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MFC1pFUk9fQklHSU5UCgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8x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AAgACQAKCAUGcmVzdWx0Al8yARxfZGVjcmVtZW50QmFsYW5jZXNCeUxwQW1vdW50AwliYWxhbmNlc18HYW1vdW50Xw5scFRvdGFsU3VwcGx5XwQEcmF0ZQkAvQIECQC4AgIFDmxwVG90YWxTdXBwbHlfBQdhbW91bnRfBQtSQVRFX0ZBQ1RPUgUObHBUb3RhbFN1cHBseV8FB0NFSUxJTkcKAQhmb2xkRnVuYwIDYWNjBGVsZW0ECm5ld0JhbGFuY2UJAL0CBAUEZWxlbQUEcmF0ZQULUkFURV9GQUNUT1IFB0NFSUxJTkcEDGRlbHRhQmFsYW5jZQkAuAICBQRlbGVtBQpuZXdCYWxhbmNlCQCVCgMJAM0IAggFA2FjYwJfMQUKbmV3QmFsYW5jZQkAtwICCAUDYWNjAl8yBQpuZXdCYWxhbmNlCQDNCAIIBQNhY2MCXzMFDGRlbHRhQmFsYW5jZQoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAULWkVST19CSUdJTlQFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBGF9nZXRQYXltZW50c0Zyb21CYWxhbmNlcwQHYXNzZXRzXwliYWxhbmNlc18KcmVjaXBpZW50Xw9zb3VyY2VEZWNpbWFsc18KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2lwaWVudF8JAKADAQkBEl9ub3JtYWxpemVEZWNpbWFscwQJAJEDAgUJYmFsYW5jZXNfBQVpbmRleAUPc291cmNlRGVjaW1hbHNfCQEMX2dldERlY2ltYWxzAQUEZWxlbQUERE9XTgkBC19zdHJUb0Fzc2V0AQUEZWxlbQQGcmVzdWx0CgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgESX2NhbGN1bGF0ZU1pY3JvRmVlBQhiYWxhbmNlXwxlcXVpbGlicml1bV8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfAwkAvwICBQxlcXVpbGlicml1bV8FCGJhbGFuY2VfBAl0aHJlc2hvbGQJALwCAwUMZXF1aWxpYnJpdW1fCQC4AgIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAL8CAgUJdGhyZXNob2xkBQhiYWxhbmNlXwQMbWF4RGV2aWF0aW9uCQC4AgIFCXRocmVzaG9sZAUIYmFsYW5jZV8EB2ZlZVJhdGUJALwCAwkAvAIDBQxtYXhEZXZpYXRpb24FDXNsaXBwYWdlUmF0ZV8FFFNMSVBQQUdFX1JBVEVfRkFDVE9SBQ9GRUVfUkFURV9GQUNUT1IFDGVxdWlsaWJyaXVtXwMJAL8CAgUHZmVlUmF0ZQULZmVlTWF4UmF0ZV8JALwCAwUMbWF4RGV2aWF0aW9uBQtmZWVNYXhSYXRlXwUPRkVFX1JBVEVfRkFDVE9SCQC8AgMFDG1heERldmlhdGlvbgUHZmVlUmF0ZQUPRkVFX1JBVEVfRkFDVE9SBQtaRVJPX0JJR0lOVAQJdGhyZXNob2xkCQC8AgMFDGVxdWlsaWJyaXVtXwkAtwICBRRNQVhfV0VJR0hUX0FNUExJRklFUgUQd2VpZ2h0QW1wbGlmaWVyXwUUTUFYX1dFSUdIVF9BTVBMSUZJRVIDCQC/AgIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEDG1heERldmlhdGlvbgkAuAICBQhiYWxhbmNlXwUJdGhyZXNob2xkBAdmZWVSYXRlCQC8AgMJALwCAwUMbWF4RGV2aWF0aW9uBQ1zbGlwcGFnZVJhdGVfBRRTTElQUEFHRV9SQVRFX0ZBQ1RPUgUPRkVFX1JBVEVfRkFDVE9SBQxlcXVpbGlicml1bV8DCQC/AgIFB2ZlZVJhdGUFC2ZlZU1heFJhdGVfCQC8AgMFDG1heERldmlhdGlvbgULZmVlTWF4UmF0ZV8FD0ZFRV9SQVRFX0ZBQ1RPUgkAvAIDBQxtYXhEZXZpYXRpb24FB2ZlZVJhdGUFD0ZFRV9SQVRFX0ZBQ1RPUgULWkVST19CSUdJTlQBDV9jYWxjdWxhdGVGZWUHCWJhbGFuY2VzXxJhc3NldHNUb3RhbFN1cHBseV8Id2VpZ2h0c18Mc2lnbWFXZWlnaHRfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwoBCGZvbGRGdW5jAgNhY2MHYmFsYW5jZQQFaW5kZXgIBQNhY2MCXzEEC2VxdWlsaWJyaXVtCQC8AgMFEmFzc2V0c1RvdGFsU3VwcGx5XwkAtgIBCQCRAwIFCHdlaWdodHNfBQVpbmRleAkAtgIBBQxzaWdtYVdlaWdodF8JAJQKAgkAZAIFBWluZGV4AAEJALcCAggFA2FjYwJfMgkBEl9jYWxjdWxhdGVNaWNyb0ZlZQUFB2JhbGFuY2UFC2VxdWlsaWJyaXVtBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwQGcmVzdWx0CgACJGwFCWJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQtaRVJPX0JJR0lOVAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5XxJwcmV2THBUb3RhbFN1cHBseV8ObHBUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfAwMJAAACBRJwcmV2THBUb3RhbFN1cHBseV8AAAYJAAACBQ5scFRvdGFsU3VwcGx5XwAABgQOcHJldkFzc2V0c1JhdGUJALwCAwkAuAICBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUScHJldkFzc2V0QmFsYW5jZXNfBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8FC1JBVEVfRkFDVE9SCQC2AgEFEnByZXZMcFRvdGFsU3VwcGx5XwQNbmV3QXNzZXRzUmF0ZQkAvAIDCQC4AgIFEWFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFDmFzc2V0QmFsYW5jZXNfBRFhc3NldFRvdGFsU3VwcGx5XwUNYXNzZXRXZWlnaHRzXwUMc2lnbWFXZWlnaHRfBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwULUkFURV9GQUNUT1IJALYCAQUObHBUb3RhbFN1cHBseV8EBGRpZmYJALgCAgUNbmV3QXNzZXRzUmF0ZQUOcHJldkFzc2V0c1JhdGUDAwkAwAICBQtaRVJPX0JJR0lOVAUEZGlmZgkAvwICCQC5AgIJALYCAQD///////////8BCQC2AgEJAQ5fbG9hZFByZWNpc2lvbgAFBGRpZmYHCQACAQkArAICAipfdmFsaWRhdGVMaXF1aWRpdHlJbnZhcmlhbnQ6IHJldmVydDogZGlmZj0JAKYDAQUEZGlmZgYBFl92YWxpZGF0ZVN3YXBJbnZhcmlhbnQJEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8OYXNzZXRCYWxhbmNlc18RYXNzZXRUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfBAhwcmV2VXRpbAkAuAICBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUScHJldkFzc2V0QmFsYW5jZXNfBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8EB25ld1V0aWwJALgCAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBARkaWZmCQC4AgIFB25ld1V0aWwFCHByZXZVdGlsAwMJAMACAgULWkVST19CSUdJTlQFBGRpZmYJAL8CAgkAuQICCQC2AgEA////////////AQkAtgIBCQEOX2xvYWRQcmVjaXNpb24ABQRkaWZmBwkAAgEJAKwCAgIlX3ZhbGlkYXRlU3dhcEludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApgMBBQRkaWZmBgEYX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uBwhiYWxhbmNlXxFhc3NldFRvdGFsU3VwcGx5XwxwcmV2QmFsYW5jZV8VcHJldkFzc2V0VG90YWxTdXBwbHlfB3dlaWdodF8Mc2lnbWFXZWlnaHRfDG1heEFsbG9jQW1wXwQLZXF1aWxpYnJpdW0JALwCAwURYXNzZXRUb3RhbFN1cHBseV8JALYCAQUHd2VpZ2h0XwkAtgIBBQxzaWdtYVdlaWdodF8EEG1heEFsbG9jYXRpb25BbXADCQC/AgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQkAtwICBQ1NQVhfQU1QTElGSUVSBQxtYXhBbGxvY0FtcF8JALgCAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfBA1tYXhBbGxvY2F0aW9uCQC8AgMFC2VxdWlsaWJyaXVtBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSBBFwcmV2TWF4QWxsb2NhdGlvbgkAvAIDCQC8AgMFFXByZXZBc3NldFRvdGFsU3VwcGx5XwkAtgIBBQd3ZWlnaHRfCQC2AgEFDHNpZ21hV2VpZ2h0XwUQbWF4QWxsb2NhdGlvbkFtcAUNTUFYX0FNUExJRklFUgMJAL8CAgUIYmFsYW5jZV8FC2VxdWlsaWJyaXVtAwkAvwICBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgMJAL8CAgURcHJldk1heEFsbG9jYXRpb24FDHByZXZCYWxhbmNlXwkAAgECIF92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogbmV3IHVwAwkAvwICCQC4AgIFCGJhbGFuY2VfBQ1tYXhBbGxvY2F0aW9uCQC4AgIFDHByZXZCYWxhbmNlXwURcHJldk1heEFsbG9jYXRpb24JAAIBAiJfdmFsaWRhdGVBc3NldEFsbG9jYXRpb246IHN0aWxsIHVwBgYDCQC/AgIFDW1heEFsbG9jYXRpb24FCGJhbGFuY2VfAwkAvwICBQxwcmV2QmFsYW5jZV8FEXByZXZNYXhBbGxvY2F0aW9uCQACAQIiX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgZG93bgMJAL8CAgkAuAICBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwkAuAICBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIkX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBzdGlsbCBkb3duBgYBE192YWxpZGF0ZUFsbG9jYXRpb24HDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQkAlAoCCQBkAgUFaW5kZXgAAQMIBQNhY2MCXzIJARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HBQRlbGVtBRFhc3NldFRvdGFsU3VwcGx5XwkAkQMCBRJwcmV2QXNzZXRCYWxhbmNlc18FBWluZGV4BRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAJEDAgUNYXNzZXRXZWlnaHRzXwUFaW5kZXgFDHNpZ21hV2VpZ2h0XwUMbWF4QWxsb2NBbXBfBwQGcmVzdWx0CgACJGwFDmFzc2V0QmFsYW5jZXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgELX2NoZWNrcG9pbnQBBXVzZXJfBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBXVzZXJfBAt1c2VyUHJvZml0cwkBEF9sb2FkVXNlclByb2ZpdHMBBQV1c2VyXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEEXVzZXJTaWdtYUZlZVBlckxwCQEWX2xvYWRVc2VyU2lnbWFGZWVQZXJMcAEFBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQNcHJvZml0VXBkYXRlZAkAZAIJAJEDAgULdXNlclByb2ZpdHMFBWluZGV4CQCgAwEJALwCAwkAtgIBBQZ1c2VyTHAJALgCAgkAkQMCBQ1zaWdtYUZlZVBlckxwBQVpbmRleAkAkQMCBRF1c2VyU2lnbWFGZWVQZXJMcAUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFDXByb2ZpdFVwZGF0ZWQEDSR0MDI1NDIzMjU0OTYKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI1NDIzMjU0OTYCXzEEDnByb2ZpdHNVcGRhdGVkCAUNJHQwMjU0MjMyNTQ5NgJfMgkAlAoCCQDOCAIJARBfc2F2ZVVzZXJQcm9maXRzAgUFdXNlcl8FDnByb2ZpdHNVcGRhdGVkCQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFBXVzZXJfBQ1zaWdtYUZlZVBlckxwBQ5wcm9maXRzVXBkYXRlZAEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEDnNpZ21hRmVlUGVyTHBfCHRvdGFsTHBfBmluZGV4XwZscEZlZV8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQZpbmRleF8FBWluZGV4CQC3AgIJAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQC8AgMJALYCAQUGbHBGZWVfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQh0b3RhbExwXwkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQEDSR0MDI2MTQ2MjYyMjUKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI2MTQ2MjYyMjUCXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMjYxNDYyNjIyNQJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQLYXNzZXRJbmRleF8HYW1vdW50XwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjY0NDYyNjcyMQMJAAACBQd0b3RhbExwAAAJAJQKAgAACQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwUHTUFYX0ZFRQkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUEBWxwRmVlCAUNJHQwMjY0NDYyNjcyMQJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNjQ0NjI2NzIxAl8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQVscEZlZQAABQ1zaWdtYUZlZVBlckxwCQEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEBQ1zaWdtYUZlZVBlckxwBQd0b3RhbExwBQthc3NldEluZGV4XwUFbHBGZWUJAJUKAwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAELX2RlcG9zaXRBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjcyMzAyNzI4MwkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjcyMzAyNzI4MwJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyNzIzMDI3MjgzAl8yBA0kdDAyNzI4ODI3MzU2CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyNzI4ODI3MzU2Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI3Mjg4MjczNTYCXzIEDSR0MDI3MzYyMjg2MDgDCQAAAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFC1pFUk9fQklHSU5UCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkCQBrAwkAkQMCBQxhc3NldFdlaWdodHMFBWluZGV4BQdhbW91bnRfBQtzaWdtYVdlaWdodAkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI3ODE3Mjc4OTEKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDI3ODE3Mjc4OTECXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDAyNzgxNzI3ODkxAl8yCQCUCgIFB2Ftb3VudF8FGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEBXJhdGlvCQC8AgMJALYCAQUHYW1vdW50XwUOUEVSQ0VOVF9GQUNUT1IFFHByZXZBc3NldFRvdGFsU3VwcGx5CgEJZm9sZEZ1bmMxAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAvAIDBQVyYXRpbwkAkQMCBRFwcmV2QXNzZXRCYWxhbmNlcwUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAQNJHQwMjg0MDcyODQ4MgoAAiRsBQZhc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlmb2xkRnVuYzECBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDI4NDA3Mjg0ODICXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDAyODQwNzI4NDgyAl8yCQCUCgIJAKADAQkAvAIDCQC2AgEFB2Ftb3VudF8JALYCAQUNbHBUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMjczNjIyODYwOAJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI3MzYyMjg2MDgCXzIEDSR0MDI4NjE0Mjg3MjcJARtfaW5jcmVtZW50QmFsYW5jZXNCeUFtb3VudHMCBRFwcmV2QXNzZXRCYWxhbmNlcwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQNYXNzZXRCYWxhbmNlcwgFDSR0MDI4NjE0Mjg3MjcCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODYxNDI4NzI3Al8yBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb01pbnQFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCF9kZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjk0MjUyOTQ3OAkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjk0MjUyOTQ3OAJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyOTQyNTI5NDc4Al8yBA0kdDAyOTQ4MzI5NTk3CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyOTQ4MzI5NTk3Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI5NDgzMjk1OTcCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBQdhbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQC3AgIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdhbW91bnRfBARlcnIyCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAURbWF4QWxsb2NBbXBsaWZpZXIDCQAAAgUEZXJyMgUEZXJyMgQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBANmZWUJAQ1fY2FsY3VsYXRlRmVlBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEDmxwVG9rZW5zVG9NaW50AwkAAAIFDWxwVG90YWxTdXBwbHkAAAkAoAMBCQC4AgIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQQJYXNzZXREaWZmCQC4AgIFEGFzc2V0VG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BAdmZWVEaWZmCQC4AgIFA2ZlZQUHcHJldkZlZQQTdXRpbGl0eUNoYW5nZUZhY3RvcgkAvAIDCQC4AgIFCWFzc2V0RGlmZgUHZmVlRGlmZgULUkFURV9GQUNUT1IJALgCAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUEE2xwVG9rZW5zVG9NaW50SW5uZXIJAKADAQkAvAIDCQC2AgEFDWxwVG90YWxTdXBwbHkFE3V0aWxpdHlDaGFuZ2VGYWN0b3IFC1JBVEVfRkFDVE9SBARlcnIzCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUTbHBUb2tlbnNUb01pbnRJbm5lcgUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDCQAAAgUEZXJyMwUEZXJyMwUTbHBUb2tlbnNUb01pbnRJbm5lcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQ5scFRva2Vuc1RvTWludAUNYXNzZXRCYWxhbmNlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMX3dpdGhkcmF3QWxsAQdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEDSR0MDMxNjA3MzE2NzUJARJfbG9hZEFzc2V0QmFsYW5jZXMABBFwcmV2QXNzZXRCYWxhbmNlcwgFDSR0MDMxNjA3MzE2NzUCXzEEFHByZXZBc3NldFRvdGFsU3VwcGx5CAUNJHQwMzE2MDczMTY3NQJfMgQNJHQwMzE2ODAzMTczMwkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMzE2ODAzMTczMwJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAzMTY4MDMxNzMzAl8yBA5scFRva2Vuc1RvQnVybgUHYW1vdW50XwQNJHQwMzE3NzIzMTkyNwkBHF9kZWNyZW1lbnRCYWxhbmNlc0J5THBBbW91bnQDBRFwcmV2QXNzZXRCYWxhbmNlcwkAtgIBBQ5scFRva2Vuc1RvQnVybgkAtgIBBQ1scFRvdGFsU3VwcGx5BA1hc3NldEJhbGFuY2VzCAUNJHQwMzE3NzIzMTkyNwJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDMxNzcyMzE5MjcCXzIEDWJhbGFuY2VzVG9QYXkIBQ0kdDAzMTc3MjMxOTI3Al8zBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBlAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb0J1cm4FDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb0J1cm4FDWJhbGFuY2VzVG9QYXkFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCV93aXRoZHJhdwIIYXNzZXRJZF8JbHBBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkECXByZWNpc2lvbgkBDl9sb2FkUHJlY2lzaW9uAAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA0kdDAzMjcxOTMyNzg3CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAzMjcxOTMyNzg3Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDMyNzE5MzI3ODcCXzIEDSR0MDMyNzkyMzI4NDUJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDMyNzkyMzI4NDUCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMzI3OTIzMjg0NQJfMgQQdGFyZ2V0QXNzZXRJbmRleAkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBAdwcmV2RmVlCQENX2NhbGN1bGF0ZUZlZQcFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEDXByZXZVdGlsVmFsdWUJALgCAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUEAWsJALwCAwkAtgIBCQBlAgUNbHBUb3RhbFN1cHBseQUJbHBBbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BBJwcmV2VXRpbFZhbHVlV2l0aEsJALwCAwUNcHJldlV0aWxWYWx1ZQUBawUOUEVSQ0VOVF9GQUNUT1IKAQhmb2xkRnVuYwIDYWNjBGVsZW0DCAUDYWNjAl8xBQNhY2MECnN0YXJ0SW5uZXIIBQNhY2MCXzIECXN0b3BJbm5lcggFA2FjYwJfMwQNY3VycmVudEFtb3VudAkAugICCQC3AgIFCXN0b3BJbm5lcgUKc3RhcnRJbm5lcgkAtgIBAAIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFDWN1cnJlbnRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQC4AgIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1jdXJyZW50QW1vdW50BAl1dGlsVmFsdWUJALgCAgUUdGVtcEFzc2V0VG90YWxTdXBwbHkJAQ1fY2FsY3VsYXRlRmVlBwURdGVtcEFzc2V0QmFsYW5jZXMFFHRlbXBBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMDCQC/AgIJALYCAQUJcHJlY2lzaW9uCQC4AgIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLCQDAAgIJALgCAgUJdXRpbFZhbHVlBRJwcmV2VXRpbFZhbHVlV2l0aEsFC1pFUk9fQklHSU5UBwkAlgoEBgUKc3RhcnRJbm5lcgUJc3RvcElubmVyBQ1jdXJyZW50QW1vdW50AwkAvwICBQtaRVJPX0JJR0lOVAkAuAICBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAlgoEBwUKc3RhcnRJbm5lcgUNY3VycmVudEFtb3VudAULWkVST19CSUdJTlQJAJYKBAcFDWN1cnJlbnRBbW91bnQFCXN0b3BJbm5lcgULWkVST19CSUdJTlQEDHRhcmdldEFtb3VudAQNJHQwMzQ0MTAzNDU1NgoAAiRsBQdMSVNUXzQ2CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBwULWkVST19CSUdJTlQJALcCAgkAtgIBBQlscEFtb3VudF8FB3ByZXZGZWUFC1pFUk9fQklHSU5UCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgQHc3VjY2VzcwgFDSR0MDM0NDEwMzQ1NTYCXzEECHN0YXJ0T3V0CAUNJHQwMzQ0MTAzNDU1NgJfMgQHc3RvcE91dAgFDSR0MDM0NDEwMzQ1NTYCXzMED3RhcmdldEFtb3VudE91dAgFDSR0MDM0NDEwMzQ1NTYCXzQDCQEBIQEFB3N1Y2Nlc3MJAAIBCQCsAgICKF93aXRoZHJhdzogY2FuJ3QgY2FsY3VsYXRlIHRhcmdldEFtb3VudD0JAKYDAQUPdGFyZ2V0QW1vdW50T3V0BQ90YXJnZXRBbW91bnRPdXQEEmZpbmFsQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BQx0YXJnZXRBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAuAICBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMdGFyZ2V0QW1vdW50BARlcnIxAwkBE192YWxpZGF0ZUFsbG9jYXRpb24HBRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDWxwVG90YWxTdXBwbHkJAGUCBQ1scFRvdGFsU3VwcGx5BQlscEFtb3VudF8FDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDAzNTQzMTM1NTc5CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEHRhcmdldEFzc2V0SW5kZXgAAQkAoAMBBQx0YXJnZXRBbW91bnQFCWxwRmVlUmF0ZQUPcHJvdG9jb2xGZWVSYXRlBAVscEZlZQgFDSR0MDM1NDMxMzU1NzkCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzU0MzEzNTU3OQJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzNTQzMTM1NTc5Al8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQVfc3dhcAMRc291cmNlQXNzZXRJbmRleF8RdGFyZ2V0QXNzZXRJbmRleF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkECXByZWNpc2lvbgkBDl9sb2FkUHJlY2lzaW9uAAQNJHQwMzYxNjQzNjIzMgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzYxNjQzNjIzMgJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzNjE2NDM2MjMyAl8yBA0kdDAzNjIzNzM2MjkwCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzNjIzNzM2MjkwAl8xBAtzaWdtYVdlaWdodAgFDSR0MDM2MjM3MzYyOTACXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FDXNvdXJjZUFtb3VudF8EEGFzc2V0VG90YWxTdXBwbHkJALcCAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDXNvdXJjZUFtb3VudF8EB3ByZXZGZWUJAQ1fY2FsY3VsYXRlRmVlBwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQNcHJldlV0aWxWYWx1ZQkAuAICBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHcHJldkZlZQoBCGZvbGRGdW5jAgNhY2MEZWxlbQMIBQNhY2MCXzEFA2FjYwQKc3RhcnRJbm5lcggFA2FjYwJfMgQJc3RvcElubmVyCAUDYWNjAl8zBA1jdXJyZW50QW1vdW50CQC6AgIJALcCAgUJc3RvcElubmVyBQpzdGFydElubmVyCQC2AgEAAgQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUNY3VycmVudEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJALgCAgUQYXNzZXRUb3RhbFN1cHBseQUNY3VycmVudEFtb3VudAQJdXRpbFZhbHVlCQC4AgIFFHRlbXBBc3NldFRvdGFsU3VwcGx5CQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDAwkAvwICCQC2AgEFCXByZWNpc2lvbgkAuAICBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUJAMACAgkAuAICBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUFC1pFUk9fQklHSU5UBwkAlgoEBgUKc3RhcnRJbm5lcgUJc3RvcElubmVyBQ1jdXJyZW50QW1vdW50AwkAvwICBQtaRVJPX0JJR0lOVAkAuAICBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUJAJcKBQcFCnN0YXJ0SW5uZXIFDWN1cnJlbnRBbW91bnQFDWN1cnJlbnRBbW91bnQJAM0IAggFA2FjYwJfNQUJdXRpbFZhbHVlCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAM0IAggFA2FjYwJfNQUJdXRpbFZhbHVlBAx0YXJnZXRBbW91bnQEDHRhcmdldEFtb3VudAUNc291cmNlQW1vdW50XwQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBR0ZW1wQXNzZXRUb3RhbFN1cHBseQkAuAICBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBAdmZWVEaWZmCQC4AgIFA2ZlZQUHcHJldkZlZQMJAAACBQdmZWVEaWZmBQtaRVJPX0JJR0lOVAUMdGFyZ2V0QW1vdW50BA0kdDAzODcwMTM4ODUxCgACJGwFB0xJU1RfNDYKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUHBQtaRVJPX0JJR0lOVAkAtwICBQ1zb3VyY2VBbW91bnRfBQdwcmV2RmVlBQtaRVJPX0JJR0lOVAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgQHc3VjY2VzcwgFDSR0MDM4NzAxMzg4NTECXzEECHN0YXJ0T3V0CAUNJHQwMzg3MDEzODg1MQJfMgQHc3RvcE91dAgFDSR0MDM4NzAxMzg4NTECXzMED3RhcmdldEFtb3VudE91dAgFDSR0MDM4NzAxMzg4NTECXzQEBWRlYnVnCAUNJHQwMzg3MDEzODg1MQJfNQMJAQEhAQUHc3VjY2VzcwkAAgEJARNfbGlzdEJpZ0ludFRvU3RyaW5nAQUFZGVidWcFD3RhcmdldEFtb3VudE91dAQSZmluYWxBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwUNYXNzZXRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8FDHRhcmdldEFtb3VudAQVZmluYWxBc3NldFRvdGFsU3VwcGx5CQC4AgIFEGFzc2V0VG90YWxTdXBwbHkFDHRhcmdldEFtb3VudAQEZXJyMQMJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAURbWF4QWxsb2NBbXBsaWZpZXIJARZfdmFsaWRhdGVTd2FwSW52YXJpYW50CQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUHAwkAAAIFBGVycjEFBGVycjEEDSR0MDM5NzE3Mzk4NjYJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgURdGFyZ2V0QXNzZXRJbmRleF8AAQkAoAMBBQx0YXJnZXRBbW91bnQFCWxwRmVlUmF0ZQUPcHJvdG9jb2xGZWVSYXRlBAVscEZlZQgFDSR0MDM5NzE3Mzk4NjYCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzk3MTczOTg2NgJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzOTcxNzM5ODY2Al8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuFQFpAQRpbml0Dgdhc3NldHNfDWFzc2V0V2VpZ2h0c18KbHBGZWVSYXRlXxBwcm90b2NvbEZlZVJhdGVfDGxwVG9rZW5OYW1lXw1scFRva2VuRGVzY3JfEGxwVG9rZW5EZWNpbWFsc18XbWF4QWxsb2NhdGlvbkFtcGxpZmllcl8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfFHByb3RvY29sRmVlQ29udHJhY3RfCnByZWNpc2lvbl8HcGF1c2VyXwQDZXJyAwMDAwMDAwMDAwMDAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBE193aGVuTm90SW5pdGlhbGl6ZWQABwkBEF93aGVuTXVsdGlzaWdTZXQABwkBD192YWxpZGF0ZUFzc2V0cwIFB2Fzc2V0c18CFGluaXQ6IGludmFsaWQgYXNzZXRzBwkBEF92YWxpZGF0ZUludExpc3QEBQ1hc3NldFdlaWdodHNfAAEFCk1BWF9XRUlHSFQCGmluaXQ6IGludmFsaWQgYXNzZXRXZWlnaHRzBwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQUHYXNzZXRzXwkAkAMBBQ1hc3NldFdlaWdodHNfAh9pbml0OiBpbnZhbGlkIGFzc2V0V2VpZ2h0cyBzaXplBwkBDF92YWxpZGF0ZUludAQFCmxwRmVlUmF0ZV8AAAUHTUFYX0ZFRQIUaW5pdDogaW52YWxpZCBscCBmZWUHCQEMX3ZhbGlkYXRlSW50BAUQcHJvdG9jb2xGZWVSYXRlXwAABQdNQVhfRkVFAhppbml0OiBpbnZhbGlkIHByb3RvY29sIGZlZQcJARJfdmFsaWRhdGVUb2tlbk5hbWUCBQxscFRva2VuTmFtZV8CEmluaXQ6IGludmFsaWQgbmFtZQcJARNfdmFsaWRhdGVUb2tlbkRlc2NyAgUNbHBUb2tlbkRlc2NyXwITaW5pdDogaW52YWxpZCBkZXNjcgcJARFfdmFsaWRhdGVEZWNpbWFscwIFEGxwVG9rZW5EZWNpbWFsc18CFmluaXQ6IGludmFsaWQgZGVjaW1hbHMHCQEMX3ZhbGlkYXRlSW50BAUXbWF4QWxsb2NhdGlvbkFtcGxpZmllcl8AAAkAoAMBBQ1NQVhfQU1QTElGSUVSAiRpbml0OiBpbnZhbGlkIG1heEFsbG9jYXRpb25BbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQd2VpZ2h0QW1wbGlmaWVyXwAABRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwIdaW5pdDogaW52YWxpZCB3ZWlnaHRBbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUNc2xpcHBhZ2VSYXRlXwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHNsaXBwYWdlUmF0ZQcJAQxfdmFsaWRhdGVJbnQEBQtmZWVNYXhSYXRlXwAABQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIGZlZU1heFJhdGUHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFFHByb3RvY29sRmVlQ29udHJhY3RfAiFpbml0OiBpbnZhbGlkIHByb3RvY29sRmVlQ29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAUKcHJlY2lzaW9uXwABBQdNQVhfSU5UAhdpbml0OiBpbnZhbGlkIHByZWNpc2lvbgcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIUaW5pdDogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyBA0kdDA0MTczNzQxODA2CQEUX3ByZXBhcmVBc3NldFdlaWdodHMBBQ1hc3NldFdlaWdodHNfBAxhc3NldFdlaWdodHMIBQ0kdDA0MTczNzQxODA2Al8xBAtzaWdtYVdlaWdodAgFDSR0MDQxNzM3NDE4MDYCXzIEDWFzc2V0QmFsYW5jZXMJARVfcHJlcGFyZUFzc2V0QmFsYW5jZXMBBQdhc3NldHNfBAVpc3N1ZQkAwggFBQxscFRva2VuTmFtZV8FDWxwVG9rZW5EZXNjcl8AAAUQbHBUb2tlbkRlY2ltYWxzXwYECWxwQXNzZXRJZAkAuAgBBQVpc3N1ZQQOc3RvcmFnZVVwZGF0ZWQJAJwKCgUJbHBBc3NldElkBgAABQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfCQC2AgEFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfCQC2AgEFEHdlaWdodEFtcGxpZmllcl8JALYCAQUNc2xpcHBhZ2VSYXRlXwkAtgIBBQtmZWVNYXhSYXRlXwkBEUBleHRyTmF0aXZlKDEwNjIpAQUUcHJvdG9jb2xGZWVDb250cmFjdF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIFBWlzc3VlBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBC19zYXZlQXNzZXRzAQUHYXNzZXRzXwkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJARFfc2F2ZUFzc2V0V2VpZ2h0cwEFDGFzc2V0V2VpZ2h0cwkBDl9zYXZlUHJlY2lzaW9uAQUKcHJlY2lzaW9uXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEJARJfbG9hZFNpZ21hRmVlUGVyTHAACQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmRlcG9zaXRBbGwBB2Ftb3VudF8EA2VycgMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQdNQVhfSU5UAhpkZXBvc2l0QWxsOiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwNDM1NTY0MzY0MQkBC19kZXBvc2l0QWxsAQUHYW1vdW50XwQObHBUb2tlbnNUb01pbnQIBQ0kdDA0MzU1NjQzNjQxAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwNDM1NTY0MzY0MQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQzNTU2NDM2NDECXzMKAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBA9wYXltZW50QXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAdhc3NldElkBBRwYXltZW50QXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFD3BheW1lbnRBc3NldFN0cgQYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkCQCRAwIFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFBWluZGV4BA5yZXF1aXJlZEFtb3VudAkAoAMBCQESX25vcm1hbGl6ZURlY2ltYWxzBAUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBRRwYXltZW50QXNzZXREZWNpbWFscwUHQ0VJTElORwQEZXJyMQMJAQIhPQIFD3BheW1lbnRBc3NldFN0cgUEZWxlbQkAAgEJAKwCAgIjZGVwb3NpdEFsbDogaW52YWxpZCBwYXltZW50OiBpbmRleD0JAKQDAQUFaW5kZXgDCQBnAgAABQ5yZXF1aXJlZEFtb3VudAkAAgECJmRlcG9zaXRBbGw6IHRvbyBsaXR0bGUgYW1vdW50IHJlcXVpcmVkBQR1bml0AwkAAAIFBGVycjEFBGVycjEEBmNoYW5nZQMJAGYCCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50BQ5yZXF1aXJlZEFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50BQ5yZXF1aXJlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4B2Fzc2V0SWQFA25pbAMJAGYCBQ5yZXF1aXJlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BmFtb3VudAkAAgEJAKwCAgkArAICCQCsAgICKGRlcG9zaXRBbGw6IGluc3VmZmljaWVudCBwYXltZW50LCBpbmRleD0JAKQDAQUFaW5kZXgCCywgcmVxdWlyZWQ9CQCkAwEFDnJlcXVpcmVkQW1vdW50BQNuaWwJAJQKAgkAZAIFBWluZGV4AAEJAM4IAggFA2FjYwJfMgUGY2hhbmdlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDA0NDgzOTQ0OTAxCgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDA0NDgzOTQ0OTAxAl8xBA1jaGFuZ2VBY3Rpb25zCAUNJHQwNDQ4Mzk0NDkwMQJfMgQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBkAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9NaW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCWxwQXNzZXRJZAUObHBUb2tlbnNUb01pbnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUObHBUb2tlbnNUb01pbnQFCWxwQXNzZXRJZAUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQ1jaGFuZ2VBY3Rpb25zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2RlcG9zaXQBDG1pbkxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUMbWluTHBBbW91bnRfAAAFB01BWF9JTlQCHmRlcG9zaXQ6IGludmFsaWQgbWluIGxwIGFtb3VudAMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQEZXJyMQMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBA0kdDA0NjMwODQ2NDA4CQEIX2RlcG9zaXQCBQhhc3NldFN0cgUQYW1vdW50Tm9ybWFsaXplZAQObHBUb2tlbnNUb01pbnQIBQ0kdDA0NjMwODQ2NDA4Al8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNDYzMDg0NjQwOAJfMgQEZXJyMgkBDF92YWxpZGF0ZUludAQFDmxwVG9rZW5zVG9NaW50BQxtaW5McEFtb3VudF8FB01BWF9JTlQCGWRlcG9zaXQ6IGxlc3MgdGhhbiBtaW4gbHADCQAAAgUEZXJyMgUEZXJyMgQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBkAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9NaW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9NaW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDmxwVG9rZW5zVG9NaW50BQlscEFzc2V0SWQFA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt3aXRoZHJhd0FsbAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJANgEAQUJbHBBc3NldElkBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUMbHBBc3NldElkU3RyBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEA2VycgMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiN3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ3NjI4NDc3MTUJAQxfd2l0aGRyYXdBbGwBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQObHBUb2tlbnNUb0J1cm4IBQ0kdDA0NzYyODQ3NzE1Al8xBA1iYWxhbmNlc1RvUGF5CAUNJHQwNDc2Mjg0NzcxNQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ3NjI4NDc3MTUCXzMEDnBheW1lbnRBY3Rpb25zCQEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAUGYXNzZXRzBQ1iYWxhbmNlc1RvUGF5CAUBaQZjYWxsZXIFCmxwRGVjaW1hbHMEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvQnVybggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBBEJ1cm4CBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9CdXJuBQNuaWwFDnBheW1lbnRBY3Rpb25zCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Aghhc3NldElkXwptaW5BbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECH3dpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiB3aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFtb3VudAcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDBQZhc3NldHMFCGFzc2V0SWRfAhl3aXRoZHJhdzogaW52YWxpZCBhc3NldElkBwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIbd2l0aGRyYXc6IGludmFsaWQgbWluQW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwNDkwNDE0OTE3NQkBCV93aXRoZHJhdwIFCGFzc2V0SWRfCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDQ5MDQxNDkxNzUCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDQ5MDQxNDkxNzUCXzIEBWxwRmVlCAUNJHQwNDkwNDE0OTE3NQJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0OTA0MTQ5MTc1Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ5MDQxNDkxNzUCXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCCQCgAwEFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJAKADAQkBEl9ub3JtYWxpemVEZWNpbWFscwQJALYCAQUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgQEZXJyMQkBDF92YWxpZGF0ZUludAQFC2ZpbmFsQW1vdW50BQptaW5BbW91bnRfBQdNQVhfSU5UAiN3aXRoZHJhdzogaW5zdWZmaWNpZW50IGZpbmFsIGFtb3VudAMJAAACBQRlcnIxBQRlcnIxBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGUCCAUHc3RvcmFnZQJfMwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEEQnVybgIFCWxwQXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtmaW5hbEFtb3VudAkBC19zdHJUb0Fzc2V0AQUIYXNzZXRJZF8FA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFCGFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUIYXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUIYXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQhhc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBHN3YXACDnRhcmdldEFzc2V0SWRfCm1pbkFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQOc291cmNlQXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQJALYCAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIfc3dhcDogaW52YWxpZCBtaW4gdGFyZ2V0IGFtb3VudAcJAQxfdmFsaWRhdGVJbnQECQCgAwEFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50BwkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRTdHIFDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECG3N3YXA6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEDSR0MDUxMzUyNTE1MTAJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1MTM1MjUxNTEwAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1MTM1MjUxNTEwAl8yBAVscEZlZQgFDSR0MDUxMzUyNTE1MTACXzMEC3Byb3RvY29sRmVlCAUNJHQwNTEzNTI1MTUxMAJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1MTM1MjUxNTEwAl81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgkAoAMBBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQCgAwEJARJfbm9ybWFsaXplRGVjaW1hbHMECQC2AgEFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04EBGVycjEJAQxfdmFsaWRhdGVJbnQEBQtmaW5hbEFtb3VudAUKbWluQW1vdW50XwUHTUFYX0lOVAIfc3dhcDogaW5zdWZmaWNpZW50IGZpbmFsIGFtb3VudAMJAAACBQRlcnIxBQRlcnIxCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQ50YXJnZXRBc3NldElkXwUDbmlsCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQ50YXJnZXRBc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWdldERlcG9zaXRBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAEFB01BWF9JTlQCHWdldERlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1MjY2OTUyNzU2CQELX2RlcG9zaXRBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNTI2Njk1Mjc1NgJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDUyNjY5NTI3NTYCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MjY2OTUyNzU2Al8zCQCUCgIFA25pbAkAlAoCBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpnZXREZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGWdldERlcG9zaXQ6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCGmdldERlcG9zaXQ6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAkAtgIBBQdhbW91bnRfBQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBA0kdDA1MzUyNjUzNjAwCQEIX2RlcG9zaXQCBQhhc3NldElkXwUQYW1vdW50Tm9ybWFsaXplZAQObHBUb2tlbnNUb01pbnQIBQ0kdDA1MzUyNjUzNjAwAl8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNTM1MjY1MzYwMAJfMgkAlAoCBQNuaWwFDmxwVG9rZW5zVG9NaW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmdldFdpdGhkcmF3QWxsAQlscEFtb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFCWxwQW1vdW50XwAABQdNQVhfSU5UAh5nZXRXaXRoZHJhd0FsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDUzOTc3NTQwNTMJAQxfd2l0aGRyYXdBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9CdXJuCAUNJHQwNTM5Nzc1NDA1MwJfMQQNYmFsYW5jZXNUb0dldAgFDSR0MDUzOTc3NTQwNTMCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1Mzk3NzU0MDUzAl8zCQCUCgIFA25pbAUNYmFsYW5jZXNUb0dldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtnZXRXaXRoZHJhdwIIYXNzZXRJZF8HYW1vdW50XwQDZXJyAwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMJAQtfbG9hZEFzc2V0cwAFCGFzc2V0SWRfAhpnZXRXaXRoZHJhdzogaW52YWxpZCBhc3NldAkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAQUHTUFYX0lOVAIbZ2V0V2l0aGRyYXc6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNJHQwNTQ3MDQ1NDgyMAkBCV93aXRoZHJhdwIFCGFzc2V0SWRfBQdhbW91bnRfBBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNTQ3MDQ1NDgyMAJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDU0NzA0NTQ4MjACXzIEBWxwRmVlCAUNJHQwNTQ3MDQ1NDgyMAJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1NDcwNDU0ODIwAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDU0NzA0NTQ4MjACXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCCQCgAwEFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMECQC2AgEFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdnZXRTd2FwAw5zb3VyY2VBc3NldElkXw50YXJnZXRBc3NldElkXw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQJALYCAQUNc291cmNlQW1vdW50XwkBDF9nZXREZWNpbWFscwEFDnNvdXJjZUFzc2V0SWRfBQpscERlY2ltYWxzBQRET1dOBANlcnIDCQEMX3ZhbGlkYXRlSW50BAkAoAMBBRZzb3VyY2VBbW91bnROb3JtYWxpemVkAAEFB01BWF9JTlQCG3N3YXA6IGludmFsaWQgc291cmNlIGFtb3VudAkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRJZF8FDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcDCQAAAgUDZXJyBQNlcnIEDSR0MDU2MjcyNTY0MzAJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1NjI3MjU2NDMwAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1NjI3MjU2NDMwAl8yBAVscEZlZQgFDSR0MDU2MjcyNTY0MzACXzMEC3Byb3RvY29sRmVlCAUNJHQwNTYyNzI1NjQzMAJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1NjI3MjU2NDMwAl81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgkAoAMBBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAkAtgIBBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOCQCUCgIFA25pbAULZmluYWxBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZ2V0Q2xhaW0BBXVzZXJfBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhZnZXRDbGFpbTogaW52YWxpZCB1c2VyCAUBaQZjYWxsZXIEDSR0MDU3MDkxNTcxNDcJAQtfY2hlY2twb2ludAEFBHVzZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTcwOTE1NzE0NwJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1NzA5MTU3MTQ3Al8yCQCUCgIFA25pbAULdXNlclByb2ZpdHMBaQELZ2V0VXRpbEZ1bmMABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BA0kdDA1NzQ4MDU3NTQwCQESX2xvYWRBc3NldEJhbGFuY2VzAAQNYXNzZXRCYWxhbmNlcwgFDSR0MDU3NDgwNTc1NDACXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDA1NzQ4MDU3NTQwAl8yBA0kdDA1NzU0NTU3NTk4CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDA1NzU0NTU3NTk4Al8xBAtzaWdtYVdlaWdodAgFDSR0MDU3NTQ1NTc1OTgCXzIEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQJdXRpbFZhbHVlCQC4AgIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQkAlAoCBQNuaWwJAJQKAgUJdXRpbFZhbHVlBQ1scFRvdGFsU3VwcGx5AWkBCmNoZWNrcG9pbnQBBXVzZXJfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhhjaGVja3BvaW50OiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgkBC19jaGVja3BvaW50AQUEdXNlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEIBQdzdG9yYWdlAl8xBARlcnIxAwMJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHHN0YWtlOiBpbnZhbGlkIHBheW1lbnRzIHNpemUJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhxzdGFrZTogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBA0kdDA1ODY3MTU4NzMxCQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTg2NzE1ODczMQJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1ODY3MTU4NzMxAl8yCQCUCgIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBkAgkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9zYXZlVG90YWxMcAEJAGQCCQEMX2xvYWRUb3RhbExwAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5zdGFrZQEHYW1vdW50XwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQZ1c2VyTHACF3Vuc3Rha2U6IGludmFsaWQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEDSR0MDU5MjQyNTkzMDIJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1OTI0MjU5MzAyAl8xBAt1c2VyUHJvZml0cwgFDSR0MDU5MjQyNTkzMDICXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FCWxwQXNzZXRJZAUDbmlsBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBlAgUGdXNlckxwBQdhbW91bnRfCQEMX3NhdmVUb3RhbExwAQkAZQIJAQxfbG9hZFRvdGFsTHAABQdhbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwITY2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQGdXNlckxwCQELX2xvYWRVc2VyTHABBQR1c2VyBA0kdDA2MDAyNTYwMDgxCQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDYwMDI1NjAwODECXzEEC3VzZXJQcm9maXRzCAUNJHQwNjAwMjU2MDA4MQJfMgoBCGZvbGRGdW5jAgNhY2MGcHJvZml0BAVpbmRleAgFA2FjYwJfMQMDCQBnAgUIbWF4SW5kZXgFBWluZGV4CQBmAgUGcHJvZml0AAAHBAVhc3NldAkAkQMCBQZhc3NldHMFBWluZGV4CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQEOU2NyaXB0VHJhbnNmZXIDBQR1c2VyBQZwcm9maXQJAQtfc3RyVG9Bc3NldAEFBWFzc2V0CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBnByb2ZpdAgFA2FjYwJfMwQNJHQwNjA0NTk2MDU1MAoAAiRsBQt1c2VyUHJvZml0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwNjA0NTk2MDU1MAJfMQQSdXNlclByb2ZpdHNVcGRhdGVkCAUNJHQwNjA0NTk2MDU1MAJfMgQNcHJvZml0QWN0aW9ucwgFDSR0MDYwNDU5NjA1NTACXzMJAJQKAgkAzggCCQDOCAIFDXByb2ZpdEFjdGlvbnMJANEIAgURY2hlY2twb2ludEFjdGlvbnMAAAkBEF9zYXZlVXNlclByb2ZpdHMCBQR1c2VyBRJ1c2VyUHJvZml0c1VwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEGBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VucGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQELX3doZW5QYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEHBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVBhdXNlcgEHcGF1c2VyXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhx1cGRhdGVQYXVzZXI6IGludmFsaWQgcGF1c2VyBwMJAAACBQNlcnIFA2VycgkAlAoCCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF92YWxpZGF0ZUFkZHJlc3MCBQltdWx0aXNpZ18CHXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnyNsRw", "height": 3768854, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3PZ5WUPhUDxVQAPZ4s9mZiAu812Z7Ti5grFQPNtFWDEP Next: 9g24kHGUhfBYr166J1CHChYoTiY35nyLdSCSKgq96So1 Diff:
OldNewDifferences
12961296
12971297 let targetAmount = {
12981298 let $t03441034556 = {
1299- let $l = LIST_64
1299+ let $l = LIST_46
13001300 let $s = size($l)
13011301 let $acc0 = $Tuple4(false, ZERO_BIGINT, (toBigInt(lpAmount_) + prevFee), ZERO_BIGINT)
13021302 func $f0_1 ($a,$i) = if (($i >= $s))
13051305
13061306 func $f0_2 ($a,$i) = if (($i >= $s))
13071307 then $a
1308- else throw("List size exceeds 20")
1309-
1310- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
1308+ else throw("List size exceeds 46")
1309+
1310+ $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($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)
13111311 }
13121312 let success = $t03441034556._1
13131313 let startOut = $t03441034556._2
13841384 then targetAmount
13851385 else {
13861386 let $t03870138851 = {
1387- let $l = LIST_64
1387+ let $l = LIST_46
13881388 let $s = size($l)
13891389 let $acc0 = $Tuple5(false, ZERO_BIGINT, (sourceAmount_ + prevFee), ZERO_BIGINT, nil)
13901390 func $f0_1 ($a,$i) = if (($i >= $s))
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 = toBigInt(1000000)
1313
1414 let MAX_WEIGHT_AMPLIFIER = toBigInt(1000000)
1515
1616 let MAX_WEIGHT = 1000000
1717
1818 let SLIPPAGE_RATE_FACTOR = toBigInt(1000000)
1919
2020 let FEE_RATE_FACTOR = toBigInt(1000000)
2121
2222 let RATE_FACTOR = toBigInt(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_10 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
3333
3434 let ZERO_BIGINT_LIST_11 = (ZERO_BIGINT_LIST_10 :+ ZERO_BIGINT)
3535
3636 let INT_DECIMALS = 8
3737
3838 let BIGINT_DECIMALS = 18
3939
4040 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", "_")
4141
4242 let LIST_46 = 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", "_")
4343
4444 let KEY_MULTISIG = "MULTISIG"
4545
4646 let KEY_STATUS = "STATUS"
4747
4848 let KEY_PAUSED = "PAUSED"
4949
5050 let KEY_PAUSER = "PAUSER"
5151
5252 let KEY_STORAGE = "STORAGE"
5353
5454 let KEY_ASSETS = "ASSETS"
5555
5656 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
5757
5858 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5959
6060 let KEY_LP_FEE = "LP_FEE"
6161
6262 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
6363
6464 let KEY_PRECISION = "PRECISION"
6565
6666 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6767
6868 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6969
7070 let KEY_USER_LP = "USER_LP"
7171
7272 let KEY_TOTAL_LP = "TOTAL_LP"
7373
7474 let KEY_USER_PROFITS = "USER_PROFITS"
7575
7676 func _validateAddress (address_,err_) = match addressFromString(address_) {
7777 case a: Address =>
7878 true
7979 case _ =>
8080 throw(err_)
8181 }
8282
8383
8484 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
8585 then true
8686 else match assetInfo(fromBase58String(assetId_)) {
8787 case a: Asset =>
8888 true
8989 case _ =>
9090 throw(err_)
9191 }
9292
9393
9494 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
9595 then true
9696 else (val_ > upperBoundary_))
9797 then throw(err_)
9898 else true
9999
100100
101101 func _validateBool (val_,target_,err_) = if ((val_ != target_))
102102 then throw(err_)
103103 else true
104104
105105
106106 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
107107 then throw(err_)
108108 else true
109109
110110
111111 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
112112 then throw(err_)
113113 else true
114114
115115
116116 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
117117 func foldFunc (acc,elem) = match parseInt(elem) {
118118 case a: Int =>
119119 if (acc)
120120 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
121121 else false
122122 case _ =>
123123 throw(err_)
124124 }
125125
126126 let $l = val_
127127 let $s = size($l)
128128 let $acc0 = true
129129 func $f0_1 ($a,$i) = if (($i >= $s))
130130 then $a
131131 else foldFunc($a, $l[$i])
132132
133133 func $f0_2 ($a,$i) = if (($i >= $s))
134134 then $a
135135 else throw("List size exceeds 10")
136136
137137 $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)
138138 }
139139
140140
141141 func _validateAssets (assets_,err_) = {
142142 func foldFunc (acc,elem) = if (acc)
143143 then _validateAsset(elem, err_)
144144 else false
145145
146146 let $l = assets_
147147 let $s = size($l)
148148 let $acc0 = true
149149 func $f0_1 ($a,$i) = if (($i >= $s))
150150 then $a
151151 else foldFunc($a, $l[$i])
152152
153153 func $f0_2 ($a,$i) = if (($i >= $s))
154154 then $a
155155 else throw("List size exceeds 10")
156156
157157 $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)
158158 }
159159
160160
161161 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
162162 then throw(err_)
163163 else true
164164
165165
166166 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
167167 then true
168168 else (size(val_) > 16))
169169 then throw(err_)
170170 else true
171171
172172
173173 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
174174 then throw(err_)
175175 else true
176176
177177
178178 func _validateDecimals (val_,err_) = if (if ((0 > val_))
179179 then true
180180 else (val_ > 8))
181181 then throw(err_)
182182 else true
183183
184184
185185 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
186186 case a: ByteVector =>
187187 if ((assetId_ != toBase58String(a)))
188188 then throw((err_ + ": asset"))
189189 else if ((requiredAmount_ > payment_.amount))
190190 then throw((err_ + ": amount"))
191191 else true
192192 case _ =>
193193 throw((err_ + ": asset"))
194194 }
195195
196196
197197 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
198198 then throw(err_)
199199 else true
200200
201201
202202 func _assetToStr (asset_) = match asset_ {
203203 case a: ByteVector =>
204204 toBase58String(a)
205205 case _ =>
206206 WAVES
207207 }
208208
209209
210210 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
211211 then true
212212 else (asset_ == ""))
213213 then unit
214214 else fromBase58String(asset_)
215215
216216
217217 func _loadPause () = match getBoolean(KEY_PAUSED) {
218218 case a: Boolean =>
219219 a
220220 case _ =>
221221 false
222222 }
223223
224224
225225 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
226226
227227
228228 func _loadPauser () = match getString(KEY_PAUSER) {
229229 case a: String =>
230230 addressFromStringValue(a)
231231 case _ =>
232232 Address(base58'')
233233 }
234234
235235
236236 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
237237
238238
239239 func _loadMultisig () = match getString(KEY_MULTISIG) {
240240 case a: String =>
241241 addressFromStringValue(a)
242242 case _ =>
243243 Address(base58'')
244244 }
245245
246246
247247 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
248248
249249
250250 func _loadStorage () = match getString(KEY_STORAGE) {
251251 case a: String =>
252252 let struct = split(a, SEP)
253253 $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseBigIntValue(struct[5]), parseBigIntValue(struct[6]), parseBigIntValue(struct[7]), parseBigIntValue(struct[8]), addressFromStringValue(struct[9]))
254254 case _ =>
255255 $Tuple10(base58'', false, 0, 0, 0, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, Address(base58''))
256256 }
257257
258258
259259 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
260260 then "1"
261261 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))]
262262
263263
264264 func _loadAssets () = match getString(KEY_ASSETS) {
265265 case a: String =>
266266 if ((size(a) > 0))
267267 then split_51C(a, SEP)
268268 else nil
269269 case _ =>
270270 nil
271271 }
272272
273273
274274 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
275275
276276
277277 func _loadAssetBalances () = {
278278 func foldFunc (acc,elem) = {
279279 let balance = parseBigIntValue(elem)
280280 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
281281 }
282282
283283 match getString(KEY_ASSET_BALANCES) {
284284 case a: String =>
285285 if ((size(a) > 0))
286286 then {
287287 let $l = split_51C(a, SEP)
288288 let $s = size($l)
289289 let $acc0 = $Tuple2(nil, ZERO_BIGINT)
290290 func $f0_1 ($a,$i) = if (($i >= $s))
291291 then $a
292292 else foldFunc($a, $l[$i])
293293
294294 func $f0_2 ($a,$i) = if (($i >= $s))
295295 then $a
296296 else throw("List size exceeds 10")
297297
298298 $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)
299299 }
300300 else $Tuple2(ZERO_BIGINT_LIST_10, ZERO_BIGINT)
301301 case _ =>
302302 $Tuple2(ZERO_BIGINT_LIST_10, ZERO_BIGINT)
303303 }
304304 }
305305
306306
307307 func _saveAssetBalances (balances_) = {
308308 func foldFunc (acc,elem) = (acc :+ toString(elem))
309309
310310 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
311311 let $l = balances_
312312 let $s = size($l)
313313 let $acc0 = nil
314314 func $f0_1 ($a,$i) = if (($i >= $s))
315315 then $a
316316 else foldFunc($a, $l[$i])
317317
318318 func $f0_2 ($a,$i) = if (($i >= $s))
319319 then $a
320320 else throw("List size exceeds 10")
321321
322322 $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)
323323 }, SEP))]
324324 }
325325
326326
327327 func _loadAssetWeights () = {
328328 func foldFunc (acc,elem) = {
329329 let weight = parseIntValue(elem)
330330 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
331331 }
332332
333333 match getString(KEY_ASSET_WEIGHTS) {
334334 case a: String =>
335335 if ((size(a) > 0))
336336 then {
337337 let $l = split_51C(a, SEP)
338338 let $s = size($l)
339339 let $acc0 = $Tuple2(nil, 0)
340340 func $f0_1 ($a,$i) = if (($i >= $s))
341341 then $a
342342 else foldFunc($a, $l[$i])
343343
344344 func $f0_2 ($a,$i) = if (($i >= $s))
345345 then $a
346346 else throw("List size exceeds 10")
347347
348348 $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)
349349 }
350350 else $Tuple2(ZERO_INT_LIST_10, 0)
351351 case _ =>
352352 $Tuple2(ZERO_INT_LIST_10, 0)
353353 }
354354 }
355355
356356
357357 func _saveAssetWeights (weights_) = {
358358 func foldFunc (acc,elem) = (acc :+ toString(elem))
359359
360360 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
361361 let $l = weights_
362362 let $s = size($l)
363363 let $acc0 = nil
364364 func $f0_1 ($a,$i) = if (($i >= $s))
365365 then $a
366366 else foldFunc($a, $l[$i])
367367
368368 func $f0_2 ($a,$i) = if (($i >= $s))
369369 then $a
370370 else throw("List size exceeds 10")
371371
372372 $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)
373373 }, SEP))]
374374 }
375375
376376
377377 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
378378 case a: Int =>
379379 a
380380 case _ =>
381381 0
382382 }
383383
384384
385385 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
386386
387387
388388 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
389389 case a: Int =>
390390 a
391391 case _ =>
392392 0
393393 }
394394
395395
396396 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
397397
398398
399399 func _loadPrecision () = match getInteger(KEY_PRECISION) {
400400 case a: Int =>
401401 a
402402 case _ =>
403403 0
404404 }
405405
406406
407407 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
408408
409409
410410 func _loadSigmaFeePerLp () = {
411411 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
412412
413413 match getString(KEY_SIGMA_FEE_PER_LP) {
414414 case a: String =>
415415 if ((size(a) > 0))
416416 then {
417417 let $l = split_51C(a, SEP)
418418 let $s = size($l)
419419 let $acc0 = nil
420420 func $f0_1 ($a,$i) = if (($i >= $s))
421421 then $a
422422 else foldFunc($a, $l[$i])
423423
424424 func $f0_2 ($a,$i) = if (($i >= $s))
425425 then $a
426426 else throw("List size exceeds 11")
427427
428428 $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)
429429 }
430430 else ZERO_BIGINT_LIST_11
431431 case _ =>
432432 ZERO_BIGINT_LIST_11
433433 }
434434 }
435435
436436
437437 func _saveSigmaFeePerLp (val_) = {
438438 func foldFunc (acc,elem) = (acc :+ toString(elem))
439439
440440 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
441441 let $l = val_
442442 let $s = size($l)
443443 let $acc0 = nil
444444 func $f0_1 ($a,$i) = if (($i >= $s))
445445 then $a
446446 else foldFunc($a, $l[$i])
447447
448448 func $f0_2 ($a,$i) = if (($i >= $s))
449449 then $a
450450 else throw("List size exceeds 11")
451451
452452 $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)
453453 }, SEP))]
454454 }
455455
456456
457457 func _loadUserSigmaFeePerLp (user_) = {
458458 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
459459
460460 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
461461 case a: String =>
462462 if ((size(a) > 0))
463463 then {
464464 let $l = split_51C(a, SEP)
465465 let $s = size($l)
466466 let $acc0 = nil
467467 func $f0_1 ($a,$i) = if (($i >= $s))
468468 then $a
469469 else foldFunc($a, $l[$i])
470470
471471 func $f0_2 ($a,$i) = if (($i >= $s))
472472 then $a
473473 else throw("List size exceeds 11")
474474
475475 $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)
476476 }
477477 else ZERO_BIGINT_LIST_11
478478 case _ =>
479479 ZERO_BIGINT_LIST_11
480480 }
481481 }
482482
483483
484484 func _saveUserSigmaFeePerLp (user_,val_) = {
485485 func foldFunc (acc,elem) = (acc :+ toString(elem))
486486
487487 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
488488 let $l = val_
489489 let $s = size($l)
490490 let $acc0 = nil
491491 func $f0_1 ($a,$i) = if (($i >= $s))
492492 then $a
493493 else foldFunc($a, $l[$i])
494494
495495 func $f0_2 ($a,$i) = if (($i >= $s))
496496 then $a
497497 else throw("List size exceeds 11")
498498
499499 $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)
500500 }, SEP))]
501501 }
502502
503503
504504 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
505505 case a: Int =>
506506 a
507507 case _ =>
508508 0
509509 }
510510
511511
512512 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
513513
514514
515515 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
516516 case a: Int =>
517517 a
518518 case _ =>
519519 0
520520 }
521521
522522
523523 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
524524
525525
526526 func _loadUserProfits (user_) = {
527527 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
528528
529529 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
530530 case a: String =>
531531 if ((size(a) > 0))
532532 then {
533533 let $l = split_51C(a, SEP)
534534 let $s = size($l)
535535 let $acc0 = nil
536536 func $f0_1 ($a,$i) = if (($i >= $s))
537537 then $a
538538 else foldFunc($a, $l[$i])
539539
540540 func $f0_2 ($a,$i) = if (($i >= $s))
541541 then $a
542542 else throw("List size exceeds 11")
543543
544544 $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)
545545 }
546546 else ZERO_INT_LIST_11
547547 case _ =>
548548 ZERO_INT_LIST_11
549549 }
550550 }
551551
552552
553553 func _saveUserProfits (user_,val_) = {
554554 func foldFunc (acc,elem) = (acc :+ toString(elem))
555555
556556 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
557557 let $l = val_
558558 let $s = size($l)
559559 let $acc0 = nil
560560 func $f0_1 ($a,$i) = if (($i >= $s))
561561 then $a
562562 else foldFunc($a, $l[$i])
563563
564564 func $f0_2 ($a,$i) = if (($i >= $s))
565565 then $a
566566 else throw("List size exceeds 11")
567567
568568 $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)
569569 }, SEP))]
570570 }
571571
572572
573573 func _onlyThisContract (caller_) = if ((caller_ != this))
574574 then throw("_onlyThisContract: revert")
575575 else true
576576
577577
578578 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
579579 then throw("_whenMultisigSet: revert")
580580 else true
581581
582582
583583 func _whenNotInitialized () = {
584584 let storage = _loadStorage()
585585 if ((storage._1 != base58''))
586586 then throw("_whenNotInitialized: revert")
587587 else true
588588 }
589589
590590
591591 func _whenInitialized () = {
592592 let storage = _loadStorage()
593593 if ((storage._1 == base58''))
594594 then throw("_whenInitialized: revert")
595595 else true
596596 }
597597
598598
599599 func _whenNotPaused () = if (_loadPause())
600600 then throw("_whenNotPaused: revert")
601601 else true
602602
603603
604604 func _whenPaused () = if (!(_loadPause()))
605605 then throw("_whenPaused: revert")
606606 else true
607607
608608
609609 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
610610 then throw("_onlyPauser: revert")
611611 else true
612612
613613
614614 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
615615 case a: Asset =>
616616 a.decimals
617617 case _ =>
618618 throw(("_getDecimals: no asset=" + assetId_))
619619 }
620620
621621
622622 func _pow10 (exponent_) = match exponent_ {
623623 case _ =>
624624 if ((8 == $match0))
625625 then 100000000
626626 else if ((7 == $match0))
627627 then 10000000
628628 else if ((6 == $match0))
629629 then 1000000
630630 else if ((5 == $match0))
631631 then 100000
632632 else if ((4 == $match0))
633633 then 10000
634634 else if ((3 == $match0))
635635 then 1000
636636 else if ((2 == $match0))
637637 then 100
638638 else if ((1 == $match0))
639639 then 10
640640 else if ((0 == $match0))
641641 then 1
642642 else throw(("_pow10: revert: " + toString(exponent_)))
643643 }
644644
645645
646646 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
647647 then fraction(amount_, toBigInt(1), toBigInt(_pow10((sourceDecimals_ - targetDecimals_))), round_)
648648 else (amount_ * toBigInt(_pow10((targetDecimals_ - sourceDecimals_))))
649649
650650
651651 func _prepareAssetBalances (assets_) = {
652652 func foldFunc (acc,elem) = (acc :+ ZERO_BIGINT)
653653
654654 let $l = assets_
655655 let $s = size($l)
656656 let $acc0 = nil
657657 func $f0_1 ($a,$i) = if (($i >= $s))
658658 then $a
659659 else foldFunc($a, $l[$i])
660660
661661 func $f0_2 ($a,$i) = if (($i >= $s))
662662 then $a
663663 else throw("List size exceeds 10")
664664
665665 $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)
666666 }
667667
668668
669669 func _prepareAssetWeights (assetWeights_) = {
670670 func foldFunc (acc,elem) = {
671671 let weight = parseIntValue(elem)
672672 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
673673 }
674674
675675 let $l = assetWeights_
676676 let $s = size($l)
677677 let $acc0 = $Tuple2(nil, 0)
678678 func $f0_1 ($a,$i) = if (($i >= $s))
679679 then $a
680680 else foldFunc($a, $l[$i])
681681
682682 func $f0_2 ($a,$i) = if (($i >= $s))
683683 then $a
684684 else throw("List size exceeds 10")
685685
686686 $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)
687687 }
688688
689689
690690 func _listIntToString (assets_) = {
691691 func foldFunc (acc,elem) = (acc :+ toString(elem))
692692
693693 makeString_11C({
694694 let $l = assets_
695695 let $s = size($l)
696696 let $acc0 = nil
697697 func $f0_1 ($a,$i) = if (($i >= $s))
698698 then $a
699699 else foldFunc($a, $l[$i])
700700
701701 func $f0_2 ($a,$i) = if (($i >= $s))
702702 then $a
703703 else throw("List size exceeds 65")
704704
705705 $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($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), 65)
706706 }, SEP)
707707 }
708708
709709
710710 func _listBigIntToString (assets_) = {
711711 func foldFunc (acc,elem) = (acc :+ toString(elem))
712712
713713 makeString({
714714 let $l = assets_
715715 let $s = size($l)
716716 let $acc0 = nil
717717 func $f0_1 ($a,$i) = if (($i >= $s))
718718 then $a
719719 else foldFunc($a, $l[$i])
720720
721721 func $f0_2 ($a,$i) = if (($i >= $s))
722722 then $a
723723 else throw("List size exceeds 65")
724724
725725 $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($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), 65)
726726 }, SEP)
727727 }
728728
729729
730730 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
731731 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, toBigInt(elem), toBigInt(sigmaWeight_)))
732732
733733 let $l = weights_
734734 let $s = size($l)
735735 let $acc0 = nil
736736 func $f0_1 ($a,$i) = if (($i >= $s))
737737 then $a
738738 else foldFunc($a, $l[$i])
739739
740740 func $f0_2 ($a,$i) = if (($i >= $s))
741741 then $a
742742 else throw("List size exceeds 10")
743743
744744 $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)
745745 }
746746
747747
748748 func _incrementBalancesByAmounts (balances_,amounts_) = {
749749 func foldFunc (acc,elem) = {
750750 let index = acc._1
751751 let amount = amounts_[index]
752752 let newBalance = (elem + amount)
753753 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
754754 }
755755
756756 let result = {
757757 let $l = balances_
758758 let $s = size($l)
759759 let $acc0 = $Tuple3(0, nil, ZERO_BIGINT)
760760 func $f0_1 ($a,$i) = if (($i >= $s))
761761 then $a
762762 else foldFunc($a, $l[$i])
763763
764764 func $f0_2 ($a,$i) = if (($i >= $s))
765765 then $a
766766 else throw("List size exceeds 10")
767767
768768 $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)
769769 }
770770 $Tuple2(result._2, result._3)
771771 }
772772
773773
774774 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
775775 func foldFunc (acc,elem) = {
776776 let index = acc._1
777777 let payment = payments_[index]
778778 let paymentAssetStr = _assetToStr(payment.assetId)
779779 let err = if ((paymentAssetStr != assets_[index]))
780780 then throw(((err_ + ": index=") + toString(index)))
781781 else unit
782782 if ((err == err))
783783 then {
784784 let assetDecimals = _getDecimals(paymentAssetStr)
785785 let newBalance = (elem + _normalizeDecimals(toBigInt(payments_[index].amount), assetDecimals, decimals_, DOWN))
786786 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
787787 }
788788 else throw("Strict value is not equal to itself.")
789789 }
790790
791791 let result = {
792792 let $l = balances_
793793 let $s = size($l)
794794 let $acc0 = $Tuple3(0, nil, ZERO_BIGINT)
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 _incrementBalanceByIndex (balances_,index_,amount_) = {
810810 func foldFunc (acc,elem) = {
811811 let index = acc._1
812812 if ((index == index_))
813813 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
814814 else $Tuple2((index + 1), (acc._2 :+ elem))
815815 }
816816
817817 let result = {
818818 let $l = balances_
819819 let $s = size($l)
820820 let $acc0 = $Tuple2(0, nil)
821821 func $f0_1 ($a,$i) = if (($i >= $s))
822822 then $a
823823 else foldFunc($a, $l[$i])
824824
825825 func $f0_2 ($a,$i) = if (($i >= $s))
826826 then $a
827827 else throw("List size exceeds 10")
828828
829829 $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)
830830 }
831831 result._2
832832 }
833833
834834
835835 func _decrementBalanceByIndex (balances_,index_,amount_) = {
836836 func foldFunc (acc,elem) = {
837837 let index = acc._1
838838 if ((index == index_))
839839 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
840840 else $Tuple2((index + 1), (acc._2 :+ elem))
841841 }
842842
843843 let result = {
844844 let $l = balances_
845845 let $s = size($l)
846846 let $acc0 = $Tuple2(0, nil)
847847 func $f0_1 ($a,$i) = if (($i >= $s))
848848 then $a
849849 else foldFunc($a, $l[$i])
850850
851851 func $f0_2 ($a,$i) = if (($i >= $s))
852852 then $a
853853 else throw("List size exceeds 10")
854854
855855 $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)
856856 }
857857 result._2
858858 }
859859
860860
861861 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
862862 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
863863 func foldFunc (acc,elem) = {
864864 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
865865 let deltaBalance = (elem - newBalance)
866866 $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
867867 }
868868
869869 let $l = balances_
870870 let $s = size($l)
871871 let $acc0 = $Tuple3(nil, ZERO_BIGINT, nil)
872872 func $f0_1 ($a,$i) = if (($i >= $s))
873873 then $a
874874 else foldFunc($a, $l[$i])
875875
876876 func $f0_2 ($a,$i) = if (($i >= $s))
877877 then $a
878878 else throw("List size exceeds 10")
879879
880880 $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)
881881 }
882882
883883
884884 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
885885 func foldFunc (acc,elem) = {
886886 let index = acc._1
887887 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, toInt(_normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN)), _strToAsset(elem))))
888888 }
889889
890890 let result = {
891891 let $l = assets_
892892 let $s = size($l)
893893 let $acc0 = $Tuple2(0, nil)
894894 func $f0_1 ($a,$i) = if (($i >= $s))
895895 then $a
896896 else foldFunc($a, $l[$i])
897897
898898 func $f0_2 ($a,$i) = if (($i >= $s))
899899 then $a
900900 else throw("List size exceeds 10")
901901
902902 $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)
903903 }
904904 result._2
905905 }
906906
907907
908908 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
909909 then {
910910 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
911911 if ((threshold > balance_))
912912 then {
913913 let maxDeviation = (threshold - balance_)
914914 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
915915 if ((feeRate > feeMaxRate_))
916916 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
917917 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
918918 }
919919 else ZERO_BIGINT
920920 }
921921 else {
922922 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
923923 if ((balance_ > threshold))
924924 then {
925925 let maxDeviation = (balance_ - threshold)
926926 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
927927 if ((feeRate > feeMaxRate_))
928928 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
929929 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
930930 }
931931 else ZERO_BIGINT
932932 }
933933
934934
935935 func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
936936 func foldFunc (acc,balance) = {
937937 let index = acc._1
938938 let equilibrium = fraction(assetsTotalSupply_, toBigInt(weights_[index]), toBigInt(sigmaWeight_))
939939 $Tuple2((index + 1), (acc._2 + _calculateMicroFee(balance, equilibrium, weightAmplifier_, slippageRate_, feeMaxRate_)))
940940 }
941941
942942 let result = {
943943 let $l = balances_
944944 let $s = size($l)
945945 let $acc0 = $Tuple2(0, ZERO_BIGINT)
946946 func $f0_1 ($a,$i) = if (($i >= $s))
947947 then $a
948948 else foldFunc($a, $l[$i])
949949
950950 func $f0_2 ($a,$i) = if (($i >= $s))
951951 then $a
952952 else throw("List size exceeds 10")
953953
954954 $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)
955955 }
956956 result._2
957957 }
958958
959959
960960 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
961961 then true
962962 else (lpTotalSupply_ == 0))
963963 then true
964964 else {
965965 let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, toBigInt(prevLpTotalSupply_))
966966 let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, toBigInt(lpTotalSupply_))
967967 let diff = (newAssetsRate - prevAssetsRate)
968968 if (if ((ZERO_BIGINT >= diff))
969969 then ((toBigInt(-1) * toBigInt(_loadPrecision())) > diff)
970970 else false)
971971 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
972972 else true
973973 }
974974
975975
976976 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
977977 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
978978 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
979979 let diff = (newUtil - prevUtil)
980980 if (if ((ZERO_BIGINT >= diff))
981981 then ((toBigInt(-1) * toBigInt(_loadPrecision())) > diff)
982982 else false)
983983 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
984984 else true
985985 }
986986
987987
988988 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
989989 let equilibrium = fraction(assetTotalSupply_, toBigInt(weight_), toBigInt(sigmaWeight_))
990990 let maxAllocationAmp = if ((balance_ > equilibrium))
991991 then (MAX_AMPLIFIER + maxAllocAmp_)
992992 else (MAX_AMPLIFIER - maxAllocAmp_)
993993 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
994994 let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, toBigInt(weight_), toBigInt(sigmaWeight_)), maxAllocationAmp, MAX_AMPLIFIER)
995995 if ((balance_ > equilibrium))
996996 then if ((balance_ > maxAllocation))
997997 then if ((prevMaxAllocation > prevBalance_))
998998 then throw("_validateAssetAllocation: new up")
999999 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
10001000 then throw("_validateAssetAllocation: still up")
10011001 else true
10021002 else true
10031003 else if ((maxAllocation > balance_))
10041004 then if ((prevBalance_ > prevMaxAllocation))
10051005 then throw("_validateAssetAllocation: new down")
10061006 else if (((maxAllocation - balance_) > (prevMaxAllocation - prevBalance_)))
10071007 then throw("_validateAssetAllocation: still down")
10081008 else true
10091009 else true
10101010 }
10111011
10121012
10131013 func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = {
10141014 func foldFunc (acc,elem) = {
10151015 let index = acc._1
10161016 $Tuple2((index + 1), if (acc._2)
10171017 then _validateAssetAllocation(elem, assetTotalSupply_, prevAssetBalances_[index], prevAssetTotalSupply_, assetWeights_[index], sigmaWeight_, maxAllocAmp_)
10181018 else false)
10191019 }
10201020
10211021 let result = {
10221022 let $l = assetBalances_
10231023 let $s = size($l)
10241024 let $acc0 = $Tuple2(0, true)
10251025 func $f0_1 ($a,$i) = if (($i >= $s))
10261026 then $a
10271027 else foldFunc($a, $l[$i])
10281028
10291029 func $f0_2 ($a,$i) = if (($i >= $s))
10301030 then $a
10311031 else throw("List size exceeds 10")
10321032
10331033 $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)
10341034 }
10351035 result._2
10361036 }
10371037
10381038
10391039 func _checkpoint (user_) = {
10401040 let userLp = _loadUserLp(user_)
10411041 let userProfits = _loadUserProfits(user_)
10421042 let sigmaFeePerLp = _loadSigmaFeePerLp()
10431043 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10441044 func foldFunc (acc,elem) = {
10451045 let index = acc._1
10461046 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10471047 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10481048 }
10491049
10501050 let $t02542325496 = {
10511051 let $l = ZERO_INT_LIST_11
10521052 let $s = size($l)
10531053 let $acc0 = $Tuple2(0, nil)
10541054 func $f0_1 ($a,$i) = if (($i >= $s))
10551055 then $a
10561056 else foldFunc($a, $l[$i])
10571057
10581058 func $f0_2 ($a,$i) = if (($i >= $s))
10591059 then $a
10601060 else throw("List size exceeds 11")
10611061
10621062 $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)
10631063 }
10641064 let idx = $t02542325496._1
10651065 let profitsUpdated = $t02542325496._2
10661066 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10671067 }
10681068
10691069
10701070 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10711071 func foldFunc (acc,elem) = {
10721072 let index = acc._1
10731073 let sigmaFeePerLpUpdated = if ((index_ == index))
10741074 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10751075 else sigmaFeePerLp_[index]
10761076 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10771077 }
10781078
10791079 let $t02614626225 = {
10801080 let $l = ZERO_INT_LIST_11
10811081 let $s = size($l)
10821082 let $acc0 = $Tuple2(0, nil)
10831083 func $f0_1 ($a,$i) = if (($i >= $s))
10841084 then $a
10851085 else foldFunc($a, $l[$i])
10861086
10871087 func $f0_2 ($a,$i) = if (($i >= $s))
10881088 then $a
10891089 else throw("List size exceeds 11")
10901090
10911091 $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)
10921092 }
10931093 let idx = $t02614626225._1
10941094 let sigmaFeePerLpUpdated = $t02614626225._2
10951095 sigmaFeePerLpUpdated
10961096 }
10971097
10981098
10991099 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
11001100 let sigmaFeePerLp = _loadSigmaFeePerLp()
11011101 let totalLp = _loadTotalLp()
11021102 let $t02644626721 = if ((totalLp == 0))
11031103 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
11041104 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
11051105 let lpFee = $t02644626721._1
11061106 let protocolFee = $t02644626721._2
11071107 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11081108 then sigmaFeePerLp
11091109 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11101110 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11111111 }
11121112
11131113
11141114 func _depositAll (amount_) = {
11151115 let storage = _loadStorage()
11161116 let lpTotalSupply = storage._3
11171117 let weightAmplifier = storage._7
11181118 let slippageRate = storage._8
11191119 let feeMaxRate = storage._9
11201120 let assets = _loadAssets()
11211121 let $t02723027283 = _loadAssetWeights()
11221122 let assetWeights = $t02723027283._1
11231123 let sigmaWeight = $t02723027283._2
11241124 let $t02728827356 = _loadAssetBalances()
11251125 let prevAssetBalances = $t02728827356._1
11261126 let prevAssetTotalSupply = $t02728827356._2
11271127 let $t02736228608 = if ((prevAssetTotalSupply == ZERO_BIGINT))
11281128 then {
11291129 func foldFunc (acc,elem) = {
11301130 let index = acc._1
11311131 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11321132 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11331133 }
11341134
11351135 let $t02781727891 = {
11361136 let $l = assets
11371137 let $s = size($l)
11381138 let $acc0 = $Tuple2(0, nil)
11391139 func $f0_1 ($a,$i) = if (($i >= $s))
11401140 then $a
11411141 else foldFunc($a, $l[$i])
11421142
11431143 func $f0_2 ($a,$i) = if (($i >= $s))
11441144 then $a
11451145 else throw("List size exceeds 10")
11461146
11471147 $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)
11481148 }
11491149 let idx = $t02781727891._1
11501150 let requiredAmountsNormalized = $t02781727891._2
11511151 $Tuple2(amount_, requiredAmountsNormalized)
11521152 }
11531153 else {
11541154 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, prevAssetTotalSupply)
11551155 func foldFunc1 (acc,elem) = {
11561156 let index = acc._1
11571157 let requiredAmountNormalized = fraction(ratio, prevAssetBalances[index], PERCENT_FACTOR)
11581158 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11591159 }
11601160
11611161 let $t02840728482 = {
11621162 let $l = assets
11631163 let $s = size($l)
11641164 let $acc0 = $Tuple2(0, nil)
11651165 func $f0_1 ($a,$i) = if (($i >= $s))
11661166 then $a
11671167 else foldFunc1($a, $l[$i])
11681168
11691169 func $f0_2 ($a,$i) = if (($i >= $s))
11701170 then $a
11711171 else throw("List size exceeds 10")
11721172
11731173 $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)
11741174 }
11751175 let idx = $t02840728482._1
11761176 let requiredAmountsNormalized = $t02840728482._2
11771177 $Tuple2(toInt(fraction(toBigInt(amount_), toBigInt(lpTotalSupply), prevAssetTotalSupply)), requiredAmountsNormalized)
11781178 }
11791179 let lpTokensToMint = $t02736228608._1
11801180 let requiredAmountsNormalized = $t02736228608._2
11811181 let $t02861428727 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
11821182 let assetBalances = $t02861428727._1
11831183 let assetTotalSupply = $t02861428727._2
11841184 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11851185 if ((err2 == err2))
11861186 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11871187 else throw("Strict value is not equal to itself.")
11881188 }
11891189
11901190
11911191 func _deposit (assetId_,amount_) = {
11921192 let storage = _loadStorage()
11931193 let lpTotalSupply = storage._3
11941194 let maxAllocAmplifier = storage._6
11951195 let weightAmplifier = storage._7
11961196 let slippageRate = storage._8
11971197 let feeMaxRate = storage._9
11981198 let assets = _loadAssets()
11991199 let $t02942529478 = _loadAssetWeights()
12001200 let assetWeights = $t02942529478._1
12011201 let sigmaWeight = $t02942529478._2
12021202 let $t02948329597 = _loadAssetBalances()
12031203 let prevAssetBalances = $t02948329597._1
12041204 let prevAssetTotalSupply = $t02948329597._2
12051205 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12061206 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12071207 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12081208 if ((err2 == err2))
12091209 then {
12101210 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12111211 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12121212 let lpTokensToMint = if ((lpTotalSupply == 0))
12131213 then toInt((assetTotalSupply - fee))
12141214 else {
12151215 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12161216 let feeDiff = (fee - prevFee)
12171217 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12181218 let lpTokensToMintInner = toInt(fraction(toBigInt(lpTotalSupply), utilityChangeFactor, RATE_FACTOR))
12191219 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12201220 if ((err3 == err3))
12211221 then lpTokensToMintInner
12221222 else throw("Strict value is not equal to itself.")
12231223 }
12241224 $Tuple2(lpTokensToMint, assetBalances)
12251225 }
12261226 else throw("Strict value is not equal to itself.")
12271227 }
12281228
12291229
12301230 func _withdrawAll (amount_) = {
12311231 let storage = _loadStorage()
12321232 let lpTotalSupply = storage._3
12331233 let lpFeeRate = storage._4
12341234 let protocolFeeRate = storage._5
12351235 let maxAllocAmplifier = storage._6
12361236 let weightAmplifier = storage._7
12371237 let slippageRate = storage._8
12381238 let feeMaxRate = storage._9
12391239 let $t03160731675 = _loadAssetBalances()
12401240 let prevAssetBalances = $t03160731675._1
12411241 let prevAssetTotalSupply = $t03160731675._2
12421242 let $t03168031733 = _loadAssetWeights()
12431243 let assetWeights = $t03168031733._1
12441244 let sigmaWeight = $t03168031733._2
12451245 let lpTokensToBurn = amount_
12461246 let $t03177231927 = _decrementBalancesByLpAmount(prevAssetBalances, toBigInt(lpTokensToBurn), toBigInt(lpTotalSupply))
12471247 let assetBalances = $t03177231927._1
12481248 let assetTotalSupply = $t03177231927._2
12491249 let balancesToPay = $t03177231927._3
12501250 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12511251 if ((err2 == err2))
12521252 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12531253 else throw("Strict value is not equal to itself.")
12541254 }
12551255
12561256
12571257 func _withdraw (assetId_,lpAmount_) = {
12581258 let storage = _loadStorage()
12591259 let lpTotalSupply = storage._3
12601260 let lpFeeRate = storage._4
12611261 let protocolFeeRate = storage._5
12621262 let maxAllocAmplifier = storage._6
12631263 let weightAmplifier = storage._7
12641264 let slippageRate = storage._8
12651265 let feeMaxRate = storage._9
12661266 let precision = _loadPrecision()
12671267 let assets = _loadAssets()
12681268 let $t03271932787 = _loadAssetBalances()
12691269 let prevAssetBalances = $t03271932787._1
12701270 let prevAssetTotalSupply = $t03271932787._2
12711271 let $t03279232845 = _loadAssetWeights()
12721272 let assetWeights = $t03279232845._1
12731273 let sigmaWeight = $t03279232845._2
12741274 let targetAssetIndex = value(indexOf(assets, assetId_))
12751275 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12761276 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12771277 let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
12781278 let prevUtilValueWithK = fraction(prevUtilValue, k, PERCENT_FACTOR)
12791279 func foldFunc (acc,elem) = if (acc._1)
12801280 then acc
12811281 else {
12821282 let startInner = acc._2
12831283 let stopInner = acc._3
12841284 let currentAmount = ((stopInner + startInner) / toBigInt(2))
12851285 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
12861286 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
12871287 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
12881288 if (if ((toBigInt(precision) > (utilValue - prevUtilValueWithK)))
12891289 then ((utilValue - prevUtilValueWithK) >= ZERO_BIGINT)
12901290 else false)
12911291 then $Tuple4(true, startInner, stopInner, currentAmount)
12921292 else if ((ZERO_BIGINT > (utilValue - prevUtilValueWithK)))
12931293 then $Tuple4(false, startInner, currentAmount, ZERO_BIGINT)
12941294 else $Tuple4(false, currentAmount, stopInner, ZERO_BIGINT)
12951295 }
12961296
12971297 let targetAmount = {
12981298 let $t03441034556 = {
1299- let $l = LIST_64
1299+ let $l = LIST_46
13001300 let $s = size($l)
13011301 let $acc0 = $Tuple4(false, ZERO_BIGINT, (toBigInt(lpAmount_) + prevFee), ZERO_BIGINT)
13021302 func $f0_1 ($a,$i) = if (($i >= $s))
13031303 then $a
13041304 else foldFunc($a, $l[$i])
13051305
13061306 func $f0_2 ($a,$i) = if (($i >= $s))
13071307 then $a
1308- else throw("List size exceeds 20")
1309-
1310- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
1308+ else throw("List size exceeds 46")
1309+
1310+ $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($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)
13111311 }
13121312 let success = $t03441034556._1
13131313 let startOut = $t03441034556._2
13141314 let stopOut = $t03441034556._3
13151315 let targetAmountOut = $t03441034556._4
13161316 if (!(success))
13171317 then throw(("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)))
13181318 else targetAmountOut
13191319 }
13201320 let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13211321 let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
13221322 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
13231323 then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13241324 else false
13251325 if ((err1 == err1))
13261326 then {
13271327 let $t03543135579 = _calculateLpAndProtocolFees((targetAssetIndex + 1), toInt(targetAmount), lpFeeRate, protocolFeeRate)
13281328 let lpFee = $t03543135579._1
13291329 let protocolFee = $t03543135579._2
13301330 let sigmaFeePerLpUpdated = $t03543135579._3
13311331 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13321332 }
13331333 else throw("Strict value is not equal to itself.")
13341334 }
13351335
13361336
13371337 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13381338 let storage = _loadStorage()
13391339 let lpAssetId = storage._1
13401340 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13411341 let lpTotalSupply = storage._3
13421342 let lpFeeRate = storage._4
13431343 let protocolFeeRate = storage._5
13441344 let maxAllocAmplifier = storage._6
13451345 let weightAmplifier = storage._7
13461346 let slippageRate = storage._8
13471347 let feeMaxRate = storage._9
13481348 let precision = _loadPrecision()
13491349 let $t03616436232 = _loadAssetBalances()
13501350 let prevAssetBalances = $t03616436232._1
13511351 let prevAssetTotalSupply = $t03616436232._2
13521352 let $t03623736290 = _loadAssetWeights()
13531353 let assetWeights = $t03623736290._1
13541354 let sigmaWeight = $t03623736290._2
13551355 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13561356 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13571357 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13581358 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13591359 func foldFunc (acc,elem) = if (acc._1)
13601360 then acc
13611361 else {
13621362 let startInner = acc._2
13631363 let stopInner = acc._3
13641364 let currentAmount = ((stopInner + startInner) / toBigInt(2))
13651365 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
13661366 let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
13671367 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
13681368 if (if ((toBigInt(precision) > (utilValue - prevUtilValue)))
13691369 then ((utilValue - prevUtilValue) >= ZERO_BIGINT)
13701370 else false)
13711371 then $Tuple4(true, startInner, stopInner, currentAmount)
13721372 else if ((ZERO_BIGINT > (utilValue - prevUtilValue)))
13731373 then $Tuple5(false, startInner, currentAmount, currentAmount, (acc._5 :+ utilValue))
13741374 else $Tuple5(false, currentAmount, stopInner, currentAmount, (acc._5 :+ utilValue))
13751375 }
13761376
13771377 let targetAmount = {
13781378 let targetAmount = sourceAmount_
13791379 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
13801380 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
13811381 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13821382 let feeDiff = (fee - prevFee)
13831383 if ((feeDiff == ZERO_BIGINT))
13841384 then targetAmount
13851385 else {
13861386 let $t03870138851 = {
1387- let $l = LIST_64
1387+ let $l = LIST_46
13881388 let $s = size($l)
13891389 let $acc0 = $Tuple5(false, ZERO_BIGINT, (sourceAmount_ + prevFee), ZERO_BIGINT, nil)
13901390 func $f0_1 ($a,$i) = if (($i >= $s))
13911391 then $a
13921392 else foldFunc($a, $l[$i])
13931393
13941394 func $f0_2 ($a,$i) = if (($i >= $s))
13951395 then $a
13961396 else throw("List size exceeds 46")
13971397
13981398 $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($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)
13991399 }
14001400 let success = $t03870138851._1
14011401 let startOut = $t03870138851._2
14021402 let stopOut = $t03870138851._3
14031403 let targetAmountOut = $t03870138851._4
14041404 let debug = $t03870138851._5
14051405 if (!(success))
14061406 then throw(_listBigIntToString(debug))
14071407 else targetAmountOut
14081408 }
14091409 }
14101410 let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
14111411 let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
14121412 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
14131413 then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14141414 else false
14151415 if ((err1 == err1))
14161416 then {
14171417 let $t03971739866 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), toInt(targetAmount), lpFeeRate, protocolFeeRate)
14181418 let lpFee = $t03971739866._1
14191419 let protocolFee = $t03971739866._2
14201420 let sigmaFeePerLpUpdated = $t03971739866._3
14211421 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14221422 }
14231423 else throw("Strict value is not equal to itself.")
14241424 }
14251425
14261426
14271427 @Callable(i)
14281428 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
14291429 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14301430 then _whenNotInitialized()
14311431 else false)
14321432 then _whenMultisigSet()
14331433 else false)
14341434 then _validateAssets(assets_, "init: invalid assets")
14351435 else false)
14361436 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
14371437 else false)
14381438 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
14391439 else false)
14401440 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
14411441 else false)
14421442 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
14431443 else false)
14441444 then _validateTokenName(lpTokenName_, "init: invalid name")
14451445 else false)
14461446 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
14471447 else false)
14481448 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14491449 else false)
14501450 then _validateInt(maxAllocationAmplifier_, 0, toInt(MAX_AMPLIFIER), "init: invalid maxAllocationAmplifier")
14511451 else false)
14521452 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14531453 else false)
14541454 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
14551455 else false)
14561456 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14571457 else false)
14581458 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14591459 else false)
14601460 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
14611461 else false)
14621462 then _validateAddress(pauser_, "init: invalid pauser")
14631463 else false
14641464 if ((err == err))
14651465 then {
14661466 let $t04173741806 = _prepareAssetWeights(assetWeights_)
14671467 let assetWeights = $t04173741806._1
14681468 let sigmaWeight = $t04173741806._2
14691469 let assetBalances = _prepareAssetBalances(assets_)
14701470 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14711471 let lpAssetId = calculateAssetId(issue)
14721472 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, toBigInt(maxAllocationAmplifier_), toBigInt(weightAmplifier_), toBigInt(slippageRate_), toBigInt(feeMaxRate_), addressFromStringValue(protocolFeeContract_))
14731473 $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14741474 }
14751475 else throw("Strict value is not equal to itself.")
14761476 }
14771477
14781478
14791479
14801480 @Callable(i)
14811481 func depositAll (amount_) = {
14821482 let err = if (if (_whenInitialized())
14831483 then _whenNotPaused()
14841484 else false)
14851485 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14861486 else false
14871487 if ((err == err))
14881488 then {
14891489 let storage = _loadStorage()
14901490 let lpAssetId = storage._1
14911491 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14921492 let assets = _loadAssets()
14931493 let $t04355643641 = _depositAll(amount_)
14941494 let lpTokensToMint = $t04355643641._1
14951495 let requiredAmountsNormalized = $t04355643641._2
14961496 let assetBalances = $t04355643641._3
14971497 func foldFunc (acc,elem) = {
14981498 let index = acc._1
14991499 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15001500 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15011501 let requiredAmountNormalized = requiredAmountsNormalized[index]
15021502 let requiredAmount = toInt(_normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING))
15031503 let err1 = if ((paymentAssetStr != elem))
15041504 then throw(("depositAll: invalid payment: index=" + toString(index)))
15051505 else if ((0 >= requiredAmount))
15061506 then throw("depositAll: too little amount required")
15071507 else unit
15081508 if ((err1 == err1))
15091509 then {
15101510 let change = if ((i.payments[index].amount > requiredAmount))
15111511 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
15121512 else if ((requiredAmount > i.payments[index].amount))
15131513 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
15141514 else nil
15151515 $Tuple2((index + 1), (acc._2 ++ change))
15161516 }
15171517 else throw("Strict value is not equal to itself.")
15181518 }
15191519
15201520 let $t04483944901 = {
15211521 let $l = assets
15221522 let $s = size($l)
15231523 let $acc0 = $Tuple2(0, nil)
15241524 func $f0_1 ($a,$i) = if (($i >= $s))
15251525 then $a
15261526 else foldFunc($a, $l[$i])
15271527
15281528 func $f0_2 ($a,$i) = if (($i >= $s))
15291529 then $a
15301530 else throw("List size exceeds 10")
15311531
15321532 $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)
15331533 }
15341534 let idx = $t04483944901._1
15351535 let changeActions = $t04483944901._2
15361536 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15371537 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15381538 }
15391539 else throw("Strict value is not equal to itself.")
15401540 }
15411541
15421542
15431543
15441544 @Callable(i)
15451545 func deposit (minLpAmount_) = {
15461546 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
15471547 if ((err == err))
15481548 then {
15491549 let storage = _loadStorage()
15501550 let lpAssetId = storage._1
15511551 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15521552 let err1 = if (if (if (if (_whenInitialized())
15531553 then _whenNotPaused()
15541554 else false)
15551555 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15561556 else false)
15571557 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15581558 else false)
15591559 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
15601560 else false
15611561 if ((err1 == err1))
15621562 then {
15631563 let assetStr = _assetToStr(i.payments[0].assetId)
15641564 let assetDecimals = _getDecimals(assetStr)
15651565 let amountNormalized = _normalizeDecimals(toBigInt(i.payments[0].amount), assetDecimals, lpDecimals, DOWN)
15661566 let $t04630846408 = _deposit(assetStr, amountNormalized)
15671567 let lpTokensToMint = $t04630846408._1
15681568 let assetBalances = $t04630846408._2
15691569 let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
15701570 if ((err2 == err2))
15711571 then {
15721572 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15731573 $Tuple2((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
15741574 }
15751575 else throw("Strict value is not equal to itself.")
15761576 }
15771577 else throw("Strict value is not equal to itself.")
15781578 }
15791579 else throw("Strict value is not equal to itself.")
15801580 }
15811581
15821582
15831583
15841584 @Callable(i)
15851585 func withdrawAll () = {
15861586 let storage = _loadStorage()
15871587 let lpAssetId = storage._1
15881588 let lpAssetIdStr = toBase58String(lpAssetId)
15891589 let lpDecimals = _getDecimals(lpAssetIdStr)
15901590 let assets = _loadAssets()
15911591 let err = if (if (if (if (_whenInitialized())
15921592 then _whenNotPaused()
15931593 else false)
15941594 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
15951595 else false)
15961596 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
15971597 else false)
15981598 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
15991599 else false
16001600 if ((err == err))
16011601 then {
16021602 let $t04762847715 = _withdrawAll(i.payments[0].amount)
16031603 let lpTokensToBurn = $t04762847715._1
16041604 let balancesToPay = $t04762847715._2
16051605 let assetBalances = $t04762847715._3
16061606 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16071607 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16081608 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16091609 }
16101610 else throw("Strict value is not equal to itself.")
16111611 }
16121612
16131613
16141614
16151615 @Callable(i)
16161616 func withdraw (assetId_,minAmount_) = {
16171617 let storage = _loadStorage()
16181618 let lpAssetId = storage._1
16191619 let lpAssetIdStr = toBase58String(lpAssetId)
16201620 let lpDecimals = _getDecimals(lpAssetIdStr)
16211621 let assets = _loadAssets()
16221622 let err = if (if (if (if (if (if (_whenInitialized())
16231623 then _whenNotPaused()
16241624 else false)
16251625 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16261626 else false)
16271627 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
16281628 else false)
16291629 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
16301630 else false)
16311631 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
16321632 else false)
16331633 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
16341634 else false
16351635 if ((err == err))
16361636 then {
16371637 let $t04904149175 = _withdraw(assetId_, i.payments[0].amount)
16381638 let targetAmountNormalized = $t04904149175._1
16391639 let finalAssetBalances = $t04904149175._2
16401640 let lpFee = $t04904149175._3
16411641 let protocolFee = $t04904149175._4
16421642 let sigmaFeePerLpUpdated = $t04904149175._5
16431643 let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
16441644 let targetDecimals = _getDecimals(assetId_)
16451645 let finalAmount = toInt(_normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN))
16461646 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: insufficient final amount")
16471647 if ((err1 == err1))
16481648 then {
16491649 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)
16501650 $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)
16511651 }
16521652 else throw("Strict value is not equal to itself.")
16531653 }
16541654 else throw("Strict value is not equal to itself.")
16551655 }
16561656
16571657
16581658
16591659 @Callable(i)
16601660 func swap (targetAssetId_,minAmount_) = {
16611661 let storage = _loadStorage()
16621662 let lpAssetId = storage._1
16631663 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16641664 let assets = _loadAssets()
16651665 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16661666 let sourceAmountNormalized = _normalizeDecimals(toBigInt(i.payments[0].amount), _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16671667 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16681668 if ((sourceAssetIndex == sourceAssetIndex))
16691669 then {
16701670 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16711671 if ((targetAssetIndex == targetAssetIndex))
16721672 then {
16731673 let err = if (if (if (if (if (_whenInitialized())
16741674 then _whenNotPaused()
16751675 else false)
16761676 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16771677 else false)
16781678 then _validateInt(toInt(sourceAmountNormalized), 1, MAX_INT, "swap: invalid source amount")
16791679 else false)
16801680 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16811681 else false)
16821682 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
16831683 else false
16841684 if ((err == err))
16851685 then {
16861686 let $t05135251510 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
16871687 let targetAmountNormalized = $t05135251510._1
16881688 let finalAssetBalances = $t05135251510._2
16891689 let lpFee = $t05135251510._3
16901690 let protocolFee = $t05135251510._4
16911691 let sigmaFeePerLpUpdated = $t05135251510._5
16921692 let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
16931693 let targetDecimals = _getDecimals(targetAssetId_)
16941694 let finalAmount = toInt(_normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN))
16951695 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: insufficient final amount")
16961696 if ((err1 == err1))
16971697 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16981698 else throw("Strict value is not equal to itself.")
16991699 }
17001700 else throw("Strict value is not equal to itself.")
17011701 }
17021702 else throw("Strict value is not equal to itself.")
17031703 }
17041704 else throw("Strict value is not equal to itself.")
17051705 }
17061706
17071707
17081708
17091709 @Callable(i)
17101710 func getDepositAll (lpAmount_) = {
17111711 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17121712 if ((err == err))
17131713 then {
17141714 let $t05266952756 = _depositAll(lpAmount_)
17151715 let lpTokensToMint = $t05266952756._1
17161716 let requiredAmountsNormalized = $t05266952756._2
17171717 let assetBalances = $t05266952756._3
17181718 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17191719 }
17201720 else throw("Strict value is not equal to itself.")
17211721 }
17221722
17231723
17241724
17251725 @Callable(i)
17261726 func getDeposit (assetId_,amount_) = {
17271727 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
17281728 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
17291729 else false
17301730 if ((err == err))
17311731 then {
17321732 let storage = _loadStorage()
17331733 let lpAssetId = storage._1
17341734 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17351735 let assetDecimals = _getDecimals(assetId_)
17361736 let amountNormalized = _normalizeDecimals(toBigInt(amount_), assetDecimals, lpDecimals, DOWN)
17371737 let $t05352653600 = _deposit(assetId_, amountNormalized)
17381738 let lpTokensToMint = $t05352653600._1
17391739 let assetBalances = $t05352653600._2
17401740 $Tuple2(nil, lpTokensToMint)
17411741 }
17421742 else throw("Strict value is not equal to itself.")
17431743 }
17441744
17451745
17461746
17471747 @Callable(i)
17481748 func getWithdrawAll (lpAmount_) = {
17491749 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17501750 if ((err == err))
17511751 then {
17521752 let $t05397754053 = _withdrawAll(lpAmount_)
17531753 let lpTokensToBurn = $t05397754053._1
17541754 let balancesToGet = $t05397754053._2
17551755 let assetBalances = $t05397754053._3
17561756 $Tuple2(nil, balancesToGet)
17571757 }
17581758 else throw("Strict value is not equal to itself.")
17591759 }
17601760
17611761
17621762
17631763 @Callable(i)
17641764 func getWithdraw (assetId_,amount_) = {
17651765 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17661766 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
17671767 else false
17681768 if ((err == err))
17691769 then {
17701770 let storage = _loadStorage()
17711771 let lpAssetId = storage._1
17721772 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17731773 let $t05470454820 = _withdraw(assetId_, amount_)
17741774 let targetAmountNormalized = $t05470454820._1
17751775 let assetBalances = $t05470454820._2
17761776 let lpFee = $t05470454820._3
17771777 let protocolFee = $t05470454820._4
17781778 let sigmaFeePerLpUpdated = $t05470454820._5
17791779 let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
17801780 let targetDecimals = _getDecimals(assetId_)
17811781 let finalAmount = _normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN)
17821782 $Tuple2(nil, finalAmount)
17831783 }
17841784 else throw("Strict value is not equal to itself.")
17851785 }
17861786
17871787
17881788
17891789 @Callable(i)
17901790 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
17911791 let storage = _loadStorage()
17921792 let lpAssetId = storage._1
17931793 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17941794 let assets = _loadAssets()
17951795 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
17961796 if ((sourceAssetIndex == sourceAssetIndex))
17971797 then {
17981798 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
17991799 if ((targetAssetIndex == targetAssetIndex))
18001800 then {
18011801 let sourceAmountNormalized = _normalizeDecimals(toBigInt(sourceAmount_), _getDecimals(sourceAssetId_), lpDecimals, DOWN)
18021802 let err = if (_validateInt(toInt(sourceAmountNormalized), 1, MAX_INT, "swap: invalid source amount"))
18031803 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18041804 else false
18051805 if ((err == err))
18061806 then {
18071807 let $t05627256430 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
18081808 let targetAmountNormalized = $t05627256430._1
18091809 let finalAssetBalances = $t05627256430._2
18101810 let lpFee = $t05627256430._3
18111811 let protocolFee = $t05627256430._4
18121812 let sigmaFeePerLpUpdated = $t05627256430._5
18131813 let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
18141814 let targetDecimals = _getDecimals(targetAssetId_)
18151815 let finalAmount = _normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN)
18161816 $Tuple2(nil, finalAmount)
18171817 }
18181818 else throw("Strict value is not equal to itself.")
18191819 }
18201820 else throw("Strict value is not equal to itself.")
18211821 }
18221822 else throw("Strict value is not equal to itself.")
18231823 }
18241824
18251825
18261826
18271827 @Callable(i)
18281828 func getClaim (user_) = {
18291829 let user = if ((size(user_) > 0))
18301830 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18311831 else i.caller
18321832 let $t05709157147 = _checkpoint(user)
18331833 let checkpointActions = $t05709157147._1
18341834 let userProfits = $t05709157147._2
18351835 $Tuple2(nil, userProfits)
18361836 }
18371837
18381838
18391839
18401840 @Callable(i)
18411841 func getUtilFunc () = {
18421842 let storage = _loadStorage()
18431843 let lpTotalSupply = storage._3
18441844 let weightAmplifier = storage._7
18451845 let slippageRate = storage._8
18461846 let feeMaxRate = storage._9
18471847 let $t05748057540 = _loadAssetBalances()
18481848 let assetBalances = $t05748057540._1
18491849 let assetTotalSupply = $t05748057540._2
18501850 let $t05754557598 = _loadAssetWeights()
18511851 let assetWeights = $t05754557598._1
18521852 let sigmaWeight = $t05754557598._2
18531853 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18541854 let utilValue = (assetTotalSupply - fee)
18551855 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18561856 }
18571857
18581858
18591859
18601860 @Callable(i)
18611861 func checkpoint (user_) = {
18621862 let err = if (_whenInitialized())
18631863 then _whenNotPaused()
18641864 else false
18651865 if ((err == err))
18661866 then {
18671867 let user = if ((size(user_) > 0))
18681868 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
18691869 else i.caller
18701870 _checkpoint(user)
18711871 }
18721872 else throw("Strict value is not equal to itself.")
18731873 }
18741874
18751875
18761876
18771877 @Callable(i)
18781878 func stake () = {
18791879 let err = if (_whenInitialized())
18801880 then _whenNotPaused()
18811881 else false
18821882 if ((err == err))
18831883 then {
18841884 let storage = _loadStorage()
18851885 let lpAssetIdStr = _assetToStr(storage._1)
18861886 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
18871887 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
18881888 else false)
18891889 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
18901890 else false
18911891 if ((err1 == err1))
18921892 then {
18931893 let $t05867158731 = _checkpoint(i.caller)
18941894 let checkpointActions = $t05867158731._1
18951895 let userProfits = $t05867158731._2
18961896 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
18971897 }
18981898 else throw("Strict value is not equal to itself.")
18991899 }
19001900 else throw("Strict value is not equal to itself.")
19011901 }
19021902
19031903
19041904
19051905 @Callable(i)
19061906 func unstake (amount_) = {
19071907 let err = if (_whenInitialized())
19081908 then _whenNotPaused()
19091909 else false
19101910 if ((err == err))
19111911 then {
19121912 let storage = _loadStorage()
19131913 let lpAssetId = storage._1
19141914 let userLp = _loadUserLp(i.caller)
19151915 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19161916 if ((err1 == err1))
19171917 then {
19181918 let $t05924259302 = _checkpoint(i.caller)
19191919 let checkpointActions = $t05924259302._1
19201920 let userProfits = $t05924259302._2
19211921 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19221922 }
19231923 else throw("Strict value is not equal to itself.")
19241924 }
19251925 else throw("Strict value is not equal to itself.")
19261926 }
19271927
19281928
19291929
19301930 @Callable(i)
19311931 func claim (user_) = {
19321932 let err = if (_whenInitialized())
19331933 then _whenNotPaused()
19341934 else false
19351935 if ((err == err))
19361936 then {
19371937 let user = if ((size(user_) > 0))
19381938 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
19391939 else i.caller
19401940 let storage = _loadStorage()
19411941 let lpAssetId = storage._1
19421942 let lpAssetIdStr = _assetToStr(lpAssetId)
19431943 let assets = [lpAssetIdStr, _loadAssets()]
19441944 let maxIndex = (size(assets) - 1)
19451945 let userLp = _loadUserLp(user)
19461946 let $t06002560081 = _checkpoint(user)
19471947 let checkpointActions = $t06002560081._1
19481948 let userProfits = $t06002560081._2
19491949 func foldFunc (acc,profit) = {
19501950 let index = acc._1
19511951 if (if ((maxIndex >= index))
19521952 then (profit > 0)
19531953 else false)
19541954 then {
19551955 let asset = assets[index]
19561956 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
19571957 }
19581958 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19591959 }
19601960
19611961 let $t06045960550 = {
19621962 let $l = userProfits
19631963 let $s = size($l)
19641964 let $acc0 = $Tuple3(0, nil, nil)
19651965 func $f0_1 ($a,$i) = if (($i >= $s))
19661966 then $a
19671967 else foldFunc($a, $l[$i])
19681968
19691969 func $f0_2 ($a,$i) = if (($i >= $s))
19701970 then $a
19711971 else throw("List size exceeds 11")
19721972
19731973 $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)
19741974 }
19751975 let idx = $t06045960550._1
19761976 let userProfitsUpdated = $t06045960550._2
19771977 let profitActions = $t06045960550._3
19781978 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19791979 }
19801980 else throw("Strict value is not equal to itself.")
19811981 }
19821982
19831983
19841984
19851985 @Callable(i)
19861986 func pause () = {
19871987 let err = if (if (_onlyPauser(i.caller))
19881988 then _whenInitialized()
19891989 else false)
19901990 then _whenNotPaused()
19911991 else false
19921992 if ((err == err))
19931993 then $Tuple2(_savePause(true), unit)
19941994 else throw("Strict value is not equal to itself.")
19951995 }
19961996
19971997
19981998
19991999 @Callable(i)
20002000 func unpause () = {
20012001 let err = if (if (_onlyPauser(i.caller))
20022002 then _whenInitialized()
20032003 else false)
20042004 then _whenPaused()
20052005 else false
20062006 if ((err == err))
20072007 then $Tuple2(_savePause(false), unit)
20082008 else throw("Strict value is not equal to itself.")
20092009 }
20102010
20112011
20122012
20132013 @Callable(i)
20142014 func updatePauser (pauser_) = {
20152015 let err = if (if (_onlyThisContract(i.caller))
20162016 then _whenInitialized()
20172017 else false)
20182018 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20192019 else false
20202020 if ((err == err))
20212021 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
20222022 else throw("Strict value is not equal to itself.")
20232023 }
20242024
20252025
20262026
20272027 @Callable(i)
20282028 func setMultisig (multisig_) = {
20292029 let err = if (_onlyThisContract(i.caller))
20302030 then _validateAddress(multisig_, "setMultisig: invalid multisig")
20312031 else false
20322032 if ((err == err))
20332033 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
20342034 else throw("Strict value is not equal to itself.")
20352035 }
20362036
20372037
20382038 @Verifier(tx)
20392039 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
20402040

github/deemru/w8io/3ef1775 
143.68 ms