tx · GyfXV9FxeaAcrbJEEYs6RTEeWs11oXnFKt7BDruDpqQd

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.02700000 Waves

2024.11.28 03:49 [3390590] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "GyfXV9FxeaAcrbJEEYs6RTEeWs11oXnFKt7BDruDpqQd", "fee": 2700000, "feeAssetId": null, "timestamp": 1732755046525, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "5GqmBveCWZgmUGyqCgAEDQdUefg93NYg3XFsrUDJRn6MG5hMr825w7rS3kEq8qsvSL66JMpHc7mbD6A8vrdnUpEt" ], "script": "base64:BgJNCAISBgoECAgICBIDCgEIEgMKAQESBAoCCAESAwoBARIECgIIARIAEgMKAQgSAwoBARIDCgEBEgMKAQgSAwoBCBIDCgEBEgASBAoCCAGVAQADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAA5NSU5TSE9QUEFZTUVOVACgjQYACkRBWV9NSUxMSVMAgLiZKQAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEACkRBWV9CTE9DS1MEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAoAsDCQAAAgEBVAUHJG1hdGNoMAA8CQACAQINVW5rbm93biBjaGFpbgALV0VFS19CTE9DS1MEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAA4E4DCQAAAgEBVAUHJG1hdGNoMAC0AQkAAgECDVVua25vd24gY2hhaW4AClZSRl9PRkZTRVQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAAAMJAAACAQFUBQckbWF0Y2gwAJD5RQkAAgECDVVua25vd24gY2hhaW4AC3VzZHRBc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQMJAAACAQFUBQckbWF0Y2gwASBVsdifcoeC7+XjW42sBatl3ppDoS8WuwXzGreHpfHFGAkAAgECDVVua25vd24gY2hhaW4AFmRlZmF1bHRSZXN0MkFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQRndZdGE4YmlFejMxenBlRmU1REpLOHdFNXRyU3BRVkY4AwkAAAIBAVQFByRtYXRjaDACIzNON1V1WWFyNjI2NFA1OEZCaFZXS1BRQWg0WXVhMmhnbmd2CQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABBJZHhDZmdBY3JlczJEYXBwAAEADUlkeENmZ1dsZ0RhcHAAAgAUSWR4Q2ZnUHV6emxlUG9vbERhcHAABAAUSWR4Q2ZnSW52ZXN0RnVuZERhcHAABQEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ9rZXlSZXN0MkFkZHJlc3MAAg0lc19fcmVzdDJBZGRyAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCCHJlc3QyQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUIcmVzdDJDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4ABFJZHhDZmdTdGFraW5nRGFwcAABAA9JZHhDZmdBY3Jlc0RhcHAACAAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAANYWNyZXNDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFD0lkeENmZ0FjcmVzRGFwcAANcmVzdDJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEPa2V5UmVzdDJBZGRyZXNzAAUWZGVmYXVsdFJlc3QyQWRkcmVzc1N0cgAIcmVzdDJDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDXJlc3QyQ29udHJhY3QADmFjcmVzMkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFEElkeENmZ0FjcmVzMkRhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFDUlkeENmZ1dsZ0RhcHAAEnB1enpsZVBvb2xDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCHJlc3QyQ2ZnBRRJZHhDZmdQdXp6bGVQb29sRGFwcAASaW52ZXN0RnVuZENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFFElkeENmZ0ludmVzdEZ1bmREYXBwARVrZXlMYXN0V2Vla1R4SWRCeVVzZXIBBGFkZHIJAKwCAgITbGFzdFdlZWtUeElkQnlVc2VyXwUEYWRkcgANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0AQprZXlVc2VyQmV0AQRhZGRyCQCsAgICCHVzZXJCZXRfBQRhZGRyARJrZXlVc2VyV2Vla1RpY2tldHMCBGFkZHIEd2VlawkArAICCQCsAgIJAKwCAgIQdXNlcldlZWtUaWNrZXRzXwUEYWRkcgIBXwkApAMBBQR3ZWVrARNrZXlUb3RhbFdlZWtUaWNrZXRzAQR3ZWVrCQCsAgICEXRvdGFsV2Vla1RpY2tldHNfCQCkAwEFBHdlZWsBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEEd2VlawkArAICAhZ0b3RhbFdlZWtQYXJ0aWNpcGFudHNfCQCkAwEFBHdlZWsBDmtleU51bU5GVDJEcmF3AQR3ZWVrCQCsAgICDG51bU5GVDJEcmF3XwkApAMBBQR3ZWVrAQ5rZXlOdW1ORlREcmF3bgEEd2VlawkArAICAgxudW1ORlREcmF3bl8JAKQDAQUEd2VlawEOa2V5V2Vla1dpbm5lcnMBBHdlZWsJAKwCAgIMd2Vla1dpbm5lcnNfCQCkAwEFBHdlZWsBCndpbm5pbmdCZXQBA2RheQQBYgkAaAIFA2RheQUKREFZX0JMT0NLUwQBaAMJAGYCBQFiBQpWUkZfT0ZGU0VUBQFiCQBkAgUBYgUKVlJGX09GRlNFVAkAagIJALEJAQkBBXZhbHVlAQgJAQV2YWx1ZQEJAO0HAQUBaAN2cmYABAALaXhXbGdBbW91bnQAAAAIaXhXbGdXbGcAAQAKaXhXbGdQcmljZQACAA5peFdsZ0lzc3VlVGltZQAIAA9peFdsZ1RlYW1BbUxlZnQACwATaXhXbGdUZWFtQW1BdmFpbE5vdwAMAA5peFdsZ0FjdEFtTGVmdAAPABJpeFdsZ0FjdEFtQXZhaWxOb3cAEAAQaXhXbGdBbUxlZnRUb3RhbAATABNpeFdsZ1VzZXJBbUF2YWlsTm93ABcAEGl4V2xnRWZmVXNlclRpbWUAGAASaXhXbGdJc3N1ZTEwQW1vdW50ABkAG2l4V2xnTWFya2V0aW5nSXNzdWUxMEFtb3VudAAaABZpeFdsZ1RlYW1Jc3N1ZTEwQW1vdW50ABsAD2l4V2xnVXNlcjEwcGFydAAcABBpeFdsZ0lzc3VlMTBUaW1lAB0BBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQBD2dldFJhbmRvbU51bWJlcgMIbWF4VmFsdWUEc2FsdAdlbnRyb3B5AwkAZwIAAAUIbWF4VmFsdWUJAAIBAhZtYXhWYWx1ZSBzaG91bGQgYmUgPiAwBApyYW5kb21IYXNoCQDUFgEJAMsBAgUEc2FsdAUHZW50cm9weQkAagIJALEJAQUKcmFuZG9tSGFzaAUIbWF4VmFsdWUABlNDQUxFOACAwtcvAAx4cExldmVsU2NhbGUAgBkAD3hwTGV2ZWxSZWNpcFBvdwCgHwASbnVtUG9pbnRzT25MZXZlbFVwAAMAD3dsZ0Jhc2VBbW91bnRYcACA0NvD9AIBCWtleVVzZXJYUAEEYWRkcgkArAICAgd1c2VyWFBfBQRhZGRyAQxrZXlVc2VyTGV2ZWwBBGFkZHIJAKwCAgIKdXNlckxldmVsXwUEYWRkcgAFeHBXbGcAkE4BCWxldmVsQnlYUAECeHAJAGsDBQx4cExldmVsU2NhbGUJAGwGBQJ4cAAEBQ94cExldmVsUmVjaXBQb3cABAAEBQRET1dOBQZTQ0FMRTgBB2xldmVsVXACCWN1cnJMZXZlbAVuZXdYUAQIbmV3TGV2ZWwJAQlsZXZlbEJ5WFABBQVuZXdYUAkAzAgCBQhuZXdMZXZlbAkAzAgCCQBoAgUSbnVtUG9pbnRzT25MZXZlbFVwCQBlAgUIbmV3TGV2ZWwFCWN1cnJMZXZlbAUDbmlsAAhNSUxMSU9ONgCAgOmDsd4WAAtQTEFZRVJTSEFSRQCAtRgACURBWU1JTExJUwCAuJkpAAt0ZWFtQWRkcktleQIIdGVhbUFkZHIAD2xhc3RUZWFtVGltZUtleQIUbGFzdENsYWltZWRUaW1lX3RlYW0AEXRlYW1BbW91bnRMZWZ0S2V5Ag50ZWFtQW1vdW50TGVmdAAVbGFzdEFjdGl2aXRpZXNUaW1lS2V5AhpsYXN0Q2xhaW1lZFRpbWVfYWN0aXZpdGllcwAQYWN0QW1vdW50TGVmdEtleQIUYWN0aXZpdGllc0Ftb3VudExlZnQAFHN0YWtlcnNBbW91bnRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAEZa2V5TGFzdFdsZ1RyYWRlVGltZUJ5VXNlcgEEYWRkcgkArAICAhBsYXN0QXJiVGltZVVzZXJfBQRhZGRyARprZXlMYXN0V2xnVHJhZGVMaW1pdEJ5VXNlcgEEYWRkcgkArAICAhFsYXN0V2xnTGltaXRVc2VyXwUEYWRkcgAPd2xnSXNzdWVUaW1lS2V5Ag13bGdfaXNzdWVUaW1lABJ3bGdJc3N1ZWRBbW91bnRLZXkCEHdsZ19pc3N1ZWRBbW91bnQBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgEYa2V5V2xnU3Rha2VkQW1vdW50QnlVc2VyAQRhZGRyCQCsAgICFndsZ1N0YWtlZEFtb3VudEJ5VXNlcl8FBGFkZHIAEXdsZ1N0YWtlZFRvdGFsS2V5AhR3bGdTdGFrZWRBbW91bnRUb3RhbAEWa2V5V2xnU3Rha2VkVGltZUJ5VXNlcgEEYWRkcgkArAICAhR3bGdTdGFrZWRUaW1lQnlVc2VyXwUEYWRkcgADTTZfAMCEPQADTThfAIDC1y8AClRFQU1fU0hBUkUAwJoMAA5BQ1RJVklUWV9TSEFSRQCgjQYADFBMQVlFUl9TSEFSRQCAtRgAC1lFQVJfTUlMTElTAICG68d1AAZEQVlfTVMAgLiZKQAHSVNTVUUxMACAlOvcAwAPUExBWUVSUzEwX1NIQVJFAIDqMAARTUFSS0VUSU5HMTBfU0hBUkUAoI0GAAxURUFNMTBfU0hBUkUAoI0GABFORVdfU1RBS0lOR19TVEFSVACA87jCsTIAEG1hcmtldGluZ0FkZHJLZXkCDW1hcmtldGluZ0FkZHIACnRlYW1BZHJLZXkCCHRlYW1BZGRyAA5sYXN0VGVhbVRpbUtleQIUbGFzdENsYWltZWRUaW1lX3RlYW0ADnRlYW1BbXRMZWZ0S2V5Ag50ZWFtQW1vdW50TGVmdAAUbGFzdEFjdGl2aXRpZXNUaW1LZXkCGmxhc3RDbGFpbWVkVGltZV9hY3Rpdml0aWVzAA1hY3RBbXRMZWZ0S2V5AhRhY3Rpdml0aWVzQW1vdW50TGVmdAARc3Rha2Vyc0FtdExlZnRLZXkCEXN0YWtlcnNBbW91bnRMZWZ0ARZrZXlMYXN0Q2xhaW1UaW1lQnlVc2VyAQRhZGRyCQCsAgICFGxhc3RDbGFpbWVkVGltZVVzZXJfBQRhZGRyAQ1kaXN0ckJ5UGVyaW9kAgxpc3N1ZWRBbW91bnQGcGVyaW9kCQBrAwUMaXNzdWVkQW1vdW50CQBoAgUMUExBWUVSX1NIQVJFCQBkAgUGcGVyaW9kAAEJAGgCAAYFA002XwARd2xnSXNzdWUxMFRpbWVLZXkCD3dsZ19pc3N1ZTEwVGltZQAOd2xnSXNzdWVUaW1LZXkCDXdsZ19pc3N1ZVRpbWUAD3dsZ0lzc3VlZEFtdEtleQIQd2xnX2lzc3VlZEFtb3VudAAOemJJc3N1ZWRBbXRLZXkCEnpiaWxsX2lzc3VlZEFtb3VudAEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyABJhY3Jlc1N0YWtkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwAFHRvdGFsRmFybWluZ1Bvd2VyS2V5AhF0b3RhbEZhcm1pbmdQb3dlcgAJZGFwcDJSZXN0AAAADGRhcHAyU3Rha2luZwABAAhkYXBwMldsZwACAAtkYXBwMlB1enpsZQADAA9kYXBwMkludmVzdEZ1bmQABAAUSWR4RHR4MVBlcmNHZW1XaW5uZXIAAQAVREVGQVVMVF9XRUVLTFlfUFJJWkVTAAUADUFDUkVTX0ZPUl9CRVQAgMLXLwARa2V5TmZ0VG90YWxJc3N1ZWQCDm5mdFRvdGFsSXNzdWVkABFrZXlOZnRUb3RhbEJ1cm5lZAIObmZ0VG90YWxCdXJuZWQAE2tleVdsTmZ0VG90YWxTdGFrZWQCEFdsTmZ0VG90YWxTdGFrZWQBEmtleVVzZXJXbE5mdE51bWJlcgEEYWRkcgkArAICAhB1c2VyV2xOZnROdW1iZXJfBQRhZGRyARBrZXlVc2VyRnVsbEJvbnVzAQRhZGRyCQCsAgICDnVzZXJGdWxsQm9udXNfBQRhZGRyAApsZXZlbEFjcmVzCQDMCAIAAAkAzAgCAAoJAMwIAgAUCQDMCAIAKAkAzAgCAFAJAMwIAgCWAQkAzAgCAPoBCQDMCAIAkAMJAMwIAgC8BQkAzAgCAOgHBQNuaWwBD2dldExldmVsQnlBY3JlcwEFYWNyZXMEA2FjcgkAaQIJAGQCBQVhY3JlcwD/wdcvBQNNOF8KAQdjaGVja2VyAgNhY2MEaXRlbQMJAGcCBQRpdGVtBQNhY3IFA2FjYwkAZAIFA2FjYwABCgACJGwFCmxldmVsQWNyZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2NoZWNrZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBWFjcmVzCQBoAgkAaAIFBWFjcmVzABQJAGQCCQEPZ2V0TGV2ZWxCeUFjcmVzAQUFYWNyZXMABAEeZ2V0RmFybWluZ1Bvd2VyQnlBY3Jlc0FuZEJvbnVzAgVhY3JlcwZib251czYECm5vdEJvbnVzZWQJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUFYWNyZXMJAJQKAgkAawMFCm5vdEJvbnVzZWQJAGQCBQNNNl8FBmJvbnVzNgUDTTZfBQpub3RCb251c2VkARBnZXRGYXJtaW5nUG93ZXJzAhJ1c2VyQWRkclN0ck9yRW1wdHkOYWNyZXMyQ29udHJhY3QEB3RvdGFsRlAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QFFHRvdGFsRmFybWluZ1Bvd2VyS2V5AAAECXVzZXJBY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5hY3JlczJDb250cmFjdAkBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQUSdXNlckFkZHJTdHJPckVtcHR5AAAECXVzZXJCb251cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5hY3JlczJDb250cmFjdAkBEGtleVVzZXJGdWxsQm9udXMBBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAQIJHQwNzkxNDMJAR5nZXRGYXJtaW5nUG93ZXJCeUFjcmVzQW5kQm9udXMCBQl1c2VyQWNyZXMFCXVzZXJCb251cwQNdXNlckZQYm9udXNlZAgFCCR0MDc5MTQzAl8xBBB1c2VyRlBub3RCb251c2VkCAUIJHQwNzkxNDMCXzIJAMwIAgUHdG90YWxGUAkAzAgCBQ11c2VyRlBib251c2VkCQDMCAIFEHVzZXJGUG5vdEJvbnVzZWQJAMwIAgUJdXNlckJvbnVzBQNuaWwACmlkeFRvdGFsRlAAAAAQaWR4VXNlckZQYm9udXNlZAABAQxnZXRXbGdTdGF0czIEC3VzZXJBZGRyT3B0CWNvbnRyYWN0cwZ1c2R0SWQVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFD3dsZ0lzc3VlZEFtdEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0BAdyZXN0VXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQlkYXBwMlJlc3QFBnVzZHRJZAQGd2xnVXNkCQBlAgkA8AcCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFBnVzZHRJZAUVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAlwdXp6bGVVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFC2RhcHAyUHV6emxlBQZ1c2R0SWQECWFjcmVzMlVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUMZGFwcDJTdGFraW5nBQZ1c2R0SWQEEWludmVzdEZuZENvbnRyYWN0CQCRAwIFCWNvbnRyYWN0cwUPZGFwcDJJbnZlc3RGdW5kBA9pbnZlc3RGdW5kVG90YWwJAGQCCQDwBwIFEWludmVzdEZuZENvbnRyYWN0BQZ1c2R0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgURaW52ZXN0Rm5kQ29udHJhY3QFDnpiSXNzdWVkQW10S2V5AAAEDXRvdGFsRnVuZHNVc2QJAGQCCQBkAgUJYWNyZXMyVXNkBQZ3bGdVc2QFD2ludmVzdEZ1bmRUb3RhbAQFd2xnSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcCC3dsZ19hc3NldElkAhNOb3QgaW5pdGlhbGl6ZWQgeWV0BANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlpc3N1ZVRpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDndsZ0lzc3VlVGltS2V5Ag9Ob3QgaW5pdGlhbGl6ZWQEBndsZ1dsZwkA8AcCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFBXdsZ0lkBAl0ZWFtVG90YWwJAGsDBQxpc3N1ZWRBbW91bnQFClRFQU1fU0hBUkUFA002XwQOdGVhbUFtb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ50ZWFtQW10TGVmdEtleQUJdGVhbVRvdGFsBAxsYXN0VGVhbVRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ5sYXN0VGVhbVRpbUtleQUJaXNzdWVUaW1lBAh0ZWFtQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAnQgCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFCnRlYW1BZHJLZXkEFnRlYW1BbW91bnRBdmFpbGFibGVOb3cJAJcDAQkAzAgCCQBrAwUJdGVhbVRvdGFsCQBlAgUDbm93BQxsYXN0VGVhbVRpbWUJAGgCAAMFC1lFQVJfTUlMTElTCQDMCAIFDnRlYW1BbW91bnRMZWZ0BQNuaWwECnRlYW1XbGdvbGQJAPAHAgUIdGVhbUFkZHIFBXdsZ0lkBAhhY3RUb3RhbAkAawMFDGlzc3VlZEFtb3VudAUOQUNUSVZJVFlfU0hBUkUFA002XwQNYWN0QW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDWFjdEFtdExlZnRLZXkFCGFjdFRvdGFsBBJsYXN0QWN0aXZpdGllc1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBRRsYXN0QWN0aXZpdGllc1RpbUtleQUJaXNzdWVUaW1lBBVhY3RBbW91bnRBdmFpbGFibGVOb3cJAJcDAQkAzAgCCQBrAwUIYWN0VG90YWwJAGUCBQNub3cFEmxhc3RBY3Rpdml0aWVzVGltZQkAaAIAAwULWUVBUl9NSUxMSVMJAMwIAgUNYWN0QW1vdW50TGVmdAUDbmlsBAlhY3RXbGdvbGQJAPAHAgkAkQMCBQljb250cmFjdHMFCWRhcHAyUmVzdAUFd2xnSWQEDGxhc3RVc2VyVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcJARZrZXlMYXN0Q2xhaW1UaW1lQnlVc2VyAQULdXNlckFkZHJPcHQFCWlzc3VlVGltZQQObGFzdFVzZXJQZXJpb2QJAGkCCQBlAgUMbGFzdFVzZXJUaW1lBQlpc3N1ZVRpbWUFC1lFQVJfTUlMTElTBApub3dMaW1pdGVkCQCXAwEJAMwIAgUDbm93CQDMCAIJAGQCBQlpc3N1ZVRpbWUJAGgCAAMFC1lFQVJfTUlMTElTBQNuaWwECWN1clBlcmlvZAkAlwMBCQDMCAIJAGkCCQBlAgUDbm93BQlpc3N1ZVRpbWUFC1lFQVJfTUlMTElTCQDMCAIAAgUDbmlsBANlZmYJARBnZXRGYXJtaW5nUG93ZXJzAgULdXNlckFkZHJPcHQJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcEFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkBDWRpc3RyQnlQZXJpb2QCBQxpc3N1ZWRBbW91bnQFCWN1clBlcmlvZAQNcHJldlBlcmlvZEVuZAkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTBQljdXJQZXJpb2QEEXByZXZQcmV2UGVyaW9kRW5kCQBkAgUJaXNzdWVUaW1lCQBoAgULWUVBUl9NSUxMSVMJAGUCBQljdXJQZXJpb2QAAQQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTBA11c2VyQXZhaWxhYmxlAwkAAAIFDmxhc3RVc2VyUGVyaW9kBQljdXJQZXJpb2QFAmEwAwkAAAIFDmxhc3RVc2VyUGVyaW9kCQBlAgUJY3VyUGVyaW9kAAEEAmExCQBrAwkBDWRpc3RyQnlQZXJpb2QCBQxpc3N1ZWRBbW91bnQJAGUCBQljdXJQZXJpb2QAAQkAZQIFDXByZXZQZXJpb2RFbmQFDGxhc3RVc2VyVGltZQULWUVBUl9NSUxMSVMJAGQCBQJhMQUCYTAEAmEyCQBrAwkBDWRpc3RyQnlQZXJpb2QCBQxpc3N1ZWRBbW91bnQJAGUCBQljdXJQZXJpb2QAAgkAZQIFEXByZXZQcmV2UGVyaW9kRW5kBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTBAJhMQkBDWRpc3RyQnlQZXJpb2QCBQxpc3N1ZWRBbW91bnQJAGUCBQljdXJQZXJpb2QAAQkAZAIJAGQCBQJhMgUCYTEFAmEwBA9hbW91bnRMZWZ0VG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBRFzdGFrZXJzQW10TGVmdEtleQAABAp1c2VyQW1vdW50AwkBAiE9AgkAkQMCBQNlZmYFCmlkeFRvdGFsRlAAAAkAawMFDXVzZXJBdmFpbGFibGUJAJEDAgUDZWZmBRBpZHhVc2VyRlBib251c2VkCQCRAwIFA2VmZgUKaWR4VG90YWxGUAAABA9sYXN0SXNzdWUxMFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBRF3bGdJc3N1ZTEwVGltZUtleQURTkVXX1NUQUtJTkdfU1RBUlQEDWlzc3VlMTBBbW91bnQJAGsDBQdJU1NVRTEwCQCWAwEJAMwIAgkAZQIFA25vdwUPbGFzdElzc3VlMTBUaW1lCQDMCAIAAAUDbmlsBQZEQVlfTVMEFm1hcmtldGluZ0lzc3VlMTBBbW91bnQJAGsDBQ1pc3N1ZTEwQW1vdW50BRFNQVJLRVRJTkcxMF9TSEFSRQUDTTZfBBF0ZWFtSXNzdWUxMEFtb3VudAkAawMFDWlzc3VlMTBBbW91bnQFDFRFQU0xMF9TSEFSRQUDTTZfBA51c2VyMTBJbnRlcnZhbAkAlgMBCQDMCAIJAGUCBQNub3cJAJYDAQkAzAgCBRFORVdfU1RBS0lOR19TVEFSVAkAzAgCBQxsYXN0VXNlclRpbWUFA25pbAkAzAgCAAAFA25pbAQKdXNlcjEwcGFydAMJAQIhPQIJAJEDAgUDZWZmBQppZHhUb3RhbEZQAAAJAGsDCQBrAwkAawMFB0lTU1VFMTAFDnVzZXIxMEludGVydmFsBQZEQVlfTVMJAJEDAgUDZWZmBRBpZHhVc2VyRlBib251c2VkCQCRAwIFA2VmZgUKaWR4VG90YWxGUAUPUExBWUVSUzEwX1NIQVJFBQNNNl8AAAQObmV3SXNzdWUxMFRpbWUJAJYDAQkAzAgCBRFORVdfU1RBS0lOR19TVEFSVAkAzAgCBQNub3cFA25pbAQQYWNyZXNTdGFrZWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUMZGFwcDJTdGFraW5nBRJhY3Jlc1N0YWtkVG90YWxLZXkAAAQObmZ0VG90YWxJc3N1ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwURa2V5TmZ0VG90YWxJc3N1ZWQAAAQObmZ0VG90YWxCdXJuZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwURa2V5TmZ0VG90YWxCdXJuZWQAAAQQd2xOZnRUb3RhbFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUMZGFwcDJTdGFraW5nBRNrZXlXbE5mdFRvdGFsU3Rha2VkAAAED3dsTmZ0VXNlclN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUMZGFwcDJTdGFraW5nCQESa2V5VXNlcldsTmZ0TnVtYmVyAQkBC3ZhbHVlT3JFbHNlAgULdXNlckFkZHJPcHQCAAAACQDMCAIFDGlzc3VlZEFtb3VudAkAzAgCBQZ3bGdXbGcJAMwIAgkAawMFDXRvdGFsRnVuZHNVc2QFA004XwUMaXNzdWVkQW1vdW50CQDMCAIFDXRvdGFsRnVuZHNVc2QJAMwIAgUHcmVzdFVzZAkAzAgCBQlhY3JlczJVc2QJAMwIAgUGd2xnVXNkCQDMCAIFCXB1enpsZVVzZAkAzAgCBQlpc3N1ZVRpbWUJAMwIAgUMbGFzdFRlYW1UaW1lCQDMCAIFCXRlYW1Ub3RhbAkAzAgCBQ50ZWFtQW1vdW50TGVmdAkAzAgCBRZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCnRlYW1XbGdvbGQJAMwIAgUIYWN0VG90YWwJAMwIAgUNYWN0QW1vdW50TGVmdAkAzAgCBRVhY3RBbW91bnRBdmFpbGFibGVOb3cJAMwIAgUJYWN0V2xnb2xkCQDMCAIFCWN1clBlcmlvZAkAzAgCBQ9hbW91bnRMZWZ0VG90YWwJAMwIAgUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQDMCAIFDGxhc3RVc2VyVGltZQkAzAgCBQ9pbnZlc3RGdW5kVG90YWwJAMwIAgUKdXNlckFtb3VudAkAzAgCBQpub3dMaW1pdGVkCQDMCAIFDWlzc3VlMTBBbW91bnQJAMwIAgUWbWFya2V0aW5nSXNzdWUxMEFtb3VudAkAzAgCBRF0ZWFtSXNzdWUxMEFtb3VudAkAzAgCBQp1c2VyMTBwYXJ0CQDMCAIFDm5ld0lzc3VlMTBUaW1lCQDMCAIJAJEDAgUDZWZmBQppZHhUb3RhbEZQCQDMCAIFEGFjcmVzU3Rha2VkVG90YWwJAMwIAgUObmZ0VG90YWxJc3N1ZWQJAMwIAgUObmZ0VG90YWxCdXJuZWQJAMwIAgUQd2xOZnRUb3RhbFN0YWtlZAkAzAgCBQ93bE5mdFVzZXJTdGFrZWQFA25pbAANcHJvZml0QWRkcktleQIKcHJvZml0QWRkcgAZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQIWc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbAEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQRhZGRyCQCsAgICFnN0YWtlcnNBbW91bnRQYWlkVXNlcl8FBGFkZHIBB3Byb2xvZzIACQEFYXNJbnQBCQD9BwQFDmFjcmVzMkNvbnRyYWN0AgpzYXZlTGFzdFR4BQNuaWwFA25pbAESZ2V0U3dhcExpbWl0V2xnb2xkAQRhZGRyBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEZa2V5TGFzdFdsZ1RyYWRlVGltZUJ5VXNlcgEFBGFkZHIAAAQMZGVmYXVsdExpbWl0CQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBQRhZGRyAAAEDWxhc3RMaW1pdExlZnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGmtleUxhc3RXbGdUcmFkZUxpbWl0QnlVc2VyAQUEYWRkcgUMZGVmYXVsdExpbWl0BAxjdXJyZW50TGltaXQJAGQCBQ1sYXN0TGltaXRMZWZ0CQBrAwUMZGVmYXVsdExpbWl0CQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFCGxhc3RUaW1lBQpEQVlfTUlMTElTCQCXAwEJAMwIAgUMY3VycmVudExpbWl0CQDMCAIFDGRlZmF1bHRMaW1pdAUDbmlsAQ5jbGFpbUludGVybmFsMgEEYWRkcgQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEBQRhZGRyCQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAt1c2VyVGltZUtleQkBFmtleUxhc3RDbGFpbVRpbWVCeVVzZXIBBQRhZGRyBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQULdXNlclRpbWVLZXkAAAQLdXNlckVmZlRpbWUJAJEDAgUIY3VyU3RhdHMFEGl4V2xnRWZmVXNlclRpbWUDCQAAAgUMbGFzdFVzZXJUaW1lBQt1c2VyRWZmVGltZQkAlAoCBQNuaWwAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQCRAwIFCGN1clN0YXRzBQ5peFdsZ0lzc3VlVGltZQQOdGVhbUFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFD2l4V2xnVGVhbUFtTGVmdAQKdGVhbUFtb3VudAkAZAIJAJEDAgUIY3VyU3RhdHMFE2l4V2xnVGVhbUFtQXZhaWxOb3cJAJEDAgUIY3VyU3RhdHMFFml4V2xnVGVhbUlzc3VlMTBBbW91bnQEDHRlYW1UcmFuc2ZlcgMJAGYCBQp0ZWFtQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQt0ZWFtQWRkcktleQUKdGVhbUFtb3VudAUKd2xnQXNzZXRJZAUDbmlsBQNuaWwEDWFjdEFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFDml4V2xnQWN0QW1MZWZ0BAlhY3RBbW91bnQJAJEDAgUIY3VyU3RhdHMFEml4V2xnQWN0QW1BdmFpbE5vdwQLYWN0VHJhbnNmZXIDCQBmAgUJYWN0QW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQlhY3RBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBA9tYXJrZXRpbmdBbW91bnQJAJEDAgUIY3VyU3RhdHMFG2l4V2xnTWFya2V0aW5nSXNzdWUxMEFtb3VudAQRbWFya2V0aW5nVHJhbnNmZXIDCQBmAgUPbWFya2V0aW5nQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBRBtYXJrZXRpbmdBZGRyS2V5BQ9tYXJrZXRpbmdBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBAp1c2VyQW1vdW50CQCRAwIFCGN1clN0YXRzBRNpeFdsZ1VzZXJBbUF2YWlsTm93BAd1c2VyS2V5CQEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQUEYWRkcgQJdXNlclRvdGFsCQBkAgUKdXNlckFtb3VudAkAkQMCBQhjdXJTdGF0cwUPaXhXbGdVc2VyMTBwYXJ0BA5pc3N1ZWQxMEFtb3VudAkAkQMCBQhjdXJTdGF0cwUSaXhXbGdJc3N1ZTEwQW1vdW50CQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQp3bGdBc3NldElkBQ5pc3N1ZWQxMEFtb3VudAYJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZAIJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BQ5pc3N1ZWQxMEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURd2xnSXNzdWUxMFRpbWVLZXkJAJEDAgUIY3VyU3RhdHMFEGl4V2xnSXNzdWUxMFRpbWUJAMwIAgkBDEludGVnZXJFbnRyeQIFB3VzZXJLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFB3VzZXJLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQAABQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAZQIJAJEDAgUIY3VyU3RhdHMFEGl4V2xnQW1MZWZ0VG90YWwFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEXRlYW1BbW91bnRMZWZ0S2V5CQBkAgkAZQIFDnRlYW1BbW91bnRMZWZ0BQp0ZWFtQW1vdW50CQCRAwIFCGN1clN0YXRzBRZpeFdsZ1RlYW1Jc3N1ZTEwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9sYXN0VGVhbVRpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQYWN0QW1vdW50TGVmdEtleQkAZQIFDWFjdEFtb3VudExlZnQFCWFjdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFC3VzZXJUaW1lS2V5BQt1c2VyRWZmVGltZQUDbmlsBQx0ZWFtVHJhbnNmZXIFC2FjdFRyYW5zZmVyBRFtYXJrZXRpbmdUcmFuc2ZlcgUJdXNlclRvdGFsAQ50YWtlWHBJbnRlcm5hbAIEYWRkcgVkZWx0YQQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQHdGltZUtleQkBFmtleVdsZ1N0YWtlZFRpbWVCeVVzZXIBBQRhZGRyBAlhbW91bnRLZXkJARhrZXlXbGdTdGFrZWRBbW91bnRCeVVzZXIBBQRhZGRyBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd0aW1lS2V5AAAEB29sZFVzZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJYW1vdW50S2V5AAAECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEXdsZ1N0YWtlZFRvdGFsS2V5AAAEAnhwCQBrAwkAawMFBXhwV2xnBQdvbGRVc2VyBQ93bGdCYXNlQW1vdW50WHAJAGUCBQhsYXN0VGltZQUDbm93BQlEQVlNSUxMSVMJAJUKAwkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlhbW91bnRLZXkJAGQCBQdvbGRVc2VyBQVkZWx0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgURd2xnU3Rha2VkVG90YWxLZXkJAGQCBQhvbGRUb3RhbAUFZGVsdGEFA25pbAUCeHAFB29sZFVzZXIBEW9wZW5DaGVzdEludGVybmFsAQRhZGRyBAR3ZWVrCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwQIZHJhd1dlZWsJAGUCBQR3ZWVrAAEECW51bVByaXplcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEOa2V5TnVtTkZUMkRyYXcBBQhkcmF3V2VlawUVREVGQVVMVF9XRUVLTFlfUFJJWkVTBAtwcml6ZXNEcmF3bgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEOa2V5TnVtTkZURHJhd24BBQhkcmF3V2VlawAABAt1c2VyVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsAAAMJAGcCAAAFC3VzZXJUaWNrZXRzCQCUCgIFA25pbAUEdW5pdAQLd2Vla1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQhkcmF3V2VlawAAAwkAZwIAAAULd2Vla1RpY2tldHMJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsFA25pbAUEdW5pdAQHZW50cm9weQkBBXZhbHVlAQgJAQV2YWx1ZQEJAO0HAQkAaAIFBHdlZWsFC1dFRUtfQkxPQ0tTA3ZyZgQEc2FsdAkA2QQBCQCRAwIJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ5hY3JlczJDb250cmFjdAkBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEFBGFkZHICCjQyX0RFRkFVTFQCAV8AAQQGcmFuZG9tCQEPZ2V0UmFuZG9tTnVtYmVyAwULd2Vla1RpY2tldHMFBHNhbHQFB2VudHJvcHkDCQBmAgkAaAIFC3VzZXJUaWNrZXRzBQludW1Qcml6ZXMFBnJhbmRvbQQLaXNzdWVSZXN1bHQJAPwHBAUOYWNyZXMyQ29udHJhY3QCCGlzc3VlTkZUCQDMCAIFBGFkZHIJAMwIAgUUSWR4RHR4MVBlcmNHZW1XaW5uZXIFA25pbAUDbmlsBAd3aW5uZXJzCQCiCAEJAQ5rZXlXZWVrV2lubmVycwEFCGRyYXdXZWVrBApuZXdXaW5uZXJzAwkBCWlzRGVmaW5lZAEFB3dpbm5lcnMJAKwCAgkArAICCQEFdmFsdWUBBQd3aW5uZXJzAgFfBQRhZGRyBQRhZGRyCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlOdW1ORlREcmF3bgEFCGRyYXdXZWVrCQBkAgULcHJpemVzRHJhd24AAQkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVdlZWtXaW5uZXJzAQUIZHJhd1dlZWsFCm5ld1dpbm5lcnMFA25pbAULaXNzdWVSZXN1bHQEB3JhbmRvbTEJAGQCCQEPZ2V0UmFuZG9tTnVtYmVyAwAJCQDLAQIBAUIFBHNhbHQFB2VudHJvcHkAAQQLY29uc1RpY2tldHMJAGsDBQt1c2VyVGlja2V0cwUHcmFuZG9tMQAKCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFCGRyYXdXZWVrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUEd2VlawULY29uc1RpY2tldHMFA25pbAULY29uc1RpY2tldHMBFGNsYWltVGlja2V0c0ludGVybmFsAgRhZGRyCnVzZXJCZXRTdHIEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTBAp0aWNrZXRzS2V5CQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUEd2VlawQGZGF5QmV0CQC1CQIFCnVzZXJCZXRTdHICAV8ED29sZFRvdGFsVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5VG90YWxXZWVrVGlja2V0cwEFBHdlZWsAAAQKb2xkVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQp0aWNrZXRzS2V5AAAEDGRlbHRhVGlja2V0cwMJAAACCQEKd2lubmluZ0JldAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZkYXlCZXQAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBmRheUJldAABAAEAAAQPb2xkUGFydGljaXBhbnRzCQELdmFsdWVPckVsc2UCCQCfCAEJARhrZXlUb3RhbFdlZWtQYXJ0aWNpcGFudHMBBQR3ZWVrAAAEEnVwZGF0ZVBhcnRpY2lwYW50cwMDCQAAAgUKb2xkVGlja2V0cwAACQAAAgUMZGVsdGFUaWNrZXRzAAEHCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5VG90YWxXZWVrUGFydGljaXBhbnRzAQUEd2VlawkAZAIFD29sZFBhcnRpY2lwYW50cwABBQNuaWwFA25pbAkAlAoCAwkAAAIFDGRlbHRhVGlja2V0cwAABQNuaWwJAM0IAgkAzQgCBRJ1cGRhdGVQYXJ0aWNpcGFudHMJAQxJbnRlZ2VyRW50cnkCBQp0aWNrZXRzS2V5CQBkAgUKb2xkVGlja2V0cwUMZGVsdGFUaWNrZXRzCQEMSW50ZWdlckVudHJ5AgkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrCQBkAgUPb2xkVG90YWxUaWNrZXRzBQxkZWx0YVRpY2tldHMFDGRlbHRhVGlja2V0cw8BaQENY29uc3RydWN0b3JWMQQIcmVzdEFkZHINbWFya2V0aW5nQWRkcgh0ZWFtQWRkcgpwcm9maXRBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQDCQEJaXNEZWZpbmVkAQkAoQgBBQ13bGdBc3NldElkS2V5CQACAQITQWxyZWFkeSBpbml0aWFsaXplZAQMaXNzdWVkQW1vdW50BQhNSUxMSU9ONgQFaXNzdWUJAMMIBwIGV0xHT0xEAiBXYXZlc0xhbmRzIEdvbGQgaW52ZXN0bWVudCB0b2tlbgUMaXNzdWVkQW1vdW50AAgGBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUFaXNzdWUJAMwIAgUFaXNzdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFD3dsZ0lzc3VlVGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQUMaXNzdWVkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFFHN0YWtlcnNBbW91bnRMZWZ0S2V5CQBrAwUITUlMTElPTjYFC1BMQVlFUlNIQVJFBQVNVUxUNgkAzAgCCQELQmluYXJ5RW50cnkCBQ13bGdBc3NldElkS2V5BQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFEG1hcmtldGluZ0FkZHJLZXkFDW1hcmtldGluZ0FkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULdGVhbUFkZHJLZXkFCHRlYW1BZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDXByb2ZpdEFkZHJLZXkFCnByb2ZpdEFkZHIFA25pbAFpAQ1jb25zdHJ1Y3RvclYyAQlyZXN0MkFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5UmVzdDJBZGRyZXNzAAUJcmVzdDJBZGRyBQNuaWwBaQEGYnV5V2xnAQxtaW5Ub1JlY2VpdmUEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEB3VzZHRBbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAZjYWxsZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQZjYWxsZXIDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQFB3VzZHRBbXQEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwULaXhXbGdBbW91bnQECHdsZ1ByaWNlCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlBAhidXlQcmljZQkAbgQFCHdsZ1ByaWNlAAYABQUHQ0VJTElORwQJd2xnQW1vdW50CQBrAwUHdXNkdEFtdAUFTVVMVDgFCGJ1eVByaWNlBAZtYXhXbGcJARJnZXRTd2FwTGltaXRXbGdvbGQBBQRhZGRyAwkAZgIFCXdsZ0Ftb3VudAUGbWF4V2xnCQACAQkArAICCQCsAgICEFlvdSBjYW4gZ2V0IG1heCAJAQpmaXhlZFBvaW50AgUGbWF4V2xnAAgCFSBXTEdPTEQgYXQgdGhlIG1vbWVudAMJAGYCBQxtaW5Ub1JlY2VpdmUFCXdsZ0Ftb3VudAkAAgECMFByaWNlIGNoYW5nZWQgZHVyaW5nIG9wZXJhdGlvbiwgcGxlYXNlIHRyeSBhZ2FpbgQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAGCQCUCgIJAMwIAgkBB1JlaXNzdWUDBQp3bGdBc3NldElkBQl3bGdBbW91bnQGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGQCBQxjdXJXbGdBbW91bnQFCXdsZ0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleUxhc3RXbGdUcmFkZUxpbWl0QnlVc2VyAQUEYWRkcgkAZQIFBm1heFdsZwUJd2xnQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUNcHJvZml0QWRkcktleQUMcHJvZml0QW1vdW50BQt1c2R0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXdsZ0Ftb3VudAUKd2xnQXNzZXRJZAUDbmlsBQxwcm9sb2dSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOYnV5V2xnUkVBRE9OTFkCB2FkZHJlc3MHdXNkdEFtdAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkBQd1c2R0QW10BAh3bGdQcmljZQkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQQIYnV5UHJpY2UJAG4EBQh3bGdQcmljZQAGAAUFB0NFSUxJTkcECXdsZ0Ftb3VudAkAawMFB3VzZHRBbXQFBU1VTFQ4BQhidXlQcmljZQQGbWF4V2xnCQESZ2V0U3dhcExpbWl0V2xnb2xkAQUHYWRkcmVzcwQHbWF4VXNkdAkAawMFBm1heFdsZwUIYnV5UHJpY2UFBU1VTFQ4BAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAYJAJQKAgUDbmlsCQDMCAIFCXdsZ0Ftb3VudAkAzAgCBQ5NSU5TSE9QUEFZTUVOVAkAzAgCBQdtYXhVc2R0CQDMCAIFDHByb2ZpdEFtb3VudAUDbmlsAWkBB3NlbGxXbGcBCW1pbkFtb3VudAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQGd2xnQW10CAUDcG10BmFtb3VudAQGY2FsbGVyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUGY2FsbGVyBAZtYXhXbGcJARJnZXRTd2FwTGltaXRXbGdvbGQBBQRhZGRyAwkAZgIFBndsZ0FtdAUGbWF4V2xnCQACAQkArAICCQCsAgICEllvdSBjYW4gc3BlbmQgbWF4IAkBCmZpeGVkUG9pbnQCBQZtYXhXbGcACAIVIFdMR09MRCBhdCB0aGUgbW9tZW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUKd2xnQXNzZXRJZAkAAgECFVdMR09MRCBwYXltZW50cyBvbmx5IQQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAAEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwULaXhXbGdBbW91bnQECXNlbGxQcmljZQkAaQIJAJEDAgUIY3VyU3RhdHMFCml4V2xnUHJpY2UAAgQHdXNkdEFtdAkAawMFBndsZ0FtdAUJc2VsbFByaWNlBQVNVUxUOAMJAGYCBQ5NSU5TSE9QUEFZTUVOVAUHdXNkdEFtdAkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHRyYWRlIG1pbiAJAQpmaXhlZFBvaW50AgUOTUlOU0hPUFBBWU1FTlQABgIFIFVTRFQDCQBmAgUJbWluQW1vdW50BQd1c2R0QW10CQACAQIwUHJpY2UgY2hhbmdlZCBkdXJpbmcgb3BlcmF0aW9uLCBwbGVhc2UgdHJ5IGFnYWluBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAUJAJQKAgkAzAgCCQEEQnVybgIFCndsZ0Fzc2V0SWQFBndsZ0FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5CQBlAgUMY3VyV2xnQW1vdW50BQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIJARlrZXlMYXN0V2xnVHJhZGVUaW1lQnlVc2VyAQUEYWRkcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJARprZXlMYXN0V2xnVHJhZGVMaW1pdEJ5VXNlcgEFBGFkZHIJAGUCBQZtYXhXbGcFBndsZ0FtdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFDXByb2ZpdEFkZHJLZXkFDHByb2ZpdEFtb3VudAULdXNkdEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQd1c2R0QW10BQt1c2R0QXNzZXRJZAUDbmlsBQxwcm9sb2dSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPc2VsbFdsZ1JFQURPTkxZAgdhZGRyZXNzBndsZ0FtdAQGbWF4V2xnCQESZ2V0U3dhcExpbWl0V2xnb2xkAQUHYWRkcmVzcwQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAAECXNlbGxQcmljZQkAaQIJAJEDAgUIY3VyU3RhdHMFCml4V2xnUHJpY2UAAgQHdXNkdEFtdAkAawMFBndsZ0FtdAUJc2VsbFByaWNlBQVNVUxUOAQGbWluV2xnCQBrAwUOTUlOU0hPUFBBWU1FTlQFBU1VTFQ4BQlzZWxsUHJpY2UEDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABQkAlAoCBQNuaWwJAMwIAgUHdXNkdEFtdAkAzAgCBQZtaW5XbGcJAMwIAgUGbWF4V2xnCQDMCAIFDHByb2ZpdEFtb3VudAUDbmlsAWkBBWNsYWltAAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQNJHQwMTM3NTYxMzgyNQkBDmNsYWltSW50ZXJuYWwyAQkApQgBCAUBaQZjYWxsZXIEB2FjdGlvbnMIBQ0kdDAxMzc1NjEzODI1Al8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTM3NTYxMzgyNQJfMgkAlAoCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUQd2xnQ2xhaW1lZEFtb3VudAUKd2xnQXNzZXRJZAUMcHJvbG9nUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEm9uU3Rha2VVbnN0YWtlTGFuZAEEYWRkcgMDAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAQIhPQIIBQFpBmNhbGxlcgUNYWNyZXNDb250cmFjdAcJAQIhPQIIBQFpBmNhbGxlcgUOYWNyZXMyQ29udHJhY3QHCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDE0MTQ0MTQxOTgJAQ5jbGFpbUludGVybmFsMgEFBGFkZHIEB2FjdGlvbnMIBQ0kdDAxNDE0NDE0MTk4Al8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTQxNDQxNDE5OAJfMgkAlAoCAwkAZgIFEHdsZ0NsYWltZWRBbW91bnQAAAkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyBRB3bGdDbGFpbWVkQW1vdW50BQp3bGdBc3NldElkBQdhY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCmJ1cm5XbGdvbGQBBndsZ0FtdAMJAQIhPQIIBQFpBmNhbGxlcgUOYWNyZXMyQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAADCQBmAgUGd2xnQW10CQCRAwIFCGN1clN0YXRzBQhpeFdsZ1dsZwkAAgEJAKwCAgkArAICCQCsAgICBU9ubHkgCQEKZml4ZWRQb2ludAIJAJEDAgUIY3VyU3RhdHMFCGl4V2xnV2xnAAgCJSBXTEdPTEQgbGVmdCBvbiBjb250cmFjdCwgY2FuJ3QgYnVybiAJAQpmaXhlZFBvaW50AgUGd2xnQW10AAgEDXdsZ0Ftb3VudExlZnQJAGUCCQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAUGd2xnQW10CQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQUNd2xnQW1vdW50TGVmdAUDbmlsBQ13bGdBbW91bnRMZWZ0AWkBDGJldEZvclRpY2tldAEDYmV0BAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQIZHJhd1dlZWsJAGUCCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwABBAt1c2VyVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsAAAQLd2Vla1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQhkcmF3V2VlawAAAwMJAGYCBQt1c2VyVGlja2V0cwAACQBmAgULd2Vla1RpY2tldHMAAAcJAAIBAhtQbGVhc2Ugb3BlbiB0aGUgY2hlc3QgZmlyc3QDCQECIT0CCQBpAgUDYmV0AAQAAAkAAgECG0ludmFsaWQgYmV0OiBzaG91bGQgYmUgMC4uMwQGbW9tZW50CQBqAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTAwkAZgIFBm1vbWVudAkAZQIFCkRBWV9CTE9DS1MAAwkAAgEJAKwCAgkArAICAjFDYW5ub3QgYmV0OiB0aGUgZGF5IGlzIGFsbW9zdCBlbmRlZCwgcGxlYXNlIHdhaXQgCQCkAwEJAGUCBQpEQVlfQkxPQ0tTBQZtb21lbnQCByBibG9ja3MEC3N0YWtlZEFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQRhZGRyAAADCQBmAgUNQUNSRVNfRk9SX0JFVAULc3Rha2VkQWNyZXMJAAIBCQCsAgIJAKwCAgIbWW91IG5lZWQgdG8gc3Rha2UgYXQgbGVhc3QgCQEKZml4ZWRQb2ludAIFDUFDUkVTX0ZPUl9CRVQACAINIEFDUkVTIHRvIGJldAQIdG9tb3Jyb3cJAGQCCQBpAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTAAEEBmJldEtleQkBCmtleVVzZXJCZXQBBQRhZGRyBA1vbGRVc2VyQmV0U3RyCQCiCAEFBmJldEtleQQLbmV3QmV0RW50cnkJAQtTdHJpbmdFbnRyeQIFBmJldEtleQkArAICCQCsAgIJAKQDAQUIdG9tb3Jyb3cCAV8JAKQDAQUDYmV0AwkBCWlzRGVmaW5lZAEFDW9sZFVzZXJCZXRTdHIEB3VzZXJCZXQJAQV2YWx1ZQEFDW9sZFVzZXJCZXRTdHIDCQAAAgkAkQMCCQC1CQIFB3VzZXJCZXQCAV8AAAkApAMBBQh0b21vcnJvdwkAAgECHFlvdSBhbHJlYWR5IGJldCBmb3IgdG9tb3Jyb3cEAXIJARRjbGFpbVRpY2tldHNJbnRlcm5hbAIFBGFkZHIFB3VzZXJCZXQJAJQKAgkAzQgCCAUBcgJfMQULbmV3QmV0RW50cnkIBQFyAl8yCQCUCgIJAMwIAgULbmV3QmV0RW50cnkFA25pbAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXRha2VXbGdYcAEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDE2ODA4MTY4NTEJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHYWN0aW9ucwgFDSR0MDE2ODA4MTY4NTECXzEEAnhwCAUNJHQwMTY4MDgxNjg1MQJfMgkAlAoCBQdhY3Rpb25zBQJ4cAFpARJjaGVja1dsZ1hwUkVBRE9OTFkBBGFkZHIEDSR0MDE2OTI4MTY5NzYJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHaWdub3JlZAgFDSR0MDE2OTI4MTY5NzYCXzEEB2RlbHRhWFAIBQ0kdDAxNjkyODE2OTc2Al8yBAVuZXdYUAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEJa2V5VXNlclhQAQUEYWRkcgAABQdkZWx0YVhQBAlsdmxQb2ludHMJAQdsZXZlbFVwAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlVc2VyTGV2ZWwBBQRhZGRyAAAFBW5ld1hQCQCUCgIFA25pbAkAzQgCBQlsdmxQb2ludHMFBW5ld1hQAWkBDHNldE51bVByaXplcwEJbnVtUHJpemVzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlOdW1ORlQyRHJhdwEFBHdlZWsFCW51bVByaXplcwUDbmlsBQludW1Qcml6ZXMBaQEJb3BlbkNoZXN0AAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQIZHJhd1dlZWsJAGUCCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwABBARhZGRyCQClCAEIBQFpBmNhbGxlcgQLdXNlclRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFCGRyYXdXZWVrAAADCQBnAgAABQt1c2VyVGlja2V0cwkAAgECGU5vIGdlbXMgdG8gb3BlbiB0aGUgY2hlc3QJARFvcGVuQ2hlc3RJbnRlcm5hbAEFBGFkZHIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKYWRkR2Vtc0ZvcgIEYWRkcgxkZWx0YVRpY2tldHMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQEd2VlawkAaQIFBmhlaWdodAULV0VFS19CTE9DS1MECnRpY2tldHNLZXkJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQR3ZWVrBA9vbGRUb3RhbFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrAAAECm9sZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKdGlja2V0c0tleQAABA9vbGRQYXJ0aWNpcGFudHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsAAAQSdXBkYXRlUGFydGljaXBhbnRzAwMJAAACBQpvbGRUaWNrZXRzAAAJAAACBQxkZWx0YVRpY2tldHMAAQcJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlUb3RhbFdlZWtQYXJ0aWNpcGFudHMBBQR3ZWVrCQBkAgUPb2xkUGFydGljaXBhbnRzAAEFA25pbAUDbmlsCQCUCgIJAM0IAgkAzQgCBRJ1cGRhdGVQYXJ0aWNpcGFudHMJAQxJbnRlZ2VyRW50cnkCBQp0aWNrZXRzS2V5CQBkAgUKb2xkVGlja2V0cwUMZGVsdGFUaWNrZXRzCQEMSW50ZWdlckVudHJ5AgkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrCQBkAgUPb2xkVG90YWxUaWNrZXRzBQxkZWx0YVRpY2tldHMFDGRlbHRhVGlja2V0cwCjhCfv", "height": 3390590, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FX8Qp3uNwbKYfwhC7DJLfiwrELQX9pkQMsFq3XPmDwks Next: B6tY7jQBcjiCQhjKLqgPBb4xFLdeFqtx8WyjCQ3xo2U Diff:
OldNewDifferences
6464 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
6565 else if ((base58'2T' == $match0))
6666 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
67- else throw("Unknown chain")
68-}
69-
70-let KS_ALLOW_NFT_DRAW = match chain {
71- case _ =>
72- if ((base58'2W' == $match0))
73- then false
74- else if ((base58'2T' == $match0))
75- then true
7667 else throw("Unknown chain")
7768 }
7869
564555 then $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek))], unit)
565556 else {
566557 let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
567- let salt = fromBase58String(split(valueOrElse(getString(keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
558+ let salt = fromBase58String(split(valueOrElse(getString(acres2Contract, keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
568559 let random = getRandomNumber(weekTickets, salt, entropy)
569560 if (((userTickets * numPrizes) > random))
570561 then {
740731 then if ((size(i.payments) != 0))
741732 then throw("No payments required")
742733 else {
743- let $t01404514114 = claimInternal2(toString(i.caller))
744- let actions = $t01404514114._1
745- let wlgClaimedAmount = $t01404514114._2
734+ let $t01375613825 = claimInternal2(toString(i.caller))
735+ let actions = $t01375613825._1
736+ let wlgClaimedAmount = $t01375613825._2
746737 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
747738 }
748739 else throw("Strict value is not equal to itself.")
758749 else false)
759750 then throw("Permission denied")
760751 else {
761- let $t01443314487 = claimInternal2(addr)
762- let actions = $t01443314487._1
763- let wlgClaimedAmount = $t01443314487._2
752+ let $t01414414198 = claimInternal2(addr)
753+ let actions = $t01414414198._1
754+ let wlgClaimedAmount = $t01414414198._2
764755 $Tuple2(if ((wlgClaimedAmount > 0))
765756 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
766757 else actions, wlgClaimedAmount)
837828 func takeWlgXp (addr) = if ((i.caller != stakingContract))
838829 then throw("Permission denied")
839830 else {
840- let $t01709717140 = takeXpInternal(addr, 0)
841- let actions = $t01709717140._1
842- let xp = $t01709717140._2
831+ let $t01680816851 = takeXpInternal(addr, 0)
832+ let actions = $t01680816851._1
833+ let xp = $t01680816851._2
843834 $Tuple2(actions, xp)
844835 }
845836
847838
848839 @Callable(i)
849840 func checkWlgXpREADONLY (addr) = {
850- let $t01721717265 = takeXpInternal(addr, 0)
851- let ignored = $t01721717265._1
852- let deltaXP = $t01721717265._2
841+ let $t01692816976 = takeXpInternal(addr, 0)
842+ let ignored = $t01692816976._1
843+ let deltaXP = $t01692816976._2
853844 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
854845 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
855846 $Tuple2(nil, (lvlPoints :+ newXP))
868859
869860
870861 @Callable(i)
871-func openChest () = if (!(KS_ALLOW_NFT_DRAW))
872- then throw("Temporarily disabled")
873- else {
874- let prologResult = prolog2()
875- if ((prologResult == prologResult))
876- then if ((size(i.payments) != 0))
877- then throw("No payments required")
878- else {
879- let drawWeek = ((height / WEEK_BLOCKS) - 1)
880- let addr = toString(i.caller)
881- let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
882- if ((0 >= userTickets))
883- then throw("No gems to open the chest")
884- else openChestInternal(addr)
885- }
886- else throw("Strict value is not equal to itself.")
887- }
862+func openChest () = {
863+ let prologResult = prolog2()
864+ if ((prologResult == prologResult))
865+ then if ((size(i.payments) != 0))
866+ then throw("No payments required")
867+ else {
868+ let drawWeek = ((height / WEEK_BLOCKS) - 1)
869+ let addr = toString(i.caller)
870+ let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
871+ if ((0 >= userTickets))
872+ then throw("No gems to open the chest")
873+ else openChestInternal(addr)
874+ }
875+ else throw("Strict value is not equal to itself.")
876+ }
888877
889878
890879
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"
67- else throw("Unknown chain")
68-}
69-
70-let KS_ALLOW_NFT_DRAW = match chain {
71- case _ =>
72- if ((base58'2W' == $match0))
73- then false
74- else if ((base58'2T' == $match0))
75- then true
7667 else throw("Unknown chain")
7768 }
7869
7970 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
8071
8172
8273 let IdxCfgAcres2Dapp = 1
8374
8475 let IdxCfgWlgDapp = 2
8576
8677 let IdxCfgPuzzlePoolDapp = 4
8778
8879 let IdxCfgInvestFundDapp = 5
8980
9081 func keyRestCfg () = "%s__restConfig"
9182
9283
9384 func keyRest2Address () = "%s__rest2Addr"
9485
9586
9687 func keyRestAddress () = "%s__restAddr"
9788
9889
9990 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
10091
10192 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
10293
10394
10495 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
10596
10697
10798 let IdxCfgStakingDapp = 1
10899
109100 let IdxCfgAcresDapp = 8
110101
111102 let restCfg = readRestCfgOrFail(restContract)
112103
113104 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
114105
115106 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
116107
117108 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
118109
119110 let rest2Cfg = readRestCfgOrFail(rest2Contract)
120111
121112 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
122113
123114 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
124115
125116 let puzzlePoolContract = getContractAddressOrFail(rest2Cfg, IdxCfgPuzzlePoolDapp)
126117
127118 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
128119
129120 func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
130121
131122
132123 let wlgAssetIdKey = "wlg_assetId"
133124
134125 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
135126
136127 func keyUserBet (addr) = ("userBet_" + addr)
137128
138129
139130 func keyUserWeekTickets (addr,week) = ((("userWeekTickets_" + addr) + "_") + toString(week))
140131
141132
142133 func keyTotalWeekTickets (week) = ("totalWeekTickets_" + toString(week))
143134
144135
145136 func keyTotalWeekParticipants (week) = ("totalWeekParticipants_" + toString(week))
146137
147138
148139 func keyNumNFT2Draw (week) = ("numNFT2Draw_" + toString(week))
149140
150141
151142 func keyNumNFTDrawn (week) = ("numNFTDrawn_" + toString(week))
152143
153144
154145 func keyWeekWinners (week) = ("weekWinners_" + toString(week))
155146
156147
157148 func winningBet (day) = {
158149 let b = (day * DAY_BLOCKS)
159150 let h = if ((b > VRF_OFFSET))
160151 then b
161152 else (b + VRF_OFFSET)
162153 (toInt(value(value(blockInfoByHeight(h)).vrf)) % 4)
163154 }
164155
165156
166157 let ixWlgAmount = 0
167158
168159 let ixWlgWlg = 1
169160
170161 let ixWlgPrice = 2
171162
172163 let ixWlgIssueTime = 8
173164
174165 let ixWlgTeamAmLeft = 11
175166
176167 let ixWlgTeamAmAvailNow = 12
177168
178169 let ixWlgActAmLeft = 15
179170
180171 let ixWlgActAmAvailNow = 16
181172
182173 let ixWlgAmLeftTotal = 19
183174
184175 let ixWlgUserAmAvailNow = 23
185176
186177 let ixWlgEffUserTime = 24
187178
188179 let ixWlgIssue10Amount = 25
189180
190181 let ixWlgMarketingIssue10Amount = 26
191182
192183 let ixWlgTeamIssue10Amount = 27
193184
194185 let ixWlgUser10part = 28
195186
196187 let ixWlgIssue10Time = 29
197188
198189 func asInt (v) = match v {
199190 case n: Int =>
200191 n
201192 case _ =>
202193 throw("fail to cast into Int")
203194 }
204195
205196
206197 func fixedPoint (val,decimals) = {
207198 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
208199 let lowPart = toString((val % tenPow))
209200 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
210201 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
211202 }
212203
213204
214205 func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
215206 then throw("maxValue should be > 0")
216207 else {
217208 let randomHash = sha256_16Kb((salt + entropy))
218209 (toInt(randomHash) % maxValue)
219210 }
220211
221212
222213 let SCALE8 = 100000000
223214
224215 let xpLevelScale = 3200
225216
226217 let xpLevelRecipPow = 4000
227218
228219 let numPointsOnLevelUp = 3
229220
230221 let wlgBaseAmountXp = 100000000000
231222
232223 func keyUserXP (addr) = ("userXP_" + addr)
233224
234225
235226 func keyUserLevel (addr) = ("userLevel_" + addr)
236227
237228
238229 let xpWlg = 10000
239230
240231 func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
241232
242233
243234 func levelUp (currLevel,newXP) = {
244235 let newLevel = levelByXP(newXP)
245236 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
246237 }
247238
248239
249240 let MILLION6 = 100000000000000
250241
251242 let PLAYERSHARE = 400000
252243
253244 let DAYMILLIS = 86400000
254245
255246 let teamAddrKey = "teamAddr"
256247
257248 let lastTeamTimeKey = "lastClaimedTime_team"
258249
259250 let teamAmountLeftKey = "teamAmountLeft"
260251
261252 let lastActivitiesTimeKey = "lastClaimedTime_activities"
262253
263254 let actAmountLeftKey = "activitiesAmountLeft"
264255
265256 let stakersAmountLeftKey = "stakersAmountLeft"
266257
267258 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
268259
269260
270261 func keyLastWlgTradeLimitByUser (addr) = ("lastWlgLimitUser_" + addr)
271262
272263
273264 let wlgIssueTimeKey = "wlg_issueTime"
274265
275266 let wlgIssuedAmountKey = "wlg_issuedAmount"
276267
277268 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
278269
279270
280271 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
281272
282273
283274 let wlgStakedTotalKey = "wlgStakedAmountTotal"
284275
285276 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
286277
287278
288279 let M6_ = 1000000
289280
290281 let M8_ = 100000000
291282
292283 let TEAM_SHARE = 200000
293284
294285 let ACTIVITY_SHARE = 100000
295286
296287 let PLAYER_SHARE = 400000
297288
298289 let YEAR_MILLIS = 31557600000
299290
300291 let DAY_MS = 86400000
301292
302293 let ISSUE10 = 1000000000
303294
304295 let PLAYERS10_SHARE = 800000
305296
306297 let MARKETING10_SHARE = 100000
307298
308299 let TEAM10_SHARE = 100000
309300
310301 let NEW_STAKING_START = 1731279600000
311302
312303 let marketingAddrKey = "marketingAddr"
313304
314305 let teamAdrKey = "teamAddr"
315306
316307 let lastTeamTimKey = "lastClaimedTime_team"
317308
318309 let teamAmtLeftKey = "teamAmountLeft"
319310
320311 let lastActivitiesTimKey = "lastClaimedTime_activities"
321312
322313 let actAmtLeftKey = "activitiesAmountLeft"
323314
324315 let stakersAmtLeftKey = "stakersAmountLeft"
325316
326317 func keyLastClaimTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
327318
328319
329320 func distrByPeriod (issuedAmount,period) = fraction(issuedAmount, (PLAYER_SHARE * (period + 1)), (6 * M6_))
330321
331322
332323 let wlgIssue10TimeKey = "wlg_issue10Time"
333324
334325 let wlgIssueTimKey = "wlg_issueTime"
335326
336327 let wlgIssuedAmtKey = "wlg_issuedAmount"
337328
338329 let zbIssuedAmtKey = "zbill_issuedAmount"
339330
340331 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
341332
342333
343334 let acresStakdTotalKey = "acresStakedAmountTotal"
344335
345336 let totalFarmingPowerKey = "totalFarmingPower"
346337
347338 let dapp2Rest = 0
348339
349340 let dapp2Staking = 1
350341
351342 let dapp2Wlg = 2
352343
353344 let dapp2Puzzle = 3
354345
355346 let dapp2InvestFund = 4
356347
357348 let IdxDtx1PercGemWinner = 1
358349
359350 let DEFAULT_WEEKLY_PRIZES = 5
360351
361352 let ACRES_FOR_BET = 100000000
362353
363354 let keyNftTotalIssued = "nftTotalIssued"
364355
365356 let keyNftTotalBurned = "nftTotalBurned"
366357
367358 let keyWlNftTotalStaked = "WlNftTotalStaked"
368359
369360 func keyUserWlNftNumber (addr) = ("userWlNftNumber_" + addr)
370361
371362
372363 func keyUserFullBonus (addr) = ("userFullBonus_" + addr)
373364
374365
375366 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
376367
377368 func getLevelByAcres (acres) = {
378369 let acr = ((acres + 99999999) / M8_)
379370 func checker (acc,item) = if ((item >= acr))
380371 then acc
381372 else (acc + 1)
382373
383374 let $l = levelAcres
384375 let $s = size($l)
385376 let $acc0 = 0
386377 func $f0_1 ($a,$i) = if (($i >= $s))
387378 then $a
388379 else checker($a, $l[$i])
389380
390381 func $f0_2 ($a,$i) = if (($i >= $s))
391382 then $a
392383 else throw("List size exceeds 10")
393384
394385 $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)
395386 }
396387
397388
398389 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
399390
400391
401392 func getFarmingPowerByAcresAndBonus (acres,bonus6) = {
402393 let notBonused = getFarmingPowerByAcres(acres)
403394 $Tuple2(fraction(notBonused, (M6_ + bonus6), M6_), notBonused)
404395 }
405396
406397
407398 func getFarmingPowers (userAddrStrOrEmpty,acres2Contract) = {
408399 let totalFP = valueOrElse(getInteger(acres2Contract, totalFarmingPowerKey), 0)
409400 let userAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
410401 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(userAddrStrOrEmpty)), 0)
411402 let $t079143 = getFarmingPowerByAcresAndBonus(userAcres, userBonus)
412403 let userFPbonused = $t079143._1
413404 let userFPnotBonused = $t079143._2
414405 [totalFP, userFPbonused, userFPnotBonused, userBonus]
415406 }
416407
417408
418409 let idxTotalFP = 0
419410
420411 let idxUserFPbonused = 1
421412
422413 func getWlgStats2 (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
423414 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssuedAmtKey), "WLGOLD is not issued yet")
424415 let restUsd = assetBalance(contracts[dapp2Rest], usdtId)
425416 let wlgUsd = (assetBalance(contracts[dapp2Wlg], usdtId) - usdtBalanceCorrection)
426417 let puzzleUsd = assetBalance(contracts[dapp2Puzzle], usdtId)
427418 let acres2Usd = assetBalance(contracts[dapp2Staking], usdtId)
428419 let investFndContract = contracts[dapp2InvestFund]
429420 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmtKey), 0))
430421 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
431422 let wlgId = valueOrErrorMessage(getBinary(contracts[dapp2Wlg], "wlg_assetId"), "Not initialized yet")
432423 let now = lastBlock.timestamp
433424 let issueTime = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssueTimKey), "Not initialized")
434425 let wlgWlg = assetBalance(contracts[dapp2Wlg], wlgId)
435426 let teamTotal = fraction(issuedAmount, TEAM_SHARE, M6_)
436427 let teamAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], teamAmtLeftKey), teamTotal)
437428 let lastTeamTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastTeamTimKey), issueTime)
438429 let teamAddr = addressFromStringValue(value(getString(contracts[dapp2Wlg], teamAdrKey)))
439430 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEAR_MILLIS)), teamAmountLeft])
440431 let teamWlgold = assetBalance(teamAddr, wlgId)
441432 let actTotal = fraction(issuedAmount, ACTIVITY_SHARE, M6_)
442433 let actAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], actAmtLeftKey), actTotal)
443434 let lastActivitiesTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastActivitiesTimKey), issueTime)
444435 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEAR_MILLIS)), actAmountLeft])
445436 let actWlgold = assetBalance(contracts[dapp2Rest], wlgId)
446437 let lastUserTime = valueOrElse(getInteger(contracts[dapp2Wlg], keyLastClaimTimeByUser(userAddrOpt)), issueTime)
447438 let lastUserPeriod = ((lastUserTime - issueTime) / YEAR_MILLIS)
448439 let nowLimited = min([now, (issueTime + (3 * YEAR_MILLIS))])
449440 let curPeriod = min([((now - issueTime) / YEAR_MILLIS), 2])
450441 let eff = getFarmingPowers(userAddrOpt, contracts[dapp2Staking])
451442 let curPeriodDistribution = distrByPeriod(issuedAmount, curPeriod)
452443 let prevPeriodEnd = (issueTime + (YEAR_MILLIS * curPeriod))
453444 let prevPrevPeriodEnd = (issueTime + (YEAR_MILLIS * (curPeriod - 1)))
454445 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
455446 let userAvailable = if ((lastUserPeriod == curPeriod))
456447 then a0
457448 else if ((lastUserPeriod == (curPeriod - 1)))
458449 then {
459450 let a1 = fraction(distrByPeriod(issuedAmount, (curPeriod - 1)), (prevPeriodEnd - lastUserTime), YEAR_MILLIS)
460451 (a1 + a0)
461452 }
462453 else {
463454 let a2 = fraction(distrByPeriod(issuedAmount, (curPeriod - 2)), (prevPrevPeriodEnd - lastUserTime), YEAR_MILLIS)
464455 let a1 = distrByPeriod(issuedAmount, (curPeriod - 1))
465456 ((a2 + a1) + a0)
466457 }
467458 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
468459 let userAmount = if ((eff[idxTotalFP] != 0))
469460 then fraction(userAvailable, eff[idxUserFPbonused], eff[idxTotalFP])
470461 else 0
471462 let lastIssue10Time = valueOrElse(getInteger(contracts[dapp2Wlg], wlgIssue10TimeKey), NEW_STAKING_START)
472463 let issue10Amount = fraction(ISSUE10, max([(now - lastIssue10Time), 0]), DAY_MS)
473464 let marketingIssue10Amount = fraction(issue10Amount, MARKETING10_SHARE, M6_)
474465 let teamIssue10Amount = fraction(issue10Amount, TEAM10_SHARE, M6_)
475466 let user10Interval = max([(now - max([NEW_STAKING_START, lastUserTime])), 0])
476467 let user10part = if ((eff[idxTotalFP] != 0))
477468 then fraction(fraction(fraction(ISSUE10, user10Interval, DAY_MS), eff[idxUserFPbonused], eff[idxTotalFP]), PLAYERS10_SHARE, M6_)
478469 else 0
479470 let newIssue10Time = max([NEW_STAKING_START, now])
480471 let acresStakedTotal = valueOrElse(getInteger(contracts[dapp2Staking], acresStakdTotalKey), 0)
481472 let nftTotalIssued = valueOrElse(getInteger(contracts[dapp2Staking], keyNftTotalIssued), 0)
482473 let nftTotalBurned = valueOrElse(getInteger(contracts[dapp2Staking], keyNftTotalBurned), 0)
483474 let wlNftTotalStaked = valueOrElse(getInteger(contracts[dapp2Staking], keyWlNftTotalStaked), 0)
484475 let wlNftUserStaked = valueOrElse(getInteger(contracts[dapp2Staking], keyUserWlNftNumber(valueOrElse(userAddrOpt, ""))), 0)
485476 [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]
486477 }
487478
488479
489480 let profitAddrKey = "profitAddr"
490481
491482 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
492483
493484 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
494485
495486
496487 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
497488
498489
499490 func getSwapLimitWlgold (addr) = {
500491 let lastTime = valueOrElse(getInteger(keyLastWlgTradeTimeByUser(addr)), 0)
501492 let defaultLimit = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmountByUser(addr)), 0)
502493 let lastLimitLeft = valueOrElse(getInteger(keyLastWlgTradeLimitByUser(addr)), defaultLimit)
503494 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (lastBlock.timestamp - lastTime), DAY_MILLIS))
504495 min([currentLimit, defaultLimit])
505496 }
506497
507498
508499 func claimInternal2 (addr) = {
509500 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
510501 let userTimeKey = keyLastClaimTimeByUser(addr)
511502 let lastUserTime = valueOrElse(getInteger(userTimeKey), 0)
512503 let userEffTime = curStats[ixWlgEffUserTime]
513504 if ((lastUserTime == userEffTime))
514505 then $Tuple2(nil, 0)
515506 else {
516507 let now = lastBlock.timestamp
517508 let issueTime = curStats[ixWlgIssueTime]
518509 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
519510 let teamAmount = (curStats[ixWlgTeamAmAvailNow] + curStats[ixWlgTeamIssue10Amount])
520511 let teamTransfer = if ((teamAmount > 0))
521512 then [ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
522513 else nil
523514 let actAmountLeft = curStats[ixWlgActAmLeft]
524515 let actAmount = curStats[ixWlgActAmAvailNow]
525516 let actTransfer = if ((actAmount > 0))
526517 then [ScriptTransfer(restContract, actAmount, wlgAssetId)]
527518 else nil
528519 let marketingAmount = curStats[ixWlgMarketingIssue10Amount]
529520 let marketingTransfer = if ((marketingAmount > 0))
530521 then [ScriptTransfer(addressFromStringValue(value(getString(marketingAddrKey))), marketingAmount, wlgAssetId)]
531522 else nil
532523 let userAmount = curStats[ixWlgUserAmAvailNow]
533524 let userKey = keyStakersAmountPaidUser(addr)
534525 let userTotal = (userAmount + curStats[ixWlgUser10part])
535526 let issued10Amount = curStats[ixWlgIssue10Amount]
536527 $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)
537528 }
538529 }
539530
540531
541532 func takeXpInternal (addr,delta) = {
542533 let now = lastBlock.timestamp
543534 let timeKey = keyWlgStakedTimeByUser(addr)
544535 let amountKey = keyWlgStakedAmountByUser(addr)
545536 let lastTime = valueOrElse(getInteger(timeKey), 0)
546537 let oldUser = valueOrElse(getInteger(amountKey), 0)
547538 let oldTotal = valueOrElse(getInteger(wlgStakedTotalKey), 0)
548539 let xp = fraction(fraction(xpWlg, oldUser, wlgBaseAmountXp), (lastTime - now), DAYMILLIS)
549540 $Tuple3([IntegerEntry(timeKey, now), IntegerEntry(amountKey, (oldUser + delta)), IntegerEntry(wlgStakedTotalKey, (oldTotal + delta))], xp, oldUser)
550541 }
551542
552543
553544 func openChestInternal (addr) = {
554545 let week = (height / WEEK_BLOCKS)
555546 let drawWeek = (week - 1)
556547 let numPrizes = valueOrElse(getInteger(keyNumNFT2Draw(drawWeek)), DEFAULT_WEEKLY_PRIZES)
557548 let prizesDrawn = valueOrElse(getInteger(keyNumNFTDrawn(drawWeek)), 0)
558549 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
559550 if ((0 >= userTickets))
560551 then $Tuple2(nil, unit)
561552 else {
562553 let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
563554 if ((0 >= weekTickets))
564555 then $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek))], unit)
565556 else {
566557 let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
567- let salt = fromBase58String(split(valueOrElse(getString(keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
558+ let salt = fromBase58String(split(valueOrElse(getString(acres2Contract, keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
568559 let random = getRandomNumber(weekTickets, salt, entropy)
569560 if (((userTickets * numPrizes) > random))
570561 then {
571562 let issueResult = invoke(acres2Contract, "issueNFT", [addr, IdxDtx1PercGemWinner], nil)
572563 let winners = getString(keyWeekWinners(drawWeek))
573564 let newWinners = if (isDefined(winners))
574565 then ((value(winners) + "_") + addr)
575566 else addr
576567 $Tuple2([IntegerEntry(keyNumNFTDrawn(drawWeek), (prizesDrawn + 1)), DeleteEntry(keyUserWeekTickets(addr, drawWeek)), StringEntry(keyWeekWinners(drawWeek), newWinners)], issueResult)
577568 }
578569 else {
579570 let random1 = (getRandomNumber(9, (base58'29' + salt), entropy) + 1)
580571 let consTickets = fraction(userTickets, random1, 10)
581572 $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek)), IntegerEntry(keyUserWeekTickets(addr, week), consTickets)], consTickets)
582573 }
583574 }
584575 }
585576 }
586577
587578
588579 func claimTicketsInternal (addr,userBetStr) = {
589580 let week = (height / WEEK_BLOCKS)
590581 let ticketsKey = keyUserWeekTickets(addr, week)
591582 let dayBet = split(userBetStr, "_")
592583 let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
593584 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
594585 let deltaTickets = if ((winningBet(parseIntValue(dayBet[0])) == parseIntValue(dayBet[1])))
595586 then 1
596587 else 0
597588 let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
598589 let updateParticipants = if (if ((oldTickets == 0))
599590 then (deltaTickets == 1)
600591 else false)
601592 then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
602593 else nil
603594 $Tuple2(if ((deltaTickets == 0))
604595 then nil
605596 else ((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
606597 }
607598
608599
609600 @Callable(i)
610601 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
611602 then throw("Permission denied")
612603 else if (isDefined(getBinary(wlgAssetIdKey)))
613604 then throw("Already initialized")
614605 else {
615606 let issuedAmount = MILLION6
616607 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
617608 let assetId = calculateAssetId(issue)
618609 [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)]
619610 }
620611
621612
622613
623614 @Callable(i)
624615 func constructorV2 (rest2Addr) = if ((i.caller != this))
625616 then throw("Permission denied")
626617 else [StringEntry(keyRest2Address(), rest2Addr)]
627618
628619
629620
630621 @Callable(i)
631622 func buyWlg (minToReceive) = {
632623 let prologResult = prolog2()
633624 if ((prologResult == prologResult))
634625 then if ((size(i.payments) != 1))
635626 then throw("exactly 1 payment must be attached")
636627 else {
637628 let pmt = i.payments[0]
638629 let usdtAmt = pmt.amount
639630 if (if (!(isDefined(pmt.assetId)))
640631 then true
641632 else (value(pmt.assetId) != usdtAssetId))
642633 then throw("USDT payments only!")
643634 else {
644635 let caller = i.caller
645636 let addr = toString(caller)
646637 if ((MINSHOPPAYMENT > usdtAmt))
647638 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
648639 else {
649640 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
650641 let curWlgAmount = curStats[ixWlgAmount]
651642 let wlgPrice = curStats[ixWlgPrice]
652643 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
653644 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
654645 let maxWlg = getSwapLimitWlgold(addr)
655646 if ((wlgAmount > maxWlg))
656647 then throw((("You can get max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
657648 else if ((minToReceive > wlgAmount))
658649 then throw("Price changed during operation, please try again")
659650 else {
660651 let profitAmount = (usdtAmt / 6)
661652 $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)
662653 }
663654 }
664655 }
665656 }
666657 else throw("Strict value is not equal to itself.")
667658 }
668659
669660
670661
671662 @Callable(i)
672663 func buyWlgREADONLY (address,usdtAmt) = {
673664 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
674665 let wlgPrice = curStats[ixWlgPrice]
675666 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
676667 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
677668 let maxWlg = getSwapLimitWlgold(address)
678669 let maxUsdt = fraction(maxWlg, buyPrice, MULT8)
679670 let profitAmount = (usdtAmt / 6)
680671 $Tuple2(nil, [wlgAmount, MINSHOPPAYMENT, maxUsdt, profitAmount])
681672 }
682673
683674
684675
685676 @Callable(i)
686677 func sellWlg (minAmount) = {
687678 let prologResult = prolog2()
688679 if ((prologResult == prologResult))
689680 then if ((size(i.payments) != 1))
690681 then throw("exactly 1 payment must be attached")
691682 else {
692683 let pmt = i.payments[0]
693684 let wlgAmt = pmt.amount
694685 let caller = i.caller
695686 let addr = toString(caller)
696687 let maxWlg = getSwapLimitWlgold(addr)
697688 if ((wlgAmt > maxWlg))
698689 then throw((("You can spend max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
699690 else if (if (!(isDefined(pmt.assetId)))
700691 then true
701692 else (value(pmt.assetId) != wlgAssetId))
702693 then throw("WLGOLD payments only!")
703694 else {
704695 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
705696 let curWlgAmount = curStats[ixWlgAmount]
706697 let sellPrice = (curStats[ixWlgPrice] / 2)
707698 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
708699 if ((MINSHOPPAYMENT > usdtAmt))
709700 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
710701 else if ((minAmount > usdtAmt))
711702 then throw("Price changed during operation, please try again")
712703 else {
713704 let profitAmount = (usdtAmt / 5)
714705 $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)
715706 }
716707 }
717708 }
718709 else throw("Strict value is not equal to itself.")
719710 }
720711
721712
722713
723714 @Callable(i)
724715 func sellWlgREADONLY (address,wlgAmt) = {
725716 let maxWlg = getSwapLimitWlgold(address)
726717 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
727718 let sellPrice = (curStats[ixWlgPrice] / 2)
728719 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
729720 let minWlg = fraction(MINSHOPPAYMENT, MULT8, sellPrice)
730721 let profitAmount = (usdtAmt / 5)
731722 $Tuple2(nil, [usdtAmt, minWlg, maxWlg, profitAmount])
732723 }
733724
734725
735726
736727 @Callable(i)
737728 func claim () = {
738729 let prologResult = prolog2()
739730 if ((prologResult == prologResult))
740731 then if ((size(i.payments) != 0))
741732 then throw("No payments required")
742733 else {
743- let $t01404514114 = claimInternal2(toString(i.caller))
744- let actions = $t01404514114._1
745- let wlgClaimedAmount = $t01404514114._2
734+ let $t01375613825 = claimInternal2(toString(i.caller))
735+ let actions = $t01375613825._1
736+ let wlgClaimedAmount = $t01375613825._2
746737 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
747738 }
748739 else throw("Strict value is not equal to itself.")
749740 }
750741
751742
752743
753744 @Callable(i)
754745 func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
755746 then (i.caller != acresContract)
756747 else false)
757748 then (i.caller != acres2Contract)
758749 else false)
759750 then throw("Permission denied")
760751 else {
761- let $t01443314487 = claimInternal2(addr)
762- let actions = $t01443314487._1
763- let wlgClaimedAmount = $t01443314487._2
752+ let $t01414414198 = claimInternal2(addr)
753+ let actions = $t01414414198._1
754+ let wlgClaimedAmount = $t01414414198._2
764755 $Tuple2(if ((wlgClaimedAmount > 0))
765756 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
766757 else actions, wlgClaimedAmount)
767758 }
768759
769760
770761
771762 @Callable(i)
772763 func burnWlgold (wlgAmt) = if ((i.caller != acres2Contract))
773764 then throw("Permission denied")
774765 else {
775766 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
776767 if ((wlgAmt > curStats[ixWlgWlg]))
777768 then throw(((("Only " + fixedPoint(curStats[ixWlgWlg], 8)) + " WLGOLD left on contract, can't burn ") + fixedPoint(wlgAmt, 8)))
778769 else {
779770 let wlgAmountLeft = (curStats[ixWlgAmount] - wlgAmt)
780771 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, wlgAmountLeft)], wlgAmountLeft)
781772 }
782773 }
783774
784775
785776
786777 @Callable(i)
787778 func betForTicket (bet) = {
788779 let prologResult = prolog2()
789780 if ((prologResult == prologResult))
790781 then if ((size(i.payments) != 0))
791782 then throw("No payments required")
792783 else {
793784 let addr = toString(i.caller)
794785 let drawWeek = ((height / WEEK_BLOCKS) - 1)
795786 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
796787 let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
797788 if (if ((userTickets > 0))
798789 then (weekTickets > 0)
799790 else false)
800791 then throw("Please open the chest first")
801792 else if (((bet / 4) != 0))
802793 then throw("Invalid bet: should be 0..3")
803794 else {
804795 let moment = (height % DAY_BLOCKS)
805796 if ((moment > (DAY_BLOCKS - 3)))
806797 then throw((("Cannot bet: the day is almost ended, please wait " + toString((DAY_BLOCKS - moment))) + " blocks"))
807798 else {
808799 let stakedAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(addr)), 0)
809800 if ((ACRES_FOR_BET > stakedAcres))
810801 then throw((("You need to stake at least " + fixedPoint(ACRES_FOR_BET, 8)) + " ACRES to bet"))
811802 else {
812803 let tomorrow = ((height / DAY_BLOCKS) + 1)
813804 let betKey = keyUserBet(addr)
814805 let oldUserBetStr = getString(betKey)
815806 let newBetEntry = StringEntry(betKey, ((toString(tomorrow) + "_") + toString(bet)))
816807 if (isDefined(oldUserBetStr))
817808 then {
818809 let userBet = value(oldUserBetStr)
819810 if ((split(userBet, "_")[0] == toString(tomorrow)))
820811 then throw("You already bet for tomorrow")
821812 else {
822813 let r = claimTicketsInternal(addr, userBet)
823814 $Tuple2((r._1 :+ newBetEntry), r._2)
824815 }
825816 }
826817 else $Tuple2([newBetEntry], 0)
827818 }
828819 }
829820 }
830821 }
831822 else throw("Strict value is not equal to itself.")
832823 }
833824
834825
835826
836827 @Callable(i)
837828 func takeWlgXp (addr) = if ((i.caller != stakingContract))
838829 then throw("Permission denied")
839830 else {
840- let $t01709717140 = takeXpInternal(addr, 0)
841- let actions = $t01709717140._1
842- let xp = $t01709717140._2
831+ let $t01680816851 = takeXpInternal(addr, 0)
832+ let actions = $t01680816851._1
833+ let xp = $t01680816851._2
843834 $Tuple2(actions, xp)
844835 }
845836
846837
847838
848839 @Callable(i)
849840 func checkWlgXpREADONLY (addr) = {
850- let $t01721717265 = takeXpInternal(addr, 0)
851- let ignored = $t01721717265._1
852- let deltaXP = $t01721717265._2
841+ let $t01692816976 = takeXpInternal(addr, 0)
842+ let ignored = $t01692816976._1
843+ let deltaXP = $t01692816976._2
853844 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
854845 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
855846 $Tuple2(nil, (lvlPoints :+ newXP))
856847 }
857848
858849
859850
860851 @Callable(i)
861852 func setNumPrizes (numPrizes) = if ((i.caller != this))
862853 then throw("Permission denied")
863854 else {
864855 let week = (height / WEEK_BLOCKS)
865856 $Tuple2([IntegerEntry(keyNumNFT2Draw(week), numPrizes)], numPrizes)
866857 }
867858
868859
869860
870861 @Callable(i)
871-func openChest () = if (!(KS_ALLOW_NFT_DRAW))
872- then throw("Temporarily disabled")
873- else {
874- let prologResult = prolog2()
875- if ((prologResult == prologResult))
876- then if ((size(i.payments) != 0))
877- then throw("No payments required")
878- else {
879- let drawWeek = ((height / WEEK_BLOCKS) - 1)
880- let addr = toString(i.caller)
881- let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
882- if ((0 >= userTickets))
883- then throw("No gems to open the chest")
884- else openChestInternal(addr)
885- }
886- else throw("Strict value is not equal to itself.")
887- }
862+func openChest () = {
863+ let prologResult = prolog2()
864+ if ((prologResult == prologResult))
865+ then if ((size(i.payments) != 0))
866+ then throw("No payments required")
867+ else {
868+ let drawWeek = ((height / WEEK_BLOCKS) - 1)
869+ let addr = toString(i.caller)
870+ let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
871+ if ((0 >= userTickets))
872+ then throw("No gems to open the chest")
873+ else openChestInternal(addr)
874+ }
875+ else throw("Strict value is not equal to itself.")
876+ }
888877
889878
890879
891880 @Callable(i)
892881 func addGemsFor (addr,deltaTickets) = if ((i.caller != this))
893882 then throw("Permission denied")
894883 else {
895884 let week = (height / WEEK_BLOCKS)
896885 let ticketsKey = keyUserWeekTickets(addr, week)
897886 let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
898887 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
899888 let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
900889 let updateParticipants = if (if ((oldTickets == 0))
901890 then (deltaTickets == 1)
902891 else false)
903892 then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
904893 else nil
905894 $Tuple2(((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
906895 }
907896
908897

github/deemru/w8io/026f985 
86.22 ms