tx · 6JQn6zjbVZccBYm5XhfrGCh2R1LZUiQ3jmVyQ495S3pC

3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm:  -0.10700000 Waves

2023.11.03 21:21 [2827512] smart account 3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm > SELF 0.00000000 Waves

{ "type": 13, "id": "6JQn6zjbVZccBYm5XhfrGCh2R1LZUiQ3jmVyQ495S3pC", "fee": 10700000, "feeAssetId": null, "timestamp": 1699035693284, "version": 2, "chainId": 84, "sender": "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm", "senderPublicKey": "EVooykMNV691Venwp1dHUTBd7KWequzUcda57Wd3LQEX", "proofs": [ "3MZinEo9cCWk9sLDguk2akaZ32FZ1QgbzrLJLPgcrRUoGcPrpvtq5FJdNCaKaV4r66DHGTpFF5WGWyaTSzJdikNw" ], "script": "base64:BgLiAQgCEgMKAQgSBAoCCAESAwoBBBIAEgMKAQgSABIDCgEIEgQKAgEIEgQKAgEIEgQKAgICEgUKAwEBARIAEgQKAggIEgASABIECgICAhIAEgMKAQgSBAoCCAgSAwoBGBIECgIICBIECgIICBIFCgMICAgSBAoCCAgSBwoFAQEBAQESAwoBARIFCgMBAQgSAwoBCBIDCgEIEgASBAoCCAESBAoCCAESAwoBCBIECgIICBIDCgEIEgASAwoBCBIDCgEIEgYKBAgBCAESABIECgICAhIECgICAhIAEgMKAQgSBAoCAQGpAgAJREFZTUlMTElTAIC4mSkBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgAGU0NBTEU4AIDC1y8ADHhwTGV2ZWxTY2FsZQCAGQAPeHBMZXZlbFJlY2lwUG93AKAfABJudW1Qb2ludHNPbkxldmVsVXAAAwAOcm9iYmVyeUNvc3RNaW4AgMLXLwAUcm9iYmVyeUNvb2xkb3duQ29lZmYAkAMADHJlcXVpcmVtZW50cwkAzAgCAghTdHJlbmd0aAkAzAgCAghBY2N1cmFjeQkAzAgCAglJbnRlbGxlY3QJAMwIAgIJRW5kdXJhbmNlCQDMCAICCURleHRlcml0eQkAzAgCAgVMZXZlbAkAzAgCAgZIZWFsdGgFA25pbAAMY2hhclN0cmVuZ3RoAAAADGNoYXJBY2N1cmFjeQABAA1jaGFySW50ZWxsZWN0AAIADWNoYXJFbmR1cmFuY2UAAwANY2hhckRleHRlcml0eQAEAAtzZWdCYWNrcGFjawAAAAtOVU1TRUdNRU5UUwAGAApOVU1NQUlOQVVYAAIACE1BWFNMT1RTAAIADU1BWFBST0RJTlNMT1QAHgAQbGFuZFJvYkNvb2xkb3ducwkAzAgCAAAJAMwIAgDAzyQJAMwIAgCg9zYJAMwIAgCA3MwUCQDMCAIAgK6mCgUDbmlsAA5NSU5fUkVTX1RPX1JPQgCA2sQJAAxyb2JJZHhMb2NrZWQAAQALZHVja0lkeEZyZWUAAAAQZHVja0lkeFByZXBhcmluZwABAQ1rZXlEdWNrSGVhbHRoAQtkdWNrQXNzZXRJZAkArAICAgtkdWNrSGVhbHRoXwULZHVja0Fzc2V0SWQBDGtleUR1Y2tDaGFycwELZHVja0Fzc2V0SWQJAKwCAgIKZHVja0NoYXJzXwULZHVja0Fzc2V0SWQBCWtleUR1Y2tYUAELZHVja0Fzc2V0SWQJAKwCAgIHZHVja1hQXwULZHVja0Fzc2V0SWQBDGtleUR1Y2tMZXZlbAELZHVja0Fzc2V0SWQJAKwCAgIKZHVja0xldmVsXwULZHVja0Fzc2V0SWQBEWtleUR1Y2tGcmVlUG9pbnRzAQtkdWNrQXNzZXRJZAkArAICAg9kdWNrRnJlZVBvaW50c18FC2R1Y2tBc3NldElkARBrZXlEdWNrRXF1aXBtZW50AQtkdWNrQXNzZXRJZAkArAICAg5kdWNrRXF1aXBtZW50XwULZHVja0Fzc2V0SWQBCWtleVVzZXJYUAEEYWRkcgkArAICAgd1c2VyWFBfBQRhZGRyAQxrZXlVc2VyTGV2ZWwBBGFkZHIJAKwCAgIKdXNlckxldmVsXwUEYWRkcgERa2V5VXNlckZyZWVQb2ludHMBBGFkZHIJAKwCAgIPdXNlckZyZWVQb2ludHNfBQRhZGRyAQ5rZXlTYXZlZEhlYWx0aAELZHVja0Fzc2V0SWQJAKwCAgIMc2F2ZWRIZWFsdGhfBQtkdWNrQXNzZXRJZAEQa2V5U2F2ZWRMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgIOc2F2ZWRMb2NhdGlvbl8FC2R1Y2tBc3NldElkAQxrZXlEdWNrQnVmZnMBC2R1Y2tBc3NldElkCQCsAgICCmR1Y2tCdWZmc18FC2R1Y2tBc3NldElkARhrZXlMYXN0Um9iYmVyeVRpbWVCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICEGxhc3RSb2JiZXJ5VGltZV8FC2R1Y2tBc3NldElkARhrZXlMYXN0Um9iYmVyeUNvc3RCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICEGxhc3RSb2JiZXJ5Q29zdF8FC2R1Y2tBc3NldElkARNrZXlMYW5kUm9iYmVyeVN0YXRlAQtsYW5kQXNzZXRJZAkArAICAhFsYW5kUm9iYmVyeVN0YXRlXwULbGFuZEFzc2V0SWQBEmtleUxhbmRDb29sZG93bkVUQQELbGFuZEFzc2V0SWQJAKwCAgIQbGFuZENvb2xkb3duRVRBXwULbGFuZEFzc2V0SWQBE2tleUR1Y2tSb2JiZXJ5U3RhdGUBC2R1Y2tBc3NldElkCQCsAgICEWR1Y2tSb2JiZXJ5U3RhdGVfBQtkdWNrQXNzZXRJZAETa2V5TG9ja2VkTGFuZEJ5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIRbG9ja2VkTGFuZEJ5RHVja18FC2R1Y2tBc3NldElkARZrZXlEZWxpdmVyeURlbGF5QnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAhRkZWxpdmVyeURlbGF5QnlEdWNrXwULZHVja0Fzc2V0SWQBFGtleVVzZXJEZWxpdmVyeUNvdW50AQRhZGRyCQCsAgICEnVzZXJEZWxpdmVyeUNvdW50XwUEYWRkcgEWa2V5VXNlckxhc3REZWxpdmVyeURheQEEYWRkcgkArAICAhR1c2VyTGFzdERlbGl2ZXJ5RGF5XwUEYWRkcgAHeHBDbGFpbQCQTgAPeHBTdWNjZXNzRmxpZ2h0AJBOAAx4cEZhaWxGbGlnaHQA0A8ACHhwQ2FsbEVTAKCNBgAMeHBDdXN0b21OYW1lAMCEPQAKeHBOZXdTTGFuZADAlrECAA54cFVwZ3JhZGVJbmZyYQCQTgAHeHBNZXJnZQDAhD0ACXhwT25ib2FyZADAhD0ABnhwSGVhbACQTgEJbGV2ZWxCeVhQAQJ4cAkAawMFDHhwTGV2ZWxTY2FsZQkAbAYFAnhwAAQFD3hwTGV2ZWxSZWNpcFBvdwAEAAQFBERPV04FBlNDQUxFOAEJbWF4SGVhbHRoAQVsZXZlbAkAZAIAZAUFbGV2ZWwBB2xldmVsVXACCWN1cnJMZXZlbAVuZXdYUAQIbmV3TGV2ZWwJAQlsZXZlbEJ5WFABBQVuZXdYUAkAzAgCBQhuZXdMZXZlbAkAzAgCCQBoAgUSbnVtUG9pbnRzT25MZXZlbFVwCQBlAgUIbmV3TGV2ZWwFCWN1cnJMZXZlbAUDbmlsAQxnZXREdWNrU3RhdHMED3N0YWtpbmdDb250cmFjdAtkdWNrQXNzZXRJZApidWZmRWZmZWN0CmZvcmNlQnVmZnMEBWNoYXJzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5RHVja0NoYXJzAQULZHVja0Fzc2V0SWQCCTBfMF8wXzBfMAIBXwQDbHZsCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkAAAEBmhlYWx0aAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQJAQltYXhIZWFsdGgBBQNsdmwECnN0YXRlQnVmZnMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlEdWNrQnVmZnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wAgFfCQDOCAIJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQxjaGFyU3RyZW5ndGgJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQxjaGFyQWNjdXJhY3kJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFySW50ZWxsZWN0CQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckVuZHVyYW5jZQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDWNoYXJEZXh0ZXJpdHkJAMwIAgUDbHZsCQDMCAIFBmhlYWx0aAUDbmlsAwUKZm9yY2VCdWZmcwkAzAgCBQpidWZmRWZmZWN0CQDMCAIFCmJ1ZmZFZmZlY3QJAMwIAgUKYnVmZkVmZmVjdAkAzAgCBQpidWZmRWZmZWN0CQDMCAIFCmJ1ZmZFZmZlY3QFA25pbAkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKc3RhdGVCdWZmcwUMY2hhclN0cmVuZ3RoCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpzdGF0ZUJ1ZmZzBQxjaGFyQWNjdXJhY3kJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnN0YXRlQnVmZnMFDWNoYXJJbnRlbGxlY3QJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnN0YXRlQnVmZnMFDWNoYXJFbmR1cmFuY2UJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnN0YXRlQnVmZnMFDWNoYXJEZXh0ZXJpdHkFA25pbAEOZ2V0Um9iYmVyeURhdGECD3N0YWtpbmdDb250cmFjdAtkdWNrQXNzZXRJZAQLbGFzdFJvYkNvc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEYa2V5TGFzdFJvYmJlcnlDb3N0QnlEdWNrAQULZHVja0Fzc2V0SWQAAAQLbGFzdFJvYlRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEYa2V5TGFzdFJvYmJlcnlUaW1lQnlEdWNrAQULZHVja0Fzc2V0SWQAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQHcm9iQ29zdAkAlgMBCQDMCAIFDnJvYmJlcnlDb3N0TWluCQDMCAIJAGUCBQtsYXN0Um9iQ29zdAkAaAIFFHJvYmJlcnlDb29sZG93bkNvZWZmCQBlAgUDbm93BQtsYXN0Um9iVGltZQUDbmlsBAlkdWNrU3RhdGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQETa2V5RHVja1JvYmJlcnlTdGF0ZQEFC2R1Y2tBc3NldElkAAAECmxvY2tlZExhbmQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQETa2V5TG9ja2VkTGFuZEJ5RHVjawEFC2R1Y2tBc3NldElkAgAEB2xhbmRFVEEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQESa2V5TGFuZENvb2xkb3duRVRBAQUKbG9ja2VkTGFuZAAACQCXCgUFB3JvYkNvc3QFC2xhc3RSb2JUaW1lBQlkdWNrU3RhdGUFCmxvY2tlZExhbmQFB2xhbmRFVEEACkxBTkRQUkVGSVgCBExBTkQACkRVQ0tQUkVGSVgCBERVQ0sACkFSVFBSRVNBTEUCB1BSRVNBTEUABk5VTVJFUwAGAA5OVU1fQ09OVElORU5UUwAFABhNQVhfTEFORFNfU1RBS0VEX0JZX1VTRVIAGQAPREFJTFlSRVNCWVBJRUNFAID40gEADFdITVVMVElQTElFUgCAyK+gJQAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EAEFJFU09VUkNFUFJJQ0VNSU4A1bUCAApFU1NFTExDT0VGAAoAFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQDQhgMAElRFTl9NSU5VVEVTX01JTExJUwDAzyQAF0FMTE9XRURfRlJFRV9ERUxJVkVSSUVTAAEAGkFDUkVTX0ZPUl9ERUxJVkVSWV9BVFRFTVBUAIDh6xcACXByb2RUeXBlcwkAzAgCAhBGaXJzdCBBaWQgS2l0IEwxCQDMCAICEEZpcnN0IEFpZCBLaXQgTDIJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMwkAzAgCAgtCYWNrcGFjayBMMQkAzAgCAgtCYWNrcGFjayBMMgkAzAgCAgtCYWNrcGFjayBMMwkAzAgCAg5Gb29kIFJhdGlvbiBMMQkAzAgCAg5Gb29kIFJhdGlvbiBMMgkAzAgCAg5Gb29kIFJhdGlvbiBMMwkAzAgCAgtKZXQgUGFjayBMMQkAzAgCAgtKZXQgUGFjayBMMgkAzAgCAgtKZXQgUGFjayBMMwkAzAgCAglTaGllbGQgTDEJAMwIAgIJU2hpZWxkIEwyCQDMCAICCVNoaWVsZCBMMwkAzAgCAgdNaW5lIEwxCQDMCAICB01pbmUgTDIJAMwIAgIHTWluZSBMMwkAzAgCAgdUcmFwIEwxCQDMCAICB1RyYXAgTDIJAMwIAgIHVHJhcCBMMwUDbmlsAApjb250aW5lbnRzCQDMCAICCEFtZXJpY2FzCQDMCAICBkV1cm9wZQkAzAgCAgRBc2lhCQDMCAICBkFmcmljYQkAzAgCAgdPY2VhbmlhBQNuaWwACUNPRUZGMk1BVACAreIEABBmb3J0QWxsb3dlZFByb2RzCQDMCAIADwkAzAgCABAJAMwIAgARCQDMCAIAEgkAzAgCABMJAMwIAgAUBQNuaWwAEHByb2R1Y3Rpb25NYXRyaXgJAMwIAgIlOF84XzhfMTdfMTdfNDJfMTJfMF8zMF8wLDAsMCwwLDAsMCwwXwkAzAgCAiU4XzhfOF8xN18xN180Ml8yNF8wXzYwXzAsMCw1LDIsMCwwLDBfCQDMCAICJzhfOF84XzE3XzE3XzQyXzM2XzBfMTIwXzAsMCwxMCw0LDAsMCwwXwkAzAgCAik4XzE5XzE5XzhfMjdfMTlfMjZfMV8yMF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNTJfMV80MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNzhfMV84MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAiU4XzhfOF84XzhfNjBfMTNfMl8yXzAsMCwwLDAsMCwwLDBfMDExCQDMCAICJThfOF84XzhfOF82MF8yNl8yXzRfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzM5XzJfOF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfMzBfM18zMF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfNjBfM181MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfOTBfM183MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8xMV80XzEwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzIyXzRfMjBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMzNfNF8zMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAio0XzEzXzIyXzRfMzVfMjJfMjNfMF81MCwxLDBfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNF8xM18yMl80XzM1XzIyXzQ2XzBfNTAsMSwxXzAsMiw1LDAsMCwwLDBfCQDMCAICKzRfMTNfMjJfNF8zNV8yMl82OV8wXzUwLDIsMV8wLDUsMTAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzIwXzFfMzAsMSwxXzAsMCwwLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV80MF8xXzMwLDEsMl8yLDEsMywwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfNjBfMV8zMCwxLDNfNSwyLDgsMCwwLDAsMF8FA25pbAAJcklkeENvZWZmAAYACnJJZHhFZmZlY3QACAAQcklkeFJlcXVpcmVtZW50cwAJAAlySWR4U2xvdHMACgAOUFJPRFVDVFBLR1NJWkUACgALd2hJZHhMZXZlbHMAAAAId2hJZHhSZXMAAQAId2hJZHhNYXQAAgAJd2hJZHhQcm9kAAMACXdoSWR4TE9GVAAEAAl2b2xMb2NrZWQAAAALdm9sT2NjdXBpZWQAAQAHdm9sRnJlZQACAAh2b2xUb3RhbAADAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADAA9sb2NJZHhDb250aW5lbnQAAAAKbG9jSWR4VHlwZQABAAhsb2NJZHhJZAACARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIDbm9fBQdhc3NldElkARprZXlMYW5kQXNzZXRJZFRvQ3VzdG9tTmFtZQEHYXNzZXRJZAkArAICAgVsY25hXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgNzdF8FB2Fzc2V0SWQBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgR0eXBlB2Fzc2V0SWQJALkJAgkAzAgCAgNsYXMJAMwIAgUEdHlwZQkAzAgCBQdhc3NldElkBQNuaWwCAV8BImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDB25mdFR5cGUHYXNzZXRJZAlvd25lckFkZHIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgZzdHRhb18FB25mdFR5cGUCAV8FB2Fzc2V0SWQCAV8FCW93bmVyQWRkcgESa2V5V2FyZWhvdXNlQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAgN3aF8FC2xhbmRBc3NldElkARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQdhc3NldElkCQCsAgICC2luZnJhTGV2ZWxfBQdhc3NldElkARdrZXlGb3J0aWZpY2F0aW9uc0J5TGFuZAELbGFuZEFzc2V0SWQJAKwCAgIPZm9ydGlmaWNhdGlvbnNfBQtsYW5kQXNzZXRJZAEaa2V5RHVja0Fzc2V0SWRUb0N1c3RvbU5hbWUBB2Fzc2V0SWQJAKwCAgIYZHVja0N1c3RvbU5hbWVCeUFzc2V0SWRfBQdhc3NldElkARZrZXlBZGRyZXNzVG9DdXN0b21OYW1lAQRhZGRyCQCsAgICGGFjY291bnRDdXN0b21OYW1lQnlBZGRyXwUEYWRkcgEPa2V5QWRkcmVzc1JlZkJ5AQRhZGRyCQCsAgICCWFjY1JlZkJ5XwUEYWRkcgEca2V5T25ib2FyZEFydEFjdGl2YXRlZE9uRHVjawELZHVja0Fzc2V0SWQJAKwCAgIab25ib2FyZEFydEFjdGl2YXRlZE9uRHVja18FC2R1Y2tBc3NldElkARxrZXlPbmJvYXJkQXJ0RHVja0FjdGl2YXRlZEJ5AQRhZGRyCQCsAgICGm9uYm9hcmRBcnRBY3RpdmF0ZWREdWNrQnlfBQRhZGRyARNrZXlBZGRyZXNzUmVmZXJyYWxzAQRhZGRyCQCsAgICDWFjY1JlZmVycmFsc18FBGFkZHIBEGtleUR1Y2tJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIKZHVja093bmVyXwUHYXNzZXRJZAEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgERa2V5QmFja3BhY2tCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICCWJhY2tQYWNrXwULZHVja0Fzc2V0SWQBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQBFWtleVVzZXJHd2xSZWxlYXNlVGltZQEIdXNlckFkZHIJAKwCAgIaJXMlc19fdXNlckd3bFJlbGVhc2VUaW1lX18FCHVzZXJBZGRyAQ5rZXlFc1dhcmVob3VzZQACGmVtZXJnZW5jeVdhcmVob3VzZVByb2R1Y3RzAA9kZWxpdmVyeUZ1bmRLZXkCDGRlbGl2ZXJ5RnVuZAARZGVsaXZlcnlMb2NrZWRLZXkCDmRlbGl2ZXJ5TG9ja2VkAA1sYXN0VG91cklkS2V5Ag4lc19fbGFzdFRvdXJJZAEVa2V5VG91clN0YXRpY0RhdGFCeUlkAQN0SWQJAKwCAgIWJXMlZF9fdG91clN0YXRpY0RhdGFfXwkApAMBBQN0SWQBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBA3RJZAkArAICAhclcyVkX190b3VyRHluYW1pY0RhdGFfXwkApAMBBQN0SWQBGmtleUJlc3RSZXN1bHRCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAh8lcyVkJXNfX2Jlc3RSZXN1bHRCeVRvdXJBbmREdWNrCQDMCAIJAKQDAQUDdElkCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwCAl9fAAlpZHhTdGF0aWMAAAAKaWR4RHluYW1pYwABAAp0U3RhdGljRW5kAAYADnREeW5hbWljU3RhdHVzAAEBC2dldFRvdXJEYXRhAgx0b3VyQ29udHJhY3QDdElkBAZzdGF0aWMJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEFA3RJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUDdElkAgUgZGF0YQICX18EB2R5bmFtaWMJALwJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQN0SWQJAKwCAgkArAICAhlFcnJvciByZWFkaW5nIHRvdXJuYW1lbnQgCQCkAwEFA3RJZAIFIGRhdGECAl9fCQDMCAIFBnN0YXRpYwkAzAgCBQdkeW5hbWljBQNuaWwBDmlzSW5Ub3VybmFtZW50Agx0b3VyQ29udHJhY3QIbG9jYXRpb24EBmxhc3RJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQx0b3VyQ29udHJhY3QFDWxhc3RUb3VySWRLZXkAAAQDbG9jCQC1CQIFCGxvY2F0aW9uAgFfBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUMdG91ckNvbnRyYWN0BQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljAwMDCQAAAgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAVQJAAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQ9sb2NJZHhDb250aW5lbnQFBmxhc3RJZAcJAAACCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzAgpJTlBST0dSRVNTBwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFCnRTdGF0aWNFbmQFA25vdwcBDGlzSW5EZWxpdmVyeQEIbG9jYXRpb24EA2xvYwkAtQkCBQhsb2NhdGlvbgIBXwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJc3RhcnRUaW1lCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQ9sb2NJZHhDb250aW5lbnQECGRpc3RhbmNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQhsb2NJZHhJZAMDCQAAAgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUQJAGYCCQBkAgUJc3RhcnRUaW1lBRJURU5fTUlOVVRFU19NSUxMSVMFA25vdwcJAGcCAAMFCGRpc3RhbmNlBwEPaXNVc3VhbExvY2F0aW9uAQhsb2NhdGlvbgQHbG9jVHlwZQkAkQMCCQC1CQIFCGxvY2F0aW9uAgFfBQpsb2NJZHhUeXBlAwkBAiE9AgUHbG9jVHlwZQIBVAkBAiE9AgUHbG9jVHlwZQIBRAcBCW9uTWlzc2lvbgIMdG91ckNvbnRyYWN0CGxvY2F0aW9uBAZsYXN0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMdG91ckNvbnRyYWN0BQ1sYXN0VG91cklkS2V5AAAEA2xvYwkAtQkCBQhsb2NhdGlvbgIBXwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFDHRvdXJDb250cmFjdAUGbGFzdElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQHbG9jVHlwZQkAkQMCBQNsb2MFCmxvY0lkeFR5cGUDCQAAAgUHbG9jVHlwZQIBRAYDAwMJAAACCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBVAkAAAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNsb2MFD2xvY0lkeENvbnRpbmVudAUGbGFzdElkBwkAAAIJAJEDAgUHZHluYW1pYwUOdER5bmFtaWNTdGF0dXMCCklOUFJPR1JFU1MHCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAUDbm93BwESZ2V0UmVjaXBlTWF0ZXJpYWxzAQZyZWNpcGUJAGgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBQlySWR4Q29lZmYFCUNPRUZGMk1BVAEMY2hlYXRBdHRlbXB0AwZvbGRMb2MGbmV3TG9jCWNoZWF0Q2FzZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhZDaGVhdCBhdHRlbXB0OiBvbGRMb2M9BQZvbGRMb2MCCSwgbmV3TG9jPQUGbmV3TG9jAgcsIGNhc2U9CQCkAwEFCWNoZWF0Q2FzZQAWS1NfU0VQQVJBVEVfUFVCTElDX0tFWQcAGEtTX0FMTE9XX0JJR19JTkZSQV9NRVJHRQcACkRBWV9NSUxMSVMAgLiZKQAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAC3VzZHRBc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQMJAAACAQFUBQckbWF0Y2gwASBVsdifcoeC7+XjW42sBatl3ppDoS8WuwXzGreHpfHFGAkAAgECDVVua25vd24gY2hhaW4AFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BRQ3V2RmJ2aDRMa1BVbnJuVTF6M2puYkExcDltM1dOaHYDCQAAAgEBVAUHJG1hdGNoMAIjM011bWtHR3p0Q0tBWHBXRHF4a2Rkb2ZxWFNVYnFRa3ZTSnkJAAIBAg1Vbmtub3duIGNoYWluABFJbmZyYVVwZ3JhZGVDb3N0UwQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMACAyK+gJQMJAAACAQFUBQckbWF0Y2gwAIDC1y8JAAIBAg1Vbmtub3duIGNoYWluAA5hcmJpdHJhZ2VEZWxheQQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAUKREFZX01JTExJUwMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AE0RFTElWRVJZX1BVTklTSE1FTlQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAgJeTBQMJAAACAQFUBQckbWF0Y2gwAKD3NgkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAFU1NJWkUAGQAFTVNJWkUAZAAFTFNJWkUA4QEABlhMU0laRQCQAwAHWFhMU0laRQDxBAAFSVRFUjYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEAEUlkeENmZ0Vjb25vbXlEYXBwAAIAFElkeENmZ0dvdmVybmFuY2VEYXBwAAMADUlkeENmZ1dsZ0RhcHAABAAUSWR4Q2ZnVG91cm5hbWVudERhcHAABwAPSWR4Q2ZnQWNyZXNEYXBwAAgBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHAAD2Vjb25vbXlDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ0Vjb25vbXlEYXBwAAtnb3ZDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ0dvdmVybmFuY2VEYXBwAAt3bGdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFDUlkeENmZ1dsZ0RhcHAAEnRvdXJuYW1lbnRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ1RvdXJuYW1lbnREYXBwAA1hY3Jlc0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUPSWR4Q2ZnQWNyZXNEYXBwAApyZWNMYW5kTnVtAAAAC3JlY0xhbmRTaXplAAEAC3JlY1RlcnJhaW5zAAIADHJlY0NvbnRpbmVudAADAA13bGdBc3NldElkS2V5Agt3bGdfYXNzZXRJZAAKd2xnQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFC3dsZ0NvbnRyYWN0BQ13bGdBc3NldElkS2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQAD2FjcmVzQXNzZXRJZEtleQIMYWNyZXNBc3NldElkAAxhY3Jlc0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQ1hY3Jlc0NvbnRyYWN0BQ9hY3Jlc0Fzc2V0SWRLZXkCF0FDUkVTIGlzIG5vdCBpc3N1ZWQgeWV0AAtyYW5kb21EZWxheQACAQlrZXlDb21taXQBB2FkZHJlc3MJAKwCAgITZmluaXNoQmxvY2tGb3JBZGRyXwUHYWRkcmVzcwERa2V5UmVzUHJvcG9ydGlvbnMAAhNyZXNUeXBlc1Byb3BvcnRpb25zARZrZXlSZXNUeXBlc0J5Q29udGluZW50AQljb250aW5lbnQJAKwCAgIUcmVzVHlwZXNCeUNvbnRpbmVudF8FCWNvbnRpbmVudAEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQlvd25lckFkZHIJAKwCAgIUc3Rha2VkUGllY2VzQnlPd25lcl8FCW93bmVyQWRkcgEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCWFzQW55TGlzdAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAglMaXN0W0FueV0EAWwFByRtYXRjaDAFAWwJAAIBAhtmYWlsIHRvIGNhc3QgaW50byBMaXN0W0FueV0BCWFzQm9vbGVhbgEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFzBQckbWF0Y2gwBQFzCQACAQIZZmFpbCB0byBjYXN0IGludG8gQm9vbGVhbgEPbnVtUGllY2VzQnlTaXplAQhsYW5kU2l6ZQQHJG1hdGNoMAUIbGFuZFNpemUDCQAAAgIBUwUHJG1hdGNoMAUFU1NJWkUDCQAAAgIBTQUHJG1hdGNoMAUFTVNJWkUDCQAAAgIBTAUHJG1hdGNoMAUFTFNJWkUDCQAAAgICWEwFByRtYXRjaDAFBlhMU0laRQMJAAACAgNYWEwFByRtYXRjaDAFB1hYTFNJWkUJAAIBAhFVbmtub3duIGxhbmQgc2l6ZQEHaXNEaWdpdAEBcwkBCWlzRGVmaW5lZAEJALYJAQUBcwEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBEWtleUxhc3RUeElkQnlVc2VyAQRhZGRyCQCsAgICD2xhc3RUeElkQnlVc2VyXwUEYWRkcgEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQBD2dldFJhbmRvbU51bWJlcgMIbWF4VmFsdWUEc2FsdAdlbnRyb3B5BApyYW5kb21IYXNoCQD3AwEJAMsBAgUEc2FsdAUHZW50cm9weQkAagIJALEJAQUKcmFuZG9tSGFzaAUIbWF4VmFsdWUADWluY3ViYXRvckFkZHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNQRWt0VnV4MlJoY2hTTjYzRHNEbzRiNG16NFFxektTZUR2AwkAAAIBAVQFByRtYXRjaDAFBHRoaXMJAAIBAg1Vbmtub3duIGNoYWluAAticmVlZGVyQWRkcgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQIjM1BEVnVVNDVIN0VoNWRtdE5iblJOUlN0R3dVTEE3Tlk2SGIDCQAAAgEBVAUHJG1hdGNoMAUEdGhpcwkAAgECDVVua25vd24gY2hhaW4AA3B1YgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAMFFktTX1NFUEFSQVRFX1BVQkxJQ19LRVkBIKsXV48VZ+NZVEGw1nLrZpvEo9NmXtWZhlDfmDcfsgkIASBPU+IaP1So1p1SThMdRidVvbNT8yx7yVRUsP9DwbQUKAMJAAACAQFUBQckbWF0Y2gwASBPU+IaP1So1p1SThMdRidVvbNT8yx7yVRUsP9DwbQUKAkAAgECDVVua25vd24gY2hhaW4ADEVNUFRZX1BST0Q1MAGQAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUZJVkVNSU5VVEVTTUlMTElTAOCnEgAMUkVOQU1JTkdDT1NUAMCWsQIACk1BWE5BTUVMRU4AMgAVSW5mcmFVcGdyYWRlQ29zdFNVc2R0AICt4gQADEVYUE1BVEVSSUFMUwQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMACm3YLtqwcDCQAAAgEBVAUHJG1hdGNoMACqp4GzCQkAAgECDVVua25vd24gY2hhaW4AB0VYUFVTRFQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAgOWadwMJAAACAQFUBQckbWF0Y2gwAIDlmncJAAIBAg1Vbmtub3duIGNoYWluAAxTX0NPU1RfQUNSRVMAgPKLqAkABUZJVkVYCQC2AgEABQAHVFdFTlRZWAkAtgIBABQACFRXRU5UWTJYCQC2AgEJAGgCABQAFAAIVFdFTlRZM1gJALYCAQkAaAIJAGgCABQAFAAUAAhUV0VOVFk0WAkAtgIBCQBoAgkAaAIJAGgCABQAFAAUABQACFRXRU5UWTVYCQC2AgEJAGgCCQBoAgkAaAIJAGgCABQAFAAUABQAFAAPUFJFU0FMRU5VTUxBTkRTAPQDARJrZXlOZXh0RnJlZUxhbmROdW0AAgtuZXh0TGFuZE51bQEaa2V5TGFuZEN1c3RvbU5hbWVUb0Fzc2V0SWQBBG5hbWUJAKwCAgIEbGNuXwUEbmFtZQEQa2V5TGFuZFRvQXNzZXRJZAEHbGFuZE51bQkArAICAgNsYV8FB2xhbmROdW0BHmtleUluZnJhTGV2ZWxCeUFzc2V0SWRBbmRPd25lcgIHYXNzZXRJZAlvd25lckFkZHIJAKwCAgkArAICCQCsAgICBWlsYW9fBQdhc3NldElkAgFfBQlvd25lckFkZHIBEWtleUxhbmROdW1Ub093bmVyAQdsYW5kTnVtCQCsAgICA2xvXwUHbGFuZE51bQEaa2V5RHVja0N1c3RvbU5hbWVUb0Fzc2V0SWQBBG5hbWUJAKwCAgIRZHVja0J5Q3VzdG9tTmFtZV8FBG5hbWUBFmtleUN1c3RvbU5hbWVUb0FkZHJlc3MBBG5hbWUJAKwCAgIUYWNjb3VudEJ5Q3VzdG9tTmFtZV8FBG5hbWUBCWtleU9sZGllcwACCm9sZGllc0xpc3QAC2NsYWltTW9kZVdoAAAADWNsYWltTW9kZUR1Y2sAAQATY2xhaW1Nb2RlV2hUaGVuRHVjawACAAhmbEhlYWx0aAAAAAtmbFRpbWVzdGFtcAAFAAdmbEJvbnVzAAYAC2ZsUHJvZHNVc2VkAAcBB25mdE5hbWUCB2xhbmROdW0IbGFuZFNpemUJAKwCAgkArAICBQpMQU5EUFJFRklYBQdsYW5kTnVtBQhsYW5kU2l6ZQEIdG9Wb2x1bWUCBmFtb3VudAdwa2dTaXplBARwa2dzAwkAZwIFBmFtb3VudAAACQBpAgkAZQIJAGQCBQZhbW91bnQFB3BrZ1NpemUAAQUHcGtnU2l6ZQkBAS0BCQBpAgkAZQIJAGQCCQEBLQEFBmFtb3VudAUHcGtnU2l6ZQABBQdwa2dTaXplCQBoAgUEcGtncwUFTVVMVDgBE2Rpc3RyaWJ1dGVCeVdlaWdodHMCBXRvdGFsB3dlaWdodHMEA3N1bQkAZAIJAGQCCQBkAgkAZAIJAGQCCQCRAwIFB3dlaWdodHMAAAkAkQMCBQd3ZWlnaHRzAAEJAJEDAgUHd2VpZ2h0cwACCQCRAwIFB3dlaWdodHMAAwkAkQMCBQd3ZWlnaHRzAAQJAJEDAgUHd2VpZ2h0cwAFAwkAZwIAAAUDc3VtCQACAQIQWmVybyB3ZWlnaHRzIHN1bQQFbm9ybTYJAGsDBQV0b3RhbAUFTVVMVDYFA3N1bQoBCm5vcm1hbGl6ZXICA2FjYwRlbGVtCQDNCAIFA2FjYwkAawMFBGVsZW0FBW5vcm02BQVNVUxUNgoAAiRsBQd3ZWlnaHRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpub3JtYWxpemVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGARJnZXROZWVkZWRNYXRlcmlhbHMBBXRvdGFsBAVwcm9wcwkAtQkCCQEFdmFsdWUBCQCiCAEJARFrZXlSZXNQcm9wb3J0aW9ucwACAV8DCQECIT0CCQCQAwEFBXByb3BzBQZOVU1SRVMJAAIBAhZXcm9uZyBwcm9wb3J0aW9ucyBkYXRhBAFyCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwAACQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwABCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwACCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwADCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwAECQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwAFBQNuaWwJARNkaXN0cmlidXRlQnlXZWlnaHRzAgUFdG90YWwFAXIBEXN1YnRyYWN0TWF0ZXJpYWxzAwxzaG91bGRVc2VNYXQDaGFzCXRvdGFsTmVlZAQEbmVlZAkBEmdldE5lZWRlZE1hdGVyaWFscwEFCXRvdGFsTmVlZAoBCnN1YnRyYWN0b3ICA2FjYwNpZHgEBnJlc3VsdAkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNoYXMFA2lkeAkAkQMCBQRuZWVkBQNpZHgDCQBmAgAABQZyZXN1bHQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJ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BQVwTGlzdAUIb2NjdXBpZWQFBGZyZWUEBGhlYWQJAMkBAgUFcExpc3QJAGgCAAgFCnByb2R1Y3RJZHgEBGN1cnIJALEJAQkAyQECCQDKAQIFBXBMaXN0CQBoAgAIBQpwcm9kdWN0SWR4AAgEBHRhaWwJAMoBAgUFcExpc3QJAGgCAAgJAGQCBQpwcm9kdWN0SWR4AAEEBnJlY2lwZQkAtQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgCAV8DAwkBASEBBQppc1Bvc2l0aXZlCQBmAgUFY291bnQFBGN1cnIHCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkApAMBBQRjdXJyAgQgb2YgCQCRAwIFCXByb2RUeXBlcwUKcHJvZHVjdElkeAITLCBidXQgdHJpZWQgdG8gdXNlIAkApAMBBQVjb3VudAQGbmV3QW10AwMJAQEhAQUKaXNQb3NpdGl2ZQkBFWNoZWNrU3RhdFJlcXVpcmVtZW50cwIFCWR1Y2tTdGF0cwkAtQkCCQCRAwIFBnJlY2lwZQUQcklkeFJlcXVpcmVtZW50cwIBLAcJAGUCBQRjdXJyBQVjb3VudAkAZAIFBGN1cnIFBWNvdW50BAhkZWx0YVZvbAkAZQIJAQh0b1ZvbHVtZQIFBm5ld0FtdAUOUFJPRFVDVFBLR1NJWkUJAQh0b1ZvbHVtZQIFBGN1cnIFDlBST0RVQ1RQS0dTSVpFCQCVCgMJAMsBAgkAywECBQRoZWFkCQCaAwEFBm5ld0FtdAUEdGFpbAkAZAIFCG9jY3VwaWVkBQhkZWx0YVZvbAkAZQIFBGZyZWUFCGRlbHRhVm9sAQhhZGRQcm9kQgcGaWR4Q250BXBMaXN0CmlzUG9zaXRpdmUHc2VnbWVudAdtYWluQXV4BHNsb3QJZHVja1N0YXRzBAVwYXJ0cwkAtQkCBQZpZHhDbnQCAToDCQECIT0CCQCQAwEFBXBhcnRzAAIJAAIBAihJbmNvcnJlY3QgZm9ybWF0LCBzaG91bGQgYmUgaW5kZXg6YW1vdW50AwMJAQEhAQUKaXNQb3NpdGl2ZQkBAiE9AgkAsQIBCQCRAwIFBXBhcnRzAAAAAgcJAAIBAitQcm9kdWN0IGlkeCBzaG91bGQgYmUgMiBkaWdpdHMsIHplcm8gcGFkZGVkBApwcm9kdWN0SWR4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAAQFY291bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwYXJ0cwABAwMJAGYCAAAFCnByb2R1Y3RJZHgGCQBnAgUKcHJvZHVjdElkeAkAkAMBBRBwcm9kdWN0aW9uTWF0cml4CQACAQITVW5rbm93biBwcm9kdWN0IGlkeAMJAGYCAAAFBWNvdW50CQACAQIXQ291bnQgY2FuJ3QgYmUgbmVnYXRpdmUDCQBmAgUFY291bnQFDU1BWFBST0RJTlNMT1QJAAIBCQCsAgIJAKwCAgkArAICAhRDYW4ndCBwdXQgbW9yZSB0aGFuIAkApAMBBQ1NQVhQUk9ESU5TTE9UAgQgb2YgCQCRAwIFCXByb2RUeXBlcwUKcHJvZHVjdElkeAMJAAACBQVjb3VudAAACQCUCgIFBXBMaXN0BwQEaGVhZAkAyQECBQVwTGlzdAkAaAIACAUKcHJvZHVjdElkeAQEY3VycgkAsQkBCQDJAQIJAMoBAgUFcExpc3QJAGgCAAgFCnByb2R1Y3RJZHgACAQEdGFpbAkAygECBQVwTGlzdAkAaAIACAkAZAIFCnByb2R1Y3RJZHgAAQQGcmVjaXBlCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUKcHJvZHVjdElkeAIBXwMDCQEBIQEFCmlzUG9zaXRpdmUJAGYCBQVjb3VudAUEY3VycgcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCkAwEFBGN1cnICBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQpwcm9kdWN0SWR4AhMsIGJ1dCB0cmllZCB0byB1c2UgCQCkAwEFBWNvdW50BAlpc0JpZ0l0ZW0DAwkBASEBBQppc1Bvc2l0aXZlCQEVY2hlY2tTdGF0UmVxdWlyZW1lbnRzAgUJZHVja1N0YXRzCQC1CQIJAJEDAgUGcmVjaXBlBRBySWR4UmVxdWlyZW1lbnRzAgEsBwQGY29tcGF0CQCRAwIFBnJlY2lwZQUJcklkeFNsb3RzAwkAAAIFBmNvbXBhdAIACQACAQIXSXRlbSBjYW5ub3QgYmUgZXF1aXBwZWQEAWMJAQ1wYXJzZUludFZhbHVlAQUGY29tcGF0BARjU2VnCQBpAgUBYwBkAwkBAiE9AgUHc2VnbWVudAUEY1NlZwkAAgECFFNlZ21lbnQgaW5jb21wYXRpYmxlBAhjTWFpbkF1eAkAaQIJAGoCBQFjAGQACgMJAQIhPQIFB21haW5BdXgFCGNNYWluQXV4CQACAQIRU2xvdCBpbmNvbXBhdGlibGUECWNOdW1TbG90cwkAagIFAWMACgMDCQECIT0CBQRzbG90AAAJAGYCBQljTnVtU2xvdHMAAQcJAAIBAh5CaWcgaXRlbXMgc2hvdWxkIG9jY3VweSBzbG90IDAJAGYCBQljTnVtU2xvdHMAAQcJAJQKAgkAywECCQDLAQIFBGhlYWQJAJoDAQkAZAIFBGN1cnIDBQppc1Bvc2l0aXZlBQVjb3VudAkBAS0BBQVjb3VudAUEdGFpbAUJaXNCaWdJdGVtAQtzbG90c0dyb3VwQgYBZwRicEluCmlzUG9zaXRpdmUHc2VnbWVudAdtYWluQXV4BXN0YXRzAwkBAiE9AgUBZwIABAVzbG90cwkAtQkCBQFnAgEsAwkAZgIJAJADAQUFc2xvdHMFCE1BWFNMT1RTCQACAQISV3Jvbmcgc2xvdHMgZm9ybWF0BAJzMAkAkQMCBQVzbG90cwAABAJzMQMJAGYCCQCQAwEFBXNsb3RzAAEJAJEDAgUFc2xvdHMAAQIAAwMJAAACBQJzMAIACQAAAgUCczECAAcFBGJwSW4EBXRtcFMwAwkBAiE9AgUCczACAAkBCGFkZFByb2RCBwUCczAFBGJwSW4FCmlzUG9zaXRpdmUFB3NlZ21lbnQFB21haW5BdXgAAAUFc3RhdHMJAJQKAgUEYnBJbgcDCQECIT0CBQJzMQIAAwgFBXRtcFMwAl8yCQACAQIeQmlnIGl0ZW0gYWxyZWFkeSBvY2N1cGllcyBzbG90CAkBCGFkZFByb2RCBwUCczEIBQV0bXBTMAJfMQUKaXNQb3NpdGl2ZQUHc2VnbWVudAUHbWFpbkF1eAABBQVzdGF0cwJfMQgFBXRtcFMwAl8xBQRicEluAQZkcmVzc0IEB3NlZ0xpc3QGcEJ5dGVzCmlzUG9zaXRpdmUFc3RhdHMKAQdzZWdtZW50AgNhY2MDc2VnBAFqCAUDYWNjAl8xBAdtYWluQXV4CQC1CQIFA3NlZwIBOwMJ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ZXdQcm9kQgkBBmRyZXNzQgQFBmN1cnJFcQUJdGVtcFByb2RCBwUFc3RhdHMJAAACBQhuZXdQcm9kQgUIbmV3UHJvZEIBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwECHByb3BMaXN0DXRlcnJhaW5Db3VudHMNbGFuZFNpemVJbmRleARzaWduAwkBAiE9AgkAkAMBBQhwcm9wTGlzdAUGTlVNUkVTCQACAQIWV3JvbmcgcHJvcG9ydGlvbnMgZGF0YQoBB3VwZGF0ZXICA2FjYwFpBAZyZXN1bHQJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvcExpc3QFAWkJAGgCCQBoAgUEc2lnbgkAkQMCBQ10ZXJyYWluQ291bnRzBQFpBQ1sYW5kU2l6ZUluZGV4AwkAZgIAAAUGcmVzdWx0CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhZQYW5pYyEgUGllY2VzIG9mIHR5cGU9CQCkAwEFAWkCBywgc2lnbj0JAKQDAQUEc2lnbgITLCB0ZXJyYWluQ291bnRzW2ldPQkApAMBCQCRAwIFDXRlcnJhaW5Db3VudHMFAWkCECwgbGFuZFNpemVJbmRleD0JAKQDAQUNbGFuZFNpemVJbmRleAkAzQgCBQNhY2MJAKQDAQUGcmVzdWx0CgACJGwFBUlURVI2CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQd1cGRhdGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGARF1cGRhdGVQcm9wb3J0aW9ucwMNdGVycmFpbkNvdW50cw1sYW5kU2l6ZUluZGV4BHNpZ24ECHByb3BMaXN0CQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBEWtleVJlc1Byb3BvcnRpb25zAAILMF8wXzBfMF8wXzACAV8JALkJAgkBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwEBQhwcm9wTGlzdAUNdGVycmFpbkNvdW50cwUNbGFuZFNpemVJbmRleAUEc2lnbgIBXwENY291bnRUZXJyYWlucwEIdGVycmFpbnMJAMwIAgkAZQIJAJADAQkAtQkCBQh0ZXJyYWlucwIBQQABCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUIAAQkAzAgCCQBlAgkAkAMBCQC1CQIFCHRlcnJhaW5zAgFDAAEJAMwIAgkAZQIJAJADAQkAtQkCBQh0ZXJyYWlucwIBRAABCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUUAAQkAzAgCCQBlAgkAkAMBCQC1CQIFCHRlcnJhaW5zAgFGAAEFA25pbAEGYWRkUmVzBQpjdXJyZW50UmVzDXRlcnJhaW5Db3VudHMJZGVsdGFUaW1lDWxhbmRTaXplSW5kZXgXZGFpbHlCeVBpZWNlV2l0aEJvbnVzZXMKAQVhZGRlcgIDYWNjAWkECXJlc09mVHlwZQkAaAIJAGgCCQBrAwUJZGVsdGFUaW1lBRdkYWlseUJ5UGllY2VXaXRoQm9udXNlcwUJREFZTUlMTElTCQCRAwIFDXRlcnJhaW5Db3VudHMFAWkFDWxhbmRTaXplSW5kZXgJAM0IAgUDYWNjCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKY3VycmVudFJlcwUBaQUJcmVzT2ZUeXBlBAFyCgACJGwFBUlURVI2CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAuQkCBQFyAgFfAQl2aXJ0Q2xhaW0EDXRlcnJhaW5Db3VudHMJZGVsdGFUaW1lDWxhbmRTaXplSW5kZXgXZGFpbHlCeVBpZWNlV2l0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ZGVsdGFDb250CQBpAgUGclRvdGFsCQBoAgUKREVDSU1BVElPTgUOTlVNX0NPTlRJTkVOVFMEDSR0MDIwMjM2MjA2NTUDAwkAZwIFD2NvbnRpbmVudFByZXNldAAACQBmAgUOTlVNX0NPTlRJTkVOVFMFD2NvbnRpbmVudFByZXNldAcJAJQKAgUPY29udGluZW50UHJlc2V0BQVzZWVkMAMJAAACBQZyVG90YWwAAAkBB2dlblJhbmQCBQ5OVU1fQ09OVElORU5UUwUFc2VlZDAEDSR0MDIwNDMwMjA0OTYJAQdnZW5SYW5kAgkAZAIFBnJUb3RhbAkAaAIFCWRlbHRhQ29udAUOTlVNX0NPTlRJTkVOVFMFBXNlZWQwBAFyCAUNJHQwMjA0MzAyMDQ5NgJfMQQDb3V0CAUNJHQwMjA0MzAyMDQ5NgJfMgoBBHN1YnICA2FjYwJlbAkAzQgCBQNhY2MJAGUCBQZtYXhTdW0FAmVsBAVjb21wbAoAAiRsBQhjb250U3VtcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEc3VicgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAlAoCCQEIZmluZFNsb3QDBQVjb21wbAUBcgUJZGVsdGFDb250BQNvdXQEB2NvbnRJZHgIBQ0kdDAyMDIzNjIwNjU1Al8xBAVzZWVkMQgFDSR0MDIwMjM2MjA2NTUCXzIEBnRhcmdldAkAkQMCBRV0YXJnZXRGcmVxQnlDb250aW5lbnQFB2NvbnRJZHgEBmFjdHVhbAkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJARZrZXlSZXNUeXBlc0J5Q29udGluZW50AQkAkQMCBQpjb250aW5lbnRzBQdjb250SWR4AgswXzBfMF8wXzBfMAIBXwoBBnRvSW50cwIDYWNjAmVsCQDNCAIFA2FjYwkBDXBhcnNlSW50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cnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFC3ZvbE9jY3VwaWVkBQp3aE9jY3VwaWVkCQC5CQIJAMwIAgkApAMBBQh3aExvY2tlZAkAzAgCCQCkAwEFA29jYwkAzAgCCQCkAwEJAGUCCQBlAgUHd2hUb3RhbAUId2hMb2NrZWQFA29jYwkAzAgCCQCkAwEFB3doVG90YWwFA25pbAIBXwkAzAgCCQCRAwIFAndoBQt3aElkeExldmVscwkAzAgCAwkAAAIJAJADAQkAtQkCCQCRAwIFAndoBQh3aElkeFJlcwIBXwUGTlVNUkVTCQCRAwIFAndoBQh3aElkeFJlcwILMF8wXzBfMF8wXzAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQJ3aAUId2hJZHhNYXQCAV8FBk5VTVJFUwkAkQMCBQJ3aAUId2hJZHhNYXQCCzBfMF8wXzBfMF8wCQDMCAIJAJEDAgUCd2gFCXdoSWR4UHJvZAkAzAgCBQZ3aExvZnQFA25pbAEVZ2V0V2FyZWhvdXNlU3BhY2VMZWZ0AQljdXJyZW50V2gEC29jY3VwaWVkVm9sCQEXZ2V0V2FyZWhvdXNlT2NjdXBpZWRWb2wBBQljdXJyZW50V2gED2N1cnJXaExvY2tlZFZvbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAIBXwUJdm9sTG9ja2VkCQBlAgkAZQIJARdnZXRXYXJlaG91c2VUb3RhbFZvbHVtZQEJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwULb2NjdXBpZWRWb2wFD2N1cnJXaExvY2tlZFZvbAEJbW92ZVN0dWZmAwpjYXJnb1BhcnRzCWN1cnJlbnRXaAtjdXJyZW50UGFjawMJAQIhPQIJAJADAQUKY2FyZ29QYXJ0cwADCQACAQI0Y2FyZ29MaXN0U3RyIHNob3VsZCBjb250YWluIGV4YWN0bHkgMiAnOicgc2VwYXJhdG9ycwQIcmVzUGFydHMJALUJAgkAkQMCBQpjYXJnb1BhcnRzAAACAV8ECG1hdFBhcnRzCQC1CQIJAJEDAgUKY2FyZ29QYXJ0cwABAgFfBAlwcm9kUGFydHMDCQAAAgkAkQMCBQpjYXJnb1BhcnRzAAICAAUDbmlsCQC8CQIJAJEDAgUKY2FyZ29QYXJ0cwACAgFfAwkBAiE9AgkAkAMBBQhyZXNQYXJ0cwUGTlVNUkVTCQACAQIgQWxsIDYgcmVzb3VyY2VzIHNob3VsZCBiZSBwYXNzZWQDCQECIT0CCQCQAwEFCG1hdFBhcnRzBQZOVU1SRVMJAAIBAiBBbGwgNiBtYXRlcmlhbHMgc2hvdWxkIGJlIHBhc3NlZAQLd2hTcGFjZUxlZnQJARVnZXRXYXJlaG91c2VTcGFjZUxlZnQBBQljdXJyZW50V2gECWN1cnJXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8ECWN1cnJXaE1hdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQCAV8ECmN1cnJXaFByb2QDCQAAAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAIBXwQOY3VycmVudFBhY2tSZXMJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8EDmN1cnJlbnRQYWNrTWF0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBA9jdXJyZW50UGFja1Byb2QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8KAQNtdlICA2FjYwRpdGVtBAFpCAUDYWNjAl8xBAJhbQkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAN3aHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQljdXJyV2hSZXMFAWkEA2JwcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmN1cnJlbnRQYWNrUmVzBQFpAwkAAAIFAmFtAAAJAJYKBAkAZAIFAWkAAQkAzQgCCAUDYWNjAl8yCQCRAwIFCWN1cnJXaFJlcwUBaQkAzQgCCAUDYWNjAl8zCQCRAwIFDmN1cnJlbnRQYWNrUmVzBQFpCAUDYWNjAl80AwkAZgIFAmFtAAADCQBmAgUCYW0FA2JwcgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtl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SWQECHVzZXJBZGRyCQClCAEFBmNhbGxlcgQGYmlnTnVtCQEDYWJzAQkAngMBBQR0eElkBAdmcmVlTnVtCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlOZXh0RnJlZUxhbmROdW0ACQBkAgUPUFJFU0FMRU5VTUxBTkRTAAEEB2xhbmROdW0JAKQDAQUHZnJlZU51bQQMY29udGluZW50SWR4CQCgAwEJALsCAgUGYmlnTnVtBQVGSVZFWAQIdGVycmFpbnMJAQtnZW5UZXJyYWlucwIFBmJpZ051bQUMY29udGluZW50SWR4BAljb250aW5lbnQJAJEDAgUKY29udGluZW50cwUMY29udGluZW50SWR4BAVpc3N1ZQkAwggFCQEHbmZ0TmFtZQIFB2xhbmROdW0CAVMJALkJAgkAzAgCBQdsYW5kTnVtCQDMCAICAVMJAMwIAgUIdGVycmFpbnMJAMwIAgUJY29udGluZW50BQNuaWwCAV8AAQAABwQHYXNzZXRJZAkAuAgBBQVpc3N1ZQQCaWQJANgEAQUHYXNzZXRJZAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5TmV4dEZyZWVMYW5kTnVtAAkAZAIFB2ZyZWVOdW0AAQkAzAgCBQVpc3N1ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEQa2V5TGFuZFRvQXNzZXRJZAEFB2xhbmROdW0FAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQJpZAUIdXNlckFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhbmROdW1Ub093bmVyAQUHbGFuZE51bQUIdXNlckFkZHIJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQUCaWQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHmtleUluZnJhTGV2ZWxCeUFzc2V0SWRBbmRPd25lcgIFAmlkBQh1c2VyQWRkcgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgABBQdhc3NldElkBQNuaWwJAJQKAgUCaWQFCWNvbnRpbmVudAEMZmxpZ2h0Q29tbW9uAwh1c2VyQWRkcgdtZXNzYWdlA3NpZwMJAQEhAQkAxBMDBQdtZXNzYWdlBQNzaWcFA3B1YgkAAgECGHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaAQFcGFydHMJALwJAgkAsAkBBQdtZXNzYWdlAgE7BAlmbGlnaHRMb2cJALwJAgkAkQMCBQVwYXJ0cwAAAgF8BAJocAkAtQkCCQCRAwIFCWZsaWdodExvZwUIZmxIZWFsdGgCAV8EBWN1ckhQCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCaHAAAAQFbmV3SFAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJocAABBAtuZXdMb2NUeFZlcgkAtQkCCQCRAwIFBXBhcnRzAAECAToEC25ld0xvY2F0aW9uCQCRAwIFC25ld0xvY1R4VmVyAAAEBHRpbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlmbGlnaHRMb2cFC2ZsVGltZXN0YW1wAwMJAGYCBQR0aW1lCQBkAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFEUZJVkVNSU5VVEVTTUlMTElTBgkAZgIJAGUCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAURRklWRU1JTlVURVNNSUxMSVMFBHRpbWUJAAIBCQCsAgIJAKwCAgkArAICAhxzaWduYXR1cmUgb3V0ZGF0ZWQ6IGxvZ1RpbWU9CQCkAwEFBHRpbWUCCSwgYmNUaW1lPQkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJdHhGcm9tTXNnCQCRAwIFC25ld0xvY1R4VmVyAAEEBmxhc3RUeAkBC3ZhbHVlT3JFbHNlAgkAoggBCQERa2V5TGFzdFR4SWRCeVVzZXIBBQh1c2VyQWRkcgIAAwkBAiE9AgUGbGFzdFR4BQl0eEZyb21Nc2cJAAIBCQCsAgIJAKwCAgkArAICAh5UeCBpZHMgZG9uJ3QgbWF0Y2ghIEluIHN0YXRlOiAFBmxhc3RUeAIKLCBpbiBtc2c6IAUJdHhGcm9tTXNnBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFCHVzZXJBZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAlrZXlIZWFsdGgJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQEBW1heEhQCQEJbWF4SGVhbHRoAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEMa2V5RHVja0xldmVsAQULZHVja0Fzc2V0SWQAAAQMb2xkRnJvbVN0YXRlCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aAUFbWF4SFADCQECIT0CBQxvbGRGcm9tU3RhdGUFBWN1ckhQCQACAQkArAICCQCsAgIJAKwCAgIKb2xkSGVhbHRoPQkApAMBBQxvbGRGcm9tU3RhdGUCLyBmcm9tIHN0YXRlIGRvZXMgbm90IG1hdGNoIG9uZSBmcm9tIGZsaWdodCBsb2c9CQCkAwEFBWN1ckhQAwkAZwIAAAUFY3VySFAJAAIBAh5Zb3UgY2FuJ3QgZmx5IHdpdGggemVybyBoZWFsdGgDCQEBIQEJARdjYW5XZWFyQ3VycmVudEVxdWlwbWVudAEFC2R1Y2tBc3NldElkCQACAQIWRXF1aXBtZW50IGluY29tcGF0aWJsZQQFYm9udXMDCQBmAgkAkAMBBQlmbGlnaHRMb2cFB2ZsQm9udXMJAJEDAgUJZmxpZ2h0TG9nBQdmbEJvbnVzAgAECHByb2RVc2VkAwkAZgIJAJADAQUJZmxpZ2h0TG9nBQtmbFByb2RzVXNlZAkAkQMCBQlmbGlnaHRMb2cFC2ZsUHJvZHNVc2VkAgAECnNlbnRBbW91bnQDAwkAZgIFBW5ld0hQAAAJAAACBQVib251cwIBJAcJAQVhc0ludAEJAPwHBAUMcmVzdENvbnRyYWN0Ag1zZW5kVXNkdFByaXplCQDMCAIFCHVzZXJBZGRyBQNuaWwFA25pbAAACQCXCgUFBW5ld0hQBQtkdWNrQXNzZXRJZAUKc2VudEFtb3VudAULbmV3TG9jYXRpb24FCHByb2RVc2VkAQxhcHBseUJvbnVzZXMCC2xhbmRBc3NldElkBnBpZWNlcwQKaW5mcmFMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAAAECWFydFBpZWNlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEga2V5TGFuZEFydFN0YXR1c0J5VHlwZUFuZEFzc2V0SWQCBQpBUlRQUkVTQUxFBQtsYW5kQXNzZXRJZAAABARhZGQ2CQBpAgUKaW5mcmFMZXZlbAAGBARhZGQ3CQBpAgUKaW5mcmFMZXZlbAAHCQBkAgkAZAIFD0RBSUxZUkVTQllQSUVDRQkAawMFD0RBSUxZUkVTQllQSUVDRQkAZAIJAGQCBQppbmZyYUxldmVsBQRhZGQ2CQBoAgACBQRhZGQ3AAUJAGsDBQ9EQUlMWVJFU0JZUElFQ0UFCWFydFBpZWNlcwkAaAIFBnBpZWNlcwAFARRjaGVja0NsYWltQ29uZGl0aW9ucwMEYWRkcgljbGFpbU1vZGUNbGFuZEFzc2V0SWRJbgQNJHQwMzY2MzYzNzE3NQMJAAACBQljbGFpbU1vZGUFC2NsYWltTW9kZVdoCQCUCgIFDWxhbmRBc3NldElkSW4JAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUEYWRkcgIABAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCiCAEJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OBANsb2MJALUJAgkBBXZhbHVlAQULY3VyTG9jYXRpb24CAV8DCQECIT0CCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBTAkAAgEJAKwCAgkArAICAhZEdWNrIGxvY2F0aW9uIHR5cGUgaXMgCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIRLCBidXQgc2hvdWxkIGJlIEwJAJQKAgkAkQMCBQNsb2MFCGxvY0lkeElkBQtkdWNrQXNzZXRJZAQLbGFuZEFzc2V0SWQIBQ0kdDAzNjYzNjM3MTc1Al8xBAZkdWNrSWQIBQ0kdDAzNjYzNjM3MTc1Al8yBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkBAlzYXZlZFRpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQd0aW1lS2V5CQCsAgIJAKwCAgIFTGFuZCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFBGFkZHIJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMEAWQJALUJAggFBWFzc2V0C2Rlc2NyaXB0aW9uAgFfCQCWCgQFBmR1Y2tJZAULbGFuZEFzc2V0SWQFAWQFCXNhdmVkVGltZQEQY2xhaW1SZXNJbnRlcm5hbAQEYWRkcgZhbW91bnQJY2xhaW1Nb2RlDWxhbmRBc3NldElkSW4DCQBmAgAABQZhbW91bnQJAAIBAg9OZWdhdGl2ZSBhbW91bnQEAWMJARRjaGVja0NsYWltQ29uZGl0aW9ucwMFBGFkZHIFCWNsYWltTW9kZQUNbGFuZEFzc2V0SWRJbgQIbGFuZFNpemUJAJEDAggFAWMCXzMFC3JlY0xhbmRTaXplBA10ZXJyYWluQ291bnRzCQENY291bnRUZXJyYWlucwEJAJEDAggFAWMCXzMFC3JlY1RlcnJhaW5zBAlkZWx0YVRpbWUJAGUCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAgFAWMCXzQDCQBmAgAABQlkZWx0YVRpbWUJAAIBCQCsAgIJAKwCAgkArAICAiZTYXZlZCB0aW1lc3RhbXAgaXMgaW4gZnV0dXJlLCBzYXZlZCA9IAkApAMBCAUBYwJfNAIMLCBjdXJyZW50ID0gCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBBQhsYW5kU2l6ZQQWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQkBDGFwcGx5Qm9udXNlcwIIBQFjAl8yBQZwaWVjZXMECGF2YWlsUmVzCQBrAwUJZGVsdGFUaW1lCQBoAgUWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQUGcGllY2VzBQlEQVlNSUxMSVMDCQBmAgUGYW1vdW50BQhhdmFpbFJlcwkAAgEJAKwCAgkArAICCQCsAgICIk5vdCBlbm91Z2ggcmVzb3VyY2VzLCBhdmFpbGFibGUgPSAJAKQDAQUIYXZhaWxSZXMCDiwgcmVxdWVzdGVkID0gCQCkAwEFBmFtb3VudAQMbmV3RGVsdGFUaW1lCQBrAwkAZQIFCGF2YWlsUmVzBQZhbW91bnQFCURBWU1JTExJUwkAaAIFFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UFBnBpZWNlcwQMbmV3VGltZXN0YW1wCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFDG5ld0RlbHRhVGltZQQJbGFuZEluZGV4CQBpAgUGcGllY2VzBQVTU0laRQQKcmVzVG9DbGFpbQkBCXZpcnRDbGFpbQQFDXRlcnJhaW5Db3VudHMJAGUCBQlkZWx0YVRpbWUFDG5ld0RlbHRhVGltZQUJbGFuZEluZGV4BRZkYWlseVByb2R1Y3Rpb25CeVBpZWNlBAV3aEtleQkBEmtleVdhcmVob3VzZUJ5TGFuZAEIBQFjAl8yBAppbmZyYUxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQgFAWMCXzIAAAQJY3VycmVudFdoCQEMZ2V0V2FyZWhvdXNlAwUFd2hLZXkFCWxhbmRJbmRleAUKaW5mcmFMZXZlbAQEbG9mdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUAgFfBAt3aFNwYWNlTGVmdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFB3ZvbEZyZWUDAwkAAAIFCWNsYWltTW9kZQULY2xhaW1Nb2RlV2gJAGYCBQZhbW91bnQFC3doU3BhY2VMZWZ0BwkAAgEJAKwCAgkArAICAgVPbmx5IAkApAMBBQt3aFNwYWNlTGVmdAIYIHNwYWNlIGxlZnQgaW4gd2FyZWhvdXNlBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQgFAWMCXzEEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQOY3VycmVudFBhY2tSZXMJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMCAV8EDGN1cnJlbnRXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8EDSR0MDM5NTQ5NDA0MjADCQAAAgUJY2xhaW1Nb2RlBQtjbGFpbU1vZGVXaAkAlgoECQEGYWRkUmVzBQUMY3VycmVudFdoUmVzBQ10ZXJyYWluQ291bnRzCQBlAgUJZGVsdGFUaW1lBQxuZXdEZWx0YVRpbWUFCWxhbmRJbmRleAUWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAULdm9sT2NjdXBpZWQIBQpyZXNUb0NsYWltAl8yCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFB3ZvbEZyZWUIBQpyZXNUb0NsYWltAl8yAwkAAAIFCWNsYWltTW9kZQUNY2xhaW1Nb2RlRHVjawkAlgoECQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMJAQZhZGRSZXMFBQ5jdXJyZW50UGFja1JlcwUNdGVycmFpbkNvdW50cwkAZQIFCWRlbHRhVGltZQUMbmV3RGVsdGFUaW1lBQlsYW5kSW5kZXgFFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQt2b2xPY2N1cGllZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFB3ZvbEZyZWUEBWRpc3RyCQENZGlzdHJpYnV0ZVJlcwQFDGN1cnJlbnRXaFJlcwUOY3VycmVudFBhY2tSZXMFCnJlc1RvQ2xhaW0FC3doU3BhY2VMZWZ0BAR3aEFtCQCXAwEJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFB3ZvbEZyZWUJAMwIAggFCnJlc1RvQ2xhaW0CXzIFA25pbAkAlgoECAUFZGlzdHICXzEIBQVkaXN0cgJfMgkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQt2b2xPY2N1cGllZAUEd2hBbQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQd2b2xGcmVlBQR3aEFtBAV3aFJlcwgFDSR0MDM5NTQ5NDA0MjACXzEEBWJwUmVzCAUNJHQwMzk1NDk0MDQyMAJfMgQFbG9mdE8IBQ0kdDAzOTU0OTQwNDIwAl8zBAVsb2Z0RggFDSR0MDM5NTQ5NDA0MjACXzQJAJcKBQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBCAUBYwJfMgUMbmV3VGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkxBTkRQUkVGSVgIBQFjAl8yBQRhZGRyBQxuZXdUaW1lc3RhbXAFA25pbAUFYnBLZXkJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCBQVicFJlcwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAUFd2hLZXkJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIFBXdoUmVzCQDMCAIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAkAzAgCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kCQDMCAIJALkJAgkAzAgCCQCRAwIFBGxvZnQFCXZvbExvY2tlZAkAzAgCCQCkAwEFBWxvZnRPCQDMCAIJAKQDAQUFbG9mdEYJAMwIAgkAkQMCBQRsb2Z0BQh2b2xUb3RhbAUDbmlsAgFfBQNuaWwBCGNsYWltQWxsBARhZGRyC2xhbmRBc3NldElkBnBpZWNlcwljbGFpbU1vZGUEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQECXNhdmVkVGltZQkBBXZhbHVlAQkAnwgBBQd0aW1lS2V5BAhhdmFpbFJlcwkAaAIJAGsDCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFCXNhdmVkVGltZQkBDGFwcGx5Qm9udXNlcwIFC2xhbmRBc3NldElkBQZwaWVjZXMFCURBWU1JTExJUwUGcGllY2VzCQEQY2xhaW1SZXNJbnRlcm5hbAQFBGFkZHIFCGF2YWlsUmVzBQljbGFpbU1vZGUFC2xhbmRBc3NldElkAQ11cEluZnJhQ29tbW9uBAxzaG91bGRVc2VNYXQGY2FsbGVyDXBheW1lbnRBbW91bnQLbGFuZEFzc2V0SWQEBGFkZHIJAKUIAQUGY2FsbGVyBAFjCQEUY2hlY2tDbGFpbUNvbmRpdGlvbnMDBQRhZGRyBRNjbGFpbU1vZGVXaFRoZW5EdWNrBQtsYW5kQXNzZXRJZAQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCCAUBYwJfMwULcmVjTGFuZFNpemUECGluZnJhS2V5CQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEIBQFjAl8yBAhjdXJMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQhpbmZyYUtleQAAAwMJAQEhAQUYS1NfQUxMT1dfQklHX0lORlJBX01FUkdFCQBnAgUIY3VyTGV2ZWwAAwcJAAIBAiZDdXJyZW50bHkgbWF4IGluZnJhc3RydWN0dXJlIGxldmVsID0gMwQIbWF4SW5mcmEJAGQCCQBpAgkBBHNxcnQEBQZwaWVjZXMAAAAABQRET1dOAAUAAgQIbmV3TGV2ZWwJAGQCBQhjdXJMZXZlbAABAwMFGEtTX0FMTE9XX0JJR19JTkZSQV9NRVJHRQkAZgIFCG5ld0xldmVsBQhtYXhJbmZyYQcJAAIBCQCsAgICJUN1cnJlbnRseSBtYXggaW5mcmFzdHJ1Y3R1cmUgbGV2ZWwgPSAJAKQDAQUIbWF4SW5mcmEEBGNvc3QJAGsDBRVJbmZyYVVwZ3JhZGVDb3N0U1VzZHQJAGgCBQZwaWVjZXMFCG5ld0xldmVsBQVTU0laRQMDCQEBIQEFDHNob3VsZFVzZU1hdAkBAiE9AgUNcGF5bWVudEFtb3VudAUEY29zdAcJAAIBCQCsAgICG1BheW1lbnQgYXR0YWNoZWQgc2hvdWxkIGJlIAkApAMBBQRjb3N0BAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQgFAWMCXzEEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQFbUxpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8EB21hdFVzZWQJAGsDBRFJbmZyYVVwZ3JhZGVDb3N0UwkAaAIFBnBpZWNlcwUIbmV3TGV2ZWwFBVNTSVpFBAZuZXdNYXQJALkJAgkBEXN1YnRyYWN0TWF0ZXJpYWxzAwUMc2hvdWxkVXNlTWF0BQVtTGlzdAUHbWF0VXNlZAIBXwQLY2xhaW1SZXN1bHQJAQhjbGFpbUFsbAQFBGFkZHIIBQFjAl8yBQZwaWVjZXMFE2NsYWltTW9kZVdoVGhlbkR1Y2sEBndoRGF0YQgFC2NsYWltUmVzdWx0Al81BAZvbGRWb2wJARdnZXRXYXJlaG91c2VUb3RhbFZvbHVtZQEJAJEDAgUGd2hEYXRhBQt3aElkeExldmVscwQKbmV3Vm9sRGF0YQkAuQkCCQDMCAIJAJEDAgkAtQkCCQCRAwIFBndoRGF0YQULd2hJZHhMZXZlbHMCAV8AAAkAzAgCCQCkAwEFCG5ld0xldmVsBQNuaWwCAV8EBm5ld1ZvbAkBF2dldFdhcmVob3VzZVRvdGFsVm9sdW1lAQUKbmV3Vm9sRGF0YQQEbG9mdAkAtQkCCQCRAwIFBndoRGF0YQUJd2hJZHhMT0ZUAgFfBApuZXdMb2Z0U3RyCQC5CQIJAMwIAgkAkQMCBQRsb2Z0BQl2b2xMb2NrZWQJAMwIAgkAkQMCBQRsb2Z0BQt2b2xPY2N1cGllZAkAzAgCCQCkAwEJAGUCCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFB3ZvbEZyZWUFBm5ld1ZvbAUGb2xkVm9sCQDMCAIJAKQDAQUGbmV3Vm9sBQNuaWwCAV8JAJUKAwkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQhpbmZyYUtleQUIbmV3TGV2ZWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAR5rZXlJbmZyYUxldmVsQnlBc3NldElkQW5kT3duZXICCAUBYwJfMgUEYWRkcgUIbmV3TGV2ZWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUFYnBLZXkJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAggFC2NsYWltUmVzdWx0Al8zBQhicElkeFJlcwkAzAgCBQZuZXdNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToJAMwIAgkBC1N0cmluZ0VudHJ5AggFC2NsYWltUmVzdWx0Al80CQC5CQIJAMwIAgUKbmV3Vm9sRGF0YQkAzAgCCQCRAwIFBndoRGF0YQUId2hJZHhSZXMJAMwIAgkAkQMCBQZ3aERhdGEFCHdoSWR4TWF0CQDMCAIJAJEDAgUGd2hEYXRhBQl3aElkeFByb2QJAMwIAgUKbmV3TG9mdFN0cgUDbmlsAgE6BQNuaWwIBQtjbGFpbVJlc3VsdAJfMQUIbmV3TGV2ZWwFB21hdFVzZWQBE3VwZGF0ZVN0YXRzSW50ZXJuYWwEBmx2bEtleQV4cEtleQlwb2ludHNLZXkHZGVsdGFYUAQCeHAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUFeHBLZXkAAAQFbmV3WFAJAGQCBQJ4cAUHZGVsdGFYUAQJbHZsUG9pbnRzCQEHbGV2ZWxVcAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUGbHZsS2V5AAAFBW5ld1hQCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFBmx2bEtleQkAkQMCBQlsdmxQb2ludHMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUFeHBLZXkFBW5ld1hQCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlwb2ludHNLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCXBvaW50c0tleQAACQCRAwIFCWx2bFBvaW50cwABBQNuaWwFBW5ld1hQARd1cGRhdGVEdWNrU3RhdHNJbnRlcm5hbAILZHVja0Fzc2V0SWQHZGVsdGFYUAkBE3VwZGF0ZVN0YXRzSW50ZXJuYWwECQEMa2V5RHVja0xldmVsAQULZHVja0Fzc2V0SWQJAQlrZXlEdWNrWFABBQtkdWNrQXNzZXRJZAkBEWtleUR1Y2tGcmVlUG9pbnRzAQULZHVja0Fzc2V0SWQFB2RlbHRhWFABFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCBGFkZHIHZGVsdGFYUAkBE3VwZGF0ZVN0YXRzSW50ZXJuYWwECQEMa2V5VXNlckxldmVsAQUEYWRkcgkBCWtleVVzZXJYUAEFBGFkZHIJARFrZXlVc2VyRnJlZVBvaW50cwEFBGFkZHIFB2RlbHRhWFABEmFjdGl2YXRlT25ib2FyZEFydAEEYWRkcgQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAhyZWZCeUtleQkBD2tleUFkZHJlc3NSZWZCeQEFBGFkZHIEBXJlZkJ5CQCiCAEFCHJlZkJ5S2V5AwkBASEBCQEJaXNEZWZpbmVkAQUFcmVmQnkJAAIBAilZb3UgYXJlIG5vdCBlbGlnaWJsZSBmb3IgT05CT0FSRCBhcnRpZmFjdAQGYXJ0S2V5CQEca2V5T25ib2FyZEFydER1Y2tBY3RpdmF0ZWRCeQEFBGFkZHIEB2FydER1Y2sJAKIIAQUGYXJ0S2V5AwkBCWlzRGVmaW5lZAEFB2FydER1Y2sJAAIBCQCsAgICL1lvdSBhbHJlYWR5IHVzZWQgeW91ciBPTkJPQVJEIGFydGlmYWN0IG9uIGR1Y2sgCQEFdmFsdWUBBQdhcnREdWNrBBBkdWNrQWN0aXZhdG9yS2V5CQEca2V5T25ib2FyZEFydEFjdGl2YXRlZE9uRHVjawEFC2R1Y2tBc3NldElkBA1kdWNrQWN0aXZhdG9yCQCiCAEFEGR1Y2tBY3RpdmF0b3JLZXkDCQEJaXNEZWZpbmVkAQUNZHVja0FjdGl2YXRvcgkAAgEJAKwCAgkArAICCQCsAgICCVRoZSBkdWNrIAULZHVja0Fzc2V0SWQCNCBhbHJlYWR5IGdvdCBwb2ludHMgZnJvbSBPTkJPQVJEIGFydGlmYWN0IGZyb20gdXNlciAJAQV2YWx1ZQEFDWR1Y2tBY3RpdmF0b3IJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQZhcnRLZXkFC2R1Y2tBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFEGR1Y2tBY3RpdmF0b3JLZXkFBGFkZHIFA25pbAgJARd1cGRhdGVEdWNrU3RhdHNJbnRlcm5hbAIFC2R1Y2tBc3NldElkBQl4cE9uYm9hcmQCXzEBEmFjdGl2YXRlUHJlc2FsZUFydAIEYWRkcg1sYW5kQXNzZXRJZEluBAFjCQEUY2hlY2tDbGFpbUNvbmRpdGlvbnMDBQRhZGRyBRNjbGFpbU1vZGVXaFRoZW5EdWNrBQ1sYW5kQXNzZXRJZEluBAtsYW5kQXNzZXRJZAgFAWMCXzIEBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAggFAWMCXzMFC3JlY0xhbmRTaXplBA1hY3RpdmF0aW9uS2V5CQEga2V5TGFuZEFydFN0YXR1c0J5VHlwZUFuZEFzc2V0SWQCBQpBUlRQUkVTQUxFBQtsYW5kQXNzZXRJZAMJAGYCCQELdmFsdWVPckVsc2UCCQCfCAEFDWFjdGl2YXRpb25LZXkAAAAACQACAQIlUHJlc2FsZSBhcnRpZmFjdCBpcyBhbHJlYWR5IGFjdGl2YXRlZAMJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAggFAWMCXzMFCnJlY0xhbmROdW0FD1BSRVNBTEVOVU1MQU5EUwkAAgEJAKwCAgkArAICCQCsAgIFCkxBTkRQUkVGSVgCASAFC2xhbmRBc3NldElkAiUgaXMgbm90IGVsaWdpYmxlIGZvciBwcmVzYWxlIGFydGlmYWN0BAtjbGFpbVJlc3VsdAkBCGNsYWltQWxsBAUEYWRkcgULbGFuZEFzc2V0SWQFBnBpZWNlcwUTY2xhaW1Nb2RlV2hUaGVuRHVjawkAzQgCCQDNCAIJAM0IAggFC2NsYWltUmVzdWx0Al8xCQEMSW50ZWdlckVudHJ5AgUNYWN0aXZhdGlvbktleQUGcGllY2VzCQELU3RyaW5nRW50cnkCCAULY2xhaW1SZXN1bHQCXzIJALkJAggFC2NsYWltUmVzdWx0Al8zAgE6CQELU3RyaW5nRW50cnkCCAULY2xhaW1SZXN1bHQCXzQJALkJAggFC2NsYWltUmVzdWx0Al81AgE6AQ9jaGVja1RvdXJuYW1lbnQBC2R1Y2tBc3NldElkBAZsYXN0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSdG91cm5hbWVudENvbnRyYWN0BQ1sYXN0VG91cklkS2V5AAAEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8EA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEBXREYXRhCQELZ2V0VG91ckRhdGECBRJ0b3VybmFtZW50Q29udHJhY3QFBmxhc3RJZAQGc3RhdGljCQCRAwIFBXREYXRhBQlpZHhTdGF0aWMEB2R5bmFtaWMJAJEDAgUFdERhdGEFCmlkeER5bmFtaWMDCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFUBwMDAwkAAAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BQZsYXN0SWQJAAACCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzAgpJTlBST0dSRVNTBwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFCnRTdGF0aWNFbmQFA25vdwcJAAIBAipZb3VyIGR1Y2sgaXMgdGFraW5nIHBhcnQgaW4gdGhlIHRvdXJuYW1lbnQJAQlhc0Jvb2xlYW4BCQD8BwQFBHRoaXMCFmV4aXRUb3VybmFtZW50SW50ZXJuYWwJAMwIAgULZHVja0Fzc2V0SWQFA25pbAUDbmlsAQ1jaGVja0RlbGl2ZXJ5AQtkdWNrQXNzZXRJZAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgIBXwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAQIhPQIJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUCAUQHBAlzdGFydFRpbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BAhkaXN0YW5jZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAMDCQBmAgkAZAIFCXN0YXJ0VGltZQUSVEVOX01JTlVURVNfTUlMTElTBQNub3cJAGYCAAEFCGRpc3RhbmNlBwkAAgECIFlvdXIgZHVjayBpcyBvbiBkZWxpdmVyeSBtaXNzaW9uCQEJYXNCb29sZWFuAQkA/AcEBQR0aGlzAhRleGl0RGVsaXZlcnlJbnRlcm5hbAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsBQNuaWwBEmV4aXREZWxpdmVyeUNvbW1vbgQLZHVja0Fzc2V0SWQFY2hlY2sFbmV3SFAFc2NvcmUEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8EA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECXN0YXJ0VGltZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ckxvY2F0aW9uBQ9sb2NJZHhDb250aW5lbnQECGRpc3RhbmNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARBrZXlEdWNrSWRUb093bmVyAQULZHVja0Fzc2V0SWQCFE5GVCBkdWNrIGlzIG9ycGhhbmVkBAloZWFsdGhLZXkJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQECWN1ckhlYWx0aAkBEUBleHRyTmF0aXZlKDEwNTUpAQUJaGVhbHRoS2V5BA5vdXRjb21lQWN0aW9ucwMDCQBmAgUIZGlzdGFuY2UAAAYDAwUFY2hlY2sJAGYCBQVzY29yZQAABwkAZgIFBW5ld0hQAAAHBAZyZXdhcmQJAPwHBAUPZWNvbm9teUNvbnRyYWN0AhJzZW5kRGVsaXZlcnlSZXdhcmQJAMwIAgUFb3duZXIFA25pbAUDbmlsAwkAAAIFBnJld2FyZAUGcmV3YXJkBAhjb3VudEtleQkBFGtleVVzZXJEZWxpdmVyeUNvdW50AQUFb3duZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFCGNvdW50S2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQhjb3VudEtleQAAAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVc2VyTGFzdERlbGl2ZXJ5RGF5AQUFb3duZXIJAGkCBQlzdGFydFRpbWUFCURBWU1JTExJUwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwMDBQVjaGVjawkAZgIFBW5ld0hQAAAHCQBmAgkAZAIFCXN0YXJ0VGltZQUSVEVOX01JTlVURVNfTUlMTElTBQNub3cHCQACAQImWW91ciBkdWNrIGlzIHN0aWxsIG9uIGRlbGl2ZXJ5IG1pc3Npb24EC2xvY2tlZFRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIFD2Vjb25vbXlDb250cmFjdAURZGVsaXZlcnlMb2NrZWRLZXkAAAQGdW5sb2NrCQD8BwQFD2Vjb25vbXlDb250cmFjdAIUdXBkYXRlRGVsaXZlcnlMb2NrZWQJAMwIAgkAZQIFC2xvY2tlZFRvdGFsBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFA25pbAUDbmlsAwkAAAIFBnVubG9jawUGdW5sb2NrAwMDBQVjaGVjawkAZwIAAAUFbmV3SFAHBgkAZwIAAAUJY3VySGVhbHRoBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlEZWxpdmVyeURlbGF5QnlEdWNrAQULZHVja0Fzc2V0SWQJAGQCBQlzdGFydFRpbWUFE0RFTElWRVJZX1BVTklTSE1FTlQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNc2F2ZWRMb2NhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTgpAQkBEGtleVNhdmVkTG9jYXRpb24BBQtkdWNrQXNzZXRJZAkAlQoDBQ5vdXRjb21lQWN0aW9ucwkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFDXNhdmVkTG9jYXRpb24FA25pbAUNc2F2ZWRMb2NhdGlvbgENbWVyZ2VJbnRlcm5hbAYLbmV3TGFuZFNpemUIbmV3TGV2ZWwHZm9ybXVsYQRhZGRyDGxhbmRBc3NldElkcwduZWVkTWF0BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQEPY2hlY2tUb3VybmFtZW50AQULZHVja0Fzc2V0SWQJAAIBAh1tZXJnZUludGVybmFsX2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQJAAIBAhttZXJnZUludGVybmFsX2NoZWNrRGVsaXZlcnkKAQpjaGVja01lcmdlAgNhY2MLbGFuZEFzc2V0SWQEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQECXNhdmVkVGltZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFB3RpbWVLZXkJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAFkCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwQJY29udGluZW50CQCRAwIFAWQFDHJlY0NvbnRpbmVudAMDCQECIT0CCAUDYWNjAl8zAgAJAQIhPQIIBQNhY2MCXzMFCWNvbnRpbmVudAcJAAIBAi5MYW5kcyBzaG91bGQgYmUgb24gdGhlIHNhbWUgY29udGluZW50IHRvIG1lcmdlBAhsYW5kU2l6ZQkAkQMCBQFkBQtyZWNMYW5kU2l6ZQQHc2l6ZXNJbggFA2FjYwJfMQQBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCzCQIFB3NpemVzSW4FCGxhbmRTaXplAidZb3UgaGF2ZW4ndCBwYXNzZWQgYWxsIHRoZSBsYW5kcyBuZWVkZWQECHNpemVzT3V0CQCsAgIJAK8CAgUHc2l6ZXNJbgUBaQkAsAICBQdzaXplc0luCQBkAgUBaQABBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBBQhsYW5kU2l6ZQQEYXJ0cwkAZAIIBQNhY2MCXzIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQAAAQKaW5mcmFMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAAAECHJlcUxldmVsBAckbWF0Y2gwBQhsYW5kU2l6ZQMJAAACAgFTBQckbWF0Y2gwAAMDCQAAAgIBTQUHJG1hdGNoMAAEAwkAAAICAUwFByRtYXRjaDAABQMJAAACAgJYTAUHJG1hdGNoMAAGCQACAQIaT25seSBTLCBNLCBMLCBYTCBjYW4gbWVyZ2UDCQECIT0CBQppbmZyYUxldmVsBQhyZXFMZXZlbAkAAgECIkFsbCBsYW5kcyBzaG91bGQgYmUgbWF4ZWQgdG8gbWVyZ2UEB2xhbmROdW0JAJEDAgUBZAUKcmVjTGFuZE51bQQNdGVycmFpbkNvdW50cwkBDWNvdW50VGVycmFpbnMBCQCRAwIFAWQFC3JlY1RlcnJhaW5zBAlkZWx0YVRpbWUJAGUCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUJc2F2ZWRUaW1lAwkAZgIAAAUJZGVsdGFUaW1lCQACAQkArAICCQCsAgIJAKwCAgImU2F2ZWQgdGltZXN0YW1wIGlzIGluIGZ1dHVyZSwgc2F2ZWQgPSAJAKQDAQUJc2F2ZWRUaW1lAgwsIGN1cnJlbnQgPSAJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAEFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UJAQxhcHBseUJvbnVzZXMCBQtsYW5kQXNzZXRJZAUGcGllY2VzBAlsYW5kSW5kZXgJAGkCBQZwaWVjZXMFBVNTSVpFBAVicFJlcwkBBmFkZFJlcwUJALUJAggFA2FjYwJfNAIBXwUNdGVycmFpbkNvdW50cwUJZGVsdGFUaW1lBQlsYW5kSW5kZXgFFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UEBXByb3BzCQEZdXBkYXRlUHJvcG9ydGlvbnNJbnRlcm5hbAQIBQNhY2MCXzYFDXRlcnJhaW5Db3VudHMFCWxhbmRJbmRleAD///////////8BBAZjUHJvcHMJARl1cGRhdGVQcm9wb3J0aW9uc0ludGVybmFsBAgFA2FjYwNfMTAFDXRlcnJhaW5Db3VudHMFCWxhbmRJbmRleAD///////////8BBAtzdW1UZXJyYWlucwkBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwECAUDYWNjAl85BQ10ZXJyYWluQ291bnRzBQlsYW5kSW5kZXgAAQQFbGFuZHMIBQNhY2MCXzcEA2lkeAkAzwgCBQVsYW5kcwULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBBQNpZHgJAAIBCQCsAgICIFlvdXIgc3Rha2VkIGxhbmRzIGRvbid0IGNvbnRhaW4gBQtsYW5kQXNzZXRJZAQJY3VzdG9tS2V5CQEaa2V5TGFuZEFzc2V0SWRUb0N1c3RvbU5hbWUBBQtsYW5kQXNzZXRJZAQKY3VzdG9tTmFtZQkBC3ZhbHVlT3JFbHNlAgkAoggBBQljdXN0b21LZXkCAAkAnAoKBQhzaXplc091dAUEYXJ0cwUJY29udGluZW50BQVicFJlcwkAzggCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAggFA2FjYwJfNQkBC0RlbGV0ZUVudHJ5AQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkBC0RlbGV0ZUVudHJ5AQkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpMQU5EUFJFRklYBQtsYW5kQXNzZXRJZAUEYWRkcgkBC0RlbGV0ZUVudHJ5AQkBEGtleUxhbmRUb0Fzc2V0SWQBBQdsYW5kTnVtCQELRGVsZXRlRW50cnkBCQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAQtEZWxldGVFbnRyeQEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAQtEZWxldGVFbnRyeQEJAR5rZXlJbmZyYUxldmVsQnlBc3NldElkQW5kT3duZXICBQtsYW5kQXNzZXRJZAUEYWRkcgkBC0RlbGV0ZUVudHJ5AQkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQJAQtEZWxldGVFbnRyeQEJARFrZXlMYW5kTnVtVG9Pd25lcgEFB2xhbmROdW0JAQtEZWxldGVFbnRyeQEJARJrZXlXYXJlaG91c2VCeUxhbmQBBQtsYW5kQXNzZXRJZAkBC0RlbGV0ZUVudHJ5AQUJY3VzdG9tS2V5CQEEQnVybgIJANkEAQULbGFuZEFzc2V0SWQAAQMJAQIhPQIFCmN1c3RvbU5hbWUCAAkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5TGFuZEN1c3RvbU5hbWVUb0Fzc2V0SWQBBQpjdXN0b21OYW1lBQNuaWwFA25pbAUFcHJvcHMJANEIAgUFbGFuZHMJAQV2YWx1ZQEFA2lkeAkAZAIIBQNhY2MCXzgFBnBpZWNlcwULc3VtVGVycmFpbnMFBmNQcm9wcwQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkECHByb3BMaXN0CQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBEWtleVJlc1Byb3BvcnRpb25zAAILMF8wXzBfMF8wXzACAV8ECGxhbmRzS2V5CQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUEYWRkcgQIbGFuZHNTdHIJAKIIAQUIbGFuZHNLZXkEB2xhbmRzSW4DCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIJAL0JAgkBBXZhbHVlAQUIbGFuZHNTdHICAV8FA25pbAQFY29udDAJAJEDAgkAtQkCCAkBBXZhbHVlAQkA7AcBCQDZBAEJAJEDAgUMbGFuZEFzc2V0SWRzAAALZGVzY3JpcHRpb24CAV8FDHJlY0NvbnRpbmVudAQJY29udFByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFmtleVJlc1R5cGVzQnlDb250aW5lbnQBBQVjb250MAILMF8wXzBfMF8wXzACAV8EAXIKAAIkbAUMbGFuZEFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAnAoKBQdmb3JtdWxhAAACAAkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMFA25pbAUIcHJvcExpc3QFB2xhbmRzSW4AAAkAtQkCAgswXzBfMF8wXzBfMAIBXwUJY29udFByb3BzCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpjaGVja01lcmdlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQJY29udGluZW50CAUBcgJfMwQMY29udGluZW50SWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUKY29udGluZW50cwUJY29udGluZW50CQCsAgICE1Vua25vd24gY29udGluZW50OiAFCWNvbnRpbmVudAQIdGVycmFpbnMJARNnZW5UZXJyYWluc0Zvck1lcmdlAggFAXICXzkJAGkCCQEPbnVtUGllY2VzQnlTaXplAQULbmV3TGFuZFNpemUFBVNTSVpFBAdmcmVlTnVtCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlOZXh0RnJlZUxhbmROdW0ACQBkAgUPUFJFU0FMRU5VTUxBTkRTAAEECm5ld0xhbmROdW0JAKQDAQUHZnJlZU51bQQFaXNzdWUJAMIIBQkBB25mdE5hbWUCBQpuZXdMYW5kTnVtBQtuZXdMYW5kU2l6ZQkAuQkCCQDMCAIFCm5ld0xhbmROdW0JAMwIAgULbmV3TGFuZFNpemUJAMwIAgUIdGVycmFpbnMJAMwIAgUJY29udGluZW50BQNuaWwCAV8AAQAABwQHYXNzZXRJZAkAuAgBBQVpc3N1ZQQObmV3TGFuZEFzc2V0SWQJANgEAQUHYXNzZXRJZAQGbmV3TWF0CQC5CQIJARFzdWJ0cmFjdE1hdGVyaWFscwMJAGYCBQduZWVkTWF0AAAJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8FB25lZWRNYXQCAV8ECXBpZWNlc0tleQkBFmtleVN0YWtlZFBpZWNlc0J5T3duZXIBBQRhZGRyBAxzdGFrZWRQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJcGllY2VzS2V5AAAJAJQKAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAggFAXICXzUDCQBmAgkAkAMBCAUBcgJfNwAACQELU3RyaW5nRW50cnkCBQhsYW5kc0tleQkAuwkCCAUBcgJfNwIBXwkBC0RlbGV0ZUVudHJ5AQUIbGFuZHNLZXkJAQxJbnRlZ2VyRW50cnkCBQlwaWVjZXNLZXkDCQBmAggFAXICXzgFDHN0YWtlZFBpZWNlcwAACQBlAgUMc3Rha2VkUGllY2VzCAUBcgJfOAkBDEludGVnZXJFbnRyeQIJARJrZXlOZXh0RnJlZUxhbmROdW0ACQBkAgUHZnJlZU51bQABBQVpc3N1ZQkBC1N0cmluZ0VudHJ5AgkBEGtleUxhbmRUb0Fzc2V0SWQBBQpuZXdMYW5kTnVtBQ5uZXdMYW5kQXNzZXRJZAkBC1N0cmluZ0VudHJ5AgkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFDm5ld0xhbmRBc3NldElkBQRhZGRyCQELU3RyaW5nRW50cnkCCQERa2V5TGFuZE51bVRvT3duZXIBBQpuZXdMYW5kTnVtBQRhZGRyCQEMSW50ZWdlckVudHJ5AgkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQUObmV3TGFuZEFzc2V0SWQIBQFyAl8yCQEMSW50ZWdlckVudHJ5AgkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQ5uZXdMYW5kQXNzZXRJZAUIbmV3TGV2ZWwJAQxJbnRlZ2VyRW50cnkCCQEea2V5SW5mcmFMZXZlbEJ5QXNzZXRJZEFuZE93bmVyAgUObmV3TGFuZEFzc2V0SWQFBGFkZHIFCG5ld0xldmVsCQELU3RyaW5nRW50cnkCBQVicEtleQkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAggFAXICXzQJAMwIAgUGbmV3TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6CQELU3RyaW5nRW50cnkCCQERa2V5UmVzUHJvcG9ydGlvbnMACQC5CQIIBQFyAl82AgFfCQELU3RyaW5nRW50cnkCCQEWa2V5UmVzVHlwZXNCeUNvbnRpbmVudAEFCWNvbnRpbmVudAkAuQkCCAUBcgNfMTACAV8JAQtTdHJpbmdFbnRyeQIJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAkAuQkCCQDMCAIFCWNvbnRpbmVudAkAzAgCAgFMCQDMCAIFDm5ld0xhbmRBc3NldElkBQNuaWwCAV8JAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIAAQUHYXNzZXRJZAUObmV3TGFuZEFzc2V0SWQBA3MybQIEYWRkcgxsYW5kQXNzZXRJZHMJAQ1tZXJnZUludGVybmFsBgIBTQADAgRTU1NTBQRhZGRyBQxsYW5kQXNzZXRJZHMAAAEDbTJsAgRhZGRyDGxhbmRBc3NldElkcwkBDW1lcmdlSW50ZXJuYWwGAgFMAAQCA1NNTQUEYWRkcgUMbGFuZEFzc2V0SWRzCQBoAgURSW5mcmFVcGdyYWRlQ29zdFMABAEEbDJ4bAIEYWRkcgxsYW5kQXNzZXRJZHMJAQ1tZXJnZUludGVybmFsBgICWEwABQIFU1NTTUwFBGFkZHIFDGxhbmRBc3NldElkcwkAaAIFEUluZnJhVXBncmFkZUNvc3RTAC8BBnhsMnh4bAIEYWRkcgxsYW5kQXNzZXRJZHMJAQ1tZXJnZUludGVybmFsBgIDWFhMAAYCA0xYTAUEYWRkcgUMbGFuZEFzc2V0SWRzCQBoAgURSW5mcmFVcGdyYWRlQ29zdFMANgELbWVyZ2VDb21tb24CBGFkZHIMbGFuZEFzc2V0SWRzBAckbWF0Y2gwCQCQAwEFDGxhbmRBc3NldElkcwMJAAACAAQFByRtYXRjaDAJAQNzMm0CBQRhZGRyBQxsYW5kQXNzZXRJZHMDCQAAAgADBQckbWF0Y2gwCQEDbTJsAgUEYWRkcgUMbGFuZEFzc2V0SWRzAwkAAAIABQUHJG1hdGNoMAkBBGwyeGwCBQRhZGRyBQxsYW5kQXNzZXRJZHMDCQAAAgACBQckbWF0Y2gwCQEGeGwyeHhsAgUEYWRkcgUMbGFuZEFzc2V0SWRzCQACAQINVW5rbm93biBtZXJnZQEVY2hlY2tPdXRkYXRlZERlbGl2ZXJ5AQh1c2VyQWRkcgQEZHVjawkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQh1c2VyQWRkcgMJAQlpc0RlZmluZWQBBQRkdWNrBAtkdWNrQXNzZXRJZAkBBXZhbHVlAQUEZHVjawQGbG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQEA2xvYwkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFBmxvY0tleQUPREVGQVVMVExPQ0FUSU9OAgFfBAlzdGFydFRpbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNsb2MFD2xvY0lkeENvbnRpbmVudAMDCQECIT0CCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBRAYJAGYCCQBkAgUJc3RhcnRUaW1lBRJURU5fTUlOVVRFU19NSUxMSVMIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQNuaWwECWhlYWx0aEtleQkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAMJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQhsb2NJZHhJZAAABAZyZXdhcmQJAPwHBAUPZWNvbm9teUNvbnRyYWN0AhJzZW5kRGVsaXZlcnlSZXdhcmQJAMwIAgUIdXNlckFkZHIFA25pbAUDbmlsAwkAAAIFBnJld2FyZAUGcmV3YXJkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAM0IAgkAzQgCBAtsb2NrZWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9lY29ub215Q29udHJhY3QFEWRlbGl2ZXJ5TG9ja2VkS2V5AAAEBnVubG9jawkA/AcEBQ9lY29ub215Q29udHJhY3QCFHVwZGF0ZURlbGl2ZXJ5TG9ja2VkCQDMCAIJAGUCBQtsb2NrZWRUb3RhbAUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwFA25pbAMJAAACBQZ1bmxvY2sFBnVubG9jawMJAGcCAAAJARFAZXh0ck5hdGl2ZSgxMDU1KQEFCWhlYWx0aEtleQUDbmlsBApwdW5pc2htZW50CQD8BwQFBHRoaXMCC3NhdmVJbnRlZ2VyCQDMCAIJARZrZXlEZWxpdmVyeURlbGF5QnlEdWNrAQULZHVja0Fzc2V0SWQJAMwIAgkAZAIFCXN0YXJ0VGltZQUTREVMSVZFUllfUFVOSVNITUVOVAUDbmlsBQNuaWwDCQAAAgUKcHVuaXNobWVudAUKcHVuaXNobWVudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEMSW50ZWdlckVudHJ5AgUJaGVhbHRoS2V5CQERQGV4dHJOYXRpdmUoMTA1NSkBCQEOa2V5U2F2ZWRIZWFsdGgBBQtkdWNrQXNzZXRJZAkBC1N0cmluZ0VudHJ5AgUGbG9jS2V5CQERQGV4dHJOYXRpdmUoMTA1OCkBCQEQa2V5U2F2ZWRMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQNuaWwBBnByb2xvZwEBaQMDCQECIT0CCAUBaQxvcmlnaW5DYWxsZXIFDHJlc3RDb250cmFjdAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEKa2V5QmxvY2tlZAAHBwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UECHVzZXJBZGRyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgkAzQgCCQEVY2hlY2tPdXRkYXRlZERlbGl2ZXJ5AQUIdXNlckFkZHIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYXN0VHhJZEJ5VXNlcgEFCHVzZXJBZGRyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQBDHByb2xvZ0ZsaWdodAEBaQMDCQECIT0CCAUBaQxvcmlnaW5DYWxsZXIFDHJlc3RDb250cmFjdAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEKa2V5QmxvY2tlZAAHBwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhc3RUeElkQnlVc2VyAQkApQgBCAUBaQxvcmlnaW5DYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsLQFpAQ1jb25zdHJ1Y3RvclYxAQhyZXN0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyBQNuaWwBaQELc2F2ZUludGVnZXICA2tleQZhbW91bnQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAiBzYXZlSW50ZWdlciBpcyBub3QgcHVibGljIG1ldGhvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQZhbW91bnQFA25pbAFpAQpzZXRCbG9ja2VkAQlpc0Jsb2NrZWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCmtleUJsb2NrZWQABQlpc0Jsb2NrZWQFA25pbAFpAQlzdGFrZUxhbmQABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AggFA3BtdAZhbW91bnQAAQkAAgEJAKwCAgkArAICAgRORlQgBQpMQU5EUFJFRklYAiQgdG9rZW4gc2hvdWxkIGJlIGF0dGFjaGVkIGFzIHBheW1lbnQEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQDCQECIT0CCAUFYXNzZXQGaXNzdWVyBQR0aGlzCQACAQIXVW5rbm93biBpc3N1ZXIgb2YgdG9rZW4DCQEBIQEJAQhjb250YWlucwIIBQVhc3NldARuYW1lBQpMQU5EUFJFRklYCQACAQkArAICCQCsAgICCU9ubHkgTkZUIAUKTEFORFBSRUZJWAIUIHRva2VucyBhcmUgYWNjZXB0ZWQEC2xhbmROdW1TaXplCQCwAgIIBQVhc3NldARuYW1lAAQEB2xhbmROdW0DCQEIY29udGFpbnMCBQtsYW5kTnVtU2l6ZQIDWFhMCQCzAgIFC2xhbmROdW1TaXplAAMDCQEIY29udGFpbnMCBQtsYW5kTnVtU2l6ZQICWEwJALMCAgULbGFuZE51bVNpemUAAgkAswICBQtsYW5kTnVtU2l6ZQABAwkBASEBCQEJaXNEZWZpbmVkAQkAtgkBBQdsYW5kTnVtCQACAQkArAICAh5DYW5ub3QgcGFyc2UgbGFuZCBudW1iZXIgZnJvbSAIBQVhc3NldARuYW1lBAtsYW5kQXNzZXRJZAkA2AQBBQdhc3NldElkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAwkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQISIGlzIGFscmVhZHkgc3Rha2VkBAFkCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwQNdGVycmFpbkNvdW50cwkBDWNvdW50VGVycmFpbnMBCQCRAwIFAWQFC3JlY1RlcnJhaW5zBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIFAWQFC3JlY0xhbmRTaXplBAlsYW5kSW5kZXgJAGkCBQZwaWVjZXMFBVNTSVpFBAVwcm9wcwkBEXVwZGF0ZVByb3BvcnRpb25zAwUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AAEEDHJlc0J5Q29udEtleQkBFmtleVJlc1R5cGVzQnlDb250aW5lbnQBCQCRAwIFAWQFDHJlY0NvbnRpbmVudAQJY29udFByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUMcmVzQnlDb250S2V5AgswXzBfMF8wXzBfMAIBXwQQdXBkYXRlZENvbnRQcm9wcwkAuQkCCQEZdXBkYXRlUHJvcG9ydGlvbnNJbnRlcm5hbAQFCWNvbnRQcm9wcwUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AAECAV8ECGxhbmRzS2V5CQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUHYWRkcmVzcwQIbGFuZHNTdHIJAKIIAQUIbGFuZHNLZXkEBWxhbmRzAwkBCWlzRGVmaW5lZAEFCGxhbmRzU3RyCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUFbGFuZHMFC2xhbmRBc3NldElkCQACAQkArAICAiJZb3VyIHN0YWtlZCBsYW5kcyBhbHJlYWR5IGNvbnRhaW4gBQtsYW5kQXNzZXRJZAMJAGcCCQCQAwEFBWxhbmRzBRhNQVhfTEFORFNfU1RBS0VEX0JZX1VTRVIJAAIBCQCsAgIJAKwCAgIZWW91ciBhbHJlYWR5IHN0YWtlZCBtYXggKAkApAMBBRhNQVhfTEFORFNfU1RBS0VEX0JZX1VTRVICBykgbGFuZHMECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAABAlwaWVjZXNLZXkJARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQUHYWRkcmVzcwQJb2xkUGllY2VzCQELdmFsdWVPckVsc2UCCQCfCAEFCXBpZWNlc0tleQAABAl3bGdSZXN1bHQJAPwHBAULd2xnQ29udHJhY3QCEm9uU3Rha2VVbnN0YWtlTGFuZAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkxBTkRQUkVGSVgFC2xhbmRBc3NldElkBQdhZGRyZXNzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQELU3RyaW5nRW50cnkCBQhsYW5kc0tleQkAuwkCCQDNCAIFBWxhbmRzBQtsYW5kQXNzZXRJZAIBXwkAzAgCCQEMSW50ZWdlckVudHJ5AgUJcGllY2VzS2V5CQBkAgUJb2xkUGllY2VzBQZwaWVjZXMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkBQdhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYW5kTnVtVG9Pd25lcgEFB2xhbmROdW0FB2FkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAR5rZXlJbmZyYUxldmVsQnlBc3NldElkQW5kT3duZXICBQtsYW5kQXNzZXRJZAUHYWRkcmVzcwUKaW5mcmFMZXZlbAkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5UmVzUHJvcG9ydGlvbnMABQVwcm9wcwkAzAgCCQELU3RyaW5nRW50cnkCBQxyZXNCeUNvbnRLZXkFEHVwZGF0ZWRDb250UHJvcHMFA25pbAUNcHJvbG9nQWN0aW9ucwUJd2xnUmVzdWx0AWkBC3Vuc3Rha2VMYW5kAQ1sYW5kQXNzZXRJZEluBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQBYwkBFGNoZWNrQ2xhaW1Db25kaXRpb25zAwUEYWRkcgUNY2xhaW1Nb2RlRHVjawUNbGFuZEFzc2V0SWRJbgQLbGFuZEFzc2V0SWQIBQFjAl8yBAFkCAUBYwJfMwQIbGFuZHNLZXkJARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBBQRhZGRyBA10ZXJyYWluQ291bnRzCQENY291bnRUZXJyYWlucwEJAJEDAgUBZAULcmVjVGVycmFpbnMEBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAgUBZAULcmVjTGFuZFNpemUECWxhbmRJbmRleAkAaQIFBnBpZWNlcwUFU1NJWkUEBXByb3BzCQERdXBkYXRlUHJvcG9ydGlvbnMDBQ10ZXJyYWluQ291bnRzBQlsYW5kSW5kZXgA////////////AQQMcmVzQnlDb250S2V5CQEWa2V5UmVzVHlwZXNCeUNvbnRpbmVudAEJAJEDAgUBZAUMcmVjQ29udGluZW50BAljb250UHJvcHMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQxyZXNCeUNvbnRLZXkCCzBfMF8wXzBfMF8wAgFfBBB1cGRhdGVkQ29udFByb3BzCQC5CQIJARl1cGRhdGVQcm9wb3J0aW9uc0ludGVybmFsBAUJY29udFByb3BzBQ10ZXJyYWluQ291bnRzBQlsYW5kSW5kZXgA////////////AQIBXwQLY2xhaW1SZXN1bHQJAQhjbGFpbUFsbAQFBGFkZHIFC2xhbmRBc3NldElkBQZwaWVjZXMFDWNsYWltTW9kZUR1Y2sEBWxhbmRzCQC9CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUIbGFuZHNLZXkCAAIBXwQDaWR4CQDPCAIFBWxhbmRzBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEFA2lkeAkAAgEJAKwCAgIgWW91ciBzdGFrZWQgbGFuZHMgZG9uJ3QgY29udGFpbiAFC2xhbmRBc3NldElkBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBA5nb3ZSZWxlYXNlVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQtnb3ZDb250cmFjdAkBFWtleVVzZXJHd2xSZWxlYXNlVGltZQEFBGFkZHIAAAMJAGcCBQ5nb3ZSZWxlYXNlVGltZQUDbm93CQACAQkArAICAjlZb3VyIGdXTCBhcmUgdGFraW5nIHBhcnQgaW4gdm90aW5nLCBjYW5ub3QgdW5zdGFrZSB1bnRpbCAJAKQDAQUOZ292UmVsZWFzZVRpbWUEDmFyYlJlbGVhc2VUaW1lCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQt3bGdDb250cmFjdAkBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQUEYWRkcgAABQ5hcmJpdHJhZ2VEZWxheQMJAGYCBQ5hcmJSZWxlYXNlVGltZQUDbm93CQACAQkArAICAj9Zb3VyIHN0YWtlZCBsYW5kcyB0b29rIHBhcnQgaW4gYXJiaXRyYWdlLCBjYW5ub3QgdW5zdGFrZSB1bnRpbCAJAKQDAQUOYXJiUmVsZWFzZVRpbWUECXBpZWNlc0tleQkBFmtleVN0YWtlZFBpZWNlc0J5T3duZXIBBQRhZGRyBAxzdGFrZWRQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJcGllY2VzS2V5AAAECW5ld1BpZWNlcwMJAGYCBQZwaWVjZXMFDHN0YWtlZFBpZWNlcwAACQBlAgUMc3Rha2VkUGllY2VzBQZwaWVjZXMECXdsZ1Jlc3VsdAkA/AcEBQt3bGdDb250cmFjdAISb25TdGFrZVVuc3Rha2VMYW5kCQDMCAIFBGFkZHIFA25pbAUDbmlsCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQkA2QQBBQtsYW5kQXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKTEFORFBSRUZJWAULbGFuZEFzc2V0SWQFBGFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleVJlc1Byb3BvcnRpb25zAAUFcHJvcHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUMcmVzQnlDb250S2V5BRB1cGRhdGVkQ29udFByb3BzCQDMCAIJAQtTdHJpbmdFbnRyeQIIBQtjbGFpbVJlc3VsdAJfMgkAuQkCCAULY2xhaW1SZXN1bHQCXzMCAToJAMwIAgMJAGYCCQCQAwEFBWxhbmRzAAEJAQtTdHJpbmdFbnRyeQIFCGxhbmRzS2V5CQC7CQIJANEIAgUFbGFuZHMJAQV2YWx1ZQEFA2lkeAIBXwkBC0RlbGV0ZUVudHJ5AQUIbGFuZHNLZXkJAMwIAgkBDEludGVnZXJFbnRyeQIFCXBpZWNlc0tleQUJbmV3UGllY2VzBQNuaWwFDXByb2xvZ0FjdGlvbnMFCXdsZ1Jlc3VsdAFpAQlzdGFrZUR1Y2sABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AggFA3BtdAZhbW91bnQAAQkAAgEJAKwCAgkArAICAgRORlQgBQpEVUNLUFJFRklYAiQgdG9rZW4gc2hvdWxkIGJlIGF0dGFjaGVkIGFzIHBheW1lbnQEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQDAwkBAiE9AggFBWFzc2V0Bmlzc3VlcgUNaW5jdWJhdG9yQWRkcgkBAiE9AggFBWFzc2V0Bmlzc3VlcgULYnJlZWRlckFkZHIHCQACAQkArAICCQCsAgICElVua25vd24gaXNzdWVyIG9mIAUKRFVDS1BSRUZJWAIGIHRva2VuAwkBASEBCQEIY29udGFpbnMCCAUFYXNzZXQEbmFtZQUKRFVDS1BSRUZJWAkAAgEJAKwCAgkArAICAglPbmx5IE5GVCAFCkRVQ0tQUkVGSVgCFCB0b2tlbnMgYXJlIGFjY2VwdGVkBAphc3NldElkU3RyCQDYBAEFB2Fzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUKYXNzZXRJZFN0cgMJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCEiBpcyBhbHJlYWR5IHN0YWtlZAMJAQlpc0RlZmluZWQBCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MJAAIBCQCsAgICHVlvdSBhbHJlYWR5IHN0YWtlZCBvbmUgZHVjazogCAUFYXNzZXQEbmFtZQQGbG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQUKYXNzZXRJZFN0cgQIbG9jYXRpb24JAKIIAQUGbG9jS2V5BAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQUKYXNzZXRJZFN0cgQIYmFja3BhY2sJAKIIAQUFYnBLZXkECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQphc3NldElkU3RyBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFCmFzc2V0SWRTdHIAAAQJY3VySGVhbHRoCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aAUFbWF4SFAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKRFVDS1BSRUZJWAkA2AQBBQdhc3NldElkBQdhZGRyZXNzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQELU3RyaW5nRW50cnkCCQEQa2V5RHVja0lkVG9Pd25lcgEFCmFzc2V0SWRTdHIFB2FkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwUKYXNzZXRJZFN0cgUDbmlsAwkBCWlzRGVmaW5lZAEFCGxvY2F0aW9uBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQZsb2NLZXkFD0RFRkFVTFRMT0NBVElPTgUDbmlsAwkBCWlzRGVmaW5lZAEFCGJhY2twYWNrBQNuaWwJAM4IAgkAzQgCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWJwS2V5AhowOjBfMF8wXzBfMF8wOjBfMF8wXzBfMF8wOgUDbmlsCQEMSW50ZWdlckVudHJ5AgUJa2V5SGVhbHRoBQljdXJIZWFsdGgFDXByb2xvZ0FjdGlvbnMBaQELdW5zdGFrZUR1Y2sBCmFzc2V0SWRTdHIEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEB2Fzc2V0SWQJANkEAQUKYXNzZXRJZFN0cgQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUKYXNzZXRJZFN0cgMJAQEhAQkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MJAAIBCQCsAgIJAKwCAgIJVGhlIGR1Y2sgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBEGtleUR1Y2tJZFRvT3duZXIBBQphc3NldElkU3RyCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQdhZGRyZXNzCQACAQIXU3Rha2VkIE5GVCBpcyBub3QgeW91cnMDCQEPY2hlY2tUb3VybmFtZW50AQUKYXNzZXRJZFN0cgkAAgECG3Vuc3Rha2VEdWNrX2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQUKYXNzZXRJZFN0cgkAAgECGXVuc3Rha2VEdWNrX2NoZWNrRGVsaXZlcnkECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQphc3NldElkU3RyBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFCmFzc2V0SWRTdHIAAAQGaGVhbHRoCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aAUFbWF4SFADCQBmAgUFbWF4SFAFBmhlYWx0aAkAAgEJAKwCAgkArAICAhlQbGVhc2UgaGVhbCB5b3VyIGR1Y2sgdG8gCQCkAwEFBW1heEhQAhNocCBiZWZvcmUgdW5zdGFraW5nCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEFB2Fzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQUHdGltZUtleQkAzAgCCQELRGVsZXRlRW50cnkBBQlrZXlIZWFsdGgJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBD2tleUR1Y2tMb2NhdGlvbgEFCmFzc2V0SWRTdHIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEGtleUR1Y2tJZFRvT3duZXIBBQphc3NldElkU3RyCQDMCAIJAQtEZWxldGVFbnRyeQEJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKRFVDS1BSRUZJWAUKYXNzZXRJZFN0cgUHYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQdhZGRyZXNzBQNuaWwFDXByb2xvZ0FjdGlvbnMBaQEIY2xhaW1SZXMCBmFtb3VudA5sYW5kQXNzZXRJZFN0cgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBnJlc3VsdAkBEGNsYWltUmVzSW50ZXJuYWwEBQRhZGRyBQZhbW91bnQFDWNsYWltTW9kZUR1Y2sFDmxhbmRBc3NldElkU3RyBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQJAJQKAgkAzggCCQDNCAIJAM0IAgkAzggCCAUGcmVzdWx0Al8xCAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQJAGsDBQd4cENsYWltBQZhbW91bnQFBU1VTFQ4Al8xCQELU3RyaW5nRW50cnkCCAUGcmVzdWx0Al8yCQC5CQIIBQZyZXN1bHQCXzMCAToJAQtTdHJpbmdFbnRyeQIIBQZyZXN1bHQCXzQJALkJAggFBnJlc3VsdAJfNQIBOgUNcHJvbG9nQWN0aW9ucwkAkQMCCAUGcmVzdWx0Al8zBQhicElkeFJlcwFpAQxjbGFpbVJlc1RvV0gCBmFtb3VudA5sYW5kQXNzZXRJZFN0cgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBnJlc3VsdAkBEGNsYWltUmVzSW50ZXJuYWwEBQRhZGRyBQZhbW91bnQFC2NsYWltTW9kZVdoBQ5sYW5kQXNzZXRJZFN0cgkAlAoCCQDOCAIJAM0IAgkAzQgCCQDOCAIIBQZyZXN1bHQCXzEICQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIFBGFkZHIJAGsDBQd4cENsYWltBQZhbW91bnQFBU1VTFQ4Al8xCQELU3RyaW5nRW50cnkCCAUGcmVzdWx0Al8yCQC5CQIIBQZyZXN1bHQCXzMCAToJAQtTdHJpbmdFbnRyeQIIBQZyZXN1bHQCXzQJALkJAggFBnJlc3VsdAJfNQIBOgUNcHJvbG9nQWN0aW9ucwkAkQMCCAUGcmVzdWx0Al81BQh3aElkeFJlcwFpAQZmbGlnaHQCB21lc3NhZ2UDc2lnBA1wcm9sb2dBY3Rpb25zCQEMcHJvbG9nRmxpZ2h0AQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAh1c2VyQWRkcgkApQgBCAUBaQZjYWxsZXIEAWYJAQxmbGlnaHRDb21tb24DBQh1c2VyQWRkcgUHbWVzc2FnZQUDc2lnBAVuZXdIUAgFAWYCXzEEC2R1Y2tBc3NldElkCAUBZgJfMgQGbG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCiCAEFBmxvY0tleQUPREVGQVVMVExPQ0FUSU9OBAtuZXdMb2NhdGlvbggFAWYCXzQDCQAAAgULbmV3TG9jYXRpb24FC2N1ckxvY2F0aW9uCQACAQIiWW91IGNhbid0IGZseSB0byB0aGUgc2FtZSBsb2NhdGlvbgQGbmV3TG9jCQC1CQIFC25ld0xvY2F0aW9uAgFfBAZpc1RvdXIJAAACCQCRAwIFBm5ld0xvYwUKbG9jSWR4VHlwZQIBVAQHaXNEZWxpdgkAAAIJAJEDAgUGbmV3TG9jBQpsb2NJZHhUeXBlAgFEBAVlcUtleQkBEGtleUR1Y2tFcXVpcG1lbnQBBQtkdWNrQXNzZXRJZAQJY3VycmVudEVxCQELdmFsdWVPckVsc2UCCQCiCAEFBWVxS2V5AhcsOyxfLDssXyw7LF8sOyxfLDssXyw7LAQNJHQwNzMwNjI3MzE1OQkBEXN1YnRyYWN0RXF1aXBtZW50AgUJY3VycmVudEVxCAUBZgJfNQQFbmV3RXEIBQ0kdDA3MzA2MjczMTU5Al8xBA9zaG91bGRaZXJvQnVmZnMIBQ0kdDA3MzA2MjczMTU5Al8yBA0kdDA3MzE2Mjc2Mjc0AwkBASEBCQEJb25NaXNzaW9uAgUSdG91cm5hbWVudENvbnRyYWN0BQtjdXJMb2NhdGlvbgMJAQEhAQkBD2lzVXN1YWxMb2NhdGlvbgEFC25ld0xvY2F0aW9uCQEMY2hlYXRBdHRlbXB0AwULY3VyTG9jYXRpb24FC25ld0xvY2F0aW9uAAUDCQBmAgUFbmV3SFAAAAkAlAoCBQtuZXdMb2NhdGlvbgUFbmV3SFAJAJQKAgULY3VyTG9jYXRpb24AAAMJAQ5pc0luVG91cm5hbWVudAIFEnRvdXJuYW1lbnRDb250cmFjdAULY3VyTG9jYXRpb24DCQEBIQEJAQ5pc0luVG91cm5hbWVudAIFEnRvdXJuYW1lbnRDb250cmFjdAULbmV3TG9jYXRpb24JAAIBAipZb3VyIGR1Y2sgaXMgdGFraW5nIHBhcnQgaW4gdGhlIHRvdXJuYW1lbnQEBXNjb3JlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGbmV3TG9jBQhsb2NJZHhJZAQGY3VyTG9jCQC1CQIFC2N1ckxvY2F0aW9uAgFfBAZsYXN0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSdG91cm5hbWVudENvbnRyYWN0BQ1sYXN0VG91cklkS2V5AAADCQECIT0CBQVzY29yZQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZjdXJMb2MFCGxvY0lkeElkAAEJAQxjaGVhdEF0dGVtcHQDBQtjdXJMb2NhdGlvbgULbmV3TG9jYXRpb24ABwMJAGYCBQVuZXdIUAAABAlsb2NhbEJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSdG91cm5hbWVudENvbnRyYWN0CQEaa2V5QmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sCBQZsYXN0SWQFC2R1Y2tBc3NldElkAAAECHVwZExvY2FsAwkAZgIFBXNjb3JlBQlsb2NhbEJlc3QJAPwHBAUSdG91cm5hbWVudENvbnRyYWN0Ag5zYXZlRHVja1Jlc3VsdAkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQVzY29yZQUDbmlsBQNuaWwFBHVuaXQDCQAAAgUIdXBkTG9jYWwFCHVwZExvY2FsCQCUCgIFC25ld0xvY2F0aW9uBQVuZXdIUAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQtjdXJMb2NhdGlvbgAAAwkBASEBCQEMaXNJbkRlbGl2ZXJ5AQULY3VyTG9jYXRpb24ECHNhdmVkTG9jCQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCEGF1dG9FeGl0RGVsaXZlcnkJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUFbmV3SFAJAMwIAgMFB2lzRGVsaXYCAjEwAgIxMQkAzAgCAAAFA25pbAUDbmlsAwkAAAIFCHNhdmVkTG9jBQhzYXZlZExvYwMFB2lzRGVsaXYJAJQKAgUIc2F2ZWRMb2MFBW5ld0hQAwkAZgIFBW5ld0hQAAAJAJQKAgULbmV3TG9jYXRpb24FBW5ld0hQCQCUCgIFCHNhdmVkTG9jAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQEBIQEFB2lzRGVsaXYJAAIBAiRZb3VyIGR1Y2sgaXMgdGFraW5nIHBhcnQgaW4gZGVsaXZlcnkDCQEBIQEJAQxpc0luRGVsaXZlcnkBBQtuZXdMb2NhdGlvbgkBDGNoZWF0QXR0ZW1wdAMFC2N1ckxvY2F0aW9uBQtuZXdMb2NhdGlvbgANBAVzY29yZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBm5ld0xvYwUIbG9jSWR4SWQEBmN1ckxvYwkAtQkCBQtjdXJMb2NhdGlvbgIBXwMJAQIhPQIFBXNjb3JlCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBmN1ckxvYwUIbG9jSWR4SWQAAQkBDGNoZWF0QXR0ZW1wdAMFC2N1ckxvY2F0aW9uBQtuZXdMb2NhdGlvbgAOAwMJAGYCBQVuZXdIUAAACQBmAgABBQVzY29yZQcJAJQKAgULbmV3TG9jYXRpb24FBW5ld0hQBAhzYXZlZExvYwkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhBhdXRvRXhpdERlbGl2ZXJ5CQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFBW5ld0hQCQDMCAICBTE1LTE3CQDMCAIFBXNjb3JlBQNuaWwFA25pbAMJAAACBQhzYXZlZExvYwUIc2F2ZWRMb2MJAJQKAgUIc2F2ZWRMb2MFBW5ld0hQCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAlsb2NUb1NhdmUIBQ0kdDA3MzE2Mjc2Mjc0Al8xBAhocFRvU2F2ZQgFDSR0MDczMTYyNzYyNzQCXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQZsb2NLZXkFCWxvY1RvU2F2ZQkAzAgCCQELU3RyaW5nRW50cnkCBQVlcUtleQUFbmV3RXEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQFCGhwVG9TYXZlBQNuaWwFDXByb2xvZ0FjdGlvbnMDBQ9zaG91bGRaZXJvQnVmZnMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUR1Y2tCdWZmcwEFC2R1Y2tBc3NldElkAgkwXzBfMF8wXzAFA25pbAUDbmlsCAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQDCQBmAgUFbmV3SFAAAAUPeHBTdWNjZXNzRmxpZ2h0BQx4cEZhaWxGbGlnaHQCXzEIBQFmAl8zAWkBBGhlYWwDCnF1YW50aXR5TDEKcXVhbnRpdHlMMgpxdWFudGl0eUwzBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMDAwkAZgIAAAUKcXVhbnRpdHlMMQYJAGYCAAAFCnF1YW50aXR5TDIGCQBmAgAABQpxdWFudGl0eUwzCQACAQIbUXVhbnRpdHkgY2Fubm90IGJlIG5lZ2F0aXZlBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBD2NoZWNrVG91cm5hbWVudAEFC2R1Y2tBc3NldElkCQACAQIUaGVhbF9jaGVja1RvdXJuYW1lbnQDCQENY2hlY2tEZWxpdmVyeQEFC2R1Y2tBc3NldElkCQACAQISaGVhbF9jaGVja0RlbGl2ZXJ5BANxdHMJAMwIAgUKcXVhbnRpdHlMMQkAzAgCBQpxdWFudGl0eUwyCQDMCAIFCnF1YW50aXR5TDMFA25pbAQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkAAAECW9sZEhlYWx0aAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlIZWFsdGgFBW1heEhQAwkAZwIFCW9sZEhlYWx0aAUFbWF4SFAJAAIBCQCsAgIJAKwCAgIPSFAgc2hvdWxkIGJlIDwgCQCkAwEFBW1heEhQAgggdG8gaGVhbAQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2tw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dEFzc2V0SWQJAAIBAhpBbGxvd2VkIFVTRFQgcGF5bWVudCBvbmx5IQQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQ9jaGVja1RvdXJuYW1lbnQBBQtkdWNrQXNzZXRJZAkAAgECFmhlYWxFU19jaGVja1RvdXJuYW1lbnQDCQENY2hlY2tEZWxpdmVyeQEFC2R1Y2tBc3NldElkCQACAQIUaGVhbEVTX2NoZWNrRGVsaXZlcnkECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAQFbWF4SFAJAQltYXhIZWFsdGgBCQELdmFsdWVPckVsc2UCCQCfCAEJAQxrZXlEdWNrTGV2ZWwBBQtkdWNrQXNzZXRJZAAABAlvbGRIZWFsdGgJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJa2V5SGVhbHRoBQVtYXhIUAMJAGYCBQlvbGRIZWFsdGgAAAkAAgECKEhQIHNob3VsZCBiZSAwIHRvIGNhbGwgRW1lcmdlbmN5IFNlcnZpY2UEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAhwcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwQNbWVkS2l0QW1vdW50MQMJAGYCCQCQAwEFCHByb2RMaXN0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhwcm9kTGlzdAAAAAAEDW1lZEtpdEFtb3VudDIDCQBmAgkAkAMBBQhwcm9kTGlzdAABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvZExpc3QAAQAABA1tZWRLaXRBbW91bnQzAwkAZgIJAJADAQUIcHJvZExpc3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCHByb2RMaXN0AAIAAAMDAwkAZgIFDW1lZEtpdEFtb3VudDEAAAYJAGYCBQ1tZWRLaXRBbW91bnQyAAAGCQBmAgUNbWVkS2l0QW1vdW50MwAACQACAQIfWW91IGhhdmUgdG8gdXNlIG93biBNZWRpY2FsIEtpdAQIZXhpc3RTdHIJAJ0IAgUPZWNvbm9teUNvbnRyYWN0CQEOa2V5RXNXYXJlaG91c2UABAxleGlzdEFtb3VudHMDCQEJaXNEZWZpbmVkAQUIZXhpc3RTdHIJALwJAgkBBXZhbHVlAQUIZXhpc3RTdHICAV8FA25pbAQLZXhpc3RBbW91bnQDCQBmAgkAkAMBBQxleGlzdEFtb3VudHMAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGV4aXN0QW1vdW50cwAAAAADCQBnAgAABQtleGlzdEFtb3VudAkAAgECOVRoZXJlIGFyZSBubyBNZWRpY2FsIEtpdHMgTDEgYXQgRW1lcmdlbmN5IFNlcnZpY2Ugc3RvcmFnZQQJbmV3SGVhbHRoCQBkAgUJb2xkSGVhbHRoCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgAAAIBXwUKcklkeEVmZmVjdAQFbmV3RVMJALkJAgkAzAgCCQCkAwEJAGUCBQtleGlzdEFtb3VudAABCQDRCAIFDGV4aXN0QW1vdW50cwAAAgFfBAZyZWNpcGUJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4AAACAV8ECHRvdGFsTWF0CQESZ2V0UmVjaXBlTWF0ZXJpYWxzAQUGcmVjaXBlBAlzZWxsUHJpY2UJAGsDCQBoAgUIdG90YWxNYXQFCkVTU0VMTENPRUYFEFJFU09VUkNFUFJJQ0VNSU4JAGgCBQVNVUxUOAUOUFJPRFVDVFBLR1NJWkUDCQECIT0CCAUDcG10BmFtb3VudAUJc2VsbFByaWNlCQACAQkArAICAhtQYXltZW50IGF0dGFjaGVkIHNob3VsZCBiZSAJAKQDAQUJc2VsbFByaWNlBAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPZWNvbm9teUNvbnRyYWN0Ag91cGRhdGVFc1N0b3JhZ2UJAMwIAgUFbmV3RVMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULdXNkdEFzc2V0SWQFCXNlbGxQcmljZQUDbmlsCQCUCgIJAM4IAgkAzQgCBQ1wcm9sb2dBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgUJa2V5SGVhbHRoBQluZXdIZWFsdGgICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAUIeHBDYWxsRVMCXzEFBnJlc3VsdAFpAQ51cGRhdGVCYWNrcGFjawILZHVja0Fzc2V0SWQHbmV3UGFjawMJAQIhPQIIBQFpBmNhbGxlcgUPZWNvbm9teUNvbnRyYWN0CQACAQIRcGVybWlzc2lvbiBkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAUHbmV3UGFjawUDbmlsBQduZXdQYWNrAWkBD2NvbW1pdEZvclJhbmRvbQAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBAtmaW5pc2hCbG9jawkAZAIFBmhlaWdodAULcmFuZG9tRGVsYXkEBGFkZHIJAKUIAQgFAWkGY2FsbGVyCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUNvbW1pdAEFBGFkZHIFC2ZpbmlzaEJsb2NrBQNuaWwFDXByb2xvZ0FjdGlvbnMFC2ZpbmlzaEJsb2NrAWkBCGJ1eVNMYW5kAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhxFeGFjdGx5IG9uZSBwYXltZW50IHJlcXVpcmVkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAMJAQIhPQIIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhpBbGxvd2VkIFVTRFQgcGF5bWVudCBvbmx5IQMJAQIhPQIIBQNwbXQGYW1vdW50BQdFWFBVU0RUCQACAQkArAICAhtQYXltZW50IGF0dGFjaGVkIHNob3VsZCBiZSAJAKQDAQUHRVhQVVNEVAQGcmVzdWx0CQESZXhwZWRpdGlvbkludGVybmFsAggFAWkGY2FsbGVyCAUBaQ10cmFuc2FjdGlvbklkBAthY3Jlc1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ1hY3Jlc0NvbnRyYWN0AglidXJuQWNyZXMJAMwIAgUMU19DT1NUX0FDUkVTBQNuaWwFA25pbAkAlAoCCQDOCAIJAM4IAgkAzQgCCAUGcmVzdWx0Al8xCQEOU2NyaXB0VHJhbnNmZXIDBQ9lY29ub215Q29udHJhY3QIBQNwbXQGYW1vdW50BQt1c2R0QXNzZXRJZAgJARZ1cGRhdGVBY2NTdGF0c0ludGVybmFsAgkApQgBCAUBaQZjYWxsZXIFCnhwTmV3U0xhbmQCXzEFDXByb2xvZ0FjdGlvbnMJAJQKAggIBQZyZXN1bHQCXzICXzEFC2FjcmVzUmVzdWx0AWkBCmV4cGVkaXRpb24CB21lc3NhZ2UDc2lnBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAh1c2VyQWRkcgkApQgBCAUBaQZjYWxsZXIEAWYJAQxmbGlnaHRDb21tb24DBQh1c2VyQWRkcgUHbWVzc2FnZQUDc2lnBAtkdWNrQXNzZXRJZAgFAWYCXzIECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkEBW1MaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBAZuZXdNYXQJALkJAgkBEXN1YnRyYWN0TWF0ZXJpYWxzAwYFBW1MaXN0BQxFWFBNQVRFUklBTFMCAV8EBWVxS2V5CQEQa2V5RHVja0VxdWlwbWVudAEFC2R1Y2tBc3NldElkBAljdXJyZW50RXEJAQt2YWx1ZU9yRWxzZQIJAKIIAQUFZXFLZXkCFyw7LF8sOyxfLDssXyw7LF8sOyxfLDssBA0kdDA4MzcxNDgzODExCQERc3VidHJhY3RFcXVpcG1lbnQCBQljdXJyZW50RXEIBQFmAl81BAVuZXdFcQgFDSR0MDgzNzE0ODM4MTECXzEED3Nob3VsZFplcm9CdWZmcwgFDSR0MDgzNzE0ODM4MTECXzIEAWUJARJleHBlZGl0aW9uSW50ZXJuYWwCCAUBaQZjYWxsZXIIBQFpDXRyYW5zYWN0aW9uSWQEAmlkCAgFAWUCXzICXzEEBnJlc3VsdAMJAGcCAAAIBQFmAl8xCQCVCgMJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleUhlYWx0aAAACQDMCAIJAQtTdHJpbmdFbnRyeQIFBWVxS2V5BQVuZXdFcQUDbmlsAgAAAAkAlQoDCQDOCAIIBQFlAl8xAwUPc2hvdWxkWmVyb0J1ZmZzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlEdWNrQnVmZnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wBQNuaWwJAM0IAgkAzQgCCQDNCAIJAM0IAgUDbmlsCQELU3RyaW5nRW50cnkCCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQJALkJAgkAzAgCCAgFAWUCXzICXzIJAMwIAgIBTAkAzAgCBQJpZAUDbmlsAgFfCQEMSW50ZWdlckVudHJ5AgUJa2V5SGVhbHRoCAUBZgJfMQkBC1N0cmluZ0VudHJ5AgUFZXFLZXkFBW5ld0VxCQELU3RyaW5nRW50cnkCBQVicEtleQkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgUGbmV3TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BQJpZAgFAWYCXzMDCQEPY2hlY2tUb3VybmFtZW50AQULZHVja0Fzc2V0SWQJAAIBAhpleHBlZGl0aW9uX2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQJAAIBAhhleHBlZGl0aW9uX2NoZWNrRGVsaXZlcnkEC2FjcmVzUmVzdWx0CQEFYXNJbnQBCQD8BwQFDWFjcmVzQ29udHJhY3QCCWJ1cm5BY3JlcwkAzAgCBQxTX0NPU1RfQUNSRVMFA25pbAUDbmlsCQCUCgIJAM4IAgkAzggCCAUGcmVzdWx0Al8xCAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQFCnhwTmV3U0xhbmQCXzEFDXByb2xvZ0FjdGlvbnMJAJUKAwgFBnJlc3VsdAJfMggFBnJlc3VsdAJfMwULYWNyZXNSZXN1bHQBaQEQYnV5U0xhbmRGb3JBY3JlcwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEA2FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQxhY3Jlc0Fzc2V0SWQJAAIBAhRBQ1JFUyBwYXltZW50cyBvbmx5IQMJAQIhPQIFA2FtdAUMU19DT1NUX0FDUkVTCQACAQkArAICAhtQYXltZW50IGF0dGFjaGVkIHNob3VsZCBiZSAJAKQDAQUMU19DT1NUX0FDUkVTBAZyZXN1bHQJARJleHBlZGl0aW9uSW50ZXJuYWwCCAUBaQZjYWxsZXIIBQFpDXRyYW5zYWN0aW9uSWQEC2FjcmVzUmVzdWx0CQEFYXNJbnQBCQD8BwQFDWFjcmVzQ29udHJhY3QCCWJ1cm5BY3JlcwkAzAgCBQxTX0NPU1RfQUNSRVMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMYWNyZXNBc3NldElkBQNhbXQFA25pbAkAlAoCCQDOCAIJAM4IAggFBnJlc3VsdAJfMQgJARZ1cGRhdGVBY2NTdGF0c0ludGVybmFsAgkApQgBCAUBaQZjYWxsZXIFCnhwTmV3U0xhbmQCXzEFDXByb2xvZ0FjdGlvbnMJAJQKAggIBQZyZXN1bHQCXzICXzEFC2FjcmVzUmVzdWx0AWkBDHVwZ3JhZGVJbmZyYQELbGFuZEFzc2V0SWQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBnJlc3VsdAkBDXVwSW5mcmFDb21tb24EBggFAWkGY2FsbGVyAAAFC2xhbmRBc3NldElkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkCQCUCgIJAM4IAgkAzggCCAUGcmVzdWx0Al8xBQ1wcm9sb2dBY3Rpb25zCAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQJAGsDBQ54cFVwZ3JhZGVJbmZyYQgFBnJlc3VsdAJfMwUFTVVMVDgCXzEIBQZyZXN1bHQCXzIBaQEQYWN0aXZhdGVBcnRpZmFjdAIHYXJ0TmFtZQ5sYW5kQXNzZXRJZE9wdAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQZjYWxsZXIEBnJlc3VsdAQHJG1hdGNoMAUHYXJ0TmFtZQMJAAACAgdQUkVTQUxFBQckbWF0Y2gwCQESYWN0aXZhdGVQcmVzYWxlQXJ0AgUEYWRkcgUObGFuZEFzc2V0SWRPcHQDCQAAAgIHT05CT0FSRAUHJG1hdGNoMAkBEmFjdGl2YXRlT25ib2FyZEFydAEFBGFkZHIJAAIBAhBVbmtub3duIGFydGlmYWN0CQDOCAIFBnJlc3VsdAUNcHJvbG9nQWN0aW9ucwFpAQptZXJnZUxhbmRzAQxsYW5kQXNzZXRJZHMEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBnJlc3VsdAkBC21lcmdlQ29tbW9uAgkApQgBCAUBaQZjYWxsZXIFDGxhbmRBc3NldElkcwkAlAoCCQDOCAIJAM4IAggFBnJlc3VsdAJfMQUNcHJvbG9nQWN0aW9ucwgJARZ1cGRhdGVBY2NTdGF0c0ludGVybmFsAgkApQgBCAUBaQZjYWxsZXIFB3hwTWVyZ2UCXzEIBQZyZXN1bHQCXzIBaQENY2FyZ29FeGNoYW5nZQIMY2FyZ29MaXN0U3RyC2xhbmRBc3NldElkBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBApjYXJnb1BhcnRzCQC8CQIFDGNhcmdvTGlzdFN0cgIBOgQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkJAAIBCQCsAgIIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFBGFkZHIJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMECWxhbmRJbmRleAkAaQIJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIJALUJAggFBWFzc2V0C2Rlc2NyaXB0aW9uAgFfBQtyZWNMYW5kU2l6ZQUFU1NJWkUECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAABAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCiCAEJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OBANsb2MJALUJAgkBBXZhbHVlAQULY3VyTG9jYXRpb24CAV8DCQECIT0CCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBTAkAAgEJAKwCAgkArAICAhZEdWNrIGxvY2F0aW9uIHR5cGUgaXMgCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIRLCBidXQgc2hvdWxkIGJlIEwDCQECIT0CCQCRAwIFA2xvYwUIbG9jSWR4SWQFC2xhbmRBc3NldElkCQACAQkArAICAhtEdWNrIHNob3VsZCBiZSBvbiB0aGUgbGFuZCAFC2xhbmRBc3NldElkBAV3aEtleQkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkBAljdXJyZW50V2gJAQxnZXRXYXJlaG91c2UDBQV3aEtleQUJbGFuZEluZGV4BQppbmZyYUxldmVsBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQGcmVzdWx0CQEJbW92ZVN0dWZmAwUKY2FyZ29QYXJ0cwUJY3VycmVudFdoBQtjdXJyZW50UGFjawQEbG9mdAkAtQkCCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhMT0ZUAgFfBAVsb2Z0TwkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQt2b2xPY2N1cGllZAgFBnJlc3VsdAJfNwQFbG9mdEYJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQgFBnJlc3VsdAJfNwkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWJwS2V5CQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCAUGcmVzdWx0Al80CQDMCAIIBQZyZXN1bHQCXzUJAMwIAggFBnJlc3VsdAJfNgUDbmlsAgE6CQDMCAIJAQtTdHJpbmdFbnRyeQIFBXdoS2V5CQC6CQIJAMwIAgkAkQMCBQljdXJyZW50V2gFC3doSWR4TGV2ZWxzCQDMCAIIBQZyZXN1bHQCXzEJAMwIAggFBnJlc3VsdAJfMgkAzAgCCAUGcmVzdWx0Al8zCQDMCAIJALkJAgkAzAgCCQCRAwIFBGxvZnQFCXZvbExvY2tlZAkAzAgCCQCkAwEFBWxvZnRPCQDMCAIJAKQDAQUFbG9mdEYJAMwIAgkAkQMCBQRsb2Z0BQh2b2xUb3RhbAUDbmlsAgFfBQNuaWwCAToFA25pbAUNcHJvbG9nQWN0aW9ucwFpAQ1zYXZlV2FyZWhvdXNlAgV3aFN0cgtsYW5kQXNzZXRJZAMJAQIhPQIIBQFpBmNhbGxlcgUPZWNvbm9teUNvbnRyYWN0CQACAQINQWNjZXNzIGRlbmllZAQFd2hLZXkJARJrZXlXYXJlaG91c2VCeUxhbmQBBQtsYW5kQXNzZXRJZAQCd2gJALwJAgUFd2hTdHICAToDCQECIT0CCQCQAwEFAndoAAUJAAIBAjB3YXJlaG91c2Ugc3RyaW5nIHNob3VsZCBjb250YWluIDQgJzonIHNlcGFyYXRvcnMEBWxvZnRMCQCRAwIJALUJAgkAkQMCBQJ3aAUJd2hJZHhMT0ZUAgFfBQl2b2xMb2NrZWQEBWxvZnRPCQEXZ2V0V2FyZWhvdXNlT2NjdXBpZWRWb2wBBQJ3aAQFbG9mdFQJARdnZXRXYXJlaG91c2VUb3RhbFZvbHVtZQEJAJEDAgUCd2gFC3doSWR4TGV2ZWxzBAVsb2Z0RgkAZQIJAGUCBQVsb2Z0VAkBDXBhcnNlSW50VmFsdWUBBQVsb2Z0TAUFbG9mdE8DCQBmAgAABQVsb2Z0RgkAAgECME9wZXJhdGlvbiBsZWFkcyB0byBuZWdhdGl2ZSBmcmVlIHdhcmVob3VzZSBzcGFjZQQIbmV3V2hTdHIJALoJAgkAzAgCCQCRAwIFAndoBQt3aElkeExldmVscwkAzAgCCQCRAwIFAndoBQh3aElkeFJlcwkAzAgCCQCRAwIFAndoBQh3aElkeE1hdAkAzAgCCQCRAwIFAndoBQl3aElkeFByb2QJAMwIAgkAuQkCCQDMCAIFBWxvZnRMCQDMCAIJAKQDAQUFbG9mdE8JAMwIAgkApAMBBQVsb2Z0RgkAzAgCCQCkAwEFBWxvZnRUBQNuaWwCAV8FA25pbAIBOgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBXdoS2V5BQhuZXdXaFN0cgUDbmlsBQhuZXdXaFN0cgFpAQ1zZXRDdXN0b21OYW1lAwdhc3NldElkCmN1c3RvbU5hbWUEdHlwZQQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhxFeGFjdGx5IG9uZSBwYXltZW50IHJlcXVpcmVkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAMJAQIhPQIIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhpBbGxvd2VkIFVTRFQgcGF5bWVudCBvbmx5IQMJAQIhPQIIBQNwbXQGYW1vdW50BQxSRU5BTUlOR0NPU1QJAAIBCQCsAgICElBheW1lbnQgc2hvdWxkIGJlIAkApAMBBQxSRU5BTUlOR0NPU1QDCQEIY29udGFpbnMCBQpjdXN0b21OYW1lAgJfXwkAAgEJAKwCAgIeTmFtZSBzaG91bGQgbm90IGNvbnRhaW4gJ19fJzogBQpjdXN0b21OYW1lAwkAZgIJALECAQUKY3VzdG9tTmFtZQUKTUFYTkFNRUxFTgkAAgEJAKwCAgIZTmFtZSB0b28gbG9uZywgbWF4TGVuZ3RoPQkApAMBBQpNQVhOQU1FTEVOBARhZGRyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQHYWN0aW9ucwQHJG1hdGNoMAUEdHlwZQMJAAACAgdBQ0NPVU5UBQckbWF0Y2gwBApyZXZlcnNlS2V5CQEWa2V5Q3VzdG9tTmFtZVRvQWRkcmVzcwEFCmN1c3RvbU5hbWUECW5hbWVPd25lcgkAoggBBQpyZXZlcnNlS2V5AwkBCWlzRGVmaW5lZAEFCW5hbWVPd25lcgkAAgEJAKwCAgIZTmFtZSBhbHJlYWR5IHJlZ2lzdGVyZWQ6IAUKY3VzdG9tTmFtZQQNYWRkclRvTmFtZUtleQkBFmtleUFkZHJlc3NUb0N1c3RvbU5hbWUBBQRhZGRyBAdvbGROYW1lCQCiCAEFDWFkZHJUb05hbWVLZXkEB2ZyZWVPbGQDCQEJaXNEZWZpbmVkAQUHb2xkTmFtZQkAzAgCCQELRGVsZXRlRW50cnkBCQEWa2V5Q3VzdG9tTmFtZVRvQWRkcmVzcwEJAQV2YWx1ZQEFB29sZE5hbWUFA25pbAUDbmlsCQDOCAIJAM0IAgkAzQgCBQdmcmVlT2xkCQELU3RyaW5nRW50cnkCBQ1hZGRyVG9OYW1lS2V5BQpjdXN0b21OYW1lCQELU3RyaW5nRW50cnkCBQpyZXZlcnNlS2V5BQRhZGRyCAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCBQRhZGRyBQx4cEN1c3RvbU5hbWUCXzEDCQAAAgIETEFORAUHJG1hdGNoMAQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQdhc3NldElkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkJAAIBCQCsAgIIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQUHYXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQKcmV2ZXJzZUtleQkBGmtleUxhbmRDdXN0b21OYW1lVG9Bc3NldElkAQUKY3VzdG9tTmFtZQQJbmFtZU93bmVyCQCiCAEFCnJldmVyc2VLZXkDCQEJaXNEZWZpbmVkAQUJbmFtZU93bmVyCQACAQkArAICAhlOYW1lIGFscmVhZHkgcmVnaXN0ZXJlZDogBQpjdXN0b21OYW1lBA5hc3NldFRvTmFtZUtleQkBGmtleUxhbmRBc3NldElkVG9DdXN0b21OYW1lAQUHYXNzZXRJZAQHb2xkTmFtZQkAoggBBQ5hc3NldFRvTmFtZUtleQQHZnJlZU9sZAMJAQlpc0RlZmluZWQBBQdvbGROYW1lCQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlMYW5kQ3VzdG9tTmFtZVRvQXNzZXRJZAEJAQV2YWx1ZQEFB29sZE5hbWUFA25pbAUDbmlsCQDOCAIJAM0IAgkAzQgCBQdmcmVlT2xkCQELU3RyaW5nRW50cnkCBQ5hc3NldFRvTmFtZUtleQUKY3VzdG9tTmFtZQkBC1N0cmluZ0VudHJ5AgUKcmV2ZXJzZUtleQUHYXNzZXRJZAgJARZ1cGRhdGVBY2NTdGF0c0ludGVybmFsAgUEYWRkcgUMeHBDdXN0b21OYW1lAl8xAwkAAAICBERVQ0sFByRtYXRjaDAEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUHYXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQdhc3NldElkAwMJAQEhAQkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQYJAQEhAQkBCWlzRGVmaW5lZAEJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUEYWRkcgkAAgEJAKwCAggFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARBrZXlEdWNrSWRUb093bmVyAQUHYXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKRFVDS1BSRUZJWAINIGlzIG5vdCB5b3VycwQKcmV2ZXJzZUtleQkBGmtleUR1Y2tDdXN0b21OYW1lVG9Bc3NldElkAQUKY3VzdG9tTmFtZQQJbmFtZU93bmVyCQCiCAEFCnJldmVyc2VLZXkDCQEJaXNEZWZpbmVkAQUJbmFtZU93bmVyCQACAQkArAICAhlOYW1lIGFscmVhZHkgcmVnaXN0ZXJlZDogBQpjdXN0b21OYW1lBA5hc3NldFRvTmFtZUtleQkBGmtleUR1Y2tBc3NldElkVG9DdXN0b21OYW1lAQUHYXNzZXRJZAQHb2xkTmFtZQkAoggBBQ5hc3NldFRvTmFtZUtleQQHZnJlZU9sZAMJAQlpc0RlZmluZWQBBQdvbGROYW1lCQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlEdWNrQ3VzdG9tTmFtZVRvQXNzZXRJZAEJAQV2YWx1ZQEFB29sZE5hbWUFA25pbAUDbmlsCQDOCAIJAM0IAgkAzQgCBQdmcmVlT2xkCQELU3RyaW5nRW50cnkCBQ5hc3NldFRvTmFtZUtleQUKY3VzdG9tTmFtZQkBC1N0cmluZ0VudHJ5AgUKcmV2ZXJzZUtleQUHYXNzZXRJZAgJARd1cGRhdGVEdWNrU3RhdHNJbnRlcm5hbAIFB2Fzc2V0SWQFDHhwQ3VzdG9tTmFtZQJfMQkAAgECE1Vua25vd24gZW50aXR5IHR5cGUJAJQKAgkAzggCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMFD2Vjb25vbXlDb250cmFjdAgFA3BtdAZhbW91bnQFC3VzZHRBc3NldElkBQ1wcm9sb2dBY3Rpb25zAAABaQEMc2V0UmVmZXJyYWxzAglvbGRQbGF5ZXIJbmV3UGxheWVyAwkBAiE9AggFAWkPY2FsbGVyUHVibGljS2V5BQNwdWIJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUJb2xkUGxheWVyCQACAQkArAICAhFJbnZhbGlkIGFkZHJlc3M6IAUJb2xkUGxheWVyAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQluZXdQbGF5ZXIJAAIBCQCsAgICEUludmFsaWQgYWRkcmVzczogBQluZXdQbGF5ZXIEB29sZHNLZXkJAQlrZXlPbGRpZXMABARvbGRzCQCiCAEFB29sZHNLZXkEBm9sZGllcwMJAQlpc0RlZmluZWQBBQRvbGRzCQC8CQIJAQV2YWx1ZQEFBG9sZHMCAV8FA25pbAMJAQ9jb250YWluc0VsZW1lbnQCBQZvbGRpZXMFCW5ld1BsYXllcgkAAgEJAKwCAgUJbmV3UGxheWVyAiYgaXMgbm90IG5ld2JpZSAoYWxyZWFkeSBoYXMgcmVmZXJyYWxzKQQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQluZXdQbGF5ZXIEBXJlZkJ5CQCiCAEFCHJlZkJ5S2V5AwMJAQlpc0RlZmluZWQBBQVyZWZCeQkBCWlzRGVmaW5lZAEJAKYIAQkBBXZhbHVlAQUFcmVmQnkHCQACAQkArAICCQCsAgIFCW5ld1BsYXllcgIUIGFscmVhZHkgaGFzIHJlZkJ5OiAJAQV2YWx1ZQEFBXJlZkJ5BAdyZWZzS2V5CQETa2V5QWRkcmVzc1JlZmVycmFscwEFCW9sZFBsYXllcgQEcmVmcwkAoggBBQdyZWZzS2V5BAlyZWZzQXJyYXkDCQEJaXNEZWZpbmVkAQUEcmVmcwkAvAkCCQEFdmFsdWUBBQRyZWZzAgFfBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUJcmVmc0FycmF5BQluZXdQbGF5ZXIJAAIBCQCsAgIJAKwCAgkArAICBQlvbGRQbGF5ZXICEiBhbHJlYWR5IGNvbnRhaW5zIAUJbmV3UGxheWVyAhEgd2l0aGluIHJlZmVycmFscwQHbmV3UmVmcwkAugkCCQDNCAIFCXJlZnNBcnJheQUJbmV3UGxheWVyAgFfBAduZXdPbGRzAwkBD2NvbnRhaW5zRWxlbWVudAIFBm9sZGllcwUJb2xkUGxheWVyCQEFdmFsdWUBBQRvbGRzCQC6CQIJAM0IAgUGb2xkaWVzBQlvbGRQbGF5ZXICAV8JAJQKAgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIFCHJlZkJ5S2V5BQlvbGRQbGF5ZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgUHcmVmc0tleQUHbmV3UmVmcwkAzAgCCQELU3RyaW5nRW50cnkCBQdvbGRzS2V5BQduZXdPbGRzBQNuaWwFDXByb2xvZ0FjdGlvbnMAAAFpARBkaXN0cmlidXRlUG9pbnRzBQhzdHJlbmd0aAhhY2N1cmFjeQlpbnRlbGxlY3QJZW5kdXJhbmNlCWRleHRlcml0eQQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEC3ZpcnRXbGdEYXRhCQEJYXNBbnlMaXN0AQkA/AcEBQt3bGdDb250cmFjdAISY2hlY2tXbGdYcFJFQURPTkxZCQDMCAIFBGFkZHIFA25pbAUDbmlsBA12aXJ0V2xnUG9pbnRzCQEFYXNJbnQBCQCRAwIFC3ZpcnRXbGdEYXRhAAEEDSR0MDk5NDMxOTk4MjEDCQBnAgAABQ12aXJ0V2xnUG9pbnRzCQCUCgIAAAUDbmlsBAdkZWx0YVhQCQEFYXNJbnQBCQD8BwQFC3dsZ0NvbnRyYWN0Agl0YWtlV2xnWHAJAMwIAgUEYWRkcgUDbmlsBQNuaWwDCQAAAgUHZGVsdGFYUAUHZGVsdGFYUAkAlAoCBQ12aXJ0V2xnUG9pbnRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5VXNlckxldmVsAQUEYWRkcgkBBWFzSW50AQkAkQMCBQt2aXJ0V2xnRGF0YQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5VXNlclhQAQUEYWRkcgkBBWFzSW50AQkAkQMCBQt2aXJ0V2xnRGF0YQACBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECXdsZ1BvaW50cwgFDSR0MDk5NDMxOTk4MjECXzEECndsZ0FjdGlvbnMIBQ0kdDA5OTQzMTk5ODIxAl8yBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQECmZyZWVLZXlBY2MJARFrZXlVc2VyRnJlZVBvaW50cwEFBGFkZHIEDWZyZWVQb2ludHNBY2MJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCmZyZWVLZXlBY2MAAAUJd2xnUG9pbnRzBAtmcmVlS2V5RHVjawkBEWtleUR1Y2tGcmVlUG9pbnRzAQULZHVja0Fzc2V0SWQEDmZyZWVQb2ludHNEdWNrCQELdmFsdWVPckVsc2UCCQCfCAEFC2ZyZWVLZXlEdWNrAAAEB3N1bUZyZWUJAGQCBQ1mcmVlUG9pbnRzQWNjBQ5mcmVlUG9pbnRzRHVjawQPc3VtVG9EaXN0cmlidXRlCQBkAgkAZAIJAGQCCQBkAgUIc3RyZW5ndGgFCGFjY3VyYWN5BQlpbnRlbGxlY3QFCWVuZHVyYW5jZQUJZGV4dGVyaXR5AwkAZgIFD3N1bVRvRGlzdHJpYnV0ZQUHc3VtRnJlZQkAAgEJAKwCAgkArAICAg9UaGVyZSBhcmUgb25seSAJAKQDAQUHc3VtRnJlZQIaIGZyZWUgcG9pbnRzIHRvIGRpc3RyaWJ1dGUECGNoYXJzS2V5CQEMa2V5RHVja0NoYXJzAQULZHVja0Fzc2V0SWQEBWNoYXJzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUIY2hhcnNLZXkCCTBfMF8wXzBfMAIBXwQGbmV3QWNjCQBlAgUNZnJlZVBvaW50c0FjYwUPc3VtVG9EaXN0cmlidXRlCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQpmcmVlS2V5QWNjAwkAZgIAAAUGbmV3QWNjAAAFBm5ld0FjYwkAzAgCCQEMSW50ZWdlckVudHJ5AgULZnJlZUtleUR1Y2sDCQBmAgAABQZuZXdBY2MJAGQCBQ5mcmVlUG9pbnRzRHVjawUGbmV3QWNjBQ5mcmVlUG9pbnRzRHVjawkAzAgCCQELU3RyaW5nRW50cnkCBQhjaGFyc0tleQkAuQkCCQDMCAIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUMY2hhclN0cmVuZ3RoBQhzdHJlbmd0aAkAzAgCCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDGNoYXJBY2N1cmFjeQUIYWNjdXJhY3kJAMwIAgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFySW50ZWxsZWN0BQlpbnRlbGxlY3QJAMwIAgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFyRW5kdXJhbmNlBQllbmR1cmFuY2UJAMwIAgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFyRGV4dGVyaXR5BQlkZXh0ZXJpdHkFA25pbAIBXwUDbmlsBQ1wcm9sb2dBY3Rpb25zBQp3bGdBY3Rpb25zAAABaQEcc3BsaXRCeUdsb2JhbFdlaWdodHNSRUFET05MWQEGYW1vdW50CQCUCgIFA25pbAkBEmdldE5lZWRlZE1hdGVyaWFscwEFBmFtb3VudAFpASRzcGxpdEJ5R2xvYmFsQW5kTG9jYWxXZWlnaHRzUkVBRE9OTFkDCW1hdEFtb3VudAlyZXNBbW91bnQIdGVycmFpbnMEDXRlcnJhaW5Db3VudHMJAQ1jb3VudFRlcnJhaW5zAQUIdGVycmFpbnMJAJQKAgUDbmlsCQCUCgIJARJnZXROZWVkZWRNYXRlcmlhbHMBBQltYXRBbW91bnQJARNkaXN0cmlidXRlQnlXZWlnaHRzAgUJcmVzQW1vdW50BQ10ZXJyYWluQ291bnRzAWkBE2dldEJhY2twYWNrUkVBRE9OTFkBC2R1Y2tBc3NldElkCQCUCgIFA25pbAkAuQkCCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAIBOgFpARRnZXRXYXJlaG91c2VSRUFET05MWQELbGFuZEFzc2V0SWQEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQECWxhbmRJbmRleAkAaQIJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIJALUJAggFBWFzc2V0C2Rlc2NyaXB0aW9uAgFfBQtyZWNMYW5kU2l6ZQUFU1NJWkUECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAACQCUCgIFA25pbAkAugkCCQEMZ2V0V2FyZWhvdXNlAwkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkBQlsYW5kSW5kZXgFCmluZnJhTGV2ZWwCAToBaQEKc2F2ZUxhc3RUeAADCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFD2Vjb25vbXlDb250cmFjdAkAzAgCBRJ0b3VybmFtZW50Q29udHJhY3QJAMwIAgUNYWNyZXNDb250cmFjdAUDbmlsCAUBaQZjYWxsZXIJAAIBAg1BY2Nlc3MgZGVuaWVkCQCUCgIJAQZwcm9sb2cBBQFpACoBaQEPdXBkYXRlRHVja1N0YXRzAgtkdWNrQXNzZXRJZAdkZWx0YVhQAwkBAiE9AggFAWkGY2FsbGVyBQ9lY29ub215Q29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkCQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAUHZGVsdGFYUAFpAQ51cGRhdGVBY2NTdGF0cwIEYWRkcgdkZWx0YVhQAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQt3bGdDb250cmFjdAkAzAgCBQ9lY29ub215Q29udHJhY3QJAMwIAgUNYWNyZXNDb250cmFjdAUDbmlsCAUBaQZjYWxsZXIJAAIBAg1BY2Nlc3MgZGVuaWVkCQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIFBGFkZHIFB2RlbHRhWFABaQEJZXF1aXBEdWNrAQllcXVpcG1lbnQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBGFkZHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQEPY2hlY2tUb3VybmFtZW50AQULZHVja0Fzc2V0SWQJAAIBAhllcXVpcER1Y2tfY2hlY2tUb3VybmFtZW50AwkBDWNoZWNrRGVsaXZlcnkBBQtkdWNrQXNzZXRJZAkAAgECF2VxdWlwRHVja19jaGVja0RlbGl2ZXJ5BAVlcUtleQkBEGtleUR1Y2tFcXVpcG1lbnQBBQtkdWNrQXNzZXRJZAQLY3VycmVudFNlZ3MJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQVlcUtleQIXLDssXyw7LF8sOyxfLDssXyw7LF8sOywCAV8EBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAVuZXdFcQkAtQkCBQllcXVpcG1lbnQCAV8DCQECIT0CCQCQAwEFBW5ld0VxBQtOVU1TRUdNRU5UUwkAAgECFldyb25nIGVxdWlwbWVudCBzdHJpbmcECXRlbXBQcm9kQgkBBmRyZXNzQgQFC2N1cnJlbnRTZWdzCQEOcHJvZFN0clRvQnl0ZXMBCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QGBQNuaWwECHNlZ0JwQXV4CQCRAwIJALUJAgkAkQMCBQVuZXdFcQULc2VnQmFja3BhY2sCATsAAQQKYnVmZkVmZmVjdAMJAAACBQhzZWdCcEF1eAIAAAAEBGF1eDAJAJEDAgkAtQkCBQhzZWdCcEF1eAIBLAAAAwkAAAIFBGF1eDACAAAABAZpZHhDbnQJALUJAgUEYXV4MAIBOgQDaWR4CQCRAwIFBmlkeENudAAABANjbnQJAJEDAgUGaWR4Q250AAEDAwMDAwkAAAIFA2lkeAICMDYGCQAAAgUDaWR4AgIwNwYJAAACBQNpZHgCAjA4CQECIT0CBQNjbnQCAAcJAGYCCQENcGFyc2VJbnRWYWx1ZQEFA2NudAAABwkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4CQENcGFyc2VJbnRWYWx1ZQEFA2lkeAIBXwUKcklkeEVmZmVjdAAABAVzdGF0cwkBDGdldER1Y2tTdGF0cwQFBHRoaXMFC2R1Y2tBc3NldElkBQpidWZmRWZmZWN0BgQIbmV3UHJvZEIJAQZkcmVzc0IEBQVuZXdFcQUJdGVtcFByb2RCBwUFc3RhdHMECm5ld1Byb2RTdHIJAQ5ieXRlc1RvUHJvZFN0cgEFCG5ld1Byb2RCCQCUCgIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQVlcUtleQUJZXF1aXBtZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFBWJwS2V5CQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCBQpuZXdQcm9kU3RyBQNuaWwCAToJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUR1Y2tCdWZmcwEFC2R1Y2tBc3NldElkCQC5CQIJAMwIAgkApAMBCQCRAwIFBXN0YXRzAAcJAMwIAgkApAMBCQCRAwIFBXN0YXRzAAgJAMwIAgkApAMBCQCRAwIFBXN0YXRzAAkJAMwIAgkApAMBCQCRAwIFBXN0YXRzAAoJAMwIAgkApAMBCQCRAwIFBXN0YXRzAAsFA25pbAIBXwUDbmlsBQ1wcm9sb2dBY3Rpb25zAAABaQEPZm9ydGlmaWNhdGVMYW5kAgtsYW5kQXNzZXRJZARwbGFuBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQLZHVja0Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUEYWRkcgIABAlkdWNrU3RhdHMJAQxnZXREdWNrU3RhdHMEBQR0aGlzBQtkdWNrQXNzZXRJZAAABwQHZm9ydEtleQkBF2tleUZvcnRpZmljYXRpb25zQnlMYW5kAQULbGFuZEFzc2V0SWQEDGN1cnJlbnRGb3J0cwkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFB2ZvcnRLZXkCDDowXzE1OjBfMTg6MAIBXwQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAQJbGFuZEluZGV4CQBpAgkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAgkAtQkCCAUFYXNzZXQLZGVzY3JpcHRpb24CAV8FC3JlY0xhbmRTaXplBQVTU0laRQQKaW5mcmFMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAAAEBXdoS2V5CQESa2V5V2FyZWhvdXNlQnlMYW5kAQULbGFuZEFzc2V0SWQEAndoCQEMZ2V0V2FyZWhvdXNlAwUFd2hLZXkFCWxhbmRJbmRleAUKaW5mcmFMZXZlbAQHY3VyTG9mdAkAtQkCCQCRAwIFAndoBQl3aElkeExPRlQCAV8EBGN1ck8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdjdXJMb2Z0BQt2b2xPY2N1cGllZAQEY3VyRgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2N1ckxvZnQFB3ZvbEZyZWUECG5ld0ZvcnRzCQC1CQIFBHBsYW4CAV8EDyR0MDEwNjY1OTEwNjc3NAkBBWZvcnRCBgUMY3VycmVudEZvcnRzCQEOcHJvZFN0clRvQnl0ZXMBCQCRAwIFAndoBQl3aElkeFByb2QFBGN1ck8FBGN1ckYGBQNuaWwECXRlbXBQcm9kQggFDyR0MDEwNjY1OTEwNjc3NAJfMQQFdGVtcE8IBQ8kdDAxMDY2NTkxMDY3NzQCXzIEBXRlbXBGCAUPJHQwMTA2NjU5MTA2Nzc0Al8zBA8kdDAxMDY3NzcxMDY4NzMJAQVmb3J0QgYFCG5ld0ZvcnRzBQl0ZW1wUHJvZEIFBXRlbXBPBQV0ZW1wRgcFCWR1Y2tTdGF0cwQIbmV3UHJvZEIIBQ8kdDAxMDY3NzcxMDY4NzMCXzEEBG5ld08IBQ8kdDAxMDY3NzcxMDY4NzMCXzIEBG5ld0YIBQ8kdDAxMDY3NzcxMDY4NzMCXzMECm5ld1Byb2RTdHIJAQ5ieXRlc1RvUHJvZFN0cgEFCG5ld1Byb2RCBApuZXdMb2Z0U3RyCQC5CQIJAMwIAgkAkQMCBQdjdXJMb2Z0BQl2b2xMb2NrZWQJAMwIAgkApAMBBQRuZXdPCQDMCAIJAKQDAQUEbmV3RgkAzAgCCQCRAwIFB2N1ckxvZnQFCHZvbFRvdGFsBQNuaWwCAV8JAJQKAgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2ZvcnRLZXkFBHBsYW4JAMwIAgkBC1N0cmluZ0VudHJ5AgUFd2hLZXkJALoJAgkAzAgCCQCRAwIFAndoBQt3aElkeExldmVscwkAzAgCCQCRAwIFAndoBQh3aElkeFJlcwkAzAgCCQCRAwIFAndoBQh3aElkeE1hdAkAzAgCBQpuZXdQcm9kU3RyCQDMCAIFCm5ld0xvZnRTdHIFA25pbAIBOgUDbmlsBQ1wcm9sb2dBY3Rpb25zAAABaQETaW5pdER1Y2tUb3VyQXR0ZW1wdAELZHVja0Fzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFEnRvdXJuYW1lbnRDb250cmFjdAkAAgECDUFjY2VzcyBkZW5pZWQECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAQFbWF4SFAJAQltYXhIZWFsdGgBCQELdmFsdWVPckVsc2UCCQCfCAEJAQxrZXlEdWNrTGV2ZWwBBQtkdWNrQXNzZXRJZAAABAljdXJIZWFsdGgJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJa2V5SGVhbHRoBQVtYXhIUAQJY3VyTG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCiCAEFCWN1ckxvY0tleQUPREVGQVVMVExPQ0FUSU9OBAZsYXN0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSdG91cm5hbWVudENvbnRyYWN0BQ1sYXN0VG91cklkS2V5AAAEDHRvdXJMb2NhdGlvbgkArAICCQCkAwEFBmxhc3RJZAIEX1RfMAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa2V5U2F2ZWRIZWFsdGgBBQtkdWNrQXNzZXRJZAUJY3VySGVhbHRoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrZXlIZWFsdGgFBW1heEhQCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlTYXZlZExvY2F0aW9uAQULZHVja0Fzc2V0SWQFC2N1ckxvY2F0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWN1ckxvY0tleQUMdG91ckxvY2F0aW9uBQNuaWwFDHRvdXJMb2NhdGlvbgFpAQxicmVha0F0dGVtcHQABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQJY3VyTG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCiCAEFCWN1ckxvY0tleQUPREVGQVVMVExPQ0FUSU9OAwkBAiE9AgkAkQMCCQC1CQIFC2N1ckxvY2F0aW9uAgFfBQpsb2NJZHhUeXBlAgFUCQACAQIiWW91ciBkdWNrIGlzIG5vdCBpbiB0aGUgdG91cm5hbWVudAQLc2F2ZWRIZWFsdGgJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ5rZXlTYXZlZEhlYWx0aAEFC2R1Y2tBc3NldElkBA1zYXZlZExvY2F0aW9uCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEQa2V5U2F2ZWRMb2NhdGlvbgEFC2R1Y2tBc3NldElkCQCUCgIJAM0IAgkAzQgCBQ1wcm9sb2dBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAULc2F2ZWRIZWFsdGgJAQtTdHJpbmdFbnRyeQIFCWN1ckxvY0tleQUNc2F2ZWRMb2NhdGlvbgULY3VyTG9jYXRpb24BaQEWZXhpdFRvdXJuYW1lbnRJbnRlcm5hbAELZHVja0Fzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg1BY2Nlc3MgZGVuaWVkBAtzYXZlZEhlYWx0aAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBDmtleVNhdmVkSGVhbHRoAQULZHVja0Fzc2V0SWQEDXNhdmVkTG9jYXRpb24JARFAZXh0ck5hdGl2ZSgxMDU4KQEJARBrZXlTYXZlZExvY2F0aW9uAQULZHVja0Fzc2V0SWQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAULc2F2ZWRIZWFsdGgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ1zYXZlZExvY2F0aW9uBQNuaWwHAWkBFGV4aXREZWxpdmVyeUludGVybmFsAQtkdWNrQXNzZXRJZAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDUFjY2VzcyBkZW5pZWQEAWUJARJleGl0RGVsaXZlcnlDb21tb24EBQtkdWNrQXNzZXRJZAcAAAAACQCUCgIJAM4IAggFAWUCXzEIBQFlAl8yBwFpARBhdXRvRXhpdERlbGl2ZXJ5BAtkdWNrQXNzZXRJZAVuZXdIUAZyZWFzb24Fc2NvcmUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg1BY2Nlc3MgZGVuaWVkBAFlCQESZXhpdERlbGl2ZXJ5Q29tbW9uBAULZHVja0Fzc2V0SWQGBQVuZXdIUAUFc2NvcmUJAJQKAggFAWUCXzEIBQFlAl8zAWkBDWJyZWFrRGVsaXZlcnkACQCUCgIJAQZwcm9sb2cBBQFpAg1icmVha0RlbGl2ZXJ5AWkBDnByZXBhcmVSb2JiZXJ5AgdtZXNzYWdlA3NpZwQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQEBIQEJAMQTAwUHbWVzc2FnZQUDc2lnBQNwdWIJAAIBAhhzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2gDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQGd2xnQW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFCndsZ0Fzc2V0SWQJAAIBAhVXTEdPTEQgcGF5bWVudHMgb25seSEEBXBhcnRzCQC1CQIJALAJAQUHbWVzc2FnZQIBfAMJAQIhPQIJAJADAQUFcGFydHMAAgkAAgECFFdyb25nIG1lc3NhZ2UgZm9ybWF0BAtkdWNrQXNzZXRJZAkAkQMCBQVwYXJ0cwAAAwkBD2NoZWNrVG91cm5hbWVudAEFC2R1Y2tBc3NldElkCQACAQIecHJlcGFyZVJvYmJlcnlfY2hlY2tUb3VybmFtZW50AwkBDWNoZWNrRGVsaXZlcnkBBQtkdWNrQXNzZXRJZAkAAgECHHByZXBhcmVSb2JiZXJ5X2NoZWNrRGVsaXZlcnkEB3JvYkNvc3QICQEOZ2V0Um9iYmVyeURhdGECBQR0aGlzBQtkdWNrQXNzZXRJZAJfMQMJAGYCBQdyb2JDb3N0BQZ3bGdBbXQJAAIBCQCsAgIJAKwCAgkArAICAghQYXltZW50IAkApAMBBQZ3bGdBbXQCDCA8IHJlcXVpcmVkIAkApAMBBQdyb2JDb3N0BApjYW5kaWRhdGVzCQC1CQIJAJEDAgUFcGFydHMAAQIBXwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJZHVja1N0YXRlCQELdmFsdWVPckVsc2UCCQCfCAEJARNrZXlEdWNrUm9iYmVyeVN0YXRlAQULZHVja0Fzc2V0SWQAAAQKbG9ja2VkTGFuZAkBC3ZhbHVlT3JFbHNlAgkAoggBCQETa2V5TG9ja2VkTGFuZEJ5RHVjawEFC2R1Y2tBc3NldElkAgAEB2xhbmRFVEEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleUxhbmRDb29sZG93bkVUQQEFCmxvY2tlZExhbmQAAAMDCQECIT0CBQlkdWNrU3RhdGUFC2R1Y2tJZHhGcmVlCQBmAgUHbGFuZEVUQQUDbm93BwkAAgEJAKwCAgInWW91IGFscmVhZHkgc3RhcnRlZCByb2JiaW5nLCB3YWl0IHRpbGwgCQCkAwEFB2xhbmRFVEEKAQdjaGVja2VyAgNhY2MLbGFuZEFzc2V0SWQEBXN0YXRlCQELdmFsdWVPckVsc2UCCQCfCAEJARNrZXlMYW5kUm9iYmVyeVN0YXRlAQULbGFuZEFzc2V0SWQAAAQLY29vbGRvd25FVEEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleUxhbmRDb29sZG93bkVUQQEFC2xhbmRBc3NldElkAAADCQBmAgUFc3RhdGUJAJADAQUQbGFuZFJvYkNvb2xkb3ducwkAAgECDUludmFsaWQgc3RhdGUDCQBmAgUDbm93BQtjb29sZG93bkVUQQQKc3Rha2VkVGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAAADCQBnAgAABQpzdGFrZWRUaW1lBQNhY2MEAWEJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAQBZAkAtQkCCAUBYQtkZXNjcmlwdGlvbgIBXwQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCBQFkBQtyZWNMYW5kU2l6ZQQMcHJvZHVjdGl2aXR5CQEMYXBwbHlCb251c2VzAgULbGFuZEFzc2V0SWQFBnBpZWNlcwQJZGVsdGFUaW1lCQBlAgUDbm93BQpzdGFrZWRUaW1lBAhhdmFpbFJlcwkAawMFCWRlbHRhVGltZQkAaAIFDHByb2R1Y3Rpdml0eQUGcGllY2VzBQlEQVlNSUxMSVMDCQBmAgUOTUlOX1JFU19UT19ST0IFCGF2YWlsUmVzBQNhY2MJAM0IAgUDYWNjBQtsYW5kQXNzZXRJZAUDYWNjBAhmaWx0ZXJlZAoAAiRsBQpjYW5kaWRhdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdjaGVja2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAwkAAAIJAJADAQUIZmlsdGVyZWQAAAkAAgECGU5vIGNhbmRpZGF0ZXMgZm9yIHJvYmJlcnkEBnJuZElkeAkBD2dldFJhbmRvbU51bWJlcgMJAJADAQUIZmlsdGVyZWQFB21lc3NhZ2UFA3NpZwQLbGFuZEFzc2V0SWQJAJEDAgUIZmlsdGVyZWQFBnJuZElkeAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJARNrZXlMYW5kUm9iYmVyeVN0YXRlAQULbGFuZEFzc2V0SWQFDHJvYklkeExvY2tlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleUxhbmRDb29sZG93bkVUQQEFC2xhbmRBc3NldElkCQBkAgUDbm93CQCRAwIFEGxhbmRSb2JDb29sZG93bnMFDHJvYklkeExvY2tlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2tleUR1Y2tSb2JiZXJ5U3RhdGUBBQtkdWNrQXNzZXRJZAUQZHVja0lkeFByZXBhcmluZwkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5TG9ja2VkTGFuZEJ5RHVjawEFC2R1Y2tBc3NldElkBQtsYW5kQXNzZXRJZAUDbmlsBQ1wcm9sb2dBY3Rpb25zBQtsYW5kQXNzZXRJZAFpAQdyb2JMYW5kAgdtZXNzYWdlA3NpZwQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQEBIQEJAMQTAwUHbWVzc2FnZQUDc2lnBQNwdWIJAAIBAhhzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2gECHVzZXJBZGRyCQClCAEIBQFpBmNhbGxlcgQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQh1c2VyQWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAlAoCCQDNCAIFDXByb2xvZ0FjdGlvbnMJAQxJbnRlZ2VyRW50cnkCCQEYa2V5TGFzdFJvYmJlcnlUaW1lQnlEdWNrAQULZHVja0Fzc2V0SWQFA25vdwAAAWkBDmFjY2VwdERlbGl2ZXJ5AAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkECHVzZXJBZGRyCQClCAEIBQFpBmNhbGxlcgQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQh1c2VyQWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQJZnVuZFRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIFD2Vjb25vbXlDb250cmFjdAUPZGVsaXZlcnlGdW5kS2V5AAAEC2xvY2tlZFRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIFD2Vjb25vbXlDb250cmFjdAURZGVsaXZlcnlMb2NrZWRLZXkAAAMJAGYCBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkJAGUCBQlmdW5kVG90YWwFC2xvY2tlZFRvdGFsCQACAQkArAICCQCsAgIJAKwCAgIgRGVsaXZlcnkgaXMgbm90IGF2YWlsYWJsZSwgZnVuZD0JAQpmaXhlZFBvaW50AgUJZnVuZFRvdGFsAAYCCSwgbG9ja2VkPQkBCmZpeGVkUG9pbnQCBQtsb2NrZWRUb3RhbAAGBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAhkZWxheUVUQQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5RGVsaXZlcnlEZWxheUJ5RHVjawEFC2R1Y2tBc3NldElkAAADCQBmAgUIZGVsYXlFVEEFA25vdwkAAgEJAKwCAgIqRGVsaXZlcnkgaXMgZm9yYmlkZGVuIGZvciB5b3VyIGR1Y2sgdW50aWwgCQCkAwEFCGRlbGF5RVRBBAZoZWFsdGgJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQDCQBnAgAABQZoZWFsdGgJAAIBAitZb3UgY2Fubm90IGFjY2VwdCBkZWxpdmVyeSB3aXRoIHplcm8gaGVhbHRoBAhjb3VudEtleQkBFGtleVVzZXJEZWxpdmVyeUNvdW50AQUIdXNlckFkZHIEBWNvdW50CQELdmFsdWVPckVsc2UCCQCfCAEFCGNvdW50S2V5AAAEB2xhc3REYXkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleVVzZXJMYXN0RGVsaXZlcnlEYXkBBQh1c2VyQWRkcgAABAV0b2RheQkAaQIFA25vdwUJREFZTUlMTElTBAVhY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBQh1c2VyQWRkcgAABBFhbGxvd2VkRGVsaXZlcmllcwkAZAIFF0FMTE9XRURfRlJFRV9ERUxJVkVSSUVTCQBpAgUFYWNyZXMFGkFDUkVTX0ZPUl9ERUxJVkVSWV9BVFRFTVBUAwMJAGcCBQVjb3VudAURYWxsb3dlZERlbGl2ZXJpZXMJAAACBQdsYXN0RGF5BQV0b2RheQcJAAIBCQCsAgIJAKwCAgIRWW91IGFscmVhZHkgdXNlZCAJAKQDAQURYWxsb3dlZERlbGl2ZXJpZXMCHCBkZWxpdmVyeSBhdHRlbXB0cyBmb3IgdG9kYXkDCQEPY2hlY2tUb3VybmFtZW50AQULZHVja0Fzc2V0SWQJAAIBAh5hY2NlcHREZWxpdmVyeV9jaGVja1RvdXJuYW1lbnQDCQENY2hlY2tEZWxpdmVyeQEFC2R1Y2tBc3NldElkCQACAQIcYWNjZXB0RGVsaXZlcnlfY2hlY2tEZWxpdmVyeQQObmV3TG9ja2VkVG90YWwJAQVhc0ludAEJAPwHBAUPZWNvbm9teUNvbnRyYWN0AhR1cGRhdGVEZWxpdmVyeUxvY2tlZAkAzAgCCQBkAgULbG9ja2VkVG90YWwFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBQNuaWwECWN1ckxvY0tleQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBBQljdXJMb2NLZXkFD0RFRkFVTFRMT0NBVElPTgQQZGVsaXZlcnlMb2NhdGlvbgkArAICCQCkAwEFA25vdwIEX0RfMAkAlAoCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleVNhdmVkTG9jYXRpb24BBQtkdWNrQXNzZXRJZAULY3VyTG9jYXRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgUJY3VyTG9jS2V5BRBkZWxpdmVyeUxvY2F0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQhjb3VudEtleQMJAQIhPQIFB2xhc3REYXkFBXRvZGF5AAAFBWNvdW50BQNuaWwFDXByb2xvZ0FjdGlvbnMJAJQKAgUQZGVsaXZlcnlMb2NhdGlvbgUObmV3TG9ja2VkVG90YWwBaQEVY2hlY2tEZWxpdmVyeUNhbGxiYWNrAQtkdWNrQXNzZXRJZAMJAQIhPQIIBQFpBmNhbGxlcgUSdG91cm5hbWVudENvbnRyYWN0CQACAQINQWNjZXNzIGRlbmllZAkAlAoCBQNuaWwJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQBaQEPZ2VuVGVzdFJFQURPTkxZAgRzZWVkDWxhbmRTaXplSW5kZXgEA3ZyZgkBBXZhbHVlAQgJAQV2YWx1ZQEJAO0HAQD+xawBA3ZyZgQGYmlnTnVtCQEDYWJzAQkAngMBCQDLAQIFA3ZyZgkA9wMBCQCaAwEFBHNlZWQJAJQKAgUDbmlsCQEEZ2VuMQMFBmJpZ051bQUNbGFuZFNpemVJbmRleAD///////////8BADSBSfs=", "height": 2827512, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DYWprMNgwRcxyBQsbywLHWYo17cbCotJBzWj3wpP2zmM Next: EHki7ShqZPBSgtwFxCThNtbfK92WztqA3zVtppJxmNKk Diff:
OldNewDifferences
178178 let ARTPRESALE = "PRESALE"
179179
180180 let NUMRES = 6
181+
182+let NUM_CONTINENTS = 5
181183
182184 let MAX_LANDS_STAKED_BY_USER = 25
183185
13181320
13191321 let TCHARS = ["A", "B", "C", "D", "E", "F"]
13201322
1323+let DECIMATION = 10
1324+
13211325 func addStrInt (acc,el) = (acc + parseIntValue(el))
13221326
13231327
13571361 }
13581362
13591363
1360-func gen1 (seed0,landSizeIndex) = {
1364+func gen1 (seed0,landSizeIndex,continentPreset) = {
13611365 func continentSums (ac,cont) = {
13621366 let curr = split(valueOrElse(getString(keyResTypesByContinent(cont)), "0_0_0_0_0_0"), "_")
13631367 let cSum = {
13771381 $Tuple2((ac._1 :+ cSum), (ac._2 + cSum))
13781382 }
13791383
1380- let $t01981920203 = {
1384+ let $t01986120039 = {
13811385 let $l = continents
13821386 let $s = size($l)
13831387 let $acc0 = $Tuple2(nil, 0)
13911395
13921396 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
13931397 }
1394- let contSums = $t01981920203._1
1395- let total = $t01981920203._2
1398+ let contSums = $t01986120039._1
1399+ let total = $t01986120039._2
13961400 let maxSum = max(contSums)
1397- let rTotal = ((maxSum * 5) - total)
1398- let deltaCont = (rTotal / 50)
1399- let $t02036920657 = if ((rTotal == 0))
1400- then genRand(5, seed0)
1401- else {
1402- let $t02045320506 = genRand((rTotal + (deltaCont * 5)), seed0)
1403- let r = $t02045320506._1
1404- let out = $t02045320506._2
1405- func subr (acc,el) = (acc :+ (maxSum - el))
1406-
1407- let compl = {
1408- let $l = contSums
1409- let $s = size($l)
1410- let $acc0 = nil
1411- func $f1_1 ($a,$i) = if (($i >= $s))
1412- then $a
1413- else subr($a, $l[$i])
1414-
1415- func $f1_2 ($a,$i) = if (($i >= $s))
1416- then $a
1417- else throw("List size exceeds 6")
1418-
1419- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
1401+ let rTotal = ((maxSum * NUM_CONTINENTS) - total)
1402+ let deltaCont = (rTotal / (DECIMATION * NUM_CONTINENTS))
1403+ let $t02023620655 = if (if ((continentPreset >= 0))
1404+ then (NUM_CONTINENTS > continentPreset)
1405+ else false)
1406+ then $Tuple2(continentPreset, seed0)
1407+ else if ((rTotal == 0))
1408+ then genRand(NUM_CONTINENTS, seed0)
1409+ else {
1410+ let $t02043020496 = genRand((rTotal + (deltaCont * NUM_CONTINENTS)), seed0)
1411+ let r = $t02043020496._1
1412+ let out = $t02043020496._2
1413+ func subr (acc,el) = (acc :+ (maxSum - el))
1414+
1415+ let compl = {
1416+ let $l = contSums
1417+ let $s = size($l)
1418+ let $acc0 = nil
1419+ func $f1_1 ($a,$i) = if (($i >= $s))
1420+ then $a
1421+ else subr($a, $l[$i])
1422+
1423+ func $f1_2 ($a,$i) = if (($i >= $s))
1424+ then $a
1425+ else throw("List size exceeds 6")
1426+
1427+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
1428+ }
1429+ $Tuple2(findSlot(compl, r, deltaCont), out)
14201430 }
1421- $Tuple2(findSlot(compl, r, deltaCont), out)
1422- }
1423- let contIdx = $t02036920657._1
1424- let seed1 = $t02036920657._2
1431+ let contIdx = $t02023620655._1
1432+ let seed1 = $t02023620655._2
14251433 let target = targetFreqByContinent[contIdx]
14261434 let actual = split(valueOrElse(getString(keyResTypesByContinent(continents[contIdx])), "0_0_0_0_0_0"), "_")
14271435 func toInts (acc,el) = (acc :+ parseIntValue(el))
14641472 $Tuple2((acc._1 :+ s), (acc._2 + s))
14651473 }
14661474
1467- let $t02144221519 = {
1475+ let $t02143421511 = {
14681476 let $l = intDelta
14691477 let $s = size($l)
14701478 let $acc0 = $Tuple2(nil, 0)
14781486
14791487 $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14801488 }
1481- let shiftedIntDelta = $t02144221519._1
1482- let sumShiftedIntDelta = $t02144221519._2
1483- let deltaRes = (sumShiftedIntDelta / 60)
1484- let $t02156721787 = if ((sumShiftedIntDelta == 0))
1485- then genRand(6, ac._4)
1489+ let shiftedIntDelta = $t02143421511._1
1490+ let sumShiftedIntDelta = $t02143421511._2
1491+ let deltaRes = (sumShiftedIntDelta / (DECIMATION * NUMRES))
1492+ let $t02157821808 = if ((sumShiftedIntDelta == 0))
1493+ then genRand(NUMRES, ac._4)
14861494 else {
1487- let $t02166521729 = genRand((sumShiftedIntDelta + (deltaRes * 6)), ac._4)
1488- let r = $t02166521729._1
1489- let out = $t02166521729._2
1495+ let $t02168121750 = genRand((sumShiftedIntDelta + (deltaRes * NUMRES)), ac._4)
1496+ let r = $t02168121750._1
1497+ let out = $t02168121750._2
14901498 $Tuple2(findSlot(shiftedIntDelta, r, deltaRes), out)
14911499 }
1492- let idx = $t02156721787._1
1493- let seed2 = $t02156721787._2
1500+ let idx = $t02157821808._1
1501+ let seed2 = $t02157821808._2
14941502 func addByIndex (acc,j) = (acc :+ (ac._2[j] + (if ((j == idx))
14951503 then landSizeIndex
14961504 else 0)))
15091517
15101518 $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6)
15111519 }
1512- $Tuple4((ac._1 :+ TCHARS[idx]), updatedActuals, (ac._3 + landSizeIndex), seed2)
1520+ $Tuple4((ac._1 + TCHARS[idx]), updatedActuals, (ac._3 + landSizeIndex), seed2)
15131521 }
15141522
15151523 let result = {
15161524 let $l = PERM25
15171525 let $s = size($l)
1518- let $acc0 = $Tuple4(nil, actualInts, contSum, seed1)
1526+ let $acc0 = $Tuple4("", actualInts, contSum, seed1)
15191527 func $f2_1 ($a,$i) = if (($i >= $s))
15201528 then $a
15211529 else genSingleTerrain($a, $l[$i])
15261534
15271535 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
15281536 }
1529- func permut (acc,j) = (acc + result._1[j])
1530-
1531- $Tuple2(contIdx, {
1532- let $l = PERM25
1533- let $s = size($l)
1534- let $acc0 = ""
1535- func $f3_1 ($a,$i) = if (($i >= $s))
1536- then $a
1537- else permut($a, $l[$i])
1538-
1539- func $f3_2 ($a,$i) = if (($i >= $s))
1540- then $a
1541- else throw("List size exceeds 25")
1542-
1543- $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
1544- })
1537+ $Tuple2(contIdx, result._1)
15451538 }
15461539
15471540
19871980
19881981
19891982 func checkClaimConditions (addr,claimMode,landAssetIdIn) = {
1990- let $t03669237231 = if ((claimMode == claimModeWh))
1983+ let $t03663637175 = if ((claimMode == claimModeWh))
19911984 then $Tuple2(landAssetIdIn, valueOrElse(getString(keyStakedDuckByOwner(addr)), ""))
19921985 else {
19931986 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
19971990 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
19981991 else $Tuple2(loc[locIdxId], duckAssetId)
19991992 }
2000- let landAssetId = $t03669237231._1
2001- let duckId = $t03669237231._2
1993+ let landAssetId = $t03663637175._1
1994+ let duckId = $t03663637175._2
20021995 let asset = value(assetInfo(fromBase58String(landAssetId)))
20031996 let timeKey = keyStakedTimeByAssetId(landAssetId)
20041997 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("Land " + asset.name) + " is not staked"))
20462039 let currentPack = getBackpack(bpKey)
20472040 let currentPackRes = split(currentPack[bpIdxRes], "_")
20482041 let currentWhRes = split(currentWh[whIdxRes], "_")
2049- let $t03960540476 = if ((claimMode == claimModeWh))
2042+ let $t03954940420 = if ((claimMode == claimModeWh))
20502043 then $Tuple4(addRes(currentWhRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), currentPack[bpIdxRes], (parseIntValue(loft[volOccupied]) + resToClaim._2), (parseIntValue(loft[volFree]) - resToClaim._2))
20512044 else if ((claimMode == claimModeDuck))
20522045 then $Tuple4(currentWh[whIdxRes], addRes(currentPackRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), parseIntValue(loft[volOccupied]), parseIntValue(loft[volFree]))
20552048 let whAm = min([parseIntValue(loft[volFree]), resToClaim._2])
20562049 $Tuple4(distr._1, distr._2, (parseIntValue(loft[volOccupied]) + whAm), (parseIntValue(loft[volFree]) - whAm))
20572050 }
2058- let whRes = $t03960540476._1
2059- let bpRes = $t03960540476._2
2060- let loftO = $t03960540476._3
2061- let loftF = $t03960540476._4
2051+ let whRes = $t03954940420._1
2052+ let bpRes = $t03954940420._2
2053+ let loftO = $t03954940420._3
2054+ let loftF = $t03954940420._4
20622055 $Tuple5([IntegerEntry(keyStakedTimeByAssetId(c._2), newTimestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, c._2, addr), newTimestamp)], bpKey, [currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], whKey, [currentWh[whIdxLevels], whRes, currentWh[whIdxMat], currentWh[whIdxProd], makeString([loft[volLocked], toString(loftO), toString(loftF), loft[volTotal]], "_")])
20632056 }
20642057 }
27232716 let isDeliv = (newLoc[locIdxType] == "D")
27242717 let eqKey = keyDuckEquipment(duckAssetId)
27252718 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2726- let $t07311873215 = subtractEquipment(currentEq, f._5)
2727- let newEq = $t07311873215._1
2728- let shouldZeroBuffs = $t07311873215._2
2729- let $t07321876330 = if (!(onMission(tournamentContract, curLocation)))
2719+ let $t07306273159 = subtractEquipment(currentEq, f._5)
2720+ let newEq = $t07306273159._1
2721+ let shouldZeroBuffs = $t07306273159._2
2722+ let $t07316276274 = if (!(onMission(tournamentContract, curLocation)))
27302723 then if (!(isUsualLocation(newLocation)))
27312724 then cheatAttempt(curLocation, newLocation, 5)
27322725 else if ((newHP > 0))
27862779 else throw("Strict value is not equal to itself.")
27872780 }
27882781 }
2789- let locToSave = $t07321876330._1
2790- let hpToSave = $t07321876330._2
2782+ let locToSave = $t07316276274._1
2783+ let hpToSave = $t07316276274._2
27912784 $Tuple2(((([StringEntry(locKey, locToSave), StringEntry(eqKey, newEq), IntegerEntry(keyDuckHealth(duckAssetId), hpToSave)] ++ prologActions) ++ (if (shouldZeroBuffs)
27922785 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
27932786 else nil)) ++ updateDuckStatsInternal(duckAssetId, if ((newHP > 0))
29932986 let newMat = makeString(subtractMaterials(true, mList, EXPMATERIALS), "_")
29942987 let eqKey = keyDuckEquipment(duckAssetId)
29952988 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2996- let $t08377083867 = subtractEquipment(currentEq, f._5)
2997- let newEq = $t08377083867._1
2998- let shouldZeroBuffs = $t08377083867._2
2989+ let $t08371483811 = subtractEquipment(currentEq, f._5)
2990+ let newEq = $t08371483811._1
2991+ let shouldZeroBuffs = $t08371483811._2
29992992 let e = expeditionInternal(i.caller, i.transactionId)
30002993 let id = e._2._1
30012994 let result = if ((0 >= f._1))
33103303 let addr = toString(i.originCaller)
33113304 let virtWlgData = asAnyList(invoke(wlgContract, "checkWlgXpREADONLY", [addr], nil))
33123305 let virtWlgPoints = asInt(virtWlgData[1])
3313- let $t09948799877 = if ((0 >= virtWlgPoints))
3306+ let $t09943199821 = if ((0 >= virtWlgPoints))
33143307 then $Tuple2(0, nil)
33153308 else {
33163309 let deltaXP = asInt(invoke(wlgContract, "takeWlgXp", [addr], nil))
33183311 then $Tuple2(virtWlgPoints, [IntegerEntry(keyUserLevel(addr), asInt(virtWlgData[0])), IntegerEntry(keyUserXP(addr), asInt(virtWlgData[2]))])
33193312 else throw("Strict value is not equal to itself.")
33203313 }
3321- let wlgPoints = $t09948799877._1
3322- let wlgActions = $t09948799877._2
3314+ let wlgPoints = $t09943199821._1
3315+ let wlgActions = $t09943199821._2
33233316 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
33243317 let freeKeyAcc = keyUserFreePoints(addr)
33253318 let freePointsAcc = (valueOrElse(getInteger(freeKeyAcc), 0) + wlgPoints)
34703463 let curO = parseIntValue(curLoft[volOccupied])
34713464 let curF = parseIntValue(curLoft[volFree])
34723465 let newForts = split(plan, "_")
3473- let $t0106715106830 = fortB(currentForts, prodStrToBytes(wh[whIdxProd]), curO, curF, true, nil)
3474- let tempProdB = $t0106715106830._1
3475- let tempO = $t0106715106830._2
3476- let tempF = $t0106715106830._3
3477- let $t0106833106929 = fortB(newForts, tempProdB, tempO, tempF, false, duckStats)
3478- let newProdB = $t0106833106929._1
3479- let newO = $t0106833106929._2
3480- let newF = $t0106833106929._3
3466+ let $t0106659106774 = fortB(currentForts, prodStrToBytes(wh[whIdxProd]), curO, curF, true, nil)
3467+ let tempProdB = $t0106659106774._1
3468+ let tempO = $t0106659106774._2
3469+ let tempF = $t0106659106774._3
3470+ let $t0106777106873 = fortB(newForts, tempProdB, tempO, tempF, false, duckStats)
3471+ let newProdB = $t0106777106873._1
3472+ let newO = $t0106777106873._2
3473+ let newF = $t0106777106873._3
34813474 let newProdStr = bytesToProdStr(newProdB)
34823475 let newLoftStr = makeString([curLoft[volLocked], toString(newO), toString(newF), curLoft[volTotal]], "_")
34833476 $Tuple2(([StringEntry(fortKey, plan), StringEntry(whKey, makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], newProdStr, newLoftStr], ":"))] ++ prologActions), 0)
37253718 func genTestREADONLY (seed,landSizeIndex) = {
37263719 let vrf = value(value(blockInfoByHeight(2827006)).vrf)
37273720 let bigNum = abs(toBigInt((vrf + sha256(toBytes(seed)))))
3728- $Tuple2(nil, gen1(bigNum, landSizeIndex))
3721+ $Tuple2(nil, gen1(bigNum, landSizeIndex, -1))
37293722 }
37303723
37313724
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let DAYMILLIS = 86400000
55
66 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
77
88
99 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
1010
1111
1212 let SCALE8 = 100000000
1313
1414 let xpLevelScale = 3200
1515
1616 let xpLevelRecipPow = 4000
1717
1818 let numPointsOnLevelUp = 3
1919
2020 let robberyCostMin = 100000000
2121
2222 let robberyCooldownCoeff = 400
2323
2424 let requirements = ["Strength", "Accuracy", "Intellect", "Endurance", "Dexterity", "Level", "Health"]
2525
2626 let charStrength = 0
2727
2828 let charAccuracy = 1
2929
3030 let charIntellect = 2
3131
3232 let charEndurance = 3
3333
3434 let charDexterity = 4
3535
3636 let segBackpack = 0
3737
3838 let NUMSEGMENTS = 6
3939
4040 let NUMMAINAUX = 2
4141
4242 let MAXSLOTS = 2
4343
4444 let MAXPRODINSLOT = 30
4545
4646 let landRobCooldowns = [0, 600000, 900000, 43200000, 21600000]
4747
4848 let MIN_RES_TO_ROB = 20000000
4949
5050 let robIdxLocked = 1
5151
5252 let duckIdxFree = 0
5353
5454 let duckIdxPreparing = 1
5555
5656 func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
5757
5858
5959 func keyDuckChars (duckAssetId) = ("duckChars_" + duckAssetId)
6060
6161
6262 func keyDuckXP (duckAssetId) = ("duckXP_" + duckAssetId)
6363
6464
6565 func keyDuckLevel (duckAssetId) = ("duckLevel_" + duckAssetId)
6666
6767
6868 func keyDuckFreePoints (duckAssetId) = ("duckFreePoints_" + duckAssetId)
6969
7070
7171 func keyDuckEquipment (duckAssetId) = ("duckEquipment_" + duckAssetId)
7272
7373
7474 func keyUserXP (addr) = ("userXP_" + addr)
7575
7676
7777 func keyUserLevel (addr) = ("userLevel_" + addr)
7878
7979
8080 func keyUserFreePoints (addr) = ("userFreePoints_" + addr)
8181
8282
8383 func keySavedHealth (duckAssetId) = ("savedHealth_" + duckAssetId)
8484
8585
8686 func keySavedLocation (duckAssetId) = ("savedLocation_" + duckAssetId)
8787
8888
8989 func keyDuckBuffs (duckAssetId) = ("duckBuffs_" + duckAssetId)
9090
9191
9292 func keyLastRobberyTimeByDuck (duckAssetId) = ("lastRobberyTime_" + duckAssetId)
9393
9494
9595 func keyLastRobberyCostByDuck (duckAssetId) = ("lastRobberyCost_" + duckAssetId)
9696
9797
9898 func keyLandRobberyState (landAssetId) = ("landRobberyState_" + landAssetId)
9999
100100
101101 func keyLandCooldownETA (landAssetId) = ("landCooldownETA_" + landAssetId)
102102
103103
104104 func keyDuckRobberyState (duckAssetId) = ("duckRobberyState_" + duckAssetId)
105105
106106
107107 func keyLockedLandByDuck (duckAssetId) = ("lockedLandByDuck_" + duckAssetId)
108108
109109
110110 func keyDeliveryDelayByDuck (duckAssetId) = ("deliveryDelayByDuck_" + duckAssetId)
111111
112112
113113 func keyUserDeliveryCount (addr) = ("userDeliveryCount_" + addr)
114114
115115
116116 func keyUserLastDeliveryDay (addr) = ("userLastDeliveryDay_" + addr)
117117
118118
119119 let xpClaim = 10000
120120
121121 let xpSuccessFlight = 10000
122122
123123 let xpFailFlight = 2000
124124
125125 let xpCallES = 100000
126126
127127 let xpCustomName = 1000000
128128
129129 let xpNewSLand = 5000000
130130
131131 let xpUpgradeInfra = 10000
132132
133133 let xpMerge = 1000000
134134
135135 let xpOnboard = 1000000
136136
137137 let xpHeal = 10000
138138
139139 func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
140140
141141
142142 func maxHealth (level) = (100 + level)
143143
144144
145145 func levelUp (currLevel,newXP) = {
146146 let newLevel = levelByXP(newXP)
147147 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
148148 }
149149
150150
151151 func getDuckStats (stakingContract,duckAssetId,buffEffect,forceBuffs) = {
152152 let chars = split(valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0"), "_")
153153 let lvl = valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0)
154154 let health = valueOrElse(getInteger(stakingContract, keyDuckHealth(duckAssetId)), maxHealth(lvl))
155155 let stateBuffs = split(valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0"), "_")
156156 ([parseIntValue(chars[charStrength]), parseIntValue(chars[charAccuracy]), parseIntValue(chars[charIntellect]), parseIntValue(chars[charEndurance]), parseIntValue(chars[charDexterity]), lvl, health] ++ (if (forceBuffs)
157157 then [buffEffect, buffEffect, buffEffect, buffEffect, buffEffect]
158158 else [parseIntValue(stateBuffs[charStrength]), parseIntValue(stateBuffs[charAccuracy]), parseIntValue(stateBuffs[charIntellect]), parseIntValue(stateBuffs[charEndurance]), parseIntValue(stateBuffs[charDexterity])]))
159159 }
160160
161161
162162 func getRobberyData (stakingContract,duckAssetId) = {
163163 let lastRobCost = valueOrElse(getInteger(stakingContract, keyLastRobberyCostByDuck(duckAssetId)), 0)
164164 let lastRobTime = valueOrElse(getInteger(stakingContract, keyLastRobberyTimeByDuck(duckAssetId)), 0)
165165 let now = lastBlock.timestamp
166166 let robCost = max([robberyCostMin, (lastRobCost - (robberyCooldownCoeff * (now - lastRobTime)))])
167167 let duckState = valueOrElse(getInteger(stakingContract, keyDuckRobberyState(duckAssetId)), 0)
168168 let lockedLand = valueOrElse(getString(stakingContract, keyLockedLandByDuck(duckAssetId)), "")
169169 let landETA = valueOrElse(getInteger(stakingContract, keyLandCooldownETA(lockedLand)), 0)
170170 $Tuple5(robCost, lastRobTime, duckState, lockedLand, landETA)
171171 }
172172
173173
174174 let LANDPREFIX = "LAND"
175175
176176 let DUCKPREFIX = "DUCK"
177177
178178 let ARTPRESALE = "PRESALE"
179179
180180 let NUMRES = 6
181+
182+let NUM_CONTINENTS = 5
181183
182184 let MAX_LANDS_STAKED_BY_USER = 25
183185
184186 let DAILYRESBYPIECE = 3456000
185187
186188 let WHMULTIPLIER = 10000000000
187189
188190 let DEFAULTLOCATION = "Africa_F_Africa"
189191
190192 let RESOURCEPRICEMIN = 39637
191193
192194 let ESSELLCOEF = 10
193195
194196 let MIN_USDT_FEE_DELIVERY = 50000
195197
196198 let TEN_MINUTES_MILLIS = 600000
197199
198200 let ALLOWED_FREE_DELIVERIES = 1
199201
200202 let ACRES_FOR_DELIVERY_ATTEMPT = 50000000
201203
202204 let prodTypes = ["First Aid Kit L1", "First Aid Kit L2", "First Aid Kit L3", "Backpack L1", "Backpack L2", "Backpack L3", "Food Ration L1", "Food Ration L2", "Food Ration L3", "Jet Pack L1", "Jet Pack L2", "Jet Pack L3", "Shield L1", "Shield L2", "Shield L3", "Mine L1", "Mine L2", "Mine L3", "Trap L1", "Trap L2", "Trap L3"]
203205
204206 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
205207
206208 let COEFF2MAT = 10000000
207209
208210 let fortAllowedProds = [15, 16, 17, 18, 19, 20]
209211
210212 let productionMatrix = ["8_8_8_17_17_42_12_0_30_0,0,0,0,0,0,0_", "8_8_8_17_17_42_24_0_60_0,0,5,2,0,0,0_", "8_8_8_17_17_42_36_0_120_0,0,10,4,0,0,0_", "8_19_19_8_27_19_26_1_20_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_52_1_40_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_78_1_80_0,0,0,0,0,0,0_001", "8_8_8_8_8_60_13_2_2_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_26_2_4_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_39_2_8_0,0,0,0,0,0,0_011", "30_30_3_17_17_3_30_3_30_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_60_3_50_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_90_3_70_0,0,0,0,0,0,0_111", "18_18_10_18_18_18_11_4_10_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_22_4_20_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_33_4_30_0,0,0,0,0,0,0_201", "4_13_22_4_35_22_23_0_50,1,0_0,0,0,0,0,0,0_", "4_13_22_4_35_22_46_0_50,1,1_0,2,5,0,0,0,0_", "4_13_22_4_35_22_69_0_50,2,1_0,5,10,0,0,0,0_", "5_25_40_5_10_15_20_1_30,1,1_0,0,0,0,0,0,0_", "5_25_40_5_10_15_40_1_30,1,2_2,1,3,0,0,0,0_", "5_25_40_5_10_15_60_1_30,1,3_5,2,8,0,0,0,0_"]
211213
212214 let rIdxCoeff = 6
213215
214216 let rIdxEffect = 8
215217
216218 let rIdxRequirements = 9
217219
218220 let rIdxSlots = 10
219221
220222 let PRODUCTPKGSIZE = 10
221223
222224 let whIdxLevels = 0
223225
224226 let whIdxRes = 1
225227
226228 let whIdxMat = 2
227229
228230 let whIdxProd = 3
229231
230232 let whIdxLOFT = 4
231233
232234 let volLocked = 0
233235
234236 let volOccupied = 1
235237
236238 let volFree = 2
237239
238240 let volTotal = 3
239241
240242 let bpIdxLevel = 0
241243
242244 let bpIdxRes = 1
243245
244246 let bpIdxMat = 2
245247
246248 let bpIdxProd = 3
247249
248250 let locIdxContinent = 0
249251
250252 let locIdxType = 1
251253
252254 let locIdxId = 2
253255
254256 func keyLandAssetIdToOwner (assetId) = ("no_" + assetId)
255257
256258
257259 func keyLandAssetIdToCustomName (assetId) = ("lcna_" + assetId)
258260
259261
260262 func keyStakedTimeByAssetId (assetId) = ("st_" + assetId)
261263
262264
263265 func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["las", type, assetId], "_")
264266
265267
266268 func keyStakedTimeByTypeAssetIdAndOwner (nftType,assetId,ownerAddr) = ((((("sttao_" + nftType) + "_") + assetId) + "_") + ownerAddr)
267269
268270
269271 func keyWarehouseByLand (landAssetId) = ("wh_" + landAssetId)
270272
271273
272274 func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
273275
274276
275277 func keyFortificationsByLand (landAssetId) = ("fortifications_" + landAssetId)
276278
277279
278280 func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
279281
280282
281283 func keyAddressToCustomName (addr) = ("accountCustomNameByAddr_" + addr)
282284
283285
284286 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
285287
286288
287289 func keyOnboardArtActivatedOnDuck (duckAssetId) = ("onboardArtActivatedOnDuck_" + duckAssetId)
288290
289291
290292 func keyOnboardArtDuckActivatedBy (addr) = ("onboardArtActivatedDuckBy_" + addr)
291293
292294
293295 func keyAddressReferrals (addr) = ("accReferrals_" + addr)
294296
295297
296298 func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
297299
298300
299301 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
300302
301303
302304 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
303305
304306
305307 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
306308
307309
308310 func keyUserGwlReleaseTime (userAddr) = ("%s%s__userGwlReleaseTime__" + userAddr)
309311
310312
311313 func keyEsWarehouse () = "emergencyWarehouseProducts"
312314
313315
314316 let deliveryFundKey = "deliveryFund"
315317
316318 let deliveryLockedKey = "deliveryLocked"
317319
318320 let lastTourIdKey = "%s__lastTourId"
319321
320322 func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
321323
322324
323325 func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
324326
325327
326328 func keyBestResultByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__bestResultByTourAndDuck", toString(tId), duckAssetId], "__")
327329
328330
329331 let idxStatic = 0
330332
331333 let idxDynamic = 1
332334
333335 let tStaticEnd = 6
334336
335337 let tDynamicStatus = 1
336338
337339 func getTourData (tourContract,tId) = {
338340 let static = split(valueOrErrorMessage(getString(tourContract, keyTourStaticDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
339341 let dynamic = split_4C(valueOrErrorMessage(getString(tourContract, keyTourDynamicDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
340342 [static, dynamic]
341343 }
342344
343345
344346 func isInTournament (tourContract,location) = {
345347 let lastId = valueOrElse(getInteger(tourContract, lastTourIdKey), 0)
346348 let loc = split(location, "_")
347349 let now = lastBlock.timestamp
348350 let tData = getTourData(tourContract, lastId)
349351 let static = tData[idxStatic]
350352 let dynamic = tData[idxDynamic]
351353 if (if (if ((loc[locIdxType] == "T"))
352354 then (parseIntValue(loc[locIdxContinent]) == lastId)
353355 else false)
354356 then (dynamic[tDynamicStatus] == "INPROGRESS")
355357 else false)
356358 then (parseIntValue(static[tStaticEnd]) > now)
357359 else false
358360 }
359361
360362
361363 func isInDelivery (location) = {
362364 let loc = split(location, "_")
363365 let now = lastBlock.timestamp
364366 let startTime = parseIntValue(loc[locIdxContinent])
365367 let distance = parseIntValue(loc[locIdxId])
366368 if (if ((loc[locIdxType] == "D"))
367369 then ((startTime + TEN_MINUTES_MILLIS) > now)
368370 else false)
369371 then (3 >= distance)
370372 else false
371373 }
372374
373375
374376 func isUsualLocation (location) = {
375377 let locType = split(location, "_")[locIdxType]
376378 if ((locType != "T"))
377379 then (locType != "D")
378380 else false
379381 }
380382
381383
382384 func onMission (tourContract,location) = {
383385 let lastId = valueOrElse(getInteger(tourContract, lastTourIdKey), 0)
384386 let loc = split(location, "_")
385387 let now = lastBlock.timestamp
386388 let tData = getTourData(tourContract, lastId)
387389 let static = tData[idxStatic]
388390 let dynamic = tData[idxDynamic]
389391 let locType = loc[locIdxType]
390392 if ((locType == "D"))
391393 then true
392394 else if (if (if ((loc[locIdxType] == "T"))
393395 then (parseIntValue(loc[locIdxContinent]) == lastId)
394396 else false)
395397 then (dynamic[tDynamicStatus] == "INPROGRESS")
396398 else false)
397399 then (parseIntValue(static[tStaticEnd]) > now)
398400 else false
399401 }
400402
401403
402404 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
403405
404406
405407 func cheatAttempt (oldLoc,newLoc,cheatCase) = throw(((((("Cheat attempt: oldLoc=" + oldLoc) + ", newLoc=") + newLoc) + ", case=") + toString(cheatCase)))
406408
407409
408410 let KS_SEPARATE_PUBLIC_KEY = false
409411
410412 let KS_ALLOW_BIG_INFRA_MERGE = false
411413
412414 let DAY_MILLIS = 86400000
413415
414416 let chain = take(drop(this.bytes, 1), 1)
415417
416418 let usdtAssetId = match chain {
417419 case _ =>
418420 if ((base58'2W' == $match0))
419421 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
420422 else if ((base58'2T' == $match0))
421423 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
422424 else throw("Unknown chain")
423425 }
424426
425427 let defaultRestAddressStr = match chain {
426428 case _ =>
427429 if ((base58'2W' == $match0))
428430 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
429431 else if ((base58'2T' == $match0))
430432 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
431433 else throw("Unknown chain")
432434 }
433435
434436 let InfraUpgradeCostS = match chain {
435437 case _ =>
436438 if ((base58'2W' == $match0))
437439 then 10000000000
438440 else if ((base58'2T' == $match0))
439441 then 100000000
440442 else throw("Unknown chain")
441443 }
442444
443445 let arbitrageDelay = match chain {
444446 case _ =>
445447 if ((base58'2W' == $match0))
446448 then DAY_MILLIS
447449 else if ((base58'2T' == $match0))
448450 then 60000
449451 else throw("Unknown chain")
450452 }
451453
452454 let DELIVERY_PUNISHMENT = match chain {
453455 case _ =>
454456 if ((base58'2W' == $match0))
455457 then 10800000
456458 else if ((base58'2T' == $match0))
457459 then 900000
458460 else throw("Unknown chain")
459461 }
460462
461463 let SEP = "__"
462464
463465 let MULT6 = 1000000
464466
465467 let MULT8 = 100000000
466468
467469 let SSIZE = 25
468470
469471 let MSIZE = 100
470472
471473 let LSIZE = 225
472474
473475 let XLSIZE = 400
474476
475477 let XXLSIZE = 625
476478
477479 let ITER6 = [0, 1, 2, 3, 4, 5]
478480
479481 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
480482
481483
482484 let IdxCfgStakingDapp = 1
483485
484486 let IdxCfgEconomyDapp = 2
485487
486488 let IdxCfgGovernanceDapp = 3
487489
488490 let IdxCfgWlgDapp = 4
489491
490492 let IdxCfgTournamentDapp = 7
491493
492494 let IdxCfgAcresDapp = 8
493495
494496 func keyRestCfg () = "%s__restConfig"
495497
496498
497499 func keyRestAddress () = "%s__restAddr"
498500
499501
500502 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
501503
502504
503505 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
504506
505507
506508 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
507509
508510 let restCfg = readRestCfgOrFail(restContract)
509511
510512 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
511513
512514 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
513515
514516 let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
515517
516518 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
517519
518520 let tournamentContract = getContractAddressOrFail(restCfg, IdxCfgTournamentDapp)
519521
520522 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
521523
522524 let recLandNum = 0
523525
524526 let recLandSize = 1
525527
526528 let recTerrains = 2
527529
528530 let recContinent = 3
529531
530532 let wlgAssetIdKey = "wlg_assetId"
531533
532534 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
533535
534536 let acresAssetIdKey = "acresAssetId"
535537
536538 let acresAssetId = valueOrErrorMessage(getBinary(acresContract, acresAssetIdKey), "ACRES is not issued yet")
537539
538540 let randomDelay = 2
539541
540542 func keyCommit (address) = ("finishBlockForAddr_" + address)
541543
542544
543545 func keyResProportions () = "resTypesProportions"
544546
545547
546548 func keyResTypesByContinent (continent) = ("resTypesByContinent_" + continent)
547549
548550
549551 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
550552
551553
552554 func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
553555
554556
555557 func asString (v) = match v {
556558 case s: String =>
557559 s
558560 case _ =>
559561 throw("fail to cast into String")
560562 }
561563
562564
563565 func asInt (v) = match v {
564566 case n: Int =>
565567 n
566568 case _ =>
567569 throw("fail to cast into Int")
568570 }
569571
570572
571573 func asAnyList (v) = match v {
572574 case l: List[Any] =>
573575 l
574576 case _ =>
575577 throw("fail to cast into List[Any]")
576578 }
577579
578580
579581 func asBoolean (v) = match v {
580582 case s: Boolean =>
581583 s
582584 case _ =>
583585 throw("fail to cast into Boolean")
584586 }
585587
586588
587589 func numPiecesBySize (landSize) = match landSize {
588590 case _ =>
589591 if (("S" == $match0))
590592 then SSIZE
591593 else if (("M" == $match0))
592594 then MSIZE
593595 else if (("L" == $match0))
594596 then LSIZE
595597 else if (("XL" == $match0))
596598 then XLSIZE
597599 else if (("XXL" == $match0))
598600 then XXLSIZE
599601 else throw("Unknown land size")
600602 }
601603
602604
603605 func isDigit (s) = isDefined(parseInt(s))
604606
605607
606608 func keyBlocked () = "contractsBlocked"
607609
608610
609611 func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
610612
611613
612614 func fixedPoint (val,decimals) = {
613615 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
614616 let lowPart = toString((val % tenPow))
615617 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
616618 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
617619 }
618620
619621
620622 func getRandomNumber (maxValue,salt,entropy) = {
621623 let randomHash = sha256((salt + entropy))
622624 (toInt(randomHash) % maxValue)
623625 }
624626
625627
626628 let incubatorAddr = match chain {
627629 case _ =>
628630 if ((base58'2W' == $match0))
629631 then addressFromStringValue("3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv")
630632 else if ((base58'2T' == $match0))
631633 then this
632634 else throw("Unknown chain")
633635 }
634636
635637 let breederAddr = match chain {
636638 case _ =>
637639 if ((base58'2W' == $match0))
638640 then addressFromStringValue("3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb")
639641 else if ((base58'2T' == $match0))
640642 then this
641643 else throw("Unknown chain")
642644 }
643645
644646 let pub = match chain {
645647 case _ =>
646648 if ((base58'2W' == $match0))
647649 then if (KS_SEPARATE_PUBLIC_KEY)
648650 then base58'CWsMtTZC5BjjoL4Q1ayW4Wwb1ehGACQB6DrKyPgotKfm'
649651 else base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
650652 else if ((base58'2T' == $match0))
651653 then base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
652654 else throw("Unknown chain")
653655 }
654656
655657 let EMPTY_PROD50 = base64'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='
656658
657659 let FIVEMINUTESMILLIS = 300000
658660
659661 let RENAMINGCOST = 5000000
660662
661663 let MAXNAMELEN = 50
662664
663665 let InfraUpgradeCostSUsdt = 10000000
664666
665667 let EXPMATERIALS = match chain {
666668 case _ =>
667669 if ((base58'2W' == $match0))
668670 then 252289527462
669671 else if ((base58'2T' == $match0))
670672 then 2522895274
671673 else throw("Unknown chain")
672674 }
673675
674676 let EXPUSDT = match chain {
675677 case _ =>
676678 if ((base58'2W' == $match0))
677679 then 250000000
678680 else if ((base58'2T' == $match0))
679681 then 250000000
680682 else throw("Unknown chain")
681683 }
682684
683685 let S_COST_ACRES = 2500000000
684686
685687 let FIVEX = toBigInt(5)
686688
687689 let TWENTYX = toBigInt(20)
688690
689691 let TWENTY2X = toBigInt((20 * 20))
690692
691693 let TWENTY3X = toBigInt(((20 * 20) * 20))
692694
693695 let TWENTY4X = toBigInt((((20 * 20) * 20) * 20))
694696
695697 let TWENTY5X = toBigInt(((((20 * 20) * 20) * 20) * 20))
696698
697699 let PRESALENUMLANDS = 500
698700
699701 func keyNextFreeLandNum () = "nextLandNum"
700702
701703
702704 func keyLandCustomNameToAssetId (name) = ("lcn_" + name)
703705
704706
705707 func keyLandToAssetId (landNum) = ("la_" + landNum)
706708
707709
708710 func keyInfraLevelByAssetIdAndOwner (assetId,ownerAddr) = ((("ilao_" + assetId) + "_") + ownerAddr)
709711
710712
711713 func keyLandNumToOwner (landNum) = ("lo_" + landNum)
712714
713715
714716 func keyDuckCustomNameToAssetId (name) = ("duckByCustomName_" + name)
715717
716718
717719 func keyCustomNameToAddress (name) = ("accountByCustomName_" + name)
718720
719721
720722 func keyOldies () = "oldiesList"
721723
722724
723725 let claimModeWh = 0
724726
725727 let claimModeDuck = 1
726728
727729 let claimModeWhThenDuck = 2
728730
729731 let flHealth = 0
730732
731733 let flTimestamp = 5
732734
733735 let flBonus = 6
734736
735737 let flProdsUsed = 7
736738
737739 func nftName (landNum,landSize) = ((LANDPREFIX + landNum) + landSize)
738740
739741
740742 func toVolume (amount,pkgSize) = {
741743 let pkgs = if ((amount >= 0))
742744 then (((amount + pkgSize) - 1) / pkgSize)
743745 else -((((-(amount) + pkgSize) - 1) / pkgSize))
744746 (pkgs * MULT8)
745747 }
746748
747749
748750 func distributeByWeights (total,weights) = {
749751 let sum = (((((weights[0] + weights[1]) + weights[2]) + weights[3]) + weights[4]) + weights[5])
750752 if ((0 >= sum))
751753 then throw("Zero weights sum")
752754 else {
753755 let norm6 = fraction(total, MULT6, sum)
754756 func normalizer (acc,elem) = (acc :+ fraction(elem, norm6, MULT6))
755757
756758 let $l = weights
757759 let $s = size($l)
758760 let $acc0 = nil
759761 func $f0_1 ($a,$i) = if (($i >= $s))
760762 then $a
761763 else normalizer($a, $l[$i])
762764
763765 func $f0_2 ($a,$i) = if (($i >= $s))
764766 then $a
765767 else throw("List size exceeds 6")
766768
767769 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
768770 }
769771 }
770772
771773
772774 func getNeededMaterials (total) = {
773775 let props = split(value(getString(keyResProportions())), "_")
774776 if ((size(props) != NUMRES))
775777 then throw("Wrong proportions data")
776778 else {
777779 let r = [parseIntValue(props[0]), parseIntValue(props[1]), parseIntValue(props[2]), parseIntValue(props[3]), parseIntValue(props[4]), parseIntValue(props[5])]
778780 distributeByWeights(total, r)
779781 }
780782 }
781783
782784
783785 func subtractMaterials (shouldUseMat,has,totalNeed) = {
784786 let need = getNeededMaterials(totalNeed)
785787 func subtractor (acc,idx) = {
786788 let result = (parseIntValue(has[idx]) - need[idx])
787789 if ((0 > result))
788790 then throw(((((("Not enough material idx=" + toString(idx)) + ", you have ") + has[idx]) + ", but need ") + toString(need[idx])))
789791 else (acc :+ toString(result))
790792 }
791793
792794 if (shouldUseMat)
793795 then {
794796 let $l = ITER6
795797 let $s = size($l)
796798 let $acc0 = nil
797799 func $f0_1 ($a,$i) = if (($i >= $s))
798800 then $a
799801 else subtractor($a, $l[$i])
800802
801803 func $f0_2 ($a,$i) = if (($i >= $s))
802804 then $a
803805 else throw("List size exceeds 6")
804806
805807 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
806808 }
807809 else has
808810 }
809811
810812
811813 func subtractEquipment (oldEq,pUsed) = if ((pUsed == ""))
812814 then $Tuple2(oldEq, false)
813815 else {
814816 func subUsed (acc,idxAmt) = {
815817 let parts = split(idxAmt, ",")
816818 if ((size(parts) != 2))
817819 then throw("Incorrect format, should be index,amount")
818820 else {
819821 let idx = parseIntValue(parts[0])
820822 if (if ((0 > idx))
821823 then true
822824 else (idx >= size(productionMatrix)))
823825 then throw("Unknown product idx")
824826 else {
825827 let amt = parseIntValue(parts[1])
826828 let eqParts = split(acc._1, (parts[0] + ":"))
827829 if ((size(eqParts) != 2))
828830 then throw((("You don't have " + prodTypes[idx]) + " equipped"))
829831 else {
830832 let tmp = eqParts[1]
831833 let numLen = if (isDigit(take(drop(tmp, 1), 1)))
832834 then 2
833835 else 1
834836 let curr = parseIntValue(take(tmp, numLen))
835837 let tail = drop(tmp, numLen)
836838 let newAmt = if ((curr >= amt))
837839 then (curr - amt)
838840 else throw(((((("You equipped " + toString(curr)) + " of ") + prodTypes[idx]) + ", but tried to use ") + toString(amt)))
839841 $Tuple2(((((eqParts[0] + parts[0]) + ":") + toString(newAmt)) + tail), if (acc._2)
840842 then true
841843 else if (if ((idx >= 6))
842844 then (8 >= idx)
843845 else false)
844846 then (newAmt == 0)
845847 else false)
846848 }
847849 }
848850 }
849851 }
850852
851853 let $l = split(pUsed, "_")
852854 let $s = size($l)
853855 let $acc0 = $Tuple2(oldEq, false)
854856 func $f0_1 ($a,$i) = if (($i >= $s))
855857 then $a
856858 else subUsed($a, $l[$i])
857859
858860 func $f0_2 ($a,$i) = if (($i >= $s))
859861 then $a
860862 else throw("List size exceeds 10")
861863
862864 $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)
863865 }
864866
865867
866868 func prodStrToBytes (prodStr) = {
867869 let pList = if ((prodStr == ""))
868870 then nil
869871 else split_4C(prodStr, "_")
870872 func toBV (acc,recipe) = {
871873 let j = (size(acc) / 8)
872874 let curr = if ((size(pList) > j))
873875 then parseIntValue(pList[j])
874876 else 0
875877 (acc + toBytes(curr))
876878 }
877879
878880 let $l = productionMatrix
879881 let $s = size($l)
880882 let $acc0 = base58''
881883 func $f0_1 ($a,$i) = if (($i >= $s))
882884 then $a
883885 else toBV($a, $l[$i])
884886
885887 func $f0_2 ($a,$i) = if (($i >= $s))
886888 then $a
887889 else throw("List size exceeds 50")
888890
889891 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
890892 }
891893
892894
893895 func bytesToProdStr (bv) = {
894896 func fromBV (acc,recipe) = {
895897 let j = size(acc)
896898 let b = take(drop(bv, (8 * j)), 8)
897899 (acc :+ toString(toInt(b)))
898900 }
899901
900902 makeString_2C({
901903 let $l = productionMatrix
902904 let $s = size($l)
903905 let $acc0 = nil
904906 func $f0_1 ($a,$i) = if (($i >= $s))
905907 then $a
906908 else fromBV($a, $l[$i])
907909
908910 func $f0_2 ($a,$i) = if (($i >= $s))
909911 then $a
910912 else throw("List size exceeds 50")
911913
912914 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
913915 }, "_")
914916 }
915917
916918
917919 func checkStatRequirements (duckStats,reqs) = {
918920 func check (acc,j) = {
919921 let buff = if ((size(duckStats) > (7 + j)))
920922 then duckStats[(7 + j)]
921923 else 0
922924 if ((parseIntValue(reqs[j]) > (duckStats[j] + buff)))
923925 then throw(("Requirement not satisfied: " + requirements[j]))
924926 else true
925927 }
926928
927929 let $l = [0, 1, 2, 3, 4, 5, 6]
928930 let $s = size($l)
929931 let $acc0 = false
930932 func $f0_1 ($a,$i) = if (($i >= $s))
931933 then $a
932934 else check($a, $l[$i])
933935
934936 func $f0_2 ($a,$i) = if (($i >= $s))
935937 then $a
936938 else throw("List size exceeds 7")
937939
938940 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
939941 }
940942
941943
942944 func placeProdB (idxCnt,pList,isPositive,duckStats,occupied,free) = {
943945 let parts = split(idxCnt, ":")
944946 if ((size(parts) != 2))
945947 then throw("Incorrect format, should be index:amount")
946948 else if (if (!(isPositive))
947949 then (size(parts[0]) != 2)
948950 else false)
949951 then throw("Product idx should be 2 digits, zero padded")
950952 else {
951953 let productIdx = parseIntValue(parts[0])
952954 let count = parseIntValue(parts[1])
953955 if (!(containsElement(fortAllowedProds, productIdx)))
954956 then throw((("Product '" + prodTypes[productIdx]) + "' cannot be used for land defense"))
955957 else if ((0 > count))
956958 then throw("Count can't be negative")
957959 else if ((count > MAXPRODINSLOT))
958960 then throw(((("Can't put more than " + toString(MAXPRODINSLOT)) + " of ") + prodTypes[productIdx]))
959961 else if ((count == 0))
960962 then $Tuple3(pList, occupied, free)
961963 else {
962964 let head = take(pList, (8 * productIdx))
963965 let curr = toInt(take(drop(pList, (8 * productIdx)), 8))
964966 let tail = drop(pList, (8 * (productIdx + 1)))
965967 let recipe = split(productionMatrix[productIdx], "_")
966968 if (if (!(isPositive))
967969 then (count > curr)
968970 else false)
969971 then throw(((((("You have " + toString(curr)) + " of ") + prodTypes[productIdx]) + ", but tried to use ") + toString(count)))
970972 else {
971973 let newAmt = if (if (!(isPositive))
972974 then checkStatRequirements(duckStats, split(recipe[rIdxRequirements], ","))
973975 else false)
974976 then (curr - count)
975977 else (curr + count)
976978 let deltaVol = (toVolume(newAmt, PRODUCTPKGSIZE) - toVolume(curr, PRODUCTPKGSIZE))
977979 $Tuple3(((head + toBytes(newAmt)) + tail), (occupied + deltaVol), (free - deltaVol))
978980 }
979981 }
980982 }
981983 }
982984
983985
984986 func addProdB (idxCnt,pList,isPositive,segment,mainAux,slot,duckStats) = {
985987 let parts = split(idxCnt, ":")
986988 if ((size(parts) != 2))
987989 then throw("Incorrect format, should be index:amount")
988990 else if (if (!(isPositive))
989991 then (size(parts[0]) != 2)
990992 else false)
991993 then throw("Product idx should be 2 digits, zero padded")
992994 else {
993995 let productIdx = parseIntValue(parts[0])
994996 let count = parseIntValue(parts[1])
995997 if (if ((0 > productIdx))
996998 then true
997999 else (productIdx >= size(productionMatrix)))
9981000 then throw("Unknown product idx")
9991001 else if ((0 > count))
10001002 then throw("Count can't be negative")
10011003 else if ((count > MAXPRODINSLOT))
10021004 then throw(((("Can't put more than " + toString(MAXPRODINSLOT)) + " of ") + prodTypes[productIdx]))
10031005 else if ((count == 0))
10041006 then $Tuple2(pList, false)
10051007 else {
10061008 let head = take(pList, (8 * productIdx))
10071009 let curr = toInt(take(drop(pList, (8 * productIdx)), 8))
10081010 let tail = drop(pList, (8 * (productIdx + 1)))
10091011 let recipe = split(productionMatrix[productIdx], "_")
10101012 if (if (!(isPositive))
10111013 then (count > curr)
10121014 else false)
10131015 then throw(((((("You have " + toString(curr)) + " of ") + prodTypes[productIdx]) + ", but tried to use ") + toString(count)))
10141016 else {
10151017 let isBigItem = if (if (!(isPositive))
10161018 then checkStatRequirements(duckStats, split(recipe[rIdxRequirements], ","))
10171019 else false)
10181020 then {
10191021 let compat = recipe[rIdxSlots]
10201022 if ((compat == ""))
10211023 then throw("Item cannot be equipped")
10221024 else {
10231025 let c = parseIntValue(compat)
10241026 let cSeg = (c / 100)
10251027 if ((segment != cSeg))
10261028 then throw("Segment incompatible")
10271029 else {
10281030 let cMainAux = ((c % 100) / 10)
10291031 if ((mainAux != cMainAux))
10301032 then throw("Slot incompatible")
10311033 else {
10321034 let cNumSlots = (c % 10)
10331035 if (if ((slot != 0))
10341036 then (cNumSlots > 1)
10351037 else false)
10361038 then throw("Big items should occupy slot 0")
10371039 else (cNumSlots > 1)
10381040 }
10391041 }
10401042 }
10411043 }
10421044 else false
10431045 $Tuple2(((head + toBytes((curr + (if (isPositive)
10441046 then count
10451047 else -(count))))) + tail), isBigItem)
10461048 }
10471049 }
10481050 }
10491051 }
10501052
10511053
10521054 func slotsGroupB (g,bpIn,isPositive,segment,mainAux,stats) = if ((g != ""))
10531055 then {
10541056 let slots = split(g, ",")
10551057 if ((size(slots) > MAXSLOTS))
10561058 then throw("Wrong slots format")
10571059 else {
10581060 let s0 = slots[0]
10591061 let s1 = if ((size(slots) > 1))
10601062 then slots[1]
10611063 else ""
10621064 if (if ((s0 == ""))
10631065 then (s1 == "")
10641066 else false)
10651067 then bpIn
10661068 else {
10671069 let tmpS0 = if ((s0 != ""))
10681070 then addProdB(s0, bpIn, isPositive, segment, mainAux, 0, stats)
10691071 else $Tuple2(bpIn, false)
10701072 if ((s1 != ""))
10711073 then if (tmpS0._2)
10721074 then throw("Big item already occupies slot")
10731075 else addProdB(s1, tmpS0._1, isPositive, segment, mainAux, 1, stats)._1
10741076 else tmpS0._1
10751077 }
10761078 }
10771079 }
10781080 else bpIn
10791081
10801082
10811083 func dressB (segList,pBytes,isPositive,stats) = {
10821084 func segment (acc,seg) = {
10831085 let j = acc._1
10841086 let mainAux = split(seg, ";")
10851087 if ((size(mainAux) != NUMMAINAUX))
10861088 then throw("Wrong segment format")
10871089 else {
10881090 let m = mainAux[0]
10891091 let a = mainAux[1]
10901092 if (if ((m == ""))
10911093 then (a == "")
10921094 else false)
10931095 then $Tuple2((j + 1), acc._2)
10941096 else {
10951097 let tmpM = slotsGroupB(m, acc._2, isPositive, j, 0, stats)
10961098 $Tuple2((j + 1), slotsGroupB(a, tmpM, isPositive, j, 1, stats))
10971099 }
10981100 }
10991101 }
11001102
11011103 ( let $l = segList
11021104 let $s = size($l)
11031105 let $acc0 = $Tuple2(0, pBytes)
11041106 func $f0_1 ($a,$i) = if (($i >= $s))
11051107 then $a
11061108 else segment($a, $l[$i])
11071109
11081110 func $f0_2 ($a,$i) = if (($i >= $s))
11091111 then $a
11101112 else throw("List size exceeds 6")
11111113
11121114 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6))._2
11131115 }
11141116
11151117
11161118 func fortB (segList,pBytes,occupied,free,isPositive,duckStats) = if ((3 > size(segList)))
11171119 then throw("At least duck, mines and traps parts are required")
11181120 else {
11191121 func segment (acc,seg) = {
11201122 let j = acc._1
11211123 if ((j == 0))
11221124 then $Tuple4((j + 1), acc._2, acc._3, acc._4)
11231125 else {
11241126 let p = placeProdB(seg, acc._2, isPositive, duckStats, acc._3, acc._4)
11251127 $Tuple4((j + 1), p._1, p._2, p._3)
11261128 }
11271129 }
11281130
11291131 let t = {
11301132 let $l = segList
11311133 let $s = size($l)
11321134 let $acc0 = $Tuple4(0, pBytes, occupied, free)
11331135 func $f0_1 ($a,$i) = if (($i >= $s))
11341136 then $a
11351137 else segment($a, $l[$i])
11361138
11371139 func $f0_2 ($a,$i) = if (($i >= $s))
11381140 then $a
11391141 else throw("List size exceeds 10")
11401142
11411143 $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)
11421144 }
11431145 $Tuple3(t._2, t._3, t._4)
11441146 }
11451147
11461148
11471149 func canWearCurrentEquipment (duckAssetId) = {
11481150 let eqKey = keyDuckEquipment(duckAssetId)
11491151 let currEq = split(valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,"), "_")
11501152 let tempProdB = dressB(currEq, EMPTY_PROD50, true, nil)
11511153 let segBpAux = split(currEq[segBackpack], ";")[1]
11521154 let buffEffect = if ((segBpAux == ""))
11531155 then 0
11541156 else {
11551157 let aux0 = split(segBpAux, ",")[0]
11561158 if ((aux0 == ""))
11571159 then 0
11581160 else {
11591161 let idxCnt = split(aux0, ":")
11601162 let idx = idxCnt[0]
11611163 let cnt = idxCnt[1]
11621164 if (if (if (if (if ((idx == "06"))
11631165 then true
11641166 else (idx == "07"))
11651167 then true
11661168 else (idx == "08"))
11671169 then (cnt != "")
11681170 else false)
11691171 then (parseIntValue(cnt) > 0)
11701172 else false)
11711173 then parseIntValue(split(productionMatrix[parseIntValue(idx)], "_")[rIdxEffect])
11721174 else 0
11731175 }
11741176 }
11751177 let stats = getDuckStats(this, duckAssetId, buffEffect, true)
11761178 let newProdB = dressB(currEq, tempProdB, false, stats)
11771179 (newProdB == newProdB)
11781180 }
11791181
11801182
11811183 func updateProportionsInternal (propList,terrainCounts,landSizeIndex,sign) = if ((size(propList) != NUMRES))
11821184 then throw("Wrong proportions data")
11831185 else {
11841186 func updater (acc,i) = {
11851187 let result = (parseIntValue(propList[i]) + ((sign * terrainCounts[i]) * landSizeIndex))
11861188 if ((0 > result))
11871189 then throw(((((((("Panic! Pieces of type=" + toString(i)) + ", sign=") + toString(sign)) + ", terrainCounts[i]=") + toString(terrainCounts[i])) + ", landSizeIndex=") + toString(landSizeIndex)))
11881190 else (acc :+ toString(result))
11891191 }
11901192
11911193 let $l = ITER6
11921194 let $s = size($l)
11931195 let $acc0 = nil
11941196 func $f0_1 ($a,$i) = if (($i >= $s))
11951197 then $a
11961198 else updater($a, $l[$i])
11971199
11981200 func $f0_2 ($a,$i) = if (($i >= $s))
11991201 then $a
12001202 else throw("List size exceeds 6")
12011203
12021204 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12031205 }
12041206
12051207
12061208 func updateProportions (terrainCounts,landSizeIndex,sign) = {
12071209 let propList = split(valueOrElse(getString(keyResProportions()), "0_0_0_0_0_0"), "_")
12081210 makeString(updateProportionsInternal(propList, terrainCounts, landSizeIndex, sign), "_")
12091211 }
12101212
12111213
12121214 func countTerrains (terrains) = [(size(split(terrains, "A")) - 1), (size(split(terrains, "B")) - 1), (size(split(terrains, "C")) - 1), (size(split(terrains, "D")) - 1), (size(split(terrains, "E")) - 1), (size(split(terrains, "F")) - 1)]
12131215
12141216
12151217 func addRes (currentRes,terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
12161218 func adder (acc,i) = {
12171219 let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCounts[i]) * landSizeIndex)
12181220 (acc :+ toString((parseIntValue(currentRes[i]) + resOfType)))
12191221 }
12201222
12211223 let r = {
12221224 let $l = ITER6
12231225 let $s = size($l)
12241226 let $acc0 = nil
12251227 func $f0_1 ($a,$i) = if (($i >= $s))
12261228 then $a
12271229 else adder($a, $l[$i])
12281230
12291231 func $f0_2 ($a,$i) = if (($i >= $s))
12301232 then $a
12311233 else throw("List size exceeds 6")
12321234
12331235 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12341236 }
12351237 makeString(r, "_")
12361238 }
12371239
12381240
12391241 func virtClaim (terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
12401242 func adder (acc,i) = {
12411243 let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCounts[i]) * landSizeIndex)
12421244 $Tuple2((acc._1 :+ resOfType), (acc._2 + resOfType))
12431245 }
12441246
12451247 let $l = ITER6
12461248 let $s = size($l)
12471249 let $acc0 = $Tuple2(nil, 0)
12481250 func $f0_1 ($a,$i) = if (($i >= $s))
12491251 then $a
12501252 else adder($a, $l[$i])
12511253
12521254 func $f0_2 ($a,$i) = if (($i >= $s))
12531255 then $a
12541256 else throw("List size exceeds 6")
12551257
12561258 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12571259 }
12581260
12591261
12601262 func distributeRes (currentWhRes,currentPackRes,resToClaim,whSpaceLeft) = {
12611263 let resListToClaim = resToClaim._1
12621264 let resAmToClaim = resToClaim._2
12631265 if ((resAmToClaim == 0))
12641266 then $Tuple2(makeString(currentWhRes, "_"), makeString(currentPackRes, "_"))
12651267 else if ((whSpaceLeft >= resAmToClaim))
12661268 then {
12671269 func addLists (acc,i) = (acc :+ toString((parseIntValue(currentWhRes[i]) + resListToClaim[i])))
12681270
12691271 let r = {
12701272 let $l = ITER6
12711273 let $s = size($l)
12721274 let $acc0 = nil
12731275 func $f0_1 ($a,$i) = if (($i >= $s))
12741276 then $a
12751277 else addLists($a, $l[$i])
12761278
12771279 func $f0_2 ($a,$i) = if (($i >= $s))
12781280 then $a
12791281 else throw("List size exceeds 6")
12801282
12811283 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12821284 }
12831285 $Tuple2(makeString(r, "_"), makeString(currentPackRes, "_"))
12841286 }
12851287 else {
12861288 func addPartLists (acc,i) = {
12871289 let whPart = fraction(resListToClaim[i], whSpaceLeft, resAmToClaim)
12881290 $Tuple2((acc._1 :+ toString((parseIntValue(currentWhRes[i]) + whPart))), (acc._2 :+ toString(((parseIntValue(currentPackRes[i]) + resListToClaim[i]) - whPart))))
12891291 }
12901292
12911293 let r = {
12921294 let $l = ITER6
12931295 let $s = size($l)
12941296 let $acc0 = $Tuple2(nil, nil)
12951297 func $f0_1 ($a,$i) = if (($i >= $s))
12961298 then $a
12971299 else addPartLists($a, $l[$i])
12981300
12991301 func $f0_2 ($a,$i) = if (($i >= $s))
13001302 then $a
13011303 else throw("List size exceeds 6")
13021304
13031305 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13041306 }
13051307 $Tuple2(makeString(r._1, "_"), makeString(r._2, "_"))
13061308 }
13071309 }
13081310
13091311
13101312 func abs (x) = if ((x >= toBigInt(0)))
13111313 then x
13121314 else -(x)
13131315
13141316
13151317 let targetFreqByContinent = [[35, 18, 30, 7, 6, 24], [29, 18, 29, 7, 8, 29], [6, 18, 29, 8, 30, 29], [6, 28, 6, 48, 26, 6], [24, 18, 6, 30, 30, 12]]
13161318
13171319 let PERM25 = [7, 2, 15, 19, 8, 24, 1, 21, 16, 5, 0, 22, 20, 23, 11, 4, 18, 12, 6, 10, 3, 17, 13, 9, 14]
13181320
13191321 let TCHARS = ["A", "B", "C", "D", "E", "F"]
13201322
1323+let DECIMATION = 10
1324+
13211325 func addStrInt (acc,el) = (acc + parseIntValue(el))
13221326
13231327
13241328 func genRand (maxRand,inSeed) = if ((maxRand == 0))
13251329 then throw("maxRand should be non-zero")
13261330 else {
13271331 let bigMax = toBigInt(maxRand)
13281332 $Tuple2(toInt((inSeed % bigMax)), (inSeed / bigMax))
13291333 }
13301334
13311335
13321336 func findSlot (arr,rnd,delta) = {
13331337 func find (acc,el) = if (acc._1)
13341338 then acc
13351339 else {
13361340 let rem = ((acc._3 - el) - delta)
13371341 if ((0 > rem))
13381342 then $Tuple3(true, acc._2, 0)
13391343 else $Tuple3(false, (acc._2 + 1), rem)
13401344 }
13411345
13421346 let r = {
13431347 let $l = arr
13441348 let $s = size($l)
13451349 let $acc0 = $Tuple3(false, 0, rnd)
13461350 func $f0_1 ($a,$i) = if (($i >= $s))
13471351 then $a
13481352 else find($a, $l[$i])
13491353
13501354 func $f0_2 ($a,$i) = if (($i >= $s))
13511355 then $a
13521356 else throw("List size exceeds 6")
13531357
13541358 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13551359 }
13561360 r._2
13571361 }
13581362
13591363
1360-func gen1 (seed0,landSizeIndex) = {
1364+func gen1 (seed0,landSizeIndex,continentPreset) = {
13611365 func continentSums (ac,cont) = {
13621366 let curr = split(valueOrElse(getString(keyResTypesByContinent(cont)), "0_0_0_0_0_0"), "_")
13631367 let cSum = {
13641368 let $l = curr
13651369 let $s = size($l)
13661370 let $acc0 = 0
13671371 func $f0_1 ($a,$i) = if (($i >= $s))
13681372 then $a
13691373 else addStrInt($a, $l[$i])
13701374
13711375 func $f0_2 ($a,$i) = if (($i >= $s))
13721376 then $a
13731377 else throw("List size exceeds 6")
13741378
13751379 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13761380 }
13771381 $Tuple2((ac._1 :+ cSum), (ac._2 + cSum))
13781382 }
13791383
1380- let $t01981920203 = {
1384+ let $t01986120039 = {
13811385 let $l = continents
13821386 let $s = size($l)
13831387 let $acc0 = $Tuple2(nil, 0)
13841388 func $f0_1 ($a,$i) = if (($i >= $s))
13851389 then $a
13861390 else continentSums($a, $l[$i])
13871391
13881392 func $f0_2 ($a,$i) = if (($i >= $s))
13891393 then $a
13901394 else throw("List size exceeds 5")
13911395
13921396 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
13931397 }
1394- let contSums = $t01981920203._1
1395- let total = $t01981920203._2
1398+ let contSums = $t01986120039._1
1399+ let total = $t01986120039._2
13961400 let maxSum = max(contSums)
1397- let rTotal = ((maxSum * 5) - total)
1398- let deltaCont = (rTotal / 50)
1399- let $t02036920657 = if ((rTotal == 0))
1400- then genRand(5, seed0)
1401- else {
1402- let $t02045320506 = genRand((rTotal + (deltaCont * 5)), seed0)
1403- let r = $t02045320506._1
1404- let out = $t02045320506._2
1405- func subr (acc,el) = (acc :+ (maxSum - el))
1406-
1407- let compl = {
1408- let $l = contSums
1409- let $s = size($l)
1410- let $acc0 = nil
1411- func $f1_1 ($a,$i) = if (($i >= $s))
1412- then $a
1413- else subr($a, $l[$i])
1414-
1415- func $f1_2 ($a,$i) = if (($i >= $s))
1416- then $a
1417- else throw("List size exceeds 6")
1418-
1419- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
1401+ let rTotal = ((maxSum * NUM_CONTINENTS) - total)
1402+ let deltaCont = (rTotal / (DECIMATION * NUM_CONTINENTS))
1403+ let $t02023620655 = if (if ((continentPreset >= 0))
1404+ then (NUM_CONTINENTS > continentPreset)
1405+ else false)
1406+ then $Tuple2(continentPreset, seed0)
1407+ else if ((rTotal == 0))
1408+ then genRand(NUM_CONTINENTS, seed0)
1409+ else {
1410+ let $t02043020496 = genRand((rTotal + (deltaCont * NUM_CONTINENTS)), seed0)
1411+ let r = $t02043020496._1
1412+ let out = $t02043020496._2
1413+ func subr (acc,el) = (acc :+ (maxSum - el))
1414+
1415+ let compl = {
1416+ let $l = contSums
1417+ let $s = size($l)
1418+ let $acc0 = nil
1419+ func $f1_1 ($a,$i) = if (($i >= $s))
1420+ then $a
1421+ else subr($a, $l[$i])
1422+
1423+ func $f1_2 ($a,$i) = if (($i >= $s))
1424+ then $a
1425+ else throw("List size exceeds 6")
1426+
1427+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
1428+ }
1429+ $Tuple2(findSlot(compl, r, deltaCont), out)
14201430 }
1421- $Tuple2(findSlot(compl, r, deltaCont), out)
1422- }
1423- let contIdx = $t02036920657._1
1424- let seed1 = $t02036920657._2
1431+ let contIdx = $t02023620655._1
1432+ let seed1 = $t02023620655._2
14251433 let target = targetFreqByContinent[contIdx]
14261434 let actual = split(valueOrElse(getString(keyResTypesByContinent(continents[contIdx])), "0_0_0_0_0_0"), "_")
14271435 func toInts (acc,el) = (acc :+ parseIntValue(el))
14281436
14291437 let actualInts = {
14301438 let $l = actual
14311439 let $s = size($l)
14321440 let $acc0 = nil
14331441 func $f1_1 ($a,$i) = if (($i >= $s))
14341442 then $a
14351443 else toInts($a, $l[$i])
14361444
14371445 func $f1_2 ($a,$i) = if (($i >= $s))
14381446 then $a
14391447 else throw("List size exceeds 6")
14401448
14411449 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14421450 }
14431451 let contSum = contSums[contIdx]
14441452 func genSingleTerrain (ac,ignored) = {
14451453 func deltaCalc (acc,j) = (acc :+ ((ac._2[j] * 120) - (target[j] * ac._3)))
14461454
14471455 let intDelta = {
14481456 let $l = ITER6
14491457 let $s = size($l)
14501458 let $acc0 = nil
14511459 func $f2_1 ($a,$i) = if (($i >= $s))
14521460 then $a
14531461 else deltaCalc($a, $l[$i])
14541462
14551463 func $f2_2 ($a,$i) = if (($i >= $s))
14561464 then $a
14571465 else throw("List size exceeds 6")
14581466
14591467 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14601468 }
14611469 let maxDelta = max(intDelta)
14621470 func shift (acc,el) = {
14631471 let s = (maxDelta - el)
14641472 $Tuple2((acc._1 :+ s), (acc._2 + s))
14651473 }
14661474
1467- let $t02144221519 = {
1475+ let $t02143421511 = {
14681476 let $l = intDelta
14691477 let $s = size($l)
14701478 let $acc0 = $Tuple2(nil, 0)
14711479 func $f3_1 ($a,$i) = if (($i >= $s))
14721480 then $a
14731481 else shift($a, $l[$i])
14741482
14751483 func $f3_2 ($a,$i) = if (($i >= $s))
14761484 then $a
14771485 else throw("List size exceeds 6")
14781486
14791487 $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14801488 }
1481- let shiftedIntDelta = $t02144221519._1
1482- let sumShiftedIntDelta = $t02144221519._2
1483- let deltaRes = (sumShiftedIntDelta / 60)
1484- let $t02156721787 = if ((sumShiftedIntDelta == 0))
1485- then genRand(6, ac._4)
1489+ let shiftedIntDelta = $t02143421511._1
1490+ let sumShiftedIntDelta = $t02143421511._2
1491+ let deltaRes = (sumShiftedIntDelta / (DECIMATION * NUMRES))
1492+ let $t02157821808 = if ((sumShiftedIntDelta == 0))
1493+ then genRand(NUMRES, ac._4)
14861494 else {
1487- let $t02166521729 = genRand((sumShiftedIntDelta + (deltaRes * 6)), ac._4)
1488- let r = $t02166521729._1
1489- let out = $t02166521729._2
1495+ let $t02168121750 = genRand((sumShiftedIntDelta + (deltaRes * NUMRES)), ac._4)
1496+ let r = $t02168121750._1
1497+ let out = $t02168121750._2
14901498 $Tuple2(findSlot(shiftedIntDelta, r, deltaRes), out)
14911499 }
1492- let idx = $t02156721787._1
1493- let seed2 = $t02156721787._2
1500+ let idx = $t02157821808._1
1501+ let seed2 = $t02157821808._2
14941502 func addByIndex (acc,j) = (acc :+ (ac._2[j] + (if ((j == idx))
14951503 then landSizeIndex
14961504 else 0)))
14971505
14981506 let updatedActuals = {
14991507 let $l = ITER6
15001508 let $s = size($l)
15011509 let $acc0 = nil
15021510 func $f4_1 ($a,$i) = if (($i >= $s))
15031511 then $a
15041512 else addByIndex($a, $l[$i])
15051513
15061514 func $f4_2 ($a,$i) = if (($i >= $s))
15071515 then $a
15081516 else throw("List size exceeds 6")
15091517
15101518 $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6)
15111519 }
1512- $Tuple4((ac._1 :+ TCHARS[idx]), updatedActuals, (ac._3 + landSizeIndex), seed2)
1520+ $Tuple4((ac._1 + TCHARS[idx]), updatedActuals, (ac._3 + landSizeIndex), seed2)
15131521 }
15141522
15151523 let result = {
15161524 let $l = PERM25
15171525 let $s = size($l)
1518- let $acc0 = $Tuple4(nil, actualInts, contSum, seed1)
1526+ let $acc0 = $Tuple4("", actualInts, contSum, seed1)
15191527 func $f2_1 ($a,$i) = if (($i >= $s))
15201528 then $a
15211529 else genSingleTerrain($a, $l[$i])
15221530
15231531 func $f2_2 ($a,$i) = if (($i >= $s))
15241532 then $a
15251533 else throw("List size exceeds 25")
15261534
15271535 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
15281536 }
1529- func permut (acc,j) = (acc + result._1[j])
1530-
1531- $Tuple2(contIdx, {
1532- let $l = PERM25
1533- let $s = size($l)
1534- let $acc0 = ""
1535- func $f3_1 ($a,$i) = if (($i >= $s))
1536- then $a
1537- else permut($a, $l[$i])
1538-
1539- func $f3_2 ($a,$i) = if (($i >= $s))
1540- then $a
1541- else throw("List size exceeds 25")
1542-
1543- $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
1544- })
1537+ $Tuple2(contIdx, result._1)
15451538 }
15461539
15471540
15481541 let freq = [[6, 9, 14, 15, 16], [5, 8, 13, 14, 15], [1, 4, 9, 10, 15], [1, 6, 7, 15, 19], [4, 7, 8, 13, 18]]
15491542
15501543 func genChar (n,freqs) = {
15511544 let rem = toInt((n % TWENTYX))
15521545 let letter = if ((freqs[0] > rem))
15531546 then "A"
15541547 else if ((freqs[1] > rem))
15551548 then "B"
15561549 else if ((freqs[2] > rem))
15571550 then "C"
15581551 else if ((freqs[3] > rem))
15591552 then "D"
15601553 else if ((freqs[4] > rem))
15611554 then "E"
15621555 else "F"
15631556 letter
15641557 }
15651558
15661559
15671560 func genTerrains (seed,continentIdx) = {
15681561 let f = freq[continentIdx]
15691562 func terrainGenerator (acc,elem) = $Tuple2((((((acc._1 + genChar(acc._2, f)) + genChar((acc._2 / TWENTYX), f)) + genChar((acc._2 / TWENTY2X), f)) + genChar((acc._2 / TWENTY3X), f)) + genChar((acc._2 / TWENTY4X), f)), (acc._2 / TWENTY5X))
15701563
15711564 let t = {
15721565 let $l = [1, 2, 3, 4, 5]
15731566 let $s = size($l)
15741567 let $acc0 = $Tuple2("", (seed / FIVEX))
15751568 func $f0_1 ($a,$i) = if (($i >= $s))
15761569 then $a
15771570 else terrainGenerator($a, $l[$i])
15781571
15791572 func $f0_2 ($a,$i) = if (($i >= $s))
15801573 then $a
15811574 else throw("List size exceeds 5")
15821575
15831576 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
15841577 }
15851578 t._1
15861579 }
15871580
15881581
15891582 func genTerrainsForMerge (sumTerrains,landSizeIndex) = {
15901583 func step1 (acc,s) = {
15911584 let j = acc._2
15921585 let el = parseIntValue(s)
15931586 let x = if ((el == 0))
15941587 then 0
15951588 else if ((el >= (4 * landSizeIndex)))
15961589 then (el / landSizeIndex)
15971590 else if ((el > (3 * landSizeIndex)))
15981591 then 3
15991592 else (((el - 1) / landSizeIndex) + 1)
16001593 $Tuple3((acc._1 :+ x), (acc._2 + 1), (acc._3 + x))
16011594 }
16021595
16031596 let t = {
16041597 let $l = sumTerrains
16051598 let $s = size($l)
16061599 let $acc0 = $Tuple3(nil, 0, 0)
16071600 func $f0_1 ($a,$i) = if (($i >= $s))
16081601 then $a
16091602 else step1($a, $l[$i])
16101603
16111604 func $f0_2 ($a,$i) = if (($i >= $s))
16121605 then $a
16131606 else throw("List size exceeds 6")
16141607
16151608 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
16161609 }
16171610 let arr = t._1
16181611 let maxIdx = value(indexOf(arr, max(arr)))
16191612 let delta = (t._3 - 25)
16201613 func subber (acc,idx) = {
16211614 let val = (arr[idx] - (if ((idx == maxIdx))
16221615 then delta
16231616 else 0))
16241617 let zeroes = if ((val == 0))
16251618 then nil
16261619 else split(drop(toString(pow(10, 0, val, 0, 0, DOWN)), 1), "")
16271620 let c = TCHARS[idx]
16281621 func listGen (ac,ignored) = (ac :+ c)
16291622
16301623 let z = {
16311624 let $l = zeroes
16321625 let $s = size($l)
16331626 let $acc0 = nil
16341627 func $f1_1 ($a,$i) = if (($i >= $s))
16351628 then $a
16361629 else listGen($a, $l[$i])
16371630
16381631 func $f1_2 ($a,$i) = if (($i >= $s))
16391632 then $a
16401633 else throw("List size exceeds 25")
16411634
16421635 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
16431636 }
16441637 (acc ++ z)
16451638 }
16461639
16471640 let r = {
16481641 let $l = ITER6
16491642 let $s = size($l)
16501643 let $acc0 = nil
16511644 func $f1_1 ($a,$i) = if (($i >= $s))
16521645 then $a
16531646 else subber($a, $l[$i])
16541647
16551648 func $f1_2 ($a,$i) = if (($i >= $s))
16561649 then $a
16571650 else throw("List size exceeds 6")
16581651
16591652 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
16601653 }
16611654 func permut (acc,j) = (acc + r[j])
16621655
16631656 let $l = PERM25
16641657 let $s = size($l)
16651658 let $acc0 = ""
16661659 func $f2_1 ($a,$i) = if (($i >= $s))
16671660 then $a
16681661 else permut($a, $l[$i])
16691662
16701663 func $f2_2 ($a,$i) = if (($i >= $s))
16711664 then $a
16721665 else throw("List size exceeds 25")
16731666
16741667 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
16751668 }
16761669
16771670
16781671 func getBackpack (bpKey) = {
16791672 let p = split(valueOrElse(getString(bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
16801673 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
16811674 then p[bpIdxRes]
16821675 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
16831676 then p[bpIdxMat]
16841677 else "0_0_0_0_0_0", p[bpIdxProd]]
16851678 }
16861679
16871680
16881681 func getWarehouseTotalVolume (volPrefix) = {
16891682 let parts = split(volPrefix, "_")
16901683 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
16911684 }
16921685
16931686
16941687 func getWarehouseOccupiedVol (currentWh) = {
16951688 let goods = currentWh[whIdxProd]
16961689 func sumResMat (acc,item) = (acc + parseIntValue(item))
16971690
16981691 func sumProd (acc,item) = {
16991692 let idx = acc._1
17001693 let pkgs = (((parseIntValue(item) + PRODUCTPKGSIZE) - 1) / PRODUCTPKGSIZE)
17011694 $Tuple2((idx + 1), (acc._2 + (pkgs * MULT8)))
17021695 }
17031696
17041697 let whResVol = {
17051698 let $l = split(currentWh[whIdxRes], "_")
17061699 let $s = size($l)
17071700 let $acc0 = 0
17081701 func $f0_1 ($a,$i) = if (($i >= $s))
17091702 then $a
17101703 else sumResMat($a, $l[$i])
17111704
17121705 func $f0_2 ($a,$i) = if (($i >= $s))
17131706 then $a
17141707 else throw("List size exceeds 6")
17151708
17161709 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
17171710 }
17181711 let whMatVol = {
17191712 let $l = split(currentWh[whIdxMat], "_")
17201713 let $s = size($l)
17211714 let $acc0 = 0
17221715 func $f1_1 ($a,$i) = if (($i >= $s))
17231716 then $a
17241717 else sumResMat($a, $l[$i])
17251718
17261719 func $f1_2 ($a,$i) = if (($i >= $s))
17271720 then $a
17281721 else throw("List size exceeds 6")
17291722
17301723 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
17311724 }
17321725 let whGoodsVol = if ((goods == ""))
17331726 then 0
17341727 else ( let $l = split_4C(goods, "_")
17351728 let $s = size($l)
17361729 let $acc0 = $Tuple2(0, 0)
17371730 func $f2_1 ($a,$i) = if (($i >= $s))
17381731 then $a
17391732 else sumProd($a, $l[$i])
17401733
17411734 func $f2_2 ($a,$i) = if (($i >= $s))
17421735 then $a
17431736 else throw("List size exceeds 50")
17441737
17451738 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._2
17461739 ((whResVol + whMatVol) + whGoodsVol)
17471740 }
17481741
17491742
17501743 func getWarehouse (whKey,landIndex,infraLevel) = {
17511744 let volPrefix = ((toString(landIndex) + "_") + toString(infraLevel))
17521745 let whTotal = getWarehouseTotalVolume(volPrefix)
17531746 let whStr = valueOrElse(getString(whKey), (volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0"))
17541747 let wh = split_4C(whStr, ":")
17551748 let whOccupied = getWarehouseOccupiedVol(wh)
17561749 let whLoft = if ((5 > size(wh)))
17571750 then makeString(["0", toString(whOccupied), toString((whTotal - whOccupied)), toString(whTotal)], "_")
17581751 else {
17591752 let loft = split(wh[whIdxLOFT], "_")
17601753 let whLocked = parseIntValue(loft[volLocked])
17611754 let occ = if ((size(loft) > 1))
17621755 then parseIntValue(loft[volOccupied])
17631756 else whOccupied
17641757 makeString([toString(whLocked), toString(occ), toString(((whTotal - whLocked) - occ)), toString(whTotal)], "_")
17651758 }
17661759 [wh[whIdxLevels], if ((size(split(wh[whIdxRes], "_")) == NUMRES))
17671760 then wh[whIdxRes]
17681761 else "0_0_0_0_0_0", if ((size(split(wh[whIdxMat], "_")) == NUMRES))
17691762 then wh[whIdxMat]
17701763 else "0_0_0_0_0_0", wh[whIdxProd], whLoft]
17711764 }
17721765
17731766
17741767 func getWarehouseSpaceLeft (currentWh) = {
17751768 let occupiedVol = getWarehouseOccupiedVol(currentWh)
17761769 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
17771770 ((getWarehouseTotalVolume(currentWh[whIdxLevels]) - occupiedVol) - currWhLockedVol)
17781771 }
17791772
17801773
17811774 func moveStuff (cargoParts,currentWh,currentPack) = if ((size(cargoParts) != 3))
17821775 then throw("cargoListStr should contain exactly 2 ':' separators")
17831776 else {
17841777 let resParts = split(cargoParts[0], "_")
17851778 let matParts = split(cargoParts[1], "_")
17861779 let prodParts = if ((cargoParts[2] == ""))
17871780 then nil
17881781 else split_4C(cargoParts[2], "_")
17891782 if ((size(resParts) != NUMRES))
17901783 then throw("All 6 resources should be passed")
17911784 else if ((size(matParts) != NUMRES))
17921785 then throw("All 6 materials should be passed")
17931786 else {
17941787 let whSpaceLeft = getWarehouseSpaceLeft(currentWh)
17951788 let currWhRes = split(currentWh[whIdxRes], "_")
17961789 let currWhMat = split(currentWh[whIdxMat], "_")
17971790 let currWhProd = if ((currentWh[whIdxProd] == ""))
17981791 then nil
17991792 else split_4C(currentWh[whIdxProd], "_")
18001793 let currentPackRes = split(currentPack[bpIdxRes], "_")
18011794 let currentPackMat = split(currentPack[bpIdxMat], "_")
18021795 let currentPackProd = if ((currentPack[bpIdxProd] == ""))
18031796 then nil
18041797 else split_4C(currentPack[bpIdxProd], "_")
18051798 func mvR (acc,item) = {
18061799 let i = acc._1
18071800 let am = parseIntValue(item)
18081801 let whr = parseIntValue(currWhRes[i])
18091802 let bpr = parseIntValue(currentPackRes[i])
18101803 if ((am == 0))
18111804 then $Tuple4((i + 1), (acc._2 :+ currWhRes[i]), (acc._3 :+ currentPackRes[i]), acc._4)
18121805 else if ((am > 0))
18131806 then if ((am > bpr))
18141807 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpr)) + " available"))
18151808 else $Tuple4((i + 1), (acc._2 :+ toString((whr + am))), (acc._3 :+ toString((bpr - am))), (acc._4 + am))
18161809 else if ((-(am) > whr))
18171810 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whr)) + " available"))
18181811 else $Tuple4((i + 1), (acc._2 :+ toString((whr + am))), (acc._3 :+ toString((bpr - am))), (acc._4 + am))
18191812 }
18201813
18211814 let r = {
18221815 let $l = resParts
18231816 let $s = size($l)
18241817 let $acc0 = $Tuple4(0, nil, nil, 0)
18251818 func $f0_1 ($a,$i) = if (($i >= $s))
18261819 then $a
18271820 else mvR($a, $l[$i])
18281821
18291822 func $f0_2 ($a,$i) = if (($i >= $s))
18301823 then $a
18311824 else throw("List size exceeds 6")
18321825
18331826 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
18341827 }
18351828 func mvM (acc,item) = {
18361829 let i = acc._1
18371830 let am = parseIntValue(item)
18381831 let whm = parseIntValue(currWhMat[i])
18391832 let bpm = parseIntValue(currentPackMat[i])
18401833 if ((am == 0))
18411834 then $Tuple4((i + 1), (acc._2 :+ currWhMat[i]), (acc._3 :+ currentPackMat[i]), acc._4)
18421835 else if ((am > 0))
18431836 then if ((am > bpm))
18441837 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpm)) + " available"))
18451838 else $Tuple4((i + 1), (acc._2 :+ toString((whm + am))), (acc._3 :+ toString((bpm - am))), (acc._4 + am))
18461839 else if ((-(am) > whm))
18471840 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whm)) + " available"))
18481841 else $Tuple4((i + 1), (acc._2 :+ toString((whm + am))), (acc._3 :+ toString((bpm - am))), (acc._4 + am))
18491842 }
18501843
18511844 let m = {
18521845 let $l = matParts
18531846 let $s = size($l)
18541847 let $acc0 = $Tuple4(0, nil, nil, r._4)
18551848 func $f1_1 ($a,$i) = if (($i >= $s))
18561849 then $a
18571850 else mvM($a, $l[$i])
18581851
18591852 func $f1_2 ($a,$i) = if (($i >= $s))
18601853 then $a
18611854 else throw("List size exceeds 6")
18621855
18631856 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
18641857 }
18651858 func mvP (acc,item) = {
18661859 let i = acc._1
18671860 let am = parseIntValue(item)
18681861 let whp = if ((size(currWhProd) > i))
18691862 then parseIntValue(currWhProd[i])
18701863 else 0
18711864 let bpp = if ((size(currentPackProd) > i))
18721865 then parseIntValue(currentPackProd[i])
18731866 else 0
18741867 if ((am == 0))
18751868 then $Tuple4((i + 1), (acc._2 :+ toString(whp)), (acc._3 :+ toString(bpp)), acc._4)
18761869 else if ((am > 0))
18771870 then if ((am > bpp))
18781871 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpp)) + " available"))
18791872 else {
18801873 let deltaVol = (toVolume((whp + am), PRODUCTPKGSIZE) - toVolume(whp, PRODUCTPKGSIZE))
18811874 $Tuple4((i + 1), (acc._2 :+ toString((whp + am))), (acc._3 :+ toString((bpp - am))), (acc._4 + deltaVol))
18821875 }
18831876 else if ((-(am) > whp))
18841877 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whp)) + " available"))
18851878 else {
18861879 let deltaVol = (toVolume((whp + am), PRODUCTPKGSIZE) - toVolume(whp, PRODUCTPKGSIZE))
18871880 $Tuple4((i + 1), (acc._2 :+ toString((whp + am))), (acc._3 :+ toString((bpp - am))), (acc._4 + deltaVol))
18881881 }
18891882 }
18901883
18911884 let p = if ((size(prodParts) != 0))
18921885 then {
18931886 let $l = prodParts
18941887 let $s = size($l)
18951888 let $acc0 = $Tuple4(0, nil, nil, m._4)
18961889 func $f2_1 ($a,$i) = if (($i >= $s))
18971890 then $a
18981891 else mvP($a, $l[$i])
18991892
19001893 func $f2_2 ($a,$i) = if (($i >= $s))
19011894 then $a
19021895 else throw("List size exceeds 50")
19031896
19041897 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
19051898 }
19061899 else $Tuple4(0, currWhProd, currentPackProd, m._4)
19071900 let volSaldo = p._4
19081901 if ((volSaldo > whSpaceLeft))
19091902 then throw((((("Attempt to put total " + toString(volSaldo)) + " stuff, but only ") + toString(whSpaceLeft)) + " warehouse space left"))
19101903 else $Tuple7(makeString(r._2, "_"), makeString(m._2, "_"), makeString_2C(p._2, "_"), makeString(r._3, "_"), makeString(m._3, "_"), makeString_2C(p._3, "_"), volSaldo)
19111904 }
19121905 }
19131906
19141907
19151908 func expeditionInternal (caller,txId) = {
19161909 let userAddr = toString(caller)
19171910 let bigNum = abs(toBigInt(txId))
19181911 let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), (PRESALENUMLANDS + 1))
19191912 let landNum = toString(freeNum)
19201913 let continentIdx = toInt((bigNum % FIVEX))
19211914 let terrains = genTerrains(bigNum, continentIdx)
19221915 let continent = continents[continentIdx]
19231916 let issue = Issue(nftName(landNum, "S"), makeString([landNum, "S", terrains, continent], "_"), 1, 0, false)
19241917 let assetId = calculateAssetId(issue)
19251918 let id = toBase58String(assetId)
19261919 $Tuple2([IntegerEntry(keyNextFreeLandNum(), (freeNum + 1)), issue, StringEntry(keyLandToAssetId(landNum), id), StringEntry(keyLandAssetIdToOwner(id), userAddr), StringEntry(keyLandNumToOwner(landNum), userAddr), IntegerEntry(keyInfraLevelByAssetId(id), 0), IntegerEntry(keyInfraLevelByAssetIdAndOwner(id, userAddr), 0), ScriptTransfer(caller, 1, assetId)], $Tuple2(id, continent))
19271920 }
19281921
19291922
19301923 func flightCommon (userAddr,message,sig) = if (!(sigVerify_8Kb(message, sig, pub)))
19311924 then throw("signature does not match")
19321925 else {
19331926 let parts = split_4C(toUtf8String(message), ";")
19341927 let flightLog = split_4C(parts[0], "|")
19351928 let hp = split(flightLog[flHealth], "_")
19361929 let curHP = parseIntValue(hp[0])
19371930 let newHP = parseIntValue(hp[1])
19381931 let newLocTxVer = split(parts[1], ":")
19391932 let newLocation = newLocTxVer[0]
19401933 let time = parseIntValue(flightLog[flTimestamp])
19411934 if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
19421935 then true
19431936 else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
19441937 then throw(((("signature outdated: logTime=" + toString(time)) + ", bcTime=") + toString(lastBlock.timestamp)))
19451938 else {
19461939 let txFromMsg = newLocTxVer[1]
19471940 let lastTx = valueOrElse(getString(keyLastTxIdByUser(userAddr)), "")
19481941 if ((lastTx != txFromMsg))
19491942 then throw(((("Tx ids don't match! In state: " + lastTx) + ", in msg: ") + txFromMsg))
19501943 else {
19511944 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
19521945 let keyHealth = keyDuckHealth(duckAssetId)
19531946 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
19541947 let oldFromState = valueOrElse(getInteger(keyHealth), maxHP)
19551948 if ((oldFromState != curHP))
19561949 then throw(((("oldHealth=" + toString(oldFromState)) + " from state does not match one from flight log=") + toString(curHP)))
19571950 else if ((0 >= curHP))
19581951 then throw("You can't fly with zero health")
19591952 else if (!(canWearCurrentEquipment(duckAssetId)))
19601953 then throw("Equipment incompatible")
19611954 else {
19621955 let bonus = if ((size(flightLog) > flBonus))
19631956 then flightLog[flBonus]
19641957 else ""
19651958 let prodUsed = if ((size(flightLog) > flProdsUsed))
19661959 then flightLog[flProdsUsed]
19671960 else ""
19681961 let sentAmount = if (if ((newHP > 0))
19691962 then (bonus == "$")
19701963 else false)
19711964 then asInt(invoke(restContract, "sendUsdtPrize", [userAddr], nil))
19721965 else 0
19731966 $Tuple5(newHP, duckAssetId, sentAmount, newLocation, prodUsed)
19741967 }
19751968 }
19761969 }
19771970 }
19781971
19791972
19801973 func applyBonuses (landAssetId,pieces) = {
19811974 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
19821975 let artPieces = valueOrElse(getInteger(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0)
19831976 let add6 = (infraLevel / 6)
19841977 let add7 = (infraLevel / 7)
19851978 ((DAILYRESBYPIECE + fraction(DAILYRESBYPIECE, ((infraLevel + add6) + (2 * add7)), 5)) + fraction(DAILYRESBYPIECE, artPieces, (pieces * 5)))
19861979 }
19871980
19881981
19891982 func checkClaimConditions (addr,claimMode,landAssetIdIn) = {
1990- let $t03669237231 = if ((claimMode == claimModeWh))
1983+ let $t03663637175 = if ((claimMode == claimModeWh))
19911984 then $Tuple2(landAssetIdIn, valueOrElse(getString(keyStakedDuckByOwner(addr)), ""))
19921985 else {
19931986 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
19941987 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
19951988 let loc = split(value(curLocation), "_")
19961989 if ((loc[locIdxType] != "L"))
19971990 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
19981991 else $Tuple2(loc[locIdxId], duckAssetId)
19991992 }
2000- let landAssetId = $t03669237231._1
2001- let duckId = $t03669237231._2
1993+ let landAssetId = $t03663637175._1
1994+ let duckId = $t03663637175._2
20021995 let asset = value(assetInfo(fromBase58String(landAssetId)))
20031996 let timeKey = keyStakedTimeByAssetId(landAssetId)
20041997 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("Land " + asset.name) + " is not staked"))
20051998 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
20061999 if ((owner != addr))
20072000 then throw((LANDPREFIX + " is not yours"))
20082001 else {
20092002 let d = split(asset.description, "_")
20102003 $Tuple4(duckId, landAssetId, d, savedTime)
20112004 }
20122005 }
20132006
20142007
20152008 func claimResInternal (addr,amount,claimMode,landAssetIdIn) = if ((0 > amount))
20162009 then throw("Negative amount")
20172010 else {
20182011 let c = checkClaimConditions(addr, claimMode, landAssetIdIn)
20192012 let landSize = c._3[recLandSize]
20202013 let terrainCounts = countTerrains(c._3[recTerrains])
20212014 let deltaTime = (lastBlock.timestamp - c._4)
20222015 if ((0 > deltaTime))
20232016 then throw(((("Saved timestamp is in future, saved = " + toString(c._4)) + ", current = ") + toString(lastBlock.timestamp)))
20242017 else {
20252018 let pieces = numPiecesBySize(landSize)
20262019 let dailyProductionByPiece = applyBonuses(c._2, pieces)
20272020 let availRes = fraction(deltaTime, (dailyProductionByPiece * pieces), DAYMILLIS)
20282021 if ((amount > availRes))
20292022 then throw(((("Not enough resources, available = " + toString(availRes)) + ", requested = ") + toString(amount)))
20302023 else {
20312024 let newDeltaTime = fraction((availRes - amount), DAYMILLIS, (dailyProductionByPiece * pieces))
20322025 let newTimestamp = (lastBlock.timestamp - newDeltaTime)
20332026 let landIndex = (pieces / SSIZE)
20342027 let resToClaim = virtClaim(terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece)
20352028 let whKey = keyWarehouseByLand(c._2)
20362029 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(c._2)), 0)
20372030 let currentWh = getWarehouse(whKey, landIndex, infraLevel)
20382031 let loft = split(currentWh[whIdxLOFT], "_")
20392032 let whSpaceLeft = parseIntValue(loft[volFree])
20402033 if (if ((claimMode == claimModeWh))
20412034 then (amount > whSpaceLeft)
20422035 else false)
20432036 then throw((("Only " + toString(whSpaceLeft)) + " space left in warehouse"))
20442037 else {
20452038 let bpKey = keyBackpackByDuck(c._1)
20462039 let currentPack = getBackpack(bpKey)
20472040 let currentPackRes = split(currentPack[bpIdxRes], "_")
20482041 let currentWhRes = split(currentWh[whIdxRes], "_")
2049- let $t03960540476 = if ((claimMode == claimModeWh))
2042+ let $t03954940420 = if ((claimMode == claimModeWh))
20502043 then $Tuple4(addRes(currentWhRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), currentPack[bpIdxRes], (parseIntValue(loft[volOccupied]) + resToClaim._2), (parseIntValue(loft[volFree]) - resToClaim._2))
20512044 else if ((claimMode == claimModeDuck))
20522045 then $Tuple4(currentWh[whIdxRes], addRes(currentPackRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), parseIntValue(loft[volOccupied]), parseIntValue(loft[volFree]))
20532046 else {
20542047 let distr = distributeRes(currentWhRes, currentPackRes, resToClaim, whSpaceLeft)
20552048 let whAm = min([parseIntValue(loft[volFree]), resToClaim._2])
20562049 $Tuple4(distr._1, distr._2, (parseIntValue(loft[volOccupied]) + whAm), (parseIntValue(loft[volFree]) - whAm))
20572050 }
2058- let whRes = $t03960540476._1
2059- let bpRes = $t03960540476._2
2060- let loftO = $t03960540476._3
2061- let loftF = $t03960540476._4
2051+ let whRes = $t03954940420._1
2052+ let bpRes = $t03954940420._2
2053+ let loftO = $t03954940420._3
2054+ let loftF = $t03954940420._4
20622055 $Tuple5([IntegerEntry(keyStakedTimeByAssetId(c._2), newTimestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, c._2, addr), newTimestamp)], bpKey, [currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], whKey, [currentWh[whIdxLevels], whRes, currentWh[whIdxMat], currentWh[whIdxProd], makeString([loft[volLocked], toString(loftO), toString(loftF), loft[volTotal]], "_")])
20632056 }
20642057 }
20652058 }
20662059 }
20672060
20682061
20692062 func claimAll (addr,landAssetId,pieces,claimMode) = {
20702063 let timeKey = keyStakedTimeByAssetId(landAssetId)
20712064 let savedTime = value(getInteger(timeKey))
20722065 let availRes = (fraction((lastBlock.timestamp - savedTime), applyBonuses(landAssetId, pieces), DAYMILLIS) * pieces)
20732066 claimResInternal(addr, availRes, claimMode, landAssetId)
20742067 }
20752068
20762069
20772070 func upInfraCommon (shouldUseMat,caller,paymentAmount,landAssetId) = {
20782071 let addr = toString(caller)
20792072 let c = checkClaimConditions(addr, claimModeWhThenDuck, landAssetId)
20802073 let pieces = numPiecesBySize(c._3[recLandSize])
20812074 let infraKey = keyInfraLevelByAssetId(c._2)
20822075 let curLevel = valueOrElse(getInteger(infraKey), 0)
20832076 if (if (!(KS_ALLOW_BIG_INFRA_MERGE))
20842077 then (curLevel >= 3)
20852078 else false)
20862079 then throw("Currently max infrastructure level = 3")
20872080 else {
20882081 let maxInfra = ((sqrt(pieces, 0, 0, DOWN) / 5) + 2)
20892082 let newLevel = (curLevel + 1)
20902083 if (if (KS_ALLOW_BIG_INFRA_MERGE)
20912084 then (newLevel > maxInfra)
20922085 else false)
20932086 then throw(("Currently max infrastructure level = " + toString(maxInfra)))
20942087 else {
20952088 let cost = fraction(InfraUpgradeCostSUsdt, (pieces * newLevel), SSIZE)
20962089 if (if (!(shouldUseMat))
20972090 then (paymentAmount != cost)
20982091 else false)
20992092 then throw(("Payment attached should be " + toString(cost)))
21002093 else {
21012094 let bpKey = keyBackpackByDuck(c._1)
21022095 let currentPack = getBackpack(bpKey)
21032096 let mList = split(currentPack[bpIdxMat], "_")
21042097 let matUsed = fraction(InfraUpgradeCostS, (pieces * newLevel), SSIZE)
21052098 let newMat = makeString(subtractMaterials(shouldUseMat, mList, matUsed), "_")
21062099 let claimResult = claimAll(addr, c._2, pieces, claimModeWhThenDuck)
21072100 let whData = claimResult._5
21082101 let oldVol = getWarehouseTotalVolume(whData[whIdxLevels])
21092102 let newVolData = makeString([split(whData[whIdxLevels], "_")[0], toString(newLevel)], "_")
21102103 let newVol = getWarehouseTotalVolume(newVolData)
21112104 let loft = split(whData[whIdxLOFT], "_")
21122105 let newLoftStr = makeString([loft[volLocked], loft[volOccupied], toString(((parseIntValue(loft[volFree]) + newVol) - oldVol)), toString(newVol)], "_")
21132106 $Tuple3(([IntegerEntry(infraKey, newLevel), IntegerEntry(keyInfraLevelByAssetIdAndOwner(c._2, addr), newLevel), StringEntry(bpKey, makeString([currentPack[bpIdxLevel], claimResult._3[bpIdxRes], newMat, currentPack[bpIdxProd]], ":")), StringEntry(claimResult._4, makeString([newVolData, whData[whIdxRes], whData[whIdxMat], whData[whIdxProd], newLoftStr], ":"))] ++ claimResult._1), newLevel, matUsed)
21142107 }
21152108 }
21162109 }
21172110 }
21182111
21192112
21202113 func updateStatsInternal (lvlKey,xpKey,pointsKey,deltaXP) = {
21212114 let xp = valueOrElse(getInteger(xpKey), 0)
21222115 let newXP = (xp + deltaXP)
21232116 let lvlPoints = levelUp(valueOrElse(getInteger(lvlKey), 0), newXP)
21242117 $Tuple2([IntegerEntry(lvlKey, lvlPoints[0]), IntegerEntry(xpKey, newXP), IntegerEntry(pointsKey, (valueOrElse(getInteger(pointsKey), 0) + lvlPoints[1]))], newXP)
21252118 }
21262119
21272120
21282121 func updateDuckStatsInternal (duckAssetId,deltaXP) = updateStatsInternal(keyDuckLevel(duckAssetId), keyDuckXP(duckAssetId), keyDuckFreePoints(duckAssetId), deltaXP)
21292122
21302123
21312124 func updateAccStatsInternal (addr,deltaXP) = updateStatsInternal(keyUserLevel(addr), keyUserXP(addr), keyUserFreePoints(addr), deltaXP)
21322125
21332126
21342127 func activateOnboardArt (addr) = {
21352128 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
21362129 let refByKey = keyAddressRefBy(addr)
21372130 let refBy = getString(refByKey)
21382131 if (!(isDefined(refBy)))
21392132 then throw("You are not eligible for ONBOARD artifact")
21402133 else {
21412134 let artKey = keyOnboardArtDuckActivatedBy(addr)
21422135 let artDuck = getString(artKey)
21432136 if (isDefined(artDuck))
21442137 then throw(("You already used your ONBOARD artifact on duck " + value(artDuck)))
21452138 else {
21462139 let duckActivatorKey = keyOnboardArtActivatedOnDuck(duckAssetId)
21472140 let duckActivator = getString(duckActivatorKey)
21482141 if (isDefined(duckActivator))
21492142 then throw(((("The duck " + duckAssetId) + " already got points from ONBOARD artifact from user ") + value(duckActivator)))
21502143 else ([StringEntry(artKey, duckAssetId), StringEntry(duckActivatorKey, addr)] ++ updateDuckStatsInternal(duckAssetId, xpOnboard)._1)
21512144 }
21522145 }
21532146 }
21542147
21552148
21562149 func activatePresaleArt (addr,landAssetIdIn) = {
21572150 let c = checkClaimConditions(addr, claimModeWhThenDuck, landAssetIdIn)
21582151 let landAssetId = c._2
21592152 let pieces = numPiecesBySize(c._3[recLandSize])
21602153 let activationKey = keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)
21612154 if ((valueOrElse(getInteger(activationKey), 0) > 0))
21622155 then throw("Presale artifact is already activated")
21632156 else if ((parseIntValue(c._3[recLandNum]) > PRESALENUMLANDS))
21642157 then throw((((LANDPREFIX + " ") + landAssetId) + " is not eligible for presale artifact"))
21652158 else {
21662159 let claimResult = claimAll(addr, landAssetId, pieces, claimModeWhThenDuck)
21672160 (((claimResult._1 :+ IntegerEntry(activationKey, pieces)) :+ StringEntry(claimResult._2, makeString(claimResult._3, ":"))) :+ StringEntry(claimResult._4, makeString(claimResult._5, ":")))
21682161 }
21692162 }
21702163
21712164
21722165 func checkTournament (duckAssetId) = {
21732166 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
21742167 let curLocation = split(valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
21752168 let now = lastBlock.timestamp
21762169 let tData = getTourData(tournamentContract, lastId)
21772170 let static = tData[idxStatic]
21782171 let dynamic = tData[idxDynamic]
21792172 if ((curLocation[locIdxType] != "T"))
21802173 then false
21812174 else if (if (if ((parseIntValue(curLocation[locIdxContinent]) == lastId))
21822175 then (dynamic[tDynamicStatus] == "INPROGRESS")
21832176 else false)
21842177 then (parseIntValue(static[tStaticEnd]) > now)
21852178 else false)
21862179 then throw("Your duck is taking part in the tournament")
21872180 else asBoolean(invoke(this, "exitTournamentInternal", [duckAssetId], nil))
21882181 }
21892182
21902183
21912184 func checkDelivery (duckAssetId) = {
21922185 let curLocation = split(valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
21932186 let now = lastBlock.timestamp
21942187 if ((curLocation[locIdxType] != "D"))
21952188 then false
21962189 else {
21972190 let startTime = parseIntValue(curLocation[locIdxContinent])
21982191 let distance = parseIntValue(curLocation[locIdxId])
21992192 if (if (((startTime + TEN_MINUTES_MILLIS) > now))
22002193 then (1 > distance)
22012194 else false)
22022195 then throw("Your duck is on delivery mission")
22032196 else asBoolean(invoke(this, "exitDeliveryInternal", [duckAssetId], nil))
22042197 }
22052198 }
22062199
22072200
22082201 func exitDeliveryCommon (duckAssetId,check,newHP,score) = {
22092202 let curLocation = split(valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
22102203 let now = lastBlock.timestamp
22112204 let startTime = parseIntValue(curLocation[locIdxContinent])
22122205 let distance = parseIntValue(curLocation[locIdxId])
22132206 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(duckAssetId)), "NFT duck is orphaned")
22142207 let healthKey = keyDuckHealth(duckAssetId)
22152208 let curHealth = getIntegerValue(healthKey)
22162209 let outcomeActions = if (if ((distance > 0))
22172210 then true
22182211 else if (if (check)
22192212 then (score > 0)
22202213 else false)
22212214 then (newHP > 0)
22222215 else false)
22232216 then {
22242217 let reward = invoke(economyContract, "sendDeliveryReward", [owner], nil)
22252218 if ((reward == reward))
22262219 then {
22272220 let countKey = keyUserDeliveryCount(owner)
22282221 [IntegerEntry(countKey, (valueOrElse(getInteger(countKey), 0) + 1)), IntegerEntry(keyUserLastDeliveryDay(owner), (startTime / DAYMILLIS))]
22292222 }
22302223 else throw("Strict value is not equal to itself.")
22312224 }
22322225 else if (if (if (check)
22332226 then (newHP > 0)
22342227 else false)
22352228 then ((startTime + TEN_MINUTES_MILLIS) > now)
22362229 else false)
22372230 then throw("Your duck is still on delivery mission")
22382231 else {
22392232 let lockedTotal = valueOrElse(getInteger(economyContract, deliveryLockedKey), 0)
22402233 let unlock = invoke(economyContract, "updateDeliveryLocked", [(lockedTotal - MIN_USDT_FEE_DELIVERY)], nil)
22412234 if ((unlock == unlock))
22422235 then if (if (if (check)
22432236 then (0 >= newHP)
22442237 else false)
22452238 then true
22462239 else (0 >= curHealth))
22472240 then nil
22482241 else [IntegerEntry(keyDeliveryDelayByDuck(duckAssetId), (startTime + DELIVERY_PUNISHMENT))]
22492242 else throw("Strict value is not equal to itself.")
22502243 }
22512244 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
22522245 $Tuple3(outcomeActions, [StringEntry(keyDuckLocation(duckAssetId), savedLocation)], savedLocation)
22532246 }
22542247
22552248
22562249 func mergeInternal (newLandSize,newLevel,formula,addr,landAssetIds,needMat) = {
22572250 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
22582251 if (checkTournament(duckAssetId))
22592252 then throw("mergeInternal_checkTournament")
22602253 else if (checkDelivery(duckAssetId))
22612254 then throw("mergeInternal_checkDelivery")
22622255 else {
22632256 func checkMerge (acc,landAssetId) = {
22642257 let asset = value(assetInfo(fromBase58String(landAssetId)))
22652258 let timeKey = keyStakedTimeByAssetId(landAssetId)
22662259 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("NFT " + asset.name) + " is not staked"))
22672260 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
22682261 if ((owner != addr))
22692262 then throw((LANDPREFIX + " is not yours"))
22702263 else {
22712264 let d = split(asset.description, "_")
22722265 let continent = d[recContinent]
22732266 if (if ((acc._3 != ""))
22742267 then (acc._3 != continent)
22752268 else false)
22762269 then throw("Lands should be on the same continent to merge")
22772270 else {
22782271 let landSize = d[recLandSize]
22792272 let sizesIn = acc._1
22802273 let i = valueOrErrorMessage(indexOf(sizesIn, landSize), "You haven't passed all the lands needed")
22812274 let sizesOut = (take(sizesIn, i) + drop(sizesIn, (i + 1)))
22822275 let pieces = numPiecesBySize(landSize)
22832276 let arts = (acc._2 + valueOrElse(getInteger(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0))
22842277 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
22852278 let reqLevel = match landSize {
22862279 case _ =>
22872280 if (("S" == $match0))
22882281 then 3
22892282 else if (("M" == $match0))
22902283 then 4
22912284 else if (("L" == $match0))
22922285 then 5
22932286 else if (("XL" == $match0))
22942287 then 6
22952288 else throw("Only S, M, L, XL can merge")
22962289 }
22972290 if ((infraLevel != reqLevel))
22982291 then throw("All lands should be maxed to merge")
22992292 else {
23002293 let landNum = d[recLandNum]
23012294 let terrainCounts = countTerrains(d[recTerrains])
23022295 let deltaTime = (lastBlock.timestamp - savedTime)
23032296 if ((0 > deltaTime))
23042297 then throw(((("Saved timestamp is in future, saved = " + toString(savedTime)) + ", current = ") + toString(lastBlock.timestamp)))
23052298 else {
23062299 let dailyProductionByPiece = applyBonuses(landAssetId, pieces)
23072300 let landIndex = (pieces / SSIZE)
23082301 let bpRes = addRes(split(acc._4, "_"), terrainCounts, deltaTime, landIndex, dailyProductionByPiece)
23092302 let props = updateProportionsInternal(acc._6, terrainCounts, landIndex, -1)
23102303 let cProps = updateProportionsInternal(acc._10, terrainCounts, landIndex, -1)
23112304 let sumTerrains = updateProportionsInternal(acc._9, terrainCounts, landIndex, 1)
23122305 let lands = acc._7
23132306 let idx = indexOf(lands, landAssetId)
23142307 if (!(isDefined(idx)))
23152308 then throw(("Your staked lands don't contain " + landAssetId))
23162309 else {
23172310 let customKey = keyLandAssetIdToCustomName(landAssetId)
23182311 let customName = valueOrElse(getString(customKey), "")
23192312 $Tuple10(sizesOut, arts, continent, bpRes, ((((((((((((acc._5 :+ DeleteEntry(keyStakedTimeByAssetId(landAssetId))) :+ DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, addr))) :+ DeleteEntry(keyLandToAssetId(landNum))) :+ DeleteEntry(keyLandAssetIdToOwner(landAssetId))) :+ DeleteEntry(keyInfraLevelByAssetId(landAssetId))) :+ DeleteEntry(keyInfraLevelByAssetIdAndOwner(landAssetId, addr))) :+ DeleteEntry(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId))) :+ DeleteEntry(keyLandNumToOwner(landNum))) :+ DeleteEntry(keyWarehouseByLand(landAssetId))) :+ DeleteEntry(customKey)) :+ Burn(fromBase58String(landAssetId), 1)) ++ (if ((customName != ""))
23202313 then [DeleteEntry(keyLandCustomNameToAssetId(customName))]
23212314 else nil)), props, removeByIndex(lands, value(idx)), (acc._8 + pieces), sumTerrains, cProps)
23222315 }
23232316 }
23242317 }
23252318 }
23262319 }
23272320 }
23282321
23292322 let bpKey = keyBackpackByDuck(duckAssetId)
23302323 let currentPack = getBackpack(bpKey)
23312324 let propList = split(valueOrElse(getString(keyResProportions()), "0_0_0_0_0_0"), "_")
23322325 let landsKey = keyStakedLandsByOwner(addr)
23332326 let landsStr = getString(landsKey)
23342327 let landsIn = if (isDefined(landsStr))
23352328 then split_51C(value(landsStr), "_")
23362329 else nil
23372330 let cont0 = split(value(assetInfo(fromBase58String(landAssetIds[0]))).description, "_")[recContinent]
23382331 let contProps = split(valueOrElse(getString(keyResTypesByContinent(cont0)), "0_0_0_0_0_0"), "_")
23392332 let r = {
23402333 let $l = landAssetIds
23412334 let $s = size($l)
23422335 let $acc0 = $Tuple10(formula, 0, "", currentPack[bpIdxRes], nil, propList, landsIn, 0, split("0_0_0_0_0_0", "_"), contProps)
23432336 func $f0_1 ($a,$i) = if (($i >= $s))
23442337 then $a
23452338 else checkMerge($a, $l[$i])
23462339
23472340 func $f0_2 ($a,$i) = if (($i >= $s))
23482341 then $a
23492342 else throw("List size exceeds 5")
23502343
23512344 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
23522345 }
23532346 let continent = r._3
23542347 let continentIdx = valueOrErrorMessage(indexOf(continents, continent), ("Unknown continent: " + continent))
23552348 let terrains = genTerrainsForMerge(r._9, (numPiecesBySize(newLandSize) / SSIZE))
23562349 let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), (PRESALENUMLANDS + 1))
23572350 let newLandNum = toString(freeNum)
23582351 let issue = Issue(nftName(newLandNum, newLandSize), makeString([newLandNum, newLandSize, terrains, continent], "_"), 1, 0, false)
23592352 let assetId = calculateAssetId(issue)
23602353 let newLandAssetId = toBase58String(assetId)
23612354 let newMat = makeString(subtractMaterials((needMat > 0), split(currentPack[bpIdxMat], "_"), needMat), "_")
23622355 let piecesKey = keyStakedPiecesByOwner(addr)
23632356 let stakedPieces = valueOrElse(getInteger(piecesKey), 0)
23642357 $Tuple2((((((((((((((((r._5 :+ (if ((size(r._7) > 0))
23652358 then StringEntry(landsKey, makeString_11C(r._7, "_"))
23662359 else DeleteEntry(landsKey))) :+ IntegerEntry(piecesKey, if ((r._8 > stakedPieces))
23672360 then 0
23682361 else (stakedPieces - r._8))) :+ IntegerEntry(keyNextFreeLandNum(), (freeNum + 1))) :+ issue) :+ StringEntry(keyLandToAssetId(newLandNum), newLandAssetId)) :+ StringEntry(keyLandAssetIdToOwner(newLandAssetId), addr)) :+ StringEntry(keyLandNumToOwner(newLandNum), addr)) :+ IntegerEntry(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, newLandAssetId), r._2)) :+ IntegerEntry(keyInfraLevelByAssetId(newLandAssetId), newLevel)) :+ IntegerEntry(keyInfraLevelByAssetIdAndOwner(newLandAssetId, addr), newLevel)) :+ StringEntry(bpKey, makeString([currentPack[bpIdxLevel], r._4, newMat, currentPack[bpIdxProd]], ":"))) :+ StringEntry(keyResProportions(), makeString(r._6, "_"))) :+ StringEntry(keyResTypesByContinent(continent), makeString(r._10, "_"))) :+ StringEntry(keyDuckLocation(duckAssetId), makeString([continent, "L", newLandAssetId], "_"))) :+ ScriptTransfer(addressFromStringValue(addr), 1, assetId)), newLandAssetId)
23692362 }
23702363 }
23712364
23722365
23732366 func s2m (addr,landAssetIds) = mergeInternal("M", 3, "SSSS", addr, landAssetIds, 0)
23742367
23752368
23762369 func m2l (addr,landAssetIds) = mergeInternal("L", 4, "SMM", addr, landAssetIds, (InfraUpgradeCostS * 4))
23772370
23782371
23792372 func l2xl (addr,landAssetIds) = mergeInternal("XL", 5, "SSSML", addr, landAssetIds, (InfraUpgradeCostS * 47))
23802373
23812374
23822375 func xl2xxl (addr,landAssetIds) = mergeInternal("XXL", 6, "LXL", addr, landAssetIds, (InfraUpgradeCostS * 54))
23832376
23842377
23852378 func mergeCommon (addr,landAssetIds) = match size(landAssetIds) {
23862379 case _ =>
23872380 if ((4 == $match0))
23882381 then s2m(addr, landAssetIds)
23892382 else if ((3 == $match0))
23902383 then m2l(addr, landAssetIds)
23912384 else if ((5 == $match0))
23922385 then l2xl(addr, landAssetIds)
23932386 else if ((2 == $match0))
23942387 then xl2xxl(addr, landAssetIds)
23952388 else throw("Unknown merge")
23962389 }
23972390
23982391
23992392 func checkOutdatedDelivery (userAddr) = {
24002393 let duck = getString(keyStakedDuckByOwner(userAddr))
24012394 if (isDefined(duck))
24022395 then {
24032396 let duckAssetId = value(duck)
24042397 let locKey = keyDuckLocation(duckAssetId)
24052398 let loc = split(valueOrElse(getString(locKey), DEFAULTLOCATION), "_")
24062399 let startTime = parseIntValue(loc[locIdxContinent])
24072400 if (if ((loc[locIdxType] != "D"))
24082401 then true
24092402 else ((startTime + TEN_MINUTES_MILLIS) > lastBlock.timestamp))
24102403 then nil
24112404 else {
24122405 let healthKey = keyDuckHealth(duckAssetId)
24132406 if ((parseIntValue(loc[locIdxId]) > 0))
24142407 then {
24152408 let reward = invoke(economyContract, "sendDeliveryReward", [userAddr], nil)
24162409 if ((reward == reward))
24172410 then nil
24182411 else throw("Strict value is not equal to itself.")
24192412 }
24202413 else (({
24212414 let lockedTotal = valueOrElse(getInteger(economyContract, deliveryLockedKey), 0)
24222415 let unlock = invoke(economyContract, "updateDeliveryLocked", [(lockedTotal - MIN_USDT_FEE_DELIVERY)], nil)
24232416 if ((unlock == unlock))
24242417 then if ((0 >= getIntegerValue(healthKey)))
24252418 then nil
24262419 else {
24272420 let punishment = invoke(this, "saveInteger", [keyDeliveryDelayByDuck(duckAssetId), (startTime + DELIVERY_PUNISHMENT)], nil)
24282421 if ((punishment == punishment))
24292422 then nil
24302423 else throw("Strict value is not equal to itself.")
24312424 }
24322425 else throw("Strict value is not equal to itself.")
24332426 } :+ IntegerEntry(healthKey, getIntegerValue(keySavedHealth(duckAssetId)))) :+ StringEntry(locKey, getStringValue(keySavedLocation(duckAssetId))))
24342427 }
24352428 }
24362429 else nil
24372430 }
24382431
24392432
24402433 func prolog (i) = if (if ((i.originCaller != restContract))
24412434 then valueOrElse(getBoolean(keyBlocked()), false)
24422435 else false)
24432436 then throw("Contracts are under maintenance")
24442437 else {
24452438 let userAddr = toString(i.originCaller)
24462439 (checkOutdatedDelivery(userAddr) :+ StringEntry(keyLastTxIdByUser(userAddr), toBase58String(i.transactionId)))
24472440 }
24482441
24492442
24502443 func prologFlight (i) = if (if ((i.originCaller != restContract))
24512444 then valueOrElse(getBoolean(keyBlocked()), false)
24522445 else false)
24532446 then throw("Contracts are under maintenance")
24542447 else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
24552448
24562449
24572450 @Callable(i)
24582451 func constructorV1 (restAddr) = if ((i.caller != this))
24592452 then throw("Permission denied")
24602453 else [StringEntry(keyRestAddress(), restAddr)]
24612454
24622455
24632456
24642457 @Callable(i)
24652458 func saveInteger (key,amount) = if ((i.caller != this))
24662459 then throw("saveInteger is not public method")
24672460 else [IntegerEntry(key, amount)]
24682461
24692462
24702463
24712464 @Callable(i)
24722465 func setBlocked (isBlocked) = if ((i.caller != this))
24732466 then throw("permission denied")
24742467 else [BooleanEntry(keyBlocked(), isBlocked)]
24752468
24762469
24772470
24782471 @Callable(i)
24792472 func stakeLand () = {
24802473 let prologActions = prolog(i)
24812474 if ((size(i.payments) != 1))
24822475 then throw("Exactly one payment required")
24832476 else {
24842477 let pmt = value(i.payments[0])
24852478 let assetId = value(pmt.assetId)
24862479 let address = toString(i.caller)
24872480 if ((pmt.amount != 1))
24882481 then throw((("NFT " + LANDPREFIX) + " token should be attached as payment"))
24892482 else {
24902483 let asset = value(assetInfo(assetId))
24912484 if ((asset.issuer != this))
24922485 then throw("Unknown issuer of token")
24932486 else if (!(contains(asset.name, LANDPREFIX)))
24942487 then throw((("Only NFT " + LANDPREFIX) + " tokens are accepted"))
24952488 else {
24962489 let landNumSize = drop(asset.name, 4)
24972490 let landNum = if (contains(landNumSize, "XXL"))
24982491 then dropRight(landNumSize, 3)
24992492 else if (contains(landNumSize, "XL"))
25002493 then dropRight(landNumSize, 2)
25012494 else dropRight(landNumSize, 1)
25022495 if (!(isDefined(parseInt(landNum))))
25032496 then throw(("Cannot parse land number from " + asset.name))
25042497 else {
25052498 let landAssetId = toBase58String(assetId)
25062499 let timeKey = keyStakedTimeByAssetId(landAssetId)
25072500 if (isDefined(getInteger(timeKey)))
25082501 then throw((("NFT " + asset.name) + " is already staked"))
25092502 else {
25102503 let d = split(asset.description, "_")
25112504 let terrainCounts = countTerrains(d[recTerrains])
25122505 let pieces = numPiecesBySize(d[recLandSize])
25132506 let landIndex = (pieces / SSIZE)
25142507 let props = updateProportions(terrainCounts, landIndex, 1)
25152508 let resByContKey = keyResTypesByContinent(d[recContinent])
25162509 let contProps = split(valueOrElse(getString(resByContKey), "0_0_0_0_0_0"), "_")
25172510 let updatedContProps = makeString(updateProportionsInternal(contProps, terrainCounts, landIndex, 1), "_")
25182511 let landsKey = keyStakedLandsByOwner(address)
25192512 let landsStr = getString(landsKey)
25202513 let lands = if (isDefined(landsStr))
25212514 then split_51C(value(landsStr), "_")
25222515 else nil
25232516 if (containsElement(lands, landAssetId))
25242517 then throw(("Your staked lands already contain " + landAssetId))
25252518 else if ((size(lands) >= MAX_LANDS_STAKED_BY_USER))
25262519 then throw((("Your already staked max (" + toString(MAX_LANDS_STAKED_BY_USER)) + ") lands"))
25272520 else {
25282521 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
25292522 let piecesKey = keyStakedPiecesByOwner(address)
25302523 let oldPieces = valueOrElse(getInteger(piecesKey), 0)
25312524 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
25322525 $Tuple2(([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, address), lastBlock.timestamp), StringEntry(landsKey, makeString_11C((lands :+ landAssetId), "_")), IntegerEntry(piecesKey, (oldPieces + pieces)), StringEntry(keyLandAssetIdToOwner(landAssetId), address), StringEntry(keyLandNumToOwner(landNum), address), IntegerEntry(keyInfraLevelByAssetIdAndOwner(landAssetId, address), infraLevel), StringEntry(keyResProportions(), props), StringEntry(resByContKey, updatedContProps)] ++ prologActions), wlgResult)
25332526 }
25342527 }
25352528 }
25362529 }
25372530 }
25382531 }
25392532 }
25402533
25412534
25422535
25432536 @Callable(i)
25442537 func unstakeLand (landAssetIdIn) = {
25452538 let prologActions = prolog(i)
25462539 if ((size(i.payments) != 0))
25472540 then throw("No payments required")
25482541 else {
25492542 let addr = toString(i.caller)
25502543 let c = checkClaimConditions(addr, claimModeDuck, landAssetIdIn)
25512544 let landAssetId = c._2
25522545 let d = c._3
25532546 let landsKey = keyStakedLandsByOwner(addr)
25542547 let terrainCounts = countTerrains(d[recTerrains])
25552548 let pieces = numPiecesBySize(d[recLandSize])
25562549 let landIndex = (pieces / SSIZE)
25572550 let props = updateProportions(terrainCounts, landIndex, -1)
25582551 let resByContKey = keyResTypesByContinent(d[recContinent])
25592552 let contProps = split(valueOrElse(getString(resByContKey), "0_0_0_0_0_0"), "_")
25602553 let updatedContProps = makeString(updateProportionsInternal(contProps, terrainCounts, landIndex, -1), "_")
25612554 let claimResult = claimAll(addr, landAssetId, pieces, claimModeDuck)
25622555 let lands = split_51C(valueOrElse(getString(landsKey), ""), "_")
25632556 let idx = indexOf(lands, landAssetId)
25642557 if (!(isDefined(idx)))
25652558 then throw(("Your staked lands don't contain " + landAssetId))
25662559 else {
25672560 let now = lastBlock.timestamp
25682561 let govReleaseTime = valueOrElse(getInteger(govContract, keyUserGwlReleaseTime(addr)), 0)
25692562 if ((govReleaseTime >= now))
25702563 then throw(("Your gWL are taking part in voting, cannot unstake until " + toString(govReleaseTime)))
25712564 else {
25722565 let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastArbTimeByUser(addr)), 0) + arbitrageDelay)
25732566 if ((arbReleaseTime > now))
25742567 then throw(("Your staked lands took part in arbitrage, cannot unstake until " + toString(arbReleaseTime)))
25752568 else {
25762569 let piecesKey = keyStakedPiecesByOwner(addr)
25772570 let stakedPieces = valueOrElse(getInteger(piecesKey), 0)
25782571 let newPieces = if ((pieces > stakedPieces))
25792572 then 0
25802573 else (stakedPieces - pieces)
25812574 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [addr], nil)
25822575 $Tuple2(([ScriptTransfer(i.caller, 1, fromBase58String(landAssetId)), DeleteEntry(keyStakedTimeByAssetId(landAssetId)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, addr)), StringEntry(keyResProportions(), props), StringEntry(resByContKey, updatedContProps), StringEntry(claimResult._2, makeString(claimResult._3, ":")), if ((size(lands) > 1))
25832576 then StringEntry(landsKey, makeString_11C(removeByIndex(lands, value(idx)), "_"))
25842577 else DeleteEntry(landsKey), IntegerEntry(piecesKey, newPieces)] ++ prologActions), wlgResult)
25852578 }
25862579 }
25872580 }
25882581 }
25892582 }
25902583
25912584
25922585
25932586 @Callable(i)
25942587 func stakeDuck () = {
25952588 let prologActions = prolog(i)
25962589 if ((size(i.payments) != 1))
25972590 then throw("Exactly one payment required")
25982591 else {
25992592 let pmt = value(i.payments[0])
26002593 let assetId = value(pmt.assetId)
26012594 let address = toString(i.caller)
26022595 if ((pmt.amount != 1))
26032596 then throw((("NFT " + DUCKPREFIX) + " token should be attached as payment"))
26042597 else {
26052598 let asset = value(assetInfo(assetId))
26062599 if (if ((asset.issuer != incubatorAddr))
26072600 then (asset.issuer != breederAddr)
26082601 else false)
26092602 then throw((("Unknown issuer of " + DUCKPREFIX) + " token"))
26102603 else if (!(contains(asset.name, DUCKPREFIX)))
26112604 then throw((("Only NFT " + DUCKPREFIX) + " tokens are accepted"))
26122605 else {
26132606 let assetIdStr = toBase58String(assetId)
26142607 let timeKey = keyStakedTimeByAssetId(assetIdStr)
26152608 if (isDefined(getInteger(timeKey)))
26162609 then throw((("NFT " + asset.name) + " is already staked"))
26172610 else if (isDefined(getString(keyStakedDuckByOwner(address))))
26182611 then throw(("You already staked one duck: " + asset.name))
26192612 else {
26202613 let locKey = keyDuckLocation(assetIdStr)
26212614 let location = getString(locKey)
26222615 let bpKey = keyBackpackByDuck(assetIdStr)
26232616 let backpack = getString(bpKey)
26242617 let keyHealth = keyDuckHealth(assetIdStr)
26252618 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(assetIdStr)), 0))
26262619 let curHealth = valueOrElse(getInteger(keyHealth), maxHP)
26272620 ([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, toBase58String(assetId), address), lastBlock.timestamp), StringEntry(keyDuckIdToOwner(assetIdStr), address), StringEntry(keyStakedDuckByOwner(address), assetIdStr)] ++ (if (isDefined(location))
26282621 then nil
26292622 else ([StringEntry(locKey, DEFAULTLOCATION)] ++ (if (isDefined(backpack))
26302623 then nil
26312624 else (([StringEntry(bpKey, "0:0_0_0_0_0_0:0_0_0_0_0_0:")] :+ IntegerEntry(keyHealth, curHealth)) ++ prologActions)))))
26322625 }
26332626 }
26342627 }
26352628 }
26362629 }
26372630
26382631
26392632
26402633 @Callable(i)
26412634 func unstakeDuck (assetIdStr) = {
26422635 let prologActions = prolog(i)
26432636 if ((size(i.payments) != 0))
26442637 then throw("No payments required")
26452638 else {
26462639 let assetId = fromBase58String(assetIdStr)
26472640 let address = toString(i.caller)
26482641 let asset = value(assetInfo(assetId))
26492642 let timeKey = keyStakedTimeByAssetId(assetIdStr)
26502643 if (!(isDefined(getInteger(timeKey))))
26512644 then throw((("NFT " + asset.name) + " is not staked"))
26522645 else if (!(isDefined(getString(keyStakedDuckByOwner(address)))))
26532646 then throw((("The duck " + asset.name) + " is not staked"))
26542647 else {
26552648 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(assetIdStr)), (("NFT " + asset.name) + " is orphaned"))
26562649 if ((owner != address))
26572650 then throw("Staked NFT is not yours")
26582651 else if (checkTournament(assetIdStr))
26592652 then throw("unstakeDuck_checkTournament")
26602653 else if (checkDelivery(assetIdStr))
26612654 then throw("unstakeDuck_checkDelivery")
26622655 else {
26632656 let keyHealth = keyDuckHealth(assetIdStr)
26642657 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(assetIdStr)), 0))
26652658 let health = valueOrElse(getInteger(keyHealth), maxHP)
26662659 if ((maxHP > health))
26672660 then throw((("Please heal your duck to " + toString(maxHP)) + "hp before unstaking"))
26682661 else ([ScriptTransfer(i.caller, 1, assetId), DeleteEntry(timeKey), DeleteEntry(keyHealth), DeleteEntry(keyDuckLocation(assetIdStr)), DeleteEntry(keyDuckIdToOwner(assetIdStr)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, assetIdStr, address)), DeleteEntry(keyStakedDuckByOwner(address))] ++ prologActions)
26692662 }
26702663 }
26712664 }
26722665 }
26732666
26742667
26752668
26762669 @Callable(i)
26772670 func claimRes (amount,landAssetIdStr) = {
26782671 let prologActions = prolog(i)
26792672 if ((size(i.payments) != 0))
26802673 then throw("No payments required")
26812674 else {
26822675 let addr = toString(i.originCaller)
26832676 let result = claimResInternal(addr, amount, claimModeDuck, landAssetIdStr)
26842677 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
26852678 $Tuple2(((((result._1 ++ updateDuckStatsInternal(duckAssetId, fraction(xpClaim, amount, MULT8))._1) :+ StringEntry(result._2, makeString(result._3, ":"))) :+ StringEntry(result._4, makeString(result._5, ":"))) ++ prologActions), result._3[bpIdxRes])
26862679 }
26872680 }
26882681
26892682
26902683
26912684 @Callable(i)
26922685 func claimResToWH (amount,landAssetIdStr) = {
26932686 let prologActions = prolog(i)
26942687 if ((size(i.payments) != 0))
26952688 then throw("No payments required")
26962689 else {
26972690 let addr = toString(i.originCaller)
26982691 let result = claimResInternal(addr, amount, claimModeWh, landAssetIdStr)
26992692 $Tuple2(((((result._1 ++ updateAccStatsInternal(addr, fraction(xpClaim, amount, MULT8))._1) :+ StringEntry(result._2, makeString(result._3, ":"))) :+ StringEntry(result._4, makeString(result._5, ":"))) ++ prologActions), result._5[whIdxRes])
27002693 }
27012694 }
27022695
27032696
27042697
27052698 @Callable(i)
27062699 func flight (message,sig) = {
27072700 let prologActions = prologFlight(i)
27082701 if ((size(i.payments) != 0))
27092702 then throw("No payments required")
27102703 else {
27112704 let userAddr = toString(i.caller)
27122705 let f = flightCommon(userAddr, message, sig)
27132706 let newHP = f._1
27142707 let duckAssetId = f._2
27152708 let locKey = keyDuckLocation(duckAssetId)
27162709 let curLocation = valueOrElse(getString(locKey), DEFAULTLOCATION)
27172710 let newLocation = f._4
27182711 if ((newLocation == curLocation))
27192712 then throw("You can't fly to the same location")
27202713 else {
27212714 let newLoc = split(newLocation, "_")
27222715 let isTour = (newLoc[locIdxType] == "T")
27232716 let isDeliv = (newLoc[locIdxType] == "D")
27242717 let eqKey = keyDuckEquipment(duckAssetId)
27252718 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2726- let $t07311873215 = subtractEquipment(currentEq, f._5)
2727- let newEq = $t07311873215._1
2728- let shouldZeroBuffs = $t07311873215._2
2729- let $t07321876330 = if (!(onMission(tournamentContract, curLocation)))
2719+ let $t07306273159 = subtractEquipment(currentEq, f._5)
2720+ let newEq = $t07306273159._1
2721+ let shouldZeroBuffs = $t07306273159._2
2722+ let $t07316276274 = if (!(onMission(tournamentContract, curLocation)))
27302723 then if (!(isUsualLocation(newLocation)))
27312724 then cheatAttempt(curLocation, newLocation, 5)
27322725 else if ((newHP > 0))
27332726 then $Tuple2(newLocation, newHP)
27342727 else $Tuple2(curLocation, 0)
27352728 else if (isInTournament(tournamentContract, curLocation))
27362729 then if (!(isInTournament(tournamentContract, newLocation)))
27372730 then throw("Your duck is taking part in the tournament")
27382731 else {
27392732 let score = parseIntValue(newLoc[locIdxId])
27402733 let curLoc = split(curLocation, "_")
27412734 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
27422735 if ((score != (parseIntValue(curLoc[locIdxId]) + 1)))
27432736 then cheatAttempt(curLocation, newLocation, 7)
27442737 else if ((newHP > 0))
27452738 then {
27462739 let localBest = valueOrElse(getInteger(tournamentContract, keyBestResultByTourAndDuck(lastId, duckAssetId)), 0)
27472740 let updLocal = if ((score > localBest))
27482741 then invoke(tournamentContract, "saveDuckResult", [duckAssetId, score], nil)
27492742 else unit
27502743 if ((updLocal == updLocal))
27512744 then $Tuple2(newLocation, newHP)
27522745 else throw("Strict value is not equal to itself.")
27532746 }
27542747 else $Tuple2(curLocation, 0)
27552748 }
27562749 else if (!(isInDelivery(curLocation)))
27572750 then {
27582751 let savedLoc = asString(invoke(this, "autoExitDelivery", [duckAssetId, newHP, if (isDeliv)
27592752 then "10"
27602753 else "11", 0], nil))
27612754 if ((savedLoc == savedLoc))
27622755 then if (isDeliv)
27632756 then $Tuple2(savedLoc, newHP)
27642757 else if ((newHP > 0))
27652758 then $Tuple2(newLocation, newHP)
27662759 else $Tuple2(savedLoc, 0)
27672760 else throw("Strict value is not equal to itself.")
27682761 }
27692762 else if (!(isDeliv))
27702763 then throw("Your duck is taking part in delivery")
27712764 else if (!(isInDelivery(newLocation)))
27722765 then cheatAttempt(curLocation, newLocation, 13)
27732766 else {
27742767 let score = parseIntValue(newLoc[locIdxId])
27752768 let curLoc = split(curLocation, "_")
27762769 if ((score != (parseIntValue(curLoc[locIdxId]) + 1)))
27772770 then cheatAttempt(curLocation, newLocation, 14)
27782771 else if (if ((newHP > 0))
27792772 then (1 > score)
27802773 else false)
27812774 then $Tuple2(newLocation, newHP)
27822775 else {
27832776 let savedLoc = asString(invoke(this, "autoExitDelivery", [duckAssetId, newHP, "15-17", score], nil))
27842777 if ((savedLoc == savedLoc))
27852778 then $Tuple2(savedLoc, newHP)
27862779 else throw("Strict value is not equal to itself.")
27872780 }
27882781 }
2789- let locToSave = $t07321876330._1
2790- let hpToSave = $t07321876330._2
2782+ let locToSave = $t07316276274._1
2783+ let hpToSave = $t07316276274._2
27912784 $Tuple2(((([StringEntry(locKey, locToSave), StringEntry(eqKey, newEq), IntegerEntry(keyDuckHealth(duckAssetId), hpToSave)] ++ prologActions) ++ (if (shouldZeroBuffs)
27922785 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
27932786 else nil)) ++ updateDuckStatsInternal(duckAssetId, if ((newHP > 0))
27942787 then xpSuccessFlight
27952788 else xpFailFlight)._1), f._3)
27962789 }
27972790 }
27982791 }
27992792
28002793
28012794
28022795 @Callable(i)
28032796 func heal (quantityL1,quantityL2,quantityL3) = {
28042797 let prologActions = prolog(i)
28052798 if (if (if ((0 > quantityL1))
28062799 then true
28072800 else (0 > quantityL2))
28082801 then true
28092802 else (0 > quantityL3))
28102803 then throw("Quantity cannot be negative")
28112804 else {
28122805 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
28132806 if (checkTournament(duckAssetId))
28142807 then throw("heal_checkTournament")
28152808 else if (checkDelivery(duckAssetId))
28162809 then throw("heal_checkDelivery")
28172810 else {
28182811 let qts = [quantityL1, quantityL2, quantityL3]
28192812 let keyHealth = keyDuckHealth(duckAssetId)
28202813 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
28212814 let oldHealth = valueOrElse(getInteger(keyHealth), maxHP)
28222815 if ((oldHealth >= maxHP))
28232816 then throw((("HP should be < " + toString(maxHP)) + " to heal"))
28242817 else {
28252818 let bpKey = keyBackpackByDuck(duckAssetId)
28262819 let currentPack = getBackpack(bpKey)
28272820 let prodList = if ((currentPack[bpIdxProd] == ""))
28282821 then nil
28292822 else split_4C(currentPack[bpIdxProd], "_")
28302823 func iterateProd (acc,recipe) = {
28312824 let n = acc._2
28322825 let x = if ((size(prodList) > n))
28332826 then parseIntValue(prodList[n])
28342827 else 0
28352828 if ((3 > n))
28362829 then {
28372830 let q = qts[n]
28382831 if ((q > x))
28392832 then throw(((("You have only " + toString(x)) + " of ") + prodTypes[n]))
28402833 else $Tuple3((acc._1 :+ toString((x - q))), (n + 1), (acc._3 + (parseIntValue(split(recipe, "_")[rIdxEffect]) * q)))
28412834 }
28422835 else $Tuple3((acc._1 :+ toString(x)), (n + 1), acc._3)
28432836 }
28442837
28452838 let result = {
28462839 let $l = productionMatrix
28472840 let $s = size($l)
28482841 let $acc0 = $Tuple3(nil, 0, 0)
28492842 func $f0_1 ($a,$i) = if (($i >= $s))
28502843 then $a
28512844 else iterateProd($a, $l[$i])
28522845
28532846 func $f0_2 ($a,$i) = if (($i >= $s))
28542847 then $a
28552848 else throw("List size exceeds 50")
28562849
28572850 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
28582851 }
28592852 let newHealth = min([maxHP, (oldHealth + result._3)])
28602853 $Tuple2((([IntegerEntry(keyHealth, newHealth), StringEntry(bpKey, makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], makeString(result._1, "_")], ":"))] ++ prologActions) ++ updateDuckStatsInternal(duckAssetId, (xpHeal * ((quantityL1 + quantityL2) + quantityL3)))._1), newHealth)
28612854 }
28622855 }
28632856 }
28642857 }
28652858
28662859
28672860
28682861 @Callable(i)
28692862 func healES () = {
28702863 let prologActions = prolog(i)
28712864 if ((size(i.payments) != 1))
28722865 then throw("Exactly one payment required")
28732866 else {
28742867 let pmt = value(i.payments[0])
28752868 if ((pmt.assetId != usdtAssetId))
28762869 then throw("Allowed USDT payment only!")
28772870 else {
28782871 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
28792872 if (checkTournament(duckAssetId))
28802873 then throw("healES_checkTournament")
28812874 else if (checkDelivery(duckAssetId))
28822875 then throw("healES_checkDelivery")
28832876 else {
28842877 let keyHealth = keyDuckHealth(duckAssetId)
28852878 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
28862879 let oldHealth = valueOrElse(getInteger(keyHealth), maxHP)
28872880 if ((oldHealth > 0))
28882881 then throw("HP should be 0 to call Emergency Service")
28892882 else {
28902883 let bpKey = keyBackpackByDuck(duckAssetId)
28912884 let currentPack = getBackpack(bpKey)
28922885 let prodList = if ((currentPack[bpIdxProd] == ""))
28932886 then nil
28942887 else split_4C(currentPack[bpIdxProd], "_")
28952888 let medKitAmount1 = if ((size(prodList) > 0))
28962889 then parseIntValue(prodList[0])
28972890 else 0
28982891 let medKitAmount2 = if ((size(prodList) > 1))
28992892 then parseIntValue(prodList[1])
29002893 else 0
29012894 let medKitAmount3 = if ((size(prodList) > 2))
29022895 then parseIntValue(prodList[2])
29032896 else 0
29042897 if (if (if ((medKitAmount1 > 0))
29052898 then true
29062899 else (medKitAmount2 > 0))
29072900 then true
29082901 else (medKitAmount3 > 0))
29092902 then throw("You have to use own Medical Kit")
29102903 else {
29112904 let existStr = getString(economyContract, keyEsWarehouse())
29122905 let existAmounts = if (isDefined(existStr))
29132906 then split_4C(value(existStr), "_")
29142907 else nil
29152908 let existAmount = if ((size(existAmounts) > 0))
29162909 then parseIntValue(existAmounts[0])
29172910 else 0
29182911 if ((0 >= existAmount))
29192912 then throw("There are no Medical Kits L1 at Emergency Service storage")
29202913 else {
29212914 let newHealth = (oldHealth + parseIntValue(split(productionMatrix[0], "_")[rIdxEffect]))
29222915 let newES = makeString([toString((existAmount - 1)), removeByIndex(existAmounts, 0)], "_")
29232916 let recipe = split(productionMatrix[0], "_")
29242917 let totalMat = getRecipeMaterials(recipe)
29252918 let sellPrice = fraction((totalMat * ESSELLCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
29262919 if ((pmt.amount != sellPrice))
29272920 then throw(("Payment attached should be " + toString(sellPrice)))
29282921 else {
29292922 let result = asString(invoke(economyContract, "updateEsStorage", [newES], [AttachedPayment(usdtAssetId, sellPrice)]))
29302923 $Tuple2(((prologActions :+ IntegerEntry(keyHealth, newHealth)) ++ updateDuckStatsInternal(duckAssetId, xpCallES)._1), result)
29312924 }
29322925 }
29332926 }
29342927 }
29352928 }
29362929 }
29372930 }
29382931 }
29392932
29402933
29412934
29422935 @Callable(i)
29432936 func updateBackpack (duckAssetId,newPack) = if ((i.caller != economyContract))
29442937 then throw("permission denied")
29452938 else $Tuple2([StringEntry(keyBackpackByDuck(duckAssetId), newPack)], newPack)
29462939
29472940
29482941
29492942 @Callable(i)
29502943 func commitForRandom () = {
29512944 let prologActions = prolog(i)
29522945 let finishBlock = (height + randomDelay)
29532946 let addr = toString(i.caller)
29542947 $Tuple2(([IntegerEntry(keyCommit(addr), finishBlock)] ++ prologActions), finishBlock)
29552948 }
29562949
29572950
29582951
29592952 @Callable(i)
29602953 func buySLand () = {
29612954 let prologActions = prolog(i)
29622955 if ((size(i.payments) != 1))
29632956 then throw("Exactly one payment required")
29642957 else {
29652958 let pmt = value(i.payments[0])
29662959 if ((pmt.assetId != usdtAssetId))
29672960 then throw("Allowed USDT payment only!")
29682961 else if ((pmt.amount != EXPUSDT))
29692962 then throw(("Payment attached should be " + toString(EXPUSDT)))
29702963 else {
29712964 let result = expeditionInternal(i.caller, i.transactionId)
29722965 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], nil))
29732966 $Tuple2((((result._1 :+ ScriptTransfer(economyContract, pmt.amount, usdtAssetId)) ++ updateAccStatsInternal(toString(i.caller), xpNewSLand)._1) ++ prologActions), $Tuple2(result._2._1, acresResult))
29742967 }
29752968 }
29762969 }
29772970
29782971
29792972
29802973 @Callable(i)
29812974 func expedition (message,sig) = {
29822975 let prologActions = prolog(i)
29832976 if ((size(i.payments) != 0))
29842977 then throw("No payments required")
29852978 else {
29862979 let userAddr = toString(i.caller)
29872980 let f = flightCommon(userAddr, message, sig)
29882981 let duckAssetId = f._2
29892982 let keyHealth = keyDuckHealth(duckAssetId)
29902983 let bpKey = keyBackpackByDuck(duckAssetId)
29912984 let currentPack = getBackpack(bpKey)
29922985 let mList = split(currentPack[bpIdxMat], "_")
29932986 let newMat = makeString(subtractMaterials(true, mList, EXPMATERIALS), "_")
29942987 let eqKey = keyDuckEquipment(duckAssetId)
29952988 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2996- let $t08377083867 = subtractEquipment(currentEq, f._5)
2997- let newEq = $t08377083867._1
2998- let shouldZeroBuffs = $t08377083867._2
2989+ let $t08371483811 = subtractEquipment(currentEq, f._5)
2990+ let newEq = $t08371483811._1
2991+ let shouldZeroBuffs = $t08371483811._2
29992992 let e = expeditionInternal(i.caller, i.transactionId)
30002993 let id = e._2._1
30012994 let result = if ((0 >= f._1))
30022995 then $Tuple3([IntegerEntry(keyHealth, 0), StringEntry(eqKey, newEq)], "", 0)
30032996 else $Tuple3((e._1 ++ (if (shouldZeroBuffs)
30042997 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
30052998 else ((((nil :+ StringEntry(keyDuckLocation(duckAssetId), makeString([e._2._2, "L", id], "_"))) :+ IntegerEntry(keyHealth, f._1)) :+ StringEntry(eqKey, newEq)) :+ StringEntry(bpKey, makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], newMat, currentPack[bpIdxProd]], ":"))))), id, f._3)
30062999 if (checkTournament(duckAssetId))
30073000 then throw("expedition_checkTournament")
30083001 else if (checkDelivery(duckAssetId))
30093002 then throw("expedition_checkDelivery")
30103003 else {
30113004 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], nil))
30123005 $Tuple2(((result._1 ++ updateDuckStatsInternal(duckAssetId, xpNewSLand)._1) ++ prologActions), $Tuple3(result._2, result._3, acresResult))
30133006 }
30143007 }
30153008 }
30163009
30173010
30183011
30193012 @Callable(i)
30203013 func buySLandForAcres () = {
30213014 let prologActions = prolog(i)
30223015 if ((size(i.payments) != 1))
30233016 then throw("exactly 1 payment must be attached")
30243017 else {
30253018 let pmt = i.payments[0]
30263019 let amt = pmt.amount
30273020 if (if (!(isDefined(pmt.assetId)))
30283021 then true
30293022 else (value(pmt.assetId) != acresAssetId))
30303023 then throw("ACRES payments only!")
30313024 else if ((amt != S_COST_ACRES))
30323025 then throw(("Payment attached should be " + toString(S_COST_ACRES)))
30333026 else {
30343027 let result = expeditionInternal(i.caller, i.transactionId)
30353028 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], [AttachedPayment(acresAssetId, amt)]))
30363029 $Tuple2(((result._1 ++ updateAccStatsInternal(toString(i.caller), xpNewSLand)._1) ++ prologActions), $Tuple2(result._2._1, acresResult))
30373030 }
30383031 }
30393032 }
30403033
30413034
30423035
30433036 @Callable(i)
30443037 func upgradeInfra (landAssetId) = {
30453038 let prologActions = prolog(i)
30463039 if ((size(i.payments) != 0))
30473040 then throw("No payments required")
30483041 else {
30493042 let result = upInfraCommon(true, i.caller, 0, landAssetId)
30503043 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
30513044 $Tuple2(((result._1 ++ prologActions) ++ updateDuckStatsInternal(duckAssetId, fraction(xpUpgradeInfra, result._3, MULT8))._1), result._2)
30523045 }
30533046 }
30543047
30553048
30563049
30573050 @Callable(i)
30583051 func activateArtifact (artName,landAssetIdOpt) = {
30593052 let prologActions = prolog(i)
30603053 if ((size(i.payments) != 0))
30613054 then throw("No payments required")
30623055 else {
30633056 let addr = toString(i.caller)
30643057 let result = match artName {
30653058 case _ =>
30663059 if (("PRESALE" == $match0))
30673060 then activatePresaleArt(addr, landAssetIdOpt)
30683061 else if (("ONBOARD" == $match0))
30693062 then activateOnboardArt(addr)
30703063 else throw("Unknown artifact")
30713064 }
30723065 (result ++ prologActions)
30733066 }
30743067 }
30753068
30763069
30773070
30783071 @Callable(i)
30793072 func mergeLands (landAssetIds) = {
30803073 let prologActions = prolog(i)
30813074 if ((size(i.payments) != 0))
30823075 then throw("No payments required")
30833076 else {
30843077 let result = mergeCommon(toString(i.caller), landAssetIds)
30853078 $Tuple2(((result._1 ++ prologActions) ++ updateAccStatsInternal(toString(i.caller), xpMerge)._1), result._2)
30863079 }
30873080 }
30883081
30893082
30903083
30913084 @Callable(i)
30923085 func cargoExchange (cargoListStr,landAssetId) = {
30933086 let prologActions = prolog(i)
30943087 if ((size(i.payments) != 0))
30953088 then throw("No payments required")
30963089 else {
30973090 let cargoParts = split_4C(cargoListStr, ":")
30983091 let addr = toString(i.originCaller)
30993092 let asset = value(assetInfo(fromBase58String(landAssetId)))
31003093 let timeKey = keyStakedTimeByAssetId(landAssetId)
31013094 if (!(isDefined(getInteger(timeKey))))
31023095 then throw((asset.name + " is not staked"))
31033096 else {
31043097 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
31053098 if ((owner != addr))
31063099 then throw((LANDPREFIX + " is not yours"))
31073100 else {
31083101 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
31093102 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
31103103 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
31113104 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
31123105 let loc = split(value(curLocation), "_")
31133106 if ((loc[locIdxType] != "L"))
31143107 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
31153108 else if ((loc[locIdxId] != landAssetId))
31163109 then throw(("Duck should be on the land " + landAssetId))
31173110 else {
31183111 let whKey = keyWarehouseByLand(landAssetId)
31193112 let currentWh = getWarehouse(whKey, landIndex, infraLevel)
31203113 let bpKey = keyBackpackByDuck(duckAssetId)
31213114 let currentPack = getBackpack(bpKey)
31223115 let result = moveStuff(cargoParts, currentWh, currentPack)
31233116 let loft = split(currentWh[whIdxLOFT], "_")
31243117 let loftO = (parseIntValue(loft[volOccupied]) + result._7)
31253118 let loftF = (parseIntValue(loft[volFree]) - result._7)
31263119 ([StringEntry(bpKey, makeString_2C([currentPack[bpIdxLevel], result._4, result._5, result._6], ":")), StringEntry(whKey, makeString_2C([currentWh[whIdxLevels], result._1, result._2, result._3, makeString([loft[volLocked], toString(loftO), toString(loftF), loft[volTotal]], "_")], ":"))] ++ prologActions)
31273120 }
31283121 }
31293122 }
31303123 }
31313124 }
31323125
31333126
31343127
31353128 @Callable(i)
31363129 func saveWarehouse (whStr,landAssetId) = if ((i.caller != economyContract))
31373130 then throw("Access denied")
31383131 else {
31393132 let whKey = keyWarehouseByLand(landAssetId)
31403133 let wh = split_4C(whStr, ":")
31413134 if ((size(wh) != 5))
31423135 then throw("warehouse string should contain 4 ':' separators")
31433136 else {
31443137 let loftL = split(wh[whIdxLOFT], "_")[volLocked]
31453138 let loftO = getWarehouseOccupiedVol(wh)
31463139 let loftT = getWarehouseTotalVolume(wh[whIdxLevels])
31473140 let loftF = ((loftT - parseIntValue(loftL)) - loftO)
31483141 if ((0 > loftF))
31493142 then throw("Operation leads to negative free warehouse space")
31503143 else {
31513144 let newWhStr = makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], wh[whIdxProd], makeString([loftL, toString(loftO), toString(loftF), toString(loftT)], "_")], ":")
31523145 $Tuple2([StringEntry(whKey, newWhStr)], newWhStr)
31533146 }
31543147 }
31553148 }
31563149
31573150
31583151
31593152 @Callable(i)
31603153 func setCustomName (assetId,customName,type) = {
31613154 let prologActions = prolog(i)
31623155 if ((size(i.payments) != 1))
31633156 then throw("Exactly one payment required")
31643157 else {
31653158 let pmt = value(i.payments[0])
31663159 if ((pmt.assetId != usdtAssetId))
31673160 then throw("Allowed USDT payment only!")
31683161 else if ((pmt.amount != RENAMINGCOST))
31693162 then throw(("Payment should be " + toString(RENAMINGCOST)))
31703163 else if (contains(customName, "__"))
31713164 then throw(("Name should not contain '__': " + customName))
31723165 else if ((size(customName) > MAXNAMELEN))
31733166 then throw(("Name too long, maxLength=" + toString(MAXNAMELEN)))
31743167 else {
31753168 let addr = toString(i.originCaller)
31763169 let actions = match type {
31773170 case _ =>
31783171 if (("ACCOUNT" == $match0))
31793172 then {
31803173 let reverseKey = keyCustomNameToAddress(customName)
31813174 let nameOwner = getString(reverseKey)
31823175 if (isDefined(nameOwner))
31833176 then throw(("Name already registered: " + customName))
31843177 else {
31853178 let addrToNameKey = keyAddressToCustomName(addr)
31863179 let oldName = getString(addrToNameKey)
31873180 let freeOld = if (isDefined(oldName))
31883181 then [DeleteEntry(keyCustomNameToAddress(value(oldName)))]
31893182 else nil
31903183 (((freeOld :+ StringEntry(addrToNameKey, customName)) :+ StringEntry(reverseKey, addr)) ++ updateAccStatsInternal(addr, xpCustomName)._1)
31913184 }
31923185 }
31933186 else if (("LAND" == $match0))
31943187 then {
31953188 let asset = value(assetInfo(fromBase58String(assetId)))
31963189 let timeKey = keyStakedTimeByAssetId(assetId)
31973190 if (!(isDefined(getInteger(timeKey))))
31983191 then throw((asset.name + " is not staked"))
31993192 else {
32003193 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(assetId)), (("NFT " + asset.name) + " is orphaned"))
32013194 if ((owner != addr))
32023195 then throw((LANDPREFIX + " is not yours"))
32033196 else {
32043197 let reverseKey = keyLandCustomNameToAssetId(customName)
32053198 let nameOwner = getString(reverseKey)
32063199 if (isDefined(nameOwner))
32073200 then throw(("Name already registered: " + customName))
32083201 else {
32093202 let assetToNameKey = keyLandAssetIdToCustomName(assetId)
32103203 let oldName = getString(assetToNameKey)
32113204 let freeOld = if (isDefined(oldName))
32123205 then [DeleteEntry(keyLandCustomNameToAssetId(value(oldName)))]
32133206 else nil
32143207 (((freeOld :+ StringEntry(assetToNameKey, customName)) :+ StringEntry(reverseKey, assetId)) ++ updateAccStatsInternal(addr, xpCustomName)._1)
32153208 }
32163209 }
32173210 }
32183211 }
32193212 else if (("DUCK" == $match0))
32203213 then {
32213214 let asset = value(assetInfo(fromBase58String(assetId)))
32223215 let timeKey = keyStakedTimeByAssetId(assetId)
32233216 if (if (!(isDefined(getInteger(timeKey))))
32243217 then true
32253218 else !(isDefined(getString(keyStakedDuckByOwner(addr)))))
32263219 then throw((asset.name + " is not staked"))
32273220 else {
32283221 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(assetId)), (("NFT " + asset.name) + " is orphaned"))
32293222 if ((owner != addr))
32303223 then throw((DUCKPREFIX + " is not yours"))
32313224 else {
32323225 let reverseKey = keyDuckCustomNameToAssetId(customName)
32333226 let nameOwner = getString(reverseKey)
32343227 if (isDefined(nameOwner))
32353228 then throw(("Name already registered: " + customName))
32363229 else {
32373230 let assetToNameKey = keyDuckAssetIdToCustomName(assetId)
32383231 let oldName = getString(assetToNameKey)
32393232 let freeOld = if (isDefined(oldName))
32403233 then [DeleteEntry(keyDuckCustomNameToAssetId(value(oldName)))]
32413234 else nil
32423235 (((freeOld :+ StringEntry(assetToNameKey, customName)) :+ StringEntry(reverseKey, assetId)) ++ updateDuckStatsInternal(assetId, xpCustomName)._1)
32433236 }
32443237 }
32453238 }
32463239 }
32473240 else throw("Unknown entity type")
32483241 }
32493242 $Tuple2(((actions :+ ScriptTransfer(economyContract, pmt.amount, usdtAssetId)) ++ prologActions), 0)
32503243 }
32513244 }
32523245 }
32533246
32543247
32553248
32563249 @Callable(i)
32573250 func setReferrals (oldPlayer,newPlayer) = if ((i.callerPublicKey != pub))
32583251 then throw("Permission denied")
32593252 else {
32603253 let prologActions = prolog(i)
32613254 if ((size(i.payments) != 0))
32623255 then throw("No payments required")
32633256 else if (!(isDefined(addressFromString(oldPlayer))))
32643257 then throw(("Invalid address: " + oldPlayer))
32653258 else if (!(isDefined(addressFromString(newPlayer))))
32663259 then throw(("Invalid address: " + newPlayer))
32673260 else {
32683261 let oldsKey = keyOldies()
32693262 let olds = getString(oldsKey)
32703263 let oldies = if (isDefined(olds))
32713264 then split_4C(value(olds), "_")
32723265 else nil
32733266 if (containsElement(oldies, newPlayer))
32743267 then throw((newPlayer + " is not newbie (already has referrals)"))
32753268 else {
32763269 let refByKey = keyAddressRefBy(newPlayer)
32773270 let refBy = getString(refByKey)
32783271 if (if (isDefined(refBy))
32793272 then isDefined(addressFromString(value(refBy)))
32803273 else false)
32813274 then throw(((newPlayer + " already has refBy: ") + value(refBy)))
32823275 else {
32833276 let refsKey = keyAddressReferrals(oldPlayer)
32843277 let refs = getString(refsKey)
32853278 let refsArray = if (isDefined(refs))
32863279 then split_4C(value(refs), "_")
32873280 else nil
32883281 if (containsElement(refsArray, newPlayer))
32893282 then throw((((oldPlayer + " already contains ") + newPlayer) + " within referrals"))
32903283 else {
32913284 let newRefs = makeString_2C((refsArray :+ newPlayer), "_")
32923285 let newOlds = if (containsElement(oldies, oldPlayer))
32933286 then value(olds)
32943287 else makeString_2C((oldies :+ oldPlayer), "_")
32953288 $Tuple2(([StringEntry(refByKey, oldPlayer), StringEntry(refsKey, newRefs), StringEntry(oldsKey, newOlds)] ++ prologActions), 0)
32963289 }
32973290 }
32983291 }
32993292 }
33003293 }
33013294
33023295
33033296
33043297 @Callable(i)
33053298 func distributePoints (strength,accuracy,intellect,endurance,dexterity) = {
33063299 let prologActions = prolog(i)
33073300 if ((size(i.payments) != 0))
33083301 then throw("No payments required")
33093302 else {
33103303 let addr = toString(i.originCaller)
33113304 let virtWlgData = asAnyList(invoke(wlgContract, "checkWlgXpREADONLY", [addr], nil))
33123305 let virtWlgPoints = asInt(virtWlgData[1])
3313- let $t09948799877 = if ((0 >= virtWlgPoints))
3306+ let $t09943199821 = if ((0 >= virtWlgPoints))
33143307 then $Tuple2(0, nil)
33153308 else {
33163309 let deltaXP = asInt(invoke(wlgContract, "takeWlgXp", [addr], nil))
33173310 if ((deltaXP == deltaXP))
33183311 then $Tuple2(virtWlgPoints, [IntegerEntry(keyUserLevel(addr), asInt(virtWlgData[0])), IntegerEntry(keyUserXP(addr), asInt(virtWlgData[2]))])
33193312 else throw("Strict value is not equal to itself.")
33203313 }
3321- let wlgPoints = $t09948799877._1
3322- let wlgActions = $t09948799877._2
3314+ let wlgPoints = $t09943199821._1
3315+ let wlgActions = $t09943199821._2
33233316 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
33243317 let freeKeyAcc = keyUserFreePoints(addr)
33253318 let freePointsAcc = (valueOrElse(getInteger(freeKeyAcc), 0) + wlgPoints)
33263319 let freeKeyDuck = keyDuckFreePoints(duckAssetId)
33273320 let freePointsDuck = valueOrElse(getInteger(freeKeyDuck), 0)
33283321 let sumFree = (freePointsAcc + freePointsDuck)
33293322 let sumToDistribute = ((((strength + accuracy) + intellect) + endurance) + dexterity)
33303323 if ((sumToDistribute > sumFree))
33313324 then throw((("There are only " + toString(sumFree)) + " free points to distribute"))
33323325 else {
33333326 let charsKey = keyDuckChars(duckAssetId)
33343327 let chars = split(valueOrElse(getString(charsKey), "0_0_0_0_0"), "_")
33353328 let newAcc = (freePointsAcc - sumToDistribute)
33363329 $Tuple2((([IntegerEntry(freeKeyAcc, if ((0 > newAcc))
33373330 then 0
33383331 else newAcc), IntegerEntry(freeKeyDuck, if ((0 > newAcc))
33393332 then (freePointsDuck + newAcc)
33403333 else freePointsDuck), StringEntry(charsKey, makeString([toString((parseIntValue(chars[charStrength]) + strength)), toString((parseIntValue(chars[charAccuracy]) + accuracy)), toString((parseIntValue(chars[charIntellect]) + intellect)), toString((parseIntValue(chars[charEndurance]) + endurance)), toString((parseIntValue(chars[charDexterity]) + dexterity))], "_"))] ++ prologActions) ++ wlgActions), 0)
33413334 }
33423335 }
33433336 }
33443337
33453338
33463339
33473340 @Callable(i)
33483341 func splitByGlobalWeightsREADONLY (amount) = $Tuple2(nil, getNeededMaterials(amount))
33493342
33503343
33513344
33523345 @Callable(i)
33533346 func splitByGlobalAndLocalWeightsREADONLY (matAmount,resAmount,terrains) = {
33543347 let terrainCounts = countTerrains(terrains)
33553348 $Tuple2(nil, $Tuple2(getNeededMaterials(matAmount), distributeByWeights(resAmount, terrainCounts)))
33563349 }
33573350
33583351
33593352
33603353 @Callable(i)
33613354 func getBackpackREADONLY (duckAssetId) = $Tuple2(nil, makeString(getBackpack(keyBackpackByDuck(duckAssetId)), ":"))
33623355
33633356
33643357
33653358 @Callable(i)
33663359 func getWarehouseREADONLY (landAssetId) = {
33673360 let asset = value(assetInfo(fromBase58String(landAssetId)))
33683361 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
33693362 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
33703363 $Tuple2(nil, makeString_2C(getWarehouse(keyWarehouseByLand(landAssetId), landIndex, infraLevel), ":"))
33713364 }
33723365
33733366
33743367
33753368 @Callable(i)
33763369 func saveLastTx () = if (!(containsElement([wlgContract, economyContract, tournamentContract, acresContract], i.caller)))
33773370 then throw("Access denied")
33783371 else $Tuple2(prolog(i), 42)
33793372
33803373
33813374
33823375 @Callable(i)
33833376 func updateDuckStats (duckAssetId,deltaXP) = if ((i.caller != economyContract))
33843377 then throw("Access denied")
33853378 else updateDuckStatsInternal(duckAssetId, deltaXP)
33863379
33873380
33883381
33893382 @Callable(i)
33903383 func updateAccStats (addr,deltaXP) = if (!(containsElement([wlgContract, economyContract, acresContract], i.caller)))
33913384 then throw("Access denied")
33923385 else updateAccStatsInternal(addr, deltaXP)
33933386
33943387
33953388
33963389 @Callable(i)
33973390 func equipDuck (equipment) = {
33983391 let prologActions = prolog(i)
33993392 if ((size(i.payments) != 0))
34003393 then throw("No payments required")
34013394 else {
34023395 let addr = toString(i.originCaller)
34033396 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
34043397 if (checkTournament(duckAssetId))
34053398 then throw("equipDuck_checkTournament")
34063399 else if (checkDelivery(duckAssetId))
34073400 then throw("equipDuck_checkDelivery")
34083401 else {
34093402 let eqKey = keyDuckEquipment(duckAssetId)
34103403 let currentSegs = split(valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,"), "_")
34113404 let bpKey = keyBackpackByDuck(duckAssetId)
34123405 let currentPack = getBackpack(bpKey)
34133406 let newEq = split(equipment, "_")
34143407 if ((size(newEq) != NUMSEGMENTS))
34153408 then throw("Wrong equipment string")
34163409 else {
34173410 let tempProdB = dressB(currentSegs, prodStrToBytes(currentPack[bpIdxProd]), true, nil)
34183411 let segBpAux = split(newEq[segBackpack], ";")[1]
34193412 let buffEffect = if ((segBpAux == ""))
34203413 then 0
34213414 else {
34223415 let aux0 = split(segBpAux, ",")[0]
34233416 if ((aux0 == ""))
34243417 then 0
34253418 else {
34263419 let idxCnt = split(aux0, ":")
34273420 let idx = idxCnt[0]
34283421 let cnt = idxCnt[1]
34293422 if (if (if (if (if ((idx == "06"))
34303423 then true
34313424 else (idx == "07"))
34323425 then true
34333426 else (idx == "08"))
34343427 then (cnt != "")
34353428 else false)
34363429 then (parseIntValue(cnt) > 0)
34373430 else false)
34383431 then parseIntValue(split(productionMatrix[parseIntValue(idx)], "_")[rIdxEffect])
34393432 else 0
34403433 }
34413434 }
34423435 let stats = getDuckStats(this, duckAssetId, buffEffect, true)
34433436 let newProdB = dressB(newEq, tempProdB, false, stats)
34443437 let newProdStr = bytesToProdStr(newProdB)
34453438 $Tuple2(([StringEntry(eqKey, equipment), StringEntry(bpKey, makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], newProdStr], ":")), StringEntry(keyDuckBuffs(duckAssetId), makeString([toString(stats[7]), toString(stats[8]), toString(stats[9]), toString(stats[10]), toString(stats[11])], "_"))] ++ prologActions), 0)
34463439 }
34473440 }
34483441 }
34493442 }
34503443
34513444
34523445
34533446 @Callable(i)
34543447 func fortificateLand (landAssetId,plan) = {
34553448 let prologActions = prolog(i)
34563449 if ((size(i.payments) != 0))
34573450 then throw("No payments required")
34583451 else {
34593452 let addr = toString(i.originCaller)
34603453 let duckAssetId = valueOrElse(getString(keyStakedDuckByOwner(addr)), "")
34613454 let duckStats = getDuckStats(this, duckAssetId, 0, false)
34623455 let fortKey = keyFortificationsByLand(landAssetId)
34633456 let currentForts = split(valueOrElse(getString(fortKey), ":0_15:0_18:0"), "_")
34643457 let asset = value(assetInfo(fromBase58String(landAssetId)))
34653458 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
34663459 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
34673460 let whKey = keyWarehouseByLand(landAssetId)
34683461 let wh = getWarehouse(whKey, landIndex, infraLevel)
34693462 let curLoft = split(wh[whIdxLOFT], "_")
34703463 let curO = parseIntValue(curLoft[volOccupied])
34713464 let curF = parseIntValue(curLoft[volFree])
34723465 let newForts = split(plan, "_")
3473- let $t0106715106830 = fortB(currentForts, prodStrToBytes(wh[whIdxProd]), curO, curF, true, nil)
3474- let tempProdB = $t0106715106830._1
3475- let tempO = $t0106715106830._2
3476- let tempF = $t0106715106830._3
3477- let $t0106833106929 = fortB(newForts, tempProdB, tempO, tempF, false, duckStats)
3478- let newProdB = $t0106833106929._1
3479- let newO = $t0106833106929._2
3480- let newF = $t0106833106929._3
3466+ let $t0106659106774 = fortB(currentForts, prodStrToBytes(wh[whIdxProd]), curO, curF, true, nil)
3467+ let tempProdB = $t0106659106774._1
3468+ let tempO = $t0106659106774._2
3469+ let tempF = $t0106659106774._3
3470+ let $t0106777106873 = fortB(newForts, tempProdB, tempO, tempF, false, duckStats)
3471+ let newProdB = $t0106777106873._1
3472+ let newO = $t0106777106873._2
3473+ let newF = $t0106777106873._3
34813474 let newProdStr = bytesToProdStr(newProdB)
34823475 let newLoftStr = makeString([curLoft[volLocked], toString(newO), toString(newF), curLoft[volTotal]], "_")
34833476 $Tuple2(([StringEntry(fortKey, plan), StringEntry(whKey, makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], newProdStr, newLoftStr], ":"))] ++ prologActions), 0)
34843477 }
34853478 }
34863479
34873480
34883481
34893482 @Callable(i)
34903483 func initDuckTourAttempt (duckAssetId) = if ((i.caller != tournamentContract))
34913484 then throw("Access denied")
34923485 else {
34933486 let keyHealth = keyDuckHealth(duckAssetId)
34943487 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
34953488 let curHealth = valueOrElse(getInteger(keyHealth), maxHP)
34963489 let curLocKey = keyDuckLocation(duckAssetId)
34973490 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
34983491 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
34993492 let tourLocation = (toString(lastId) + "_T_0")
35003493 $Tuple2([IntegerEntry(keySavedHealth(duckAssetId), curHealth), IntegerEntry(keyHealth, maxHP), StringEntry(keySavedLocation(duckAssetId), curLocation), StringEntry(curLocKey, tourLocation)], tourLocation)
35013494 }
35023495
35033496
35043497
35053498 @Callable(i)
35063499 func breakAttempt () = {
35073500 let prologActions = prolog(i)
35083501 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
35093502 let curLocKey = keyDuckLocation(duckAssetId)
35103503 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
35113504 if ((split(curLocation, "_")[locIdxType] != "T"))
35123505 then throw("Your duck is not in the tournament")
35133506 else {
35143507 let savedHealth = getIntegerValue(keySavedHealth(duckAssetId))
35153508 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
35163509 $Tuple2(((prologActions :+ IntegerEntry(keyDuckHealth(duckAssetId), savedHealth)) :+ StringEntry(curLocKey, savedLocation)), curLocation)
35173510 }
35183511 }
35193512
35203513
35213514
35223515 @Callable(i)
35233516 func exitTournamentInternal (duckAssetId) = if ((i.caller != this))
35243517 then throw("Access denied")
35253518 else {
35263519 let savedHealth = getIntegerValue(keySavedHealth(duckAssetId))
35273520 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
35283521 $Tuple2([IntegerEntry(keyDuckHealth(duckAssetId), savedHealth), StringEntry(keyDuckLocation(duckAssetId), savedLocation)], false)
35293522 }
35303523
35313524
35323525
35333526 @Callable(i)
35343527 func exitDeliveryInternal (duckAssetId) = if ((i.caller != this))
35353528 then throw("Access denied")
35363529 else {
35373530 let e = exitDeliveryCommon(duckAssetId, false, 0, 0)
35383531 $Tuple2((e._1 ++ e._2), false)
35393532 }
35403533
35413534
35423535
35433536 @Callable(i)
35443537 func autoExitDelivery (duckAssetId,newHP,reason,score) = if ((i.caller != this))
35453538 then throw("Access denied")
35463539 else {
35473540 let e = exitDeliveryCommon(duckAssetId, true, newHP, score)
35483541 $Tuple2(e._1, e._3)
35493542 }
35503543
35513544
35523545
35533546 @Callable(i)
35543547 func breakDelivery () = $Tuple2(prolog(i), "breakDelivery")
35553548
35563549
35573550
35583551 @Callable(i)
35593552 func prepareRobbery (message,sig) = {
35603553 let prologActions = prolog(i)
35613554 if (!(sigVerify_8Kb(message, sig, pub)))
35623555 then throw("signature does not match")
35633556 else if ((size(i.payments) != 1))
35643557 then throw("exactly 1 payment must be attached")
35653558 else {
35663559 let pmt = i.payments[0]
35673560 let wlgAmt = pmt.amount
35683561 if (if (!(isDefined(pmt.assetId)))
35693562 then true
35703563 else (value(pmt.assetId) != wlgAssetId))
35713564 then throw("WLGOLD payments only!")
35723565 else {
35733566 let parts = split(toUtf8String(message), "|")
35743567 if ((size(parts) != 2))
35753568 then throw("Wrong message format")
35763569 else {
35773570 let duckAssetId = parts[0]
35783571 if (checkTournament(duckAssetId))
35793572 then throw("prepareRobbery_checkTournament")
35803573 else if (checkDelivery(duckAssetId))
35813574 then throw("prepareRobbery_checkDelivery")
35823575 else {
35833576 let robCost = getRobberyData(this, duckAssetId)._1
35843577 if ((robCost > wlgAmt))
35853578 then throw(((("Payment " + toString(wlgAmt)) + " < required ") + toString(robCost)))
35863579 else {
35873580 let candidates = split(parts[1], "_")
35883581 let now = lastBlock.timestamp
35893582 let duckState = valueOrElse(getInteger(keyDuckRobberyState(duckAssetId)), 0)
35903583 let lockedLand = valueOrElse(getString(keyLockedLandByDuck(duckAssetId)), "")
35913584 let landETA = valueOrElse(getInteger(keyLandCooldownETA(lockedLand)), 0)
35923585 if (if ((duckState != duckIdxFree))
35933586 then (landETA > now)
35943587 else false)
35953588 then throw(("You already started robbing, wait till " + toString(landETA)))
35963589 else {
35973590 func checker (acc,landAssetId) = {
35983591 let state = valueOrElse(getInteger(keyLandRobberyState(landAssetId)), 0)
35993592 let cooldownETA = valueOrElse(getInteger(keyLandCooldownETA(landAssetId)), 0)
36003593 if ((state > size(landRobCooldowns)))
36013594 then throw("Invalid state")
36023595 else if ((now > cooldownETA))
36033596 then {
36043597 let stakedTime = valueOrElse(getInteger(keyStakedTimeByAssetId(landAssetId)), 0)
36053598 if ((0 >= stakedTime))
36063599 then acc
36073600 else {
36083601 let a = value(assetInfo(fromBase58String(landAssetId)))
36093602 let d = split(a.description, "_")
36103603 let pieces = numPiecesBySize(d[recLandSize])
36113604 let productivity = applyBonuses(landAssetId, pieces)
36123605 let deltaTime = (now - stakedTime)
36133606 let availRes = fraction(deltaTime, (productivity * pieces), DAYMILLIS)
36143607 if ((MIN_RES_TO_ROB > availRes))
36153608 then acc
36163609 else (acc :+ landAssetId)
36173610 }
36183611 }
36193612 else acc
36203613 }
36213614
36223615 let filtered = {
36233616 let $l = candidates
36243617 let $s = size($l)
36253618 let $acc0 = nil
36263619 func $f0_1 ($a,$i) = if (($i >= $s))
36273620 then $a
36283621 else checker($a, $l[$i])
36293622
36303623 func $f0_2 ($a,$i) = if (($i >= $s))
36313624 then $a
36323625 else throw("List size exceeds 10")
36333626
36343627 $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)
36353628 }
36363629 if ((size(filtered) == 0))
36373630 then throw("No candidates for robbery")
36383631 else {
36393632 let rndIdx = getRandomNumber(size(filtered), message, sig)
36403633 let landAssetId = filtered[rndIdx]
36413634 $Tuple2(([IntegerEntry(keyLandRobberyState(landAssetId), robIdxLocked), IntegerEntry(keyLandCooldownETA(landAssetId), (now + landRobCooldowns[robIdxLocked])), IntegerEntry(keyDuckRobberyState(duckAssetId), duckIdxPreparing), StringEntry(keyLockedLandByDuck(duckAssetId), landAssetId)] ++ prologActions), landAssetId)
36423635 }
36433636 }
36443637 }
36453638 }
36463639 }
36473640 }
36483641 }
36493642 }
36503643
36513644
36523645
36533646 @Callable(i)
36543647 func robLand (message,sig) = {
36553648 let prologActions = prolog(i)
36563649 if (!(sigVerify_8Kb(message, sig, pub)))
36573650 then throw("signature does not match")
36583651 else {
36593652 let userAddr = toString(i.caller)
36603653 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
36613654 let now = lastBlock.timestamp
36623655 $Tuple2((prologActions :+ IntegerEntry(keyLastRobberyTimeByDuck(duckAssetId), now)), 0)
36633656 }
36643657 }
36653658
36663659
36673660
36683661 @Callable(i)
36693662 func acceptDelivery () = {
36703663 let prologActions = prolog(i)
36713664 let userAddr = toString(i.caller)
36723665 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
36733666 let fundTotal = valueOrElse(getInteger(economyContract, deliveryFundKey), 0)
36743667 let lockedTotal = valueOrElse(getInteger(economyContract, deliveryLockedKey), 0)
36753668 if ((MIN_USDT_FEE_DELIVERY > (fundTotal - lockedTotal)))
36763669 then throw(((("Delivery is not available, fund=" + fixedPoint(fundTotal, 6)) + ", locked=") + fixedPoint(lockedTotal, 6)))
36773670 else {
36783671 let now = lastBlock.timestamp
36793672 let delayETA = valueOrElse(getInteger(keyDeliveryDelayByDuck(duckAssetId)), 0)
36803673 if ((delayETA > now))
36813674 then throw(("Delivery is forbidden for your duck until " + toString(delayETA)))
36823675 else {
36833676 let health = getIntegerValue(keyDuckHealth(duckAssetId))
36843677 if ((0 >= health))
36853678 then throw("You cannot accept delivery with zero health")
36863679 else {
36873680 let countKey = keyUserDeliveryCount(userAddr)
36883681 let count = valueOrElse(getInteger(countKey), 0)
36893682 let lastDay = valueOrElse(getInteger(keyUserLastDeliveryDay(userAddr)), 0)
36903683 let today = (now / DAYMILLIS)
36913684 let acres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddr)), 0)
36923685 let allowedDeliveries = (ALLOWED_FREE_DELIVERIES + (acres / ACRES_FOR_DELIVERY_ATTEMPT))
36933686 if (if ((count >= allowedDeliveries))
36943687 then (lastDay == today)
36953688 else false)
36963689 then throw((("You already used " + toString(allowedDeliveries)) + " delivery attempts for today"))
36973690 else if (checkTournament(duckAssetId))
36983691 then throw("acceptDelivery_checkTournament")
36993692 else if (checkDelivery(duckAssetId))
37003693 then throw("acceptDelivery_checkDelivery")
37013694 else {
37023695 let newLockedTotal = asInt(invoke(economyContract, "updateDeliveryLocked", [(lockedTotal + MIN_USDT_FEE_DELIVERY)], nil))
37033696 let curLocKey = keyDuckLocation(duckAssetId)
37043697 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
37053698 let deliveryLocation = (toString(now) + "_D_0")
37063699 $Tuple2(([StringEntry(keySavedLocation(duckAssetId), curLocation), StringEntry(curLocKey, deliveryLocation), IntegerEntry(countKey, if ((lastDay != today))
37073700 then 0
37083701 else count)] ++ prologActions), $Tuple2(deliveryLocation, newLockedTotal))
37093702 }
37103703 }
37113704 }
37123705 }
37133706 }
37143707
37153708
37163709
37173710 @Callable(i)
37183711 func checkDeliveryCallback (duckAssetId) = if ((i.caller != tournamentContract))
37193712 then throw("Access denied")
37203713 else $Tuple2(nil, checkDelivery(duckAssetId))
37213714
37223715
37233716
37243717 @Callable(i)
37253718 func genTestREADONLY (seed,landSizeIndex) = {
37263719 let vrf = value(value(blockInfoByHeight(2827006)).vrf)
37273720 let bigNum = abs(toBigInt((vrf + sha256(toBytes(seed)))))
3728- $Tuple2(nil, gen1(bigNum, landSizeIndex))
3721+ $Tuple2(nil, gen1(bigNum, landSizeIndex, -1))
37293722 }
37303723
37313724

github/deemru/w8io/169f3d6 
620.86 ms