tx · Fv5kpH7SLtaykk6Jh46YWctaXLcZDnzU6jZR3Gu6nwhk

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.03600000 Waves

2024.12.14 02:14 [3413450] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "Fv5kpH7SLtaykk6Jh46YWctaXLcZDnzU6jZR3Gu6nwhk", "fee": 3600000, "feeAssetId": null, "timestamp": 1734131649402, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "5CVspoEbq2jppHzNjC538td11vgJtrR9ohoEVKCkS2npEviRUYq7TWSNvY4aPKw85ir3bPsv1zSauRN47pegitYY" ], "script": "base64:BgJSCAISBgoECAgICBIDCgEIEgMKAQESBAoCCAESAwoBARIECgIIARIAEgMKAQgSAwoBCBIDCgEBEgMKAQESAwoBCBIDCgEIEgMKAQESABIECgIIAbcBAANTRVACAl9fAAVNVUxUNgDAhD0ABU1VTFQ4AIDC1y8ADk1JTlNIT1BQQVlNRU5UAKCNBgAKREFZX01JTExJUwCAuJkpAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQAKREFZX0JMT0NLUwQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMACgCwMJAAACAQFUBQckbWF0Y2gwADwJAAIBAg1Vbmtub3duIGNoYWluAAtXRUVLX0JMT0NLUwQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMADgTgMJAAACAQFUBQckbWF0Y2gwALQBCQACAQINVW5rbm93biBjaGFpbgAKVlJGX09GRlNFVAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAAAAwkAAAIBAVQFByRtYXRjaDAAkPlFCQACAQINVW5rbm93biBjaGFpbgALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BGd1l0YThiaUV6MzF6cGVGZTVESks4d0U1dHJTcFFWRjgDCQAAAgEBVAUHJG1hdGNoMAIjM043VXVZYXI2MjY0UDU4RkJoVldLUFFBaDRZdWEyaGduZ3YJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgASZWNvbm9teUNvbnRyYWN0U3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUDJzazFLbmNTeFJhWnM4YjRDV0dQdzJqa3Z2YXY3NHU0RAMJAAACAQFUBQckbWF0Y2gwAiMzTjh5NHd4WDNKQzRUZHJDSkJYWDE2U2pXZjZYMjU2aHJlcAkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABBJZHhDZmdBY3JlczJEYXBwAAEADUlkeENmZ1dsZ0RhcHAAAgAUSWR4Q2ZnUHV6emxlUG9vbERhcHAABAAUSWR4Q2ZnSW52ZXN0RnVuZERhcHAABQEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ9rZXlSZXN0MkFkZHJlc3MAAg0lc19fcmVzdDJBZGRyAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCCHJlc3QyQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUIcmVzdDJDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4ABFJZHhDZmdTdGFraW5nRGFwcAABAA9JZHhDZmdBY3Jlc0RhcHAACAAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAANYWNyZXNDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFD0lkeENmZ0FjcmVzRGFwcAANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAIcmVzdDJDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDXJlc3QyQ29udHJhY3QADmFjcmVzMkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ0FjcmVzMkRhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFDUlkeENmZ1dsZ0RhcHAAEnB1enpsZVBvb2xDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRRJZHhDZmdQdXp6bGVQb29sRGFwcAASaW52ZXN0RnVuZENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFFElkeENmZ0ludmVzdEZ1bmREYXBwARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBGFkZHIJAKwCAgITbGFzdFdlZWtUeElkQnlVc2VyXwUEYWRkcgANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0AQprZXlVc2VyQmV0AQRhZGRyCQCsAgICCHVzZXJCZXRfBQRhZGRyARJrZXlVc2VyV2Vla1RpY2tldHMCBGFkZHIEd2VlawkArAICCQCsAgIJAKwCAgIQdXNlcldlZWtUaWNrZXRzXwUEYWRkcgIBXwkApAMBBQR3ZWVrARNrZXlUb3RhbFdlZWtUaWNrZXRzAQR3ZWVrCQCsAgICEXRvdGFsV2Vla1RpY2tldHNfCQCkAwEFBHdlZWsBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEEd2VlawkArAICAhZ0b3RhbFdlZWtQYXJ0aWNpcGFudHNfCQCkAwEFBHdlZWsBDmtleU51bU5GVDJEcmF3AQR3ZWVrCQCsAgICDG51bU5GVDJEcmF3XwkApAMBBQR3ZWVrAQ5rZXlOdW1ORlREcmF3bgEEd2VlawkArAICAgxudW1ORlREcmF3bl8JAKQDAQUEd2VlawEOa2V5V2Vla1dpbm5lcnMBBHdlZWsJAKwCAgIMd2Vla1dpbm5lcnNfCQCkAwEFBHdlZWsBCndpbm5pbmdCZXQBA2RheQQBYgkAaAIFA2RheQUKREFZX0JMT0NLUwQBaAMJAGYCBQFiBQpWUkZfT0ZGU0VUBQFiCQBkAgUBYgUKVlJGX09GRlNFVAkAagIJALEJAQkBBXZhbHVlAQgJAQV2YWx1ZQEJAO0HAQUBaAN2cmYABAALaXhXbGdBbW91bnQAAAAIaXhXbGdXbGcAAQAKaXhXbGdQcmljZQACAA5peFdsZ0lzc3VlVGltZQAIAA9peFdsZ1RlYW1BbUxlZnQACwATaXhXbGdUZWFtQW1BdmFpbE5vdwAMAA5peFdsZ0FjdEFtTGVmdAAPABJpeFdsZ0FjdEFtQXZhaWxOb3cAEAAQaXhXbGdBbUxlZnRUb3RhbAATABNpeFdsZ1VzZXJBbUF2YWlsTm93ABcAEGl4V2xnRWZmVXNlclRpbWUAGAASaXhXbGdJc3N1ZTEwQW1vdW50ABkAG2l4V2xnTWFya2V0aW5nSXNzdWUxMEFtb3VudAAaABZpeFdsZ1RlYW1Jc3N1ZTEwQW1vdW50ABsAD2l4V2xnVXNlcjEwcGFydAAcABBpeFdsZ0lzc3VlMTBUaW1lAB0BBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQBD2dldFJhbmRvbU51bWJlcgMIbWF4VmFsdWUEc2FsdAdlbnRyb3B5AwkAZwIAAAUIbWF4VmFsdWUJAAIBAhZtYXhWYWx1ZSBzaG91bGQgYmUgPiAwBApyYW5kb21IYXNoCQDUFgEJAMsBAgUEc2FsdAUHZW50cm9weQkAagIJALEJAQUKcmFuZG9tSGFzaAUIbWF4VmFsdWUABlNDQUxFOACAwtcvAAx4cExldmVsU2NhbGUAgBkAD3hwTGV2ZWxSZWNpcFBvdwCgHwASbnVtUG9pbnRzT25MZXZlbFVwAAMAD3dsZ0Jhc2VBbW91bnRYcACA0NvD9AIBCWtleVVzZXJYUAEEYWRkcgkArAICAgd1c2VyWFBfBQRhZGRyAQxrZXlVc2VyTGV2ZWwBBGFkZHIJAKwCAgIKdXNlckxldmVsXwUEYWRkcgAFeHBXbGcAkE4BCWxldmVsQnlYUAECeHAJAGsDBQx4cExldmVsU2NhbGUJAGwGBQJ4cAAEBQ94cExldmVsUmVjaXBQb3cABAAEBQRET1dOBQZTQ0FMRTgBB2xldmVsVXACCWN1cnJMZXZlbAVuZXdYUAQIbmV3TGV2ZWwJAQlsZXZlbEJ5WFABBQVuZXdYUAkAzAgCBQhuZXdMZXZlbAkAzAgCCQBoAgUSbnVtUG9pbnRzT25MZXZlbFVwCQBlAgUIbmV3TGV2ZWwFCWN1cnJMZXZlbAUDbmlsAAJNNgDAhD0AAk04AIDC1y8ACE1JTExJT042AICA6YOx3hYACVRFQU1TSEFSRQDAmgwADUFDVElWSVRZU0hBUkUAoI0GAAtQTEFZRVJTSEFSRQCAtRgACllFQVJNSUxMSVMAgIbrx3UACURBWU1JTExJUwCAuJkpAAhCQU5LX0ZFRQDQhgMAAmNoCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABABNVU0RUX1RWTF9DT1JSRUNUSU9OBAckbWF0Y2gwBQJjaAMJAAACAQFXBQckbWF0Y2gwAPD1qMAEAwkAAAIBAVQFByRtYXRjaDAAAAkAAgECDVVua25vd24gY2hhaW4AC3RlYW1BZGRyS2V5Agh0ZWFtQWRkcgAPbGFzdFRlYW1UaW1lS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQARdGVhbUFtb3VudExlZnRLZXkCDnRlYW1BbW91bnRMZWZ0ABVsYXN0QWN0aXZpdGllc1RpbWVLZXkCGmxhc3RDbGFpbWVkVGltZV9hY3Rpdml0aWVzABBhY3RBbW91bnRMZWZ0S2V5AhRhY3Rpdml0aWVzQW1vdW50TGVmdAAUc3Rha2Vyc0Ftb3VudExlZnRLZXkCEXN0YWtlcnNBbW91bnRMZWZ0ARtrZXlMYXN0Q2xhaW1lZFRpbWVCeVVzZXJPbGQBBGFkZHIJAKwCAgIXbGFzdENsYWltZWRUaW1lVXNlck9sZF8FBGFkZHIBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBGFkZHIJAKwCAgIQbGFzdEFyYlRpbWVVc2VyXwUEYWRkcgEaa2V5TGFzdFdsZ1RyYWRlTGltaXRCeVVzZXIBBGFkZHIJAKwCAgIRbGFzdFdsZ0xpbWl0VXNlcl8FBGFkZHIBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQZwZXJpb2QJAGsDBQhNSUxMSU9ONgkAaAIFC1BMQVlFUlNIQVJFCQBkAgUGcGVyaW9kAAEJAGgCAAYFAk02AA93bGdJc3N1ZVRpbWVLZXkCDXdsZ19pc3N1ZVRpbWUAEndsZ0lzc3VlZEFtb3VudEtleQIQd2xnX2lzc3VlZEFtb3VudAARemJJc3N1ZWRBbW91bnRLZXkCEnpiaWxsX2lzc3VlZEFtb3VudAEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyABNhY3Jlc1N0YWtlZFRvdGFsS2V5AhZhY3Jlc1N0YWtlZEFtb3VudFRvdGFsARhrZXlXbGdTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIWd2xnU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgARd2xnU3Rha2VkVG90YWxLZXkCFHdsZ1N0YWtlZEFtb3VudFRvdGFsARZrZXlXbGdTdGFrZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFHdsZ1N0YWtlZFRpbWVCeVVzZXJfBQRhZGRyAAhkYXBwUmVzdAAAAAtkYXBwU3Rha2luZwABAAtkYXBwRWNvbm9teQACAAdkYXBwV2xnAAMACmRhcHBQdXp6bGUABAAOZGFwcEludmVzdEZ1bmQABQAJZGFwcEFjcmVzAAYBCGdldExhbmRzAxJ1c2VyQWRkclN0ck9yRW1wdHkPc3Rha2luZ0NvbnRyYWN0DWFjcmVzQ29udHJhY3QEBXByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0AhNyZXNUeXBlc1Byb3BvcnRpb25zAgswXzBfMF8wXzBfMAIBXwoBBWFkZGVyAgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAt0b3RhbFBpZWNlcwoAAiRsBQVwcm9wcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYECnVzZXJQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQCsAgICFHN0YWtlZFBpZWNlc0J5T3duZXJfBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAQKdG90YWxBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0BRNhY3Jlc1N0YWtlZFRvdGFsS2V5AAAECXVzZXJBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAkAzAgCBQt0b3RhbFBpZWNlcwkAzAgCBQp1c2VyUGllY2VzCQDMCAIFCnRvdGFsQWNyZXMJAMwIAgUJdXNlckFjcmVzBQNuaWwADmlkeFRvdGFsUGllY2VzAAAADWlkeFVzZXJQaWVjZXMAAQANaWR4VG90YWxBY3JlcwACAAxpZHhVc2VyQWNyZXMAAwART0xEX1NUQUtJTkdfREVBREwAgPnjm7kyAQtnZXRXbGdTdGF0cwULdXNlckFkZHJPcHQJY29udHJhY3RzBnVzZHRJZBV1c2R0QmFsYW5jZUNvcnJlY3Rpb24PdXNlclByb3BvcnRpb242BAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUSd2xnSXNzdWVkQW1vdW50S2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQECmVjb25vbXlVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFC2RhcHBFY29ub215BQZ1c2R0SWQEB3Jlc3RVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHBSZXN0BQZ1c2R0SWQEBndsZ1VzZAkAZQIJAPAHAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFBnVzZHRJZAUVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAlwdXp6bGVVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCmRhcHBQdXp6bGUFBnVzZHRJZAQRaW52ZXN0Rm5kQ29udHJhY3QJAJEDAgUJY29udHJhY3RzBQ5kYXBwSW52ZXN0RnVuZAQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRFpbnZlc3RGbmRDb250cmFjdAUGdXNkdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEWludmVzdEZuZENvbnRyYWN0BRF6Yklzc3VlZEFtb3VudEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIFCmVjb25vbXlVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsBAV3bGdJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnAgt3bGdfYXNzZXRJZAITTm90IGluaXRpYWxpemVkIHlldAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFD3dsZ0lzc3VlVGltZUtleQIPTm90IGluaXRpYWxpemVkBApiYW5rV2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQtkYXBwU3Rha2luZwUFd2xnSWQECXRlYW1Ub3RhbAkAawMFCE1JTExJT042BQlURUFNU0hBUkUFAk02BA50ZWFtQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwURdGVhbUFtb3VudExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQ9sYXN0VGVhbVRpbWVLZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFC3RlYW1BZGRyS2V5BBZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCXRlYW1Ub3RhbAkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDnRlYW1BbW91bnRMZWZ0BQNuaWwECnRlYW1XbGdvbGQJAPAHAgUIdGVhbUFkZHIFBXdsZ0lkBAhhY3RUb3RhbAkAawMFCE1JTExJT042BQ1BQ1RJVklUWVNIQVJFBQJNNgQNYWN0QW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUQYWN0QW1vdW50TGVmdEtleQUIYWN0VG90YWwEEmxhc3RBY3Rpdml0aWVzVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQlpc3N1ZVRpbWUEFWFjdEFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQhhY3RUb3RhbAkAZQIFA25vdwUSbGFzdEFjdGl2aXRpZXNUaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDWFjdEFtb3VudExlZnQFA25pbAQJYWN0V2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQhkYXBwUmVzdAUFd2xnSWQEDGxhc3RVc2VyVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwkBG2tleUxhc3RDbGFpbWVkVGltZUJ5VXNlck9sZAEFC3VzZXJBZGRyT3B0BQlpc3N1ZVRpbWUEDmxhc3RVc2VyUGVyaW9kCQBpAgkAZQIFDGxhc3RVc2VyVGltZQUJaXNzdWVUaW1lBQpZRUFSTUlMTElTBApub3dMaW1pdGVkCQCXAwEJAMwIAgkAlwMBCQDMCAIFA25vdwkAzAgCCQBkAgUJaXNzdWVUaW1lCQBoAgADBQpZRUFSTUlMTElTBQNuaWwJAMwIAgURT0xEX1NUQUtJTkdfREVBREwFA25pbAQJY3VyUGVyaW9kCQCXAwEJAMwIAgkAaQIJAGUCBQNub3cFCWlzc3VlVGltZQUKWUVBUk1JTExJUwkAzAgCAAIFA25pbAQDZWZmCQEIZ2V0TGFuZHMDBQt1c2VyQWRkck9wdAkAkQMCBQljb250cmFjdHMFC2RhcHBTdGFraW5nCQCRAwIFCWNvbnRyYWN0cwUJZGFwcEFjcmVzBBVjdXJQZXJpb2REaXN0cmlidXRpb24JARRkaXN0cmlidXRpb25CeVBlcmlvZAEFCWN1clBlcmlvZAQIJHQwNzkxNDMDCQAAAgUObGFzdFVzZXJQZXJpb2QFCWN1clBlcmlvZAQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkBQxsYXN0VXNlclRpbWUFCllFQVJNSUxMSVMECHVzZXJQYXJ0CQBrAwUCYTAFD3VzZXJQcm9wb3J0aW9uNgUCTTYEB2VmZlRpbWUJAGQCBQxsYXN0VXNlclRpbWUJAGsDCQBlAgUKbm93TGltaXRlZAUMbGFzdFVzZXJUaW1lBQ91c2VyUHJvcG9ydGlvbjYFAk02CQCVCgMFCHVzZXJQYXJ0BQJhMAUHZWZmVGltZQMJAAACBQ5sYXN0VXNlclBlcmlvZAkAZQIFCWN1clBlcmlvZAABBAJhMQkAawMJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFDGxhc3RVc2VyVGltZQUKWUVBUk1JTExJUwQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kBQpZRUFSTUlMTElTBAVhdmFpbAkAZAIFAmExBQJhMAQIdXNlclBhcnQJAGsDBQVhdmFpbAUPdXNlclByb3BvcnRpb242BQJNNgQHZWZmVGltZQMJAGcCBQJhMQUIdXNlclBhcnQJAGQCBQxsYXN0VXNlclRpbWUJAGsDBQpZRUFSTUlMTElTBQh1c2VyUGFydAkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABCQBkAgkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMFCWN1clBlcmlvZAkAawMFCllFQVJNSUxMSVMJAGUCBQh1c2VyUGFydAUCYTEFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAlQoDBQh1c2VyUGFydAUFYXZhaWwFB2VmZlRpbWUEAmEyCQBrAwkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAACCQBlAgkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMJAGUCBQljdXJQZXJpb2QAAQUMbGFzdFVzZXJUaW1lBQpZRUFSTUlMTElTBAJhMQkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABBAJhMAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFCllFQVJNSUxMSVMEBWF2YWlsCQBkAgkAZAIFAmEyBQJhMQUCYTAECHVzZXJQYXJ0CQBrAwUFYXZhaWwFD3VzZXJQcm9wb3J0aW9uNgUCTTYEB2VmZlRpbWUDCQBnAgUCYTIFCHVzZXJQYXJ0CQBkAgUMbGFzdFVzZXJUaW1lCQBrAwUKWUVBUk1JTExJUwUIdXNlclBhcnQJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAgMJAGcCCQBkAgUCYTIFAmExBQh1c2VyUGFydAkAZAIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTCQBlAgUJY3VyUGVyaW9kAAEJAGsDBQpZRUFSTUlMTElTCQBlAgUIdXNlclBhcnQFAmEyCQEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAEJAGQCCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kCQBrAwUKWUVBUk1JTExJUwkAZQIJAGUCBQh1c2VyUGFydAUCYTIFAmExBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAJUKAwUIdXNlclBhcnQFBWF2YWlsBQdlZmZUaW1lBAp1c2VyQW1vdW50CAUIJHQwNzkxNDMCXzEEDXVzZXJBdmFpbGFibGUIBQgkdDA3OTE0MwJfMgQLZWZmTGFzdFRpbWUIBQgkdDA3OTE0MwJfMwQQc0xhbmREYWlseUFtb3VudAkAawMJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24FCURBWU1JTExJUwUKWUVBUk1JTExJUwAZCQCRAwIFA2VmZgUOaWR4VG90YWxQaWVjZXMED2Ftb3VudExlZnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUUc3Rha2Vyc0Ftb3VudExlZnRLZXkAAAQIdXNlclRlbXAJAGsDBQp1c2VyQW1vdW50CQBkAgkAaAIJAJEDAgUDZWZmBQ1pZHhVc2VyUGllY2VzBQJNOAkAkQMCBQNlZmYFDGlkeFVzZXJBY3JlcwkAZAIJAGgCCQCRAwIFA2VmZgUOaWR4VG90YWxQaWVjZXMFAk04CQCRAwIFA2VmZgUNaWR4VG90YWxBY3JlcwQMYmFua0Zyb21Vc2VyCQBrAwUIdXNlclRlbXAFCEJBTktfRkVFBQJNNgQKcm9iYmVkVXNlcgkAZQIFCHVzZXJUZW1wBQxiYW5rRnJvbVVzZXIEDHVucm9iYmVkVXNlcgkAawMFDXVzZXJBdmFpbGFibGUJAGQCCQBoAgkAkQMCBQNlZmYFDWlkeFVzZXJQaWVjZXMFAk04CQCRAwIFA2VmZgUMaWR4VXNlckFjcmVzCQBkAgkAaAIJAJEDAgUDZWZmBQ5pZHhUb3RhbFBpZWNlcwUCTTgJAJEDAgUDZWZmBQ1pZHhUb3RhbEFjcmVzCQDMCAIFDGlzc3VlZEFtb3VudAkAzAgCCQBrAwkAZQIFDXRvdGFsRnVuZHNVc2QFE1VTRFRfVFZMX0NPUlJFQ1RJT04FAk04BQxpc3N1ZWRBbW91bnQJAMwIAgUNdG90YWxGdW5kc1VzZAkAzAgCBQplY29ub215VXNkCQDMCAIFB3Jlc3RVc2QJAMwIAgUGd2xnVXNkCQDMCAIFCXB1enpsZVVzZAkAzAgCBQlpc3N1ZVRpbWUJAMwIAgUMbGFzdFRlYW1UaW1lCQDMCAIFCXRlYW1Ub3RhbAkAzAgCBQ50ZWFtQW1vdW50TGVmdAkAzAgCBRZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCnRlYW1XbGdvbGQJAMwIAgUIYWN0VG90YWwJAMwIAgUNYWN0QW1vdW50TGVmdAkAzAgCBRVhY3RBbW91bnRBdmFpbGFibGVOb3cJAMwIAgUJYWN0V2xnb2xkCQDMCAIFCWN1clBlcmlvZAkAzAgCBQ9hbW91bnRMZWZ0VG90YWwJAMwIAgUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQDMCAIFDGxhc3RVc2VyVGltZQkAzAgCBQpyb2JiZWRVc2VyCQDMCAIFEHNMYW5kRGFpbHlBbW91bnQJAMwIAgUPaW52ZXN0RnVuZFRvdGFsCQDMCAIFDHVucm9iYmVkVXNlcgkAzAgCBQtlZmZMYXN0VGltZQkAzAgCBQpiYW5rV2xnb2xkBQNuaWwAA002XwDAhD0AA004XwCAwtcvAApURUFNX1NIQVJFAMCaDAAOQUNUSVZJVFlfU0hBUkUAoI0GAAxQTEFZRVJfU0hBUkUAgLUYAAtZRUFSX01JTExJUwCAhuvHdQAGREFZX01TAIC4mSkAB0lTU1VFMTAAgJTr3AMAD1BMQVlFUlMxMF9TSEFSRQCA6jAAEU1BUktFVElORzEwX1NIQVJFAKCNBgAMVEVBTTEwX1NIQVJFAKCNBgARTkVXX1NUQUtJTkdfU1RBUlQAgPO4wrEyABBtYXJrZXRpbmdBZGRyS2V5Ag1tYXJrZXRpbmdBZGRyAAp0ZWFtQWRyS2V5Agh0ZWFtQWRkcgAObGFzdFRlYW1UaW1LZXkCFGxhc3RDbGFpbWVkVGltZV90ZWFtAA50ZWFtQW10TGVmdEtleQIOdGVhbUFtb3VudExlZnQAFGxhc3RBY3Rpdml0aWVzVGltS2V5AhpsYXN0Q2xhaW1lZFRpbWVfYWN0aXZpdGllcwANYWN0QW10TGVmdEtleQIUYWN0aXZpdGllc0Ftb3VudExlZnQAEXN0YWtlcnNBbXRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEEYWRkcgkArAICAhRsYXN0Q2xhaW1lZFRpbWVVc2VyXwUEYWRkcgENZGlzdHJCeVBlcmlvZAIMaXNzdWVkQW1vdW50BnBlcmlvZAkAawMFDGlzc3VlZEFtb3VudAkAaAIFDFBMQVlFUl9TSEFSRQkAZAIFBnBlcmlvZAABCQBoAgAGBQNNNl8AEXdsZ0lzc3VlMTBUaW1lS2V5Ag93bGdfaXNzdWUxMFRpbWUADndsZ0lzc3VlVGltS2V5Ag13bGdfaXNzdWVUaW1lAA93bGdJc3N1ZWRBbXRLZXkCEHdsZ19pc3N1ZWRBbW91bnQADnpiSXNzdWVkQW10S2V5AhJ6YmlsbF9pc3N1ZWRBbW91bnQBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgASYWNyZXNTdGFrZFRvdGFsS2V5AhZhY3Jlc1N0YWtlZEFtb3VudFRvdGFsABR0b3RhbEZhcm1pbmdQb3dlcktleQIRdG90YWxGYXJtaW5nUG93ZXIACWRhcHAyUmVzdAAAAAxkYXBwMlN0YWtpbmcAAQAIZGFwcDJXbGcAAgALZGFwcDJQdXp6bGUAAwAPZGFwcDJJbnZlc3RGdW5kAAQAFURFRkFVTFRfV0VFS0xZX1BSSVpFUwAFAA1BQ1JFU19GT1JfQkVUAIDC1y8AEWtleU5mdFRvdGFsSXNzdWVkAg5uZnRUb3RhbElzc3VlZAARa2V5TmZ0VG90YWxCdXJuZWQCDm5mdFRvdGFsQnVybmVkABNrZXlXbE5mdFRvdGFsU3Rha2VkAhBXbE5mdFRvdGFsU3Rha2VkARJrZXlVc2VyV2xOZnROdW1iZXIBBGFkZHIJAKwCAgIQdXNlcldsTmZ0TnVtYmVyXwUEYWRkcgEQa2V5VXNlckZ1bGxCb251cwEEYWRkcgkArAICAg51c2VyRnVsbEJvbnVzXwUEYWRkcgAKbGV2ZWxBY3JlcwkAzAgCAAAJAMwIAgAKCQDMCAIAFAkAzAgCACgJAMwIAgBQCQDMCAIAlgEJAMwIAgD6AQkAzAgCAJADCQDMCAIAvAUJAMwIAgDoBwUDbmlsAQ9nZXRMZXZlbEJ5QWNyZXMBBWFjcmVzBANhY3IJAGkCCQBkAgUFYWNyZXMA/8HXLwUDTThfCgEHY2hlY2tlcgIDYWNjBGl0ZW0DCQBnAgUEaXRlbQUDYWNyBQNhY2MJAGQCBQNhY2MAAQoAAiRsBQpsZXZlbEFjcmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdjaGVja2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQVhY3JlcwkAaAIJAGgCBQVhY3JlcwAUCQBkAgkBD2dldExldmVsQnlBY3JlcwEFBWFjcmVzAAQBHmdldEZhcm1pbmdQb3dlckJ5QWNyZXNBbmRCb251cwIFYWNyZXMGYm9udXM2BApub3RCb251c2VkCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFBWFjcmVzCQCUCgIJAGsDBQpub3RCb251c2VkCQBkAgUDTTZfBQZib251czYFA002XwUKbm90Qm9udXNlZAEQZ2V0RmFybWluZ1Bvd2VycwISdXNlckFkZHJTdHJPckVtcHR5DmFjcmVzMkNvbnRyYWN0BAd0b3RhbEZQCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0BRR0b3RhbEZhcm1pbmdQb3dlcktleQAABAl1c2VyQWNyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFEnVzZXJBZGRyU3RyT3JFbXB0eQAABAl1c2VyQm9udXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARBrZXlVc2VyRnVsbEJvbnVzAQUSdXNlckFkZHJTdHJPckVtcHR5AAAECCR0MDc5MTQzCQEeZ2V0RmFybWluZ1Bvd2VyQnlBY3Jlc0FuZEJvbnVzAgUJdXNlckFjcmVzBQl1c2VyQm9udXMEDXVzZXJGUGJvbnVzZWQIBQgkdDA3OTE0MwJfMQQQdXNlckZQbm90Qm9udXNlZAgFCCR0MDc5MTQzAl8yCQDMCAIFB3RvdGFsRlAJAMwIAgUNdXNlckZQYm9udXNlZAkAzAgCBRB1c2VyRlBub3RCb251c2VkCQDMCAIFCXVzZXJCb251cwUDbmlsAAppZHhUb3RhbEZQAAAAEGlkeFVzZXJGUGJvbnVzZWQAAQEMZ2V0V2xnU3RhdHMyBAt1c2VyQWRkck9wdAljb250cmFjdHMGdXNkdElkFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQMaXNzdWVkQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ93bGdJc3N1ZWRBbXRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQHcmVzdFVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUJZGFwcDJSZXN0BQZ1c2R0SWQEBndsZ1VzZAkAZQIJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQZ1c2R0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQJcHV6emxlVXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQtkYXBwMlB1enpsZQUGdXNkdElkBAlhY3JlczJVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwUGdXNkdElkBBFpbnZlc3RGbmRDb250cmFjdAkAkQMCBQljb250cmFjdHMFD2RhcHAySW52ZXN0RnVuZAQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRFpbnZlc3RGbmRDb250cmFjdAUGdXNkdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEWludmVzdEZuZENvbnRyYWN0BQ56Yklzc3VlZEFtdEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIFCWFjcmVzMlVzZAUGd2xnVXNkBQ9pbnZlc3RGdW5kVG90YWwEBXdsZ0lkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnAgt3bGdfYXNzZXRJZAITTm90IGluaXRpYWxpemVkIHlldAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ53bGdJc3N1ZVRpbUtleQIPTm90IGluaXRpYWxpemVkBAZ3bGdXbGcJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQV3bGdJZAQJdGVhbVRvdGFsCQBrAwUMaXNzdWVkQW1vdW50BQpURUFNX1NIQVJFBQNNNl8EDnRlYW1BbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUOdGVhbUFtdExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUObGFzdFRlYW1UaW1LZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQp0ZWFtQWRyS2V5BBZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCXRlYW1Ub3RhbAkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQtZRUFSX01JTExJUwkAzAgCBQ50ZWFtQW1vdW50TGVmdAUDbmlsBAp0ZWFtV2xnb2xkCQDwBwIFCHRlYW1BZGRyBQV3bGdJZAQIYWN0VG90YWwJAGsDBQxpc3N1ZWRBbW91bnQFDkFDVElWSVRZX1NIQVJFBQNNNl8EDWFjdEFtb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ1hY3RBbXRMZWZ0S2V5BQhhY3RUb3RhbAQSbGFzdEFjdGl2aXRpZXNUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUUbGFzdEFjdGl2aXRpZXNUaW1LZXkFCWlzc3VlVGltZQQVYWN0QW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCGFjdFRvdGFsCQBlAgUDbm93BRJsYXN0QWN0aXZpdGllc1RpbWUJAGgCAAMFC1lFQVJfTUlMTElTCQDMCAIFDWFjdEFtb3VudExlZnQFA25pbAQJYWN0V2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQlkYXBwMlJlc3QFBXdsZ0lkBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnCQEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEFC3VzZXJBZGRyT3B0BQlpc3N1ZVRpbWUEDmxhc3RVc2VyUGVyaW9kCQBpAgkAZQIFDGxhc3RVc2VyVGltZQUJaXNzdWVUaW1lBQtZRUFSX01JTExJUwQKbm93TGltaXRlZAkAlwMBCQDMCAIFA25vdwkAzAgCCQBkAgUJaXNzdWVUaW1lCQBoAgADBQtZRUFSX01JTExJUwUDbmlsBAljdXJQZXJpb2QJAJcDAQkAzAgCCQBpAgkAZQIFA25vdwUJaXNzdWVUaW1lBQtZRUFSX01JTExJUwkAzAgCAAIFA25pbAQDZWZmCQEQZ2V0RmFybWluZ1Bvd2VycwIFC3VzZXJBZGRyT3B0CQCRAwIFCWNvbnRyYWN0cwUMZGFwcDJTdGFraW5nBBVjdXJQZXJpb2REaXN0cmlidXRpb24JAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50BQljdXJQZXJpb2QEDXByZXZQZXJpb2RFbmQJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kBBFwcmV2UHJldlBlcmlvZEVuZAkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTCQBlAgUJY3VyUGVyaW9kAAEEAmEwCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBlAgUKbm93TGltaXRlZAUMbGFzdFVzZXJUaW1lBQtZRUFSX01JTExJUwQNdXNlckF2YWlsYWJsZQMJAAACBQ5sYXN0VXNlclBlcmlvZAUJY3VyUGVyaW9kBQJhMAMJAAACBQ5sYXN0VXNlclBlcmlvZAkAZQIFCWN1clBlcmlvZAABBAJhMQkAawMJAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50CQBlAgUJY3VyUGVyaW9kAAEJAGUCBQ1wcmV2UGVyaW9kRW5kBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTCQBkAgUCYTEFAmEwBAJhMgkAawMJAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50CQBlAgUJY3VyUGVyaW9kAAIJAGUCBRFwcmV2UHJldlBlcmlvZEVuZAUMbGFzdFVzZXJUaW1lBQtZRUFSX01JTExJUwQCYTEJAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50CQBlAgUJY3VyUGVyaW9kAAEJAGQCCQBkAgUCYTIFAmExBQJhMAQPYW1vdW50TGVmdFRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwURc3Rha2Vyc0FtdExlZnRLZXkAAAQKdXNlckFtb3VudAMJAQIhPQIJAJEDAgUDZWZmBQppZHhUb3RhbEZQAAAJAGsDBQ11c2VyQXZhaWxhYmxlCQCRAwIFA2VmZgUQaWR4VXNlckZQYm9udXNlZAkAkQMCBQNlZmYFCmlkeFRvdGFsRlAAAAQPbGFzdElzc3VlMTBUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwURd2xnSXNzdWUxMFRpbWVLZXkFEU5FV19TVEFLSU5HX1NUQVJUBA1pc3N1ZTEwQW1vdW50CQBrAwUHSVNTVUUxMAkAlgMBCQDMCAIJAGUCBQNub3cFD2xhc3RJc3N1ZTEwVGltZQkAzAgCAAAFA25pbAUGREFZX01TBBZtYXJrZXRpbmdJc3N1ZTEwQW1vdW50CQBrAwUNaXNzdWUxMEFtb3VudAURTUFSS0VUSU5HMTBfU0hBUkUFA002XwQRdGVhbUlzc3VlMTBBbW91bnQJAGsDBQ1pc3N1ZTEwQW1vdW50BQxURUFNMTBfU0hBUkUFA002XwQOdXNlcjEwSW50ZXJ2YWwJAJYDAQkAzAgCCQBlAgUDbm93CQCWAwEJAMwIAgURTkVXX1NUQUtJTkdfU1RBUlQJAMwIAgUMbGFzdFVzZXJUaW1lBQNuaWwJAMwIAgAABQNuaWwECnVzZXIxMHBhcnQDCQECIT0CCQCRAwIFA2VmZgUKaWR4VG90YWxGUAAACQBrAwkAawMJAGsDBQdJU1NVRTEwBQ51c2VyMTBJbnRlcnZhbAUGREFZX01TCQCRAwIFA2VmZgUQaWR4VXNlckZQYm9udXNlZAkAkQMCBQNlZmYFCmlkeFRvdGFsRlAFD1BMQVlFUlMxMF9TSEFSRQUDTTZfAAAEDm5ld0lzc3VlMTBUaW1lCQCWAwEJAMwIAgURTkVXX1NUQUtJTkdfU1RBUlQJAMwIAgUDbm93BQNuaWwEEGFjcmVzU3Rha2VkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwUSYWNyZXNTdGFrZFRvdGFsS2V5AAAEDm5mdFRvdGFsSXNzdWVkCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcFEWtleU5mdFRvdGFsSXNzdWVkAAAEDm5mdFRvdGFsQnVybmVkCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcFEWtleU5mdFRvdGFsQnVybmVkAAAEEHdsTmZ0VG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwUTa2V5V2xOZnRUb3RhbFN0YWtlZAAABA93bE5mdFVzZXJTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwkBEmtleVVzZXJXbE5mdE51bWJlcgEJAQt2YWx1ZU9yRWxzZQIFC3VzZXJBZGRyT3B0AgAAAAkAzAgCBQxpc3N1ZWRBbW91bnQJAMwIAgUGd2xnV2xnCQDMCAIJAGsDBQ10b3RhbEZ1bmRzVXNkBQNNOF8FDGlzc3VlZEFtb3VudAkAzAgCBQ10b3RhbEZ1bmRzVXNkCQDMCAIFB3Jlc3RVc2QJAMwIAgUJYWNyZXMyVXNkCQDMCAIFBndsZ1VzZAkAzAgCBQlwdXp6bGVVc2QJAMwIAgUJaXNzdWVUaW1lCQDMCAIFDGxhc3RUZWFtVGltZQkAzAgCBQl0ZWFtVG90YWwJAMwIAgUOdGVhbUFtb3VudExlZnQJAMwIAgUWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQp0ZWFtV2xnb2xkCQDMCAIFCGFjdFRvdGFsCQDMCAIFDWFjdEFtb3VudExlZnQJAMwIAgUVYWN0QW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCWFjdFdsZ29sZAkAzAgCBQljdXJQZXJpb2QJAMwIAgUPYW1vdW50TGVmdFRvdGFsCQDMCAIFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAzAgCBQxsYXN0VXNlclRpbWUJAMwIAgUPaW52ZXN0RnVuZFRvdGFsCQDMCAIFCnVzZXJBbW91bnQJAMwIAgUKbm93TGltaXRlZAkAzAgCBQ1pc3N1ZTEwQW1vdW50CQDMCAIFFm1hcmtldGluZ0lzc3VlMTBBbW91bnQJAMwIAgURdGVhbUlzc3VlMTBBbW91bnQJAMwIAgUKdXNlcjEwcGFydAkAzAgCBQ5uZXdJc3N1ZTEwVGltZQkAzAgCCQCRAwIFA2VmZgUKaWR4VG90YWxGUAkAzAgCBRBhY3Jlc1N0YWtlZFRvdGFsCQDMCAIFDm5mdFRvdGFsSXNzdWVkCQDMCAIFDm5mdFRvdGFsQnVybmVkCQDMCAIFEHdsTmZ0VG90YWxTdGFrZWQJAMwIAgUPd2xOZnRVc2VyU3Rha2VkBQNuaWwADXByb2ZpdEFkZHJLZXkCCnByb2ZpdEFkZHIAGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkCFnN0YWtlcnNBbW91bnRQYWlkVG90YWwBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEEYWRkcgkArAICAhZzdGFrZXJzQW1vdW50UGFpZFVzZXJfBQRhZGRyAQdwcm9sb2cyAAkBBWFzSW50AQkA/QcEBQ5hY3JlczJDb250cmFjdAIKc2F2ZUxhc3RUeAUDbmlsBQNuaWwBEmdldFN3YXBMaW1pdFdsZ29sZAEEYWRkcgQIbGFzdFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBQRhZGRyAAAEDGRlZmF1bHRMaW1pdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5hY3JlczJDb250cmFjdAkBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQUEYWRkcgAABA1sYXN0TGltaXRMZWZ0CQELdmFsdWVPckVsc2UCCQCfCAEJARprZXlMYXN0V2xnVHJhZGVMaW1pdEJ5VXNlcgEFBGFkZHIFDGRlZmF1bHRMaW1pdAQMY3VycmVudExpbWl0CQBkAgUNbGFzdExpbWl0TGVmdAkAawMFDGRlZmF1bHRMaW1pdAkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhsYXN0VGltZQUKREFZX01JTExJUwkAlwMBCQDMCAIFDGN1cnJlbnRMaW1pdAkAzAgCBQxkZWZhdWx0TGltaXQFA25pbAAQaWR4V2xnVGVhbUFtTGVmdAAKABRpZHhXbGdUZWFtQW1BdmFpbE5vdwALAA9pZHhXbGdBY3RBbUxlZnQADgATaWR4V2xnQWN0QW1BdmFpbE5vdwAPABFpZHhXbGdBbUxlZnRUb3RhbAASABRpZHhXbGdVc2VyVG90YWxBdmFpbAAYABFpZHhXbGdFZmZVc2VyVGltZQAZAQ1jbGFpbUludGVybmFsAQRhZGRyBAZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIED2Vjb25vbXlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUSZWNvbm9teUNvbnRyYWN0U3RyBAhjdXJTdGF0cwkBC2dldFdsZ1N0YXRzBQUEYWRkcgkAzAgCBQxyZXN0Q29udHJhY3QJAMwIAgUPc3Rha2luZ0NvbnRyYWN0CQDMCAIFD2Vjb25vbXlDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0CQDMCAIFDWFjcmVzQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAUFTVVMVDYEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEDnRlYW1BbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBRBpZHhXbGdUZWFtQW1MZWZ0BAp0ZWFtQW1vdW50CQCRAwIFCGN1clN0YXRzBRRpZHhXbGdUZWFtQW1BdmFpbE5vdwQNYWN0QW1vdW50TGVmdAkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnQWN0QW1MZWZ0BAlhY3RBbW91bnQJAJEDAgUIY3VyU3RhdHMFE2lkeFdsZ0FjdEFtQXZhaWxOb3cECnVzZXJBbW91bnQJAJEDAgUIY3VyU3RhdHMFFGlkeFdsZ1VzZXJUb3RhbEF2YWlsBAd1c2VyS2V5CQEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQUEYWRkcgQJdXNlclRvdGFsCQCRAwIFCGN1clN0YXRzBRRpZHhXbGdVc2VyVG90YWxBdmFpbAQLdXNlckVmZlRpbWUJAJEDAgUIY3VyU3RhdHMFEWlkeFdsZ0VmZlVzZXJUaW1lCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQt0ZWFtQWRkcktleQUKdGVhbUFtb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFCWFjdEFtb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdXNlcktleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdXNlcktleQAABQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AAAFCXVzZXJUb3RhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGUCCQCRAwIFCGN1clN0YXRzBRFpZHhXbGdBbUxlZnRUb3RhbAUJdXNlclRvdGFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF0ZWFtQW1vdW50TGVmdEtleQkAZQIFDnRlYW1BbW91bnRMZWZ0BQp0ZWFtQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9sYXN0VGVhbVRpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQYWN0QW1vdW50TGVmdEtleQkAZQIFDWFjdEFtb3VudExlZnQFCWFjdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIJARtrZXlMYXN0Q2xhaW1lZFRpbWVCeVVzZXJPbGQBBQRhZGRyBQt1c2VyRWZmVGltZQUDbmlsBQp1c2VyQW1vdW50AQ5jbGFpbUludGVybmFsMgEEYWRkcgQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEBQRhZGRyCQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAt1c2VyVGltZUtleQkBFmtleUxhc3RDbGFpbVRpbWVCeVVzZXIBBQRhZGRyBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQULdXNlclRpbWVLZXkAAAQLdXNlckVmZlRpbWUJAJEDAgUIY3VyU3RhdHMFEGl4V2xnRWZmVXNlclRpbWUDCQAAAgUMbGFzdFVzZXJUaW1lBQt1c2VyRWZmVGltZQkAlAoCBQNuaWwAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQCRAwIFCGN1clN0YXRzBQ5peFdsZ0lzc3VlVGltZQQOdGVhbUFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFD2l4V2xnVGVhbUFtTGVmdAQKdGVhbUFtb3VudAkAZAIJAJEDAgUIY3VyU3RhdHMFE2l4V2xnVGVhbUFtQXZhaWxOb3cJAJEDAgUIY3VyU3RhdHMFFml4V2xnVGVhbUlzc3VlMTBBbW91bnQEC3RlYW1BY3Rpb25zAwkAZgIFCnRlYW1BbW91bnQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgURdGVhbUFtb3VudExlZnRLZXkJAGQCCQBlAgUOdGVhbUFtb3VudExlZnQFCnRlYW1BbW91bnQJAJEDAgUIY3VyU3RhdHMFFml4V2xnVGVhbUlzc3VlMTBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2xhc3RUZWFtVGltZUtleQUDbm93CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQULdGVhbUFkZHJLZXkFCnRlYW1BbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBA1hY3RBbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBQ5peFdsZ0FjdEFtTGVmdAQJYWN0QW1vdW50CQCRAwIFCGN1clN0YXRzBRJpeFdsZ0FjdEFtQXZhaWxOb3cECmFjdEFjdGlvbnMDCQBmAgUJYWN0QW1vdW50AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEGFjdEFtb3VudExlZnRLZXkJAGUCBQ1hY3RBbW91bnRMZWZ0BQlhY3RBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFWxhc3RBY3Rpdml0aWVzVGltZUtleQUDbm93CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUJYWN0QW1vdW50BQp3bGdBc3NldElkBQNuaWwFA25pbAQPbWFya2V0aW5nQW1vdW50CQCRAwIFCGN1clN0YXRzBRtpeFdsZ01hcmtldGluZ0lzc3VlMTBBbW91bnQEEW1hcmtldGluZ1RyYW5zZmVyAwkAZgIFD21hcmtldGluZ0Ftb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUQbWFya2V0aW5nQWRkcktleQUPbWFya2V0aW5nQW1vdW50BQp3bGdBc3NldElkBQNuaWwFA25pbAQKdXNlckFtb3VudAkAkQMCBQhjdXJTdGF0cwUTaXhXbGdVc2VyQW1BdmFpbE5vdwQHdXNlcktleQkBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEFBGFkZHIECXVzZXJUb3RhbAkAZAIFCnVzZXJBbW91bnQJAJEDAgUIY3VyU3RhdHMFD2l4V2xnVXNlcjEwcGFydAQOaXNzdWVkMTBBbW91bnQJAJEDAgUIY3VyU3RhdHMFEml4V2xnSXNzdWUxMEFtb3VudAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUKd2xnQXNzZXRJZAUOaXNzdWVkMTBBbW91bnQGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGQCCQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAUOaXNzdWVkMTBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEXdsZ0lzc3VlMTBUaW1lS2V5CQCRAwIFCGN1clN0YXRzBRBpeFdsZ0lzc3VlMTBUaW1lCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd1c2VyS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd1c2VyS2V5AAAFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGUCCQCRAwIFCGN1clN0YXRzBRBpeFdsZ0FtTGVmdFRvdGFsBQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQt1c2VyVGltZUtleQULdXNlckVmZlRpbWUFA25pbAULdGVhbUFjdGlvbnMFCmFjdEFjdGlvbnMFEW1hcmtldGluZ1RyYW5zZmVyBQl1c2VyVG90YWwBDnRha2VYcEludGVybmFsAgRhZGRyBWRlbHRhBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAd0aW1lS2V5CQEWa2V5V2xnU3Rha2VkVGltZUJ5VXNlcgEFBGFkZHIECWFtb3VudEtleQkBGGtleVdsZ1N0YWtlZEFtb3VudEJ5VXNlcgEFBGFkZHIECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFB3RpbWVLZXkAAAQHb2xkVXNlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlhbW91bnRLZXkAAAQIb2xkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURd2xnU3Rha2VkVG90YWxLZXkAAAQCeHAJAGsDCQBrAwUFeHBXbGcFB29sZFVzZXIFD3dsZ0Jhc2VBbW91bnRYcAkAZQIFCGxhc3RUaW1lBQNub3cFCURBWU1JTExJUwkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd0aW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFtb3VudEtleQkAZAIFB29sZFVzZXIFBWRlbHRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF3bGdTdGFrZWRUb3RhbEtleQkAZAIFCG9sZFRvdGFsBQVkZWx0YQUDbmlsBQJ4cAUHb2xkVXNlcgERb3BlbkNoZXN0SW50ZXJuYWwBBGFkZHIEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTBAhkcmF3V2VlawkAZQIFBHdlZWsAAQQJbnVtUHJpemVzCQELdmFsdWVPckVsc2UCCQCfCAEJAQ5rZXlOdW1ORlQyRHJhdwEFCGRyYXdXZWVrBRVERUZBVUxUX1dFRUtMWV9QUklaRVMEC3ByaXplc0RyYXduCQELdmFsdWVPckVsc2UCCQCfCAEJAQ5rZXlOdW1ORlREcmF3bgEFCGRyYXdXZWVrAAAEC3VzZXJUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQhkcmF3V2VlawAAAwkAZwIAAAULdXNlclRpY2tldHMJAJQKAgUDbmlsBQR1bml0BAt3ZWVrVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5VG90YWxXZWVrVGlja2V0cwEFCGRyYXdXZWVrAAADCQBnAgAABQt3ZWVrVGlja2V0cwkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQhkcmF3V2VlawUDbmlsBQR1bml0BAdlbnRyb3B5CQEFdmFsdWUBCAkBBXZhbHVlAQkA7QcBCQBoAgUEd2VlawULV0VFS19CTE9DS1MDdnJmBARzYWx0CQDZBAEJAJEDAgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFDmFjcmVzMkNvbnRyYWN0CQEVa2V5TGFzdFdlZWtUeElkQnlVc2VyAQUEYWRkcgIKNDJfREVGQVVMVAIBXwABBAZyYW5kb20JAQ9nZXRSYW5kb21OdW1iZXIDBQt3ZWVrVGlja2V0cwUEc2FsdAUHZW50cm9weQMJAGYCCQBoAgULdXNlclRpY2tldHMFCW51bVByaXplcwUGcmFuZG9tBAtpc3N1ZVJlc3VsdAkA/AcEBQ5hY3JlczJDb250cmFjdAILaXNzdWVQaWNrQzEJAMwIAgUEYWRkcgUDbmlsBQNuaWwEB3dpbm5lcnMJAKIIAQkBDmtleVdlZWtXaW5uZXJzAQUIZHJhd1dlZWsECm5ld1dpbm5lcnMDCQEJaXNEZWZpbmVkAQUHd2lubmVycwkArAICCQCsAgIJAQV2YWx1ZQEFB3dpbm5lcnMCAV8FBGFkZHIFBGFkZHIJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmtleU51bU5GVERyYXduAQUIZHJhd1dlZWsJAGQCBQtwcml6ZXNEcmF3bgABCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQhkcmF3V2VlawkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5V2Vla1dpbm5lcnMBBQhkcmF3V2VlawUKbmV3V2lubmVycwUDbmlsBQtpc3N1ZVJlc3VsdAQHcmFuZG9tMQkAZAIJAQ9nZXRSYW5kb21OdW1iZXIDAAkJAMsBAgEBQgUEc2FsdAUHZW50cm9weQABBAtjb25zVGlja2V0cwkAawMFC3VzZXJUaWNrZXRzBQdyYW5kb20xAAoECnRpY2tldHNLZXkJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQR3ZWVrBApvbGRUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEFCnRpY2tldHNLZXkAAAkAlAoCCQDNCAIDCQAAAgULY29uc1RpY2tldHMAAAUDbmlsBA1jb21tb25BY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETa2V5VG90YWxXZWVrVGlja2V0cwEFBHdlZWsJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEJARNrZXlUb3RhbFdlZWtUaWNrZXRzAQUEd2VlawAABQtjb25zVGlja2V0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgUKdGlja2V0c0tleQkAZAIFCm9sZFRpY2tldHMFC2NvbnNUaWNrZXRzBQNuaWwDCQBmAgUKb2xkVGlja2V0cwAABQ1jb21tb25BY3Rpb25zCQDNCAIFDWNvbW1vbkFjdGlvbnMJAQxJbnRlZ2VyRW50cnkCCQEYa2V5VG90YWxXZWVrUGFydGljaXBhbnRzAQUEd2VlawkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsAAAABCQELRGVsZXRlRW50cnkBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsFC2NvbnNUaWNrZXRzARRjbGFpbVRpY2tldHNJbnRlcm5hbAIEYWRkcgp1c2VyQmV0U3RyBAR3ZWVrCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwQKdGlja2V0c0tleQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFBHdlZWsEBmRheUJldAkAtQkCBQp1c2VyQmV0U3RyAgFfBA9vbGRUb3RhbFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrAAAECm9sZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKdGlja2V0c0tleQAABAxkZWx0YVRpY2tldHMDCQAAAgkBCndpbm5pbmdCZXQBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGZGF5QmV0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZkYXlCZXQAAQABAAAED29sZFBhcnRpY2lwYW50cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEYa2V5VG90YWxXZWVrUGFydGljaXBhbnRzAQUEd2VlawAABBJ1cGRhdGVQYXJ0aWNpcGFudHMDAwkAAAIFCm9sZFRpY2tldHMAAAkAAAIFDGRlbHRhVGlja2V0cwABBwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsJAGQCBQ9vbGRQYXJ0aWNpcGFudHMAAQUDbmlsBQNuaWwJAJQKAgMJAAACBQxkZWx0YVRpY2tldHMAAAUDbmlsCQDNCAIJAM0IAgUSdXBkYXRlUGFydGljaXBhbnRzCQEMSW50ZWdlckVudHJ5AgUKdGlja2V0c0tleQkAZAIFCm9sZFRpY2tldHMFDGRlbHRhVGlja2V0cwkBDEludGVnZXJFbnRyeQIJARNrZXlUb3RhbFdlZWtUaWNrZXRzAQUEd2VlawkAZAIFD29sZFRvdGFsVGlja2V0cwUMZGVsdGFUaWNrZXRzBQxkZWx0YVRpY2tldHMQAWkBDWNvbnN0cnVjdG9yVjEECHJlc3RBZGRyDW1hcmtldGluZ0FkZHIIdGVhbUFkZHIKcHJvZml0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkAwkBCWlzRGVmaW5lZAEJAKEIAQUNd2xnQXNzZXRJZEtleQkAAgECE0FscmVhZHkgaW5pdGlhbGl6ZWQEDGlzc3VlZEFtb3VudAUITUlMTElPTjYEBWlzc3VlCQDDCAcCBldMR09MRAIgV2F2ZXNMYW5kcyBHb2xkIGludmVzdG1lbnQgdG9rZW4FDGlzc3VlZEFtb3VudAAIBgUEdW5pdAAABAdhc3NldElkCQC4CAEFBWlzc3VlCQDMCAIFBWlzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ93bGdJc3N1ZVRpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkFDGlzc3VlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAawMFCE1JTExJT042BQtQTEFZRVJTSEFSRQUFTVVMVDYJAMwIAgkBC0JpbmFyeUVudHJ5AgUNd2xnQXNzZXRJZEtleQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBRBtYXJrZXRpbmdBZGRyS2V5BQ1tYXJrZXRpbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC3RlYW1BZGRyS2V5BQh0ZWFtQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ1wcm9maXRBZGRyS2V5BQpwcm9maXRBZGRyBQNuaWwBaQENY29uc3RydWN0b3JWMgEJcmVzdDJBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleVJlc3QyQWRkcmVzcwAFCXJlc3QyQWRkcgUDbmlsAWkBBmJ1eVdsZwEMbWluVG9SZWNlaXZlBAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAd1c2R0QW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQGY2FsbGVyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUGY2FsbGVyAwkAZgIFDk1JTlNIT1BQQVlNRU5UBQd1c2R0QW10CQACAQkArAICCQCsAgICEllvdSBjYW4gdHJhZGUgbWluIAkBCmZpeGVkUG9pbnQCBQ5NSU5TSE9QUEFZTUVOVAAGAgUgVVNEVAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkBQd1c2R0QW10BAxjdXJXbGdBbW91bnQJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BAh3bGdQcmljZQkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQQIYnV5UHJpY2UJAG4EBQh3bGdQcmljZQAGAAUFB0NFSUxJTkcECXdsZ0Ftb3VudAkAawMFB3VzZHRBbXQFBU1VTFQ4BQhidXlQcmljZQQGbWF4V2xnCQESZ2V0U3dhcExpbWl0V2xnb2xkAQUEYWRkcgMJAGYCBQl3bGdBbW91bnQFBm1heFdsZwkAAgEJAKwCAgkArAICAhBZb3UgY2FuIGdldCBtYXggCQEKZml4ZWRQb2ludAIFBm1heFdsZwAIAhUgV0xHT0xEIGF0IHRoZSBtb21lbnQDCQBmAgUMbWluVG9SZWNlaXZlBQl3bGdBbW91bnQJAAIBAjBQcmljZSBjaGFuZ2VkIGR1cmluZyBvcGVyYXRpb24sIHBsZWFzZSB0cnkgYWdhaW4EDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABgkAlAoCCQDMCAIJAQdSZWlzc3VlAwUKd2xnQXNzZXRJZAUJd2xnQW1vdW50BgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5CQBkAgUMY3VyV2xnQW1vdW50BQl3bGdBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQUEYWRkcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJARprZXlMYXN0V2xnVHJhZGVMaW1pdEJ5VXNlcgEFBGFkZHIJAGUCBQZtYXhXbGcFCXdsZ0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFDXByb2ZpdEFkZHJLZXkFDHByb2ZpdEFtb3VudAULdXNkdEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQl3bGdBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUMcHJvbG9nUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmJ1eVdsZ1JFQURPTkxZAgdhZGRyZXNzB3VzZHRBbXQECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAUHdXNkdEFtdAQId2xnUHJpY2UJAJEDAgUIY3VyU3RhdHMFCml4V2xnUHJpY2UECGJ1eVByaWNlCQBuBAUId2xnUHJpY2UABgAFBQdDRUlMSU5HBAl3bGdBbW91bnQJAGsDBQd1c2R0QW10BQVNVUxUOAUIYnV5UHJpY2UEBm1heFdsZwkBEmdldFN3YXBMaW1pdFdsZ29sZAEFB2FkZHJlc3MEB21heFVzZHQJAGsDBQZtYXhXbGcFCGJ1eVByaWNlBQVNVUxUOAQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAGCQCUCgIFA25pbAkAzAgCBQl3bGdBbW91bnQJAMwIAgUOTUlOU0hPUFBBWU1FTlQJAMwIAgUHbWF4VXNkdAkAzAgCBQxwcm9maXRBbW91bnQFA25pbAFpAQdzZWxsV2xnAQltaW5BbW91bnQEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBndsZ0FtdAgFA3BtdAZhbW91bnQEBmNhbGxlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBmNhbGxlcgQGbWF4V2xnCQESZ2V0U3dhcExpbWl0V2xnb2xkAQUEYWRkcgMJAGYCBQZ3bGdBbXQFBm1heFdsZwkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHNwZW5kIG1heCAJAQpmaXhlZFBvaW50AgUGbWF4V2xnAAgCFSBXTEdPTEQgYXQgdGhlIG1vbWVudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFCndsZ0Fzc2V0SWQJAAIBAhVXTEdPTEQgcGF5bWVudHMgb25seSEECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAxjdXJXbGdBbW91bnQJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BAlzZWxsUHJpY2UJAGkCCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlAAIEB3VzZHRBbXQJAGsDBQZ3bGdBbXQFCXNlbGxQcmljZQUFTVVMVDgDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUAwkAZgIFCW1pbkFtb3VudAUHdXNkdEFtdAkAAgECMFByaWNlIGNoYW5nZWQgZHVyaW5nIG9wZXJhdGlvbiwgcGxlYXNlIHRyeSBhZ2FpbgQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAFCQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZQIFDGN1cldsZ0Ftb3VudAUGd2xnQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZa2V5TGFzdFdsZ1RyYWRlVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5TGFzdFdsZ1RyYWRlTGltaXRCeVVzZXIBBQRhZGRyCQBlAgUGbWF4V2xnBQZ3bGdBbXQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQ1wcm9maXRBZGRyS2V5BQxwcm9maXRBbW91bnQFC3VzZHRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUHdXNkdEFtdAULdXNkdEFzc2V0SWQFA25pbAUMcHJvbG9nUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD3NlbGxXbGdSRUFET05MWQIHYWRkcmVzcwZ3bGdBbXQEBm1heFdsZwkBEmdldFN3YXBMaW1pdFdsZ29sZAEFB2FkZHJlc3MECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAlzZWxsUHJpY2UJAGkCCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlAAIEB3VzZHRBbXQJAGsDBQZ3bGdBbXQFCXNlbGxQcmljZQUFTVVMVDgEBm1pbldsZwkAawMFDk1JTlNIT1BQQVlNRU5UBQVNVUxUOAUJc2VsbFByaWNlBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAUJAJQKAgUDbmlsCQDMCAIFB3VzZHRBbXQJAMwIAgUGbWluV2xnCQDMCAIFBm1heFdsZwkAzAgCBQxwcm9maXRBbW91bnQFA25pbAFpAQVjbGFpbQAEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEDSR0MDE2NDM5MTY1MDgJAQ5jbGFpbUludGVybmFsMgEJAKUIAQgFAWkGY2FsbGVyBAdhY3Rpb25zCAUNJHQwMTY0MzkxNjUwOAJfMQQQd2xnQ2xhaW1lZEFtb3VudAgFDSR0MDE2NDM5MTY1MDgCXzIJAJQKAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFEHdsZ0NsYWltZWRBbW91bnQFCndsZ0Fzc2V0SWQFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJvblN0YWtlVW5zdGFrZUxhbmQBBGFkZHIDAwMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQECIT0CCAUBaQZjYWxsZXIFDWFjcmVzQ29udHJhY3QHCQECIT0CCAUBaQZjYWxsZXIFDmFjcmVzMkNvbnRyYWN0BwkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA0kdDAxNjgyODE2ODg1CQEOY2xhaW1JbnRlcm5hbDIBBQRhZGRyAwkAAAIFDSR0MDE2ODI4MTY4ODUFDSR0MDE2ODI4MTY4ODUEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAxNjgyODE2ODg1Al8yBAdhY3Rpb25zCAUNJHQwMTY4MjgxNjg4NQJfMQkAlAoCAwkAZgIFEHdsZ0NsYWltZWRBbW91bnQAAAkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyBRB3bGdDbGFpbWVkQW1vdW50BQp3bGdBc3NldElkBQdhY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFW9uU3Rha2VVbnN0YWtlTGFuZE9sZAEEYWRkcgMDAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAQIhPQIIBQFpBmNhbGxlcgUNYWNyZXNDb250cmFjdAcJAQIhPQIIBQFpBmNhbGxlcgUOYWNyZXMyQ29udHJhY3QHCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDE3MjY4MTczMjQJAQ1jbGFpbUludGVybmFsAQUEYWRkcgMJAAACBQ0kdDAxNzI2ODE3MzI0BQ0kdDAxNzI2ODE3MzI0BBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTcyNjgxNzMyNAJfMgQHYWN0aW9ucwgFDSR0MDE3MjY4MTczMjQCXzEJAJQKAgMJAGYCBRB3bGdDbGFpbWVkQW1vdW50AAAJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYWRkcgUQd2xnQ2xhaW1lZEFtb3VudAUKd2xnQXNzZXRJZAUDbmlsBRB3bGdDbGFpbWVkQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmJ1cm5XbGdvbGQBBndsZ0FtdAMJAQIhPQIIBQFpBmNhbGxlcgUOYWNyZXMyQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAADCQBmAgUGd2xnQW10CQCRAwIFCGN1clN0YXRzBQhpeFdsZ1dsZwkAAgEJAKwCAgkArAICCQCsAgICBU9ubHkgCQEKZml4ZWRQb2ludAIJAJEDAgUIY3VyU3RhdHMFCGl4V2xnV2xnAAgCJSBXTEdPTEQgbGVmdCBvbiBjb250cmFjdCwgY2FuJ3QgYnVybiAJAQpmaXhlZFBvaW50AgUGd2xnQW10AAgEDXdsZ0Ftb3VudExlZnQJAGUCCQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAUGd2xnQW10CQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQUNd2xnQW1vdW50TGVmdAUDbmlsBQ13bGdBbW91bnRMZWZ0AWkBDGJldEZvclRpY2tldAEDYmV0BAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQIZHJhd1dlZWsJAGUCCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwABBAt1c2VyVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsAAAQLd2Vla1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQhkcmF3V2VlawAAAwMJAGYCBQt1c2VyVGlja2V0cwAACQBmAgULd2Vla1RpY2tldHMAAAcJAAIBAhtQbGVhc2Ugb3BlbiB0aGUgY2hlc3QgZmlyc3QDCQECIT0CCQBpAgUDYmV0AAQAAAkAAgECG0ludmFsaWQgYmV0OiBzaG91bGQgYmUgMC4uMwQGbW9tZW50CQBqAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTAwkAZgIFBm1vbWVudAkAZQIFCkRBWV9CTE9DS1MAAwkAAgEJAKwCAgkArAICAjFDYW5ub3QgYmV0OiB0aGUgZGF5IGlzIGFsbW9zdCBlbmRlZCwgcGxlYXNlIHdhaXQgCQCkAwEJAGUCBQpEQVlfQkxPQ0tTBQZtb21lbnQCByBibG9ja3MEC3N0YWtlZEFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQRhZGRyAAADCQBmAgUNQUNSRVNfRk9SX0JFVAULc3Rha2VkQWNyZXMJAAIBCQCsAgIJAKwCAgIbWW91IG5lZWQgdG8gc3Rha2UgYXQgbGVhc3QgCQEKZml4ZWRQb2ludAIFDUFDUkVTX0ZPUl9CRVQACAINIEFDUkVTIHRvIGJldAQIdG9tb3Jyb3cJAGQCCQBpAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTAAEEBmJldEtleQkBCmtleVVzZXJCZXQBBQRhZGRyBA1vbGRVc2VyQmV0U3RyCQCiCAEFBmJldEtleQQLbmV3QmV0RW50cnkJAQtTdHJpbmdFbnRyeQIFBmJldEtleQkArAICCQCsAgIJAKQDAQUIdG9tb3Jyb3cCAV8JAKQDAQUDYmV0AwkBCWlzRGVmaW5lZAEFDW9sZFVzZXJCZXRTdHIEB3VzZXJCZXQJAQV2YWx1ZQEFDW9sZFVzZXJCZXRTdHIDCQAAAgkAkQMCCQC1CQIFB3VzZXJCZXQCAV8AAAkApAMBBQh0b21vcnJvdwkAAgECHFlvdSBhbHJlYWR5IGJldCBmb3IgdG9tb3Jyb3cEAXIJARRjbGFpbVRpY2tldHNJbnRlcm5hbAIFBGFkZHIFB3VzZXJCZXQJAJQKAgkAzQgCCAUBcgJfMQULbmV3QmV0RW50cnkIBQFyAl8yCQCUCgIJAMwIAgULbmV3QmV0RW50cnkFA25pbAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXRha2VXbGdYcAEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDE5OTI2MTk5NjkJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHYWN0aW9ucwgFDSR0MDE5OTI2MTk5NjkCXzEEAnhwCAUNJHQwMTk5MjYxOTk2OQJfMgkAlAoCBQdhY3Rpb25zBQJ4cAFpARJjaGVja1dsZ1hwUkVBRE9OTFkBBGFkZHIEDSR0MDIwMDQ2MjAwOTQJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHaWdub3JlZAgFDSR0MDIwMDQ2MjAwOTQCXzEEB2RlbHRhWFAIBQ0kdDAyMDA0NjIwMDk0Al8yBAVuZXdYUAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEJa2V5VXNlclhQAQUEYWRkcgAABQdkZWx0YVhQBAlsdmxQb2ludHMJAQdsZXZlbFVwAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlVc2VyTGV2ZWwBBQRhZGRyAAAFBW5ld1hQCQCUCgIFA25pbAkAzQgCBQlsdmxQb2ludHMFBW5ld1hQAWkBDHNldE51bVByaXplcwEJbnVtUHJpemVzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlOdW1ORlQyRHJhdwEFBHdlZWsFCW51bVByaXplcwUDbmlsBQludW1Qcml6ZXMBaQEJb3BlbkNoZXN0AAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQIZHJhd1dlZWsJAGUCCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwABBARhZGRyCQClCAEIBQFpBmNhbGxlcgQLdXNlclRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFCGRyYXdXZWVrAAADCQBnAgAABQt1c2VyVGlja2V0cwkAAgECGU5vIGdlbXMgdG8gb3BlbiB0aGUgY2hlc3QJARFvcGVuQ2hlc3RJbnRlcm5hbAEFBGFkZHIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKYWRkR2Vtc0ZvcgIEYWRkcgxkZWx0YVRpY2tldHMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQEd2VlawkAaQIFBmhlaWdodAULV0VFS19CTE9DS1MECnRpY2tldHNLZXkJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQR3ZWVrBA9vbGRUb3RhbFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrAAAECm9sZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKdGlja2V0c0tleQAABA9vbGRQYXJ0aWNpcGFudHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsAAAQSdXBkYXRlUGFydGljaXBhbnRzAwMJAAACBQpvbGRUaWNrZXRzAAAJAAACBQxkZWx0YVRpY2tldHMAAQcJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlUb3RhbFdlZWtQYXJ0aWNpcGFudHMBBQR3ZWVrCQBkAgUPb2xkUGFydGljaXBhbnRzAAEFA25pbAUDbmlsCQCUCgIJAM0IAgkAzQgCBRJ1cGRhdGVQYXJ0aWNpcGFudHMJAQxJbnRlZ2VyRW50cnkCBQp0aWNrZXRzS2V5CQBkAgUKb2xkVGlja2V0cwUMZGVsdGFUaWNrZXRzCQEMSW50ZWdlckVudHJ5AgkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrCQBkAgUPb2xkVG90YWxUaWNrZXRzBQxkZWx0YVRpY2tldHMFDGRlbHRhVGlja2V0cwC1h2Bs", "height": 3413450, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6jygPk1vZcRyMffmD1MKm9JxZjpRvBvBmgr4UXMauREN Next: 53rW9Ba4zwe6GQjwSpduXNstE5AytXWAybVmptYug5aP Diff:
OldNewDifferences
702702 let issueTime = curStats[ixWlgIssueTime]
703703 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
704704 let teamAmount = (curStats[ixWlgTeamAmAvailNow] + curStats[ixWlgTeamIssue10Amount])
705- let teamTransfer = if ((teamAmount > 0))
706- then [ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
705+ let teamActions = if ((teamAmount > 0))
706+ then [IntegerEntry(teamAmountLeftKey, ((teamAmountLeft - teamAmount) + curStats[ixWlgTeamIssue10Amount])), IntegerEntry(lastTeamTimeKey, now), ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
707707 else nil
708708 let actAmountLeft = curStats[ixWlgActAmLeft]
709709 let actAmount = curStats[ixWlgActAmAvailNow]
710- let actTransfer = if ((actAmount > 0))
711- then [ScriptTransfer(restContract, actAmount, wlgAssetId)]
710+ let actActions = if ((actAmount > 0))
711+ then [IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), ScriptTransfer(restContract, actAmount, wlgAssetId)]
712712 else nil
713713 let marketingAmount = curStats[ixWlgMarketingIssue10Amount]
714714 let marketingTransfer = if ((marketingAmount > 0))
718718 let userKey = keyStakersAmountPaidUser(addr)
719719 let userTotal = (userAmount + curStats[ixWlgUser10part])
720720 let issued10Amount = curStats[ixWlgIssue10Amount]
721- $Tuple2(((([Reissue(wlgAssetId, issued10Amount, true), IntegerEntry(wlgIssuedAmountKey, (curStats[ixWlgAmount] + issued10Amount)), IntegerEntry(wlgIssue10TimeKey, curStats[ixWlgIssue10Time]), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userAmount)), IntegerEntry(stakersAmountLeftKey, (curStats[ixWlgAmLeftTotal] - userAmount)), IntegerEntry(teamAmountLeftKey, ((teamAmountLeft - teamAmount) + curStats[ixWlgTeamIssue10Amount])), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(userTimeKey, userEffTime)] ++ teamTransfer) ++ actTransfer) ++ marketingTransfer), userTotal)
721+ $Tuple2(((([Reissue(wlgAssetId, issued10Amount, true), IntegerEntry(wlgIssuedAmountKey, (curStats[ixWlgAmount] + issued10Amount)), IntegerEntry(wlgIssue10TimeKey, curStats[ixWlgIssue10Time]), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userAmount)), IntegerEntry(stakersAmountLeftKey, (curStats[ixWlgAmLeftTotal] - userAmount)), IntegerEntry(userTimeKey, userEffTime)] ++ teamActions) ++ actActions) ++ marketingTransfer), userTotal)
722722 }
723723 }
724724
934934 then if ((size(i.payments) != 0))
935935 then throw("No payments required")
936936 else {
937- let $t01640016469 = claimInternal2(toString(i.caller))
938- let actions = $t01640016469._1
939- let wlgClaimedAmount = $t01640016469._2
937+ let $t01643916508 = claimInternal2(toString(i.caller))
938+ let actions = $t01643916508._1
939+ let wlgClaimedAmount = $t01643916508._2
940940 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
941941 }
942942 else throw("Strict value is not equal to itself.")
952952 else false)
953953 then throw("Permission denied")
954954 else {
955- let $t01678916846 = claimInternal2(addr)
956- if (($t01678916846 == $t01678916846))
955+ let $t01682816885 = claimInternal2(addr)
956+ if (($t01682816885 == $t01682816885))
957957 then {
958- let wlgClaimedAmount = $t01678916846._2
959- let actions = $t01678916846._1
958+ let wlgClaimedAmount = $t01682816885._2
959+ let actions = $t01682816885._1
960960 $Tuple2(if ((wlgClaimedAmount > 0))
961961 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
962962 else actions, wlgClaimedAmount)
974974 else false)
975975 then throw("Permission denied")
976976 else {
977- let $t01720317259 = claimInternal(addr)
978- if (($t01720317259 == $t01720317259))
977+ let $t01726817324 = claimInternal(addr)
978+ if (($t01726817324 == $t01726817324))
979979 then {
980- let wlgClaimedAmount = $t01720317259._2
981- let actions = $t01720317259._1
980+ let wlgClaimedAmount = $t01726817324._2
981+ let actions = $t01726817324._1
982982 $Tuple2(if ((wlgClaimedAmount > 0))
983983 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
984984 else nil, wlgClaimedAmount)
10571057 func takeWlgXp (addr) = if ((i.caller != stakingContract))
10581058 then throw("Permission denied")
10591059 else {
1060- let $t01986119904 = takeXpInternal(addr, 0)
1061- let actions = $t01986119904._1
1062- let xp = $t01986119904._2
1060+ let $t01992619969 = takeXpInternal(addr, 0)
1061+ let actions = $t01992619969._1
1062+ let xp = $t01992619969._2
10631063 $Tuple2(actions, xp)
10641064 }
10651065
10671067
10681068 @Callable(i)
10691069 func checkWlgXpREADONLY (addr) = {
1070- let $t01998120029 = takeXpInternal(addr, 0)
1071- let ignored = $t01998120029._1
1072- let deltaXP = $t01998120029._2
1070+ let $t02004620094 = takeXpInternal(addr, 0)
1071+ let ignored = $t02004620094._1
1072+ let deltaXP = $t02004620094._2
10731073 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
10741074 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
10751075 $Tuple2(nil, (lvlPoints :+ newXP))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT8 = 100000000
99
1010 let MINSHOPPAYMENT = 100000
1111
1212 let DAY_MILLIS = 86400000
1313
1414 let chain = take(drop(this.bytes, 1), 1)
1515
1616 let DAY_BLOCKS = match chain {
1717 case _ =>
1818 if ((base58'2W' == $match0))
1919 then 1440
2020 else if ((base58'2T' == $match0))
2121 then 60
2222 else throw("Unknown chain")
2323 }
2424
2525 let WEEK_BLOCKS = match chain {
2626 case _ =>
2727 if ((base58'2W' == $match0))
2828 then 10080
2929 else if ((base58'2T' == $match0))
3030 then 180
3131 else throw("Unknown chain")
3232 }
3333
3434 let VRF_OFFSET = match chain {
3535 case _ =>
3636 if ((base58'2W' == $match0))
3737 then 0
3838 else if ((base58'2T' == $match0))
3939 then 1146000
4040 else throw("Unknown chain")
4141 }
4242
4343 let usdtAssetId = match chain {
4444 case _ =>
4545 if ((base58'2W' == $match0))
4646 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
4747 else if ((base58'2T' == $match0))
4848 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
4949 else throw("Unknown chain")
5050 }
5151
5252 let defaultRest2AddressStr = match chain {
5353 case _ =>
5454 if ((base58'2W' == $match0))
5555 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
5656 else if ((base58'2T' == $match0))
5757 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
5858 else throw("Unknown chain")
5959 }
6060
6161 let defaultRestAddressStr = match chain {
6262 case _ =>
6363 if ((base58'2W' == $match0))
6464 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
6565 else if ((base58'2T' == $match0))
6666 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
6767 else throw("Unknown chain")
6868 }
6969
7070 let economyContractStr = match chain {
7171 case _ =>
7272 if ((base58'2W' == $match0))
7373 then "3P2sk1KncSxRaZs8b4CWGPw2jkvvav74u4D"
7474 else if ((base58'2T' == $match0))
7575 then "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep"
7676 else throw("Unknown chain")
7777 }
7878
7979 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
8080
8181
8282 let IdxCfgAcres2Dapp = 1
8383
8484 let IdxCfgWlgDapp = 2
8585
8686 let IdxCfgPuzzlePoolDapp = 4
8787
8888 let IdxCfgInvestFundDapp = 5
8989
9090 func keyRestCfg () = "%s__restConfig"
9191
9292
9393 func keyRest2Address () = "%s__rest2Addr"
9494
9595
9696 func keyRestAddress () = "%s__restAddr"
9797
9898
9999 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
100100
101101 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
102102
103103
104104 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
105105
106106
107107 let IdxCfgStakingDapp = 1
108108
109109 let IdxCfgAcresDapp = 8
110110
111111 let restCfg = readRestCfgOrFail(restContract)
112112
113113 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
114114
115115 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
116116
117117 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
118118
119119 let rest2Cfg = readRestCfgOrFail(rest2Contract)
120120
121121 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
122122
123123 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
124124
125125 let puzzlePoolContract = getContractAddressOrFail(rest2Cfg, IdxCfgPuzzlePoolDapp)
126126
127127 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
128128
129129 func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
130130
131131
132132 let wlgAssetIdKey = "wlg_assetId"
133133
134134 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
135135
136136 func keyUserBet (addr) = ("userBet_" + addr)
137137
138138
139139 func keyUserWeekTickets (addr,week) = ((("userWeekTickets_" + addr) + "_") + toString(week))
140140
141141
142142 func keyTotalWeekTickets (week) = ("totalWeekTickets_" + toString(week))
143143
144144
145145 func keyTotalWeekParticipants (week) = ("totalWeekParticipants_" + toString(week))
146146
147147
148148 func keyNumNFT2Draw (week) = ("numNFT2Draw_" + toString(week))
149149
150150
151151 func keyNumNFTDrawn (week) = ("numNFTDrawn_" + toString(week))
152152
153153
154154 func keyWeekWinners (week) = ("weekWinners_" + toString(week))
155155
156156
157157 func winningBet (day) = {
158158 let b = (day * DAY_BLOCKS)
159159 let h = if ((b > VRF_OFFSET))
160160 then b
161161 else (b + VRF_OFFSET)
162162 (toInt(value(value(blockInfoByHeight(h)).vrf)) % 4)
163163 }
164164
165165
166166 let ixWlgAmount = 0
167167
168168 let ixWlgWlg = 1
169169
170170 let ixWlgPrice = 2
171171
172172 let ixWlgIssueTime = 8
173173
174174 let ixWlgTeamAmLeft = 11
175175
176176 let ixWlgTeamAmAvailNow = 12
177177
178178 let ixWlgActAmLeft = 15
179179
180180 let ixWlgActAmAvailNow = 16
181181
182182 let ixWlgAmLeftTotal = 19
183183
184184 let ixWlgUserAmAvailNow = 23
185185
186186 let ixWlgEffUserTime = 24
187187
188188 let ixWlgIssue10Amount = 25
189189
190190 let ixWlgMarketingIssue10Amount = 26
191191
192192 let ixWlgTeamIssue10Amount = 27
193193
194194 let ixWlgUser10part = 28
195195
196196 let ixWlgIssue10Time = 29
197197
198198 func asInt (v) = match v {
199199 case n: Int =>
200200 n
201201 case _ =>
202202 throw("fail to cast into Int")
203203 }
204204
205205
206206 func fixedPoint (val,decimals) = {
207207 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
208208 let lowPart = toString((val % tenPow))
209209 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
210210 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
211211 }
212212
213213
214214 func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
215215 then throw("maxValue should be > 0")
216216 else {
217217 let randomHash = sha256_16Kb((salt + entropy))
218218 (toInt(randomHash) % maxValue)
219219 }
220220
221221
222222 let SCALE8 = 100000000
223223
224224 let xpLevelScale = 3200
225225
226226 let xpLevelRecipPow = 4000
227227
228228 let numPointsOnLevelUp = 3
229229
230230 let wlgBaseAmountXp = 100000000000
231231
232232 func keyUserXP (addr) = ("userXP_" + addr)
233233
234234
235235 func keyUserLevel (addr) = ("userLevel_" + addr)
236236
237237
238238 let xpWlg = 10000
239239
240240 func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
241241
242242
243243 func levelUp (currLevel,newXP) = {
244244 let newLevel = levelByXP(newXP)
245245 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
246246 }
247247
248248
249249 let M6 = 1000000
250250
251251 let M8 = 100000000
252252
253253 let MILLION6 = 100000000000000
254254
255255 let TEAMSHARE = 200000
256256
257257 let ACTIVITYSHARE = 100000
258258
259259 let PLAYERSHARE = 400000
260260
261261 let YEARMILLIS = 31557600000
262262
263263 let DAYMILLIS = 86400000
264264
265265 let BANK_FEE = 50000
266266
267267 let ch = take(drop(this.bytes, 1), 1)
268268
269269 let USDT_TVL_CORRECTION = match ch {
270270 case _ =>
271271 if ((base58'2W' == $match0))
272272 then 1208630000
273273 else if ((base58'2T' == $match0))
274274 then 0
275275 else throw("Unknown chain")
276276 }
277277
278278 let teamAddrKey = "teamAddr"
279279
280280 let lastTeamTimeKey = "lastClaimedTime_team"
281281
282282 let teamAmountLeftKey = "teamAmountLeft"
283283
284284 let lastActivitiesTimeKey = "lastClaimedTime_activities"
285285
286286 let actAmountLeftKey = "activitiesAmountLeft"
287287
288288 let stakersAmountLeftKey = "stakersAmountLeft"
289289
290290 func keyLastClaimedTimeByUserOld (addr) = ("lastClaimedTimeUserOld_" + addr)
291291
292292
293293 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
294294
295295
296296 func keyLastWlgTradeLimitByUser (addr) = ("lastWlgLimitUser_" + addr)
297297
298298
299299 func distributionByPeriod (period) = fraction(MILLION6, (PLAYERSHARE * (period + 1)), (6 * M6))
300300
301301
302302 let wlgIssueTimeKey = "wlg_issueTime"
303303
304304 let wlgIssuedAmountKey = "wlg_issuedAmount"
305305
306306 let zbIssuedAmountKey = "zbill_issuedAmount"
307307
308308 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
309309
310310
311311 let acresStakedTotalKey = "acresStakedAmountTotal"
312312
313313 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
314314
315315
316316 let wlgStakedTotalKey = "wlgStakedAmountTotal"
317317
318318 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
319319
320320
321321 let dappRest = 0
322322
323323 let dappStaking = 1
324324
325325 let dappEconomy = 2
326326
327327 let dappWlg = 3
328328
329329 let dappPuzzle = 4
330330
331331 let dappInvestFund = 5
332332
333333 let dappAcres = 6
334334
335335 func getLands (userAddrStrOrEmpty,stakingContract,acresContract) = {
336336 let props = split(valueOrElse(getString(stakingContract, "resTypesProportions"), "0_0_0_0_0_0"), "_")
337337 func adder (acc,item) = (acc + parseIntValue(item))
338338
339339 let totalPieces = {
340340 let $l = props
341341 let $s = size($l)
342342 let $acc0 = 0
343343 func $f0_1 ($a,$i) = if (($i >= $s))
344344 then $a
345345 else adder($a, $l[$i])
346346
347347 func $f0_2 ($a,$i) = if (($i >= $s))
348348 then $a
349349 else throw("List size exceeds 6")
350350
351351 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
352352 }
353353 let userPieces = valueOrElse(getInteger(stakingContract, ("stakedPiecesByOwner_" + userAddrStrOrEmpty)), 0)
354354 let totalAcres = valueOrElse(getInteger(acresContract, acresStakedTotalKey), 0)
355355 let userAcres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddrStrOrEmpty)), 0)
356356 [totalPieces, userPieces, totalAcres, userAcres]
357357 }
358358
359359
360360 let idxTotalPieces = 0
361361
362362 let idxUserPieces = 1
363363
364364 let idxTotalAcres = 2
365365
366366 let idxUserAcres = 3
367367
368368 let OLD_STAKING_DEADL = 1733346000000
369369
370370 func getWlgStats (userAddrOpt,contracts,usdtId,usdtBalanceCorrection,userProportion6) = {
371371 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssuedAmountKey), "WLGOLD is not issued yet")
372372 let economyUsd = assetBalance(contracts[dappEconomy], usdtId)
373373 let restUsd = assetBalance(contracts[dappRest], usdtId)
374374 let wlgUsd = (assetBalance(contracts[dappWlg], usdtId) - usdtBalanceCorrection)
375375 let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
376376 let investFndContract = contracts[dappInvestFund]
377377 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmountKey), 0))
378378 let totalFundsUsd = ((economyUsd + wlgUsd) + investFundTotal)
379379 let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
380380 let now = lastBlock.timestamp
381381 let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
382382 let bankWlgold = assetBalance(contracts[dappStaking], wlgId)
383383 let teamTotal = fraction(MILLION6, TEAMSHARE, M6)
384384 let teamAmountLeft = valueOrElse(getInteger(contracts[dappWlg], teamAmountLeftKey), teamTotal)
385385 let lastTeamTime = valueOrElse(getInteger(contracts[dappWlg], lastTeamTimeKey), issueTime)
386386 let teamAddr = addressFromStringValue(value(getString(contracts[dappWlg], teamAddrKey)))
387387 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
388388 let teamWlgold = assetBalance(teamAddr, wlgId)
389389 let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
390390 let actAmountLeft = valueOrElse(getInteger(contracts[dappWlg], actAmountLeftKey), actTotal)
391391 let lastActivitiesTime = valueOrElse(getInteger(contracts[dappWlg], lastActivitiesTimeKey), issueTime)
392392 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
393393 let actWlgold = assetBalance(contracts[dappRest], wlgId)
394394 let lastUserTime = valueOrElse(getInteger(contracts[dappWlg], keyLastClaimedTimeByUserOld(userAddrOpt)), issueTime)
395395 let lastUserPeriod = ((lastUserTime - issueTime) / YEARMILLIS)
396396 let nowLimited = min([min([now, (issueTime + (3 * YEARMILLIS))]), OLD_STAKING_DEADL])
397397 let curPeriod = min([((now - issueTime) / YEARMILLIS), 2])
398398 let eff = getLands(userAddrOpt, contracts[dappStaking], contracts[dappAcres])
399399 let curPeriodDistribution = distributionByPeriod(curPeriod)
400400 let $t079143 = if ((lastUserPeriod == curPeriod))
401401 then {
402402 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEARMILLIS)
403403 let userPart = fraction(a0, userProportion6, M6)
404404 let effTime = (lastUserTime + fraction((nowLimited - lastUserTime), userProportion6, M6))
405405 $Tuple3(userPart, a0, effTime)
406406 }
407407 else if ((lastUserPeriod == (curPeriod - 1)))
408408 then {
409409 let a1 = fraction(distributionByPeriod((curPeriod - 1)), ((issueTime + (YEARMILLIS * curPeriod)) - lastUserTime), YEARMILLIS)
410410 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
411411 let avail = (a1 + a0)
412412 let userPart = fraction(avail, userProportion6, M6)
413413 let effTime = if ((a1 >= userPart))
414414 then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 1))))
415415 else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, (userPart - a1), curPeriodDistribution))
416416 $Tuple3(userPart, avail, effTime)
417417 }
418418 else {
419419 let a2 = fraction(distributionByPeriod((curPeriod - 2)), ((issueTime + (YEARMILLIS * (curPeriod - 1))) - lastUserTime), YEARMILLIS)
420420 let a1 = distributionByPeriod((curPeriod - 1))
421421 let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
422422 let avail = ((a2 + a1) + a0)
423423 let userPart = fraction(avail, userProportion6, M6)
424424 let effTime = if ((a2 >= userPart))
425425 then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 2))))
426426 else if (((a2 + a1) >= userPart))
427427 then ((issueTime + (YEARMILLIS * (curPeriod - 1))) + fraction(YEARMILLIS, (userPart - a2), distributionByPeriod((curPeriod - 1))))
428428 else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, ((userPart - a2) - a1), curPeriodDistribution))
429429 $Tuple3(userPart, avail, effTime)
430430 }
431431 let userAmount = $t079143._1
432432 let userAvailable = $t079143._2
433433 let effLastTime = $t079143._3
434434 let sLandDailyAmount = fraction(fraction(curPeriodDistribution, DAYMILLIS, YEARMILLIS), 25, eff[idxTotalPieces])
435435 let amountLeftTotal = valueOrElse(getInteger(contracts[dappWlg], stakersAmountLeftKey), 0)
436436 let userTemp = fraction(userAmount, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
437437 let bankFromUser = fraction(userTemp, BANK_FEE, M6)
438438 let robbedUser = (userTemp - bankFromUser)
439439 let unrobbedUser = fraction(userAvailable, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
440440 [issuedAmount, fraction((totalFundsUsd - USDT_TVL_CORRECTION), M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, robbedUser, sLandDailyAmount, investFundTotal, unrobbedUser, effLastTime, bankWlgold]
441441 }
442442
443443
444444 let M6_ = 1000000
445445
446446 let M8_ = 100000000
447447
448448 let TEAM_SHARE = 200000
449449
450450 let ACTIVITY_SHARE = 100000
451451
452452 let PLAYER_SHARE = 400000
453453
454454 let YEAR_MILLIS = 31557600000
455455
456456 let DAY_MS = 86400000
457457
458458 let ISSUE10 = 1000000000
459459
460460 let PLAYERS10_SHARE = 800000
461461
462462 let MARKETING10_SHARE = 100000
463463
464464 let TEAM10_SHARE = 100000
465465
466466 let NEW_STAKING_START = 1731279600000
467467
468468 let marketingAddrKey = "marketingAddr"
469469
470470 let teamAdrKey = "teamAddr"
471471
472472 let lastTeamTimKey = "lastClaimedTime_team"
473473
474474 let teamAmtLeftKey = "teamAmountLeft"
475475
476476 let lastActivitiesTimKey = "lastClaimedTime_activities"
477477
478478 let actAmtLeftKey = "activitiesAmountLeft"
479479
480480 let stakersAmtLeftKey = "stakersAmountLeft"
481481
482482 func keyLastClaimTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
483483
484484
485485 func distrByPeriod (issuedAmount,period) = fraction(issuedAmount, (PLAYER_SHARE * (period + 1)), (6 * M6_))
486486
487487
488488 let wlgIssue10TimeKey = "wlg_issue10Time"
489489
490490 let wlgIssueTimKey = "wlg_issueTime"
491491
492492 let wlgIssuedAmtKey = "wlg_issuedAmount"
493493
494494 let zbIssuedAmtKey = "zbill_issuedAmount"
495495
496496 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
497497
498498
499499 let acresStakdTotalKey = "acresStakedAmountTotal"
500500
501501 let totalFarmingPowerKey = "totalFarmingPower"
502502
503503 let dapp2Rest = 0
504504
505505 let dapp2Staking = 1
506506
507507 let dapp2Wlg = 2
508508
509509 let dapp2Puzzle = 3
510510
511511 let dapp2InvestFund = 4
512512
513513 let DEFAULT_WEEKLY_PRIZES = 5
514514
515515 let ACRES_FOR_BET = 100000000
516516
517517 let keyNftTotalIssued = "nftTotalIssued"
518518
519519 let keyNftTotalBurned = "nftTotalBurned"
520520
521521 let keyWlNftTotalStaked = "WlNftTotalStaked"
522522
523523 func keyUserWlNftNumber (addr) = ("userWlNftNumber_" + addr)
524524
525525
526526 func keyUserFullBonus (addr) = ("userFullBonus_" + addr)
527527
528528
529529 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
530530
531531 func getLevelByAcres (acres) = {
532532 let acr = ((acres + 99999999) / M8_)
533533 func checker (acc,item) = if ((item >= acr))
534534 then acc
535535 else (acc + 1)
536536
537537 let $l = levelAcres
538538 let $s = size($l)
539539 let $acc0 = 0
540540 func $f0_1 ($a,$i) = if (($i >= $s))
541541 then $a
542542 else checker($a, $l[$i])
543543
544544 func $f0_2 ($a,$i) = if (($i >= $s))
545545 then $a
546546 else throw("List size exceeds 10")
547547
548548 $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)
549549 }
550550
551551
552552 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
553553
554554
555555 func getFarmingPowerByAcresAndBonus (acres,bonus6) = {
556556 let notBonused = getFarmingPowerByAcres(acres)
557557 $Tuple2(fraction(notBonused, (M6_ + bonus6), M6_), notBonused)
558558 }
559559
560560
561561 func getFarmingPowers (userAddrStrOrEmpty,acres2Contract) = {
562562 let totalFP = valueOrElse(getInteger(acres2Contract, totalFarmingPowerKey), 0)
563563 let userAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
564564 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(userAddrStrOrEmpty)), 0)
565565 let $t079143 = getFarmingPowerByAcresAndBonus(userAcres, userBonus)
566566 let userFPbonused = $t079143._1
567567 let userFPnotBonused = $t079143._2
568568 [totalFP, userFPbonused, userFPnotBonused, userBonus]
569569 }
570570
571571
572572 let idxTotalFP = 0
573573
574574 let idxUserFPbonused = 1
575575
576576 func getWlgStats2 (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
577577 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssuedAmtKey), "WLGOLD is not issued yet")
578578 let restUsd = assetBalance(contracts[dapp2Rest], usdtId)
579579 let wlgUsd = (assetBalance(contracts[dapp2Wlg], usdtId) - usdtBalanceCorrection)
580580 let puzzleUsd = assetBalance(contracts[dapp2Puzzle], usdtId)
581581 let acres2Usd = assetBalance(contracts[dapp2Staking], usdtId)
582582 let investFndContract = contracts[dapp2InvestFund]
583583 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmtKey), 0))
584584 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
585585 let wlgId = valueOrErrorMessage(getBinary(contracts[dapp2Wlg], "wlg_assetId"), "Not initialized yet")
586586 let now = lastBlock.timestamp
587587 let issueTime = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssueTimKey), "Not initialized")
588588 let wlgWlg = assetBalance(contracts[dapp2Wlg], wlgId)
589589 let teamTotal = fraction(issuedAmount, TEAM_SHARE, M6_)
590590 let teamAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], teamAmtLeftKey), teamTotal)
591591 let lastTeamTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastTeamTimKey), issueTime)
592592 let teamAddr = addressFromStringValue(value(getString(contracts[dapp2Wlg], teamAdrKey)))
593593 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEAR_MILLIS)), teamAmountLeft])
594594 let teamWlgold = assetBalance(teamAddr, wlgId)
595595 let actTotal = fraction(issuedAmount, ACTIVITY_SHARE, M6_)
596596 let actAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], actAmtLeftKey), actTotal)
597597 let lastActivitiesTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastActivitiesTimKey), issueTime)
598598 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEAR_MILLIS)), actAmountLeft])
599599 let actWlgold = assetBalance(contracts[dapp2Rest], wlgId)
600600 let lastUserTime = valueOrElse(getInteger(contracts[dapp2Wlg], keyLastClaimTimeByUser(userAddrOpt)), issueTime)
601601 let lastUserPeriod = ((lastUserTime - issueTime) / YEAR_MILLIS)
602602 let nowLimited = min([now, (issueTime + (3 * YEAR_MILLIS))])
603603 let curPeriod = min([((now - issueTime) / YEAR_MILLIS), 2])
604604 let eff = getFarmingPowers(userAddrOpt, contracts[dapp2Staking])
605605 let curPeriodDistribution = distrByPeriod(issuedAmount, curPeriod)
606606 let prevPeriodEnd = (issueTime + (YEAR_MILLIS * curPeriod))
607607 let prevPrevPeriodEnd = (issueTime + (YEAR_MILLIS * (curPeriod - 1)))
608608 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
609609 let userAvailable = if ((lastUserPeriod == curPeriod))
610610 then a0
611611 else if ((lastUserPeriod == (curPeriod - 1)))
612612 then {
613613 let a1 = fraction(distrByPeriod(issuedAmount, (curPeriod - 1)), (prevPeriodEnd - lastUserTime), YEAR_MILLIS)
614614 (a1 + a0)
615615 }
616616 else {
617617 let a2 = fraction(distrByPeriod(issuedAmount, (curPeriod - 2)), (prevPrevPeriodEnd - lastUserTime), YEAR_MILLIS)
618618 let a1 = distrByPeriod(issuedAmount, (curPeriod - 1))
619619 ((a2 + a1) + a0)
620620 }
621621 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
622622 let userAmount = if ((eff[idxTotalFP] != 0))
623623 then fraction(userAvailable, eff[idxUserFPbonused], eff[idxTotalFP])
624624 else 0
625625 let lastIssue10Time = valueOrElse(getInteger(contracts[dapp2Wlg], wlgIssue10TimeKey), NEW_STAKING_START)
626626 let issue10Amount = fraction(ISSUE10, max([(now - lastIssue10Time), 0]), DAY_MS)
627627 let marketingIssue10Amount = fraction(issue10Amount, MARKETING10_SHARE, M6_)
628628 let teamIssue10Amount = fraction(issue10Amount, TEAM10_SHARE, M6_)
629629 let user10Interval = max([(now - max([NEW_STAKING_START, lastUserTime])), 0])
630630 let user10part = if ((eff[idxTotalFP] != 0))
631631 then fraction(fraction(fraction(ISSUE10, user10Interval, DAY_MS), eff[idxUserFPbonused], eff[idxTotalFP]), PLAYERS10_SHARE, M6_)
632632 else 0
633633 let newIssue10Time = max([NEW_STAKING_START, now])
634634 let acresStakedTotal = valueOrElse(getInteger(contracts[dapp2Staking], acresStakdTotalKey), 0)
635635 let nftTotalIssued = valueOrElse(getInteger(contracts[dapp2Staking], keyNftTotalIssued), 0)
636636 let nftTotalBurned = valueOrElse(getInteger(contracts[dapp2Staking], keyNftTotalBurned), 0)
637637 let wlNftTotalStaked = valueOrElse(getInteger(contracts[dapp2Staking], keyWlNftTotalStaked), 0)
638638 let wlNftUserStaked = valueOrElse(getInteger(contracts[dapp2Staking], keyUserWlNftNumber(valueOrElse(userAddrOpt, ""))), 0)
639639 [issuedAmount, wlgWlg, fraction(totalFundsUsd, M8_, issuedAmount), totalFundsUsd, restUsd, acres2Usd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, investFundTotal, userAmount, nowLimited, issue10Amount, marketingIssue10Amount, teamIssue10Amount, user10part, newIssue10Time, eff[idxTotalFP], acresStakedTotal, nftTotalIssued, nftTotalBurned, wlNftTotalStaked, wlNftUserStaked]
640640 }
641641
642642
643643 let profitAddrKey = "profitAddr"
644644
645645 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
646646
647647 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
648648
649649
650650 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
651651
652652
653653 func getSwapLimitWlgold (addr) = {
654654 let lastTime = valueOrElse(getInteger(keyLastWlgTradeTimeByUser(addr)), 0)
655655 let defaultLimit = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmountByUser(addr)), 0)
656656 let lastLimitLeft = valueOrElse(getInteger(keyLastWlgTradeLimitByUser(addr)), defaultLimit)
657657 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (lastBlock.timestamp - lastTime), DAY_MILLIS))
658658 min([currentLimit, defaultLimit])
659659 }
660660
661661
662662 let idxWlgTeamAmLeft = 10
663663
664664 let idxWlgTeamAmAvailNow = 11
665665
666666 let idxWlgActAmLeft = 14
667667
668668 let idxWlgActAmAvailNow = 15
669669
670670 let idxWlgAmLeftTotal = 18
671671
672672 let idxWlgUserTotalAvail = 24
673673
674674 let idxWlgEffUserTime = 25
675675
676676 func claimInternal (addr) = {
677677 let caller = addressFromStringValue(addr)
678678 let economyContract = addressFromStringValue(economyContractStr)
679679 let curStats = getWlgStats(addr, [restContract, stakingContract, economyContract, wlgContract, puzzlePoolContract, investFundContract, acresContract], usdtAssetId, 0, MULT6)
680680 let now = lastBlock.timestamp
681681 let teamAmountLeft = curStats[idxWlgTeamAmLeft]
682682 let teamAmount = curStats[idxWlgTeamAmAvailNow]
683683 let actAmountLeft = curStats[idxWlgActAmLeft]
684684 let actAmount = curStats[idxWlgActAmAvailNow]
685685 let userAmount = curStats[idxWlgUserTotalAvail]
686686 let userKey = keyStakersAmountPaidUser(addr)
687687 let userTotal = curStats[idxWlgUserTotalAvail]
688688 let userEffTime = curStats[idxWlgEffUserTime]
689689 $Tuple2([ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId), ScriptTransfer(restContract, actAmount, wlgAssetId), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userTotal)), IntegerEntry(stakersAmountLeftKey, (curStats[idxWlgAmLeftTotal] - userTotal)), IntegerEntry(teamAmountLeftKey, (teamAmountLeft - teamAmount)), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(keyLastClaimedTimeByUserOld(addr), userEffTime)], userAmount)
690690 }
691691
692692
693693 func claimInternal2 (addr) = {
694694 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
695695 let userTimeKey = keyLastClaimTimeByUser(addr)
696696 let lastUserTime = valueOrElse(getInteger(userTimeKey), 0)
697697 let userEffTime = curStats[ixWlgEffUserTime]
698698 if ((lastUserTime == userEffTime))
699699 then $Tuple2(nil, 0)
700700 else {
701701 let now = lastBlock.timestamp
702702 let issueTime = curStats[ixWlgIssueTime]
703703 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
704704 let teamAmount = (curStats[ixWlgTeamAmAvailNow] + curStats[ixWlgTeamIssue10Amount])
705- let teamTransfer = if ((teamAmount > 0))
706- then [ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
705+ let teamActions = if ((teamAmount > 0))
706+ then [IntegerEntry(teamAmountLeftKey, ((teamAmountLeft - teamAmount) + curStats[ixWlgTeamIssue10Amount])), IntegerEntry(lastTeamTimeKey, now), ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
707707 else nil
708708 let actAmountLeft = curStats[ixWlgActAmLeft]
709709 let actAmount = curStats[ixWlgActAmAvailNow]
710- let actTransfer = if ((actAmount > 0))
711- then [ScriptTransfer(restContract, actAmount, wlgAssetId)]
710+ let actActions = if ((actAmount > 0))
711+ then [IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), ScriptTransfer(restContract, actAmount, wlgAssetId)]
712712 else nil
713713 let marketingAmount = curStats[ixWlgMarketingIssue10Amount]
714714 let marketingTransfer = if ((marketingAmount > 0))
715715 then [ScriptTransfer(addressFromStringValue(value(getString(marketingAddrKey))), marketingAmount, wlgAssetId)]
716716 else nil
717717 let userAmount = curStats[ixWlgUserAmAvailNow]
718718 let userKey = keyStakersAmountPaidUser(addr)
719719 let userTotal = (userAmount + curStats[ixWlgUser10part])
720720 let issued10Amount = curStats[ixWlgIssue10Amount]
721- $Tuple2(((([Reissue(wlgAssetId, issued10Amount, true), IntegerEntry(wlgIssuedAmountKey, (curStats[ixWlgAmount] + issued10Amount)), IntegerEntry(wlgIssue10TimeKey, curStats[ixWlgIssue10Time]), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userAmount)), IntegerEntry(stakersAmountLeftKey, (curStats[ixWlgAmLeftTotal] - userAmount)), IntegerEntry(teamAmountLeftKey, ((teamAmountLeft - teamAmount) + curStats[ixWlgTeamIssue10Amount])), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(userTimeKey, userEffTime)] ++ teamTransfer) ++ actTransfer) ++ marketingTransfer), userTotal)
721+ $Tuple2(((([Reissue(wlgAssetId, issued10Amount, true), IntegerEntry(wlgIssuedAmountKey, (curStats[ixWlgAmount] + issued10Amount)), IntegerEntry(wlgIssue10TimeKey, curStats[ixWlgIssue10Time]), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userAmount)), IntegerEntry(stakersAmountLeftKey, (curStats[ixWlgAmLeftTotal] - userAmount)), IntegerEntry(userTimeKey, userEffTime)] ++ teamActions) ++ actActions) ++ marketingTransfer), userTotal)
722722 }
723723 }
724724
725725
726726 func takeXpInternal (addr,delta) = {
727727 let now = lastBlock.timestamp
728728 let timeKey = keyWlgStakedTimeByUser(addr)
729729 let amountKey = keyWlgStakedAmountByUser(addr)
730730 let lastTime = valueOrElse(getInteger(timeKey), 0)
731731 let oldUser = valueOrElse(getInteger(amountKey), 0)
732732 let oldTotal = valueOrElse(getInteger(wlgStakedTotalKey), 0)
733733 let xp = fraction(fraction(xpWlg, oldUser, wlgBaseAmountXp), (lastTime - now), DAYMILLIS)
734734 $Tuple3([IntegerEntry(timeKey, now), IntegerEntry(amountKey, (oldUser + delta)), IntegerEntry(wlgStakedTotalKey, (oldTotal + delta))], xp, oldUser)
735735 }
736736
737737
738738 func openChestInternal (addr) = {
739739 let week = (height / WEEK_BLOCKS)
740740 let drawWeek = (week - 1)
741741 let numPrizes = valueOrElse(getInteger(keyNumNFT2Draw(drawWeek)), DEFAULT_WEEKLY_PRIZES)
742742 let prizesDrawn = valueOrElse(getInteger(keyNumNFTDrawn(drawWeek)), 0)
743743 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
744744 if ((0 >= userTickets))
745745 then $Tuple2(nil, unit)
746746 else {
747747 let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
748748 if ((0 >= weekTickets))
749749 then $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek))], unit)
750750 else {
751751 let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
752752 let salt = fromBase58String(split(valueOrElse(getString(acres2Contract, keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
753753 let random = getRandomNumber(weekTickets, salt, entropy)
754754 if (((userTickets * numPrizes) > random))
755755 then {
756756 let issueResult = invoke(acres2Contract, "issuePickC1", [addr], nil)
757757 let winners = getString(keyWeekWinners(drawWeek))
758758 let newWinners = if (isDefined(winners))
759759 then ((value(winners) + "_") + addr)
760760 else addr
761761 $Tuple2([IntegerEntry(keyNumNFTDrawn(drawWeek), (prizesDrawn + 1)), DeleteEntry(keyUserWeekTickets(addr, drawWeek)), StringEntry(keyWeekWinners(drawWeek), newWinners)], issueResult)
762762 }
763763 else {
764764 let random1 = (getRandomNumber(9, (base58'29' + salt), entropy) + 1)
765765 let consTickets = fraction(userTickets, random1, 10)
766766 let ticketsKey = keyUserWeekTickets(addr, week)
767767 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
768768 $Tuple2(((if ((consTickets == 0))
769769 then nil
770770 else {
771771 let commonActions = [IntegerEntry(keyTotalWeekTickets(week), (valueOrElse(getInteger(keyTotalWeekTickets(week)), 0) + consTickets)), IntegerEntry(ticketsKey, (oldTickets + consTickets))]
772772 if ((oldTickets > 0))
773773 then commonActions
774774 else (commonActions :+ IntegerEntry(keyTotalWeekParticipants(week), (valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0) + 1)))
775775 }) :+ DeleteEntry(keyUserWeekTickets(addr, drawWeek))), consTickets)
776776 }
777777 }
778778 }
779779 }
780780
781781
782782 func claimTicketsInternal (addr,userBetStr) = {
783783 let week = (height / WEEK_BLOCKS)
784784 let ticketsKey = keyUserWeekTickets(addr, week)
785785 let dayBet = split(userBetStr, "_")
786786 let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
787787 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
788788 let deltaTickets = if ((winningBet(parseIntValue(dayBet[0])) == parseIntValue(dayBet[1])))
789789 then 1
790790 else 0
791791 let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
792792 let updateParticipants = if (if ((oldTickets == 0))
793793 then (deltaTickets == 1)
794794 else false)
795795 then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
796796 else nil
797797 $Tuple2(if ((deltaTickets == 0))
798798 then nil
799799 else ((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
800800 }
801801
802802
803803 @Callable(i)
804804 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
805805 then throw("Permission denied")
806806 else if (isDefined(getBinary(wlgAssetIdKey)))
807807 then throw("Already initialized")
808808 else {
809809 let issuedAmount = MILLION6
810810 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
811811 let assetId = calculateAssetId(issue)
812812 [issue, IntegerEntry(wlgIssueTimeKey, lastBlock.timestamp), IntegerEntry(wlgIssuedAmountKey, issuedAmount), IntegerEntry(stakersAmountPaidTotalKey, 0), IntegerEntry(stakersAmountLeftKey, fraction(MILLION6, PLAYERSHARE, MULT6)), BinaryEntry(wlgAssetIdKey, assetId), StringEntry(keyRestAddress(), restAddr), StringEntry(marketingAddrKey, marketingAddr), StringEntry(teamAddrKey, teamAddr), StringEntry(profitAddrKey, profitAddr)]
813813 }
814814
815815
816816
817817 @Callable(i)
818818 func constructorV2 (rest2Addr) = if ((i.caller != this))
819819 then throw("Permission denied")
820820 else [StringEntry(keyRest2Address(), rest2Addr)]
821821
822822
823823
824824 @Callable(i)
825825 func buyWlg (minToReceive) = {
826826 let prologResult = prolog2()
827827 if ((prologResult == prologResult))
828828 then if ((size(i.payments) != 1))
829829 then throw("exactly 1 payment must be attached")
830830 else {
831831 let pmt = i.payments[0]
832832 let usdtAmt = pmt.amount
833833 if (if (!(isDefined(pmt.assetId)))
834834 then true
835835 else (value(pmt.assetId) != usdtAssetId))
836836 then throw("USDT payments only!")
837837 else {
838838 let caller = i.caller
839839 let addr = toString(caller)
840840 if ((MINSHOPPAYMENT > usdtAmt))
841841 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
842842 else {
843843 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
844844 let curWlgAmount = curStats[ixWlgAmount]
845845 let wlgPrice = curStats[ixWlgPrice]
846846 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
847847 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
848848 let maxWlg = getSwapLimitWlgold(addr)
849849 if ((wlgAmount > maxWlg))
850850 then throw((("You can get max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
851851 else if ((minToReceive > wlgAmount))
852852 then throw("Price changed during operation, please try again")
853853 else {
854854 let profitAmount = (usdtAmt / 6)
855855 $Tuple2([Reissue(wlgAssetId, wlgAmount, true), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount + wlgAmount)), IntegerEntry(keyLastWlgTradeTimeByUser(addr), lastBlock.timestamp), IntegerEntry(keyLastWlgTradeLimitByUser(addr), (maxWlg - wlgAmount)), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, wlgAmount, wlgAssetId)], prologResult)
856856 }
857857 }
858858 }
859859 }
860860 else throw("Strict value is not equal to itself.")
861861 }
862862
863863
864864
865865 @Callable(i)
866866 func buyWlgREADONLY (address,usdtAmt) = {
867867 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
868868 let wlgPrice = curStats[ixWlgPrice]
869869 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
870870 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
871871 let maxWlg = getSwapLimitWlgold(address)
872872 let maxUsdt = fraction(maxWlg, buyPrice, MULT8)
873873 let profitAmount = (usdtAmt / 6)
874874 $Tuple2(nil, [wlgAmount, MINSHOPPAYMENT, maxUsdt, profitAmount])
875875 }
876876
877877
878878
879879 @Callable(i)
880880 func sellWlg (minAmount) = {
881881 let prologResult = prolog2()
882882 if ((prologResult == prologResult))
883883 then if ((size(i.payments) != 1))
884884 then throw("exactly 1 payment must be attached")
885885 else {
886886 let pmt = i.payments[0]
887887 let wlgAmt = pmt.amount
888888 let caller = i.caller
889889 let addr = toString(caller)
890890 let maxWlg = getSwapLimitWlgold(addr)
891891 if ((wlgAmt > maxWlg))
892892 then throw((("You can spend max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
893893 else if (if (!(isDefined(pmt.assetId)))
894894 then true
895895 else (value(pmt.assetId) != wlgAssetId))
896896 then throw("WLGOLD payments only!")
897897 else {
898898 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
899899 let curWlgAmount = curStats[ixWlgAmount]
900900 let sellPrice = (curStats[ixWlgPrice] / 2)
901901 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
902902 if ((MINSHOPPAYMENT > usdtAmt))
903903 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
904904 else if ((minAmount > usdtAmt))
905905 then throw("Price changed during operation, please try again")
906906 else {
907907 let profitAmount = (usdtAmt / 5)
908908 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount - wlgAmt)), IntegerEntry(keyLastWlgTradeTimeByUser(addr), lastBlock.timestamp), IntegerEntry(keyLastWlgTradeLimitByUser(addr), (maxWlg - wlgAmt)), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, usdtAmt, usdtAssetId)], prologResult)
909909 }
910910 }
911911 }
912912 else throw("Strict value is not equal to itself.")
913913 }
914914
915915
916916
917917 @Callable(i)
918918 func sellWlgREADONLY (address,wlgAmt) = {
919919 let maxWlg = getSwapLimitWlgold(address)
920920 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
921921 let sellPrice = (curStats[ixWlgPrice] / 2)
922922 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
923923 let minWlg = fraction(MINSHOPPAYMENT, MULT8, sellPrice)
924924 let profitAmount = (usdtAmt / 5)
925925 $Tuple2(nil, [usdtAmt, minWlg, maxWlg, profitAmount])
926926 }
927927
928928
929929
930930 @Callable(i)
931931 func claim () = {
932932 let prologResult = prolog2()
933933 if ((prologResult == prologResult))
934934 then if ((size(i.payments) != 0))
935935 then throw("No payments required")
936936 else {
937- let $t01640016469 = claimInternal2(toString(i.caller))
938- let actions = $t01640016469._1
939- let wlgClaimedAmount = $t01640016469._2
937+ let $t01643916508 = claimInternal2(toString(i.caller))
938+ let actions = $t01643916508._1
939+ let wlgClaimedAmount = $t01643916508._2
940940 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
941941 }
942942 else throw("Strict value is not equal to itself.")
943943 }
944944
945945
946946
947947 @Callable(i)
948948 func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
949949 then (i.caller != acresContract)
950950 else false)
951951 then (i.caller != acres2Contract)
952952 else false)
953953 then throw("Permission denied")
954954 else {
955- let $t01678916846 = claimInternal2(addr)
956- if (($t01678916846 == $t01678916846))
955+ let $t01682816885 = claimInternal2(addr)
956+ if (($t01682816885 == $t01682816885))
957957 then {
958- let wlgClaimedAmount = $t01678916846._2
959- let actions = $t01678916846._1
958+ let wlgClaimedAmount = $t01682816885._2
959+ let actions = $t01682816885._1
960960 $Tuple2(if ((wlgClaimedAmount > 0))
961961 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
962962 else actions, wlgClaimedAmount)
963963 }
964964 else throw("Strict value is not equal to itself.")
965965 }
966966
967967
968968
969969 @Callable(i)
970970 func onStakeUnstakeLandOld (addr) = if (if (if ((i.caller != stakingContract))
971971 then (i.caller != acresContract)
972972 else false)
973973 then (i.caller != acres2Contract)
974974 else false)
975975 then throw("Permission denied")
976976 else {
977- let $t01720317259 = claimInternal(addr)
978- if (($t01720317259 == $t01720317259))
977+ let $t01726817324 = claimInternal(addr)
978+ if (($t01726817324 == $t01726817324))
979979 then {
980- let wlgClaimedAmount = $t01720317259._2
981- let actions = $t01720317259._1
980+ let wlgClaimedAmount = $t01726817324._2
981+ let actions = $t01726817324._1
982982 $Tuple2(if ((wlgClaimedAmount > 0))
983983 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
984984 else nil, wlgClaimedAmount)
985985 }
986986 else throw("Strict value is not equal to itself.")
987987 }
988988
989989
990990
991991 @Callable(i)
992992 func burnWlgold (wlgAmt) = if ((i.caller != acres2Contract))
993993 then throw("Permission denied")
994994 else {
995995 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
996996 if ((wlgAmt > curStats[ixWlgWlg]))
997997 then throw(((("Only " + fixedPoint(curStats[ixWlgWlg], 8)) + " WLGOLD left on contract, can't burn ") + fixedPoint(wlgAmt, 8)))
998998 else {
999999 let wlgAmountLeft = (curStats[ixWlgAmount] - wlgAmt)
10001000 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, wlgAmountLeft)], wlgAmountLeft)
10011001 }
10021002 }
10031003
10041004
10051005
10061006 @Callable(i)
10071007 func betForTicket (bet) = {
10081008 let prologResult = prolog2()
10091009 if ((prologResult == prologResult))
10101010 then if ((size(i.payments) != 0))
10111011 then throw("No payments required")
10121012 else {
10131013 let addr = toString(i.caller)
10141014 let drawWeek = ((height / WEEK_BLOCKS) - 1)
10151015 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
10161016 let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
10171017 if (if ((userTickets > 0))
10181018 then (weekTickets > 0)
10191019 else false)
10201020 then throw("Please open the chest first")
10211021 else if (((bet / 4) != 0))
10221022 then throw("Invalid bet: should be 0..3")
10231023 else {
10241024 let moment = (height % DAY_BLOCKS)
10251025 if ((moment > (DAY_BLOCKS - 3)))
10261026 then throw((("Cannot bet: the day is almost ended, please wait " + toString((DAY_BLOCKS - moment))) + " blocks"))
10271027 else {
10281028 let stakedAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(addr)), 0)
10291029 if ((ACRES_FOR_BET > stakedAcres))
10301030 then throw((("You need to stake at least " + fixedPoint(ACRES_FOR_BET, 8)) + " ACRES to bet"))
10311031 else {
10321032 let tomorrow = ((height / DAY_BLOCKS) + 1)
10331033 let betKey = keyUserBet(addr)
10341034 let oldUserBetStr = getString(betKey)
10351035 let newBetEntry = StringEntry(betKey, ((toString(tomorrow) + "_") + toString(bet)))
10361036 if (isDefined(oldUserBetStr))
10371037 then {
10381038 let userBet = value(oldUserBetStr)
10391039 if ((split(userBet, "_")[0] == toString(tomorrow)))
10401040 then throw("You already bet for tomorrow")
10411041 else {
10421042 let r = claimTicketsInternal(addr, userBet)
10431043 $Tuple2((r._1 :+ newBetEntry), r._2)
10441044 }
10451045 }
10461046 else $Tuple2([newBetEntry], 0)
10471047 }
10481048 }
10491049 }
10501050 }
10511051 else throw("Strict value is not equal to itself.")
10521052 }
10531053
10541054
10551055
10561056 @Callable(i)
10571057 func takeWlgXp (addr) = if ((i.caller != stakingContract))
10581058 then throw("Permission denied")
10591059 else {
1060- let $t01986119904 = takeXpInternal(addr, 0)
1061- let actions = $t01986119904._1
1062- let xp = $t01986119904._2
1060+ let $t01992619969 = takeXpInternal(addr, 0)
1061+ let actions = $t01992619969._1
1062+ let xp = $t01992619969._2
10631063 $Tuple2(actions, xp)
10641064 }
10651065
10661066
10671067
10681068 @Callable(i)
10691069 func checkWlgXpREADONLY (addr) = {
1070- let $t01998120029 = takeXpInternal(addr, 0)
1071- let ignored = $t01998120029._1
1072- let deltaXP = $t01998120029._2
1070+ let $t02004620094 = takeXpInternal(addr, 0)
1071+ let ignored = $t02004620094._1
1072+ let deltaXP = $t02004620094._2
10731073 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
10741074 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
10751075 $Tuple2(nil, (lvlPoints :+ newXP))
10761076 }
10771077
10781078
10791079
10801080 @Callable(i)
10811081 func setNumPrizes (numPrizes) = if ((i.caller != this))
10821082 then throw("Permission denied")
10831083 else {
10841084 let week = (height / WEEK_BLOCKS)
10851085 $Tuple2([IntegerEntry(keyNumNFT2Draw(week), numPrizes)], numPrizes)
10861086 }
10871087
10881088
10891089
10901090 @Callable(i)
10911091 func openChest () = {
10921092 let prologResult = prolog2()
10931093 if ((prologResult == prologResult))
10941094 then if ((size(i.payments) != 0))
10951095 then throw("No payments required")
10961096 else {
10971097 let drawWeek = ((height / WEEK_BLOCKS) - 1)
10981098 let addr = toString(i.caller)
10991099 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
11001100 if ((0 >= userTickets))
11011101 then throw("No gems to open the chest")
11021102 else openChestInternal(addr)
11031103 }
11041104 else throw("Strict value is not equal to itself.")
11051105 }
11061106
11071107
11081108
11091109 @Callable(i)
11101110 func addGemsFor (addr,deltaTickets) = if ((i.caller != this))
11111111 then throw("Permission denied")
11121112 else {
11131113 let week = (height / WEEK_BLOCKS)
11141114 let ticketsKey = keyUserWeekTickets(addr, week)
11151115 let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
11161116 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
11171117 let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
11181118 let updateParticipants = if (if ((oldTickets == 0))
11191119 then (deltaTickets == 1)
11201120 else false)
11211121 then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
11221122 else nil
11231123 $Tuple2(((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
11241124 }
11251125
11261126

github/deemru/w8io/169f3d6 
136.01 ms