Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
25A56D9BCB7C5765652457BE2DB4080E2119D28F642F2E93A3B42341DB92A679
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
201,039,004
Requested gas limit
GAS USED
154,645,378
Gas consumed
FEE
201040ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems30000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CoOlBwoML3ZtLm1fYWRkcGtnEvGkBwooZzE3Y2p5bTVlOWhod3M0Nmx0NjMyOXB2Mmd0eDJheTA1MDNoZ2VtcxK0pAcKCmdlbXNhcnQzZDISPmduby5sYW5kL3AvZzE3Y2p5bTVlOWhod3M0Nmx0NjMyOXB2Mmd0eDJheTA1MDNoZ2Vtcy9nZW1zYXJ0M2QyGtmiBwoLZ2Vtc2FydC5nbm8SyKIHLy8gUGFja2FnZSBnZW1zYXJ0ZmFiOiBvbi1jaGFpbiBTVkcgZ2VuZXJhdG9yIGZvciB0aGUgImdlbSBpbiBhIHJpbmciCi8vIGNvbGxlY3Rpb24gLS0gdGhlICJmYWIiIGl0ZXJhdGlvbiBvZiBnZW1zYXJ0MiwgcmUtbGl0IHRvIHJlYWQgYXMgYQovLyB0cmFuc3BhcmVudCwgcG9saXNoZWQgY3J5c3RhbCBpbnN0ZWFkIG9mIGEgZmxhdCBtYXR0ZSBjdXRvdXQuIFNhbWUKLy8gZ2VvbWV0cnksIHNhbWUgdHJhaXRzLCBzYW1lIGNhc2NhZGUgc2NoZWR1bGU7IHdoYXQgY2hhbmdlZCBpcyBvbmx5Ci8vIGhvdyBhIGZhY2V0ZWQgc3RvbmUgaXMgcGFpbnRlZCAoc2VlIHRoZSBnZW0gc2hhcGVzIHNlY3Rpb24pLiBUd28gaGFyZAovLyBjb25zdHJhaW50cyBzaGFwZWQgZXZlcnkgY2hvaWNlIHRoZXJlOiBieXRlcyBwZXIgdG9rZW4gKGEgdG9rZW4gaXMKLy8gcmUtcmVuZGVyZWQgb24gZXZlcnkgVG9rZW5VUkkvUmVuZGVyIHJlYWQgYW5kIHNoaXBwZWQgaW5saW5lKSBhbmQKLy8gV2ViS2l0IHJlbmRlcmluZyBjb3N0IC0tIHRoaXMgcHJvamVjdCBoYXMgdHdpY2UgZml4ZWQgcmVhbCBTYWZhcmkKLy8gc2xvd2Rvd25zIGJ5IHJlbW92aW5nIFNWRyA8ZmlsdGVyPnMgYW5kIFNNSUwsIHNvIHRoZSBuZXcgbG9vayB1c2VzCi8vIG9ubHkgc3RhdGljIGdyYWRpZW50cywgcGF0aHMsIG9uZSBpbmhlcml0ZWQgc3Ryb2tlLCBhbmQgQ1NTIG9wYWNpdHkKLy8ga2V5ZnJhbWVzLiBOb3RoaW5nIGVsc2UuCi8vCi8vIE9yaWdpbmFsbHkgcG9ydGVkIGZyb20gdGhlIFB5dGhvbiBwcm90b3R5cGUgdXNlZCB0byBkZXNpZ24gYW5kCi8vIGFwcHJvdmUgdGhlIGZpcnN0IGxvb2suIEV2ZXJ5IGZ1bmN0aW9uIGhlcmUgaXMgcHVyZSDigJQgbm8gc3RhdGUgcmVhZHMKLy8gYmV5b25kIGl0cyBvd24gc3RvbmUvY29sb3IgdGFibGVzIOKAlCBzbyBhIHRva2VuJ3MgZnVsbCBpbWFnZSBjYW4gYmUKLy8gcmVjb21wdXRlZCBvbiBhbnkgcmVhZCAoVG9rZW5VUkkvUmVuZGVyKSBpbnN0ZWFkIG9mIGJlaW5nIHN0b3JlZCBhcyBhCi8vIHByZWNvbXB1dGVkIGJsb2IuCi8vCi8vIEEgc2VwYXJhdGUgZGVwbG95IGZyb20gdGhlIG5mdG1pbnRlciByZWFsbSB0aGF0IGltcG9ydHMgaXQgKG5vdCBvbmUKLy8gY29tYmluZWQgcGFja2FnZSBhcyBvcmlnaW5hbGx5IGRlc2lnbmVkKSAtLSBnbm9tY3AncyBvd24gZ25vX2FkZHBrZwovLyB0b29sIGhhcmRjb2RlcyBhIDEwLDAwMCwwMDAgdWdub3QgbWF4LWRlcG9zaXQgY2VpbGluZyBwZXIgZGVwbG95IGNhbGwKLy8gd2l0aCBubyBvdmVycmlkZSwgYW5kIHRoZSBjb21iaW5lZCBzb3VyY2UgKH4xNzVLQikgbmVlZHMgfjE3LjZNLiBFYWNoCi8vIGhhbGYgZml0cyB1bmRlciB0aGF0IGNlaWxpbmcgZGVwbG95ZWQgc2VwYXJhdGVseS4gVGhlIHB1YmxpYyBzdXJmYWNlCi8vIGJlbG93IChTaGFwZU5hbWVzL01ldGFsTmFtZXMvUmVuZGVyVG9rZW5TVkcvU3RvbmVGb3JDaGFpbi8KLy8gQ29sb3JQYWxldHRlU2l6ZSwgcGx1cyBTZXRTdG9uZUZvckNoYWluL0FkZFN0b25lQ29sb3IvU3RvbmVOYW1lc0NTVi8KLy8gQ29sb3JQYWxldHRlQ1NWL01ldGFsVG9uZUhleCkgZXhpc3RzIHNwZWNpZmljYWxseSBzbyBuZnRtaW50ZXIuZ25vIGNhbgovLyBzdGlsbCByZWFjaCBldmVyeXRoaW5nIGl0IG5lZWRzIGFjcm9zcyB0aGF0IHBhY2thZ2UgYm91bmRhcnkuCi8vCi8vIFRoaXMgaXMgdGhlIGFyY2hpdGVjdHVyZSBjaGFuZ2UgcmVxdWVzdGVkIGV4cGxpY2l0bHksIGJhY2sgd2hlbiB0aGlzCi8vIHdhcyBzdGlsbCBvbmUgZmlsZTogaW5zdGVhZCBvZiB0aGUgb3duZXIgcHJlY29tcHV0aW5nIGFuZCBzdG9yaW5nIGEKLy8gZnVsbCB+Ny42S0IgaW1hZ2Ugc3RyaW5nIHBlciB0b2tlbiwgdGhpcyBwYWNrYWdlJ3Mgc2hhcmVkIGdlbmVyYXRvcgovLyBjb2RlIGlzIHN0b3JlZCBPTkNFLCBhbmQgZWFjaCB0b2tlbiBvbmx5IG5lZWRzIGEgaGFuZGZ1bCBvZiBzbWFsbAovLyB0cmFpdCBzZWxlY3Rpb25zIChzZWUgdHJhaXRQcmVzZXQgaW4gbmZ0bWludGVyLmdubykg4oCUIHRoZSBpbWFnZSBpcwovLyBhc3NlbWJsZWQgZnJvbSB0aG9zZSBvbiBkZW1hbmQuIFN0b3JhZ2UgY29zdCBzdG9wcyBzY2FsaW5nIHdpdGggdG9rZW4KLy8gY291bnQ7IGl0J3MgZG9taW5hdGVkIGJ5IHRoaXMgcGFja2FnZSdzIG93biBvbmUtdGltZSBkZXBsb3ltZW50IGNvc3QKLy8gaW5zdGVhZC4KcGFja2FnZSBnZW1zYXJ0M2QyCgppbXBvcnQgKAoJImNyeXB0by9zaGEyNTYiCgkibWF0aCIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCmNvbnN0ICgKCWNhbnZhc1csIGNhbnZhc0ggPSAxNzAuMCwgMTcwLjAKCXN1YmpYLCBzdWJqWSAgICAgPSA4NS4wLCA3OC4wCikKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBudW1iZXIvY29sb3IgZm9ybWF0dGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8vIGZudW0gZm9ybWF0cyBhIGZsb2F0IHRvIDIgZGVjaW1hbCBwbGFjZXMgd2l0aG91dCBkZXBlbmRpbmcgb24gdWZtdAovLyBzdXBwb3J0aW5nICVmLyVnICh1bmNlcnRhaW4gaW4gdGhpcyBlbnZpcm9ubWVudCkg4oCUIHBsYWluIGludGVnZXIgbWF0aAovLyBhbmQgJWQgaW5zdGVhZC4gWmVyby1wYWRzIHRoZSBmcmFjdGlvbiBtYW51YWxseSByYXRoZXIgdGhhbiB2aWEKLy8gIiUwMmQiOiB1Zm10LlNwcmludGYgZG9lcyBOT1QgaW1wbGVtZW50IHdpZHRoL3plcm8tcGFkIGZsYWdzIChjb25maXJtZWQKLy8gZW1waXJpY2FsbHkgLS0gU3ByaW50ZigiJWQuJTAyZCIsIDEsIDkpIHJldHVybnMgIjEuOSIsIG5vdCAiMS4wOSIpLCBzbwovLyByZWx5aW5nIG9uICIlMDJkIiBzaWxlbnRseSBjb3JydXB0ZWQgYW55IHZhbHVlIHdob3NlIGh1bmRyZWR0aHMgZGlnaXQKLy8gcm91bmRlZCB0byAxLTkgKGUuZy4gMS4wOSByZW5kZXJlZCBhcyAiMS45IiwgYSB+MTB4IGVycm9yKSB0aHJvdWdob3V0Ci8vIHRoaXMgd2hvbGUgZmlsZSwgc2luY2UgZXZlcnkgY29vcmRpbmF0ZS9yYWRpdXMvYW5nbGUgZ29lcyB0aHJvdWdoIHRoaXMKLy8gb25lIGZ1bmN0aW9uLgovLyBpdG9hIHdyaXRlcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJ3MgZGlnaXRzLiBFdmVyeSBudW1iZXIgaW4gYSB0b2tlbgovLyBnb2VzIHRocm91Z2ggaGVyZTogdWZtdC5TcHJpbnRmIGlzIGdlbmVyYWwtcHVycG9zZSBhbmQsIG9uLWNoYWluLCBtb3N0Ci8vIG9mIGEgcmVuZGVyJ3MgZ2FzIHdlbnQgdG8gZm9ybWF0dGluZyBjb29yZGluYXRlcyB3aXRoIGl0LgpmdW5jIGl0b2EodiBpbnQ2NCkgc3RyaW5nIHsKCWlmIHYgPT0gMCB7CgkJcmV0dXJuICIwIgoJfQoJbmVnIDo9IHYgPCAwCglpZiBuZWcgewoJCXYgPSAtdgoJfQoJdmFyIGIgWzIwXWJ5dGUKCWkgOj0gbGVuKGIpCglmb3IgdiA+IDAgewoJCWktLQoJCWJbaV0gPSBieXRlKCcwJyArIHYlMTApCgkJdiAvPSAxMAoJfQoJaWYgbmVnIHsKCQlpLS0KCQliW2ldID0gJy0nCgl9CglyZXR1cm4gc3RyaW5nKGJbaTpdKQp9CgovLyBmbnVtIGlzIHRoZSBjb21wYWN0IGZvcm0gZXZlcnkgZW1pdHRlciB1c2VzOiB0d28gZGVjaW1hbHMgYXQgbW9zdCwKLy8gdHJhaWxpbmcgemVyb3MgYW5kIGEgbGVhZGluZyAiMCIgZHJvcHBlZCAoIjg1LjAwIiAtPiAiODUiLCAiMC40NSIgLT4KLy8gIi40NSIpLiBWYWxpZCBpbiBTVkcgYXR0cmlidXRlcyBhbmQgQ1NTIGFsaWtlOyBhIHF1YXJ0ZXIgb2YgYSB0b2tlbidzCi8vIGJ5dGVzIHdlcmUgcGFkZGluZyBiZWZvcmUgdGhpcy4KZnVuYyBmbnVtKHYgZmxvYXQ2NCkgc3RyaW5nIHsgcmV0dXJuIGNudW0odikgfQoKZnVuYyBmbnVtUGFkKHYgZmxvYXQ2NCkgc3RyaW5nIHsKCW5lZyA6PSB2IDwgMAoJaWYgbmVnIHsKCQl2ID0gLXYKCX0KCXNjYWxlZCA6PSBpbnQ2NCh2KjEwMCArIDAuNSkKCXdob2xlIDo9IHNjYWxlZCAvIDEwMAoJZnJhYyA6PSBzY2FsZWQgJSAxMDAKCWZyYWNTdHIgOj0gaXRvYShmcmFjKQoJaWYgZnJhYyA8IDEwIHsKCQlmcmFjU3RyID0gIjAiICsgZnJhY1N0cgoJfQoJcyA6PSBpdG9hKHdob2xlKSArICIuIiArIGZyYWNTdHIKCWlmIG5lZyB7CgkJcmV0dXJuICItIiArIHMKCX0KCXJldHVybiBzCn0KCi8vIGZudW0xIGlzIGZudW0gYXQgb25lIGRlY2ltYWwgLS0gZm9yIGtleWZyYW1lIHBlcmNlbnRhZ2VzLCB3aGVyZSB0aGUKLy8gc2Vjb25kIGRlY2ltYWwgaXMgYSBmcmFjdGlvbiBvZiBhIGZyYW1lIGFuZCBvbmx5IGNvc3RzIGJ5dGVzICh0aGUKLy8ga2V5ZnJhbWUgQ1NTIGlzIHRoZSBsYXJnZXN0IHNsaWNlIG9mIGV2ZXJ5IHRva2VuKS4KLy8gY251bSBpcyBmbnVtIHdpdGhvdXQgcGFkZGluZzogdHJhaWxpbmcgemVyb3MgYW5kIGEgbGVhZGluZyAiMCIgYmVmb3JlCi8vIHRoZSBwb2ludCBhcmUgZHJvcHBlZCAoIjAuNDUiIC0+ICIuNDUiLCAiODUuMDAiIC0+ICI4NSIpLiBVc2VkIGJ5IHRoZQovLyByaW5nIGFuZCBwbGF0ZSBtYXJrdXAsIHdoaWNoIGlzIGVtaXR0ZWQgb24gZXZlcnkgdG9rZW4gcmVhZC4KZnVuYyBjbnVtKHYgZmxvYXQ2NCkgc3RyaW5nIHsKCXMgOj0gZm51bVBhZCh2KQoJaWYgc3RyaW5ncy5Db250YWlucyhzLCAiLiIpIHsKCQlzID0gc3RyaW5ncy5UcmltUmlnaHQoc3RyaW5ncy5UcmltUmlnaHQocywgIjAiKSwgIi4iKQoJfQoJaWYgc3RyaW5ncy5IYXNQcmVmaXgocywgIjAuIikgewoJCXMgPSBzWzE6XQoJfSBlbHNlIGlmIHN0cmluZ3MuSGFzUHJlZml4KHMsICItMC4iKSB7CgkJcyA9ICItIiArIHNbMjpdCgl9CglyZXR1cm4gcwp9CgpmdW5jIGZudW0xKHYgZmxvYXQ2NCkgc3RyaW5nIHsKCW5lZyA6PSB2IDwgMAoJaWYgbmVnIHsKCQl2ID0gLXYKCX0KCXNjYWxlZCA6PSBpbnQ2NCh2KjEwICsgMC41KQoJcyA6PSBpdG9hKHNjYWxlZC8xMCkgKyAiLiIgKyBpdG9hKHNjYWxlZCUxMCkKCWlmIG5lZyB7CgkJcmV0dXJuICItIiArIHMKCX0KCXJldHVybiBzCn0KCi8vIHBjdG51bSBmb3JtYXRzIGEgZmxvYXQgYWxyZWFkeSBtZWFudCBhcyBhIHBlcmNlbnRhZ2UgKDIgZGVjaW1hbHMsIG5vCi8vIGNsYW1waW5nIOKAlCBjYWxsZXJzIGNsYW1wIGZpcnN0IHdoZXJlIGl0IG1hdHRlcnMpLgpmdW5jIHBjdG51bSh2IGZsb2F0NjQpIHN0cmluZyB7IHJldHVybiBmbnVtKHYpIH0KCmZ1bmMgaGV4VG9SR0IoaGV4IHN0cmluZykgKGludCwgaW50LCBpbnQpIHsKCWggOj0gaGV4CglpZiBsZW4oaCkgPiAwICYmIGhbMF0gPT0gJyMnIHsKCQloID0gaFsxOl0KCX0KCXIgOj0gaGV4Qnl0ZShoWzA6Ml0pCglnIDo9IGhleEJ5dGUoaFsyOjRdKQoJYiA6PSBoZXhCeXRlKGhbNDo2XSkKCXJldHVybiByLCBnLCBiCn0KCmZ1bmMgaGV4Qnl0ZShzIHN0cmluZykgaW50IHsKCXYgOj0gMAoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQl2YXIgZCBpbnQKCQlzd2l0Y2ggewoJCWNhc2UgYyA+PSAnMCcgJiYgYyA8PSAnOSc6CgkJCWQgPSBpbnQoYyAtICcwJykKCQljYXNlIGMgPj0gJ2EnICYmIGMgPD0gJ2YnOgoJCQlkID0gaW50KGMtJ2EnKSArIDEwCgkJY2FzZSBjID49ICdBJyAmJiBjIDw9ICdGJzoKCQkJZCA9IGludChjLSdBJykgKyAxMAoJCX0KCQl2ID0gdioxNiArIGQKCX0KCXJldHVybiB2Cn0KCmZ1bmMgcmdiVG9IZXgociwgZywgYiBpbnQpIHN0cmluZyB7CglyZXR1cm4gIiMiICsgaGV4RGlnaXQyKHIpICsgaGV4RGlnaXQyKGcpICsgaGV4RGlnaXQyKGIpCn0KCmZ1bmMgaGV4RGlnaXQyKHYgaW50KSBzdHJpbmcgewoJaWYgdiA8IDAgewoJCXYgPSAwCgl9CglpZiB2ID4gMjU1IHsKCQl2ID0gMjU1Cgl9Cgljb25zdCBkaWdpdHMgPSAiMDEyMzQ1Njc4OWFiY2RlZiIKCXJldHVybiBzdHJpbmcoZGlnaXRzW3YvMTZdKSArIHN0cmluZyhkaWdpdHNbdiUxNl0pCn0KCmZ1bmMgY2xhbXBCeXRlKHYgZmxvYXQ2NCkgaW50IHsKCWl2IDo9IGludCh2KQoJaWYgaXYgPCAwIHsKCQlyZXR1cm4gMAoJfQoJaWYgaXYgPiAyNTUgewoJCXJldHVybiAyNTUKCX0KCXJldHVybiBpdgp9CgovLyBsaWdodGVuIGJsZW5kcyBoZXggdG93YXJkIHdoaXRlIGJ5IGFtdCAoMC0xKSDigJQgdXNlZCBzbyBhIG5lb24gZ2xvdydzCi8vIGNvcmUgcmVhZHMgYXMgZ2VudWluZWx5IGJyaWdodGVyIHRoYW4gaXRzIG93biBiYXNlIGNvbG9yLCBub3QganVzdCBhCi8vIGhpZ2hlci1vcGFjaXR5IHZlcnNpb24gb2YgdGhlIHNhbWUgdG9uZS4KZnVuYyBsaWdodGVuKGhleCBzdHJpbmcsIGFtdCBmbG9hdDY0KSBzdHJpbmcgewoJciwgZywgYiA6PSBoZXhUb1JHQihoZXgpCgluciA6PSBjbGFtcEJ5dGUoZmxvYXQ2NChyKSArICgyNTUtZmxvYXQ2NChyKSkqYW10KQoJbmcgOj0gY2xhbXBCeXRlKGZsb2F0NjQoZykgKyAoMjU1LWZsb2F0NjQoZykpKmFtdCkKCW5iIDo9IGNsYW1wQnl0ZShmbG9hdDY0KGIpICsgKDI1NS1mbG9hdDY0KGIpKSphbXQpCglyZXR1cm4gcmdiVG9IZXgobnIsIG5nLCBuYikKfQoKLy8gbWl4SGV4IGJsZW5kcyBoZXggdG93YXJkIHRhcmdldCBieSBhbXQgKDAtMSkg4oCUIHVzZWQgdG8gc29mdGVuIGEgaGFyZAovLyB0d28tY29sb3IgZ3JhZGllbnQgc3RvcCBpbnRvIGFuIGluLWJldHdlZW4gdG9uZSwgZS5nLiB0aGUgbGFiZWwgYmFyJ3MKLy8gbXV0ZWQgZWNobyBvZiB0aGUgcmluZydzIG93biBtdWx0aS1iYW5kIGhpZ2hsaWdodC9zaGFkb3cgc3dpbmcuCmZ1bmMgbWl4SGV4KGhleCwgdGFyZ2V0IHN0cmluZywgYW10IGZsb2F0NjQpIHN0cmluZyB7CglyMSwgZzEsIGIxIDo9IGhleFRvUkdCKGhleCkKCXIyLCBnMiwgYjIgOj0gaGV4VG9SR0IodGFyZ2V0KQoJbnIgOj0gY2xhbXBCeXRlKGZsb2F0NjQocjEpICsgZmxvYXQ2NChyMi1yMSkqYW10KQoJbmcgOj0gY2xhbXBCeXRlKGZsb2F0NjQoZzEpICsgZmxvYXQ2NChnMi1nMSkqYW10KQoJbmIgOj0gY2xhbXBCeXRlKGZsb2F0NjQoYjEpICsgZmxvYXQ2NChiMi1iMSkqYW10KQoJcmV0dXJuIHJnYlRvSGV4KG5yLCBuZywgbmIpCn0KCi8vIGh1ZVJvdGF0ZSB0dXJucyBoZXgncyBodWUgYnkgZGVnIGRlZ3JlZXMgLS0gdGhlIGV4YWN0IG1hdHJpeCBTVkcncwovLyBmZUNvbG9yTWF0cml4IHR5cGU9Imh1ZVJvdGF0ZSIgYXBwbGllcywgZG9uZSBoZXJlIG9uY2UgYXQgcmVuZGVyIHNvCi8vIG5vIGxpdmUgZmlsdGVyIGlzIGV2ZXIgbmVlZGVkLiBVc2VkIGZvciBjb2xvdXIgem9uaW5nOiBhIHJlYWwgY3J5c3RhbAovLyBpcyBub3Qgb25lIGh1ZSwgaXQgZHJpZnRzIGEgZmV3IGRlZ3JlZXMgZnJvbSBmYWNldCB0byBmYWNldC4KZnVuYyBodWVSb3RhdGUoaGV4IHN0cmluZywgZGVnIGZsb2F0NjQpIHN0cmluZyB7CgljLCBzbiA6PSBtYXRoLkNvcyhkZWcqbWF0aC5QaS8xODApLCBtYXRoLlNpbihkZWcqbWF0aC5QaS8xODApCglyLCBnLCBiIDo9IGhleFRvUkdCKGhleCkKCWZyLCBmZywgZmIgOj0gZmxvYXQ2NChyKSwgZmxvYXQ2NChnKSwgZmxvYXQ2NChiKQoJbnIgOj0gKDAuMjEzK2MqMC43ODctc24qMC4yMTMpKmZyICsgKDAuNzE1LWMqMC43MTUtc24qMC43MTUpKmZnICsgKDAuMDcyLWMqMC4wNzIrc24qMC45MjgpKmZiCgluZyA6PSAoMC4yMTMtYyowLjIxMytzbiowLjE0MykqZnIgKyAoMC43MTUrYyowLjI4NStzbiowLjE0MCkqZmcgKyAoMC4wNzItYyowLjA3Mi1zbiowLjI4MykqZmIKCW5iIDo9ICgwLjIxMy1jKjAuMjEzLXNuKjAuNzg3KSpmciArICgwLjcxNS1jKjAuNzE1K3NuKjAuNzE1KSpmZyArICgwLjA3MitjKjAuOTI4K3NuKjAuMDcyKSpmYgoJcmV0dXJuIHJnYlRvSGV4KGNsYW1wQnl0ZShuciksIGNsYW1wQnl0ZShuZyksIGNsYW1wQnl0ZShuYikpCn0KCi8vIHNoYWRlU2VyaWVzIHJldHVybnMgbiBzaGFkZXMgb2YgaGV4IHNjYWxlZCBiZXR3ZWVuIGxvIGFuZCBoaSBicmlnaHRuZXNzCi8vIOKAlCB0aGUgcGFsZXR0ZSBhIGZhY2V0ZWQgZ2VtJ3MgaW5kaXZpZHVhbCBmYWNldHMgcGljayBmcm9tIHNvIGFkamFjZW50Ci8vIHRyaWFuZ2xlcy9xdWFkcyByZWFkIGFzIGNhdGNoaW5nIGxpZ2h0IGRpZmZlcmVudGx5LgpmdW5jIHNoYWRlU2VyaWVzKGhleCBzdHJpbmcsIG4gaW50LCBsbywgaGkgZmxvYXQ2NCkgW11zdHJpbmcgewoJciwgZywgYiA6PSBoZXhUb1JHQihoZXgpCglvdXQgOj0gbWFrZShbXXN0cmluZywgbikKCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCXQgOj0gbG8KCQlpZiBuID4gMSB7CgkJCXQgPSBsbyArIChoaS1sbykqZmxvYXQ2NChpKS9mbG9hdDY0KG4tMSkKCQl9CgkJb3V0W2ldID0gcmdiVG9IZXgoY2xhbXBCeXRlKGZsb2F0NjQocikqdCksIGNsYW1wQnl0ZShmbG9hdDY0KGcpKnQpLCBjbGFtcEJ5dGUoZmxvYXQ2NChiKSp0KSkKCX0KCXJldHVybiBvdXQKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRpbnkgZGV0ZXJtaW5pc3RpYyBQUk5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLy8gcHJuZyBpcyBhIHNtYWxsIGRldGVybWluaXN0aWMgZ2VuZXJhdG9yIHNlZWRlZCBmcm9tIGEgc3RyaW5nLCB1c2VkIG9ubHkKLy8gZm9yIHBlci1waWVjZSBDT1NNRVRJQyBhbmltYXRpb24gdGltaW5nIChnbG93IHBoYXNlL2R1cmF0aW9uLCBtb3Rpb24KLy8gcGhhc2VzL3JvdGF0aW9uIGRlZ3JlZSkg4oCUIG5ldmVyIGZvciB3aGljaCB0cmFpdCBjb21iaW5hdGlvbiBhIHBpZWNlCi8vIGhhcyAodGhhdCdzIHRyYWl0UHJlc2V0LCByYW5kb21seSBhc3NlbWJsZWQgYnkgbmZ0bWludGVyLmdubydzIG93bgovLyBzZXBhcmF0ZSBQUk5HIGluIHJhbmRvbVRyYWl0UHJlc2V0LCBub3QgY3VyYXRlZCBhbmQgbm90IHRoaXMgb25lKS4KLy8gRGV0ZXJtaW5pc20gaGVyZSBkb2Vzbid0IHdlYWtlbiB0aGUgYW50aS1zbmlwaW5nIGRlc2lnbiBhdCBhbGw6IGtub3dpbmcKLy8gaW4gYWR2YW5jZSB0aGF0IGEgZ2xvdyBwdWxzZXMgYXQgMi4xcyBpbnN0ZWFkIG9mIDEuOXMgaXNuJ3QgYSB0cmFpdAovLyBhbnlvbmUgd291bGQgc25pcGUgZm9yLgp0eXBlIHBybmcgc3RydWN0IHsKCXNlZWQgc3RyaW5nCgluICAgIGludAp9CgpmdW5jIG5ld1BSTkcoc2VlZCBzdHJpbmcpICpwcm5nIHsgcmV0dXJuICZwcm5ne3NlZWQ6IHNlZWR9IH0KCmZ1bmMgKHAgKnBybmcpIG5leHQoKSB1aW50NjQgewoJcC5uKysKCW1hdGVyaWFsIDo9IHAuc2VlZCArICI6IiArIGl0b2EoaW50NjQocC5uKSkgLy8gc2FtZSBieXRlcyBhcyAiJXM6JWQiCglzdW0gOj0gc2hhMjU2LlN1bTI1NihbXWJ5dGUobWF0ZXJpYWwpKQoJdmFyIHYgdWludDY0Cglmb3IgaSA6PSAwOyBpIDwgODsgaSsrIHsKCQl2ID0gdjw8OCB8IHVpbnQ2NChzdW1baV0pCgl9CglyZXR1cm4gdgp9CgpmdW5jIChwICpwcm5nKSBmbG9hdEluKGxvLCBoaSBmbG9hdDY0KSBmbG9hdDY0IHsKCWZyYWMgOj0gZmxvYXQ2NChwLm5leHQoKSUxMDAwMDAwKSAvIDEwMDAwMDAuMAoJcmV0dXJuIGxvICsgZnJhYyooaGktbG8pCn0KCmZ1bmMgKHAgKnBybmcpIGludG4obiBpbnQpIGludCB7CglpZiBuIDw9IDEgewoJCXJldHVybiAwCgl9CglyZXR1cm4gaW50KHAubmV4dCgpICUgdWludDY0KG4pKQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGF0aCBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKdHlwZSBwdCBzdHJ1Y3R7IHgsIHkgZmxvYXQ2NCB9CgpmdW5jIHBvbHlQYXRoKHB0cyBbXXB0KSBzdHJpbmcgewoJcyA6PSAiTSIKCWZvciBpLCBwIDo9IHJhbmdlIHB0cyB7CgkJaWYgaSA+IDAgewoJCQlzICs9ICIgTCIKCQl9CgkJcyArPSBmbnVtKHAueCkgKyAiLCIgKyBmbnVtKHAueSkKCX0KCXJldHVybiBzICsgIiBaIgp9CgpmdW5jIHBvbHlnb25Qb2ludHMocHRzIFtdcHQpIHN0cmluZyB7CglzIDo9ICIiCglmb3IgaSwgcCA6PSByYW5nZSBwdHMgewoJCWlmIGkgPiAwIHsKCQkJcyArPSAiICIKCQl9CgkJcyArPSBmbnVtKHAueCkgKyAiLCIgKyBmbnVtKHAueSkKCX0KCXJldHVybiBzCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZW0gc2hhcGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovLyBTdG9uZXMgYXJlIHJlYWwgM0QgY3V0cywgbm90IGZsYXQgZGlhZ3JhbXMuIEVhY2ggY3V0IGlzIGEgc21hbGwgc29saWQKLy8gKHRhYmxlLCBjcm93biBicmVhaywgZ2lyZGxlLCBwYXZpbGlvbiwgY3VsZXQpIGJ1aWx0IGZyb20gcmluZ3Mgb2YKLy8gdmVydGljZXMgb24gdGhlIGN1dCdzIG93biBvdXRsaW5lLCB0aWx0ZWQgdG93YXJkIHRoZSB2aWV3ZXIgYW5kCi8vIHByb2plY3RlZC4gRXZlcnkgZmFjZXQgaXMgc2hhZGVkIGZyb20gaXRzIGFjdHVhbCBzdXJmYWNlIG5vcm1hbCB1bmRlcgovLyBvbmUgbGlnaHQsIHRoZSBwYXZpbGlvbidzIGJhY2sgZmFjZXRzIGFyZSBkcmF3biBmaXJzdCBhbmQgc2hvdyB0aHJvdWdoCi8vIHRoZSBmcm9udCBvbmVzLCBhbmQgdGhlIHRhYmxlIGlzIGEgd2luZG93IG9udG8gdGhlbSAtLSB3aGljaCBpcyB3aGF0Ci8vIGZpbmFsbHkgbWFrZXMgdGhlIHN0b25lIHJlYWQgYXMgdHJhbnNwYXJlbnQ6IHRoZXJlIGlzIG5vdyBzb21ldGhpbmcKLy8gYmVoaW5kIGl0IHRvIHNlZS4gRXZlcnl0aGluZyBpcyBzdGlsbCBmbGF0IHNvbGlkIGZpbGxzIChvbmUgYm9keS1nbG93Ci8vIGdyYWRpZW50IHBlciBzdG9uZSk6IHRoZSByZWFsaXNtIGNvbWVzIGZyb20gZ2VvbWV0cnkgYW5kIG5vcm1hbHMsIG5vdAovLyBmcm9tIHBhaW50IGVmZmVjdHMsIHNvIFNhZmFyaSBwYXlzIG5vdGhpbmcgZXh0cmEgZm9yIGl0LgovLwovLyBCeXRlcyBhcmUgYnVkZ2V0ZWQsIHRoaXMgcnVucyBvbiBldmVyeSB0b2tlbiByZWFkOiByZWxhdGl2ZSBwYXRoCi8vIGNvb3JkaW5hdGVzIGF0IG9uZSBkZWNpbWFsLCAzLWRpZ2l0IGhleCBjb2xvdXJzIChhIGZhY2V0IGlzIG9uZSBmbGF0Ci8vIHRvbmUsIDEyIGJpdHMgaXMgcGxlbnR5KSwgc2hhcmVkIGF0dHJpYnV0ZXMgaG9pc3RlZCBvbnRvIGdyb3VwcywgdGhlCi8vIGdpcmRsZSBhcyBPTkUgc3Ryb2tlLCBoaWRkZW4gY3Jvd24gYmFjay1mYWNlcyBuZXZlciBlbWl0dGVkLCBhbmQgdGhlCi8vIGZpcmUgY2FwcGVkIGF0IH4xNCBvdmVybGF5cyBwZXIgc3RvbmUgaG93ZXZlciBtYW55IGZhY2V0cyBhIGN1dCBoYXMuCgp0eXBlIGdzdG9wIHN0cnVjdCB7CglwY3QgICBmbG9hdDY0Cgljb2xvciBzdHJpbmcKCW9wICAgIGZsb2F0NjQKfQoKLy8gZ3JhbXAgaXMgYSBsaW5lYXIgY29sb3VyIHJhbXAgaW4gYWJzb2x1dGUgY29vcmRpbmF0ZXMsIHNhbXBsZWQgYnkKLy8gcHJvamVjdGlvbiAtLSB1c2VkIGZvciB0aGUgc3BlY3RyYWwgZmlyZSBzbyBlYWNoIGZhY2V0IGZsYXNoZXMgdGhlCi8vIGJhbmQgb2YgdGhlIHNwZWN0cnVtIGl0IHNpdHMgaW4uCnR5cGUgZ3JhbXAgc3RydWN0IHsKCXgxLCB5MSwgeDIsIHkyIGZsb2F0NjQKCXN0b3BzICAgICAgICAgIFtdZ3N0b3AKfQoKZnVuYyAoZyBncmFtcCkgc2FtcGxlKHB4LCBweSBmbG9hdDY0KSAoc3RyaW5nLCBmbG9hdDY0KSB7CglkeCwgZHkgOj0gZy54Mi1nLngxLCBnLnkyLWcueTEKCXQgOj0gKChweC1nLngxKSpkeCArIChweS1nLnkxKSpkeSkgLyAoZHgqZHggKyBkeSpkeSkgKiAxMDAKCWlmIHQgPCAwIHsKCQl0ID0gMAoJfQoJaWYgdCA+IDEwMCB7CgkJdCA9IDEwMAoJfQoJZm9yIGkgOj0gMTsgaSA8IGxlbihnLnN0b3BzKTsgaSsrIHsKCQlpZiB0IDw9IGcuc3RvcHNbaV0ucGN0IHsKCQkJYSwgYiA6PSBnLnN0b3BzW2ktMV0sIGcuc3RvcHNbaV0KCQkJZiA6PSAodCAtIGEucGN0KSAvIChiLnBjdCAtIGEucGN0KQoJCQlyZXR1cm4gbWl4SGV4KGEuY29sb3IsIGIuY29sb3IsIGYpLCBhLm9wICsgKGIub3AtYS5vcCkqZgoJCX0KCX0KCWxhc3QgOj0gZy5zdG9wc1tsZW4oZy5zdG9wcyktMV0KCXJldHVybiBsYXN0LmNvbG9yLCBsYXN0Lm9wCn0KCmZ1bmMgY2VudHJvaWQocG9seSBbXXB0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJY3gsIGN5IDo9IDAuMCwgMC4wCglmb3IgXywgcCA6PSByYW5nZSBwb2x5IHsKCQljeCArPSBwLngKCQljeSArPSBwLnkKCX0KCXJldHVybiBjeCAvIGZsb2F0NjQobGVuKHBvbHkpKSwgY3kgLyBmbG9hdDY0KGxlbihwb2x5KSkKfQoKLy8gZmFjZXRTdHlsZSBpcyB3aGF0IHRoZSBmaXJlIG5lZWRzIGZyb20gdGhlIHN0b25lOiBlYWNoIGxpdC1jYXBhYmxlCi8vIGZhY2V0J3MgMkQgY2VudHJvaWQgaW4gZHJhdyBvcmRlciwgdGhlIHNwZWN0cmFsIHJhbXAsIGFuZCB0aGUgc3RvbmUncwovLyBvcHRpY2FsIHByb2ZpbGUuCnR5cGUgZmFjZXRTdHlsZSBzdHJ1Y3QgewoJZmxhc2ggICAgZ3JhbXAKCXJpbmdDZW50IFtdcHQKCXByb2YgICAgIGZpcmVQcm9maWxlCgl6b25lICAgICAqcHJuZyAvLyBwZXItZmFjZXQgaHVlIGRyaWZ0IGFuZCBzaGFkZSBqaXR0ZXIsIHNlZWRlZCBwZXIgdG9rZW4KCXN0b25lICAgIHN0cmluZyAvLyB3aGljaCBjcnlzdGFsIGhhYml0IGEgUmF3IENyeXN0YWwgdGFrZXMKCS8vIHRodW1iOiBhIGxpc3QgdGh1bWJuYWlsIC0tIHNraXBzIHdoYXQgZG9lcyBub3QgcmVhZCBhdCB0aHVtYm5haWwKCS8vIHNpemUgKGZpcmUgZmxhc2hlcywgcm9jayByZWxpZ2h0aW5nLCB0YWJsZSByZWZsZWN0aW9ucykgdG8gY3V0CgkvLyByZW5kZXIgZ2FzLiBUaGUgc3RvbmUsIGl0cyBmYWNldHMgYW5kIGNvbG91cnMgYXJlIGlkZW50aWNhbC4KCXRodW1iIGJvb2wKCS8vIGdsaW50czogc3RhciBzcGFya2xlcyBhcHBseUNhc2NhZGUgYnVpbGRzLCBkcmF3biBhYm92ZSBldmVyeXRoaW5nCgkvLyBlbHNlIG9uIHRoZSBzdG9uZSAoYWZ0ZXIgdGhlIHRhYmxlIHJlZmxlY3Rpb25zKSBzbyBub3RoaW5nIGRpbXMgdGhlbS4KCWdsaW50cyBzdHJpbmcKfQoKLy8gZmlyZVByb2ZpbGUgaXMgaG93IGEgc3RvbmUncyBvcHRpY3MgZGlmZmVyIGJ5IHdoYXQgaXQgaXMuIERpc3BlcnNpb24KLy8gaXMgYSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWw6IGNvbG91cmxlc3Mgc3RvbmVzIHRocm93IHN0cm9uZwovLyBzcGVjdHJhbCBmaXJlLCBzYXBwaGlyZSBtdWNoIGxlc3MsIHRvcGF6IGxlc3Mgc3RpbGwuIHNoYWRvdyBpcyB3aGF0IGEKLy8gZmFjZXQgZGFya2VucyB0b3dhcmQ7IGJvZHlNaXgvbmV1dHJhbCByZWJ1aWxkIHRoZSB3b3JraW5nIGJhc2UgZm9yCi8vIHN0b25lcyB3aG9zZSBwYWxldHRlIGhleCBpcyBuZWFyLXdoaXRlIChzZWUgZmlyZVByb2ZpbGVGb3IpLgp0eXBlIGZpcmVQcm9maWxlIHN0cnVjdCB7CglzYXQsIGhpdCAgZmxvYXQ2NAoJcGlucG9pbnRzIGludAoJc2hhZG93ICAgIHN0cmluZwoJYm9keU1peCAgIGZsb2F0NjQKCW5ldXRyYWwgICBzdHJpbmcKfQoKZnVuYyBmaXJlUHJvZmlsZUZvcihzdG9uZSwgY29sb3JOYW1lIHN0cmluZykgZmlyZVByb2ZpbGUgewoJaWYgc3RvbmUgPT0gIkRpYW1vbmQiIHsKCQkvLyBkaXNwZXJzaW9uIDAuMDQ0LCB0aGUgaGlnaGVzdCBvZiBhbnkgc3RvbmUgaGVyZTogZXZlcnkgY29sb3VyCgkJLy8gdGhyb3dzIHN0cm9uZyBzcGVjdHJhbCBmaXJlLCB0aGUgY29sb3VybGVzcyBvbmUgbW9zdCBvZiBhbGwuCgkJLy8gQmxhY2sgZGlhbW9uZCBpcyBvcGFxdWU6IHNoaW5lIG9ubHksIGFsbW9zdCBubyBmaXJlLgoJCXN3aXRjaCBjb2xvck5hbWUgewoJCWNhc2UgIkNvbG9ybGVzcyI6CgkJCS8vIGEgbGlnaHQgYm9keSBtaXg6IGEgZGlhbW9uZCBpcyBhIGNvbnRyYXN0IG9mIG5lYXItd2hpdGUKCQkJLy8gYW5kIG5lYXItYmxhY2sgZmFjZXRzLCBub3QgYSBtaWQtZ3JleSAoMC41IHJlYWQgYXMgc2xhdGUpCgkJCXJldHVybiBmaXJlUHJvZmlsZXsxLjAsIDAuODUsIDUsICIjMGQxMjIyIiwgMC4xMiwgIiNmNGY3ZmMifQoJCWNhc2UgIkJsYWNrIjoKCQkJcmV0dXJuIGZpcmVQcm9maWxlezAuMTUsIDAuMzUsIDEsICIjMDAwMDAwIiwgMCwgIiJ9CgkJfQoJCXJldHVybiBmaXJlUHJvZmlsZXswLjk1LCAwLjcsIDQsICIjMGIwZDE4IiwgMCwgIiJ9Cgl9CglpZiBzdG9uZSA9PSAiUXVhcnR6IiB7CgkJLy8gZGlzcGVyc2lvbiAwLjAxMywgdGhlIGxvd2VzdCBoZXJlOiBmYWludCBmaXJlLCBtb3N0bHkgZ2xhc3N5IHNoaW5lCgkJaWYgY29sb3JOYW1lID09ICJSb2NrIENyeXN0YWwiIHsKCQkJcmV0dXJuIGZpcmVQcm9maWxlezAuNCwgMC42LCAzLCAiIzE0MWEyYyIsIDAuMjUsICIjZThlZGY0In0KCQl9CgkJcmV0dXJuIGZpcmVQcm9maWxlezAuMzUsIDAuNSwgMywgIiMwMDAwMDAiLCAwLCAiIn0KCX0KCWlmIGNvbG9yTmFtZSA9PSAiQ29sb3JsZXNzIiB7CgkJcmV0dXJuIGZpcmVQcm9maWxlezEuMCwgMC43LCA0LCAiIzE0MWEyYyIsIDAuNTUsICIjZGZlNGVlIn0KCX0KCWlmIGNvbG9yTmFtZSA9PSAiV2hpdGUiIHsKCQlyZXR1cm4gZmlyZVByb2ZpbGV7MC44NSwgMC42LCAzLCAiIzdkODZhMCIsIDAsICIifQoJfQoJaWYgY29sb3JOYW1lID09ICJDcnlzdGFsIiB7CgkJcmV0dXJuIGZpcmVQcm9maWxlezEuMCwgMC43OCwgNCwgIiMxNDFhMmMiLCAwLjMsICIjZTRlOWYyIn0KCX0KCWlmIHN0b25lID09ICJUb3BheiIgewoJCXJldHVybiBmaXJlUHJvZmlsZXswLjUsIDAuNSwgMywgIiMwMDAwMDAiLCAwLCAiIn0KCX0KCXJldHVybiBmaXJlUHJvZmlsZXswLjcsIDAuNSwgMywgIiMwMDAwMDAiLCAwLCAiIn0KfQoKY29uc3QgZmlyZVpvbmVEZWcgPSA3LjAKCi8vIHJnYkkgaXMgYSBjb2xvdXIgYXMgdGhyZWUgMC0yNTUgaW50cy4gVGhlIGZhY2V0IHNoYWRpbmcgd29ya3Mgb24gdGhlc2UKLy8gaW5zdGVhZCBvZiAiI3JyZ2diYiIgc3RyaW5nczogcGFyc2luZyBhbmQgcmUtZm9ybWF0dGluZyBhIGhleCBzdHJpbmcgYXQKLy8gZXZlcnkgbWl4IHdhcyBhIGxhcmdlIHNoYXJlIG9mIGEgcmVuZGVyJ3MgZ2FzLiBFYWNoIG9wIHJvdW5kcyBleGFjdGx5Ci8vIGFzIGl0cyBoZXgtc3RyaW5nIHR3aW4gZG9lcyAoY2xhbXBCeXRlIHBlciBjaGFubmVsKSwgc28gdGhlIG91dHB1dCBpcwovLyBieXRlLWlkZW50aWNhbC4KdHlwZSByZ2JJIHN0cnVjdHsgciwgZywgYiBpbnQgfQoKZnVuYyB0b1JHQkkoaGV4IHN0cmluZykgcmdiSSB7IHIsIGcsIGIgOj0gaGV4VG9SR0IoaGV4KTsgcmV0dXJuIHJnYkl7ciwgZywgYn0gfQoKZnVuYyAoYyByZ2JJKSBoZXgoKSBzdHJpbmcgeyByZXR1cm4gcmdiVG9IZXgoYy5yLCBjLmcsIGMuYikgfQoKZnVuYyBtaXhJKGEsIGIgcmdiSSwgYW10IGZsb2F0NjQpIHJnYkkgewoJcmV0dXJuIHJnYkl7CgkJY2xhbXBCeXRlKGZsb2F0NjQoYS5yKSArIGZsb2F0NjQoYi5yLWEucikqYW10KSwKCQljbGFtcEJ5dGUoZmxvYXQ2NChhLmcpICsgZmxvYXQ2NChiLmctYS5nKSphbXQpLAoJCWNsYW1wQnl0ZShmbG9hdDY0KGEuYikgKyBmbG9hdDY0KGIuYi1hLmIpKmFtdCksCgl9Cn0KCmZ1bmMgaHVlUm90YXRlSSh4IHJnYkksIGRlZyBmbG9hdDY0KSByZ2JJIHsKCWMsIHNuIDo9IG1hdGguQ29zKGRlZyptYXRoLlBpLzE4MCksIG1hdGguU2luKGRlZyptYXRoLlBpLzE4MCkKCWZyLCBmZywgZmIgOj0gZmxvYXQ2NCh4LnIpLCBmbG9hdDY0KHguZyksIGZsb2F0NjQoeC5iKQoJbnIgOj0gKDAuMjEzK2MqMC43ODctc24qMC4yMTMpKmZyICsgKDAuNzE1LWMqMC43MTUtc24qMC43MTUpKmZnICsgKDAuMDcyLWMqMC4wNzIrc24qMC45MjgpKmZiCgluZyA6PSAoMC4yMTMtYyowLjIxMytzbiowLjE0MykqZnIgKyAoMC43MTUrYyowLjI4NStzbiowLjE0MCkqZmcgKyAoMC4wNzItYyowLjA3Mi1zbiowLjI4MykqZmIKCW5iIDo9ICgwLjIxMy1jKjAuMjEzLXNuKjAuNzg3KSpmciArICgwLjcxNS1jKjAuNzE1K3NuKjAuNzE1KSpmZyArICgwLjA3MitjKjAuOTI4K3NuKjAuMDcyKSpmYgoJcmV0dXJuIHJnYkl7Y2xhbXBCeXRlKG5yKSwgY2xhbXBCeXRlKG5nKSwgY2xhbXBCeXRlKG5iKX0KfQoKZnVuYyBoZXgzSSh4IHJnYkkpIHN0cmluZyB7CglkIDo9ICIwMTIzNDU2Nzg5YWJjZGVmIgoJcSA6PSBmdW5jKHYgaW50KSBieXRlIHsgcmV0dXJuIGRbKHYrOCkqMTUvMjU1JTE2XSB9CglyZXR1cm4gIiMiICsgc3RyaW5nKFtdYnl0ZXtxKHguciksIHEoeC5nKSwgcSh4LmIpfSkKfQoKdmFyIHdoaXRlSSA9IHJnYkl7MjU1LCAyNTUsIDI1NX0KCmZ1bmMgZGFya2VuKGhleCwgc2hhZG93IHN0cmluZywgYW10IGZsb2F0NjQpIHN0cmluZyB7CglpZiBhbXQgPiAwLjk1IHsKCQlhbXQgPSAwLjk1Cgl9CglyZXR1cm4gbWl4SGV4KGhleCwgc2hhZG93LCBhbXQpCn0KCmNvbnN0IHByaXNtRmxhc2ggPSB0cnVlCgpmdW5jIGZsYXNoUmFtcChleHQsIHNhdCBmbG9hdDY0KSBncmFtcCB7CglyIDo9IGdyYW1we3gxOiBzdWJqWCAtIGV4dCwgeTE6IHN1YmpZIC0gZXh0LCB4Mjogc3VialggKyBleHQsIHkyOiBzdWJqWSArIGV4dH0KCWlmICFwcmlzbUZsYXNoIHsKCQlyLnN0b3BzID0gW11nc3RvcHt7MCwgIiNmZmZmZmYiLCAxfSwgezEwMCwgIiNmZmZmZmYiLCAwLjI1fX0KCQlyZXR1cm4gcgoJfQoJci5zdG9wcyA9IFtdZ3N0b3B7CgkJezAsICIjZmZmZmZmIiwgMX0sIHsxNCwgIiNmZjQwNDAiLCAwLjk1fSwgezI4LCAiI2ZmOWExZiIsIDAuOTV9LCB7NDIsICIjZmZlODFmIiwgMC45fSwKCQl7NTYsICIjMzVmZjdhIiwgMC44NX0sIHs3MCwgIiMyMmNjZmYiLCAwLjh9LCB7ODQsICIjNTU2NmZmIiwgMC43NX0sIHsxMDAsICIjYzA0ZGZmIiwgMC43fSwKCX0KCWZvciBpIDo9IHJhbmdlIHIuc3RvcHMgewoJCXIuc3RvcHNbaV0uY29sb3IgPSBtaXhIZXgoci5zdG9wc1tpXS5jb2xvciwgIiNmZmZmZmYiLCAxLXNhdCkKCX0KCXJldHVybiByCn0KCi8qIC0tLS0gdGlueSB2ZWN0b3IgbWF0aHMgLS0tLSAqLwoKdHlwZSB2MyBzdHJ1Y3R7IHgsIHksIHogZmxvYXQ2NCB9CgpmdW5jIHZzdWIoYSwgYiB2MykgdjMgICAgICAgeyByZXR1cm4gdjN7YS54IC0gYi54LCBhLnkgLSBiLnksIGEueiAtIGIuen0gfQpmdW5jIHZkb3QoYSwgYiB2MykgZmxvYXQ2NCAgeyByZXR1cm4gYS54KmIueCArIGEueSpiLnkgKyBhLnoqYi56IH0KZnVuYyB2Y3Jvc3MoYSwgYiB2MykgdjMgICAgIHsgcmV0dXJuIHYze2EueSpiLnogLSBhLnoqYi55LCBhLnoqYi54IC0gYS54KmIueiwgYS54KmIueSAtIGEueSpiLnh9IH0KZnVuYyB2c2NhbGUoYSB2MywgayBmbG9hdDY0KSB2MyB7IHJldHVybiB2M3thLnggKiBrLCBhLnkgKiBrLCBhLnogKiBrfSB9CmZ1bmMgdm5vcm0oYSB2MykgdjMgewoJbCA6PSBtYXRoLlNxcnQodmRvdChhLCBhKSkKCWlmIGwgPT0gMCB7CgkJcmV0dXJuIGEKCX0KCXJldHVybiB2M3thLnggLyBsLCBhLnkgLyBsLCBhLnogLyBsfQp9CgpmdW5jIHNnblBvdyh2LCBlIGZsb2F0NjQpIGZsb2F0NjQgewoJaWYgdiA8IDAgewoJCXJldHVybiAtbWF0aC5Qb3coLXYsIGUpCgl9CglyZXR1cm4gbWF0aC5Qb3codiwgZSkKfQoKLyogLS0tLSBvdXRsaW5lczogYSBjbG9zZWQgY3VydmUgdCBpbiBbMCwxKSAtPiAoeCwgeSkgaW4gWy0xLDFdIC0tLS0gKi8KCnR5cGUgb3V0bGluZUZuIGZ1bmModCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkKCmZ1bmMgY2lyY2xlT3V0bGluZSh0IGZsb2F0NjQpIChmbG9hdDY0LCBmbG9hdDY0KSB7CglhIDo9IDIgKiBtYXRoLlBpICogdAoJcmV0dXJuIG1hdGguQ29zKGEpLCBtYXRoLlNpbihhKQp9CgovLyBzdXBlck91dGxpbmUgaXMgYSBzdXBlcmVsbGlwc2U6IHA9MiBpcyBhbiBlbGxpcHNlLCBoaWdoZXIgcCBzcXVhcmVzCi8vIHRoZSBzaG91bGRlcnMgLS0gYSBjdXNoaW9uLgpmdW5jIHN1cGVyT3V0bGluZShwIGZsb2F0NjQpIG91dGxpbmVGbiB7CglyZXR1cm4gZnVuYyh0IGZsb2F0NjQpIChmbG9hdDY0LCBmbG9hdDY0KSB7CgkJYSA6PSAyICogbWF0aC5QaSAqIHQKCQlyZXR1cm4gc2duUG93KG1hdGguQ29zKGEpLCAyL3ApLCBzZ25Qb3cobWF0aC5TaW4oYSksIDIvcCkKCX0KfQoKLy8gcG9seU91dGxpbmUgd2Fsa3MgYSBwb2x5Z29uIGJ5IHZlcnRleCBpbmRleDogdD1rL2xlbiBsYW5kcyBleGFjdGx5IG9uCi8vIHZlcnRleCBrLCBzbyBzdGVwIGN1dHMga2VlcCB0aGVpciB0cnVlIGNvcm5lcnMgYXQgYW55IHJpbmcgc2l6ZS4KZnVuYyBwb2x5T3V0bGluZSh2cyBbXXB0KSBvdXRsaW5lRm4gewoJcmV0dXJuIGZ1bmModCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJCW4gOj0gbGVuKHZzKQoJCWYgOj0gdCAqIGZsb2F0NjQobikKCQlrIDo9IGludChtYXRoLkZsb29yKGYpKQoJCWZyIDo9IGYgLSBmbG9hdDY0KGspCgkJYSA6PSB2c1soKGslbikrbiklbl0KCQliIDo9IHZzWygoKGsrMSklbikrbiklbl0KCQlyZXR1cm4gYS54ICsgKGIueC1hLngpKmZyLCBhLnkgKyAoYi55LWEueSkqZnIKCX0KfQoKLy8gb2N0YWdvbiBpcyBhIHJlY3RhbmdsZSBodyB4IGhoIHdpdGggaXRzIGNvcm5lcnMgY3V0IGJ5IGMuCmZ1bmMgb2N0YWdvbihodywgaGgsIGMgZmxvYXQ2NCkgW11wdCB7CglyZXR1cm4gW11wdHsKCQl7aHcgLSBjLCBoaH0sIHstaHcgKyBjLCBoaH0sIHstaHcsIGhoIC0gY30sIHstaHcsIC1oaCArIGN9LAoJCXstaHcgKyBjLCAtaGh9LCB7aHcgLSBjLCAtaGh9LCB7aHcsIC1oaCArIGN9LCB7aHcsIGhoIC0gY30sCgl9Cn0KCmZ1bmMgcGVhck91dGxpbmUodCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJYSA6PSAyICogbWF0aC5QaSAqIHQKCWMgOj0gbWF0aC5Db3MoYSkKCXJldHVybiBjKjAuOTIgKyAwLjA4LCAwLjcgKiBtYXRoLlNpbihhKSAqICgxIC0gMC40NipjKQp9CgpmdW5jIG1hcnF1aXNlT3V0bGluZSh0IGZsb2F0NjQpIChmbG9hdDY0LCBmbG9hdDY0KSB7CglhIDo9IDIgKiBtYXRoLlBpICogdAoJcmV0dXJuIG1hdGguQ29zKGEpLCAwLjUyICogc2duUG93KG1hdGguU2luKGEpLCAxLjM1KQp9CgovLyBoZWFydE91dGxpbmUgaXMgYSBoZWFydCBDVVQsIG5vdCBhIHZhbGVudGluZTogZnVsbCByb3VuZGVkIGxvYmVzLCBhCi8vIHNoYWxsb3cgbm90Y2ggKH4xNCUgb2YgdGhlIGxlbmd0aDsgdGhlIHZhbGVudGluZSBjdXJ2ZSdzIDI0JSByZWFkIGFzIGEKLy8gZHJhd2luZyksIGdlbnRseSBjb252ZXggc2lkZXMgYW5kIGEgY2xlYW4gcG9pbnQsIGFzIGEgaGVhcnQtY3V0Ci8vIGRpYW1vbmQgaXMuIE5vdGNoIGF0IHQ9MCAoZmFyIHNpZGUsICt5KSwgcG9pbnQgYXQgdD0uNSAobmVhciBzaWRlKSwKLy8gbm9ybWFsaXNlZCB0byBbLTEsMV07IHRoZSBjdXQncyByeC9yeSBzZXQgaXRzIHdpZHRoLXRvLWxlbmd0aCByYXRpbwovLyAocmVhbCBoZWFydCBjdXRzIHJ1biAwLjktMS4xKS4KZnVuYyBoZWFydE91dGxpbmUodCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJYSA6PSAyICogbWF0aC5QaSAqIHQKCXNuIDo9IG1hdGguU2luKGEpCgl5IDo9ICgxMyptYXRoLkNvcyhhKSAtIDQqbWF0aC5Db3MoMiphKSAtIDEuNCptYXRoLkNvcygzKmEpIC0gMC41Km1hdGguQ29zKDQqYSkpIC8gMTcKCXJldHVybiAwLjg4KnNuKnNuKnNuICsgMC4xMipzbiwgKHkgKyAwLjE1NzYpIC8gMC43ODk0Cn0KCmZ1bmMgdHJpbGxpb25PdXRsaW5lKHQgZmxvYXQ2NCkgKGZsb2F0NjQsIGZsb2F0NjQpIHsKCXZzIDo9IFtdcHR7ezAsIDF9LCB7LTAuODY2LCAtMC41fSwgezAuODY2LCAtMC41fX0KCWYgOj0gdCAqIDMKCWsgOj0gaW50KG1hdGguRmxvb3IoZikpCglmciA6PSBmIC0gZmxvYXQ2NChrKQoJYSwgYiA6PSB2c1soKGslMykrMyklM10sIHZzWygoKGsrMSklMykrMyklM10KCWJ1bGdlIDo9IDEgKyAwLjE2Km1hdGguU2luKG1hdGguUGkqZnIpCglyZXR1cm4gKGEueCArIChiLngtYS54KSpmcikgKiBidWxnZSwgKGEueSArIChiLnktYS55KSpmcikgKiBidWxnZQp9CgovKiAtLS0tIHRoZSBjdXRzIC0tLS0gKi8KCi8vIGN1dFNwZWMgaXMgb25lIGN1dDogaXRzIG91dGxpbmUsIGhvdyBtYW55IHRhYmxlIHZlcnRpY2VzIGl0IGhhcywgYW5kCi8vIHdoZXRoZXIgaXQgaXMgYSBicmlsbGlhbnQgKHRyaWFuZ3VsYXIva2l0ZSBmYWNldHMgcmFkaWF0aW5nIGZyb20gdGhlCi8vIHRhYmxlLCBnaXJkbGUgYXQgdHdpY2UgdGhlIHRhYmxlJ3MgdmVydGV4IGNvdW50KSBvciBhIHN0ZXAgY3V0Ci8vIChjb25jZW50cmljIHJvd3Mgb2YgbG9uZyByZWN0YW5ndWxhciBmYWNldHMpLgp0eXBlIGN1dFNwZWMgc3RydWN0IHsKCW4gICAgICAgICBpbnQKCWJyaWxsaWFudCBib29sCglvdXRsaW5lICAgb3V0bGluZUZuCglyeCwgcnkgICAgZmxvYXQ2NAp9CgovLyBTaGFwZU5hbWVzIGlzIHRoZSBmYWNldGVkLWN1dCB2b2NhYnVsYXJ5LCBpbiBpbmRleCBvcmRlci4gSGVhcnQsIFJvc2UKLy8gQ3V0IGFuZCBSYXcgQ3J5c3RhbCB3ZXJlIGRyb3BwZWQgZnJvbSB0aGUgZmlyc3QgM0QgcGFzcyBhbmQgYXJlIGJhY2sKLy8gKGFwcGVuZGVkLCBzbyB0aGUgZmlyc3QgdGVuIGtlZXAgdGhlaXIgaW5kZXhlcyksIGVhY2ggb25seSBvbiB0aGUKLy8gc3RvbmVzIHRoYXQgYXJlIHJlYWxseSBzb2xkIHRoYXQgd2F5IC0tIHNlZSBDdXRzRm9yU3RvbmUuIFJhdyBDcnlzdGFsCi8vIGlzIHRoZSBzdG9uZSdzIG93biBuYXR1cmFsIGNyeXN0YWwsIG5vdCBhIGN1dDogYW4gb2N0YWhlZHJvbiBmb3IKLy8gZGlhbW9uZCwgYSBoZXhhZ29uYWwgYmFycmVsIGZvciBzYXBwaGlyZSwgYSBwcmlzbSB3aXRoIGEgcHlyYW1pZCB0aXAKLy8gYW5kIGEgZmxhdCBjbGVhdmFnZSBicmVhayBmb3IgdG9wYXogKGJ1aWxkUmF3KS4KdmFyIFNoYXBlTmFtZXMgPSBbXXN0cmluZ3sKCSJSb3VuZCBCcmlsbGlhbnQiLCAiT3ZhbCIsICJDdXNoaW9uIiwgIkVtZXJhbGQgQ3V0IiwgIkFzc2NoZXIiLAoJIlJhZGlhbnQiLCAiUHJpbmNlc3MgQ3V0IiwgIlBlYXIiLCAiTWFycXVpc2UiLCAiVHJpbGxpb24iLAoJIkhlYXJ0IiwgIlJvc2UgQ3V0IiwgIlJhdyBDcnlzdGFsIiwKfQoKY29uc3QgKAoJc2hhcGVIZWFydCA9IDEwCglzaGFwZVJvc2UgID0gMTEKCXNoYXBlUmF3ICAgPSAxMgopCgovLyBzdG9uZVNjYWxlIGVubGFyZ2VzIGV2ZXJ5IHN0b25lIGFuZCBwZWFybCBpbnNpZGUgdGhlIHJpbmcgb3BlbmluZzoKLy8gMS4yMiAodGhlIGZpcnN0IGdlbXNhcnQzZDIgcGFzcykgY3Jvd2RlZCB0aGUgcmluZzsgMC45OCB3YXMgNC81IG9mCi8vIHRoYXQsIGFuZCAwLjc4IGlzIDQvNSBhZ2FpbiAoMjAyNi0wOS0yNiwgcGVyIHJlcXVlc3QpLiBUaGVuIDEuMDIgd2l0aAovLyB0aGUgcmluZyBkcmF3biAxMCUgbGFyZ2VyLCBhbmQgZmluYWxseSAxLjIxIHdpdGggdGhlIHJpbmcgMTYlIGxhcmdlcgovLyAoc2l6ZSAiRCsiIG9mIHRoZSBzaXplIHRyaWFscywgY2hvc2VuIDIwMjYtMDktMjY7IHNlZSByaW5nU2NhbGUpLgpjb25zdCBzdG9uZVNjYWxlID0gMS4yMQoKZnVuYyBjdXRGb3Ioc2hhcGVJZHggaW50KSBjdXRTcGVjIHsKCWMgOj0gY3V0Rm9yVW5zY2FsZWQoc2hhcGVJZHgpCgljLnJ4LCBjLnJ5ID0gYy5yeCpzdG9uZVNjYWxlLCBjLnJ5KnN0b25lU2NhbGUKCXJldHVybiBjCn0KCmZ1bmMgY3V0Rm9yVW5zY2FsZWQoc2hhcGVJZHggaW50KSBjdXRTcGVjIHsKCXN3aXRjaCBzaGFwZUlkeCB7CgljYXNlIDE6CgkJcmV0dXJuIGN1dFNwZWN7OCwgdHJ1ZSwgY2lyY2xlT3V0bGluZSwgMzAsIDIxLjV9CgljYXNlIDI6CgkJcmV0dXJuIGN1dFNwZWN7OCwgdHJ1ZSwgc3VwZXJPdXRsaW5lKDMuNCksIDI3LCAyNH0KCWNhc2UgMzoKCQkvLyBFbWVyYWxkIEN1dDogMTAlIHNtYWxsZXIgdGhhbiB0aGUgb3RoZXIgY3V0cycgc2NhbGUgKHdhcyAzMCB4IDIxKTsKCQkvLyBpdHMgbG9uZyBzdGVwLWN1dCBvdXRsaW5lIHJlYWQgbGFyZ2VyIHRoYW4gdGhlIHJlc3QgYXQgMS4yMQoJCXJldHVybiBjdXRTcGVjezgsIGZhbHNlLCBwb2x5T3V0bGluZShvY3RhZ29uKDEsIDEsIDAuMykpLCAyNywgMTguOX0KCWNhc2UgNDoKCQlyZXR1cm4gY3V0U3BlY3s4LCBmYWxzZSwgcG9seU91dGxpbmUob2N0YWdvbigxLCAxLCAwLjM2KSksIDI1LCAyNX0KCWNhc2UgNToKCQlyZXR1cm4gY3V0U3BlY3s4LCB0cnVlLCBwb2x5T3V0bGluZShvY3RhZ29uKDEsIDEsIDAuMykpLCAyOSwgMjIuNX0KCWNhc2UgNjoKCQlyZXR1cm4gY3V0U3BlY3s4LCB0cnVlLCBwb2x5T3V0bGluZShbXXB0e3sxLCAxfSwgezAsIDF9LCB7LTEsIDF9LCB7LTEsIDB9LCB7LTEsIC0xfSwgezAsIC0xfSwgezEsIC0xfSwgezEsIDB9fSksIDIzLjUsIDIzLjV9CgljYXNlIDc6CgkJcmV0dXJuIGN1dFNwZWN7OCwgdHJ1ZSwgcGVhck91dGxpbmUsIDMxLCAyN30KCWNhc2UgODoKCQlyZXR1cm4gY3V0U3BlY3s4LCB0cnVlLCBtYXJxdWlzZU91dGxpbmUsIDMzLCAzMH0KCWNhc2UgOToKCQlyZXR1cm4gY3V0U3BlY3s5LCB0cnVlLCB0cmlsbGlvbk91dGxpbmUsIDI3LCAyN30KCWNhc2Ugc2hhcGVIZWFydDoKCQlyZXR1cm4gY3V0U3BlY3sxMCwgdHJ1ZSwgaGVhcnRPdXRsaW5lLCAyOSwgMjh9CgljYXNlIHNoYXBlUm9zZToKCQlyZXR1cm4gY3V0U3BlY3s2LCB0cnVlLCBjaXJjbGVPdXRsaW5lLCAyNywgMjd9CgljYXNlIHNoYXBlUmF3OgoJCXJldHVybiBjdXRTcGVjezAsIGZhbHNlLCBjaXJjbGVPdXRsaW5lLCAyNywgMjd9IC8vIHNpemVkIHBlciBzdG9uZSBpbiBidWlsZFJhdwoJfQoJcmV0dXJuIGN1dFNwZWN7OCwgdHJ1ZSwgY2lyY2xlT3V0bGluZSwgMjcsIDI3fQp9CgovLyBDdXRzRm9yU3RvbmUgaXMgd2hpY2ggY3V0cyBhIHN0b25lIGlzIHJlYWxseSBzb2xkIGluIC0tIHRoZSBjdXRzIHRoZQovLyB0cmFkZSBhY3R1YWxseSBwcm9kdWNlcyBmb3IgaXQgaW4gcXVhbnRpdHksIG5vdCBldmVyeSBjdXQgdGhhdCBoYXMKLy8gZXZlciBiZWVuIHRyaWVkLiBBIG1pbnQgcGlja3Mgc2hhcGVJZHggZnJvbSB0aGlzIHNsaWNlLgovLyAgIERpYW1vbmQ6IGV2ZXJ5IGN1dCBoZXJlOyBicmlsbGlhbmNlIGN1dHMgKFJhZGlhbnQsIFByaW5jZXNzLCBBc3NjaGVyKQovLyAgICAgd2VyZSBpbnZlbnRlZCBmb3IgaXQsIFJvc2UgQ3V0IGlzIGl0cyBvbGRlc3QgZmFjZXRlZCBmb3JtLCBhbmQgcmF3Ci8vICAgICBvY3RhaGVkcmEgYXJlIHNldCBpbiBqZXdlbGxlcnkgYXMgdGhleSBjb21lIGZyb20gdGhlIG1pbmUuCi8vICAgU2FwcGhpcmU6IHJvdWdoIGZhdm91cnMgb3ZhbHMgYW5kIGN1c2hpb25zICh3ZWlnaHQgcmV0ZW50aW9uKSwgdGhlbgovLyAgICAgcm91bmRzLCBlbWVyYWxkIGN1dHMsIHBlYXJzLCBoZWFydHMsIG1hcnF1aXNlcywgdHJpbGxpb25zIChzaWRlCi8vICAgICBzdG9uZXMpLCBwcmluY2VzcyAoY2FsaWJyYXRlZCBzcXVhcmVzKSwgcm9zZSBjdXRzLCByYXcgYmFycmVscy4KLy8gICAgIEFzc2NoZXIgYW5kIFJhZGlhbnQgYXJlIGRpYW1vbmQtb3B0aW1pc2VkIGFuZCByYXJlIGluIHNhcHBoaXJlLgovLyAgIFRvcGF6OiBjcnlzdGFscyBhcmUgbG9uZyBwcmlzbXMsIHNvIGVtZXJhbGQgY3V0cywgb3ZhbHMsIHBlYXJzLAovLyAgICAgY3VzaGlvbnMsIG1hcnF1aXNlcywgdGhlbiByb3VuZHMsIHRyaWxsaW9ucywgaGVhcnRzLCBwcmluY2VzcywgYW5kCi8vICAgICByYXcgY3J5c3RhbHMgKHRvcGF6IGlzIG9uZSBvZiB0aGUgY2xhc3NpYyBjb2xsZWN0b3IgY3J5c3RhbHMpLgovLyAgIFF1YXJ0eiAoZXZlcnkgY2hhaW4gd2l0aG91dCBpdHMgb3duIHN0b25lKTogY3V0IGluIGV2ZXJ5IHN0eWxlIChpdAovLyAgICAgaXMgdGhlIGxhcGlkYXJ5J3MgZXZlcnlkYXkgc3RvbmUpLCByb3NlLWN1dCBhbWV0aHlzdCBpcyBhIGNsYXNzaWMsCi8vICAgICBhbmQgdGhlIGhleGFnb25hbCBxdWFydHogcG9pbnQgaXMgVEhFIHJhdyBjcnlzdGFsLgpmdW5jIEN1dHNGb3JTdG9uZShzdG9uZSBzdHJpbmcpIFtdaW50IHsKCXN3aXRjaCBzdG9uZSB7CgljYXNlICJEaWFtb25kIjoKCQlyZXR1cm4gW11pbnR7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgc2hhcGVIZWFydCwgc2hhcGVSb3NlLCBzaGFwZVJhd30KCWNhc2UgIlNhcHBoaXJlIjoKCQlyZXR1cm4gW11pbnR7MSwgMiwgMCwgMywgNywgc2hhcGVIZWFydCwgOCwgOSwgNiwgc2hhcGVSb3NlLCBzaGFwZVJhd30KCWNhc2UgIlRvcGF6IjoKCQlyZXR1cm4gW11pbnR7MywgMSwgNywgMiwgOCwgMCwgOSwgc2hhcGVIZWFydCwgNiwgc2hhcGVSYXd9Cgl9CglyZXR1cm4gW11pbnR7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgc2hhcGVIZWFydCwgc2hhcGVSb3NlLCBzaGFwZVJhd30KfQoKY29uc3QgKAoJa0Nyb3duID0gaW90YQoJa1RhYmxlCglrUGF2CikKCnR5cGUgZmFjZSBzdHJ1Y3QgewoJcCAgICBbXXYzCglraW5kIGludAp9CgpmdW5jIHJpbmdQdHMoYyBjdXRTcGVjLCBuIGludCwgc2NhbGUsIHosIG9mZiBmbG9hdDY0KSBbXXYzIHsKCW91dCA6PSBtYWtlKFtddjMsIG4pCglmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQl4LCB5IDo9IGMub3V0bGluZSgoZmxvYXQ2NChrKSArIG9mZikgLyBmbG9hdDY0KG4pKQoJCW91dFtrXSA9IHYze3ggKiBjLnJ4ICogc2NhbGUsIHkgKiBjLnJ5ICogc2NhbGUsIHp9Cgl9CglyZXR1cm4gb3V0Cn0KCi8vIGJ1aWxkQ3V0IHJldHVybnMgdGhlIHNvbGlkJ3MgZmFjZXMgcGx1cyBpdHMgZ2lyZGxlIHJpbmcgKGRyYXduIGFzIG9uZQovLyBzdHJva2UsIG5vdCBhcyBmYWNlcykuIFByb3BvcnRpb25zIGZvbGxvdyBhIHJlYWwgc3RvbmU6IHRhYmxlIH41NiUgb2YKLy8gdGhlIHdpZHRoLCBjcm93biB+MS8zIGFzIHRhbGwgYXMgdGhlIHBhdmlsaW9uIGlzIGRlZXAuCmZ1bmMgYnVpbGRDdXQoYyBjdXRTcGVjKSAoZmFjZXMgW11mYWNlLCBnaXJkbGUgW112MykgewoJYmFzZSA6PSBjLnJ4CglpZiBjLnJ5IDwgYmFzZSB7CgkJYmFzZSA9IGMucnkKCX0KCWhjLCBocCA6PSAwLjM0KmJhc2UsIDAuOSpiYXNlCgluIDo9IGMubgoJaWYgYy5icmlsbGlhbnQgewoJCVQgOj0gcmluZ1B0cyhjLCBuLCAwLjU2LCBoYywgMCkKCQlCIDo9IHJpbmdQdHMoYywgbiwgMC44LCBoYyowLjQ2LCAwLjUpCgkJRyA6PSByaW5nUHRzKGMsIDIqbiwgMSwgMCwgMCkKCQljdWxldCA6PSB2M3swLCAwLCAtaHB9CgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7VCwga1RhYmxlfSkKCQlmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQkJazEgOj0gKGsgKyAxKSAlIG4KCQkJLy8gc3RhciwgdGhlbiB0aGUga2l0ZSBhcyBvbmUgcXVhZCBkb3duIHRvIHRoZSBnaXJkbGUKCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tUW2tdLCBCW2tdLCBUW2sxXX0sIGtDcm93bn0pCgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7VFtrMV0sIEJba10sIEdbKDIqaysyKSUoMipuKV0sIEJbazFdfSwga0Nyb3dufSkKCQkJLy8gdGhlIHR3byB1cHBlci1naXJkbGUgZmFjZXRzIHVuZGVyIHRoaXMgYnJlYWsgdmVydGV4CgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7QltrXSwgR1syKmtdLCBHWzIqaysxXX0sIGtDcm93bn0pCgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7QltrXSwgR1syKmsrMV0sIEdbKDIqaysyKSUoMipuKV19LCBrQ3Jvd259KQoJCQkvLyBwYXZpbGlvbiBtYWluLCBzcGFubmluZyB0d28gZ2lyZGxlIHNlZ21lbnRzCgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7R1syKmtdLCBHWzIqaysxXSwgR1soMiprKzIpJSgyKm4pXSwgY3VsZXR9LCBrUGF2fSkKCQl9CgkJcmV0dXJuIGZhY2VzLCBHCgl9CglUIDo9IHJpbmdQdHMoYywgbiwgMC41NCwgaGMsIDApCglTIDo9IHJpbmdQdHMoYywgbiwgMC43OCwgaGMqMC41LCAwKQoJRyA6PSByaW5nUHRzKGMsIG4sIDEsIDAsIDApCglQMSA6PSByaW5nUHRzKGMsIG4sIDAuNywgLWhwKjAuNDIsIDApCglQMiA6PSByaW5nUHRzKGMsIG4sIDAuMzgsIC1ocCowLjc4LCAwKQoJSyA6PSByaW5nUHRzKGMsIG4sIDAuMSwgLWhwLCAwKQoJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7VCwga1RhYmxlfSkKCXJvd3MgOj0gW11bMl1bXXYze3tULCBTfSwge1MsIEd9fQoJZm9yIF8sIHIgOj0gcmFuZ2Ugcm93cyB7CgkJZm9yIGsgOj0gMDsgayA8IG47IGsrKyB7CgkJCWsxIDo9IChrICsgMSkgJSBuCgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7clswXVtrXSwgclswXVtrMV0sIHJbMV1bazFdLCByWzFdW2tdfSwga0Nyb3dufSkKCQl9Cgl9Cglwcm93IDo9IFtdWzJdW112M3t7RywgUDF9LCB7UDEsIFAyfSwge1AyLCBLfX0KCWZvciBfLCByIDo9IHJhbmdlIHByb3cgewoJCWZvciBrIDo9IDA7IGsgPCBuOyBrKysgewoJCQlrMSA6PSAoayArIDEpICUgbgoJCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgZmFjZXtbXXYze3JbMF1ba10sIHJbMF1bazFdLCByWzFdW2sxXSwgclsxXVtrXX0sIGtQYXZ9KQoJCX0KCX0KCXJldHVybiBmYWNlcywgRwp9CgovLyBidWlsZFJvc2UgaXMgYSByb3NlIGN1dDogYSBmbGF0IGJhc2UgYW5kIGEgZG9tZSBvZiB0cmlhbmd1bGFyIGZhY2V0cwovLyByaXNpbmcgdG8gYSBwb2ludCAtLSBzaXggYXQgdGhlIHRvcCwgdHdlbHZlIGFyb3VuZCB0aGUgZWRnZS4gTm8gdGFibGUsCi8vIG5vIHBhdmlsaW9uOyB0aGUgZmxhdCBiYWNrIGlzIHRoZSBvbmUgcGF2aWxpb24gZmFjZS4KZnVuYyBidWlsZFJvc2UoYyBjdXRTcGVjKSAoZmFjZXMgW11mYWNlLCBnaXJkbGUgW112MykgewoJbiA6PSBjLm4KCWJhc2UgOj0gbWF0aC5NaW4oYy5yeCwgYy5yeSkKCWggOj0gMC42MiAqIGJhc2UKCWFwZXggOj0gdjN7MCwgMCwgaH0KCVIgOj0gcmluZ1B0cyhjLCBuLCAwLjU1LCBoKjAuNjIsIDAuNSkKCUcgOj0gcmluZ1B0cyhjLCAyKm4sIDEsIDAsIDApCglmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQlrMSA6PSAoayArIDEpICUgbgoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7YXBleCwgUltrXSwgUltrMV19LCBrQ3Jvd259KQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7R1syKmtdLCBHWzIqaysxXSwgUltrXX0sIGtDcm93bn0pCgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tHWzIqaysxXSwgR1soMiprKzIpJSgyKm4pXSwgUltrXX0sIGtDcm93bn0pCgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tSW2tdLCBHWygyKmsrMiklKDIqbildLCBSW2sxXX0sIGtDcm93bn0pCgl9CgliYWNrIDo9IG1ha2UoW112MywgbGVuKEcpKQoJZm9yIGkgOj0gcmFuZ2UgRyB7CgkJYmFja1tsZW4oRyktMS1pXSA9IEdbaV0KCX0KCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle2JhY2ssIGtQYXZ9KQoJcmV0dXJuIGZhY2VzLCBHCn0KCi8vIHJpbmdYIGlzIGEgcmluZyBvZiBuIHBvaW50cyBhcm91bmQgdGhlIHggYXhpcyBhdCBwb3NpdGlvbiB4LgpmdW5jIHJpbmdYKG4gaW50LCB4LCByeSwgcnosIHBoYXNlIGZsb2F0NjQpIFtddjMgewoJb3V0IDo9IG1ha2UoW112MywgbikKCWZvciBrIDo9IDA7IGsgPCBuOyBrKysgewoJCWEgOj0gMiptYXRoLlBpKihmbG9hdDY0KGspK3BoYXNlKS9mbG9hdDY0KG4pICsgbWF0aC5QaS8yCgkJb3V0W2tdID0gdjN7eCwgcnkgKiBtYXRoLkNvcyhhKSwgcnogKiBtYXRoLlNpbihhKX0KCX0KCXJldHVybiBvdXQKfQoKLy8gYmFuZFggam9pbnMgdHdvIHJpbmdzIG9mIGVxdWFsIHNpemUgd2l0aCBxdWFkcy4KZnVuYyBiYW5kWChhLCBiIFtddjMpIFtdZmFjZSB7Cgl2YXIgZnMgW11mYWNlCglmb3IgayA6PSByYW5nZSBhIHsKCQlrMSA6PSAoayArIDEpICUgbGVuKGEpCgkJZnMgPSBhcHBlbmQoZnMsIGZhY2V7W112M3thW2tdLCBhW2sxXSwgYltrMV0sIGJba119LCBrQ3Jvd259KQoJfQoJcmV0dXJuIGZzCn0KCi8vIGNhcFggY2xvc2VzIGEgcmluZyB3aXRoIG9uZSBmbGF0IGZhY2UgKGEgcGluYWNvaWQgb3IgYSBjbGVhdmFnZSBicmVhaykuCmZ1bmMgY2FwWChyIFtddjMpIGZhY2UgeyByZXR1cm4gZmFjZXtyLCBrQ3Jvd259IH0KCi8vIHR1cm5GYWNlcyByb3RhdGVzIGV2ZXJ5IHZlcnRleCBhYm91dCB4IGJ5IGF4LCB0aGVuIGFib3V0IHogYnkgYXoKLy8gKHJhZGlhbnMpOiBhIHJvdWdoIGNyeXN0YWwgaXMgc2V0IGF0IGFuIGFuZ2xlIHRoYXQgc2hvd3Mgc2V2ZXJhbCBvZiBpdHMKLy8gZmFjZXMsIG5vdCBzcXVhcmUtb24gdG8gdGhlIHZpZXdlci4KZnVuYyB0dXJuRmFjZXMoZnMgW11mYWNlLCBheCwgYXogZmxvYXQ2NCkgW11mYWNlIHsKCWN4LCBzeCwgY3osIHN6IDo9IG1hdGguQ29zKGF4KSwgbWF0aC5TaW4oYXgpLCBtYXRoLkNvcyhheiksIG1hdGguU2luKGF6KQoJZm9yIGkgOj0gcmFuZ2UgZnMgewoJCS8vIEEgcm91Z2ggY3J5c3RhbCBpcyB0cmFuc2x1Y2VudDogbGl0IGZyb20gaW5zaWRlIGxpa2UgYQoJCS8vIHBhdmlsaW9uLCBhbmQgaXRzIGZhciBmYWNlcyBzaG93IHRocm91Z2ggdGhlIG5lYXIgb25lcwoJCS8vIChyZW5kZXJHZW0zRCBkcmF3cyBiYWNrLWZhY2luZyBrUGF2IGZhY2VzKS4KCQlmc1tpXS5raW5kID0ga1BhdgoJCWZvciBqLCBwIDo9IHJhbmdlIGZzW2ldLnAgewoJCQl5LCB6IDo9IHAueSpjeC1wLnoqc3gsIHAueSpzeCtwLnoqY3gKCQkJZnNbaV0ucFtqXSA9IHYze3AueCpjeiAtIHkqc3osIHAueCpzeiArIHkqY3osIHp9CgkJfQoJfQoJcmV0dXJuIGZzCn0KCi8vIGJ1aWxkUmF3IGlzIHRoZSBzdG9uZSdzIG5hdHVyYWwgY3J5c3RhbCwgbHlpbmcgb24gaXRzIHNpZGUgYXMgaXQgd291bGQKLy8gaW4gYSByYXctY3J5c3RhbCBzZXR0aW5nLiBSb3VnaCBjcnlzdGFscyBoYXZlIG5vIHRhYmxlIGFuZCBubyBnaXJkbGUsCi8vIGFuZCBub25lIGlzIHBlcmZlY3RseSByZWd1bGFyOiBlYWNoIGhhYml0IGlzIHN0cmV0Y2hlZCBhIGxpdHRsZSBvbiBvbmUKLy8gYXhpcy4KZnVuYyBidWlsZFJhdyhzdG9uZSBzdHJpbmcpIChmYWNlcyBbXWZhY2UsIGdpcmRsZSBbXXYzKSB7CglkZWcgOj0gbWF0aC5QaSAvIDE4MAoJc3dpdGNoIHN0b25lIHsKCWNhc2UgIkRpYW1vbmQiOgoJCS8vIHRoZSBvY3RhaGVkcm9uLCBkaWFtb25kJ3MgY29tbW9uZXN0IGhhYml0LCB0aXBwZWQgc28gZm91ciBvciBmaXZlCgkJLy8gb2YgaXRzIGVpZ2h0IGZhY2VzIHNob3cKCQlhLCBiLCBoIDo9IDI1LjAqc3RvbmVTY2FsZSwgMjIuMCpzdG9uZVNjYWxlLCAyMy4wKnN0b25lU2NhbGUKCQl2IDo9IFtddjN7e2EsIDAsIDB9LCB7MCwgYiwgMH0sIHstYSwgMCwgMH0sIHswLCAtYiwgMH19CgkJdG9wLCBib3QgOj0gdjN7MCwgMCwgaH0sIHYzezAsIDAsIC1ofQoJCWZvciBrIDo9IDA7IGsgPCA0OyBrKysgewoJCQlrMSA6PSAoayArIDEpICUgNAoJCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgZmFjZXtbXXYze3RvcCwgdltrXSwgdltrMV19LCBrQ3Jvd259KQoJCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgZmFjZXtbXXYze2JvdCwgdltrMV0sIHZba119LCBrQ3Jvd259KQoJCX0KCQlyZXR1cm4gdHVybkZhY2VzKGZhY2VzLCAtMzgqZGVnLCAyOCpkZWcpLCBuaWwKCWNhc2UgIlNhcHBoaXJlIjoKCQkvLyBjb3J1bmR1bSdzIGJhcnJlbDogYSBoZXhhZ29uYWwgcHJpc20gc3dlbGxpbmcgaW4gdGhlIG1pZGRsZSwKCQkvLyB0YXBlcmluZyB0byBmbGF0IGhleGFnb25hbCBlbmRzCgkJTCwgUiA6PSAyNi4wKnN0b25lU2NhbGUsIDE2LjAqc3RvbmVTY2FsZQoJCXIwIDo9IHJpbmdYKDYsIC1MLCBSKjAuNDIsIFIqMC40MiwgMCkKCQlyMSA6PSByaW5nWCg2LCAtTCowLjMsIFIsIFIqMC45NCwgMCkKCQlyMiA6PSByaW5nWCg2LCBMKjAuMywgUiwgUiowLjk0LCAwKQoJCXIzIDo9IHJpbmdYKDYsIEwsIFIqMC40MiwgUiowLjQyLCAwKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMCwgcjEpLi4uKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMSwgcjIpLi4uKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMiwgcjMpLi4uKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBjYXBYKHIzKSkKCQlyZXYgOj0gbWFrZShbXXYzLCA2KQoJCWZvciBpIDo9IHJhbmdlIHIwIHsKCQkJcmV2WzUtaV0gPSByMFtpXQoJCX0KCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgY2FwWChyZXYpKQoJCXJldHVybiB0dXJuRmFjZXMoZmFjZXMsIC0zMCpkZWcsIC0xNCpkZWcpLCBuaWwKCX0KCWlmIHN0b25lID09ICJRdWFydHoiIHsKCQkvLyB0aGUgcXVhcnR6IHBvaW50OiBhIHNpeC1zaWRlZCBwcmlzbSBlbmRpbmcgaW4gYSBzaXgtZmFjZWQKCQkvLyBweXJhbWlkLCB0aGUgZmFyIGVuZCBicm9rZW4gb2ZmIHdoZXJlIGl0IGdyZXcgZnJvbSB0aGUgbWF0cml4CgkJTCwgUiA6PSAyNy4wKnN0b25lU2NhbGUsIDEyLjUqc3RvbmVTY2FsZQoJCXIwIDo9IHJpbmdYKDYsIC1MLCBSKjEuMDQsIFIsIDApCgkJcjEgOj0gcmluZ1goNiwgTCowLjQsIFIsIFIqMC45NiwgMCkKCQlwb2ludCA6PSB2M3tMLCAwLCAwfQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMCwgcjEpLi4uKQoJCWZvciBrIDo9IDA7IGsgPCA2OyBrKysgewoJCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgZmFjZXtbXXYze3IxW2tdLCByMVsoaysxKSU2XSwgcG9pbnR9LCBrQ3Jvd259KQoJCX0KCQlyZXYgOj0gbWFrZShbXXYzLCA2KQoJCWZvciBpIDo9IHJhbmdlIHIwIHsKCQkJcmV2WzUtaV0gPSByMFtpXQoJCX0KCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgY2FwWChyZXYpKQoJCXJldHVybiB0dXJuRmFjZXMoZmFjZXMsIC0zMipkZWcsIDE2KmRlZyksIG5pbAoJfQoJLy8gdG9wYXo6IGFuIGVpZ2h0LXNpZGVkIHByaXNtIChyaG9tYmljIHByaXNtIHdpdGggYmV2ZWxsZWQgZWRnZXMpLAoJLy8gYSBmb3VyLWZhY2VkIHB5cmFtaWQgYXQgb25lIGVuZCwgYW5kIHRoZSBmbGF0IGJyZWFrIG9mIHRvcGF6J3MKCS8vIHBlcmZlY3QgYmFzYWwgY2xlYXZhZ2UgYXQgdGhlIG90aGVyCglMLCByeSwgcnogOj0gMjYuMCpzdG9uZVNjYWxlLCAxNi4wKnN0b25lU2NhbGUsIDEzLjAqc3RvbmVTY2FsZQoJcjAgOj0gcmluZ1goOCwgLUwsIHJ5LCByeiwgMC41KQoJcjEgOj0gcmluZ1goOCwgTCowLjUsIHJ5LCByeiwgMC41KQoJdGlwIDo9IHJpbmdYKDgsIEwqMC44MiwgcnkqMC40NSwgcnoqMC40NSwgMC41KQoJcG9pbnQgOj0gdjN7TCwgMCwgMH0KCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMCwgcjEpLi4uKQoJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGJhbmRYKHIxLCB0aXApLi4uKQoJZm9yIGsgOj0gMDsgayA8IDg7IGsrKyB7CgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3t0aXBba10sIHRpcFsoaysxKSU4XSwgcG9pbnR9LCBrQ3Jvd259KQoJfQoJcmV2IDo9IG1ha2UoW112MywgOCkKCWZvciBpIDo9IHJhbmdlIHIwIHsKCQlyZXZbNy1pXSA9IHIwW2ldCgl9CglmYWNlcyA9IGFwcGVuZChmYWNlcywgY2FwWChyZXYpKQoJcmV0dXJuIHR1cm5GYWNlcyhmYWNlcywgLTMwKmRlZywgMTIqZGVnKSwgbmlsCn0KCi8qIC0tLS0gdmlldywgbGlnaHQsIHBhaW50IC0tLS0gKi8KCi8vIGdlbVRpbHQgaXMgZGVncmVlcyBmcm9tIGEgc3RyYWlnaHQtZG93biB2aWV3OiA2MSBpcyBlbm91Z2ggdG8gc2VlIHVuZGVyCi8vIHRoZSBnaXJkbGUgKHRoZSBzYXZlZCAib2JsaXF1ZSIgdmlldzsgdGhlICJwcm9maWxlIiByZXZpZXcgc2V0IGlzIHRoZQovLyBzYW1lIGNvZGUgcmVuZGVyZWQgd2l0aCA3NikuCmNvbnN0IGdlbVRpbHQgPSA2MS4wCgpjb25zdCAoCgkvLyBPcHRpY2FsbHkgY2VudHJlZDogdGhlIHBhdmlsaW9uICh0aGUgbG93ZXIgaGFsZikgaXMgZGFyayBhbmQgbWVsdHMKCS8vIGludG8gdGhlIGdyb3VuZCwgc28gYSBzdG9uZSBjZW50cmVkIGJ5IGdlb21ldHJ5IHJlYWRzIGhpZ2g7IG1lYXN1cmVkCgkvLyBvbiBzdGlsbCByZW5kZXJzLCBpdHMgdmlzaWJsZSBwYXJ0IHNhdCB+MS41IHVuaXRzIGFib3ZlIHRoZSByaW5nCgkvLyBjZW50cmUuIFBlYXJscyBhcmUgZXZlbmx5IGxpdCBhbmQgdXNlIHN1YmpZIGFzIGlzLiAoV2FzIHN1YmpZLTEuKQoJZ2VtQ1kgICA9IHN1YmpZICsgMS41CikKCi8vIG4xIGZvcm1hdHMgdG8gb25lIGRlY2ltYWwgYXMgY29tcGFjdGx5IGFzIFNWRyBhbGxvd3M6IG5vIHRyYWlsaW5nCi8vICIuMCIsIG5vIGxlYWRpbmcgIjAiLgpmdW5jIG4xKHYgZmxvYXQ2NCkgc3RyaW5nIHsKCW5lZyA6PSB2IDwgMAoJaWYgbmVnIHsKCQl2ID0gLXYKCX0KCXQgOj0gaW50NjQodioxMCArIDAuNSkKCXcsIGYgOj0gdC8xMCwgdCUxMAoJcyA6PSAiIgoJaWYgZiA9PSAwIHsKCQlzID0gaXRvYSh3KQoJfSBlbHNlIGlmIHcgPT0gMCB7CgkJcyA9ICIuIiArIHN0cmluZyhieXRlKCcwJytmKSkKCX0gZWxzZSB7CgkJcyA9IGl0b2EodykgKyAiLiIgKyBzdHJpbmcoYnl0ZSgnMCcrZikpCgl9CglpZiBuZWcgJiYgdCAhPSAwIHsKCQlyZXR1cm4gIi0iICsgcwoJfQoJcmV0dXJuIHMKfQoKLy8gcmVsUGF0aCB3cml0ZXMgYSBjbG9zZWQgcG9seWdvbiB3aXRoIHJlbGF0aXZlIGNvb3JkaW5hdGVzOyBhIG5lZ2F0aXZlCi8vIG51bWJlciBuZWVkcyBubyBzZXBhcmF0b3IgYmVmb3JlIGl0LCB3aGljaCBpcyB3aGVyZSB0aGUgYnl0ZXMgZ28uCmZ1bmMgcmVsUGF0aChwcyBbXXB0KSBzdHJpbmcgewoJcyA6PSAiTSIgKyBuMShwc1swXS54KSArICIgIiArIG4xKHBzWzBdLnkpICsgImwiCglweCwgcHkgOj0gbWF0aC5Sb3VuZChwc1swXS54KjEwKS8xMCwgbWF0aC5Sb3VuZChwc1swXS55KjEwKS8xMAoJZm9yIGkgOj0gMTsgaSA8IGxlbihwcyk7IGkrKyB7CgkJcXgsIHF5IDo9IG1hdGguUm91bmQocHNbaV0ueCoxMCkvMTAsIG1hdGguUm91bmQocHNbaV0ueSoxMCkvMTAKCQlkeCwgZHkgOj0gbjEocXgtcHgpLCBuMShxeS1weSkKCQlpZiBpID4gMSAmJiBkeFswXSAhPSAnLScgewoJCQlzICs9ICIgIgoJCX0KCQlzICs9IGR4CgkJaWYgZHlbMF0gIT0gJy0nIHsKCQkJcyArPSAiICIKCQl9CgkJcyArPSBkeQoJCXB4LCBweSA9IHF4LCBxeQoJfQoJcmV0dXJuIHMgKyAieiIKfQoKLy8gaGV4MyBxdWFudGlzZXMgI3JyZ2diYiB0byAjcmdiLgpmdW5jIGhleDMoaCBzdHJpbmcpIHN0cmluZyB7CglyLCBnLCBiIDo9IGhleFRvUkdCKGgpCglkIDo9ICIwMTIzNDU2Nzg5YWJjZGVmIgoJcSA6PSBmdW5jKHYgaW50KSBieXRlIHsgcmV0dXJuIGRbKHYrOCkqMTUvMjU1JTE2XSB9CglyZXR1cm4gIiMiICsgc3RyaW5nKFtdYnl0ZXtxKHIpLCBxKGcpLCBxKGIpfSkKfQoKZnVuYyBjb252ZXhIdWxsKHBzIFtdcHQpIFtdcHQgewoJbiA6PSBsZW4ocHMpCglpZHggOj0gbWFrZShbXWludCwgbikKCWZvciBpIDo9IHJhbmdlIGlkeCB7CgkJaWR4W2ldID0gaQoJfQoJLy8gYm90dG9tLXVwIG1lcmdlIHNvcnQgYnkgKHgsIHkpOiB0aGUgYm9keSBodWxsIHRha2VzIGV2ZXJ5IHByb2plY3RlZAoJLy8gdmVydGV4IG9mIHRoZSBzdG9uZSAoaHVuZHJlZHMpLCB3aGVyZSBhbiBpbnNlcnRpb24gc29ydCdzIG5eMgoJLy8gY29tcGFyaXNvbnMgd2VyZSBhIHJlYWwgc2hhcmUgb2YgYSByZW5kZXIncyBnYXMKCWxlc3MgOj0gZnVuYyhhLCBiIGludCkgYm9vbCB7CgkJcmV0dXJuIHBzW2FdLnggPCBwc1tiXS54IHx8IChwc1thXS54ID09IHBzW2JdLnggJiYgcHNbYV0ueSA8IHBzW2JdLnkpCgl9Cgl0bXAgOj0gbWFrZShbXWludCwgbikKCWZvciB3IDo9IDE7IHcgPCBuOyB3ICo9IDIgewoJCWZvciBsbyA6PSAwOyBsbyA8IG47IGxvICs9IDIgKiB3IHsKCQkJbWlkLCBoaSA6PSBsbyt3LCBsbysyKncKCQkJaWYgbWlkID4gbiB7CgkJCQltaWQgPSBuCgkJCX0KCQkJaWYgaGkgPiBuIHsKCQkJCWhpID0gbgoJCQl9CgkJCWksIGosIGsgOj0gbG8sIG1pZCwgbG8KCQkJZm9yIGkgPCBtaWQgJiYgaiA8IGhpIHsKCQkJCWlmIGxlc3MoaWR4W2pdLCBpZHhbaV0pIHsKCQkJCQl0bXBba10gPSBpZHhbal0KCQkJCQlqKysKCQkJCX0gZWxzZSB7CgkJCQkJdG1wW2tdID0gaWR4W2ldCgkJCQkJaSsrCgkJCQl9CgkJCQlrKysKCQkJfQoJCQlmb3IgaSA8IG1pZCB7CgkJCQl0bXBba10gPSBpZHhbaV0KCQkJCWkrKwoJCQkJaysrCgkJCX0KCQkJZm9yIGogPCBoaSB7CgkJCQl0bXBba10gPSBpZHhbal0KCQkJCWorKwoJCQkJaysrCgkJCX0KCQl9CgkJaWR4LCB0bXAgPSB0bXAsIGlkeAoJfQoJY3IgOj0gZnVuYyhvLCBhLCBiIHB0KSBmbG9hdDY0IHsgcmV0dXJuIChhLngtby54KSooYi55LW8ueSkgLSAoYS55LW8ueSkqKGIueC1vLngpIH0KCXZhciBoIFtdcHQKCWZvciBwYXNzIDo9IDA7IHBhc3MgPCAyOyBwYXNzKysgewoJCXN0YXJ0IDo9IGxlbihoKQoJCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCQlwIDo9IHBzW2lkeFtpXV0KCQkJaWYgcGFzcyA9PSAxIHsKCQkJCXAgPSBwc1tpZHhbbi0xLWldXQoJCQl9CgkJCWZvciBsZW4oaCkgPj0gc3RhcnQrMiAmJiBjcihoW2xlbihoKS0yXSwgaFtsZW4oaCktMV0sIHApIDw9IDAgewoJCQkJaCA9IGhbOmxlbihoKS0xXQoJCQl9CgkJCWggPSBhcHBlbmQoaCwgcCkKCQl9CgkJaCA9IGhbOmxlbihoKS0xXQoJfQoJcmV0dXJuIGgKfQoKLyogLS0tLSBwb2x5Z29uIGhlbHBlcnMgZm9yIHRoZSByZWFsaXNtIHBhc3NlcyAtLS0tICovCgovLyBwb2x5QXJlYSBpcyB0d2ljZSB0aGUgc2lnbmVkIGFyZWE7IHNpZ24gdGVsbHMgd2luZGluZy4KZnVuYyBwb2x5QXJlYShwcyBbXXB0KSBmbG9hdDY0IHsKCWEgOj0gMC4wCglmb3IgaSA6PSByYW5nZSBwcyB7CgkJaiA6PSAoaSArIDEpICUgbGVuKHBzKQoJCWEgKz0gcHNbaV0ueCpwc1tqXS55IC0gcHNbal0ueCpwc1tpXS55Cgl9CglpZiBhIDwgMCB7CgkJcmV0dXJuIC1hIC8gMgoJfQoJcmV0dXJuIGEgLyAyCn0KCi8vIGNsaXBIYWxmIGlzIG9uZSBTdXRoZXJsYW5kLUhvZGdtYW4gcGFzczoga2VlcHMgdGhlIHBhcnQgb2YgcHMgb24gdGhlCi8vIGlubmVyIHNpZGUgb2YgdGhlIGxpbmUgdGhyb3VnaCAob3gsb3kpIHdpdGggb3V0d2FyZCBub3JtYWwgKG54LG55KS4KZnVuYyBjbGlwSGFsZihwcyBbXXB0LCBveCwgb3ksIG54LCBueSBmbG9hdDY0KSBbXXB0IHsKCWlmIGxlbihwcykgPT0gMCB7CgkJcmV0dXJuIHBzCgl9CglkIDo9IGZ1bmMocSBwdCkgZmxvYXQ2NCB7IHJldHVybiAocS54LW94KSpueCArIChxLnktb3kpKm55IH0KCXZhciBvdXQgW11wdAoJZm9yIGkgOj0gcmFuZ2UgcHMgewoJCWEsIGIgOj0gcHNbaV0sIHBzWyhpKzEpJWxlbihwcyldCgkJZGEsIGRiIDo9IGQoYSksIGQoYikKCQlpZiBkYSA8PSAwIHsKCQkJb3V0ID0gYXBwZW5kKG91dCwgYSkKCQl9CgkJaWYgKGRhIDwgMCAmJiBkYiA+IDApIHx8IChkYSA+IDAgJiYgZGIgPCAwKSB7CgkJCXQgOj0gZGEgLyAoZGEgLSBkYikKCQkJb3V0ID0gYXBwZW5kKG91dCwgcHR7YS54ICsgKGIueC1hLngpKnQsIGEueSArIChiLnktYS55KSp0fSkKCQl9Cgl9CglyZXR1cm4gb3V0Cn0KCi8vIGNsaXBUb0NvbnZleCBrZWVwcyB0aGUgcGFydCBvZiBwcyBpbnNpZGUgdGhlIGNvbnZleCB3aW5kb3cgd2luLgpmdW5jIGNsaXBUb0NvbnZleChwcywgd2luIFtdcHQpIFtdcHQgewoJLy8gd2luIGZyb20gY29udmV4SHVsbCBpcyBjb3VudGVyLWNsb2Nrd2lzZSBpbiBzY3JlZW4gY29vcmRzOyB0aGUKCS8vIG91dHdhcmQgbm9ybWFsIG9mIGVkZ2UgKGEsYikgaXMgKGR5LC1keCkgcm90YXRlZCB0byBwb2ludCBhd2F5LgoJZm9yIGkgOj0gcmFuZ2Ugd2luIHsKCQlhLCBiIDo9IHdpbltpXSwgd2luWyhpKzEpJWxlbih3aW4pXQoJCW54LCBueSA6PSBiLnktYS55LCBhLngtYi54CgkJbWlkIDo9IHB0eyhhLnggKyBiLngpIC8gMiwgKGEueSArIGIueSkgLyAyfQoJCS8vIG1ha2UgdGhlIG5vcm1hbCBwb2ludCBvdXR3YXJkOiBhd2F5IGZyb20gdGhlIHdpbmRvdyBjZW50cmUKCQljeCwgY3kgOj0gY2VudHJvaWQod2luKQoJCWlmIChtaWQueC1jeCkqbngrKG1pZC55LWN5KSpueSA8IDAgewoJCQlueCwgbnkgPSAtbngsIC1ueQoJCX0KCQlwcyA9IGNsaXBIYWxmKHBzLCBhLngsIGEueSwgbngsIG55KQoJCWlmIGxlbihwcykgPCAzIHsKCQkJcmV0dXJuIG5pbAoJCX0KCX0KCXJldHVybiBwcwp9CgovLyBzcGxpdFBvbHkgY3V0cyBwcyBpbiB0d28gYWxvbmcgdGhlIGxpbmUgdGhyb3VnaCBpdHMgY2VudHJvaWQgYXQgYW5nLgpmdW5jIHNwbGl0UG9seShwcyBbXXB0LCBhbmcgZmxvYXQ2NCkgKFtdcHQsIFtdcHQpIHsKCWN4LCBjeSA6PSBjZW50cm9pZChwcykKCW54LCBueSA6PSBtYXRoLkNvcyhhbmcpLCBtYXRoLlNpbihhbmcpCglyZXR1cm4gY2xpcEhhbGYocHMsIGN4LCBjeSwgbngsIG55KSwgY2xpcEhhbGYocHMsIGN4LCBjeSwgLW54LCAtbnkpCn0KCi8vIHJlbmRlckdlbTNEIGJ1aWxkcyB0aGUgc3RvbmUuIFJldHVybnMgd2hhdCBnb2VzIHVuZGVyIHRoZSBmYWNldHMKLy8gKGRlZnMsIGJvZHkgZ2xvdywgdGhlIHBhdmlsaW9uJ3MgYmFjayBmYWNlcyksIHRoZSBmcm9udCBmYWNldHMgYXMgYmFyZQovLyBzZWxmLWNsb3NpbmcgcGF0aHMgKGFwcGx5Q2FzY2FkZSBzY2FucyB0aGVzZSksIGFuZCB3aGF0IGdvZXMgb3ZlcgovLyAoZ2lyZGxlIHN0cm9rZSwgcmltKS4KZnVuYyByZW5kZXJHZW0zRChzaGFwZUlkeCBpbnQsIGJhc2UsIHNhbHQgc3RyaW5nLCBmcyAqZmFjZXRTdHlsZSkgKHVuZGVyLCBmYWNldHMsIG92ZXIgc3RyaW5nKSB7CgljIDo9IGN1dEZvcihzaGFwZUlkeCkKCXZhciBmYWNlcyBbXWZhY2UKCXZhciBnaXJkbGUgW112MwoJc3dpdGNoIHNoYXBlSWR4IHsKCWNhc2Ugc2hhcGVSb3NlOgoJCWZhY2VzLCBnaXJkbGUgPSBidWlsZFJvc2UoYykKCWNhc2Ugc2hhcGVSYXc6CgkJZmFjZXMsIGdpcmRsZSA9IGJ1aWxkUmF3KGZzLnN0b25lKQoJZGVmYXVsdDoKCQlmYWNlcywgZ2lyZGxlID0gYnVpbGRDdXQoYykKCX0KCXJhdyA6PSBzaGFwZUlkeCA9PSBzaGFwZVJhdwoKCXNoIDo9IGZzLnByb2Yuc2hhZG93CglpZiBmcy5wcm9mLm5ldXRyYWwgIT0gIiIgewoJCWJhc2UgPSBmcy5wcm9mLm5ldXRyYWwKCX0KCWJhc2UgPSBtaXhIZXgoYmFzZSwgc2gsIGZzLnByb2YuYm9keU1peCkKCWRlZXAgOj0gZGFya2VuKGJhc2UsIHNoLCAwLjkpCgkvLyBIaWdobGlnaHRzIHN0YXkgaW4gdGhlIHN0b25lJ3MgaHVlOyBvbmx5IHRoZSBzcGVjdWxhciBnb2VzIHRvCgkvLyB3aGl0ZS4gTWl4aW5nIGZhY2V0cyBtb3N0IG9mIHRoZSB3YXkgdG8gd2hpdGUgaXMgd2hhdCByZWFkIHBhc3RlbC4KCWJyaWdodCA6PSBsaWdodGVuKGJhc2UsIDAuNSkKCWZzLmZsYXNoID0gZmxhc2hSYW1wKDI4LCBmcy5wcm9mLnNhdCkKCWRlZXBJLCBiYXNlSSwgYnJpZ2h0SSA6PSB0b1JHQkkoZGVlcCksIHRvUkdCSShiYXNlKSwgdG9SR0JJKGJyaWdodCkKCXRvbmVJIDo9IGZ1bmMobHVtIGZsb2F0NjQpIHJnYkkgewoJCWlmIGx1bSA8IDAgewoJCQlsdW0gPSAwCgkJfQoJCWlmIGx1bSA+IDEgewoJCQlsdW0gPSAxCgkJfQoJCWlmIGx1bSA8IDAuNSB7CgkJCXJldHVybiBtaXhJKGRlZXBJLCBiYXNlSSwgbHVtKjIpCgkJfQoJCXJldHVybiBtaXhJKGJhc2VJLCBicmlnaHRJLCAobHVtLTAuNSkqMikKCX0KCXRvbmUgOj0gZnVuYyhsdW0gZmxvYXQ2NCkgc3RyaW5nIHsgcmV0dXJuIHRvbmVJKGx1bSkuaGV4KCkgfQoKCS8vIHZpZXc6IGEgc21hbGwgcGVyLXRva2VuIHlhdywgdGhlbiB0aGUgdGlsdCB0b3dhcmQgdGhlIHZpZXdlcgoJeWF3IDo9IGZzLnpvbmUuZmxvYXRJbigtMTMsIDEzKSAqIG1hdGguUGkgLyAxODAKCXRoIDo9IGdlbVRpbHQgKiBtYXRoLlBpIC8gMTgwCgljeSwgc3kgOj0gbWF0aC5Db3MoeWF3KSwgbWF0aC5TaW4oeWF3KQoJY3QsIHN0dCA6PSBtYXRoLkNvcyh0aCksIG1hdGguU2luKHRoKQoJdmlldyA6PSBmdW5jKHAgdjMpIHYzIHsKCQl4MSwgeTEgOj0gcC54KmN5LXAueSpzeSwgcC54KnN5K3AueSpjeQoJCXJldHVybiB2M3t4MSwgeTEqY3QgKyBwLnoqc3R0LCBwLnoqY3QgLSB5MSpzdHR9Cgl9CgkvLyBDZW50cmUgZXZlcnkgc3RvbmUgb24gaXRzIG93biBkcmF3biBleHRlbnQsIG5vdCBvbiBpdHMgZ2VvbWV0cmljCgkvLyBvcmlnaW46IGEgcm9zZSBjdXQgaXMgYWxsIGRvbWUgYW5kIG5vIHBhdmlsaW9uLCBzbyBjZW50cmVkIG9uIGl0cwoJLy8gZ2lyZGxlIGl0IHNhdCBoaWdoIGluIHRoZSByaW5nOyByYXcgY3J5c3RhbHMgYW5kIHBlYXJzIGFyZSBsb3BzaWRlZAoJLy8gdGhlIHNhbWUgd2F5LiBUaGlzIHNoaWZ0cyB0aGUgZHJhd2luZyBvbmx5OyB0aGUgcm9jayBzdGlsbCBwaXZvdHMKCS8vIG9uIHRoZSByaW5nIGNlbnRyZS4KCWV4MCwgZXkwLCBleDEsIGV5MSA6PSAxZTksIDFlOSwgLTFlOSwgLTFlOQoJZm9yIF8sIGYgOj0gcmFuZ2UgZmFjZXMgewoJCWZvciBfLCBwIDo9IHJhbmdlIGYucCB7CgkJCXEgOj0gdmlldyhwKQoJCQlleDAsIGV5MCA9IG1hdGguTWluKGV4MCwgcS54KSwgbWF0aC5NaW4oZXkwLCBxLnkpCgkJCWV4MSwgZXkxID0gbWF0aC5NYXgoZXgxLCBxLngpLCBtYXRoLk1heChleTEsIHEueSkKCQl9Cgl9CglveCwgb3kgOj0gLShleDArZXgxKS8yLCAtKGV5MCtleTEpLzIKCXNjciA6PSBmdW5jKHAgdjMpIHB0IHsgcmV0dXJuIHB0e3N1YmpYICsgcC54ICsgb3gsIGdlbUNZIC0gKHAueSArIG95KX0gfQoJbGlnaHQgOj0gdm5vcm0odjN7LTAuNSwgMC42MiwgMC42fSkKCWluc2lkZSA6PSB2M3swLCAwLCAtMC4yNSAqIGMucnl9CglpZiByYXcgewoJCWluc2lkZSA9IHYze30KCX0gZWxzZSBpZiBzaGFwZUlkeCA9PSBzaGFwZVJvc2UgewoJCWluc2lkZSA9IHYzezAsIDAsIDAuMTUgKiBjLnJ5fQoJfQoKCXR5cGUgZHJhd24gc3RydWN0IHsKCQlwdHMgICBbXXB0CgkJZGVwdGggZmxvYXQ2NAoJCWZpbGwgIHN0cmluZwoJCWtpbmQgIGludAoJCWx1bSAgIGZsb2F0NjQKCQkvLyB3aGF0IHNoYWRlRnJvbnQgbmVlZHMgdG8gcmVsaWdodCB0aGlzIGZhY2V0IGZvciB0aGUgcm9jawoJCW52ICAgICAgICAgICAgICAgIHYzCgkJaml0LCBkcmlmdCwgdGhpY2sgZmxvYXQ2NAoJCWV4dCAgICAgICAgICAgICAgIGJvb2wKCX0KCS8vIHNoYWRlRnJvbnQgaXMgdGhlIGxpZ2h0aW5nIG9mIGEgZmFjZXQgc2VlbiBmcm9tIG91dHNpZGUsIGZvciBhCgkvLyBnaXZlbiBsaWdodCBkaXJlY3Rpb24uIEtlcHQgYXMgb25lIGZ1bmN0aW9uIHNvIHRoZSByb2NrIHN0YXRlcwoJLy8gKHNlZSBsaWdodFN0YXRlcyBiZWxvdykgYXJlIGxpdCBieSBleGFjdGx5IHRoZSBzYW1lIG1vZGVsLgoJc2hhZGVGcm9udCA6PSBmdW5jKGtpbmQgaW50LCBudiwgTCB2Mywgaml0LCBkcmlmdCwgdGhpY2sgZmxvYXQ2NCwgZXh0IGJvb2wpIChzdHJpbmcsIGZsb2F0NjQpIHsKCQlIIDo9IHZub3JtKHYze0wueCwgTC55LCBMLnogKyAxfSkKCQkvLyBBIHJlYWwgc3RvbmUgaXMgYSBjb250cmFzdCBwYXR0ZXJuLCBub3QgYW4gZXZlbmx5IGxpdCBzb2xpZDoKCQkvLyBsYW1iZXJ0IHdpdGggYSBnYW1tYSBzbyBtaWQgZmFjZXRzIHN0YXkgZGVlcCBhbmQgc2F0dXJhdGVkLAoJCS8vIHBsdXMgdGhlIG9kZCAiZXh0aW5jdGlvbiIgZmFjZXQgdGhhdCByZXR1cm5zIG5vIGxpZ2h0IGF0IGFsbC4KCQlsYW0gOj0gbWF0aC5NYXgoMCwgdmRvdChudiwgTCkpCgkJbHVtIDo9IDAuMDMgKyAwLjcqbWF0aC5Qb3cobGFtLCAyLjEpICsgaml0CgkJaWYgZXh0IHsKCQkJbHVtICo9IDAuMwoJCX0KCQlpZiBraW5kID09IGtUYWJsZSB7CgkJCWx1bSA9IDAuMzYgKyAwLjI2KmxhbQoJCX0KCQlpZiBraW5kID09IGtQYXYgewoJCQkvLyBBIHBhdmlsaW9uIGZhY2V0IHNlZW4gZnJvbSBvdXRzaWRlIGZhY2VzIGF3YXkgZnJvbSB0aGUKCQkJLy8gbGFtcCwgYnV0IGl0IGlzIHdoZXJlIGxpZ2h0IHRoYXQgZW50ZXJlZCB0aHJvdWdoIHRoZQoJCQkvLyBjcm93biBMRUFWRVMgdGhlIHN0b25lOiBsaXQgZnJvbSBpdHMgaW5uZXIgc2lkZS4KCQkJbHVtID0gMC4yMiArIDAuNSptYXRoLk1heCgwLCB2ZG90KHZzY2FsZShudiwgLTEpLCBMKSkgKyBqaXQKCQl9CgkJaWYgcmF3IHsKCQkJLy8gQSBuYXR1cmFsIGNyeXN0YWwgZmFjZSBpcyBub3QgcG9saXNoZWQsIGJ1dCB0b3BheiwgcXVhcnR6LAoJCQkvLyBzYXBwaGlyZSBhbmQgZGlhbW9uZCByb3VnaCBhbGwgaGF2ZSBhIGdsYXNzeSAodml0cmVvdXMgdG8KCQkJLy8gYWRhbWFudGluZSkgbHVzdHJlOiBmYWNlcyB0b3dhcmQgdGhlIGxhbXAgc2hpbmUgZnJvbQoJCQkvLyBvdXRzaWRlIGFzIHdlbGwgYXMgZ2xvd2luZyBmcm9tIGluc2lkZS4gTGl0IG9ubHkgZnJvbQoJCQkvLyBpbnNpZGUsIHRoZSBjcnlzdGFscyByZWFkIGFzIGR1bGwgcGxhc3RpYy4KCQkJbHVtID0gMC4zICsgMC40MiptYXRoLlBvdyhsYW0sIDEuNCkgKyAwLjIyKm1hdGguTWF4KDAsIHZkb3QodnNjYWxlKG52LCAtMSksIEwpKSArIGppdCowLjYKCQl9CgkJY29sIDo9IG1peEkodG9uZUkobHVtKSwgZGVlcEksIDAuMzQqdGhpY2sqdGhpY2spCgkJaWYgc3AgOj0gbWF0aC5Qb3cobWF0aC5NYXgoMCwgdmRvdChudiwgSCkpLCAyOCk7IHNwID4gMC4zIHsKCQkJY29sID0gbWl4SShjb2wsIHdoaXRlSSwgc3AqMC44NSkKCQl9CgkJLy8gRGlzcGVyc2lvbiBvbiB0aGUgYnJpZ2h0IGZhY2V0czogd2hpdGUgbGlnaHQgc3BsaXQgYnkgdGhlIHN0b25lCgkJLy8gbGVhdmVzIGVhY2ggZmFjZXQgaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgc3BlY3RyYWwgY29sb3VyLCBzZXQgYnkKCQkvLyB3aGljaCB3YXkgdGhlIGZhY2V0IGZhY2VzIChpdHMgYXppbXV0aCksIHNvIG5laWdoYm91cnMgZGlmZmVyCgkJLy8gdGhlIHdheSByZWFsIGZpcmUgZG9lcyBpbnN0ZWFkIG9mIGV2ZXJ5IGJyaWdodCBmYWNldCBiZWluZyBvbmUKCQkvLyBsaWdodGVyIHNoYWRlIG9mIHRoZSBib2R5LiBTY2FsZWQgYnkgdGhlIHN0b25lJ3Mgb3duIGRpc3BlcnNpb24KCQkvLyAocHJvZi5zYXQ6IGRpYW1vbmQgbW9zdCwgdG9wYXogbGVhc3QpIGFuZCBvbmx5IGFib3ZlIG1pZAoJCS8vIGJyaWdodG5lc3M7IGRhcmsgZmFjZXRzIGtlZXAgdGhlIGJvZHkgY29sb3VyLgoJCWlmIGx1bSA+IDAuNSAmJiBraW5kICE9IGtUYWJsZSB7CgkJCWFtdCA6PSBtYXRoLk1pbigxLCAobHVtLTAuNSkvMC40KSAqIGRpc3BlcnNpb25NaXggKiBmcy5wcm9mLnNhdAoJCQl0IDo9IG1hdGguQXRhbjIobnYueSwgbnYueCkvbWF0aC5QaSArIGRyaWZ0LzQwCgkJCWNvbCA9IG1peEkoY29sLCBzcGVjdHJ1bUF0SSh0KSwgYW10KQoJCX0KCQlyZXR1cm4gaGV4M0koaHVlUm90YXRlSShjb2wsIGRyaWZ0KSksIGx1bQoJfQoJdmFyIGJhY2ssIGZyb250LCBwYXYgW11kcmF3bgoJdmFyIGFsbCBbXXB0Cglmb3IgXywgZiA6PSByYW5nZSBmYWNlcyB7CgkJdnAgOj0gbWFrZShbXXYzLCBsZW4oZi5wKSkKCQljdHIgOj0gdjN7fQoJCWZvciBpLCBwIDo9IHJhbmdlIGYucCB7CgkJCXZwW2ldID0gdmlldyhwKQoJCQljdHIgPSB2M3tjdHIueCArIHAueCwgY3RyLnkgKyBwLnksIGN0ci56ICsgcC56fQoJCX0KCQljdHIgPSB2c2NhbGUoY3RyLCAxL2Zsb2F0NjQobGVuKGYucCkpKQoJCS8vIE5ld2VsbCdzIG5vcm1hbCwgbm90IGEgY3Jvc3MgcHJvZHVjdCBvZiB0aGUgZmlyc3QgdGhyZWUgcG9pbnRzOgoJCS8vIFByaW5jZXNzIEN1dCdzIHRhYmxlIGhhcyB0aHJlZSBjb2xsaW5lYXIgY29ybmVycyB0aGVyZSwgd2hpY2gKCQkvLyBnYXZlIGEgemVybyBub3JtYWwgYW5kIGRyb3BwZWQgaXRzIHRhYmxlIGZhY2UgZW50aXJlbHkuCgkJbm0gOj0gdjN7fQoJCWZvciBpIDo9IHJhbmdlIGYucCB7CgkJCWEsIGIgOj0gZi5wW2ldLCBmLnBbKGkrMSklbGVuKGYucCldCgkJCW5tID0gdjN7bm0ueCArIChhLnktYi55KSooYS56K2IueiksIG5tLnkgKyAoYS56LWIueikqKGEueCtiLngpLCBubS56ICsgKGEueC1iLngpKihhLnkrYi55KX0KCQl9CgkJbm0gPSB2bm9ybShubSkKCQlpZiB2ZG90KG5tLCB2c3ViKGN0ciwgaW5zaWRlKSkgPCAwIHsKCQkJbm0gPSB2c2NhbGUobm0sIC0xKQoJCX0KCQludiA6PSB2bm9ybSh2aWV3KG5tKSkKCQlkIDo9IGRyYXdue2tpbmQ6IGYua2luZH0KCQlmb3IgXywgcCA6PSByYW5nZSB2cCB7CgkJCWQucHRzID0gYXBwZW5kKGQucHRzLCBzY3IocCkpCgkJCWQuZGVwdGggKz0gcC56CgkJCWFsbCA9IGFwcGVuZChhbGwsIHNjcihwKSkKCQl9CgkJZC5kZXB0aCAvPSBmbG9hdDY0KGxlbih2cCkpCgkJLy8gSG93IG11Y2ggc3RvbmUgdGhlIGxpZ2h0IGNyb3NzZXMgdW5kZXIgdGhpcyBmYWNldDogdGhlIHNvbGlkIGlzCgkJLy8gdGhpY2tlc3Qgb3ZlciB0aGUgYXhpcyBhbmQgdGhpbnMgdG8gbm90aGluZyBhdCB0aGUgZ2lyZGxlLCBzbyBhCgkJLy8gZmFjZXQgbmVhciB0aGUgY2VudHJlIHNob3dzIG1vcmUgb2YgdGhlIGJvZHkgY29sb3VyIChCZWVyLUxhbWJlcnQsCgkJLy8gdGhlIHJlYXNvbiBhIGRlZXAgc3RvbmUgcmVhZHMgZGFya2VyIGFuZCBtb3JlIHNhdHVyYXRlZCB0aGFuIGEKCQkvLyBzaGFsbG93IG9uZSkuIENvc3RzIG5vIGV4dHJhIG1hcmt1cCAtLSBpdCBvbmx5IHNoaWZ0cyB0aGUgZmlsbC4KCQlyTiA6PSBtYXRoLlNxcnQoKGN0ci54L2MucngpKihjdHIueC9jLnJ4KSArIChjdHIueS9jLnJ5KSooY3RyLnkvYy5yeSkpCgkJaWYgck4gPiAxIHsKCQkJck4gPSAxCgkJfQoJCXRoaWNrIDo9IDEgLSByTgoJCWppdCA6PSBmcy56b25lLmZsb2F0SW4oLTAuMTMsIDAuMTMpCgkJaWYgbnYueiA+IDAuMDIgewoJCQlleHQgOj0gZi5raW5kID09IGtDcm93biAmJiBmcy56b25lLmZsb2F0SW4oMCwgMSkgPCAwLjI4CgkJCWRyaWZ0IDo9IGZzLnpvbmUuZmxvYXRJbigtZmlyZVpvbmVEZWcsIGZpcmVab25lRGVnKQoJCQlkLm52LCBkLmppdCwgZC5kcmlmdCwgZC50aGljaywgZC5leHQgPSBudiwgaml0LCBkcmlmdCwgdGhpY2ssIGV4dAoJCQlkLmZpbGwsIGQubHVtID0gc2hhZGVGcm9udChmLmtpbmQsIG52LCBsaWdodCwgaml0LCBkcmlmdCwgdGhpY2ssIGV4dCkKCQkJZnJvbnQgPSBhcHBlbmQoZnJvbnQsIGQpCgkJCWlmIGYua2luZCA9PSBrUGF2IHsKCQkJCXBhdiA9IGFwcGVuZChwYXYsIGQpCgkJCX0KCQl9IGVsc2UgaWYgZi5raW5kID09IGtQYXYgewoJCQkvLyBzZWVuIGZyb20gaW5zaWRlIHRocm91Z2ggdGhlIGNyb3duOiBsaXQgb24gaXRzIGlubmVyIHNpZGUKCQkJaW5uZXIgOj0gdnNjYWxlKG52LCAtMSkKCQkJbHVtIDo9IDAuMiArIDAuNiptYXRoLk1heCgwLCB2ZG90KGlubmVyLCBsaWdodCkpICsgaml0CgkJCWQuZmlsbCA9IGhleDMobWl4SGV4KHRvbmUobHVtKSwgZGVlcCwgMC4zNCp0aGljayp0aGljaykpCgkJCWQubHVtID0gbHVtCgkJCWJhY2sgPSBhcHBlbmQoYmFjaywgZCkKCQkJcGF2ID0gYXBwZW5kKHBhdiwgZCkKCQl9Cgl9Cglzb3J0RHJhd24gOj0gZnVuYyhkcyBbXWRyYXduKSB7CgkJZm9yIGkgOj0gMTsgaSA8IGxlbihkcyk7IGkrKyB7CgkJCWZvciBqIDo9IGk7IGogPiAwICYmIGRzW2pdLmRlcHRoIDwgZHNbai0xXS5kZXB0aDsgai0tIHsKCQkJCWRzW2pdLCBkc1tqLTFdID0gZHNbai0xXSwgZHNbal0KCQkJfQoJCX0KCX0KCXNvcnREcmF3bihiYWNrKQoJc29ydERyYXduKGZyb250KQoKCWh1bGwgOj0gY29udmV4SHVsbChhbGwpCglpZiBzaGFwZUlkeCA9PSBzaGFwZUhlYXJ0IHsKCQkvLyB0aGUgbm90Y2g6IGEgaHVsbCB3b3VsZCBmaWxsIGl0OyB0aGUgZ2lyZGxlIHJpbmcgaXMgdGhlIG91dGxpbmUKCQlodWxsID0gbmlsCgkJZm9yIF8sIGcgOj0gcmFuZ2UgZ2lyZGxlIHsKCQkJaHVsbCA9IGFwcGVuZChodWxsLCBzY3IodmlldyhnKSkpCgkJfQoJfQoJLy8gc3RyaW5ncy5CdWlsZGVyLCBub3QgKz06IGFwcGVuZGluZyB0byBhIGdyb3dpbmcgc3RyaW5nIHJlLWNvcGllcyBpdAoJLy8gZXZlcnkgdGltZSwgYW5kIG9uLWNoYWluIHRoYXQgY29weWluZyB3YXMgdGhlIGJ1bGsgb2YgYSByZW5kZXIncyBnYXMKCXZhciB1bmRlckIsIGZhY2V0c0Igc3RyaW5ncy5CdWlsZGVyCgl1bmRlckIuV3JpdGVTdHJpbmcoYDxkZWZzPjxyYWRpYWxHcmFkaWVudCBpZD0iYmRgICsgc2FsdCArIGAiIGN4PSIuNCIgY3k9Ii4zNSIgcj0iLjc1Ij5gICsKCQlgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSJgICsgaGV4MyhiYXNlKSArIGAiLz48c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSJgICsgaGV4MyhkYXJrZW4oYmFzZSwgc2gsIDAuMjUpKSArIGAiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9ImAgKyBoZXgzKGRhcmtlbihiYXNlLCBzaCwgMC44NSkpICsgYCIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPmAgKwoJCWA8cGF0aCBkPSJgICsgcmVsUGF0aChodWxsKSArIGAiIGZpbGw9InVybCgjYmRgICsgc2FsdCArIGApIiBvcGFjaXR5PSIuNyIvPjxnIGZpbGwtb3BhY2l0eT0iLjYiPmApCglmb3IgXywgZCA6PSByYW5nZSBiYWNrIHsKCQl1bmRlckIuV3JpdGVTdHJpbmcoYDxwYXRoIGQ9ImAgKyByZWxQYXRoKGQucHRzKSArIGAiIGZpbGw9ImAgKyBkLmZpbGwgKyBgIi8+YCkKCX0KCXVuZGVyQi5Xcml0ZVN0cmluZyhgPC9nPmApCgoJbkNyb3duIDo9IDAKCWZvciBfLCBkIDo9IHJhbmdlIGZyb250IHsKCQlpZiBkLmtpbmQgPT0ga0Nyb3duIHsKCQkJbkNyb3duKysKCQl9Cgl9CgljYW5kUCA6PSAxLjAKCWlmIG5Dcm93biA+IGZpcmVNYXhGYWNldHMgewoJCWNhbmRQID0gZmxvYXQ2NChmaXJlTWF4RmFjZXRzKSAvIGZsb2F0NjQobkNyb3duKSAqIDEuMjUKCX0KCW5DYW5kIDo9IDAKCW5TcGxpdCA6PSAwCglpZiByYXcgfHwgZnMudGh1bWIgewoJCS8vIHJvdWdoIGNyeXN0YWw6IG5vIGZpcmUgZmxhc2hlcywgbm8gc3BsaXQgZmFjZXRzIC0tIGEgbmF0dXJhbAoJCS8vIGZhY2UgaXMgb25lIGZyb3N0ZWQgcGxhbmUuIEEgdGh1bWJuYWlsOiBubyBmbGFzaGVzIGVpdGhlci4KCQljYW5kUCA9IDAKCX0KCWZvciBfLCBkIDo9IHJhbmdlIGZyb250IHsKCQlpZiBkLmtpbmQgPT0ga1RhYmxlICYmIHNoYXBlSWR4ID09IHNoYXBlSGVhcnQgewoJCQkvLyBhIG5vbi1jb252ZXggd2luZG93OiBza2lwIHRoZSByZWZsZWN0ZWQgbW9zYWljLCB3aGljaCBpcwoJCQkvLyBjbGlwcGVkIHRvIGEgY29udmV4IG91dGxpbmUgYW5kIHdvdWxkIHNwaWxsIGludG8gdGhlIG5vdGNoCgkJCWZhY2V0c0IuV3JpdGVTdHJpbmcoYDxwYXRoIGQ9ImAgKyByZWxQYXRoKGQucHRzKSArIGAiIGZpbGw9ImAgKyBkLmZpbGwgKyBgIiBmaWxsLW9wYWNpdHk9Ii40NiIvPmApCgkJCWNvbnRpbnVlCgkJfQoJCWlmIGQua2luZCA9PSBrVGFibGUgewoJCQkvLyBUaGUgd2luZG93LiBUaHJvdWdoIGl0IHlvdSBkbyBub3Qgc2VlIHRoZSBwYXZpbGlvbidzIG93bgoJCQkvLyBmYWNlcyBzdHJhaWdodCBvbiAtLSB5b3Ugc2VlIHRoZW0gbWlycm9yZWQgYmFjayB1cCBhdCB5b3Ugb2ZmCgkJCS8vIHRoZSBwYXZpbGlvbiB3YWxscywgc21hbGwgYW5kIGludmVydGVkLiBUaGF0IG1vc2FpYyBpcyB3aGF0IGEKCQkJLy8gcmVhbCB0YWJsZSBzaG93cywgc28gaXQgaXMgZHJhd24gaGVyZTogZWFjaCBwYXZpbGlvbiBmYWNlIG1hcHBlZAoJCQkvLyBpbnRvIHRoZSB0YWJsZSwgZmxpcHBlZCwgYW5kIGN1dCB0byB0aGUgdGFibGUncyBvdXRsaW5lIChhCgkJCS8vIFN1dGhlcmxhbmQtSG9kZ21hbiBjbGlwLCBubyA8Y2xpcFBhdGg+KS4KCQkJZmFjZXRzQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoZC5wdHMpICsgYCIgZmlsbD0iYCArIGQuZmlsbCArIGAiIGZpbGwtb3BhY2l0eT0iLjQ2Ii8+YCkKCQkJd2luIDo9IGNvbnZleEh1bGwoZC5wdHMpCgkJCXR4LCB0eSA6PSBjZW50cm9pZCh3aW4pCgkJCWlmIGxlbihwYXYpID4gMCAmJiAhZnMudGh1bWIgewoJCQkJYngwLCBieTAsIGJ4MSwgYnkxIDo9IDFlOSwgMWU5LCAtMWU5LCAtMWU5CgkJCQlmb3IgXywgYiA6PSByYW5nZSBwYXYgewoJCQkJCWZvciBfLCBxIDo9IHJhbmdlIGIucHRzIHsKCQkJCQkJYngwLCBieTAgPSBtYXRoLk1pbihieDAsIHEueCksIG1hdGguTWluKGJ5MCwgcS55KQoJCQkJCQlieDEsIGJ5MSA9IG1hdGguTWF4KGJ4MSwgcS54KSwgbWF0aC5NYXgoYnkxLCBxLnkpCgkJCQkJfQoJCQkJfQoJCQkJd3gwLCB3eTAsIHd4MSwgd3kxIDo9IDFlOSwgMWU5LCAtMWU5LCAtMWU5CgkJCQlmb3IgXywgcSA6PSByYW5nZSB3aW4gewoJCQkJCXd4MCwgd3kwID0gbWF0aC5NaW4od3gwLCBxLngpLCBtYXRoLk1pbih3eTAsIHEueSkKCQkJCQl3eDEsIHd5MSA9IG1hdGguTWF4KHd4MSwgcS54KSwgbWF0aC5NYXgod3kxLCBxLnkpCgkJCQl9CgkJCQlrIDo9IDAuOTIgKiBtYXRoLk1pbigod3gxLXd4MCkvbWF0aC5NYXgoMSwgYngxLWJ4MCksICh3eTEtd3kwKS9tYXRoLk1heCgxLCBieTEtYnkwKSkKCQkJCWJ4LCBieSA6PSAoYngwK2J4MSkvMiwgKGJ5MCtieTEpLzIKCQkJCXZhciBtb3NCIHN0cmluZ3MuQnVpbGRlcgoJCQkJblJlZmwgOj0gMAoJCQkJZm9yIF8sIGIgOj0gcmFuZ2UgcGF2IHsKCQkJCQlpZiBuUmVmbCA+PSA4IHsKCQkJCQkJYnJlYWsKCQkJCQl9CgkJCQkJbXAgOj0gbWFrZShbXXB0LCBsZW4oYi5wdHMpKQoJCQkJCWZvciBpLCBxIDo9IHJhbmdlIGIucHRzIHsKCQkJCQkJbXBbaV0gPSBwdHt0eCArIChxLngtYngpKmssIHR5IC0gKHEueS1ieSkqa30KCQkJCQl9CgkJCQkJY2wgOj0gY2xpcFRvQ29udmV4KG1wLCB3aW4pCgkJCQkJaWYgbGVuKGNsKSA8IDMgfHwgcG9seUFyZWEoY2wpIDwgNCB7CgkJCQkJCWNvbnRpbnVlCgkJCQkJfQoJCQkJCW5SZWZsKysKCQkJCQltb3NCLldyaXRlU3RyaW5nKGA8cGF0aCBkPSJgICsgcmVsUGF0aChjbCkgKyBgIiBmaWxsPSJgICsgaGV4Myh0b25lKGIubHVtKjAuOTUpKSArIGAiLz5gKQoJCQkJfQoJCQkJaWYgbW9zQi5MZW4oKSA+IDAgewoJCQkJCWZhY2V0c0IuV3JpdGVTdHJpbmcoYDxnIGZpbGwtb3BhY2l0eT0iLjU1Ij5gICsgbW9zQi5TdHJpbmcoKSArIGA8L2c+YCkKCQkJCX0KCQkJfQoJCQljb250aW51ZQoJCX0KCQkvLyBPbmx5IHNvbWUgY3Jvd24gZmFjZXRzIGNhbiBmbGFzaCAoZmlyZU1heEZhY2V0cyk6IGV2ZXJ5IG9uZSB0aGF0CgkJLy8gY2FuIGNvc3RzIGFuIG92ZXJsYXkgcGF0aCwgc28gdGhlIHNldCBpcyBib3VuZGVkIHBlciBzdG9uZS4KCQlpZiBkLmtpbmQgPT0ga0Nyb3duICYmIG5DYW5kIDwgZmlyZU1heEZhY2V0cyAmJiBmcy56b25lLmZsb2F0SW4oMCwgMSkgPCBjYW5kUCB7CgkJCW5DYW5kKysKCQkJY3gsIGN5eSA6PSBjZW50cm9pZChkLnB0cykKCQkJZnMucmluZ0NlbnQgPSBhcHBlbmQoZnMucmluZ0NlbnQsIHB0e2N4LCBjeXl9KQoJCQlmYWNldHNCLldyaXRlU3RyaW5nKGA8cGF0aCBkPSJgICsgcmVsUGF0aChkLnB0cykgKyBgIiBmaWxsPSJgICsgZC5maWxsICsgYCIgY2xhc3M9ImYiLz5gKQoJCQljb250aW51ZQoJCX0KCQkvLyBUd28tdG9uZSBmYWNldHM6IGEgcmVhbCBmYWNldCByYXJlbHkgcmVmbGVjdHMgb25lIHRoaW5nLiBQYXJ0IG9mCgkJLy8gaXQgY2F0Y2hlcyB0aGUgbGFtcCwgdGhlIHJlc3QgY2F0Y2hlcyB0aGUgZGFyayByb29tLCBhbmQgdGhlCgkJLy8gYm91bmRhcnkgaXMgYSBzdHJhaWdodCBsaW5lIGFjcm9zcyB0aGUgZmFjZXQuIFNwbGl0IGEgYm91bmRlZAoJCS8vIG51bWJlciBvZiB0aGUgbGFyZ2VyIG9uZXMgKGVhY2ggc3BsaXQgY29zdHMgb25lIGV4dHJhIHBhdGgpLgoJCWlmICFyYXcgJiYgblNwbGl0IDwgNiAmJiBwb2x5QXJlYShkLnB0cykgPiAyNiAmJiBmcy56b25lLmZsb2F0SW4oMCwgMSkgPCAwLjUgewoJCQlhLCBiIDo9IHNwbGl0UG9seShkLnB0cywgZnMuem9uZS5mbG9hdEluKDAsIG1hdGguUGkpKQoJCQlpZiBsZW4oYSkgPj0gMyAmJiBsZW4oYikgPj0gMyB7CgkJCQluU3BsaXQrKwoJCQkJbG8gOj0gaGV4MyhtaXhIZXgodG9uZShtYXRoLk1heCgwLCBkLmx1bSowLjYtMC4wNCkpLCBkZWVwLCAwLjE4KSkKCQkJCWhpIDo9IGhleDModG9uZShtYXRoLk1pbigxLCBkLmx1bSoxLjM1KzAuMDYpKSkKCQkJCWZhY2V0c0IuV3JpdGVTdHJpbmcoYDxwYXRoIGQ9ImAgKyByZWxQYXRoKGEpICsgYCIgZmlsbD0iYCArIGhpICsgYCIvPjxwYXRoIGQ9ImAgKyByZWxQYXRoKGIpICsgYCIgZmlsbD0iYCArIGxvICsgYCIvPmApCgkJCQljb250aW51ZQoJCQl9CgkJfQoJCWZhY2V0c0IuV3JpdGVTdHJpbmcoYDxwYXRoIGQ9ImAgKyByZWxQYXRoKGQucHRzKSArIGAiIGZpbGw9ImAgKyBkLmZpbGwgKyBgIi8+YCkKCX0KCgkvLyBMaWdodGluZyB0aGF0IGZvbGxvd3MgdGhlIHJvY2suIFRoZSBzdG9uZSBzd2luZ3MgdG8gLXJvdCBhbmQgK3JvdAoJLy8gKG1vdGlvblBoYXNlcyk7IHJlbGF0aXZlIHRvIHRoZSBzdG9uZSB0aGF0IHR1cm5zIHRoZSBsYW1wIHRoZSBvdGhlcgoJLy8gd2F5LCBzbyBldmVyeSBmYWNldCBtZWV0cyB0aGUgbGlnaHQgYXQgYSBuZXcgYW5nbGUgYW5kIHRoZXkgYWxsCgkvLyBjaGFuZ2UgdG9nZXRoZXIuIEZvciBlYWNoIHN3aW5nIHRoZSBmYWNldHMgdGhhdCBjaGFuZ2UgbW9zdCBnZXQgYQoJLy8gY29weSBpbiB0aGVpciBuZXcgc2hhZGUsIGdyb3VwZWQsIGFuZCB0aGUgZ3JvdXAgZmFkZXMgaW4gd2l0aCB0aGUKCS8vIHN3aW5nIChndC1sYSAvIGd0LWxiIGluIHN0eWxlQmxvY2ssIHRpbWVkIG9mZiB0aGUgcm9jaydzIG93bgoJLy8gZHVyYXRpb24gYW5kIGRlbGF5LCB3aGljaCB0aGUgZ3JvdXAgaW5oZXJpdHMgZnJvbSAuZ3QtcikuIE9ubHkKCS8vIGdyb3VwIG9wYWNpdHkgYW5pbWF0ZXMgLS0gbm8gcGVyLWZhY2V0IGNvbG91ciBhbmltYXRpb24sIHdoaWNoIGlzCgkvLyB3aGF0IGtlZXBzIGl0IHNtb290aCBpbiBTYWZhcmkuIFRoZSBsYW1wIHR1cm5zIGxpZ2h0U3dpbmcgdGltZXMgdGhlCgkvLyByb2NrIGFuZ2xlOiBhIHJlYWwgc3RvbmUgZmxhc2hlcyBoYXJkIG9uIGEgdGlueSBtb3ZlbWVudCwgYW5kIGF0IDF4CgkvLyBhIDQtOCBkZWdyZWUgcm9jayBiYXJlbHkgbW92ZXMgdGhlIHNoYWRpbmcuCglfLCBfLCBfLCBfLCByb3REZWcgOj0gbW90aW9uUGhhc2VzKHNhbHQpCgl0eXBlIGNhbmQgc3RydWN0IHsKCQlpICAgICBpbnQKCQlmaWxsICBzdHJpbmcKCQlkZWx0YSBmbG9hdDY0Cgl9Cglmb3Igc2ksIHNnbiA6PSByYW5nZSBbXWZsb2F0NjR7MSwgLTF9IHsKCQlpZiBmcy50aHVtYiB7CgkJCWJyZWFrCgkJfQoJCS8vIHJvdGF0ZSgtcm90KSBpbiBTVkcgKHkgZG93bikgaXMgYSB2aXN1YWwgY291bnRlci1jbG9ja3dpc2UgdHVybiwKCQkvLyB3aGljaCBpbiB0aGlzIHktdXAgdmlldyBzcGFjZSB0dXJucyB0aGUgc3RvbmUgK3JvdCwgaS5lLiB0aGUKCQkvLyBsYW1wIC1yb3QgcmVsYXRpdmUgdG8gaXQKCQlhIDo9IC1zZ24gKiByb3REZWcgKiBsaWdodFN3aW5nICogbWF0aC5QaSAvIDE4MAoJCWNhLCBzYSA6PSBtYXRoLkNvcyhhKSwgbWF0aC5TaW4oYSkKCQlMIDo9IHZub3JtKHYze2xpZ2h0LngqY2EgLSBsaWdodC55KnNhLCBsaWdodC54KnNhICsgbGlnaHQueSpjYSwgbGlnaHQuen0pCgkJdmFyIGNzIFtdY2FuZAoJCWZvciBpLCBkIDo9IHJhbmdlIGZyb250IHsKCQkJaWYgZC5raW5kID09IGtUYWJsZSB7CgkJCQljb250aW51ZQoJCQl9CgkJCWYyLCBfIDo9IHNoYWRlRnJvbnQoZC5raW5kLCBkLm52LCBMLCBkLmppdCwgZC5kcmlmdCwgZC50aGljaywgZC5leHQpCgkJCWlmIGRsIDo9IGx1bWFEZWx0YShmMiwgZC5maWxsKTsgZGwgPiAwLjA2ICYmIHBvbHlBcmVhKGQucHRzKSA+IDMgewoJCQkJY3MgPSBhcHBlbmQoY3MsIGNhbmR7aSwgZjIsIGRsfSkKCQkJfQoJCX0KCQkvLyBzdHJvbmdlc3QgY2hhbmdlcyBmaXJzdDsgaW5zZXJ0aW9uIHNvcnQsIHRoZSBsaXN0IGlzIHNob3J0CgkJZm9yIGkgOj0gMTsgaSA8IGxlbihjcyk7IGkrKyB7CgkJCWZvciBqIDo9IGk7IGogPiAwICYmIGNzW2pdLmRlbHRhID4gY3Nbai0xXS5kZWx0YTsgai0tIHsKCQkJCWNzW2pdLCBjc1tqLTFdID0gY3Nbai0xXSwgY3Nbal0KCQkJfQoJCX0KCQlpZiBsZW4oY3MpID4gbGlnaHRNYXhGYWNldHMgewoJCQljcyA9IGNzWzpsaWdodE1heEZhY2V0c10KCQl9CgkJaWYgbGVuKGNzKSA9PSAwIHsKCQkJY29udGludWUKCQl9CgkJY2xzIDo9ICJndC1sYSIKCQlpZiBzaSA9PSAxIHsKCQkJY2xzID0gImd0LWxiIgoJCX0KCQlmYWNldHNCLldyaXRlU3RyaW5nKGA8ZyBjbGFzcz0iYCArIGNscyArIGAiIG9wYWNpdHk9IjAiPmApCgkJZm9yIF8sIGMgOj0gcmFuZ2UgY3MgewoJCQlmYWNldHNCLldyaXRlU3RyaW5nKGA8cGF0aCBkPSJgICsgcmVsUGF0aChmcm9udFtjLmldLnB0cykgKyBgIiBmaWxsPSJgICsgYy5maWxsICsgYCIvPmApCgkJfQoJCWZhY2V0c0IuV3JpdGVTdHJpbmcoYDwvZz5gKQoJfQoKCS8vIGdpcmRsZTogdGhlIG5lYXIgaGFsZiBvZiB0aGUgcmluZyBhcyBvbmUgZnJvc3RlZCBzdHJva2UKCWdkLCBsYXN0RyA6PSAiIiwgIiIKCWZvciBpIDo9IHJhbmdlIGdpcmRsZSB7CgkJYSwgYiA6PSB2aWV3KGdpcmRsZVtpXSksIHZpZXcoZ2lyZGxlWyhpKzEpJWxlbihnaXJkbGUpXSkKCQltaWQgOj0gdnNjYWxlKHYze2dpcmRsZVtpXS54ICsgZ2lyZGxlWyhpKzEpJWxlbihnaXJkbGUpXS54LCBnaXJkbGVbaV0ueSArIGdpcmRsZVsoaSsxKSVsZW4oZ2lyZGxlKV0ueSwgMH0sIDAuNSkKCQlpZiB2aWV3KHZub3JtKG1pZCkpLnotMCA+IC0wLjA1ICYmIHZpZXcobWlkKS56ID49IHZpZXcodjN7fSkuei0wLjAxIHsKCQkJcGEsIHBiIDo9IHNjcihhKSwgc2NyKGIpCgkJCS8vIGNvbnNlY3V0aXZlIHNlZ21lbnRzIHNoYXJlIGFuIGVuZCBwb2ludDogY29udGludWUgdGhlCgkJCS8vIHBvbHlsaW5lIGluc3RlYWQgb2YgYSBmcmVzaCBNLi4uTCBwYWlyIHBlciBzZWdtZW50CgkJCXNhIDo9IG4xKHBhLngpICsgIiAiICsgbjEocGEueSkKCQkJaWYgc2EgIT0gbGFzdEcgewoJCQkJZ2QgKz0gIk0iICsgc2EKCQkJfQoJCQlsYXN0RyA9IG4xKHBiLngpICsgIiAiICsgbjEocGIueSkKCQkJZ2QgKz0gIiAiICsgbGFzdEcKCQl9Cgl9CgkvLyBUaGUgZ2lyZGxlIGlzIGEgZmFpbnQgbGluZSBpbiB0aGUgc3RvbmUncyBvd24gdG9uZSwgbm90IGEgbGlnaHQKCS8vIGVkZ2UsIGFuZCB0aGVyZSBpcyBubyBvdXRsaW5lIHN0cm9rZTogYSBkcmF3biByaW0gcmVhZHMgYXMgYQoJLy8gc3RpY2tlciBib3JkZXIsIHJlYWwgc3RvbmVzIGVuZCB3aGVyZSB0aGVpciBmYWNldHMgZW5kLgoJb3ZlciA9IGA8cGF0aCBkPSJgICsgZ2QgKyBgIiBmaWxsPSJub25lIiBzdHJva2U9ImAgKyBoZXgzKGxpZ2h0ZW4oYmFzZSwgMC4xOCkpICsgYCIgc3Ryb2tlLXdpZHRoPSIuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBvcGFjaXR5PSIuNCIvPmAKCXJldHVybiB1bmRlckIuU3RyaW5nKCksIGZhY2V0c0IuU3RyaW5nKCksIG92ZXIKfQoKLy8gZGlzcGVyc2lvbk1peCBpcyB0aGUgbW9zdCBhIGJyaWdodCBmYWNldCBpcyB0aW50ZWQgdG93YXJkIGl0cyBzcGVjdHJhbAovLyBjb2xvdXIgKGZvciBhIHN0b25lIHdpdGggcHJvZi5zYXQgMSwgaS5lLiBkaWFtb25kKS4KY29uc3QgZGlzcGVyc2lvbk1peCA9IDAuMzIKCnZhciBzcGVjdHJ1bSA9IFtdc3RyaW5neyIjZmY0MDQwIiwgIiNmZjlhMWYiLCAiI2ZmZTgxZiIsICIjMzVmZjdhIiwgIiMyMmNjZmYiLCAiIzU1NjZmZiIsICIjYzA0ZGZmIn0KCnZhciBzcGVjdHJ1bUkgPSBmdW5jKCkgW11yZ2JJIHsKCW91dCA6PSBtYWtlKFtdcmdiSSwgbGVuKHNwZWN0cnVtKSkKCWZvciBpLCBoIDo9IHJhbmdlIHNwZWN0cnVtIHsKCQlvdXRbaV0gPSB0b1JHQkkoaCkKCX0KCXJldHVybiBvdXQKfSgpCgpmdW5jIHNwZWN0cnVtQXRJKHQgZmxvYXQ2NCkgcmdiSSB7Cgl0ID0gdCAtIG1hdGguRmxvb3IodCkKCWYgOj0gdCAqIGZsb2F0NjQobGVuKHNwZWN0cnVtSSkpCglpIDo9IGludChmKQoJcmV0dXJuIG1peEkoc3BlY3RydW1JW2klbGVuKHNwZWN0cnVtSSldLCBzcGVjdHJ1bUlbKGkrMSklbGVuKHNwZWN0cnVtSSldLCBmLWZsb2F0NjQoaSkpCn0KCi8vIHNwZWN0cnVtQXQgcmV0dXJucyB0aGUgc3BlY3RyYWwgY29sb3VyIGF0IHQsIHdyYXBwaW5nIGV2ZXJ5IDEuMCAoc28KLy8gZmFjZXRzIGZhY2luZyBvcHBvc2l0ZSB3YXlzIGdldCB0aGUgc2FtZSBodWUsIGFzIGEgc3ltbWV0cmljIGN1dCBkb2VzKS4KZnVuYyBzcGVjdHJ1bUF0KHQgZmxvYXQ2NCkgc3RyaW5nIHsKCXQgPSB0IC0gbWF0aC5GbG9vcih0KQoJZiA6PSB0ICogZmxvYXQ2NChsZW4oc3BlY3RydW0pKQoJaSA6PSBpbnQoZikKCXJldHVybiBtaXhIZXgoc3BlY3RydW1baSVsZW4oc3BlY3RydW0pXSwgc3BlY3RydW1bKGkrMSklbGVuKHNwZWN0cnVtKV0sIGYtZmxvYXQ2NChpKSkKfQoKLy8gbGlnaHRTd2luZyBpcyBob3cgZmFyIHRoZSBsYW1wIHR1cm5zIHBlciBkZWdyZWUgb2Ygcm9jaywgYW5kCi8vIGxpZ2h0TWF4RmFjZXRzIGhvdyBtYW55IGZhY2V0cyBwZXIgc3dpbmcgZ2V0IGEgcmVsaXQgY29weSAoZWFjaCBjb3N0cwovLyBvbmUgcGF0aCwgfjYwIGJ5dGVzKS4KY29uc3QgKAoJbGlnaHRTd2luZyAgICAgPSAyLjIKCWxpZ2h0TWF4RmFjZXRzID0gMTIKKQoKLy8gbHVtYURlbHRhIGlzIHRoZSBwZXJjZWl2ZWQgYnJpZ2h0bmVzcyBkaWZmZXJlbmNlIG9mIHR3byBoZXggY29sb3VycywKLy8gMC4uMS4KZnVuYyBsdW1hRGVsdGEoYSwgYiBzdHJpbmcpIGZsb2F0NjQgewoJLy8gZmFjZXQgZmlsbHMgYXJlICNyZ2IgKGhleDMpOyB3aWRlbiB0byAjcnJnZ2JiIGZvciBoZXhUb1JHQgoJd2lkZSA6PSBmdW5jKGggc3RyaW5nKSBzdHJpbmcgewoJCWlmIGxlbihoKSA9PSA0IHsKCQkJcmV0dXJuICIjIiArIGhbMToyXSArIGhbMToyXSArIGhbMjozXSArIGhbMjozXSArIGhbMzo0XSArIGhbMzo0XQoJCX0KCQlyZXR1cm4gaAoJfQoJYXIsIGFnLCBhYiA6PSBoZXhUb1JHQih3aWRlKGEpKQoJYnIsIGJnLCBiYiA6PSBoZXhUb1JHQih3aWRlKGIpKQoJZCA6PSAoMC4yMTI2KmZsb2F0NjQoYXItYnIpICsgMC43MTUyKmZsb2F0NjQoYWctYmcpICsgMC4wNzIyKmZsb2F0NjQoYWItYmIpKSAvIDI1NQoJaWYgZCA8IDAgewoJCXJldHVybiAtZAoJfQoJcmV0dXJuIGQKfQoKLy8gZmlyZU1heEZhY2V0cyBib3VuZHMgaG93IG1hbnkgZmFjZXRzIG9mIGEgc3RvbmUgY2FuIGZsYXNoLgpjb25zdCBmaXJlTWF4RmFjZXRzID0gMTIKCi8vIHN0YXJmaWVsZCB0b2dnbGVzIHRoZSBiYWNrZ3JvdW5kIHN0YXJzIChzZWUgcmVuZGVyU3RhcnMpLgpjb25zdCBzdGFyZmllbGQgPSB0cnVlCgovLyByZW5kZXJTdGFycyBzY2F0dGVycyBhIHNwYXJzZSBzdGFyZmllbGQgYmVoaW5kIGV2ZXJ5dGhpbmcuIFRoZSBmaWVsZAovLyBpdHNlbGYgaXMgc3RpbGw6IGV2ZXJ5IHN0YXIga2VlcHMgaXRzIG93biBmaXhlZCBicmlnaHRuZXNzIChmb3VyIGxldmVscywKLy8gc2l6ZXMgdG8gbWF0Y2gpLCB0aGUgd2F5IGEgbmlnaHQgc2t5IGxvb2tzLiBPbmx5IGEgZmV3IHN0YXJzIHR3aW5rbGUsCi8vIGFuZCBlYWNoIHR3aW5rbGVyIGlzIGl0cyBvd24gZWxlbWVudCB3aXRoIGl0cyBvd24gcGVyaW9kIGFuZCBwaGFzZSwKLy8gZHJhd24gcGVyIHRva2VuLCBzbyBubyB0d28gZXZlciBibGluayB0b2dldGhlciAtLSB0aGUgb2xkIGZpZWxkIGhhZCBvbmUKLy8gd2hvbGUgZ3JvdXAgb2Ygc3RhcnMgZmFkaW5nIGluIGFuZCBvdXQgaW4gdW5pc29uLiBUaGUgcmluZyBiYW5kIGlzIGtlcHQKLy8gY2xlYXIuIFNlZWRlZCBwZXIgdG9rZW4uCmZ1bmMgcmVuZGVyU3RhcnMoc2FsdCBzdHJpbmcpIHN0cmluZyB7CglpZiAhc3RhcmZpZWxkIHsKCQlyZXR1cm4gIiIKCX0KCXJuZCA6PSBuZXdQUk5HKCJzdGFycyIgKyBzYWx0KQoJdHlwZSBzdGFyIHN0cnVjdHsgeCwgeSBmbG9hdDY0IH0KCXZhciBieUxldmVsIFs0XVtdc3RhcgoJZm9yIGkgOj0gMDsgaSA8IDM2OyBpKysgewoJCXgsIHkgOj0gcm5kLmZsb2F0SW4oMywgY2FudmFzVy0zKSwgcm5kLmZsb2F0SW4oMywgMTI3KQoJCWsgOj0gcm5kLmludG4oMjApCgkJZHgsIGR5IDo9IHgtc3VialgsIHktc3VialkKCQlpZiByIDo9IG1hdGguU3FydChkeCpkeCArIGR5KmR5KTsgciA+IDQzICYmIHIgPCA1OCB7CgkJCWNvbnRpbnVlCgkJfQoJCWx2bCA6PSAwIC8vIG1vc3Qgc3RhcnMgYXJlIGZhaW50OyBhIGZldyBhcmUgYnJpZ2h0CgkJc3dpdGNoIHsKCQljYXNlIGsgPj0gMTg6CgkJCWx2bCA9IDMKCQljYXNlIGsgPj0gMTQ6CgkJCWx2bCA9IDIKCQljYXNlIGsgPj0gODoKCQkJbHZsID0gMQoJCX0KCQlieUxldmVsW2x2bF0gPSBhcHBlbmQoYnlMZXZlbFtsdmxdLCBzdGFye3gsIHl9KQoJfQoJd2lkdGhzIDo9IFs0XXN0cmluZ3siLjQ1IiwgIi42IiwgIi44NSIsICIxLjE1In0KCW9wcyA6PSBbNF1zdHJpbmd7Ii4yMiIsICIuMzgiLCAiLjU4IiwgIi44NSJ9Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoYDxnIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBmaWxsPSJub25lIj5gKQoJdmFyIHR3IFtdc3RhcgoJZm9yIGwgOj0gMDsgbCA8IDQ7IGwrKyB7CgkJaWYgbGVuKGJ5TGV2ZWxbbF0pID09IDAgewoJCQljb250aW51ZQoJCX0KCQlkIDo9ICIiCgkJZm9yIGksIHN0IDo9IHJhbmdlIGJ5TGV2ZWxbbF0gewoJCQkvLyB0aGUgdHdpbmtsZXJzIGNvbWUgZnJvbSB0aGUgbWlkZGxlIGxldmVscyAodmlzaWJsZSwgbm90IHRoZQoJCQkvLyBicmlnaHRlc3QpLCBhdCBtb3N0IHRocmVlIHBlciB0b2tlbgoJCQlpZiBsID49IDEgJiYgbCA8PSAyICYmIGxlbih0dykgPCAzICYmIGklMyA9PSAwIHsKCQkJCXR3ID0gYXBwZW5kKHR3LCBzdCkKCQkJCWNvbnRpbnVlCgkJCX0KCQkJZCArPSAiTSIgKyBuMShzdC54KSArICIgIiArIG4xKHN0LnkpICsgImguMDEiCgkJfQoJCWlmIGQgIT0gIiIgewoJCQliLldyaXRlU3RyaW5nKGA8cGF0aCBkPSJgICsgZCArIGAiIHN0cm9rZS13aWR0aD0iYCArIHdpZHRoc1tsXSArIGAiIG9wYWNpdHk9ImAgKyBvcHNbbF0gKyBgIi8+YCkKCQl9Cgl9Cglmb3IgXywgc3QgOj0gcmFuZ2UgdHcgewoJCS8vIDUtMTIgcyBwZXJpb2RzIChpcnJhdGlvbmFsLWlzaCByYXRpb3MgYmV0d2VlbiB0aGVtKSBhbmQgcmFuZG9tCgkJLy8gcGhhc2VzOiBlYWNoIHR3aW5rbGVzIGFsb25lLCBicmllZmx5LCBub3cgYW5kIHRoZW4KCQlkdXIgOj0gcm5kLmZsb2F0SW4oNSwgMTIpCgkJYi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iTWAgKyBuMShzdC54KSArICIgIiArIG4xKHN0LnkpICsgYGguMDEiIHN0cm9rZS13aWR0aD0iLjkiIG9wYWNpdHk9Ii40IiBjbGFzcz0iZ3QtdHciIHN0eWxlPSItLWQ6YCArIGZudW0xKGR1cikgKyBgczstLWRsOi1gICsgZm51bTEocm5kLmZsb2F0SW4oMCwgZHVyKSkgKyBgcyIvPmApCgl9CgliLldyaXRlU3RyaW5nKGA8L2c+YCkKCXJldHVybiBiLlN0cmluZygpCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwZWFybCBzaGFwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8vIFBlYXJscyBhcmUgb3JnYW5pYyBnZW1zIC0tIHRoZXkgZ3JvdyBpbnRvIGEgZm9ybSwgdGhleSBhcmUgbmV2ZXIgY3V0IG9yCi8vIGZhY2V0ZWQgdGhlIHdheSBhIGNyeXN0YWwgaXMuIFNvIHVubGlrZSB0aGUgY3V0IHZvY2FidWxhcnkgYWJvdmUKLy8gKFNoYXBlTmFtZXMvcmVuZGVyR2VtKSwgZXZlcnl0aGluZyBoZXJlIGRyYXdzIGEgc21vb3RoLCBjb250aW51b3VzCi8vIHN1cmZhY2U6IG9uZSByYWRpYWwgbHVzdGVyIGdyYWRpZW50IHBsdXMgYSBzb2Z0IGRpYWdvbmFsIGhpZ2hsaWdodCBiYW5kCi8vIChhIHBlYXJsJ3MgcmVhbCAib3JpZW50IiBzaGVlbiksIG5vIHN0cmFpZ2h0LWVkZ2VkIGZhY2V0IHRyaWFuZ2xlcy4KCi8vIHBlYXJsTHVzdGVyR3JhZGllbnQgcmV0dXJucyB0aGUgZGVmcyBmb3IgYSBwZWFybCdzIG5hY3JlLCBhcyBmb3VyCi8vIGdyYWRpZW50cyB0aGUgYm9keSBzaGFwZSBpcyBmaWxsZWQgd2l0aCBpbiB0dXJuIChwZWFybExheWVycyk6Ci8vICAgZ2lkICAgIGJvZHk6IGEgc3BoZXJlIGxpdCBmcm9tIHRoZSB1cHBlciBsZWZ0IC0tIGxpZnRlZCB3aGVyZSB0aGUgbGlnaHQKLy8gICAgICAgICAgbGFuZHMsIHRoZSBib2R5IGNvbG91ciB0aHJvdWdoIHRoZSBtaWRkbGUsIGEgcmVhbCB0ZXJtaW5hdG9yCi8vICAgICAgICAgICh0aGUgc2hhZG93ZWQgbGltYiwgbG93ZXIgcmlnaHQpLCBhbmQgYSB0aGluIGJvdW5jZS1saXQgcmltLgovLyAgICAgICAgICBUaGUgb2xkIHZlcnNpb24gb25seSBsaWdodGVuZWQgYSB3aGl0ZSBib2R5LCB3aGljaCBjYW5ub3QgZ2V0Ci8vICAgICAgICAgIGJyaWdodGVyLCBzbyB3aGl0ZSBwZWFybHMgcmVhZCBhcyBmbGF0IGRpc2NzLgovLyAgIGdpZCtvICBvdmVydG9uZTogbmFjcmUncyByZXN0aW5nIGlyaWRlc2NlbmNlLCByb3NlIG92ZXIgdGhlIGJvZHkgYW5kCi8vICAgICAgICAgIGdyZWVuIHRvd2FyZCB0aGUgcmltLCB0aGUgdHdvIGludGVyZmVyZW5jZSBjb2xvdXJzIHBlYXJscyBzaG93LgovLyAgIGdpZCtzICBzcGVjdWxhcjogdGhlIGxhbXAgaXRzZWxmLCBhIHNtYWxsIGhvdCBjb3JlIHdpdGggYSBzb2Z0IHNraXJ0LgovLyAgICAgICAgICBOYWNyZSBpcyBnbG9zc3k7IHRoZSBjb3JlIGlzIHdoYXQgc2F5cyAicGVhcmwiIGF0IDIwMCBweC4KLy8gICBnaWQrdyAgd2luZG93OiB0aGUgc2Vjb25kLCBkaW1tZXIgcmVmbGVjdGlvbiBvZiB0aGUgcm9vbSBvbiB0aGUgZmFyCi8vICAgICAgICAgIHNpZGUsIHdoaWNoIGlzIHdoYXQgbWFrZXMgYSBzcGhlcmUgcmVhZCBhcyBhIG1pcnJvciwgbm90IHBhaW50LgovLyBTaGFkb3cgdG9uZXMgYXJlIHdhcm0gZm9yIGxpZ2h0IGJvZGllcyBhbmQgbmV1dHJhbCBmb3IgZGFyayBvbmVzOiBhCi8vIHdoaXRlIHBlYXJsIHNoYWRlcyB0b3dhcmQgZ3JleS10YXVwZSwgbmV2ZXIgdG93YXJkIGJsYWNrLgpmdW5jIHBlYXJsTHVzdGVyR3JhZGllbnQoZ2lkLCBiYXNlLCBtZXRhbCBzdHJpbmcpIHN0cmluZyB7CglyLCBnLCBiIDo9IGhleFRvUkdCKGJhc2UpCglsdW0gOj0gKDAuMjEyNipmbG9hdDY0KHIpICsgMC43MTUyKmZsb2F0NjQoZykgKyAwLjA3MjIqZmxvYXQ2NChiKSkgLyAyNTUKCXNoYWRvdyA6PSAiIzRhNDAzOCIKCWlmIGx1bSA8IDAuNCB7CgkJc2hhZG93ID0gIiMwMDAwMDAiCgl9CgkvLyBUaGUgbGl0IHNpZGUgaXMgdGhlIGJvZHkgY29sb3VyIGl0c2VsZiBhbmQgZXZlcnl0aGluZyBlbHNlIGlzCgkvLyBzaGFkZWQgZG93biBmcm9tIGl0LCBzbyB0aGUgc3BlY3VsYXIgKHB1cmUgd2hpdGUpIGlzIHRoZSBvbmx5IHRoaW5nCgkvLyB0aGF0IGJyaWdodGVzdCAtLSB0aGF0IGNvbnRyYXN0IGlzIHdoYXQgcmVhZHMgYXMgZ2xvc3MuIEZ1bGwgNi1kaWdpdAoJLy8gaGV4IGhlcmU6ICNyZ2IgcXVhbnRpc2luZyBmbGF0dGVuZWQgdGhlIHN1YnRsZSBwZWFybCB0b25lcy4KCWhpIDo9IGJhc2UKCS8vIGhpZ2hsaWdodCBzdHJlbmd0aHM7IGEgZGFyayAoVGFoaXRpYW4pIHBlYXJsIGdldHMgYSBzbWFsbGVyLCBzb2Z0ZXIKCS8vIGhpZ2hsaWdodDogYXQgZnVsbCBzdHJlbmd0aCBhIHdoaXRlIGhvdCBzcG90IG9uIGEgbmVhci1ibGFjayBib2R5CgkvLyByZWFkIGFzIGEgZ2xhcmUsIG5vdCBhcyBuYWNyZQoJLy8gQSBzb2Z0LCB3aWRlIHNoZWVuIHJhdGhlciB0aGFuIGEgaG90IHNwb3Q6IGEgcmVhbCBwZWFybCdzIGx1c3RyZSBpcwoJLy8gYSBicm9hZCBnbG93IHdpdGggYSBnZW50bGUgZmFsbG9mZiAobmFjcmUgc2NhdHRlcnMgbGlnaHQpLCBub3QgYQoJLy8gcGlucG9pbnQuIFBlYWsga2VwdCB3ZWxsIGJlbG93IGZ1bGwgd2hpdGUsIHNwcmVhZCBvdmVyIGEgbGFyZ2VyCgkvLyByYWRpdXMgd2l0aCBhbiBleHRyYSBtaWQgc3RvcCBzbyB0aGVyZSBpcyBubyBoYXJkIGVkZ2UuCglzYywgc3MsIHN3IDo9ICIuNiIsICIuMzIiLCAiLjE2IgoJbW8gOj0gIi4zIgoJaWYgbHVtIDwgMC40IHsKCQltbyA9ICIuMjIiCgkJaGkgPSBtaXhIZXgoYmFzZSwgIiNjOWQyZDgiLCAwLjI4KQoJCXNjLCBzcywgc3cgPSAiLjM0IiwgIi4xNiIsICIuMDciCgl9CglyZXR1cm4gYDxyYWRpYWxHcmFkaWVudCBpZD0iYCArIGdpZCArIGAiIGN4PSIuNCIgY3k9Ii4zNiIgcj0iLjciIGZ4PSIuMzQiIGZ5PSIuMjgiPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9ImAgKyBoaSArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIuNCIgc3RvcC1jb2xvcj0iYCArIG1peEhleChiYXNlLCBzaGFkb3csIDAuMTMpICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9Ii43NiIgc3RvcC1jb2xvcj0iYCArIG1peEhleChiYXNlLCBzaGFkb3csIDAuMzYpICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9Ii45MyIgc3RvcC1jb2xvcj0iYCArIG1peEhleChiYXNlLCBzaGFkb3csIDAuNSkgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iYCArIG1peEhleChiYXNlLCBzaGFkb3csIDAuMykgKyBgIi8+PC9yYWRpYWxHcmFkaWVudD5gICsKCQlgPHJhZGlhbEdyYWRpZW50IGlkPSJgICsgZ2lkICsgYG8iIGN4PSIuNDUiIGN5PSIuNDQiIHI9Ii42MiI+YCArCgkJYDxzdG9wIG9mZnNldD0iLjMiIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iMCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9Ii42MiIgc3RvcC1jb2xvcj0iI2ZmYjNjZiIgc3RvcC1vcGFjaXR5PSIuMiIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9Ii44OCIgc3RvcC1jb2xvcj0iI2IzZmZkNiIgc3RvcC1vcGFjaXR5PSIuMiIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNjM2QzZmYiIHN0b3Atb3BhY2l0eT0iLjEyIi8+PC9yYWRpYWxHcmFkaWVudD5gICsKCQlgPHJhZGlhbEdyYWRpZW50IGlkPSJgICsgZ2lkICsgYHMiIGN4PSIuMzYiIGN5PSIuMyIgcj0iLjQiPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iYCArIHNjICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9Ii4zNSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSJgICsgc3MgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjciIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iLjA2Ii8+YCArCgkJYDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+PC9yYWRpYWxHcmFkaWVudD5gICsKCQkvLyBnaWQrbTogdGhlIHNldHRpbmcgbWlycm9yZWQgaW4gdGhlIG5hY3JlIC0tIGEgdGhpbiBjcmVzY2VudCBvZgoJCS8vIHRoZSByaW5nJ3MgbWV0YWwgYWxvbmcgdGhlIGxvd2VyIGxpbWIsIHdoZXJlIGEgc3BoZXJlIHJlZmxlY3RzCgkJLy8gd2hhdCBpcyBiZXNpZGUgYW5kIGJlbG93IGl0LiBBIHBlYXJsIGluIGdvbGQgc2hvd3MgYSB3YXJtIGVkZ2UsCgkJLy8gaW4gcGxhdGludW0gYSBjb29sIG9uZTogdGhhdCBpcyB3aGF0IG1ha2VzIGl0IHJlYWQgYXMgYSBtaXJyb3IuCgkJYDxyYWRpYWxHcmFkaWVudCBpZD0iYCArIGdpZCArIGBtIiBjeD0iLjQyIiBjeT0iLjM2IiByPSIuNjgiPmAgKwoJCWA8c3RvcCBvZmZzZXQ9Ii43OCIgc3RvcC1jb2xvcj0iYCArIG1ldGFsICsgYCIgc3RvcC1vcGFjaXR5PSIwIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjkzIiBzdG9wLWNvbG9yPSJgICsgbWV0YWwgKyBgIiBzdG9wLW9wYWNpdHk9ImAgKyBtbyArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJgICsgbWV0YWwgKyBgIiBzdG9wLW9wYWNpdHk9IjAiLz48L3JhZGlhbEdyYWRpZW50PmAgKwoJCWA8cmFkaWFsR3JhZGllbnQgaWQ9ImAgKyBnaWQgKyBgdyIgY3g9Ii42NiIgY3k9Ii43MyIgcj0iLjIiPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iYCArIHN3ICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmYiIHN0b3Atb3BhY2l0eT0iMCIvPjwvcmFkaWFsR3JhZGllbnQ+YAp9CgovLyBwZWFybExheWVycyByZS1lbWl0cyBhIHBlYXJsJ3MgYm9keSBzaGFwZSBvbmNlIHBlciBsdXN0cmUgbGF5ZXIgKGJvZHksCi8vIG92ZXJ0b25lLCBtZXRhbCByZWZsZWN0aW9uLCB3aW5kb3csIHNwZWN1bGFyKSAoc2VlCi8vIHBlYXJsTHVzdGVyR3JhZGllbnQpLiBzaGFwZSBpcyB0aGUgZnVsbCBzZWxmLWNsb3NpbmcgZWxlbWVudCB3aXRoIGl0cwovLyBmaWxsIGF0dHJpYnV0ZTsgb25seSB0aGUgZmlsbCBpcyBzd2FwcGVkLiBUaGUgcmluZ3Mgb2YgYSBDaXJjbGVkIHBlYXJsCi8vIGdvIGJldHdlZW4gdGhlIG92ZXJ0b25lIGFuZCB0aGUgaGlnaGxpZ2h0cywgc28gdGhlIGhpZ2hsaWdodCBzaXRzIG9uCi8vIHRvcCBvZiB0aGUgZ3Jvb3ZlcyBhcyBpdCB3b3VsZCBvbiBhIHJlYWwgc3VyZmFjZS4KZnVuYyBwZWFybExheWVycyhzaGFwZSwgZ2lkLCBiZXR3ZWVuIHN0cmluZykgc3RyaW5nIHsKCWkgOj0gc3RyaW5ncy5JbmRleChzaGFwZSwgYCBmaWxsPSJgKQoJaWYgaSA8IDAgewoJCXJldHVybiBzaGFwZQoJfQoJY3AgOj0gZnVuYyhzdWZmaXggc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gc2hhcGVbOmldICsgYCBmaWxsPSJ1cmwoI2AgKyBnaWQgKyBzdWZmaXggKyBgKSIvPmAgfQoJcmV0dXJuIHNoYXBlICsgY3AoIm8iKSArIGNwKCJtIikgKyBiZXR3ZWVuICsgY3AoInciKSArIGNwKCJzIikKfQoKLy8gcGVhcmxTd2VlcENvbG9ySW50ZW5zaXR5IHBpY2tzIHRoZSBzd2VlcCBncmFkaWVudCdzIG9wYWNpdHkgbXVsdGlwbGllcgovLyBvZmYgdGhlIGJhc2UgY29sb3IncyBvd24gbHVtaW5hbmNlOiBhIGRhcmsgYm9keSAoZS5nLiBCbGFjaykgYWxyZWFkeQovLyByZWFkcyBhIHNjcmVlbi1ibGVuZGVkIGNvbG9yIGJhbmQgZmFyIG1vcmUgc3Ryb25nbHkgdGhhbiBhIGxpZ2h0IGJvZHkKLy8gZG9lcyBhdCB0aGUgc2FtZSBvcGFjaXR5LCBzbyBsaWdodCBib2RpZXMgZ2V0IGEgYmlnZ2VyIGJvb3N0IG9mZiB0aGUKLy8gc2hhcmVkIGJhc2VsaW5lIHRoYW4gZGFyayBvbmVzIGRvLiBUaHJlc2hvbGQvbXVsdGlwbGllcnMgdHVuZWQgYnkgZXllCi8vIGFnYWluc3QgdGhlIGZ1bGwgOC1jb2xvciBwYWxldHRlLCBub3QgZGVyaXZlZCBmcm9tIGFueXRoaW5nIHBoeXNpY2FsLgpmdW5jIHBlYXJsU3dlZXBDb2xvckludGVuc2l0eShiYXNlIHN0cmluZykgZmxvYXQ2NCB7CglyLCBnLCBiIDo9IGhleFRvUkdCKGJhc2UpCglsdW0gOj0gMC4yMTI2KmZsb2F0NjQocikvMjU1ICsgMC43MTUyKmZsb2F0NjQoZykvMjU1ICsgMC4wNzIyKmZsb2F0NjQoYikvMjU1CglpZiBsdW0gPCAwLjQgewoJCS8vIHdhcyAxLjI6IG9uIGEgYmxhY2sgcGVhcmwgdGhlIGNvbG91ciBiYW5kIHJlYWQgYXMgYSBicmlnaHQKCQkvLyBzdHJpcGU7IG5hY3JlJ3Mgb3JpZW50IG9uIGEgZGFyayBib2R5IGlzIHN1YnRsZQoJCXJldHVybiAwLjU1Cgl9CglyZXR1cm4gMi4wCn0KCi8vIHBlYXJsU3dlZXBHcmFkaWVudCBpcyB0aGUgdHJhdmVsaW5nIGJhbmQncyBvd24gY29sb3I6IHRyYW5zcGFyZW50IGF0Ci8vIGJvdGggZW5kcywgYSBzb2Z0IHBpbmsvYmx1ZS9ncmVlbi9nb2xkIHNwZWN0cnVtIGluIHRoZSBtaWRkbGUgLS0gYW4KLy8gYXBwcm94aW1hdGlvbiBvZiB0aGluLWZpbG0gaW50ZXJmZXJlbmNlICh0aGUgcmVhbCBzb3VyY2Ugb2YgbmFjcmUncwovLyBpcmlkZXNjZW5jZSkgcmF0aGVyIHRoYW4gYSBzaW5nbGUgZmxhdCBoaWdobGlnaHQgdG9uZS4KZnVuYyBwZWFybFN3ZWVwR3JhZGllbnQoZ2lkLCBiYXNlIHN0cmluZykgc3RyaW5nIHsKCW11bHQgOj0gcGVhcmxTd2VlcENvbG9ySW50ZW5zaXR5KGJhc2UpCglvMSwgbzIsIG8zIDo9IGZudW0oMC4zKm11bHQpLCBmbnVtKDAuMzUqbXVsdCksIGZudW0oMC4zKm11bHQpCglyZXR1cm4gYDxsaW5lYXJHcmFkaWVudCBpZD0iYCArIGdpZCArIGAiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjAlIj5gICsKCQlgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iMTglIiBzdG9wLWNvbG9yPSIjZmZkMmU2IiBzdG9wLW9wYWNpdHk9ImAgKyBvMSArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIzOCUiIHN0b3AtY29sb3I9IiNjZmU4ZmYiIHN0b3Atb3BhY2l0eT0iYCArIG8yICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjU4JSIgc3RvcC1jb2xvcj0iI2Q0ZmZlNCIgc3RvcC1vcGFjaXR5PSJgICsgbzMgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iODAlIiBzdG9wLWNvbG9yPSIjZmZmMGMyIiBzdG9wLW9wYWNpdHk9ImAgKyBvMyArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz5gICsKCQlgPC9saW5lYXJHcmFkaWVudD5gCn0KCi8vIHBlYXJsU3dlZXBPdmVybGF5IHJlcGxhY2VzIHRoZSBvbGQgZml4ZWQgcGVhcmxPcmllbnRTaGVlbiBlbGxpcHNlOiBhCi8vIGhhbmRmdWwgb2Ygc2xvdywgd2lkZSwgdHJhbnNsdWNlbnQgY29sb3IgYmFuZHMgdGhhdCBlYWNoIGNyb3NzIHRoZQovLyBwZWFybCdzIG93biBzaWxob3VldHRlIG9uY2UgZnJvbSBhIHJhbmRvbSBhbmdsZSwgdGhlbiB3YWl0LCB0aGVuIGNyb3NzCi8vIGFnYWluIGZyb20gYSBuZXcgcmFuZG9tIGFuZ2xlLCBvbiByZXBlYXQuIHNoYXBlR2VvbSBpcyB0aGF0IHBlYXJsJ3Mgb3duCi8vIG91dGxpbmUgKG5vIGZpbGwgbmVlZGVkIC0tIG9ubHkgdXNlZCBpbnNpZGUgYSBjbGlwUGF0aCkgc28gdGhlIGNvbG9yCi8vIG5ldmVyIHNwaWxscyBwYXN0IHRoZSBnZW0ncyBlZGdlLCB0aGUgc2FtZSB3YXkgYXBwbHlDYXNjYWRlJ3MgZmFjZXQKLy8gZmxhc2hlcyBhcmUgc2VlZGVkIHBlciB0b2tlbiBvZmYgdGlkU3RyIHJhdGhlciB0aGFuIGJlaW5nIGlkZW50aWNhbAovLyBhY3Jvc3MgZXZlcnkgcGllY2UuCmZ1bmMgcGVhcmxTd2VlcE92ZXJsYXkoc2FsdCwgYmFzZSwgc2hhcGVHZW9tIHN0cmluZywgdywgaCBmbG9hdDY0KSBzdHJpbmcgewoJcm5kIDo9IG5ld1BSTkcoc2FsdCArICItc3dlZXAiKQoJY29uc3QgcGFzc2VzID0gMwoJdG90YWwgOj0gMTUuMCArIHJuZC5mbG9hdEluKDAsIDkpCgoJZHVycyA6PSBtYWtlKFtdZmxvYXQ2NCwgcGFzc2VzKQoJc3VtRHVyIDo9IDAuMAoJZm9yIGkgOj0gMDsgaSA8IHBhc3NlczsgaSsrIHsKCQlkdXJzW2ldID0gMi40ICsgcm5kLmZsb2F0SW4oMCwgMi4yKQoJCXN1bUR1ciArPSBkdXJzW2ldCgl9CglnYXBUb3RhbCA6PSB0b3RhbCAtIHN1bUR1cgoJaWYgZ2FwVG90YWwgPCBmbG9hdDY0KHBhc3NlcykqMC41IHsKCQlnYXBUb3RhbCA9IGZsb2F0NjQocGFzc2VzKSAqIDAuNQoJfQoJd2VpZ2h0cyA6PSBtYWtlKFtdZmxvYXQ2NCwgcGFzc2VzKQoJc3VtVyA6PSAwLjAKCWZvciBpIDo9IDA7IGkgPCBwYXNzZXM7IGkrKyB7CgkJd2VpZ2h0c1tpXSA9IDAuNCArIHJuZC5mbG9hdEluKDAsIDEpCgkJc3VtVyArPSB3ZWlnaHRzW2ldCgl9CglnYXBzIDo9IG1ha2UoW11mbG9hdDY0LCBwYXNzZXMpCglmb3IgaSA6PSAwOyBpIDwgcGFzc2VzOyBpKysgewoJCWdhcHNbaV0gPSB3ZWlnaHRzW2ldIC8gc3VtVyAqIGdhcFRvdGFsCgl9CglzdGFydHMgOj0gbWFrZShbXWZsb2F0NjQsIHBhc3NlcykKCXQgOj0gZ2Fwc1swXQoJZm9yIGkgOj0gMDsgaSA8IHBhc3NlczsgaSsrIHsKCQlzdGFydHNbaV0gPSB0CgkJdCArPSBkdXJzW2ldCgkJaWYgaSA8IHBhc3Nlcy0xIHsKCQkJdCArPSBnYXBzW2krMV0KCQl9Cgl9CgoJdHJhdmVsIDo9IHcgKiAxLjA1CgljbGlwSUQgOj0gImNscCIgKyBzYWx0CglncmFkSUQgOj0gInN3cCIgKyBzYWx0CglvZmYsIG9uMSwgb24yLCBvdXQgOj0gZm51bSgtdHJhdmVsKSwgZm51bSgtdHJhdmVsKjAuNSksIGZudW0odHJhdmVsKjAuNSksIGZudW0odHJhdmVsKQoKCXZhciBkZWZzIHN0cmluZ3MuQnVpbGRlcgoJZGVmcy5Xcml0ZVN0cmluZyhgPGRlZnM+PGNsaXBQYXRoIGlkPSJgICsgY2xpcElEICsgYCI+YCArIHNoYXBlR2VvbSArIGA8L2NsaXBQYXRoPmApCglkZWZzLldyaXRlU3RyaW5nKHBlYXJsU3dlZXBHcmFkaWVudChncmFkSUQsIGJhc2UpKQoKCXZhciBtYXJrcyBzdHJpbmdzLkJ1aWxkZXIKCW1hcmtzLldyaXRlU3RyaW5nKGA8ZyBjbGlwLXBhdGg9InVybCgjYCArIGNsaXBJRCArIGApIj5gKQoJZm9yIGkgOj0gMDsgaSA8IHBhc3NlczsgaSsrIHsKCQlhbmdsZSA6PSBmbnVtKHJuZC5mbG9hdEluKDAsIDM2MCkpCgkJc3RhcnRQY3QgOj0gc3RhcnRzW2ldIC8gdG90YWwgKiAxMDAKCQlkdXJQY3QgOj0gZHVyc1tpXSAvIHRvdGFsICogMTAwCgkJcmFtcFBjdCA6PSBkdXJQY3QgKiAwLjMyCgkJaWYgcmFtcFBjdCA+IDYgewoJCQlyYW1wUGN0ID0gNgoJCX0KCQlwMCwgcDEsIHAyLCBwMyA6PSBzdGFydFBjdCwgc3RhcnRQY3QrcmFtcFBjdCwgc3RhcnRQY3QrZHVyUGN0LXJhbXBQY3QsIHN0YXJ0UGN0K2R1clBjdAoJCWtmIDo9ICJzd3AiICsgc2FsdCArICJfIiArIHVmbXQuU3ByaW50ZigiJWQiLCBpKQoKCQljbG9zaW5nIDo9ICIiCgkJaWYgcDMgPCA5OS45OTkgewoJCQljbG9zaW5nID0gYDEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZShgICsgb2ZmICsgYHB4LDApO29wYWNpdHk6MH1gCgkJfQoJCWRlZnMuV3JpdGVTdHJpbmcoYDxzdHlsZT5Aa2V5ZnJhbWVzIGAgKyBrZiArIGB7YCArCgkJCWAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlKGAgKyBvZmYgKyBgcHgsMCk7b3BhY2l0eTowfWAgKwoJCQlmbnVtKHAwKSArIGAle3RyYW5zZm9ybTp0cmFuc2xhdGUoYCArIG9mZiArIGBweCwwKTtvcGFjaXR5OjB9YCArCgkJCWZudW0ocDEpICsgYCV7dHJhbnNmb3JtOnRyYW5zbGF0ZShgICsgb24xICsgYHB4LDApO29wYWNpdHk6MX1gICsKCQkJZm51bShwMikgKyBgJXt0cmFuc2Zvcm06dHJhbnNsYXRlKGAgKyBvbjIgKyBgcHgsMCk7b3BhY2l0eToxfWAgKwoJCQlmbnVtKHAzKSArIGAle3RyYW5zZm9ybTp0cmFuc2xhdGUoYCArIG91dCArIGBweCwwKTtvcGFjaXR5OjB9YCArCgkJCWNsb3NpbmcgKwoJCQlgfTwvc3R5bGU+YCkKCgkJbWFya3MuV3JpdGVTdHJpbmcoYDxnIHRyYW5zZm9ybT0icm90YXRlKGAgKyBhbmdsZSArIGAgYCArIGZudW0oc3VialgpICsgYCBgICsgZm51bShzdWJqWSkgKyBgKSI+YCArCgkJCWA8cmVjdCB4PSJgICsgZm51bShzdWJqWC13KjEuMykgKyBgIiB5PSJgICsgZm51bShzdWJqWS1oKjAuOTUpICsgYCIgd2lkdGg9ImAgKyBmbnVtKHcqMi42KSArIGAiIGhlaWdodD0iYCArIGZudW0oaCoxLjkpICsgYCIgZmlsbD0idXJsKCNgICsgZ3JhZElEICsgYCkiIG9wYWNpdHk9IjAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTpzY3JlZW47YW5pbWF0aW9uOmAgKyBrZiArIGAgYCArIGZudW0odG90YWwpICsgYHMgbGluZWFyIGluZmluaXRlIi8+YCArCgkJCWA8L2c+YCkKCX0KCW1hcmtzLldyaXRlU3RyaW5nKGA8L2c+YCkKCWRlZnMuV3JpdGVTdHJpbmcoYDwvZGVmcz5gKQoJcmV0dXJuIGRlZnMuU3RyaW5nKCkgKyBtYXJrcy5TdHJpbmcoKQp9CgpmdW5jIHBlYXJsUm91bmQoYmFzZSwgbWV0YWwsIHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJZ2lkIDo9ICJwcmwiICsgc2FsdAoJciA6PSAyNC4wICogc3RvbmVTY2FsZQoJYm9keSA6PSBgPGNpcmNsZSBjeD0iYCArIGZudW0oc3VialgpICsgYCIgY3k9ImAgKyBmbnVtKHN1YmpZKSArIGAiIHI9ImAgKyBmbnVtKHIpICsgYCIgZmlsbD0idXJsKCNgICsgZ2lkICsgYCkiLz5gCgljbGlwR2VvbSA6PSBgPGNpcmNsZSBjeD0iYCArIGZudW0oc3VialgpICsgYCIgY3k9ImAgKyBmbnVtKHN1YmpZKSArIGAiIHI9ImAgKyBmbnVtKHIpICsgYCIvPmAKCXN3ZWVwIDo9IHBlYXJsU3dlZXBPdmVybGF5KHNhbHQsIGJhc2UsIGNsaXBHZW9tLCByKjIsIHIqMikKCXJldHVybiBgPGRlZnM+YCArIHBlYXJsTHVzdGVyR3JhZGllbnQoZ2lkLCBiYXNlLCBtZXRhbCkgKyBgPC9kZWZzPmAgKyBwZWFybExheWVycyhib2R5LCBnaWQsICIiKSArIHN3ZWVwCn0KCmZ1bmMgcGVhcmxPdmFsKGJhc2UsIG1ldGFsLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCWdpZCA6PSAicHJsIiArIHNhbHQKCXJ4LCByeSA6PSAxOC4wKnN0b25lU2NhbGUsIDI1LjAqc3RvbmVTY2FsZQoJYm9keSA6PSBgPGVsbGlwc2UgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByeD0iYCArIGZudW0ocngpICsgYCIgcnk9ImAgKyBmbnVtKHJ5KSArIGAiIGZpbGw9InVybCgjYCArIGdpZCArIGApIi8+YAoJY2xpcEdlb20gOj0gYDxlbGxpcHNlIGN4PSJgICsgZm51bShzdWJqWCkgKyBgIiBjeT0iYCArIGZudW0oc3VialkpICsgYCIgcng9ImAgKyBmbnVtKHJ4KSArIGAiIHJ5PSJgICsgZm51bShyeSkgKyBgIi8+YAoJc3dlZXAgOj0gcGVhcmxTd2VlcE92ZXJsYXkoc2FsdCwgYmFzZSwgY2xpcEdlb20sIHJ4KjIsIHJ5KjIpCglyZXR1cm4gYDxkZWZzPmAgKyBwZWFybEx1c3RlckdyYWRpZW50KGdpZCwgYmFzZSwgbWV0YWwpICsgYDwvZGVmcz5gICsgcGVhcmxMYXllcnMoYm9keSwgZ2lkLCAiIikgKyBzd2VlcAp9CgovLyBwZWFybEJ1dHRvbiBpcyBmbGF0dGVuZWQgcmF0aGVyIHRoYW4gcm91bmQgLS0gd2lkZXIgdGhhbiB0YWxsLCB0aGUKLy8gcmVhbCAiYnV0dG9uIHBlYXJsIiBzaWxob3VldHRlIChhcyBpZiBnZW50bHkgcHJlc3NlZCksIHBvcHVsYXIgaW4KLy8gamV3ZWxyeSBzcGVjaWZpY2FsbHkgYmVjYXVzZSB0aGUgZmxhdCBiYWNrIHNpdHMgd2VsbCBhZ2FpbnN0IHNraW4uCmZ1bmMgcGVhcmxCdXR0b24oYmFzZSwgbWV0YWwsIHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJZ2lkIDo9ICJwcmwiICsgc2FsdAoJcngsIHJ5IDo9IDI1LjAqc3RvbmVTY2FsZSwgMTguMCpzdG9uZVNjYWxlCglib2R5IDo9IGA8ZWxsaXBzZSBjeD0iYCArIGZudW0oc3VialgpICsgYCIgY3k9ImAgKyBmbnVtKHN1YmpZKSArIGAiIHJ4PSJgICsgZm51bShyeCkgKyBgIiByeT0iYCArIGZudW0ocnkpICsgYCIgZmlsbD0idXJsKCNgICsgZ2lkICsgYCkiLz5gCgljbGlwR2VvbSA6PSBgPGVsbGlwc2UgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByeD0iYCArIGZudW0ocngpICsgYCIgcnk9ImAgKyBmbnVtKHJ5KSArIGAiLz5gCglzd2VlcCA6PSBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBjbGlwR2VvbSwgcngqMiwgcnkqMikKCXJldHVybiBgPGRlZnM+YCArIHBlYXJsTHVzdGVyR3JhZGllbnQoZ2lkLCBiYXNlLCBtZXRhbCkgKyBgPC9kZWZzPmAgKyBwZWFybExheWVycyhib2R5LCBnaWQsICIiKSArIHN3ZWVwCn0KCi8vIHBlYXJsRHJvcCBpcyBhIHNtb290aCB0ZWFyZHJvcCBidWlsdCBmcm9tIHR3byBCZXppZXIgYXJjcyAtLSB1bmxpa2UKLy8gZ2VtUGVhcidzIGZhY2V0ZWQgcG9seWdvbiwgYSByZWFsIGRyb3AgcGVhcmwgdGFwZXJzIGNvbnRpbnVvdXNseSwgd2l0aAovLyBubyBzdHJhaWdodCBlZGdlcyBhbnl3aGVyZSBvbiBpdHMgc3VyZmFjZS4KZnVuYyBwZWFybERyb3AoYmFzZSwgbWV0YWwsIHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJZ2lkIDo9ICJwcmwiICsgc2FsdAoJLy8gd2lkZXIgYW5kIHRhbGxlciB0aGFuIHRoZSByb3VuZCdzIGZvb3RwcmludCBzdWdnZXN0czogYSBkcm9wIG9ubHkKCS8vIGZpbGxzIGhhbGYgaXRzIGJvdW5kaW5nIGJveCwgYW5kIGF0IDIweDMwIGl0IHJlYWQgYXMgYSBzZWVkCgl3LCBoIDo9IDMyLjAqc3RvbmVTY2FsZSwgNDIuMCpzdG9uZVNjYWxlCglwYXRoIDo9IGBNIGAgKyBmbnVtKHN1YmpYKSArIGAgYCArIGZudW0oc3VialktaCowLjU1KSArCgkJYCBDIGAgKyBmbnVtKHN1YmpYK3cqMC41NSkgKyBgIGAgKyBmbnVtKHN1YmpZLWgqMC4xNSkgKyBgIGAgKyBmbnVtKHN1YmpYK3cqMC40MikgKyBgIGAgKyBmbnVtKHN1YmpZK2gqMC40MikgKyBgIGAgKyBmbnVtKHN1YmpYKSArIGAgYCArIGZudW0oc3VialkraCowLjQ4KSArCgkJYCBDIGAgKyBmbnVtKHN1YmpYLXcqMC40MikgKyBgIGAgKyBmbnVtKHN1YmpZK2gqMC40MikgKyBgIGAgKyBmbnVtKHN1YmpYLXcqMC41NSkgKyBgIGAgKyBmbnVtKHN1YmpZLWgqMC4xNSkgKyBgIGAgKyBmbnVtKHN1YmpYKSArIGAgYCArIGZudW0oc3VialktaCowLjU1KSArIGAgWmAKCWJvZHkgOj0gYDxwYXRoIGQ9ImAgKyBwYXRoICsgYCIgZmlsbD0idXJsKCNgICsgZ2lkICsgYCkiLz5gCgljbGlwR2VvbSA6PSBgPHBhdGggZD0iYCArIHBhdGggKyBgIi8+YAoJc3dlZXAgOj0gcGVhcmxTd2VlcE92ZXJsYXkoc2FsdCwgYmFzZSwgY2xpcEdlb20sIHcqMS42LCBoKjAuOSkKCXJldHVybiBgPGRlZnM+YCArIHBlYXJsTHVzdGVyR3JhZGllbnQoZ2lkLCBiYXNlLCBtZXRhbCkgKyBgPC9kZWZzPmAgKyBwZWFybExheWVycyhib2R5LCBnaWQsICIiKSArIHN3ZWVwCn0KCi8vIHBlYXJsQmFyb3F1ZU91dGxpbmUgZHJhd3MgYW4gaXJyZWd1bGFyLCBhc3ltbWV0cmljIHNpbGhvdWV0dGUgLS0gYSByZWFsCi8vIGJhcm9xdWUgcGVhcmwgaGFzIG5vIHN5bW1ldHJ5IGF0IGFsbCwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IG1ha2VzIGl0IGEKLy8gYmFyb3F1ZSBwZWFybCByYXRoZXIgdGhhbiBhIHJvdW5kIG9uZS4KZnVuYyBwZWFybEJhcm9xdWVPdXRsaW5lKHNlZWQgc3RyaW5nKSBbXXB0IHsKCXJuZCA6PSBuZXdQUk5HKHNlZWQpCgluIDo9IDEwCglwdHMgOj0gbWFrZShbXXB0LCBuKQoJZm9yIGsgOj0gMDsgayA8IG47IGsrKyB7CgkJYSA6PSAyICogbWF0aC5QaSAqIGZsb2F0NjQoaykgLyBmbG9hdDY0KG4pCgkJcnIgOj0gMjEuMCAqIHN0b25lU2NhbGUgKiAoMC43NSArIDAuNCpybmQuZmxvYXRJbigwLCAxKSkKCQlwdHNba10gPSBwdHtzdWJqWCArIHJyKm1hdGguQ29zKGEpKjEuMSwgc3VialkgKyByciptYXRoLlNpbihhKSowLjl9Cgl9CglyZXR1cm4gcHRzCn0KCi8vIHBlYXJsQmFyb3F1ZVNtb290aFBhdGggdGhyZWFkcyBhIHF1YWRyYXRpYyBCZXppZXIgdGhyb3VnaCB0aGUgbWlkcG9pbnQKLy8gb2YgZXZlcnkgb3V0bGluZSBzZWdtZW50LCBzbyB0aGUgaXJyZWd1bGFyIG91dGxpbmUgc3RpbGwgcmVhZHMgYXMgb25lCi8vIGNvbnRpbnVvdXMgb3JnYW5pYyBzdXJmYWNlIC0tIGEgc3RyYWlnaHQtZWRnZWQgcG9seWdvbiBoZXJlIHdvdWxkIHJlYWQKLy8gYXMgYSBjdXQgZmFjZXQsIHdoaWNoIGEgYmFyb3F1ZSBwZWFybCdzIHN1cmZhY2UgbmV2ZXIgaGFzLgpmdW5jIHBlYXJsQmFyb3F1ZVNtb290aFBhdGgocHRzIFtdcHQpIHN0cmluZyB7CgluIDo9IGxlbihwdHMpCgltaWQgOj0gZnVuYyhhLCBiIHB0KSBwdCB7IHJldHVybiBwdHsoYS54ICsgYi54KSAvIDIsIChhLnkgKyBiLnkpIC8gMn0gfQoJc3RhcnQgOj0gbWlkKHB0c1tuLTFdLCBwdHNbMF0pCglwYXRoIDo9ICJNICIgKyBmbnVtKHN0YXJ0LngpICsgIiAiICsgZm51bShzdGFydC55KQoJZm9yIGsgOj0gMDsgayA8IG47IGsrKyB7CgkJbmV4dCA6PSBwdHNbKGsrMSklbl0KCQltIDo9IG1pZChwdHNba10sIG5leHQpCgkJcGF0aCArPSAiIFEgIiArIGZudW0ocHRzW2tdLngpICsgIiAiICsgZm51bShwdHNba10ueSkgKyAiICIgKyBmbnVtKG0ueCkgKyAiICIgKyBmbnVtKG0ueSkKCX0KCXJldHVybiBwYXRoICsgIiBaIgp9CgpmdW5jIHBlYXJsQmFyb3F1ZShiYXNlLCBtZXRhbCwgc2FsdCBzdHJpbmcpIHN0cmluZyB7CglnaWQgOj0gInBybCIgKyBzYWx0CglwYXRoRCA6PSBwZWFybEJhcm9xdWVTbW9vdGhQYXRoKHBlYXJsQmFyb3F1ZU91dGxpbmUoImJhcm9xdWUiICsgc2FsdCkpCglib2R5IDo9IGA8cGF0aCBkPSJgICsgcGF0aEQgKyBgIiBmaWxsPSJ1cmwoI2AgKyBnaWQgKyBgKSIvPmAKCWNsaXBHZW9tIDo9IGA8cGF0aCBkPSJgICsgcGF0aEQgKyBgIi8+YAoJc3dlZXAgOj0gcGVhcmxTd2VlcE92ZXJsYXkoc2FsdCwgYmFzZSwgY2xpcEdlb20sIDQwKnN0b25lU2NhbGUsIDMwKnN0b25lU2NhbGUpCglyZXR1cm4gYDxkZWZzPmAgKyBwZWFybEx1c3RlckdyYWRpZW50KGdpZCwgYmFzZSwgbWV0YWwpICsgYDwvZGVmcz5gICsgcGVhcmxMYXllcnMoYm9keSwgZ2lkLCAiIikgKyBzd2VlcAp9CgovLyBwZWFybENpcmNsZWQgZHJhd3MgdGhpbiBjb25jZW50cmljIGdyb3d0aCByaW5ncyBvdmVyIGEgcm91bmQgYm9keSAtLQovLyB0aGUgZGVmaW5pbmcgZmVhdHVyZSBvZiBhIHJlYWwgImNpcmNsZWQiIChvciAicmluZ2VkIikgcGVhcmwsIHZpc2libGUKLy8gZ3Jvb3ZlcyBsZWZ0IGJ5IGl0cyBvd24gZ3Jvd3RoLCBub3QgYSBkZWNvcmF0aXZlIHBhdHRlcm4uCmZ1bmMgcGVhcmxDaXJjbGVkKGJhc2UsIG1ldGFsLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCWdpZCA6PSAicHJsIiArIHNhbHQKCXIgOj0gMjQuMCAqIHN0b25lU2NhbGUKCWJvZHkgOj0gYDxjaXJjbGUgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByPSJgICsgZm51bShyKSArIGAiIGZpbGw9InVybCgjYCArIGdpZCArIGApIi8+YAoJcmluZ1RvbmUgOj0gbWl4SGV4KGJhc2UsICIjMDAwMDAwIiwgMC4xMikKCXJpbmdzIDo9ICIiCglmb3IgXywgZiA6PSByYW5nZSBbXWZsb2F0NjR7MC40MiwgMC41OCwgMC43NCwgMC45fSB7CgkJcmluZ3MgKz0gYDxjaXJjbGUgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByPSJgICsgZm51bShyKmYpICsgYCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJgICsgcmluZ1RvbmUgKyBgIiBzdHJva2Utd2lkdGg9IjAuOSIgb3BhY2l0eT0iMC4zNSIvPmAKCX0KCWNsaXBHZW9tIDo9IGA8Y2lyY2xlIGN4PSJgICsgZm51bShzdWJqWCkgKyBgIiBjeT0iYCArIGZudW0oc3VialkpICsgYCIgcj0iYCArIGZudW0ocikgKyBgIi8+YAoJc3dlZXAgOj0gcGVhcmxTd2VlcE92ZXJsYXkoc2FsdCwgYmFzZSwgY2xpcEdlb20sIHIqMiwgcioyKQoJcmV0dXJuIGA8ZGVmcz5gICsgcGVhcmxMdXN0ZXJHcmFkaWVudChnaWQsIGJhc2UsIG1ldGFsKSArIGA8L2RlZnM+YCArIHBlYXJsTGF5ZXJzKGJvZHksIGdpZCwgcmluZ3MpICsgc3dlZXAKfQoKLy8gUGVhcmxTaGFwZU5hbWVzIGxpc3RzIHRoZSByZWFsIGpld2VscnktdHJhZGUgcGVhcmwgc2hhcGUgY2F0ZWdvcmllcyAtLQovLyBkZWxpYmVyYXRlbHkgTk9UIHRoZSBmYWNldGVkLWN1dCB2b2NhYnVsYXJ5IGFib3ZlIChTaGFwZU5hbWVzKS4gUm91bmQKLy8gaXMgdGhlIHJhcmVzdC9tb3N0IHByaXplZCAocGVyZmVjdGx5IHNwaGVyaWNhbCk7IEJhcm9xdWUgaXMgdGhlIGxlYXN0Ci8vIHJlZ3VsYXIgKGZyZWVmb3JtLCBubyBzeW1tZXRyeSk7IENpcmNsZWQgcGVhcmxzIHNob3cgdmlzaWJsZQovLyBjb25jZW50cmljIGdyb3d0aCBncm9vdmVzLgp2YXIgUGVhcmxTaGFwZU5hbWVzID0gW11zdHJpbmd7IlJvdW5kIiwgIk92YWwiLCAiQnV0dG9uIiwgIkRyb3AiLCAiQmFyb3F1ZSIsICJDaXJjbGVkIn0KCi8vIHJlbmRlclBlYXJsU2hhcGUgaXMgUGVhcmxTaGFwZU5hbWVzJyBvd24gY291bnRlcnBhcnQgdG8gcmVuZGVyR2VtLgpmdW5jIHJlbmRlclBlYXJsU2hhcGUoc2hhcGVJZHggaW50LCBiYXNlLCBtZXRhbCwgc2FsdCBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggc2hhcGVJZHggewoJY2FzZSAwOgoJCXJldHVybiBwZWFybFJvdW5kKGJhc2UsIG1ldGFsLCBzYWx0KQoJY2FzZSAxOgoJCXJldHVybiBwZWFybE92YWwoYmFzZSwgbWV0YWwsIHNhbHQpCgljYXNlIDI6CgkJcmV0dXJuIHBlYXJsQnV0dG9uKGJhc2UsIG1ldGFsLCBzYWx0KQoJY2FzZSAzOgoJCXJldHVybiBwZWFybERyb3AoYmFzZSwgbWV0YWwsIHNhbHQpCgljYXNlIDQ6CgkJcmV0dXJuIHBlYXJsQmFyb3F1ZShiYXNlLCBtZXRhbCwgc2FsdCkKCWRlZmF1bHQ6CgkJcmV0dXJuIHBlYXJsQ2lyY2xlZChiYXNlLCBtZXRhbCwgc2FsdCkKCX0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLy8gcmVuZGVyUmluZyBkcmF3cyB0aGUgbWV0YWwgYmFuZCAod2l0aCBiZXZlbCkgcGx1cyB0aGUgbmVvbiBlbmVyZ3ktZmllbGQKLy8gZ2xvdyDigJQgZml4ZWQgb3V0ZXIgZWRnZSAobmV2ZXIgYW5pbWF0ZXMgcG9zaXRpb24pLCB0d28gc3RhdGljLWdlb21ldHJ5Ci8vIGxheWVycyBjcm9zc2ZhZGVkIHZpYSBvcGFjaXR5IG9ubHkuIE5vIGJsdXIgZmlsdGVyOiBhbiBTVkcgPGZpbHRlcj4KLy8gd3JhcHBpbmcgYW4gb3BhY2l0eS1hbmltYXRlZCBjaGlsZCBpcyBleHBlbnNpdmUgdG8gY29tcG9zaXRlIGluCi8vIFdlYktpdCBzcGVjaWZpY2FsbHkgKGNvbmZpcm1lZCB2aWEgYSBsaXZlIFNhZmFyaSB0ZXN0IGFnYWluc3QgYSBtb2NrCi8vIHBhZ2Ugd2l0aCBpdCByZW1vdmVkIOKAlCBDaHJvbWUgbmV2ZXIgc2hvd2VkIHRoZSBwcm9ibGVtLCBtYXNraW5nIGl0KS4KLy8gVGhlIGdyYWRpZW50J3Mgb3duIG11bHRpLXN0b3AgZmFsbG9mZiBjYXJyaWVzIHRoZSBnbG93IGluc3RlYWQuCmZ1bmMgcmVuZGVyUmluZyhtZXRhbEhpLCBtZXRhbExvLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCS8vIExpZ2h0LWZyb20tdG9wLWxlZnQgdGlsdDogaW5zdGVhZCBvZiBvbmUgc21vb3RoIGRpYWdvbmFsIGZhZGUsIHRoZQoJLy8gZ3JhZGllbnQgYWx0ZXJuYXRlcyBoaS9sbyB0d2ljZSBhbG9uZyB0aGUgc2FtZSBkaWFnb25hbCBheGlzLCBzbwoJLy8gdGhlIGJhbmQgcmVhZHMgYXMgY2F0Y2hpbmcgbW9yZSB0aGFuIG9uZSByZWZsZWN0ZWQgaGlnaGxpZ2h0IGFzIGl0CgkvLyBjdXJ2ZXMg4oCUIGEgcmVhbCBwb2xpc2hlZCByaW5nJ3MgIm11bHRpLWJhbmQgRnJlc25lbCIgbG9vaywgY2hvc2VuCgkvLyBvdmVyIGEgcGxhaW4gMi1zdG9wIGZhZGUgYWZ0ZXIgYSBsaXZlIHNpZGUtYnktc2lkZSBjb21wYXJpc29uIG9mCgkvLyBzaXggYWx0ZXJuYXRpdmUgcmluZyB0cmVhdG1lbnRzLiBBbGwgdGhyZWUgc3Ryb2tlcyAob3V0ZXIvbWFpbi8KCS8vIGlubmVyKSByZWZlcmVuY2UgdGhpcyBvbmUgZ3JhZGllbnQgc28gdGhlIGxpZ2h0IGRpcmVjdGlvbiBpcwoJLy8gY29uc2lzdGVudCBhY3Jvc3MgdGhlIHdob2xlIGJhbmQsIG5vdCBqdXN0IGl0cyBjZW50ZXIuCglnaWQgOj0gInJpbmciICsgc2FsdAoJLy8gV2lkZXIgdG9uYWwgc3dpbmcgdGhhbiB0aGUgbWV0YWwgdGFibGUncyBvd24gaGkvbG8gcGFpcjogdGhlIGJyaWdodAoJLy8gYmFuZHMgbGlmdCB0b3dhcmQgd2hpdGUgYW5kIHRoZSBkYXJrIGJhbmRzIHNpbmsgdG93YXJkIGJsYWNrLCBzbwoJLy8gdGhlIGJhbmQgcmVhZHMgYXMgcG9saXNoZWQgbWV0YWwgdHVybmluZyB0aHJvdWdoIHRoZSBsaWdodCBpbnN0ZWFkCgkvLyBvZiBhIGZsYXQgcGFpbnRlZCBob29wICh0aGUgb2xkIGhpL2xvLW9ubHkgdmVyc2lvbiByZWFkIGFzIG1hdHRlKS4KCWJyaWdodCA6PSBsaWdodGVuKG1ldGFsSGksIDAuNDUpCglkZWVwIDo9IG1peEhleChtZXRhbExvLCAiIzAwMDAwMCIsIDAuNDUpCgkvLyBDb21wYWN0IG1hcmt1cCAoc2FtZSBwaWN0dXJlIGFzIHRoZSBsb25nIGZvcm0pOiBzdG9wIG9mZnNldHMgYXMKCS8vIGZyYWN0aW9ucywgY2lyY2xlcyBpbiBvbmUgdHJhbnNsYXRlZCBncm91cCBzbyBjeC9jeS9maWxsIGFyZW4ndAoJLy8gcmVwZWF0ZWQgLS0gdGhpcyBydW5zIG9uIGV2ZXJ5IHRva2VuIHJlYWQsIGJ5dGVzIG1hdHRlci4KCXN0IDo9IGZ1bmMob2ZmLCBjIHN0cmluZykgc3RyaW5nIHsgcmV0dXJuIGA8c3RvcCBvZmZzZXQ9ImAgKyBvZmYgKyBgIiBzdG9wLWNvbG9yPSJgICsgYyArIGAiLz5gIH0KCWRlZnMgOj0gYDxsaW5lYXJHcmFkaWVudCBpZD0iYCArIGdpZCArIGAiIHgyPSIxIiB5Mj0iMSI+YCArCgkJc3QoIjAiLCBicmlnaHQpICsgc3QoIi4xMiIsIG1ldGFsSGkpICsgc3QoIi4yNiIsIGRlZXApICsgc3QoIi40IiwgbWV0YWxMbykgKyBzdCgiLjUyIiwgYnJpZ2h0KSArCgkJc3QoIi42NCIsIG1ldGFsSGkpICsgc3QoIi43OCIsIGRlZXApICsgc3QoIi45IiwgbWV0YWxMbykgKyBzdCgiMSIsIGJyaWdodCkgKyBgPC9saW5lYXJHcmFkaWVudD5gCgoJLy8gRHJvcCBzaGFkb3cgdW5kZXIgdGhlIGJhbmQgKGdyb3VuZHMgaXQpLCB0aGUgYmFuZCwgdGhlbiBiZXZlbCBlZGdlczoKCS8vIGEgYnJpZ2h0IGlubmVyLXRvcCBlZGdlIGFuZCBhIGRhcmsgb3V0ZXIgZWRnZSwgdGhlIHdheSBhIHJlYWwKCS8vIHJvdW5kZWQgYmFuZCBjYXRjaGVzIGxpZ2h0IG9uIHRoZSBzaWRlIGZhY2luZyB0aGUgbGFtcCBhbmQgZmFsbHMKCS8vIGludG8gc2hhZG93IG9uIHRoZSBmYXIgc2lkZS4gTm8gZHJhd24gc3BlY3VsYXIgYXJjczogdGhleSByZWFkIGFzCgkvLyBjYXJ0b29uIGhpZ2hsaWdodHM7IHRoZSBiYW5kIGdyYWRpZW50IGNhcnJpZXMgdGhlIGxpZ2h0IG9uIGl0cyBvd24uCgkvLyBBbGwgcGxhaW4gc3Ryb2tlcywgbm8gZmlsdGVycy4KCW91dGVyIDo9IGA8ZyBmaWxsPSJub25lIiB0cmFuc2Zvcm09InRyYW5zbGF0ZShgICsgY251bShzdWJqWCkgKyBgIGAgKyBjbnVtKHN1YmpZKSArIGApIj5gICsKCQlgPGNpcmNsZSByPSI1Mi42IiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS42IiBvcGFjaXR5PSIuNDUiLz5gICsKCQlgPGNpcmNsZSByPSI1MCIgc3Ryb2tlPSJ1cmwoI2AgKyBnaWQgKyBgKSIgc3Ryb2tlLXdpZHRoPSI0LjQiLz5gICsKCQlgPGNpcmNsZSByPSI1Mi4zIiBzdHJva2U9ImAgKyBkZWVwICsgYCIgc3Ryb2tlLXdpZHRoPSIuNyIgb3BhY2l0eT0iLjgiLz5gICsKCQlgPGNpcmNsZSByPSI0Ny43IiBzdHJva2U9ImAgKyBkZWVwICsgYCIgc3Ryb2tlLXdpZHRoPSIuNiIgb3BhY2l0eT0iLjciLz5gICsKCQlgPGNpcmNsZSByPSI0OC41IiBzdHJva2U9ImAgKyBsaWdodGVuKG1ldGFsSGksIDAuMzUpICsgYCIgc3Ryb2tlLXdpZHRoPSIuNSIgb3BhY2l0eT0iLjQ1Ii8+PC9nPmAKCgljb25zdCByT3V0ID0gNDYuMAoJY29uc3QgY29yZUhhbGYgPSAwLjYKCWNvbnN0IG91dHdhcmRCbG9vbSA9IDAuOQoJZ2xvd1IgOj0gck91dCArIG91dHdhcmRCbG9vbSArIDMKCXBjdCA6PSBmdW5jKHYgZmxvYXQ2NCkgZmxvYXQ2NCB7CgkJcCA6PSB2IC8gZ2xvd1IgKiAxMDAKCQlpZiBwIDwgMCB7CgkJCXAgPSAwCgkJfQoJCWlmIHAgPiAxMDAgewoJCQlwID0gMTAwCgkJfQoJCXJldHVybiBwCgl9CgkvLyBDb3JlIHRpbnRlZCBpbiB0aGUgbWV0YWwncyBvd24gdG9uZSByYXRoZXIgdGhhbiBuZWFyLXdoaXRlLCBhbmQgdGhlCgkvLyBhbmltYXRlZCBsYXllciBwZWFrcyBsb3dlciBhbmQgYnJlYXRoZXMgc2xvd2VyIChzZWUgZHVyKTogbmV4dCB0byBhCgkvLyByZWFsaXN0aWMgc3RvbmUgdGhlIG9sZCB3aGl0ZSBuZW9uIHB1bHNlIHdhcyB0aGUgbW9zdCBzdHlsaXNlZCB0aGluZwoJLy8gb24gdGhlIGNhbnZhcy4KCWNvcmVDb2xvciA6PSBsaWdodGVuKG1ldGFsSGksIDAuMjUpCglkb251dFN0b3BzIDo9IGZ1bmMoaW53YXJkQmxvb20sIHBlYWtPcCBmbG9hdDY0LCBnaWQgc3RyaW5nKSBzdHJpbmcgewoJCWJsb29tT3AgOj0gcGVha09wICogMC4zNQoJCW1pZE9wIDo9IHBlYWtPcCAqIDAuNwoJCXJldHVybiBgPHJhZGlhbEdyYWRpZW50IGlkPSJgICsgZ2lkICsgYCIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNTAlIj5gICsKCQkJYDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9ImAgKyBtZXRhbEhpICsgYCIgc3RvcC1vcGFjaXR5PSIwIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9ImAgKyBwY3RudW0ocGN0KHJPdXQtaW53YXJkQmxvb20tMS41KSkgKyBgJSIgc3RvcC1jb2xvcj0iYCArIG1ldGFsSGkgKyBgIiBzdG9wLW9wYWNpdHk9IjAiLz5gICsKCQkJYDxzdG9wIG9mZnNldD0iYCArIHBjdG51bShwY3Qock91dC1pbndhcmRCbG9vbSkpICsgYCUiIHN0b3AtY29sb3I9ImAgKyBtZXRhbEhpICsgYCIgc3RvcC1vcGFjaXR5PSJgICsgZm51bShibG9vbU9wKSArIGAiLz5gICsKCQkJYDxzdG9wIG9mZnNldD0iYCArIHBjdG51bShwY3Qock91dC1jb3JlSGFsZikpICsgYCUiIHN0b3AtY29sb3I9ImAgKyBjb3JlQ29sb3IgKyBgIiBzdG9wLW9wYWNpdHk9ImAgKyBmbnVtKG1pZE9wKSArIGAiLz5gICsKCQkJYDxzdG9wIG9mZnNldD0iYCArIHBjdG51bShwY3Qock91dCkpICsgYCUiIHN0b3AtY29sb3I9ImAgKyBjb3JlQ29sb3IgKyBgIiBzdG9wLW9wYWNpdHk9ImAgKyBmbnVtKHBlYWtPcCkgKyBgIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9ImAgKyBwY3RudW0ocGN0KHJPdXQrY29yZUhhbGYpKSArIGAlIiBzdG9wLWNvbG9yPSJgICsgY29yZUNvbG9yICsgYCIgc3RvcC1vcGFjaXR5PSJgICsgZm51bShtaWRPcCkgKyBgIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9ImAgKyBwY3RudW0ocGN0KHJPdXQrb3V0d2FyZEJsb29tKSkgKyBgJSIgc3RvcC1jb2xvcj0iYCArIG1ldGFsSGkgKyBgIiBzdG9wLW9wYWNpdHk9ImAgKyBmbnVtKGJsb29tT3ApICsgYCIvPmAgKwoJCQlgPHN0b3Agb2Zmc2V0PSJgICsgcGN0bnVtKHBjdChyT3V0K291dHdhcmRCbG9vbSsxKSkgKyBgJSIgc3RvcC1jb2xvcj0iYCArIG1ldGFsSGkgKyBgIiBzdG9wLW9wYWNpdHk9IjAiLz5gICsKCQkJYDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iYCArIG1ldGFsSGkgKyBgIiBzdG9wLW9wYWNpdHk9IjAiLz48L3JhZGlhbEdyYWRpZW50PmAKCX0KCglybmQgOj0gbmV3UFJORygiZW5lcmd5IiArIHNhbHQpCglnaWRBLCBnaWRCIDo9ICJnbG93QSIrc2FsdCwgImdsb3dCIitzYWx0CgkvLyAyLjEzLTMuMiBzOiA3NSUgb2YgdGhlIG9yaWdpbmFsIGVuZXJneSBwdWxzZSdzIHNwZWVkIChnZW1zLmdubyBhbmQKCS8vIGdlbXNhcnQyIHJhbiAxLjYtMi40IHM7IGdlbXNhcnRmYWIgaGFkIHNsb3dlZCBpdCB0byAzLjUtNS41IHMpCglkdXIgOj0gcm5kLmZsb2F0SW4oMi4xMywgMy4yKQoJcGhhc2UgOj0gcm5kLmZsb2F0SW4oMCwgZHVyKQoKCXN0b3BzQSA6PSBkb251dFN0b3BzKDIuNSoyLjAvMy4wKjAuNSwgMC40LCBnaWRBKQoJc3RvcHNCIDo9IGRvbnV0U3RvcHMoOC4wKjIuMC8zLjAqMC41LCAwLjYsIGdpZEIpCgoJZW5lcmd5IDo9IGA8ZGVmcz5gICsgc3RvcHNBICsgc3RvcHNCICsgYDwvZGVmcz5gICsKCQlgPGc+YCArCgkJYDxjaXJjbGUgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByPSJgICsgZm51bShnbG93UikgKyBgIiBmaWxsPSJ1cmwoI2AgKyBnaWRBICsgYCkiLz5gICsKCQlgPGNpcmNsZSBjeD0iYCArIGZudW0oc3VialgpICsgYCIgY3k9ImAgKyBmbnVtKHN1YmpZKSArIGAiIHI9ImAgKyBmbnVtKGdsb3dSKSArIGAiIGZpbGw9InVybCgjYCArIGdpZEIgKyBgKSIgb3BhY2l0eT0iMCIgY2xhc3M9Imd0LWdsb3ciIHN0eWxlPSItLWdsb3ctZHVyOmAgKyBmbnVtKGR1cikgKyBgczstLWdsb3ctZGVsYXk6LWAgKyBmbnVtKHBoYXNlKSArIGBzIi8+YCArCgkJYDwvZz5gCgoJcmV0dXJuIGA8ZGVmcz5gICsgZGVmcyArIGA8L2RlZnM+YCArIG91dGVyICsgZW5lcmd5Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbW90aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmNvbnN0ICgKCW1vdGlvblZEdXIsIG1vdGlvbkhEdXIsIG1vdGlvblJEdXIsIG1vdGlvblNEdXIgPSAzLjQsIDQuNjYsIDUuODEsIDYuNTYKCW1vdGlvblJvdE1pbiwgbW90aW9uUm90TWF4ICAgICAgICAgICAgICAgICAgICAgPSA0LjAsIDguMAoJbW90aW9uU2NhbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEuMDkKKQoKLy8gYXBwbHlNb3Rpb24gd3JhcHMgY29udGVudCBpbiB0aGUgZmxvYXRpbmctaG9sZGVyIGFuaW1hdGlvbiAodmVydGljYWwKLy8gZmxvYXQgKyBzaWRld2F5cyBkcmlmdCArIGxlZnQvcmlnaHQgcm9jayArIHNjYWxlIHB1bHNlKSwgZWFjaCBheGlzIG9uCi8vIGl0cyBvd24gaW5kZXBlbmRlbnRseS1waGFzZWQgcGVyaW9kIHNvIHBpZWNlcyBuZXZlciBtb3ZlIGluIHN5bmMuCi8vIENTUyBAa2V5ZnJhbWVzIChzZWUgc3R5bGVCbG9jayksIG5vdCBTTUlMIC0tIFdlYktpdCdzIFNNSUwgZW5naW5lCi8vIHNjYWxlcyBiYWRseSB3aXRoIG1hbnkgY29uY3VycmVudGx5LWFuaW1hdGVkIGVsZW1lbnRzIG9uIG9uZSBwYWdlLAovLyBjb25maXJtZWQgdmlhIGEgbGl2ZSBjcm9zcy1icm93c2VyIHRlc3QuIHRyYW5zZm9ybS1vcmlnaW46dmlldy1ib3gKLy8gb24gZ3Qtci9ndC1zIHJlcGxhY2VzIFNNSUwncyBtYW51YWwgdHJhbnNsYXRlLXRvLXBpdm90L3NjYWxlLwovLyB0cmFuc2xhdGUtYmFjayB0cmljaywgc28gdGhpcyBuZXN0cyBpbiBmZXdlciBlbGVtZW50cyB0aGFuIGJlZm9yZSwKLy8gbm90IG1vcmUuCi8vIG1vdGlvblBoYXNlcyBkcmF3cyBhIHRva2VuJ3MgZm91ciBtb3Rpb24gcGhhc2VzIGFuZCBpdHMgcm9jayBhbmdsZS4KLy8gU2hhcmVkIHdpdGggYXBwbHlDYXNjYWRlIHNvIHRoZSBmaXJlIGNhbiBsb2NrIHRvIHRoZSByb2NrOiBhIGZsYXNoCi8vIHNob3VsZCBoYXBwZW4gd2hlbiB0aGUgc3RvbmUgdGlsdHMsIG5vdCBvbiBhIHRpbWVyIG9mIGl0cyBvd24uCmZ1bmMgbW90aW9uUGhhc2VzKHNhbHQgc3RyaW5nKSAodnBoYXNlLCBocGhhc2UsIHJwaGFzZSwgc3BoYXNlLCByb3REZWcgZmxvYXQ2NCkgewoJcm5kIDo9IG5ld1BSTkcoIm1vdGlvbiIgKyBzYWx0KQoJdnBoYXNlID0gcm5kLmZsb2F0SW4oMCwgbW90aW9uVkR1cikKCWhwaGFzZSA9IHJuZC5mbG9hdEluKDAsIG1vdGlvbkhEdXIpCglycGhhc2UgPSBybmQuZmxvYXRJbigwLCBtb3Rpb25SRHVyKQoJc3BoYXNlID0gcm5kLmZsb2F0SW4oMCwgbW90aW9uU0R1cikKCXJvdERlZyA9IHJuZC5mbG9hdEluKG1vdGlvblJvdE1pbiwgbW90aW9uUm90TWF4KQoJcmV0dXJuCn0KCmZ1bmMgYXBwbHlNb3Rpb24oY29udGVudCwgc2FsdCBzdHJpbmcpIHN0cmluZyB7Cgl2cGhhc2UsIGhwaGFzZSwgcnBoYXNlLCBzcGhhc2UsIHJvdERlZyA6PSBtb3Rpb25QaGFzZXMoc2FsdCkKCgkvLyBUaGUgcm9jayBhbmQgdGhlIHB1bHNlIHBpdm90IG9uIHRoZSByaW5nIGNlbnRyZSBieSBnZW9tZXRyeSwgbm90IGJ5CgkvLyB0cmFuc2Zvcm0tYm94L3RyYW5zZm9ybS1vcmlnaW46IHRoZSBtb3Rpb24gZ3JvdXBzIHNpdCBpbnNpZGUgYSBncm91cAoJLy8gYWxyZWFkeSB0cmFuc2xhdGVkIHRvIChzdWJqWCwgc3VialkpLCBzbyB0aGVpciBvd24gb3JpZ2luIElTIHRoZSByaW5nCgkvLyBjZW50cmUsIGFuZCB0aGUgY29udGVudCBpcyBzaGlmdGVkIGJhY2sgaW5zaWRlIHRoZW0uIFNhZmFyaSBoYXMKCS8vIG1pc2hhbmRsZWQgdHJhbnNmb3JtLWJveCBpbnNpZGUgPGltZz4gU1ZHcywgd2hpY2ggc3dpbmdzIGEgc3RvbmUKCS8vIGFyb3VuZCB0aGUgaW1hZ2UgY29ybmVyIGluc3RlYWQgb2YgaXRzIGNlbnRyZS4KCXJldHVybiBgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoYCArIGZudW0oc3VialgpICsgYCBgICsgZm51bShzdWJqWSkgKyBgKSI+YCArCgkJYDxnIGNsYXNzPSJndC12IiBzdHlsZT0iLS12LWR1cjpgICsgZm51bShtb3Rpb25WRHVyKSArIGBzOy0tdi1kZWxheTotYCArIGZudW0odnBoYXNlKSArIGBzIj5gICsKCQlgPGcgY2xhc3M9Imd0LWgiIHN0eWxlPSItLWgtZHVyOmAgKyBmbnVtKG1vdGlvbkhEdXIpICsgYHM7LS1oLWRlbGF5Oi1gICsgZm51bShocGhhc2UpICsgYHMiPmAgKwoJCWA8ZyBjbGFzcz0iZ3QtciIgc3R5bGU9Ii0tci1kdXI6YCArIGZudW0obW90aW9uUkR1cikgKyBgczstLXItZGVsYXk6LWAgKyBmbnVtKHJwaGFzZSkgKyBgczstLXJvdC1kZWc6YCArIGZudW0ocm90RGVnKSArIGBkZWciPmAgKwoJCWA8ZyBjbGFzcz0iZ3QtcyIgc3R5bGU9Ii0tcy1kdXI6YCArIGZudW0obW90aW9uU0R1cikgKyBgczstLXMtZGVsYXk6LWAgKyBmbnVtKHNwaGFzZSkgKyBgcyI+YCArCgkJYDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC1gICsgZm51bShzdWJqWCkgKyBgIC1gICsgZm51bShzdWJqWSkgKyBgKSI+YCArCgkJY29udGVudCArIGA8L2c+PC9nPjwvZz48L2c+PC9nPjwvZz5gCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmluZyBhbmQgc3RvbmUgc2l6ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8vIENob3NlbiAyMDI2LTA5LTI2IGZyb20gc2lkZS1ieS1zaWRlcyBvZiBzZXZlcmFsIHNpemVzICgxMDAgcGllY2VzIGVhY2gsCi8vIGFsbCBhbmltYXRlZCk6IHRoZSByaW5nIGlzIGRyYXduIDE2JSBsYXJnZXIgYW5kIHRoZSBzdG9uZSBhdCBzY2FsZSAxLjIxCi8vICh3YXMgMC43OCksIHNvIGEgYmlnZ2VyIHN0b25lIHN0aWxsIGtlZXBzIGNsZWFyIG9mIHRoZSBiYW5kLiBCb3RoIHNpdAovLyBzaXplTGlmdCB1bml0cyBoaWdoZXIgc28gdGhlIGxhcmdlciByaW5nIGNsZWFycyB0aGUgY2hhaW4gcGxhdGUgKHRvcCBhdAovLyB5IDEzNCksIGFuZCB0aGUgc3RhdHVzIGRvdCBtb3ZlcyBvdXQgc28gaXQgZG9lcyBub3QgdG91Y2ggdGhlIGJhbmQuIFRoZQovLyByaW5nIGlzIHNjYWxlZCBhcyBvbmUgZ3JvdXAgYXJvdW5kIGl0cyBvd24gY2VudHJlOiBpdHMgc3Ryb2tlcywgYmV2ZWwKLy8gYW5kIGdsb3cga2VlcCB0aGVpciBwcm9wb3J0aW9ucy4gUGxhaW4gZ3JvdXAgdHJhbnNmb3Jtcywgbm8gZmlsdGVycy4KY29uc3QgKAoJcmluZ1NjYWxlID0gMS4xNgoJc2l6ZUxpZnQgID0gNi4wCikKCmZ1bmMgc2V0UmluZyhlbHMgc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIGA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZShgICsgZm51bShzdWJqWCkgKyBgIGAgKyBmbnVtKHN1YmpZLXNpemVMaWZ0KSArIGApIHNjYWxlKGAgKyBmbnVtKHJpbmdTY2FsZSkgKyBgKSB0cmFuc2xhdGUoLWAgKyBmbnVtKHN1YmpYKSArIGAgLWAgKyBmbnVtKHN1YmpZKSArIGApIj5gICsgZWxzICsgYDwvZz5gCn0KZnVuYyBzZXRTdG9uZShlbHMgc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gYDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLWAgKyBmbnVtKHNpemVMaWZ0KSArIGApIj5gICsgZWxzICsgYDwvZz5gIH0KZnVuYyBzZXRCYWRnZShlbHMgc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gYDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUgMikiPmAgKyBlbHMgKyBgPC9nPmAgfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGF0dXMgYmFkZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKY29uc3QgZG90WCwgZG90WSA9IHN1YmpYICsgNTAsIHN1YmpZICsgNDIKCmZ1bmMgcmVuZGVyU3RhdHVzQmFkZ2UoYWN0aXZlIGJvb2wpIHN0cmluZyB7CglpZiBhY3RpdmUgewoJCXJldHVybiBgPGNpcmNsZSBjeD0iYCArIGZudW0oZG90WCkgKyBgIiBjeT0iYCArIGZudW0oZG90WSkgKyBgIiByPSI0IiBmaWxsPSIjN2ZkODhmIi8+YCArCgkJCS8vIHIgc3RhcnRzIGF0IDQgKHRoZSBzb2xpZCBkb3QncyBvd24gcmFkaXVzLCBzbyB0aGUgcmluZwoJCQkvLyBiZWdpbnMgZmx1c2ggd2l0aCBpdHMgZWRnZSkgYW5kIHNjYWxlcyB1cCB2aWEgdHJhbnNmb3JtIC0tCgkJCS8vIHNlZSBzdHlsZUJsb2NrJ3MgZ3Qta2YtYmFkZ2UtcHVsc2UgY29tbWVudCBmb3Igd2h5IG5vdCByLgoJCQkvLyBwdWxzZSByaW5nIGRyYXduIGF0IHRoZSBvcmlnaW4gb2YgYSB0cmFuc2xhdGVkIGdyb3VwLCBzbyBpdHMKCQkJLy8gc2NhbGUgZ3Jvd3MgZnJvbSB0aGUgZG90J3Mgb3duIGNlbnRyZSBpbiBldmVyeSBicm93c2VyCgkJCWA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZShgICsgZm51bShkb3RYKSArIGAgYCArIGZudW0oZG90WSkgKyBgKSI+PGNpcmNsZSByPSI0IiBmaWxsPSJub25lIiBzdHJva2U9IiM3ZmQ4OGYiIHN0cm9rZS13aWR0aD0iMS4yIiBjbGFzcz0iZ3QtYmFkZ2UtcHVsc2UiIG9wYWNpdHk9IjAuOCIvPjwvZz5gCgl9CglyZXR1cm4gYDxjaXJjbGUgY3g9ImAgKyBmbnVtKGRvdFgpICsgYCIgY3k9ImAgKyBmbnVtKGRvdFkpICsgYCIgcj0iNCIgZmlsbD0iIzVhNWY2YiIvPmAKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZhY2V0IGZpcmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8vIFRoZSBzdG9uZSdzIHNwYXJrbGUsIG1vZGVsbGVkIG9uIHdoYXQgYSBjdXQgZGlhbW9uZCBkb2VzIHVuZGVyIGEKLy8gbW92aW5nIGxpZ2h0IHJhdGhlciB0aGFuIG9uIGEgZGVjb3JhdGl2ZSBzaGltbWVyOgovLyAgIC0gc2NpbnRpbGxhdGlvbjogYSBmYWNldCBmbGFzaGVzIG9uIHNoYXJwbHkgYW5kIGRlY2F5cywgaW4gYSB0aGlyZAovLyAgICAgb2YgYSBzZWNvbmQsIG5vdCBhIHNsb3cgc3ltbWV0cmljIGZhZGU7Ci8vICAgLSBmaXJlOiB0aGUgZmxhc2ggaXMgd2hpdGUgYXQgaXRzIHBlYWsgYW5kIHRha2VzIG9uIHRoYXQgZmFjZXQncwovLyAgICAgc3BlY3RyYWwgY29sb3VyIGFzIGl0IGRpZXMgLS0gY29sb3VyIGZvbGxvd3MgYnJpbGxpYW5jZTsKLy8gICAtIHN3ZWVwOiBhIGZsYXNoIHBhc3NlcyBBQ1JPU1MgdGhlIHN0b25lIGluIG9uZSBkaXJlY3Rpb24gKGZhY2V0cwovLyAgICAgb3JkZXJlZCBieSB0aGVpciBwcm9qZWN0aW9uIGFsb25nIGEgcmFuZG9tIHN3ZWVwIGF4aXMpLCBhbmQgb25seQovLyAgICAgYWJvdXQgaGFsZiBvZiB0aGVtIGxpZ2h0IG9uIGFueSBwYXNzLCBzbyBpdCBzdGF5cyBzcGFyc2U7Ci8vICAgLSBtb3Rpb24tbG9ja2VkOiB0aGUgc3dlZXBzIHNpdCBvbiB0aGUgTUlELXN3aW5ncyBvZiB0aGUgcm9jawovLyAgICAgYW5pbWF0aW9uIChzZWUgbW90aW9uUGhhc2VzIGFuZCBhcHBseUNhc2NhZGUncyBkZWxheSksIHdoZXJlIHRoZQovLyAgICAgc3RvbmUgdHVybnMgZmFzdGVzdCBhbmQgYSByZWFsIHJlZmxlY3Rpb24gbW92ZXMgZmFzdGVzdCwgYW5kIGVhY2gKLy8gICAgIHN3ZWVwIHRyYXZlbHMgdGhlIHdheSB0aGUgc3RvbmUgaXMgdHVybmluZyBhdCB0aGF0IG1vbWVudCAtLSBvbmUKLy8gICAgIHdheSBvbiB0aGUgY2xvY2t3aXNlIHN3aW5nLCB0aGUgcmV2ZXJzZSBvbiB0aGUgd2F5IGJhY2sgLS0gYWxvbmcKLy8gICAgIHRoZSBheGlzIGEgZml4ZWQgdG9wLWxlZnQgbGlnaHQgdHJhY2VzIGFjcm9zcyBhIHR1cm5pbmcgc3RvbmUuIFNvCi8vICAgICB0aGUgc3BhcmtsZSByZWFkcyBhcyBjYXVzZWQgYnkgdGhlIG1vdGlvbi4gQSBmZXcgbG9uZSBwaW5wb2ludAovLyAgICAgZmxhc2hlcyBhdCByYW5kb20gdGltZXMgYXJlIHRoZSBleGNlcHRpb24uCi8vIENvc3QgaXMgdW5jaGFuZ2VkIGZyb20gdGhlIG9sZCBjYXNjYWRlOiBvbmUgc29saWQtZmlsbGVkIG92ZXJsYXkgcGF0aAovLyBwZXIgbGl0IGZhY2V0LCBhbmltYXRlZCBvbiBvcGFjaXR5IGFuZCBmaWxsIG9ubHkuCgovLyBmYWNldFNwYW4gaXMgb25lIHNlbGYtY2xvc2luZyBmYWNldCBlbGVtZW50IGZvdW5kIGluIHJlbmRlckdlbSdzIG93bgovLyBtYXJrdXAsIGluIHRoZSBzYW1lIGxlZnQtdG8tcmlnaHQgb3JkZXIgaXQgd2FzIGRyYXduIC0tIHdoaWNoIGlzIGFsc28KLy8gZWFjaCBmYWNldCdzIHJlYWwgYWRqYWNlbmN5IG9yZGVyIGFyb3VuZCBpdHMgcmluZywgc2luY2UgZXZlcnkgZ2VtXyoKLy8gZnVuY3Rpb24gZHJhd3MgaXRzIHJpbmcgaW4gb25lIGNvbnRpbnVvdXMgYW5ndWxhciBzd2VlcC4gcmluZ01lbWJlcgovLyBkaXN0aW5ndWlzaGVzIGEgcmVhbCBmYWNldCAoY2xhc3M9ImYiLCBzZXQgYnkgZmFjZXRTdHlsZS5mYWNldCkgZnJvbQovLyB0aGUgb25lIG5vbi1yaW5nIHRhYmxlL2NlbnRlci9iYWNraW5nIGVsZW1lbnQgZWFjaCBzaGFwZSBkcmF3cwovLyB3aXRob3V0IGl0IC0tIHRoYXQgb25lIHN0YXlzIHN0YXRpYywgb3V0c2lkZSB0aGUgY2FzY2FkZS4KdHlwZSBmYWNldFNwYW4gc3RydWN0IHsKCXN0YXJ0LCBlbmQgaW50CglyaW5nTWVtYmVyIGJvb2wKfQoKLy8gc2NhbkZhY2V0U3BhbnMgd2Fsa3MgcmVuZGVyR2VtJ3Mgb3duIG1hcmt1cCBvbmNlLCBsZWZ0IHRvIHJpZ2h0LCB3aXRoCi8vIHBsYWluIHN0cmluZyBzY2FubmluZyByYXRoZXIgdGhhbiByZWdleHAgLS0gdGhpcyBydW5zIG9uIGV2ZXJ5Ci8vIFRva2VuVVJJL1JlbmRlciBjYWxsLCBhbmQgQ29sbGVjdGlvblN1bW1hcnkvV2FsbGV0U3VtbWFyeSdzIG93bgovLyBwYWdpbmF0aW9uIGZpeCBhbHJlYWR5IGVzdGFibGlzaGVkIHRoYXQgYW55dGhpbmcgdW5ib3VuZGVkIG9yCi8vIHVubmVjZXNzYXJpbHkgZXhwZW5zaXZlIGluIGEgcGVyLXRva2VuIHJlYWQgcGF0aCBiZWNvbWVzIGEgcmVhbCAib3V0Ci8vIG9mIGdhcyIgZmFpbHVyZSBhdCByZWFsIGNvbGxlY3Rpb24gc2l6ZXMsIG5vdCBhIHRoZW9yZXRpY2FsIGNvbmNlcm4uCmZ1bmMgc2NhbkZhY2V0U3BhbnMobWFya3VwIHN0cmluZykgW11mYWNldFNwYW4gewoJdmFyIHNwYW5zIFtdZmFjZXRTcGFuCglpIDo9IDAKCWZvciB7CgkJcmVsIDo9IHN0cmluZ3MuSW5kZXgobWFya3VwW2k6XSwgIjwiKQoJCWlmIHJlbCA8IDAgewoJCQlicmVhawoJCX0KCQlzdGFydCA6PSBpICsgcmVsCgkJcmVsRW5kIDo9IHN0cmluZ3MuSW5kZXgobWFya3VwW3N0YXJ0Ol0sICIvPiIpCgkJaWYgcmVsRW5kIDwgMCB7CgkJCWJyZWFrCgkJfQoJCWVuZCA6PSBzdGFydCArIHJlbEVuZCArIDIKCQl0YWcgOj0gbWFya3VwW3N0YXJ0OmVuZF0KCQlpID0gZW5kCgkJaXNGYWNldFRhZyA6PSBzdHJpbmdzLkhhc1ByZWZpeCh0YWcsICI8cGF0aCIpIHx8IHN0cmluZ3MuSGFzUHJlZml4KHRhZywgIjxjaXJjbGUiKSB8fCBzdHJpbmdzLkhhc1ByZWZpeCh0YWcsICI8cG9seWdvbiIpCgkJaWYgIWlzRmFjZXRUYWcgewoJCQljb250aW51ZQoJCX0KCQlzcGFucyA9IGFwcGVuZChzcGFucywgZmFjZXRTcGFue3N0YXJ0OiBzdGFydCwgZW5kOiBlbmQsIHJpbmdNZW1iZXI6IHN0cmluZ3MuQ29udGFpbnModGFnLCBgY2xhc3M9ImYiYCl9KQoJfQoJcmV0dXJuIHNwYW5zCn0KCgovLyBhcHBseUNhc2NhZGUgaXMgdGhlIHN0b25lJ3MgZmlyZS4gRXZlcnkgZmxhc2gtY2FwYWJsZSBmYWNldCAoY2xhc3MKLy8gImYiLCBjaG9zZW4gaW4gcmVuZGVyR2VtM0QpIGdldHMgYSBkdXBsaWNhdGUgb2YgaXRzIHBhdGggc3RhY2tlZCBhYm92ZQovLyB0aGUgZmFjZXRzLCBhbmQgQUxMIG9mIHRoZW0gc2hhcmUgdHdvIGtleWZyYW1lIHJ1bGVzIHBlciBzdG9uZSBpbnN0ZWFkCi8vIG9mIG93bmluZyBvbmUgZWFjaCAtLSB0aGUgcGVyLWZhY2V0IGtleWZyYW1lIGJsb2NrcyB3ZXJlIHNldmVyYWwKLy8ga2lsb2J5dGVzIG9mIGV2ZXJ5IHRva2VuLiBXaGF0IGRpZmZlcnMgcGVyIGZhY2V0IHJpZGVzIG9uIHRoZSBlbGVtZW50Ci8vIGl0c2VsZjogLS1jIGl0cyBzcGVjdHJhbCBjb2xvdXIsIC0tbyBpdHMgcGVhayBzdHJlbmd0aCwgYW5kIGFuCi8vIGFuaW1hdGlvbi1kZWxheSB0aGF0IHBsYWNlcyBpdCBpbiB0aGUgc3dlZXAuCi8vCi8vIFRoZSBmbGFzaCBzaGFwZSBpcyB1bmNoYW5nZWQgZnJvbSB0aGUgaGFuZC1zY2hlZHVsZWQgdmVyc2lvbjogd2hpdGUgYXQKLy8gdGhlIHBlYWssIHRoZSBmYWNldCdzIG93biBzcGVjdHJhbCBjb2xvdXIgb24gdGhlIGRlY2F5LCB1bmRlciBhIHNlY29uZC4KLy8gUnVsZSBBIGZpcmVzIG9uIHRoZSByb2NrIGFuaW1hdGlvbidzIGNsb2Nrd2lzZSBtaWQtc3dpbmcgYW5kIHN3ZWVwcwovLyBhbG9uZyBmaXJlU3dlZXBBeGlzOyBydWxlIEIgZmlyZXMgb24gdGhlIHJldHVybiBzd2luZyBhbmQgc3dlZXBzIHRoZQovLyBvdGhlciB3YXkuIEZhY2V0cyBhcmUgc3BsaXQgYmV0d2VlbiB0aGUgdHdvLCBzbyBhIHN0b25lIHNwYXJrbGVzCi8vIGZvcnRoIGFuZCBiYWNrIGluIHRpbWUgd2l0aCBpdHMgb3duIG1vdGlvbiAocGVyaW9kID0gdHdvIHJvY2sgY3ljbGVzLAovLyBkZWxheXMgb2Zmc2V0IGZyb20gdGhlIHRva2VuJ3Mgcm9jayBwaGFzZSwgc2VlIG1vdGlvblBoYXNlcykuCmNvbnN0ICgKCWZpcmVTd2VlcEF4aXMgPSAtMzUuMCAqIG1hdGguUGkgLyAxODAKCWZpcmVTd2VlcFNwYW4gPSAxLjYgLy8gc2Vjb25kcyBhIHN3ZWVwIHRha2VzIHRvIGNyb3NzIHRoZSBzdG9uZQopCgpmdW5jIGFwcGx5Q2FzY2FkZShtYXJrdXAsIHRpZFN0ciBzdHJpbmcsIGZzICpmYWNldFN0eWxlKSAob3ZlcmxheSBzdHJpbmcsIGNzcyBzdHJpbmcpIHsKCWlmIGZzID09IG5pbCB8fCBsZW4oZnMucmluZ0NlbnQpID09IDAgewoJCXJldHVybiAiIiwgIiIKCX0KCXNwYW5zIDo9IHNjYW5GYWNldFNwYW5zKG1hcmt1cCkKCXJuZCA6PSBuZXdQUk5HKCJmaXJlIiArIHRpZFN0cikKCV8sIF8sIHJwaGFzZSwgXywgXyA6PSBtb3Rpb25QaGFzZXModGlkU3RyKQoJcGVyaW9kIDo9IDIgKiBtb3Rpb25SRHVyCglheGlzIDo9IGZpcmVTd2VlcEF4aXMgKyBybmQuZmxvYXRJbigtMC4zLCAwLjMpCglkeCwgZHkgOj0gbWF0aC5Db3MoYXhpcyksIG1hdGguU2luKGF4aXMpCgoJLy8gZmxhc2g6IDAgLT4gd2hpdGUgcGVhayAtPiBjb2xvdXJlZCBkZWNheSAtPiAwLCBpbiB0aGUgZmlyc3QgfjglIG9mCgkvLyB0aGUgcGVyaW9kICh+MC45cyk7IEIgaXMgdGhlIHNhbWUgc2hhcGUgaGFsZiBhIHBlcmlvZCBsYXRlci4KCWthLCBrYiA6PSAiZmEiK3RpZFN0ciwgImZiIit0aWRTdHIKCXNoYXBlIDo9IGZ1bmMoYXQgZmxvYXQ2NCkgc3RyaW5nIHsKCQlyZXR1cm4gZm51bTEoYXQpICsgYCV7b3BhY2l0eTowfWAgKyBmbnVtMShhdCsyKSArIGAle29wYWNpdHk6dmFyKC0tbyk7ZmlsbDojZmZmfWAgKwoJCQlmbnVtMShhdCs0LjUpICsgYCV7b3BhY2l0eTouNDtmaWxsOnZhcigtLWMpfWAgKyBmbnVtMShhdCs4KSArIGAle29wYWNpdHk6MH1gCgl9CglwZXIgOj0gZm51bShwZXJpb2QpCgkvLyBvcGFjaXR5PSIwIiByaWRlcyBvbiBlYWNoIG92ZXJsYXkgYXMgYW4gYXR0cmlidXRlLCBub3Qgb25seSBpbiB0aGlzCgkvLyBDU1M6IGEgdGh1bWJuYWlsZXIgdGhhdCBpZ25vcmVzIENTUyBhbmltYXRpb24gKG9yIENTUykgbXVzdCBzZWUgdGhlCgkvLyByZXN0aW5nIHN0YXRlLCBub3QgYW4gdW5maWxsZWQgKGJsYWNrKSBjb3B5IG9mIGV2ZXJ5IGZsYXNoIGZhY2V0LgoJY3NzID0gYC5gICsga2EgKyBge2FuaW1hdGlvbjpgICsga2EgKyBgIGAgKyBwZXIgKyBgcyBsaW5lYXIgaW5maW5pdGV9LmAgKyBrYiArIGB7YW5pbWF0aW9uOmAgKyBrYiArIGAgYCArIHBlciArIGBzIGxpbmVhciBpbmZpbml0ZX1gICsKCQlgQGtleWZyYW1lcyBgICsga2EgKyBge2AgKyBzaGFwZSgxMi41KSArIGAxMDAle29wYWNpdHk6MH19YCArCgkJYEBrZXlmcmFtZXMgYCArIGtiICsgYHtgICsgc2hhcGUoNjIuNSkgKyBgMTAwJXtvcGFjaXR5OjB9fWAKCgl2YXIgb3V0IHN0cmluZ3MuQnVpbGRlcgoJdHlwZSBnbGludEF0IHN0cnVjdCB7CgkJeCwgeSwgZGVsYXkgZmxvYXQ2NAoJCXJ1bGUgICAgICAgIHN0cmluZwoJfQoJdmFyIGNhbmRzIFtdZ2xpbnRBdAoJcmluZ0lkeCA6PSAtMQoJZm9yIF8sIHNwYW4gOj0gcmFuZ2Ugc3BhbnMgewoJCWlmICFzcGFuLnJpbmdNZW1iZXIgewoJCQljb250aW51ZQoJCX0KCQlyaW5nSWR4KysKCQlpZiByaW5nSWR4ID49IGxlbihmcy5yaW5nQ2VudCkgewoJCQlicmVhawoJCX0KCQljIDo9IGZzLnJpbmdDZW50W3JpbmdJZHhdCgkJY29sb3IsIGNvbG9yT3AgOj0gZnMuZmxhc2guc2FtcGxlKGMueCwgYy55KQoJCS8vIHBvc2l0aW9uIGFsb25nIHRoZSBzd2VlcCBheGlzLCAtMS4uMSBhY3Jvc3MgdGhlIHN0b25lCgkJcG9zIDo9ICgoYy54LXN1YmpYKSpkeCArIChjLnktZ2VtQ1kpKmR5KSAvICgzMCAqIHN0b25lU2NhbGUpCgkJbmFtZSA6PSBrYQoJCWlmIHJuZC5mbG9hdEluKDAsIDEpIDwgMC41IHsKCQkJbmFtZSwgcG9zID0ga2IsIC1wb3MKCQl9CgkJLy8gdGhlIHJvY2sgcnVucyBhdCBkZWxheSAtcnBoYXNlOyB0aGUgZmxhc2ggd2luZG93cyBzaXQgYXQgMTIuNSUKCQkvLyBhbmQgNjIuNSUgb2YgdHdvIHJvY2sgY3ljbGVzID0gdGhlIHJvY2sncyB0d28gbWlkLXN3aW5ncwoJCWRlbGF5IDo9IHJwaGFzZSAtIDAuMjUqbW90aW9uUkR1ciArIHBlcmlvZCAtIHBvcypmaXJlU3dlZXBTcGFuLzIKCQl0YWcgOj0gbWFya3VwW3NwYW4uc3RhcnQ6c3Bhbi5lbmRdCgkJZ2VvbUVuZCA6PSBzdHJpbmdzLkluZGV4KHRhZywgYCIgZmlsbD1gKQoJCWlmIGdlb21FbmQgPCAwIHsKCQkJY29udGludWUKCQl9CgkJY2FuZHMgPSBhcHBlbmQoY2FuZHMsIGdsaW50QXR7Yy54LCBjLnksIGRlbGF5LCBuYW1lfSkKCQlvdXQuV3JpdGVTdHJpbmcodGFnWzpnZW9tRW5kXSArIGAiIG9wYWNpdHk9IjAiIGNsYXNzPSJgICsgbmFtZSArIGAiIHN0eWxlPSItLW86YCArIGZudW0obWF0aC5Sb3VuZChtYXRoLk1pbigxLCBybmQuZmxvYXRJbigwLjg1LCAxLjA1KSpjb2xvck9wKSoxMCkvMTApICsgYDstLWM6YCArIGhleDMoY29sb3IpICsKCQkJYDthbmltYXRpb24tZGVsYXk6LWAgKyBmbnVtMShkZWxheSkgKyBgcyIvPmApCgl9CgkvLyBTdGFyIGdsaW50czogdGhlIGJyaWdodGVzdCBtb21lbnQgb2YgYSByZWFsIGRpYW1vbmQgaXMgYSBwaW5wb2ludCB0aGF0CgkvLyB0aHJvd3MgZm91ciByYXlzLiBUaHJlZSBmYWNldHMgKG9uZSBvbiB0aGUgZm9yd2FyZCBzd2VlcCwgdHdvIHNwcmVhZAoJLy8gb3V0KSBlYWNoIGdldCBhIGZvdXItcG9pbnQgc3RhciB0aGF0IHBvcHMgYXQgdGhhdCBmYWNldCdzIHdoaXRlIHBlYWsKCS8vIC0tIHNhbWUgZGVsYXkgYXMgaXRzIGZsYXNoLCBzbyBpdCBsYW5kcyBleGFjdGx5IGFzIHRoZSBmYWNldCBnb2VzCgkvLyB3aGl0ZSAtLSBzY2FsZXMgdXAgd2l0aCBhIHNtYWxsIHR3aXN0IGFuZCBjb2xsYXBzZXMuIFBsYWluIHBhdGhzIG9uCgkvLyB0cmFuc2Zvcm0gKyBvcGFjaXR5IG9ubHk7IG9wYWNpdHk9IjAiIHJlc3RzIHRoZW0gZm9yIHRodW1ibmFpbGVycy4KCWlmIGxlbihjYW5kcykgPiAwICYmIGZzLnByb2Yuc2F0ID49IDAuMyB7CgkJbiA6PSAzCgkJaWYgZnMucHJvZi5zYXQgPCAwLjYgewoJCQluID0gMiAvLyBxdWFydHosIHRvcGF6OiBsZXNzIGZpcmUsIGZld2VyIHN0YXJzCgkJfQoJCWdhLCBnYiA6PSAiZ2EiK3RpZFN0ciwgImdiIit0aWRTdHIKCQlzdGFyIDo9IGZ1bmMoYXQgZmxvYXQ2NCkgc3RyaW5nIHsKCQkJcmV0dXJuIGZudW0xKGF0KzAuNikgKyBgJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKC4yKSByb3RhdGUoMCl9YCArCgkJCQlmbnVtMShhdCsyLjIpICsgYCV7b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZSgxKSByb3RhdGUoMjVkZWcpfWAgKwoJCQkJZm51bTEoYXQrNC40KSArIGAle29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoLjM1KSByb3RhdGUoNTVkZWcpfWAKCQl9CgkJY3NzICs9IGAuYCArIGdhICsgYCwuYCArIGdiICsgYHtvcGFjaXR5OjB9YCArCgkJCWAuYCArIGdhICsgYHthbmltYXRpb246YCArIGdhICsgYCBgICsgcGVyICsgYHMgbGluZWFyIGluZmluaXRlfS5gICsgZ2IgKyBge2FuaW1hdGlvbjpgICsgZ2IgKyBgIGAgKyBwZXIgKyBgcyBsaW5lYXIgaW5maW5pdGV9YCArCgkJCWBAa2V5ZnJhbWVzIGAgKyBnYSArIGB7MCV7b3BhY2l0eTowfWAgKyBzdGFyKDEyLjUpICsgYDEwMCV7b3BhY2l0eTowfX1gICsKCQkJYEBrZXlmcmFtZXMgYCArIGdiICsgYHswJXtvcGFjaXR5OjB9YCArIHN0YXIoNjIuNSkgKyBgMTAwJXtvcGFjaXR5OjB9fWAKCQlyIDo9IDcuNSAqIHN0b25lU2NhbGUKCQl3IDo9IDAuOSAqIHN0b25lU2NhbGUKCQlyYXkgOj0gYE0wIC1gICsgZm51bTEocikgKyBgTGAgKyBmbnVtMSh3KSArIGAgLWAgKyBmbnVtMSh3KSArIGBMYCArIGZudW0xKHIpICsgYCAwTGAgKyBmbnVtMSh3KSArIGAgYCArIGZudW0xKHcpICsKCQkJYEwwIGAgKyBmbnVtMShyKSArIGBMLWAgKyBmbnVtMSh3KSArIGAgYCArIGZudW0xKHcpICsgYEwtYCArIGZudW0xKHIpICsgYCAwTC1gICsgZm51bTEodykgKyBgIC1gICsgZm51bTEodykgKyBgWmAKCQl2YXIgZyBzdHJpbmdzLkJ1aWxkZXIKCQl1c2VkIDo9IG1hcFtpbnRdYm9vbHt9CgkJZm9yIGsgOj0gMDsgayA8IG4gJiYgayA8IGxlbihjYW5kcyk7IGsrKyB7CgkJCWkgOj0gcm5kLmludG4obGVuKGNhbmRzKSkKCQkJZm9yIHRyaWVzIDo9IDA7IHVzZWRbaV0gJiYgdHJpZXMgPCBsZW4oY2FuZHMpOyB0cmllcysrIHsKCQkJCWkgPSAoaSArIDEpICUgbGVuKGNhbmRzKQoJCQl9CgkJCXVzZWRbaV0gPSB0cnVlCgkJCWMgOj0gY2FuZHNbaV0KCQkJY2xzIDo9ICJnYSIgKyB0aWRTdHIKCQkJaWYgYy5ydWxlID09IGtiIHsKCQkJCWNscyA9ICJnYiIgKyB0aWRTdHIKCQkJfQoJCQlnLldyaXRlU3RyaW5nKGA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZShgICsgZm51bTEoYy54KSArIGAgYCArIGZudW0xKGMueSkgKyBgKSI+PGcgY2xhc3M9ImAgKyBjbHMgKyBgIiBvcGFjaXR5PSIwIiBzdHlsZT0iYW5pbWF0aW9uLWRlbGF5Oi1gICsgZm51bTEoYy5kZWxheSkgKyBgcyI+YCArCgkJCQlgPHBhdGggZD0iYCArIHJheSArIGAiIGZpbGw9IiNmZmYiLz48Y2lyY2xlIHI9ImAgKyBmbnVtMSgxLjEqc3RvbmVTY2FsZSkgKyBgIiBmaWxsPSIjZmZmIi8+PC9nPjwvZz5gKQoJCX0KCQlmcy5nbGludHMgPSBnLlN0cmluZygpCgl9CglyZXR1cm4gb3V0LlN0cmluZygpLCBjc3MKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsYWJlbCArIHNlcmlhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpmdW5jIHJlbmRlck1ldGFsTGFiZWxSZWN0KG1ldGFsSGksIG1ldGFsTG8gc3RyaW5nLCB4LCB5LCB3LCBoLCByeCBmbG9hdDY0LCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCS8vIEVjaG9lcyB0aGUgcmluZydzIG11bHRpLWJhbmQgdGlsdCBidXQgaGVhdmlseSBtdXRlZCDigJQgYSBzb2Z0CgkvLyB0d28tc3RlcCBibGVuZCBpbnN0ZWFkIG9mIHRoZSByaW5nJ3MgaGFyZCBhbHRlcm5hdGluZyBzdG9wcywgc28gdGhlCgkvLyBiYXIgZG9lc24ndCB2aXN1YWxseSBmaWdodCB0aGUgY2hhaW4tbmFtZSB0ZXh0IHNpdHRpbmcgb24gdG9wIG9mIGl0LgoJZ2lkIDo9ICJsZyIgKyBzYWx0CgkvLyBBIGJydXNoZWQgbWV0YWwgcGxhdGUgcmF0aGVyIHRoYW4gYSBmbGF0IGJhcjogYSBob3Jpem9udGFsIHN3ZWVwCgkvLyB3aXRoIGEgYnJpZ2h0IGJhbmQsIGEgZGFyayBvdXRsaW5lIHRoYXQgc2VhdHMgaXQgb24gdGhlIGNhbnZhcywgYQoJLy8gbGlnaHQgdG9wIGVkZ2UgYW5kIGRhcmsgYm90dG9tIGVkZ2UgKGJldmVsKSwgYW5kIGEgcml2ZXQgaW4gZWFjaAoJLy8gY29ybmVyLiBUaGUgY2hhaW4gdGV4dCBpcyBkcmF3biBvbiB0b3AgYnkgUmVuZGVyVG9rZW5TVkcgd2l0aCBhbgoJLy8gZW5ncmF2ZWQgc2hhZG93IChzZWUgdGhlcmUpLiBQbGFpbiBzaGFwZXMsIG9uZSBncmFkaWVudC4KCWJyaWdodCA6PSBsaWdodGVuKG1ldGFsSGksIDAuNCkKCWRlZXAgOj0gbWl4SGV4KG1ldGFsTG8sICIjMDAwMDAwIiwgMC41KQoJc3QgOj0gZnVuYyhvZmYsIGMgc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gYDxzdG9wIG9mZnNldD0iYCArIG9mZiArIGAiIHN0b3AtY29sb3I9ImAgKyBjICsgYCIvPmAgfQoJZGVmcyA6PSBgPGxpbmVhckdyYWRpZW50IGlkPSJgICsgZ2lkICsgYCI+YCArCgkJc3QoIjAiLCBtZXRhbExvKSArIHN0KCIuMjIiLCBtZXRhbEhpKSArIHN0KCIuNDIiLCBicmlnaHQpICsgc3QoIi42MiIsIG1ldGFsSGkpICsgc3QoIjEiLCBtZXRhbExvKSArIGA8L2xpbmVhckdyYWRpZW50PmAKCXJlY3QgOj0gYDxyZWN0IHg9ImAgKyBjbnVtKHgpICsgYCIgeT0iYCArIGNudW0oeSkgKyBgIiB3aWR0aD0iYCArIGNudW0odykgKyBgIiBoZWlnaHQ9ImAgKyBjbnVtKGgpICsgYCIgcng9ImAgKyBjbnVtKHJ4KSArIGAiIGZpbGw9InVybCgjYCArIGdpZCArIGApIiBzdHJva2U9ImAgKyBkZWVwICsgYCIgc3Ryb2tlLXdpZHRoPSIuOCIvPmAKCS8vIEJldmVsIGVkZ2VzIGZvbGxvdyB0aGUgcGxhdGUncyBvd24gcm91bmRlZCBvdXRsaW5lLCBpbnNldCBhIGhhaXI6CgkvLyBhIHRoaW4gc29mdCBoaWdobGlnaHQgYWxvbmcgdGhlIHRvcCBjaGFtZmVyLCBhIHRoaW4gc2hhZGUgYWxvbmcgdGhlCgkvLyBib3R0b20gb25lIC0tIGxvdyBjb250cmFzdCwgdGhlIHdheSBhIHJlYWwgbWFjaGluZWQgZWRnZSByZWFkcy4KCWNvbnN0IGluXyA9IDAuOQoJYXJjIDo9IGAgYWAgKyBjbnVtKHJ4LWluXykgKyBgIGAgKyBjbnVtKHJ4LWluXykgKyBgIDAgMCBgCglkIDo9IGNudW0ocnggLSBpbl8pCgllZGdlcyA6PSBgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj5gICsKCQlgPHBhdGggZD0iTWAgKyBjbnVtKHgraW5fKSArIGAgYCArIGNudW0oeStyeCkgKyBhcmMgKyBgMSBgICsgZCArIGAgLWAgKyBkICsgYEhgICsgY251bSh4K3ctcngpICsgYXJjICsgYDEgYCArIGQgKyBgIGAgKyBkICsgYCIgc3Ryb2tlPSJgICsgbGlnaHRlbihtZXRhbEhpLCAwLjQ1KSArIGAiIHN0cm9rZS13aWR0aD0iLjQ1IiBvcGFjaXR5PSIuNCIvPmAgKwoJCWA8cGF0aCBkPSJNYCArIGNudW0oeCtpbl8pICsgYCBgICsgY251bSh5K2gtcngpICsgYXJjICsgYDAgYCArIGQgKyBgIGAgKyBkICsgYEhgICsgY251bSh4K3ctcngpICsgYXJjICsgYDAgYCArIGQgKyBgIC1gICsgZCArIGAiIHN0cm9rZT0iYCArIGRlZXAgKyBgIiBzdHJva2Utd2lkdGg9Ii41IiBvcGFjaXR5PSIuNSIvPjwvZz5gCgkvLyBTbG90dGVkIHNjcmV3czogYSBzaGFkb3dlZCBjb3VudGVyc2luaywgYSBoZWFkIGEgc2hhZGUgb2ZmIHRoZSBwbGF0ZQoJLy8gdG9uZSB3aXRoIGEgc29mdCBzaGVlbiB1cC1sZWZ0LCBhbmQgYSBzbG90IGF0IGEgZGlmZmVyZW50IGFuZ2xlIHBlcgoJLy8gc2NyZXcgKGFuZCBwZXIgdG9rZW4pLiBUaGUgaGVhZCBpcyBkZWZpbmVkIG9uY2UgYW5kIHBsYWNlZCB3aXRoCgkvLyA8dXNlPjsgYWxsIGZvdXIgc2xvdHMgYXJlIG9uZSBwYXRoIC0tIGJ5dGVzIG1hdHRlciBvbiBldmVyeSByZWFkLgoJc2lkIDo9ICJzaCIgKyBzYWx0CglkZWZzICs9IGA8ZyBpZD0iYCArIHNpZCArIGAiPjxjaXJjbGUgY3g9Ii4xNSIgY3k9Ii4yIiByPSIxLjYiIGZpbGw9ImAgKyBkZWVwICsgYCIgb3BhY2l0eT0iLjU1Ii8+YCArCgkJYDxjaXJjbGUgcj0iMS4zIiBmaWxsPSJgICsgbWl4SGV4KG1ldGFsTG8sIG1ldGFsSGksIDAuNCkgKyBgIiBzdHJva2U9ImAgKyBkZWVwICsgYCIgc3Ryb2tlLXdpZHRoPSIuMjUiLz5gICsKCQlgPGNpcmNsZSBjeD0iLS40IiBjeT0iLS40IiByPSIuNzUiIGZpbGw9ImAgKyBsaWdodGVuKG1ldGFsSGksIDAuMykgKyBgIiBvcGFjaXR5PSIuMzUiLz48L2c+YAoJc2VlZCA6PSAwCglmb3IgayA6PSAwOyBrIDwgbGVuKHNhbHQpOyBrKysgewoJCXNlZWQgKz0gaW50KHNhbHRba10pCgl9CgloZWFkcywgc2xvdHMgOj0gIiIsICIiCgluIDo9IDAKCWZvciBfLCBweCA6PSByYW5nZSBbXWZsb2F0NjR7eCArIDQuMiwgeCArIHcgLSA0LjJ9IHsKCQlmb3IgXywgcHkgOj0gcmFuZ2UgW11mbG9hdDY0e3kgKyAzLjcsIHkgKyBoIC0gMy43fSB7CgkJCWhlYWRzICs9IGA8dXNlIGhyZWY9IiNgICsgc2lkICsgYCIgeD0iYCArIGNudW0ocHgpICsgYCIgeT0iYCArIGNudW0ocHkpICsgYCIvPmAKCQkJYW5nIDo9IGZsb2F0NjQoKHNlZWQqMzcrbio3MSklMTgwKSAqIG1hdGguUGkgLyAxODAKCQkJZHgsIGR5IDo9IDAuOSptYXRoLkNvcyhhbmcpLCAwLjkqbWF0aC5TaW4oYW5nKQoJCQlzbG90cyArPSBgTWAgKyBjbnVtKHB4LWR4KSArIGAgYCArIGNudW0ocHktZHkpICsgYGxgICsgY251bSgyKmR4KSArIGAgYCArIGNudW0oMipkeSkKCQkJbisrCgkJfQoJfQoJcml2ZXRzIDo9IGhlYWRzICsgYDxwYXRoIGQ9ImAgKyBzbG90cyArIGAiIHN0cm9rZT0iYCArIGRlZXAgKyBgIiBzdHJva2Utd2lkdGg9Ii40NSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+YAoJcmV0dXJuIGA8ZGVmcz5gICsgZGVmcyArIGA8L2RlZnM+YCArIHJlY3QgKyBlZGdlcyArIHJpdmV0cwp9CgovLyBQbGF0ZSBsZXR0ZXJpbmcuIFNWR3Mgc2hvd24gYXMgPGltZz4gY2FuJ3QgbG9hZCB3ZWIgZm9udHMsIHNvIHRoaXMgaXMgYQovLyBzeXN0ZW0tZm9udCBzdGFjazogRElOLXN0eWxlIGVuZ2luZWVyaW5nIGNhcGl0YWxzIHdoZXJlIHRoZSBPUyBoYXMgb25lCi8vIChESU4gQWx0ZXJuYXRlIG9uIEFwcGxlLCBCYWhuc2NocmlmdCBvbiBXaW5kb3dzLCBSb2JvdG8gQ29uZGVuc2VkIG9uCi8vIEFuZHJvaWQpLCB0cmFja2VkIG91dCBsaWtlIHN0YW1wZWQgbmFtZXBsYXRlIHR5cGUuIEVuZ3JhdmVkIHJhdGhlciB0aGFuCi8vIGVtYm9zc2VkOiB0aGUgbGV0dGVycyBzaXQgaW4gdGhlIHBsYXRlIGFuZCB0aGVpciBsb3dlciBsaXAgY2F0Y2hlcyB0aGUKLy8gbGlnaHQsIHNvIHRoZSBoaWdobGlnaHQgY29weSBnb2VzIGEgaGFpciBCRUxPVyB0aGUgZmlsbC4KY29uc3QgKAoJcGxhdGVGb250ICAgID0gYCdESU4gQWx0ZXJuYXRlJyxCYWhuc2NocmlmdCwnUm9ib3RvIENvbmRlbnNlZCcsc2Fucy1zZXJpZmAKCXBsYXRlU2l6ZSAgICA9IDguNgoJcGxhdGVTcGFjaW5nID0gMS4xCglwbGF0ZU1heFcgICAgPSAxMDAuMAopCgpmdW5jIHJlbmRlclBsYXRlVGV4dChsYWJlbCwgZmlsbCwgbWV0YWxIaSBzdHJpbmcpIHN0cmluZyB7CglnIDo9IGA8ZyBmb250LXNpemU9ImAgKyBjbnVtKHBsYXRlU2l6ZSkgKyBgIiBsZXR0ZXItc3BhY2luZz0iYCArIGNudW0ocGxhdGVTcGFjaW5nKSArIGAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJgICsgcGxhdGVGb250ICsgYCIgZm9udC13ZWlnaHQ9IjcwMCJgCgkvLyBSb3VnaCB3aWR0aCBlc3RpbWF0ZSAoY29uZGVuc2VkIGNhcHMgfjAuNTJlbSBwbHVzIHRyYWNraW5nKTsgb25seSBhCgkvLyBsYWJlbCB0aGF0IHdvdWxkIHJ1biBpbnRvIHRoZSBzY3Jld3MgZ2V0cyBzcXVlZXplZCB0byBmaXQuCglpZiBlc3QgOj0gZmxvYXQ2NChsZW4obGFiZWwpKSoocGxhdGVTaXplKjAuNTIrcGxhdGVTcGFjaW5nKTsgZXN0ID4gcGxhdGVNYXhXIHsKCQlnICs9IGAgdGV4dExlbmd0aD0iYCArIGNudW0ocGxhdGVNYXhXKSArIGAiIGxlbmd0aEFkanVzdD0ic3BhY2luZ0FuZEdseXBocyJgCgl9Cgl4IDo9IGNudW0oc3VialgpCglyZXR1cm4gZyArIGA+PHRleHQgeD0iYCArIHggKyBgIiB5PSIxNDQuOSIgZmlsbD0iYCArIGxpZ2h0ZW4obWV0YWxIaSwgMC41KSArIGAiIG9wYWNpdHk9Ii40NSI+YCArIGxhYmVsICsgYDwvdGV4dD5gICsKCQlgPHRleHQgeD0iYCArIHggKyBgIiB5PSIxNDQuNCIgZmlsbD0iYCArIGZpbGwgKyBgIj5gICsgbGFiZWwgKyBgPC90ZXh0PjwvZz5gCn0KCi8vIHJlbmRlclNlcmlhbFRleHQgdXNlcyB0aGUgdG9rZW4ncyBSRUFMIGFzc2lnbmVkIElEIChhbHJlYWR5IHRoZSBleGFjdAovLyBDcm9ja2ZvcmQtYmFzZTMyIHNlcWlkIGZvcm1hdCBnbm8ubGFuZCBpdHNlbGYgcHJvZHVjZXMpIOKAlCBubyBsb29rdXAKLy8gdGFibGUgb3IgcmVpbXBsZW1lbnRlZCBlbmNvZGluZyBuZWVkZWQsIHVubGlrZSB0aGUgUHl0aG9uIHByb3RvdHlwZQovLyB3aGljaCBoYWQgdG8gaGFyZGNvZGUgYSB2ZXJpZmllZCBzYW1wbGUgb2YgcmVhbCBJRHMgc2luY2UgaXQgY291bGRuJ3QKLy8gY2FsbCB0aGUgcmVhbCBwYWNrYWdlIGRpcmVjdGx5LgpmdW5jIHJlbmRlclNlcmlhbFRleHQodGlkU3RyLCBjb2xvciBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gYDx0ZXh0IHg9ImAgKyBmbnVtKHN1YmpYKSArIGAiIHk9IjE1OS41IiBmb250LXNpemU9IjYuNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iYCArIGNvbG9yICsgYCIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSxtb25vc3BhY2UiIG9wYWNpdHk9IjAuODUiPiNgICsgdGlkU3RyICsgYDwvdGV4dD5gCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RvbmUgLyBjb2xvciAvIG1ldGFsIHRhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgp0eXBlIG5hbWVkQ29sb3Igc3RydWN0eyBoZXgsIG5hbWUgc3RyaW5nIH0KCi8vIHN0b25lQnlDaGFpbiwgc3RvbmVQYWxldHRlcywgYW5kIHN0b25lTmFtZXMgYXJlIG11dGFibGUsIG5vdCBjb25zdCAtLQovLyBhIGRlbGliZXJhdGUgZGVwYXJ0dXJlIGZyb20gdGhpcyBmaWxlJ3MgInB1cmUgZnVuY3Rpb25zLCBubyBzdGF0ZSIKLy8gZGVzaWduIChzZWUgdGhlIHBhY2thZ2UgZG9jIGNvbW1lbnQpLiBPcmlnaW5hbGx5IGhhcmRjb2RlZCBzd2l0Y2gKLy8gc3RhdGVtZW50cyBjb3ZlcmluZyBvbmx5IFRvcGF6LTEvU2FwcGhpcmUtMSwgc2VlZGVkIGhlcmUgd2l0aCB0aGUKLy8gc2FtZSByZWFsIGdlbW9sb2d5IHJlc2VhcmNoLCBidXQgbm93IGVkaXRhYmxlIHZpYSBTZXRTdG9uZUZvckNoYWluLwovLyBBZGRTdG9uZUNvbG9yIChuZnRtaW50ZXIuZ25vKSBzbyBhIEZVVFVSRSBnbm8ubGFuZCB0ZXN0bmV0IGdlbmVyYXRpb24KLy8gdGhhdCBnZXRzIGEgcmVhbCBnZW0gY29kZW5hbWUgY2FuIGJlIHJlY29nbml6ZWQgd2l0aG91dCBhIGNvbnRyYWN0Ci8vIHJlZGVwbG95IOKAlCB0aGUgd2hvbGUgcG9pbnQgb2YgcHV0dGluZyB0aGlzIGRhdGEgaW4gc3RhdGUgaW5zdGVhZCBvZgovLyBzb3VyY2UuCnZhciBzdG9uZUJ5Q2hhaW4gPSBtYXBbc3RyaW5nXXN0cmluZ3sKCSJUT1BBWi0xIjogICAgIlRvcGF6IiwKCSJTQVBQSElSRS0xIjogIlNhcHBoaXJlIiwKCSJQRUFSTC0xIjogICAgIlBlYXJsIiwKCS8vIE1haW5uZXQuIERpYW1vbmQ6IHRoZSBoYXJkZXN0LCBtb3N0LWRpc3BlcnNpdmUgc3RvbmUgZm9yIHRoZSBjaGFpbgoJLy8gdGhhdCBpcyBmaW5hbCwgYW5kIHRoZSBvbmUgZ2VtIGV2ZXJ5IGNvbGxlY3RvciByZWFkcyBhdCBhIGdsYW5jZS4KCSJHTk9MQU5ELTEiOiAiRGlhbW9uZCIsCn0KCi8vIEFsbCBoZXggdmFsdWVzIGhlcmUgKGV4Y2VwdCBSZWQsIHNlZSAiTm90IFNldCIgYmVsb3cpIGFyZSB0aGUgb3JpZ2luYWwKLy8gcGFsZXR0ZSBydW4gdGhyb3VnaCB0aGUgZXhhY3QgQ1NTL1NWRyBmZUNvbG9yTWF0cml4IHR5cGU9InNhdHVyYXRlIgovLyBmb3JtdWxhIGF0IHM9MS41ICgxNTAlKSAtLSBjb25maXJtZWQgYWdhaW5zdCBhIGxpdmUgc2lkZS1ieS1zaWRlCi8vIGNvbXBhcmlzb24gKHRocmVlIHNhdHVyYXRpb24gbGV2ZWxzLCBzYW1lIHNpeCByZWFsIG1pbnRlZCBwaWVjZXMpCi8vIGJlZm9yZSBjaG9vc2luZyB0aGlzIG9uZSwgInRoZSBlbmhhbmNlZCBzYXR1cmF0aW9uIiBvdmVyIGJvdGggdGhlCi8vIG9yaWdpbmFsIDEwMCUgYW5kIGEgbW9yZSBleHRyZW1lIDIwMCUgb3B0aW9uLiBOb3QgYSBoYW5kLXBpY2tlZAovLyByZXBhaW50IC0tIGV2ZXJ5IHZhbHVlIGlzIHRoZSBkZXRlcm1pbmlzdGljIG91dHB1dCBvZiB0aGF0IG9uZSBtYXRyaXgsCi8vIHNvIGh1ZXMgc3RheSB0cnVlLCBvbmx5IGludGVuc2l0eSBpbmNyZWFzZXMuCi8vCi8vIEJha2VkIGRpcmVjdGx5IGludG8gdGhlc2UgY29uc3RhbnRzIHJhdGhlciB0aGFuIGFwcGxpZWQgdmlhIGEgbGl2ZQovLyA8ZmlsdGVyPiAob3IgYW4gZXF1aXZhbGVudCBHbyBmdW5jdGlvbiBjYWxsZWQgb24gZXZlcnkgcmVuZGVyKTogYQovLyBsaXZlIGZpbHRlciB1bmRlciBzZXZlcmFsIENTUy1hbmltYXRlZCBhbmNlc3RvcnMsIHRpbWVzIHBvdGVudGlhbGx5Ci8vIGRvemVucyBvZiBnZW1zIHJlbmRlcmVkIG9uIG9uZSBwYWdlIGF0IG9uY2UsIHdhcyBhIHJlYWwsIGNvbmZpcm1lZAovLyBTYWZhcmkgbW90aW9uLWppdHRlciBzb3VyY2UgaW4gdGhpcyBwcm9qZWN0IChzYW1lIGNhdGVnb3J5IG9mIGZpeAovLyBhbHJlYWR5IGFwcGxpZWQgb25jZSBiZWZvcmUsIHRvIHRoZSByaW5ncycgZ2xvdyBlZmZlY3QpLiBQcmVjb21wdXRpbmcKLy8gdGhlIHRhcmdldCBjb2xvciBvbmNlLCBoZXJlLCBhbmQgc2hpcHBpbmcgaXQgYXMgYW4gb3JkaW5hcnkgc3RhdGljCi8vIGZpbGwgdmFsdWUgcmVtb3ZlcyB0aGF0IGNvc3QgZW50aXJlbHkgLS0gbm90aGluZyBsZWZ0IGZvciBhbnkgYnJvd3NlcgovLyB0byByZS1yYXN0ZXJpemUuIFRoZSBtYXRyaXggaXRzZWxmLCBpZiBhIGZ1dHVyZSBwYWxldHRlIGFkZGl0aW9uIGV2ZXIKLy8gbmVlZHMgdG8gcmVwcm9kdWNlIGl0IGJ5IGhhbmQ6Ci8vICAgYT0uMjEzKy43ODdzICBiPS43MTUtLjcxNXMgIGM9LjA3Mi0uMDcycwovLyAgIGQ9LjIxMy0uMjEzcyAgZT0uNzE1Ky4yODVzICBmPS4wNzItLjA3MnMKLy8gICBnPS4yMTMtLjIxM3MgIGg9LjcxNS0uNzE1cyAgaT0uMDcyKy45MjhzCi8vICAgUic9YSpSK2IqRytjKkIgIEcnPWQqUitlKkcrZipCICBCJz1nKlIraCpHK2kqQiAgKHM9MS41IGhlcmUpCnZhciBzdG9uZVBhbGV0dGVzID0gbWFwW3N0cmluZ11bXW5hbWVkQ29sb3J7CgkvLyBBY2N1cmFjeSBwYXNzICgyMDI2LTA5LTI1KSwgZml2ZSBoYW5kLXNldCBleGNlcHRpb25zIHRvIHRoZSBtYXRyaXgKCS8vIHJ1bGUsIGVhY2ggYmVjYXVzZSB0aGUgYm9vc3RlZCB2YWx1ZSBuYW1lZCB0aGUgd3Jvbmcgc3RvbmU6IGJsdWUKCS8vIHNhcHBoaXJlIGlzIHJveWFsL2Nvcm5mbG93ZXIgYmx1ZSwgbm90IGN5YW4gKCMwMGI2ZmYgcmVhZCBhcwoJLy8gYXF1YW1hcmluZSk7IGdyZWVuIHNhcHBoaXJlIGlzIHRlYWwtZ3JlZW4sIG5vdCBlbWVyYWxkIGdyZWVuOwoJLy8gcGFkcGFyYWRzY2hhIGlzIGJ5IGRlZmluaXRpb24gcGlua2lzaC1vcmFuZ2UgKGxvdHVzKSwgbm90IG9yYW5nZS0KCS8vIHJlZDsgbmF0dXJhbCBibHVlIHRvcGF6IGlzIHBhbGUgc2t5IGJsdWUgKHNhdHVyYXRlZCBibHVlIHRvcGF6IGlzCgkvLyBpcnJhZGlhdGVkKTsgc2hlcnJ5IHRvcGF6IGlzIHllbGxvd2lzaC9yZWRkaXNoIGJyb3duLCBub3Qgb3JhbmdlLgoJIlNhcHBoaXJlIjogewoJCXsiIzJhNWZlMCIsICJCbHVlIn0sIHsiI2ZmNmVhNCIsICJQaW5rIn0sIHsiI2ZmODUwMSIsICJPcmFuZ2UifSwgeyIjZmZkNTAwIiwgIlllbGxvdyJ9LAoJCXsiIzFhYTg4YSIsICJHcmVlbiJ9LCB7IiNhNjU4ZmYiLCAiVmlvbGV0In0sIHsiI2U2ZTlmOCIsICJXaGl0ZSJ9LCB7IiNmZjhmNzIiLCAiUGFkcGFyYWRzY2hhIn0sCgl9LAoJIlRvcGF6IjogewoJCXsiI2Y1ZWRkMSIsICJDb2xvcmxlc3MifSwgeyIjZmZhMzAwIiwgIkltcGVyaWFsIn0sIHsiI2ZmZDEwMCIsICJHb2xkZW4ifSwKCQl7IiNjOTZhMjgiLCAiU2hlcnJ5IEJyb3duIn0sIHsiIzg2Y2RmMiIsICJTa3kgQmx1ZSJ9LCB7IiNmZjk2YmEiLCAiUGluayJ9LAoJfSwKCS8vIE5vdCBTZXQgd2FzIG9yaWdpbmFsbHkgYSBtdXRlZCwgZGVsaWJlcmF0ZWx5IG5vbi1nZW0gcGFsZXR0ZSAoZHVsbAoJLy8gZ3JheXMpLCByZWFzb25pbmcgdGhhdCBhIGNoYWluIHdpdGggbm8gYXNzaWduZWQgc3RvbmUgc2hvdWxkbid0IGdldAoJLy8gZ2VtLWxpa2UgY29sb3JzLiBSZXBsYWNlZCBwZXIgcmVxdWVzdCAtLSB0aGVzZSByZWFkIGFzIGR1bGwvYm9yaW5nCgkvLyBpbiBwcmFjdGljZSwgYW5kIHRoaXMgc3RvbmUgYWNjb3VudHMgZm9yIHRoZSBsYXJnZSBtYWpvcml0eSBvZgoJLy8gY2hhaW5zIChldmVyeSB0ZXN0bmV0IGV4Y2VwdCBUb3Bhei0xL1NhcHBoaXJlLTEpLCBzbyBpdCBub3cgZ2V0cwoJLy8gdGhlIGZ1bGwgZ2VuZXJpYyBnZW0tY29sb3Igc3BlY3RydW0gaW5zdGVhZDogZXZlcnkgaHVlIGFscmVhZHkgdXNlZAoJLy8gYnkgU2FwcGhpcmUvVG9wYXogKHRoaXMgaXMgaW50ZW50aW9uYWwgcmV1c2UsIG5vdCBuZXcgaGV4IHZhbHVlcyAtLQoJLy8gYSAiTm90IFNldCIgcGllY2UgY2FuIGxhbmQgb24gYW55IGNvbG9yIGEgcmVhbCBnZW0gbWlnaHQpLCBwbHVzIFJlZCwKCS8vIHdoaWNoIG5laXRoZXIgU2FwcGhpcmUgbm9yIFRvcGF6IGNhbiB1c2UgKFNhcHBoaXJlIGV4Y2x1ZGVzIGl0CgkvLyBiZWNhdXNlIHJlZCBjb3J1bmR1bSBpcyBjbGFzc2lmaWVkIGFzIHJ1YnksIGEgc2VwYXJhdGUgZ2VtIG5hbWUpLgoJLy8gUmVkIGlzIHRoZSBvbmUgZGVsaWJlcmF0ZSBleGNlcHRpb24gdG8gdGhpcyBmaWxlJ3MgImV2ZXJ5IGhleCBpcwoJLy8gdGhlIHM9MS41IG1hdHJpeCBvdXRwdXQiIHJ1bGUgYWJvdmUgLS0gdGhlIG1hdHJpeC1kZXJpdmVkICNmZjRiNGIKCS8vIHJlYWQgdG9vIHNhdHVyYXRlZCBpbiBwcmFjdGljZSwgc28gaXQncyBoYW5kLXR1bmVkIH4xMi41JSBsZXNzCgkvLyBzYXR1cmF0ZWQgKCNmNDU2NTYpIGluc3RlYWQsIHBlciByZXF1ZXN0LgoJLy8gQ3J5c3RhbCAoYXBwZW5kZWQgbGFzdCwgc28gZXZlcnkgZWFybGllciBpbmRleCBrZWVwcyBpdHMgbWVhbmluZykKCS8vIGlzIHRoZSBjbGVhcmVzdCBzdG9uZSBpbiB0aGUgcG9vbC4gTm90IGNhbGxlZCBUcmFuc3BhcmVudDogaW4KCS8vIGdlbW9sb2d5IHRyYW5zcGFyZW5jeSBpcyBkaWFwaGFuZWl0eSwgYSBzZXBhcmF0ZSBheGlzIGZyb20gY29sb3VyLAoJLy8gYW5kIHRoaXMgaXMgYSBjb2xvdXIgbGlzdC4gU2VlIGZpcmVQcm9maWxlRm9yIGZvciBob3cgaXQgaXMKCS8vIHBhaW50ZWQgLS0gdGhlIGhleCBoZXJlIGlzIG9ubHkgd2hhdCB0aGUgbWV0YWRhdGEgcmVwb3J0cyBhbmQKCS8vIHdoYXQgdGhlIHJpbSBzdHJva2UgbGlnaHRlbnMgZnJvbS4KCS8vIFF1YXJ0eiAoMjAyNi0wOS0yNSkgcmVwbGFjZXMgIk5vdCBTZXQiIGZvciBldmVyeSBjaGFpbiB3aXRob3V0IGl0cwoJLy8gb3duIGNvZGVuYW1lIChURVNULTEuLjEzLCBCRVRBTkVULCBhbnkgZnV0dXJlIG9uZSk6IGEgZ2VuZXJpYwoJLy8gIlJlZCBBc3NjaGVyIiB3YXMgbm90IGEgcmVhbCBnZW0sIGFuZCBxdWFydHogaXMgdGhlIG9uZSBnZW0gZmFtaWx5CgkvLyB3aG9zZSBuYXR1cmFsIHZhcmlldGllcyBjb3ZlciB0aGUgcmFuZ2UuIEhhbmQtc2V0IHJlYWwgY29sb3VyczoKCS8vIFJvY2sgQ3J5c3RhbCAoY29sb3VybGVzcyksIEFtZXRoeXN0IChwdXJwbGUpLCBDaXRyaW5lICh5ZWxsb3cgdG8KCS8vIG9yYW5nZS15ZWxsb3cpLCBSb3NlIFF1YXJ0eiAocGFsZSwgc2xpZ2h0bHkgbWlsa3kgcGluayksIFNtb2t5CgkvLyBRdWFydHogKGdyZXktYnJvd24pLCBQcmFzaW9saXRlIChwYWxlIGxlZWsgZ3JlZW47IG1vc3RseSBoZWF0ZWQKCS8vIGFtZXRoeXN0LCByYXJlIGluIG5hdHVyZSkuIFdlaWdodGVkIGluIGNvbG9yV2VpZ2h0cy4KCSJRdWFydHoiOiB7CgkJeyIjZWVmMmY3IiwgIlJvY2sgQ3J5c3RhbCJ9LCB7IiM5YjU5ZDYiLCAiQW1ldGh5c3QifSwgeyIjZjJiMDFlIiwgIkNpdHJpbmUifSwKCQl7IiNmNWI5Y2EiLCAiUm9zZSBRdWFydHoifSwgeyIjN2Q2MjUwIiwgIlNtb2t5IFF1YXJ0eiJ9LCB7IiNhOWQ5YTIiLCAiUHJhc2lvbGl0ZSJ9LAoJfSwKCS8vIFBlYXJsIChQRUFSTC0xLCBhZGRlZCBmb3IgdGhlIFBlYXJsIHRlc3RuZXQgZ2VuZXJhdGlvbikgaXMgdGhlIG9uZQoJLy8gZGVsaWJlcmF0ZSBleGNlcHRpb24gdG8gdGhpcyBmaWxlJ3MgImV2ZXJ5IGhleCBpcyB0aGUgcz0xLjUgbWF0cml4CgkvLyBvdXRwdXQiIHJ1bGUgYWJvdmUsIGZvciBhIHJlYWwgZ2Vtb2xvZ2ljYWwgcmVhc29uIHJhdGhlciB0aGFuIGEKCS8vIHN0eWxpc3RpYyBvbmU6IHBlYXJscyBhcmUgb3JnYW5pYyBnZW1zIHdpdGggYSBzb2Z0IG5hY3JlIHNoZWVuLCBub3QKCS8vIGZhY2V0ZWQgY3J5c3RhbHMgLS0gdGhlIHNhbWUgc2F0dXJhdGlvbiBib29zdCB0aGF0IG1ha2VzIFNhcHBoaXJlLwoJLy8gVG9wYXogcmVhZCBhcyB2aXZpZCBnZW1zdG9uZXMgd291bGQgbWlzcmVwcmVzZW50IHdoYXQgYSBwZWFybAoJLy8gYWN0dWFsbHkgbG9va3MgbGlrZS4gVGhlc2UgOCBhcmUgcmVhbCBuYXR1cmFsbHktb2NjdXJyaW5nIHBlYXJsCgkvLyBib2R5IGNvbG9ycyAobm90IGR5ZWQpLCBzb3VyY2VkIGZyb20gZ2Vtb2xvZ2ljYWwgcmVmZXJlbmNlcywgaGFuZC0KCS8vIHR1bmVkIHRvIGEgbXV0ZWQvcGVhcmx5IHJhbmdlIGluc3RlYWQgb2YgdGhlIGJvb3N0ZWQtc2F0dXJhdGlvbiBvbmU6CgkvLyB3aGl0ZSAoQWtveWEpLCBjcmVhbSwgYmxhY2sgKFRhaGl0aWFuIC0tIHJlYWRzIGFzIGEgdmVyeSBkYXJrIGdyZXkvCgkvLyBncmVlbiwgbmV2ZXIgdHJ1ZSBibGFjayksIHNpbHZlciwgZ29sZCAoU291dGggU2VhKSwgcGluayBhbmQgcGVhY2gKCS8vIChmcmVzaHdhdGVyKSwgYW5kIGxhdmVuZGVyIChmcmVzaHdhdGVyLCBvbmUgb2YgdGhlIHJhcmVyIG5hdHVyYWwKCS8vIG92ZXJ0b25lcykuCgkvLyBEaWFtb25kIChHTk9MQU5ELTEpIGlzIGhhbmQtcGlja2VkIGxpa2UgUGVhcmwsIG5vdCB0aGUgcz0xLjUgbWF0cml4OgoJLy8gcmVhbCBkaWFtb25kIGNvbG91ciBncmFkZXMuIENvbG9ybGVzcyBmaXJzdCAoRC1GLCB0aGUgY2xhc3NpYyBzdG9uZSksCgkvLyB0aGVuIHRoZSBuYXR1cmFsICJmYW5jeSIgY29sb3VycyBpbiB0aGUgdHJhZGUncyBvd24gbmFtZXMsIGluY2x1ZGluZwoJLy8gdGhlIGJyb3ducyBzb2xkIGFzIENoYW1wYWduZSBhbmQgQ29nbmFjLCBhbmQgQmxhY2sgKG9wYXF1ZSwgYSBtZXRhbGxpYwoJLy8gc2hpbmUgYW5kIG5vIGZpcmUgLS0gZmlyZVByb2ZpbGVGb3IgcGFpbnRzIGl0IHNlcGFyYXRlbHkpLgoJIkRpYW1vbmQiOiB7CgkJeyIjZjNmNmZjIiwgIkNvbG9ybGVzcyJ9LCB7IiNmZmM0MDAiLCAiRmFuY3kgWWVsbG93In0sIHsiI2ZmNGY5YSIsICJGYW5jeSBQaW5rIn0sCgkJeyIjMWY4ZmZmIiwgIkZhbmN5IEJsdWUifSwgeyIjMTRjNDZlIiwgIkZhbmN5IEdyZWVuIn0sIHsiI2Q5YTU2MCIsICJDaGFtcGFnbmUifSwKCQl7IiNiNDU2MWEiLCAiQ29nbmFjIn0sIHsiIzJiMmQzNCIsICJCbGFjayJ9LAoJCS8vIGFwcGVuZGVkIDIwMjYtMDktMjUsIHNvIGV2ZXJ5IGVhcmxpZXIgaW5kZXgga2VlcHMgaXRzIG1lYW5pbmc7CgkJLy8gcmVkIGRpYW1vbmRzIGFyZSBwdXJwbGlzaC1yZWQgaW4gbGlmZSwgcHVycGxlIG9uZXMgYXJlIG1vc3RseQoJCS8vIHZpb2xldC1wdXJwbGUKCQl7IiNlMDI0M2EiLCAiUmVkIn0sIHsiI2ZmN2ExYSIsICJPcmFuZ2UifSwgeyIjOWI0ZmQ2IiwgIlB1cnBsZSJ9LAoJfSwKCSJQZWFybCI6IHsKCQl7IiNmOGY2ZjAiLCAiV2hpdGUifSwgeyIjZjBlNGM4IiwgIkNyZWFtIn0sIHsiIzNhM2EzYyIsICJCbGFjayJ9LCB7IiNjOGNkZDQiLCAiU2lsdmVyIn0sCgkJeyIjZDRhZjZhIiwgIkdvbGQifSwgeyIjZjBkNGRjIiwgIlBpbmsifSwgeyIjZjJjOWE4IiwgIlBlYWNoIn0sIHsiI2Q4Y2JlMCIsICJMYXZlbmRlciJ9LAoJfSwKfQoKLy8gY29sb3JXZWlnaHRzIGlzIGhvdyBvZnRlbiBlYWNoIHBhbGV0dGUgZW50cnkgaXMgZHJhd24gYXQgbWludCwgaW4KLy8gcGFydHMgcGVyIDEwMCBieSBwYWxldHRlIGluZGV4LiBEaWFtb25kIGFuZCBRdWFydHogYXJlIHdlaWdodGVkLCBpbiB0aGUgb3JkZXIKLy8gb2YgcmVhbC13b3JsZCByYXJpdHk6IGNvbG91cmxlc3MgYW5kIHRoZSB5ZWxsb3dzIGFuZCBicm93bnMgYXJlIHdoYXQKLy8gdGhlIG1pbmVzIG1vc3RseSBnaXZlLCBwaW5rL2JsdWUvZ3JlZW4gYXJlIHJhcmUsIHJlZCBpcyB0aGUgcmFyZXN0Ci8vIGRpYW1vbmQgdGhlcmUgaXMuIEV2ZXJ5IG90aGVyIHN0b25lIGRyYXdzIGl0cyBjb2xvdXJzIGV2ZW5seS4gQSBjb2xvdXIKLy8gYXBwZW5kZWQgbGF0ZXIgKEFkZFN0b25lQ29sb3IpIHdpdGggbm8gd2VpZ2h0IGhlcmUgZ2V0cwovLyBkZWZhdWx0Q29sb3JXZWlnaHQuCnZhciBjb2xvcldlaWdodHMgPSBtYXBbc3RyaW5nXVtdaW50ewoJLy8gICAgICAgICAgICBDb2xvcmxlc3MgWWVsbG93IFBpbmsgQmx1ZSBHcmVlbiBDaGFtcGFnbmUgQ29nbmFjIEJsYWNrIFJlZCBPcmFuZ2UgUHVycGxlCgkiRGlhbW9uZCI6IHszMCwgMTgsIDUsIDQsIDMsIDE0LCAxMiwgOCwgMSwgMywgMn0sCgkvLyBSb2NrIENyeXN0YWwgYW5kIEFtZXRoeXN0IGFyZSB0aGUgY29tbW9uZXN0IHF1YXJ0eiwgQ2l0cmluZSBhbmQgU21va3kKCS8vIG5leHQsIFJvc2UgUXVhcnR6IGlzIHJhcmVseSBjbGVhciBlbm91Z2ggdG8gZmFjZXQsIFByYXNpb2xpdGUgcmFyZS4KCSJRdWFydHoiOiB7MjUsIDI1LCAxOCwgOSwgMTgsIDV9LAp9Cgpjb25zdCBkZWZhdWx0Q29sb3JXZWlnaHQgPSA1CgpmdW5jIGNvbG9yV2VpZ2h0KHN0b25lIHN0cmluZywgaWR4IGludCkgaW50IHsKCXcsIG9rIDo9IGNvbG9yV2VpZ2h0c1tzdG9uZV0KCWlmICFvayB7CgkJcmV0dXJuIDEKCX0KCWlmIGlkeCA8IGxlbih3KSB7CgkJcmV0dXJuIHdbaWR4XQoJfQoJcmV0dXJuIGRlZmF1bHRDb2xvcldlaWdodAp9CgovLyBQaWNrQ29sb3JJbmRleCBtYXBzIGEgdW5pZm9ybSByYW5kb20gcm9sbCB0byBhIHBhbGV0dGUgaW5kZXggZm9yIHN0b25lLAovLyBob25vdXJpbmcgY29sb3JXZWlnaHRzLiBUaGUgbWludCByZWFsbSBjYWxscyB0aGlzIGluc3RlYWQgb2YgYW4gZXZlbgovLyBpbnRuKENvbG9yUGFsZXR0ZVNpemUoc3RvbmUpKS4KZnVuYyBQaWNrQ29sb3JJbmRleChzdG9uZSBzdHJpbmcsIHJvbGwgdWludDY0KSBpbnQgewoJbiA6PSBDb2xvclBhbGV0dGVTaXplKHN0b25lKQoJdG90YWwgOj0gMAoJZm9yIGkgOj0gMDsgaSA8IG47IGkrKyB7CgkJdG90YWwgKz0gY29sb3JXZWlnaHQoc3RvbmUsIGkpCgl9CglyIDo9IGludChyb2xsICUgdWludDY0KHRvdGFsKSkKCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCXIgLT0gY29sb3JXZWlnaHQoc3RvbmUsIGkpCgkJaWYgciA8IDAgewoJCQlyZXR1cm4gaQoJCX0KCX0KCXJldHVybiBuIC0gMQp9CgovLyBDb2xvclByb2JhYmlsaXR5IGlzIHRoZSBjaGFuY2UgKDAuLjEpIHRoYXQgYSBtaW50IG9mIHN0b25lIGRyYXdzIGNvbG91cgovLyBpZHggLS0gdGhlIHNhbWUgd2VpZ2h0cyBQaWNrQ29sb3JJbmRleCB1c2VzLiBUaGUgbWludCByZWFsbSBtdWx0aXBsaWVzCi8vIGl0IGludG8gYSBwaWVjZSdzIFJhcml0eSB0aWVyLgpmdW5jIENvbG9yUHJvYmFiaWxpdHkoc3RvbmUgc3RyaW5nLCBpZHggaW50KSBmbG9hdDY0IHsKCW4gOj0gQ29sb3JQYWxldHRlU2l6ZShzdG9uZSkKCXRvdGFsIDo9IDAKCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCXRvdGFsICs9IGNvbG9yV2VpZ2h0KHN0b25lLCBpKQoJfQoJcmV0dXJuIGZsb2F0NjQoY29sb3JXZWlnaHQoc3RvbmUsIGlkeCkpIC8gZmxvYXQ2NCh0b3RhbCkKfQoKLy8gQ29sb3JSYXJpdHlDU1YgbGlzdHMgIm5hbWU6cGVyY2VudCIgZm9yIGV2ZXJ5IGNvbG91ciBvZiBzdG9uZSwgZS5nLiBmb3IKLy8gYSBtaW50IHBhZ2UncyBvZGRzIHRhYmxlLiBQZXJjZW50IGhhcyBvbmUgZGVjaW1hbC4KZnVuYyBDb2xvclJhcml0eUNTVihzdG9uZSBzdHJpbmcpIHN0cmluZyB7CgluIDo9IENvbG9yUGFsZXR0ZVNpemUoc3RvbmUpCgl0b3RhbCA6PSAwCglmb3IgaSA6PSAwOyBpIDwgbjsgaSsrIHsKCQl0b3RhbCArPSBjb2xvcldlaWdodChzdG9uZSwgaSkKCX0KCW91dCA6PSBtYWtlKFtdc3RyaW5nLCBuKQoJZm9yIGkgOj0gMDsgaSA8IG47IGkrKyB7CgkJcG0gOj0gY29sb3JXZWlnaHQoc3RvbmUsIGkpICogMTAwMCAvIHRvdGFsCgkJb3V0W2ldID0gY29sb3JGb3JTdG9uZShzdG9uZSwgaSkubmFtZSArICI6IiArIHVmbXQuU3ByaW50ZigiJWQuJWQiLCBwbS8xMCwgcG0lMTApCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKG91dCwgIjsiKQp9CgovLyBDaGFpbkFsd2F5c0FjdGl2ZTogbWFpbm5ldCBuZXZlciBzdW5zZXRzLCBzbyBhIEdOT0xBTkQtMSBwaWVjZSBhbHdheXMKLy8gc2hvd3MgdGhlIGdyZWVuIGFjdGl2ZSBsaWdodC4gUmVuZGVyVG9rZW5TVkcgZm9yY2VzIGl0OyB0aGUgbWludCByZWFsbQovLyBzaG91bGQgcmVjb3JkIEFjdGl2ZT10cnVlIGZvciBpdCB0b28gc28gdGhlIG1ldGFkYXRhIGFncmVlcy4KZnVuYyBDaGFpbkFsd2F5c0FjdGl2ZShjaGFpbiBzdHJpbmcpIGJvb2wgeyByZXR1cm4gY2hhaW4gPT0gIkdOT0xBTkQtMSIgfQoKLy8gc3RvbmVOYW1lcyB0cmFja3MgaW5zZXJ0aW9uIG9yZGVyIGZvciBkZXRlcm1pbmlzdGljIGxpc3RpbmcgKEdvL0dubwovLyBtYXAgaXRlcmF0aW9uIG9yZGVyIGlzIHJhbmRvbWl6ZWQpIC0tIGtlcHQgaW4gc3luYyB3aXRoIHN0b25lUGFsZXR0ZXMKLy8gYnkgcmVnaXN0ZXJTdG9uZU5hbWUsIGNhbGxlZCBmcm9tIGJvdGggQWRkU3RvbmVDb2xvciBhbmQKLy8gU2V0U3RvbmVGb3JDaGFpbiAobmZ0bWludGVyLmdubykuCnZhciBzdG9uZU5hbWVzID0gW11zdHJpbmd7IlNhcHBoaXJlIiwgIlRvcGF6IiwgIlBlYXJsIiwgIkRpYW1vbmQiLCAiUXVhcnR6In0KCmZ1bmMgcmVnaXN0ZXJTdG9uZU5hbWUoc3RvbmUgc3RyaW5nKSB7Cglmb3IgXywgcyA6PSByYW5nZSBzdG9uZU5hbWVzIHsKCQlpZiBzID09IHN0b25lIHsKCQkJcmV0dXJuCgkJfQoJfQoJc3RvbmVOYW1lcyA9IGFwcGVuZChzdG9uZU5hbWVzLCBzdG9uZSkKfQoKLy8gU2V0U3RvbmVGb3JDaGFpbiBhbmQgQWRkU3RvbmVDb2xvciBsaXZlIGhlcmUgKG5vdCBpbiBuZnRtaW50ZXIuZ25vJ3Mgb3duCi8vIHdyYXBwZXIgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIHB1cnBvc2UpIGJlY2F1c2UgdGhleSBtdXRhdGUgdGhpcwovLyBwYWNrYWdlJ3Mgb3duIHByaXZhdGUgbWFwcyAtLSBzdG9uZUJ5Q2hhaW4vc3RvbmVQYWxldHRlcy9zdG9uZU5hbWVzCi8vIGFyZW4ndCB2aXNpYmxlIG91dHNpZGUgdGhpcyBwYWNrYWdlIG9uY2UgZ2Vtc2FydCBpcyBpdHMgb3duIHNlcGFyYXRlCi8vIGRlcGxveSwgdW5saWtlIHdoZW4gdGhpcyB3YXMgb25lIGNvbWJpbmVkIHJlYWxtLiBuZnRtaW50ZXIuZ25vJ3MKLy8gU2V0U3RvbmVGb3JDaGFpbi9BZGRTdG9uZUNvbG9yIG5vdyBqdXN0IGFzc2VydE93bmVyKCkgdGhlbiBkZWxlZ2F0ZSBoZXJlLgpmdW5jIFNldFN0b25lRm9yQ2hhaW4oY2hhaW5OYW1lLCBzdG9uZSBzdHJpbmcpIHsKCXN0b25lQnlDaGFpbltjaGFpbk5hbWVdID0gc3RvbmUKCXJlZ2lzdGVyU3RvbmVOYW1lKHN0b25lKQp9CgpmdW5jIEFkZFN0b25lQ29sb3Ioc3RvbmUsIGhleCwgbmFtZSBzdHJpbmcpIHsKCXN0b25lUGFsZXR0ZXNbc3RvbmVdID0gYXBwZW5kKHN0b25lUGFsZXR0ZXNbc3RvbmVdLCBuYW1lZENvbG9ye2hleDogaGV4LCBuYW1lOiBuYW1lfSkKCXJlZ2lzdGVyU3RvbmVOYW1lKHN0b25lKQp9CgovLyBTdG9uZU5hbWVzQ1NWIGxpc3RzIGV2ZXJ5IHJlZ2lzdGVyZWQgc3RvbmUgbmFtZSwgc2VtaWNvbG9uLXNlcGFyYXRlZCwKLy8gaW4gdGhlIG9yZGVyIGVhY2ggd2FzIGZpcnN0IGludHJvZHVjZWQuCmZ1bmMgU3RvbmVOYW1lc0NTVigpIHN0cmluZyB7CglyZXR1cm4gc3RyaW5ncy5Kb2luKHN0b25lTmFtZXMsICI7IikKfQoKLy8gQ29sb3JQYWxldHRlQ1NWIGxpc3RzIHN0b25lJ3MgZnVsbCBjb2xvciBwYWxldHRlIGFzICJoZXg6bmFtZTsuLi4iLCBpbgovLyBjb2xvcklkeCBvcmRlci4gSW1wbGVtZW50ZWQgaGVyZSByYXRoZXIgdGhhbiBpbiBuZnRtaW50ZXIuZ25vIHNpbmNlIGl0Ci8vIG5lZWRzIG5hbWVkQ29sb3IncyBvd24gdW5leHBvcnRlZCBoZXgvbmFtZSBmaWVsZHMuCmZ1bmMgQ29sb3JQYWxldHRlQ1NWKHN0b25lIHN0cmluZykgc3RyaW5nIHsKCXBhbGV0dGUgOj0gc3RvbmVQYWxldHRlc1tzdG9uZV0KCXBhaXJzIDo9IG1ha2UoW11zdHJpbmcsIGxlbihwYWxldHRlKSkKCWZvciBpLCBjIDo9IHJhbmdlIHBhbGV0dGUgewoJCXBhaXJzW2ldID0gYy5oZXggKyAiOiIgKyBjLm5hbWUKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4ocGFpcnMsICI7IikKfQoKLy8gTWV0YWxUb25lSGV4IHJlcG9ydHMgbWV0YWxOYW1lJ3MgaGkvbG8gZ3JhZGllbnQgdG9uZXMgYXMgImhpO2xvIiwgb3IgIiIKLy8gaWYgdW5yZWNvZ25pemVkLiBJbXBsZW1lbnRlZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24gYXMKLy8gQ29sb3JQYWxldHRlQ1NWIC0tIG5lZWRzIG1ldGFsVG9uZSdzIG93biB1bmV4cG9ydGVkIGhpL2xvIGZpZWxkcy4KZnVuYyBNZXRhbFRvbmVIZXgobWV0YWxOYW1lIHN0cmluZykgc3RyaW5nIHsKCXQsIG9rIDo9IG1ldGFsc1ttZXRhbE5hbWVdCglpZiAhb2sgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIHQuaGkgKyAiOyIgKyB0LmxvCn0KCi8vIFN0b25lRm9yQ2hhaW46IG9ubHkgZ25vLmxhbmQgdGVzdG5ldCBnZW5lcmF0aW9ucyB0aGF0IHdlcmUgYWN0dWFsbHkKLy8gZ2l2ZW4gYSBnZW1zdG9uZSBjb2RlbmFtZSAoVG9wYXotMSwgU2FwcGhpcmUtMSBhdCBsYXVuY2gpIGdldCBvbmUg4oCUCi8vIGV2ZXJ5IG90aGVyL2Z1dHVyZSBjaGFpbiBpcyAiTm90IFNldCIgcmF0aGVyIHRoYW4gYSBndWVzc2VkIG1pbmVyYWwKLy8gbmFtZSwgdW5sZXNzIHRoZSBvd25lciBleHBsaWNpdGx5IGFzc2lnbnMgb25lIHZpYSBTZXRTdG9uZUZvckNoYWluLgpmdW5jIFN0b25lRm9yQ2hhaW4oY2hhaW4gc3RyaW5nKSBzdHJpbmcgewoJaWYgcywgb2sgOj0gc3RvbmVCeUNoYWluW2NoYWluXTsgb2sgewoJCXJldHVybiBzCgl9CglyZXR1cm4gIlF1YXJ0eiIKfQoKLy8gY29sb3JGb3JTdG9uZSBsb29rcyB1cCBjb2xvcklkeCBpbiB0aGUgcGFsZXR0ZSBtYXRjaGluZyBzdG9uZSwKLy8gY2xhbXBpbmcgb3V0LW9mLXJhbmdlIGluZGljZXMgaW5zdGVhZCBvZiBwYW5pY2tpbmcg4oCUIEFkZFRyYWl0UHJlc2V0Ci8vIHZhbGlkYXRlcyBhdCB3cml0ZSB0aW1lLCB0aGlzIGlzIGp1c3QgZGVmZW5zZSBpbiBkZXB0aCBmb3IgcmVhZCB0aW1lLgovLyBBIHN0b25lIHdpdGggbm8gcGFsZXR0ZSB5ZXQgKHJlZ2lzdGVyZWQgdmlhIFNldFN0b25lRm9yQ2hhaW4gYnV0Ci8vIG5ldmVyIGdpdmVuIGEgY29sb3IgdmlhIEFkZFN0b25lQ29sb3IpIGZhbGxzIGJhY2sgdG8gIk5vdCBTZXQiJ3MKLy8gcGFsZXR0ZSByYXRoZXIgdGhhbiBpbmRleGluZyBpbnRvIGFuIGVtcHR5IHNsaWNlLgpmdW5jIGNvbG9yRm9yU3RvbmUoc3RvbmUgc3RyaW5nLCBjb2xvcklkeCBpbnQpIG5hbWVkQ29sb3IgewoJcGFsZXR0ZSA6PSBzdG9uZVBhbGV0dGVzW3N0b25lXQoJaWYgbGVuKHBhbGV0dGUpID09IDAgewoJCXBhbGV0dGUgPSBzdG9uZVBhbGV0dGVzWyJRdWFydHoiXQoJfQoJaWYgY29sb3JJZHggPCAwIHsKCQljb2xvcklkeCA9IDAKCX0KCWlmIGNvbG9ySWR4ID49IGxlbihwYWxldHRlKSB7CgkJY29sb3JJZHggPSBsZW4ocGFsZXR0ZSkgLSAxCgl9CglyZXR1cm4gcGFsZXR0ZVtjb2xvcklkeF0KfQoKLy8gQ29sb3JQYWxldHRlU2l6ZSByZXBvcnRzIGhvdyBtYW55IGNvbG9ycyBhcmUgdmFsaWQgZm9yIHN0b25lLCBzbwovLyBBZGRUcmFpdFByZXNldCBjYW4gdmFsaWRhdGUgYSBjYWxsZXItc3VwcGxpZWQgY29sb3JJZHguIFNhbWUKLy8gZW1wdHktcGFsZXR0ZSBmYWxsYmFjayBhcyBjb2xvckZvclN0b25lLCBmb3IgdGhlIHNhbWUgcmVhc29uLgpmdW5jIENvbG9yUGFsZXR0ZVNpemUoc3RvbmUgc3RyaW5nKSBpbnQgewoJaWYgbiA6PSBsZW4oc3RvbmVQYWxldHRlc1tzdG9uZV0pOyBuID4gMCB7CgkJcmV0dXJuIG4KCX0KCXJldHVybiBsZW4oc3RvbmVQYWxldHRlc1siUXVhcnR6Il0pCn0KCi8vIEZpbmRTaGFwZUluZGV4IHJldmVyc2UtbWFwcyBhIHJlbmRlcmVkICJTaGFwZSIgdHJhaXQgdmFsdWUgKGUuZy4KLy8gIk92YWwiKSBiYWNrIHRvIGl0cyBpbmRleCBpbnRvIFNoYXBlTmFtZXMuIEEgc291cmNlIHJlYWxtIGZvciBhCi8vIG1pZ3JhdGlvbiBvbmx5IGV2ZXIgZXhwb3NlcyB0aGUgcmVuZGVyZWQgdHJhaXQgU1RSSU5HICh2aWEKLy8gQ29sbGVjdGlvblN1bW1hcnkpLCBuZXZlciB0aGUgcmF3IGluZGV4IGEgbWlncmF0ZWQgdG9rZW4gd291bGQgbmVlZAovLyB0byByZWdlbmVyYXRlIGl0cyBvd24gYXJ0IGluc3RlYWQgb2Ygc3RvcmluZyBhIGZ1bGwgY29weSBvZiBpdCDigJQgdGhpcwovLyBjbG9zZXMgdGhhdCBnYXAgZm9yIHRoZSBtaWdyYXRpb24gdG9vbGluZyAoc2VlCi8vIEFkZE1pZ3JhdGlvblNuYXBzaG90RW50cnkpLiBvayBpcyBmYWxzZSBpZiBuYW1lIGRvZXNuJ3QgbWF0Y2ggYW55Ci8vIGN1cnJlbnQgc2hhcGUgKG5vdCBleHBlY3RlZCBmb3IgYW55dGhpbmcgdGhpcyByZWFsbSdzIG93biBnZW1zLmdubwovLyBwcm9kdWNlZCwgYnV0IGEgY2FsbGVyIHNob3VsZCB0cmVhdCB0aGF0IGFzICJ1bnJlY29nbml6ZWQsIiBub3QgZ3Vlc3MpLgovLyBGaW5kU2hhcGVJbmRleCB0YWtlcyBzdG9uZSAoZnJvbSBTdG9uZUZvckNoYWluKSBzaW5jZSBQZWFybCBkcmF3cwovLyBzaGFwZUlkeCBmcm9tIGEgY29tcGxldGVseSBkaWZmZXJlbnQgbGlzdCAoUGVhcmxTaGFwZU5hbWVzLCBub3QKLy8gU2hhcGVOYW1lcykgLS0gYSByZW5kZXJlZCAiQmFyb3F1ZSIgb25seSByZXNvbHZlcyBhZ2FpbnN0IHRoZSByaWdodAovLyBvbmUuCmZ1bmMgRmluZFNoYXBlSW5kZXgoc3RvbmUsIG5hbWUgc3RyaW5nKSAoaWR4IGludCwgb2sgYm9vbCkgewoJbmFtZXMgOj0gU2hhcGVOYW1lcwoJaWYgc3RvbmUgPT0gIlBlYXJsIiB7CgkJbmFtZXMgPSBQZWFybFNoYXBlTmFtZXMKCX0KCWZvciBpLCBzIDo9IHJhbmdlIG5hbWVzIHsKCQlpZiBzID09IG5hbWUgewoJCQlyZXR1cm4gaSwgdHJ1ZQoJCX0KCX0KCXJldHVybiAtMSwgZmFsc2UKfQoKLy8gRmluZENvbG9ySW5kZXggcmV2ZXJzZS1tYXBzIGEgcmVuZGVyZWQgIkNvbG9yIiB0cmFpdCB2YWx1ZSBiYWNrIHRvCi8vIGl0cyBpbmRleCBpbiBjaGFpbidzIG93biBzdG9uZSBwYWxldHRlIOKAlCBjb2xvcklkeCBpcyBvbmx5IG1lYW5pbmdmdWwKLy8gcmVsYXRpdmUgdG8gYSBzcGVjaWZpYyBzdG9uZSAoZGVyaXZlZCBmcm9tIGNoYWluIHZpYSBTdG9uZUZvckNoYWluKSwKLy8gbm90IGEgc2luZ2xlIGdsb2JhbCBjb2xvciBsaXN0LCBzbyB0aGlzIG5lZWRzIHRoZSBjaGFpbiB0b28uIFNhbWUKLy8gbWlncmF0aW9uLXRvb2xpbmcgcHVycG9zZSBhcyBGaW5kU2hhcGVJbmRleC4KZnVuYyBGaW5kQ29sb3JJbmRleChjaGFpbiwgY29sb3JOYW1lIHN0cmluZykgKGlkeCBpbnQsIG9rIGJvb2wpIHsKCXN0b25lIDo9IFN0b25lRm9yQ2hhaW4oY2hhaW4pCglwYWxldHRlIDo9IHN0b25lUGFsZXR0ZXNbc3RvbmVdCglpZiBsZW4ocGFsZXR0ZSkgPT0gMCB7CgkJcGFsZXR0ZSA9IHN0b25lUGFsZXR0ZXNbIlF1YXJ0eiJdCgl9Cglmb3IgaSwgYyA6PSByYW5nZSBwYWxldHRlIHsKCQlpZiBjLm5hbWUgPT0gY29sb3JOYW1lIHsKCQkJcmV0dXJuIGksIHRydWUKCQl9Cgl9CglyZXR1cm4gLTEsIGZhbHNlCn0KCnR5cGUgbWV0YWxUb25lIHN0cnVjdHsgaGksIGxvIHN0cmluZyB9CgovLyBtZXRhbHMgaG9sZHMgZWFjaCBtZXRhbCdzIHJpbmcvbGFiZWwgZ3JhZGllbnQgdG9uZXMuIEEgdmFyIHJhdGhlciB0aGFuCi8vIGEgY29uc3QgcHVyZWx5IGJlY2F1c2UgR25vIGRvZXNuJ3QgYWxsb3cgbWFwIGxpdGVyYWxzIGFzIGNvbnN0cywgbm90Ci8vIGJlY2F1c2UgaXQncyBtZWFudCB0byBiZSBtdXRhYmxlIC0tIG5vIGV4cG9ydGVkIGZ1bmN0aW9uIHJlYXNzaWducyBpdAovLyAobmZ0bWludGVyLmdubydzIE1ldGFsVG9uZUhleCBpcyByZWFkLW9ubHkpLCBzbyBhIG1pbnRlZCBwaWVjZSdzIHJpbmcKLy8gY29sb3IgaXMgZml4ZWQgdGhlIG1vbWVudCBpdCdzIHJldmVhbGVkLCBzYW1lIGFzIGV2ZXJ5IG90aGVyIHRyYWl0LgovLyBHb2xkL1NpbHZlci9Ccm9uemUgYXJlIHR3byBkYXJrZW5pbmcKLy8gcGFzc2VzIGRvd24gZnJvbSB0aGVpciBvcmlnaW5hbCBicmlnaHRlciB2YWx1ZXM7IFBsYXRpbnVtIHN0YXlzIGF0Ci8vIE9ORSBwYXNzIChub3QgdHdvKSBhbmQgT2JzaWRpYW4gaXMgdW5jaGFuZ2VkLiBWZXJpZmllZCBieXRlLWZvci1ieXRlCi8vIGFnYWluc3QgYWxsIDEwMCBwaWVjZXMgb2YgdGhlIGNvbmZpcm1lZCAiTGF0ZXN0IGl0ZXJhdGlvbiwgYWxsCi8vIGh1bmRyZWQgKG1hc2sgYXBwbGllZCkiIHJlZmVyZW5jZSBiYXRjaCAtLSBldmVyeSBub24tUGxhdGludW0gcmluZwovLyBtYXRjaGVkIHRoZSB0d28tcGFzcyB0b25lIGV4YWN0bHksIGJ1dCBldmVyeSBQbGF0aW51bSByaW5nIGluIHRoYXQKLy8gc2FtZSBjb25maXJtZWQgYmF0Y2ggdXNlZCB0aGUgb25lLXBhc3MgdG9uZSwgbm90IHR3bzsgYSBsYXRlciBjb21taXQKLy8gaGFkIG1pc3Rha2VubHkgY2FycmllZCBQbGF0aW51bSB0aHJvdWdoIHRoZSBzZWNvbmQgZGFya2VuaW5nIHBhc3MKLy8gdG9vLiBSZXZlcnRlZCBqdXN0IHRoYXQgb25lIGVudHJ5IHRvIG1hdGNoIHRoZSBjb25maXJtZWQgcmVmZXJlbmNlLgp2YXIgbWV0YWxzID0gbWFwW3N0cmluZ11tZXRhbFRvbmV7CgkiR29sZCI6ICAgICB7IiNhNDhiM2YiLCAiIzZhNTExNyJ9LAoJIlNpbHZlciI6ICAgeyIjOTU5ODljIiwgIiM1ZTY0NmMifSwKCSJCcm9uemUiOiAgIHsiIzg2NWIzNCIsICIjNTIzOTFkIn0sCgkiUGxhdGludW0iOiB7IiNjM2M2YzgiLCAiIzg3OTA5YSJ9LAoJIk9ic2lkaWFuIjogeyIjM2EzZDQ3IiwgIiMwZDBlMTIifSwKfQoKLy8gTWV0YWxOYW1lcyBpcyBhbiBvcmRlcmVkIGNvdW50ZXJwYXJ0IHRvIG1ldGFscyAtLSBHby9Hbm8gbWFwIGl0ZXJhdGlvbgovLyBvcmRlciBpcyByYW5kb21pemVkLCBzbyBvbi10aGUtZmx5IHJhbmRvbSB0cmFpdCBhc3NlbWJseSAoTWludEFzc2VtYmxlZCwKLy8gbmZ0bWludGVyLmdubykgbmVlZHMgYW4gaW5kZXhhYmxlIHNsaWNlIHRvIHBpY2sgYSByYW5kb20gbWV0YWwgZnJvbS4KdmFyIE1ldGFsTmFtZXMgPSBbXXN0cmluZ3siR29sZCIsICJTaWx2ZXIiLCAiQnJvbnplIiwgIlBsYXRpbnVtIiwgIk9ic2lkaWFuIn0KCnR5cGUgbWV0YWxMYWJlbFRvbmUgc3RydWN0eyBiZywgdGV4dCBzdHJpbmcgfQoKdmFyIG1ldGFsTGFiZWwgPSBtYXBbc3RyaW5nXW1ldGFsTGFiZWxUb25lewoJIkdvbGQiOiAgICAgeyIjZjRkMDYwIiwgIiMwNDEyMWEifSwKCSJTaWx2ZXIiOiAgIHsiI2RmZTRlYSIsICIjMDQxMjFhIn0sCgkiQnJvbnplIjogICB7IiNjOTg4NGYiLCAiIzA0MTIxYSJ9LAoJIlBsYXRpbnVtIjogeyIjZWVmMmY1IiwgIiMwNDEyMWEifSwKCSJPYnNpZGlhbiI6IHsiIzVhNWY2YiIsICIjZThlOWYwIn0sCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmdWxsIGFzc2VtYmx5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLy8gUmVuZGVyVG9rZW5TVkcgYXNzZW1ibGVzIG9uZSB0b2tlbidzIGNvbXBsZXRlIFNWRyBmcm9tIGl0cyBzbWFsbCB0cmFpdAovLyBzZWxlY3Rpb24sIG1pcnJvcmluZyBiYWRnZSgpIGluIHRoZSBQeXRob24gcHJvdG90eXBlIGV4YWN0bHkgKHNhbWUKLy8gZWxlbWVudCBvcmRlciwgc2FtZSBsYXlvdXQgY29uc3RhbnRzKS4gYHNhbHRgIHNlZWRzIGV2ZXJ5IHBlci1waWVjZQovLyBhbmltYXRpb24gdGltaW5nIGFuZCBldmVyeSBncmFkaWVudCBpZCDigJQgdGhlIHRva2VuJ3Mgb3duIHJlYWwgSUQKLy8gKHRpZFN0ciksIHNvIG5vdGhpbmcgaGVyZSBpcyBjb21wdXRlZCBiZWZvcmUgbWludCBhc3NpZ25zIG9uZS4KLy8gUmVuZGVyVG9rZW5UaHVtYlNWRyBpcyBSZW5kZXJUb2tlblNWRyBmb3IgYSBsaXN0IHRodW1ibmFpbCAoYSBnbm93ZWIKLy8gY29sbGVjdGlvbiB0YWJsZSByb3cpOiB0aGUgc2FtZSBwaWVjZSwgbWludXMgdGhlIGZpcmUgZmxhc2hlcywgdGhlIHJvY2sKLy8gcmVsaWdodGluZyBhbmQgdGhlIHRhYmxlIHJlZmxlY3Rpb25zLCB3aGljaCBkbyBub3QgcmVhZCBhdCB0aHVtYm5haWwKLy8gc2l6ZSwgZm9yIHJvdWdobHkgYSB0aGlyZCBsZXNzIGdhcywgc28gYSBwYWdlIGZpdHMgbW9yZSByb3dzIHVuZGVyIGEKLy8gcXVlcnkncyBnYXMgY2VpbGluZy4KZnVuYyBSZW5kZXJUb2tlblRodW1iU1ZHKGNoYWluLCBtZXRhbCBzdHJpbmcsIHNoYXBlSWR4LCBjb2xvcklkeCBpbnQsIGFjdGl2ZSBib29sLCB0aWRTdHIgc3RyaW5nKSBzdHJpbmcgewoJc3ZnLCBfLCBfLCBfIDo9IHJlbmRlclRva2VuKGNoYWluLCBtZXRhbCwgc2hhcGVJZHgsIGNvbG9ySWR4LCBhY3RpdmUsIHRpZFN0ciwgdHJ1ZSkKCXJldHVybiBzdmcKfQoKZnVuYyBSZW5kZXJUb2tlblNWRyhjaGFpbiwgbWV0YWwgc3RyaW5nLCBzaGFwZUlkeCwgY29sb3JJZHggaW50LCBhY3RpdmUgYm9vbCwgdGlkU3RyIHN0cmluZykgKHN2ZyBzdHJpbmcsIHN0b25lIHN0cmluZywgY29sb3JIZXggc3RyaW5nLCBjb2xvck5hbWUgc3RyaW5nKSB7CglyZXR1cm4gcmVuZGVyVG9rZW4oY2hhaW4sIG1ldGFsLCBzaGFwZUlkeCwgY29sb3JJZHgsIGFjdGl2ZSwgdGlkU3RyLCBmYWxzZSkKfQoKZnVuYyByZW5kZXJUb2tlbihjaGFpbiwgbWV0YWwgc3RyaW5nLCBzaGFwZUlkeCwgY29sb3JJZHggaW50LCBhY3RpdmUgYm9vbCwgdGlkU3RyIHN0cmluZywgdGh1bWIgYm9vbCkgKHN2ZyBzdHJpbmcsIHN0b25lIHN0cmluZywgY29sb3JIZXggc3RyaW5nLCBjb2xvck5hbWUgc3RyaW5nKSB7Cgl2YXIgY2FzY2FkZUNTUyBzdHJpbmcKCXN0b25lID0gU3RvbmVGb3JDaGFpbihjaGFpbikKCWlmIENoYWluQWx3YXlzQWN0aXZlKGNoYWluKSB7CgkJYWN0aXZlID0gdHJ1ZQoJfQoJbmMgOj0gY29sb3JGb3JTdG9uZShzdG9uZSwgY29sb3JJZHgpCgljb2xvckhleCwgY29sb3JOYW1lID0gbmMuaGV4LCBuYy5uYW1lCgltdCA6PSBtZXRhbHNbbWV0YWxdCgoJcmluZ0VscyA6PSByZW5kZXJSaW5nKG10LmhpLCBtdC5sbywgdGlkU3RyKQoJLy8gY29sb3JIZXggaXMgYWxyZWFkeSB0aGUgYm9vc3RlZCB2YWx1ZSAtLSBzdG9uZVBhbGV0dGVzJyBvd24gaGV4CgkvLyBjb25zdGFudHMgQVJFIHRoZSBzPTEuNSBzYXR1cmF0ZSBvdXRwdXQgKHNlZSBzdG9uZVBhbGV0dGVzJyBjb21tZW50CgkvLyBmb3IgdGhlIGZvcm11bGEsIGFuZCBmb3Igd2hpY2ggZW50cnkgaXMgZGVsaWJlcmF0ZWx5IGV4Y2x1ZGVkOiBSZWQpLgoJLy8KCS8vIFBlYXJsIGRyYXdzIGZyb20gcmVuZGVyUGVhcmxTaGFwZSAoc21vb3RoIGx1c3RlciBncmFkaWVudCwgbm8KCS8vIGZhY2V0cykgaW5zdGVhZCBvZiB0aGUgZmFjZXRlZCBwaXBlbGluZSAtLSBhIHJlYWwgcGVhcmwgaXMgbmV2ZXIKCS8vIGN1dC4gYXBwbHlDYXNjYWRlIHN0aWxsIHJ1bnMgb24gaXQgcmF0aGVyIHRoYW4gYmVpbmcgc2tpcHBlZDoKCS8vIHNjYW5GYWNldFNwYW5zIGZpbmRzIG5vIGNsYXNzPSJmIiBmYWNldHMgaW4gcGVhcmwgbWFya3VwIGFuZAoJLy8gcmV0dXJucyBub3RoaW5nLCBzbyBpdCBzdGF5cyBhIG5vLW9wIHRoZXJlIHdpdGhvdXQgaXRzIG93biBicmFuY2guCgkvLwoJLy8gRmFjZXRlZCBzdG9uZXMgc3RhY2ssIGJvdHRvbSB0byB0b3A6IGJvZHkgZ2xvdyAoc2lsaG91ZXR0ZSksIHRoZQoJLy8gZmFjZXRzIHRoZW1zZWx2ZXMgKHRyYW5zbHVjZW50IHNvbGlkIGZpbGxzIGF0IHZhcnlpbmcgb3BhY2l0eSwgc28KCS8vIHRoZSBnbG93IHNob3dzIHRocm91Z2ggc29tZSBtb3JlIHRoYW4gb3RoZXJzKSwgdGhlIGNhc2NhZGUncyBmbGFzaAoJLy8gb3ZlcmxheXMsIHRoZW4gb25lIGZhaW50IHJpbSBzdHJva2UuIEEgY2F1c3RpYyBwb29sIHVuZGVyIHRoZSBzdG9uZQoJLy8gYW5kIGEgcGF2aWxpb24gc2lsaG91ZXR0ZSBiZWhpbmQgaXQgd2VyZSB0cmllZCBhbmQgZHJvcHBlZDogb24gYQoJLy8gZmxhdCBkYXJrIGdyb3VuZCB0aGV5IHJlYWQgYXMgYSBzZWNvbmQgbGF5ZXIsIG5vdCBhcyBkZXB0aC4gQWxsIHN0YXRpYyBncmFkaWVudHMgYW5kIHBhdGhzIC0tIG5vIDxmaWx0ZXI+LCBubyBtYXNrLgoJLy8gQW4gZWFybGllciBpdGVyYXRpb24gYWxzbyBkcmV3IGhhaXJsaW5lIGZhY2V0IGVkZ2VzIGFuZCB0d28gd2hpdGUKCS8vIHNwZWN1bGFyIGhvdCBzcG90czsgYm90aCByZWFkIGFzIGNhcnRvb25pc2ggYW5kIHdlcmUgZHJvcHBlZC4KCXZhciBnZW1NYXJrdXAgc3RyaW5nCglpZiBzdG9uZSA9PSAiUGVhcmwiIHsKCQlwZWFybCA6PSByZW5kZXJQZWFybFNoYXBlKHNoYXBlSWR4LCBjb2xvckhleCwgbXQuaGksIHRpZFN0cikKCQlvdmVybGF5LCBjc3MgOj0gYXBwbHlDYXNjYWRlKHBlYXJsLCB0aWRTdHIsIG5pbCkKCQlnZW1NYXJrdXAsIGNhc2NhZGVDU1MgPSBwZWFybCtvdmVybGF5LCBjc3MKCX0gZWxzZSB7CgkJZnMgOj0gJmZhY2V0U3R5bGV7cHJvZjogZmlyZVByb2ZpbGVGb3Ioc3RvbmUsIGNvbG9yTmFtZSksIHpvbmU6IG5ld1BSTkcoInpvbmUiICsgdGlkU3RyKSwgc3RvbmU6IHN0b25lLCB0aHVtYjogdGh1bWJ9CgkJdW5kZXIsIGZhY2V0cywgb3ZlciA6PSByZW5kZXJHZW0zRChzaGFwZUlkeCwgY29sb3JIZXgsIHRpZFN0ciwgZnMpCgkJb3ZlcmxheSwgY3NzIDo9IGFwcGx5Q2FzY2FkZShmYWNldHMsIHRpZFN0ciwgZnMpCgkJY2FzY2FkZUNTUyA9IGNzcwoJCWdlbU1hcmt1cCA9IHVuZGVyICsgYDxnIGZpbGwtb3BhY2l0eT0iLjkiPmAgKyBmYWNldHMgKyBgPC9nPmAgKyBvdmVybGF5ICsgb3ZlciArIGZzLmdsaW50cwoJfQoJZmxvYXRpbmdHZW0gOj0gYXBwbHlNb3Rpb24oZ2VtTWFya3VwLCB0aWRTdHIpCglzdGF0dXMgOj0gcmVuZGVyU3RhdHVzQmFkZ2UoYWN0aXZlKQoJc2VyaWFsIDo9IHJlbmRlclNlcmlhbFRleHQodGlkU3RyLCBtdC5oaSkKCWxhYmVsVGV4dCA6PSBtZXRhbExhYmVsW21ldGFsXS50ZXh0CglsYWJlbFJlY3QgOj0gcmVuZGVyTWV0YWxMYWJlbFJlY3QobXQuaGksIG10LmxvLCAyNCwgMTM0LCAxMjIsIDE1LCAzLCB0aWRTdHIpCgoJaW5uZXIgOj0gYDxyZWN0IHdpZHRoPSJgICsgZm51bShjYW52YXNXKSArIGAiIGhlaWdodD0iYCArIGZudW0oY2FudmFzSCkgKyBgIiBmaWxsPSIjMGEwYjEwIi8+YCArCgkJcmVuZGVyU3RhcnModGlkU3RyKSArIHNldFJpbmcocmluZ0VscykgKyBzZXRTdG9uZShmbG9hdGluZ0dlbSkgKyBzZXRCYWRnZShzdGF0dXMpICsgc2VyaWFsICsgbGFiZWxSZWN0ICsKCQlyZW5kZXJQbGF0ZVRleHQoY2hhaW4rIiBDSEFJTiIsIGxhYmVsVGV4dCwgbXQuaGkpCgoJLy8gd2lkdGgvaGVpZ2h0IG9uIHRoZSByb290IDxzdmc+LCBub3QganVzdCB2aWV3Qm94IC0tIHdpdGhvdXQgdGhlbSB0aGUKCS8vIGltYWdlIGhhcyBubyBkZWZpbml0ZSBpbnRyaW5zaWMgc2l6ZSBhcyBhbiA8aW1nPiByZXNvdXJjZSwgYW5kCgkvLyBnbm93ZWIncyBvd24gQ1NTIChhbmNob3JzIHdyYXBwaW5nIGVtYmVkZGVkIHRodW1ibmFpbHMgYXJlCgkvLyBgZGlzcGxheTogaW5saW5lLWJsb2NrOyB0ZXh0LXdyYXA6IGJhbGFuY2VgKSBjb2xsYXBzZXMgYW4KCS8vIGFtYmlndW91cy1zaXplIGltYWdlIGRvd24gdG8gMngycHguIENvbmZpcm1lZCBsaXZlIGFnYWluc3QgYSByZWFsCgkvLyBkZXBsb3llZCBjb2xsZWN0aW9uIChnbm8tdG9vbHMnIG5mdC1taW50ZXIgdG9vbCBoaXQgdGhlIGV4YWN0IHNhbWUKCS8vIGJ1Zyk7IHNlZSB+L2duby1sYW5kLWRldi1ub3Rlcy5tZC4KCS8vIGNhc2NhZGVDU1MgaXMgYSBzZWNvbmQsIHNlcGFyYXRlIDxzdHlsZT4gYmxvY2sgcmF0aGVyIHRoYW4gZm9sZGVkCgkvLyBpbnRvIHN0eWxlQmxvY2soKSAtLSBldmVyeSBydWxlIGluIGl0IChrZXlmcmFtZSBuYW1lcywgdGltaW5ncykgaXMKCS8vIHVuaXF1ZSB0byBUSElTIHRva2VuLCB1bmxpa2Ugc3R5bGVCbG9jaygpJ3Mgc2hhcmVkLCBmaXhlZCBydWxlcwoJLy8gcmV1c2VkIGFjcm9zcyBldmVyeSB0b2tlbiB0aGF0J3MgZXZlciByZW5kZXJlZC4KCXN2ZyA9IGA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9ImAgKyBmbnVtKGNhbnZhc1cpICsgYCIgaGVpZ2h0PSJgICsgZm51bShjYW52YXNIKSArIGAiIHZpZXdCb3g9IjAgMCBgICsgZm51bShjYW52YXNXKSArIGAgYCArIGZudW0oY2FudmFzSCkgKyBgIj5gICsgc3R5bGVCbG9jaygpICsKCQlgPHN0eWxlPmAgKyBjYXNjYWRlQ1NTICsgYDwvc3R5bGU+YCArIGlubmVyICsgYDwvc3ZnPmAKCXJldHVybiBzdmcsIHN0b25lLCBjb2xvckhleCwgY29sb3JOYW1lCn0KCi8vIHN0eWxlQmxvY2sgaXMgZW1iZWRkZWQgb25jZSBwZXIgdG9rZW4ncyBvd24gU1ZHIChhIHJlYWwgTkZUIGltYWdlIGlzIGEKLy8gZnVsbHkgc2VsZi1jb250YWluZWQgZG9jdW1lbnQgLS0gdGhpcyBjYW4ndCBsaXZlIGluIGEgcGFnZS1sZXZlbAovLyBzdHlsZXNoZWV0KS4gRHJpdmVzIGV2ZXJ5IGFuaW1hdGVkIHBpZWNlIHZpYSBDU1MgQGtleWZyYW1lcyBpbnN0ZWFkCi8vIG9mIFNNSUwgPGFuaW1hdGU+LzxhbmltYXRlVHJhbnNmb3JtPjogZWFjaCB0b2tlbidzIG93biByYW5kb21pemVkCi8vIHRpbWluZy9hbmdsZXMgYXJlIHNldCBhcyBjdXN0b20gcHJvcGVydGllcyBpbiBhIHNtYWxsIGlubGluZSBzdHlsZT0iIgovLyBwZXIgZWxlbWVudCwgYWdhaW5zdCB0aGVzZSBzaGFyZWQsIGZpeGVkIGtleWZyYW1lIHJ1bGVzLgpmdW5jIHN0eWxlQmxvY2soKSBzdHJpbmcgewoJY29uc3QgZWFzZU91dCA9ICJjdWJpYy1iZXppZXIoMCwwLC4zLDEpIgoJLy8gQ29tcGFjdCBmb3JtIChnZW1zYXJ0M2QyKTogc2hhcmVkIHNlbGVjdG9ycywgYW5pbWF0aW9uIHNob3J0aGFuZCB3aXRoCgkvLyB0aGUgZGVsYXkgaW5saW5lLCBlYXNlLWluLW91dCBpbiBwbGFjZSBvZiB0aGUgbmVhci1pZGVudGljYWwKCS8vIGN1YmljLWJlemllciguNDUsMCwuNTUsMSkuIFNhbWUgbW90aW9uLCB+NDAlIGZld2VyIGJ5dGVzLiBUaGUKCS8vIHdpbGwtY2hhbmdlIGhpbnQgc3RheXM6IGl0IG1hdHRlcmVkIGZvciBTYWZhcmkuCglyZXR1cm4gYDxzdHlsZT4uZ3QtdiwuZ3QtaCwuZ3QtciwuZ3Qtc3t3aWxsLWNoYW5nZTp0cmFuc2Zvcm19YCArCgoJCWAuZ3QtdnthbmltYXRpb246Z3QtdiB2YXIoLS12LWR1cikgZWFzZS1pbi1vdXQgdmFyKC0tdi1kZWxheSkgaW5maW5pdGV9YCArCgkJYC5ndC1oe2FuaW1hdGlvbjpndC1oIHZhcigtLWgtZHVyKSBlYXNlLWluLW91dCB2YXIoLS1oLWRlbGF5KSBpbmZpbml0ZX1gICsKCQlgLmd0LXJ7YW5pbWF0aW9uOmd0LXIgdmFyKC0tci1kdXIpIGVhc2UtaW4tb3V0IHZhcigtLXItZGVsYXkpIGluZmluaXRlfWAgKwoJCWAuZ3Qtc3thbmltYXRpb246Z3QtcyB2YXIoLS1zLWR1cikgZWFzZS1pbi1vdXQgdmFyKC0tcy1kZWxheSkgaW5maW5pdGV9YCArCgkJYC5ndC1nbG93e2FuaW1hdGlvbjpndC1nbG93IHZhcigtLWdsb3ctZHVyKSBlYXNlLWluLW91dCB2YXIoLS1nbG93LWRlbGF5KSBpbmZpbml0ZX1gICsKCQkvLyByb2NrLXN5bmNlZCBsaWdodGluZzogc2FtZSBkdXJhdGlvbiwgZGVsYXkgYW5kIGVhc2luZyBhcyAuZ3QtciwKCQkvLyBwZWFraW5nIGF0IGl0cyB0d28gZXh0cmVtZXMgKDI1JSBhbmQgNzUlKQoJCWAuZ3QtbGF7YW5pbWF0aW9uOmd0LWxhIHZhcigtLXItZHVyKSBlYXNlLWluLW91dCB2YXIoLS1yLWRlbGF5KSBpbmZpbml0ZX1gICsKCQlgLmd0LWxie2FuaW1hdGlvbjpndC1sYiB2YXIoLS1yLWR1cikgZWFzZS1pbi1vdXQgdmFyKC0tci1kZWxheSkgaW5maW5pdGV9YCArCgkJYEBrZXlmcmFtZXMgZ3QtbGF7MCUsNTAlLDEwMCV7b3BhY2l0eTowfTI1JXtvcGFjaXR5OjF9fWAgKwoJCWBAa2V5ZnJhbWVzIGd0LWxiezAlLDUwJSwxMDAle29wYWNpdHk6MH03NSV7b3BhY2l0eToxfX1gICsKCQlgLmd0LWJhZGdlLXB1bHNle2FuaW1hdGlvbjpndC1icCAxLjhzIGAgKyBlYXNlT3V0ICsgYCBpbmZpbml0ZX1gICsKCQkvLyB0aGUgZmxvYXQgaXMgYmFsYW5jZWQgYXJvdW5kIHRoZSByaW5nIGNlbnRyZSAoKzIuNSB0byAtMi41KTsgaXQKCQkvLyB1c2VkIHRvIHJpc2UgMCB0byAtNSBvbmx5LCB3aGljaCBzYXQgZXZlcnkgc3RvbmUgMi41IGhpZ2ggb24gYXZlcmFnZQoJCWBAa2V5ZnJhbWVzIGd0LXZ7MCUsMTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgyLjVweCl9NTAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0yLjVweCl9fWAgKwoJCWBAa2V5ZnJhbWVzIGd0LWh7NTAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEuOHB4KX19YCArCgkJYEBrZXlmcmFtZXMgZ3QtcnsyNSV7dHJhbnNmb3JtOnJvdGF0ZShjYWxjKC0xKnZhcigtLXJvdC1kZWcpKSl9NzUle3RyYW5zZm9ybTpyb3RhdGUodmFyKC0tcm90LWRlZykpfX1gICsKCQlgQGtleWZyYW1lcyBndC1zezUwJXt0cmFuc2Zvcm06c2NhbGUoYCArIGZudW0obW90aW9uU2NhbGUpICsgYCl9fWAgKwoJCS8vIGEgdHdpbmtsZSBpcyBhIGJyaWVmIGZsYXJlIGZyb20gdGhlIHN0YXIncyByZXN0aW5nIGJyaWdodG5lc3MsCgkJLy8gb25jZSBwZXIgaXRzIG93biBwZXJpb2QgKHNlZSByZW5kZXJTdGFycykKCQlgLmd0LXR3e2FuaW1hdGlvbjpndC10dyB2YXIoLS1kKSBlYXNlLWluLW91dCB2YXIoLS1kbCkgaW5maW5pdGV9QGtleWZyYW1lcyBndC10d3swJSw4NCUsMTAwJXtvcGFjaXR5Oi40fTkwJXtvcGFjaXR5OjF9OTQle29wYWNpdHk6LjJ9fWAgKwoJCWBAa2V5ZnJhbWVzIGd0LWdsb3d7NTAle29wYWNpdHk6MX19YCArCgkJYEBrZXlmcmFtZXMgZ3QtYnB7ZnJvbXt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eTouOH10b3t0cmFuc2Zvcm06c2NhbGUoMi4yNSk7b3BhY2l0eTowfX1gICsKCQlgPC9zdHlsZT5gCn0KGmUKC2dub21vZC50b21sElZtb2R1bGUgPSAiZ25vLmxhbmQvcC9nMTdjanltNWU5aGh3czQ2bHQ2MzI5cHYyZ3R4MmF5MDUwM2hnZW1zL2dlbXNhcnQzZDIiCmdubyA9ICIwLjkiCiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMzAwMDAwMDB1Z25vdBITCLjy3L8BEgsyMDEwNDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQLCzd6z+v3nLXk6f237JH3rRKCasLtFOId/hFzCdzV2NBJAMN7qvS1SOtGs5PxSKF7leCaXhI2yEldapllnJBPj9Hd9K7YmwlvBUJLTJFq3dH5K63FF3A5woAIrRyHw/s5GTRooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==