tx · MaC2oQScPuim7GuNbSCMu3DQNKMuYRt8roEavL8JWZD

3NAg2HDvKz7gwrNc2wnUxdK74NydBFUXTYP:  -0.02900000 Waves

2024.07.04 10:38 [3178982] smart account 3NAg2HDvKz7gwrNc2wnUxdK74NydBFUXTYP > SELF 0.00000000 Waves

{ "type": 13, "id": "MaC2oQScPuim7GuNbSCMu3DQNKMuYRt8roEavL8JWZD", "fee": 2900000, "feeAssetId": null, "timestamp": 1720078793867, "version": 2, "chainId": 84, "sender": "3NAg2HDvKz7gwrNc2wnUxdK74NydBFUXTYP", "senderPublicKey": "BEbZF8zo7WjaQFZFFuPs7hqSLEgGwjwQFGg4tSidf9C3", "proofs": [ "5PQF72V8Twsh7AK7vEXHhvqqD16PkAQgLfcEgaTwJBryJ8CQe7NP8dGrh7cz5VXHPMCjm5EGnfT2CfDcsfTZdFtX" ], "script": "base64:BwJjCAISCAoGCAgICAgIEggKBggICAgICBIJCgcICAgICAgIEgUKAwgICBILCgkICAgICAgICAgSBgoECAgICBIFCgMBCAgSBQoDAQgIEgMKAQESAwoBCBIAEgASAwoBCBIDCgEIagAJU0VQQVJBVE9SAgJfXwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAAhLRVlfSU5JVAIESU5JVAAKS0VZX1BBVVNFRAIGUEFVU0VEAApLRVlfUEFVU0VSAgZQQVVTRVIADEtFWV9FWEVDVVRPUgIIRVhFQ1VUT1IAE0tFWV9DQUxMRVJfQ09OVFJBQ1QCD0NBTExFUl9DT05UUkFDVAAPS0VZX1dBVkVTX1ZBVUxUAgtXQVZFU19WQVVMVAATS0VZX0FDQ09VTlRfU1RPUkFHRQIPQUNDT1VOVF9TVE9SQUdFAAlLRVlfQ0hBSU4CBUNIQUlOABJLRVlfQVNTRVRfQ1VSUkVOQ1kCDkFTU0VUX0NVUlJFTkNZABJLRVlfQVNTRVRfUkVTRVJWRVMCDkFTU0VUX1JFU0VSVkVTABlLRVlfQVNTRVRfUkVTRVJWRVNfTE9DS0VEAhVBU1NFVF9SRVNFUlZFU19MT0NLRUQAFUtFWV9DVVJSRU5DWV9SRVNFUlZFUwIRQ1VSUkVOQ1lfUkVTRVJWRVMAG0tFWV9SRVFVRVNUX1dJVEhEUkFXQUxfU0laRQIXUkVRVUVTVF9XSVRIRFJBV0FMX1NJWkUAFktFWV9SRVFVRVNUX1dJVEhEUkFXQUwCElJFUVVFU1RfV0lUSERSQVdBTAAiS0VZX1JFUVVFU1RfV0lUSERSQVdBTF9CTE9DS19ERUxBWQIeUkVRVUVTVF9XSVRIRFJBV0FMX0JMT0NLX0RFTEFZAA1LRVlfU0VRVUVOQ0VSAglTRVFVRU5DRVIAE0tFWV9XSVRIRFJBV0FMX0hBU0gCD1dJVEhEUkFXQUxfSEFTSAARS0VZX1ZBVUxUX0FEQVBURVICDVZBVUxUX0FEQVBURVIAFktFWV9SRVdBUkRfRElTVFJJQlVUT1ICElJFV0FSRF9ESVNUUklCVVRPUgAMRlVOQ19ERVBPU0lUAgdkZXBvc2l0ABVGVU5DX0dFVF9VU0VSX0JBTEFOQ0UCDmdldFVzZXJCYWxhbmNlABZGVU5DX0lOVEVSTkFMX1RSQU5TRkVSAhBpbnRlcm5hbFRyYW5zZmVyAA1GVU5DX1dJVEhEUkFXAgh3aXRoZHJhdwAbRlVOQ19ERVBPU0lUX1NUQUtJTkdfUkVXQVJEAhRkZXBvc2l0U3Rha2luZ1Jld2FyZAAWUkVRVUVTVF9TVEFUVVNfQ1JFQVRFRAAAABNSRVFVRVNUX1NUQVRVU19ET05FAAEAF1JFUVVFU1RfU1RBVFVTX1JFSkVDVEVEAAIABVdBVkVTAgVXQVZFUwALU1BPVF9XQUxMRVQCBFNQT1QAEldJVEhEUkFXQUxTX1dBTExFVAILV0lUSERSQVdBTFMAB01BWF9JTlQA//////////9/AAtaRVJPX0JJR0lOVAkAtgIBAAAACk9ORV9CSUdJTlQJALYCAQABAAdPTkVfREFZAIC4mSkADkFMR19UWVBFX1dBVkVTAAEADEFMR19UWVBFX0VWTQACABRFVk1fU0lHTkFUVVJFX1BSRUZJWAEcGUV0aGVyZXVtIFNpZ25lZCBNZXNzYWdlOgozMgEQX3ZhbGlkYXRlQWRkcmVzcwIIYWRkcmVzc18EZXJyXwQHJG1hdGNoMAkApggBBQhhZGRyZXNzXwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ9fdmFsaWRhdGVCaWdJbnQDBHZhbF8ObG93ZXJCb3VuZGFyeV8EZXJyXwMJAL8CAgUObG93ZXJCb3VuZGFyeV8FBHZhbF8JAAIBBQRlcnJfBgEPX3ZhbGlkYXRlU3RyaW5nAgR2YWxfBGVycl8DAwkAZwIAAAkAsQIBBQR2YWxfBgkBCGNvbnRhaW5zAgUEdmFsXwUJU0VQQVJBVE9SCQACAQUEZXJyXwYBFF92YWxpZGF0ZVN0cmluZ0VxdWFsAwV2YWwxXwV2YWwyXwRlcnJfAwkBAiE9AgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBCV9sb2FkSW5pdAAEByRtYXRjaDAJAKAIAQUIS0VZX0lOSVQDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYQUHJG1hdGNoMAUBYQcBCV9zYXZlSW5pdAEHaXNJbml0XwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUIS0VZX0lOSVQFB2lzSW5pdF8FA25pbAEKX2xvYWRQYXVzZQAEByRtYXRjaDAJAKAIAQUKS0VZX1BBVVNFRAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEKX3NhdmVQYXVzZQEJaXNQYXVzZWRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQpLRVlfUEFVU0VEBQlpc1BhdXNlZF8FA25pbAELX2xvYWRQYXVzZXIABAckbWF0Y2gwCQCiCAEFCktFWV9QQVVTRVIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAELX3NhdmVQYXVzZXIBB3BhdXNlcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUKS0VZX1BBVVNFUgkApQgBBQdwYXVzZXJfBQNuaWwBDV9sb2FkTXVsdGlzaWcABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQ1fc2F2ZU11bHRpc2lnAQltdWx0aXNpZ18JAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX01VTFRJU0lHCQClCAEFCW11bHRpc2lnXwUDbmlsARNfbG9hZENhbGxlckNvbnRyYWN0AQhjaGFpbklkXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUTS0VZX0NBTExFUl9DT05UUkFDVAkAzAgCCQCkAwEFCGNoYWluSWRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAETX3NhdmVDYWxsZXJDb250cmFjdAIIY2hhaW5JZF8PY2FsbGVyQ29udHJhY3RfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRNLRVlfQ0FMTEVSX0NPTlRSQUNUCQDMCAIJAKQDAQUIY2hhaW5JZF8FA25pbAUJU0VQQVJBVE9SBQ9jYWxsZXJDb250cmFjdF8FA25pbAENX2xvYWRFeGVjdXRvcgAEByRtYXRjaDAJAKIIAQUMS0VZX0VYRUNVVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlRXhlY3V0b3IBCWV4ZWN1dG9yXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfRVhFQ1VUT1IJAKUIAQUJZXhlY3V0b3JfBQNuaWwBE19sb2FkQWNjb3VudFN0b3JhZ2UABAckbWF0Y2gwCQCiCAEFE0tFWV9BQ0NPVU5UX1NUT1JBR0UDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAETX3NhdmVBY2NvdW50U3RvcmFnZQEPYWNjb3VudFN0b3JhZ2VfCQDMCAIJAQtTdHJpbmdFbnRyeQIFE0tFWV9BQ0NPVU5UX1NUT1JBR0UJAKUIAQUPYWNjb3VudFN0b3JhZ2VfBQNuaWwBD19sb2FkV2F2ZXNWYXVsdAAEByRtYXRjaDAJAKIIAQUPS0VZX1dBVkVTX1ZBVUxUAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABD19zYXZlV2F2ZXNWYXVsdAELd2F2ZXNWYXVsdF8JAMwIAgkBC1N0cmluZ0VudHJ5AgUPS0VZX1dBVkVTX1ZBVUxUCQClCAEFC3dhdmVzVmF1bHRfBQNuaWwBCl9sb2FkQ2hhaW4BCGNoYWluSWRfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBQlLRVlfQ0hBSU4JAMwIAgkApAMBBQhjaGFpbklkXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABCl9zYXZlQ2hhaW4CCGNoYWluSWRfBW5hbWVfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBQlLRVlfQ0hBSU4JAMwIAgkApAMBBQhjaGFpbklkXwUDbmlsBQlTRVBBUkFUT1IFBW5hbWVfBQNuaWwBEl9sb2FkQXNzZXRDdXJyZW5jeQIIY2hhaW5JZF8GYXNzZXRfBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBRJLRVlfQVNTRVRfQ1VSUkVOQ1kJAMwIAgkApAMBBQhjaGFpbklkXwkAzAgCBQZhc3NldF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAUBYQIAARJfc2F2ZUFzc2V0Q3VycmVuY3kDCGNoYWluSWRfBmFzc2V0XwljdXJyZW5jeV8JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFEktFWV9BU1NFVF9DVVJSRU5DWQkAzAgCCQCkAwEFCGNoYWluSWRfCQDMCAIFBmFzc2V0XwUDbmlsBQlTRVBBUkFUT1IFCWN1cnJlbmN5XwUDbmlsARJfbG9hZEFzc2V0UmVzZXJ2ZXMCCGNoYWluSWRfBmFzc2V0XwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUSS0VZX0FTU0VUX1JFU0VSVkVTCQDMCAIJAKQDAQUIY2hhaW5JZF8JAMwIAgUGYXNzZXRfBQNuaWwFCVNFUEFSQVRPUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQULWkVST19CSUdJTlQBEl9zYXZlQXNzZXRSZXNlcnZlcwMIY2hhaW5JZF8GYXNzZXRfCXJlc2VydmVzXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUSS0VZX0FTU0VUX1JFU0VSVkVTCQDMCAIJAKQDAQUIY2hhaW5JZF8JAMwIAgUGYXNzZXRfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQlyZXNlcnZlc18FA25pbAEYX2xvYWRBc3NldFJlc2VydmVzTG9ja2VkAghjaGFpbklkXwZhc3NldF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFGUtFWV9BU1NFVF9SRVNFUlZFU19MT0NLRUQJAMwIAgkApAMBBQhjaGFpbklkXwkAzAgCBQZhc3NldF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEYX3NhdmVBc3NldFJlc2VydmVzTG9ja2VkAwhjaGFpbklkXwZhc3NldF8JcmVzZXJ2ZXNfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRlLRVlfQVNTRVRfUkVTRVJWRVNfTE9DS0VECQDMCAIJAKQDAQUIY2hhaW5JZF8JAMwIAgUGYXNzZXRfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQlyZXNlcnZlc18FA25pbAEVX2xvYWRDdXJyZW5jeVJlc2VydmVzAQljdXJyZW5jeV8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFFUtFWV9DVVJSRU5DWV9SRVNFUlZFUwkAzAgCBQljdXJyZW5jeV8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkApwMBBQFhBQtaRVJPX0JJR0lOVAEVX3NhdmVDdXJyZW5jeVJlc2VydmVzAgljdXJyZW5jeV8JcmVzZXJ2ZXNfCQDMCAIJAQtTdHJpbmdFbnRyeQIJALkJAgkAzAgCBRVLRVlfQ1VSUkVOQ1lfUkVTRVJWRVMJAMwIAgUJY3VycmVuY3lfBQNuaWwFCVNFUEFSQVRPUgkApgMBBQlyZXNlcnZlc18FA25pbAEaX2xvYWRSZXF1ZXN0V2l0aGRyYXdhbFNpemUABAckbWF0Y2gwCQCfCAEFG0tFWV9SRVFVRVNUX1dJVEhEUkFXQUxfU0laRQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEaX3NhdmVSZXF1ZXN0V2l0aGRyYXdhbFNpemUBBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFG0tFWV9SRVFVRVNUX1dJVEhEUkFXQUxfU0laRQUEdmFsXwUDbmlsARZfbG9hZFJlcXVlc3RXaXRoZHJhd2FsAQZpbmRleF8EByRtYXRjaDAJAKIIAQkAuQkCCQDMCAIFFktFWV9SRVFVRVNUX1dJVEhEUkFXQUwJAMwIAgkApAMBBQZpbmRleF8FA25pbAUJU0VQQVJBVE9SAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAQGc3RydWN0CQC1CQIFAWEFCVNFUEFSQVRPUgkAmgoICQCRAwIFBnN0cnVjdAAACQCRAwIFBnN0cnVjdAABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAIJAJEDAgUGc3RydWN0AAMJAKcDAQkAkQMCBQZzdHJ1Y3QABAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAFCQCRAwIFBnN0cnVjdAAGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAcJAJoKCAIAAgAAAAIABQtaRVJPX0JJR0lOVAAAAgAFFlJFUVVFU1RfU1RBVFVTX0NSRUFURUQBFl9zYXZlUmVxdWVzdFdpdGhkcmF3YWwCBmluZGV4XwhyZXF1ZXN0XwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUWS0VZX1JFUVVFU1RfV0lUSERSQVdBTAkAzAgCCQCkAwEFBmluZGV4XwUDbmlsBQlTRVBBUkFUT1IJALkJAgkAzAgCCAUIcmVxdWVzdF8CXzEJAMwIAggFCHJlcXVlc3RfAl8yCQDMCAIJAKQDAQgFCHJlcXVlc3RfAl8zCQDMCAIIBQhyZXF1ZXN0XwJfNAkAzAgCCQCmAwEIBQhyZXF1ZXN0XwJfNQkAzAgCCQCkAwEIBQhyZXF1ZXN0XwJfNgkAzAgCCAUIcmVxdWVzdF8CXzcJAMwIAgkApAMBCAUIcmVxdWVzdF8CXzgFA25pbAUJU0VQQVJBVE9SBQNuaWwBIF9sb2FkUmVxdWVzdFdpdGhkcmF3YWxCbG9ja0RlbGF5AAQHJG1hdGNoMAkAnwgBBSJLRVlfUkVRVUVTVF9XSVRIRFJBV0FMX0JMT0NLX0RFTEFZAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAASBfc2F2ZVJlcXVlc3RXaXRoZHJhd2FsQmxvY2tEZWxheQEGZGVsYXlfCQDMCAIJAQxJbnRlZ2VyRW50cnkCBSJLRVlfUkVRVUVTVF9XSVRIRFJBV0FMX0JMT0NLX0RFTEFZBQZkZWxheV8FA25pbAEOX2xvYWRTZXF1ZW5jZXIABAckbWF0Y2gwCQCiCAEFDUtFWV9TRVFVRU5DRVIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAEOX3NhdmVTZXF1ZW5jZXIBCnNlcXVlbmNlcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUNS0VZX1NFUVVFTkNFUgkApQgBBQpzZXF1ZW5jZXJfBQNuaWwBE19sb2FkV2l0aGRyYXdhbEhhc2gBD3dpdGhkcmF3YWxIYXNoXwQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUTS0VZX1dJVEhEUkFXQUxfSEFTSAkAzAgCCQDYBAEFD3dpdGhkcmF3YWxIYXNoXwUDbmlsBQlTRVBBUkFUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABE19zYXZlV2l0aGRyYXdhbEhhc2gCD3dpdGhkcmF3YWxIYXNoXwV0eElkXwkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUTS0VZX1dJVEhEUkFXQUxfSEFTSAkAzAgCCQDYBAEFD3dpdGhkcmF3YWxIYXNoXwUDbmlsBQlTRVBBUkFUT1IFBXR4SWRfBQNuaWwBEV9sb2FkVmF1bHRBZGFwdGVyAAQHJG1hdGNoMAkAoggBBRFLRVlfVkFVTFRfQURBUFRFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAARFfc2F2ZVZhdWx0QWRhcHRlcgENdmF1bHRBZGFwdGVyXwkAzAgCCQELU3RyaW5nRW50cnkCBRFLRVlfVkFVTFRfQURBUFRFUgkApQgBBQ12YXVsdEFkYXB0ZXJfBQNuaWwBFl9sb2FkUmV3YXJkRGlzdHJpYnV0b3IABAckbWF0Y2gwCQCiCAEFFktFWV9SRVdBUkRfRElTVFJJQlVUT1IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABFl9zYXZlUmV3YXJkRGlzdHJpYnV0b3IBDGRpc3RyaWJ1dG9yXwkAzAgCCQELU3RyaW5nRW50cnkCBRZLRVlfUkVXQVJEX0RJU1RSSUJVVE9SBQxkaXN0cmlidXRvcl8FA25pbAERX29ubHlUaGlzQ29udHJhY3QBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfBQR0aGlzCQACAQIZX29ubHlUaGlzQ29udHJhY3Q6IHJldmVydAYBEF93aGVuTXVsdGlzaWdTZXQAAwkAAAIJAQ1fbG9hZE11bHRpc2lnAAkBB0FkZHJlc3MBAQAJAAIBAhhfd2hlbk11bHRpc2lnU2V0OiByZXZlcnQGARNfd2hlbk5vdEluaXRpYWxpemVkAAMJAQlfbG9hZEluaXQACQACAQIbX3doZW5Ob3RJbml0aWFsaXplZDogcmV2ZXJ0BgEQX3doZW5Jbml0aWFsaXplZAADCQEBIQEJAQlfbG9hZEluaXQACQACAQIYX3doZW5Jbml0aWFsaXplZDogcmV2ZXJ0BgEOX3doZW5Ob3RQYXVzZWQAAwkBCl9sb2FkUGF1c2UACQACAQIWX3doZW5Ob3RQYXVzZWQ6IHJldmVydAYBC193aGVuUGF1c2VkAAMJAQEhAQkBCl9sb2FkUGF1c2UACQACAQITX3doZW5QYXVzZWQ6IHJldmVydAYBC19vbmx5UGF1c2VyAQdjYWxsZXJfAwkBAiE9AgUHY2FsbGVyXwkBC19sb2FkUGF1c2VyAAkAAgECE19vbmx5UGF1c2VyOiByZXZlcnQGARFfdmFsaWRhdGVFeGVjdXRvcgIEdmFsXwRlcnJfAwkBAiE9AgUEdmFsXwkBDV9sb2FkRXhlY3V0b3IACQACAQUEZXJyXwYBF192YWxpZGF0ZUNhbGxlckNvbnRyYWN0AwhjaGFpbklkXw9jYWxsZXJDb250cmFjdF8EZXJyXwMJAQIhPQIJARNfbG9hZENhbGxlckNvbnRyYWN0AQUIY2hhaW5JZF8FD2NhbGxlckNvbnRyYWN0XwkAAgEFBGVycl8GAQxfY2hhaW5FeGlzdHMCCGNoYWluSWRfBGVycl8DCQBnAgAACQCxAgEJAQpfbG9hZENoYWluAQUIY2hhaW5JZF8JAAIBBQRlcnJfBgEOX2NoYWluTm90RXhpc3QCCGNoYWluSWRfBGVycl8DCQBmAgkAsQIBCQEKX2xvYWRDaGFpbgEFCGNoYWluSWRfAAAJAAIBBQRlcnJfBgEUX2Fzc2V0Q3VycmVuY3lFeGlzdHMDCGNoYWluSWRfBmFzc2V0XwRlcnJfAwkAZwIAAAkAsQIBCQESX2xvYWRBc3NldEN1cnJlbmN5AgUIY2hhaW5JZF8FBmFzc2V0XwkAAgEFBGVycl8GARZfYXNzZXRDdXJyZW5jeU5vdEV4aXN0AwhjaGFpbklkXwZhc3NldF8EZXJyXwMJAGYCCQCxAgEJARJfbG9hZEFzc2V0Q3VycmVuY3kCBQhjaGFpbklkXwUGYXNzZXRfAAAJAAIBBQRlcnJfBgETX3ZhbGlkYXRlV2F2ZXNWYXVsdAIGY2FsbGVyBGVycl8DCQECIT0CCQEPX2xvYWRXYXZlc1ZhdWx0AAUGY2FsbGVyCQACAQUEZXJyXwYBEV9yZXF1ZXN0SXNDcmVhdGVkAgdzdGF0dXNfBGVycl8DCQECIT0CBQdzdGF0dXNfBRZSRVFVRVNUX1NUQVRVU19DUkVBVEVECQACAQUEZXJyXwYBEl92YWxpZGF0ZVNlcXVlbmNlcgIGY2FsbGVyBGVycl8DCQECIT0CCQEOX2xvYWRTZXF1ZW5jZXIABQZjYWxsZXIJAAIBBQRlcnJfBgEcX2NoZWNrV2l0aGRyYXdhbEhhc2hOb3RFeGlzdAIPd2l0aGRyYXdhbEhhc2hfBGVycl8DCQBmAgkAsQIBCQETX2xvYWRXaXRoZHJhd2FsSGFzaAEFD3dpdGhkcmF3YWxIYXNoXwAACQACAQUEZXJyXwYBGF92YWxpZGF0ZVNpZ25hdHVyZUZvcm1hdAMKc2lnbmF0dXJlXwRhbGdfBGVycl8DCQAAAgUEYWxnXwUOQUxHX1RZUEVfV0FWRVMDCQECIT0CCQDIAQEFCnNpZ25hdHVyZV8AQAkAAgEFBGVycl8GAwkAAAIFBGFsZ18FDEFMR19UWVBFX0VWTQMJAQIhPQIJAMgBAQUKc2lnbmF0dXJlXwBBCQACAQUEZXJyXwYJAAIBCQCsAgIFBGVycl8CCTogaW52IGFsZwESX3ZhbGlkYXRlUHVibGljS2V5AwpwdWJsaWNLZXlfBGFsZ18EZXJyXwMJAAACBQRhbGdfBQ5BTEdfVFlQRV9XQVZFUwMJAQIhPQIJAMgBAQUKcHVibGljS2V5XwAgCQACAQUEZXJyXwYDCQAAAgUEYWxnXwUMQUxHX1RZUEVfRVZNAwkBAiE9AgkAyAEBBQpwdWJsaWNLZXlfABQJAAIBBQRlcnJfBgkAAgEJAKwCAgUEZXJyXwIJOiBpbnYgYWxnARxfdmFsaWRhdGVXaXRoZHJhd2FsU2lnbmF0dXJlBQ93aXRoZHJhd2FsSGFzaF8Kc2lnbmF0dXJlXwpwdWJsaWNLZXlfBGFsZ18EZXJyXwQGcmVzdWx0AwkAAAIFBGFsZ18FDkFMR19UWVBFX1dBVkVTCQD0AwMFD3dpdGhkcmF3YWxIYXNoXwUKc2lnbmF0dXJlXwUKcHVibGljS2V5XwMJAAACBQRhbGdfBQxBTEdfVFlQRV9FVk0EDmhhc2hXaXRoUHJlZml4CQCMFQEJAMsBAgUURVZNX1NJR05BVFVSRV9QUkVGSVgFD3dpdGhkcmF3YWxIYXNoXwkAAAIJAMwBAgkAjBUBCQCEBwIFDmhhc2hXaXRoUHJlZml4BQpzaWduYXR1cmVfABQFCnB1YmxpY0tleV8JAAIBCQCsAgIFBGVycl8CCTogaW52IGFsZwMJAQEhAQUGcmVzdWx0CQACAQUEZXJyXwYBIF92YWxpZGF0ZVB1YmxpY0tleU1hdGNoZXNBZGRyZXNzBApwdWJsaWNLZXlfBWZyb21fBGFsZ18EZXJyXwQHYWRkcmVzcwMJAAACBQRhbGdfBQ5BTEdfVFlQRV9XQVZFUwkApQgBCQCnCAEFCnB1YmxpY0tleV8DCQAAAgUEYWxnXwUMQUxHX1RZUEVfRVZNCQCsAgICAjB4CQDcBAEFCnB1YmxpY0tleV8JAAIBCQCsAgIFBGVycl8CCTogaW52IGFsZwMJAQIhPQIFB2FkZHJlc3MFBWZyb21fCQACAQUEZXJyXwYOAWkBBGluaXQGCWV4ZWN1dG9yXwdwYXVzZXJfD2FjY291bnRTdG9yYWdlXwt3YXZlc1ZhdWx0XwpzZXF1ZW5jZXJfDXZhdWx0QWRhcHRlcl8EA2VycgMDAwMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARNfd2hlbk5vdEluaXRpYWxpemVkAAcJARBfd2hlbk11bHRpc2lnU2V0AAcJARBfdmFsaWRhdGVBZGRyZXNzAgUJZXhlY3V0b3JfAhZpbml0OiBpbnZhbGlkIGV4ZWN1dG9yBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhRpbml0OiBpbnZhbGlkIHBhdXNlcgcJARBfdmFsaWRhdGVBZGRyZXNzAgUPYWNjb3VudFN0b3JhZ2VfAhxpbml0OiBpbnZhbGlkIGFjY291bnRTdG9yYWdlBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQt3YXZlc1ZhdWx0XwIYaW5pdDogaW52YWxpZCB3YXZlc1ZhdWx0BwkBEF92YWxpZGF0ZUFkZHJlc3MCBQpzZXF1ZW5jZXJfAhdpbml0OiBpbnZhbGlkIHNlcXVlbmNlcgcJARBfdmFsaWRhdGVBZGRyZXNzAgUNdmF1bHRBZGFwdGVyXwIaaW5pdDogaW52YWxpZCB2YXVsdEFkYXB0ZXIHAwkAAAIFA2VycgUDZXJyCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAQlfc2F2ZUluaXQBBgkBDV9zYXZlRXhlY3V0b3IBCQERQGV4dHJOYXRpdmUoMTA2MikBBQlleGVjdXRvcl8JAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8JARNfc2F2ZUFjY291bnRTdG9yYWdlAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUPYWNjb3VudFN0b3JhZ2VfCQEPX3NhdmVXYXZlc1ZhdWx0AQkBEUBleHRyTmF0aXZlKDEwNjIpAQULd2F2ZXNWYXVsdF8JAQ5fc2F2ZVNlcXVlbmNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCnNlcXVlbmNlcl8JARFfc2F2ZVZhdWx0QWRhcHRlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDXZhdWx0QWRhcHRlcl8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAYPY2FsbGVyQ29udHJhY3RfBWZyb21fA3RvXwhjaGFpbklkXwZhc3NldF8HYW1vdW50XwQHY2hhaW5JZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEFCGNoYWluSWRfAhhkZXBvc2l0OiBjaGFpbklkIG5vdCBpbnQEBmFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEFB2Ftb3VudF8CF2RlcG9zaXQ6IGFtb3VudCBub3QgaW50BANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQxfY2hhaW5FeGlzdHMCBQdjaGFpbklkAhhkZXBvc2l0OiBpbnZhbGlkIGNoYWluSWQHCQEPX3ZhbGlkYXRlU3RyaW5nAgUFZnJvbV8CFWRlcG9zaXQ6IGludmFsaWQgZnJvbQcJAQ9fdmFsaWRhdGVTdHJpbmcCBQN0b18CE2RlcG9zaXQ6IGludmFsaWQgdG8HCQEUX2Fzc2V0Q3VycmVuY3lFeGlzdHMDBQdjaGFpbklkBQZhc3NldF8CFmRlcG9zaXQ6IGludmFsaWQgYXNzZXQHCQEPX3ZhbGlkYXRlQmlnSW50AwUGYW1vdW50BQtaRVJPX0JJR0lOVAIXZGVwb3NpdDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBARlcnIxAwkAAAIJAQpfbG9hZENoYWluAQUHY2hhaW5JZAUFV0FWRVMJARNfdmFsaWRhdGVXYXZlc1ZhdWx0AggFAWkGY2FsbGVyAhxkZXBvc2l0OiBpbnZhbGlkIHdhdmVzIHZhdWx0AwkBEV92YWxpZGF0ZUV4ZWN1dG9yAggFAWkGY2FsbGVyAhlkZXBvc2l0OiBpbnZhbGlkIGV4ZWN1dG9yCQEXX3ZhbGlkYXRlQ2FsbGVyQ29udHJhY3QDBQdjaGFpbklkBQ9jYWxsZXJDb250cmFjdF8CIGRlcG9zaXQ6IGludmFsaWQgY2FsbGVyIGNvbnRyYWN0BwMJAAACBQRlcnIxBQRlcnIxBBBuZXdBc3NldFJlc2VydmVzCQC3AgIJARJfbG9hZEFzc2V0UmVzZXJ2ZXMCBQdjaGFpbklkBQZhc3NldF8FBmFtb3VudAQIY3VycmVuY3kJARJfbG9hZEFzc2V0Q3VycmVuY3kCBQdjaGFpbklkBQZhc3NldF8EE25ld0N1cnJlbmN5UmVzZXJ2ZXMJALcCAgkBFV9sb2FkQ3VycmVuY3lSZXNlcnZlcwEFCGN1cnJlbmN5BQZhbW91bnQECmludm9jYXRpb24JAPwHBAkBE19sb2FkQWNjb3VudFN0b3JhZ2UABQxGVU5DX0RFUE9TSVQJAMwIAgUDdG9fCQDMCAIFCGN1cnJlbmN5CQDMCAIFB2Ftb3VudF8FA25pbAUDbmlsAwkAAAIFCmludm9jYXRpb24FCmludm9jYXRpb24JAJQKAgkAzggCCQESX3NhdmVBc3NldFJlc2VydmVzAwUHY2hhaW5JZAUGYXNzZXRfBRBuZXdBc3NldFJlc2VydmVzCQEVX3NhdmVDdXJyZW5jeVJlc2VydmVzAgUIY3VycmVuY3kFE25ld0N1cnJlbmN5UmVzZXJ2ZXMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERcmVxdWVzdFdpdGhkcmF3YWwHD2NhbGxlckNvbnRyYWN0XwVmcm9tXwN0b18MZnJvbUNoYWluSWRfCnRvQ2hhaW5JZF8GYXNzZXRfB2Ftb3VudF8EC2Zyb21DaGFpbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUMZnJvbUNoYWluSWRfAiZyZXF1ZXN0V2l0aGRyYXdhbDogZnJvbUNoYWluSWQgbm90IGludAQJdG9DaGFpbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUKdG9DaGFpbklkXwIkcmVxdWVzdFdpdGhkcmF3YWw6IHRvQ2hhaW5JZCBub3QgaW50BAZhbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBBQdhbW91bnRfAiFyZXF1ZXN0V2l0aGRyYXdhbDogYW1vdW50IG5vdCBpbnQEA2VycgMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEMX2NoYWluRXhpc3RzAgULZnJvbUNoYWluSWQCJnJlcXVlc3RXaXRoZHJhd2FsOiBpbnZhbGlkIGZyb21DaGFpbklkBwkBDF9jaGFpbkV4aXN0cwIFCXRvQ2hhaW5JZAIkcmVxdWVzdFdpdGhkcmF3YWw6IGludmFsaWQgdG9DaGFpbklkBwkBD192YWxpZGF0ZVN0cmluZwIFBWZyb21fAh9yZXF1ZXN0V2l0aGRyYXdhbDogaW52YWxpZCBmcm9tBwkBD192YWxpZGF0ZVN0cmluZwIFA3RvXwIdcmVxdWVzdFdpdGhkcmF3YWw6IGludmFsaWQgdG8HCQEUX2Fzc2V0Q3VycmVuY3lFeGlzdHMDBQl0b0NoYWluSWQFBmFzc2V0XwIgcmVxdWVzdFdpdGhkcmF3YWw6IGludmFsaWQgYXNzZXQHCQEPX3ZhbGlkYXRlQmlnSW50AwUGYW1vdW50BQtaRVJPX0JJR0lOVAIhcmVxdWVzdFdpdGhkcmF3YWw6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQEZXJyMQMJAAACCQEKX2xvYWRDaGFpbgEFC2Zyb21DaGFpbklkBQVXQVZFUwkBE192YWxpZGF0ZVdhdmVzVmF1bHQCCAUBaQZjYWxsZXICJnJlcXVlc3RXaXRoZHJhd2FsOiBpbnZhbGlkIHdhdmVzIHZhdWx0AwkBEV92YWxpZGF0ZUV4ZWN1dG9yAggFAWkGY2FsbGVyAiNyZXF1ZXN0V2l0aGRyYXdhbDogaW52YWxpZCBleGVjdXRvcgkBF192YWxpZGF0ZUNhbGxlckNvbnRyYWN0AwULZnJvbUNoYWluSWQFD2NhbGxlckNvbnRyYWN0XwIqcmVxdWVzdFdpdGhkcmF3YWw6IGludmFsaWQgY2FsbGVyIGNvbnRyYWN0BwMJAAACBQRlcnIxBQRlcnIxBAhjdXJyZW5jeQkBEl9sb2FkQXNzZXRDdXJyZW5jeQIFCXRvQ2hhaW5JZAUGYXNzZXRfBBBhdmFpbGFibGVCYWxhbmNlBAckbWF0Y2gwCQD8BwQJARNfbG9hZEFjY291bnRTdG9yYWdlAAUVRlVOQ19HRVRfVVNFUl9CQUxBTkNFCQDMCAIFBWZyb21fCQDMCAIFC1NQT1RfV0FMTEVUCQDMCAIFCGN1cnJlbmN5BQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQkAAgECPHJlcXVlc3RXaXRoZHJhd2FsOiBjYW4ndCB0YWtlIGF2YWlsYWJsZSBiYWxhbmNlIGZyb20gc3RvcmFnZQMJAAACBRBhdmFpbGFibGVCYWxhbmNlBRBhdmFpbGFibGVCYWxhbmNlBA5sb2NrZWRSZXNlcnZlcwkBGF9sb2FkQXNzZXRSZXNlcnZlc0xvY2tlZAIFCXRvQ2hhaW5JZAUGYXNzZXRfBA0kdDAxODIzNTE4NzQ0AwMJAMACAgUQYXZhaWxhYmxlQmFsYW5jZQUGYW1vdW50CQDAAgIJALgCAgkBEl9sb2FkQXNzZXRSZXNlcnZlcwIFCXRvQ2hhaW5JZAUGYXNzZXRfBQ5sb2NrZWRSZXNlcnZlcwUGYW1vdW50BwkAlQoDBRZSRVFVRVNUX1NUQVRVU19DUkVBVEVECQD8BwQJARNfbG9hZEFjY291bnRTdG9yYWdlAAUWRlVOQ19JTlRFUk5BTF9UUkFOU0ZFUgkAzAgCBQVmcm9tXwkAzAgCBQtTUE9UX1dBTExFVAkAzAgCBRJXSVRIRFJBV0FMU19XQUxMRVQJAMwIAgUIY3VycmVuY3kJAMwIAgUHYW1vdW50XwUDbmlsBQNuaWwJARhfc2F2ZUFzc2V0UmVzZXJ2ZXNMb2NrZWQDBQl0b0NoYWluSWQFBmFzc2V0XwkAtwICBQ5sb2NrZWRSZXNlcnZlcwUGYW1vdW50CQCVCgMFF1JFUVVFU1RfU1RBVFVTX1JFSkVDVEVEBQR1bml0BQNuaWwDCQAAAgUNJHQwMTgyMzUxODc0NAUNJHQwMTgyMzUxODc0NAQPcmVzZXJ2ZXNBY3Rpb25zCAUNJHQwMTgyMzUxODc0NAJfMwQRc3RvcmFnZUludm9jYXRpb24IBQ0kdDAxODIzNTE4NzQ0Al8yBA1yZXF1ZXN0U3RhdHVzCAUNJHQwMTgyMzUxODc0NAJfMQQVcmVxdWVzdFdpdGhkcmF3YWxTaXplCQEaX2xvYWRSZXF1ZXN0V2l0aGRyYXdhbFNpemUABBFyZXF1ZXN0V2l0aGRyYXdhbAkAmgoIBQVmcm9tXwUDdG9fBQl0b0NoYWluSWQFBmFzc2V0XwUGYW1vdW50BQZoZWlnaHQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUNcmVxdWVzdFN0YXR1cwkAlAoCCQDOCAIJAM4IAgkBFl9zYXZlUmVxdWVzdFdpdGhkcmF3YWwCBRVyZXF1ZXN0V2l0aGRyYXdhbFNpemUFEXJlcXVlc3RXaXRoZHJhd2FsCQEaX3NhdmVSZXF1ZXN0V2l0aGRyYXdhbFNpemUBCQBkAgUVcmVxdWVzdFdpdGhkcmF3YWxTaXplAAEFD3Jlc2VydmVzQWN0aW9ucwUVcmVxdWVzdFdpdGhkcmF3YWxTaXplCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWV4ZWN1dGVXaXRoZHJhd2FsAw9jYWxsZXJDb250cmFjdF8IY2hhaW5JZF8UcmVxdWVzdFdpdGhkcmF3YWxJZF8EB2NoYWluSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBBQhjaGFpbklkXwIiZXhlY3V0ZVdpdGhkcmF3YWw6IGNoYWluSWQgbm90IGludAQTcmVxdWVzdFdpdGhkcmF3YWxJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEFFHJlcXVlc3RXaXRoZHJhd2FsSWRfAi5leGVjdXRlV2l0aGRyYXdhbDogcmVxdWVzdFdpdGhkcmF3YWxJZCBub3QgaW50BBVyZXF1ZXN0V2l0aGRyYXdhbFNpemUJARpfbG9hZFJlcXVlc3RXaXRoZHJhd2FsU2l6ZQAEA2VycgMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQxfY2hhaW5FeGlzdHMCBQdjaGFpbklkAiJleGVjdXRlV2l0aGRyYXdhbDogaW52YWxpZCBjaGFpbklkBwkBDF92YWxpZGF0ZUludAQFE3JlcXVlc3RXaXRoZHJhd2FsSWQAAAkAZQIFFXJlcXVlc3RXaXRoZHJhd2FsU2l6ZQABAi5leGVjdXRlV2l0aGRyYXdhbDogaW52YWxpZCByZXF1ZXN0V2l0aGRyYXdhbElkBwMJAAACBQNlcnIFA2VycgQEZXJyMQMJAAACCQEKX2xvYWRDaGFpbgEFB2NoYWluSWQFBVdBVkVTCQETX3ZhbGlkYXRlV2F2ZXNWYXVsdAIIBQFpBmNhbGxlcgImZXhlY3V0ZVdpdGhkcmF3YWw6IGludmFsaWQgd2F2ZXMgdmF1bHQDCQERX3ZhbGlkYXRlRXhlY3V0b3ICCAUBaQZjYWxsZXICI2V4ZWN1dGVXaXRoZHJhd2FsOiBpbnZhbGlkIGV4ZWN1dG9yCQEXX3ZhbGlkYXRlQ2FsbGVyQ29udHJhY3QDBQdjaGFpbklkBQ9jYWxsZXJDb250cmFjdF8CKmV4ZWN1dGVXaXRoZHJhd2FsOiBpbnZhbGlkIGNhbGxlciBjb250cmFjdAcDCQAAAgUEZXJyMQUEZXJyMQQHcmVxdWVzdAkBFl9sb2FkUmVxdWVzdFdpdGhkcmF3YWwBBRNyZXF1ZXN0V2l0aGRyYXdhbElkBAtyZXF1ZXN0RnJvbQgFB3JlcXVlc3QCXzEECXJlcXVlc3RUbwgFB3JlcXVlc3QCXzIEEHJlcXVlc3RUb0NoYWluSWQIBQdyZXF1ZXN0Al8zBAxyZXF1ZXN0QXNzZXQIBQdyZXF1ZXN0Al80BA1yZXF1ZXN0QW1vdW50CAUHcmVxdWVzdAJfNQQNcmVxdWVzdEhlaWdodAgFB3JlcXVlc3QCXzYEDXJlcXVlc3RTdGF0dXMIBQdyZXF1ZXN0Al84BBBuZXdBc3NldFJlc2VydmVzCQC4AgIJARJfbG9hZEFzc2V0UmVzZXJ2ZXMCBRByZXF1ZXN0VG9DaGFpbklkBQxyZXF1ZXN0QXNzZXQFDXJlcXVlc3RBbW91bnQEFm5ld0Fzc2V0UmVzZXJ2ZXNMb2NrZWQJALgCAgkBGF9sb2FkQXNzZXRSZXNlcnZlc0xvY2tlZAIFEHJlcXVlc3RUb0NoYWluSWQFDHJlcXVlc3RBc3NldAUNcmVxdWVzdEFtb3VudAQIY3VycmVuY3kJARJfbG9hZEFzc2V0Q3VycmVuY3kCBRByZXF1ZXN0VG9DaGFpbklkBQxyZXF1ZXN0QXNzZXQEE25ld0N1cnJlbmN5UmVzZXJ2ZXMJALgCAgkBFV9sb2FkQ3VycmVuY3lSZXNlcnZlcwEFCGN1cnJlbmN5BQ1yZXF1ZXN0QW1vdW50BARlcnIyAwMDAwkBD192YWxpZGF0ZUJpZ0ludAMFEG5ld0Fzc2V0UmVzZXJ2ZXMFC1pFUk9fQklHSU5UAixleGVjdXRlV2l0aGRyYXdhbDogbmVnYXRpdmUgbmV3QXNzZXRSZXNlcnZlcwkBD192YWxpZGF0ZUJpZ0ludAMFFm5ld0Fzc2V0UmVzZXJ2ZXNMb2NrZWQFC1pFUk9fQklHSU5UAjJleGVjdXRlV2l0aGRyYXdhbDogbmVnYXRpdmUgbmV3QXNzZXRSZXNlcnZlc0xvY2tlZAcJAQ9fdmFsaWRhdGVCaWdJbnQDBRNuZXdDdXJyZW5jeVJlc2VydmVzBQtaRVJPX0JJR0lOVAIvZXhlY3V0ZVdpdGhkcmF3YWw6IG5lZ2F0aXZlIG5ld0N1cnJlbmN5UmVzZXJ2ZXMHCQEMX3ZhbGlkYXRlSW50BAkAZQIFBmhlaWdodAUNcmVxdWVzdEhlaWdodAkBIF9sb2FkUmVxdWVzdFdpdGhkcmF3YWxCbG9ja0RlbGF5AAUHTUFYX0lOVAInZXhlY3V0ZVdpdGhkcmF3YWw6IHRvbyBlYXJseSB0byBleGVjdXRlBwkBEV9yZXF1ZXN0SXNDcmVhdGVkAgUNcmVxdWVzdFN0YXR1cwImZXhlY3V0ZVdpdGhkcmF3YWw6IHJlcXVlc3QgaXMgcmVzb2x2ZWQHAwkAAAIFBGVycjIFBGVycjIEEXN0b3JhZ2VJbnZvY2F0aW9uCQD8BwQJARNfbG9hZEFjY291bnRTdG9yYWdlAAUNRlVOQ19XSVRIRFJBVwkAzAgCBQtyZXF1ZXN0RnJvbQkAzAgCBQhjdXJyZW5jeQkAzAgCCQCmAwEFDXJlcXVlc3RBbW91bnQFA25pbAUDbmlsAwkAAAIFEXN0b3JhZ2VJbnZvY2F0aW9uBRFzdG9yYWdlSW52b2NhdGlvbgQSd2l0aGRyYXdJbnZvY2F0aW9uAwkAAAIJAQpfbG9hZENoYWluAQUQcmVxdWVzdFRvQ2hhaW5JZAUFV0FWRVMJAPwHBAkBD19sb2FkV2F2ZXNWYXVsdAAFDUZVTkNfV0lUSERSQVcJAMwIAgUJcmVxdWVzdFRvCQDMCAIFDHJlcXVlc3RBc3NldAkAzAgCCQCmAwEFDXJlcXVlc3RBbW91bnQFA25pbAUDbmlsCQD8BwQJARFfbG9hZFZhdWx0QWRhcHRlcgAFDUZVTkNfV0lUSERSQVcJAMwIAgUQcmVxdWVzdFRvQ2hhaW5JZAkAzAgCBQxyZXF1ZXN0QXNzZXQJAMwIAgkApgMBBQ1yZXF1ZXN0QW1vdW50CQDMCAIFCXJlcXVlc3RUbwUDbmlsBQNuaWwDCQAAAgUSd2l0aGRyYXdJbnZvY2F0aW9uBRJ3aXRoZHJhd0ludm9jYXRpb24EDnJlcXVlc3RVcGRhdGVkCQCaCggIBQdyZXF1ZXN0Al8xCAUHcmVxdWVzdAJfMggFB3JlcXVlc3QCXzMIBQdyZXF1ZXN0Al80CAUHcmVxdWVzdAJfNQgFB3JlcXVlc3QCXzYIBQdyZXF1ZXN0Al83BRNSRVFVRVNUX1NUQVRVU19ET05FCQCUCgIJAM4IAgkAzggCCQDOCAIJARJfc2F2ZUFzc2V0UmVzZXJ2ZXMDBRByZXF1ZXN0VG9DaGFpbklkBQxyZXF1ZXN0QXNzZXQFEG5ld0Fzc2V0UmVzZXJ2ZXMJARhfc2F2ZUFzc2V0UmVzZXJ2ZXNMb2NrZWQDBRByZXF1ZXN0VG9DaGFpbklkBQxyZXF1ZXN0QXNzZXQFFm5ld0Fzc2V0UmVzZXJ2ZXNMb2NrZWQJARVfc2F2ZUN1cnJlbmN5UmVzZXJ2ZXMCBQhjdXJyZW5jeQUTbmV3Q3VycmVuY3lSZXNlcnZlcwkBFl9zYXZlUmVxdWVzdFdpdGhkcmF3YWwCBRNyZXF1ZXN0V2l0aGRyYXdhbElkBQ5yZXF1ZXN0VXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwkFZnJvbV8DdG9fCnRvQ2hhaW5JZF8GYXNzZXRfB2Ftb3VudF8KdGltZXN0YW1wXwpwdWJsaWNLZXlfBGFsZ18Kc2lnbmF0dXJlXwQJdG9DaGFpbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUKdG9DaGFpbklkXwIbd2l0aGRyYXc6IHRvQ2hhaW5JZCBub3QgaW50BAZhbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBBQdhbW91bnRfAhh3aXRoZHJhdzogYW1vdW50IG5vdCBpbnQECXRpbWVzdGFtcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEFCnRpbWVzdGFtcF8CG3dpdGhkcmF3OiB0aW1lc3RhbXAgbm90IGludAQDYWxnCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUEYWxnXwIVd2l0aGRyYXc6IGFsZyBub3QgaW50BAlwdWJsaWNLZXkJANkEAQUKcHVibGljS2V5XwQJc2lnbmF0dXJlCQDZBAEFCnNpZ25hdHVyZV8EA2VycgMDAwMDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBEl92YWxpZGF0ZVNlcXVlbmNlcgIIBQFpBmNhbGxlcgIbd2l0aGRyYXc6IGludmFsaWQgc2VxdWVuY2VyBwkBD192YWxpZGF0ZVN0cmluZwIFBWZyb21fAhZ3aXRoZHJhdzogaW52YWxpZCBmcm9tBwkBD192YWxpZGF0ZVN0cmluZwIFA3RvXwIUd2l0aGRyYXc6IGludmFsaWQgdG8HCQEMX2NoYWluRXhpc3RzAgUJdG9DaGFpbklkAht3aXRoZHJhdzogaW52YWxpZCB0b0NoYWluSWQHCQEUX2Fzc2V0Q3VycmVuY3lFeGlzdHMDBQl0b0NoYWluSWQFBmFzc2V0XwIXd2l0aGRyYXc6IGludmFsaWQgYXNzZXQHCQEPX3ZhbGlkYXRlQmlnSW50AwUGYW1vdW50BQtaRVJPX0JJR0lOVAIYd2l0aGRyYXc6IGludmFsaWQgYW1vdW50BwkBDF92YWxpZGF0ZUludAQJAGQCBQl0aW1lc3RhbXAFB09ORV9EQVkIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQdNQVhfSU5UAht3aXRoZHJhdzogaW52YWxpZCB0aW1lc3RhbXAHCQESX3ZhbGlkYXRlUHVibGljS2V5AwUJcHVibGljS2V5BQNhbGcCGHdpdGhkcmF3OiBpbnYgcHVibGljIGtleQcJARhfdmFsaWRhdGVTaWduYXR1cmVGb3JtYXQDBQlzaWduYXR1cmUFA2FsZwIYd2l0aGRyYXc6IGludiBzaWcgZm9ybWF0BwkBIF92YWxpZGF0ZVB1YmxpY0tleU1hdGNoZXNBZGRyZXNzBAUJcHVibGljS2V5BQVmcm9tXwUDYWxnAh13aXRoZHJhdzogcHVibGljIGtleSBtaXNtYXRjaAcDCQAAAgUDZXJyBQNlcnIED3dpdGhkcmF3YWxCeXRlcwkAywECCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAywECCQDLAQIJAMsBAgkAywECCQCaAwEJALECAQUFZnJvbV8JAJsDAQUFZnJvbV8JAJoDAQkAsQIBBQN0b18JAJsDAQUDdG9fCQCaAwEFCXRvQ2hhaW5JZAkAmgMBCQCxAgEFBmFzc2V0XwkAmwMBBQZhc3NldF8JAJ0DAQUGYW1vdW50CQCaAwEFCXRpbWVzdGFtcAUJcHVibGljS2V5CQCaAwEFA2FsZwQOd2l0aGRyYXdhbEhhc2gJAIwVAQUPd2l0aGRyYXdhbEJ5dGVzBAhjdXJyZW5jeQkBEl9sb2FkQXNzZXRDdXJyZW5jeQIFCXRvQ2hhaW5JZAUGYXNzZXRfBBBhdmFpbGFibGVCYWxhbmNlBAckbWF0Y2gwCQD8BwQJARNfbG9hZEFjY291bnRTdG9yYWdlAAUVRlVOQ19HRVRfVVNFUl9CQUxBTkNFCQDMCAIFBWZyb21fCQDMCAIFC1NQT1RfV0FMTEVUCQDMCAIFCGN1cnJlbmN5BQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJAKcDAQUBYQkAAgECM3dpdGhkcmF3OiBjYW4ndCB0YWtlIGF2YWlsYWJsZSBiYWxhbmNlIGZyb20gc3RvcmFnZQMJAAACBRBhdmFpbGFibGVCYWxhbmNlBRBhdmFpbGFibGVCYWxhbmNlBA1hc3NldFJlc2VydmVzCQESX2xvYWRBc3NldFJlc2VydmVzAgUJdG9DaGFpbklkBQZhc3NldF8EDmxvY2tlZFJlc2VydmVzCQEYX2xvYWRBc3NldFJlc2VydmVzTG9ja2VkAgUJdG9DaGFpbklkBQZhc3NldF8EBGVycjEDAwMJARxfdmFsaWRhdGVXaXRoZHJhd2FsU2lnbmF0dXJlBQUOd2l0aGRyYXdhbEhhc2gFCXNpZ25hdHVyZQUJcHVibGljS2V5BQNhbGcCFXdpdGhkcmF3OiBpbnZhbGlkIHNpZwkBHF9jaGVja1dpdGhkcmF3YWxIYXNoTm90RXhpc3QCBQ53aXRoZHJhd2FsSGFzaAIad2l0aGRyYXc6IGFscmVhZHkgZXhlY3V0ZWQHCQEPX3ZhbGlkYXRlQmlnSW50AwUQYXZhaWxhYmxlQmFsYW5jZQUGYW1vdW50Ah53aXRoZHJhdzogaW5zdWZmaWNpZW50IGJhbGFuY2UHCQEPX3ZhbGlkYXRlQmlnSW50AwkAuAICBQ1hc3NldFJlc2VydmVzBQ5sb2NrZWRSZXNlcnZlcwUGYW1vdW50Ah93aXRoZHJhdzogaW5zdWZmaWNpZW50IHJlc2VydmVzBwMJAAACBQRlcnIxBQRlcnIxBBBuZXdBc3NldFJlc2VydmVzCQC4AgIFDWFzc2V0UmVzZXJ2ZXMFBmFtb3VudAQTbmV3Q3VycmVuY3lSZXNlcnZlcwkAuAICCQEVX2xvYWRDdXJyZW5jeVJlc2VydmVzAQUIY3VycmVuY3kFBmFtb3VudAQEZXJyMgMJAQ9fdmFsaWRhdGVCaWdJbnQDBRBuZXdBc3NldFJlc2VydmVzBQtaRVJPX0JJR0lOVAIjd2l0aGRyYXc6IG5lZ2F0aXZlIG5ld0Fzc2V0UmVzZXJ2ZXMJAQ9fdmFsaWRhdGVCaWdJbnQDBRNuZXdDdXJyZW5jeVJlc2VydmVzBQtaRVJPX0JJR0lOVAImd2l0aGRyYXc6IG5lZ2F0aXZlIG5ld0N1cnJlbmN5UmVzZXJ2ZXMHAwkAAAIFBGVycjIFBGVycjIEEXN0b3JhZ2VJbnZvY2F0aW9uCQD8BwQJARNfbG9hZEFjY291bnRTdG9yYWdlAAUWRlVOQ19JTlRFUk5BTF9UUkFOU0ZFUgkAzAgCBQVmcm9tXwkAzAgCBQtTUE9UX1dBTExFVAkAzAgCBRJXSVRIRFJBV0FMU19XQUxMRVQJAMwIAgUIY3VycmVuY3kJAMwIAgUHYW1vdW50XwUDbmlsBQNuaWwDCQAAAgURc3RvcmFnZUludm9jYXRpb24FEXN0b3JhZ2VJbnZvY2F0aW9uBBJzdG9yYWdlSW52b2NhdGlvbjEJAPwHBAkBE19sb2FkQWNjb3VudFN0b3JhZ2UABQ1GVU5DX1dJVEhEUkFXCQDMCAIFBWZyb21fCQDMCAIFCGN1cnJlbmN5CQDMCAIFB2Ftb3VudF8FA25pbAUDbmlsAwkAAAIFEnN0b3JhZ2VJbnZvY2F0aW9uMQUSc3RvcmFnZUludm9jYXRpb24xBBJ3aXRoZHJhd0ludm9jYXRpb24DCQAAAgkBCl9sb2FkQ2hhaW4BBQl0b0NoYWluSWQFBVdBVkVTCQD8BwQJAQ9fbG9hZFdhdmVzVmF1bHQABQ1GVU5DX1dJVEhEUkFXCQDMCAIFA3RvXwkAzAgCBQZhc3NldF8JAMwIAgUHYW1vdW50XwUDbmlsBQNuaWwJAPwHBAkBEV9sb2FkVmF1bHRBZGFwdGVyAAUNRlVOQ19XSVRIRFJBVwkAzAgCBQl0b0NoYWluSWQJAMwIAgUGYXNzZXRfCQDMCAIFB2Ftb3VudF8JAMwIAgUDdG9fBQNuaWwFA25pbAMJAAACBRJ3aXRoZHJhd0ludm9jYXRpb24FEndpdGhkcmF3SW52b2NhdGlvbgkAlAoCCQDOCAIJAM4IAgkBEl9zYXZlQXNzZXRSZXNlcnZlcwMFCXRvQ2hhaW5JZAUGYXNzZXRfBRBuZXdBc3NldFJlc2VydmVzCQEVX3NhdmVDdXJyZW5jeVJlc2VydmVzAgUIY3VycmVuY3kFE25ld0N1cnJlbmN5UmVzZXJ2ZXMJARNfc2F2ZVdpdGhkcmF3YWxIYXNoAgUOd2l0aGRyYXdhbEhhc2gJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRkZXBvc2l0U3Rha2luZ1Jld2FyZAQPY2FsbGVyQ29udHJhY3RfCGNoYWluSWRfBmFzc2V0XwdhbW91bnRfBAdjaGFpbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUIY2hhaW5JZF8CJWRlcG9zaXRTdGFraW5nUmV3YXJkOiBjaGFpbklkIG5vdCBpbnQEBmFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEFB2Ftb3VudF8CJGRlcG9zaXRTdGFraW5nUmV3YXJkOiBhbW91bnQgbm90IGludAQDZXJyAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF9jaGFpbkV4aXN0cwIFB2NoYWluSWQCJWRlcG9zaXRTdGFraW5nUmV3YXJkOiBpbnZhbGlkIGNoYWluSWQHCQEUX2Fzc2V0Q3VycmVuY3lFeGlzdHMDBQdjaGFpbklkBQZhc3NldF8CI2RlcG9zaXRTdGFraW5nUmV3YXJkOiBpbnZhbGlkIGFzc2V0BwkBD192YWxpZGF0ZUJpZ0ludAMFBmFtb3VudAULWkVST19CSUdJTlQCJGRlcG9zaXRTdGFraW5nUmV3YXJkOiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEBGVycjEDCQAAAgkBCl9sb2FkQ2hhaW4BBQdjaGFpbklkBQVXQVZFUwkBE192YWxpZGF0ZVdhdmVzVmF1bHQCCAUBaQZjYWxsZXICKWRlcG9zaXRTdGFraW5nUmV3YXJkOiBpbnZhbGlkIHdhdmVzIHZhdWx0AwkBEV92YWxpZGF0ZUV4ZWN1dG9yAggFAWkGY2FsbGVyAiZkZXBvc2l0U3Rha2luZ1Jld2FyZDogaW52YWxpZCBleGVjdXRvcgkBF192YWxpZGF0ZUNhbGxlckNvbnRyYWN0AwUHY2hhaW5JZAUPY2FsbGVyQ29udHJhY3RfAi1kZXBvc2l0U3Rha2luZ1Jld2FyZDogaW52YWxpZCBjYWxsZXIgY29udHJhY3QHAwkAAAIFBGVycjEFBGVycjEEEG5ld0Fzc2V0UmVzZXJ2ZXMJALcCAgkBEl9sb2FkQXNzZXRSZXNlcnZlcwIFB2NoYWluSWQFBmFzc2V0XwUGYW1vdW50BAhjdXJyZW5jeQkBEl9sb2FkQXNzZXRDdXJyZW5jeQIFB2NoYWluSWQFBmFzc2V0XwQTbmV3Q3VycmVuY3lSZXNlcnZlcwkAtwICCQEVX2xvYWRDdXJyZW5jeVJlc2VydmVzAQUIY3VycmVuY3kFBmFtb3VudAQKaW52b2NhdGlvbgkA/AcECQETX2xvYWRBY2NvdW50U3RvcmFnZQAFG0ZVTkNfREVQT1NJVF9TVEFLSU5HX1JFV0FSRAkAzAgCCQEWX2xvYWRSZXdhcmREaXN0cmlidXRvcgAJAMwIAgUIY3VycmVuY3kJAMwIAgUHYW1vdW50XwUDbmlsBQNuaWwDCQAAAgUKaW52b2NhdGlvbgUKaW52b2NhdGlvbgkAlAoCCQDOCAIJARJfc2F2ZUFzc2V0UmVzZXJ2ZXMDBQdjaGFpbklkBQZhc3NldF8FEG5ld0Fzc2V0UmVzZXJ2ZXMJARVfc2F2ZUN1cnJlbmN5UmVzZXJ2ZXMCBQhjdXJyZW5jeQUTbmV3Q3VycmVuY3lSZXNlcnZlcwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhhZGRDaGFpbgMIY2hhaW5JZF8FbmFtZV8PY2FsbGVyQ29udHJhY3RfBANlcnIDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEMX3ZhbGlkYXRlSW50BAUIY2hhaW5JZF8AAAUHTUFYX0lOVAIZYWRkQ2hhaW46IGludmFsaWQgY2hhaW5JZAcJAQ9fdmFsaWRhdGVTdHJpbmcCBQVuYW1lXwIWYWRkQ2hhaW46IGludmFsaWQgbmFtZQcJAQ9fdmFsaWRhdGVTdHJpbmcCBQ9jYWxsZXJDb250cmFjdF8CIGFkZENoYWluOiBpbnZhbGlkIGNhbGxlckNvbnRyYWN0BwkBDl9jaGFpbk5vdEV4aXN0AgUIY2hhaW5JZF8CGGFkZENoYWluOiBhbHJlYWR5IGV4aXN0cwcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQEKX3NhdmVDaGFpbgIFCGNoYWluSWRfBQVuYW1lXwkBE19zYXZlQ2FsbGVyQ29udHJhY3QCBQhjaGFpbklkXwUPY2FsbGVyQ29udHJhY3RfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGFkZEFzc2V0AwhjaGFpbklkXwZhc3NldF8JY3VycmVuY3lfBANlcnIDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEMX2NoYWluRXhpc3RzAgUIY2hhaW5JZF8CGWFkZEFzc2V0OiBpbnZhbGlkIGNoYWluSWQHCQEPX3ZhbGlkYXRlU3RyaW5nAgUGYXNzZXRfAhdhZGRBc3NldDogaW52YWxpZCBhc3NldAcJAQ9fdmFsaWRhdGVTdHJpbmcCBQljdXJyZW5jeV8CGmFkZEFzc2V0OiBpbnZhbGlkIGN1cnJlbmN5BwkBFl9hc3NldEN1cnJlbmN5Tm90RXhpc3QDBQhjaGFpbklkXwUGYXNzZXRfAhhhZGRBc3NldDogYWxyZWFkeSBleGlzdHMHAwkAAAIFA2VycgUDZXJyCQCUCgIJARJfc2F2ZUFzc2V0Q3VycmVuY3kDBQhjaGFpbklkXwUGYXNzZXRfBQljdXJyZW5jeV8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEec2V0UmVxdWVzdFdpdGhkcmF3YWxCbG9ja0RlbGF5AQZkZWxheV8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQxfdmFsaWRhdGVJbnQEBQZkZWxheV8AAAUHTUFYX0lOVAItc2V0UmVxdWVzdFdpdGhkcmF3YWxCbG9ja0RlbGF5OiBpbnZhbGlkIGRlbGF5BwMJAAACBQNlcnIFA2VycgkAlAoCCQEgX3NhdmVSZXF1ZXN0V2l0aGRyYXdhbEJsb2NrRGVsYXkBBQZkZWxheV8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEXdXBkYXRlUmV3YXJkRGlzdHJpYnV0b3IBEnJld2FyZERpc3RyaWJ1dG9yXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBD192YWxpZGF0ZVN0cmluZwIFEnJld2FyZERpc3RyaWJ1dG9yXwIydXBkYXRlUmV3YXJkRGlzdHJpYnV0b3I6IGludmFsaWQgcmV3YXJkRGlzdHJpYnV0b3IHAwkAAAIFA2VycgUDZXJyCQCUCgIJARZfc2F2ZVJld2FyZERpc3RyaWJ1dG9yAQUScmV3YXJkRGlzdHJpYnV0b3JfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1bnBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBC193aGVuUGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQx1cGRhdGVQYXVzZXIBB3BhdXNlcl8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIcdXBkYXRlUGF1c2VyOiBpbnZhbGlkIHBhdXNlcgcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzZXRNdWx0aXNpZwEJbXVsdGlzaWdfBANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfdmFsaWRhdGVBZGRyZXNzAgUJbXVsdGlzaWdfAh1zZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZwcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDV9zYXZlTXVsdGlzaWcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQltdWx0aXNpZ18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcECG11bHRpc2lnBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG11bHRpc2lnCQC5CQIJAMwIAgUKS0VZX1NUQVRVUwkAzAgCCQClCAEFBHRoaXMJAMwIAgkA2AQBCAUCdHgCaWQFA25pbAUJU0VQQVJBVE9SBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tlecuOLnI=", "height": 3178982, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 7 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEPARATOR = "__"
5+
6+let KEY_MULTISIG = "MULTISIG"
7+
8+let KEY_STATUS = "STATUS"
9+
10+let KEY_INIT = "INIT"
11+
12+let KEY_PAUSED = "PAUSED"
13+
14+let KEY_PAUSER = "PAUSER"
15+
16+let KEY_EXECUTOR = "EXECUTOR"
17+
18+let KEY_CALLER_CONTRACT = "CALLER_CONTRACT"
19+
20+let KEY_WAVES_VAULT = "WAVES_VAULT"
21+
22+let KEY_ACCOUNT_STORAGE = "ACCOUNT_STORAGE"
23+
24+let KEY_CHAIN = "CHAIN"
25+
26+let KEY_ASSET_CURRENCY = "ASSET_CURRENCY"
27+
28+let KEY_ASSET_RESERVES = "ASSET_RESERVES"
29+
30+let KEY_ASSET_RESERVES_LOCKED = "ASSET_RESERVES_LOCKED"
31+
32+let KEY_CURRENCY_RESERVES = "CURRENCY_RESERVES"
33+
34+let KEY_REQUEST_WITHDRAWAL_SIZE = "REQUEST_WITHDRAWAL_SIZE"
35+
36+let KEY_REQUEST_WITHDRAWAL = "REQUEST_WITHDRAWAL"
37+
38+let KEY_REQUEST_WITHDRAWAL_BLOCK_DELAY = "REQUEST_WITHDRAWAL_BLOCK_DELAY"
39+
40+let KEY_SEQUENCER = "SEQUENCER"
41+
42+let KEY_WITHDRAWAL_HASH = "WITHDRAWAL_HASH"
43+
44+let KEY_VAULT_ADAPTER = "VAULT_ADAPTER"
45+
46+let KEY_REWARD_DISTRIBUTOR = "REWARD_DISTRIBUTOR"
47+
48+let FUNC_DEPOSIT = "deposit"
49+
50+let FUNC_GET_USER_BALANCE = "getUserBalance"
51+
52+let FUNC_INTERNAL_TRANSFER = "internalTransfer"
53+
54+let FUNC_WITHDRAW = "withdraw"
55+
56+let FUNC_DEPOSIT_STAKING_REWARD = "depositStakingReward"
57+
58+let REQUEST_STATUS_CREATED = 0
59+
60+let REQUEST_STATUS_DONE = 1
61+
62+let REQUEST_STATUS_REJECTED = 2
63+
64+let WAVES = "WAVES"
65+
66+let SPOT_WALLET = "SPOT"
67+
68+let WITHDRAWALS_WALLET = "WITHDRAWALS"
69+
70+let MAX_INT = 9223372036854775807
71+
72+let ZERO_BIGINT = toBigInt(0)
73+
74+let ONE_BIGINT = toBigInt(1)
75+
76+let ONE_DAY = 86400000
77+
78+let ALG_TYPE_WAVES = 1
79+
80+let ALG_TYPE_EVM = 2
81+
82+let EVM_SIGNATURE_PREFIX = base58'G5Nu92G2p7moXW9qjjN3na7gtq4dWCeVdaSjry'
83+
84+func _validateAddress (address_,err_) = match addressFromString(address_) {
85+ case a: Address =>
86+ true
87+ case _ =>
88+ throw(err_)
89+}
90+
91+
92+func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
93+ then true
94+ else (val_ > upperBoundary_))
95+ then throw(err_)
96+ else true
97+
98+
99+func _validateBigInt (val_,lowerBoundary_,err_) = if ((lowerBoundary_ > val_))
100+ then throw(err_)
101+ else true
102+
103+
104+func _validateString (val_,err_) = if (if ((0 >= size(val_)))
105+ then true
106+ else contains(val_, SEPARATOR))
107+ then throw(err_)
108+ else true
109+
110+
111+func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
112+ then throw(err_)
113+ else true
114+
115+
116+func _loadInit () = match getBoolean(KEY_INIT) {
117+ case a: Boolean =>
118+ a
119+ case _ =>
120+ false
121+}
122+
123+
124+func _saveInit (isInit_) = [BooleanEntry(KEY_INIT, isInit_)]
125+
126+
127+func _loadPause () = match getBoolean(KEY_PAUSED) {
128+ case a: Boolean =>
129+ a
130+ case _ =>
131+ false
132+}
133+
134+
135+func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
136+
137+
138+func _loadPauser () = match getString(KEY_PAUSER) {
139+ case a: String =>
140+ addressFromStringValue(a)
141+ case _ =>
142+ Address(base58'')
143+}
144+
145+
146+func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
147+
148+
149+func _loadMultisig () = match getString(KEY_MULTISIG) {
150+ case a: String =>
151+ addressFromStringValue(a)
152+ case _ =>
153+ Address(base58'')
154+}
155+
156+
157+func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
158+
159+
160+func _loadCallerContract (chainId_) = match getString(makeString([KEY_CALLER_CONTRACT, toString(chainId_)], SEPARATOR)) {
161+ case a: String =>
162+ a
163+ case _ =>
164+ ""
165+}
166+
167+
168+func _saveCallerContract (chainId_,callerContract_) = [StringEntry(makeString([KEY_CALLER_CONTRACT, toString(chainId_)], SEPARATOR), callerContract_)]
169+
170+
171+func _loadExecutor () = match getString(KEY_EXECUTOR) {
172+ case a: String =>
173+ addressFromStringValue(a)
174+ case _ =>
175+ Address(base58'')
176+}
177+
178+
179+func _saveExecutor (executor_) = [StringEntry(KEY_EXECUTOR, toString(executor_))]
180+
181+
182+func _loadAccountStorage () = match getString(KEY_ACCOUNT_STORAGE) {
183+ case a: String =>
184+ addressFromStringValue(a)
185+ case _ =>
186+ Address(base58'')
187+}
188+
189+
190+func _saveAccountStorage (accountStorage_) = [StringEntry(KEY_ACCOUNT_STORAGE, toString(accountStorage_))]
191+
192+
193+func _loadWavesVault () = match getString(KEY_WAVES_VAULT) {
194+ case a: String =>
195+ addressFromStringValue(a)
196+ case _ =>
197+ Address(base58'')
198+}
199+
200+
201+func _saveWavesVault (wavesVault_) = [StringEntry(KEY_WAVES_VAULT, toString(wavesVault_))]
202+
203+
204+func _loadChain (chainId_) = match getString(makeString([KEY_CHAIN, toString(chainId_)], SEPARATOR)) {
205+ case a: String =>
206+ a
207+ case _ =>
208+ ""
209+}
210+
211+
212+func _saveChain (chainId_,name_) = [StringEntry(makeString([KEY_CHAIN, toString(chainId_)], SEPARATOR), name_)]
213+
214+
215+func _loadAssetCurrency (chainId_,asset_) = match getString(makeString([KEY_ASSET_CURRENCY, toString(chainId_), asset_], SEPARATOR)) {
216+ case a: String =>
217+ a
218+ case _ =>
219+ ""
220+}
221+
222+
223+func _saveAssetCurrency (chainId_,asset_,currency_) = [StringEntry(makeString([KEY_ASSET_CURRENCY, toString(chainId_), asset_], SEPARATOR), currency_)]
224+
225+
226+func _loadAssetReserves (chainId_,asset_) = match getString(makeString([KEY_ASSET_RESERVES, toString(chainId_), asset_], SEPARATOR)) {
227+ case a: String =>
228+ parseBigIntValue(a)
229+ case _ =>
230+ ZERO_BIGINT
231+}
232+
233+
234+func _saveAssetReserves (chainId_,asset_,reserves_) = [StringEntry(makeString([KEY_ASSET_RESERVES, toString(chainId_), asset_], SEPARATOR), toString(reserves_))]
235+
236+
237+func _loadAssetReservesLocked (chainId_,asset_) = match getString(makeString([KEY_ASSET_RESERVES_LOCKED, toString(chainId_), asset_], SEPARATOR)) {
238+ case a: String =>
239+ parseBigIntValue(a)
240+ case _ =>
241+ ZERO_BIGINT
242+}
243+
244+
245+func _saveAssetReservesLocked (chainId_,asset_,reserves_) = [StringEntry(makeString([KEY_ASSET_RESERVES_LOCKED, toString(chainId_), asset_], SEPARATOR), toString(reserves_))]
246+
247+
248+func _loadCurrencyReserves (currency_) = match getString(makeString([KEY_CURRENCY_RESERVES, currency_], SEPARATOR)) {
249+ case a: String =>
250+ parseBigIntValue(a)
251+ case _ =>
252+ ZERO_BIGINT
253+}
254+
255+
256+func _saveCurrencyReserves (currency_,reserves_) = [StringEntry(makeString([KEY_CURRENCY_RESERVES, currency_], SEPARATOR), toString(reserves_))]
257+
258+
259+func _loadRequestWithdrawalSize () = match getInteger(KEY_REQUEST_WITHDRAWAL_SIZE) {
260+ case a: Int =>
261+ a
262+ case _ =>
263+ 0
264+}
265+
266+
267+func _saveRequestWithdrawalSize (val_) = [IntegerEntry(KEY_REQUEST_WITHDRAWAL_SIZE, val_)]
268+
269+
270+func _loadRequestWithdrawal (index_) = match getString(makeString([KEY_REQUEST_WITHDRAWAL, toString(index_)], SEPARATOR)) {
271+ case a: String =>
272+ let struct = split(a, SEPARATOR)
273+ $Tuple8(struct[0], struct[1], parseIntValue(struct[2]), struct[3], parseBigIntValue(struct[4]), parseIntValue(struct[5]), struct[6], parseIntValue(struct[7]))
274+ case _ =>
275+ $Tuple8("", "", 0, "", ZERO_BIGINT, 0, "", REQUEST_STATUS_CREATED)
276+}
277+
278+
279+func _saveRequestWithdrawal (index_,request_) = [StringEntry(makeString([KEY_REQUEST_WITHDRAWAL, toString(index_)], SEPARATOR), makeString([request_._1, request_._2, toString(request_._3), request_._4, toString(request_._5), toString(request_._6), request_._7, toString(request_._8)], SEPARATOR))]
280+
281+
282+func _loadRequestWithdrawalBlockDelay () = match getInteger(KEY_REQUEST_WITHDRAWAL_BLOCK_DELAY) {
283+ case a: Int =>
284+ a
285+ case _ =>
286+ 0
287+}
288+
289+
290+func _saveRequestWithdrawalBlockDelay (delay_) = [IntegerEntry(KEY_REQUEST_WITHDRAWAL_BLOCK_DELAY, delay_)]
291+
292+
293+func _loadSequencer () = match getString(KEY_SEQUENCER) {
294+ case a: String =>
295+ addressFromStringValue(a)
296+ case _ =>
297+ Address(base58'')
298+}
299+
300+
301+func _saveSequencer (sequencer_) = [StringEntry(KEY_SEQUENCER, toString(sequencer_))]
302+
303+
304+func _loadWithdrawalHash (withdrawalHash_) = match getString(makeString([KEY_WITHDRAWAL_HASH, toBase58String(withdrawalHash_)], SEPARATOR)) {
305+ case a: String =>
306+ a
307+ case _ =>
308+ ""
309+}
310+
311+
312+func _saveWithdrawalHash (withdrawalHash_,txId_) = [StringEntry(makeString([KEY_WITHDRAWAL_HASH, toBase58String(withdrawalHash_)], SEPARATOR), txId_)]
313+
314+
315+func _loadVaultAdapter () = match getString(KEY_VAULT_ADAPTER) {
316+ case a: String =>
317+ addressFromStringValue(a)
318+ case _ =>
319+ Address(base58'')
320+}
321+
322+
323+func _saveVaultAdapter (vaultAdapter_) = [StringEntry(KEY_VAULT_ADAPTER, toString(vaultAdapter_))]
324+
325+
326+func _loadRewardDistributor () = match getString(KEY_REWARD_DISTRIBUTOR) {
327+ case a: String =>
328+ a
329+ case _ =>
330+ ""
331+}
332+
333+
334+func _saveRewardDistributor (distributor_) = [StringEntry(KEY_REWARD_DISTRIBUTOR, distributor_)]
335+
336+
337+func _onlyThisContract (caller_) = if ((caller_ != this))
338+ then throw("_onlyThisContract: revert")
339+ else true
340+
341+
342+func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
343+ then throw("_whenMultisigSet: revert")
344+ else true
345+
346+
347+func _whenNotInitialized () = if (_loadInit())
348+ then throw("_whenNotInitialized: revert")
349+ else true
350+
351+
352+func _whenInitialized () = if (!(_loadInit()))
353+ then throw("_whenInitialized: revert")
354+ else true
355+
356+
357+func _whenNotPaused () = if (_loadPause())
358+ then throw("_whenNotPaused: revert")
359+ else true
360+
361+
362+func _whenPaused () = if (!(_loadPause()))
363+ then throw("_whenPaused: revert")
364+ else true
365+
366+
367+func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
368+ then throw("_onlyPauser: revert")
369+ else true
370+
371+
372+func _validateExecutor (val_,err_) = if ((val_ != _loadExecutor()))
373+ then throw(err_)
374+ else true
375+
376+
377+func _validateCallerContract (chainId_,callerContract_,err_) = if ((_loadCallerContract(chainId_) != callerContract_))
378+ then throw(err_)
379+ else true
380+
381+
382+func _chainExists (chainId_,err_) = if ((0 >= size(_loadChain(chainId_))))
383+ then throw(err_)
384+ else true
385+
386+
387+func _chainNotExist (chainId_,err_) = if ((size(_loadChain(chainId_)) > 0))
388+ then throw(err_)
389+ else true
390+
391+
392+func _assetCurrencyExists (chainId_,asset_,err_) = if ((0 >= size(_loadAssetCurrency(chainId_, asset_))))
393+ then throw(err_)
394+ else true
395+
396+
397+func _assetCurrencyNotExist (chainId_,asset_,err_) = if ((size(_loadAssetCurrency(chainId_, asset_)) > 0))
398+ then throw(err_)
399+ else true
400+
401+
402+func _validateWavesVault (caller,err_) = if ((_loadWavesVault() != caller))
403+ then throw(err_)
404+ else true
405+
406+
407+func _requestIsCreated (status_,err_) = if ((status_ != REQUEST_STATUS_CREATED))
408+ then throw(err_)
409+ else true
410+
411+
412+func _validateSequencer (caller,err_) = if ((_loadSequencer() != caller))
413+ then throw(err_)
414+ else true
415+
416+
417+func _checkWithdrawalHashNotExist (withdrawalHash_,err_) = if ((size(_loadWithdrawalHash(withdrawalHash_)) > 0))
418+ then throw(err_)
419+ else true
420+
421+
422+func _validateSignatureFormat (signature_,alg_,err_) = if ((alg_ == ALG_TYPE_WAVES))
423+ then if ((size(signature_) != 64))
424+ then throw(err_)
425+ else true
426+ else if ((alg_ == ALG_TYPE_EVM))
427+ then if ((size(signature_) != 65))
428+ then throw(err_)
429+ else true
430+ else throw((err_ + ": inv alg"))
431+
432+
433+func _validatePublicKey (publicKey_,alg_,err_) = if ((alg_ == ALG_TYPE_WAVES))
434+ then if ((size(publicKey_) != 32))
435+ then throw(err_)
436+ else true
437+ else if ((alg_ == ALG_TYPE_EVM))
438+ then if ((size(publicKey_) != 20))
439+ then throw(err_)
440+ else true
441+ else throw((err_ + ": inv alg"))
442+
443+
444+func _validateWithdrawalSignature (withdrawalHash_,signature_,publicKey_,alg_,err_) = {
445+ let result = if ((alg_ == ALG_TYPE_WAVES))
446+ then sigVerify(withdrawalHash_, signature_, publicKey_)
447+ else if ((alg_ == ALG_TYPE_EVM))
448+ then {
449+ let hashWithPrefix = keccak256_16Kb((EVM_SIGNATURE_PREFIX + withdrawalHash_))
450+ (takeRight(keccak256_16Kb(ecrecover(hashWithPrefix, signature_)), 20) == publicKey_)
451+ }
452+ else throw((err_ + ": inv alg"))
453+ if (!(result))
454+ then throw(err_)
455+ else true
456+ }
457+
458+
459+func _validatePublicKeyMatchesAddress (publicKey_,from_,alg_,err_) = {
460+ let address = if ((alg_ == ALG_TYPE_WAVES))
461+ then toString(addressFromPublicKey(publicKey_))
462+ else if ((alg_ == ALG_TYPE_EVM))
463+ then ("0x" + toBase16String(publicKey_))
464+ else throw((err_ + ": inv alg"))
465+ if ((address != from_))
466+ then throw(err_)
467+ else true
468+ }
469+
470+
471+@Callable(i)
472+func init (executor_,pauser_,accountStorage_,wavesVault_,sequencer_,vaultAdapter_) = {
473+ let err = if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
474+ then _whenNotInitialized()
475+ else false)
476+ then _whenMultisigSet()
477+ else false)
478+ then _validateAddress(executor_, "init: invalid executor")
479+ else false)
480+ then _validateAddress(pauser_, "init: invalid pauser")
481+ else false)
482+ then _validateAddress(accountStorage_, "init: invalid accountStorage")
483+ else false)
484+ then _validateAddress(wavesVault_, "init: invalid wavesVault")
485+ else false)
486+ then _validateAddress(sequencer_, "init: invalid sequencer")
487+ else false)
488+ then _validateAddress(vaultAdapter_, "init: invalid vaultAdapter")
489+ else false
490+ if ((err == err))
491+ then $Tuple2(((((((_saveInit(true) ++ _saveExecutor(addressFromStringValue(executor_))) ++ _savePauser(addressFromStringValue(pauser_))) ++ _saveAccountStorage(addressFromStringValue(accountStorage_))) ++ _saveWavesVault(addressFromStringValue(wavesVault_))) ++ _saveSequencer(addressFromStringValue(sequencer_))) ++ _saveVaultAdapter(addressFromStringValue(vaultAdapter_))), unit)
492+ else throw("Strict value is not equal to itself.")
493+ }
494+
495+
496+
497+@Callable(i)
498+func deposit (callerContract_,from_,to_,chainId_,asset_,amount_) = {
499+ let chainId = valueOrErrorMessage(parseInt(chainId_), "deposit: chainId not int")
500+ let amount = valueOrErrorMessage(parseBigInt(amount_), "deposit: amount not int")
501+ let err = if (if (if (if (if (if (_whenInitialized())
502+ then _whenNotPaused()
503+ else false)
504+ then _chainExists(chainId, "deposit: invalid chainId")
505+ else false)
506+ then _validateString(from_, "deposit: invalid from")
507+ else false)
508+ then _validateString(to_, "deposit: invalid to")
509+ else false)
510+ then _assetCurrencyExists(chainId, asset_, "deposit: invalid asset")
511+ else false)
512+ then _validateBigInt(amount, ZERO_BIGINT, "deposit: invalid amount")
513+ else false
514+ if ((err == err))
515+ then {
516+ let err1 = if ((_loadChain(chainId) == WAVES))
517+ then _validateWavesVault(i.caller, "deposit: invalid waves vault")
518+ else if (_validateExecutor(i.caller, "deposit: invalid executor"))
519+ then _validateCallerContract(chainId, callerContract_, "deposit: invalid caller contract")
520+ else false
521+ if ((err1 == err1))
522+ then {
523+ let newAssetReserves = (_loadAssetReserves(chainId, asset_) + amount)
524+ let currency = _loadAssetCurrency(chainId, asset_)
525+ let newCurrencyReserves = (_loadCurrencyReserves(currency) + amount)
526+ let invocation = invoke(_loadAccountStorage(), FUNC_DEPOSIT, [to_, currency, amount_], nil)
527+ if ((invocation == invocation))
528+ then $Tuple2((_saveAssetReserves(chainId, asset_, newAssetReserves) ++ _saveCurrencyReserves(currency, newCurrencyReserves)), unit)
529+ else throw("Strict value is not equal to itself.")
530+ }
531+ else throw("Strict value is not equal to itself.")
532+ }
533+ else throw("Strict value is not equal to itself.")
534+ }
535+
536+
537+
538+@Callable(i)
539+func requestWithdrawal (callerContract_,from_,to_,fromChainId_,toChainId_,asset_,amount_) = {
540+ let fromChainId = valueOrErrorMessage(parseInt(fromChainId_), "requestWithdrawal: fromChainId not int")
541+ let toChainId = valueOrErrorMessage(parseInt(toChainId_), "requestWithdrawal: toChainId not int")
542+ let amount = valueOrErrorMessage(parseBigInt(amount_), "requestWithdrawal: amount not int")
543+ let err = if (if (if (if (if (if (_whenInitialized())
544+ then _chainExists(fromChainId, "requestWithdrawal: invalid fromChainId")
545+ else false)
546+ then _chainExists(toChainId, "requestWithdrawal: invalid toChainId")
547+ else false)
548+ then _validateString(from_, "requestWithdrawal: invalid from")
549+ else false)
550+ then _validateString(to_, "requestWithdrawal: invalid to")
551+ else false)
552+ then _assetCurrencyExists(toChainId, asset_, "requestWithdrawal: invalid asset")
553+ else false)
554+ then _validateBigInt(amount, ZERO_BIGINT, "requestWithdrawal: invalid amount")
555+ else false
556+ if ((err == err))
557+ then {
558+ let err1 = if ((_loadChain(fromChainId) == WAVES))
559+ then _validateWavesVault(i.caller, "requestWithdrawal: invalid waves vault")
560+ else if (_validateExecutor(i.caller, "requestWithdrawal: invalid executor"))
561+ then _validateCallerContract(fromChainId, callerContract_, "requestWithdrawal: invalid caller contract")
562+ else false
563+ if ((err1 == err1))
564+ then {
565+ let currency = _loadAssetCurrency(toChainId, asset_)
566+ let availableBalance = match invoke(_loadAccountStorage(), FUNC_GET_USER_BALANCE, [from_, SPOT_WALLET, currency], nil) {
567+ case a: String =>
568+ parseBigIntValue(a)
569+ case _ =>
570+ throw("requestWithdrawal: can't take available balance from storage")
571+ }
572+ if ((availableBalance == availableBalance))
573+ then {
574+ let lockedReserves = _loadAssetReservesLocked(toChainId, asset_)
575+ let $t01823518744 = if (if ((availableBalance >= amount))
576+ then ((_loadAssetReserves(toChainId, asset_) - lockedReserves) >= amount)
577+ else false)
578+ then $Tuple3(REQUEST_STATUS_CREATED, invoke(_loadAccountStorage(), FUNC_INTERNAL_TRANSFER, [from_, SPOT_WALLET, WITHDRAWALS_WALLET, currency, amount_], nil), _saveAssetReservesLocked(toChainId, asset_, (lockedReserves + amount)))
579+ else $Tuple3(REQUEST_STATUS_REJECTED, unit, nil)
580+ if (($t01823518744 == $t01823518744))
581+ then {
582+ let reservesActions = $t01823518744._3
583+ let storageInvocation = $t01823518744._2
584+ let requestStatus = $t01823518744._1
585+ let requestWithdrawalSize = _loadRequestWithdrawalSize()
586+ let requestWithdrawal = $Tuple8(from_, to_, toChainId, asset_, amount, height, toBase58String(i.transactionId), requestStatus)
587+ $Tuple2(((_saveRequestWithdrawal(requestWithdrawalSize, requestWithdrawal) ++ _saveRequestWithdrawalSize((requestWithdrawalSize + 1))) ++ reservesActions), requestWithdrawalSize)
588+ }
589+ else throw("Strict value is not equal to itself.")
590+ }
591+ else throw("Strict value is not equal to itself.")
592+ }
593+ else throw("Strict value is not equal to itself.")
594+ }
595+ else throw("Strict value is not equal to itself.")
596+ }
597+
598+
599+
600+@Callable(i)
601+func executeWithdrawal (callerContract_,chainId_,requestWithdrawalId_) = {
602+ let chainId = valueOrErrorMessage(parseInt(chainId_), "executeWithdrawal: chainId not int")
603+ let requestWithdrawalId = valueOrErrorMessage(parseInt(requestWithdrawalId_), "executeWithdrawal: requestWithdrawalId not int")
604+ let requestWithdrawalSize = _loadRequestWithdrawalSize()
605+ let err = if (if (_whenInitialized())
606+ then _chainExists(chainId, "executeWithdrawal: invalid chainId")
607+ else false)
608+ then _validateInt(requestWithdrawalId, 0, (requestWithdrawalSize - 1), "executeWithdrawal: invalid requestWithdrawalId")
609+ else false
610+ if ((err == err))
611+ then {
612+ let err1 = if ((_loadChain(chainId) == WAVES))
613+ then _validateWavesVault(i.caller, "executeWithdrawal: invalid waves vault")
614+ else if (_validateExecutor(i.caller, "executeWithdrawal: invalid executor"))
615+ then _validateCallerContract(chainId, callerContract_, "executeWithdrawal: invalid caller contract")
616+ else false
617+ if ((err1 == err1))
618+ then {
619+ let request = _loadRequestWithdrawal(requestWithdrawalId)
620+ let requestFrom = request._1
621+ let requestTo = request._2
622+ let requestToChainId = request._3
623+ let requestAsset = request._4
624+ let requestAmount = request._5
625+ let requestHeight = request._6
626+ let requestStatus = request._8
627+ let newAssetReserves = (_loadAssetReserves(requestToChainId, requestAsset) - requestAmount)
628+ let newAssetReservesLocked = (_loadAssetReservesLocked(requestToChainId, requestAsset) - requestAmount)
629+ let currency = _loadAssetCurrency(requestToChainId, requestAsset)
630+ let newCurrencyReserves = (_loadCurrencyReserves(currency) - requestAmount)
631+ let err2 = if (if (if (if (_validateBigInt(newAssetReserves, ZERO_BIGINT, "executeWithdrawal: negative newAssetReserves"))
632+ then _validateBigInt(newAssetReservesLocked, ZERO_BIGINT, "executeWithdrawal: negative newAssetReservesLocked")
633+ else false)
634+ then _validateBigInt(newCurrencyReserves, ZERO_BIGINT, "executeWithdrawal: negative newCurrencyReserves")
635+ else false)
636+ then _validateInt((height - requestHeight), _loadRequestWithdrawalBlockDelay(), MAX_INT, "executeWithdrawal: too early to execute")
637+ else false)
638+ then _requestIsCreated(requestStatus, "executeWithdrawal: request is resolved")
639+ else false
640+ if ((err2 == err2))
641+ then {
642+ let storageInvocation = invoke(_loadAccountStorage(), FUNC_WITHDRAW, [requestFrom, currency, toString(requestAmount)], nil)
643+ if ((storageInvocation == storageInvocation))
644+ then {
645+ let withdrawInvocation = if ((_loadChain(requestToChainId) == WAVES))
646+ then invoke(_loadWavesVault(), FUNC_WITHDRAW, [requestTo, requestAsset, toString(requestAmount)], nil)
647+ else invoke(_loadVaultAdapter(), FUNC_WITHDRAW, [requestToChainId, requestAsset, toString(requestAmount), requestTo], nil)
648+ if ((withdrawInvocation == withdrawInvocation))
649+ then {
650+ let requestUpdated = $Tuple8(request._1, request._2, request._3, request._4, request._5, request._6, request._7, REQUEST_STATUS_DONE)
651+ $Tuple2((((_saveAssetReserves(requestToChainId, requestAsset, newAssetReserves) ++ _saveAssetReservesLocked(requestToChainId, requestAsset, newAssetReservesLocked)) ++ _saveCurrencyReserves(currency, newCurrencyReserves)) ++ _saveRequestWithdrawal(requestWithdrawalId, requestUpdated)), unit)
652+ }
653+ else throw("Strict value is not equal to itself.")
654+ }
655+ else throw("Strict value is not equal to itself.")
656+ }
657+ else throw("Strict value is not equal to itself.")
658+ }
659+ else throw("Strict value is not equal to itself.")
660+ }
661+ else throw("Strict value is not equal to itself.")
662+ }
663+
664+
665+
666+@Callable(i)
667+func withdraw (from_,to_,toChainId_,asset_,amount_,timestamp_,publicKey_,alg_,signature_) = {
668+ let toChainId = valueOrErrorMessage(parseInt(toChainId_), "withdraw: toChainId not int")
669+ let amount = valueOrErrorMessage(parseBigInt(amount_), "withdraw: amount not int")
670+ let timestamp = valueOrErrorMessage(parseInt(timestamp_), "withdraw: timestamp not int")
671+ let alg = valueOrErrorMessage(parseInt(alg_), "withdraw: alg not int")
672+ let publicKey = fromBase58String(publicKey_)
673+ let signature = fromBase58String(signature_)
674+ let err = if (if (if (if (if (if (if (if (if (if (_whenInitialized())
675+ then _validateSequencer(i.caller, "withdraw: invalid sequencer")
676+ else false)
677+ then _validateString(from_, "withdraw: invalid from")
678+ else false)
679+ then _validateString(to_, "withdraw: invalid to")
680+ else false)
681+ then _chainExists(toChainId, "withdraw: invalid toChainId")
682+ else false)
683+ then _assetCurrencyExists(toChainId, asset_, "withdraw: invalid asset")
684+ else false)
685+ then _validateBigInt(amount, ZERO_BIGINT, "withdraw: invalid amount")
686+ else false)
687+ then _validateInt((timestamp + ONE_DAY), lastBlock.timestamp, MAX_INT, "withdraw: invalid timestamp")
688+ else false)
689+ then _validatePublicKey(publicKey, alg, "withdraw: inv public key")
690+ else false)
691+ then _validateSignatureFormat(signature, alg, "withdraw: inv sig format")
692+ else false)
693+ then _validatePublicKeyMatchesAddress(publicKey, from_, alg, "withdraw: public key mismatch")
694+ else false
695+ if ((err == err))
696+ then {
697+ let withdrawalBytes = ((((((((((toBytes(size(from_)) + toBytes(from_)) + toBytes(size(to_))) + toBytes(to_)) + toBytes(toChainId)) + toBytes(size(asset_))) + toBytes(asset_)) + toBytes(amount)) + toBytes(timestamp)) + publicKey) + toBytes(alg))
698+ let withdrawalHash = keccak256_16Kb(withdrawalBytes)
699+ let currency = _loadAssetCurrency(toChainId, asset_)
700+ let availableBalance = match invoke(_loadAccountStorage(), FUNC_GET_USER_BALANCE, [from_, SPOT_WALLET, currency], nil) {
701+ case a: String =>
702+ parseBigIntValue(a)
703+ case _ =>
704+ throw("withdraw: can't take available balance from storage")
705+ }
706+ if ((availableBalance == availableBalance))
707+ then {
708+ let assetReserves = _loadAssetReserves(toChainId, asset_)
709+ let lockedReserves = _loadAssetReservesLocked(toChainId, asset_)
710+ let err1 = if (if (if (_validateWithdrawalSignature(withdrawalHash, signature, publicKey, alg, "withdraw: invalid sig"))
711+ then _checkWithdrawalHashNotExist(withdrawalHash, "withdraw: already executed")
712+ else false)
713+ then _validateBigInt(availableBalance, amount, "withdraw: insufficient balance")
714+ else false)
715+ then _validateBigInt((assetReserves - lockedReserves), amount, "withdraw: insufficient reserves")
716+ else false
717+ if ((err1 == err1))
718+ then {
719+ let newAssetReserves = (assetReserves - amount)
720+ let newCurrencyReserves = (_loadCurrencyReserves(currency) - amount)
721+ let err2 = if (_validateBigInt(newAssetReserves, ZERO_BIGINT, "withdraw: negative newAssetReserves"))
722+ then _validateBigInt(newCurrencyReserves, ZERO_BIGINT, "withdraw: negative newCurrencyReserves")
723+ else false
724+ if ((err2 == err2))
725+ then {
726+ let storageInvocation = invoke(_loadAccountStorage(), FUNC_INTERNAL_TRANSFER, [from_, SPOT_WALLET, WITHDRAWALS_WALLET, currency, amount_], nil)
727+ if ((storageInvocation == storageInvocation))
728+ then {
729+ let storageInvocation1 = invoke(_loadAccountStorage(), FUNC_WITHDRAW, [from_, currency, amount_], nil)
730+ if ((storageInvocation1 == storageInvocation1))
731+ then {
732+ let withdrawInvocation = if ((_loadChain(toChainId) == WAVES))
733+ then invoke(_loadWavesVault(), FUNC_WITHDRAW, [to_, asset_, amount_], nil)
734+ else invoke(_loadVaultAdapter(), FUNC_WITHDRAW, [toChainId, asset_, amount_, to_], nil)
735+ if ((withdrawInvocation == withdrawInvocation))
736+ then $Tuple2(((_saveAssetReserves(toChainId, asset_, newAssetReserves) ++ _saveCurrencyReserves(currency, newCurrencyReserves)) ++ _saveWithdrawalHash(withdrawalHash, toBase58String(i.transactionId))), unit)
737+ else throw("Strict value is not equal to itself.")
738+ }
739+ else throw("Strict value is not equal to itself.")
740+ }
741+ else throw("Strict value is not equal to itself.")
742+ }
743+ else throw("Strict value is not equal to itself.")
744+ }
745+ else throw("Strict value is not equal to itself.")
746+ }
747+ else throw("Strict value is not equal to itself.")
748+ }
749+ else throw("Strict value is not equal to itself.")
750+ }
751+
752+
753+
754+@Callable(i)
755+func depositStakingReward (callerContract_,chainId_,asset_,amount_) = {
756+ let chainId = valueOrErrorMessage(parseInt(chainId_), "depositStakingReward: chainId not int")
757+ let amount = valueOrErrorMessage(parseBigInt(amount_), "depositStakingReward: amount not int")
758+ let err = if (if (if (if (_whenInitialized())
759+ then _whenNotPaused()
760+ else false)
761+ then _chainExists(chainId, "depositStakingReward: invalid chainId")
762+ else false)
763+ then _assetCurrencyExists(chainId, asset_, "depositStakingReward: invalid asset")
764+ else false)
765+ then _validateBigInt(amount, ZERO_BIGINT, "depositStakingReward: invalid amount")
766+ else false
767+ if ((err == err))
768+ then {
769+ let err1 = if ((_loadChain(chainId) == WAVES))
770+ then _validateWavesVault(i.caller, "depositStakingReward: invalid waves vault")
771+ else if (_validateExecutor(i.caller, "depositStakingReward: invalid executor"))
772+ then _validateCallerContract(chainId, callerContract_, "depositStakingReward: invalid caller contract")
773+ else false
774+ if ((err1 == err1))
775+ then {
776+ let newAssetReserves = (_loadAssetReserves(chainId, asset_) + amount)
777+ let currency = _loadAssetCurrency(chainId, asset_)
778+ let newCurrencyReserves = (_loadCurrencyReserves(currency) + amount)
779+ let invocation = invoke(_loadAccountStorage(), FUNC_DEPOSIT_STAKING_REWARD, [_loadRewardDistributor(), currency, amount_], nil)
780+ if ((invocation == invocation))
781+ then $Tuple2((_saveAssetReserves(chainId, asset_, newAssetReserves) ++ _saveCurrencyReserves(currency, newCurrencyReserves)), unit)
782+ else throw("Strict value is not equal to itself.")
783+ }
784+ else throw("Strict value is not equal to itself.")
785+ }
786+ else throw("Strict value is not equal to itself.")
787+ }
788+
789+
790+
791+@Callable(i)
792+func addChain (chainId_,name_,callerContract_) = {
793+ let err = if (if (if (if (if (_onlyThisContract(i.caller))
794+ then _whenInitialized()
795+ else false)
796+ then _validateInt(chainId_, 0, MAX_INT, "addChain: invalid chainId")
797+ else false)
798+ then _validateString(name_, "addChain: invalid name")
799+ else false)
800+ then _validateString(callerContract_, "addChain: invalid callerContract")
801+ else false)
802+ then _chainNotExist(chainId_, "addChain: already exists")
803+ else false
804+ if ((err == err))
805+ then $Tuple2((_saveChain(chainId_, name_) ++ _saveCallerContract(chainId_, callerContract_)), unit)
806+ else throw("Strict value is not equal to itself.")
807+ }
808+
809+
810+
811+@Callable(i)
812+func addAsset (chainId_,asset_,currency_) = {
813+ let err = if (if (if (if (if (_onlyThisContract(i.caller))
814+ then _whenInitialized()
815+ else false)
816+ then _chainExists(chainId_, "addAsset: invalid chainId")
817+ else false)
818+ then _validateString(asset_, "addAsset: invalid asset")
819+ else false)
820+ then _validateString(currency_, "addAsset: invalid currency")
821+ else false)
822+ then _assetCurrencyNotExist(chainId_, asset_, "addAsset: already exists")
823+ else false
824+ if ((err == err))
825+ then $Tuple2(_saveAssetCurrency(chainId_, asset_, currency_), unit)
826+ else throw("Strict value is not equal to itself.")
827+ }
828+
829+
830+
831+@Callable(i)
832+func setRequestWithdrawalBlockDelay (delay_) = {
833+ let err = if (if (_onlyThisContract(i.caller))
834+ then _whenInitialized()
835+ else false)
836+ then _validateInt(delay_, 0, MAX_INT, "setRequestWithdrawalBlockDelay: invalid delay")
837+ else false
838+ if ((err == err))
839+ then $Tuple2(_saveRequestWithdrawalBlockDelay(delay_), unit)
840+ else throw("Strict value is not equal to itself.")
841+ }
842+
843+
844+
845+@Callable(i)
846+func updateRewardDistributor (rewardDistributor_) = {
847+ let err = if (if (_onlyThisContract(i.caller))
848+ then _whenInitialized()
849+ else false)
850+ then _validateString(rewardDistributor_, "updateRewardDistributor: invalid rewardDistributor")
851+ else false
852+ if ((err == err))
853+ then $Tuple2(_saveRewardDistributor(rewardDistributor_), unit)
854+ else throw("Strict value is not equal to itself.")
855+ }
856+
857+
858+
859+@Callable(i)
860+func pause () = {
861+ let err = if (if (_onlyPauser(i.caller))
862+ then _whenInitialized()
863+ else false)
864+ then _whenNotPaused()
865+ else false
866+ if ((err == err))
867+ then $Tuple2(_savePause(true), unit)
868+ else throw("Strict value is not equal to itself.")
869+ }
870+
871+
872+
873+@Callable(i)
874+func unpause () = {
875+ let err = if (if (_onlyPauser(i.caller))
876+ then _whenInitialized()
877+ else false)
878+ then _whenPaused()
879+ else false
880+ if ((err == err))
881+ then $Tuple2(_savePause(false), unit)
882+ else throw("Strict value is not equal to itself.")
883+ }
884+
885+
886+
887+@Callable(i)
888+func updatePauser (pauser_) = {
889+ let err = if (if (_onlyThisContract(i.caller))
890+ then _whenInitialized()
891+ else false)
892+ then _validateAddress(pauser_, "updatePauser: invalid pauser")
893+ else false
894+ if ((err == err))
895+ then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
896+ else throw("Strict value is not equal to itself.")
897+ }
898+
899+
900+
901+@Callable(i)
902+func setMultisig (multisig_) = {
903+ let err = if (_onlyThisContract(i.caller))
904+ then _validateAddress(multisig_, "setMultisig: invalid multisig")
905+ else false
906+ if ((err == err))
907+ then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
908+ else throw("Strict value is not equal to itself.")
909+ }
910+
911+
912+@Verifier(tx)
913+func verify () = match getString(KEY_MULTISIG) {
914+ case multisig: String =>
915+ valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEPARATOR)), false)
916+ case _ =>
917+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
918+}
919+

github/deemru/w8io/873ac7e 
50.02 ms