submission 31256
KernelBot user 376 · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.
baguette_mla_6.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mla-decode-31256?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesbf16
Benchmark evidence
1 measurement across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:adc569e955d0223edcc6ac000f0f8d863ac48ff9aa9df1c200173559f21438d4
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
baguette_mla_6.py1 lines
aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKICAgICAKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiN1bmRlZiBfX0hJUF9OT19IQUxGX09QRVJBVE9SU19fCiN1bmRlZiBfX0hJUF9OT19IQUxGX0NPTlZFUlNJT05TX18KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9iZmxvYXQxNi5oPgojaW5jbHVkZSA8cHliaW5kMTEvcHliaW5kMTEuaD4KI2luY2x1ZGUgPHB5YmluZDExL3N0bC5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDx1bmlzdGQuaD4gIAojaW5jbHVkZSA8cm9jYmxhcy9yb2NibGFzLmg+CiNpbmNsdWRlIDxoaXBibGFzbHQvaGlwYmxhc2x0Lmg+CiNpbmNsdWRlIDxoaXBibGFzbHQvaGlwYmxhc2x0LWV4dC5ocHA+CgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9iZjE2Lmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwOC5oPgojaW5jbHVkZSA8dG9yY2gvdG9yY2guaD4KI2RlZmluZSBDSEVDS19ISVBCTEFTTFQoZXJyKSBpZiAoZXJyICE9IEhJUEJMQVNfU1RBVFVTX1NVQ0NFU1MpIHsgQAogIHN0ZDo6Y2VyciA8PCAiaGlwQkxBU0x0IGVycm9yIGF0IGxpbmUgIiA8PCBfX0xJTkVfXyA8PCAgc3RkOjplbmRsOyBleGl0KDEpOyB9CiAgCiNkZWZpbmUgV0FSUF9TSVpFIDY0CnVzaW5nIGJmMTYgPSBoaXBfYmZsb2F0MTY7CgppbnQgZGl2VXAoaW50IHgsaW50IG4pewpyZXR1cm4gKHggKyBuLTEpL247Cn0KCnRlbXBsYXRlPGludCBuX3NwbGl0PgpfX2dsb2JhbF9fIHZvaWQgcm9wZV9rZXJuZWwoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSwgaW50IHN0cmlkZV9icywgaW50IHN0cmlkZV9zZXEpIHsKICBjb25zdGV4cHIgaW50IGRfbW9kZWwgPSA2NDsvL011c3QgYmUgZXF1YWwgdG8gV0FSUF9TSVpFCiAgY29uc3RleHByIGludCBkX21vZGVsXzIgPSBkX21vZGVsLzI7CiAgaW50IHRpZCA9IGJsb2NrSWR4LngqYmxvY2tEaW0ueCArIHRocmVhZElkeC54OwoKICBpbnQgcG9zID0gdGlkICUgZF9tb2RlbDsKICBpbnQgc2VxID0gKHRpZCAvIGRfbW9kZWwpICUgc2VxX2xlbjsKICBpbnQgYnMgPSB0aWQgLyBkX21vZGVsIC8gc2VxX2xlbjsKICAKICBpZiAoYnMgPCBiYXRjaF9zaXplKXsKICAgIGF1dG8gcG9zXzIgPSBiZjE2KHRpZCAlIGRfbW9kZWxfMik7CiAgICBhdXRvIHRoZXRhID0gYmYxNihwb3dmKGJmMTYoMTAwMDAuMGYpLGJmMTYoLXBvc18yKS9iZjE2KGRfbW9kZWxfMikpKTsKICAgIGF1dG8gaWR4X3RoZXRhMiA9IGJmMTYoc3RhcnRfcG9zK3NlcSkqdGhldGE7CiAgICBhdXRvIGMgPSBiZjE2KGNvc2YoaWR4X3RoZXRhMikpOwogICAgYXV0byBzID0gYmYxNihzaW5mKGlkeF90aGV0YTIpKTsKCiAgICBiZjE2IHhfcltuX3NwbGl0XTsKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIGludCBpbmRleCA9ICgoYmF0Y2hfc2l6ZS9uX3NwbGl0KSpzcGxpdCArIGJzKSpzdHJpZGVfYnMrCiAgICAgICAgICAgICAgICAgIHNlcSpzdHJpZGVfc2VxKwogICAgICAgICAgICAgICAgICBwb3M7CiAgICAgICB4X3Jbc3BsaXRdID0gcm9wZVtpbmRleF07CiAgICB9CgogICAgI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IHNwbGl0PTA7c3BsaXQ8bl9zcGxpdDtzcGxpdCsrKXsKICAgICAgLy9UT0RPOmFkZCBwYXJhbWV0ZXJzIGZvciBvdXRwdXQgc3RyaWRlcwogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqZF9tb2RlbCpzZXFfbGVuKwogICAgICAgICAgICAgICAgICBzZXEqZF9tb2RlbCsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgICAKICAgICAgYXV0byB4ID0geF9yW3NwbGl0XTsKCiAgICAgIGludCBzcmNfbGFuZSA9IChwb3MgK2RfbW9kZWxfMiklIGRfbW9kZWw7CiAgICAgIGF1dG8geF9yb3QgPSBfX3NoZmwoeCwgc3JjX2xhbmUsIDY0KTsKICAgICAgeF9yb3QgPSAocG9zIDwgZF9tb2RlbF8yKSA/IC14X3JvdCA6IHhfcm90OwoKICAgICAgYXV0byBvdXQgID0gYmYxNih4KmMpK2JmMTYoeF9yb3Qqcyk7CiAgICAgIHJvcGVfb3V0W2luZGV4XSA9IG91dDsKCiAgICB9CiAgfQp9Cgp2b2lkIGNvbXB1dGVfcm9wZShiZjE2KiByb3BlX291dCwgY29uc3QgYmYxNiogcm9wZSwgaW50IHN0YXJ0X3BvcywgaW50IHNlcV9sZW4sIGludCBiYXRjaF9zaXplLGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkaW1fcm9wZSA9IDY0OwogIGNvbnN0ZXhwciBpbnQgbl9zcGxpdCA9IDMyOwogIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoZGl2VXAoc2VxX2xlbipkaW1fcm9wZSpiYXRjaF9zaXplL25fc3BsaXQsIHRocmVhZHNQZXJCbG9jay54KSk7CiAgaGlwTGF1bmNoS2VybmVsR0dMKChyb3BlX2tlcm5lbDxuX3NwbGl0PiksIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgcm9wZV9vdXQscm9wZSwgc3RhcnRfcG9zLHNlcV9sZW4sYmF0Y2hfc2l6ZSxzdHJpZGVfYnMsc3RyaWRlX3NlcSk7Cn0KCnZvaWQgY29tcHV0ZV9yb3Blc193cmFwcGVyKAogIHVpbnRwdHJfdCBrX3JvcGVfb3V0X3B0ciwKICB1aW50cHRyX3Qga19yb3BlX3B0ciwKICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBrX3JvcGVfc3RyaWRlLAogIHVpbnRwdHJfdCBxX3JvcGVfb3V0X3B0ciwKICB1aW50cHRyX3QgcV9yb3BlX3B0ciwKICBpbnQgYmF0Y2hfc2l6ZSwKICBpbnQgbl9oZWFkcywKICBpbnQgc2VxX2xlbil7CgogIGJmMTYgKmRfa19yb3BlX291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KGtfcm9wZV9vdXRfcHRyKTsKICBiZjE2ICpkX3Ffcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX3JvcGVfb3V0X3B0cik7CiAgY29uc3QgYmYxNiAqZF9rX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihrX3JvcGVfcHRyKTsKICBjb25zdCBiZjE2ICpkX3Ffcm9wZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfcm9wZV9wdHIpOwoKICBpbnQgc3RyaWRlX2JzX2sgPSBrX3JvcGVfc3RyaWRlWzBdOwogIGludCBzdHJpZGVfc2VxX2sgPSBrX3JvcGVfc3RyaWRlWzFdOwogIAogIGludCBzdHJpZGVfYnNfcSA9IDY0OwogIGludCBzdHJpZGVfc2VxX3EgPSA2NDsKCiAgY29tcHV0ZV9yb3BlKGRfa19yb3BlX291dCxkX2tfcm9wZSwgMCwgc2VxX2xlbiwgYmF0Y2hfc2l6ZSxzdHJpZGVfYnNfayxzdHJpZGVfc2VxX2spOwogIGNvbXB1dGVfcm9wZShkX3Ffcm9wZV9vdXQsZF9xX3JvcGUsIHNlcV9sZW4tMSwgMSwgYmF0Y2hfc2l6ZSpuX2hlYWRzLHN0cmlkZV9ic19xLHN0cmlkZV9zZXFfcSk7CiAgCn0KCl9fZ2xvYmFsX18gdm9pZCBzdG9yZV90b19rdl9jYWNoZV9rZXJuZWwoYmYxNioga3ZfY2FjaGUsIGNvbnN0IGJmMTYgKmt2LCBpbnQgYmF0Y2hfc2l6ZSwgaW50IHNlcV9pZCkgewogIGNvbnN0ZXhwciBpbnQgZGltX2t2ID0gNTc2OwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKICBpbnQgYnMgPSB0aWQvZGltX2t2OwogIGludCBjb2wgPSB0aWQgJSBkaW1fa3Y7CiAgaW50IGRzdF9yb3cgPSBicyo4MTkyICsgc2VxX2lkOwogIGludCBkc3RJbmRleCA9IGRzdF9yb3cqZGltX2t2K2NvbDsKICBpZiAoYnM8YmF0Y2hfc2l6ZSAmJiBkc3Rfcm93PGJhdGNoX3NpemUqODE5Mil7CiAgICBrdl9jYWNoZVtkc3RJbmRleF0gPSBrdlticypkaW1fa3YrY29sXTsKICB9Cn0KCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGUoYmYxNioga3ZfY2FjaGUsIGNvbnN0IGJmMTYgKmt2LCBpbnQgYmF0Y2hfc2l6ZSwgaW50IHNlcV9pZCkgIHsKICAgIGNvbnN0ZXhwciBpbnQgZGltX2t2ID0gNTc2OwogICAgZGltMyB0aHJlYWRzUGVyQmxvY2soV0FSUF9TSVpFKjQpOwogICAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKGJhdGNoX3NpemUqZGltX2t2LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogICAgaGlwTGF1bmNoS2VybmVsR0dMKChzdG9yZV90b19rdl9jYWNoZV9rZXJuZWwpLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGt2X2NhY2hlLGt2LCBiYXRjaF9zaXplLCBzZXFfaWQpOwp9CgoKdm9pZCBzdG9yZV90b19rdl9jYWNoZV93cmFwcGVyKAogIHVpbnRwdHJfdCBrdl9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfY2FjaGVfcHRyLAoKICBpbnQgYmF0Y2hfc2l6ZSwKICBpbnQgc2VxX2lkKXsKCiAgY29uc3QgYmYxNiAqZF9rdl9sb3JhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfbG9yYV9wdHIpOwogIGJmMTYgKmRfa3ZfY2FjaGUgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9jYWNoZV9wdHIpOwoKICBzdG9yZV90b19rdl9jYWNoZShkX2t2X2NhY2hlLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIHNlcV9pZCk7CiAgCn0KCnN0YXRpYyByb2NibGFzX2hhbmRsZSBoYW5kbGU7CnN0YXRpYyBib29sIGhhc0luaXQgPSBmYWxzZTsKc3RhdGljIHNpemVfdCB3b3Jrc3BhY2VTaXplID0gKDQgPDwgMjApKjQ7IAoKICAgIC8vIENyZWF0ZSBoaXBCTEFTTHQgaGFuZGxlCnN0YXRpYyBoaXBibGFzTHRIYW5kbGVfdCBoYW5kbGVfaGlwYmxhczsKICAgIApzdHJ1Y3QgQ29uZmlnQmxhc0x0ewogIGhpcGJsYXNMdE1hdHJpeExheW91dF90IGxheW91dEEsIGxheW91dEIsIGxheW91dEM7CiAgdm9pZCogZF93b3Jrc3BhY2U7CiAgaGlwYmxhc0x0TWF0bXVsSGV1cmlzdGljUmVzdWx0X3QgaGV1cmlzdGljUmVzdWx0OwogIGhpcGJsYXNMdE1hdG11bERlc2NfdCBtYXRtdWxEZXNjOwp9OwoKQ29uZmlnQmxhc0x0IGluaXRCbGFzTHQoaW50IE0sIGludCBOLCBpbnQgSywgaW50IGJhdGNoQ291bnQsIGludCBzdHJpZGVNSywgaW50IHN0cmlkZUtOKXsKCiAgbG9uZyBsb25nIHN0cmlkZUEgPSBzdHJpZGVNSzsKICBsb25nIGxvbmcgc3RyaWRlQiA9IHN0cmlkZUtOOwogIGxvbmcgbG9uZyBzdHJpZGVDID0gTSAqIE47CiAgZmxvYXQgYWxwaGEgPSAxLjBmLCBiZXRhID0gMC4wZjsKIAogIGhpcGJsYXNMdE1hdG11bERlc2NfdCBtYXRtdWxEZXNjOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRtdWxEZXNjQ3JlYXRlKCZtYXRtdWxEZXNjLCBISVBCTEFTX0NPTVBVVEVfMzJGLCAgSElQX1JfMzJGKSk7CiAgCiAgaGlwYmxhc0x0TWF0cml4TGF5b3V0X3QgbGF5b3V0QSwgbGF5b3V0QiwgbGF5b3V0QzsKICBDSEVDS19ISVBCTEFTTFQoaGlwYmxhc0x0TWF0cml4TGF5b3V0Q3JlYXRlKCZsYXlvdXRBLCBISVBfUl8xNkJGLCBLLCBNLCBLKSk7CiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdHJpeExheW91dENyZWF0ZSgmbGF5b3V0QiwgSElQX1JfMTZCRiwgTiwgSywgTikpOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRDcmVhdGUoJmxheW91dEMsIEhJUF9SXzE2QkYsIE4sIE0sIE4pKTsKCiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdHJpeExheW91dFNldEF0dHJpYnV0ZShsYXlvdXRBLAogICAgICBISVBCTEFTTFRfTUFUUklYX0xBWU9VVF9CQVRDSF9DT1VOVCwgJmJhdGNoQ291bnQsIHNpemVvZihiYXRjaENvdW50KSkpOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRTZXRBdHRyaWJ1dGUobGF5b3V0QSwKICAgICAgSElQQkxBU0xUX01BVFJJWF9MQVlPVVRfU1RSSURFRF9CQVRDSF9PRkZTRVQsICZzdHJpZGVBLCBzaXplb2Yoc3RyaWRlQSkpKTsKCiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdHJpeExheW91dFNldEF0dHJpYnV0ZShsYXlvdXRCLAogICAgICBISVBCTEFTTFRfTUFUUklYX0xBWU9VVF9CQVRDSF9DT1VOVCwgJmJhdGNoQ291bnQsIHNpemVvZihiYXRjaENvdW50KSkpOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRTZXRBdHRyaWJ1dGUobGF5b3V0QiwKICAgICAgSElQQkxBU0xUX01BVFJJWF9MQVlPVVRfU1RSSURFRF9CQVRDSF9PRkZTRVQsICZzdHJpZGVCLCBzaXplb2Yoc3RyaWRlQikpKTsKCiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdHJpeExheW91dFNldEF0dHJpYnV0ZShsYXlvdXRDLAogICAgICBISVBCTEFTTFRfTUFUUklYX0xBWU9VVF9CQVRDSF9DT1VOVCwgJmJhdGNoQ291bnQsIHNpemVvZihiYXRjaENvdW50KSkpOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRTZXRBdHRyaWJ1dGUobGF5b3V0QywKICAgICAgSElQQkxBU0xUX01BVFJJWF9MQVlPVVRfU1RSSURFRF9CQVRDSF9PRkZTRVQsICZzdHJpZGVDLCBzaXplb2Yoc3RyaWRlQykpKTsKCiAgaGlwYmxhc0x0TWF0bXVsUHJlZmVyZW5jZV90IHByZWZlcmVuY2U7CiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdG11bFByZWZlcmVuY2VDcmVhdGUoJnByZWZlcmVuY2UpKTsKCiAgdm9pZCogZF93b3Jrc3BhY2U7CiAgaGlwTWFsbG9jKCZkX3dvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7CiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdG11bFByZWZlcmVuY2VTZXRBdHRyaWJ1dGUocHJlZmVyZW5jZSwKICAgICAgSElQQkxBU0xUX01BVE1VTF9QUkVGX01BWF9XT1JLU1BBQ0VfQllURVMsICZ3b3Jrc3BhY2VTaXplLCBzaXplb2Yod29ya3NwYWNlU2l6ZSkpKTsKCiAgaGlwYmxhc0x0TWF0bXVsSGV1cmlzdGljUmVzdWx0X3QgaGV1cmlzdGljUmVzdWx0OwogIGludCByZXR1cm5lZEFsZ29Db3VudCA9IDA7CiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdG11bEFsZ29HZXRIZXVyaXN0aWMoaGFuZGxlX2hpcGJsYXMsIG1hdG11bERlc2MsCiAgICAgIGxheW91dEIsIGxheW91dEEsIGxheW91dEMsIGxheW91dEMsIHByZWZlcmVuY2UsIDEsICZoZXVyaXN0aWNSZXN1bHQsICZyZXR1cm5lZEFsZ29Db3VudCkpOwoKICBpZiAocmV0dXJuZWRBbGdvQ291bnQgPT0gMCkgewogICAgICBzdGQ6OmNlcnIgPDwgIk5vIHN1aXRhYmxlIGFsZ29yaXRobSBmb3VuZC4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgdGhyb3cgbmV3IHN0ZDo6cnVudGltZV9lcnJvcigiTm8gc3VpdGFibGUgYWxnb3JpdGhtIGZvdW5kLiIpOwogIH0KCiAgcmV0dXJuewogICAgbGF5b3V0QSwgbGF5b3V0QiwgbGF5b3V0QywKICAgIGRfd29ya3NwYWNlLAogICAgaGV1cmlzdGljUmVzdWx0LAogICAgbWF0bXVsRGVzYwogIH07CiAKfQoKc3RhdGljIENvbmZpZ0JsYXNMdCBjb25maWdfbG9yYTsKCnZvaWQgaW5pdCgpewogICAgaWYgKCFoYXNJbml0KXsKICAgICAgICByb2NibGFzX2NyZWF0ZV9oYW5kbGUoJmhhbmRsZSk7ICAgICAgICAKICAgICAgICAKICAgICAgICBDSEVDS19ISVBCTEFTTFQoaGlwYmxhc0x0Q3JlYXRlKCZoYW5kbGVfaGlwYmxhcykpOwogIAogICAgICAgIGludCBiYXRjaENvdW50ID0gMTI4OwogICAgICAgIGludCBNID0gMTI4OwogICAgICAgIGludCBOID0gNTEyOwogICAgICAgIGludCBLID0gMTUzNjsKICAgICAgICBpbnQgc3RyaWRlTUsgPSAwOwogICAgICAgIGludCBzdHJpZGVLTiA9IEsqTjsKICAgICAgICBjb25maWdfbG9yYSA9IGluaXRCbGFzTHQoIE0sICBOLCAgSywgIGJhdGNoQ291bnQsIHN0cmlkZU1LLCBzdHJpZGVLTik7CiAgICAKICAgICAgICBoYXNJbml0ID0gdHJ1ZTsKICAgIH0KfQoKdm9pZCBtYXRtdWxfYmxhc19ybV9jbShjb25zdCBiZjE2KmRBLCBjb25zdCBiZjE2ICpkQiwgYmYxNiAqZEMsIGludCBNLCBpbnQgTiwgaW50IEssIGludCBzdHJpZGVBLCBmbG9hdCBhbHBoYSA9IDEuMGYpewogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICByb2NibGFzX2dlbW1fZXgoCiAgICBoYW5kbGUsCiAgICByb2NibGFzX29wZXJhdGlvbl90cmFuc3Bvc2UsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSywKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgc3RyaWRlQSwKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLAogICAgcm9jYmxhc19kYXRhdHlwZV9mMzJfciwKICAgIHJvY2JsYXNfZ2VtbV9hbGdvX3N0YW5kYXJkLAogICAgMCwgMAogICk7Cn0KCnZvaWQgZG93bl9wcm9qKAogIHVpbnRwdHJfdCB4X3B0ciwKICB1aW50cHRyX3QgcV9wcm9qX2Rvd25fcHRyLAogIHVpbnRwdHJfdCBxX2xvcmFfcHRyLAogIHVpbnRwdHJfdCBrdl9wcm9qX2Rvd25fcHRyLAogIHVpbnRwdHJfdCBrdl9sb3JhX3B0ciwKICBpbnQgYmF0Y2hfc2l6ZSwKICBpbnQgZGltX3FfZG93biwKICBpbnQgZGltX2t2X2Rvd24sCiAgaW50IGRpbV9lbWJlZCl7CgogIGNvbnN0IGJmMTYgKmRfaW5wdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPih4X3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3Byb2pfZG93biA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfcHJval9kb3duX3B0cik7CiAgY29uc3QgYmYxNiAqZF9rdl9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihrdl9wcm9qX2Rvd25fcHRyKTsKICAKICBiZjE2ICpkX3FfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KHFfbG9yYV9wdHIpOwogIGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KGt2X2xvcmFfcHRyKTsKCiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfcV9wcm9qX2Rvd24sIGRfcV9sb3JhLCBiYXRjaF9zaXplLCBkaW1fcV9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAgbWF0bXVsX2JsYXNfcm1fY20oZF9pbnB1dCwgZF9rdl9wcm9qX2Rvd24sIGRfa3ZfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX2t2X2Rvd24sIGRpbV9lbWJlZCxkaW1fZW1iZWQpOwogIAp9CgoKdm9pZCBtYXRtdWxfYmxhc19jbV9ybV9iYXRjaGVkX3N0cmlkZShjb25zdCBiZjE2KmRBLCBjb25zdCBiZjE2ICpkQiwgYmYxNiAqZEMsIGludCBNLCBpbnQgTiwgaW50IEssIGludCBuX2JhdGNoZXMsIGludCBzdHJpZGVNSywgaW50IHN0cmlkZUtOKXsKICBjb25zdCBmbG9hdCBhbHBoYSA9IDEuMGY7CiAgY29uc3QgZmxvYXQgYmV0YSAgPSAwLjBmOwogIHJvY2JsYXNfZ2VtbV9zdHJpZGVkX2JhdGNoZWRfZXgoCiAgICBoYW5kbGUsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixzdHJpZGVLTiwKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTSxzdHJpZGVNSywKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBuX2JhdGNoZXMsCiAgICByb2NibGFzX2RhdGF0eXBlX2YzMl9yLAogICAgcm9jYmxhc19nZW1tX2FsZ29fc3RhbmRhcmQsCiAgICAwLCAwCiAgKTsKfQoKdm9pZCBtZXJnZWRfbWF0bXVsKAogIHVpbnRwdHJfdCBRX3Byb2pfdXBfcHRyLAogIHVpbnRwdHJfdCBLVl9wcm9qX3VwX3B0ciwKICB1aW50cHRyX3QgbWVyZ2VkX3B0ciwKICBpbnQgYmF0Y2hfc2l6ZSwKICBpbnQgcV9sb3JhX2RpbSwKICBpbnQga3ZfbG9yYV9kaW0pewogIAogIGNvbnN0IGJmMTYgKmRfV3FfVXBfbm9wZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KFFfcHJval91cF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfV2tfdXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihLVl9wcm9qX3VwX3B0cik7CiAgYmYxNiAqZF9tZXJnZWQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihtZXJnZWRfcHRyKTsKICAKICBjb25zdCBpbnQgbmJfaGVhZHMgPSAxMjg7CiAgY29uc3QgaW50IE0gPSBxX2xvcmFfZGltOwogIGNvbnN0IGludCBOID0ga3ZfbG9yYV9kaW07CiAgY29uc3QgaW50IEsgPSAxMjg7CiAgY29uc3QgaW50IHN0cmlkZU1LID0gMTkyKnFfbG9yYV9kaW07Ly8xMjgrNjQKICBjb25zdCBpbnQgc3RyaWRlS04gPSAyNTYqa3ZfbG9yYV9kaW07IC8vMTI4KzEyOAogICAgCiAgbWF0bXVsX2JsYXNfY21fcm1fYmF0Y2hlZF9zdHJpZGUoZF9XcV9VcF9ub3BlLCBkX1drX3VwLCBkX21lcmdlZCwgTSwgIE4sICBLLCBiYXRjaF9zaXplLHN0cmlkZU1LLCBzdHJpZGVLTik7CiAgCn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY21fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGNvbnN0IGJmMTYgKmRDLCBiZjE2ICpkRCwgaW50IE0sIGludCBOLCBpbnQgSywgaW50IG5fYmF0Y2hlcywgaW50IHN0cmlkZU1LLCBpbnQgc3RyaWRlS04sIGZsb2F0IGFscGhhLCBmbG9hdCBiZXRhKXsKCiAgcm9jYmxhc19nZW1tX3N0cmlkZWRfYmF0Y2hlZF9leCgKICAgIGhhbmRsZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX3RyYW5zcG9zZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX25vbmUsCiAgICBOLCBNLCBLLAogICAgJmFscGhhLAogICAgZEIsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBLLHN0cmlkZUtOLAogICAgZEEsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBLLHN0cmlkZU1LLAogICAgJmJldGEsCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgZEQsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIG5fYmF0Y2hlcywKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGNvbWJpbmVfcm9wZSgKICB1aW50cHRyX3QgU2NvcmVOb1JvcGVfcHRyLAogIHVpbnRwdHJfdCBxX3JvcGVfb3V0X3B0ciwKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IFNjb3JlT3V0X3B0ciwKICBpbnQgTSwKICBpbnQgTiwKICBpbnQgSywKICBmbG9hdCBzY2FsZSl7CiAgCiAgY29uc3QgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlX291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGtfcm9wZV9vdXRfcHRyKTsKICBjb25zdCBiZjE2ICpkX1Njb3JlTm9Sb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oU2NvcmVOb1JvcGVfcHRyKTsKICBiZjE2ICogIGRfU2NvcmVPdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihTY29yZU91dF9wdHIpOwogIAogIGNvbnN0IGludCBuYl9oZWFkcyA9IDEyODsKICBpbnQgc3RyaWRlTUsgPSBLKk07CiAgaW50IHN0cmlkZUtOID0gSypOOwoKICBtYXRtdWxfYmxhc19ybV9jbV9iYXRjaGVkX3N0cmlkZShkX3Ffcm9wZV9vdXQsIGRfa19yb3BlX291dCwgZF9TY29yZU5vUm9wZSwgZF9TY29yZU91dCwgTSwgIE4sICBLLCBuYl9oZWFkcyxzdHJpZGVNSywgc3RyaWRlS04sc2NhbGUsc2NhbGUpOwp9Cgp2b2lkIG1hdG11bF9ibGFzX3JtX3JtX2JhdGNoZWRfc3RyaWRlKGNvbnN0IGJmMTYqZEEsIGNvbnN0IGJmMTYgKmRCLCBiZjE2ICpkQywgaW50IE0sIGludCBOLCBpbnQgSywgaW50IG5fYmF0Y2hlcywgaW50IHN0cmlkZU1LLCBpbnQgc3RyaWRlS04pewogIGNvbnN0IGZsb2F0IGFscGhhID0gMS4wZjsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgCiAgcm9jYmxhc19nZW1tX3N0cmlkZWRfYmF0Y2hlZF9leCgKICAgIGhhbmRsZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX25vbmUsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixzdHJpZGVLTiwKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVNSywKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBuX2JhdGNoZXMsCiAgICByb2NibGFzX2RhdGF0eXBlX2YzMl9yLAogICAgcm9jYmxhc19nZW1tX2FsZ29fc29sdXRpb25faW5kZXgsCiAgICAwLCAwCiAgKTsKICAKfQoKCnZvaWQgbWF0bXVsX2hpcGJsYXNsdF9ybV9ybV9iYXRjaGVkX3N0cmlkZShjb25zdCBDb25maWdCbGFzTHQgJiBjb25maWcgLCBjb25zdCBiZjE2KmRfQSwgY29uc3QgYmYxNiAqZF9CLCBiZjE2ICpkX0MgKXsKCiAgZmxvYXQgYWxwaGEgPSAxLjBmLCBiZXRhID0gMC4wZjsKICAvLyBSdW4gbWF0bXVsCiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdG11bChoYW5kbGUsCiAgICAgIGNvbmZpZy5tYXRtdWxEZXNjLAogICAgICAmYWxwaGEsIGRfQiwgY29uZmlnLmxheW91dEIsCiAgICAgICAgICAgICAgZF9BLCBjb25maWcubGF5b3V0QSwKICAgICAgJmJldGEsICBkX0MsIGNvbmZpZy5sYXlvdXRDLAogICAgICAgICAgICAgIGRfQywgY29uZmlnLmxheW91dEMsCiAgICAgICZjb25maWcuaGV1cmlzdGljUmVzdWx0LmFsZ28sCiAgICAgIGNvbmZpZy5kX3dvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSwgMCkpOwogICAgCn0Kdm9pZCBtYXRtdWxfcWxvcmEoCiAgdWludHB0cl90IHFfbG9yYV9wdHIsCiAgdWludHB0cl90IFdfbWVyZ2VkX3B0ciwKICB1aW50cHRyX3QgU2NvcmVOb1JvcGVfcHRyLAogIGludCBNLAogIGludCBOLAogIGludCBLKXsKICAKICBjb25zdCBiZjE2ICpkX3FfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfbG9yYV9wdHIpOwogIGNvbnN0IGJmMTYgKmRfV19tZXJnZWQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihXX21lcmdlZF9wdHIpOwogIGJmMTYgKmRfU2NvcmVOb1JvcGUxID0gcmVpbnRlcnByZXRfY2FzdDwgYmYxNio+KFNjb3JlTm9Sb3BlX3B0cik7CiAgCiAgY29uc3QgaW50IG5iX2hlYWRzID0gMTI4OwogIGNvbnN0IGludCBzdHJpZGVNSyA9IDA7CiAgY29uc3QgaW50IHN0cmlkZUtOID0gSypOOyAKICAgCiAgbWF0bXVsX2hpcGJsYXNsdF9ybV9ybV9iYXRjaGVkX3N0cmlkZShjb25maWdfbG9yYSxkX3FfbG9yYSwgZF9XX21lcmdlZCwgZF9TY29yZU5vUm9wZTEpOwogIAp9Cgp0b3JjaDo6VGVuc29yIG1hdG11bF9jcHAodG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIpIHsKICAgIHJldHVybiBhdDo6Ym1tKGEsIGIpOwp9CgoKCgpQWUJJTkQxMV9NT0RVTEUocm9wZSwgbSkgewogIG0uZGVmKCJpbml0IiwgJmluaXQsICJJbml0IGNvZGUiKTsKICBtLmRlZigicm9wZSIsICZjb21wdXRlX3JvcGVzX3dyYXBwZXIsICJSb3BlIGtlcm5lbCIpOwogIG0uZGVmKCJzdG9yZWt2IiwgJnN0b3JlX3RvX2t2X2NhY2hlX3dyYXBwZXIsICJLVkNhY2hlIGtlcm5lbCIpOwogIG0uZGVmKCJkb3duX3Byb2oiLCAmZG93bl9wcm9qLCAiRG93biBQcm9qIGtlcm5lbCIpOwogIG0uZGVmKCJtZXJnZWRfbWF0bXVsIiwgJm1lcmdlZF9tYXRtdWwsICJtZXJnZWRfbWF0bXVsIGtlcm5lbCIpOwogIG0uZGVmKCJjb21iaW5lX3JvcGUiLCAmY29tYmluZV9yb3BlLCAiY29tYmluZV9yb3BlIGtlcm5lbCIpOwogIG0uZGVmKCJtYXRtdWxfcWxvcmEiLCAmbWF0bXVsX3Fsb3JhLCAibWF0bXVsX3Fsb3JhIGtlcm5lbCIpOwogIG0uZGVmKCJtYXRtdWxfY3BwIiwgJm1hdG11bF9jcHAsICJtYXRtdWxfdGVzdCBrZXJuZWwiKTsKICAKICAKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9InJvcGUiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMTcgLU8zIl0sCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCgpjbGFzcyBLVkNhY2hlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga3ZfY2FjaGVfc2hhcGU6IHR1cGxlKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdkYXRhJywgdG9yY2guemVyb3Moa3ZfY2FjaGVfc2hhcGUsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSkKICAgICAgICBzZWxmLnNlcV9sZW4gPSAwCiAgICAgICAgc2VsZi56ZXJvKCkKCiAgICBkZWYgemVybyhzZWxmKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGF0YS56ZXJvXygpCiAgICAKICAgIGRlZiBnZXRfZGF0YShzZWxmKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGNfa3Y6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGFzc2VydCBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSkgPD0gc2VsZi5kYXRhLnNpemUoMSksICJLViBDYWNoZSBFeGNlZWRlZCIKCiAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhLnRvKGNfa3YuZHR5cGUpCiAgICAgICAgc2VsZi5kYXRhWwogICAgICAgICAgICA6LCBzZWxmLnNlcV9sZW4gOiBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSksIDoKICAgICAgICBdID0gY19rdgogICAgICAgIHNlbGYuc2VxX2xlbiArPSBjX2t2LnNpemUoMSkKCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVs6LCA6c2VsZi5zZXFfbGVuXSwgc2VsZi5zZXFfbGVuCiAgICAKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCiAgICAgCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAKICAgICAgICBzZWxmLnFfbG9yYSA9IHRvcmNoLmVtcHR5KGNvbmZpZy5iYXRjaF9zaXplLCAxLCBzZWxmLnFfbG9yYV9yYW5rLGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQogICAgICAgIHNlbGYua3ZfbG9yYSA9IHRvcmNoLmVtcHR5KGNvbmZpZy5iYXRjaF9zaXplLCAxLCBzZWxmLmt2X2xvcmFfcmFuays2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLlNjb3JlTm9Sb3BlMSA9IHRvcmNoLmVtcHR5KGNvbmZpZy5iYXRjaF9zaXplLCAxMjgsIDUxMixkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLldfbWVyZ2VkID0gdG9yY2guZW1wdHkoY29uZmlnLmJhdGNoX3NpemUsIHNlbGYucV9sb3JhX3JhbmssIHNlbGYua3ZfbG9yYV9yYW5rLGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgaGlwX21vZHVsZS5pbml0KCkKICAgICAgICAKIAogICAgICAgIAogICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwga3ZfY2FjaGU6IEtWQ2FjaGUpIC0+IHRvcmNoLlRlbnNvcjoKCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgbW9kZWxfZGltID0geC5zaXplKCkKICAgICAgICAgIAogICAgICAgIGhpcF9tb2R1bGUuZG93bl9wcm9qKAogICAgICAgICAgICAgICAgeC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5jb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5jb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5rdl9sb3JhLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICAgICAgc2VsZi5xX2xvcmFfcmFuaywKICAgICAgICAgICAgICAgIHNlbGYua3ZfbG9yYV9yYW5rKzY0LAogICAgICAgICAgICAgICAgeC5zaGFwZVsyXSkKICAgICAgICAgICAgICAgCiAgICAgICAgaGlwX21vZHVsZS5tZXJnZWRfbWF0bXVsKAogICAgICAgICAgc2VsZi5jb25maWcuUV9wcm9qX3VwX3dlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5jb25maWcuS1ZfcHJval91cF93ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgIHNlbGYuV19tZXJnZWQuZGF0YV9wdHIoKSwKICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICBzZWxmLnFfbG9yYV9yYW5rLAogICAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmspCiAgCiAgICAgICAgaGlwX21vZHVsZS5zdG9yZWt2KAogICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAga3ZfY2FjaGUuZ2V0X2RhdGEoKS5kYXRhX3B0cigpLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBrdl9jYWNoZS5zZXFfbGVuKQogICAgICAgIAogICAgICAgIAogICAgICAgIGhpcF9tb2R1bGUubWF0bXVsX3Fsb3JhKAogICAgICAgICAgc2VsZi5xX2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgIHNlbGYuV19tZXJnZWQuZGF0YV9wdHIoKSwKICAgICAgICAgIHNlbGYuU2NvcmVOb1JvcGUxLmRhdGFfcHRyKCksCiAgICAgICAgICAxMjgsCiAgICAgICAgICA1MTIsCiAgICAgICAgICAxNTM2KQogICAgICAgICAgCiAgICAgICAgCiAgICAgICAga3ZfY2FjaGUuc2VxX2xlbis9MQogICAgICAgIGt2X2xlbiA9IGt2X2NhY2hlLnNlcV9sZW4KICAgICAgICAKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCiAgICAgICAga3ZfbG9yYSA9IHRvcmNoLmFzX3N0cmlkZWQoa3ZfY2FjaGUuZGF0YSwgc2l6ZT0oMTI4LCBrdl9sZW4sIDU3NiksIHN0cmlkZT1rdl9jYWNoZS5kYXRhLnN0cmlkZSgpKQogICAgICAgIAogICAgICAgIGt2RG93bl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgICAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2RG93bl9ub3BlLnBlcm11dGUoMCwyLDEpCiAgICAgICAgCiAgICAgICAgU2NvcmVOb1JvcGUxID0gc2VsZi5TY29yZU5vUm9wZTEucGVybXV0ZSgxLDAsMikKICAgICAgICBTY29yZU5vUm9wZV90PVNjb3JlTm9Sb3BlMS52aWV3KGJhdGNoX3NpemUsc2VsZi5uX2hlYWRzLDUxMikgI1ticyxuX2hlYWQsNTEyXSkKCiAgICAgICAgU2NvcmVOb1JvcGUgPSBoaXBfbW9kdWxlLm1hdG11bF9jcHAoU2NvcmVOb1JvcGVfdCxrdl9kb3duX3Blcm11dGUpCiAgICAgICAgCiAgICAgICAgV3FOb3BlUm9wZSA9IHNlbGYuY29uZmlnLlFfcHJval91cF93ZWlnaHQudCgpLnZpZXcoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5ub3BlX2hlYWRfZGltK3NlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBfLCBXcV9VcF9yb3BlID0gdG9yY2guc3BsaXQoV3FOb3BlUm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICBXa3ZfdXAgPSBzZWxmLmNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodC50KCkudmlldyhzZWxmLmt2X2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5ub3BlX2hlYWRfZGltK3NlbGYudl9oZWFkX2RpbSkKICAgICAgICBfLCBXdl91cCA9IHRvcmNoLnNwbGl0KFdrdl91cCwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi52X2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIAogICAgICAgIFd2X3VwID0gV3ZfdXAucGVybXV0ZSgxLCAwLCAyKSAgIyBzaGFwZTogKG5faGVhZCwgZGltLCBoZWFkKSAgICAgICAgCiAgICAgICAgV3FfVXBfcm9wZTAgPSBXcV9VcF9yb3BlLnZpZXcoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIFdxX1VwX3JvcGUwID0gV3FfVXBfcm9wZTAucGVybXV0ZSgxLDAsMikKICAgICAgICBRUm9wZTAgPSB0b3JjaC5tYXRtdWwoc2VsZi5xX2xvcmEucGVybXV0ZSgxLDAsMiksV3FfVXBfcm9wZTApIzEKCiAgICAgICAgCiAgICAgICAgUVJvcGUgPSBRUm9wZTAucGVybXV0ZSgxLDAsMikudmlldygxMjgsIDEsIDEyOCwgNjQpLmNvbnRpZ3VvdXMoKQogICAgICAgIHFfcm9wZSA9IFFSb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogCiAgICAgICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIGt2X2xlbiwgNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgcV9yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywxLCA2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLnJvcGUoa19yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBrX3JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAga19yb3BlLnN0cmlkZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHFfcm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5faGVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGt2X2xlbikKICAgICAgICAKICAgICAgICBrX3JvcGVfb3V0ID0ga19yb3BlX291dC51bnNxdWVlemUoMSkKCiAgICAgICAgU2NvcmVPdXQgPSB0b3JjaC5lbXB0eShiYXRjaF9zaXplLCAxMjgsIGt2X2xlbixkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLmNvbWJpbmVfcm9wZSgKICAgICAgICAgIFNjb3JlTm9Sb3BlLmRhdGFfcHRyKCksCiAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBrX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBTY29yZU91dC5kYXRhX3B0cigpLAogICAgICAgICAgU2NvcmVPdXQuc2hhcGVbMV0sCiAgICAgICAgICBrdl9sZW4sCiAgICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0sCiAgICAgICAgICAxLjAgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKSkKICAgICAgICAKICAgICAgICBBdHRuT3V0U01heCA9IEYuc29mdG1heChTY29yZU91dCwgZGltPS0xKSMudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAga3ZfZG93biA9IGt2RG93bl9ub3BlLnVuc3F1ZWV6ZSgxKQogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoQXR0bk91dFNNYXguc3F1ZWV6ZSgyKSxrdl9kb3duLnNxdWVlemUoMSkpCiAgICAgICAgeTBfYz15MF9jLnVuc3F1ZWV6ZSgyKQogICAgICAgIAogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoeTBfYy5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV3ZfdXApCiAgICAgICAgeTBfYyA9IHkwX2MucGVybXV0ZSgxLDAsMikKICAgICAgICB5MF9jID0gdG9yY2gubWF0bXVsKHkwX2MuZmxhdHRlbihzdGFydF9kaW09MSksc2VsZi5jb25maWcud29fd2VpZ2h0LnQoKSkKICAgICAgICAKICAgICAgICByZXR1cm4geTBfYy52aWV3KGJhdGNoX3NpemUsMSxzZWxmLmRpbSksIGt2X2NhY2hlLmdldF9kYXRhKCkKCm1vZGVsID0gTm9uZQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgICAgZ2xvYmFsIG1vZGVsCiAgICAgIGlmIG1vZGVsID09IE5vbmU6CiAgICAgICAgICBtb2RlbCA9IE1MQShjb25maWcpLnRvKCdjdWRhOjAnKQogICAKICAgICAgbW9kZWwuY29uZmlnID0gY29uZmlnCiAgICAgIHJldHVybiBtb2RlbCh4LCBrdl9jYWNoZSk=Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Changes from previous submission
Against this author's previous submission submission 30729.
- aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKCmlmICJQWVRPUkNIX1JPQ01fQVJDSCIgbm90IGluIG9zLmVudmlyb246CiAgICBvcy5lbnZpcm9uWyJQWVRPUkNIX1JPQ01fQVJDSCJdID0gImdmeDk0Mjp4bmFjay0iCgprZXJuZWxfY3BwID0gciIiIgojdW5kZWYgX19ISVBfTk9fSEFMRl9PUEVSQVRPUlNfXwojdW5kZWYgX19ISVBfTk9fSEFMRl9DT05WRVJTSU9OU19fCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfYmZsb2F0MTYuaD4KI2luY2x1ZGUgPHB5YmluZDExL3B5YmluZDExLmg+CiNpbmNsdWRlIDxweWJpbmQxMS9zdGwuaD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHJhbmRvbT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxmc3RyZWFtPgojaW5jbHVkZSA8dW5pc3RkLmg+ICAKI2luY2x1ZGUgPHJvY2JsYXMvcm9jYmxhcy5oPgojaW5jbHVkZSA8aGlwYmxhc2x0L2hpcGJsYXNsdC5oPgojaW5jbHVkZSA8aGlwYmxhc2x0L2hpcGJsYXNsdC1leHQuaHBwPgoKI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCiNkZWZpbmUgQ0hFQ0tfSElQQkxBU0xUKGVycikgaWYgKGVyciAhPSBISVBCTEFTX1NUQVRVU19TVUNDRVNTKSB7IEAKICBzdGQ6OmNlcnIgPDwgImhpcEJMQVNMdCBlcnJvciBhdCBsaW5lICIgPDwgX19MSU5FX18gPDwgIHN0ZDo6ZW5kbDsgZXhpdCgxKTsgfQogIAojZGVmaW5lIFdBUlBfU0laRSA2NAp1c2luZyBiZjE2ID0gaGlwX2JmbG9hdDE2OwoKaW50IGRpdlVwKGludCB4LGludCBuKXsKcmV0dXJuICh4ICsgbi0xKS9uOwp9Cgp0ZW1wbGF0ZTxpbnQgbl9zcGxpdD4KX19nbG9iYWxfXyB2b2lkIHJvcGVfa2VybmVsKGJmMTYqIHJvcGVfb3V0LCBjb25zdCBiZjE2KiByb3BlLCBpbnQgc3RhcnRfcG9zLCBpbnQgc2VxX2xlbiwgaW50IGJhdGNoX3NpemUsIGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkX21vZGVsID0gNjQ7Ly9NdXN0IGJlIGVxdWFsIHRvIFdBUlBfU0laRQogIGNvbnN0ZXhwciBpbnQgZF9tb2RlbF8yID0gZF9tb2RlbC8yOwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKCiAgaW50IHBvcyA9IHRpZCAlIGRfbW9kZWw7CiAgaW50IHNlcSA9ICh0aWQgLyBkX21vZGVsKSAlIHNlcV9sZW47CiAgaW50IGJzID0gdGlkIC8gZF9tb2RlbCAvIHNlcV9sZW47CiAgCiAgaWYgKGJzIDwgYmF0Y2hfc2l6ZSl7CiAgICBhdXRvIHBvc18yID0gYmYxNih0aWQgJSBkX21vZGVsXzIpOwogICAgYXV0byB0aGV0YSA9IGJmMTYocG93ZihiZjE2KDEwMDAwLjBmKSxiZjE2KC1wb3NfMikvYmYxNihkX21vZGVsXzIpKSk7CiAgICBhdXRvIGlkeF90aGV0YTIgPSBiZjE2KHN0YXJ0X3BvcytzZXEpKnRoZXRhOwogICAgYXV0byBjID0gYmYxNihjb3NmKGlkeF90aGV0YTIpKTsKICAgIGF1dG8gcyA9IGJmMTYoc2luZihpZHhfdGhldGEyKSk7CgogICAgYmYxNiB4X3Jbbl9zcGxpdF07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgc3BsaXQ9MDtzcGxpdDxuX3NwbGl0O3NwbGl0KyspewogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqc3RyaWRlX2JzKwogICAgICAgICAgICAgICAgICBzZXEqc3RyaWRlX3NlcSsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgeF9yW3NwbGl0XSA9IHJvcGVbaW5kZXhdOwogICAgfQoKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIC8vVE9ETzphZGQgcGFyYW1ldGVycyBmb3Igb3V0cHV0IHN0cmlkZXMKICAgICAgaW50IGluZGV4ID0gKChiYXRjaF9zaXplL25fc3BsaXQpKnNwbGl0ICsgYnMpKmRfbW9kZWwqc2VxX2xlbisKICAgICAgICAgICAgICAgICAgc2VxKmRfbW9kZWwrCiAgICAgICAgICAgICAgICAgIHBvczsKICAgICAgICAgCiAgICAgIGF1dG8geCA9IHhfcltzcGxpdF07CgogICAgICBpbnQgc3JjX2xhbmUgPSAocG9zICtkX21vZGVsXzIpJSBkX21vZGVsOwogICAgICBhdXRvIHhfcm90ID0gX19zaGZsKHgsIHNyY19sYW5lLCA2NCk7CiAgICAgIHhfcm90ID0gKHBvcyA8IGRfbW9kZWxfMikgPyAteF9yb3QgOiB4X3JvdDsKCiAgICAgIGF1dG8gb3V0ICA9IGJmMTYoeCpjKStiZjE2KHhfcm90KnMpOwogICAgICByb3BlX291dFtpbmRleF0gPSBvdXQ7CgogICAgfQogIH0KfQoKdm9pZCBjb21wdXRlX3JvcGUoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSxpbnQgc3RyaWRlX2JzLCBpbnQgc3RyaWRlX3NlcSkgewogIGNvbnN0ZXhwciBpbnQgZGltX3JvcGUgPSA2NDsKICBjb25zdGV4cHIgaW50IG5fc3BsaXQgPSAzMjsKICBkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CiAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKHNlcV9sZW4qZGltX3JvcGUqYmF0Y2hfc2l6ZS9uX3NwbGl0LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogIGhpcExhdW5jaEtlcm5lbEdHTCgocm9wZV9rZXJuZWw8bl9zcGxpdD4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIHJvcGVfb3V0LHJvcGUsIHN0YXJ0X3BvcyxzZXFfbGVuLGJhdGNoX3NpemUsc3RyaWRlX2JzLHN0cmlkZV9zZXEpOwp9Cgp2b2lkIGNvbXB1dGVfcm9wZXNfd3JhcHBlcigKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9wdHIsCiAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYga19yb3BlX3N0cmlkZSwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IHFfcm9wZV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IG5faGVhZHMsCiAgaW50IHNlcV9sZW4pewoKICBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa19yb3BlX3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3JvcGVfcHRyKTsKCiAgaW50IHN0cmlkZV9ic19rID0ga19yb3BlX3N0cmlkZVswXTsKICBpbnQgc3RyaWRlX3NlcV9rID0ga19yb3BlX3N0cmlkZVsxXTsKICAKICBpbnQgc3RyaWRlX2JzX3EgPSA2NDsKICBpbnQgc3RyaWRlX3NlcV9xID0gNjQ7CgogIGNvbXB1dGVfcm9wZShkX2tfcm9wZV9vdXQsZF9rX3JvcGUsIDAsIHNlcV9sZW4sIGJhdGNoX3NpemUsc3RyaWRlX2JzX2ssc3RyaWRlX3NlcV9rKTsKICBjb21wdXRlX3JvcGUoZF9xX3JvcGVfb3V0LGRfcV9yb3BlLCBzZXFfbGVuLTEsIDEsIGJhdGNoX3NpemUqbl9oZWFkcyxzdHJpZGVfYnNfcSxzdHJpZGVfc2VxX3EpOwogIAp9CgpfX2dsb2JhbF9fIHZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpIHsKICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICBpbnQgdGlkID0gYmxvY2tJZHgueCpibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgaW50IGJzID0gdGlkL2RpbV9rdjsKICBpbnQgY29sID0gdGlkICUgZGltX2t2OwogIGludCBkc3Rfcm93ID0gYnMqODE5MiArIHNlcV9pZDsKICBpbnQgZHN0SW5kZXggPSBkc3Rfcm93KmRpbV9rditjb2w7CiAgaWYgKGJzPGJhdGNoX3NpemUgJiYgZHN0X3JvdzxiYXRjaF9zaXplKjgxOTIpewogICAga3ZfY2FjaGVbZHN0SW5kZXhdID0ga3ZbYnMqZGltX2t2K2NvbF07CiAgfQp9Cgp2b2lkIHN0b3JlX3RvX2t2X2NhY2hlKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpICB7CiAgICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZChkaXZVcChiYXRjaF9zaXplKmRpbV9rdiwgdGhyZWFkc1BlckJsb2NrLngpKTsKICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBrdl9jYWNoZSxrdiwgYmF0Y2hfc2l6ZSwgc2VxX2lkKTsKfQoKCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfd3JhcHBlcigKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgdWludHB0cl90IGt2X2NhY2hlX3B0ciwKCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHNlcV9pZCl7CgogIGNvbnN0IGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGt2X2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2NhY2hlID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oa3ZfY2FjaGVfcHRyKTsKCiAgc3RvcmVfdG9fa3ZfY2FjaGUoZF9rdl9jYWNoZSwgZF9rdl9sb3JhLCBiYXRjaF9zaXplLCBzZXFfaWQpOwogIAp9CgpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7CnN0YXRpYyBzaXplX3Qgd29ya3NwYWNlU2l6ZSA9ICg0IDw8IDIwKSo0OyAKCiAgICAvLyBDcmVhdGUgaGlwQkxBU0x0IGhhbmRsZQpzdGF0aWMgaGlwYmxhc0x0SGFuZGxlX3QgaGFuZGxlX2hpcGJsYXM7CiAgICAKc3RydWN0IENvbmZpZ0JsYXNMdHsKICBoaXBibGFzTHRNYXRyaXhMYXlvdXRfdCBsYXlvdXRBLCBsYXlvdXRCLCBsYXlvdXRDOwogIHZvaWQqIGRfd29ya3NwYWNlOwogIGhpcGJsYXNMdE1hdG11bEhldXJpc3RpY1Jlc3VsdF90IGhldXJpc3RpY1Jlc3VsdDsKICBoaXBibGFzTHRNYXRtdWxEZXNjX3QgbWF0bXVsRGVzYzsKfTsKCkNvbmZpZ0JsYXNMdCBpbml0Qmxhc0x0KGludCBNLCBpbnQgTiwgaW50IEssIGludCBiYXRjaENvdW50LCBpbnQgc3RyaWRlTUssIGludCBzdHJpZGVLTil7CgogIGxvbmcgbG9uZyBzdHJpZGVBID0gc3RyaWRlTUs7CiAgbG9uZyBsb25nIHN0cmlkZUIgPSBzdHJpZGVLTjsKICBsb25nIGxvbmcgc3RyaWRlQyA9IE0gKiBOOwogIGZsb2F0IGFscGhhID0gMS4wZiwgYmV0YSA9IDAuMGY7CiAKICBoaXBibGFzTHRNYXRtdWxEZXNjX3QgbWF0bXVsRGVzYzsKICBDSEVDS19ISVBCTEFTTFQoaGlwYmxhc0x0TWF0bXVsRGVzY0NyZWF0ZSgmbWF0bXVsRGVzYywgSElQQkxBU19DT01QVVRFXzMyRiwgIEhJUF9SXzMyRikpOwogIAogIGhpcGJsYXNMdE1hdHJpeExheW91dF90IGxheW91dEEsIGxheW91dEIsIGxheW91dEM7CiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdHJpeExheW91dENyZWF0ZSgmbGF5b3V0QSwgSElQX1JfMTZCRiwgSywgTSwgSykpOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRDcmVhdGUoJmxheW91dEIsIEhJUF9SXzE2QkYsIE4sIEssIE4pKTsKICBDSEVDS19ISVBCTEFTTFQoaGlwYmxhc0x0TWF0cml4TGF5b3V0Q3JlYXRlKCZsYXlvdXRDLCBISVBfUl8xNkJGLCBOLCBNLCBOKSk7CgogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRTZXRBdHRyaWJ1dGUobGF5b3V0QSwKICAgICAgSElQQkxBU0xUX01BVFJJWF9MQVlPVVRfQkFUQ0hfQ09VTlQsICZiYXRjaENvdW50LCBzaXplb2YoYmF0Y2hDb3VudCkpKTsKICBDSEVDS19ISVBCTEFTTFQoaGlwYmxhc0x0TWF0cml4TGF5b3V0U2V0QXR0cmlidXRlKGxheW91dEEsCiAgICAgIEhJUEJMQVNMVF9NQVRSSVhfTEFZT1VUX1NUUklERURfQkFUQ0hfT0ZGU0VULCAmc3RyaWRlQSwgc2l6ZW9mKHN0cmlkZUEpKSk7CgogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRTZXRBdHRyaWJ1dGUobGF5b3V0QiwKICAgICAgSElQQkxBU0xUX01BVFJJWF9MQVlPVVRfQkFUQ0hfQ09VTlQsICZiYXRjaENvdW50LCBzaXplb2YoYmF0Y2hDb3VudCkpKTsKICBDSEVDS19ISVBCTEFTTFQoaGlwYmxhc0x0TWF0cml4TGF5b3V0U2V0QXR0cmlidXRlKGxheW91dEIsCiAgICAgIEhJUEJMQVNMVF9NQVRSSVhfTEFZT1VUX1NUUklERURfQkFUQ0hfT0ZGU0VULCAmc3RyaWRlQiwgc2l6ZW9mKHN0cmlkZUIpKSk7CgogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRTZXRBdHRyaWJ1dGUobGF5b3V0QywKICAgICAgSElQQkxBU0xUX01BVFJJWF9MQVlPVVRfQkFUQ0hfQ09VTlQsICZiYXRjaENvdW50LCBzaXplb2YoYmF0Y2hDb3VudCkpKTsKICBDSEVDS19ISVBCTEFTTFQoaGlwYmxhc0x0TWF0cml4TGF5b3V0U2V0QXR0cmlidXRlKGxheW91dEMsCiAgICAgIEhJUEJMQVNMVF9NQVRSSVhfTEFZT1VUX1NUUklERURfQkFUQ0hfT0ZGU0VULCAmc3RyaWRlQywgc2l6ZW9mKHN0cmlkZUMpKSk7CgogIGhpcGJsYXNMdE1hdG11bFByZWZlcmVuY2VfdCBwcmVmZXJlbmNlOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRtdWxQcmVmZXJlbmNlQ3JlYXRlKCZwcmVmZXJlbmNlKSk7CgogIHZvaWQqIGRfd29ya3NwYWNlOwogIGhpcE1hbGxvYygmZF93b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRtdWxQcmVmZXJlbmNlU2V0QXR0cmlidXRlKHByZWZlcmVuY2UsCiAgICAgIEhJUEJMQVNMVF9NQVRNVUxfUFJFRl9NQVhfV09SS1NQQUNFX0JZVEVTLCAmd29ya3NwYWNlU2l6ZSwgc2l6ZW9mKHdvcmtzcGFjZVNpemUpKSk7CgogIGhpcGJsYXNMdE1hdG11bEhldXJpc3RpY1Jlc3VsdF90IGhldXJpc3RpY1Jlc3VsdDsKICBpbnQgcmV0dXJuZWRBbGdvQ291bnQgPSAwOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRtdWxBbGdvR2V0SGV1cmlzdGljKGhhbmRsZV9oaXBibGFzLCBtYXRtdWxEZXNjLAogICAgICBsYXlvdXRCLCBsYXlvdXRBLCBsYXlvdXRDLCBsYXlvdXRDLCBwcmVmZXJlbmNlLCAxLCAmaGV1cmlzdGljUmVzdWx0LCAmcmV0dXJuZWRBbGdvQ291bnQpKTsKCiAgaWYgKHJldHVybmVkQWxnb0NvdW50ID09IDApIHsKICAgICAgc3RkOjpjZXJyIDw8ICJObyBzdWl0YWJsZSBhbGdvcml0aG0gZm91bmQuIiA8PCBzdGQ6OmVuZGw7CiAgICAgIHRocm93IG5ldyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIk5vIHN1aXRhYmxlIGFsZ29yaXRobSBmb3VuZC4iKTsKICB9CgogIHJldHVybnsKICAgIGxheW91dEEsIGxheW91dEIsIGxheW91dEMsCiAgICBkX3dvcmtzcGFjZSwKICAgIGhldXJpc3RpY1Jlc3VsdCwKICAgIG1hdG11bERlc2MKICB9OwogCn0KCnN0YXRpYyBDb25maWdCbGFzTHQgY29uZmlnX2xvcmE7Cgp2b2lkIGluaXQoKXsKICAgIGlmICghaGFzSW5pdCl7CiAgICAgICAgcm9jYmxhc19jcmVhdGVfaGFuZGxlKCZoYW5kbGUpOyAgICAgICAgCiAgICAgICAgCiAgICAgICAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdENyZWF0ZSgmaGFuZGxlX2hpcGJsYXMpKTsKICAKICAgICAgICBpbnQgYmF0Y2hDb3VudCA9IDEyODsKICAgICAgICBpbnQgTSA9IDEyODsKICAgICAgICBpbnQgTiA9IDUxMjsKICAgICAgICBpbnQgSyA9IDE1MzY7CiAgICAgICAgaW50IHN0cmlkZU1LID0gMDsKICAgICAgICBpbnQgc3RyaWRlS04gPSBLKk47CiAgICAgICAgY29uZmlnX2xvcmEgPSBpbml0Qmxhc0x0KCBNLCAgTiwgIEssICBiYXRjaENvdW50LCBzdHJpZGVNSywgc3RyaWRlS04pOwogICAgCiAgICAgICAgaGFzSW5pdCA9IHRydWU7CiAgICB9Cn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY20oY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgc3RyaWRlQSwgZmxvYXQgYWxwaGEgPSAxLjBmKXsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgcm9jYmxhc19nZW1tX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIEssCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIHN0cmlkZUEsCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGRvd25fcHJvaigKICB1aW50cHRyX3QgeF9wdHIsCiAgdWludHB0cl90IHFfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3QgcV9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IGRpbV9xX2Rvd24sCiAgaW50IGRpbV9rdl9kb3duLAogIGludCBkaW1fZW1iZWQpewoKICBjb25zdCBiZjE2ICpkX2lucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oeF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfcV9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3Byb2pfZG93bl9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa3ZfcHJval9kb3duID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfcHJval9kb3duX3B0cik7CiAgCiAgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9sb3JhX3B0cik7CgogICBtYXRtdWxfYmxhc19ybV9jbShkX2lucHV0LCBkX3FfcHJval9kb3duLCBkX3FfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX3FfZG93biwgZGltX2VtYmVkLGRpbV9lbWJlZCk7CiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfa3ZfcHJval9kb3duLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIGRpbV9rdl9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAKfQoKCnZvaWQgbWF0bXVsX2JsYXNfY21fcm1fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgbl9iYXRjaGVzLCBpbnQgc3RyaWRlTUssIGludCBzdHJpZGVLTil7CiAgY29uc3QgZmxvYXQgYWxwaGEgPSAxLjBmOwogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICByb2NibGFzX2dlbW1fc3RyaWRlZF9iYXRjaGVkX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX3RyYW5zcG9zZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sc3RyaWRlS04sCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE0sc3RyaWRlTUssCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgbl9iYXRjaGVzLAogICAgcm9jYmxhc19kYXRhdHlwZV9mMzJfciwKICAgIHJvY2JsYXNfZ2VtbV9hbGdvX3N0YW5kYXJkLAogICAgMCwgMAogICk7Cn0KCnZvaWQgbWVyZ2VkX21hdG11bCgKICB1aW50cHRyX3QgUV9wcm9qX3VwX3B0ciwKICB1aW50cHRyX3QgS1ZfcHJval91cF9wdHIsCiAgdWludHB0cl90IG1lcmdlZF9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHFfbG9yYV9kaW0sCiAgaW50IGt2X2xvcmFfZGltKXsKICAKICBjb25zdCBiZjE2ICpkX1dxX1VwX25vcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihRX3Byb2pfdXBfcHRyKTsKICBjb25zdCBiZjE2ICpkX1drX3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oS1ZfcHJval91cF9wdHIpOwogIGJmMTYgKmRfbWVyZ2VkID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4obWVyZ2VkX3B0cik7CiAgCiAgY29uc3QgaW50IG5iX2hlYWRzID0gMTI4OwogIGNvbnN0IGludCBNID0gcV9sb3JhX2RpbTsKICBjb25zdCBpbnQgTiA9IGt2X2xvcmFfZGltOwogIGNvbnN0IGludCBLID0gMTI4OwogIGNvbnN0IGludCBzdHJpZGVNSyA9IDE5MipxX2xvcmFfZGltOy8vMTI4KzY0CiAgY29uc3QgaW50IHN0cmlkZUtOID0gMjU2Kmt2X2xvcmFfZGltOyAvLzEyOCsxMjgKICAgIAogIG1hdG11bF9ibGFzX2NtX3JtX2JhdGNoZWRfc3RyaWRlKGRfV3FfVXBfbm9wZSwgZF9Xa191cCwgZF9tZXJnZWQsIE0sICBOLCAgSywgYmF0Y2hfc2l6ZSxzdHJpZGVNSywgc3RyaWRlS04pOwogIAp9Cgp2b2lkIG1hdG11bF9ibGFzX3JtX2NtX2JhdGNoZWRfc3RyaWRlKGNvbnN0IGJmMTYqZEEsIGNvbnN0IGJmMTYgKmRCLCBjb25zdCBiZjE2ICpkQywgYmYxNiAqZEQsIGludCBNLCBpbnQgTiwgaW50IEssIGludCBuX2JhdGNoZXMsIGludCBzdHJpZGVNSywgaW50IHN0cmlkZUtOLCBmbG9hdCBhbHBoYSwgZmxvYXQgYmV0YSl7CgogIHJvY2JsYXNfZ2VtbV9zdHJpZGVkX2JhdGNoZWRfZXgoCiAgICBoYW5kbGUsCiAgICByb2NibGFzX29wZXJhdGlvbl90cmFuc3Bvc2UsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVLTiwKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVNSywKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIGRELCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBuX2JhdGNoZXMsCiAgICByb2NibGFzX2RhdGF0eXBlX2YzMl9yLAogICAgcm9jYmxhc19nZW1tX2FsZ29fc3RhbmRhcmQsCiAgICAwLCAwCiAgKTsKfQoKdm9pZCBjb21iaW5lX3JvcGUoCiAgdWludHB0cl90IFNjb3JlTm9Sb3BlX3B0ciwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9vdXRfcHRyLAogIHVpbnRwdHJfdCBTY29yZU91dF9wdHIsCiAgaW50IE0sCiAgaW50IE4sCiAgaW50IEssCiAgZmxvYXQgc2NhbGUpewogIAogIGNvbnN0IGJmMTYgKmRfcV9yb3BlX291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfcm9wZV9vdXRfcHRyKTsKICBjb25zdCBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgY29uc3QgYmYxNiAqZF9TY29yZU5vUm9wZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KFNjb3JlTm9Sb3BlX3B0cik7CiAgYmYxNiAqICBkX1Njb3JlT3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oU2NvcmVPdXRfcHRyKTsKICAKICBjb25zdCBpbnQgbmJfaGVhZHMgPSAxMjg7CiAgaW50IHN0cmlkZU1LID0gSypNOwogIGludCBzdHJpZGVLTiA9IEsqTjsKCiAgbWF0bXVsX2JsYXNfcm1fY21fYmF0Y2hlZF9zdHJpZGUoZF9xX3JvcGVfb3V0LCBkX2tfcm9wZV9vdXQsIGRfU2NvcmVOb1JvcGUsIGRfU2NvcmVPdXQsIE0sICBOLCAgSywgbmJfaGVhZHMsc3RyaWRlTUssIHN0cmlkZUtOLHNjYWxlLHNjYWxlKTsKCiAgCn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fcm1fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgbl9iYXRjaGVzLCBpbnQgc3RyaWRlTUssIGludCBzdHJpZGVLTil7CiAgY29uc3QgZmxvYXQgYWxwaGEgPSAxLjBmOwogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICAKICByb2NibGFzX2dlbW1fc3RyaWRlZF9iYXRjaGVkX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX25vbmUsCiAgICBOLCBNLCBLLAogICAgJmFscGhhLAogICAgZEIsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLHN0cmlkZUtOLAogICAgZEEsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBLLHN0cmlkZU1LLAogICAgJmJldGEsCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIG5fYmF0Y2hlcywKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zb2x1dGlvbl9pbmRleCwKICAgIDAsIDAKICApOwogIAp9CgoKdm9pZCBtYXRtdWxfaGlwYmxhc2x0X3JtX3JtX2JhdGNoZWRfc3RyaWRlKGNvbnN0IENvbmZpZ0JsYXNMdCAmIGNvbmZpZyAsIGNvbnN0IGJmMTYqZF9BLCBjb25zdCBiZjE2ICpkX0IsIGJmMTYgKmRfQyApewoKIAogIAoKICBmbG9hdCBhbHBoYSA9IDEuMGYsIGJldGEgPSAwLjBmOwogIC8vIFJ1biBtYXRtdWwKICBDSEVDS19ISVBCTEFTTFQoaGlwYmxhc0x0TWF0bXVsKGhhbmRsZSwKICAgICAgY29uZmlnLm1hdG11bERlc2MsCiAgICAgICZhbHBoYSwgZF9CLCBjb25maWcubGF5b3V0QiwKICAgICAgICAgICAgICBkX0EsIGNvbmZpZy5sYXlvdXRBLAogICAgICAmYmV0YSwgIGRfQywgY29uZmlnLmxheW91dEMsCiAgICAgICAgICAgICAgZF9DLCBjb25maWcubGF5b3V0QywKICAgICAgJmNvbmZpZy5oZXVyaXN0aWNSZXN1bHQuYWxnbywKICAgICAgY29uZmlnLmRfd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplLCAwKSk7CiAgICAKfQp2b2lkIG1hdG11bF9xbG9yYSgKICB1aW50cHRyX3QgcV9sb3JhX3B0ciwKICB1aW50cHRyX3QgV19tZXJnZWRfcHRyLAogIHVpbnRwdHJfdCBTY29yZU5vUm9wZV9wdHIsCiAgaW50IE0sCiAgaW50IE4sCiAgaW50IEspewogIAogIGNvbnN0IGJmMTYgKmRfcV9sb3JhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4ocV9sb3JhX3B0cik7CiAgY29uc3QgYmYxNiAqZF9XX21lcmdlZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KFdfbWVyZ2VkX3B0cik7CiAgYmYxNiAqZF9TY29yZU5vUm9wZTEgPSByZWludGVycHJldF9jYXN0PCBiZjE2Kj4oU2NvcmVOb1JvcGVfcHRyKTsKICAKICBjb25zdCBpbnQgbmJfaGVhZHMgPSAxMjg7CiAgY29uc3QgaW50IHN0cmlkZU1LID0gMDsKICBjb25zdCBpbnQgc3RyaWRlS04gPSBLKk47IAogICAKICBtYXRtdWxfaGlwYmxhc2x0X3JtX3JtX2JhdGNoZWRfc3RyaWRlKGNvbmZpZ19sb3JhLGRfcV9sb3JhLCBkX1dfbWVyZ2VkLCBkX1Njb3JlTm9Sb3BlMSk7CiAgLy9tYXRtdWxfYmxhc19ybV9ybV9iYXRjaGVkX3N0cmlkZShkX3FfbG9yYSwgZF9XX21lcmdlZCwgZF9TY29yZU5vUm9wZTEsIE0sICBOLCAgSywgbmJfaGVhZHMsc3RyaWRlTUssIHN0cmlkZUtOKTsKfQoKUFlCSU5EMTFfTU9EVUxFKHJvcGUsIG0pIHsKICBtLmRlZigiaW5pdCIsICZpbml0LCAiSW5pdCBjb2RlIik7CiAgbS5kZWYoInJvcGUiLCAmY29tcHV0ZV9yb3Blc193cmFwcGVyLCAiUm9wZSBrZXJuZWwiKTsKICBtLmRlZigic3RvcmVrdiIsICZzdG9yZV90b19rdl9jYWNoZV93cmFwcGVyLCAiS1ZDYWNoZSBrZXJuZWwiKTsKICBtLmRlZigiZG93bl9wcm9qIiwgJmRvd25fcHJvaiwgIkRvd24gUHJvaiBrZXJuZWwiKTsKICBtLmRlZigibWVyZ2VkX21hdG11bCIsICZtZXJnZWRfbWF0bXVsLCAibWVyZ2VkX21hdG11bCBrZXJuZWwiKTsKICBtLmRlZigiY29tYmluZV9yb3BlIiwgJmNvbWJpbmVfcm9wZSwgImNvbWJpbmVfcm9wZSBrZXJuZWwiKTsKICBtLmRlZigibWF0bXVsX3Fsb3JhIiwgJm1hdG11bF9xbG9yYSwgIm1hdG11bF9xbG9yYSBrZXJuZWwiKTsKICAKICAKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9InJvcGUiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMTciXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKCmNsYXNzIEtWQ2FjaGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jYWNoZV9zaGFwZTogdHVwbGUpIC0+IE5vbmU6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ2RhdGEnLCB0b3JjaC56ZXJvcyhrdl9jYWNoZV9zaGFwZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpKQogICAgICAgIHNlbGYuc2VxX2xlbiA9IDAKICAgICAgICBzZWxmLnplcm8oKQoKICAgIGRlZiB6ZXJvKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYXRhLnplcm9fKCkKICAgIAogICAgZGVmIGdldF9kYXRhKHNlbGYpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIGZvcndhcmQoc2VsZiwgY19rdjogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgYXNzZXJ0IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSA8PSBzZWxmLmRhdGEuc2l6ZSgxKSwgIktWIENhY2hlIEV4Y2VlZGVkIgoKICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEudG8oY19rdi5kdHlwZSkKICAgICAgICBzZWxmLmRhdGFbCiAgICAgICAgICAgIDosIHNlbGYuc2VxX2xlbiA6IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSwgOgogICAgICAgIF0gPSBjX2t2CiAgICAgICAgc2VsZi5zZXFfbGVuICs9IGNfa3Yuc2l6ZSgxKQoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhWzosIDpzZWxmLnNlcV9sZW5dLCBzZWxmLnNlcV9sZW4KICAgIApAZGF0YWNsYXNzCmNsYXNzIENvbmZpZzoKICAgIGJhdGNoX3NpemU6IGludAogICAgZGltOiBpbnQKICAgIG5faGVhZHM6IGludAogICAgcV9sb3JhX3Jhbms6IGludCAKICAgIGt2X2xvcmFfcmFuazogaW50CiAgICBxa19ub3BlX2hlYWRfZGltOiBpbnQKICAgIHFrX3JvcGVfaGVhZF9kaW06IGludAogICAgdl9oZWFkX2RpbTogaW50CiAgICBzZXFfbGVuOiBpbnQKICAgIG1heF9zZXFfbGVuOiBpbnQKICAgIGt2X2NhY2hlX3NoYXBlOiB0dXBsZQogICAgUV9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIFFfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICB3b193ZWlnaHQ6IHRvcmNoLlRlbnNvcgoKICAgICAKY2xhc3MgTUxBKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBDb25maWcpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZGltID0gY29uZmlnLmRpbQogICAgICAgIHNlbGYubl9oZWFkcyA9IGNvbmZpZy5uX2hlYWRzCiAgICAgICAgc2VsZi5xX2xvcmFfcmFuayA9IGNvbmZpZy5xX2xvcmFfcmFuawogICAgICAgIHNlbGYua3ZfbG9yYV9yYW5rID0gY29uZmlnLmt2X2xvcmFfcmFuawogICAgICAgIHNlbGYubm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19ub3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi5yb3BlX2hlYWRfZGltID0gY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnZfaGVhZF9kaW0gPSBjb25maWcudl9oZWFkX2RpbQogICAgICAgIAogICAgICAgIHNlbGYucV9sb3JhID0gdG9yY2guZW1wdHkoY29uZmlnLmJhdGNoX3NpemUsIDEsIHNlbGYucV9sb3JhX3JhbmssZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgc2VsZi5rdl9sb3JhID0gdG9yY2guZW1wdHkoY29uZmlnLmJhdGNoX3NpemUsIDEsIHNlbGYua3ZfbG9yYV9yYW5rKzY0LGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQogICAgICAgIHNlbGYuU2NvcmVOb1JvcGUxID0gdG9yY2guZW1wdHkoY29uZmlnLmJhdGNoX3NpemUsIDEyOCwgNTEyLGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQogICAgICAgIHNlbGYuV19tZXJnZWQgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgc2VsZi5xX2xvcmFfcmFuaywgc2VsZi5rdl9sb3JhX3JhbmssZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBoaXBfbW9kdWxlLmluaXQoKQogICAgICAgIAogCiAgICAgICAgCiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgoKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQogICAgICAgICAgCiAgICAgICAgaGlwX21vZHVsZS5kb3duX3Byb2ooCiAgICAgICAgICAgICAgICB4LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYucV9sb3JhLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYV9yYW5rLAogICAgICAgICAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsrNjQsCiAgICAgICAgICAgICAgICB4LnNoYXBlWzJdKQogICAgICAgICAgICAgICAKICAgICAgICBoaXBfbW9kdWxlLm1lcmdlZF9tYXRtdWwoCiAgICAgICAgICBzZWxmLmNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICBzZWxmLmNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5XX21lcmdlZC5kYXRhX3B0cigpLAogICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgIHNlbGYucV9sb3JhX3JhbmssCiAgICAgICAgICBzZWxmLmt2X2xvcmFfcmFuaykKICAKICAgICAgICBoaXBfbW9kdWxlLnN0b3Jla3YoCiAgICAgICAgICAgIHNlbGYua3ZfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICBrdl9jYWNoZS5nZXRfZGF0YSgpLmRhdGFfcHRyKCksCiAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgIGt2X2NhY2hlLnNlcV9sZW4pCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgaGlwX21vZHVsZS5tYXRtdWxfcWxvcmEoCiAgICAgICAgICBzZWxmLnFfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5XX21lcmdlZC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5TY29yZU5vUm9wZTEuZGF0YV9wdHIoKSwKICAgICAgICAgIDEyOCwKICAgICAgICAgIDUxMiwKICAgICAgICAgIDE1MzYpCiAgICAgICAgICAKICAgICAgICAKICAgICAgICBrdl9jYWNoZS5zZXFfbGVuKz0xCiAgICAgICAga3ZfbGVuID0ga3ZfY2FjaGUuc2VxX2xlbgogICAgICAgIAogICAgICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEKICAgICAgICBrdl9sb3JhID0ga3ZfY2FjaGUuZ2V0X2RhdGEoKVs6LCA6a3ZfbGVuLCA6XQogICAgICAgIAogICAgICAgIAogICAgICAgIGt2RG93bl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgICAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2RG93bl9ub3BlLnBlcm11dGUoMCwyLDEpCiAgICAgICAgCiAgICAgICAgU2NvcmVOb1JvcGUxID0gc2VsZi5TY29yZU5vUm9wZTEucGVybXV0ZSgxLDAsMikKICAgICAgICBTY29yZU5vUm9wZV90PVNjb3JlTm9Sb3BlMS52aWV3KGJhdGNoX3NpemUsc2VsZi5uX2hlYWRzLDUxMikgI1ticyxuX2hlYWQsNTEyXSkKICAgICAgICAKICAgICAgICBTY29yZU5vUm9wZSA9IHRvcmNoLm1hdG11bChTY29yZU5vUm9wZV90LGt2X2Rvd25fcGVybXV0ZSkKICAgICAgICAKICAgICAgICBXcU5vcGVSb3BlID0gc2VsZi5jb25maWcuUV9wcm9qX3VwX3dlaWdodC50KCkudmlldyhzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcyxzZWxmLm5vcGVfaGVhZF9kaW0rc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIF8sIFdxX1VwX3JvcGUgPSB0b3JjaC5zcGxpdChXcU5vcGVSb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgIFdrdl91cCA9IHNlbGYuY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnQoKS52aWV3KHNlbGYua3ZfbG9yYV9yYW5rLHNlbGYubl9oZWFkcyxzZWxmLm5vcGVfaGVhZF9kaW0rc2VsZi52X2hlYWRfZGltKQogICAgICAgIF8sIFd2X3VwID0gdG9yY2guc3BsaXQoV2t2X3VwLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnZfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAgCiAgICAgICAgV3ZfdXAgPSBXdl91cC5wZXJtdXRlKDEsIDAsIDIpICAjIHNoYXBlOiAobl9oZWFkLCBkaW0sIGhlYWQpICAgICAgICAKICAgICAgICBXcV9VcF9yb3BlMCA9IFdxX1VwX3JvcGUudmlldyhzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcyxzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgV3FfVXBfcm9wZTAgPSBXcV9VcF9yb3BlMC5wZXJtdXRlKDEsMCwyKQogICAgICAgIFFSb3BlMCA9IHRvcmNoLm1hdG11bChzZWxmLnFfbG9yYS5wZXJtdXRlKDEsMCwyKSxXcV9VcF9yb3BlMCkjMQoKICAgICAgICAKICAgICAgICBRUm9wZSA9IFFSb3BlMC5wZXJtdXRlKDEsMCwyKS52aWV3KDEyOCwgMSwgMTI4LCA2NCkuY29udGlndW91cygpCiAgICAgICAgcV9yb3BlID0gUVJvcGUucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHggbl9oZWFkcyB4IHNlcV9sZW4geCByb3BlX2hlYWRfZGltCiAKICAgICAgICBrX3JvcGVfb3V0ID0gdG9yY2guZW1wdHkoYmF0Y2hfc2l6ZSwga3ZfbGVuLCA2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBxX3JvcGVfb3V0ID0gdG9yY2guZW1wdHkoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLDEsIDY0LGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQogICAgICAgIGhpcF9tb2R1bGUucm9wZShrX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGtfcm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBrX3JvcGUuc3RyaWRlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHFfcm9wZV9vdXQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcV9yb3BlLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubl9oZWFkcywKICAgICAgICAgICAgICAgICAgICAgICAga3ZfbGVuKQogICAgICAgIAogICAgICAgIGtfcm9wZV9vdXQgPSBrX3JvcGVfb3V0LnVuc3F1ZWV6ZSgxKQoKICAgICAgICBTY29yZU91dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIDEyOCwga3ZfbGVuLGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQogICAgICAgIGhpcF9tb2R1bGUuY29tYmluZV9yb3BlKAogICAgICAgICAgU2NvcmVOb1JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgIHFfcm9wZV9vdXQuZGF0YV9wdHIoKSwKICAgICAgICAgIGtfcm9wZV9vdXQuZGF0YV9wdHIoKSwKICAgICAgICAgIFNjb3JlT3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBTY29yZU91dC5zaGFwZVsxXSwKICAgICAgICAgIGt2X2xlbiwKICAgICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSwKICAgICAgICAgIDEuMCAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pKQogICAgICAgIAogICAgICAgIEF0dG5PdXRTTWF4ID0gRi5zb2Z0bWF4KFNjb3JlT3V0LCBkaW09LTEpIy50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICAKICAgICAgICBrdl9kb3duID0ga3ZEb3duX25vcGUudW5zcXVlZXplKDEpCiAgICAgICAgeTBfYyA9IHRvcmNoLm1hdG11bChBdHRuT3V0U01heC5zcXVlZXplKDIpLGt2X2Rvd24uc3F1ZWV6ZSgxKSkKICAgICAgICB5MF9jPXkwX2MudW5zcXVlZXplKDIpCiAgICAgICAgCiAgICAgICAgeTBfYyA9IHRvcmNoLm1hdG11bCh5MF9jLnBlcm11dGUoMSwwLDIsMykuc3F1ZWV6ZSgyKSxXdl91cCkKICAgICAgICB5MF9jID0geTBfYy5wZXJtdXRlKDEsMCwyKQogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoeTBfYy5mbGF0dGVuKHN0YXJ0X2RpbT0xKSxzZWxmLmNvbmZpZy53b193ZWlnaHQudCgpKQogICAgICAgIAogICAgICAgIHJldHVybiB5MF9jLnZpZXcoYmF0Y2hfc2l6ZSwxLHNlbGYuZGltKSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKbW9kZWwgPSBOb25lCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQogICAgICBnbG9iYWwgbW9kZWwKICAgICAgaWYgbW9kZWwgPT0gTm9uZToKICAgICAgICAgIG1vZGVsID0gTUxBKGNvbmZpZykudG8oJ2N1ZGE6MCcpCiAgIAogICAgICBtb2RlbC5jb25maWcgPSBjb25maWcKICAgICAgcmV0dXJuIG1vZGVsKHgsIGt2X2NhY2hlKQ==No newline at end of file+ aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKICAgICAKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiN1bmRlZiBfX0hJUF9OT19IQUxGX09QRVJBVE9SU19fCiN1bmRlZiBfX0hJUF9OT19IQUxGX0NPTlZFUlNJT05TX18KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9iZmxvYXQxNi5oPgojaW5jbHVkZSA8cHliaW5kMTEvcHliaW5kMTEuaD4KI2luY2x1ZGUgPHB5YmluZDExL3N0bC5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDx1bmlzdGQuaD4gIAojaW5jbHVkZSA8cm9jYmxhcy9yb2NibGFzLmg+CiNpbmNsdWRlIDxoaXBibGFzbHQvaGlwYmxhc2x0Lmg+CiNpbmNsdWRlIDxoaXBibGFzbHQvaGlwYmxhc2x0LWV4dC5ocHA+CgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9iZjE2Lmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwOC5oPgojaW5jbHVkZSA8dG9yY2gvdG9yY2guaD4KI2RlZmluZSBDSEVDS19ISVBCTEFTTFQoZXJyKSBpZiAoZXJyICE9IEhJUEJMQVNfU1RBVFVTX1NVQ0NFU1MpIHsgQAogIHN0ZDo6Y2VyciA8PCAiaGlwQkxBU0x0IGVycm9yIGF0IGxpbmUgIiA8PCBfX0xJTkVfXyA8PCAgc3RkOjplbmRsOyBleGl0KDEpOyB9CiAgCiNkZWZpbmUgV0FSUF9TSVpFIDY0CnVzaW5nIGJmMTYgPSBoaXBfYmZsb2F0MTY7CgppbnQgZGl2VXAoaW50IHgsaW50IG4pewpyZXR1cm4gKHggKyBuLTEpL247Cn0KCnRlbXBsYXRlPGludCBuX3NwbGl0PgpfX2dsb2JhbF9fIHZvaWQgcm9wZV9rZXJuZWwoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSwgaW50IHN0cmlkZV9icywgaW50IHN0cmlkZV9zZXEpIHsKICBjb25zdGV4cHIgaW50IGRfbW9kZWwgPSA2NDsvL011c3QgYmUgZXF1YWwgdG8gV0FSUF9TSVpFCiAgY29uc3RleHByIGludCBkX21vZGVsXzIgPSBkX21vZGVsLzI7CiAgaW50IHRpZCA9IGJsb2NrSWR4LngqYmxvY2tEaW0ueCArIHRocmVhZElkeC54OwoKICBpbnQgcG9zID0gdGlkICUgZF9tb2RlbDsKICBpbnQgc2VxID0gKHRpZCAvIGRfbW9kZWwpICUgc2VxX2xlbjsKICBpbnQgYnMgPSB0aWQgLyBkX21vZGVsIC8gc2VxX2xlbjsKICAKICBpZiAoYnMgPCBiYXRjaF9zaXplKXsKICAgIGF1dG8gcG9zXzIgPSBiZjE2KHRpZCAlIGRfbW9kZWxfMik7CiAgICBhdXRvIHRoZXRhID0gYmYxNihwb3dmKGJmMTYoMTAwMDAuMGYpLGJmMTYoLXBvc18yKS9iZjE2KGRfbW9kZWxfMikpKTsKICAgIGF1dG8gaWR4X3RoZXRhMiA9IGJmMTYoc3RhcnRfcG9zK3NlcSkqdGhldGE7CiAgICBhdXRvIGMgPSBiZjE2KGNvc2YoaWR4X3RoZXRhMikpOwogICAgYXV0byBzID0gYmYxNihzaW5mKGlkeF90aGV0YTIpKTsKCiAgICBiZjE2IHhfcltuX3NwbGl0XTsKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIGludCBpbmRleCA9ICgoYmF0Y2hfc2l6ZS9uX3NwbGl0KSpzcGxpdCArIGJzKSpzdHJpZGVfYnMrCiAgICAgICAgICAgICAgICAgIHNlcSpzdHJpZGVfc2VxKwogICAgICAgICAgICAgICAgICBwb3M7CiAgICAgICB4X3Jbc3BsaXRdID0gcm9wZVtpbmRleF07CiAgICB9CgogICAgI3ByYWdtYSB1bnJvbGwKICAgIGZvciAoaW50IHNwbGl0PTA7c3BsaXQ8bl9zcGxpdDtzcGxpdCsrKXsKICAgICAgLy9UT0RPOmFkZCBwYXJhbWV0ZXJzIGZvciBvdXRwdXQgc3RyaWRlcwogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqZF9tb2RlbCpzZXFfbGVuKwogICAgICAgICAgICAgICAgICBzZXEqZF9tb2RlbCsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgICAKICAgICAgYXV0byB4ID0geF9yW3NwbGl0XTsKCiAgICAgIGludCBzcmNfbGFuZSA9IChwb3MgK2RfbW9kZWxfMiklIGRfbW9kZWw7CiAgICAgIGF1dG8geF9yb3QgPSBfX3NoZmwoeCwgc3JjX2xhbmUsIDY0KTsKICAgICAgeF9yb3QgPSAocG9zIDwgZF9tb2RlbF8yKSA/IC14X3JvdCA6IHhfcm90OwoKICAgICAgYXV0byBvdXQgID0gYmYxNih4KmMpK2JmMTYoeF9yb3Qqcyk7CiAgICAgIHJvcGVfb3V0W2luZGV4XSA9IG91dDsKCiAgICB9CiAgfQp9Cgp2b2lkIGNvbXB1dGVfcm9wZShiZjE2KiByb3BlX291dCwgY29uc3QgYmYxNiogcm9wZSwgaW50IHN0YXJ0X3BvcywgaW50IHNlcV9sZW4sIGludCBiYXRjaF9zaXplLGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkaW1fcm9wZSA9IDY0OwogIGNvbnN0ZXhwciBpbnQgbl9zcGxpdCA9IDMyOwogIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICBkaW0zIGJsb2Nrc1BlckdyaWQoZGl2VXAoc2VxX2xlbipkaW1fcm9wZSpiYXRjaF9zaXplL25fc3BsaXQsIHRocmVhZHNQZXJCbG9jay54KSk7CiAgaGlwTGF1bmNoS2VybmVsR0dMKChyb3BlX2tlcm5lbDxuX3NwbGl0PiksIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgcm9wZV9vdXQscm9wZSwgc3RhcnRfcG9zLHNlcV9sZW4sYmF0Y2hfc2l6ZSxzdHJpZGVfYnMsc3RyaWRlX3NlcSk7Cn0KCnZvaWQgY29tcHV0ZV9yb3Blc193cmFwcGVyKAogIHVpbnRwdHJfdCBrX3JvcGVfb3V0X3B0ciwKICB1aW50cHRyX3Qga19yb3BlX3B0ciwKICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBrX3JvcGVfc3RyaWRlLAogIHVpbnRwdHJfdCBxX3JvcGVfb3V0X3B0ciwKICB1aW50cHRyX3QgcV9yb3BlX3B0ciwKICBpbnQgYmF0Y2hfc2l6ZSwKICBpbnQgbl9oZWFkcywKICBpbnQgc2VxX2xlbil7CgogIGJmMTYgKmRfa19yb3BlX291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KGtfcm9wZV9vdXRfcHRyKTsKICBiZjE2ICpkX3Ffcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX3JvcGVfb3V0X3B0cik7CiAgY29uc3QgYmYxNiAqZF9rX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihrX3JvcGVfcHRyKTsKICBjb25zdCBiZjE2ICpkX3Ffcm9wZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfcm9wZV9wdHIpOwoKICBpbnQgc3RyaWRlX2JzX2sgPSBrX3JvcGVfc3RyaWRlWzBdOwogIGludCBzdHJpZGVfc2VxX2sgPSBrX3JvcGVfc3RyaWRlWzFdOwogIAogIGludCBzdHJpZGVfYnNfcSA9IDY0OwogIGludCBzdHJpZGVfc2VxX3EgPSA2NDsKCiAgY29tcHV0ZV9yb3BlKGRfa19yb3BlX291dCxkX2tfcm9wZSwgMCwgc2VxX2xlbiwgYmF0Y2hfc2l6ZSxzdHJpZGVfYnNfayxzdHJpZGVfc2VxX2spOwogIGNvbXB1dGVfcm9wZShkX3Ffcm9wZV9vdXQsZF9xX3JvcGUsIHNlcV9sZW4tMSwgMSwgYmF0Y2hfc2l6ZSpuX2hlYWRzLHN0cmlkZV9ic19xLHN0cmlkZV9zZXFfcSk7CiAgCn0KCl9fZ2xvYmFsX18gdm9pZCBzdG9yZV90b19rdl9jYWNoZV9rZXJuZWwoYmYxNioga3ZfY2FjaGUsIGNvbnN0IGJmMTYgKmt2LCBpbnQgYmF0Y2hfc2l6ZSwgaW50IHNlcV9pZCkgewogIGNvbnN0ZXhwciBpbnQgZGltX2t2ID0gNTc2OwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKICBpbnQgYnMgPSB0aWQvZGltX2t2OwogIGludCBjb2wgPSB0aWQgJSBkaW1fa3Y7CiAgaW50IGRzdF9yb3cgPSBicyo4MTkyICsgc2VxX2lkOwogIGludCBkc3RJbmRleCA9IGRzdF9yb3cqZGltX2t2K2NvbDsKICBpZiAoYnM8YmF0Y2hfc2l6ZSAmJiBkc3Rfcm93PGJhdGNoX3NpemUqODE5Mil7CiAgICBrdl9jYWNoZVtkc3RJbmRleF0gPSBrdlticypkaW1fa3YrY29sXTsKICB9Cn0KCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGUoYmYxNioga3ZfY2FjaGUsIGNvbnN0IGJmMTYgKmt2LCBpbnQgYmF0Y2hfc2l6ZSwgaW50IHNlcV9pZCkgIHsKICAgIGNvbnN0ZXhwciBpbnQgZGltX2t2ID0gNTc2OwogICAgZGltMyB0aHJlYWRzUGVyQmxvY2soV0FSUF9TSVpFKjQpOwogICAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKGJhdGNoX3NpemUqZGltX2t2LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogICAgaGlwTGF1bmNoS2VybmVsR0dMKChzdG9yZV90b19rdl9jYWNoZV9rZXJuZWwpLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGt2X2NhY2hlLGt2LCBiYXRjaF9zaXplLCBzZXFfaWQpOwp9CgoKdm9pZCBzdG9yZV90b19rdl9jYWNoZV93cmFwcGVyKAogIHVpbnRwdHJfdCBrdl9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfY2FjaGVfcHRyLAoKICBpbnQgYmF0Y2hfc2l6ZSwKICBpbnQgc2VxX2lkKXsKCiAgY29uc3QgYmYxNiAqZF9rdl9sb3JhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfbG9yYV9wdHIpOwogIGJmMTYgKmRfa3ZfY2FjaGUgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9jYWNoZV9wdHIpOwoKICBzdG9yZV90b19rdl9jYWNoZShkX2t2X2NhY2hlLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIHNlcV9pZCk7CiAgCn0KCnN0YXRpYyByb2NibGFzX2hhbmRsZSBoYW5kbGU7CnN0YXRpYyBib29sIGhhc0luaXQgPSBmYWxzZTsKc3RhdGljIHNpemVfdCB3b3Jrc3BhY2VTaXplID0gKDQgPDwgMjApKjQ7IAoKICAgIC8vIENyZWF0ZSBoaXBCTEFTTHQgaGFuZGxlCnN0YXRpYyBoaXBibGFzTHRIYW5kbGVfdCBoYW5kbGVfaGlwYmxhczsKICAgIApzdHJ1Y3QgQ29uZmlnQmxhc0x0ewogIGhpcGJsYXNMdE1hdHJpeExheW91dF90IGxheW91dEEsIGxheW91dEIsIGxheW91dEM7CiAgdm9pZCogZF93b3Jrc3BhY2U7CiAgaGlwYmxhc0x0TWF0bXVsSGV1cmlzdGljUmVzdWx0X3QgaGV1cmlzdGljUmVzdWx0OwogIGhpcGJsYXNMdE1hdG11bERlc2NfdCBtYXRtdWxEZXNjOwp9OwoKQ29uZmlnQmxhc0x0IGluaXRCbGFzTHQoaW50IE0sIGludCBOLCBpbnQgSywgaW50IGJhdGNoQ291bnQsIGludCBzdHJpZGVNSywgaW50IHN0cmlkZUtOKXsKCiAgbG9uZyBsb25nIHN0cmlkZUEgPSBzdHJpZGVNSzsKICBsb25nIGxvbmcgc3RyaWRlQiA9IHN0cmlkZUtOOwogIGxvbmcgbG9uZyBzdHJpZGVDID0gTSAqIE47CiAgZmxvYXQgYWxwaGEgPSAxLjBmLCBiZXRhID0gMC4wZjsKIAogIGhpcGJsYXNMdE1hdG11bERlc2NfdCBtYXRtdWxEZXNjOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRtdWxEZXNjQ3JlYXRlKCZtYXRtdWxEZXNjLCBISVBCTEFTX0NPTVBVVEVfMzJGLCAgSElQX1JfMzJGKSk7CiAgCiAgaGlwYmxhc0x0TWF0cml4TGF5b3V0X3QgbGF5b3V0QSwgbGF5b3V0QiwgbGF5b3V0QzsKICBDSEVDS19ISVBCTEFTTFQoaGlwYmxhc0x0TWF0cml4TGF5b3V0Q3JlYXRlKCZsYXlvdXRBLCBISVBfUl8xNkJGLCBLLCBNLCBLKSk7CiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdHJpeExheW91dENyZWF0ZSgmbGF5b3V0QiwgSElQX1JfMTZCRiwgTiwgSywgTikpOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRDcmVhdGUoJmxheW91dEMsIEhJUF9SXzE2QkYsIE4sIE0sIE4pKTsKCiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdHJpeExheW91dFNldEF0dHJpYnV0ZShsYXlvdXRBLAogICAgICBISVBCTEFTTFRfTUFUUklYX0xBWU9VVF9CQVRDSF9DT1VOVCwgJmJhdGNoQ291bnQsIHNpemVvZihiYXRjaENvdW50KSkpOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRTZXRBdHRyaWJ1dGUobGF5b3V0QSwKICAgICAgSElQQkxBU0xUX01BVFJJWF9MQVlPVVRfU1RSSURFRF9CQVRDSF9PRkZTRVQsICZzdHJpZGVBLCBzaXplb2Yoc3RyaWRlQSkpKTsKCiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdHJpeExheW91dFNldEF0dHJpYnV0ZShsYXlvdXRCLAogICAgICBISVBCTEFTTFRfTUFUUklYX0xBWU9VVF9CQVRDSF9DT1VOVCwgJmJhdGNoQ291bnQsIHNpemVvZihiYXRjaENvdW50KSkpOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRTZXRBdHRyaWJ1dGUobGF5b3V0QiwKICAgICAgSElQQkxBU0xUX01BVFJJWF9MQVlPVVRfU1RSSURFRF9CQVRDSF9PRkZTRVQsICZzdHJpZGVCLCBzaXplb2Yoc3RyaWRlQikpKTsKCiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdHJpeExheW91dFNldEF0dHJpYnV0ZShsYXlvdXRDLAogICAgICBISVBCTEFTTFRfTUFUUklYX0xBWU9VVF9CQVRDSF9DT1VOVCwgJmJhdGNoQ291bnQsIHNpemVvZihiYXRjaENvdW50KSkpOwogIENIRUNLX0hJUEJMQVNMVChoaXBibGFzTHRNYXRyaXhMYXlvdXRTZXRBdHRyaWJ1dGUobGF5b3V0QywKICAgICAgSElQQkxBU0xUX01BVFJJWF9MQVlPVVRfU1RSSURFRF9CQVRDSF9PRkZTRVQsICZzdHJpZGVDLCBzaXplb2Yoc3RyaWRlQykpKTsKCiAgaGlwYmxhc0x0TWF0bXVsUHJlZmVyZW5jZV90IHByZWZlcmVuY2U7CiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdG11bFByZWZlcmVuY2VDcmVhdGUoJnByZWZlcmVuY2UpKTsKCiAgdm9pZCogZF93b3Jrc3BhY2U7CiAgaGlwTWFsbG9jKCZkX3dvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7CiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdG11bFByZWZlcmVuY2VTZXRBdHRyaWJ1dGUocHJlZmVyZW5jZSwKICAgICAgSElQQkxBU0xUX01BVE1VTF9QUkVGX01BWF9XT1JLU1BBQ0VfQllURVMsICZ3b3Jrc3BhY2VTaXplLCBzaXplb2Yod29ya3NwYWNlU2l6ZSkpKTsKCiAgaGlwYmxhc0x0TWF0bXVsSGV1cmlzdGljUmVzdWx0X3QgaGV1cmlzdGljUmVzdWx0OwogIGludCByZXR1cm5lZEFsZ29Db3VudCA9IDA7CiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdG11bEFsZ29HZXRIZXVyaXN0aWMoaGFuZGxlX2hpcGJsYXMsIG1hdG11bERlc2MsCiAgICAgIGxheW91dEIsIGxheW91dEEsIGxheW91dEMsIGxheW91dEMsIHByZWZlcmVuY2UsIDEsICZoZXVyaXN0aWNSZXN1bHQsICZyZXR1cm5lZEFsZ29Db3VudCkpOwoKICBpZiAocmV0dXJuZWRBbGdvQ291bnQgPT0gMCkgewogICAgICBzdGQ6OmNlcnIgPDwgIk5vIHN1aXRhYmxlIGFsZ29yaXRobSBmb3VuZC4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgdGhyb3cgbmV3IHN0ZDo6cnVudGltZV9lcnJvcigiTm8gc3VpdGFibGUgYWxnb3JpdGhtIGZvdW5kLiIpOwogIH0KCiAgcmV0dXJuewogICAgbGF5b3V0QSwgbGF5b3V0QiwgbGF5b3V0QywKICAgIGRfd29ya3NwYWNlLAogICAgaGV1cmlzdGljUmVzdWx0LAogICAgbWF0bXVsRGVzYwogIH07CiAKfQoKc3RhdGljIENvbmZpZ0JsYXNMdCBjb25maWdfbG9yYTsKCnZvaWQgaW5pdCgpewogICAgaWYgKCFoYXNJbml0KXsKICAgICAgICByb2NibGFzX2NyZWF0ZV9oYW5kbGUoJmhhbmRsZSk7ICAgICAgICAKICAgICAgICAKICAgICAgICBDSEVDS19ISVBCTEFTTFQoaGlwYmxhc0x0Q3JlYXRlKCZoYW5kbGVfaGlwYmxhcykpOwogIAogICAgICAgIGludCBiYXRjaENvdW50ID0gMTI4OwogICAgICAgIGludCBNID0gMTI4OwogICAgICAgIGludCBOID0gNTEyOwogICAgICAgIGludCBLID0gMTUzNjsKICAgICAgICBpbnQgc3RyaWRlTUsgPSAwOwogICAgICAgIGludCBzdHJpZGVLTiA9IEsqTjsKICAgICAgICBjb25maWdfbG9yYSA9IGluaXRCbGFzTHQoIE0sICBOLCAgSywgIGJhdGNoQ291bnQsIHN0cmlkZU1LLCBzdHJpZGVLTik7CiAgICAKICAgICAgICBoYXNJbml0ID0gdHJ1ZTsKICAgIH0KfQoKdm9pZCBtYXRtdWxfYmxhc19ybV9jbShjb25zdCBiZjE2KmRBLCBjb25zdCBiZjE2ICpkQiwgYmYxNiAqZEMsIGludCBNLCBpbnQgTiwgaW50IEssIGludCBzdHJpZGVBLCBmbG9hdCBhbHBoYSA9IDEuMGYpewogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICByb2NibGFzX2dlbW1fZXgoCiAgICBoYW5kbGUsCiAgICByb2NibGFzX29wZXJhdGlvbl90cmFuc3Bvc2UsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSywKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgc3RyaWRlQSwKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLAogICAgcm9jYmxhc19kYXRhdHlwZV9mMzJfciwKICAgIHJvY2JsYXNfZ2VtbV9hbGdvX3N0YW5kYXJkLAogICAgMCwgMAogICk7Cn0KCnZvaWQgZG93bl9wcm9qKAogIHVpbnRwdHJfdCB4X3B0ciwKICB1aW50cHRyX3QgcV9wcm9qX2Rvd25fcHRyLAogIHVpbnRwdHJfdCBxX2xvcmFfcHRyLAogIHVpbnRwdHJfdCBrdl9wcm9qX2Rvd25fcHRyLAogIHVpbnRwdHJfdCBrdl9sb3JhX3B0ciwKICBpbnQgYmF0Y2hfc2l6ZSwKICBpbnQgZGltX3FfZG93biwKICBpbnQgZGltX2t2X2Rvd24sCiAgaW50IGRpbV9lbWJlZCl7CgogIGNvbnN0IGJmMTYgKmRfaW5wdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPih4X3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3Byb2pfZG93biA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfcHJval9kb3duX3B0cik7CiAgY29uc3QgYmYxNiAqZF9rdl9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihrdl9wcm9qX2Rvd25fcHRyKTsKICAKICBiZjE2ICpkX3FfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KHFfbG9yYV9wdHIpOwogIGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8YmYxNio+KGt2X2xvcmFfcHRyKTsKCiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfcV9wcm9qX2Rvd24sIGRfcV9sb3JhLCBiYXRjaF9zaXplLCBkaW1fcV9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAgbWF0bXVsX2JsYXNfcm1fY20oZF9pbnB1dCwgZF9rdl9wcm9qX2Rvd24sIGRfa3ZfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX2t2X2Rvd24sIGRpbV9lbWJlZCxkaW1fZW1iZWQpOwogIAp9CgoKdm9pZCBtYXRtdWxfYmxhc19jbV9ybV9iYXRjaGVkX3N0cmlkZShjb25zdCBiZjE2KmRBLCBjb25zdCBiZjE2ICpkQiwgYmYxNiAqZEMsIGludCBNLCBpbnQgTiwgaW50IEssIGludCBuX2JhdGNoZXMsIGludCBzdHJpZGVNSywgaW50IHN0cmlkZUtOKXsKICBjb25zdCBmbG9hdCBhbHBoYSA9IDEuMGY7CiAgY29uc3QgZmxvYXQgYmV0YSAgPSAwLjBmOwogIHJvY2JsYXNfZ2VtbV9zdHJpZGVkX2JhdGNoZWRfZXgoCiAgICBoYW5kbGUsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixzdHJpZGVLTiwKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTSxzdHJpZGVNSywKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBuX2JhdGNoZXMsCiAgICByb2NibGFzX2RhdGF0eXBlX2YzMl9yLAogICAgcm9jYmxhc19nZW1tX2FsZ29fc3RhbmRhcmQsCiAgICAwLCAwCiAgKTsKfQoKdm9pZCBtZXJnZWRfbWF0bXVsKAogIHVpbnRwdHJfdCBRX3Byb2pfdXBfcHRyLAogIHVpbnRwdHJfdCBLVl9wcm9qX3VwX3B0ciwKICB1aW50cHRyX3QgbWVyZ2VkX3B0ciwKICBpbnQgYmF0Y2hfc2l6ZSwKICBpbnQgcV9sb3JhX2RpbSwKICBpbnQga3ZfbG9yYV9kaW0pewogIAogIGNvbnN0IGJmMTYgKmRfV3FfVXBfbm9wZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KFFfcHJval91cF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfV2tfdXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihLVl9wcm9qX3VwX3B0cik7CiAgYmYxNiAqZF9tZXJnZWQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihtZXJnZWRfcHRyKTsKICAKICBjb25zdCBpbnQgbmJfaGVhZHMgPSAxMjg7CiAgY29uc3QgaW50IE0gPSBxX2xvcmFfZGltOwogIGNvbnN0IGludCBOID0ga3ZfbG9yYV9kaW07CiAgY29uc3QgaW50IEsgPSAxMjg7CiAgY29uc3QgaW50IHN0cmlkZU1LID0gMTkyKnFfbG9yYV9kaW07Ly8xMjgrNjQKICBjb25zdCBpbnQgc3RyaWRlS04gPSAyNTYqa3ZfbG9yYV9kaW07IC8vMTI4KzEyOAogICAgCiAgbWF0bXVsX2JsYXNfY21fcm1fYmF0Y2hlZF9zdHJpZGUoZF9XcV9VcF9ub3BlLCBkX1drX3VwLCBkX21lcmdlZCwgTSwgIE4sICBLLCBiYXRjaF9zaXplLHN0cmlkZU1LLCBzdHJpZGVLTik7CiAgCn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY21fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGNvbnN0IGJmMTYgKmRDLCBiZjE2ICpkRCwgaW50IE0sIGludCBOLCBpbnQgSywgaW50IG5fYmF0Y2hlcywgaW50IHN0cmlkZU1LLCBpbnQgc3RyaWRlS04sIGZsb2F0IGFscGhhLCBmbG9hdCBiZXRhKXsKCiAgcm9jYmxhc19nZW1tX3N0cmlkZWRfYmF0Y2hlZF9leCgKICAgIGhhbmRsZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX3RyYW5zcG9zZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX25vbmUsCiAgICBOLCBNLCBLLAogICAgJmFscGhhLAogICAgZEIsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBLLHN0cmlkZUtOLAogICAgZEEsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBLLHN0cmlkZU1LLAogICAgJmJldGEsCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgZEQsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIG5fYmF0Y2hlcywKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGNvbWJpbmVfcm9wZSgKICB1aW50cHRyX3QgU2NvcmVOb1JvcGVfcHRyLAogIHVpbnRwdHJfdCBxX3JvcGVfb3V0X3B0ciwKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IFNjb3JlT3V0X3B0ciwKICBpbnQgTSwKICBpbnQgTiwKICBpbnQgSywKICBmbG9hdCBzY2FsZSl7CiAgCiAgY29uc3QgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlX291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGtfcm9wZV9vdXRfcHRyKTsKICBjb25zdCBiZjE2ICpkX1Njb3JlTm9Sb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oU2NvcmVOb1JvcGVfcHRyKTsKICBiZjE2ICogIGRfU2NvcmVPdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihTY29yZU91dF9wdHIpOwogIAogIGNvbnN0IGludCBuYl9oZWFkcyA9IDEyODsKICBpbnQgc3RyaWRlTUsgPSBLKk07CiAgaW50IHN0cmlkZUtOID0gSypOOwoKICBtYXRtdWxfYmxhc19ybV9jbV9iYXRjaGVkX3N0cmlkZShkX3Ffcm9wZV9vdXQsIGRfa19yb3BlX291dCwgZF9TY29yZU5vUm9wZSwgZF9TY29yZU91dCwgTSwgIE4sICBLLCBuYl9oZWFkcyxzdHJpZGVNSywgc3RyaWRlS04sc2NhbGUsc2NhbGUpOwp9Cgp2b2lkIG1hdG11bF9ibGFzX3JtX3JtX2JhdGNoZWRfc3RyaWRlKGNvbnN0IGJmMTYqZEEsIGNvbnN0IGJmMTYgKmRCLCBiZjE2ICpkQywgaW50IE0sIGludCBOLCBpbnQgSywgaW50IG5fYmF0Y2hlcywgaW50IHN0cmlkZU1LLCBpbnQgc3RyaWRlS04pewogIGNvbnN0IGZsb2F0IGFscGhhID0gMS4wZjsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgCiAgcm9jYmxhc19nZW1tX3N0cmlkZWRfYmF0Y2hlZF9leCgKICAgIGhhbmRsZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX25vbmUsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixzdHJpZGVLTiwKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVNSywKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBuX2JhdGNoZXMsCiAgICByb2NibGFzX2RhdGF0eXBlX2YzMl9yLAogICAgcm9jYmxhc19nZW1tX2FsZ29fc29sdXRpb25faW5kZXgsCiAgICAwLCAwCiAgKTsKICAKfQoKCnZvaWQgbWF0bXVsX2hpcGJsYXNsdF9ybV9ybV9iYXRjaGVkX3N0cmlkZShjb25zdCBDb25maWdCbGFzTHQgJiBjb25maWcgLCBjb25zdCBiZjE2KmRfQSwgY29uc3QgYmYxNiAqZF9CLCBiZjE2ICpkX0MgKXsKCiAgZmxvYXQgYWxwaGEgPSAxLjBmLCBiZXRhID0gMC4wZjsKICAvLyBSdW4gbWF0bXVsCiAgQ0hFQ0tfSElQQkxBU0xUKGhpcGJsYXNMdE1hdG11bChoYW5kbGUsCiAgICAgIGNvbmZpZy5tYXRtdWxEZXNjLAogICAgICAmYWxwaGEsIGRfQiwgY29uZmlnLmxheW91dEIsCiAgICAgICAgICAgICAgZF9BLCBjb25maWcubGF5b3V0QSwKICAgICAgJmJldGEsICBkX0MsIGNvbmZpZy5sYXlvdXRDLAogICAgICAgICAgICAgIGRfQywgY29uZmlnLmxheW91dEMsCiAgICAgICZjb25maWcuaGV1cmlzdGljUmVzdWx0LmFsZ28sCiAgICAgIGNvbmZpZy5kX3dvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSwgMCkpOwogICAgCn0Kdm9pZCBtYXRtdWxfcWxvcmEoCiAgdWludHB0cl90IHFfbG9yYV9wdHIsCiAgdWludHB0cl90IFdfbWVyZ2VkX3B0ciwKICB1aW50cHRyX3QgU2NvcmVOb1JvcGVfcHRyLAogIGludCBNLAogIGludCBOLAogIGludCBLKXsKICAKICBjb25zdCBiZjE2ICpkX3FfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfbG9yYV9wdHIpOwogIGNvbnN0IGJmMTYgKmRfV19tZXJnZWQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihXX21lcmdlZF9wdHIpOwogIGJmMTYgKmRfU2NvcmVOb1JvcGUxID0gcmVpbnRlcnByZXRfY2FzdDwgYmYxNio+KFNjb3JlTm9Sb3BlX3B0cik7CiAgCiAgY29uc3QgaW50IG5iX2hlYWRzID0gMTI4OwogIGNvbnN0IGludCBzdHJpZGVNSyA9IDA7CiAgY29uc3QgaW50IHN0cmlkZUtOID0gSypOOyAKICAgCiAgbWF0bXVsX2hpcGJsYXNsdF9ybV9ybV9iYXRjaGVkX3N0cmlkZShjb25maWdfbG9yYSxkX3FfbG9yYSwgZF9XX21lcmdlZCwgZF9TY29yZU5vUm9wZTEpOwogIAp9Cgp0b3JjaDo6VGVuc29yIG1hdG11bF9jcHAodG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIpIHsKICAgIHJldHVybiBhdDo6Ym1tKGEsIGIpOwp9CgoKCgpQWUJJTkQxMV9NT0RVTEUocm9wZSwgbSkgewogIG0uZGVmKCJpbml0IiwgJmluaXQsICJJbml0IGNvZGUiKTsKICBtLmRlZigicm9wZSIsICZjb21wdXRlX3JvcGVzX3dyYXBwZXIsICJSb3BlIGtlcm5lbCIpOwogIG0uZGVmKCJzdG9yZWt2IiwgJnN0b3JlX3RvX2t2X2NhY2hlX3dyYXBwZXIsICJLVkNhY2hlIGtlcm5lbCIpOwogIG0uZGVmKCJkb3duX3Byb2oiLCAmZG93bl9wcm9qLCAiRG93biBQcm9qIGtlcm5lbCIpOwogIG0uZGVmKCJtZXJnZWRfbWF0bXVsIiwgJm1lcmdlZF9tYXRtdWwsICJtZXJnZWRfbWF0bXVsIGtlcm5lbCIpOwogIG0uZGVmKCJjb21iaW5lX3JvcGUiLCAmY29tYmluZV9yb3BlLCAiY29tYmluZV9yb3BlIGtlcm5lbCIpOwogIG0uZGVmKCJtYXRtdWxfcWxvcmEiLCAmbWF0bXVsX3Fsb3JhLCAibWF0bXVsX3Fsb3JhIGtlcm5lbCIpOwogIG0uZGVmKCJtYXRtdWxfY3BwIiwgJm1hdG11bF9jcHAsICJtYXRtdWxfdGVzdCBrZXJuZWwiKTsKICAKICAKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9InJvcGUiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMTcgLU8zIl0sCiAgICBub19pbXBsaWNpdF9oZWFkZXJzPVRydWUsCikKCgpjbGFzcyBLVkNhY2hlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga3ZfY2FjaGVfc2hhcGU6IHR1cGxlKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdkYXRhJywgdG9yY2guemVyb3Moa3ZfY2FjaGVfc2hhcGUsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSkKICAgICAgICBzZWxmLnNlcV9sZW4gPSAwCiAgICAgICAgc2VsZi56ZXJvKCkKCiAgICBkZWYgemVybyhzZWxmKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGF0YS56ZXJvXygpCiAgICAKICAgIGRlZiBnZXRfZGF0YShzZWxmKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGNfa3Y6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGFzc2VydCBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSkgPD0gc2VsZi5kYXRhLnNpemUoMSksICJLViBDYWNoZSBFeGNlZWRlZCIKCiAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhLnRvKGNfa3YuZHR5cGUpCiAgICAgICAgc2VsZi5kYXRhWwogICAgICAgICAgICA6LCBzZWxmLnNlcV9sZW4gOiBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSksIDoKICAgICAgICBdID0gY19rdgogICAgICAgIHNlbGYuc2VxX2xlbiArPSBjX2t2LnNpemUoMSkKCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVs6LCA6c2VsZi5zZXFfbGVuXSwgc2VsZi5zZXFfbGVuCiAgICAKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCiAgICAgCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAKICAgICAgICBzZWxmLnFfbG9yYSA9IHRvcmNoLmVtcHR5KGNvbmZpZy5iYXRjaF9zaXplLCAxLCBzZWxmLnFfbG9yYV9yYW5rLGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQogICAgICAgIHNlbGYua3ZfbG9yYSA9IHRvcmNoLmVtcHR5KGNvbmZpZy5iYXRjaF9zaXplLCAxLCBzZWxmLmt2X2xvcmFfcmFuays2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLlNjb3JlTm9Sb3BlMSA9IHRvcmNoLmVtcHR5KGNvbmZpZy5iYXRjaF9zaXplLCAxMjgsIDUxMixkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLldfbWVyZ2VkID0gdG9yY2guZW1wdHkoY29uZmlnLmJhdGNoX3NpemUsIHNlbGYucV9sb3JhX3JhbmssIHNlbGYua3ZfbG9yYV9yYW5rLGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgaGlwX21vZHVsZS5pbml0KCkKICAgICAgICAKIAogICAgICAgIAogICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwga3ZfY2FjaGU6IEtWQ2FjaGUpIC0+IHRvcmNoLlRlbnNvcjoKCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgbW9kZWxfZGltID0geC5zaXplKCkKICAgICAgICAgIAogICAgICAgIGhpcF9tb2R1bGUuZG93bl9wcm9qKAogICAgICAgICAgICAgICAgeC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5jb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5jb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5rdl9sb3JhLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICAgICAgc2VsZi5xX2xvcmFfcmFuaywKICAgICAgICAgICAgICAgIHNlbGYua3ZfbG9yYV9yYW5rKzY0LAogICAgICAgICAgICAgICAgeC5zaGFwZVsyXSkKICAgICAgICAgICAgICAgCiAgICAgICAgaGlwX21vZHVsZS5tZXJnZWRfbWF0bXVsKAogICAgICAgICAgc2VsZi5jb25maWcuUV9wcm9qX3VwX3dlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5jb25maWcuS1ZfcHJval91cF93ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgIHNlbGYuV19tZXJnZWQuZGF0YV9wdHIoKSwKICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICBzZWxmLnFfbG9yYV9yYW5rLAogICAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmspCiAgCiAgICAgICAgaGlwX21vZHVsZS5zdG9yZWt2KAogICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAga3ZfY2FjaGUuZ2V0X2RhdGEoKS5kYXRhX3B0cigpLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBrdl9jYWNoZS5zZXFfbGVuKQogICAgICAgIAogICAgICAgIAogICAgICAgIGhpcF9tb2R1bGUubWF0bXVsX3Fsb3JhKAogICAgICAgICAgc2VsZi5xX2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgIHNlbGYuV19tZXJnZWQuZGF0YV9wdHIoKSwKICAgICAgICAgIHNlbGYuU2NvcmVOb1JvcGUxLmRhdGFfcHRyKCksCiAgICAgICAgICAxMjgsCiAgICAgICAgICA1MTIsCiAgICAgICAgICAxNTM2KQogICAgICAgICAgCiAgICAgICAgCiAgICAgICAga3ZfY2FjaGUuc2VxX2xlbis9MQogICAgICAgIGt2X2xlbiA9IGt2X2NhY2hlLnNlcV9sZW4KICAgICAgICAKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCiAgICAgICAga3ZfbG9yYSA9IHRvcmNoLmFzX3N0cmlkZWQoa3ZfY2FjaGUuZGF0YSwgc2l6ZT0oMTI4LCBrdl9sZW4sIDU3NiksIHN0cmlkZT1rdl9jYWNoZS5kYXRhLnN0cmlkZSgpKQogICAgICAgIAogICAgICAgIGt2RG93bl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgICAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2RG93bl9ub3BlLnBlcm11dGUoMCwyLDEpCiAgICAgICAgCiAgICAgICAgU2NvcmVOb1JvcGUxID0gc2VsZi5TY29yZU5vUm9wZTEucGVybXV0ZSgxLDAsMikKICAgICAgICBTY29yZU5vUm9wZV90PVNjb3JlTm9Sb3BlMS52aWV3KGJhdGNoX3NpemUsc2VsZi5uX2hlYWRzLDUxMikgI1ticyxuX2hlYWQsNTEyXSkKCiAgICAgICAgU2NvcmVOb1JvcGUgPSBoaXBfbW9kdWxlLm1hdG11bF9jcHAoU2NvcmVOb1JvcGVfdCxrdl9kb3duX3Blcm11dGUpCiAgICAgICAgCiAgICAgICAgV3FOb3BlUm9wZSA9IHNlbGYuY29uZmlnLlFfcHJval91cF93ZWlnaHQudCgpLnZpZXcoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5ub3BlX2hlYWRfZGltK3NlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBfLCBXcV9VcF9yb3BlID0gdG9yY2guc3BsaXQoV3FOb3BlUm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICBXa3ZfdXAgPSBzZWxmLmNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodC50KCkudmlldyhzZWxmLmt2X2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5ub3BlX2hlYWRfZGltK3NlbGYudl9oZWFkX2RpbSkKICAgICAgICBfLCBXdl91cCA9IHRvcmNoLnNwbGl0KFdrdl91cCwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi52X2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIAogICAgICAgIFd2X3VwID0gV3ZfdXAucGVybXV0ZSgxLCAwLCAyKSAgIyBzaGFwZTogKG5faGVhZCwgZGltLCBoZWFkKSAgICAgICAgCiAgICAgICAgV3FfVXBfcm9wZTAgPSBXcV9VcF9yb3BlLnZpZXcoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMsc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIFdxX1VwX3JvcGUwID0gV3FfVXBfcm9wZTAucGVybXV0ZSgxLDAsMikKICAgICAgICBRUm9wZTAgPSB0b3JjaC5tYXRtdWwoc2VsZi5xX2xvcmEucGVybXV0ZSgxLDAsMiksV3FfVXBfcm9wZTApIzEKCiAgICAgICAgCiAgICAgICAgUVJvcGUgPSBRUm9wZTAucGVybXV0ZSgxLDAsMikudmlldygxMjgsIDEsIDEyOCwgNjQpLmNvbnRpZ3VvdXMoKQogICAgICAgIHFfcm9wZSA9IFFSb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogCiAgICAgICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIGt2X2xlbiwgNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgcV9yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywxLCA2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLnJvcGUoa19yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBrX3JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAga19yb3BlLnN0cmlkZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHFfcm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5faGVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGt2X2xlbikKICAgICAgICAKICAgICAgICBrX3JvcGVfb3V0ID0ga19yb3BlX291dC51bnNxdWVlemUoMSkKCiAgICAgICAgU2NvcmVPdXQgPSB0b3JjaC5lbXB0eShiYXRjaF9zaXplLCAxMjgsIGt2X2xlbixkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLmNvbWJpbmVfcm9wZSgKICAgICAgICAgIFNjb3JlTm9Sb3BlLmRhdGFfcHRyKCksCiAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBrX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBTY29yZU91dC5kYXRhX3B0cigpLAogICAgICAgICAgU2NvcmVPdXQuc2hhcGVbMV0sCiAgICAgICAgICBrdl9sZW4sCiAgICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0sCiAgICAgICAgICAxLjAgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKSkKICAgICAgICAKICAgICAgICBBdHRuT3V0U01heCA9IEYuc29mdG1heChTY29yZU91dCwgZGltPS0xKSMudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAga3ZfZG93biA9IGt2RG93bl9ub3BlLnVuc3F1ZWV6ZSgxKQogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoQXR0bk91dFNNYXguc3F1ZWV6ZSgyKSxrdl9kb3duLnNxdWVlemUoMSkpCiAgICAgICAgeTBfYz15MF9jLnVuc3F1ZWV6ZSgyKQogICAgICAgIAogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoeTBfYy5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV3ZfdXApCiAgICAgICAgeTBfYyA9IHkwX2MucGVybXV0ZSgxLDAsMikKICAgICAgICB5MF9jID0gdG9yY2gubWF0bXVsKHkwX2MuZmxhdHRlbihzdGFydF9kaW09MSksc2VsZi5jb25maWcud29fd2VpZ2h0LnQoKSkKICAgICAgICAKICAgICAgICByZXR1cm4geTBfYy52aWV3KGJhdGNoX3NpemUsMSxzZWxmLmRpbSksIGt2X2NhY2hlLmdldF9kYXRhKCkKCm1vZGVsID0gTm9uZQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgICAgZ2xvYmFsIG1vZGVsCiAgICAgIGlmIG1vZGVsID09IE5vbmU6CiAgICAgICAgICBtb2RlbCA9IE1MQShjb25maWcpLnRvKCdjdWRhOjAnKQogICAKICAgICAgbW9kZWwuY29uZmlnID0gY29uZmlnCiAgICAgIHJldHVybiBtb2RlbCh4LCBrdl9jYWNoZSk=No newline at end of file
Best evidence level for this revision: reported
JSON