tx · DYWprMNgwRcxyBQsbywLHWYo17cbCotJBzWj3wpP2zmM

3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm:  -0.10800000 Waves

2023.11.03 16:30 [2827211] smart account 3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm > SELF 0.00000000 Waves

{ "type": 13, "id": "DYWprMNgwRcxyBQsbywLHWYo17cbCotJBzWj3wpP2zmM", "fee": 10800000, "feeAssetId": null, "timestamp": 1699018135348, "version": 2, "chainId": 84, "sender": "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm", "senderPublicKey": "EVooykMNV691Venwp1dHUTBd7KWequzUcda57Wd3LQEX", "proofs": [ "4EM9fgwjV5JqhkcaAgFszTs295AQ4CcWh8CvngYVUhJhp7YKfy5SgdvgVqcLAKNfDW4zuSKBjKg3AmkUokgPXKwN" ], "script": "base64:BgLiAQgCEgMKAQgSBAoCCAESAwoBBBIAEgMKAQgSABIDCgEIEgQKAgEIEgQKAgEIEgQKAgICEgUKAwEBARIAEgQKAggIEgASABIECgICAhIAEgMKAQgSBAoCCAgSAwoBGBIECgIICBIECgIICBIFCgMICAgSBAoCCAgSBwoFAQEBAQESAwoBARIFCgMBAQgSAwoBCBIDCgEIEgASBAoCCAESBAoCCAESAwoBCBIECgIICBIDCgEIEgASAwoBCBIDCgEIEgYKBAgBCAESABIECgICAhIECgICAhIAEgMKAQgSBAoCAQGnAgAJREFZTUlMTElTAIC4mSkBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgAGU0NBTEU4AIDC1y8ADHhwTGV2ZWxTY2FsZQCAGQAPeHBMZXZlbFJlY2lwUG93AKAfABJudW1Qb2ludHNPbkxldmVsVXAAAwAOcm9iYmVyeUNvc3RNaW4AgMLXLwAUcm9iYmVyeUNvb2xkb3duQ29lZmYAkAMADHJlcXVpcmVtZW50cwkAzAgCAghTdHJlbmd0aAkAzAgCAghBY2N1cmFjeQkAzAgCAglJbnRlbGxlY3QJAMwIAgIJRW5kdXJhbmNlCQDMCAICCURleHRlcml0eQkAzAgCAgVMZXZlbAkAzAgCAgZIZWFsdGgFA25pbAAMY2hhclN0cmVuZ3RoAAAADGNoYXJBY2N1cmFjeQABAA1jaGFySW50ZWxsZWN0AAIADWNoYXJFbmR1cmFuY2UAAwANY2hhckRleHRlcml0eQAEAAtzZWdCYWNrcGFjawAAAAtOVU1TRUdNRU5UUwAGAApOVU1NQUlOQVVYAAIACE1BWFNMT1RTAAIADU1BWFBST0RJTlNMT1QAHgAQbGFuZFJvYkNvb2xkb3ducwkAzAgCAAAJAMwIAgDAzyQJAMwIAgCg9zYJAMwIAgCA3MwUCQDMCAIAgK6mCgUDbmlsAA5NSU5fUkVTX1RPX1JPQgCA2sQJAAxyb2JJZHhMb2NrZWQAAQALZHVja0lkeEZyZWUAAAAQZHVja0lkeFByZXBhcmluZwABAQ1rZXlEdWNrSGVhbHRoAQtkdWNrQXNzZXRJZAkArAICAgtkdWNrSGVhbHRoXwULZHVja0Fzc2V0SWQBDGtleUR1Y2tDaGFycwELZHVja0Fzc2V0SWQJAKwCAgIKZHVja0NoYXJzXwULZHVja0Fzc2V0SWQBCWtleUR1Y2tYUAELZHVja0Fzc2V0SWQJAKwCAgIHZHVja1hQXwULZHVja0Fzc2V0SWQBDGtleUR1Y2tMZXZlbAELZHVja0Fzc2V0SWQJAKwCAgIKZHVja0xldmVsXwULZHVja0Fzc2V0SWQBEWtleUR1Y2tGcmVlUG9pbnRzAQtkdWNrQXNzZXRJZAkArAICAg9kdWNrRnJlZVBvaW50c18FC2R1Y2tBc3NldElkARBrZXlEdWNrRXF1aXBtZW50AQtkdWNrQXNzZXRJZAkArAICAg5kdWNrRXF1aXBtZW50XwULZHVja0Fzc2V0SWQBCWtleVVzZXJYUAEEYWRkcgkArAICAgd1c2VyWFBfBQRhZGRyAQxrZXlVc2VyTGV2ZWwBBGFkZHIJAKwCAgIKdXNlckxldmVsXwUEYWRkcgERa2V5VXNlckZyZWVQb2ludHMBBGFkZHIJAKwCAgIPdXNlckZyZWVQb2ludHNfBQRhZGRyAQ5rZXlTYXZlZEhlYWx0aAELZHVja0Fzc2V0SWQJAKwCAgIMc2F2ZWRIZWFsdGhfBQtkdWNrQXNzZXRJZAEQa2V5U2F2ZWRMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgIOc2F2ZWRMb2NhdGlvbl8FC2R1Y2tBc3NldElkAQxrZXlEdWNrQnVmZnMBC2R1Y2tBc3NldElkCQCsAgICCmR1Y2tCdWZmc18FC2R1Y2tBc3NldElkARhrZXlMYXN0Um9iYmVyeVRpbWVCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICEGxhc3RSb2JiZXJ5VGltZV8FC2R1Y2tBc3NldElkARhrZXlMYXN0Um9iYmVyeUNvc3RCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICEGxhc3RSb2JiZXJ5Q29zdF8FC2R1Y2tBc3NldElkARNrZXlMYW5kUm9iYmVyeVN0YXRlAQtsYW5kQXNzZXRJZAkArAICAhFsYW5kUm9iYmVyeVN0YXRlXwULbGFuZEFzc2V0SWQBEmtleUxhbmRDb29sZG93bkVUQQELbGFuZEFzc2V0SWQJAKwCAgIQbGFuZENvb2xkb3duRVRBXwULbGFuZEFzc2V0SWQBE2tleUR1Y2tSb2JiZXJ5U3RhdGUBC2R1Y2tBc3NldElkCQCsAgICEWR1Y2tSb2JiZXJ5U3RhdGVfBQtkdWNrQXNzZXRJZAETa2V5TG9ja2VkTGFuZEJ5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIRbG9ja2VkTGFuZEJ5RHVja18FC2R1Y2tBc3NldElkARZrZXlEZWxpdmVyeURlbGF5QnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAhRkZWxpdmVyeURlbGF5QnlEdWNrXwULZHVja0Fzc2V0SWQBFGtleVVzZXJEZWxpdmVyeUNvdW50AQRhZGRyCQCsAgICEnVzZXJEZWxpdmVyeUNvdW50XwUEYWRkcgEWa2V5VXNlckxhc3REZWxpdmVyeURheQEEYWRkcgkArAICAhR1c2VyTGFzdERlbGl2ZXJ5RGF5XwUEYWRkcgAHeHBDbGFpbQCQTgAPeHBTdWNjZXNzRmxpZ2h0AJBOAAx4cEZhaWxGbGlnaHQA0A8ACHhwQ2FsbEVTAKCNBgAMeHBDdXN0b21OYW1lAMCEPQAKeHBOZXdTTGFuZADAlrECAA54cFVwZ3JhZGVJbmZyYQCQTgAHeHBNZXJnZQDAhD0ACXhwT25ib2FyZADAhD0ABnhwSGVhbACQTgEJbGV2ZWxCeVhQAQJ4cAkAawMFDHhwTGV2ZWxTY2FsZQkAbAYFAnhwAAQFD3hwTGV2ZWxSZWNpcFBvdwAEAAQFBERPV04FBlNDQUxFOAEJbWF4SGVhbHRoAQVsZXZlbAkAZAIAZAUFbGV2ZWwBB2xldmVsVXACCWN1cnJMZXZlbAVuZXdYUAQIbmV3TGV2ZWwJAQlsZXZlbEJ5WFABBQVuZXdYUAkAzAgCBQhuZXdMZXZlbAkAzAgCCQBoAgUSbnVtUG9pbnRzT25MZXZlbFVwCQBlAgUIbmV3TGV2ZWwFCWN1cnJMZXZlbAUDbmlsAQxnZXREdWNrU3RhdHMED3N0YWtpbmdDb250cmFjdAtkdWNrQXNzZXRJZApidWZmRWZmZWN0CmZvcmNlQnVmZnMEBWNoYXJzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5RHVja0NoYXJzAQULZHVja0Fzc2V0SWQCCTBfMF8wXzBfMAIBXwQDbHZsCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkAAAEBmhlYWx0aAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQJAQltYXhIZWFsdGgBBQNsdmwECnN0YXRlQnVmZnMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlEdWNrQnVmZnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wAgFfCQDOCAIJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQxjaGFyU3RyZW5ndGgJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQxjaGFyQWNjdXJhY3kJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFySW50ZWxsZWN0CQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckVuZHVyYW5jZQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDWNoYXJEZXh0ZXJpdHkJAMwIAgUDbHZsCQDMCAIFBmhlYWx0aAUDbmlsAwUKZm9yY2VCdWZmcwkAzAgCBQpidWZmRWZmZWN0CQDMCAIFCmJ1ZmZFZmZlY3QJAMwIAgUKYnVmZkVmZmVjdAkAzAgCBQpidWZmRWZmZWN0CQDMCAIFCmJ1ZmZFZmZlY3QFA25pbAkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKc3RhdGVCdWZmcwUMY2hhclN0cmVuZ3RoCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpzdGF0ZUJ1ZmZzBQxjaGFyQWNjdXJhY3kJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnN0YXRlQnVmZnMFDWNoYXJJbnRlbGxlY3QJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnN0YXRlQnVmZnMFDWNoYXJFbmR1cmFuY2UJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnN0YXRlQnVmZnMFDWNoYXJEZXh0ZXJpdHkFA25pbAEOZ2V0Um9iYmVyeURhdGECD3N0YWtpbmdDb250cmFjdAtkdWNrQXNzZXRJZAQLbGFzdFJvYkNvc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEYa2V5TGFzdFJvYmJlcnlDb3N0QnlEdWNrAQULZHVja0Fzc2V0SWQAAAQLbGFzdFJvYlRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEYa2V5TGFzdFJvYmJlcnlUaW1lQnlEdWNrAQULZHVja0Fzc2V0SWQAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQHcm9iQ29zdAkAlgMBCQDMCAIFDnJvYmJlcnlDb3N0TWluCQDMCAIJAGUCBQtsYXN0Um9iQ29zdAkAaAIFFHJvYmJlcnlDb29sZG93bkNvZWZmCQBlAgUDbm93BQtsYXN0Um9iVGltZQUDbmlsBAlkdWNrU3RhdGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQETa2V5RHVja1JvYmJlcnlTdGF0ZQEFC2R1Y2tBc3NldElkAAAECmxvY2tlZExhbmQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQETa2V5TG9ja2VkTGFuZEJ5RHVjawEFC2R1Y2tBc3NldElkAgAEB2xhbmRFVEEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQESa2V5TGFuZENvb2xkb3duRVRBAQUKbG9ja2VkTGFuZAAACQCXCgUFB3JvYkNvc3QFC2xhc3RSb2JUaW1lBQlkdWNrU3RhdGUFCmxvY2tlZExhbmQFB2xhbmRFVEEACkxBTkRQUkVGSVgCBExBTkQACkRVQ0tQUkVGSVgCBERVQ0sACkFSVFBSRVNBTEUCB1BSRVNBTEUABk5VTVJFUwAGABhNQVhfTEFORFNfU1RBS0VEX0JZX1VTRVIAGQAPREFJTFlSRVNCWVBJRUNFAID40gEADFdITVVMVElQTElFUgCAyK+gJQAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EAEFJFU09VUkNFUFJJQ0VNSU4A1bUCAApFU1NFTExDT0VGAAoAFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQDQhgMAElRFTl9NSU5VVEVTX01JTExJUwDAzyQAF0FMTE9XRURfRlJFRV9ERUxJVkVSSUVTAAEAGkFDUkVTX0ZPUl9ERUxJVkVSWV9BVFRFTVBUAIDh6xcACXByb2RUeXBlcwkAzAgCAhBGaXJzdCBBaWQgS2l0IEwxCQDMCAICEEZpcnN0IEFpZCBLaXQgTDIJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMwkAzAgCAgtCYWNrcGFjayBMMQkAzAgCAgtCYWNrcGFjayBMMgkAzAgCAgtCYWNrcGFjayBMMwkAzAgCAg5Gb29kIFJhdGlvbiBMMQkAzAgCAg5Gb29kIFJhdGlvbiBMMgkAzAgCAg5Gb29kIFJhdGlvbiBMMwkAzAgCAgtKZXQgUGFjayBMMQkAzAgCAgtKZXQgUGFjayBMMgkAzAgCAgtKZXQgUGFjayBMMwkAzAgCAglTaGllbGQgTDEJAMwIAgIJU2hpZWxkIEwyCQDMCAICCVNoaWVsZCBMMwkAzAgCAgdNaW5lIEwxCQDMCAICB01pbmUgTDIJAMwIAgIHTWluZSBMMwkAzAgCAgdUcmFwIEwxCQDMCAICB1RyYXAgTDIJAMwIAgIHVHJhcCBMMwUDbmlsAApjb250aW5lbnRzCQDMCAICCEFtZXJpY2FzCQDMCAICBkV1cm9wZQkAzAgCAgRBc2lhCQDMCAICBkFmcmljYQkAzAgCAgdPY2VhbmlhBQNuaWwACUNPRUZGMk1BVACAreIEABBmb3J0QWxsb3dlZFByb2RzCQDMCAIADwkAzAgCABAJAMwIAgARCQDMCAIAEgkAzAgCABMJAMwIAgAUBQNuaWwAEHByb2R1Y3Rpb25NYXRyaXgJAMwIAgIlOF84XzhfMTdfMTdfNDJfMTJfMF8zMF8wLDAsMCwwLDAsMCwwXwkAzAgCAiU4XzhfOF8xN18xN180Ml8yNF8wXzYwXzAsMCw1LDIsMCwwLDBfCQDMCAICJzhfOF84XzE3XzE3XzQyXzM2XzBfMTIwXzAsMCwxMCw0LDAsMCwwXwkAzAgCAik4XzE5XzE5XzhfMjdfMTlfMjZfMV8yMF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNTJfMV80MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAik4XzE5XzE5XzhfMjdfMTlfNzhfMV84MF8wLDAsMCwwLDAsMCwwXzAwMQkAzAgCAiU4XzhfOF84XzhfNjBfMTNfMl8yXzAsMCwwLDAsMCwwLDBfMDExCQDMCAICJThfOF84XzhfOF82MF8yNl8yXzRfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzM5XzJfOF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfMzBfM18zMF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfNjBfM181MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAikzMF8zMF8zXzE3XzE3XzNfOTBfM183MF8wLDAsMCwwLDAsMCwwXzExMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8xMV80XzEwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzIyXzRfMjBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMzNfNF8zMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAio0XzEzXzIyXzRfMzVfMjJfMjNfMF81MCwxLDBfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNF8xM18yMl80XzM1XzIyXzQ2XzBfNTAsMSwxXzAsMiw1LDAsMCwwLDBfCQDMCAICKzRfMTNfMjJfNF8zNV8yMl82OV8wXzUwLDIsMV8wLDUsMTAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzIwXzFfMzAsMSwxXzAsMCwwLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV80MF8xXzMwLDEsMl8yLDEsMywwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfNjBfMV8zMCwxLDNfNSwyLDgsMCwwLDAsMF8FA25pbAAJcklkeENvZWZmAAYACnJJZHhFZmZlY3QACAAQcklkeFJlcXVpcmVtZW50cwAJAAlySWR4U2xvdHMACgAOUFJPRFVDVFBLR1NJWkUACgALd2hJZHhMZXZlbHMAAAAId2hJZHhSZXMAAQAId2hJZHhNYXQAAgAJd2hJZHhQcm9kAAMACXdoSWR4TE9GVAAEAAl2b2xMb2NrZWQAAAALdm9sT2NjdXBpZWQAAQAHdm9sRnJlZQACAAh2b2xUb3RhbAADAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADAA9sb2NJZHhDb250aW5lbnQAAAAKbG9jSWR4VHlwZQABAAhsb2NJZHhJZAACARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIDbm9fBQdhc3NldElkARprZXlMYW5kQXNzZXRJZFRvQ3VzdG9tTmFtZQEHYXNzZXRJZAkArAICAgVsY25hXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgNzdF8FB2Fzc2V0SWQBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgR0eXBlB2Fzc2V0SWQJALkJAgkAzAgCAgNsYXMJAMwIAgUEdHlwZQkAzAgCBQdhc3NldElkBQNuaWwCAV8BImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDB25mdFR5cGUHYXNzZXRJZAlvd25lckFkZHIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgZzdHRhb18FB25mdFR5cGUCAV8FB2Fzc2V0SWQCAV8FCW93bmVyQWRkcgESa2V5V2FyZWhvdXNlQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAgN3aF8FC2xhbmRBc3NldElkARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQdhc3NldElkCQCsAgICC2luZnJhTGV2ZWxfBQdhc3NldElkARdrZXlGb3J0aWZpY2F0aW9uc0J5TGFuZAELbGFuZEFzc2V0SWQJAKwCAgIPZm9ydGlmaWNhdGlvbnNfBQtsYW5kQXNzZXRJZAEaa2V5RHVja0Fzc2V0SWRUb0N1c3RvbU5hbWUBB2Fzc2V0SWQJAKwCAgIYZHVja0N1c3RvbU5hbWVCeUFzc2V0SWRfBQdhc3NldElkARZrZXlBZGRyZXNzVG9DdXN0b21OYW1lAQRhZGRyCQCsAgICGGFjY291bnRDdXN0b21OYW1lQnlBZGRyXwUEYWRkcgEPa2V5QWRkcmVzc1JlZkJ5AQRhZGRyCQCsAgICCWFjY1JlZkJ5XwUEYWRkcgEca2V5T25ib2FyZEFydEFjdGl2YXRlZE9uRHVjawELZHVja0Fzc2V0SWQJAKwCAgIab25ib2FyZEFydEFjdGl2YXRlZE9uRHVja18FC2R1Y2tBc3NldElkARxrZXlPbmJvYXJkQXJ0RHVja0FjdGl2YXRlZEJ5AQRhZGRyCQCsAgICGm9uYm9hcmRBcnRBY3RpdmF0ZWREdWNrQnlfBQRhZGRyARNrZXlBZGRyZXNzUmVmZXJyYWxzAQRhZGRyCQCsAgICDWFjY1JlZmVycmFsc18FBGFkZHIBEGtleUR1Y2tJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIKZHVja093bmVyXwUHYXNzZXRJZAEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgERa2V5QmFja3BhY2tCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICCWJhY2tQYWNrXwULZHVja0Fzc2V0SWQBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQBFWtleVVzZXJHd2xSZWxlYXNlVGltZQEIdXNlckFkZHIJAKwCAgIaJXMlc19fdXNlckd3bFJlbGVhc2VUaW1lX18FCHVzZXJBZGRyAQ5rZXlFc1dhcmVob3VzZQACGmVtZXJnZW5jeVdhcmVob3VzZVByb2R1Y3RzAA9kZWxpdmVyeUZ1bmRLZXkCDGRlbGl2ZXJ5RnVuZAARZGVsaXZlcnlMb2NrZWRLZXkCDmRlbGl2ZXJ5TG9ja2VkAA1sYXN0VG91cklkS2V5Ag4lc19fbGFzdFRvdXJJZAEVa2V5VG91clN0YXRpY0RhdGFCeUlkAQN0SWQJAKwCAgIWJXMlZF9fdG91clN0YXRpY0RhdGFfXwkApAMBBQN0SWQBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBA3RJZAkArAICAhclcyVkX190b3VyRHluYW1pY0RhdGFfXwkApAMBBQN0SWQBGmtleUJlc3RSZXN1bHRCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAh8lcyVkJXNfX2Jlc3RSZXN1bHRCeVRvdXJBbmREdWNrCQDMCAIJAKQDAQUDdElkCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwCAl9fAAlpZHhTdGF0aWMAAAAKaWR4RHluYW1pYwABAAp0U3RhdGljRW5kAAYADnREeW5hbWljU3RhdHVzAAEBC2dldFRvdXJEYXRhAgx0b3VyQ29udHJhY3QDdElkBAZzdGF0aWMJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEFA3RJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUDdElkAgUgZGF0YQICX18EB2R5bmFtaWMJALwJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQN0SWQJAKwCAgkArAICAhlFcnJvciByZWFkaW5nIHRvdXJuYW1lbnQgCQCkAwEFA3RJZAIFIGRhdGECAl9fCQDMCAIFBnN0YXRpYwkAzAgCBQdkeW5hbWljBQNuaWwBDmlzSW5Ub3VybmFtZW50Agx0b3VyQ29udHJhY3QIbG9jYXRpb24EBmxhc3RJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQx0b3VyQ29udHJhY3QFDWxhc3RUb3VySWRLZXkAAAQDbG9jCQC1CQIFCGxvY2F0aW9uAgFfBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUMdG91ckNvbnRyYWN0BQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljAwMDCQAAAgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAVQJAAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQ9sb2NJZHhDb250aW5lbnQFBmxhc3RJZAcJAAACCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzAgpJTlBST0dSRVNTBwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFCnRTdGF0aWNFbmQFA25vdwcBDGlzSW5EZWxpdmVyeQEIbG9jYXRpb24EA2xvYwkAtQkCBQhsb2NhdGlvbgIBXwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJc3RhcnRUaW1lCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQ9sb2NJZHhDb250aW5lbnQECGRpc3RhbmNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQhsb2NJZHhJZAMDCQAAAgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUQJAGYCCQBkAgUJc3RhcnRUaW1lBRJURU5fTUlOVVRFU19NSUxMSVMFA25vdwcJAGcCAAMFCGRpc3RhbmNlBwEPaXNVc3VhbExvY2F0aW9uAQhsb2NhdGlvbgQHbG9jVHlwZQkAkQMCCQC1CQIFCGxvY2F0aW9uAgFfBQpsb2NJZHhUeXBlAwkBAiE9AgUHbG9jVHlwZQIBVAkBAiE9AgUHbG9jVHlwZQIBRAcBCW9uTWlzc2lvbgIMdG91ckNvbnRyYWN0CGxvY2F0aW9uBAZsYXN0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMdG91ckNvbnRyYWN0BQ1sYXN0VG91cklkS2V5AAAEA2xvYwkAtQkCBQhsb2NhdGlvbgIBXwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFDHRvdXJDb250cmFjdAUGbGFzdElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQHbG9jVHlwZQkAkQMCBQNsb2MFCmxvY0lkeFR5cGUDCQAAAgUHbG9jVHlwZQIBRAYDAwMJAAACCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBVAkAAAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNsb2MFD2xvY0lkeENvbnRpbmVudAUGbGFzdElkBwkAAAIJAJEDAgUHZHluYW1pYwUOdER5bmFtaWNTdGF0dXMCCklOUFJPR1JFU1MHCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAUDbm93BwESZ2V0UmVjaXBlTWF0ZXJpYWxzAQZyZWNpcGUJAGgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBQlySWR4Q29lZmYFCUNPRUZGMk1BVAEMY2hlYXRBdHRlbXB0AwZvbGRMb2MGbmV3TG9jCWNoZWF0Q2FzZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhZDaGVhdCBhdHRlbXB0OiBvbGRMb2M9BQZvbGRMb2MCCSwgbmV3TG9jPQUGbmV3TG9jAgcsIGNhc2U9CQCkAwEFCWNoZWF0Q2FzZQAWS1NfU0VQQVJBVEVfUFVCTElDX0tFWQcAGEtTX0FMTE9XX0JJR19JTkZSQV9NRVJHRQcACkRBWV9NSUxMSVMAgLiZKQAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAC3VzZHRBc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQMJAAACAQFUBQckbWF0Y2gwASBVsdifcoeC7+XjW42sBatl3ppDoS8WuwXzGreHpfHFGAkAAgECDVVua25vd24gY2hhaW4AFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BRQ3V2RmJ2aDRMa1BVbnJuVTF6M2puYkExcDltM1dOaHYDCQAAAgEBVAUHJG1hdGNoMAIjM011bWtHR3p0Q0tBWHBXRHF4a2Rkb2ZxWFNVYnFRa3ZTSnkJAAIBAg1Vbmtub3duIGNoYWluABFJbmZyYVVwZ3JhZGVDb3N0UwQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMACAyK+gJQMJAAACAQFUBQckbWF0Y2gwAIDC1y8JAAIBAg1Vbmtub3duIGNoYWluAA5hcmJpdHJhZ2VEZWxheQQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAUKREFZX01JTExJUwMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AE0RFTElWRVJZX1BVTklTSE1FTlQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAgJeTBQMJAAACAQFUBQckbWF0Y2gwAKD3NgkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAFU1NJWkUAGQAFTVNJWkUAZAAFTFNJWkUA4QEABlhMU0laRQCQAwAHWFhMU0laRQDxBAAFSVRFUjYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEAEUlkeENmZ0Vjb25vbXlEYXBwAAIAFElkeENmZ0dvdmVybmFuY2VEYXBwAAMADUlkeENmZ1dsZ0RhcHAABAAUSWR4Q2ZnVG91cm5hbWVudERhcHAABwAPSWR4Q2ZnQWNyZXNEYXBwAAgBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHAAD2Vjb25vbXlDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ0Vjb25vbXlEYXBwAAtnb3ZDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ0dvdmVybmFuY2VEYXBwAAt3bGdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFDUlkeENmZ1dsZ0RhcHAAEnRvdXJuYW1lbnRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ1RvdXJuYW1lbnREYXBwAA1hY3Jlc0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUPSWR4Q2ZnQWNyZXNEYXBwAApyZWNMYW5kTnVtAAAAC3JlY0xhbmRTaXplAAEAC3JlY1RlcnJhaW5zAAIADHJlY0NvbnRpbmVudAADAA13bGdBc3NldElkS2V5Agt3bGdfYXNzZXRJZAAKd2xnQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFC3dsZ0NvbnRyYWN0BQ13bGdBc3NldElkS2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQAD2FjcmVzQXNzZXRJZEtleQIMYWNyZXNBc3NldElkAAxhY3Jlc0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQ1hY3Jlc0NvbnRyYWN0BQ9hY3Jlc0Fzc2V0SWRLZXkCF0FDUkVTIGlzIG5vdCBpc3N1ZWQgeWV0AAtyYW5kb21EZWxheQACAQlrZXlDb21taXQBB2FkZHJlc3MJAKwCAgITZmluaXNoQmxvY2tGb3JBZGRyXwUHYWRkcmVzcwERa2V5UmVzUHJvcG9ydGlvbnMAAhNyZXNUeXBlc1Byb3BvcnRpb25zARZrZXlSZXNUeXBlc0J5Q29udGluZW50AQljb250aW5lbnQJAKwCAgIUcmVzVHlwZXNCeUNvbnRpbmVudF8FCWNvbnRpbmVudAEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQlvd25lckFkZHIJAKwCAgIUc3Rha2VkUGllY2VzQnlPd25lcl8FCW93bmVyQWRkcgEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCWFzQW55TGlzdAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAglMaXN0W0FueV0EAWwFByRtYXRjaDAFAWwJAAIBAhtmYWlsIHRvIGNhc3QgaW50byBMaXN0W0FueV0BCWFzQm9vbGVhbgEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFzBQckbWF0Y2gwBQFzCQACAQIZZmFpbCB0byBjYXN0IGludG8gQm9vbGVhbgEPbnVtUGllY2VzQnlTaXplAQhsYW5kU2l6ZQQHJG1hdGNoMAUIbGFuZFNpemUDCQAAAgIBUwUHJG1hdGNoMAUFU1NJWkUDCQAAAgIBTQUHJG1hdGNoMAUFTVNJWkUDCQAAAgIBTAUHJG1hdGNoMAUFTFNJWkUDCQAAAgICWEwFByRtYXRjaDAFBlhMU0laRQMJAAACAgNYWEwFByRtYXRjaDAFB1hYTFNJWkUJAAIBAhFVbmtub3duIGxhbmQgc2l6ZQEHaXNEaWdpdAEBcwkBCWlzRGVmaW5lZAEJALYJAQUBcwEKa2V5QmxvY2tlZAACEGNvbnRyYWN0c0Jsb2NrZWQBEWtleUxhc3RUeElkQnlVc2VyAQRhZGRyCQCs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ZFRvQXNzZXRJZAEHbGFuZE51bQkArAICAgNsYV8FB2xhbmROdW0BHmtleUluZnJhTGV2ZWxCeUFzc2V0SWRBbmRPd25lcgIHYXNzZXRJZAlvd25lckFkZHIJAKwCAgkArAICCQCsAgICBWlsYW9fBQdhc3NldElkAgFfBQlvd25lckFkZHIBEWtleUxhbmROdW1Ub093bmVyAQdsYW5kTnVtCQCsAgICA2xvXwUHbGFuZE51bQEaa2V5RHVja0N1c3RvbU5hbWVUb0Fzc2V0SWQBBG5hbWUJAKwCAgIRZHVja0J5Q3VzdG9tTmFtZV8FBG5hbWUBFmtleUN1c3RvbU5hbWVUb0FkZHJlc3MBBG5hbWUJAKwCAgIUYWNjb3VudEJ5Q3VzdG9tTmFtZV8FBG5hbWUBCWtleU9sZGllcwACCm9sZGllc0xpc3QAC2NsYWltTW9kZVdoAAAADWNsYWltTW9kZUR1Y2sAAQATY2xhaW1Nb2RlV2hUaGVuRHVjawACAAhmbEhlYWx0aAAAAAtmbFRpbWVzdGFtcAAFAAdmbEJvbnVzAAYAC2ZsUHJvZHNVc2VkAAcBB25mdE5hbWUCB2xhbmROdW0IbGFuZFNpemUJAKwCAgkArAICBQpMQU5EUFJFRklYBQdsYW5kTnVtBQhsYW5kU2l6ZQEIdG9Wb2x1bWUCBmFtb3VudAdwa2dTaXplBARwa2dzAwkAZwIFBmFtb3VudAAACQBpAgkAZQIJAGQCBQZhbW91bnQFB3BrZ1NpemUAAQUHcGtnU2l6ZQkBAS0BCQBpAgkAZQIJAGQCCQEBLQEFBmFtb3VudAUHcGtnU2l6ZQABBQdwa2dTaXplCQBoAgUEcGtncwUFTVVMVDgBE2Rpc3RyaWJ1dGVCeVdlaWdodHMCBXRvdGFsB3dlaWdodHMEA3N1bQkAZAIJAGQCCQBkAgkAZAIJAGQCCQCRAwIFB3dlaWdodHMAAAkAkQMCBQd3ZWlnaHRzAAEJAJEDAgUHd2VpZ2h0cwACCQCRAwIFB3dlaWdodHMAAwkAkQMCBQd3ZWlnaHRzAAQJAJEDAgUHd2VpZ2h0cwAFAwkAZwIAAAUDc3VtCQACAQIQWmVybyB3ZWlnaHRzIHN1bQQFbm9ybTYJAGsDBQV0b3RhbAUFTVVMVDYFA3N1bQoBCm5vcm1hbGl6ZXICA2FjYwRlbGVtCQDNCAIFA2FjYwkAawMFBGVsZW0FBW5vcm02BQVNVUxUNgoAAiRsBQd3ZWlnaHRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpub3JtYWxpemVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGARJnZXROZWVkZWRNYXRlcmlhbHMBBXRvdGFsBAVwcm9wcwkAtQkCCQEFdmFsdWUBCQCiCAEJARFrZXlSZXNQcm9wb3J0aW9ucwACAV8DCQECIT0CCQCQAwEFBXByb3BzBQZOVU1SRVMJAAIBAhZXcm9uZyBwcm9wb3J0aW9ucyBkYXRhBAFyCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwAACQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwABCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwACCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwADCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwAECQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwAFBQNuaWwJARNkaXN0cmlidXRlQnlXZWlnaHRzAgUFdG90YWwFAXIBEXN1YnRyYWN0TWF0ZXJpYWxzAwxzaG91bGRVc2VNYXQDaGFzCXRvdGFsTmVlZAQEbmVlZAkBEmdldE5lZWRlZE1hdGVyaWFscwEFCXRvdGFsTmVlZAoBCnN1YnRyYWN0b3ICA2FjYwNpZHgEBnJlc3VsdAkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNoYXMFA2lkeAkAkQMCBQRuZWVkBQNpZHgDCQBmAgAABQZyZXN1bHQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIYTm90IGVub3VnaCBt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BGZyZWUEBGhlYWQJAMkBAgUFcExpc3QJAGgCAAgFCnByb2R1Y3RJZHgEBGN1cnIJALEJAQkAyQECCQDKAQIFBXBMaXN0CQBoAgAIBQpwcm9kdWN0SWR4AAgEBHRhaWwJAMoBAgUFcExpc3QJAGgCAAgJAGQCBQpwcm9kdWN0SWR4AAEEBnJlY2lwZQkAtQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgCAV8DAwkBASEBBQppc1Bvc2l0aXZlCQBmAgUFY291bnQFBGN1cnIHCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkApAMBBQRjdXJyAgQgb2YgCQCRAwIFCXByb2RUeXBlcwUKcHJvZHVjdElkeAITLCBidXQgdHJpZWQgdG8gdXNlIAkApAMBBQVjb3VudAQGbmV3QW10AwMJAQEhAQUKaXNQb3NpdGl2ZQkBFWNoZWNrU3RhdFJlcXVpcmVtZW50cwIFCWR1Y2tTdGF0cwkAtQkCCQCRAwIFBnJlY2lwZQUQcklkeFJlcXVpcmVtZW50cwIBLAcJAGUCBQRjdXJyBQVjb3VudAkAZAIFBGN1cnIFBWNvdW50BAhkZWx0YVZvbAkAZQIJAQh0b1ZvbHVtZQIFBm5ld0FtdAUOUFJPRFVDVFBLR1NJWkUJAQh0b1ZvbHVtZQIFBGN1cnIFDlBST0RVQ1RQS0dTSVpFCQCVCgMJAMsBAgkAywECBQRoZWFkCQCaAwEFBm5ld0FtdAUEdGFpbAkAZAIFCG9jY3VwaWVkBQhkZWx0YVZvbAkAZQIFBGZyZWUFCGRlbHRhVm9sAQhhZGRQcm9kQgcGaWR4Q250BXBMaXN0CmlzUG9zaXRpdmUHc2VnbWVudAdtYWluQXV4BHNsb3QJZHVja1N0YXRzBAVwYXJ0cwkAtQkCBQZpZHhDbnQCAToDCQECIT0CCQCQAwEFBXBhcnRzAAIJAAIBAihJbmNvcnJlY3QgZm9ybWF0LCBzaG91bGQgYmUgaW5kZXg6YW1vdW50AwMJAQEhAQUKaXNQb3NpdGl2ZQkBAiE9AgkAsQIBCQCRAwIFBXBhcnRzAAAAAgcJAAIBAitQcm9kdWN0IGlkeCBzaG91bGQgYmUgMiBkaWdpdHMsIHplcm8gcGFkZGVkBApwcm9kdWN0SWR4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAAQFY291bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwYXJ0cwABAwMJAGYCAAAFCnByb2R1Y3RJZHgGCQBnAgUKcHJvZHVjdElkeAkAkAMBBRBwcm9kdWN0aW9uTWF0cml4CQACAQITVW5rbm93biBwcm9kdWN0IGlkeAMJAGYCAAAFBWNvdW50CQACAQIXQ291bnQgY2FuJ3QgYmUgbmVnYXRpdmUDCQBmAgUFY291bnQFDU1BWFBST0RJTlNMT1QJAAIBCQCsAgIJAKwCAgkArAICAhRDYW4ndCBwdXQgbW9yZSB0aGFuIAkApAMBBQ1NQVhQUk9ESU5TTE9UAgQgb2YgCQCRAwIFCXByb2RUeXBlcwUKcHJvZHVjdElkeAMJAAACBQVjb3VudAAACQCUCgIFBXBMaXN0BwQEaGVhZAkAyQECBQVwTGlzdAkAaAIACAUKcHJvZHVjdElkeAQEY3VycgkAsQkBCQDJAQIJAMoBAgUFcExpc3QJAGgCAAgFCnByb2R1Y3RJZHgACAQEdGFpbAkAygECBQVwTGlzdAkAaAIACAkAZAIFCnByb2R1Y3RJZHgAAQQGcmVjaXBlCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUKcHJvZHVjdElkeAIBXwMDCQEBIQEFCmlzUG9zaXRpdmUJAGYCBQVjb3VudAUEY3VycgcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCkAwEFBGN1cnICBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQpwcm9kdWN0SWR4AhMsIGJ1dCB0cmllZCB0byB1c2UgCQCkAwEFBWNvdW50BAlpc0JpZ0l0ZW0DAwkBASEBBQppc1Bvc2l0aXZlCQEVY2hlY2tTdGF0UmVxdWlyZW1lbnRzAgUJZHVja1N0YXRzCQC1CQIJAJEDAgUGcmVjaXBlBRBySWR4UmVxdWlyZW1lbnRzAgEsBwQGY29tcGF0CQCRAwIFBnJlY2lwZQUJcklkeFNsb3RzAwkAAAIFBmNvbXBhdAIACQACAQIXSXRlbSBjYW5ub3QgYmUgZXF1aXBwZWQEAWMJAQ1wYXJzZUludFZhbHVlAQUGY29tcGF0BARjU2VnCQBpAgUBYwBkAwkBAiE9AgUHc2VnbWVudAUEY1NlZwkAAgECFFNlZ21lbnQgaW5jb21wYXRpYmxlBAhjTWFpbkF1eAkAaQIJAGoCBQFjAGQACgMJAQIhPQIFB21haW5BdXgFCGNNYWluQXV4CQACAQIRU2xvdCBpbmNvbXBhdGlibGUECWNOdW1TbG90cwkAagIFAWMACgMDCQECIT0CBQRzbG90AAAJAGYCBQljTnVtU2xvdHMAAQcJAAIBAh5CaWcgaXRlbXMgc2hvdWxkIG9jY3VweSBzbG90IDAJAGYCBQljTnVtU2xvdHMAAQcJAJQKAgkAywECCQDLAQIFBGhlYWQJAJoDAQkAZAIFBGN1cnIDBQppc1Bvc2l0aXZlBQVjb3VudAkBAS0BBQVjb3VudAUEdGFpbAUJaXNCaWdJdGVtAQtzbG90c0dyb3VwQgYBZwRicEluCmlzUG9zaXRpdmUHc2VnbWVudAdtYWluQXV4BXN0YXRzAwkBAiE9AgUBZwIABAVzbG90cwkAtQkCBQFnAgEsAwkAZgIJAJADAQUFc2xvdHMFCE1BWFNMT1RTCQACAQISV3Jvbmcgc2xvdHMgZm9ybWF0BAJzMAkAkQMCBQVzbG90cwAABAJzMQMJAGYCCQCQAwEFBXNsb3RzAAEJAJEDAgUFc2xvdHMAAQIAAwMJAAACBQJzMAIACQAAAgUCczECAAcFBGJwSW4EBXRtcFMwAwkBAiE9AgUCczACAAkBCGFkZFByb2RCBwUCczAFBGJwSW4FCmlzUG9zaXRpdmUFB3NlZ21lbnQFB21haW5BdXgAAAUFc3RhdHMJAJQKAgUEYnBJbgcDCQECIT0CBQJzMQIAAwgFBXRtcFMwAl8yCQACAQIeQmlnIGl0ZW0gYWxyZWFkeSBvY2N1cGllcyBzbG90CAkBCGFkZFByb2RCBwUCczEIBQV0bXBTMAJfMQUKaXNQb3NpdGl2ZQUHc2VnbWVudAUHbWFpbkF1eAABBQVzdGF0cwJfMQgFBXRtcFMwAl8xBQRicEluAQZkcmVzc0IEB3NlZ0xpc3QGcEJ5dGVzCmlzUG9zaXRpdmUFc3RhdHMKAQdzZWdtZW50AgNhY2MDc2VnBAFqCAUDYWNjAl8xBAdtYWluQXV4CQC1CQIFA3NlZwIBOwMJAQIhPQIJAJADAQUHbWFpbkF1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BmN1cnJFcQUJdGVtcFByb2RCBwUFc3RhdHMJAAACBQhuZXdQcm9kQgUIbmV3UHJvZEIBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwECHByb3BMaXN0DXRlcnJhaW5Db3VudHMNbGFuZFNpemVJbmRleARzaWduAwkBAiE9AgkAkAMBBQhwcm9wTGlzdAUGTlVNUkVTCQACAQIWV3JvbmcgcHJvcG9ydGlvbnMgZGF0YQoBB3VwZGF0ZXICA2FjYwFpBAZyZXN1bHQJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvcExpc3QFAWkJAGgCCQBoAgUEc2lnbgkAkQMCBQ10ZXJyYWluQ291bnRzBQFpBQ1sYW5kU2l6ZUluZGV4AwkAZgIAAAUGcmVzdWx0CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhZQYW5pYyEgUGllY2VzIG9mIHR5cGU9CQCkAwEFAWkCBywgc2lnbj0JAKQDAQUEc2lnbgITLCB0ZXJyYWluQ291bnRzW2ldPQkApAMBCQCRAwIFDXRlcnJhaW5Db3VudHMFAWkCECwgbGFuZFNpemVJbmRleD0JAKQDAQUNbGFuZFNpemVJbmRleAkAzQgCBQNhY2MJAKQDAQUGcmVzdWx0CgACJGwFBUlURVI2CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQd1cGRhdGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGARF1cGRhdGVQcm9wb3J0aW9ucwMNdGVycmFpbkNvdW50cw1sYW5kU2l6ZUluZGV4BHNpZ24ECHByb3BMaXN0CQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBEWtleVJlc1Byb3BvcnRpb25zAAILMF8wXzBfMF8wXzACAV8JALkJAgkBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwEBQhwcm9wTGlzdAUNdGVycmFpbkNvdW50cwUNbGFuZFNpemVJbmRleAUEc2lnbgIBXwENY291bnRUZXJyYWlucwEIdGVycmFpbnMJAMwIAgkAZQIJAJADAQkAtQkCBQh0ZXJyYWlucwIBQQABCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUIAAQkAzAgCCQBlAgkAkAMBCQC1CQIFCHRlcnJhaW5zAgFDAAEJAMwIAgkAZQIJAJADAQkAtQkCBQh0ZXJyYWlucwIBRAABCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUUAAQkAzAgCCQBlAgkAkAMBCQC1CQIFCHRlcnJhaW5zAgFGAAEFA25pbAEGYWRkUmVzBQpjdXJyZW50UmVzDXRlcnJhaW5Db3VudHMJZGVsdGFUaW1lDWxhbmRTaXplSW5kZXgXZGFpbHlCeVBpZWNlV2l0aEJvbnVzZXMKAQVhZGRlcgIDYWNjAWkECXJlc09mVHlwZQkAaAIJAGgCCQBrAwUJZGVsdGFUaW1lBRdkYWlseUJ5UGllY2VXaXRoQm9udXNlcwUJREFZTUlMTElTCQCRAwIFDXRlcnJhaW5Db3VudHMFAWkFDWxhbmRTaXplSW5kZXgJAM0IAgUDYWNjCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKY3VycmVudFJlcwUBaQUJcmVzT2ZUeXBlBAFyCgACJGwFBUlURVI2CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAuQkCBQFyAgFfAQl2aXJ0Q2xhaW0EDXRlcnJhaW5Db3VudHMJZGVsdGFUaW1lDWxhbmRTaXplSW5kZXgXZGFpbHlCeVBpZWNlV2l0aEJvbnVzZXMKAQVhZGRlcgID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CAIABQkAzAgCAAgJAMwIAgANCQDMCAIADgkAzAgCAA8FA25pbAkAzAgCCQDMCAIAAQkAzAgCAAQJAMwIAgAJCQDMCAIACgkAzAgCAA8FA25pbAkAzAgCCQDMCAIAAQkAzAgCAAYJAMwIAgAHCQDMCAIADwkAzAgCABMFA25pbAkAzAgCCQDMCAIABAkAzAgCAAcJAMwIAgAICQDMCAIADQkAzAgCABIFA25pbAUDbmlsAQdnZW5DaGFyAgFuBWZyZXFzBANyZW0JAKADAQkAuwICBQFuBQdUV0VOVFlYBAZsZXR0ZXIDCQBmAgkAkQMCBQVmcmVxcwAABQNyZW0CAUEDCQBmAgkAkQMCBQVmcmVxcwABBQNyZW0CAUIDCQBmAgkAkQMCBQVmcmVxcwACBQNyZW0CAUMDCQBmAgkAkQMCBQVmcmVxcwADBQNyZW0CAUQDCQBmAgkAkQMCBQVmcmVxcwAEBQNyZW0CAUUCAUYFBmxldHRlcgELZ2VuVGVycmFpbnMCBHNlZWQMY29udGluZW50SWR4BAFmCQCRAwIFBGZyZXEFDGNvbnRpbmVudElkeAoBEHRlcnJhaW5HZW5lcmF0b3ICA2FjYwRlbGVtCQCUCgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCAUDYWNjAl8xCQEHZ2VuQ2hhcgIIBQNhY2MCXzIFAWYJAQdnZW5DaGFyAgkAugICCAUDYWNjAl8yBQdUV0VOVFlYBQFmCQEHZ2VuQ2hhcgIJALoCAggFA2FjYwJfMgUIVFdFTlRZMlgFAWYJAQdnZW5DaGFyAgkAugICCAUDYWNjAl8yBQhUV0VOVFkzWAUBZgkBB2dlbkNoYXICCQC6AgIIBQNhY2MCXzIFCFRXRU5UWTRYBQFmCQC6AgIIBQNhY2MCXzIFCFRXRU5UWTVYBAF0CgACJGwJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAgAJALoCAgUEc2VlZAUFRklWRVgKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEHRlcnJhaW5HZW5lcmF0b3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkA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bAEFAndoBAZ3aExvZnQDCQBmAgAFCQCQAwEFAndoCQC5CQIJAMwIAgIBMAkAzAgCCQCkAwEFCndoT2NjdXBpZWQJAMwIAgkApAMBCQBlAgUHd2hUb3RhbAUKd2hPY2N1cGllZAkAzAgCCQCkAwEFB3doVG90YWwFA25pbAIBXwQEbG9mdAkAtQkCCQCRAwIFAndoBQl3aElkeExPRlQCAV8ECHdoTG9ja2VkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUJdm9sTG9ja2VkBANvY2MDCQBmAgkAkAMBBQRsb2Z0AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQt2b2xPY2N1cGllZAUKd2hPY2N1cGllZAkAuQkCCQDMCAIJAKQDAQUId2hMb2NrZWQJAMwIAgkApAMBBQNvY2MJAMwIAgkApAMBCQBlAgkAZQIFB3doVG90YWwFCHdoTG9ja2VkBQNvY2MJAMwIAgkApAMBBQd3aFRvdGFsBQNuaWwCAV8JAMwIAgkAkQMCBQJ3aAULd2hJZHhMZXZlbHMJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQJ3aAUId2hJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQJ3aAUId2hJZHhSZXMCCzBfMF8wXzBfMF8wCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUCd2gFCHdoSWR4TWF0AgFfBQZOVU1SRVMJAJEDAgUCd2gFCHdoSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAndoBQl3aElkeFByb2QJAMwIAgUGd2hMb2Z0BQNuaWwBFWdldFdhcmVob3VzZVNwYWNlTGVmdAEJY3VycmVudFdoBAtvY2N1cGllZFZvbAkBF2dldFdhcmVob3VzZU9jY3VwaWVkVm9sAQUJY3VycmVudFdoBA9jdXJyV2hMb2NrZWRWb2wJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQCAV8FCXZvbExvY2tlZAkAZQIJAGUCCQEXZ2V0V2FyZWhvdXNlVG90YWxWb2x1bWUBCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMFC29jY3VwaWVkVm9sBQ9jdXJyV2hMb2NrZWRWb2wBCW1vdmVTdHVmZgMKY2FyZ29QYXJ0cwljdXJyZW50V2gLY3VycmVudFBhY2sDCQECIT0CCQCQAwEFCmNhcmdvUGFydHMAAwkAAgECNGNhcmdvTGlzdFN0ciBzaG91bGQgY29udGFpbiBleGFjdGx5IDIgJzonIHNlcGFyYXRvcnMECHJlc1BhcnRzCQC1CQIJAJEDAgUKY2FyZ29QYXJ0cwAAAgFfBAhtYXRQYXJ0cwkAtQkCCQCRAwIFCmNhcmdvUGFydHMAAQIBXwQJcHJvZFBhcnRzAwkAAAIJAJEDAgUKY2FyZ29QYXJ0cwACAgAFA25pbAkAvAkCCQCRAwIFCmNhcmdvUGFydHMAAgIBXwMJAQIhPQIJAJADAQUIcmVzUGFydHMFBk5VTVJFUwkAAgECIEFsbCA2IHJlc291cmNlcyBzaG91bGQgYmUgcGFzc2VkAwkBAiE9AgkAkAMBBQhtYXRQYXJ0cwUGTlVNUkVTCQACAQIgQWxsIDYgbWF0ZXJpYWxzIHNob3VsZCBiZSBwYXNzZWQEC3doU3BhY2VMZWZ0CQEVZ2V0V2FyZWhvdXNlU3BhY2VMZWZ0AQUJY3VycmVudFdoBAljdXJyV2hSZXMJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAljdXJyV2hNYXQJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBApjdXJyV2hQcm9kAwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8EDmN1cnJlbnRQYWNrUmVzCQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBA5jdXJyZW50UGFja01hdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQPY3VycmVudFBhY2tQcm9kAwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfCgEDbXZSAgNhY2MEaXRlbQQBaQgFA2FjYwJfMQQCYW0JAQ1wYXJzZUludFZhbHVlAQUEaXRlbQQDd2hyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJY3VycldoUmVzBQFpBANicHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5jdXJyZW50UGFja1JlcwUBaQMJAAACBQJhbQAACQCWCgQJAGQCBQFpAAEJAM0IAggFA2FjYwJfMgkAkQMCBQljdXJyV2hSZXMFAWkJAM0IAggFA2FjYwJfMwkAkQMCBQ5jdXJyZW50UGFja1JlcwUBaQgFA2FjYwJfNAMJAGYCBQJhbQAAAwkAZgIFAmFtBQNicHIJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAFBGl0ZW0CGSBmcm9tIGJhY2twYWNrLCBidXQgb25seSAJAKQDAQUDYnByAgogYXZhaWxhYmxlCQCWCgQJAGQCBQFpAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUDd2hyBQJhbQkAzQgCCAUDYWNjAl8zCQCkAwEJAGUCBQNicHIFAmFtCQBkAggFA2FjYwJfNAUCYW0DCQBmAgkBAS0BBQJhbQUDd2hyCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHRha2UgCQCkAwEJAQEtAQUCYW0CGiBmcm9tIHdhcmVob3VzZSwgYnV0IG9ubHkgCQCkAwEFA3docgIKIGF2YWlsYWJsZQkAlgoECQBkAgUBaQABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIFA3docgUCYW0JAM0IAggFA2FjYwJfMwkApAMBCQBlAgUDYnByBQJhbQkAZAIIBQNhY2MCXzQFAmFtBAFyCgACJGwFCHJlc1BhcnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA212UgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgoBA212TQIDYWNjBGl0ZW0EAWkIBQNhY2MCXzEEAmFtCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0EA3dobQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWN1cnJXaE1hdAUBaQQDYnBtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOY3VycmVudFBhY2tNYXQFAWkDCQAAAgUCYW0AAAkAlgoECQBkAgUBaQABCQDNCAIIBQNhY2MCXzIJAJEDAgUJY3VycldoTWF0BQFpCQDNCAIIBQNhY2MCXzMJAJEDAgUOY3VycmVudFBhY2tNYXQFAWkIBQNhY2MCXzQDCQBmAgUCYW0AAAMJAGYCBQJhbQUDYnBtCQACAQkArAICCQCsAgIJAKwCAgkArAICAhBBdHRlbXB0IHRvIHRha2UgBQRpdGVtAhkgZnJvbSBiYWNrcGFjaywgYnV0IG9ubHkgCQCkAwEFA2JwbQIKIGF2YWlsYWJsZQkAlgoECQBkAgUBaQABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIFA3dobQUCYW0JAM0IAggFA2FjYwJfMwkApAMBCQBlAgUDYnBtBQJhbQkAZAIIBQNhY2MCXzQFAmFtAwkAZgIJAQEtAQUCYW0FA3dobQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBCQEBLQEFAmFtAhogZnJvbSB3YXJlaG91c2UsIGJ1dCBvbmx5IAkApAMBBQN3aG0CCiBhdmFpbGFibGUJAJYKBAkAZAIFAWkAAQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCBQN3aG0FAmFtCQDNCAIIBQNhY2MCXzMJAKQDAQkAZQIFA2JwbQUCYW0JAGQCCAUDYWNjAl80BQJhbQQBbQoAAiRsBQhtYXRQYXJ0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAABQNuaWwFA25pbAgFAXICXzQKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA212TQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgoBA212UAIDYWNjBGl0ZW0EAWkIBQNhY2MCXzEEAmFtCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0EA3docAMJAGYCCQCQAwEFCmN1cnJXaFByb2QFAWkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpjdXJyV2hQcm9kBQFpAAAEA2JwcAMJAGYCCQCQAwEFD2N1cnJlbnRQYWNrUHJvZAUBaQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFD2N1cnJlbnRQYWNrUHJvZAUBaQAAAwkAAAIFAmFtAAAJAJYKBAkAZAIFAWkAAQkAzQgCCAUDYWNjAl8yCQCkAwEFA3docAkAzQgCCAUDYWNjAl8zCQCkAwEFA2JwcAgFA2FjYwJfNAMJAGYCBQJhbQAAAwkAZgIFAmFtBQNicHAJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAFBGl0ZW0CGSBmcm9tIGJhY2twYWNrLCBidXQgb25seSAJAKQDAQUDYnBwAgogYXZhaWxhYmxlBAhkZWx0YVZvbAkAZQIJAQh0b1ZvbHVtZQIJAGQCBQN3aHAFAmFtBQ5QUk9EVUNUUEtHU0laRQkBCHRvVm9sdW1lAgUDd2hwBQ5QUk9EVUNUUEtHU0laRQkAlgoECQBkAgUBaQABCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIFA3docAUCYW0JAM0IAggFA2FjYwJfMwkApAMBCQBlAgUDYnBwBQJhbQkAZAIIBQNhY2MCXzQFCGRlbHRhVm9sAwkAZgIJAQEtAQUCYW0FA3docAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIQQXR0ZW1wdCB0byB0YWtlIAkApAMBCQEBLQEFAmFtAhogZnJvbSB3YXJlaG91c2UsIGJ1dCBvbmx5IAkApAMBBQN3aHACCiBhdmFpbGFibGUECGRlbHRhVm9sCQBlAgkBCHRvVm9sdW1lAgkAZAIFA3docAUCYW0FDlBST0RVQ1RQS0dTSVpFCQEIdG9Wb2x1bWUCBQN3aHAFDlBST0RVQ1RQS0dTSVpFCQCWCgQJAGQCBQFpAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUDd2hwBQJhbQkAzQgCCAUDYWNjAl8zCQCkAwEJAGUCBQNicHAFAmFtCQBkAggFA2FjYwJfNAUIZGVsdGFWb2wEAXADCQECIT0CCQCQAwEFCXByb2RQYXJ0cwAACgACJGwFCXByb2RQYXJ0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAABQNuaWwFA25pbAgFAW0CXzQKAQUkZjJfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA212UAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMl8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjJfMgIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIJAQUkZjJfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyCQCWCgQAAAUKY3VycldoUHJvZAUPY3VycmVudFBhY2tQcm9kCAUBbQJfNAQIdm9sU2FsZG8IBQFwAl80AwkAZgIFCHZvbFNhbGRvBQt3aFNwYWNlTGVmdAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIVQXR0ZW1wdCB0byBwdXQgdG90YWwgCQCkAwEFCHZvbFNhbGRvAhEgc3R1ZmYsIGJ1dCBvbmx5IAkApAMBBQt3aFNwYWNlTGVmdAIVIHdhcmVob3VzZSBzcGFjZSBsZWZ0CQCZCgcJALkJAggFAXICXzICAV8JALkJAggFAW0CXzICAV8JALoJAggFAXACXzICAV8JALkJAggFAXICXzMCAV8JALkJAggFAW0CXzMCAV8JALoJAggFAXACXzMCAV8FCHZvbFNhbGRvARJleHBlZGl0aW9uSW50ZXJuYWwCBmNhbGxlcgR0eElkBAh1c2VyQWRkcgkApQgBBQZjYWxsZXIEBmJpZ051bQkBA2FicwEJAJ4DAQUEdHhJZAQHZnJlZU51bQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5TmV4dEZyZWVMYW5kTnVtAAkAZAIFD1BSRVNBTEVOVU1MQU5EUwABBAdsYW5kTnVtCQCkAwEFB2ZyZWVOdW0EDGNvbnRpbmVudElkeAkAoAMBCQC7AgIFBmJpZ051bQUFRklWRVgECHRlcnJhaW5zCQELZ2VuVGVycmFpbnMCBQZiaWdOdW0FDGNvbnRpbmVudElkeAQJY29udGluZW50CQCRAwIFCmNvbnRpbmVudHMFDGNvbnRpbmVudElkeAQFaXNzdWUJAMIIBQkBB25mdE5hbWUCBQdsYW5kTnVtAgFTCQC5CQIJAMwIAgUHbGFuZE51bQkAzAgCAgFTCQDMCAIFCHRlcnJhaW5zCQDMCAIFCWNvbnRpbmVudAUDbmlsAgFfAAEAAAcEB2Fzc2V0SWQJALgIAQUFaXNzdWUEAmlkCQDYBAEFB2Fzc2V0SWQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleU5leHRGcmVlTGFuZE51bQAJAGQCBQdmcmVlTnVtAAEJAMwIAgUFaXNzdWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleUxhbmRUb0Fzc2V0SWQBBQdsYW5kTnVtBQJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQUCaWQFCHVzZXJBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYW5kTnVtVG9Pd25lcgEFB2xhbmROdW0FCHVzZXJBZGRyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFAmlkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAR5rZXlJbmZyYUxldmVsQnlBc3NldElkQW5kT3duZXICBQJpZAUIdXNlckFkZHIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIAAQUHYXNzZXRJZAUDbmlsCQCUCgIFAmlkBQljb250aW5lbnQBDGZsaWdodENvbW1vbgMIdXNlckFkZHIHbWVzc2FnZQNzaWcDCQEBIQEJAMQTAwUHbWVzc2FnZQUDc2lnBQNwdWIJAAIBAhhzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2gEBXBhcnRzCQC8CQIJALAJAQUHbWVzc2FnZQIBOwQJZmxpZ2h0TG9nCQC8CQIJAJEDAgUFcGFydHMAAAIBfAQCaHAJALUJAgkAkQMCBQlmbGlnaHRMb2cFCGZsSGVhbHRoAgFfBAVjdXJIUAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmhwAAAEBW5ld0hQCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCaHAAAQQLbmV3TG9jVHhWZXIJALUJAgkAkQMCBQVwYXJ0cwABAgE6BAtuZXdMb2NhdGlvbgkAkQMCBQtuZXdMb2NUeFZlcgAABAR0aW1lCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZmxpZ2h0TG9nBQtmbFRpbWVzdGFtcAMDCQBmAgUEdGltZQkAZAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBRFGSVZFTUlOVVRFU01JTExJUwYJAGYCCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFEUZJVkVNSU5VVEVTTUlMTElTBQR0aW1lCQACAQkArAICCQCsAgIJAKwCAgIcc2lnbmF0dXJlIG91dGRhdGVkOiBsb2dUaW1lPQkApAMBBQR0aW1lAgksIGJjVGltZT0JAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAECXR4RnJvbU1zZwkAkQMCBQtuZXdMb2NUeFZlcgABBAZsYXN0VHgJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBEWtleUxhc3RUeElkQnlVc2VyAQUIdXNlckFkZHICAAMJAQIhPQIFBmxhc3RUeAUJdHhGcm9tTXNnCQACAQkArAICCQCsAgIJAKwCAgIeVHggaWRzIGRvbid0IG1hdGNoISBJbiBzdGF0ZTogBQZsYXN0VHgCCiwgaW4gbXNnOiAFCXR4RnJvbU1zZwQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQh1c2VyQWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkAAAEDG9sZEZyb21TdGF0ZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlIZWFsdGgFBW1heEhQAwkBAiE9AgUMb2xkRnJvbVN0YXRlBQVjdXJIUAkAAgEJAKwCAgkArAICCQCsAgICCm9sZEhlYWx0aD0JAKQDAQUMb2xkRnJvbVN0YXRlAi8gZnJvbSBzdGF0ZSBkb2VzIG5vdCBtYXRjaCBvbmUgZnJvbSBmbGlnaHQgbG9nPQkApAMBBQVjdXJIUAMJAGcCAAAFBWN1ckhQCQACAQIeWW91IGNhbid0IGZseSB3aXRoIHplcm8gaGVhbHRoAwkBASEBCQEXY2FuV2VhckN1cnJlbnRFcXVpcG1lbnQBBQtkdWNrQXNzZXRJZAkAAgECFkVxdWlwbWVudCBpbmNvbXBhdGlibGUEBWJvbnVzAwkAZgIJAJADAQUJZmxpZ2h0TG9nBQdmbEJvbnVzCQCRAwIFCWZsaWdodExvZwUHZmxCb251cwIABAhwcm9kVXNlZAMJAGYCCQCQAwEFCWZsaWdodExvZwULZmxQcm9kc1VzZWQJAJEDAgUJZmxpZ2h0TG9nBQtmbFByb2RzVXNlZAIABApzZW50QW1vdW50AwMJAGYCBQVuZXdIUAAACQAAAgUFYm9udXMCASQHCQEFYXNJbnQBCQD8BwQFDHJlc3RDb250cmFjdAINc2VuZFVzZHRQcml6ZQkAzAgCBQh1c2VyQWRkcgUDbmlsBQNuaWwAAAkAlwoFBQVuZXdIUAULZHVja0Fzc2V0SWQFCnNlbnRBbW91bnQFC25ld0xvY2F0aW9uBQhwcm9kVXNlZAEMYXBwbHlCb251c2VzAgtsYW5kQXNzZXRJZAZwaWVjZXMECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAABAlhcnRQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQAAAQEYWRkNgkAaQIFCmluZnJhTGV2ZWwABgQEYWRkNwkAaQIFCmluZnJhTGV2ZWwABwkAZAIJAGQCBQ9EQUlMWVJFU0JZUElFQ0UJAGsDBQ9EQUlMWVJFU0JZUElFQ0UJAGQCCQBkAgUKaW5mcmFMZXZlbAUEYWRkNgkAaAIAAgUEYWRkNwAFCQBrAwUPREFJTFlSRVNCWVBJRUNFBQlhcnRQaWVjZXMJAGgCBQZwaWVjZXMABQEUY2hlY2tDbGFpbUNvbmRpdGlvbnMDBGFkZHIJY2xhaW1Nb2RlDWxhbmRBc3NldElkSW4EDSR0MDM2NjkyMzcyMzEDCQAAAgUJY2xhaW1Nb2RlBQtjbGFpbU1vZGVXaAkAlAoCBQ1sYW5kQXNzZXRJZEluCQELdmFsdWVPckVsc2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICAAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgQDbG9jCQC1CQIJAQV2YWx1ZQEFC2N1ckxvY2F0aW9uAgFfAwkBAiE9AgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUwJAAIBCQCsAgIJAKwCAgIWRHVjayBsb2NhdGlvbiB0eXBlIGlzIAkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCESwgYnV0IHNob3VsZCBiZSBMCQCUCgIJAJEDAgUDbG9jBQhsb2NJZHhJZAULZHVja0Fzc2V0SWQEC2xhbmRBc3NldElkCAUNJHQwMzY2OTIzNzIzMQJfMQQGZHVja0lkCAUNJHQwMzY2OTIzNzIzMQJfMgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAQJc2F2ZWRUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUHdGltZUtleQkArAICCQCsAgICBUxhbmQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAFkCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwkAlgoEBQZkdWNrSWQFC2xhbmRBc3NldElkBQFkBQlzYXZlZFRpbWUBEGNsYWltUmVzSW50ZXJuYWwEBGFkZHIGYW1vdW50CWNsYWltTW9kZQ1sYW5kQXNzZXRJZEluAwkAZgIAAAUGYW1vdW50CQACAQIPTmVnYXRpdmUgYW1vdW50BAFjCQEUY2hlY2tDbGFpbUNvbmRpdGlvbnMDBQRhZGRyBQljbGFpbU1vZGUFDWxhbmRBc3NldElkSW4ECGxhbmRTaXplCQCRAwIIBQFjAl8zBQtyZWNMYW5kU2l6ZQQNdGVycmFpbkNvdW50cwkBDWNvdW50VGVycmFpbnMBCQCRAwIIBQFjAl8zBQtyZWNUZXJyYWlucwQJZGVsdGFUaW1lCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAIBQFjAl80AwkAZgIAAAUJZGVsdGFUaW1lCQACAQkArAICCQCsAgIJAKwCAgImU2F2ZWQgdGltZXN0YW1wIGlzIGluIGZ1dHVyZSwgc2F2ZWQgPSAJAKQDAQgFAWMCXzQCDCwgY3VycmVudCA9IAkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQUIbGFuZFNpemUEFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UJAQxhcHBseUJvbnVzZXMCCAUBYwJfMgUGcGllY2VzBAhhdmFpbFJlcwkAawMFCWRlbHRhVGltZQkAaAIFFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UFBnBpZWNlcwUJREFZTUlMTElTAwkAZgIFBmFtb3VudAUIYXZhaWxSZXMJAAIBCQCsAgIJAKwCAgkArAICAiJOb3QgZW5vdWdoIHJlc291cmNlcywgYXZhaWxhYmxlID0gCQCkAwEFCGF2YWlsUmVzAg4sIHJlcXVlc3RlZCA9IAkApAMBBQZhbW91bnQEDG5ld0RlbHRhVGltZQkAawMJAGUCBQhhdmFpbFJlcwUGYW1vdW50BQlEQVlNSUxMSVMJAGgCBRZkYWlseVByb2R1Y3Rpb25CeVBpZWNlBQZwaWVjZXMEDG5ld1RpbWVzdGFtcAkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQxuZXdEZWx0YVRpbWUECWxhbmRJbmRleAkAaQIFBnBpZWNlcwUFU1NJWkUECnJlc1RvQ2xhaW0JAQl2aXJ0Q2xhaW0EBQ10ZXJyYWluQ291bnRzCQBlAgUJZGVsdGFUaW1lBQxuZXdEZWx0YVRpbWUFCWxhbmRJbmRleAUWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQQFd2hLZXkJARJrZXlXYXJlaG91c2VCeUxhbmQBCAUBYwJfMgQKaW5mcmFMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEIBQFjAl8yAAAECWN1cnJlbnRXaAkBDGdldFdhcmVob3VzZQMFBXdoS2V5BQlsYW5kSW5kZXgFCmluZnJhTGV2ZWwEBGxvZnQJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAIBXwQLd2hTcGFjZUxlZnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQd2b2xGcmVlAwMJAAACBQljbGFpbU1vZGUFC2NsYWltTW9kZVdoCQBmAgUGYW1vdW50BQt3aFNwYWNlTGVmdAcJAAIBCQCsAgIJAKwCAgIFT25seSAJAKQDAQULd2hTcGFjZUxlZnQCGCBzcGFjZSBsZWZ0IGluIHdhcmVob3VzZQQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEIBQFjAl8xBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkEDmN1cnJlbnRQYWNrUmVzCQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBAxjdXJyZW50V2hSZXMJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBA0kdDAzOTYwNTQwNDc2AwkAAAIFCWNsYWltTW9kZQULY2xhaW1Nb2RlV2gJAJYKBAkBBmFkZFJlcwUFDGN1cnJlbnRXaFJlcwUNdGVycmFpbkNvdW50cwkAZQIFCWRlbHRhVGltZQUMbmV3RGVsdGFUaW1lBQlsYW5kSW5kZXgFFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFC3ZvbE9jY3VwaWVkCAUKcmVzVG9DbGFpbQJfMgkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQd2b2xGcmVlCAUKcmVzVG9DbGFpbQJfMgMJAAACBQljbGFpbU1vZGUFDWNsYWltTW9kZUR1Y2sJAJYKBAkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzCQEGYWRkUmVzBQUOY3VycmVudFBhY2tSZXMFDXRlcnJhaW5Db3VudHMJAGUCBQlkZWx0YVRpbWUFDG5ld0RlbHRhVGltZQUJbGFuZEluZGV4BRZkYWlseVByb2R1Y3Rpb25CeVBpZWNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAULdm9sT2NjdXBpZWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQd2b2xGcmVlBAVkaXN0cgkBDWRpc3RyaWJ1dGVSZXMEBQxjdXJyZW50V2hSZXMFDmN1cnJlbnRQYWNrUmVzBQpyZXNUb0NsYWltBQt3aFNwYWNlTGVmdAQEd2hBbQkAlwMBCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQd2b2xGcmVlCQDMCAIIBQpyZXNUb0NsYWltAl8yBQNuaWwJAJYKBAgFBWRpc3RyAl8xCAUFZGlzdHICXzIJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAULdm9sT2NjdXBpZWQFBHdoQW0JAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQUEd2hBbQQFd2hSZXMIBQ0kdDAzOTYwNTQwNDc2Al8xBAVicFJlcwgFDSR0MDM5NjA1NDA0NzYCXzIEBWxvZnRPCAUNJHQwMzk2MDU0MDQ3NgJfMwQFbG9mdEYIBQ0kdDAzOTYwNTQwNDc2Al80CQCXCgUJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQgFAWMCXzIFDG5ld1RpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpMQU5EUFJFRklYCAUBYwJfMgUEYWRkcgUMbmV3VGltZXN0YW1wBQNuaWwFBWJwS2V5CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgUFYnBSZXMJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwFBXdoS2V5CQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCBQV3aFJlcwkAzAgCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhNYXQJAMwIAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4UHJvZAkAzAgCCQC5CQIJAMwIAgkAkQMCBQRsb2Z0BQl2b2xMb2NrZWQJAMwIAgkApAMBBQVsb2Z0TwkAzAgCCQCkAwEFBWxvZnRGCQDMCAIJAJEDAgUEbG9mdAUIdm9sVG90YWwFA25pbAIBXwUDbmlsAQhjbGFpbUFsbAQEYWRkcgtsYW5kQXNzZXRJZAZwaWVjZXMJY2xhaW1Nb2RlBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkBAlzYXZlZFRpbWUJAQV2YWx1ZQEJAJ8IAQUHdGltZUtleQQIYXZhaWxSZXMJAGgCCQBrAwkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQlzYXZlZFRpbWUJAQxhcHBseUJvbnVzZXMCBQtsYW5kQXNzZXRJZAUGcGllY2VzBQlEQVlNSUxMSVMFBnBpZWNlcwkBEGNsYWltUmVzSW50ZXJuYWwEBQRhZGRyBQhhdmFpbFJlcwUJY2xhaW1Nb2RlBQtsYW5kQXNzZXRJZAENdXBJbmZyYUNvbW1vbgQMc2hvdWxkVXNlTWF0BmNhbGxlcg1wYXltZW50QW1vdW50C2xhbmRBc3NldElkBARhZGRyCQClCAEFBmNhbGxlcgQBYwkBFGNoZWNrQ2xhaW1Db25kaXRpb25zAwUEYWRkcgUTY2xhaW1Nb2RlV2hUaGVuRHVjawULbGFuZEFzc2V0SWQEBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAggFAWMCXzMFC3JlY0xhbmRTaXplBAhpbmZyYUtleQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBCAUBYwJfMgQIY3VyTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUIaW5mcmFLZXkAAAMDCQEBIQEFGEtTX0FMTE9XX0JJR19JTkZSQV9NRVJHRQkAZwIFCGN1ckxldmVsAAMHCQACAQImQ3VycmVudGx5IG1heCBpbmZyYXN0cnVjdHVyZSBsZXZlbCA9IDMECG1heEluZnJhCQBkAgkAaQIJAQRzcXJ0BAUGcGllY2VzAAAAAAUERE9XTgAFAAIECG5ld0xldmVsCQBkAgUIY3VyTGV2ZWwAAQMDBRhLU19BTExPV19CSUdfSU5GUkFfTUVSR0UJAGYCBQhuZXdMZXZlbAUIbWF4SW5mcmEHCQACAQkArAICAiVDdXJyZW50bHkgbWF4IGluZnJhc3RydWN0dXJlIGxldmVsID0gCQCkAwEFCG1heEluZnJhBARjb3N0CQBrAwUVSW5mcmFVcGdyYWRlQ29zdFNVc2R0CQBoAgUGcGllY2VzBQhuZXdMZXZlbAUFU1NJWkUDAwkBASEBBQxzaG91bGRVc2VNYXQJAQIhPQIFDXBheW1lbnRBbW91bnQFBGNvc3QHCQACAQkArAICAhtQYXltZW50IGF0dGFjaGVkIHNob3VsZCBiZSAJAKQDAQUEY29zdAQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEIBQFjAl8xBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkEBW1MaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBAdtYXRVc2VkCQBrAwURSW5mcmFVcGdyYWRlQ29zdFMJAGgCBQZwaWVjZXMFCG5ld0xldmVsBQVTU0laRQQGbmV3TWF0CQC5CQIJARFzdWJ0cmFjdE1hdGVyaWFscwMFDHNob3VsZFVzZU1hdAUFbUxpc3QFB21hdFVzZWQCAV8EC2NsYWltUmVzdWx0CQEIY2xhaW1BbGwEBQRhZGRyCAUBYwJfMgUGcGllY2VzBRNjbGFpbU1vZGVXaFRoZW5EdWNrBAZ3aERhdGEIBQtjbGFpbVJlc3VsdAJfNQQGb2xkVm9sCQEXZ2V0V2FyZWhvdXNlVG90YWxWb2x1bWUBCQCRAwIFBndoRGF0YQULd2hJZHhMZXZlbHMECm5ld1ZvbERhdGEJALkJAgkAzAgCCQCRAwIJALUJAgkAkQMCBQZ3aERhdGEFC3doSWR4TGV2ZWxzAgFfAAAJAMwIAgkApAMBBQhuZXdMZXZlbAUDbmlsAgFfBAZuZXdWb2wJARdnZXRXYXJlaG91c2VUb3RhbFZvbHVtZQEFCm5ld1ZvbERhdGEEBGxvZnQJALUJAgkAkQMCBQZ3aERhdGEFCXdoSWR4TE9GVAIBXwQKbmV3TG9mdFN0cgkAuQkCCQDMCAIJAJEDAgUEbG9mdAUJdm9sTG9ja2VkCQDMCAIJAJEDAgUEbG9mdAULdm9sT2NjdXBpZWQJAMwIAgkApAMBCQBlAgkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQd2b2xGcmVlBQZuZXdWb2wFBm9sZFZvbAkAzAgCCQCkAwEFBm5ld1ZvbAUDbmlsAgFfCQCVCgMJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUIaW5mcmFLZXkFCG5ld0xldmVsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEea2V5SW5mcmFMZXZlbEJ5QXNzZXRJZEFuZE93bmVyAggFAWMCXzIFBGFkZHIFCG5ld0xldmVsCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWJwS2V5CQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIIBQtjbGFpbVJlc3VsdAJfMwUIYnBJZHhSZXMJAMwIAgUGbmV3TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6CQDMCAIJAQtTdHJpbmdFbnRyeQIIBQtjbGFpbVJlc3VsdAJfNAkAuQkCCQDMCAIFCm5ld1ZvbERhdGEJAMwIAgkAkQMCBQZ3aERhdGEFCHdoSWR4UmVzCQDMCAIJAJEDAgUGd2hEYXRhBQh3aElkeE1hdAkAzAgCCQCRAwIFBndoRGF0YQUJd2hJZHhQcm9kCQDMCAIFCm5ld0xvZnRTdHIFA25pbAIBOgUDbmlsCAULY2xhaW1SZXN1bHQCXzEFCG5ld0xldmVsBQdtYXRVc2VkARN1cGRhdGVTdGF0c0ludGVybmFsBAZsdmxLZXkFeHBLZXkJcG9pbnRzS2V5B2RlbHRhWFAEAnhwCQELdmFsdWVPckVsc2UCCQCfCAEFBXhwS2V5AAAEBW5ld1hQCQBkAgUCeHAFB2RlbHRhWFAECWx2bFBvaW50cwkBB2xldmVsVXACCQELdmFsdWVPckVsc2UCCQCfCAEFBmx2bEtleQAABQVuZXdYUAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZsdmxLZXkJAJEDAgUJbHZsUG9pbnRzAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFBXhwS2V5BQVuZXdYUAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJcG9pbnRzS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlwb2ludHNLZXkAAAkAkQMCBQlsdmxQb2ludHMAAQUDbmlsBQVuZXdYUAEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCC2R1Y2tBc3NldElkB2RlbHRhWFAJARN1cGRhdGVTdGF0c0ludGVybmFsBAkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkCQEJa2V5RHVja1hQAQULZHVja0Fzc2V0SWQJARFrZXlEdWNrRnJlZVBvaW50cwEFC2R1Y2tBc3NldElkBQdkZWx0YVhQARZ1cGRhdGVBY2NTdGF0c0ludGVybmFsAgRhZGRyB2RlbHRhWFAJARN1cGRhdGVTdGF0c0ludGVybmFsBAkBDGtleVVzZXJMZXZlbAEFBGFkZHIJAQlrZXlVc2VyWFABBQRhZGRyCQERa2V5VXNlckZyZWVQb2ludHMBBQRhZGRyBQdkZWx0YVhQARJhY3RpdmF0ZU9uYm9hcmRBcnQBBGFkZHIEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUEYWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQRhZGRyBAVyZWZCeQkAoggBBQhyZWZCeUtleQMJAQEhAQkBCWlzRGVmaW5lZAEFBXJlZkJ5CQACAQIpWW91IGFyZSBub3QgZWxpZ2libGUgZm9yIE9OQk9BUkQgYXJ0aWZhY3QEBmFydEtleQkBHGtleU9uYm9hcmRBcnREdWNrQWN0aXZhdGVkQnkBBQRhZGRyBAdhcnREdWNrCQCiCAEFBmFydEtleQMJAQlpc0RlZmluZWQBBQdhcnREdWNrCQACAQkArAICAi9Zb3UgYWxyZWFkeSB1c2VkIHlvdXIgT05CT0FSRCBhcnRpZmFjdCBvbiBkdWNrIAkBBXZhbHVlAQUHYXJ0RHVjawQQZHVja0FjdGl2YXRvcktleQkBHGtleU9uYm9hcmRBcnRBY3RpdmF0ZWRPbkR1Y2sBBQtkdWNrQXNzZXRJZAQNZHVja0FjdGl2YXRvcgkAoggBBRBkdWNrQWN0aXZhdG9yS2V5AwkBCWlzRGVmaW5lZAEFDWR1Y2tBY3RpdmF0b3IJAAIBCQCsAgIJAKwCAgkArAICAglUaGUgZHVjayAFC2R1Y2tBc3NldElkAjQgYWxyZWFkeSBnb3QgcG9pbnRzIGZyb20gT05CT0FSRCBhcnRpZmFjdCBmcm9tIHVzZXIgCQEFdmFsdWUBBQ1kdWNrQWN0aXZhdG9yCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUGYXJ0S2V5BQtkdWNrQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBRBkdWNrQWN0aXZhdG9yS2V5BQRhZGRyBQNuaWwICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAUJeHBPbmJvYXJkAl8xARJhY3RpdmF0ZVByZXNhbGVBcnQCBGFkZHINbGFuZEFzc2V0SWRJbgQBYwkBFGNoZWNrQ2xhaW1Db25kaXRpb25zAwUEYWRkcgUTY2xhaW1Nb2RlV2hUaGVuRHVjawUNbGFuZEFzc2V0SWRJbgQLbGFuZEFzc2V0SWQIBQFjAl8yBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIIBQFjAl8zBQtyZWNMYW5kU2l6ZQQNYWN0aXZhdGlvbktleQkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQDCQBmAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ1hY3RpdmF0aW9uS2V5AAAAAAkAAgECJVByZXNhbGUgYXJ0aWZhY3QgaXMgYWxyZWFkeSBhY3RpdmF0ZWQDCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQFjAl8zBQpyZWNMYW5kTnVtBQ9QUkVTQUxFTlVNTEFORFMJAAIBCQCsAgIJAKwCAgkArAICBQpMQU5EUFJFRklYAgEgBQtsYW5kQXNzZXRJZAIlIGlzIG5vdCBlbGlnaWJsZSBmb3IgcHJlc2FsZSBhcnRpZmFjdAQLY2xhaW1SZXN1bHQJAQhjbGFpbUFsbAQFBGFkZHIFC2xhbmRBc3NldElkBQZwaWVjZXMFE2NsYWltTW9kZVdoVGhlbkR1Y2sJAM0IAgkAzQgCCQDNCAIIBQtjbGFpbVJlc3VsdAJfMQkBDEludGVnZXJFbnRyeQIFDWFjdGl2YXRpb25LZXkFBnBpZWNlcwkBC1N0cmluZ0VudHJ5AggFC2NsYWltUmVzdWx0Al8yCQC5CQIIBQtjbGFpbVJlc3VsdAJfMwIBOgkBC1N0cmluZ0VudHJ5AggFC2NsYWltUmVzdWx0Al80CQC5CQIIBQtjbGFpbVJlc3VsdAJfNQIBOgEPY2hlY2tUb3VybmFtZW50AQtkdWNrQXNzZXRJZAQGbGFzdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEnRvdXJuYW1lbnRDb250cmFjdAUNbGFzdFRvdXJJZEtleQAABAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUSdG91cm5hbWVudENvbnRyYWN0BQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBVAcDAwMJAAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULY3VyTG9jYXRpb24FD2xvY0lkeENvbnRpbmVudAUGbGFzdElkCQAAAgkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwIKSU5QUk9HUkVTUwcJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kBQNub3cHCQACAQIqWW91ciBkdWNrIGlzIHRha2luZyBwYXJ0IGluIHRoZSB0b3VybmFtZW50CQEJYXNCb29sZWFuAQkA/AcEBQR0aGlzAhZleGl0VG91cm5hbWVudEludGVybmFsCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwFA25pbAENY2hlY2tEZWxpdmVyeQELZHVja0Fzc2V0SWQEC2N1ckxvY2F0aW9uCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8EA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXADCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFEBwQJc3RhcnRUaW1lCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULY3VyTG9jYXRpb24FD2xvY0lkeENvbnRpbmVudAQIZGlzdGFuY2UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQDAwkAZgIJAGQCBQlzdGFydFRpbWUFElRFTl9NSU5VVEVTX01JTExJUwUDbm93CQBmAgABBQhkaXN0YW5jZQcJAAIBAiBZb3VyIGR1Y2sgaXMgb24gZGVsaXZlcnkgbWlzc2lvbgkBCWFzQm9vbGVhbgEJAPwHBAUEdGhpcwIUZXhpdERlbGl2ZXJ5SW50ZXJuYWwJAMwIAgULZHVja0Fzc2V0SWQFA25pbAUDbmlsARJleGl0RGVsaXZlcnlDb21tb24EC2R1Y2tBc3NldElkBWNoZWNrBW5ld0hQBXNjb3JlBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlzdGFydFRpbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BAhkaXN0YW5jZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEQa2V5RHVja0lkVG9Pd25lcgEFC2R1Y2tBc3NldElkAhRORlQgZHVjayBpcyBvcnBoYW5lZAQJaGVhbHRoS2V5CQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAljdXJIZWFsdGgJARFAZXh0ck5hdGl2ZSgxMDU1KQEFCWhlYWx0aEtleQQOb3V0Y29tZUFjdGlvbnMDAwkAZgIFCGRpc3RhbmNlAAAGAwMFBWNoZWNrCQBmAgUFc2NvcmUAAAcJAGYCBQVuZXdIUAAABwQGcmV3YXJkCQD8BwQFD2Vjb25vbXlDb250cmFjdAISc2VuZERlbGl2ZXJ5UmV3YXJkCQDMCAIFBW93bmVyBQNuaWwFA25pbAMJAAACBQZyZXdhcmQFBnJld2FyZAQIY291bnRLZXkJARRrZXlVc2VyRGVsaXZlcnlDb3VudAEFBW93bmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQhjb3VudEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUIY291bnRLZXkAAAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5VXNlckxhc3REZWxpdmVyeURheQEFBW93bmVyCQBpAgUJc3RhcnRUaW1lBQlEQVlNSUxMSVMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMDAwUFY2hlY2sJAGYCBQVuZXdIUAAABwkAZgIJAGQCBQlzdGFydFRpbWUFElRFTl9NSU5VVEVTX01JTExJUwUDbm93BwkAAgECJllvdXIgZHVjayBpcyBzdGlsbCBvbiBkZWxpdmVyeSBtaXNzaW9uBAtsb2NrZWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9lY29ub215Q29udHJhY3QFEWRlbGl2ZXJ5TG9ja2VkS2V5AAAEBnVubG9jawkA/AcEBQ9lY29ub215Q29udHJhY3QCFHVwZGF0ZURlbGl2ZXJ5TG9ja2VkCQDMCAIJAGUCBQtsb2NrZWRUb3RhbAUVTUlOX1VTRFRfRkVFX0RFTElWRVJZBQNuaWwFA25pbAMJAAACBQZ1bmxvY2sFBnVubG9jawMDAwUFY2hlY2sJAGcCAAAFBW5ld0hQBwYJAGcCAAAFCWN1ckhlYWx0aAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5RGVsaXZlcnlEZWxheUJ5RHVjawEFC2R1Y2tBc3NldElkCQBkAgUJc3RhcnRUaW1lBRNERUxJVkVSWV9QVU5JU0hNRU5UBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDXNhdmVkTG9jYXRpb24JARFAZXh0ck5hdGl2ZSgxMDU4KQEJARBrZXlTYXZlZExvY2F0aW9uAQULZHVja0Fzc2V0SWQJAJUKAwUOb3V0Y29tZUFjdGlvbnMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ1zYXZlZExvY2F0aW9uBQNuaWwFDXNhdmVkTG9jYXRpb24BDW1lcmdlSW50ZXJuYWwGC25ld0xhbmRTaXplCG5ld0xldmVsB2Zvcm11bGEEYWRkcgxsYW5kQXNzZXRJZHMHbmVlZE1hdAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBD2NoZWNrVG91cm5hbWVudAEFC2R1Y2tBc3NldElkCQACAQIdbWVyZ2VJbnRlcm5hbF9jaGVja1RvdXJuYW1lbnQDCQENY2hlY2tEZWxpdmVyeQEFC2R1Y2tBc3NldElkCQACAQIbbWVyZ2VJbnRlcm5hbF9jaGVja0RlbGl2ZXJ5CgEKY2hlY2tNZXJnZQIDYWNjC2xhbmRBc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkBAlzYXZlZFRpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQd0aW1lS2V5CQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQBZAkAtQkCCAUFYXNzZXQLZGVzY3JpcHRpb24CAV8ECWNvbnRpbmVudAkAkQMCBQFkBQxyZWNDb250aW5lbnQDAwkBAiE9AggFA2FjYwJfMwIACQECIT0CCAUDYWNjAl8zBQljb250aW5lbnQHCQACAQIuTGFuZHMgc2hvdWxkIGJlIG9uIHRoZSBzYW1lIGNvbnRpbmVudCB0byBtZXJnZQQIbGFuZFNpemUJAJEDAgUBZAULcmVjTGFuZFNpemUEB3NpemVzSW4IBQNhY2MCXzEEAWkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAswkCBQdzaXplc0luBQhsYW5kU2l6ZQInWW91IGhhdmVuJ3QgcGFzc2VkIGFsbCB0aGUgbGFuZHMgbmVlZGVkBAhzaXplc091dAkArAICCQCvAgIFB3NpemVzSW4FAWkJALACAgUHc2l6ZXNJbgkAZAIFAWkAAQQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQUIbGFuZFNpemUEBGFydHMJAGQCCAUDYWNjAl8yCQELdmFsdWVPckVsc2UCCQCfCAEJASBrZXlMYW5kQXJ0U3RhdHVzQnlUeXBlQW5kQXNzZXRJZAIFCkFSVFBSRVNBTEUFC2xhbmRBc3NldElkAAAECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAABAhyZXFMZXZlbAQHJG1hdGNoMAUIbGFuZFNpemUDCQAAAgIBUwUHJG1hdGNoMAADAwkAAAICAU0FByRtYXRjaDAABAMJAAACAgFMBQckbWF0Y2gwAAUDCQAAAgICWEwFByRtYXRjaDAABgkAAgECGk9ubHkgUywgTSwgTCwgWEwgY2FuIG1lcmdlAwkBAiE9AgUKaW5mcmFMZXZlbAUIcmVxTGV2ZWwJAAIBAiJBbGwgbGFuZHMgc2hvdWxkIGJlIG1heGVkIHRvIG1lcmdlBAdsYW5kTnVtCQCRAwIFAWQFCnJlY0xhbmROdW0EDXRlcnJhaW5Db3VudHMJAQ1jb3VudFRlcnJhaW5zAQkAkQMCBQFkBQtyZWNUZXJyYWlucwQJZGVsdGFUaW1lCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFCXNhdmVkVGltZQMJAGYCAAAFCWRlbHRhVGltZQkAAgEJAKwCAgkArAICCQCsAgICJlNhdmVkIHRpbWVzdGFtcCBpcyBpbiBmdXR1cmUsIHNhdmVkID0gCQCkAwEFCXNhdmVkVGltZQIMLCBjdXJyZW50ID0gCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBBZkYWlseVByb2R1Y3Rpb25CeVBpZWNlCQEMYXBwbHlCb251c2VzAgULbGFuZEFzc2V0SWQFBnBpZWNlcwQJbGFuZEluZGV4CQBpAgUGcGllY2VzBQVTU0laRQQFYnBSZXMJAQZhZGRSZXMFCQC1CQIIBQNhY2MCXzQCAV8FDXRlcnJhaW5Db3VudHMFCWRlbHRhVGltZQUJbGFuZEluZGV4BRZkYWlseVByb2R1Y3Rpb25CeVBpZWNlBAVwcm9wcwkBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwECAUDYWNjAl82BQ10ZXJyYWluQ291bnRzBQlsYW5kSW5kZXgA////////////AQQGY1Byb3BzCQEZdXBkYXRlUHJvcG9ydGlvbnNJbnRlcm5hbAQIBQNhY2MDXzEwBQ10ZXJyYWluQ291bnRzBQlsYW5kSW5kZXgA////////////AQQLc3VtVGVycmFpbnMJARl1cGRhdGVQcm9wb3J0aW9uc0ludGVybmFsBAgFA2FjYwJfOQUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AAEEBWxhbmRzCAUDYWNjAl83BANpZHgJAM8IAgUFbGFuZHMFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQUDaWR4CQACAQkArAICAiBZb3VyIHN0YWtlZCBsYW5kcyBkb24ndCBjb250YWluIAULbGFuZEFzc2V0SWQECWN1c3RvbUtleQkBGmtleUxhbmRBc3NldElkVG9DdXN0b21OYW1lAQULbGFuZEFzc2V0SWQECmN1c3RvbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAKIIAQUJY3VzdG9tS2V5AgAJAJwKCgUIc2l6ZXNPdXQFBGFydHMFCWNvbnRpbmVudAUFYnBSZXMJAM4IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIIBQNhY2MCXzUJAQtEZWxldGVFbnRyeQEJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAQtEZWxldGVFbnRyeQEJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKTEFORFBSRUZJWAULbGFuZEFzc2V0SWQFBGFkZHIJAQtEZWxldGVFbnRyeQEJARBrZXlMYW5kVG9Bc3NldElkAQUHbGFuZE51bQkBC0RlbGV0ZUVudHJ5AQkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQELRGVsZXRlRW50cnkBCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQELRGVsZXRlRW50cnkBCQEea2V5SW5mcmFMZXZlbEJ5QXNzZXRJZEFuZE93bmVyAgULbGFuZEFzc2V0SWQFBGFkZHIJAQtEZWxldGVFbnRyeQEJASBrZXlMYW5kQXJ0U3RhdHVzQnlUeXBlQW5kQXNzZXRJZAIFCkFSVFBSRVNBTEUFC2xhbmRBc3NldElkCQELRGVsZXRlRW50cnkBCQERa2V5TGFuZE51bVRvT3duZXIBBQdsYW5kTnVtCQELRGVsZXRlRW50cnkBCQESa2V5V2FyZWhvdXNlQnlMYW5kAQULbGFuZEFzc2V0SWQJAQtEZWxldGVFbnRyeQEFCWN1c3RvbUtleQkBBEJ1cm4CCQDZBAEFC2xhbmRBc3NldElkAAEDCQECIT0CBQpjdXN0b21OYW1lAgAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGmtleUxhbmRDdXN0b21OYW1lVG9Bc3NldElkAQUKY3VzdG9tTmFtZQUDbmlsBQNuaWwFBXByb3BzCQDRCAIFBWxhbmRzCQEFdmFsdWUBBQNpZHgJAGQCCAUDYWNjAl84BQZwaWVjZXMFC3N1bVRlcnJhaW5zBQZjUHJvcHMEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAhwcm9wTGlzdAkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJARFrZXlSZXNQcm9wb3J0aW9ucwACCzBfMF8wXzBfMF8wAgFfBAhsYW5kc0tleQkBFWtleVN0YWtlZExhbmRzQnlPd25lcgEFBGFkZHIECGxhbmRzU3RyCQCiCAEFCGxhbmRzS2V5BAdsYW5kc0luAwkBCWlzRGVmaW5lZAEFCGxhbmRzU3RyCQC9CQIJAQV2YWx1ZQEFCGxhbmRzU3RyAgFfBQNuaWwEBWNvbnQwCQCRAwIJALUJAggJAQV2YWx1ZQEJAOwHAQkA2QQBCQCRAwIFDGxhbmRBc3NldElkcwAAC2Rlc2NyaXB0aW9uAgFfBQxyZWNDb250aW5lbnQECWNvbnRQcm9wcwkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJARZrZXlSZXNUeXBlc0J5Q29udGluZW50AQUFY29udDACCzBfMF8wXzBfMF8wAgFfBAFyCgACJGwFDGxhbmRBc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJwKCgUHZm9ybXVsYQAAAgAJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzBQNuaWwFCHByb3BMaXN0BQdsYW5kc0luAAAJALUJAgILMF8wXzBfMF8wXzACAV8FCWNvbnRQcm9wcwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKY2hlY2tNZXJnZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUECWNvbnRpbmVudAgFAXICXzMEDGNvbnRpbmVudElkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCmNvbnRpbmVudHMFCWNvbnRpbmVudAkArAICAhNVbmtub3duIGNvbnRpbmVudDogBQljb250aW5lbnQECHRlcnJhaW5zCQETZ2VuVGVycmFpbnNGb3JNZXJnZQIIBQFyAl85CQBpAgkBD251bVBpZWNlc0J5U2l6ZQEFC25ld0xhbmRTaXplBQVTU0laRQQHZnJlZU51bQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5TmV4dEZyZWVMYW5kTnVtAAkAZAIFD1BSRVNBTEVOVU1MQU5EUwABBApuZXdMYW5kTnVtCQCkAwEFB2ZyZWVOdW0EBWlzc3VlCQDCCAUJAQduZnROYW1lAgUKbmV3TGFuZE51bQULbmV3TGFuZFNpemUJALkJAgkAzAgCBQpuZXdMYW5kTnVtCQDMCAIFC25ld0xhbmRTaXplCQDMCAIFCHRlcnJhaW5zCQDMCAIFCWNvbnRpbmVudAUDbmlsAgFfAAEAAAcEB2Fzc2V0SWQJALgIAQUFaXNzdWUEDm5ld0xhbmRBc3NldElkCQDYBAEFB2Fzc2V0SWQEBm5ld01hdAkAuQkCCQERc3VidHJhY3RNYXRlcmlhbHMDCQBmAgUHbmVlZE1hdAAACQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBQduZWVkTWF0AgFfBAlwaWVjZXNLZXkJARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQUEYWRkcgQMc3Rha2VkUGllY2VzCQELdmFsdWVPckVsc2UCCQCfCAEFCXBpZWNlc0tleQAACQCUCgIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIIBQFyAl81AwkAZgIJAJADAQgFAXICXzcAAAkBC1N0cmluZ0VudHJ5AgUIbGFuZHNLZXkJALsJAggFAXICXzcCAV8JAQtEZWxldGVFbnRyeQEFCGxhbmRzS2V5CQEMSW50ZWdlckVudHJ5AgUJcGllY2VzS2V5AwkAZgIIBQFyAl84BQxzdGFrZWRQaWVjZXMAAAkAZQIFDHN0YWtlZFBpZWNlcwgFAXICXzgJAQxJbnRlZ2VyRW50cnkCCQESa2V5TmV4dEZyZWVMYW5kTnVtAAkAZAIFB2ZyZWVOdW0AAQUFaXNzdWUJAQtTdHJpbmdFbnRyeQIJARBrZXlMYW5kVG9Bc3NldElkAQUKbmV3TGFuZE51bQUObmV3TGFuZEFzc2V0SWQJAQtTdHJpbmdFbnRyeQIJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQ5uZXdMYW5kQXNzZXRJZAUEYWRkcgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhbmROdW1Ub093bmVyAQUKbmV3TGFuZE51bQUEYWRkcgkBDEludGVnZXJFbnRyeQIJASBrZXlMYW5kQXJ0U3RhdHVzQnlUeXBlQW5kQXNzZXRJZAIFCkFSVFBSRVNBTEUFDm5ld0xhbmRBc3NldElkCAUBcgJfMgkBDEludGVnZXJFbnRyeQIJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQUObmV3TGFuZEFzc2V0SWQFCG5ld0xldmVsCQEMSW50ZWdlckVudHJ5AgkBHmtleUluZnJhTGV2ZWxCeUFzc2V0SWRBbmRPd25lcgIFDm5ld0xhbmRBc3NldElkBQRhZGRyBQhuZXdMZXZlbAkBC1N0cmluZ0VudHJ5AgUFYnBLZXkJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIIBQFyAl80CQDMCAIFBm5ld01hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgkBC1N0cmluZ0VudHJ5AgkBEWtleVJlc1Byb3BvcnRpb25zAAkAuQkCCAUBcgJfNgIBXwkBC1N0cmluZ0VudHJ5AgkBFmtleVJlc1R5cGVzQnlDb250aW5lbnQBBQljb250aW5lbnQJALkJAggFAXIDXzEwAgFfCQELU3RyaW5nRW50cnkCCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQJALkJAgkAzAgCBQljb250aW5lbnQJAMwIAgIBTAkAzAgCBQ5uZXdMYW5kQXNzZXRJZAUDbmlsAgFfCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyAAEFB2Fzc2V0SWQFDm5ld0xhbmRBc3NldElkAQNzMm0CBGFkZHIMbGFuZEFzc2V0SWRzCQENbWVyZ2VJbnRlcm5hbAYCAU0AAwIEU1NTUwUEYWRkcgUMbGFuZEFzc2V0SWRzAAABA20ybAIEYWRkcgxsYW5kQXNzZXRJZHMJAQ1tZXJnZUludGVybmFsBgIBTAAEAgNTTU0FBGFkZHIFDGxhbmRBc3NldElkcwkAaAIFEUluZnJhVXBncmFkZUNvc3RTAAQBBGwyeGwCBGFkZHIMbGFuZEFzc2V0SWRzCQENbWVyZ2VJbnRlcm5hbAYCAlhMAAUCBVNTU01MBQRhZGRyBQxsYW5kQXNzZXRJZHMJAGgCBRFJbmZyYVVwZ3JhZGVDb3N0UwAvAQZ4bDJ4eGwCBGFkZHIMbGFuZEFzc2V0SWRzCQENbWVyZ2VJbnRlcm5hbAYCA1hYTAAGAgNMWEwFBGFkZHIFDGxhbmRBc3NldElkcwkAaAIFEUluZnJhVXBncmFkZUNvc3RTADYBC21lcmdlQ29tbW9uAgRhZGRyDGxhbmRBc3NldElkcwQHJG1hdGNoMAkAkAMBBQxsYW5kQXNzZXRJZHMDCQAAAgAEBQckbWF0Y2gwCQEDczJtAgUEYWRkcgUMbGFuZEFzc2V0SWRzAwkAAAIAAwUHJG1hdGNoMAkBA20ybAIFBGFkZHIFDGxhbmRBc3NldElkcwMJAAACAAUFByRtYXRjaDAJAQRsMnhsAgUEYWRkcgUMbGFuZEFzc2V0SWRzAwkAAAIAAgUHJG1hdGNoMAkBBnhsMnh4bAIFBGFkZHIFDGxhbmRBc3NldElkcwkAAgECDVVua25vd24gbWVyZ2UBFWNoZWNrT3V0ZGF0ZWREZWxpdmVyeQEIdXNlckFkZHIEBGR1Y2sJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUIdXNlckFkZHIDCQEJaXNEZWZpbmVkAQUEZHVjawQLZHVja0Fzc2V0SWQJAQV2YWx1ZQEFBGR1Y2sEBmxvY0tleQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBANsb2MJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQZsb2NLZXkFD0RFRkFVTFRMT0NBVElPTgIBXwQJc3RhcnRUaW1lCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQ9sb2NJZHhDb250aW5lbnQDAwkBAiE9AgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUQGCQBmAgkAZAIFCXN0YXJ0VGltZQUSVEVOX01JTlVURVNfTUlMTElTCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUDbmlsBAloZWFsdGhLZXkJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQDCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2xvYwUIbG9jSWR4SWQAAAQGcmV3YXJkCQD8BwQFD2Vjb25vbXlDb250cmFjdAISc2VuZERlbGl2ZXJ5UmV3YXJkCQDMCAIFCHVzZXJBZGRyBQNuaWwFA25pbAMJAAACBQZyZXdhcmQFBnJld2FyZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDNCAIJAM0IAgQLbG9ja2VkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPZWNvbm9teUNvbnRyYWN0BRFkZWxpdmVyeUxvY2tlZEtleQAABAZ1bmxvY2sJAPwHBAUPZWNvbm9teUNvbnRyYWN0AhR1cGRhdGVEZWxpdmVyeUxvY2tlZAkAzAgCCQBlAgULbG9ja2VkVG90YWwFFU1JTl9VU0RUX0ZFRV9ERUxJVkVSWQUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sDCQBnAgAACQERQGV4dHJOYXRpdmUoMTA1NSkBBQloZWFsdGhLZXkFA25pbAQKcHVuaXNobWVudAkA/AcEBQR0aGlzAgtzYXZlSW50ZWdlcgkAzAgCCQEWa2V5RGVsaXZlcnlEZWxheUJ5RHVjawEFC2R1Y2tBc3NldElkCQDMCAIJAGQCBQlzdGFydFRpbWUFE0RFTElWRVJZX1BVTklTSE1FTlQFA25pbAUDbmlsAwkAAAIFCnB1bmlzaG1lbnQFCnB1bmlzaG1lbnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBDEludGVnZXJFbnRyeQIFCWhlYWx0aEtleQkBEUBleHRyTmF0aXZlKDEwNTUpAQkBDmtleVNhdmVkSGVhbHRoAQULZHVja0Fzc2V0SWQJAQtTdHJpbmdFbnRyeQIFBmxvY0tleQkBEUBleHRyTmF0aXZlKDEwNTgpAQkBEGtleVNhdmVkTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUDbmlsAQZwcm9sb2cBAWkDAwkBAiE9AggFAWkMb3JpZ2luQ2FsbGVyBQxyZXN0Q29udHJhY3QJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBCmtleUJsb2NrZWQABwcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlBAh1c2VyQWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIJAM0IAgkBFWNoZWNrT3V0ZGF0ZWREZWxpdmVyeQEFCHVzZXJBZGRyCQELU3RyaW5nRW50cnkCCQERa2V5TGFzdFR4SWRCeVVzZXIBBQh1c2VyQWRkcgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkAQxwcm9sb2dGbGlnaHQBAWkDAwkBAiE9AggFAWkMb3JpZ2luQ2FsbGVyBQxyZXN0Q29udHJhY3QJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBCmtleUJsb2NrZWQABwcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYXN0VHhJZEJ5VXNlcgEJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFA25pbC0BaQENY29uc3RydWN0b3JWMQEIcmVzdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgUDbmlsAWkBC3NhdmVJbnRlZ2VyAgNrZXkGYW1vdW50AwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIgc2F2ZUludGVnZXIgaXMgbm90IHB1YmxpYyBtZXRob2QJAMwIAgkBDEludGVnZXJFbnRyeQIFA2tleQUGYW1vdW50BQNuaWwBaQEKc2V0QmxvY2tlZAEJaXNCbG9ja2VkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRcGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQprZXlCbG9ja2VkAAUJaXNCbG9ja2VkBQNuaWwBaQEJc3Rha2VMYW5kAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhxFeGFjdGx5IG9uZSBwYXltZW50IHJlcXVpcmVkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQHYXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBCQCsAgIJAKwCAgIETkZUIAUKTEFORFBSRUZJWAIkIHRva2VuIHNob3VsZCBiZSBhdHRhY2hlZCBhcyBwYXltZW50BAVhc3NldAkBBXZhbHVlAQkA7AcBBQdhc3NldElkAwkBAiE9AggFBWFzc2V0Bmlzc3VlcgUEdGhpcwkAAgECF1Vua25vd24gaXNzdWVyIG9mIHRva2VuAwkBASEBCQEIY29udGFpbnMCCAUFYXNzZXQEbmFtZQUKTEFORFBSRUZJWAkAAgEJAKwCAgkArAICAglPbmx5IE5GVCAFCkxBTkRQUkVGSVgCFCB0b2tlbnMgYXJlIGFjY2VwdGVkBAtsYW5kTnVtU2l6ZQkAsAICCAUFYXNzZXQEbmFtZQAEBAdsYW5kTnVtAwkBCGNvbnRhaW5zAgULbGFuZE51bVNpemUCA1hYTAkAswICBQtsYW5kTnVtU2l6ZQADAwkBCGNvbnRhaW5zAgULbGFuZE51bVNpemUCAlhMCQCzAgIFC2xhbmROdW1TaXplAAIJALMCAgULbGFuZE51bVNpemUAAQMJAQEhAQkBCWlzRGVmaW5lZAEJALYJAQUHbGFuZE51bQkAAgEJAKwCAgIeQ2Fubm90IHBhcnNlIGxhbmQgbnVtYmVyIGZyb20gCAUFYXNzZXQEbmFtZQQLbGFuZEFzc2V0SWQJANgEAQUHYXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAMJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCEiBpcyBhbHJlYWR5IHN0YWtlZAQBZAkAtQkCCAUFYXNzZXQLZGVzY3JpcHRpb24CAV8EDXRlcnJhaW5Db3VudHMJAQ1jb3VudFRlcnJhaW5zAQkAkQMCBQFkBQtyZWNUZXJyYWlucwQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCBQFkBQtyZWNMYW5kU2l6ZQQJbGFuZEluZGV4CQBpAgUGcGllY2VzBQVTU0laRQQFcHJvcHMJARF1cGRhdGVQcm9wb3J0aW9ucwMFDXRlcnJhaW5Db3VudHMFCWxhbmRJbmRleAABBAxyZXNCeUNvbnRLZXkJARZrZXlSZXNUeXBlc0J5Q29udGluZW50AQkAkQMCBQFkBQxyZWNDb250aW5lbnQECWNvbnRQcm9wcwkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFDHJlc0J5Q29udEtleQILMF8wXzBfMF8wXzACAV8EEHVwZGF0ZWRDb250UHJvcHMJALkJAgkBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwEBQljb250UHJvcHMFDXRlcnJhaW5Db3VudHMFCWxhbmRJbmRleAABAgFfBAhsYW5kc0tleQkBFWtleVN0YWtlZExhbmRzQnlPd25lcgEFB2FkZHJlc3MECGxhbmRzU3RyCQCiCAEFCGxhbmRzS2V5BAVsYW5kcwMJAQlpc0RlZmluZWQBBQhsYW5kc1N0cgkAvQkCCQEFdmFsdWUBBQhsYW5kc1N0cgIBXwUDbmlsAwkBD2NvbnRhaW5zRWxlbWVudAIFBWxhbmRzBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgIiWW91ciBzdGFrZWQgbGFuZHMgYWxyZWFkeSBjb250YWluIAULbGFuZEFzc2V0SWQDCQBnAgkAkAMBBQVsYW5kcwUYTUFYX0xBTkRTX1NUQUtFRF9CWV9VU0VSCQACAQkArAICCQCsAgICGVlvdXIgYWxyZWFkeSBzdGFrZWQgbWF4ICgJAKQDAQUYTUFYX0xBTkRTX1NUQUtFRF9CWV9VU0VSAgcpIGxhbmRzBAppbmZyYUxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQAAAQJcGllY2VzS2V5CQEWa2V5U3Rha2VkUGllY2VzQnlPd25lcgEFB2FkZHJlc3MECW9sZFBpZWNlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlwaWVjZXNLZXkAAAQJd2xnUmVzdWx0CQD8BwQFC3dsZ0NvbnRyYWN0AhJvblN0YWtlVW5zdGFrZUxhbmQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd0aW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpMQU5EUFJFRklYBQtsYW5kQXNzZXRJZAUHYWRkcmVzcwgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBC1N0cmluZ0VudHJ5AgUIbGFuZHNLZXkJALsJAgkAzQgCBQVsYW5kcwULbGFuZEFzc2V0SWQCAV8JAMwIAgkBDEludGVnZXJFbnRyeQIFCXBpZWNlc0tleQkAZAIFCW9sZFBpZWNlcwUGcGllY2VzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAUHYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5TGFuZE51bVRvT3duZXIBBQdsYW5kTnVtBQdhZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEea2V5SW5mcmFMZXZlbEJ5QXNzZXRJZEFuZE93bmVyAgULbGFuZEFzc2V0SWQFB2FkZHJlc3MFCmluZnJhTGV2ZWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleVJlc1Byb3BvcnRpb25zAAUFcHJvcHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUMcmVzQnlDb250S2V5BRB1cGRhdGVkQ29udFByb3BzBQNuaWwFDXByb2xvZ0FjdGlvbnMFCXdsZ1Jlc3VsdAFpAQt1bnN0YWtlTGFuZAENbGFuZEFzc2V0SWRJbgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQZjYWxsZXIEAWMJARRjaGVja0NsYWltQ29uZGl0aW9ucwMFBGFkZHIFDWNsYWltTW9kZUR1Y2sFDWxhbmRBc3NldElkSW4EC2xhbmRBc3NldElkCAUBYwJfMgQBZAgFAWMCXzMECGxhbmRzS2V5CQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUEYWRkcgQNdGVycmFpbkNvdW50cwkBDWNvdW50VGVycmFpbnMBCQCRAwIFAWQFC3JlY1RlcnJhaW5zBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIFAWQFC3JlY0xhbmRTaXplBAlsYW5kSW5kZXgJAGkCBQZwaWVjZXMFBVNTSVpFBAVwcm9wcwkBEXVwZGF0ZVByb3BvcnRpb25zAwUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AP///////////wEEDHJlc0J5Q29udEtleQkBFmtleVJlc1R5cGVzQnlDb250aW5lbnQBCQCRAwIFAWQFDHJlY0NvbnRpbmVudAQJY29udFByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUMcmVzQnlDb250S2V5AgswXzBfMF8wXzBfMAIBXwQQdXBkYXRlZENvbnRQcm9wcwkAuQkCCQEZdXBkYXRlUHJvcG9ydGlvbnNJbnRlcm5hbAQFCWNvbnRQcm9wcwUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AP///////////wECAV8EC2NsYWltUmVzdWx0CQEIY2xhaW1BbGwEBQRhZGRyBQtsYW5kQXNzZXRJZAUGcGllY2VzBQ1jbGFpbU1vZGVEdWNrBAVsYW5kcwkAvQkCCQELdmFsdWVPckVsc2UCCQCiCAEFCGxhbmRzS2V5AgACAV8EA2lkeAkAzwgCBQVsYW5kcwULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBBQNpZHgJAAIBCQCsAgICIFlvdXIgc3Rha2VkIGxhbmRzIGRvbid0IGNvbnRhaW4gBQtsYW5kQXNzZXRJZAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQOZ292UmVsZWFzZVRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgULZ292Q29udHJhY3QJARVrZXlVc2VyR3dsUmVsZWFzZVRpbWUBBQRhZGRyAAADCQBnAgUOZ292UmVsZWFzZVRpbWUFA25vdwkAAgEJAKwCAgI5WW91ciBnV0wgYXJlIHRha2luZyBwYXJ0IGluIHZvdGluZywgY2Fubm90IHVuc3Rha2UgdW50aWwgCQCkAwEFDmdvdlJlbGVhc2VUaW1lBA5hcmJSZWxlYXNlVGltZQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgULd2xnQ29udHJhY3QJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIAAAUOYXJiaXRyYWdlRGVsYXkDCQBmAgUOYXJiUmVsZWFzZVRpbWUFA25vdwkAAgEJAKwCAgI/WW91ciBzdGFrZWQgbGFuZHMgdG9vayBwYXJ0IGluIGFyYml0cmFnZSwgY2Fubm90IHVuc3Rha2UgdW50aWwgCQCkAwEFDmFyYlJlbGVhc2VUaW1lBAlwaWVjZXNLZXkJARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQUEYWRkcgQMc3Rha2VkUGllY2VzCQELdmFsdWVPckVsc2UCCQCfCAEFCXBpZWNlc0tleQAABAluZXdQaWVjZXMDCQBmAgUGcGllY2VzBQxzdGFrZWRQaWVjZXMAAAkAZQIFDHN0YWtlZFBpZWNlcwUGcGllY2VzBAl3bGdSZXN1bHQJAPwHBAULd2xnQ29udHJhY3QCEm9uU3Rha2VVbnN0YWtlTGFuZAkAzAgCBQRhZGRyBQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEJANkEAQULbGFuZEFzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkxBTkRQUkVGSVgFC2xhbmRBc3NldElkBQRhZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlSZXNQcm9wb3J0aW9ucwAFBXByb3BzCQDMCAIJAQtTdHJpbmdFbnRyeQIFDHJlc0J5Q29udEtleQUQdXBkYXRlZENvbnRQcm9wcwkAzAgCCQELU3RyaW5nRW50cnkCCAULY2xhaW1SZXN1bHQCXzIJALkJAggFC2NsYWltUmVzdWx0Al8zAgE6CQDMCAIDCQBmAgkAkAMBBQVsYW5kcwABCQELU3RyaW5nRW50cnkCBQhsYW5kc0tleQkAuwkCCQDRCAIFBWxhbmRzCQEFdmFsdWUBBQNpZHgCAV8JAQtEZWxldGVFbnRyeQEFCGxhbmRzS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlwaWVjZXNLZXkFCW5ld1BpZWNlcwUDbmlsBQ1wcm9sb2dBY3Rpb25zBQl3bGdSZXN1bHQBaQEJc3Rha2VEdWNrAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhxFeGFjdGx5IG9uZSBwYXltZW50IHJlcXVpcmVkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQHYXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBCQCsAgIJAKwCAgIETkZUIAUKRFVDS1BSRUZJWAIkIHRva2VuIHNob3VsZCBiZSBhdHRhY2hlZCBhcyBwYXltZW50BAVhc3NldAkBBXZhbHVlAQkA7AcBBQdhc3NldElkAwMJAQIhPQIIBQVhc3NldAZpc3N1ZXIFDWluY3ViYXRvckFkZHIJAQIhPQIIBQVhc3NldAZpc3N1ZXIFC2JyZWVkZXJBZGRyBwkAAgEJAKwCAgkArAICAhJVbmtub3duIGlzc3VlciBvZiAFCkRVQ0tQUkVGSVgCBiB0b2tlbgMJAQEhAQkBCGNvbnRhaW5zAggFBWFzc2V0BG5hbWUFCkRVQ0tQUkVGSVgJAAIBCQCsAgIJAKwCAgIJT25seSBORlQgBQpEVUNLUFJFRklYAhQgdG9rZW5zIGFyZSBhY2NlcHRlZAQKYXNzZXRJZFN0cgkA2AQBBQdhc3NldElkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFCmFzc2V0SWRTdHIDCQEJaXNEZWZpbmVkAQkAnwgBBQd0aW1lS2V5CQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAhIgaXMgYWxyZWFkeSBzdGFrZWQDCQEJaXNEZWZpbmVkAQkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQdhZGRyZXNzCQACAQkArAICAh1Zb3UgYWxyZWFkeSBzdGFrZWQgb25lIGR1Y2s6IAgFBWFzc2V0BG5hbWUEBmxvY0tleQkBD2tleUR1Y2tMb2NhdGlvbgEFCmFzc2V0SWRTdHIECGxvY2F0aW9uCQCiCAEFBmxvY0tleQQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFCmFzc2V0SWRTdHIECGJhY2twYWNrCQCiCAEFBWJwS2V5BAlrZXlIZWFsdGgJAQ1rZXlEdWNrSGVhbHRoAQUKYXNzZXRJZFN0cgQFbWF4SFAJAQltYXhIZWFsdGgBCQELdmFsdWVPckVsc2UCCQCfCAEJAQxrZXlEdWNrTGV2ZWwBBQphc3NldElkU3RyAAAECWN1ckhlYWx0aAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlIZWFsdGgFBW1heEhQCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkRVQ0tQUkVGSVgJANgEAQUHYXNzZXRJZAUHYWRkcmVzcwgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleUR1Y2tJZFRvT3duZXIBBQphc3NldElkU3RyBQdhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MFCmFzc2V0SWRTdHIFA25pbAMJAQlpc0RlZmluZWQBBQhsb2NhdGlvbgUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUGbG9jS2V5BQ9ERUZBVUxUTE9DQVRJT04FA25pbAMJAQlpc0RlZmluZWQBBQhiYWNrcGFjawUDbmlsCQDOCAIJAM0IAgkAzAgCCQELU3RyaW5nRW50cnkCBQVicEtleQIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoFA25pbAkBDEludGVnZXJFbnRyeQIFCWtleUhlYWx0aAUJY3VySGVhbHRoBQ1wcm9sb2dBY3Rpb25zAWkBC3Vuc3Rha2VEdWNrAQphc3NldElkU3RyBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAdhc3NldElkCQDZBAEFCmFzc2V0SWRTdHIEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAVhc3NldAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFCmFzc2V0SWRTdHIDCQEBIQEJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkAwkBASEBCQEJaXNEZWZpbmVkAQkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQdhZGRyZXNzCQACAQkArAICCQCsAgICCVRoZSBkdWNrIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARBrZXlEdWNrSWRUb093bmVyAQUKYXNzZXRJZFN0cgkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUHYWRkcmVzcwkAAgECF1N0YWtlZCBORlQgaXMgbm90IHlvdXJzAwkBD2NoZWNrVG91cm5hbWVudAEFCmFzc2V0SWRTdHIJAAIBAht1bnN0YWtlRHVja19jaGVja1RvdXJuYW1lbnQDCQENY2hlY2tEZWxpdmVyeQEFCmFzc2V0SWRTdHIJAAIBAhl1bnN0YWtlRHVja19jaGVja0RlbGl2ZXJ5BAlrZXlIZWFsdGgJAQ1rZXlEdWNrSGVhbHRoAQUKYXNzZXRJZFN0cgQFbWF4SFAJAQltYXhIZWFsdGgBCQELdmFsdWVPckVsc2UCCQCfCAEJAQxrZXlEdWNrTGV2ZWwBBQphc3NldElkU3RyAAAEBmhlYWx0aAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlIZWFsdGgFBW1heEhQAwkAZgIFBW1heEhQBQZoZWFsdGgJAAIBCQCsAgIJAKwCAgIZUGxlYXNlIGhlYWwgeW91ciBkdWNrIHRvIAkApAMBBQVtYXhIUAITaHAgYmVmb3JlIHVuc3Rha2luZwkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEFB3RpbWVLZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQUJa2V5SGVhbHRoCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ9rZXlEdWNrTG9jYXRpb24BBQphc3NldElkU3RyCQDMCAIJAQtEZWxldGVFbnRyeQEJARBrZXlEdWNrSWRUb093bmVyAQUKYXNzZXRJZFN0cgkAzAgCCQELRGVsZXRlRW50cnkBCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkRVQ0tQUkVGSVgFCmFzc2V0SWRTdHIFB2FkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwUDbmlsBQ1wcm9sb2dBY3Rpb25zAWkBCGNsYWltUmVzAgZhbW91bnQObGFuZEFzc2V0SWRTdHIEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBGFkZHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAZyZXN1bHQJARBjbGFpbVJlc0ludGVybmFsBAUEYWRkcgUGYW1vdW50BQ1jbGFpbU1vZGVEdWNrBQ5sYW5kQXNzZXRJZFN0cgQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkCQCUCgIJAM4IAgkAzQgCCQDNCAIJAM4IAggFBnJlc3VsdAJfMQgJARd1cGRhdGVEdWNrU3RhdHNJbnRlcm5hbAIFC2R1Y2tBc3NldElkCQBrAwUHeHBDbGFpbQUGYW1vdW50BQVNVUxUOAJfMQkBC1N0cmluZ0VudHJ5AggFBnJlc3VsdAJfMgkAuQkCCAUGcmVzdWx0Al8zAgE6CQELU3RyaW5nRW50cnkCCAUGcmVzdWx0Al80CQC5CQIIBQZyZXN1bHQCXzUCAToFDXByb2xvZ0FjdGlvbnMJAJEDAggFBnJlc3VsdAJfMwUIYnBJZHhSZXMBaQEMY2xhaW1SZXNUb1dIAgZhbW91bnQObGFuZEFzc2V0SWRTdHIEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBGFkZHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAZyZXN1bHQJARBjbGFpbVJlc0ludGVybmFsBAUEYWRkcgUGYW1vdW50BQtjbGFpbU1vZGVXaAUObGFuZEFzc2V0SWRTdHIJAJQKAgkAzggCCQDNCAIJAM0IAgkAzggCCAUGcmVzdWx0Al8xCAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCBQRhZGRyCQBrAwUHeHBDbGFpbQUGYW1vdW50BQVNVUxUOAJfMQkBC1N0cmluZ0VudHJ5AggFBnJlc3VsdAJfMgkAuQkCCAUGcmVzdWx0Al8zAgE6CQELU3RyaW5nRW50cnkCCAUGcmVzdWx0Al80CQC5CQIIBQZyZXN1bHQCXzUCAToFDXByb2xvZ0FjdGlvbnMJAJEDAggFBnJlc3VsdAJfNQUId2hJZHhSZXMBaQEGZmxpZ2h0AgdtZXNzYWdlA3NpZwQNcHJvbG9nQWN0aW9ucwkBDHByb2xvZ0ZsaWdodAEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQIdXNlckFkZHIJAKUIAQgFAWkGY2FsbGVyBAFmCQEMZmxpZ2h0Q29tbW9uAwUIdXNlckFkZHIFB21lc3NhZ2UFA3NpZwQFbmV3SFAIBQFmAl8xBAtkdWNrQXNzZXRJZAgFAWYCXzIEBmxvY0tleQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBBQZsb2NLZXkFD0RFRkFVTFRMT0NBVElPTgQLbmV3TG9jYXRpb24IBQFmAl80AwkAAAIFC25ld0xvY2F0aW9uBQtjdXJMb2NhdGlvbgkAAgECIllvdSBjYW4ndCBmbHkgdG8gdGhlIHNhbWUgbG9jYXRpb24EBm5ld0xvYwkAtQkCBQtuZXdMb2NhdGlvbgIBXwQGaXNUb3VyCQAAAgkAkQMCBQZuZXdMb2MFCmxvY0lkeFR5cGUCAVQEB2lzRGVsaXYJAAACCQCRAwIFBm5ld0xvYwUKbG9jSWR4VHlwZQIBRAQFZXFLZXkJARBrZXlEdWNrRXF1aXBtZW50AQULZHVja0Fzc2V0SWQECWN1cnJlbnRFcQkBC3ZhbHVlT3JFbHNlAgkAoggBBQVlcUtleQIXLDssXyw7LF8sOyxfLDssXyw7LF8sOywEDSR0MDczMTE4NzMyMTUJARFzdWJ0cmFjdEVxdWlwbWVudAIFCWN1cnJlbnRFcQgFAWYCXzUEBW5ld0VxCAUNJHQwNzMxMTg3MzIxNQJfMQQPc2hvdWxkWmVyb0J1ZmZzCAUNJHQwNzMxMTg3MzIxNQJfMgQNJHQwNzMyMTg3NjMzMAMJAQEhAQkBCW9uTWlzc2lvbgIFEnRvdXJuYW1lbnRDb250cmFjdAULY3VyTG9jYXRpb24DCQEBIQEJAQ9pc1VzdWFsTG9jYXRpb24BBQtuZXdMb2NhdGlvbgkBDGNoZWF0QXR0ZW1wdAMFC2N1ckxvY2F0aW9uBQtuZXdMb2NhdGlvbgAFAwkAZgIFBW5ld0hQAAAJAJQKAgULbmV3TG9jYXRpb24FBW5ld0hQCQCUCgIFC2N1ckxvY2F0aW9uAAADCQEOaXNJblRvdXJuYW1lbnQCBRJ0b3VybmFtZW50Q29udHJhY3QFC2N1ckxvY2F0aW9uAwkBASEBCQEOaXNJblRvdXJuYW1lbnQCBRJ0b3VybmFtZW50Q29udHJhY3QFC25ld0xvY2F0aW9uCQACAQIqWW91ciBkdWNrIGlzIHRha2luZyBwYXJ0IGluIHRoZSB0b3VybmFtZW50BAVzY29yZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBm5ld0xvYwUIbG9jSWR4SWQEBmN1ckxvYwkAtQkCBQtjdXJMb2NhdGlvbgIBXwQGbGFzdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEnRvdXJuYW1lbnRDb250cmFjdAUNbGFzdFRvdXJJZEtleQAAAwkBAiE9AgUFc2NvcmUJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGY3VyTG9jBQhsb2NJZHhJZAABCQEMY2hlYXRBdHRlbXB0AwULY3VyTG9jYXRpb24FC25ld0xvY2F0aW9uAAcDCQBmAgUFbmV3SFAAAAQJbG9jYWxCZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFEnRvdXJuYW1lbnRDb250cmFjdAkBGmtleUJlc3RSZXN1bHRCeVRvdXJBbmREdWNrAgUGbGFzdElkBQtkdWNrQXNzZXRJZAAABAh1cGRMb2NhbAMJAGYCBQVzY29yZQUJbG9jYWxCZXN0CQD8BwQFEnRvdXJuYW1lbnRDb250cmFjdAIOc2F2ZUR1Y2tSZXN1bHQJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUFc2NvcmUFA25pbAUDbmlsBQR1bml0AwkAAAIFCHVwZExvY2FsBQh1cGRMb2NhbAkAlAoCBQtuZXdMb2NhdGlvbgUFbmV3SFAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgULY3VyTG9jYXRpb24AAAMJAQEhAQkBDGlzSW5EZWxpdmVyeQEFC2N1ckxvY2F0aW9uBAhzYXZlZExvYwkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAhBhdXRvRXhpdERlbGl2ZXJ5CQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFBW5ld0hQCQDMCAIDBQdpc0RlbGl2AgIxMAICMTEJAMwIAgAABQNuaWwFA25pbAMJAAACBQhzYXZlZExvYwUIc2F2ZWRMb2MDBQdpc0RlbGl2CQCUCgIFCHNhdmVkTG9jBQVuZXdIUAMJAGYCBQVuZXdIUAAACQCUCgIFC25ld0xvY2F0aW9uBQVuZXdIUAkAlAoCBQhzYXZlZExvYwAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkBASEBBQdpc0RlbGl2CQACAQIkWW91ciBkdWNrIGlzIHRha2luZyBwYXJ0IGluIGRlbGl2ZXJ5AwkBASEBCQEMaXNJbkRlbGl2ZXJ5AQULbmV3TG9jYXRpb24JAQxjaGVhdEF0dGVtcHQDBQtjdXJMb2NhdGlvbgULbmV3TG9jYXRpb24ADQQFc2NvcmUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZuZXdMb2MFCGxvY0lkeElkBAZjdXJMb2MJALUJAgULY3VyTG9jYXRpb24CAV8DCQECIT0CBQVzY29yZQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZjdXJMb2MFCGxvY0lkeElkAAEJAQxjaGVhdEF0dGVtcHQDBQtjdXJMb2NhdGlvbgULbmV3TG9jYXRpb24ADgMDCQBmAgUFbmV3SFAAAAkAZgIAAQUFc2NvcmUHCQCUCgIFC25ld0xvY2F0aW9uBQVuZXdIUAQIc2F2ZWRMb2MJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIQYXV0b0V4aXREZWxpdmVyeQkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQVuZXdIUAkAzAgCAgUxNS0xNwkAzAgCBQVzY29yZQUDbmlsBQNuaWwDCQAAAgUIc2F2ZWRMb2MFCHNhdmVkTG9jCQCUCgIFCHNhdmVkTG9jBQVuZXdIUAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQJbG9jVG9TYXZlCAUNJHQwNzMyMTg3NjMzMAJfMQQIaHBUb1NhdmUIBQ0kdDA3MzIxODc2MzMwAl8yCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUGbG9jS2V5BQlsb2NUb1NhdmUJAMwIAgkBC1N0cmluZ0VudHJ5AgUFZXFLZXkFBW5ld0VxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBQhocFRvU2F2ZQUDbmlsBQ1wcm9sb2dBY3Rpb25zAwUPc2hvdWxkWmVyb0J1ZmZzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlEdWNrQnVmZnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wBQNuaWwFA25pbAgJARd1cGRhdGVEdWNrU3RhdHNJbnRlcm5hbAIFC2R1Y2tBc3NldElkAwkAZgIFBW5ld0hQAAAFD3hwU3VjY2Vzc0ZsaWdodAUMeHBGYWlsRmxpZ2h0Al8xCAUBZgJfMwFpAQRoZWFsAwpxdWFudGl0eUwxCnF1YW50aXR5TDIKcXVhbnRpdHlMMwQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDAwMJAGYCAAAFCnF1YW50aXR5TDEGCQBmAgAABQpxdWFudGl0eUwyBgkAZgIAAAUKcXVhbnRpdHlMMwkAAgECG1F1YW50aXR5IGNhbm5vdCBiZSBuZWdhdGl2ZQQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQ9jaGVja1RvdXJuYW1lbnQBBQtkdWNrQXNzZXRJZAkAAgECFGhlYWxfY2hlY2tUb3VybmFtZW50AwkBDWNoZWNrRGVsaXZlcnkBBQtkdWNrQXNzZXRJZAkAAgECEmhlYWxfY2hlY2tEZWxpdmVyeQQDcXRzCQDMCAIFCnF1YW50aXR5TDEJAMwIAgUKcXVhbnRpdHlMMgkAzAgCBQpxdWFudGl0eUwzBQNuaWwECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAQFbWF4SFAJAQltYXhIZWFsdGgBCQELdmFsdWVPckVsc2UCCQCfCAEJAQxrZXlEdWNrTGV2ZWwBBQtkdWNrQXNzZXRJZAAABAlvbGRIZWFsdGgJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJa2V5SGVhbHRoBQVtYXhIUAMJAGcCBQlvbGRIZWFsdGgFBW1heEhQCQACAQkArAICCQCsAgICD0hQIHNob3VsZCBiZSA8IAkApAMBBQVtYXhIUAIIIHRvIGhlYWwEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAhwcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwoBC2l0ZXJhdGVQcm9kAgNhY2MGcmVjaXBlBAFuCAUDYWNjAl8yBAF4AwkAZgIJAJADAQUIcHJvZExpc3QFAW4JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhwcm9kTGlzdAUBbgAAAwkAZgIAAwUBbgQBcQkAkQMCBQNxdHMFAW4DCQBmAgUBcQUBeAkAAgEJAKwCAgkArAICCQCsAgICDllvdSBoYXZlIG9ubHkgCQCkAwEFAXgCBCBvZiAJAJEDAgUJcHJvZFR5cGVzBQFuCQCVCgMJAM0IAggFA2FjYwJfMQkApAMBCQBlAgUBeAUBcQkAZAIFAW4AAQkAZAIIBQNhY2MCXzMJAGgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCBQZyZWNpcGUCAV8FCnJJZHhFZmZlY3QFAXEJAJUKAwkAzQgCCAUDYWNjAl8xCQCkAwEFAXgJAGQCBQFuAAEIBQNhY2MCXzMEBnJlc3VsdAoAAiRsBRBwcm9kdWN0aW9uTWF0cml4CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQtpdGVyYXRlUHJvZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyBAluZXdIZWFsdGgJAJcDAQkAzAgCBQVtYXhIUAkAzAgCCQBkAgUJb2xkSGVhbHRoCAUGcmVzdWx0Al8zBQNuaWwJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleUhlYWx0aAUJbmV3SGVhbHRoCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWJwS2V5CQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCCQC5CQIIBQZyZXN1bHQCXzECAV8FA25pbAIBOgUDbmlsBQ1wcm9sb2dBY3Rpb25zCAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQJAGgCBQZ4cEhlYWwJAGQCCQBkAgUKcXVhbnRpdHlMMQUKcXVhbnRpdHlMMgUKcXVhbnRpdHlMMwJfMQUJbmV3SGVhbHRoAWkBBmhlYWxFUwAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIcRXhhY3RseSBvbmUgcGF5bWVudCByZXF1aXJlZAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQIaQWxsb3dlZCBVU0RUIHBheW1lbnQgb25seSEEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQEPY2hlY2tUb3VybmFtZW50AQULZHVja0Fzc2V0SWQJAAIBAhZoZWFsRVNfY2hlY2tUb3VybmFtZW50AwkBDWNoZWNrRGVsaXZlcnkBBQtkdWNrQXNzZXRJZAkAAgECFGhlYWxFU19jaGVja0RlbGl2ZXJ5BAlrZXlIZWFsdGgJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQEBW1heEhQCQEJbWF4SGVhbHRoAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEMa2V5RHVja0xldmVsAQULZHVja0Fzc2V0SWQAAAQJb2xkSGVhbHRoCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aAUFbWF4SFADCQBmAgUJb2xkSGVhbHRoAAAJAAIBAihIUCBzaG91bGQgYmUgMCB0byBjYWxsIEVtZXJnZW5jeSBTZXJ2aWNlBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQIcHJvZExpc3QDCQAAAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgAFA25pbAkAvAkCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAV8EDW1lZEtpdEFtb3VudDEDCQBmAgkAkAMBBQhwcm9kTGlzdAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvZExpc3QAAAAABA1tZWRLaXRBbW91bnQyAwkAZgIJAJADAQUIcHJvZExpc3QAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCHByb2RMaXN0AAEAAAQNbWVkS2l0QW1vdW50MwMJAGYCCQCQAwEFCHByb2RMaXN0AAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhwcm9kTGlzdAACAAADAwMJAGYCBQ1tZWRLaXRBbW91bnQxAAAGCQBmAgUNbWVkS2l0QW1vdW50MgAABgkAZgIFDW1lZEtpdEFtb3VudDMAAAkAAgECH1lvdSBoYXZlIHRvIHVzZSBvd24gTWVkaWNhbCBLaXQECGV4aXN0U3RyCQCdCAIFD2Vjb25vbXlDb250cmFjdAkBDmtleUVzV2FyZWhvdXNlAAQMZXhpc3RBbW91bnRzAwkBCWlzRGVmaW5lZAEFCGV4aXN0U3RyCQC8CQIJAQV2YWx1ZQEFCGV4aXN0U3RyAgFfBQNuaWwEC2V4aXN0QW1vdW50AwkAZgIJAJADAQUMZXhpc3RBbW91bnRzAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxleGlzdEFtb3VudHMAAAAAAwkAZwIAAAULZXhpc3RBbW91bnQJAAIBAjlUaGVyZSBhcmUgbm8gTWVkaWNhbCBLaXRzIEwxIGF0IEVtZXJnZW5jeSBTZXJ2aWNlIHN0b3JhZ2UECW5ld0hlYWx0aAkAZAIFCW9sZEhlYWx0aAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4AAACAV8FCnJJZHhFZmZlY3QEBW5ld0VTCQC5CQIJAMwIAgkApAMBCQBlAgULZXhpc3RBbW91bnQAAQkA0QgCBQxleGlzdEFtb3VudHMAAAIBXwQGcmVjaXBlCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAAAAgFfBAh0b3RhbE1hdAkBEmdldFJlY2lwZU1hdGVyaWFscwEFBnJlY2lwZQQJc2VsbFByaWNlCQBrAwkAaAIFCHRvdGFsTWF0BQpFU1NFTExDT0VGBRBSRVNPVVJDRVBSSUNFTUlOCQBoAgUFTVVMVDgFDlBST0RVQ1RQS0dTSVpFAwkBAiE9AggFA3BtdAZhbW91bnQFCXNlbGxQcmljZQkAAgEJAKwCAgIbUGF5bWVudCBhdHRhY2hlZCBzaG91bGQgYmUgCQCkAwEFCXNlbGxQcmljZQQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD2Vjb25vbXlDb250cmFjdAIPdXBkYXRlRXNTdG9yYWdlCQDMCAIFBW5ld0VTBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3VzZHRBc3NldElkBQlzZWxsUHJpY2UFA25pbAkAlAoCCQDOCAIJAM0IAgUNcHJvbG9nQWN0aW9ucwkBDEludGVnZXJFbnRyeQIFCWtleUhlYWx0aAUJbmV3SGVhbHRoCAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQFCHhwQ2FsbEVTAl8xBQZyZXN1bHQBaQEOdXBkYXRlQmFja3BhY2sCC2R1Y2tBc3NldElkB25ld1BhY2sDCQECIT0CCAUBaQZjYWxsZXIFD2Vjb25vbXlDb250cmFjdAkAAgECEXBlcm1pc3Npb24gZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQFB25ld1BhY2sFA25pbAUHbmV3UGFjawFpAQ9jb21taXRGb3JSYW5kb20ABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQQLZmluaXNoQmxvY2sJAGQCBQZoZWlnaHQFC3JhbmRvbURlbGF5BARhZGRyCQClCAEIBQFpBmNhbGxlcgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlDb21taXQBBQRhZGRyBQtmaW5pc2hCbG9jawUDbmlsBQ1wcm9sb2dBY3Rpb25zBQtmaW5pc2hCbG9jawFpAQhidXlTTGFuZAAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIcRXhhY3RseSBvbmUgcGF5bWVudCByZXF1aXJlZAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQIaQWxsb3dlZCBVU0RUIHBheW1lbnQgb25seSEDCQECIT0CCAUDcG10BmFtb3VudAUHRVhQVVNEVAkAAgEJAKwCAgIbUGF5bWVudCBhdHRhY2hlZCBzaG91bGQgYmUgCQCkAwEFB0VYUFVTRFQEBnJlc3VsdAkBEmV4cGVkaXRpb25JbnRlcm5hbAIIBQFpBmNhbGxlcggFAWkNdHJhbnNhY3Rpb25JZAQLYWNyZXNSZXN1bHQJAQVhc0ludAEJAPwHBAUNYWNyZXNDb250cmFjdAIJYnVybkFjcmVzCQDMCAIFDFNfQ09TVF9BQ1JFUwUDbmlsBQNuaWwJAJQKAgkAzggCCQDOCAIJAM0IAggFBnJlc3VsdAJfMQkBDlNjcmlwdFRyYW5zZmVyAwUPZWNvbm9teUNvbnRyYWN0CAUDcG10BmFtb3VudAULdXNkdEFzc2V0SWQICQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIJAKUIAQgFAWkGY2FsbGVyBQp4cE5ld1NMYW5kAl8xBQ1wcm9sb2dBY3Rpb25zCQCUCgIICAUGcmVzdWx0Al8yAl8xBQthY3Jlc1Jlc3VsdAFpAQpleHBlZGl0aW9uAgdtZXNzYWdlA3NpZwQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQIdXNlckFkZHIJAKUIAQgFAWkGY2FsbGVyBAFmCQEMZmxpZ2h0Q29tbW9uAwUIdXNlckFkZHIFB21lc3NhZ2UFA3NpZwQLZHVja0Fzc2V0SWQIBQFmAl8yBAlrZXlIZWFsdGgJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAVtTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQGbmV3TWF0CQC5CQIJARFzdWJ0cmFjdE1hdGVyaWFscwMGBQVtTGlzdAUMRVhQTUFURVJJQUxTAgFfBAVlcUtleQkBEGtleUR1Y2tFcXVpcG1lbnQBBQtkdWNrQXNzZXRJZAQJY3VycmVudEVxCQELdmFsdWVPckVsc2UCCQCiCAEFBWVxS2V5AhcsOyxfLDssXyw7LF8sOyxfLDssXyw7LAQNJHQwODM3NzA4Mzg2NwkBEXN1YnRyYWN0RXF1aXBtZW50AgUJY3VycmVudEVxCAUBZgJfNQQFbmV3RXEIBQ0kdDA4Mzc3MDgzODY3Al8xBA9zaG91bGRaZXJvQnVmZnMIBQ0kdDA4Mzc3MDgzODY3Al8yBAFlCQESZXhwZWRpdGlvbkludGVybmFsAggFAWkGY2FsbGVyCAUBaQ10cmFuc2FjdGlvbklkBAJpZAgIBQFlAl8yAl8xBAZyZXN1bHQDCQBnAgAACAUBZgJfMQkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrZXlIZWFsdGgAAAkAzAgCCQELU3RyaW5nRW50cnkCBQVlcUtleQUFbmV3RXEFA25pbAIAAAAJAJUKAwkAzggCCAUBZQJfMQMFD3Nob3VsZFplcm9CdWZmcwkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RHVja0J1ZmZzAQULZHVja0Fzc2V0SWQCCTBfMF8wXzBfMAUDbmlsCQDNCAIJAM0IAgkAzQgCCQDNCAIFA25pbAkBC1N0cmluZ0VudHJ5AgkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkCQC5CQIJAMwIAggIBQFlAl8yAl8yCQDMCAICAUwJAMwIAgUCaWQFA25pbAIBXwkBDEludGVnZXJFbnRyeQIFCWtleUhlYWx0aAgFAWYCXzEJAQtTdHJpbmdFbnRyeQIFBWVxS2V5BQVuZXdFcQkBC1N0cmluZ0VudHJ5AgUFYnBLZXkJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIFBm5ld01hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgUCaWQIBQFmAl8zAwkBD2NoZWNrVG91cm5hbWVudAEFC2R1Y2tBc3NldElkCQACAQIaZXhwZWRpdGlvbl9jaGVja1RvdXJuYW1lbnQDCQENY2hlY2tEZWxpdmVyeQEFC2R1Y2tBc3NldElkCQACAQIYZXhwZWRpdGlvbl9jaGVja0RlbGl2ZXJ5BAthY3Jlc1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ1hY3Jlc0NvbnRyYWN0AglidXJuQWNyZXMJAMwIAgUMU19DT1NUX0FDUkVTBQNuaWwFA25pbAkAlAoCCQDOCAIJAM4IAggFBnJlc3VsdAJfMQgJARd1cGRhdGVEdWNrU3RhdHNJbnRlcm5hbAIFC2R1Y2tBc3NldElkBQp4cE5ld1NMYW5kAl8xBQ1wcm9sb2dBY3Rpb25zCQCVCgMIBQZyZXN1bHQCXzIIBQZyZXN1bHQCXzMFC2FjcmVzUmVzdWx0AWkBEGJ1eVNMYW5kRm9yQWNyZXMABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAUMYWNyZXNBc3NldElkCQACAQIUQUNSRVMgcGF5bWVudHMgb25seSEDCQECIT0CBQNhbXQFDFNfQ09TVF9BQ1JFUwkAAgEJAKwCAgIbUGF5bWVudCBhdHRhY2hlZCBzaG91bGQgYmUgCQCkAwEFDFNfQ09TVF9BQ1JFUwQGcmVzdWx0CQESZXhwZWRpdGlvbkludGVybmFsAggFAWkGY2FsbGVyCAUBaQ10cmFuc2FjdGlvbklkBAthY3Jlc1Jlc3VsdAkBBWFzSW50AQkA/AcEBQ1hY3Jlc0NvbnRyYWN0AglidXJuQWNyZXMJAMwIAgUMU19DT1NUX0FDUkVTBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDGFjcmVzQXNzZXRJZAUDYW10BQNuaWwJAJQKAgkAzggCCQDOCAIIBQZyZXN1bHQCXzEICQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIJAKUIAQgFAWkGY2FsbGVyBQp4cE5ld1NMYW5kAl8xBQ1wcm9sb2dBY3Rpb25zCQCUCgIICAUGcmVzdWx0Al8yAl8xBQthY3Jlc1Jlc3VsdAFpAQx1cGdyYWRlSW5mcmEBC2xhbmRBc3NldElkBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAZyZXN1bHQJAQ11cEluZnJhQ29tbW9uBAYIBQFpBmNhbGxlcgAABQtsYW5kQXNzZXRJZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAkAlAoCCQDOCAIJAM4IAggFBnJlc3VsdAJfMQUNcHJvbG9nQWN0aW9ucwgJARd1cGRhdGVEdWNrU3RhdHNJbnRlcm5hbAIFC2R1Y2tBc3NldElkCQBrAwUOeHBVcGdyYWRlSW5mcmEIBQZyZXN1bHQCXzMFBU1VTFQ4Al8xCAUGcmVzdWx0Al8yAWkBEGFjdGl2YXRlQXJ0aWZhY3QCB2FydE5hbWUObGFuZEFzc2V0SWRPcHQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAZyZXN1bHQEByRtYXRjaDAFB2FydE5hbWUDCQAAAgIHUFJFU0FMRQUHJG1hdGNoMAkBEmFjdGl2YXRlUHJlc2FsZUFydAIFBGFkZHIFDmxhbmRBc3NldElkT3B0AwkAAAICB09OQk9BUkQFByRtYXRjaDAJARJhY3RpdmF0ZU9uYm9hcmRBcnQBBQRhZGRyCQACAQIQVW5rbm93biBhcnRpZmFjdAkAzggCBQZyZXN1bHQFDXByb2xvZ0FjdGlvbnMBaQEKbWVyZ2VMYW5kcwEMbGFuZEFzc2V0SWRzBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAZyZXN1bHQJAQttZXJnZUNvbW1vbgIJAKUIAQgFAWkGY2FsbGVyBQxsYW5kQXNzZXRJZHMJAJQKAgkAzggCCQDOCAIIBQZyZXN1bHQCXzEFDXByb2xvZ0FjdGlvbnMICQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIJAKUIAQgFAWkGY2FsbGVyBQd4cE1lcmdlAl8xCAUGcmVzdWx0Al8yAWkBDWNhcmdvRXhjaGFuZ2UCDGNhcmdvTGlzdFN0cgtsYW5kQXNzZXRJZAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQKY2FyZ29QYXJ0cwkAvAkCBQxjYXJnb0xpc3RTdHICAToEBGFkZHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAnwgBBQd0aW1lS2V5CQACAQkArAICCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAlsYW5kSW5kZXgJAGkCCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwULcmVjTGFuZFNpemUFBVNTSVpFBAppbmZyYUxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQAAAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgQDbG9jCQC1CQIJAQV2YWx1ZQEFC2N1ckxvY2F0aW9uAgFfAwkBAiE9AgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUwJAAIBCQCsAgIJAKwCAgIWRHVjayBsb2NhdGlvbiB0eXBlIGlzIAkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCESwgYnV0IHNob3VsZCBiZSBMAwkBAiE9AgkAkQMCBQNsb2MFCGxvY0lkeElkBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgIbRHVjayBzaG91bGQgYmUgb24gdGhlIGxhbmQgBQtsYW5kQXNzZXRJZAQFd2hLZXkJARJrZXlXYXJlaG91c2VCeUxhbmQBBQtsYW5kQXNzZXRJZAQJY3VycmVudFdoCQEMZ2V0V2FyZWhvdXNlAwUFd2hLZXkFCWxhbmRJbmRleAUKaW5mcmFMZXZlbAQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkEBnJlc3VsdAkBCW1vdmVTdHVmZgMFCmNhcmdvUGFydHMFCWN1cnJlbnRXaAULY3VycmVudFBhY2sEBGxvZnQJALUJAgkAkQMCBQljdXJyZW50V2gFCXdoSWR4TE9GVAIBXwQFbG9mdE8JAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAULdm9sT2NjdXBpZWQIBQZyZXN1bHQCXzcEBWxvZnRGCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFB3ZvbEZyZWUIBQZyZXN1bHQCXzcJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQVicEtleQkAugkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAggFBnJlc3VsdAJfNAkAzAgCCAUGcmVzdWx0Al81CQDMCAIIBQZyZXN1bHQCXzYFA25pbAIBOgkAzAgCCQELU3RyaW5nRW50cnkCBQV3aEtleQkAugkCCQDMCAIJAJEDAgUJY3VycmVudFdoBQt3aElkeExldmVscwkAzAgCCAUGcmVzdWx0Al8xCQDMCAIIBQZyZXN1bHQCXzIJAMwIAggFBnJlc3VsdAJfMwkAzAgCCQC5CQIJAMwIAgkAkQMCBQRsb2Z0BQl2b2xMb2NrZWQJAMwIAgkApAMBBQVsb2Z0TwkAzAgCCQCkAwEFBWxvZnRGCQDMCAIJAJEDAgUEbG9mdAUIdm9sVG90YWwFA25pbAIBXwUDbmlsAgE6BQNuaWwFDXByb2xvZ0FjdGlvbnMBaQENc2F2ZVdhcmVob3VzZQIFd2hTdHILbGFuZEFzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFD2Vjb25vbXlDb250cmFjdAkAAgECDUFjY2VzcyBkZW5pZWQEBXdoS2V5CQESa2V5V2FyZWhvdXNlQnlMYW5kAQULbGFuZEFzc2V0SWQEAndoCQC8CQIFBXdoU3RyAgE6AwkBAiE9AgkAkAMBBQJ3aAAFCQACAQIwd2FyZWhvdXNlIHN0cmluZyBzaG91bGQgY29udGFpbiA0ICc6JyBzZXBhcmF0b3JzBAVsb2Z0TAkAkQMCCQC1CQIJAJEDAgUCd2gFCXdoSWR4TE9GVAIBXwUJdm9sTG9ja2VkBAVsb2Z0TwkBF2dldFdhcmVob3VzZU9jY3VwaWVkVm9sAQUCd2gEBWxvZnRUCQEXZ2V0V2FyZWhvdXNlVG90YWxWb2x1bWUBCQCRAwIFAndoBQt3aElkeExldmVscwQFbG9mdEYJAGUCCQBlAgUFbG9mdFQJAQ1wYXJzZUludFZhbHVlAQUFbG9mdEwFBWxvZnRPAwkAZgIAAAUFbG9mdEYJAAIBAjBPcGVyYXRpb24gbGVhZHMgdG8gbmVnYXRpdmUgZnJlZSB3YXJlaG91c2Ugc3BhY2UECG5ld1doU3RyCQC6CQIJAMwIAgkAkQMCBQJ3aAULd2hJZHhMZXZlbHMJAMwIAgkAkQMCBQJ3aAUId2hJZHhSZXMJAMwIAgkAkQMCBQJ3aAUId2hJZHhNYXQJAMwIAgkAkQMCBQJ3aAUJd2hJZHhQcm9kCQDMCAIJALkJAgkAzAgCBQVsb2Z0TAkAzAgCCQCkAwEFBWxvZnRPCQDMCAIJAKQDAQUFbG9mdEYJAMwIAgkApAMBBQVsb2Z0VAUDbmlsAgFfBQNuaWwCAToJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQV3aEtleQUIbmV3V2hTdHIFA25pbAUIbmV3V2hTdHIBaQENc2V0Q3VzdG9tTmFtZQMHYXNzZXRJZApjdXN0b21OYW1lBHR5cGUEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIcRXhhY3RseSBvbmUgcGF5bWVudCByZXF1aXJlZAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCAUDcG10B2Fzc2V0SWQFC3VzZHRBc3NldElkCQACAQIaQWxsb3dlZCBVU0RUIHBheW1lbnQgb25seSEDCQECIT0CCAUDcG10BmFtb3VudAUMUkVOQU1JTkdDT1NUCQACAQkArAICAhJQYXltZW50IHNob3VsZCBiZSAJAKQDAQUMUkVOQU1JTkdDT1NUAwkBCGNvbnRhaW5zAgUKY3VzdG9tTmFtZQICX18JAAIBCQCsAgICHk5hbWUgc2hvdWxkIG5vdCBjb250YWluICdfXyc6IAUKY3VzdG9tTmFtZQMJAGYCCQCxAgEFCmN1c3RvbU5hbWUFCk1BWE5BTUVMRU4JAAIBCQCsAgICGU5hbWUgdG9vIGxvbmcsIG1heExlbmd0aD0JAKQDAQUKTUFYTkFNRUxFTgQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEB2FjdGlvbnMEByRtYXRjaDAFBHR5cGUDCQAAAgIHQUNDT1VOVAUHJG1hdGNoMAQKcmV2ZXJzZUtleQkBFmtleUN1c3RvbU5hbWVUb0FkZHJlc3MBBQpjdXN0b21OYW1lBAluYW1lT3duZXIJAKIIAQUKcmV2ZXJzZUtleQMJAQlpc0RlZmluZWQBBQluYW1lT3duZXIJAAIBCQCsAgICGU5hbWUgYWxyZWFkeSByZWdpc3RlcmVkOiAFCmN1c3RvbU5hbWUEDWFkZHJUb05hbWVLZXkJARZrZXlBZGRyZXNzVG9DdXN0b21OYW1lAQUEYWRkcgQHb2xkTmFtZQkAoggBBQ1hZGRyVG9OYW1lS2V5BAdmcmVlT2xkAwkBCWlzRGVmaW5lZAEFB29sZE5hbWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFmtleUN1c3RvbU5hbWVUb0FkZHJlc3MBCQEFdmFsdWUBBQdvbGROYW1lBQNuaWwFA25pbAkAzggCCQDNCAIJAM0IAgUHZnJlZU9sZAkBC1N0cmluZ0VudHJ5AgUNYWRkclRvTmFtZUtleQUKY3VzdG9tTmFtZQkBC1N0cmluZ0VudHJ5AgUKcmV2ZXJzZUtleQUEYWRkcggJARZ1cGRhdGVBY2NTdGF0c0ludGVybmFsAgUEYWRkcgUMeHBDdXN0b21OYW1lAl8xAwkAAAICBExBTkQFByRtYXRjaDAEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUHYXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAnwgBBQd0aW1lS2V5CQACAQkArAICCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFB2Fzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFBGFkZHIJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMECnJldmVyc2VLZXkJARprZXlMYW5kQ3VzdG9tTmFtZVRvQXNzZXRJZAEFCmN1c3RvbU5hbWUECW5hbWVPd25lcgkAoggBBQpyZXZlcnNlS2V5AwkBCWlzRGVmaW5lZAEFCW5hbWVPd25lcgkAAgEJAKwCAgIZTmFtZSBhbHJlYWR5IHJlZ2lzdGVyZWQ6IAUKY3VzdG9tTmFtZQQOYXNzZXRUb05hbWVLZXkJARprZXlMYW5kQXNzZXRJZFRvQ3VzdG9tTmFtZQEFB2Fzc2V0SWQEB29sZE5hbWUJAKIIAQUOYXNzZXRUb05hbWVLZXkEB2ZyZWVPbGQDCQEJaXNEZWZpbmVkAQUHb2xkTmFtZQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5TGFuZEN1c3RvbU5hbWVUb0Fzc2V0SWQBCQEFdmFsdWUBBQdvbGROYW1lBQNuaWwFA25pbAkAzggCCQDNCAIJAM0IAgUHZnJlZU9sZAkBC1N0cmluZ0VudHJ5AgUOYXNzZXRUb05hbWVLZXkFCmN1c3RvbU5hbWUJAQtTdHJpbmdFbnRyeQIFCnJldmVyc2VLZXkFB2Fzc2V0SWQICQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIFBGFkZHIFDHhwQ3VzdG9tTmFtZQJfMQMJAAACAgREVUNLBQckbWF0Y2gwBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFB2Fzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUHYXNzZXRJZAMDCQEBIQEJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkGCQEBIQEJAQlpc0RlZmluZWQBCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHIJAAIBCQCsAgIIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEQa2V5RHVja0lkVG9Pd25lcgEFB2Fzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFBGFkZHIJAAIBCQCsAgIFCkRVQ0tQUkVGSVgCDSBpcyBub3QgeW91cnMECnJldmVyc2VLZXkJARprZXlEdWNrQ3VzdG9tTmFtZVRvQXNzZXRJZAEFCmN1c3RvbU5hbWUECW5hbWVPd25lcgkAoggBBQpyZXZlcnNlS2V5AwkBCWlzRGVmaW5lZAEFCW5hbWVPd25lcgkAAgEJAKwCAgIZTmFtZSBhbHJlYWR5IHJlZ2lzdGVyZWQ6IAUKY3VzdG9tTmFtZQQOYXNzZXRUb05hbWVLZXkJARprZXlEdWNrQXNzZXRJZFRvQ3VzdG9tTmFtZQEFB2Fzc2V0SWQEB29sZE5hbWUJAKIIAQUOYXNzZXRUb05hbWVLZXkEB2ZyZWVPbGQDCQEJaXNEZWZpbmVkAQUHb2xkTmFtZQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5RHVja0N1c3RvbU5hbWVUb0Fzc2V0SWQBCQEFdmFsdWUBBQdvbGROYW1lBQNuaWwFA25pbAkAzggCCQDNCAIJAM0IAgUHZnJlZU9sZAkBC1N0cmluZ0VudHJ5AgUOYXNzZXRUb05hbWVLZXkFCmN1c3RvbU5hbWUJAQtTdHJpbmdFbnRyeQIFCnJldmVyc2VLZXkFB2Fzc2V0SWQICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQdhc3NldElkBQx4cEN1c3RvbU5hbWUCXzEJAAIBAhNVbmtub3duIGVudGl0eSB0eXBlCQCUCgIJAM4IAgkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDBQ9lY29ub215Q29udHJhY3QIBQNwbXQGYW1vdW50BQt1c2R0QXNzZXRJZAUNcHJvbG9nQWN0aW9ucwAAAWkBDHNldFJlZmVycmFscwIJb2xkUGxheWVyCW5ld1BsYXllcgMJAQIhPQIIBQFpD2NhbGxlclB1YmxpY0tleQUDcHViCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFCW9sZFBsYXllcgkAAgEJAKwCAgIRSW52YWxpZCBhZGRyZXNzOiAFCW9sZFBsYXllcgMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUJbmV3UGxheWVyCQACAQkArAICAhFJbnZhbGlkIGFkZHJlc3M6IAUJbmV3UGxheWVyBAdvbGRzS2V5CQEJa2V5T2xkaWVzAAQEb2xkcwkAoggBBQdvbGRzS2V5BAZvbGRpZXMDCQEJaXNEZWZpbmVkAQUEb2xkcwkAvAkCCQEFdmFsdWUBBQRvbGRzAgFfBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUGb2xkaWVzBQluZXdQbGF5ZXIJAAIBCQCsAgIFCW5ld1BsYXllcgImIGlzIG5vdCBuZXdiaWUgKGFscmVhZHkgaGFzIHJlZmVycmFscykECHJlZkJ5S2V5CQEPa2V5QWRkcmVzc1JlZkJ5AQUJbmV3UGxheWVyBAVyZWZCeQkAoggBBQhyZWZCeUtleQMDCQEJaXNEZWZpbmVkAQUFcmVmQnkJAQlpc0RlZmluZWQBCQCmCAEJAQV2YWx1ZQEFBXJlZkJ5BwkAAgEJAKwCAgkArAICBQluZXdQbGF5ZXICFCBhbHJlYWR5IGhhcyByZWZCeTogCQEFdmFsdWUBBQVyZWZCeQQHcmVmc0tleQkBE2tleUFkZHJlc3NSZWZlcnJhbHMBBQlvbGRQbGF5ZXIEBHJlZnMJAKIIAQUHcmVmc0tleQQJcmVmc0FycmF5AwkBCWlzRGVmaW5lZAEFBHJlZnMJALwJAgkBBXZhbHVlAQUEcmVmcwIBXwUDbmlsAwkBD2NvbnRhaW5zRWxlbWVudAIFCXJlZnNBcnJheQUJbmV3UGxheWVyCQACAQkArAICCQCsAgIJAKwCAgUJb2xkUGxheWVyAhIgYWxyZWFkeSBjb250YWlucyAFCW5ld1BsYXllcgIRIHdpdGhpbiByZWZlcnJhbHMEB25ld1JlZnMJALoJAgkAzQgCBQlyZWZzQXJyYXkFCW5ld1BsYXllcgIBXwQHbmV3T2xkcwMJAQ9jb250YWluc0VsZW1lbnQCBQZvbGRpZXMFCW9sZFBsYXllcgkBBXZhbHVlAQUEb2xkcwkAugkCCQDNCAIFBm9sZGllcwUJb2xkUGxheWVyAgFfCQCUCgIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQhyZWZCeUtleQUJb2xkUGxheWVyCQDMCAIJAQtTdHJpbmdFbnRyeQIFB3JlZnNLZXkFB25ld1JlZnMJAMwIAgkBC1N0cmluZ0VudHJ5AgUHb2xkc0tleQUHbmV3T2xkcwUDbmlsBQ1wcm9sb2dBY3Rpb25zAAABaQEQZGlzdHJpYnV0ZVBvaW50cwUIc3RyZW5ndGgIYWNjdXJhY3kJaW50ZWxsZWN0CWVuZHVyYW5jZQlkZXh0ZXJpdHkEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBGFkZHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAt2aXJ0V2xnRGF0YQkBCWFzQW55TGlzdAEJAPwHBAULd2xnQ29udHJhY3QCEmNoZWNrV2xnWHBSRUFET05MWQkAzAgCBQRhZGRyBQNuaWwFA25pbAQNdmlydFdsZ1BvaW50cwkBBWFzSW50AQkAkQMCBQt2aXJ0V2xnRGF0YQABBA0kdDA5OTQ4Nzk5ODc3AwkAZwIAAAUNdmlydFdsZ1BvaW50cwkAlAoCAAAFA25pbAQHZGVsdGFYUAkBBWFzSW50AQkA/AcEBQt3bGdDb250cmFjdAIJdGFrZVdsZ1hwCQDMCAIFBGFkZHIFA25pbAUDbmlsAwkAAAIFB2RlbHRhWFAFB2RlbHRhWFAJAJQKAgUNdmlydFdsZ1BvaW50cwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleVVzZXJMZXZlbAEFBGFkZHIJAQVhc0ludAEJAJEDAgULdmlydFdsZ0RhdGEAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleVVzZXJYUAEFBGFkZHIJAQVhc0ludAEJAJEDAgULdmlydFdsZ0RhdGEAAgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAl3bGdQb2ludHMIBQ0kdDA5OTQ4Nzk5ODc3Al8xBAp3bGdBY3Rpb25zCAUNJHQwOTk0ODc5OTg3NwJfMgQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBApmcmVlS2V5QWNjCQERa2V5VXNlckZyZWVQb2ludHMBBQRhZGRyBA1mcmVlUG9pbnRzQWNjCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQpmcmVlS2V5QWNjAAAFCXdsZ1BvaW50cwQLZnJlZUtleUR1Y2sJARFrZXlEdWNrRnJlZVBvaW50cwEFC2R1Y2tBc3NldElkBA5mcmVlUG9pbnRzRHVjawkBC3ZhbHVlT3JFbHNlAgkAnwgBBQtmcmVlS2V5RHVjawAABAdzdW1GcmVlCQBkAgUNZnJlZVBvaW50c0FjYwUOZnJlZVBvaW50c0R1Y2sED3N1bVRvRGlzdHJpYnV0ZQkAZAIJAGQCCQBkAgkAZAIFCHN0cmVuZ3RoBQhhY2N1cmFjeQUJaW50ZWxsZWN0BQllbmR1cmFuY2UFCWRleHRlcml0eQMJAGYCBQ9zdW1Ub0Rpc3RyaWJ1dGUFB3N1bUZyZWUJAAIBCQCsAgIJAKwCAgIPVGhlcmUgYXJlIG9ubHkgCQCkAwEFB3N1bUZyZWUCGiBmcmVlIHBvaW50cyB0byBkaXN0cmlidXRlBAhjaGFyc0tleQkBDGtleUR1Y2tDaGFycwEFC2R1Y2tBc3NldElkBAVjaGFycwkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFCGNoYXJzS2V5AgkwXzBfMF8wXzACAV8EBm5ld0FjYwkAZQIFDWZyZWVQb2ludHNBY2MFD3N1bVRvRGlzdHJpYnV0ZQkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUKZnJlZUtleUFjYwMJAGYCAAAFBm5ld0FjYwAABQZuZXdBY2MJAMwIAgkBDEludGVnZXJFbnRyeQIFC2ZyZWVLZXlEdWNrAwkAZgIAAAUGbmV3QWNjCQBkAgUOZnJlZVBvaW50c0R1Y2sFBm5ld0FjYwUOZnJlZVBvaW50c0R1Y2sJAMwIAgkBC1N0cmluZ0VudHJ5AgUIY2hhcnNLZXkJALkJAgkAzAgCCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDGNoYXJTdHJlbmd0aAUIc3RyZW5ndGgJAMwIAgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQxjaGFyQWNjdXJhY3kFCGFjY3VyYWN5CQDMCAIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckludGVsbGVjdAUJaW50ZWxsZWN0CQDMCAIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckVuZHVyYW5jZQUJZW5kdXJhbmNlCQDMCAIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckRleHRlcml0eQUJZGV4dGVyaXR5BQNuaWwCAV8FA25pbAUNcHJvbG9nQWN0aW9ucwUKd2xnQWN0aW9ucwAAAWkBHHNwbGl0QnlHbG9iYWxXZWlnaHRzUkVBRE9OTFkBBmFtb3VudAkAlAoCBQNuaWwJARJnZXROZWVkZWRNYXRlcmlhbHMBBQZhbW91bnQBaQEkc3BsaXRCeUdsb2JhbEFuZExvY2FsV2VpZ2h0c1JFQURPTkxZAwltYXRBbW91bnQJcmVzQW1vdW50CHRlcnJhaW5zBA10ZXJyYWluQ291bnRzCQENY291bnRUZXJyYWlucwEFCHRlcnJhaW5zCQCUCgIFA25pbAkAlAoCCQESZ2V0TmVlZGVkTWF0ZXJpYWxzAQUJbWF0QW1vdW50CQETZGlzdHJpYnV0ZUJ5V2VpZ2h0cwIFCXJlc0Ftb3VudAUNdGVycmFpbkNvdW50cwFpARNnZXRCYWNrcGFja1JFQURPTkxZAQtkdWNrQXNzZXRJZAkAlAoCBQNuaWwJALkJAgkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQCAToBaQEUZ2V0V2FyZWhvdXNlUkVBRE9OTFkBC2xhbmRBc3NldElkBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2xhbmRBc3NldElkBAlsYW5kSW5kZXgJAGkCCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwULcmVjTGFuZFNpemUFBVNTSVpFBAppbmZyYUxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQAAAkAlAoCBQNuaWwJALoJAgkBDGdldFdhcmVob3VzZQMJARJrZXlXYXJlaG91c2VCeUxhbmQBBQtsYW5kQXNzZXRJZAUJbGFuZEluZGV4BQppbmZyYUxldmVsAgE6AWkBCnNhdmVMYXN0VHgAAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQt3bGdDb250cmFjdAkAzAgCBQ9lY29ub215Q29udHJhY3QJAMwIAgUSdG91cm5hbWVudENvbnRyYWN0CQDMCAIFDWFjcmVzQ29udHJhY3QFA25pbAgFAWkGY2FsbGVyCQACAQINQWNjZXNzIGRlbmllZAkAlAoCCQEGcHJvbG9nAQUBaQAqAWkBD3VwZGF0ZUR1Y2tTdGF0cwILZHVja0Fzc2V0SWQHZGVsdGFYUAMJAQIhPQIIBQFpBmNhbGxlcgUPZWNvbm9teUNvbnRyYWN0CQACAQINQWNjZXNzIGRlbmllZAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQFB2RlbHRhWFABaQEOdXBkYXRlQWNjU3RhdHMCBGFkZHIHZGVsdGFYUAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUPZWNvbm9teUNvbnRyYWN0CQDMCAIFDWFjcmVzQ29udHJhY3QFA25pbAgFAWkGY2FsbGVyCQACAQINQWNjZXNzIGRlbmllZAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCBQRhZGRyBQdkZWx0YVhQAWkBCWVxdWlwRHVjawEJZXF1aXBtZW50BA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBD2NoZWNrVG91cm5hbWVudAEFC2R1Y2tBc3NldElkCQACAQIZZXF1aXBEdWNrX2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQJAAIBAhdlcXVpcER1Y2tfY2hlY2tEZWxpdmVyeQQFZXFLZXkJARBrZXlEdWNrRXF1aXBtZW50AQULZHVja0Fzc2V0SWQEC2N1cnJlbnRTZWdzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUFZXFLZXkCFyw7LF8sOyxfLDssXyw7LF8sOyxfLDssAgFfBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQFbmV3RXEJALUJAgUJZXF1aXBtZW50AgFfAwkBAiE9AgkAkAMBBQVuZXdFcQULTlVNU0VHTUVOVFMJAAIBAhZXcm9uZyBlcXVpcG1lbnQgc3RyaW5nBAl0ZW1wUHJvZEIJAQZkcmVzc0IEBQtjdXJyZW50U2VncwkBDnByb2RTdHJUb0J5dGVzAQkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBgUDbmlsBAhzZWdCcEF1eAkAkQMCCQC1CQIJAJEDAgUFbmV3RXEFC3NlZ0JhY2twYWNrAgE7AAEECmJ1ZmZFZmZlY3QDCQAAAgUIc2VnQnBBdXgCAAAABARhdXgwCQCRAwIJALUJAgUIc2VnQnBBdXgCASwAAAMJAAACBQRhdXgwAgAAAAQGaWR4Q250CQC1CQIFBGF1eDACAToEA2lkeAkAkQMCBQZpZHhDbnQAAAQDY250CQCRAwIFBmlkeENudAABAwMDAwMJAAACBQNpZHgCAjA2BgkAAAIFA2lkeAICMDcGCQAAAgUDaWR4AgIwOAkBAiE9AgUDY250AgAHCQBmAgkBDXBhcnNlSW50VmFsdWUBBQNjbnQAAAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAkBDXBhcnNlSW50VmFsdWUBBQNpZHgCAV8FCnJJZHhFZmZlY3QAAAQFc3RhdHMJAQxnZXREdWNrU3RhdHMEBQR0aGlzBQtkdWNrQXNzZXRJZAUKYnVmZkVmZmVjdAYECG5ld1Byb2RCCQEGZHJlc3NCBAUFbmV3RXEFCXRlbXBQcm9kQgcFBXN0YXRzBApuZXdQcm9kU3RyCQEOYnl0ZXNUb1Byb2RTdHIBBQhuZXdQcm9kQgkAlAoCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUFZXFLZXkFCWVxdWlwbWVudAkAzAgCCQELU3RyaW5nRW50cnkCBQVicEtleQkAugkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgUKbmV3UHJvZFN0cgUDbmlsAgE6CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlEdWNrQnVmZnMBBQtkdWNrQXNzZXRJZAkAuQkCCQDMCAIJAKQDAQkAkQMCBQVzdGF0cwAHCQDMCAIJAKQDAQkAkQMCBQVzdGF0cwAICQDMCAIJAKQDAQkAkQMCBQVzdGF0cwAJCQDMCAIJAKQDAQkAkQMCBQVzdGF0cwAKCQDMCAIJAKQDAQkAkQMCBQVzdGF0cwALBQNuaWwCAV8FA25pbAUNcHJvbG9nQWN0aW9ucwAAAWkBD2ZvcnRpZmljYXRlTGFuZAILbGFuZEFzc2V0SWQEcGxhbgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEC2R1Y2tBc3NldElkCQELdmFsdWVPckVsc2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICAAQJZHVja1N0YXRzCQEMZ2V0RHVja1N0YXRzBAUEdGhpcwULZHVja0Fzc2V0SWQAAAcEB2ZvcnRLZXkJARdrZXlGb3J0aWZpY2F0aW9uc0J5TGFuZAEFC2xhbmRBc3NldElkBAxjdXJyZW50Rm9ydHMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQdmb3J0S2V5Agw6MF8xNTowXzE4OjACAV8EBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQECWxhbmRJbmRleAkAaQIJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIJALUJAggFBWFzc2V0C2Rlc2NyaXB0aW9uAgFfBQtyZWNMYW5kU2l6ZQUFU1NJWkUECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAABAV3aEtleQkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkBAJ3aAkBDGdldFdhcmVob3VzZQMFBXdoS2V5BQlsYW5kSW5kZXgFCmluZnJhTGV2ZWwEB2N1ckxvZnQJALUJAgkAkQMCBQJ3aAUJd2hJZHhMT0ZUAgFfBARjdXJPCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHY3VyTG9mdAULdm9sT2NjdXBpZWQEBGN1ckYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdjdXJMb2Z0BQd2b2xGcmVlBAhuZXdGb3J0cwkAtQkCBQRwbGFuAgFfBA8kdDAxMDY3MTUxMDY4MzAJAQVmb3J0QgYFDGN1cnJlbnRGb3J0cwkBDnByb2RTdHJUb0J5dGVzAQkAkQMCBQJ3aAUJd2hJZHhQcm9kBQRjdXJPBQRjdXJGBgUDbmlsBAl0ZW1wUHJvZEIIBQ8kdDAxMDY3MTUxMDY4MzACXzEEBXRlbXBPCAUPJHQwMTA2NzE1MTA2ODMwAl8yBAV0ZW1wRggFDyR0MDEwNjcxNTEwNjgzMAJfMwQPJHQwMTA2ODMzMTA2OTI5CQEFZm9ydEIGBQhuZXdGb3J0cwUJdGVtcFByb2RCBQV0ZW1wTwUFdGVtcEYHBQlkdWNrU3RhdHMECG5ld1Byb2RCCAUPJHQwMTA2ODMzMTA2OTI5Al8xBARuZXdPCAUPJHQwMTA2ODMzMTA2OTI5Al8yBARuZXdGCAUPJHQwMTA2ODMzMTA2OTI5Al8zBApuZXdQcm9kU3RyCQEOYnl0ZXNUb1Byb2RTdHIBBQhuZXdQcm9kQgQKbmV3TG9mdFN0cgkAuQkCCQDMCAIJAJEDAgUHY3VyTG9mdAUJdm9sTG9ja2VkCQDMCAIJAKQDAQUEbmV3TwkAzAgCCQCkAwEFBG5ld0YJAMwIAgkAkQMCBQdjdXJMb2Z0BQh2b2xUb3RhbAUDbmlsAgFfCQCUCgIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQdmb3J0S2V5BQRwbGFuCQDMCAIJAQtTdHJpbmdFbnRyeQIFBXdoS2V5CQC6CQIJAMwIAgkAkQMCBQJ3aAULd2hJZHhMZXZlbHMJAMwIAgkAkQMCBQJ3aAUId2hJZHhSZXMJAMwIAgkAkQMCBQJ3aAUId2hJZHhNYXQJAMwIAgUKbmV3UHJvZFN0cgkAzAgCBQpuZXdMb2Z0U3RyBQNuaWwCAToFA25pbAUNcHJvbG9nQWN0aW9ucwAAAWkBE2luaXREdWNrVG91ckF0dGVtcHQBC2R1Y2tBc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBRJ0b3VybmFtZW50Q29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkBAlrZXlIZWFsdGgJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQEBW1heEhQCQEJbWF4SGVhbHRoAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEMa2V5RHVja0xldmVsAQULZHVja0Fzc2V0SWQAAAQJY3VySGVhbHRoCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aAUFbWF4SFAECWN1ckxvY0tleQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBBQljdXJMb2NLZXkFD0RFRkFVTFRMT0NBVElPTgQGbGFzdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEnRvdXJuYW1lbnRDb250cmFjdAUNbGFzdFRvdXJJZEtleQAABAx0b3VyTG9jYXRpb24JAKwCAgkApAMBBQZsYXN0SWQCBF9UXzAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmtleVNhdmVkSGVhbHRoAQULZHVja0Fzc2V0SWQFCWN1ckhlYWx0aAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa2V5SGVhbHRoBQVtYXhIUAkAzAgCCQELU3RyaW5nRW50cnkCCQEQa2V5U2F2ZWRMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQtjdXJMb2NhdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCBQljdXJMb2NLZXkFDHRvdXJMb2NhdGlvbgUDbmlsBQx0b3VyTG9jYXRpb24BaQEMYnJlYWtBdHRlbXB0AAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQECWN1ckxvY0tleQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBBQljdXJMb2NLZXkFD0RFRkFVTFRMT0NBVElPTgMJAQIhPQIJAJEDAgkAtQkCBQtjdXJMb2NhdGlvbgIBXwUKbG9jSWR4VHlwZQIBVAkAAgECIllvdXIgZHVjayBpcyBub3QgaW4gdGhlIHRvdXJuYW1lbnQEC3NhdmVkSGVhbHRoCQERQGV4dHJOYXRpdmUoMTA1NSkBCQEOa2V5U2F2ZWRIZWFsdGgBBQtkdWNrQXNzZXRJZAQNc2F2ZWRMb2NhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTgpAQkBEGtleVNhdmVkTG9jYXRpb24BBQtkdWNrQXNzZXRJZAkAlAoCCQDNCAIJAM0IAgUNcHJvbG9nQWN0aW9ucwkBDEludGVnZXJFbnRyeQIJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQFC3NhdmVkSGVhbHRoCQELU3RyaW5nRW50cnkCBQljdXJMb2NLZXkFDXNhdmVkTG9jYXRpb24FC2N1ckxvY2F0aW9uAWkBFmV4aXRUb3VybmFtZW50SW50ZXJuYWwBC2R1Y2tBc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQINQWNjZXNzIGRlbmllZAQLc2F2ZWRIZWFsdGgJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ5rZXlTYXZlZEhlYWx0aAEFC2R1Y2tBc3NldElkBA1zYXZlZExvY2F0aW9uCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEQa2V5U2F2ZWRMb2NhdGlvbgEFC2R1Y2tBc3NldElkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQFC3NhdmVkSGVhbHRoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUNc2F2ZWRMb2NhdGlvbgUDbmlsBwFpARRleGl0RGVsaXZlcnlJbnRlcm5hbAELZHVja0Fzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg1BY2Nlc3MgZGVuaWVkBAFlCQESZXhpdERlbGl2ZXJ5Q29tbW9uBAULZHVja0Fzc2V0SWQHAAAAAAkAlAoCCQDOCAIIBQFlAl8xCAUBZQJfMgcBaQEQYXV0b0V4aXREZWxpdmVyeQQLZHVja0Fzc2V0SWQFbmV3SFAGcmVhc29uBXNjb3JlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQINQWNjZXNzIGRlbmllZAQBZQkBEmV4aXREZWxpdmVyeUNvbW1vbgQFC2R1Y2tBc3NldElkBgUFbmV3SFAFBXNjb3JlCQCUCgIIBQFlAl8xCAUBZQJfMwFpAQ1icmVha0RlbGl2ZXJ5AAkAlAoCCQEGcHJvbG9nAQUBaQINYnJlYWtEZWxpdmVyeQFpAQ5wcmVwYXJlUm9iYmVyeQIHbWVzc2FnZQNzaWcEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBASEBCQDEEwMFB21lc3NhZ2UFA3NpZwUDcHViCQACAQIYc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBndsZ0FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQp3bGdBc3NldElkCQACAQIVV0xHT0xEIHBheW1lbnRzIG9ubHkhBAVwYXJ0cwkAtQkCCQCwCQEFB21lc3NhZ2UCAXwDCQECIT0CCQCQAwEFBXBhcnRzAAIJAAIBAhRXcm9uZyBtZXNzYWdlIGZvcm1hdAQLZHVja0Fzc2V0SWQJAJEDAgUFcGFydHMAAAMJAQ9jaGVja1RvdXJuYW1lbnQBBQtkdWNrQXNzZXRJZAkAAgECHnByZXBhcmVSb2JiZXJ5X2NoZWNrVG91cm5hbWVudAMJAQ1jaGVja0RlbGl2ZXJ5AQULZHVja0Fzc2V0SWQJAAIBAhxwcmVwYXJlUm9iYmVyeV9jaGVja0RlbGl2ZXJ5BAdyb2JDb3N0CAkBDmdldFJvYmJlcnlEYXRhAgUEdGhpcwULZHVja0Fzc2V0SWQCXzEDCQBmAgUHcm9iQ29zdAUGd2xnQW10CQACAQkArAICCQCsAgIJAKwCAgIIUGF5bWVudCAJAKQDAQUGd2xnQW10AgwgPCByZXF1aXJlZCAJAKQDAQUHcm9iQ29zdAQKY2FuZGlkYXRlcwkAtQkCCQCRAwIFBXBhcnRzAAECAV8EA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWR1Y2tTdGF0ZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5RHVja1JvYmJlcnlTdGF0ZQEFC2R1Y2tBc3NldElkAAAECmxvY2tlZExhbmQJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBE2tleUxvY2tlZExhbmRCeUR1Y2sBBQtkdWNrQXNzZXRJZAIABAdsYW5kRVRBCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlMYW5kQ29vbGRvd25FVEEBBQpsb2NrZWRMYW5kAAADAwkBAiE9AgUJZHVja1N0YXRlBQtkdWNrSWR4RnJlZQkAZgIFB2xhbmRFVEEFA25vdwcJAAIBCQCsAgICJ1lvdSBhbHJlYWR5IHN0YXJ0ZWQgcm9iYmluZywgd2FpdCB0aWxsIAkApAMBBQdsYW5kRVRBCgEHY2hlY2tlcgIDYWNjC2xhbmRBc3NldElkBAVzdGF0ZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5TGFuZFJvYmJlcnlTdGF0ZQEFC2xhbmRBc3NldElkAAAEC2Nvb2xkb3duRVRBCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlMYW5kQ29vbGRvd25FVEEBBQtsYW5kQXNzZXRJZAAAAwkAZgIFBXN0YXRlCQCQAwEFEGxhbmRSb2JDb29sZG93bnMJAAIBAg1JbnZhbGlkIHN0YXRlAwkAZgIFA25vdwULY29vbGRvd25FVEEECnN0YWtlZFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAAAwkAZwIAAAUKc3Rha2VkVGltZQUDYWNjBAFhCQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQEAWQJALUJAggFAWELZGVzY3JpcHRpb24CAV8EBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAgUBZAULcmVjTGFuZFNpemUEDHByb2R1Y3Rpdml0eQkBDGFwcGx5Qm9udXNlcwIFC2xhbmRBc3NldElkBQZwaWVjZXMECWRlbHRhVGltZQkAZQIFA25vdwUKc3Rha2VkVGltZQQIYXZhaWxSZXMJAGsDBQlkZWx0YVRpbWUJAGgCBQxwcm9kdWN0aXZpdHkFBnBpZWNlcwUJREFZTUlMTElTAwkAZgIFDk1JTl9SRVNfVE9fUk9CBQhhdmFpbFJlcwUDYWNjCQDNCAIFA2FjYwULbGFuZEFzc2V0SWQFA2FjYwQIZmlsdGVyZWQKAAIkbAUKY2FuZGlkYXRlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHY2hlY2tlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMJAAACCQCQAwEFCGZpbHRlcmVkAAAJAAIBAhlObyBjYW5kaWRhdGVzIGZvciByb2JiZXJ5BAZybmRJZHgJAQ9nZXRSYW5kb21OdW1iZXIDCQCQAwEFCGZpbHRlcmVkBQdtZXNzYWdlBQNzaWcEC2xhbmRBc3NldElkCQCRAwIFCGZpbHRlcmVkBQZybmRJZHgJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETa2V5TGFuZFJvYmJlcnlTdGF0ZQEFC2xhbmRBc3NldElkBQxyb2JJZHhMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlMYW5kQ29vbGRvd25FVEEBBQtsYW5kQXNzZXRJZAkAZAIFA25vdwkAkQMCBRBsYW5kUm9iQ29vbGRvd25zBQxyb2JJZHhMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARNrZXlEdWNrUm9iYmVyeVN0YXRlAQULZHVja0Fzc2V0SWQFEGR1Y2tJZHhQcmVwYXJpbmcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2tleUxvY2tlZExhbmRCeUR1Y2sBBQtkdWNrQXNzZXRJZAULbGFuZEFzc2V0SWQFA25pbAUNcHJvbG9nQWN0aW9ucwULbGFuZEFzc2V0SWQBaQEHcm9iTGFuZAIHbWVzc2FnZQNzaWcEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBASEBCQDEEwMFB21lc3NhZ2UFA3NpZwUDcHViCQACAQIYc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoBAh1c2VyQWRkcgkApQgBCAUBaQZjYWxsZXIEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUIdXNlckFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAJQKAgkAzQgCBQ1wcm9sb2dBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkBGGtleUxhc3RSb2JiZXJ5VGltZUJ5RHVjawEFC2R1Y2tBc3NldElkBQNub3cAAAFpAQ5hY2NlcHREZWxpdmVyeQAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBAh1c2VyQWRkcgkApQgBCAUBaQZjYWxsZXIEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUIdXNlckFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQECWZ1bmRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9lY29ub215Q29udHJhY3QFD2RlbGl2ZXJ5RnVuZEtleQAABAtsb2NrZWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9lY29ub215Q29udHJhY3QFEWRlbGl2ZXJ5TG9ja2VkS2V5AAADCQBmAgUVTUlOX1VTRFRfRkVFX0RFTElWRVJZCQBlAgUJZnVuZFRvdGFsBQtsb2NrZWRUb3RhbAkAAgEJAKwCAgkArAICCQCsAgICIERlbGl2ZXJ5IGlzIG5vdCBhdmFpbGFibGUsIGZ1bmQ9CQEKZml4ZWRQb2ludAIFCWZ1bmRUb3RhbAAGAgksIGxvY2tlZD0JAQpmaXhlZFBvaW50AgULbG9ja2VkVG90YWwABgQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQIZGVsYXlFVEEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleURlbGl2ZXJ5RGVsYXlCeUR1Y2sBBQtkdWNrQXNzZXRJZAAAAwkAZgIFCGRlbGF5RVRBBQNub3cJAAIBCQCsAgICKkRlbGl2ZXJ5IGlzIGZvcmJpZGRlbiBmb3IgeW91ciBkdWNrIHVudGlsIAkApAMBBQhkZWxheUVUQQQGaGVhbHRoCQERQGV4dHJOYXRpdmUoMTA1NSkBCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkAwkAZwIAAAUGaGVhbHRoCQACAQIrWW91IGNhbm5vdCBhY2NlcHQgZGVsaXZlcnkgd2l0aCB6ZXJvIGhlYWx0aAQIY291bnRLZXkJARRrZXlVc2VyRGVsaXZlcnlDb3VudAEFCHVzZXJBZGRyBAVjb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQhjb3VudEtleQAABAdsYXN0RGF5CQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlVc2VyTGFzdERlbGl2ZXJ5RGF5AQUIdXNlckFkZHIAAAQFdG9kYXkJAGkCBQNub3cFCURBWU1JTExJUwQFYWNyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNYWNyZXNDb250cmFjdAkBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQUIdXNlckFkZHIAAAQRYWxsb3dlZERlbGl2ZXJpZXMJAGQCBRdBTExPV0VEX0ZSRUVfREVMSVZFUklFUwkAaQIFBWFjcmVzBRpBQ1JFU19GT1JfREVMSVZFUllfQVRURU1QVAMDCQBnAgUFY291bnQFEWFsbG93ZWREZWxpdmVyaWVzCQAAAgUHbGFzdERheQUFdG9kYXkHCQACAQkArAICCQCsAgICEVlvdSBhbHJlYWR5IHVzZWQgCQCkAwEFEWFsbG93ZWREZWxpdmVyaWVzAhwgZGVsaXZlcnkgYXR0ZW1wdHMgZm9yIHRvZGF5AwkBD2NoZWNrVG91cm5hbWVudAEFC2R1Y2tBc3NldElkCQACAQIeYWNjZXB0RGVsaXZlcnlfY2hlY2tUb3VybmFtZW50AwkBDWNoZWNrRGVsaXZlcnkBBQtkdWNrQXNzZXRJZAkAAgECHGFjY2VwdERlbGl2ZXJ5X2NoZWNrRGVsaXZlcnkEDm5ld0xvY2tlZFRvdGFsCQEFYXNJbnQBCQD8BwQFD2Vjb25vbXlDb250cmFjdAIUdXBkYXRlRGVsaXZlcnlMb2NrZWQJAMwIAgkAZAIFC2xvY2tlZFRvdGFsBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFA25pbAUDbmlsBAljdXJMb2NLZXkJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAKIIAQUJY3VyTG9jS2V5BQ9ERUZBVUxUTE9DQVRJT04EEGRlbGl2ZXJ5TG9jYXRpb24JAKwCAgkApAMBBQNub3cCBF9EXzAJAJQKAgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlTYXZlZExvY2F0aW9uAQULZHVja0Fzc2V0SWQFC2N1ckxvY2F0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWN1ckxvY0tleQUQZGVsaXZlcnlMb2NhdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgUIY291bnRLZXkDCQECIT0CBQdsYXN0RGF5BQV0b2RheQAABQVjb3VudAUDbmlsBQ1wcm9sb2dBY3Rpb25zCQCUCgIFEGRlbGl2ZXJ5TG9jYXRpb24FDm5ld0xvY2tlZFRvdGFsAWkBFWNoZWNrRGVsaXZlcnlDYWxsYmFjawELZHVja0Fzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFEnRvdXJuYW1lbnRDb250cmFjdAkAAgECDUFjY2VzcyBkZW5pZWQJAJQKAgUDbmlsCQENY2hlY2tEZWxpdmVyeQEFC2R1Y2tBc3NldElkAWkBD2dlblRlc3RSRUFET05MWQIEc2VlZA1sYW5kU2l6ZUluZGV4BAN2cmYJAQV2YWx1ZQEICQEFdmFsdWUBCQDtBwEA/sWsAQN2cmYEBmJpZ051bQkBA2FicwEJAJ4DAQkAywECBQN2cmYJAPcDAQkAmgMBBQRzZWVkCQCUCgIFA25pbAkBBGdlbjECBQZiaWdOdW0FDWxhbmRTaXplSW5kZXgAzOYjrg==", "height": 2827211, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BohPRMGBuTGSqzCqDj6UiF84FXk4jdEoYApe7tp26RBv Next: 6JQn6zjbVZccBYm5XhfrGCh2R1LZUiQ3jmVyQ495S3pC Diff:
OldNewDifferences
13601360 func gen1 (seed0,landSizeIndex) = {
13611361 func continentSums (ac,cont) = {
13621362 let curr = split(valueOrElse(getString(keyResTypesByContinent(cont)), "0_0_0_0_0_0"), "_")
1363- let contSum = {
1363+ let cSum = {
13641364 let $l = curr
13651365 let $s = size($l)
13661366 let $acc0 = 0
13741374
13751375 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13761376 }
1377- $Tuple2((ac._1 :+ contSum), (ac._2 + contSum))
1377+ $Tuple2((ac._1 :+ cSum), (ac._2 + cSum))
13781378 }
13791379
1380- let $t01982820212 = {
1380+ let $t01981920203 = {
13811381 let $l = continents
13821382 let $s = size($l)
13831383 let $acc0 = $Tuple2(nil, 0)
13911391
13921392 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
13931393 }
1394- let contSums = $t01982820212._1
1395- let total = $t01982820212._2
1394+ let contSums = $t01981920203._1
1395+ let total = $t01981920203._2
13961396 let maxSum = max(contSums)
13971397 let rTotal = ((maxSum * 5) - total)
13981398 let deltaCont = (rTotal / 50)
1399- let $t02037820666 = if ((rTotal == 0))
1399+ let $t02036920657 = if ((rTotal == 0))
14001400 then genRand(5, seed0)
14011401 else {
1402- let $t02046220515 = genRand((rTotal + (deltaCont * 5)), seed0)
1403- let r = $t02046220515._1
1404- let out = $t02046220515._2
1402+ let $t02045320506 = genRand((rTotal + (deltaCont * 5)), seed0)
1403+ let r = $t02045320506._1
1404+ let out = $t02045320506._2
14051405 func subr (acc,el) = (acc :+ (maxSum - el))
14061406
14071407 let compl = {
14201420 }
14211421 $Tuple2(findSlot(compl, r, deltaCont), out)
14221422 }
1423- let contIdx = $t02037820666._1
1424- let seed1 = $t02037820666._2
1423+ let contIdx = $t02036920657._1
1424+ let seed1 = $t02036920657._2
14251425 let target = targetFreqByContinent[contIdx]
14261426 let actual = split(valueOrElse(getString(keyResTypesByContinent(continents[contIdx])), "0_0_0_0_0_0"), "_")
14271427 func toInts (acc,el) = (acc :+ parseIntValue(el))
14641464 $Tuple2((acc._1 :+ s), (acc._2 + s))
14651465 }
14661466
1467- let $t02145121528 = {
1467+ let $t02144221519 = {
14681468 let $l = intDelta
14691469 let $s = size($l)
14701470 let $acc0 = $Tuple2(nil, 0)
14781478
14791479 $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14801480 }
1481- let shiftedIntDelta = $t02145121528._1
1482- let sumShiftedIntDelta = $t02145121528._2
1481+ let shiftedIntDelta = $t02144221519._1
1482+ let sumShiftedIntDelta = $t02144221519._2
14831483 let deltaRes = (sumShiftedIntDelta / 60)
1484- let $t02157621796 = if ((sumShiftedIntDelta == 0))
1484+ let $t02156721787 = if ((sumShiftedIntDelta == 0))
14851485 then genRand(6, ac._4)
14861486 else {
1487- let $t02167421738 = genRand((sumShiftedIntDelta + (deltaRes * 6)), ac._4)
1488- let r = $t02167421738._1
1489- let out = $t02167421738._2
1487+ let $t02166521729 = genRand((sumShiftedIntDelta + (deltaRes * 6)), ac._4)
1488+ let r = $t02166521729._1
1489+ let out = $t02166521729._2
14901490 $Tuple2(findSlot(shiftedIntDelta, r, deltaRes), out)
14911491 }
1492- let idx = $t02157621796._1
1493- let seed2 = $t02157621796._2
1492+ let idx = $t02156721787._1
1493+ let seed2 = $t02156721787._2
14941494 func addByIndex (acc,j) = (acc :+ (ac._2[j] + (if ((j == idx))
14951495 then landSizeIndex
14961496 else 0)))
19871987
19881988
19891989 func checkClaimConditions (addr,claimMode,landAssetIdIn) = {
1990- let $t03670137240 = if ((claimMode == claimModeWh))
1990+ let $t03669237231 = if ((claimMode == claimModeWh))
19911991 then $Tuple2(landAssetIdIn, valueOrElse(getString(keyStakedDuckByOwner(addr)), ""))
19921992 else {
19931993 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
19971997 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
19981998 else $Tuple2(loc[locIdxId], duckAssetId)
19991999 }
2000- let landAssetId = $t03670137240._1
2001- let duckId = $t03670137240._2
2000+ let landAssetId = $t03669237231._1
2001+ let duckId = $t03669237231._2
20022002 let asset = value(assetInfo(fromBase58String(landAssetId)))
20032003 let timeKey = keyStakedTimeByAssetId(landAssetId)
20042004 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("Land " + asset.name) + " is not staked"))
20462046 let currentPack = getBackpack(bpKey)
20472047 let currentPackRes = split(currentPack[bpIdxRes], "_")
20482048 let currentWhRes = split(currentWh[whIdxRes], "_")
2049- let $t03961440485 = if ((claimMode == claimModeWh))
2049+ let $t03960540476 = if ((claimMode == claimModeWh))
20502050 then $Tuple4(addRes(currentWhRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), currentPack[bpIdxRes], (parseIntValue(loft[volOccupied]) + resToClaim._2), (parseIntValue(loft[volFree]) - resToClaim._2))
20512051 else if ((claimMode == claimModeDuck))
20522052 then $Tuple4(currentWh[whIdxRes], addRes(currentPackRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), parseIntValue(loft[volOccupied]), parseIntValue(loft[volFree]))
20552055 let whAm = min([parseIntValue(loft[volFree]), resToClaim._2])
20562056 $Tuple4(distr._1, distr._2, (parseIntValue(loft[volOccupied]) + whAm), (parseIntValue(loft[volFree]) - whAm))
20572057 }
2058- let whRes = $t03961440485._1
2059- let bpRes = $t03961440485._2
2060- let loftO = $t03961440485._3
2061- let loftF = $t03961440485._4
2058+ let whRes = $t03960540476._1
2059+ let bpRes = $t03960540476._2
2060+ let loftO = $t03960540476._3
2061+ let loftF = $t03960540476._4
20622062 $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]], "_")])
20632063 }
20642064 }
27232723 let isDeliv = (newLoc[locIdxType] == "D")
27242724 let eqKey = keyDuckEquipment(duckAssetId)
27252725 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2726- let $t07312773224 = subtractEquipment(currentEq, f._5)
2727- let newEq = $t07312773224._1
2728- let shouldZeroBuffs = $t07312773224._2
2729- let $t07322776339 = if (!(onMission(tournamentContract, curLocation)))
2726+ let $t07311873215 = subtractEquipment(currentEq, f._5)
2727+ let newEq = $t07311873215._1
2728+ let shouldZeroBuffs = $t07311873215._2
2729+ let $t07321876330 = if (!(onMission(tournamentContract, curLocation)))
27302730 then if (!(isUsualLocation(newLocation)))
27312731 then cheatAttempt(curLocation, newLocation, 5)
27322732 else if ((newHP > 0))
27862786 else throw("Strict value is not equal to itself.")
27872787 }
27882788 }
2789- let locToSave = $t07322776339._1
2790- let hpToSave = $t07322776339._2
2789+ let locToSave = $t07321876330._1
2790+ let hpToSave = $t07321876330._2
27912791 $Tuple2(((([StringEntry(locKey, locToSave), StringEntry(eqKey, newEq), IntegerEntry(keyDuckHealth(duckAssetId), hpToSave)] ++ prologActions) ++ (if (shouldZeroBuffs)
27922792 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
27932793 else nil)) ++ updateDuckStatsInternal(duckAssetId, if ((newHP > 0))
29932993 let newMat = makeString(subtractMaterials(true, mList, EXPMATERIALS), "_")
29942994 let eqKey = keyDuckEquipment(duckAssetId)
29952995 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2996- let $t08377983876 = subtractEquipment(currentEq, f._5)
2997- let newEq = $t08377983876._1
2998- let shouldZeroBuffs = $t08377983876._2
2996+ let $t08377083867 = subtractEquipment(currentEq, f._5)
2997+ let newEq = $t08377083867._1
2998+ let shouldZeroBuffs = $t08377083867._2
29992999 let e = expeditionInternal(i.caller, i.transactionId)
30003000 let id = e._2._1
30013001 let result = if ((0 >= f._1))
33103310 let addr = toString(i.originCaller)
33113311 let virtWlgData = asAnyList(invoke(wlgContract, "checkWlgXpREADONLY", [addr], nil))
33123312 let virtWlgPoints = asInt(virtWlgData[1])
3313- let $t09949699886 = if ((0 >= virtWlgPoints))
3313+ let $t09948799877 = if ((0 >= virtWlgPoints))
33143314 then $Tuple2(0, nil)
33153315 else {
33163316 let deltaXP = asInt(invoke(wlgContract, "takeWlgXp", [addr], nil))
33183318 then $Tuple2(virtWlgPoints, [IntegerEntry(keyUserLevel(addr), asInt(virtWlgData[0])), IntegerEntry(keyUserXP(addr), asInt(virtWlgData[2]))])
33193319 else throw("Strict value is not equal to itself.")
33203320 }
3321- let wlgPoints = $t09949699886._1
3322- let wlgActions = $t09949699886._2
3321+ let wlgPoints = $t09948799877._1
3322+ let wlgActions = $t09948799877._2
33233323 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
33243324 let freeKeyAcc = keyUserFreePoints(addr)
33253325 let freePointsAcc = (valueOrElse(getInteger(freeKeyAcc), 0) + wlgPoints)
34703470 let curO = parseIntValue(curLoft[volOccupied])
34713471 let curF = parseIntValue(curLoft[volFree])
34723472 let newForts = split(plan, "_")
3473- let $t0106724106839 = fortB(currentForts, prodStrToBytes(wh[whIdxProd]), curO, curF, true, nil)
3474- let tempProdB = $t0106724106839._1
3475- let tempO = $t0106724106839._2
3476- let tempF = $t0106724106839._3
3477- let $t0106842106938 = fortB(newForts, tempProdB, tempO, tempF, false, duckStats)
3478- let newProdB = $t0106842106938._1
3479- let newO = $t0106842106938._2
3480- let newF = $t0106842106938._3
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
34813481 let newProdStr = bytesToProdStr(newProdB)
34823482 let newLoftStr = makeString([curLoft[volLocked], toString(newO), toString(newF), curLoft[volTotal]], "_")
34833483 $Tuple2(([StringEntry(fortKey, plan), StringEntry(whKey, makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], newProdStr, newLoftStr], ":"))] ++ prologActions), 0)
37233723
37243724 @Callable(i)
37253725 func genTestREADONLY (seed,landSizeIndex) = {
3726- let bigNum = abs(toBigInt(sha256(toBytes(seed))))
3726+ let vrf = value(value(blockInfoByHeight(2827006)).vrf)
3727+ let bigNum = abs(toBigInt((vrf + sha256(toBytes(seed)))))
37273728 $Tuple2(nil, gen1(bigNum, landSizeIndex))
37283729 }
37293730
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
181181
182182 let MAX_LANDS_STAKED_BY_USER = 25
183183
184184 let DAILYRESBYPIECE = 3456000
185185
186186 let WHMULTIPLIER = 10000000000
187187
188188 let DEFAULTLOCATION = "Africa_F_Africa"
189189
190190 let RESOURCEPRICEMIN = 39637
191191
192192 let ESSELLCOEF = 10
193193
194194 let MIN_USDT_FEE_DELIVERY = 50000
195195
196196 let TEN_MINUTES_MILLIS = 600000
197197
198198 let ALLOWED_FREE_DELIVERIES = 1
199199
200200 let ACRES_FOR_DELIVERY_ATTEMPT = 50000000
201201
202202 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"]
203203
204204 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
205205
206206 let COEFF2MAT = 10000000
207207
208208 let fortAllowedProds = [15, 16, 17, 18, 19, 20]
209209
210210 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_"]
211211
212212 let rIdxCoeff = 6
213213
214214 let rIdxEffect = 8
215215
216216 let rIdxRequirements = 9
217217
218218 let rIdxSlots = 10
219219
220220 let PRODUCTPKGSIZE = 10
221221
222222 let whIdxLevels = 0
223223
224224 let whIdxRes = 1
225225
226226 let whIdxMat = 2
227227
228228 let whIdxProd = 3
229229
230230 let whIdxLOFT = 4
231231
232232 let volLocked = 0
233233
234234 let volOccupied = 1
235235
236236 let volFree = 2
237237
238238 let volTotal = 3
239239
240240 let bpIdxLevel = 0
241241
242242 let bpIdxRes = 1
243243
244244 let bpIdxMat = 2
245245
246246 let bpIdxProd = 3
247247
248248 let locIdxContinent = 0
249249
250250 let locIdxType = 1
251251
252252 let locIdxId = 2
253253
254254 func keyLandAssetIdToOwner (assetId) = ("no_" + assetId)
255255
256256
257257 func keyLandAssetIdToCustomName (assetId) = ("lcna_" + assetId)
258258
259259
260260 func keyStakedTimeByAssetId (assetId) = ("st_" + assetId)
261261
262262
263263 func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["las", type, assetId], "_")
264264
265265
266266 func keyStakedTimeByTypeAssetIdAndOwner (nftType,assetId,ownerAddr) = ((((("sttao_" + nftType) + "_") + assetId) + "_") + ownerAddr)
267267
268268
269269 func keyWarehouseByLand (landAssetId) = ("wh_" + landAssetId)
270270
271271
272272 func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
273273
274274
275275 func keyFortificationsByLand (landAssetId) = ("fortifications_" + landAssetId)
276276
277277
278278 func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
279279
280280
281281 func keyAddressToCustomName (addr) = ("accountCustomNameByAddr_" + addr)
282282
283283
284284 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
285285
286286
287287 func keyOnboardArtActivatedOnDuck (duckAssetId) = ("onboardArtActivatedOnDuck_" + duckAssetId)
288288
289289
290290 func keyOnboardArtDuckActivatedBy (addr) = ("onboardArtActivatedDuckBy_" + addr)
291291
292292
293293 func keyAddressReferrals (addr) = ("accReferrals_" + addr)
294294
295295
296296 func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
297297
298298
299299 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
300300
301301
302302 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
303303
304304
305305 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
306306
307307
308308 func keyUserGwlReleaseTime (userAddr) = ("%s%s__userGwlReleaseTime__" + userAddr)
309309
310310
311311 func keyEsWarehouse () = "emergencyWarehouseProducts"
312312
313313
314314 let deliveryFundKey = "deliveryFund"
315315
316316 let deliveryLockedKey = "deliveryLocked"
317317
318318 let lastTourIdKey = "%s__lastTourId"
319319
320320 func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
321321
322322
323323 func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
324324
325325
326326 func keyBestResultByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__bestResultByTourAndDuck", toString(tId), duckAssetId], "__")
327327
328328
329329 let idxStatic = 0
330330
331331 let idxDynamic = 1
332332
333333 let tStaticEnd = 6
334334
335335 let tDynamicStatus = 1
336336
337337 func getTourData (tourContract,tId) = {
338338 let static = split(valueOrErrorMessage(getString(tourContract, keyTourStaticDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
339339 let dynamic = split_4C(valueOrErrorMessage(getString(tourContract, keyTourDynamicDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
340340 [static, dynamic]
341341 }
342342
343343
344344 func isInTournament (tourContract,location) = {
345345 let lastId = valueOrElse(getInteger(tourContract, lastTourIdKey), 0)
346346 let loc = split(location, "_")
347347 let now = lastBlock.timestamp
348348 let tData = getTourData(tourContract, lastId)
349349 let static = tData[idxStatic]
350350 let dynamic = tData[idxDynamic]
351351 if (if (if ((loc[locIdxType] == "T"))
352352 then (parseIntValue(loc[locIdxContinent]) == lastId)
353353 else false)
354354 then (dynamic[tDynamicStatus] == "INPROGRESS")
355355 else false)
356356 then (parseIntValue(static[tStaticEnd]) > now)
357357 else false
358358 }
359359
360360
361361 func isInDelivery (location) = {
362362 let loc = split(location, "_")
363363 let now = lastBlock.timestamp
364364 let startTime = parseIntValue(loc[locIdxContinent])
365365 let distance = parseIntValue(loc[locIdxId])
366366 if (if ((loc[locIdxType] == "D"))
367367 then ((startTime + TEN_MINUTES_MILLIS) > now)
368368 else false)
369369 then (3 >= distance)
370370 else false
371371 }
372372
373373
374374 func isUsualLocation (location) = {
375375 let locType = split(location, "_")[locIdxType]
376376 if ((locType != "T"))
377377 then (locType != "D")
378378 else false
379379 }
380380
381381
382382 func onMission (tourContract,location) = {
383383 let lastId = valueOrElse(getInteger(tourContract, lastTourIdKey), 0)
384384 let loc = split(location, "_")
385385 let now = lastBlock.timestamp
386386 let tData = getTourData(tourContract, lastId)
387387 let static = tData[idxStatic]
388388 let dynamic = tData[idxDynamic]
389389 let locType = loc[locIdxType]
390390 if ((locType == "D"))
391391 then true
392392 else if (if (if ((loc[locIdxType] == "T"))
393393 then (parseIntValue(loc[locIdxContinent]) == lastId)
394394 else false)
395395 then (dynamic[tDynamicStatus] == "INPROGRESS")
396396 else false)
397397 then (parseIntValue(static[tStaticEnd]) > now)
398398 else false
399399 }
400400
401401
402402 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
403403
404404
405405 func cheatAttempt (oldLoc,newLoc,cheatCase) = throw(((((("Cheat attempt: oldLoc=" + oldLoc) + ", newLoc=") + newLoc) + ", case=") + toString(cheatCase)))
406406
407407
408408 let KS_SEPARATE_PUBLIC_KEY = false
409409
410410 let KS_ALLOW_BIG_INFRA_MERGE = false
411411
412412 let DAY_MILLIS = 86400000
413413
414414 let chain = take(drop(this.bytes, 1), 1)
415415
416416 let usdtAssetId = match chain {
417417 case _ =>
418418 if ((base58'2W' == $match0))
419419 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
420420 else if ((base58'2T' == $match0))
421421 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
422422 else throw("Unknown chain")
423423 }
424424
425425 let defaultRestAddressStr = match chain {
426426 case _ =>
427427 if ((base58'2W' == $match0))
428428 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
429429 else if ((base58'2T' == $match0))
430430 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
431431 else throw("Unknown chain")
432432 }
433433
434434 let InfraUpgradeCostS = match chain {
435435 case _ =>
436436 if ((base58'2W' == $match0))
437437 then 10000000000
438438 else if ((base58'2T' == $match0))
439439 then 100000000
440440 else throw("Unknown chain")
441441 }
442442
443443 let arbitrageDelay = match chain {
444444 case _ =>
445445 if ((base58'2W' == $match0))
446446 then DAY_MILLIS
447447 else if ((base58'2T' == $match0))
448448 then 60000
449449 else throw("Unknown chain")
450450 }
451451
452452 let DELIVERY_PUNISHMENT = match chain {
453453 case _ =>
454454 if ((base58'2W' == $match0))
455455 then 10800000
456456 else if ((base58'2T' == $match0))
457457 then 900000
458458 else throw("Unknown chain")
459459 }
460460
461461 let SEP = "__"
462462
463463 let MULT6 = 1000000
464464
465465 let MULT8 = 100000000
466466
467467 let SSIZE = 25
468468
469469 let MSIZE = 100
470470
471471 let LSIZE = 225
472472
473473 let XLSIZE = 400
474474
475475 let XXLSIZE = 625
476476
477477 let ITER6 = [0, 1, 2, 3, 4, 5]
478478
479479 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
480480
481481
482482 let IdxCfgStakingDapp = 1
483483
484484 let IdxCfgEconomyDapp = 2
485485
486486 let IdxCfgGovernanceDapp = 3
487487
488488 let IdxCfgWlgDapp = 4
489489
490490 let IdxCfgTournamentDapp = 7
491491
492492 let IdxCfgAcresDapp = 8
493493
494494 func keyRestCfg () = "%s__restConfig"
495495
496496
497497 func keyRestAddress () = "%s__restAddr"
498498
499499
500500 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
501501
502502
503503 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
504504
505505
506506 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
507507
508508 let restCfg = readRestCfgOrFail(restContract)
509509
510510 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
511511
512512 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
513513
514514 let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
515515
516516 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
517517
518518 let tournamentContract = getContractAddressOrFail(restCfg, IdxCfgTournamentDapp)
519519
520520 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
521521
522522 let recLandNum = 0
523523
524524 let recLandSize = 1
525525
526526 let recTerrains = 2
527527
528528 let recContinent = 3
529529
530530 let wlgAssetIdKey = "wlg_assetId"
531531
532532 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
533533
534534 let acresAssetIdKey = "acresAssetId"
535535
536536 let acresAssetId = valueOrErrorMessage(getBinary(acresContract, acresAssetIdKey), "ACRES is not issued yet")
537537
538538 let randomDelay = 2
539539
540540 func keyCommit (address) = ("finishBlockForAddr_" + address)
541541
542542
543543 func keyResProportions () = "resTypesProportions"
544544
545545
546546 func keyResTypesByContinent (continent) = ("resTypesByContinent_" + continent)
547547
548548
549549 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
550550
551551
552552 func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
553553
554554
555555 func asString (v) = match v {
556556 case s: String =>
557557 s
558558 case _ =>
559559 throw("fail to cast into String")
560560 }
561561
562562
563563 func asInt (v) = match v {
564564 case n: Int =>
565565 n
566566 case _ =>
567567 throw("fail to cast into Int")
568568 }
569569
570570
571571 func asAnyList (v) = match v {
572572 case l: List[Any] =>
573573 l
574574 case _ =>
575575 throw("fail to cast into List[Any]")
576576 }
577577
578578
579579 func asBoolean (v) = match v {
580580 case s: Boolean =>
581581 s
582582 case _ =>
583583 throw("fail to cast into Boolean")
584584 }
585585
586586
587587 func numPiecesBySize (landSize) = match landSize {
588588 case _ =>
589589 if (("S" == $match0))
590590 then SSIZE
591591 else if (("M" == $match0))
592592 then MSIZE
593593 else if (("L" == $match0))
594594 then LSIZE
595595 else if (("XL" == $match0))
596596 then XLSIZE
597597 else if (("XXL" == $match0))
598598 then XXLSIZE
599599 else throw("Unknown land size")
600600 }
601601
602602
603603 func isDigit (s) = isDefined(parseInt(s))
604604
605605
606606 func keyBlocked () = "contractsBlocked"
607607
608608
609609 func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
610610
611611
612612 func fixedPoint (val,decimals) = {
613613 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
614614 let lowPart = toString((val % tenPow))
615615 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
616616 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
617617 }
618618
619619
620620 func getRandomNumber (maxValue,salt,entropy) = {
621621 let randomHash = sha256((salt + entropy))
622622 (toInt(randomHash) % maxValue)
623623 }
624624
625625
626626 let incubatorAddr = match chain {
627627 case _ =>
628628 if ((base58'2W' == $match0))
629629 then addressFromStringValue("3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv")
630630 else if ((base58'2T' == $match0))
631631 then this
632632 else throw("Unknown chain")
633633 }
634634
635635 let breederAddr = match chain {
636636 case _ =>
637637 if ((base58'2W' == $match0))
638638 then addressFromStringValue("3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb")
639639 else if ((base58'2T' == $match0))
640640 then this
641641 else throw("Unknown chain")
642642 }
643643
644644 let pub = match chain {
645645 case _ =>
646646 if ((base58'2W' == $match0))
647647 then if (KS_SEPARATE_PUBLIC_KEY)
648648 then base58'CWsMtTZC5BjjoL4Q1ayW4Wwb1ehGACQB6DrKyPgotKfm'
649649 else base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
650650 else if ((base58'2T' == $match0))
651651 then base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
652652 else throw("Unknown chain")
653653 }
654654
655655 let EMPTY_PROD50 = base64'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='
656656
657657 let FIVEMINUTESMILLIS = 300000
658658
659659 let RENAMINGCOST = 5000000
660660
661661 let MAXNAMELEN = 50
662662
663663 let InfraUpgradeCostSUsdt = 10000000
664664
665665 let EXPMATERIALS = match chain {
666666 case _ =>
667667 if ((base58'2W' == $match0))
668668 then 252289527462
669669 else if ((base58'2T' == $match0))
670670 then 2522895274
671671 else throw("Unknown chain")
672672 }
673673
674674 let EXPUSDT = match chain {
675675 case _ =>
676676 if ((base58'2W' == $match0))
677677 then 250000000
678678 else if ((base58'2T' == $match0))
679679 then 250000000
680680 else throw("Unknown chain")
681681 }
682682
683683 let S_COST_ACRES = 2500000000
684684
685685 let FIVEX = toBigInt(5)
686686
687687 let TWENTYX = toBigInt(20)
688688
689689 let TWENTY2X = toBigInt((20 * 20))
690690
691691 let TWENTY3X = toBigInt(((20 * 20) * 20))
692692
693693 let TWENTY4X = toBigInt((((20 * 20) * 20) * 20))
694694
695695 let TWENTY5X = toBigInt(((((20 * 20) * 20) * 20) * 20))
696696
697697 let PRESALENUMLANDS = 500
698698
699699 func keyNextFreeLandNum () = "nextLandNum"
700700
701701
702702 func keyLandCustomNameToAssetId (name) = ("lcn_" + name)
703703
704704
705705 func keyLandToAssetId (landNum) = ("la_" + landNum)
706706
707707
708708 func keyInfraLevelByAssetIdAndOwner (assetId,ownerAddr) = ((("ilao_" + assetId) + "_") + ownerAddr)
709709
710710
711711 func keyLandNumToOwner (landNum) = ("lo_" + landNum)
712712
713713
714714 func keyDuckCustomNameToAssetId (name) = ("duckByCustomName_" + name)
715715
716716
717717 func keyCustomNameToAddress (name) = ("accountByCustomName_" + name)
718718
719719
720720 func keyOldies () = "oldiesList"
721721
722722
723723 let claimModeWh = 0
724724
725725 let claimModeDuck = 1
726726
727727 let claimModeWhThenDuck = 2
728728
729729 let flHealth = 0
730730
731731 let flTimestamp = 5
732732
733733 let flBonus = 6
734734
735735 let flProdsUsed = 7
736736
737737 func nftName (landNum,landSize) = ((LANDPREFIX + landNum) + landSize)
738738
739739
740740 func toVolume (amount,pkgSize) = {
741741 let pkgs = if ((amount >= 0))
742742 then (((amount + pkgSize) - 1) / pkgSize)
743743 else -((((-(amount) + pkgSize) - 1) / pkgSize))
744744 (pkgs * MULT8)
745745 }
746746
747747
748748 func distributeByWeights (total,weights) = {
749749 let sum = (((((weights[0] + weights[1]) + weights[2]) + weights[3]) + weights[4]) + weights[5])
750750 if ((0 >= sum))
751751 then throw("Zero weights sum")
752752 else {
753753 let norm6 = fraction(total, MULT6, sum)
754754 func normalizer (acc,elem) = (acc :+ fraction(elem, norm6, MULT6))
755755
756756 let $l = weights
757757 let $s = size($l)
758758 let $acc0 = nil
759759 func $f0_1 ($a,$i) = if (($i >= $s))
760760 then $a
761761 else normalizer($a, $l[$i])
762762
763763 func $f0_2 ($a,$i) = if (($i >= $s))
764764 then $a
765765 else throw("List size exceeds 6")
766766
767767 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
768768 }
769769 }
770770
771771
772772 func getNeededMaterials (total) = {
773773 let props = split(value(getString(keyResProportions())), "_")
774774 if ((size(props) != NUMRES))
775775 then throw("Wrong proportions data")
776776 else {
777777 let r = [parseIntValue(props[0]), parseIntValue(props[1]), parseIntValue(props[2]), parseIntValue(props[3]), parseIntValue(props[4]), parseIntValue(props[5])]
778778 distributeByWeights(total, r)
779779 }
780780 }
781781
782782
783783 func subtractMaterials (shouldUseMat,has,totalNeed) = {
784784 let need = getNeededMaterials(totalNeed)
785785 func subtractor (acc,idx) = {
786786 let result = (parseIntValue(has[idx]) - need[idx])
787787 if ((0 > result))
788788 then throw(((((("Not enough material idx=" + toString(idx)) + ", you have ") + has[idx]) + ", but need ") + toString(need[idx])))
789789 else (acc :+ toString(result))
790790 }
791791
792792 if (shouldUseMat)
793793 then {
794794 let $l = ITER6
795795 let $s = size($l)
796796 let $acc0 = nil
797797 func $f0_1 ($a,$i) = if (($i >= $s))
798798 then $a
799799 else subtractor($a, $l[$i])
800800
801801 func $f0_2 ($a,$i) = if (($i >= $s))
802802 then $a
803803 else throw("List size exceeds 6")
804804
805805 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
806806 }
807807 else has
808808 }
809809
810810
811811 func subtractEquipment (oldEq,pUsed) = if ((pUsed == ""))
812812 then $Tuple2(oldEq, false)
813813 else {
814814 func subUsed (acc,idxAmt) = {
815815 let parts = split(idxAmt, ",")
816816 if ((size(parts) != 2))
817817 then throw("Incorrect format, should be index,amount")
818818 else {
819819 let idx = parseIntValue(parts[0])
820820 if (if ((0 > idx))
821821 then true
822822 else (idx >= size(productionMatrix)))
823823 then throw("Unknown product idx")
824824 else {
825825 let amt = parseIntValue(parts[1])
826826 let eqParts = split(acc._1, (parts[0] + ":"))
827827 if ((size(eqParts) != 2))
828828 then throw((("You don't have " + prodTypes[idx]) + " equipped"))
829829 else {
830830 let tmp = eqParts[1]
831831 let numLen = if (isDigit(take(drop(tmp, 1), 1)))
832832 then 2
833833 else 1
834834 let curr = parseIntValue(take(tmp, numLen))
835835 let tail = drop(tmp, numLen)
836836 let newAmt = if ((curr >= amt))
837837 then (curr - amt)
838838 else throw(((((("You equipped " + toString(curr)) + " of ") + prodTypes[idx]) + ", but tried to use ") + toString(amt)))
839839 $Tuple2(((((eqParts[0] + parts[0]) + ":") + toString(newAmt)) + tail), if (acc._2)
840840 then true
841841 else if (if ((idx >= 6))
842842 then (8 >= idx)
843843 else false)
844844 then (newAmt == 0)
845845 else false)
846846 }
847847 }
848848 }
849849 }
850850
851851 let $l = split(pUsed, "_")
852852 let $s = size($l)
853853 let $acc0 = $Tuple2(oldEq, false)
854854 func $f0_1 ($a,$i) = if (($i >= $s))
855855 then $a
856856 else subUsed($a, $l[$i])
857857
858858 func $f0_2 ($a,$i) = if (($i >= $s))
859859 then $a
860860 else throw("List size exceeds 10")
861861
862862 $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)
863863 }
864864
865865
866866 func prodStrToBytes (prodStr) = {
867867 let pList = if ((prodStr == ""))
868868 then nil
869869 else split_4C(prodStr, "_")
870870 func toBV (acc,recipe) = {
871871 let j = (size(acc) / 8)
872872 let curr = if ((size(pList) > j))
873873 then parseIntValue(pList[j])
874874 else 0
875875 (acc + toBytes(curr))
876876 }
877877
878878 let $l = productionMatrix
879879 let $s = size($l)
880880 let $acc0 = base58''
881881 func $f0_1 ($a,$i) = if (($i >= $s))
882882 then $a
883883 else toBV($a, $l[$i])
884884
885885 func $f0_2 ($a,$i) = if (($i >= $s))
886886 then $a
887887 else throw("List size exceeds 50")
888888
889889 $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)
890890 }
891891
892892
893893 func bytesToProdStr (bv) = {
894894 func fromBV (acc,recipe) = {
895895 let j = size(acc)
896896 let b = take(drop(bv, (8 * j)), 8)
897897 (acc :+ toString(toInt(b)))
898898 }
899899
900900 makeString_2C({
901901 let $l = productionMatrix
902902 let $s = size($l)
903903 let $acc0 = nil
904904 func $f0_1 ($a,$i) = if (($i >= $s))
905905 then $a
906906 else fromBV($a, $l[$i])
907907
908908 func $f0_2 ($a,$i) = if (($i >= $s))
909909 then $a
910910 else throw("List size exceeds 50")
911911
912912 $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)
913913 }, "_")
914914 }
915915
916916
917917 func checkStatRequirements (duckStats,reqs) = {
918918 func check (acc,j) = {
919919 let buff = if ((size(duckStats) > (7 + j)))
920920 then duckStats[(7 + j)]
921921 else 0
922922 if ((parseIntValue(reqs[j]) > (duckStats[j] + buff)))
923923 then throw(("Requirement not satisfied: " + requirements[j]))
924924 else true
925925 }
926926
927927 let $l = [0, 1, 2, 3, 4, 5, 6]
928928 let $s = size($l)
929929 let $acc0 = false
930930 func $f0_1 ($a,$i) = if (($i >= $s))
931931 then $a
932932 else check($a, $l[$i])
933933
934934 func $f0_2 ($a,$i) = if (($i >= $s))
935935 then $a
936936 else throw("List size exceeds 7")
937937
938938 $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)
939939 }
940940
941941
942942 func placeProdB (idxCnt,pList,isPositive,duckStats,occupied,free) = {
943943 let parts = split(idxCnt, ":")
944944 if ((size(parts) != 2))
945945 then throw("Incorrect format, should be index:amount")
946946 else if (if (!(isPositive))
947947 then (size(parts[0]) != 2)
948948 else false)
949949 then throw("Product idx should be 2 digits, zero padded")
950950 else {
951951 let productIdx = parseIntValue(parts[0])
952952 let count = parseIntValue(parts[1])
953953 if (!(containsElement(fortAllowedProds, productIdx)))
954954 then throw((("Product '" + prodTypes[productIdx]) + "' cannot be used for land defense"))
955955 else if ((0 > count))
956956 then throw("Count can't be negative")
957957 else if ((count > MAXPRODINSLOT))
958958 then throw(((("Can't put more than " + toString(MAXPRODINSLOT)) + " of ") + prodTypes[productIdx]))
959959 else if ((count == 0))
960960 then $Tuple3(pList, occupied, free)
961961 else {
962962 let head = take(pList, (8 * productIdx))
963963 let curr = toInt(take(drop(pList, (8 * productIdx)), 8))
964964 let tail = drop(pList, (8 * (productIdx + 1)))
965965 let recipe = split(productionMatrix[productIdx], "_")
966966 if (if (!(isPositive))
967967 then (count > curr)
968968 else false)
969969 then throw(((((("You have " + toString(curr)) + " of ") + prodTypes[productIdx]) + ", but tried to use ") + toString(count)))
970970 else {
971971 let newAmt = if (if (!(isPositive))
972972 then checkStatRequirements(duckStats, split(recipe[rIdxRequirements], ","))
973973 else false)
974974 then (curr - count)
975975 else (curr + count)
976976 let deltaVol = (toVolume(newAmt, PRODUCTPKGSIZE) - toVolume(curr, PRODUCTPKGSIZE))
977977 $Tuple3(((head + toBytes(newAmt)) + tail), (occupied + deltaVol), (free - deltaVol))
978978 }
979979 }
980980 }
981981 }
982982
983983
984984 func addProdB (idxCnt,pList,isPositive,segment,mainAux,slot,duckStats) = {
985985 let parts = split(idxCnt, ":")
986986 if ((size(parts) != 2))
987987 then throw("Incorrect format, should be index:amount")
988988 else if (if (!(isPositive))
989989 then (size(parts[0]) != 2)
990990 else false)
991991 then throw("Product idx should be 2 digits, zero padded")
992992 else {
993993 let productIdx = parseIntValue(parts[0])
994994 let count = parseIntValue(parts[1])
995995 if (if ((0 > productIdx))
996996 then true
997997 else (productIdx >= size(productionMatrix)))
998998 then throw("Unknown product idx")
999999 else if ((0 > count))
10001000 then throw("Count can't be negative")
10011001 else if ((count > MAXPRODINSLOT))
10021002 then throw(((("Can't put more than " + toString(MAXPRODINSLOT)) + " of ") + prodTypes[productIdx]))
10031003 else if ((count == 0))
10041004 then $Tuple2(pList, false)
10051005 else {
10061006 let head = take(pList, (8 * productIdx))
10071007 let curr = toInt(take(drop(pList, (8 * productIdx)), 8))
10081008 let tail = drop(pList, (8 * (productIdx + 1)))
10091009 let recipe = split(productionMatrix[productIdx], "_")
10101010 if (if (!(isPositive))
10111011 then (count > curr)
10121012 else false)
10131013 then throw(((((("You have " + toString(curr)) + " of ") + prodTypes[productIdx]) + ", but tried to use ") + toString(count)))
10141014 else {
10151015 let isBigItem = if (if (!(isPositive))
10161016 then checkStatRequirements(duckStats, split(recipe[rIdxRequirements], ","))
10171017 else false)
10181018 then {
10191019 let compat = recipe[rIdxSlots]
10201020 if ((compat == ""))
10211021 then throw("Item cannot be equipped")
10221022 else {
10231023 let c = parseIntValue(compat)
10241024 let cSeg = (c / 100)
10251025 if ((segment != cSeg))
10261026 then throw("Segment incompatible")
10271027 else {
10281028 let cMainAux = ((c % 100) / 10)
10291029 if ((mainAux != cMainAux))
10301030 then throw("Slot incompatible")
10311031 else {
10321032 let cNumSlots = (c % 10)
10331033 if (if ((slot != 0))
10341034 then (cNumSlots > 1)
10351035 else false)
10361036 then throw("Big items should occupy slot 0")
10371037 else (cNumSlots > 1)
10381038 }
10391039 }
10401040 }
10411041 }
10421042 else false
10431043 $Tuple2(((head + toBytes((curr + (if (isPositive)
10441044 then count
10451045 else -(count))))) + tail), isBigItem)
10461046 }
10471047 }
10481048 }
10491049 }
10501050
10511051
10521052 func slotsGroupB (g,bpIn,isPositive,segment,mainAux,stats) = if ((g != ""))
10531053 then {
10541054 let slots = split(g, ",")
10551055 if ((size(slots) > MAXSLOTS))
10561056 then throw("Wrong slots format")
10571057 else {
10581058 let s0 = slots[0]
10591059 let s1 = if ((size(slots) > 1))
10601060 then slots[1]
10611061 else ""
10621062 if (if ((s0 == ""))
10631063 then (s1 == "")
10641064 else false)
10651065 then bpIn
10661066 else {
10671067 let tmpS0 = if ((s0 != ""))
10681068 then addProdB(s0, bpIn, isPositive, segment, mainAux, 0, stats)
10691069 else $Tuple2(bpIn, false)
10701070 if ((s1 != ""))
10711071 then if (tmpS0._2)
10721072 then throw("Big item already occupies slot")
10731073 else addProdB(s1, tmpS0._1, isPositive, segment, mainAux, 1, stats)._1
10741074 else tmpS0._1
10751075 }
10761076 }
10771077 }
10781078 else bpIn
10791079
10801080
10811081 func dressB (segList,pBytes,isPositive,stats) = {
10821082 func segment (acc,seg) = {
10831083 let j = acc._1
10841084 let mainAux = split(seg, ";")
10851085 if ((size(mainAux) != NUMMAINAUX))
10861086 then throw("Wrong segment format")
10871087 else {
10881088 let m = mainAux[0]
10891089 let a = mainAux[1]
10901090 if (if ((m == ""))
10911091 then (a == "")
10921092 else false)
10931093 then $Tuple2((j + 1), acc._2)
10941094 else {
10951095 let tmpM = slotsGroupB(m, acc._2, isPositive, j, 0, stats)
10961096 $Tuple2((j + 1), slotsGroupB(a, tmpM, isPositive, j, 1, stats))
10971097 }
10981098 }
10991099 }
11001100
11011101 ( let $l = segList
11021102 let $s = size($l)
11031103 let $acc0 = $Tuple2(0, pBytes)
11041104 func $f0_1 ($a,$i) = if (($i >= $s))
11051105 then $a
11061106 else segment($a, $l[$i])
11071107
11081108 func $f0_2 ($a,$i) = if (($i >= $s))
11091109 then $a
11101110 else throw("List size exceeds 6")
11111111
11121112 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6))._2
11131113 }
11141114
11151115
11161116 func fortB (segList,pBytes,occupied,free,isPositive,duckStats) = if ((3 > size(segList)))
11171117 then throw("At least duck, mines and traps parts are required")
11181118 else {
11191119 func segment (acc,seg) = {
11201120 let j = acc._1
11211121 if ((j == 0))
11221122 then $Tuple4((j + 1), acc._2, acc._3, acc._4)
11231123 else {
11241124 let p = placeProdB(seg, acc._2, isPositive, duckStats, acc._3, acc._4)
11251125 $Tuple4((j + 1), p._1, p._2, p._3)
11261126 }
11271127 }
11281128
11291129 let t = {
11301130 let $l = segList
11311131 let $s = size($l)
11321132 let $acc0 = $Tuple4(0, pBytes, occupied, free)
11331133 func $f0_1 ($a,$i) = if (($i >= $s))
11341134 then $a
11351135 else segment($a, $l[$i])
11361136
11371137 func $f0_2 ($a,$i) = if (($i >= $s))
11381138 then $a
11391139 else throw("List size exceeds 10")
11401140
11411141 $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)
11421142 }
11431143 $Tuple3(t._2, t._3, t._4)
11441144 }
11451145
11461146
11471147 func canWearCurrentEquipment (duckAssetId) = {
11481148 let eqKey = keyDuckEquipment(duckAssetId)
11491149 let currEq = split(valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,"), "_")
11501150 let tempProdB = dressB(currEq, EMPTY_PROD50, true, nil)
11511151 let segBpAux = split(currEq[segBackpack], ";")[1]
11521152 let buffEffect = if ((segBpAux == ""))
11531153 then 0
11541154 else {
11551155 let aux0 = split(segBpAux, ",")[0]
11561156 if ((aux0 == ""))
11571157 then 0
11581158 else {
11591159 let idxCnt = split(aux0, ":")
11601160 let idx = idxCnt[0]
11611161 let cnt = idxCnt[1]
11621162 if (if (if (if (if ((idx == "06"))
11631163 then true
11641164 else (idx == "07"))
11651165 then true
11661166 else (idx == "08"))
11671167 then (cnt != "")
11681168 else false)
11691169 then (parseIntValue(cnt) > 0)
11701170 else false)
11711171 then parseIntValue(split(productionMatrix[parseIntValue(idx)], "_")[rIdxEffect])
11721172 else 0
11731173 }
11741174 }
11751175 let stats = getDuckStats(this, duckAssetId, buffEffect, true)
11761176 let newProdB = dressB(currEq, tempProdB, false, stats)
11771177 (newProdB == newProdB)
11781178 }
11791179
11801180
11811181 func updateProportionsInternal (propList,terrainCounts,landSizeIndex,sign) = if ((size(propList) != NUMRES))
11821182 then throw("Wrong proportions data")
11831183 else {
11841184 func updater (acc,i) = {
11851185 let result = (parseIntValue(propList[i]) + ((sign * terrainCounts[i]) * landSizeIndex))
11861186 if ((0 > result))
11871187 then throw(((((((("Panic! Pieces of type=" + toString(i)) + ", sign=") + toString(sign)) + ", terrainCounts[i]=") + toString(terrainCounts[i])) + ", landSizeIndex=") + toString(landSizeIndex)))
11881188 else (acc :+ toString(result))
11891189 }
11901190
11911191 let $l = ITER6
11921192 let $s = size($l)
11931193 let $acc0 = nil
11941194 func $f0_1 ($a,$i) = if (($i >= $s))
11951195 then $a
11961196 else updater($a, $l[$i])
11971197
11981198 func $f0_2 ($a,$i) = if (($i >= $s))
11991199 then $a
12001200 else throw("List size exceeds 6")
12011201
12021202 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12031203 }
12041204
12051205
12061206 func updateProportions (terrainCounts,landSizeIndex,sign) = {
12071207 let propList = split(valueOrElse(getString(keyResProportions()), "0_0_0_0_0_0"), "_")
12081208 makeString(updateProportionsInternal(propList, terrainCounts, landSizeIndex, sign), "_")
12091209 }
12101210
12111211
12121212 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)]
12131213
12141214
12151215 func addRes (currentRes,terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
12161216 func adder (acc,i) = {
12171217 let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCounts[i]) * landSizeIndex)
12181218 (acc :+ toString((parseIntValue(currentRes[i]) + resOfType)))
12191219 }
12201220
12211221 let r = {
12221222 let $l = ITER6
12231223 let $s = size($l)
12241224 let $acc0 = nil
12251225 func $f0_1 ($a,$i) = if (($i >= $s))
12261226 then $a
12271227 else adder($a, $l[$i])
12281228
12291229 func $f0_2 ($a,$i) = if (($i >= $s))
12301230 then $a
12311231 else throw("List size exceeds 6")
12321232
12331233 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12341234 }
12351235 makeString(r, "_")
12361236 }
12371237
12381238
12391239 func virtClaim (terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
12401240 func adder (acc,i) = {
12411241 let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCounts[i]) * landSizeIndex)
12421242 $Tuple2((acc._1 :+ resOfType), (acc._2 + resOfType))
12431243 }
12441244
12451245 let $l = ITER6
12461246 let $s = size($l)
12471247 let $acc0 = $Tuple2(nil, 0)
12481248 func $f0_1 ($a,$i) = if (($i >= $s))
12491249 then $a
12501250 else adder($a, $l[$i])
12511251
12521252 func $f0_2 ($a,$i) = if (($i >= $s))
12531253 then $a
12541254 else throw("List size exceeds 6")
12551255
12561256 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12571257 }
12581258
12591259
12601260 func distributeRes (currentWhRes,currentPackRes,resToClaim,whSpaceLeft) = {
12611261 let resListToClaim = resToClaim._1
12621262 let resAmToClaim = resToClaim._2
12631263 if ((resAmToClaim == 0))
12641264 then $Tuple2(makeString(currentWhRes, "_"), makeString(currentPackRes, "_"))
12651265 else if ((whSpaceLeft >= resAmToClaim))
12661266 then {
12671267 func addLists (acc,i) = (acc :+ toString((parseIntValue(currentWhRes[i]) + resListToClaim[i])))
12681268
12691269 let r = {
12701270 let $l = ITER6
12711271 let $s = size($l)
12721272 let $acc0 = nil
12731273 func $f0_1 ($a,$i) = if (($i >= $s))
12741274 then $a
12751275 else addLists($a, $l[$i])
12761276
12771277 func $f0_2 ($a,$i) = if (($i >= $s))
12781278 then $a
12791279 else throw("List size exceeds 6")
12801280
12811281 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12821282 }
12831283 $Tuple2(makeString(r, "_"), makeString(currentPackRes, "_"))
12841284 }
12851285 else {
12861286 func addPartLists (acc,i) = {
12871287 let whPart = fraction(resListToClaim[i], whSpaceLeft, resAmToClaim)
12881288 $Tuple2((acc._1 :+ toString((parseIntValue(currentWhRes[i]) + whPart))), (acc._2 :+ toString(((parseIntValue(currentPackRes[i]) + resListToClaim[i]) - whPart))))
12891289 }
12901290
12911291 let r = {
12921292 let $l = ITER6
12931293 let $s = size($l)
12941294 let $acc0 = $Tuple2(nil, nil)
12951295 func $f0_1 ($a,$i) = if (($i >= $s))
12961296 then $a
12971297 else addPartLists($a, $l[$i])
12981298
12991299 func $f0_2 ($a,$i) = if (($i >= $s))
13001300 then $a
13011301 else throw("List size exceeds 6")
13021302
13031303 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13041304 }
13051305 $Tuple2(makeString(r._1, "_"), makeString(r._2, "_"))
13061306 }
13071307 }
13081308
13091309
13101310 func abs (x) = if ((x >= toBigInt(0)))
13111311 then x
13121312 else -(x)
13131313
13141314
13151315 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]]
13161316
13171317 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]
13181318
13191319 let TCHARS = ["A", "B", "C", "D", "E", "F"]
13201320
13211321 func addStrInt (acc,el) = (acc + parseIntValue(el))
13221322
13231323
13241324 func genRand (maxRand,inSeed) = if ((maxRand == 0))
13251325 then throw("maxRand should be non-zero")
13261326 else {
13271327 let bigMax = toBigInt(maxRand)
13281328 $Tuple2(toInt((inSeed % bigMax)), (inSeed / bigMax))
13291329 }
13301330
13311331
13321332 func findSlot (arr,rnd,delta) = {
13331333 func find (acc,el) = if (acc._1)
13341334 then acc
13351335 else {
13361336 let rem = ((acc._3 - el) - delta)
13371337 if ((0 > rem))
13381338 then $Tuple3(true, acc._2, 0)
13391339 else $Tuple3(false, (acc._2 + 1), rem)
13401340 }
13411341
13421342 let r = {
13431343 let $l = arr
13441344 let $s = size($l)
13451345 let $acc0 = $Tuple3(false, 0, rnd)
13461346 func $f0_1 ($a,$i) = if (($i >= $s))
13471347 then $a
13481348 else find($a, $l[$i])
13491349
13501350 func $f0_2 ($a,$i) = if (($i >= $s))
13511351 then $a
13521352 else throw("List size exceeds 6")
13531353
13541354 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13551355 }
13561356 r._2
13571357 }
13581358
13591359
13601360 func gen1 (seed0,landSizeIndex) = {
13611361 func continentSums (ac,cont) = {
13621362 let curr = split(valueOrElse(getString(keyResTypesByContinent(cont)), "0_0_0_0_0_0"), "_")
1363- let contSum = {
1363+ let cSum = {
13641364 let $l = curr
13651365 let $s = size($l)
13661366 let $acc0 = 0
13671367 func $f0_1 ($a,$i) = if (($i >= $s))
13681368 then $a
13691369 else addStrInt($a, $l[$i])
13701370
13711371 func $f0_2 ($a,$i) = if (($i >= $s))
13721372 then $a
13731373 else throw("List size exceeds 6")
13741374
13751375 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13761376 }
1377- $Tuple2((ac._1 :+ contSum), (ac._2 + contSum))
1377+ $Tuple2((ac._1 :+ cSum), (ac._2 + cSum))
13781378 }
13791379
1380- let $t01982820212 = {
1380+ let $t01981920203 = {
13811381 let $l = continents
13821382 let $s = size($l)
13831383 let $acc0 = $Tuple2(nil, 0)
13841384 func $f0_1 ($a,$i) = if (($i >= $s))
13851385 then $a
13861386 else continentSums($a, $l[$i])
13871387
13881388 func $f0_2 ($a,$i) = if (($i >= $s))
13891389 then $a
13901390 else throw("List size exceeds 5")
13911391
13921392 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
13931393 }
1394- let contSums = $t01982820212._1
1395- let total = $t01982820212._2
1394+ let contSums = $t01981920203._1
1395+ let total = $t01981920203._2
13961396 let maxSum = max(contSums)
13971397 let rTotal = ((maxSum * 5) - total)
13981398 let deltaCont = (rTotal / 50)
1399- let $t02037820666 = if ((rTotal == 0))
1399+ let $t02036920657 = if ((rTotal == 0))
14001400 then genRand(5, seed0)
14011401 else {
1402- let $t02046220515 = genRand((rTotal + (deltaCont * 5)), seed0)
1403- let r = $t02046220515._1
1404- let out = $t02046220515._2
1402+ let $t02045320506 = genRand((rTotal + (deltaCont * 5)), seed0)
1403+ let r = $t02045320506._1
1404+ let out = $t02045320506._2
14051405 func subr (acc,el) = (acc :+ (maxSum - el))
14061406
14071407 let compl = {
14081408 let $l = contSums
14091409 let $s = size($l)
14101410 let $acc0 = nil
14111411 func $f1_1 ($a,$i) = if (($i >= $s))
14121412 then $a
14131413 else subr($a, $l[$i])
14141414
14151415 func $f1_2 ($a,$i) = if (($i >= $s))
14161416 then $a
14171417 else throw("List size exceeds 6")
14181418
14191419 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14201420 }
14211421 $Tuple2(findSlot(compl, r, deltaCont), out)
14221422 }
1423- let contIdx = $t02037820666._1
1424- let seed1 = $t02037820666._2
1423+ let contIdx = $t02036920657._1
1424+ let seed1 = $t02036920657._2
14251425 let target = targetFreqByContinent[contIdx]
14261426 let actual = split(valueOrElse(getString(keyResTypesByContinent(continents[contIdx])), "0_0_0_0_0_0"), "_")
14271427 func toInts (acc,el) = (acc :+ parseIntValue(el))
14281428
14291429 let actualInts = {
14301430 let $l = actual
14311431 let $s = size($l)
14321432 let $acc0 = nil
14331433 func $f1_1 ($a,$i) = if (($i >= $s))
14341434 then $a
14351435 else toInts($a, $l[$i])
14361436
14371437 func $f1_2 ($a,$i) = if (($i >= $s))
14381438 then $a
14391439 else throw("List size exceeds 6")
14401440
14411441 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14421442 }
14431443 let contSum = contSums[contIdx]
14441444 func genSingleTerrain (ac,ignored) = {
14451445 func deltaCalc (acc,j) = (acc :+ ((ac._2[j] * 120) - (target[j] * ac._3)))
14461446
14471447 let intDelta = {
14481448 let $l = ITER6
14491449 let $s = size($l)
14501450 let $acc0 = nil
14511451 func $f2_1 ($a,$i) = if (($i >= $s))
14521452 then $a
14531453 else deltaCalc($a, $l[$i])
14541454
14551455 func $f2_2 ($a,$i) = if (($i >= $s))
14561456 then $a
14571457 else throw("List size exceeds 6")
14581458
14591459 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14601460 }
14611461 let maxDelta = max(intDelta)
14621462 func shift (acc,el) = {
14631463 let s = (maxDelta - el)
14641464 $Tuple2((acc._1 :+ s), (acc._2 + s))
14651465 }
14661466
1467- let $t02145121528 = {
1467+ let $t02144221519 = {
14681468 let $l = intDelta
14691469 let $s = size($l)
14701470 let $acc0 = $Tuple2(nil, 0)
14711471 func $f3_1 ($a,$i) = if (($i >= $s))
14721472 then $a
14731473 else shift($a, $l[$i])
14741474
14751475 func $f3_2 ($a,$i) = if (($i >= $s))
14761476 then $a
14771477 else throw("List size exceeds 6")
14781478
14791479 $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14801480 }
1481- let shiftedIntDelta = $t02145121528._1
1482- let sumShiftedIntDelta = $t02145121528._2
1481+ let shiftedIntDelta = $t02144221519._1
1482+ let sumShiftedIntDelta = $t02144221519._2
14831483 let deltaRes = (sumShiftedIntDelta / 60)
1484- let $t02157621796 = if ((sumShiftedIntDelta == 0))
1484+ let $t02156721787 = if ((sumShiftedIntDelta == 0))
14851485 then genRand(6, ac._4)
14861486 else {
1487- let $t02167421738 = genRand((sumShiftedIntDelta + (deltaRes * 6)), ac._4)
1488- let r = $t02167421738._1
1489- let out = $t02167421738._2
1487+ let $t02166521729 = genRand((sumShiftedIntDelta + (deltaRes * 6)), ac._4)
1488+ let r = $t02166521729._1
1489+ let out = $t02166521729._2
14901490 $Tuple2(findSlot(shiftedIntDelta, r, deltaRes), out)
14911491 }
1492- let idx = $t02157621796._1
1493- let seed2 = $t02157621796._2
1492+ let idx = $t02156721787._1
1493+ let seed2 = $t02156721787._2
14941494 func addByIndex (acc,j) = (acc :+ (ac._2[j] + (if ((j == idx))
14951495 then landSizeIndex
14961496 else 0)))
14971497
14981498 let updatedActuals = {
14991499 let $l = ITER6
15001500 let $s = size($l)
15011501 let $acc0 = nil
15021502 func $f4_1 ($a,$i) = if (($i >= $s))
15031503 then $a
15041504 else addByIndex($a, $l[$i])
15051505
15061506 func $f4_2 ($a,$i) = if (($i >= $s))
15071507 then $a
15081508 else throw("List size exceeds 6")
15091509
15101510 $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6)
15111511 }
15121512 $Tuple4((ac._1 :+ TCHARS[idx]), updatedActuals, (ac._3 + landSizeIndex), seed2)
15131513 }
15141514
15151515 let result = {
15161516 let $l = PERM25
15171517 let $s = size($l)
15181518 let $acc0 = $Tuple4(nil, actualInts, contSum, seed1)
15191519 func $f2_1 ($a,$i) = if (($i >= $s))
15201520 then $a
15211521 else genSingleTerrain($a, $l[$i])
15221522
15231523 func $f2_2 ($a,$i) = if (($i >= $s))
15241524 then $a
15251525 else throw("List size exceeds 25")
15261526
15271527 $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)
15281528 }
15291529 func permut (acc,j) = (acc + result._1[j])
15301530
15311531 $Tuple2(contIdx, {
15321532 let $l = PERM25
15331533 let $s = size($l)
15341534 let $acc0 = ""
15351535 func $f3_1 ($a,$i) = if (($i >= $s))
15361536 then $a
15371537 else permut($a, $l[$i])
15381538
15391539 func $f3_2 ($a,$i) = if (($i >= $s))
15401540 then $a
15411541 else throw("List size exceeds 25")
15421542
15431543 $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)
15441544 })
15451545 }
15461546
15471547
15481548 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]]
15491549
15501550 func genChar (n,freqs) = {
15511551 let rem = toInt((n % TWENTYX))
15521552 let letter = if ((freqs[0] > rem))
15531553 then "A"
15541554 else if ((freqs[1] > rem))
15551555 then "B"
15561556 else if ((freqs[2] > rem))
15571557 then "C"
15581558 else if ((freqs[3] > rem))
15591559 then "D"
15601560 else if ((freqs[4] > rem))
15611561 then "E"
15621562 else "F"
15631563 letter
15641564 }
15651565
15661566
15671567 func genTerrains (seed,continentIdx) = {
15681568 let f = freq[continentIdx]
15691569 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))
15701570
15711571 let t = {
15721572 let $l = [1, 2, 3, 4, 5]
15731573 let $s = size($l)
15741574 let $acc0 = $Tuple2("", (seed / FIVEX))
15751575 func $f0_1 ($a,$i) = if (($i >= $s))
15761576 then $a
15771577 else terrainGenerator($a, $l[$i])
15781578
15791579 func $f0_2 ($a,$i) = if (($i >= $s))
15801580 then $a
15811581 else throw("List size exceeds 5")
15821582
15831583 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
15841584 }
15851585 t._1
15861586 }
15871587
15881588
15891589 func genTerrainsForMerge (sumTerrains,landSizeIndex) = {
15901590 func step1 (acc,s) = {
15911591 let j = acc._2
15921592 let el = parseIntValue(s)
15931593 let x = if ((el == 0))
15941594 then 0
15951595 else if ((el >= (4 * landSizeIndex)))
15961596 then (el / landSizeIndex)
15971597 else if ((el > (3 * landSizeIndex)))
15981598 then 3
15991599 else (((el - 1) / landSizeIndex) + 1)
16001600 $Tuple3((acc._1 :+ x), (acc._2 + 1), (acc._3 + x))
16011601 }
16021602
16031603 let t = {
16041604 let $l = sumTerrains
16051605 let $s = size($l)
16061606 let $acc0 = $Tuple3(nil, 0, 0)
16071607 func $f0_1 ($a,$i) = if (($i >= $s))
16081608 then $a
16091609 else step1($a, $l[$i])
16101610
16111611 func $f0_2 ($a,$i) = if (($i >= $s))
16121612 then $a
16131613 else throw("List size exceeds 6")
16141614
16151615 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
16161616 }
16171617 let arr = t._1
16181618 let maxIdx = value(indexOf(arr, max(arr)))
16191619 let delta = (t._3 - 25)
16201620 func subber (acc,idx) = {
16211621 let val = (arr[idx] - (if ((idx == maxIdx))
16221622 then delta
16231623 else 0))
16241624 let zeroes = if ((val == 0))
16251625 then nil
16261626 else split(drop(toString(pow(10, 0, val, 0, 0, DOWN)), 1), "")
16271627 let c = TCHARS[idx]
16281628 func listGen (ac,ignored) = (ac :+ c)
16291629
16301630 let z = {
16311631 let $l = zeroes
16321632 let $s = size($l)
16331633 let $acc0 = nil
16341634 func $f1_1 ($a,$i) = if (($i >= $s))
16351635 then $a
16361636 else listGen($a, $l[$i])
16371637
16381638 func $f1_2 ($a,$i) = if (($i >= $s))
16391639 then $a
16401640 else throw("List size exceeds 25")
16411641
16421642 $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)
16431643 }
16441644 (acc ++ z)
16451645 }
16461646
16471647 let r = {
16481648 let $l = ITER6
16491649 let $s = size($l)
16501650 let $acc0 = nil
16511651 func $f1_1 ($a,$i) = if (($i >= $s))
16521652 then $a
16531653 else subber($a, $l[$i])
16541654
16551655 func $f1_2 ($a,$i) = if (($i >= $s))
16561656 then $a
16571657 else throw("List size exceeds 6")
16581658
16591659 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
16601660 }
16611661 func permut (acc,j) = (acc + r[j])
16621662
16631663 let $l = PERM25
16641664 let $s = size($l)
16651665 let $acc0 = ""
16661666 func $f2_1 ($a,$i) = if (($i >= $s))
16671667 then $a
16681668 else permut($a, $l[$i])
16691669
16701670 func $f2_2 ($a,$i) = if (($i >= $s))
16711671 then $a
16721672 else throw("List size exceeds 25")
16731673
16741674 $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)
16751675 }
16761676
16771677
16781678 func getBackpack (bpKey) = {
16791679 let p = split(valueOrElse(getString(bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
16801680 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
16811681 then p[bpIdxRes]
16821682 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
16831683 then p[bpIdxMat]
16841684 else "0_0_0_0_0_0", p[bpIdxProd]]
16851685 }
16861686
16871687
16881688 func getWarehouseTotalVolume (volPrefix) = {
16891689 let parts = split(volPrefix, "_")
16901690 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
16911691 }
16921692
16931693
16941694 func getWarehouseOccupiedVol (currentWh) = {
16951695 let goods = currentWh[whIdxProd]
16961696 func sumResMat (acc,item) = (acc + parseIntValue(item))
16971697
16981698 func sumProd (acc,item) = {
16991699 let idx = acc._1
17001700 let pkgs = (((parseIntValue(item) + PRODUCTPKGSIZE) - 1) / PRODUCTPKGSIZE)
17011701 $Tuple2((idx + 1), (acc._2 + (pkgs * MULT8)))
17021702 }
17031703
17041704 let whResVol = {
17051705 let $l = split(currentWh[whIdxRes], "_")
17061706 let $s = size($l)
17071707 let $acc0 = 0
17081708 func $f0_1 ($a,$i) = if (($i >= $s))
17091709 then $a
17101710 else sumResMat($a, $l[$i])
17111711
17121712 func $f0_2 ($a,$i) = if (($i >= $s))
17131713 then $a
17141714 else throw("List size exceeds 6")
17151715
17161716 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
17171717 }
17181718 let whMatVol = {
17191719 let $l = split(currentWh[whIdxMat], "_")
17201720 let $s = size($l)
17211721 let $acc0 = 0
17221722 func $f1_1 ($a,$i) = if (($i >= $s))
17231723 then $a
17241724 else sumResMat($a, $l[$i])
17251725
17261726 func $f1_2 ($a,$i) = if (($i >= $s))
17271727 then $a
17281728 else throw("List size exceeds 6")
17291729
17301730 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
17311731 }
17321732 let whGoodsVol = if ((goods == ""))
17331733 then 0
17341734 else ( let $l = split_4C(goods, "_")
17351735 let $s = size($l)
17361736 let $acc0 = $Tuple2(0, 0)
17371737 func $f2_1 ($a,$i) = if (($i >= $s))
17381738 then $a
17391739 else sumProd($a, $l[$i])
17401740
17411741 func $f2_2 ($a,$i) = if (($i >= $s))
17421742 then $a
17431743 else throw("List size exceeds 50")
17441744
17451745 $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
17461746 ((whResVol + whMatVol) + whGoodsVol)
17471747 }
17481748
17491749
17501750 func getWarehouse (whKey,landIndex,infraLevel) = {
17511751 let volPrefix = ((toString(landIndex) + "_") + toString(infraLevel))
17521752 let whTotal = getWarehouseTotalVolume(volPrefix)
17531753 let whStr = valueOrElse(getString(whKey), (volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0"))
17541754 let wh = split_4C(whStr, ":")
17551755 let whOccupied = getWarehouseOccupiedVol(wh)
17561756 let whLoft = if ((5 > size(wh)))
17571757 then makeString(["0", toString(whOccupied), toString((whTotal - whOccupied)), toString(whTotal)], "_")
17581758 else {
17591759 let loft = split(wh[whIdxLOFT], "_")
17601760 let whLocked = parseIntValue(loft[volLocked])
17611761 let occ = if ((size(loft) > 1))
17621762 then parseIntValue(loft[volOccupied])
17631763 else whOccupied
17641764 makeString([toString(whLocked), toString(occ), toString(((whTotal - whLocked) - occ)), toString(whTotal)], "_")
17651765 }
17661766 [wh[whIdxLevels], if ((size(split(wh[whIdxRes], "_")) == NUMRES))
17671767 then wh[whIdxRes]
17681768 else "0_0_0_0_0_0", if ((size(split(wh[whIdxMat], "_")) == NUMRES))
17691769 then wh[whIdxMat]
17701770 else "0_0_0_0_0_0", wh[whIdxProd], whLoft]
17711771 }
17721772
17731773
17741774 func getWarehouseSpaceLeft (currentWh) = {
17751775 let occupiedVol = getWarehouseOccupiedVol(currentWh)
17761776 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
17771777 ((getWarehouseTotalVolume(currentWh[whIdxLevels]) - occupiedVol) - currWhLockedVol)
17781778 }
17791779
17801780
17811781 func moveStuff (cargoParts,currentWh,currentPack) = if ((size(cargoParts) != 3))
17821782 then throw("cargoListStr should contain exactly 2 ':' separators")
17831783 else {
17841784 let resParts = split(cargoParts[0], "_")
17851785 let matParts = split(cargoParts[1], "_")
17861786 let prodParts = if ((cargoParts[2] == ""))
17871787 then nil
17881788 else split_4C(cargoParts[2], "_")
17891789 if ((size(resParts) != NUMRES))
17901790 then throw("All 6 resources should be passed")
17911791 else if ((size(matParts) != NUMRES))
17921792 then throw("All 6 materials should be passed")
17931793 else {
17941794 let whSpaceLeft = getWarehouseSpaceLeft(currentWh)
17951795 let currWhRes = split(currentWh[whIdxRes], "_")
17961796 let currWhMat = split(currentWh[whIdxMat], "_")
17971797 let currWhProd = if ((currentWh[whIdxProd] == ""))
17981798 then nil
17991799 else split_4C(currentWh[whIdxProd], "_")
18001800 let currentPackRes = split(currentPack[bpIdxRes], "_")
18011801 let currentPackMat = split(currentPack[bpIdxMat], "_")
18021802 let currentPackProd = if ((currentPack[bpIdxProd] == ""))
18031803 then nil
18041804 else split_4C(currentPack[bpIdxProd], "_")
18051805 func mvR (acc,item) = {
18061806 let i = acc._1
18071807 let am = parseIntValue(item)
18081808 let whr = parseIntValue(currWhRes[i])
18091809 let bpr = parseIntValue(currentPackRes[i])
18101810 if ((am == 0))
18111811 then $Tuple4((i + 1), (acc._2 :+ currWhRes[i]), (acc._3 :+ currentPackRes[i]), acc._4)
18121812 else if ((am > 0))
18131813 then if ((am > bpr))
18141814 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpr)) + " available"))
18151815 else $Tuple4((i + 1), (acc._2 :+ toString((whr + am))), (acc._3 :+ toString((bpr - am))), (acc._4 + am))
18161816 else if ((-(am) > whr))
18171817 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whr)) + " available"))
18181818 else $Tuple4((i + 1), (acc._2 :+ toString((whr + am))), (acc._3 :+ toString((bpr - am))), (acc._4 + am))
18191819 }
18201820
18211821 let r = {
18221822 let $l = resParts
18231823 let $s = size($l)
18241824 let $acc0 = $Tuple4(0, nil, nil, 0)
18251825 func $f0_1 ($a,$i) = if (($i >= $s))
18261826 then $a
18271827 else mvR($a, $l[$i])
18281828
18291829 func $f0_2 ($a,$i) = if (($i >= $s))
18301830 then $a
18311831 else throw("List size exceeds 6")
18321832
18331833 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
18341834 }
18351835 func mvM (acc,item) = {
18361836 let i = acc._1
18371837 let am = parseIntValue(item)
18381838 let whm = parseIntValue(currWhMat[i])
18391839 let bpm = parseIntValue(currentPackMat[i])
18401840 if ((am == 0))
18411841 then $Tuple4((i + 1), (acc._2 :+ currWhMat[i]), (acc._3 :+ currentPackMat[i]), acc._4)
18421842 else if ((am > 0))
18431843 then if ((am > bpm))
18441844 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpm)) + " available"))
18451845 else $Tuple4((i + 1), (acc._2 :+ toString((whm + am))), (acc._3 :+ toString((bpm - am))), (acc._4 + am))
18461846 else if ((-(am) > whm))
18471847 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whm)) + " available"))
18481848 else $Tuple4((i + 1), (acc._2 :+ toString((whm + am))), (acc._3 :+ toString((bpm - am))), (acc._4 + am))
18491849 }
18501850
18511851 let m = {
18521852 let $l = matParts
18531853 let $s = size($l)
18541854 let $acc0 = $Tuple4(0, nil, nil, r._4)
18551855 func $f1_1 ($a,$i) = if (($i >= $s))
18561856 then $a
18571857 else mvM($a, $l[$i])
18581858
18591859 func $f1_2 ($a,$i) = if (($i >= $s))
18601860 then $a
18611861 else throw("List size exceeds 6")
18621862
18631863 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
18641864 }
18651865 func mvP (acc,item) = {
18661866 let i = acc._1
18671867 let am = parseIntValue(item)
18681868 let whp = if ((size(currWhProd) > i))
18691869 then parseIntValue(currWhProd[i])
18701870 else 0
18711871 let bpp = if ((size(currentPackProd) > i))
18721872 then parseIntValue(currentPackProd[i])
18731873 else 0
18741874 if ((am == 0))
18751875 then $Tuple4((i + 1), (acc._2 :+ toString(whp)), (acc._3 :+ toString(bpp)), acc._4)
18761876 else if ((am > 0))
18771877 then if ((am > bpp))
18781878 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpp)) + " available"))
18791879 else {
18801880 let deltaVol = (toVolume((whp + am), PRODUCTPKGSIZE) - toVolume(whp, PRODUCTPKGSIZE))
18811881 $Tuple4((i + 1), (acc._2 :+ toString((whp + am))), (acc._3 :+ toString((bpp - am))), (acc._4 + deltaVol))
18821882 }
18831883 else if ((-(am) > whp))
18841884 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whp)) + " available"))
18851885 else {
18861886 let deltaVol = (toVolume((whp + am), PRODUCTPKGSIZE) - toVolume(whp, PRODUCTPKGSIZE))
18871887 $Tuple4((i + 1), (acc._2 :+ toString((whp + am))), (acc._3 :+ toString((bpp - am))), (acc._4 + deltaVol))
18881888 }
18891889 }
18901890
18911891 let p = if ((size(prodParts) != 0))
18921892 then {
18931893 let $l = prodParts
18941894 let $s = size($l)
18951895 let $acc0 = $Tuple4(0, nil, nil, m._4)
18961896 func $f2_1 ($a,$i) = if (($i >= $s))
18971897 then $a
18981898 else mvP($a, $l[$i])
18991899
19001900 func $f2_2 ($a,$i) = if (($i >= $s))
19011901 then $a
19021902 else throw("List size exceeds 50")
19031903
19041904 $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)
19051905 }
19061906 else $Tuple4(0, currWhProd, currentPackProd, m._4)
19071907 let volSaldo = p._4
19081908 if ((volSaldo > whSpaceLeft))
19091909 then throw((((("Attempt to put total " + toString(volSaldo)) + " stuff, but only ") + toString(whSpaceLeft)) + " warehouse space left"))
19101910 else $Tuple7(makeString(r._2, "_"), makeString(m._2, "_"), makeString_2C(p._2, "_"), makeString(r._3, "_"), makeString(m._3, "_"), makeString_2C(p._3, "_"), volSaldo)
19111911 }
19121912 }
19131913
19141914
19151915 func expeditionInternal (caller,txId) = {
19161916 let userAddr = toString(caller)
19171917 let bigNum = abs(toBigInt(txId))
19181918 let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), (PRESALENUMLANDS + 1))
19191919 let landNum = toString(freeNum)
19201920 let continentIdx = toInt((bigNum % FIVEX))
19211921 let terrains = genTerrains(bigNum, continentIdx)
19221922 let continent = continents[continentIdx]
19231923 let issue = Issue(nftName(landNum, "S"), makeString([landNum, "S", terrains, continent], "_"), 1, 0, false)
19241924 let assetId = calculateAssetId(issue)
19251925 let id = toBase58String(assetId)
19261926 $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))
19271927 }
19281928
19291929
19301930 func flightCommon (userAddr,message,sig) = if (!(sigVerify_8Kb(message, sig, pub)))
19311931 then throw("signature does not match")
19321932 else {
19331933 let parts = split_4C(toUtf8String(message), ";")
19341934 let flightLog = split_4C(parts[0], "|")
19351935 let hp = split(flightLog[flHealth], "_")
19361936 let curHP = parseIntValue(hp[0])
19371937 let newHP = parseIntValue(hp[1])
19381938 let newLocTxVer = split(parts[1], ":")
19391939 let newLocation = newLocTxVer[0]
19401940 let time = parseIntValue(flightLog[flTimestamp])
19411941 if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
19421942 then true
19431943 else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
19441944 then throw(((("signature outdated: logTime=" + toString(time)) + ", bcTime=") + toString(lastBlock.timestamp)))
19451945 else {
19461946 let txFromMsg = newLocTxVer[1]
19471947 let lastTx = valueOrElse(getString(keyLastTxIdByUser(userAddr)), "")
19481948 if ((lastTx != txFromMsg))
19491949 then throw(((("Tx ids don't match! In state: " + lastTx) + ", in msg: ") + txFromMsg))
19501950 else {
19511951 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
19521952 let keyHealth = keyDuckHealth(duckAssetId)
19531953 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
19541954 let oldFromState = valueOrElse(getInteger(keyHealth), maxHP)
19551955 if ((oldFromState != curHP))
19561956 then throw(((("oldHealth=" + toString(oldFromState)) + " from state does not match one from flight log=") + toString(curHP)))
19571957 else if ((0 >= curHP))
19581958 then throw("You can't fly with zero health")
19591959 else if (!(canWearCurrentEquipment(duckAssetId)))
19601960 then throw("Equipment incompatible")
19611961 else {
19621962 let bonus = if ((size(flightLog) > flBonus))
19631963 then flightLog[flBonus]
19641964 else ""
19651965 let prodUsed = if ((size(flightLog) > flProdsUsed))
19661966 then flightLog[flProdsUsed]
19671967 else ""
19681968 let sentAmount = if (if ((newHP > 0))
19691969 then (bonus == "$")
19701970 else false)
19711971 then asInt(invoke(restContract, "sendUsdtPrize", [userAddr], nil))
19721972 else 0
19731973 $Tuple5(newHP, duckAssetId, sentAmount, newLocation, prodUsed)
19741974 }
19751975 }
19761976 }
19771977 }
19781978
19791979
19801980 func applyBonuses (landAssetId,pieces) = {
19811981 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
19821982 let artPieces = valueOrElse(getInteger(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0)
19831983 let add6 = (infraLevel / 6)
19841984 let add7 = (infraLevel / 7)
19851985 ((DAILYRESBYPIECE + fraction(DAILYRESBYPIECE, ((infraLevel + add6) + (2 * add7)), 5)) + fraction(DAILYRESBYPIECE, artPieces, (pieces * 5)))
19861986 }
19871987
19881988
19891989 func checkClaimConditions (addr,claimMode,landAssetIdIn) = {
1990- let $t03670137240 = if ((claimMode == claimModeWh))
1990+ let $t03669237231 = if ((claimMode == claimModeWh))
19911991 then $Tuple2(landAssetIdIn, valueOrElse(getString(keyStakedDuckByOwner(addr)), ""))
19921992 else {
19931993 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
19941994 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
19951995 let loc = split(value(curLocation), "_")
19961996 if ((loc[locIdxType] != "L"))
19971997 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
19981998 else $Tuple2(loc[locIdxId], duckAssetId)
19991999 }
2000- let landAssetId = $t03670137240._1
2001- let duckId = $t03670137240._2
2000+ let landAssetId = $t03669237231._1
2001+ let duckId = $t03669237231._2
20022002 let asset = value(assetInfo(fromBase58String(landAssetId)))
20032003 let timeKey = keyStakedTimeByAssetId(landAssetId)
20042004 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("Land " + asset.name) + " is not staked"))
20052005 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
20062006 if ((owner != addr))
20072007 then throw((LANDPREFIX + " is not yours"))
20082008 else {
20092009 let d = split(asset.description, "_")
20102010 $Tuple4(duckId, landAssetId, d, savedTime)
20112011 }
20122012 }
20132013
20142014
20152015 func claimResInternal (addr,amount,claimMode,landAssetIdIn) = if ((0 > amount))
20162016 then throw("Negative amount")
20172017 else {
20182018 let c = checkClaimConditions(addr, claimMode, landAssetIdIn)
20192019 let landSize = c._3[recLandSize]
20202020 let terrainCounts = countTerrains(c._3[recTerrains])
20212021 let deltaTime = (lastBlock.timestamp - c._4)
20222022 if ((0 > deltaTime))
20232023 then throw(((("Saved timestamp is in future, saved = " + toString(c._4)) + ", current = ") + toString(lastBlock.timestamp)))
20242024 else {
20252025 let pieces = numPiecesBySize(landSize)
20262026 let dailyProductionByPiece = applyBonuses(c._2, pieces)
20272027 let availRes = fraction(deltaTime, (dailyProductionByPiece * pieces), DAYMILLIS)
20282028 if ((amount > availRes))
20292029 then throw(((("Not enough resources, available = " + toString(availRes)) + ", requested = ") + toString(amount)))
20302030 else {
20312031 let newDeltaTime = fraction((availRes - amount), DAYMILLIS, (dailyProductionByPiece * pieces))
20322032 let newTimestamp = (lastBlock.timestamp - newDeltaTime)
20332033 let landIndex = (pieces / SSIZE)
20342034 let resToClaim = virtClaim(terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece)
20352035 let whKey = keyWarehouseByLand(c._2)
20362036 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(c._2)), 0)
20372037 let currentWh = getWarehouse(whKey, landIndex, infraLevel)
20382038 let loft = split(currentWh[whIdxLOFT], "_")
20392039 let whSpaceLeft = parseIntValue(loft[volFree])
20402040 if (if ((claimMode == claimModeWh))
20412041 then (amount > whSpaceLeft)
20422042 else false)
20432043 then throw((("Only " + toString(whSpaceLeft)) + " space left in warehouse"))
20442044 else {
20452045 let bpKey = keyBackpackByDuck(c._1)
20462046 let currentPack = getBackpack(bpKey)
20472047 let currentPackRes = split(currentPack[bpIdxRes], "_")
20482048 let currentWhRes = split(currentWh[whIdxRes], "_")
2049- let $t03961440485 = if ((claimMode == claimModeWh))
2049+ let $t03960540476 = if ((claimMode == claimModeWh))
20502050 then $Tuple4(addRes(currentWhRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), currentPack[bpIdxRes], (parseIntValue(loft[volOccupied]) + resToClaim._2), (parseIntValue(loft[volFree]) - resToClaim._2))
20512051 else if ((claimMode == claimModeDuck))
20522052 then $Tuple4(currentWh[whIdxRes], addRes(currentPackRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), parseIntValue(loft[volOccupied]), parseIntValue(loft[volFree]))
20532053 else {
20542054 let distr = distributeRes(currentWhRes, currentPackRes, resToClaim, whSpaceLeft)
20552055 let whAm = min([parseIntValue(loft[volFree]), resToClaim._2])
20562056 $Tuple4(distr._1, distr._2, (parseIntValue(loft[volOccupied]) + whAm), (parseIntValue(loft[volFree]) - whAm))
20572057 }
2058- let whRes = $t03961440485._1
2059- let bpRes = $t03961440485._2
2060- let loftO = $t03961440485._3
2061- let loftF = $t03961440485._4
2058+ let whRes = $t03960540476._1
2059+ let bpRes = $t03960540476._2
2060+ let loftO = $t03960540476._3
2061+ let loftF = $t03960540476._4
20622062 $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]], "_")])
20632063 }
20642064 }
20652065 }
20662066 }
20672067
20682068
20692069 func claimAll (addr,landAssetId,pieces,claimMode) = {
20702070 let timeKey = keyStakedTimeByAssetId(landAssetId)
20712071 let savedTime = value(getInteger(timeKey))
20722072 let availRes = (fraction((lastBlock.timestamp - savedTime), applyBonuses(landAssetId, pieces), DAYMILLIS) * pieces)
20732073 claimResInternal(addr, availRes, claimMode, landAssetId)
20742074 }
20752075
20762076
20772077 func upInfraCommon (shouldUseMat,caller,paymentAmount,landAssetId) = {
20782078 let addr = toString(caller)
20792079 let c = checkClaimConditions(addr, claimModeWhThenDuck, landAssetId)
20802080 let pieces = numPiecesBySize(c._3[recLandSize])
20812081 let infraKey = keyInfraLevelByAssetId(c._2)
20822082 let curLevel = valueOrElse(getInteger(infraKey), 0)
20832083 if (if (!(KS_ALLOW_BIG_INFRA_MERGE))
20842084 then (curLevel >= 3)
20852085 else false)
20862086 then throw("Currently max infrastructure level = 3")
20872087 else {
20882088 let maxInfra = ((sqrt(pieces, 0, 0, DOWN) / 5) + 2)
20892089 let newLevel = (curLevel + 1)
20902090 if (if (KS_ALLOW_BIG_INFRA_MERGE)
20912091 then (newLevel > maxInfra)
20922092 else false)
20932093 then throw(("Currently max infrastructure level = " + toString(maxInfra)))
20942094 else {
20952095 let cost = fraction(InfraUpgradeCostSUsdt, (pieces * newLevel), SSIZE)
20962096 if (if (!(shouldUseMat))
20972097 then (paymentAmount != cost)
20982098 else false)
20992099 then throw(("Payment attached should be " + toString(cost)))
21002100 else {
21012101 let bpKey = keyBackpackByDuck(c._1)
21022102 let currentPack = getBackpack(bpKey)
21032103 let mList = split(currentPack[bpIdxMat], "_")
21042104 let matUsed = fraction(InfraUpgradeCostS, (pieces * newLevel), SSIZE)
21052105 let newMat = makeString(subtractMaterials(shouldUseMat, mList, matUsed), "_")
21062106 let claimResult = claimAll(addr, c._2, pieces, claimModeWhThenDuck)
21072107 let whData = claimResult._5
21082108 let oldVol = getWarehouseTotalVolume(whData[whIdxLevels])
21092109 let newVolData = makeString([split(whData[whIdxLevels], "_")[0], toString(newLevel)], "_")
21102110 let newVol = getWarehouseTotalVolume(newVolData)
21112111 let loft = split(whData[whIdxLOFT], "_")
21122112 let newLoftStr = makeString([loft[volLocked], loft[volOccupied], toString(((parseIntValue(loft[volFree]) + newVol) - oldVol)), toString(newVol)], "_")
21132113 $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)
21142114 }
21152115 }
21162116 }
21172117 }
21182118
21192119
21202120 func updateStatsInternal (lvlKey,xpKey,pointsKey,deltaXP) = {
21212121 let xp = valueOrElse(getInteger(xpKey), 0)
21222122 let newXP = (xp + deltaXP)
21232123 let lvlPoints = levelUp(valueOrElse(getInteger(lvlKey), 0), newXP)
21242124 $Tuple2([IntegerEntry(lvlKey, lvlPoints[0]), IntegerEntry(xpKey, newXP), IntegerEntry(pointsKey, (valueOrElse(getInteger(pointsKey), 0) + lvlPoints[1]))], newXP)
21252125 }
21262126
21272127
21282128 func updateDuckStatsInternal (duckAssetId,deltaXP) = updateStatsInternal(keyDuckLevel(duckAssetId), keyDuckXP(duckAssetId), keyDuckFreePoints(duckAssetId), deltaXP)
21292129
21302130
21312131 func updateAccStatsInternal (addr,deltaXP) = updateStatsInternal(keyUserLevel(addr), keyUserXP(addr), keyUserFreePoints(addr), deltaXP)
21322132
21332133
21342134 func activateOnboardArt (addr) = {
21352135 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
21362136 let refByKey = keyAddressRefBy(addr)
21372137 let refBy = getString(refByKey)
21382138 if (!(isDefined(refBy)))
21392139 then throw("You are not eligible for ONBOARD artifact")
21402140 else {
21412141 let artKey = keyOnboardArtDuckActivatedBy(addr)
21422142 let artDuck = getString(artKey)
21432143 if (isDefined(artDuck))
21442144 then throw(("You already used your ONBOARD artifact on duck " + value(artDuck)))
21452145 else {
21462146 let duckActivatorKey = keyOnboardArtActivatedOnDuck(duckAssetId)
21472147 let duckActivator = getString(duckActivatorKey)
21482148 if (isDefined(duckActivator))
21492149 then throw(((("The duck " + duckAssetId) + " already got points from ONBOARD artifact from user ") + value(duckActivator)))
21502150 else ([StringEntry(artKey, duckAssetId), StringEntry(duckActivatorKey, addr)] ++ updateDuckStatsInternal(duckAssetId, xpOnboard)._1)
21512151 }
21522152 }
21532153 }
21542154
21552155
21562156 func activatePresaleArt (addr,landAssetIdIn) = {
21572157 let c = checkClaimConditions(addr, claimModeWhThenDuck, landAssetIdIn)
21582158 let landAssetId = c._2
21592159 let pieces = numPiecesBySize(c._3[recLandSize])
21602160 let activationKey = keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)
21612161 if ((valueOrElse(getInteger(activationKey), 0) > 0))
21622162 then throw("Presale artifact is already activated")
21632163 else if ((parseIntValue(c._3[recLandNum]) > PRESALENUMLANDS))
21642164 then throw((((LANDPREFIX + " ") + landAssetId) + " is not eligible for presale artifact"))
21652165 else {
21662166 let claimResult = claimAll(addr, landAssetId, pieces, claimModeWhThenDuck)
21672167 (((claimResult._1 :+ IntegerEntry(activationKey, pieces)) :+ StringEntry(claimResult._2, makeString(claimResult._3, ":"))) :+ StringEntry(claimResult._4, makeString(claimResult._5, ":")))
21682168 }
21692169 }
21702170
21712171
21722172 func checkTournament (duckAssetId) = {
21732173 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
21742174 let curLocation = split(valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
21752175 let now = lastBlock.timestamp
21762176 let tData = getTourData(tournamentContract, lastId)
21772177 let static = tData[idxStatic]
21782178 let dynamic = tData[idxDynamic]
21792179 if ((curLocation[locIdxType] != "T"))
21802180 then false
21812181 else if (if (if ((parseIntValue(curLocation[locIdxContinent]) == lastId))
21822182 then (dynamic[tDynamicStatus] == "INPROGRESS")
21832183 else false)
21842184 then (parseIntValue(static[tStaticEnd]) > now)
21852185 else false)
21862186 then throw("Your duck is taking part in the tournament")
21872187 else asBoolean(invoke(this, "exitTournamentInternal", [duckAssetId], nil))
21882188 }
21892189
21902190
21912191 func checkDelivery (duckAssetId) = {
21922192 let curLocation = split(valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
21932193 let now = lastBlock.timestamp
21942194 if ((curLocation[locIdxType] != "D"))
21952195 then false
21962196 else {
21972197 let startTime = parseIntValue(curLocation[locIdxContinent])
21982198 let distance = parseIntValue(curLocation[locIdxId])
21992199 if (if (((startTime + TEN_MINUTES_MILLIS) > now))
22002200 then (1 > distance)
22012201 else false)
22022202 then throw("Your duck is on delivery mission")
22032203 else asBoolean(invoke(this, "exitDeliveryInternal", [duckAssetId], nil))
22042204 }
22052205 }
22062206
22072207
22082208 func exitDeliveryCommon (duckAssetId,check,newHP,score) = {
22092209 let curLocation = split(valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
22102210 let now = lastBlock.timestamp
22112211 let startTime = parseIntValue(curLocation[locIdxContinent])
22122212 let distance = parseIntValue(curLocation[locIdxId])
22132213 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(duckAssetId)), "NFT duck is orphaned")
22142214 let healthKey = keyDuckHealth(duckAssetId)
22152215 let curHealth = getIntegerValue(healthKey)
22162216 let outcomeActions = if (if ((distance > 0))
22172217 then true
22182218 else if (if (check)
22192219 then (score > 0)
22202220 else false)
22212221 then (newHP > 0)
22222222 else false)
22232223 then {
22242224 let reward = invoke(economyContract, "sendDeliveryReward", [owner], nil)
22252225 if ((reward == reward))
22262226 then {
22272227 let countKey = keyUserDeliveryCount(owner)
22282228 [IntegerEntry(countKey, (valueOrElse(getInteger(countKey), 0) + 1)), IntegerEntry(keyUserLastDeliveryDay(owner), (startTime / DAYMILLIS))]
22292229 }
22302230 else throw("Strict value is not equal to itself.")
22312231 }
22322232 else if (if (if (check)
22332233 then (newHP > 0)
22342234 else false)
22352235 then ((startTime + TEN_MINUTES_MILLIS) > now)
22362236 else false)
22372237 then throw("Your duck is still on delivery mission")
22382238 else {
22392239 let lockedTotal = valueOrElse(getInteger(economyContract, deliveryLockedKey), 0)
22402240 let unlock = invoke(economyContract, "updateDeliveryLocked", [(lockedTotal - MIN_USDT_FEE_DELIVERY)], nil)
22412241 if ((unlock == unlock))
22422242 then if (if (if (check)
22432243 then (0 >= newHP)
22442244 else false)
22452245 then true
22462246 else (0 >= curHealth))
22472247 then nil
22482248 else [IntegerEntry(keyDeliveryDelayByDuck(duckAssetId), (startTime + DELIVERY_PUNISHMENT))]
22492249 else throw("Strict value is not equal to itself.")
22502250 }
22512251 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
22522252 $Tuple3(outcomeActions, [StringEntry(keyDuckLocation(duckAssetId), savedLocation)], savedLocation)
22532253 }
22542254
22552255
22562256 func mergeInternal (newLandSize,newLevel,formula,addr,landAssetIds,needMat) = {
22572257 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
22582258 if (checkTournament(duckAssetId))
22592259 then throw("mergeInternal_checkTournament")
22602260 else if (checkDelivery(duckAssetId))
22612261 then throw("mergeInternal_checkDelivery")
22622262 else {
22632263 func checkMerge (acc,landAssetId) = {
22642264 let asset = value(assetInfo(fromBase58String(landAssetId)))
22652265 let timeKey = keyStakedTimeByAssetId(landAssetId)
22662266 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("NFT " + asset.name) + " is not staked"))
22672267 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
22682268 if ((owner != addr))
22692269 then throw((LANDPREFIX + " is not yours"))
22702270 else {
22712271 let d = split(asset.description, "_")
22722272 let continent = d[recContinent]
22732273 if (if ((acc._3 != ""))
22742274 then (acc._3 != continent)
22752275 else false)
22762276 then throw("Lands should be on the same continent to merge")
22772277 else {
22782278 let landSize = d[recLandSize]
22792279 let sizesIn = acc._1
22802280 let i = valueOrErrorMessage(indexOf(sizesIn, landSize), "You haven't passed all the lands needed")
22812281 let sizesOut = (take(sizesIn, i) + drop(sizesIn, (i + 1)))
22822282 let pieces = numPiecesBySize(landSize)
22832283 let arts = (acc._2 + valueOrElse(getInteger(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0))
22842284 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
22852285 let reqLevel = match landSize {
22862286 case _ =>
22872287 if (("S" == $match0))
22882288 then 3
22892289 else if (("M" == $match0))
22902290 then 4
22912291 else if (("L" == $match0))
22922292 then 5
22932293 else if (("XL" == $match0))
22942294 then 6
22952295 else throw("Only S, M, L, XL can merge")
22962296 }
22972297 if ((infraLevel != reqLevel))
22982298 then throw("All lands should be maxed to merge")
22992299 else {
23002300 let landNum = d[recLandNum]
23012301 let terrainCounts = countTerrains(d[recTerrains])
23022302 let deltaTime = (lastBlock.timestamp - savedTime)
23032303 if ((0 > deltaTime))
23042304 then throw(((("Saved timestamp is in future, saved = " + toString(savedTime)) + ", current = ") + toString(lastBlock.timestamp)))
23052305 else {
23062306 let dailyProductionByPiece = applyBonuses(landAssetId, pieces)
23072307 let landIndex = (pieces / SSIZE)
23082308 let bpRes = addRes(split(acc._4, "_"), terrainCounts, deltaTime, landIndex, dailyProductionByPiece)
23092309 let props = updateProportionsInternal(acc._6, terrainCounts, landIndex, -1)
23102310 let cProps = updateProportionsInternal(acc._10, terrainCounts, landIndex, -1)
23112311 let sumTerrains = updateProportionsInternal(acc._9, terrainCounts, landIndex, 1)
23122312 let lands = acc._7
23132313 let idx = indexOf(lands, landAssetId)
23142314 if (!(isDefined(idx)))
23152315 then throw(("Your staked lands don't contain " + landAssetId))
23162316 else {
23172317 let customKey = keyLandAssetIdToCustomName(landAssetId)
23182318 let customName = valueOrElse(getString(customKey), "")
23192319 $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 != ""))
23202320 then [DeleteEntry(keyLandCustomNameToAssetId(customName))]
23212321 else nil)), props, removeByIndex(lands, value(idx)), (acc._8 + pieces), sumTerrains, cProps)
23222322 }
23232323 }
23242324 }
23252325 }
23262326 }
23272327 }
23282328
23292329 let bpKey = keyBackpackByDuck(duckAssetId)
23302330 let currentPack = getBackpack(bpKey)
23312331 let propList = split(valueOrElse(getString(keyResProportions()), "0_0_0_0_0_0"), "_")
23322332 let landsKey = keyStakedLandsByOwner(addr)
23332333 let landsStr = getString(landsKey)
23342334 let landsIn = if (isDefined(landsStr))
23352335 then split_51C(value(landsStr), "_")
23362336 else nil
23372337 let cont0 = split(value(assetInfo(fromBase58String(landAssetIds[0]))).description, "_")[recContinent]
23382338 let contProps = split(valueOrElse(getString(keyResTypesByContinent(cont0)), "0_0_0_0_0_0"), "_")
23392339 let r = {
23402340 let $l = landAssetIds
23412341 let $s = size($l)
23422342 let $acc0 = $Tuple10(formula, 0, "", currentPack[bpIdxRes], nil, propList, landsIn, 0, split("0_0_0_0_0_0", "_"), contProps)
23432343 func $f0_1 ($a,$i) = if (($i >= $s))
23442344 then $a
23452345 else checkMerge($a, $l[$i])
23462346
23472347 func $f0_2 ($a,$i) = if (($i >= $s))
23482348 then $a
23492349 else throw("List size exceeds 5")
23502350
23512351 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
23522352 }
23532353 let continent = r._3
23542354 let continentIdx = valueOrErrorMessage(indexOf(continents, continent), ("Unknown continent: " + continent))
23552355 let terrains = genTerrainsForMerge(r._9, (numPiecesBySize(newLandSize) / SSIZE))
23562356 let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), (PRESALENUMLANDS + 1))
23572357 let newLandNum = toString(freeNum)
23582358 let issue = Issue(nftName(newLandNum, newLandSize), makeString([newLandNum, newLandSize, terrains, continent], "_"), 1, 0, false)
23592359 let assetId = calculateAssetId(issue)
23602360 let newLandAssetId = toBase58String(assetId)
23612361 let newMat = makeString(subtractMaterials((needMat > 0), split(currentPack[bpIdxMat], "_"), needMat), "_")
23622362 let piecesKey = keyStakedPiecesByOwner(addr)
23632363 let stakedPieces = valueOrElse(getInteger(piecesKey), 0)
23642364 $Tuple2((((((((((((((((r._5 :+ (if ((size(r._7) > 0))
23652365 then StringEntry(landsKey, makeString_11C(r._7, "_"))
23662366 else DeleteEntry(landsKey))) :+ IntegerEntry(piecesKey, if ((r._8 > stakedPieces))
23672367 then 0
23682368 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)
23692369 }
23702370 }
23712371
23722372
23732373 func s2m (addr,landAssetIds) = mergeInternal("M", 3, "SSSS", addr, landAssetIds, 0)
23742374
23752375
23762376 func m2l (addr,landAssetIds) = mergeInternal("L", 4, "SMM", addr, landAssetIds, (InfraUpgradeCostS * 4))
23772377
23782378
23792379 func l2xl (addr,landAssetIds) = mergeInternal("XL", 5, "SSSML", addr, landAssetIds, (InfraUpgradeCostS * 47))
23802380
23812381
23822382 func xl2xxl (addr,landAssetIds) = mergeInternal("XXL", 6, "LXL", addr, landAssetIds, (InfraUpgradeCostS * 54))
23832383
23842384
23852385 func mergeCommon (addr,landAssetIds) = match size(landAssetIds) {
23862386 case _ =>
23872387 if ((4 == $match0))
23882388 then s2m(addr, landAssetIds)
23892389 else if ((3 == $match0))
23902390 then m2l(addr, landAssetIds)
23912391 else if ((5 == $match0))
23922392 then l2xl(addr, landAssetIds)
23932393 else if ((2 == $match0))
23942394 then xl2xxl(addr, landAssetIds)
23952395 else throw("Unknown merge")
23962396 }
23972397
23982398
23992399 func checkOutdatedDelivery (userAddr) = {
24002400 let duck = getString(keyStakedDuckByOwner(userAddr))
24012401 if (isDefined(duck))
24022402 then {
24032403 let duckAssetId = value(duck)
24042404 let locKey = keyDuckLocation(duckAssetId)
24052405 let loc = split(valueOrElse(getString(locKey), DEFAULTLOCATION), "_")
24062406 let startTime = parseIntValue(loc[locIdxContinent])
24072407 if (if ((loc[locIdxType] != "D"))
24082408 then true
24092409 else ((startTime + TEN_MINUTES_MILLIS) > lastBlock.timestamp))
24102410 then nil
24112411 else {
24122412 let healthKey = keyDuckHealth(duckAssetId)
24132413 if ((parseIntValue(loc[locIdxId]) > 0))
24142414 then {
24152415 let reward = invoke(economyContract, "sendDeliveryReward", [userAddr], nil)
24162416 if ((reward == reward))
24172417 then nil
24182418 else throw("Strict value is not equal to itself.")
24192419 }
24202420 else (({
24212421 let lockedTotal = valueOrElse(getInteger(economyContract, deliveryLockedKey), 0)
24222422 let unlock = invoke(economyContract, "updateDeliveryLocked", [(lockedTotal - MIN_USDT_FEE_DELIVERY)], nil)
24232423 if ((unlock == unlock))
24242424 then if ((0 >= getIntegerValue(healthKey)))
24252425 then nil
24262426 else {
24272427 let punishment = invoke(this, "saveInteger", [keyDeliveryDelayByDuck(duckAssetId), (startTime + DELIVERY_PUNISHMENT)], nil)
24282428 if ((punishment == punishment))
24292429 then nil
24302430 else throw("Strict value is not equal to itself.")
24312431 }
24322432 else throw("Strict value is not equal to itself.")
24332433 } :+ IntegerEntry(healthKey, getIntegerValue(keySavedHealth(duckAssetId)))) :+ StringEntry(locKey, getStringValue(keySavedLocation(duckAssetId))))
24342434 }
24352435 }
24362436 else nil
24372437 }
24382438
24392439
24402440 func prolog (i) = if (if ((i.originCaller != restContract))
24412441 then valueOrElse(getBoolean(keyBlocked()), false)
24422442 else false)
24432443 then throw("Contracts are under maintenance")
24442444 else {
24452445 let userAddr = toString(i.originCaller)
24462446 (checkOutdatedDelivery(userAddr) :+ StringEntry(keyLastTxIdByUser(userAddr), toBase58String(i.transactionId)))
24472447 }
24482448
24492449
24502450 func prologFlight (i) = if (if ((i.originCaller != restContract))
24512451 then valueOrElse(getBoolean(keyBlocked()), false)
24522452 else false)
24532453 then throw("Contracts are under maintenance")
24542454 else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
24552455
24562456
24572457 @Callable(i)
24582458 func constructorV1 (restAddr) = if ((i.caller != this))
24592459 then throw("Permission denied")
24602460 else [StringEntry(keyRestAddress(), restAddr)]
24612461
24622462
24632463
24642464 @Callable(i)
24652465 func saveInteger (key,amount) = if ((i.caller != this))
24662466 then throw("saveInteger is not public method")
24672467 else [IntegerEntry(key, amount)]
24682468
24692469
24702470
24712471 @Callable(i)
24722472 func setBlocked (isBlocked) = if ((i.caller != this))
24732473 then throw("permission denied")
24742474 else [BooleanEntry(keyBlocked(), isBlocked)]
24752475
24762476
24772477
24782478 @Callable(i)
24792479 func stakeLand () = {
24802480 let prologActions = prolog(i)
24812481 if ((size(i.payments) != 1))
24822482 then throw("Exactly one payment required")
24832483 else {
24842484 let pmt = value(i.payments[0])
24852485 let assetId = value(pmt.assetId)
24862486 let address = toString(i.caller)
24872487 if ((pmt.amount != 1))
24882488 then throw((("NFT " + LANDPREFIX) + " token should be attached as payment"))
24892489 else {
24902490 let asset = value(assetInfo(assetId))
24912491 if ((asset.issuer != this))
24922492 then throw("Unknown issuer of token")
24932493 else if (!(contains(asset.name, LANDPREFIX)))
24942494 then throw((("Only NFT " + LANDPREFIX) + " tokens are accepted"))
24952495 else {
24962496 let landNumSize = drop(asset.name, 4)
24972497 let landNum = if (contains(landNumSize, "XXL"))
24982498 then dropRight(landNumSize, 3)
24992499 else if (contains(landNumSize, "XL"))
25002500 then dropRight(landNumSize, 2)
25012501 else dropRight(landNumSize, 1)
25022502 if (!(isDefined(parseInt(landNum))))
25032503 then throw(("Cannot parse land number from " + asset.name))
25042504 else {
25052505 let landAssetId = toBase58String(assetId)
25062506 let timeKey = keyStakedTimeByAssetId(landAssetId)
25072507 if (isDefined(getInteger(timeKey)))
25082508 then throw((("NFT " + asset.name) + " is already staked"))
25092509 else {
25102510 let d = split(asset.description, "_")
25112511 let terrainCounts = countTerrains(d[recTerrains])
25122512 let pieces = numPiecesBySize(d[recLandSize])
25132513 let landIndex = (pieces / SSIZE)
25142514 let props = updateProportions(terrainCounts, landIndex, 1)
25152515 let resByContKey = keyResTypesByContinent(d[recContinent])
25162516 let contProps = split(valueOrElse(getString(resByContKey), "0_0_0_0_0_0"), "_")
25172517 let updatedContProps = makeString(updateProportionsInternal(contProps, terrainCounts, landIndex, 1), "_")
25182518 let landsKey = keyStakedLandsByOwner(address)
25192519 let landsStr = getString(landsKey)
25202520 let lands = if (isDefined(landsStr))
25212521 then split_51C(value(landsStr), "_")
25222522 else nil
25232523 if (containsElement(lands, landAssetId))
25242524 then throw(("Your staked lands already contain " + landAssetId))
25252525 else if ((size(lands) >= MAX_LANDS_STAKED_BY_USER))
25262526 then throw((("Your already staked max (" + toString(MAX_LANDS_STAKED_BY_USER)) + ") lands"))
25272527 else {
25282528 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
25292529 let piecesKey = keyStakedPiecesByOwner(address)
25302530 let oldPieces = valueOrElse(getInteger(piecesKey), 0)
25312531 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
25322532 $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)
25332533 }
25342534 }
25352535 }
25362536 }
25372537 }
25382538 }
25392539 }
25402540
25412541
25422542
25432543 @Callable(i)
25442544 func unstakeLand (landAssetIdIn) = {
25452545 let prologActions = prolog(i)
25462546 if ((size(i.payments) != 0))
25472547 then throw("No payments required")
25482548 else {
25492549 let addr = toString(i.caller)
25502550 let c = checkClaimConditions(addr, claimModeDuck, landAssetIdIn)
25512551 let landAssetId = c._2
25522552 let d = c._3
25532553 let landsKey = keyStakedLandsByOwner(addr)
25542554 let terrainCounts = countTerrains(d[recTerrains])
25552555 let pieces = numPiecesBySize(d[recLandSize])
25562556 let landIndex = (pieces / SSIZE)
25572557 let props = updateProportions(terrainCounts, landIndex, -1)
25582558 let resByContKey = keyResTypesByContinent(d[recContinent])
25592559 let contProps = split(valueOrElse(getString(resByContKey), "0_0_0_0_0_0"), "_")
25602560 let updatedContProps = makeString(updateProportionsInternal(contProps, terrainCounts, landIndex, -1), "_")
25612561 let claimResult = claimAll(addr, landAssetId, pieces, claimModeDuck)
25622562 let lands = split_51C(valueOrElse(getString(landsKey), ""), "_")
25632563 let idx = indexOf(lands, landAssetId)
25642564 if (!(isDefined(idx)))
25652565 then throw(("Your staked lands don't contain " + landAssetId))
25662566 else {
25672567 let now = lastBlock.timestamp
25682568 let govReleaseTime = valueOrElse(getInteger(govContract, keyUserGwlReleaseTime(addr)), 0)
25692569 if ((govReleaseTime >= now))
25702570 then throw(("Your gWL are taking part in voting, cannot unstake until " + toString(govReleaseTime)))
25712571 else {
25722572 let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastArbTimeByUser(addr)), 0) + arbitrageDelay)
25732573 if ((arbReleaseTime > now))
25742574 then throw(("Your staked lands took part in arbitrage, cannot unstake until " + toString(arbReleaseTime)))
25752575 else {
25762576 let piecesKey = keyStakedPiecesByOwner(addr)
25772577 let stakedPieces = valueOrElse(getInteger(piecesKey), 0)
25782578 let newPieces = if ((pieces > stakedPieces))
25792579 then 0
25802580 else (stakedPieces - pieces)
25812581 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [addr], nil)
25822582 $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))
25832583 then StringEntry(landsKey, makeString_11C(removeByIndex(lands, value(idx)), "_"))
25842584 else DeleteEntry(landsKey), IntegerEntry(piecesKey, newPieces)] ++ prologActions), wlgResult)
25852585 }
25862586 }
25872587 }
25882588 }
25892589 }
25902590
25912591
25922592
25932593 @Callable(i)
25942594 func stakeDuck () = {
25952595 let prologActions = prolog(i)
25962596 if ((size(i.payments) != 1))
25972597 then throw("Exactly one payment required")
25982598 else {
25992599 let pmt = value(i.payments[0])
26002600 let assetId = value(pmt.assetId)
26012601 let address = toString(i.caller)
26022602 if ((pmt.amount != 1))
26032603 then throw((("NFT " + DUCKPREFIX) + " token should be attached as payment"))
26042604 else {
26052605 let asset = value(assetInfo(assetId))
26062606 if (if ((asset.issuer != incubatorAddr))
26072607 then (asset.issuer != breederAddr)
26082608 else false)
26092609 then throw((("Unknown issuer of " + DUCKPREFIX) + " token"))
26102610 else if (!(contains(asset.name, DUCKPREFIX)))
26112611 then throw((("Only NFT " + DUCKPREFIX) + " tokens are accepted"))
26122612 else {
26132613 let assetIdStr = toBase58String(assetId)
26142614 let timeKey = keyStakedTimeByAssetId(assetIdStr)
26152615 if (isDefined(getInteger(timeKey)))
26162616 then throw((("NFT " + asset.name) + " is already staked"))
26172617 else if (isDefined(getString(keyStakedDuckByOwner(address))))
26182618 then throw(("You already staked one duck: " + asset.name))
26192619 else {
26202620 let locKey = keyDuckLocation(assetIdStr)
26212621 let location = getString(locKey)
26222622 let bpKey = keyBackpackByDuck(assetIdStr)
26232623 let backpack = getString(bpKey)
26242624 let keyHealth = keyDuckHealth(assetIdStr)
26252625 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(assetIdStr)), 0))
26262626 let curHealth = valueOrElse(getInteger(keyHealth), maxHP)
26272627 ([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, toBase58String(assetId), address), lastBlock.timestamp), StringEntry(keyDuckIdToOwner(assetIdStr), address), StringEntry(keyStakedDuckByOwner(address), assetIdStr)] ++ (if (isDefined(location))
26282628 then nil
26292629 else ([StringEntry(locKey, DEFAULTLOCATION)] ++ (if (isDefined(backpack))
26302630 then nil
26312631 else (([StringEntry(bpKey, "0:0_0_0_0_0_0:0_0_0_0_0_0:")] :+ IntegerEntry(keyHealth, curHealth)) ++ prologActions)))))
26322632 }
26332633 }
26342634 }
26352635 }
26362636 }
26372637
26382638
26392639
26402640 @Callable(i)
26412641 func unstakeDuck (assetIdStr) = {
26422642 let prologActions = prolog(i)
26432643 if ((size(i.payments) != 0))
26442644 then throw("No payments required")
26452645 else {
26462646 let assetId = fromBase58String(assetIdStr)
26472647 let address = toString(i.caller)
26482648 let asset = value(assetInfo(assetId))
26492649 let timeKey = keyStakedTimeByAssetId(assetIdStr)
26502650 if (!(isDefined(getInteger(timeKey))))
26512651 then throw((("NFT " + asset.name) + " is not staked"))
26522652 else if (!(isDefined(getString(keyStakedDuckByOwner(address)))))
26532653 then throw((("The duck " + asset.name) + " is not staked"))
26542654 else {
26552655 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(assetIdStr)), (("NFT " + asset.name) + " is orphaned"))
26562656 if ((owner != address))
26572657 then throw("Staked NFT is not yours")
26582658 else if (checkTournament(assetIdStr))
26592659 then throw("unstakeDuck_checkTournament")
26602660 else if (checkDelivery(assetIdStr))
26612661 then throw("unstakeDuck_checkDelivery")
26622662 else {
26632663 let keyHealth = keyDuckHealth(assetIdStr)
26642664 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(assetIdStr)), 0))
26652665 let health = valueOrElse(getInteger(keyHealth), maxHP)
26662666 if ((maxHP > health))
26672667 then throw((("Please heal your duck to " + toString(maxHP)) + "hp before unstaking"))
26682668 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)
26692669 }
26702670 }
26712671 }
26722672 }
26732673
26742674
26752675
26762676 @Callable(i)
26772677 func claimRes (amount,landAssetIdStr) = {
26782678 let prologActions = prolog(i)
26792679 if ((size(i.payments) != 0))
26802680 then throw("No payments required")
26812681 else {
26822682 let addr = toString(i.originCaller)
26832683 let result = claimResInternal(addr, amount, claimModeDuck, landAssetIdStr)
26842684 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
26852685 $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])
26862686 }
26872687 }
26882688
26892689
26902690
26912691 @Callable(i)
26922692 func claimResToWH (amount,landAssetIdStr) = {
26932693 let prologActions = prolog(i)
26942694 if ((size(i.payments) != 0))
26952695 then throw("No payments required")
26962696 else {
26972697 let addr = toString(i.originCaller)
26982698 let result = claimResInternal(addr, amount, claimModeWh, landAssetIdStr)
26992699 $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])
27002700 }
27012701 }
27022702
27032703
27042704
27052705 @Callable(i)
27062706 func flight (message,sig) = {
27072707 let prologActions = prologFlight(i)
27082708 if ((size(i.payments) != 0))
27092709 then throw("No payments required")
27102710 else {
27112711 let userAddr = toString(i.caller)
27122712 let f = flightCommon(userAddr, message, sig)
27132713 let newHP = f._1
27142714 let duckAssetId = f._2
27152715 let locKey = keyDuckLocation(duckAssetId)
27162716 let curLocation = valueOrElse(getString(locKey), DEFAULTLOCATION)
27172717 let newLocation = f._4
27182718 if ((newLocation == curLocation))
27192719 then throw("You can't fly to the same location")
27202720 else {
27212721 let newLoc = split(newLocation, "_")
27222722 let isTour = (newLoc[locIdxType] == "T")
27232723 let isDeliv = (newLoc[locIdxType] == "D")
27242724 let eqKey = keyDuckEquipment(duckAssetId)
27252725 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2726- let $t07312773224 = subtractEquipment(currentEq, f._5)
2727- let newEq = $t07312773224._1
2728- let shouldZeroBuffs = $t07312773224._2
2729- let $t07322776339 = if (!(onMission(tournamentContract, curLocation)))
2726+ let $t07311873215 = subtractEquipment(currentEq, f._5)
2727+ let newEq = $t07311873215._1
2728+ let shouldZeroBuffs = $t07311873215._2
2729+ let $t07321876330 = if (!(onMission(tournamentContract, curLocation)))
27302730 then if (!(isUsualLocation(newLocation)))
27312731 then cheatAttempt(curLocation, newLocation, 5)
27322732 else if ((newHP > 0))
27332733 then $Tuple2(newLocation, newHP)
27342734 else $Tuple2(curLocation, 0)
27352735 else if (isInTournament(tournamentContract, curLocation))
27362736 then if (!(isInTournament(tournamentContract, newLocation)))
27372737 then throw("Your duck is taking part in the tournament")
27382738 else {
27392739 let score = parseIntValue(newLoc[locIdxId])
27402740 let curLoc = split(curLocation, "_")
27412741 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
27422742 if ((score != (parseIntValue(curLoc[locIdxId]) + 1)))
27432743 then cheatAttempt(curLocation, newLocation, 7)
27442744 else if ((newHP > 0))
27452745 then {
27462746 let localBest = valueOrElse(getInteger(tournamentContract, keyBestResultByTourAndDuck(lastId, duckAssetId)), 0)
27472747 let updLocal = if ((score > localBest))
27482748 then invoke(tournamentContract, "saveDuckResult", [duckAssetId, score], nil)
27492749 else unit
27502750 if ((updLocal == updLocal))
27512751 then $Tuple2(newLocation, newHP)
27522752 else throw("Strict value is not equal to itself.")
27532753 }
27542754 else $Tuple2(curLocation, 0)
27552755 }
27562756 else if (!(isInDelivery(curLocation)))
27572757 then {
27582758 let savedLoc = asString(invoke(this, "autoExitDelivery", [duckAssetId, newHP, if (isDeliv)
27592759 then "10"
27602760 else "11", 0], nil))
27612761 if ((savedLoc == savedLoc))
27622762 then if (isDeliv)
27632763 then $Tuple2(savedLoc, newHP)
27642764 else if ((newHP > 0))
27652765 then $Tuple2(newLocation, newHP)
27662766 else $Tuple2(savedLoc, 0)
27672767 else throw("Strict value is not equal to itself.")
27682768 }
27692769 else if (!(isDeliv))
27702770 then throw("Your duck is taking part in delivery")
27712771 else if (!(isInDelivery(newLocation)))
27722772 then cheatAttempt(curLocation, newLocation, 13)
27732773 else {
27742774 let score = parseIntValue(newLoc[locIdxId])
27752775 let curLoc = split(curLocation, "_")
27762776 if ((score != (parseIntValue(curLoc[locIdxId]) + 1)))
27772777 then cheatAttempt(curLocation, newLocation, 14)
27782778 else if (if ((newHP > 0))
27792779 then (1 > score)
27802780 else false)
27812781 then $Tuple2(newLocation, newHP)
27822782 else {
27832783 let savedLoc = asString(invoke(this, "autoExitDelivery", [duckAssetId, newHP, "15-17", score], nil))
27842784 if ((savedLoc == savedLoc))
27852785 then $Tuple2(savedLoc, newHP)
27862786 else throw("Strict value is not equal to itself.")
27872787 }
27882788 }
2789- let locToSave = $t07322776339._1
2790- let hpToSave = $t07322776339._2
2789+ let locToSave = $t07321876330._1
2790+ let hpToSave = $t07321876330._2
27912791 $Tuple2(((([StringEntry(locKey, locToSave), StringEntry(eqKey, newEq), IntegerEntry(keyDuckHealth(duckAssetId), hpToSave)] ++ prologActions) ++ (if (shouldZeroBuffs)
27922792 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
27932793 else nil)) ++ updateDuckStatsInternal(duckAssetId, if ((newHP > 0))
27942794 then xpSuccessFlight
27952795 else xpFailFlight)._1), f._3)
27962796 }
27972797 }
27982798 }
27992799
28002800
28012801
28022802 @Callable(i)
28032803 func heal (quantityL1,quantityL2,quantityL3) = {
28042804 let prologActions = prolog(i)
28052805 if (if (if ((0 > quantityL1))
28062806 then true
28072807 else (0 > quantityL2))
28082808 then true
28092809 else (0 > quantityL3))
28102810 then throw("Quantity cannot be negative")
28112811 else {
28122812 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
28132813 if (checkTournament(duckAssetId))
28142814 then throw("heal_checkTournament")
28152815 else if (checkDelivery(duckAssetId))
28162816 then throw("heal_checkDelivery")
28172817 else {
28182818 let qts = [quantityL1, quantityL2, quantityL3]
28192819 let keyHealth = keyDuckHealth(duckAssetId)
28202820 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
28212821 let oldHealth = valueOrElse(getInteger(keyHealth), maxHP)
28222822 if ((oldHealth >= maxHP))
28232823 then throw((("HP should be < " + toString(maxHP)) + " to heal"))
28242824 else {
28252825 let bpKey = keyBackpackByDuck(duckAssetId)
28262826 let currentPack = getBackpack(bpKey)
28272827 let prodList = if ((currentPack[bpIdxProd] == ""))
28282828 then nil
28292829 else split_4C(currentPack[bpIdxProd], "_")
28302830 func iterateProd (acc,recipe) = {
28312831 let n = acc._2
28322832 let x = if ((size(prodList) > n))
28332833 then parseIntValue(prodList[n])
28342834 else 0
28352835 if ((3 > n))
28362836 then {
28372837 let q = qts[n]
28382838 if ((q > x))
28392839 then throw(((("You have only " + toString(x)) + " of ") + prodTypes[n]))
28402840 else $Tuple3((acc._1 :+ toString((x - q))), (n + 1), (acc._3 + (parseIntValue(split(recipe, "_")[rIdxEffect]) * q)))
28412841 }
28422842 else $Tuple3((acc._1 :+ toString(x)), (n + 1), acc._3)
28432843 }
28442844
28452845 let result = {
28462846 let $l = productionMatrix
28472847 let $s = size($l)
28482848 let $acc0 = $Tuple3(nil, 0, 0)
28492849 func $f0_1 ($a,$i) = if (($i >= $s))
28502850 then $a
28512851 else iterateProd($a, $l[$i])
28522852
28532853 func $f0_2 ($a,$i) = if (($i >= $s))
28542854 then $a
28552855 else throw("List size exceeds 50")
28562856
28572857 $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)
28582858 }
28592859 let newHealth = min([maxHP, (oldHealth + result._3)])
28602860 $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)
28612861 }
28622862 }
28632863 }
28642864 }
28652865
28662866
28672867
28682868 @Callable(i)
28692869 func healES () = {
28702870 let prologActions = prolog(i)
28712871 if ((size(i.payments) != 1))
28722872 then throw("Exactly one payment required")
28732873 else {
28742874 let pmt = value(i.payments[0])
28752875 if ((pmt.assetId != usdtAssetId))
28762876 then throw("Allowed USDT payment only!")
28772877 else {
28782878 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
28792879 if (checkTournament(duckAssetId))
28802880 then throw("healES_checkTournament")
28812881 else if (checkDelivery(duckAssetId))
28822882 then throw("healES_checkDelivery")
28832883 else {
28842884 let keyHealth = keyDuckHealth(duckAssetId)
28852885 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
28862886 let oldHealth = valueOrElse(getInteger(keyHealth), maxHP)
28872887 if ((oldHealth > 0))
28882888 then throw("HP should be 0 to call Emergency Service")
28892889 else {
28902890 let bpKey = keyBackpackByDuck(duckAssetId)
28912891 let currentPack = getBackpack(bpKey)
28922892 let prodList = if ((currentPack[bpIdxProd] == ""))
28932893 then nil
28942894 else split_4C(currentPack[bpIdxProd], "_")
28952895 let medKitAmount1 = if ((size(prodList) > 0))
28962896 then parseIntValue(prodList[0])
28972897 else 0
28982898 let medKitAmount2 = if ((size(prodList) > 1))
28992899 then parseIntValue(prodList[1])
29002900 else 0
29012901 let medKitAmount3 = if ((size(prodList) > 2))
29022902 then parseIntValue(prodList[2])
29032903 else 0
29042904 if (if (if ((medKitAmount1 > 0))
29052905 then true
29062906 else (medKitAmount2 > 0))
29072907 then true
29082908 else (medKitAmount3 > 0))
29092909 then throw("You have to use own Medical Kit")
29102910 else {
29112911 let existStr = getString(economyContract, keyEsWarehouse())
29122912 let existAmounts = if (isDefined(existStr))
29132913 then split_4C(value(existStr), "_")
29142914 else nil
29152915 let existAmount = if ((size(existAmounts) > 0))
29162916 then parseIntValue(existAmounts[0])
29172917 else 0
29182918 if ((0 >= existAmount))
29192919 then throw("There are no Medical Kits L1 at Emergency Service storage")
29202920 else {
29212921 let newHealth = (oldHealth + parseIntValue(split(productionMatrix[0], "_")[rIdxEffect]))
29222922 let newES = makeString([toString((existAmount - 1)), removeByIndex(existAmounts, 0)], "_")
29232923 let recipe = split(productionMatrix[0], "_")
29242924 let totalMat = getRecipeMaterials(recipe)
29252925 let sellPrice = fraction((totalMat * ESSELLCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
29262926 if ((pmt.amount != sellPrice))
29272927 then throw(("Payment attached should be " + toString(sellPrice)))
29282928 else {
29292929 let result = asString(invoke(economyContract, "updateEsStorage", [newES], [AttachedPayment(usdtAssetId, sellPrice)]))
29302930 $Tuple2(((prologActions :+ IntegerEntry(keyHealth, newHealth)) ++ updateDuckStatsInternal(duckAssetId, xpCallES)._1), result)
29312931 }
29322932 }
29332933 }
29342934 }
29352935 }
29362936 }
29372937 }
29382938 }
29392939
29402940
29412941
29422942 @Callable(i)
29432943 func updateBackpack (duckAssetId,newPack) = if ((i.caller != economyContract))
29442944 then throw("permission denied")
29452945 else $Tuple2([StringEntry(keyBackpackByDuck(duckAssetId), newPack)], newPack)
29462946
29472947
29482948
29492949 @Callable(i)
29502950 func commitForRandom () = {
29512951 let prologActions = prolog(i)
29522952 let finishBlock = (height + randomDelay)
29532953 let addr = toString(i.caller)
29542954 $Tuple2(([IntegerEntry(keyCommit(addr), finishBlock)] ++ prologActions), finishBlock)
29552955 }
29562956
29572957
29582958
29592959 @Callable(i)
29602960 func buySLand () = {
29612961 let prologActions = prolog(i)
29622962 if ((size(i.payments) != 1))
29632963 then throw("Exactly one payment required")
29642964 else {
29652965 let pmt = value(i.payments[0])
29662966 if ((pmt.assetId != usdtAssetId))
29672967 then throw("Allowed USDT payment only!")
29682968 else if ((pmt.amount != EXPUSDT))
29692969 then throw(("Payment attached should be " + toString(EXPUSDT)))
29702970 else {
29712971 let result = expeditionInternal(i.caller, i.transactionId)
29722972 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], nil))
29732973 $Tuple2((((result._1 :+ ScriptTransfer(economyContract, pmt.amount, usdtAssetId)) ++ updateAccStatsInternal(toString(i.caller), xpNewSLand)._1) ++ prologActions), $Tuple2(result._2._1, acresResult))
29742974 }
29752975 }
29762976 }
29772977
29782978
29792979
29802980 @Callable(i)
29812981 func expedition (message,sig) = {
29822982 let prologActions = prolog(i)
29832983 if ((size(i.payments) != 0))
29842984 then throw("No payments required")
29852985 else {
29862986 let userAddr = toString(i.caller)
29872987 let f = flightCommon(userAddr, message, sig)
29882988 let duckAssetId = f._2
29892989 let keyHealth = keyDuckHealth(duckAssetId)
29902990 let bpKey = keyBackpackByDuck(duckAssetId)
29912991 let currentPack = getBackpack(bpKey)
29922992 let mList = split(currentPack[bpIdxMat], "_")
29932993 let newMat = makeString(subtractMaterials(true, mList, EXPMATERIALS), "_")
29942994 let eqKey = keyDuckEquipment(duckAssetId)
29952995 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2996- let $t08377983876 = subtractEquipment(currentEq, f._5)
2997- let newEq = $t08377983876._1
2998- let shouldZeroBuffs = $t08377983876._2
2996+ let $t08377083867 = subtractEquipment(currentEq, f._5)
2997+ let newEq = $t08377083867._1
2998+ let shouldZeroBuffs = $t08377083867._2
29992999 let e = expeditionInternal(i.caller, i.transactionId)
30003000 let id = e._2._1
30013001 let result = if ((0 >= f._1))
30023002 then $Tuple3([IntegerEntry(keyHealth, 0), StringEntry(eqKey, newEq)], "", 0)
30033003 else $Tuple3((e._1 ++ (if (shouldZeroBuffs)
30043004 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
30053005 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)
30063006 if (checkTournament(duckAssetId))
30073007 then throw("expedition_checkTournament")
30083008 else if (checkDelivery(duckAssetId))
30093009 then throw("expedition_checkDelivery")
30103010 else {
30113011 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], nil))
30123012 $Tuple2(((result._1 ++ updateDuckStatsInternal(duckAssetId, xpNewSLand)._1) ++ prologActions), $Tuple3(result._2, result._3, acresResult))
30133013 }
30143014 }
30153015 }
30163016
30173017
30183018
30193019 @Callable(i)
30203020 func buySLandForAcres () = {
30213021 let prologActions = prolog(i)
30223022 if ((size(i.payments) != 1))
30233023 then throw("exactly 1 payment must be attached")
30243024 else {
30253025 let pmt = i.payments[0]
30263026 let amt = pmt.amount
30273027 if (if (!(isDefined(pmt.assetId)))
30283028 then true
30293029 else (value(pmt.assetId) != acresAssetId))
30303030 then throw("ACRES payments only!")
30313031 else if ((amt != S_COST_ACRES))
30323032 then throw(("Payment attached should be " + toString(S_COST_ACRES)))
30333033 else {
30343034 let result = expeditionInternal(i.caller, i.transactionId)
30353035 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], [AttachedPayment(acresAssetId, amt)]))
30363036 $Tuple2(((result._1 ++ updateAccStatsInternal(toString(i.caller), xpNewSLand)._1) ++ prologActions), $Tuple2(result._2._1, acresResult))
30373037 }
30383038 }
30393039 }
30403040
30413041
30423042
30433043 @Callable(i)
30443044 func upgradeInfra (landAssetId) = {
30453045 let prologActions = prolog(i)
30463046 if ((size(i.payments) != 0))
30473047 then throw("No payments required")
30483048 else {
30493049 let result = upInfraCommon(true, i.caller, 0, landAssetId)
30503050 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
30513051 $Tuple2(((result._1 ++ prologActions) ++ updateDuckStatsInternal(duckAssetId, fraction(xpUpgradeInfra, result._3, MULT8))._1), result._2)
30523052 }
30533053 }
30543054
30553055
30563056
30573057 @Callable(i)
30583058 func activateArtifact (artName,landAssetIdOpt) = {
30593059 let prologActions = prolog(i)
30603060 if ((size(i.payments) != 0))
30613061 then throw("No payments required")
30623062 else {
30633063 let addr = toString(i.caller)
30643064 let result = match artName {
30653065 case _ =>
30663066 if (("PRESALE" == $match0))
30673067 then activatePresaleArt(addr, landAssetIdOpt)
30683068 else if (("ONBOARD" == $match0))
30693069 then activateOnboardArt(addr)
30703070 else throw("Unknown artifact")
30713071 }
30723072 (result ++ prologActions)
30733073 }
30743074 }
30753075
30763076
30773077
30783078 @Callable(i)
30793079 func mergeLands (landAssetIds) = {
30803080 let prologActions = prolog(i)
30813081 if ((size(i.payments) != 0))
30823082 then throw("No payments required")
30833083 else {
30843084 let result = mergeCommon(toString(i.caller), landAssetIds)
30853085 $Tuple2(((result._1 ++ prologActions) ++ updateAccStatsInternal(toString(i.caller), xpMerge)._1), result._2)
30863086 }
30873087 }
30883088
30893089
30903090
30913091 @Callable(i)
30923092 func cargoExchange (cargoListStr,landAssetId) = {
30933093 let prologActions = prolog(i)
30943094 if ((size(i.payments) != 0))
30953095 then throw("No payments required")
30963096 else {
30973097 let cargoParts = split_4C(cargoListStr, ":")
30983098 let addr = toString(i.originCaller)
30993099 let asset = value(assetInfo(fromBase58String(landAssetId)))
31003100 let timeKey = keyStakedTimeByAssetId(landAssetId)
31013101 if (!(isDefined(getInteger(timeKey))))
31023102 then throw((asset.name + " is not staked"))
31033103 else {
31043104 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
31053105 if ((owner != addr))
31063106 then throw((LANDPREFIX + " is not yours"))
31073107 else {
31083108 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
31093109 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
31103110 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
31113111 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
31123112 let loc = split(value(curLocation), "_")
31133113 if ((loc[locIdxType] != "L"))
31143114 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
31153115 else if ((loc[locIdxId] != landAssetId))
31163116 then throw(("Duck should be on the land " + landAssetId))
31173117 else {
31183118 let whKey = keyWarehouseByLand(landAssetId)
31193119 let currentWh = getWarehouse(whKey, landIndex, infraLevel)
31203120 let bpKey = keyBackpackByDuck(duckAssetId)
31213121 let currentPack = getBackpack(bpKey)
31223122 let result = moveStuff(cargoParts, currentWh, currentPack)
31233123 let loft = split(currentWh[whIdxLOFT], "_")
31243124 let loftO = (parseIntValue(loft[volOccupied]) + result._7)
31253125 let loftF = (parseIntValue(loft[volFree]) - result._7)
31263126 ([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)
31273127 }
31283128 }
31293129 }
31303130 }
31313131 }
31323132
31333133
31343134
31353135 @Callable(i)
31363136 func saveWarehouse (whStr,landAssetId) = if ((i.caller != economyContract))
31373137 then throw("Access denied")
31383138 else {
31393139 let whKey = keyWarehouseByLand(landAssetId)
31403140 let wh = split_4C(whStr, ":")
31413141 if ((size(wh) != 5))
31423142 then throw("warehouse string should contain 4 ':' separators")
31433143 else {
31443144 let loftL = split(wh[whIdxLOFT], "_")[volLocked]
31453145 let loftO = getWarehouseOccupiedVol(wh)
31463146 let loftT = getWarehouseTotalVolume(wh[whIdxLevels])
31473147 let loftF = ((loftT - parseIntValue(loftL)) - loftO)
31483148 if ((0 > loftF))
31493149 then throw("Operation leads to negative free warehouse space")
31503150 else {
31513151 let newWhStr = makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], wh[whIdxProd], makeString([loftL, toString(loftO), toString(loftF), toString(loftT)], "_")], ":")
31523152 $Tuple2([StringEntry(whKey, newWhStr)], newWhStr)
31533153 }
31543154 }
31553155 }
31563156
31573157
31583158
31593159 @Callable(i)
31603160 func setCustomName (assetId,customName,type) = {
31613161 let prologActions = prolog(i)
31623162 if ((size(i.payments) != 1))
31633163 then throw("Exactly one payment required")
31643164 else {
31653165 let pmt = value(i.payments[0])
31663166 if ((pmt.assetId != usdtAssetId))
31673167 then throw("Allowed USDT payment only!")
31683168 else if ((pmt.amount != RENAMINGCOST))
31693169 then throw(("Payment should be " + toString(RENAMINGCOST)))
31703170 else if (contains(customName, "__"))
31713171 then throw(("Name should not contain '__': " + customName))
31723172 else if ((size(customName) > MAXNAMELEN))
31733173 then throw(("Name too long, maxLength=" + toString(MAXNAMELEN)))
31743174 else {
31753175 let addr = toString(i.originCaller)
31763176 let actions = match type {
31773177 case _ =>
31783178 if (("ACCOUNT" == $match0))
31793179 then {
31803180 let reverseKey = keyCustomNameToAddress(customName)
31813181 let nameOwner = getString(reverseKey)
31823182 if (isDefined(nameOwner))
31833183 then throw(("Name already registered: " + customName))
31843184 else {
31853185 let addrToNameKey = keyAddressToCustomName(addr)
31863186 let oldName = getString(addrToNameKey)
31873187 let freeOld = if (isDefined(oldName))
31883188 then [DeleteEntry(keyCustomNameToAddress(value(oldName)))]
31893189 else nil
31903190 (((freeOld :+ StringEntry(addrToNameKey, customName)) :+ StringEntry(reverseKey, addr)) ++ updateAccStatsInternal(addr, xpCustomName)._1)
31913191 }
31923192 }
31933193 else if (("LAND" == $match0))
31943194 then {
31953195 let asset = value(assetInfo(fromBase58String(assetId)))
31963196 let timeKey = keyStakedTimeByAssetId(assetId)
31973197 if (!(isDefined(getInteger(timeKey))))
31983198 then throw((asset.name + " is not staked"))
31993199 else {
32003200 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(assetId)), (("NFT " + asset.name) + " is orphaned"))
32013201 if ((owner != addr))
32023202 then throw((LANDPREFIX + " is not yours"))
32033203 else {
32043204 let reverseKey = keyLandCustomNameToAssetId(customName)
32053205 let nameOwner = getString(reverseKey)
32063206 if (isDefined(nameOwner))
32073207 then throw(("Name already registered: " + customName))
32083208 else {
32093209 let assetToNameKey = keyLandAssetIdToCustomName(assetId)
32103210 let oldName = getString(assetToNameKey)
32113211 let freeOld = if (isDefined(oldName))
32123212 then [DeleteEntry(keyLandCustomNameToAssetId(value(oldName)))]
32133213 else nil
32143214 (((freeOld :+ StringEntry(assetToNameKey, customName)) :+ StringEntry(reverseKey, assetId)) ++ updateAccStatsInternal(addr, xpCustomName)._1)
32153215 }
32163216 }
32173217 }
32183218 }
32193219 else if (("DUCK" == $match0))
32203220 then {
32213221 let asset = value(assetInfo(fromBase58String(assetId)))
32223222 let timeKey = keyStakedTimeByAssetId(assetId)
32233223 if (if (!(isDefined(getInteger(timeKey))))
32243224 then true
32253225 else !(isDefined(getString(keyStakedDuckByOwner(addr)))))
32263226 then throw((asset.name + " is not staked"))
32273227 else {
32283228 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(assetId)), (("NFT " + asset.name) + " is orphaned"))
32293229 if ((owner != addr))
32303230 then throw((DUCKPREFIX + " is not yours"))
32313231 else {
32323232 let reverseKey = keyDuckCustomNameToAssetId(customName)
32333233 let nameOwner = getString(reverseKey)
32343234 if (isDefined(nameOwner))
32353235 then throw(("Name already registered: " + customName))
32363236 else {
32373237 let assetToNameKey = keyDuckAssetIdToCustomName(assetId)
32383238 let oldName = getString(assetToNameKey)
32393239 let freeOld = if (isDefined(oldName))
32403240 then [DeleteEntry(keyDuckCustomNameToAssetId(value(oldName)))]
32413241 else nil
32423242 (((freeOld :+ StringEntry(assetToNameKey, customName)) :+ StringEntry(reverseKey, assetId)) ++ updateDuckStatsInternal(assetId, xpCustomName)._1)
32433243 }
32443244 }
32453245 }
32463246 }
32473247 else throw("Unknown entity type")
32483248 }
32493249 $Tuple2(((actions :+ ScriptTransfer(economyContract, pmt.amount, usdtAssetId)) ++ prologActions), 0)
32503250 }
32513251 }
32523252 }
32533253
32543254
32553255
32563256 @Callable(i)
32573257 func setReferrals (oldPlayer,newPlayer) = if ((i.callerPublicKey != pub))
32583258 then throw("Permission denied")
32593259 else {
32603260 let prologActions = prolog(i)
32613261 if ((size(i.payments) != 0))
32623262 then throw("No payments required")
32633263 else if (!(isDefined(addressFromString(oldPlayer))))
32643264 then throw(("Invalid address: " + oldPlayer))
32653265 else if (!(isDefined(addressFromString(newPlayer))))
32663266 then throw(("Invalid address: " + newPlayer))
32673267 else {
32683268 let oldsKey = keyOldies()
32693269 let olds = getString(oldsKey)
32703270 let oldies = if (isDefined(olds))
32713271 then split_4C(value(olds), "_")
32723272 else nil
32733273 if (containsElement(oldies, newPlayer))
32743274 then throw((newPlayer + " is not newbie (already has referrals)"))
32753275 else {
32763276 let refByKey = keyAddressRefBy(newPlayer)
32773277 let refBy = getString(refByKey)
32783278 if (if (isDefined(refBy))
32793279 then isDefined(addressFromString(value(refBy)))
32803280 else false)
32813281 then throw(((newPlayer + " already has refBy: ") + value(refBy)))
32823282 else {
32833283 let refsKey = keyAddressReferrals(oldPlayer)
32843284 let refs = getString(refsKey)
32853285 let refsArray = if (isDefined(refs))
32863286 then split_4C(value(refs), "_")
32873287 else nil
32883288 if (containsElement(refsArray, newPlayer))
32893289 then throw((((oldPlayer + " already contains ") + newPlayer) + " within referrals"))
32903290 else {
32913291 let newRefs = makeString_2C((refsArray :+ newPlayer), "_")
32923292 let newOlds = if (containsElement(oldies, oldPlayer))
32933293 then value(olds)
32943294 else makeString_2C((oldies :+ oldPlayer), "_")
32953295 $Tuple2(([StringEntry(refByKey, oldPlayer), StringEntry(refsKey, newRefs), StringEntry(oldsKey, newOlds)] ++ prologActions), 0)
32963296 }
32973297 }
32983298 }
32993299 }
33003300 }
33013301
33023302
33033303
33043304 @Callable(i)
33053305 func distributePoints (strength,accuracy,intellect,endurance,dexterity) = {
33063306 let prologActions = prolog(i)
33073307 if ((size(i.payments) != 0))
33083308 then throw("No payments required")
33093309 else {
33103310 let addr = toString(i.originCaller)
33113311 let virtWlgData = asAnyList(invoke(wlgContract, "checkWlgXpREADONLY", [addr], nil))
33123312 let virtWlgPoints = asInt(virtWlgData[1])
3313- let $t09949699886 = if ((0 >= virtWlgPoints))
3313+ let $t09948799877 = if ((0 >= virtWlgPoints))
33143314 then $Tuple2(0, nil)
33153315 else {
33163316 let deltaXP = asInt(invoke(wlgContract, "takeWlgXp", [addr], nil))
33173317 if ((deltaXP == deltaXP))
33183318 then $Tuple2(virtWlgPoints, [IntegerEntry(keyUserLevel(addr), asInt(virtWlgData[0])), IntegerEntry(keyUserXP(addr), asInt(virtWlgData[2]))])
33193319 else throw("Strict value is not equal to itself.")
33203320 }
3321- let wlgPoints = $t09949699886._1
3322- let wlgActions = $t09949699886._2
3321+ let wlgPoints = $t09948799877._1
3322+ let wlgActions = $t09948799877._2
33233323 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
33243324 let freeKeyAcc = keyUserFreePoints(addr)
33253325 let freePointsAcc = (valueOrElse(getInteger(freeKeyAcc), 0) + wlgPoints)
33263326 let freeKeyDuck = keyDuckFreePoints(duckAssetId)
33273327 let freePointsDuck = valueOrElse(getInteger(freeKeyDuck), 0)
33283328 let sumFree = (freePointsAcc + freePointsDuck)
33293329 let sumToDistribute = ((((strength + accuracy) + intellect) + endurance) + dexterity)
33303330 if ((sumToDistribute > sumFree))
33313331 then throw((("There are only " + toString(sumFree)) + " free points to distribute"))
33323332 else {
33333333 let charsKey = keyDuckChars(duckAssetId)
33343334 let chars = split(valueOrElse(getString(charsKey), "0_0_0_0_0"), "_")
33353335 let newAcc = (freePointsAcc - sumToDistribute)
33363336 $Tuple2((([IntegerEntry(freeKeyAcc, if ((0 > newAcc))
33373337 then 0
33383338 else newAcc), IntegerEntry(freeKeyDuck, if ((0 > newAcc))
33393339 then (freePointsDuck + newAcc)
33403340 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)
33413341 }
33423342 }
33433343 }
33443344
33453345
33463346
33473347 @Callable(i)
33483348 func splitByGlobalWeightsREADONLY (amount) = $Tuple2(nil, getNeededMaterials(amount))
33493349
33503350
33513351
33523352 @Callable(i)
33533353 func splitByGlobalAndLocalWeightsREADONLY (matAmount,resAmount,terrains) = {
33543354 let terrainCounts = countTerrains(terrains)
33553355 $Tuple2(nil, $Tuple2(getNeededMaterials(matAmount), distributeByWeights(resAmount, terrainCounts)))
33563356 }
33573357
33583358
33593359
33603360 @Callable(i)
33613361 func getBackpackREADONLY (duckAssetId) = $Tuple2(nil, makeString(getBackpack(keyBackpackByDuck(duckAssetId)), ":"))
33623362
33633363
33643364
33653365 @Callable(i)
33663366 func getWarehouseREADONLY (landAssetId) = {
33673367 let asset = value(assetInfo(fromBase58String(landAssetId)))
33683368 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
33693369 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
33703370 $Tuple2(nil, makeString_2C(getWarehouse(keyWarehouseByLand(landAssetId), landIndex, infraLevel), ":"))
33713371 }
33723372
33733373
33743374
33753375 @Callable(i)
33763376 func saveLastTx () = if (!(containsElement([wlgContract, economyContract, tournamentContract, acresContract], i.caller)))
33773377 then throw("Access denied")
33783378 else $Tuple2(prolog(i), 42)
33793379
33803380
33813381
33823382 @Callable(i)
33833383 func updateDuckStats (duckAssetId,deltaXP) = if ((i.caller != economyContract))
33843384 then throw("Access denied")
33853385 else updateDuckStatsInternal(duckAssetId, deltaXP)
33863386
33873387
33883388
33893389 @Callable(i)
33903390 func updateAccStats (addr,deltaXP) = if (!(containsElement([wlgContract, economyContract, acresContract], i.caller)))
33913391 then throw("Access denied")
33923392 else updateAccStatsInternal(addr, deltaXP)
33933393
33943394
33953395
33963396 @Callable(i)
33973397 func equipDuck (equipment) = {
33983398 let prologActions = prolog(i)
33993399 if ((size(i.payments) != 0))
34003400 then throw("No payments required")
34013401 else {
34023402 let addr = toString(i.originCaller)
34033403 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
34043404 if (checkTournament(duckAssetId))
34053405 then throw("equipDuck_checkTournament")
34063406 else if (checkDelivery(duckAssetId))
34073407 then throw("equipDuck_checkDelivery")
34083408 else {
34093409 let eqKey = keyDuckEquipment(duckAssetId)
34103410 let currentSegs = split(valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,"), "_")
34113411 let bpKey = keyBackpackByDuck(duckAssetId)
34123412 let currentPack = getBackpack(bpKey)
34133413 let newEq = split(equipment, "_")
34143414 if ((size(newEq) != NUMSEGMENTS))
34153415 then throw("Wrong equipment string")
34163416 else {
34173417 let tempProdB = dressB(currentSegs, prodStrToBytes(currentPack[bpIdxProd]), true, nil)
34183418 let segBpAux = split(newEq[segBackpack], ";")[1]
34193419 let buffEffect = if ((segBpAux == ""))
34203420 then 0
34213421 else {
34223422 let aux0 = split(segBpAux, ",")[0]
34233423 if ((aux0 == ""))
34243424 then 0
34253425 else {
34263426 let idxCnt = split(aux0, ":")
34273427 let idx = idxCnt[0]
34283428 let cnt = idxCnt[1]
34293429 if (if (if (if (if ((idx == "06"))
34303430 then true
34313431 else (idx == "07"))
34323432 then true
34333433 else (idx == "08"))
34343434 then (cnt != "")
34353435 else false)
34363436 then (parseIntValue(cnt) > 0)
34373437 else false)
34383438 then parseIntValue(split(productionMatrix[parseIntValue(idx)], "_")[rIdxEffect])
34393439 else 0
34403440 }
34413441 }
34423442 let stats = getDuckStats(this, duckAssetId, buffEffect, true)
34433443 let newProdB = dressB(newEq, tempProdB, false, stats)
34443444 let newProdStr = bytesToProdStr(newProdB)
34453445 $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)
34463446 }
34473447 }
34483448 }
34493449 }
34503450
34513451
34523452
34533453 @Callable(i)
34543454 func fortificateLand (landAssetId,plan) = {
34553455 let prologActions = prolog(i)
34563456 if ((size(i.payments) != 0))
34573457 then throw("No payments required")
34583458 else {
34593459 let addr = toString(i.originCaller)
34603460 let duckAssetId = valueOrElse(getString(keyStakedDuckByOwner(addr)), "")
34613461 let duckStats = getDuckStats(this, duckAssetId, 0, false)
34623462 let fortKey = keyFortificationsByLand(landAssetId)
34633463 let currentForts = split(valueOrElse(getString(fortKey), ":0_15:0_18:0"), "_")
34643464 let asset = value(assetInfo(fromBase58String(landAssetId)))
34653465 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
34663466 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
34673467 let whKey = keyWarehouseByLand(landAssetId)
34683468 let wh = getWarehouse(whKey, landIndex, infraLevel)
34693469 let curLoft = split(wh[whIdxLOFT], "_")
34703470 let curO = parseIntValue(curLoft[volOccupied])
34713471 let curF = parseIntValue(curLoft[volFree])
34723472 let newForts = split(plan, "_")
3473- let $t0106724106839 = fortB(currentForts, prodStrToBytes(wh[whIdxProd]), curO, curF, true, nil)
3474- let tempProdB = $t0106724106839._1
3475- let tempO = $t0106724106839._2
3476- let tempF = $t0106724106839._3
3477- let $t0106842106938 = fortB(newForts, tempProdB, tempO, tempF, false, duckStats)
3478- let newProdB = $t0106842106938._1
3479- let newO = $t0106842106938._2
3480- let newF = $t0106842106938._3
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
34813481 let newProdStr = bytesToProdStr(newProdB)
34823482 let newLoftStr = makeString([curLoft[volLocked], toString(newO), toString(newF), curLoft[volTotal]], "_")
34833483 $Tuple2(([StringEntry(fortKey, plan), StringEntry(whKey, makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], newProdStr, newLoftStr], ":"))] ++ prologActions), 0)
34843484 }
34853485 }
34863486
34873487
34883488
34893489 @Callable(i)
34903490 func initDuckTourAttempt (duckAssetId) = if ((i.caller != tournamentContract))
34913491 then throw("Access denied")
34923492 else {
34933493 let keyHealth = keyDuckHealth(duckAssetId)
34943494 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
34953495 let curHealth = valueOrElse(getInteger(keyHealth), maxHP)
34963496 let curLocKey = keyDuckLocation(duckAssetId)
34973497 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
34983498 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
34993499 let tourLocation = (toString(lastId) + "_T_0")
35003500 $Tuple2([IntegerEntry(keySavedHealth(duckAssetId), curHealth), IntegerEntry(keyHealth, maxHP), StringEntry(keySavedLocation(duckAssetId), curLocation), StringEntry(curLocKey, tourLocation)], tourLocation)
35013501 }
35023502
35033503
35043504
35053505 @Callable(i)
35063506 func breakAttempt () = {
35073507 let prologActions = prolog(i)
35083508 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
35093509 let curLocKey = keyDuckLocation(duckAssetId)
35103510 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
35113511 if ((split(curLocation, "_")[locIdxType] != "T"))
35123512 then throw("Your duck is not in the tournament")
35133513 else {
35143514 let savedHealth = getIntegerValue(keySavedHealth(duckAssetId))
35153515 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
35163516 $Tuple2(((prologActions :+ IntegerEntry(keyDuckHealth(duckAssetId), savedHealth)) :+ StringEntry(curLocKey, savedLocation)), curLocation)
35173517 }
35183518 }
35193519
35203520
35213521
35223522 @Callable(i)
35233523 func exitTournamentInternal (duckAssetId) = if ((i.caller != this))
35243524 then throw("Access denied")
35253525 else {
35263526 let savedHealth = getIntegerValue(keySavedHealth(duckAssetId))
35273527 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
35283528 $Tuple2([IntegerEntry(keyDuckHealth(duckAssetId), savedHealth), StringEntry(keyDuckLocation(duckAssetId), savedLocation)], false)
35293529 }
35303530
35313531
35323532
35333533 @Callable(i)
35343534 func exitDeliveryInternal (duckAssetId) = if ((i.caller != this))
35353535 then throw("Access denied")
35363536 else {
35373537 let e = exitDeliveryCommon(duckAssetId, false, 0, 0)
35383538 $Tuple2((e._1 ++ e._2), false)
35393539 }
35403540
35413541
35423542
35433543 @Callable(i)
35443544 func autoExitDelivery (duckAssetId,newHP,reason,score) = if ((i.caller != this))
35453545 then throw("Access denied")
35463546 else {
35473547 let e = exitDeliveryCommon(duckAssetId, true, newHP, score)
35483548 $Tuple2(e._1, e._3)
35493549 }
35503550
35513551
35523552
35533553 @Callable(i)
35543554 func breakDelivery () = $Tuple2(prolog(i), "breakDelivery")
35553555
35563556
35573557
35583558 @Callable(i)
35593559 func prepareRobbery (message,sig) = {
35603560 let prologActions = prolog(i)
35613561 if (!(sigVerify_8Kb(message, sig, pub)))
35623562 then throw("signature does not match")
35633563 else if ((size(i.payments) != 1))
35643564 then throw("exactly 1 payment must be attached")
35653565 else {
35663566 let pmt = i.payments[0]
35673567 let wlgAmt = pmt.amount
35683568 if (if (!(isDefined(pmt.assetId)))
35693569 then true
35703570 else (value(pmt.assetId) != wlgAssetId))
35713571 then throw("WLGOLD payments only!")
35723572 else {
35733573 let parts = split(toUtf8String(message), "|")
35743574 if ((size(parts) != 2))
35753575 then throw("Wrong message format")
35763576 else {
35773577 let duckAssetId = parts[0]
35783578 if (checkTournament(duckAssetId))
35793579 then throw("prepareRobbery_checkTournament")
35803580 else if (checkDelivery(duckAssetId))
35813581 then throw("prepareRobbery_checkDelivery")
35823582 else {
35833583 let robCost = getRobberyData(this, duckAssetId)._1
35843584 if ((robCost > wlgAmt))
35853585 then throw(((("Payment " + toString(wlgAmt)) + " < required ") + toString(robCost)))
35863586 else {
35873587 let candidates = split(parts[1], "_")
35883588 let now = lastBlock.timestamp
35893589 let duckState = valueOrElse(getInteger(keyDuckRobberyState(duckAssetId)), 0)
35903590 let lockedLand = valueOrElse(getString(keyLockedLandByDuck(duckAssetId)), "")
35913591 let landETA = valueOrElse(getInteger(keyLandCooldownETA(lockedLand)), 0)
35923592 if (if ((duckState != duckIdxFree))
35933593 then (landETA > now)
35943594 else false)
35953595 then throw(("You already started robbing, wait till " + toString(landETA)))
35963596 else {
35973597 func checker (acc,landAssetId) = {
35983598 let state = valueOrElse(getInteger(keyLandRobberyState(landAssetId)), 0)
35993599 let cooldownETA = valueOrElse(getInteger(keyLandCooldownETA(landAssetId)), 0)
36003600 if ((state > size(landRobCooldowns)))
36013601 then throw("Invalid state")
36023602 else if ((now > cooldownETA))
36033603 then {
36043604 let stakedTime = valueOrElse(getInteger(keyStakedTimeByAssetId(landAssetId)), 0)
36053605 if ((0 >= stakedTime))
36063606 then acc
36073607 else {
36083608 let a = value(assetInfo(fromBase58String(landAssetId)))
36093609 let d = split(a.description, "_")
36103610 let pieces = numPiecesBySize(d[recLandSize])
36113611 let productivity = applyBonuses(landAssetId, pieces)
36123612 let deltaTime = (now - stakedTime)
36133613 let availRes = fraction(deltaTime, (productivity * pieces), DAYMILLIS)
36143614 if ((MIN_RES_TO_ROB > availRes))
36153615 then acc
36163616 else (acc :+ landAssetId)
36173617 }
36183618 }
36193619 else acc
36203620 }
36213621
36223622 let filtered = {
36233623 let $l = candidates
36243624 let $s = size($l)
36253625 let $acc0 = nil
36263626 func $f0_1 ($a,$i) = if (($i >= $s))
36273627 then $a
36283628 else checker($a, $l[$i])
36293629
36303630 func $f0_2 ($a,$i) = if (($i >= $s))
36313631 then $a
36323632 else throw("List size exceeds 10")
36333633
36343634 $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)
36353635 }
36363636 if ((size(filtered) == 0))
36373637 then throw("No candidates for robbery")
36383638 else {
36393639 let rndIdx = getRandomNumber(size(filtered), message, sig)
36403640 let landAssetId = filtered[rndIdx]
36413641 $Tuple2(([IntegerEntry(keyLandRobberyState(landAssetId), robIdxLocked), IntegerEntry(keyLandCooldownETA(landAssetId), (now + landRobCooldowns[robIdxLocked])), IntegerEntry(keyDuckRobberyState(duckAssetId), duckIdxPreparing), StringEntry(keyLockedLandByDuck(duckAssetId), landAssetId)] ++ prologActions), landAssetId)
36423642 }
36433643 }
36443644 }
36453645 }
36463646 }
36473647 }
36483648 }
36493649 }
36503650
36513651
36523652
36533653 @Callable(i)
36543654 func robLand (message,sig) = {
36553655 let prologActions = prolog(i)
36563656 if (!(sigVerify_8Kb(message, sig, pub)))
36573657 then throw("signature does not match")
36583658 else {
36593659 let userAddr = toString(i.caller)
36603660 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
36613661 let now = lastBlock.timestamp
36623662 $Tuple2((prologActions :+ IntegerEntry(keyLastRobberyTimeByDuck(duckAssetId), now)), 0)
36633663 }
36643664 }
36653665
36663666
36673667
36683668 @Callable(i)
36693669 func acceptDelivery () = {
36703670 let prologActions = prolog(i)
36713671 let userAddr = toString(i.caller)
36723672 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
36733673 let fundTotal = valueOrElse(getInteger(economyContract, deliveryFundKey), 0)
36743674 let lockedTotal = valueOrElse(getInteger(economyContract, deliveryLockedKey), 0)
36753675 if ((MIN_USDT_FEE_DELIVERY > (fundTotal - lockedTotal)))
36763676 then throw(((("Delivery is not available, fund=" + fixedPoint(fundTotal, 6)) + ", locked=") + fixedPoint(lockedTotal, 6)))
36773677 else {
36783678 let now = lastBlock.timestamp
36793679 let delayETA = valueOrElse(getInteger(keyDeliveryDelayByDuck(duckAssetId)), 0)
36803680 if ((delayETA > now))
36813681 then throw(("Delivery is forbidden for your duck until " + toString(delayETA)))
36823682 else {
36833683 let health = getIntegerValue(keyDuckHealth(duckAssetId))
36843684 if ((0 >= health))
36853685 then throw("You cannot accept delivery with zero health")
36863686 else {
36873687 let countKey = keyUserDeliveryCount(userAddr)
36883688 let count = valueOrElse(getInteger(countKey), 0)
36893689 let lastDay = valueOrElse(getInteger(keyUserLastDeliveryDay(userAddr)), 0)
36903690 let today = (now / DAYMILLIS)
36913691 let acres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddr)), 0)
36923692 let allowedDeliveries = (ALLOWED_FREE_DELIVERIES + (acres / ACRES_FOR_DELIVERY_ATTEMPT))
36933693 if (if ((count >= allowedDeliveries))
36943694 then (lastDay == today)
36953695 else false)
36963696 then throw((("You already used " + toString(allowedDeliveries)) + " delivery attempts for today"))
36973697 else if (checkTournament(duckAssetId))
36983698 then throw("acceptDelivery_checkTournament")
36993699 else if (checkDelivery(duckAssetId))
37003700 then throw("acceptDelivery_checkDelivery")
37013701 else {
37023702 let newLockedTotal = asInt(invoke(economyContract, "updateDeliveryLocked", [(lockedTotal + MIN_USDT_FEE_DELIVERY)], nil))
37033703 let curLocKey = keyDuckLocation(duckAssetId)
37043704 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
37053705 let deliveryLocation = (toString(now) + "_D_0")
37063706 $Tuple2(([StringEntry(keySavedLocation(duckAssetId), curLocation), StringEntry(curLocKey, deliveryLocation), IntegerEntry(countKey, if ((lastDay != today))
37073707 then 0
37083708 else count)] ++ prologActions), $Tuple2(deliveryLocation, newLockedTotal))
37093709 }
37103710 }
37113711 }
37123712 }
37133713 }
37143714
37153715
37163716
37173717 @Callable(i)
37183718 func checkDeliveryCallback (duckAssetId) = if ((i.caller != tournamentContract))
37193719 then throw("Access denied")
37203720 else $Tuple2(nil, checkDelivery(duckAssetId))
37213721
37223722
37233723
37243724 @Callable(i)
37253725 func genTestREADONLY (seed,landSizeIndex) = {
3726- let bigNum = abs(toBigInt(sha256(toBytes(seed))))
3726+ let vrf = value(value(blockInfoByHeight(2827006)).vrf)
3727+ let bigNum = abs(toBigInt((vrf + sha256(toBytes(seed)))))
37273728 $Tuple2(nil, gen1(bigNum, landSizeIndex))
37283729 }
37293730
37303731

github/deemru/w8io/169f3d6 
298.66 ms