Skip to content
KernelIndex
Search⌘K

submission 30286

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_2.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mla-decode-30286?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
AMD MLA decodebf16 · [128, 1, 7168]
AMD Instinct MI300X
2.02ms
#19 of 79
2025-06-01

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:25171ab6d0b25bd65b4e66608496ba2354eacec2be50fe88efb23497bc915919
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

baguette_mla_2.py1 lines
aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKaW1wb3J0IHN5cwogICAgIAogICAgIAppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKa2VybmVsX2NwcCA9IHIiIiIKI3VuZGVmIF9fSElQX05PX0hBTEZfT1BFUkFUT1JTX18KI3VuZGVmIF9fSElQX05PX0hBTEZfQ09OVkVSU0lPTlNfXwojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmbG9hdDE2Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8cHliaW5kMTEvc3RsLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHVuaXN0ZC5oPiAgCiNpbmNsdWRlIDxyb2NibGFzL3JvY2JsYXMuaD4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgojZGVmaW5lIFdBUlBfU0laRSA2NAp1c2luZyBiZjE2ID0gaGlwX2JmbG9hdDE2OwoKaW50IGRpdlVwKGludCB4LGludCBuKXsKcmV0dXJuICh4ICsgbi0xKS9uOwp9Cgp0ZW1wbGF0ZTxpbnQgbl9zcGxpdD4KX19nbG9iYWxfXyB2b2lkIHJvcGVfa2VybmVsKGJmMTYqIHJvcGVfb3V0LCBjb25zdCBiZjE2KiByb3BlLCBpbnQgc3RhcnRfcG9zLCBpbnQgc2VxX2xlbiwgaW50IGJhdGNoX3NpemUsIGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkX21vZGVsID0gNjQ7Ly9NdXN0IGJlIGVxdWFsIHRvIFdBUlBfU0laRQogIGNvbnN0ZXhwciBpbnQgZF9tb2RlbF8yID0gZF9tb2RlbC8yOwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKCiAgaW50IHBvcyA9IHRpZCAlIGRfbW9kZWw7CiAgaW50IHNlcSA9ICh0aWQgLyBkX21vZGVsKSAlIHNlcV9sZW47CiAgaW50IGJzID0gdGlkIC8gZF9tb2RlbCAvIHNlcV9sZW47CiAgCiAgaWYgKGJzIDwgYmF0Y2hfc2l6ZSl7CiAgICBhdXRvIHBvc18yID0gYmYxNih0aWQgJSBkX21vZGVsXzIpOwogICAgYXV0byB0aGV0YSA9IGJmMTYocG93ZihiZjE2KDEwMDAwLjBmKSxiZjE2KC1wb3NfMikvYmYxNihkX21vZGVsXzIpKSk7CiAgICBhdXRvIGlkeF90aGV0YTIgPSBiZjE2KHN0YXJ0X3BvcytzZXEpKnRoZXRhOwogICAgYXV0byBjID0gYmYxNihjb3NmKGlkeF90aGV0YTIpKTsKICAgIGF1dG8gcyA9IGJmMTYoc2luZihpZHhfdGhldGEyKSk7CgogICAgYmYxNiB4X3Jbbl9zcGxpdF07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgc3BsaXQ9MDtzcGxpdDxuX3NwbGl0O3NwbGl0KyspewogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqc3RyaWRlX2JzKwogICAgICAgICAgICAgICAgICBzZXEqc3RyaWRlX3NlcSsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgeF9yW3NwbGl0XSA9IHJvcGVbaW5kZXhdOwogICAgfQoKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIC8vVE9ETzphZGQgcGFyYW1ldGVycyBmb3Igb3V0cHV0IHN0cmlkZXMKICAgICAgaW50IGluZGV4ID0gKChiYXRjaF9zaXplL25fc3BsaXQpKnNwbGl0ICsgYnMpKmRfbW9kZWwqc2VxX2xlbisKICAgICAgICAgICAgICAgICAgc2VxKmRfbW9kZWwrCiAgICAgICAgICAgICAgICAgIHBvczsKICAgICAgICAgCiAgICAgIGF1dG8geCA9IHhfcltzcGxpdF07CgogICAgICBpbnQgc3JjX2xhbmUgPSAocG9zICtkX21vZGVsXzIpJSBkX21vZGVsOwogICAgICBhdXRvIHhfcm90ID0gX19zaGZsKHgsIHNyY19sYW5lLCA2NCk7CiAgICAgIHhfcm90ID0gKHBvcyA8IGRfbW9kZWxfMikgPyAteF9yb3QgOiB4X3JvdDsKCiAgICAgIGF1dG8gb3V0ICA9IGJmMTYoeCpjKStiZjE2KHhfcm90KnMpOwogICAgICByb3BlX291dFtpbmRleF0gPSBvdXQ7CgogICAgfQogIH0KfQoKdm9pZCBjb21wdXRlX3JvcGUoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSxpbnQgc3RyaWRlX2JzLCBpbnQgc3RyaWRlX3NlcSkgewogIGNvbnN0ZXhwciBpbnQgZGltX3JvcGUgPSA2NDsKICBjb25zdGV4cHIgaW50IG5fc3BsaXQgPSAzMjsKICBkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CiAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKHNlcV9sZW4qZGltX3JvcGUqYmF0Y2hfc2l6ZS9uX3NwbGl0LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogIGhpcExhdW5jaEtlcm5lbEdHTCgocm9wZV9rZXJuZWw8bl9zcGxpdD4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIHJvcGVfb3V0LHJvcGUsIHN0YXJ0X3BvcyxzZXFfbGVuLGJhdGNoX3NpemUsc3RyaWRlX2JzLHN0cmlkZV9zZXEpOwp9Cgp2b2lkIGNvbXB1dGVfcm9wZXNfd3JhcHBlcigKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9wdHIsCiAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYga19yb3BlX3N0cmlkZSwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IHFfcm9wZV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IG5faGVhZHMsCiAgaW50IHNlcV9sZW4pewoKICBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa19yb3BlX3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3JvcGVfcHRyKTsKCiAgaW50IHN0cmlkZV9ic19rID0ga19yb3BlX3N0cmlkZVswXTsKICBpbnQgc3RyaWRlX3NlcV9rID0ga19yb3BlX3N0cmlkZVsxXTsKICAKICBpbnQgc3RyaWRlX2JzX3EgPSA2NDsKICBpbnQgc3RyaWRlX3NlcV9xID0gNjQ7CgogIGNvbXB1dGVfcm9wZShkX2tfcm9wZV9vdXQsZF9rX3JvcGUsIDAsIHNlcV9sZW4sIGJhdGNoX3NpemUsc3RyaWRlX2JzX2ssc3RyaWRlX3NlcV9rKTsKICBjb21wdXRlX3JvcGUoZF9xX3JvcGVfb3V0LGRfcV9yb3BlLCBzZXFfbGVuLTEsIDEsIGJhdGNoX3NpemUqbl9oZWFkcyxzdHJpZGVfYnNfcSxzdHJpZGVfc2VxX3EpOwogIAp9CgpfX2dsb2JhbF9fIHZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpIHsKICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICBpbnQgdGlkID0gYmxvY2tJZHgueCpibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgaW50IGJzID0gdGlkL2RpbV9rdjsKICBpbnQgY29sID0gdGlkICUgZGltX2t2OwogIGludCBkc3Rfcm93ID0gYnMqODE5MiArIHNlcV9pZDsKICBpbnQgZHN0SW5kZXggPSBkc3Rfcm93KmRpbV9rditjb2w7CiAgaWYgKGJzPGJhdGNoX3NpemUgJiYgZHN0X3JvdzxiYXRjaF9zaXplKjgxOTIpewogICAga3ZfY2FjaGVbZHN0SW5kZXhdID0ga3ZbYnMqZGltX2t2K2NvbF07CiAgfQp9Cgp2b2lkIHN0b3JlX3RvX2t2X2NhY2hlKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpICB7CiAgICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZChkaXZVcChiYXRjaF9zaXplKmRpbV9rdiwgdGhyZWFkc1BlckJsb2NrLngpKTsKICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBrdl9jYWNoZSxrdiwgYmF0Y2hfc2l6ZSwgc2VxX2lkKTsKfQoKCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfd3JhcHBlcigKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgdWludHB0cl90IGt2X2NhY2hlX3B0ciwKCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHNlcV9pZCl7CgogIGNvbnN0IGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGt2X2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2NhY2hlID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oa3ZfY2FjaGVfcHRyKTsKCiAgc3RvcmVfdG9fa3ZfY2FjaGUoZF9rdl9jYWNoZSwgZF9rdl9sb3JhLCBiYXRjaF9zaXplLCBzZXFfaWQpOwogIAp9CgpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7Cgp2b2lkIGluaXQoKXsKICAgIGlmICghaGFzSW5pdCl7CiAgICAgICAgcm9jYmxhc19jcmVhdGVfaGFuZGxlKCZoYW5kbGUpOyAgICAgICAgCiAgICAgICAgaGFzSW5pdCA9IHRydWU7CiAgICB9Cn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY20oY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgc3RyaWRlQSwgZmxvYXQgYWxwaGEgPSAxLjBmKXsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgcm9jYmxhc19nZW1tX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIEssCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIHN0cmlkZUEsCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGRvd25fcHJvaigKICB1aW50cHRyX3QgeF9wdHIsCiAgdWludHB0cl90IHFfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3QgcV9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IGRpbV9xX2Rvd24sCiAgaW50IGRpbV9rdl9kb3duLAogIGludCBkaW1fZW1iZWQpewoKICBjb25zdCBiZjE2ICpkX2lucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oeF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfcV9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3Byb2pfZG93bl9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa3ZfcHJval9kb3duID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfcHJval9kb3duX3B0cik7CiAgCiAgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9sb3JhX3B0cik7CgogICBtYXRtdWxfYmxhc19ybV9jbShkX2lucHV0LCBkX3FfcHJval9kb3duLCBkX3FfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX3FfZG93biwgZGltX2VtYmVkLGRpbV9lbWJlZCk7CiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfa3ZfcHJval9kb3duLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIGRpbV9rdl9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAKfQoKCnZvaWQgbWF0bXVsX2JsYXNfY21fcm1fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgbl9iYXRjaGVzLCBpbnQgc3RyaWRlTUssIGludCBzdHJpZGVLTil7CiAgY29uc3QgZmxvYXQgYWxwaGEgPSAxLjBmOwogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICByb2NibGFzX2dlbW1fc3RyaWRlZF9iYXRjaGVkX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX3RyYW5zcG9zZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sc3RyaWRlS04sCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE0sc3RyaWRlTUssCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgbl9iYXRjaGVzLAogICAgcm9jYmxhc19kYXRhdHlwZV9mMzJfciwKICAgIHJvY2JsYXNfZ2VtbV9hbGdvX3N0YW5kYXJkLAogICAgMCwgMAogICk7Cn0KCnZvaWQgbWVyZ2VkX21hdG11bCgKICB1aW50cHRyX3QgUV9wcm9qX3VwX3B0ciwKICB1aW50cHRyX3QgS1ZfcHJval91cF9wdHIsCiAgdWludHB0cl90IG1lcmdlZF9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHFfbG9yYV9kaW0sCiAgaW50IGt2X2xvcmFfZGltKXsKICAKICBjb25zdCBiZjE2ICpkX1dxX1VwX25vcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihRX3Byb2pfdXBfcHRyKTsKICBjb25zdCBiZjE2ICpkX1drX3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oS1ZfcHJval91cF9wdHIpOwogIGJmMTYgKmRfbWVyZ2VkID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4obWVyZ2VkX3B0cik7CiAgCiAgY29uc3QgaW50IG5iX2hlYWRzID0gMTI4OwogIGNvbnN0IGludCBNID0gcV9sb3JhX2RpbTsKICBjb25zdCBpbnQgTiA9IGt2X2xvcmFfZGltOwogIGNvbnN0IGludCBLID0gMTI4OwogIGNvbnN0IGludCBzdHJpZGVNSyA9IDE5MipxX2xvcmFfZGltOy8vMTI4KzY0CiAgY29uc3QgaW50IHN0cmlkZUtOID0gMjU2Kmt2X2xvcmFfZGltOyAvLzEyOCsxMjgKICAgIAogIG1hdG11bF9ibGFzX2NtX3JtX2JhdGNoZWRfc3RyaWRlKGRfV3FfVXBfbm9wZSwgZF9Xa191cCwgZF9tZXJnZWQsIE0sICBOLCAgSywgYmF0Y2hfc2l6ZSxzdHJpZGVNSywgc3RyaWRlS04pOwogIAp9Cgp2b2lkIG1hdG11bF9ibGFzX3JtX2NtX2JhdGNoZWRfc3RyaWRlKGNvbnN0IGJmMTYqZEEsIGNvbnN0IGJmMTYgKmRCLCBjb25zdCBiZjE2ICpkQywgYmYxNiAqZEQsIGludCBNLCBpbnQgTiwgaW50IEssIGludCBuX2JhdGNoZXMsIGludCBzdHJpZGVNSywgaW50IHN0cmlkZUtOLCBmbG9hdCBhbHBoYSwgZmxvYXQgYmV0YSl7CgogIHJvY2JsYXNfZ2VtbV9zdHJpZGVkX2JhdGNoZWRfZXgoCiAgICBoYW5kbGUsCiAgICByb2NibGFzX29wZXJhdGlvbl90cmFuc3Bvc2UsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVLTiwKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVNSywKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIGRELCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBuX2JhdGNoZXMsCiAgICByb2NibGFzX2RhdGF0eXBlX2YzMl9yLAogICAgcm9jYmxhc19nZW1tX2FsZ29fc3RhbmRhcmQsCiAgICAwLCAwCiAgKTsKfQoKdm9pZCBjb21iaW5lX3JvcGUoCiAgdWludHB0cl90IFNjb3JlTm9Sb3BlX3B0ciwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9vdXRfcHRyLAogIHVpbnRwdHJfdCBTY29yZU91dF9wdHIsCiAgaW50IE0sCiAgaW50IE4sCiAgaW50IEssCiAgZmxvYXQgc2NhbGUpewogIAogIGNvbnN0IGJmMTYgKmRfcV9yb3BlX291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfcm9wZV9vdXRfcHRyKTsKICBjb25zdCBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgY29uc3QgYmYxNiAqZF9TY29yZU5vUm9wZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KFNjb3JlTm9Sb3BlX3B0cik7CiAgYmYxNiAqICBkX1Njb3JlT3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oU2NvcmVPdXRfcHRyKTsKICAKICBjb25zdCBpbnQgbmJfaGVhZHMgPSAxMjg7CiAgaW50IHN0cmlkZU1LID0gSypNOwogIGludCBzdHJpZGVLTiA9IEsqTjsKCiAgbWF0bXVsX2JsYXNfcm1fY21fYmF0Y2hlZF9zdHJpZGUoZF9xX3JvcGVfb3V0LCBkX2tfcm9wZV9vdXQsIGRfU2NvcmVOb1JvcGUsIGRfU2NvcmVPdXQsIE0sICBOLCAgSywgbmJfaGVhZHMsc3RyaWRlTUssIHN0cmlkZUtOLHNjYWxlLHNjYWxlKTsKCiAgCn0KCgoKUFlCSU5EMTFfTU9EVUxFKHJvcGUsIG0pIHsKICBtLmRlZigiaW5pdCIsICZpbml0LCAiSW5pdCBjb2RlIik7CiAgbS5kZWYoInJvcGUiLCAmY29tcHV0ZV9yb3Blc193cmFwcGVyLCAiUm9wZSBrZXJuZWwiKTsKICBtLmRlZigic3RvcmVrdiIsICZzdG9yZV90b19rdl9jYWNoZV93cmFwcGVyLCAiS1ZDYWNoZSBrZXJuZWwiKTsKICBtLmRlZigiZG93bl9wcm9qIiwgJmRvd25fcHJvaiwgIkRvd24gUHJvaiBrZXJuZWwiKTsKICBtLmRlZigibWVyZ2VkX21hdG11bCIsICZtZXJnZWRfbWF0bXVsLCAibWVyZ2VkX21hdG11bCBrZXJuZWwiKTsKICBtLmRlZigiY29tYmluZV9yb3BlIiwgJmNvbWJpbmVfcm9wZSwgImNvbWJpbmVfcm9wZSBrZXJuZWwiKTsKICAKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9InJvcGUiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMTciXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKCmNsYXNzIEtWQ2FjaGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jYWNoZV9zaGFwZTogdHVwbGUpIC0+IE5vbmU6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ2RhdGEnLCB0b3JjaC56ZXJvcyhrdl9jYWNoZV9zaGFwZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpKQogICAgICAgIHNlbGYuc2VxX2xlbiA9IDAKICAgICAgICBzZWxmLnplcm8oKQoKICAgIGRlZiB6ZXJvKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYXRhLnplcm9fKCkKICAgIAogICAgZGVmIGdldF9kYXRhKHNlbGYpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIGZvcndhcmQoc2VsZiwgY19rdjogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgYXNzZXJ0IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSA8PSBzZWxmLmRhdGEuc2l6ZSgxKSwgIktWIENhY2hlIEV4Y2VlZGVkIgoKICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEudG8oY19rdi5kdHlwZSkKICAgICAgICBzZWxmLmRhdGFbCiAgICAgICAgICAgIDosIHNlbGYuc2VxX2xlbiA6IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSwgOgogICAgICAgIF0gPSBjX2t2CiAgICAgICAgc2VsZi5zZXFfbGVuICs9IGNfa3Yuc2l6ZSgxKQoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhWzosIDpzZWxmLnNlcV9sZW5dLCBzZWxmLnNlcV9sZW4KICAgIApAZGF0YWNsYXNzCmNsYXNzIENvbmZpZzoKICAgIGJhdGNoX3NpemU6IGludAogICAgZGltOiBpbnQKICAgIG5faGVhZHM6IGludAogICAgcV9sb3JhX3Jhbms6IGludCAKICAgIGt2X2xvcmFfcmFuazogaW50CiAgICBxa19ub3BlX2hlYWRfZGltOiBpbnQKICAgIHFrX3JvcGVfaGVhZF9kaW06IGludAogICAgdl9oZWFkX2RpbTogaW50CiAgICBzZXFfbGVuOiBpbnQKICAgIG1heF9zZXFfbGVuOiBpbnQKICAgIGt2X2NhY2hlX3NoYXBlOiB0dXBsZQogICAgUV9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIFFfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICB3b193ZWlnaHQ6IHRvcmNoLlRlbnNvcgoKICAgICAKY2xhc3MgTUxBKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBDb25maWcpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZGltID0gY29uZmlnLmRpbQogICAgICAgIHNlbGYubl9oZWFkcyA9IGNvbmZpZy5uX2hlYWRzCiAgICAgICAgc2VsZi5xX2xvcmFfcmFuayA9IGNvbmZpZy5xX2xvcmFfcmFuawogICAgICAgIHNlbGYua3ZfbG9yYV9yYW5rID0gY29uZmlnLmt2X2xvcmFfcmFuawogICAgICAgIHNlbGYubm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19ub3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi5yb3BlX2hlYWRfZGltID0gY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnZfaGVhZF9kaW0gPSBjb25maWcudl9oZWFkX2RpbQogICAgICAgICMgRG93bi1wcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBVcC1wcm9qZWN0aW9uIGFuZCByb3BlIHByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLnFfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYua3ZfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAgc2VsZi5xX2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5xX2xvcmFfcmFuayxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLmt2X2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5rdl9sb3JhX3JhbmsrNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCgogICAgICAgICMgT3V0cHV0IHByb2plY3Rpb24KICAgICAgICBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV19tZXJnZWQgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgc2VsZi5xX2xvcmFfcmFuaywgc2VsZi5rdl9sb3JhX3JhbmssZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgICAgICAgaGlwX21vZHVsZS5pbml0KCkKICAgICAgICAKICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIGt2X2NhY2hlOiBLVkNhY2hlKSAtPiB0b3JjaC5UZW5zb3I6CgogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIG1vZGVsX2RpbSA9IHguc2l6ZSgpCgogICAgICAgIGhpcF9tb2R1bGUuZG93bl9wcm9qKAogICAgICAgICAgICAgICAgeC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5RX3Byb2pfZG93bi53ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYucV9sb3JhLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLktWX3Byb2pfZG93bi53ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYua3ZfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgICAgIHNlbGYucV9sb3JhX3JhbmssCiAgICAgICAgICAgICAgICBzZWxmLmt2X2xvcmFfcmFuays2NCwKICAgICAgICAgICAgICAgIHguc2hhcGVbMl0pCiAgICAgICAgICAgICAgIAogICAgICAgIGhpcF9tb2R1bGUubWVyZ2VkX21hdG11bCgKICAgICAgICAgIHNlbGYuUV9wcm9qX3VwLndlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5LVl9wcm9qX3VwLndlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5XX21lcmdlZC5kYXRhX3B0cigpLAogICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgIHNlbGYucV9sb3JhX3JhbmssCiAgICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayk7CiAgCiAgICAgICAgaGlwX21vZHVsZS5zdG9yZWt2KAogICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAga3ZfY2FjaGUuZ2V0X2RhdGEoKS5kYXRhX3B0cigpLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBrdl9jYWNoZS5zZXFfbGVuKQogICAgICAgIAogICAgICAgIAogICAgICAgIGt2X2NhY2hlLnNlcV9sZW4rPTEKICAgICAgICBrdl9sZW4gPSBrdl9jYWNoZS5zZXFfbGVuCiAgICAgICAgCiAgICAgICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMQogICAgICAgIGt2X2xvcmEgPSBrdl9jYWNoZS5nZXRfZGF0YSgpWzosIDprdl9sZW4sIDpdCiAgICAgICAgcV9kb3duID0gc2VsZi5xX2xvcmEudW5zcXVlZXplKDEpICMgKDEyOCwxLDE1MzYpIC0+ICgxMjgsMSwxLDE1MzYpCiAgICAgICAgU2NvcmVOb1JvcGUxID0gdG9yY2gubWF0bXVsKHFfZG93bi5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksc2VsZi5XX21lcmdlZCkjMgogICAgICAgIFNjb3JlTm9Sb3BlMSA9IFNjb3JlTm9Sb3BlMS5wZXJtdXRlKDEsMCwyKQogICAgICAgIGt2RG93bl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgICAgICAgICAgICAgIAogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2RG93bl9ub3BlLnBlcm11dGUoMCwyLDEpCiAgICAgICAga3ZfZG93bl9wZXJtdXRlID0ga3ZfZG93bl9wZXJtdXRlLnVuc3F1ZWV6ZSgxKSAjKDEyOCw1MTIsc2VxKSAtPiAoMTI4LDEsNTEyLHNlcSkKICAgICAgICAKICAgICAgICBTY29yZU5vUm9wZV90PVNjb3JlTm9Sb3BlMS52aWV3KGJhdGNoX3NpemUsc2VsZi5uX2hlYWRzLDUxMikgI1ticyxuX2hlYWQsNTEyXSkKICAgICAgICBTY29yZU5vUm9wZSA9IHRvcmNoLm1hdG11bChTY29yZU5vUm9wZV90LGt2X2Rvd25fcGVybXV0ZS5zcXVlZXplKDEpKSMzCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgV3FOb3BlUm9wZSA9IHNlbGYuUV9wcm9qX3VwLndlaWdodC50KCkudmlldyhzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcyxzZWxmLm5vcGVfaGVhZF9kaW0rc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIF8sIFdxX1VwX3JvcGUgPSB0b3JjaC5zcGxpdChXcU5vcGVSb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgIFdrdl91cCA9IHNlbGYuS1ZfcHJval91cC53ZWlnaHQudCgpLnZpZXcoc2VsZi5rdl9sb3JhX3Jhbmssc2VsZi5uX2hlYWRzLHNlbGYubm9wZV9oZWFkX2RpbStzZWxmLnZfaGVhZF9kaW0pCiAgICAgICAgXywgV3ZfdXAgPSB0b3JjaC5zcGxpdChXa3ZfdXAsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYudl9oZWFkX2RpbV0sIGRpbT0tMSkKICAgICAgICAKICAgICAgICBXdl91cCA9IFd2X3VwLnBlcm11dGUoMSwgMCwgMikgICMgc2hhcGU6IChuX2hlYWQsIGRpbSwgaGVhZCkgICAgICAgIAogICAgICAgIFdxX1VwX3JvcGUgPSBXcV9VcF9yb3BlLnJlc2hhcGUoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMqc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIFFSb3BlID0gdG9yY2gubWF0bXVsKHNlbGYucV9sb3JhLFdxX1VwX3JvcGUpIzEKICAgICAgICBRUm9wZSA9IFFSb3BlLnZpZXcoMTI4LCAxLCAxMjgsIDY0KQogICAgICAgIHFfcm9wZSA9IFFSb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogCiAgICAgICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIGt2X2xlbiwgNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgcV9yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywxLCA2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLnJvcGUoa19yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBrX3JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAga19yb3BlLnN0cmlkZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHFfcm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5faGVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGt2X2xlbikKICAgICAgICAKICAgICAgICBrX3JvcGVfb3V0ID0ga19yb3BlX291dC51bnNxdWVlemUoMSkKCiAgICAgICAgU2NvcmVPdXQgPSB0b3JjaC5lbXB0eShiYXRjaF9zaXplLCAxMjgsIGt2X2xlbixkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLmNvbWJpbmVfcm9wZSgKICAgICAgICAgIFNjb3JlTm9Sb3BlLmRhdGFfcHRyKCksCiAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBrX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBTY29yZU91dC5kYXRhX3B0cigpLAogICAgICAgICAgU2NvcmVPdXQuc2hhcGVbMV0sCiAgICAgICAgICBrdl9sZW4sCiAgICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0sCiAgICAgICAgICAxLjAgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKSkKICAgICAgICAKICAgICAgICBBdHRuT3V0U01heCA9IEYuc29mdG1heChTY29yZU91dCwgZGltPS0xKSMudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAga3ZfZG93biA9IGt2RG93bl9ub3BlLnVuc3F1ZWV6ZSgxKQogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoQXR0bk91dFNNYXguc3F1ZWV6ZSgyKSxrdl9kb3duLnNxdWVlemUoMSkpCiAgICAgICAgeTBfYz15MF9jLnVuc3F1ZWV6ZSgyKQogICAgICAgIAogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoeTBfYy5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV3ZfdXApCiAgICAgICAgeTBfYyA9IHkwX2MucGVybXV0ZSgxLDAsMikKICAgICAgICB5MF9jID0gc2VsZi53byh5MF9jLmZsYXR0ZW4oc3RhcnRfZGltPTEpKQogICAgICAgIAogICAgICAgIHJldHVybiB5MF9jLnZpZXcoYmF0Y2hfc2l6ZSwxLHNlbGYuZGltKSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKbW9kZWwgPSBOb25lCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgICAgICBnbG9iYWwgbW9kZWwKICAgICAgICBpZiBtb2RlbCA9PSBOb25lOgogICAgICAgICAgICBtb2RlbCA9IE1MQShjb25maWcpLnRvKCdjdWRhOjAnKQogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuUV9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX3VwX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval9kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuS1ZfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLndvX3dlaWdodCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnNpemUoKSwgY29uZmlnLlFfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX3VwX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLlFfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuUV9wcm9qX3VwX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0LnNldF8oY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc3RyaWRlKCkpIAogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQuc2V0Xyhjb25maWcud29fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcud29fd2VpZ2h0LnNpemUoKSwgY29uZmlnLndvX3dlaWdodC5zdHJpZGUoKSkgCgogICAgICAgIG91dHB1dCwga3ZfY2FjaGUgPSBtb2RlbCh4LCBrdl9jYWNoZSkKICAgICAgICByZXR1cm4gb3V0cHV0LCBrdl9jYWNoZQ==

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 29860.

- aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKCgppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKa2VybmVsX2NwcCA9IHIiIiIKI3VuZGVmIF9fSElQX05PX0hBTEZfT1BFUkFUT1JTX18KI3VuZGVmIF9fSElQX05PX0hBTEZfQ09OVkVSU0lPTlNfXwojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmbG9hdDE2Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8cHliaW5kMTEvc3RsLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHVuaXN0ZC5oPiAgCiNpbmNsdWRlIDxyb2NibGFzL3JvY2JsYXMuaD4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgojZGVmaW5lIFdBUlBfU0laRSA2NAp1c2luZyBiZjE2ID0gaGlwX2JmbG9hdDE2OwoKaW50IGRpdlVwKGludCB4LGludCBuKXsKcmV0dXJuICh4ICsgbi0xKS9uOwp9Cgp0ZW1wbGF0ZTxpbnQgbl9zcGxpdD4KX19nbG9iYWxfXyB2b2lkIHJvcGVfa2VybmVsKGJmMTYqIHJvcGVfb3V0LCBjb25zdCBiZjE2KiByb3BlLCBpbnQgc3RhcnRfcG9zLCBpbnQgc2VxX2xlbiwgaW50IGJhdGNoX3NpemUsIGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkX21vZGVsID0gNjQ7Ly9NdXN0IGJlIGVxdWFsIHRvIFdBUlBfU0laRQogIGNvbnN0ZXhwciBpbnQgZF9tb2RlbF8yID0gZF9tb2RlbC8yOwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKCiAgaW50IHBvcyA9IHRpZCAlIGRfbW9kZWw7CiAgaW50IHNlcSA9ICh0aWQgLyBkX21vZGVsKSAlIHNlcV9sZW47CiAgaW50IGJzID0gdGlkIC8gZF9tb2RlbCAvIHNlcV9sZW47CiAgCiAgaWYgKGJzIDwgYmF0Y2hfc2l6ZSl7CiAgICBhdXRvIHBvc18yID0gYmYxNih0aWQgJSBkX21vZGVsXzIpOwogICAgYXV0byB0aGV0YSA9IGJmMTYocG93ZihiZjE2KDEwMDAwLjBmKSxiZjE2KC1wb3NfMikvYmYxNihkX21vZGVsXzIpKSk7CiAgICBhdXRvIGlkeF90aGV0YTIgPSBiZjE2KHN0YXJ0X3BvcytzZXEpKnRoZXRhOwogICAgYXV0byBjID0gYmYxNihjb3NmKGlkeF90aGV0YTIpKTsKICAgIGF1dG8gcyA9IGJmMTYoc2luZihpZHhfdGhldGEyKSk7CgogICAgYmYxNiB4X3Jbbl9zcGxpdF07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgc3BsaXQ9MDtzcGxpdDxuX3NwbGl0O3NwbGl0KyspewogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqc3RyaWRlX2JzKwogICAgICAgICAgICAgICAgICBzZXEqc3RyaWRlX3NlcSsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgeF9yW3NwbGl0XSA9IHJvcGVbaW5kZXhdOwogICAgfQoKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIC8vVE9ETzphZGQgcGFyYW1ldGVycyBmb3Igb3V0cHV0IHN0cmlkZXMKICAgICAgaW50IGluZGV4ID0gKChiYXRjaF9zaXplL25fc3BsaXQpKnNwbGl0ICsgYnMpKmRfbW9kZWwqc2VxX2xlbisKICAgICAgICAgICAgICAgICAgc2VxKmRfbW9kZWwrCiAgICAgICAgICAgICAgICAgIHBvczsKICAgICAgICAgCiAgICAgIGF1dG8geCA9IHhfcltzcGxpdF07CgogICAgICBpbnQgc3JjX2xhbmUgPSAocG9zICtkX21vZGVsXzIpJSBkX21vZGVsOwogICAgICBhdXRvIHhfcm90ID0gX19zaGZsKHgsIHNyY19sYW5lLCA2NCk7CiAgICAgIHhfcm90ID0gKHBvcyA8IGRfbW9kZWxfMikgPyAteF9yb3QgOiB4X3JvdDsKCiAgICAgIGF1dG8gb3V0ICA9IGJmMTYoeCpjKStiZjE2KHhfcm90KnMpOwogICAgICByb3BlX291dFtpbmRleF0gPSBvdXQ7CgogICAgfQogIH0KfQoKdm9pZCBjb21wdXRlX3JvcGUoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSxpbnQgc3RyaWRlX2JzLCBpbnQgc3RyaWRlX3NlcSkgewogIGNvbnN0ZXhwciBpbnQgZGltX3JvcGUgPSA2NDsKICBjb25zdGV4cHIgaW50IG5fc3BsaXQgPSAzMjsKICBkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CiAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKHNlcV9sZW4qZGltX3JvcGUqYmF0Y2hfc2l6ZS9uX3NwbGl0LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogIGhpcExhdW5jaEtlcm5lbEdHTCgocm9wZV9rZXJuZWw8bl9zcGxpdD4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIHJvcGVfb3V0LHJvcGUsIHN0YXJ0X3BvcyxzZXFfbGVuLGJhdGNoX3NpemUsc3RyaWRlX2JzLHN0cmlkZV9zZXEpOwp9Cgp2b2lkIGNvbXB1dGVfcm9wZXNfd3JhcHBlcigKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9wdHIsCiAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYga19yb3BlX3N0cmlkZSwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IHFfcm9wZV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IG5faGVhZHMsCiAgaW50IHNlcV9sZW4pewoKICBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa19yb3BlX3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3JvcGVfcHRyKTsKCiAgaW50IHN0cmlkZV9ic19rID0ga19yb3BlX3N0cmlkZVswXTsKICBpbnQgc3RyaWRlX3NlcV9rID0ga19yb3BlX3N0cmlkZVsxXTsKICAKICBpbnQgc3RyaWRlX2JzX3EgPSA2NDsKICBpbnQgc3RyaWRlX3NlcV9xID0gNjQ7CgogIGNvbXB1dGVfcm9wZShkX2tfcm9wZV9vdXQsZF9rX3JvcGUsIDAsIHNlcV9sZW4sIGJhdGNoX3NpemUsc3RyaWRlX2JzX2ssc3RyaWRlX3NlcV9rKTsKICBjb21wdXRlX3JvcGUoZF9xX3JvcGVfb3V0LGRfcV9yb3BlLCBzZXFfbGVuLTEsIDEsIGJhdGNoX3NpemUqbl9oZWFkcyxzdHJpZGVfYnNfcSxzdHJpZGVfc2VxX3EpOwogIAp9CgpfX2dsb2JhbF9fIHZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpIHsKICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICBpbnQgdGlkID0gYmxvY2tJZHgueCpibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgaW50IGJzID0gdGlkL2RpbV9rdjsKICBpbnQgY29sID0gdGlkICUgZGltX2t2OwogIGludCBkc3Rfcm93ID0gYnMqODE5MiArIHNlcV9pZDsKICBpbnQgZHN0SW5kZXggPSBkc3Rfcm93KmRpbV9rditjb2w7CiAgaWYgKGJzPGJhdGNoX3NpemUgJiYgZHN0X3JvdzxiYXRjaF9zaXplKjgxOTIpewogICAga3ZfY2FjaGVbZHN0SW5kZXhdID0ga3ZbYnMqZGltX2t2K2NvbF07CiAgfQp9Cgp2b2lkIHN0b3JlX3RvX2t2X2NhY2hlKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpICB7CiAgICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZChkaXZVcChiYXRjaF9zaXplKmRpbV9rdiwgdGhyZWFkc1BlckJsb2NrLngpKTsKICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBrdl9jYWNoZSxrdiwgYmF0Y2hfc2l6ZSwgc2VxX2lkKTsKfQoKCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfd3JhcHBlcigKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgdWludHB0cl90IGt2X2NhY2hlX3B0ciwKCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHNlcV9pZCl7CgogIGNvbnN0IGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGt2X2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2NhY2hlID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oa3ZfY2FjaGVfcHRyKTsKCiAgc3RvcmVfdG9fa3ZfY2FjaGUoZF9rdl9jYWNoZSwgZF9rdl9sb3JhLCBiYXRjaF9zaXplLCBzZXFfaWQpOwogIAp9CgpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7Cgp2b2lkIGluaXQoKXsKICAgIGlmICghaGFzSW5pdCl7CiAgICAgICAgcm9jYmxhc19jcmVhdGVfaGFuZGxlKCZoYW5kbGUpOyAgICAgICAgCiAgICAgICAgaGFzSW5pdCA9IHRydWU7CiAgICB9Cn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY20oY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgc3RyaWRlQSwgZmxvYXQgYWxwaGEgPSAxLjBmKXsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgcm9jYmxhc19nZW1tX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIEssCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIHN0cmlkZUEsCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGRvd25fcHJvaigKICB1aW50cHRyX3QgeF9wdHIsCiAgdWludHB0cl90IHFfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3QgcV9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IGRpbV9xX2Rvd24sCiAgaW50IGRpbV9rdl9kb3duLAogIGludCBkaW1fZW1iZWQpewoKICBjb25zdCBiZjE2ICpkX2lucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oeF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfcV9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3Byb2pfZG93bl9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa3ZfcHJval9kb3duID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfcHJval9kb3duX3B0cik7CiAgCiAgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9sb3JhX3B0cik7CgogICBtYXRtdWxfYmxhc19ybV9jbShkX2lucHV0LCBkX3FfcHJval9kb3duLCBkX3FfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX3FfZG93biwgZGltX2VtYmVkLGRpbV9lbWJlZCk7CiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfa3ZfcHJval9kb3duLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIGRpbV9rdl9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAKfQoKCgoKUFlCSU5EMTFfTU9EVUxFKHJvcGUsIG0pIHsKICBtLmRlZigiaW5pdCIsICZpbml0LCAiSW5pdCBjb2RlIik7CiAgbS5kZWYoInJvcGUiLCAmY29tcHV0ZV9yb3Blc193cmFwcGVyLCAiUm9wZSBrZXJuZWwiKTsKICBtLmRlZigic3RvcmVrdiIsICZzdG9yZV90b19rdl9jYWNoZV93cmFwcGVyLCAiS1ZDYWNoZSBrZXJuZWwiKTsKICBtLmRlZigiZG93bl9wcm9qIiwgJmRvd25fcHJvaiwgIkRvd24gUHJvaiBrZXJuZWwiKTsKICAKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9InJvcGUiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMTciXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKCmNsYXNzIEtWQ2FjaGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jYWNoZV9zaGFwZTogdHVwbGUpIC0+IE5vbmU6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ2RhdGEnLCB0b3JjaC56ZXJvcyhrdl9jYWNoZV9zaGFwZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpKQogICAgICAgIHNlbGYuc2VxX2xlbiA9IDAKICAgICAgICBzZWxmLnplcm8oKQoKICAgIGRlZiB6ZXJvKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYXRhLnplcm9fKCkKICAgIAogICAgZGVmIGdldF9kYXRhKHNlbGYpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIGZvcndhcmQoc2VsZiwgY19rdjogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgYXNzZXJ0IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSA8PSBzZWxmLmRhdGEuc2l6ZSgxKSwgIktWIENhY2hlIEV4Y2VlZGVkIgoKICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEudG8oY19rdi5kdHlwZSkKICAgICAgICBzZWxmLmRhdGFbCiAgICAgICAgICAgIDosIHNlbGYuc2VxX2xlbiA6IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSwgOgogICAgICAgIF0gPSBjX2t2CiAgICAgICAgc2VsZi5zZXFfbGVuICs9IGNfa3Yuc2l6ZSgxKQoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhWzosIDpzZWxmLnNlcV9sZW5dLCBzZWxmLnNlcV9sZW4KICAgIApAZGF0YWNsYXNzCmNsYXNzIENvbmZpZzoKICAgIGJhdGNoX3NpemU6IGludAogICAgZGltOiBpbnQKICAgIG5faGVhZHM6IGludAogICAgcV9sb3JhX3Jhbms6IGludCAKICAgIGt2X2xvcmFfcmFuazogaW50CiAgICBxa19ub3BlX2hlYWRfZGltOiBpbnQKICAgIHFrX3JvcGVfaGVhZF9kaW06IGludAogICAgdl9oZWFkX2RpbTogaW50CiAgICBzZXFfbGVuOiBpbnQKICAgIG1heF9zZXFfbGVuOiBpbnQKICAgIGt2X2NhY2hlX3NoYXBlOiB0dXBsZQogICAgUV9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIFFfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICB3b193ZWlnaHQ6IHRvcmNoLlRlbnNvcgoKICAgICAKY2xhc3MgTUxBKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBDb25maWcpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZGltID0gY29uZmlnLmRpbQogICAgICAgIHNlbGYubl9oZWFkcyA9IGNvbmZpZy5uX2hlYWRzCiAgICAgICAgc2VsZi5xX2xvcmFfcmFuayA9IGNvbmZpZy5xX2xvcmFfcmFuawogICAgICAgIHNlbGYua3ZfbG9yYV9yYW5rID0gY29uZmlnLmt2X2xvcmFfcmFuawogICAgICAgIHNlbGYubm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19ub3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi5yb3BlX2hlYWRfZGltID0gY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnZfaGVhZF9kaW0gPSBjb25maWcudl9oZWFkX2RpbQogICAgICAgICMgRG93bi1wcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBVcC1wcm9qZWN0aW9uIGFuZCByb3BlIHByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLnFfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYua3ZfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAgc2VsZi5xX2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5xX2xvcmFfcmFuayxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLmt2X2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5rdl9sb3JhX3JhbmsrNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCgogICAgICAgICMgT3V0cHV0IHByb2plY3Rpb24KICAgICAgICBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAgICAgIGhpcF9tb2R1bGUuaW5pdCgpCiAgICAgICAgCiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgoKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICBoaXBfbW9kdWxlLmRvd25fcHJvaigKICAgICAgICAgICAgICAgIHguZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYuUV9wcm9qX2Rvd24ud2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24ud2VpZ2h0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgICAgICBzZWxmLnFfbG9yYV9yYW5rLAogICAgICAgICAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsrNjQsCiAgICAgICAgICAgICAgICB4LnNoYXBlWzJdKQogICAgICAgIAogICAgICAgIGhpcF9tb2R1bGUuc3RvcmVrdigKICAgICAgICAgICAgICAgIHNlbGYua3ZfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAga3ZfY2FjaGUuZ2V0X2RhdGEoKS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgICAgIGt2X2NhY2hlLnNlcV9sZW4pCiAgICAgICAgCiAgICAgICAga3ZfY2FjaGUuc2VxX2xlbis9MQogICAgICAgIGt2X2xlbiA9IGt2X2NhY2hlLnNlcV9sZW4KICAgICAgICAKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCiAgICAgICAga3ZfbG9yYSA9IGt2X2NhY2hlLmdldF9kYXRhKClbOiwgOmt2X2xlbiwgOl0KICAgICAgICAKICAgICAgICBrdkRvd25fbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgIFdrdl91cCA9IHNlbGYuS1ZfcHJval91cC53ZWlnaHQudCgpLnZpZXcoc2VsZi5rdl9sb3JhX3Jhbmssc2VsZi5uX2hlYWRzLHNlbGYubm9wZV9oZWFkX2RpbStzZWxmLnZfaGVhZF9kaW0pCiAgICAgICAgV2tfdXAsIFd2X3VwID0gdG9yY2guc3BsaXQoV2t2X3VwLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnZfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAgV2tfdXAgPSBXa191cC5wZXJtdXRlKDEsIDIsIDApICMgKG5faGVhZCwgZGltLCBoZWFkKSwgdGhlbiAobl9oZWFkLCBoZWFkLGRpbSkgZm9yIG1hdG11bAogICAgICAgIFd2X3VwID0gV3ZfdXAucGVybXV0ZSgxLCAwLCAyKSAgIyBzaGFwZTogKG5faGVhZCwgZGltLCBoZWFkKSAgICAgICAgCiAgICAgICAgCiAgICAgICAgV3FOb3BlUm9wZSA9IHNlbGYuUV9wcm9qX3VwLndlaWdodC50KCkudmlldyhzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcyxzZWxmLm5vcGVfaGVhZF9kaW0rc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIFdxX1VwX25vcGUsIFdxX1VwX3JvcGUgPSB0b3JjaC5zcGxpdChXcU5vcGVSb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAgCiAgICAgICAgV3FfVXBfbm9wZSA9IFdxX1VwX25vcGUucGVybXV0ZSgxLCAwLCAyKSAKICAgICAgICBXX21lcmdlZCA9IHRvcmNoLm1hdG11bChXcV9VcF9ub3BlLFdrX3VwKSAKICAgCiAgICAgICAgV3FfVXBfcm9wZSA9IFdxX1VwX3JvcGUucmVzaGFwZShzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcypzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgUVJvcGUgPSB0b3JjaC5tYXRtdWwoc2VsZi5xX2xvcmEsV3FfVXBfcm9wZSkKICAgICAgICAKICAgICAgICBrdl9kb3duX3Blcm11dGUgPSBrdkRvd25fbm9wZS5wZXJtdXRlKDAsMiwxKQogICAgICAgIAogICAgICAgIHFfZG93biA9IHNlbGYucV9sb3JhLnVuc3F1ZWV6ZSgxKSAjICgxMjgsMSwxNTM2KSAtPiAoMTI4LDEsMSwxNTM2KQogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2X2Rvd25fcGVybXV0ZS51bnNxdWVlemUoMSkgIygxMjgsNTEyLHNlcSkgLT4gKDEyOCwxLDUxMixzZXEpCiAgICAgICAgCiAgICAgICAgU2NvcmVOb1JvcGUxID0gdG9yY2gubWF0bXVsKHFfZG93bi5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV19tZXJnZWQpCiAgICAgICAgU2NvcmVOb1JvcGUxID0gU2NvcmVOb1JvcGUxLnBlcm11dGUoMSwwLDIpCiAgICAgICAgU2NvcmVOb1JvcGVfdD1TY29yZU5vUm9wZTEudmlldyhiYXRjaF9zaXplLHNlbGYubl9oZWFkcyw1MTIpICNbYnMsbl9oZWFkLDUxMl0pCiAgICAgICAgU2NvcmVOb1JvcGUgPSB0b3JjaC5tYXRtdWwoU2NvcmVOb1JvcGVfdCxrdl9kb3duX3Blcm11dGUuc3F1ZWV6ZSgxKSkKICAgICAgICAKICAgICAgICBRUm9wZSA9IFFSb3BlLnZpZXcoMTI4LCAxLCAxMjgsIDY0KQogICAgICAgIHFfcm9wZSA9IFFSb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogCiAgICAgICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIGt2X2xlbiwgNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgcV9yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywxLCA2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLnJvcGUoa19yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBrX3JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAga19yb3BlLnN0cmlkZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHFfcm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5faGVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGt2X2xlbikKICAgICAgICAKICAgICAgICBrX3JvcGVfb3V0ID0ga19yb3BlX291dC51bnNxdWVlemUoMSkKICAgICAgICAKICAgICAgICBTY29yZU91dCA9IHRvcmNoLmJhZGRibW0oCiAgICAgICAgICAgICAgICAgICAgICAgIFNjb3JlTm9Sb3BlLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LnNxdWVlemUoMiksCiAgICAgICAgICAgICAgICAgICAgICAgIGtfcm9wZV9vdXQucGVybXV0ZSgwLCAxLCAzLCAyKS5zcXVlZXplKDEpLAogICAgICAgICAgICAgICAgICAgICAgICBiZXRhPTEuMCAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pLAogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYT0xLjAgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgQXR0bk91dFNNYXggPSBGLnNvZnRtYXgoU2NvcmVPdXQsIGRpbT0tMSkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAga3ZfZG93biA9IGt2RG93bl9ub3BlLnVuc3F1ZWV6ZSgxKQogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoQXR0bk91dFNNYXguc3F1ZWV6ZSgyKSxrdl9kb3duLnNxdWVlemUoMSkpCiAgICAgICAgeTBfYz15MF9jLnVuc3F1ZWV6ZSgyKQogICAgICAgIAogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoeTBfYy5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV3ZfdXApCiAgICAgICAgeTBfYyA9IHkwX2MucGVybXV0ZSgxLDAsMikKICAgICAgICB5MF9jID0gc2VsZi53byh5MF9jLmZsYXR0ZW4oc3RhcnRfZGltPTEpKQogICAgICAgIAogICAgICAgIHJldHVybiB5MF9jLnZpZXcoYmF0Y2hfc2l6ZSwxLHNlbGYuZGltKSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKbW9kZWwgPSBOb25lCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgICAgICBnbG9iYWwgbW9kZWwKICAgICAgICBpZiBtb2RlbCA9PSBOb25lOgogICAgICAgICAgICBtb2RlbCA9IE1MQShjb25maWcpLnRvKCdjdWRhOjAnKQogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuUV9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX3VwX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval9kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuS1ZfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLndvX3dlaWdodCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnNpemUoKSwgY29uZmlnLlFfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX3VwX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLlFfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuUV9wcm9qX3VwX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0LnNldF8oY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc3RyaWRlKCkpIAogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQuc2V0Xyhjb25maWcud29fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcud29fd2VpZ2h0LnNpemUoKSwgY29uZmlnLndvX3dlaWdodC5zdHJpZGUoKSkgCgogICAgICAgIG91dHB1dCwga3ZfY2FjaGUgPSBtb2RlbCh4LCBrdl9jYWNoZSkKICAgICAgICByZXR1cm4gb3V0cHV0LCBrdl9jYWNoZQ==
No newline at end of file
+ aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHRpbWUKaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHV0aWxzIGltcG9ydCB2ZXJib3NlX2FsbGNsb3NlCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgb3MKaW1wb3J0IHN5cwogICAgIAogICAgIAppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgb3MuZW52aXJvblsiUFlUT1JDSF9ST0NNX0FSQ0giXSA9ICJnZng5NDI6eG5hY2stIgoKa2VybmVsX2NwcCA9IHIiIiIKI3VuZGVmIF9fSElQX05PX0hBTEZfT1BFUkFUT1JTX18KI3VuZGVmIF9fSElQX05PX0hBTEZfQ09OVkVSU0lPTlNfXwojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2JmbG9hdDE2Lmg+CiNpbmNsdWRlIDxweWJpbmQxMS9weWJpbmQxMS5oPgojaW5jbHVkZSA8cHliaW5kMTEvc3RsLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxyYW5kb20+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHVuaXN0ZC5oPiAgCiNpbmNsdWRlIDxyb2NibGFzL3JvY2JsYXMuaD4KCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgojZGVmaW5lIFdBUlBfU0laRSA2NAp1c2luZyBiZjE2ID0gaGlwX2JmbG9hdDE2OwoKaW50IGRpdlVwKGludCB4LGludCBuKXsKcmV0dXJuICh4ICsgbi0xKS9uOwp9Cgp0ZW1wbGF0ZTxpbnQgbl9zcGxpdD4KX19nbG9iYWxfXyB2b2lkIHJvcGVfa2VybmVsKGJmMTYqIHJvcGVfb3V0LCBjb25zdCBiZjE2KiByb3BlLCBpbnQgc3RhcnRfcG9zLCBpbnQgc2VxX2xlbiwgaW50IGJhdGNoX3NpemUsIGludCBzdHJpZGVfYnMsIGludCBzdHJpZGVfc2VxKSB7CiAgY29uc3RleHByIGludCBkX21vZGVsID0gNjQ7Ly9NdXN0IGJlIGVxdWFsIHRvIFdBUlBfU0laRQogIGNvbnN0ZXhwciBpbnQgZF9tb2RlbF8yID0gZF9tb2RlbC8yOwogIGludCB0aWQgPSBibG9ja0lkeC54KmJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKCiAgaW50IHBvcyA9IHRpZCAlIGRfbW9kZWw7CiAgaW50IHNlcSA9ICh0aWQgLyBkX21vZGVsKSAlIHNlcV9sZW47CiAgaW50IGJzID0gdGlkIC8gZF9tb2RlbCAvIHNlcV9sZW47CiAgCiAgaWYgKGJzIDwgYmF0Y2hfc2l6ZSl7CiAgICBhdXRvIHBvc18yID0gYmYxNih0aWQgJSBkX21vZGVsXzIpOwogICAgYXV0byB0aGV0YSA9IGJmMTYocG93ZihiZjE2KDEwMDAwLjBmKSxiZjE2KC1wb3NfMikvYmYxNihkX21vZGVsXzIpKSk7CiAgICBhdXRvIGlkeF90aGV0YTIgPSBiZjE2KHN0YXJ0X3BvcytzZXEpKnRoZXRhOwogICAgYXV0byBjID0gYmYxNihjb3NmKGlkeF90aGV0YTIpKTsKICAgIGF1dG8gcyA9IGJmMTYoc2luZihpZHhfdGhldGEyKSk7CgogICAgYmYxNiB4X3Jbbl9zcGxpdF07CiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgc3BsaXQ9MDtzcGxpdDxuX3NwbGl0O3NwbGl0KyspewogICAgICBpbnQgaW5kZXggPSAoKGJhdGNoX3NpemUvbl9zcGxpdCkqc3BsaXQgKyBicykqc3RyaWRlX2JzKwogICAgICAgICAgICAgICAgICBzZXEqc3RyaWRlX3NlcSsKICAgICAgICAgICAgICAgICAgcG9zOwogICAgICAgeF9yW3NwbGl0XSA9IHJvcGVbaW5kZXhdOwogICAgfQoKICAgICNwcmFnbWEgdW5yb2xsCiAgICBmb3IgKGludCBzcGxpdD0wO3NwbGl0PG5fc3BsaXQ7c3BsaXQrKyl7CiAgICAgIC8vVE9ETzphZGQgcGFyYW1ldGVycyBmb3Igb3V0cHV0IHN0cmlkZXMKICAgICAgaW50IGluZGV4ID0gKChiYXRjaF9zaXplL25fc3BsaXQpKnNwbGl0ICsgYnMpKmRfbW9kZWwqc2VxX2xlbisKICAgICAgICAgICAgICAgICAgc2VxKmRfbW9kZWwrCiAgICAgICAgICAgICAgICAgIHBvczsKICAgICAgICAgCiAgICAgIGF1dG8geCA9IHhfcltzcGxpdF07CgogICAgICBpbnQgc3JjX2xhbmUgPSAocG9zICtkX21vZGVsXzIpJSBkX21vZGVsOwogICAgICBhdXRvIHhfcm90ID0gX19zaGZsKHgsIHNyY19sYW5lLCA2NCk7CiAgICAgIHhfcm90ID0gKHBvcyA8IGRfbW9kZWxfMikgPyAteF9yb3QgOiB4X3JvdDsKCiAgICAgIGF1dG8gb3V0ICA9IGJmMTYoeCpjKStiZjE2KHhfcm90KnMpOwogICAgICByb3BlX291dFtpbmRleF0gPSBvdXQ7CgogICAgfQogIH0KfQoKdm9pZCBjb21wdXRlX3JvcGUoYmYxNiogcm9wZV9vdXQsIGNvbnN0IGJmMTYqIHJvcGUsIGludCBzdGFydF9wb3MsIGludCBzZXFfbGVuLCBpbnQgYmF0Y2hfc2l6ZSxpbnQgc3RyaWRlX2JzLCBpbnQgc3RyaWRlX3NlcSkgewogIGNvbnN0ZXhwciBpbnQgZGltX3JvcGUgPSA2NDsKICBjb25zdGV4cHIgaW50IG5fc3BsaXQgPSAzMjsKICBkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CiAgZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKHNlcV9sZW4qZGltX3JvcGUqYmF0Y2hfc2l6ZS9uX3NwbGl0LCB0aHJlYWRzUGVyQmxvY2sueCkpOwogIGhpcExhdW5jaEtlcm5lbEdHTCgocm9wZV9rZXJuZWw8bl9zcGxpdD4pLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIHJvcGVfb3V0LHJvcGUsIHN0YXJ0X3BvcyxzZXFfbGVuLGJhdGNoX3NpemUsc3RyaWRlX2JzLHN0cmlkZV9zZXEpOwp9Cgp2b2lkIGNvbXB1dGVfcm9wZXNfd3JhcHBlcigKICB1aW50cHRyX3Qga19yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9wdHIsCiAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYga19yb3BlX3N0cmlkZSwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IHFfcm9wZV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IG5faGVhZHMsCiAgaW50IHNlcV9sZW4pewoKICBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgYmYxNiAqZF9xX3JvcGVfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4ocV9yb3BlX291dF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa19yb3BlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa19yb3BlX3B0cik7CiAgY29uc3QgYmYxNiAqZF9xX3JvcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3JvcGVfcHRyKTsKCiAgaW50IHN0cmlkZV9ic19rID0ga19yb3BlX3N0cmlkZVswXTsKICBpbnQgc3RyaWRlX3NlcV9rID0ga19yb3BlX3N0cmlkZVsxXTsKICAKICBpbnQgc3RyaWRlX2JzX3EgPSA2NDsKICBpbnQgc3RyaWRlX3NlcV9xID0gNjQ7CgogIGNvbXB1dGVfcm9wZShkX2tfcm9wZV9vdXQsZF9rX3JvcGUsIDAsIHNlcV9sZW4sIGJhdGNoX3NpemUsc3RyaWRlX2JzX2ssc3RyaWRlX3NlcV9rKTsKICBjb21wdXRlX3JvcGUoZF9xX3JvcGVfb3V0LGRfcV9yb3BlLCBzZXFfbGVuLTEsIDEsIGJhdGNoX3NpemUqbl9oZWFkcyxzdHJpZGVfYnNfcSxzdHJpZGVfc2VxX3EpOwogIAp9CgpfX2dsb2JhbF9fIHZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpIHsKICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICBpbnQgdGlkID0gYmxvY2tJZHgueCpibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgaW50IGJzID0gdGlkL2RpbV9rdjsKICBpbnQgY29sID0gdGlkICUgZGltX2t2OwogIGludCBkc3Rfcm93ID0gYnMqODE5MiArIHNlcV9pZDsKICBpbnQgZHN0SW5kZXggPSBkc3Rfcm93KmRpbV9rditjb2w7CiAgaWYgKGJzPGJhdGNoX3NpemUgJiYgZHN0X3JvdzxiYXRjaF9zaXplKjgxOTIpewogICAga3ZfY2FjaGVbZHN0SW5kZXhdID0ga3ZbYnMqZGltX2t2K2NvbF07CiAgfQp9Cgp2b2lkIHN0b3JlX3RvX2t2X2NhY2hlKGJmMTYqIGt2X2NhY2hlLCBjb25zdCBiZjE2ICprdiwgaW50IGJhdGNoX3NpemUsIGludCBzZXFfaWQpICB7CiAgICBjb25zdGV4cHIgaW50IGRpbV9rdiA9IDU3NjsKICAgIGRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKICAgIGRpbTMgYmxvY2tzUGVyR3JpZChkaXZVcChiYXRjaF9zaXplKmRpbV9rdiwgdGhyZWFkc1BlckJsb2NrLngpKTsKICAgIGhpcExhdW5jaEtlcm5lbEdHTCgoc3RvcmVfdG9fa3ZfY2FjaGVfa2VybmVsKSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBrdl9jYWNoZSxrdiwgYmF0Y2hfc2l6ZSwgc2VxX2lkKTsKfQoKCnZvaWQgc3RvcmVfdG9fa3ZfY2FjaGVfd3JhcHBlcigKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgdWludHB0cl90IGt2X2NhY2hlX3B0ciwKCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHNlcV9pZCl7CgogIGNvbnN0IGJmMTYgKmRfa3ZfbG9yYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KGt2X2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2NhY2hlID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oa3ZfY2FjaGVfcHRyKTsKCiAgc3RvcmVfdG9fa3ZfY2FjaGUoZF9rdl9jYWNoZSwgZF9rdl9sb3JhLCBiYXRjaF9zaXplLCBzZXFfaWQpOwogIAp9CgpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7Cgp2b2lkIGluaXQoKXsKICAgIGlmICghaGFzSW5pdCl7CiAgICAgICAgcm9jYmxhc19jcmVhdGVfaGFuZGxlKCZoYW5kbGUpOyAgICAgICAgCiAgICAgICAgaGFzSW5pdCA9IHRydWU7CiAgICB9Cn0KCnZvaWQgbWF0bXVsX2JsYXNfcm1fY20oY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgc3RyaWRlQSwgZmxvYXQgYWxwaGEgPSAxLjBmKXsKICBjb25zdCBmbG9hdCBiZXRhICA9IDAuMGY7CiAgcm9jYmxhc19nZW1tX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fdHJhbnNwb3NlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIEssCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIHN0cmlkZUEsCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTiwKICAgIHJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCiAgICByb2NibGFzX2dlbW1fYWxnb19zdGFuZGFyZCwKICAgIDAsIDAKICApOwp9Cgp2b2lkIGRvd25fcHJvaigKICB1aW50cHRyX3QgeF9wdHIsCiAgdWludHB0cl90IHFfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3QgcV9sb3JhX3B0ciwKICB1aW50cHRyX3Qga3ZfcHJval9kb3duX3B0ciwKICB1aW50cHRyX3Qga3ZfbG9yYV9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IGRpbV9xX2Rvd24sCiAgaW50IGRpbV9rdl9kb3duLAogIGludCBkaW1fZW1iZWQpewoKICBjb25zdCBiZjE2ICpkX2lucHV0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oeF9wdHIpOwogIGNvbnN0IGJmMTYgKmRfcV9wcm9qX2Rvd24gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihxX3Byb2pfZG93bl9wdHIpOwogIGNvbnN0IGJmMTYgKmRfa3ZfcHJval9kb3duID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oa3ZfcHJval9kb3duX3B0cik7CiAgCiAgYmYxNiAqZF9xX2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihxX2xvcmFfcHRyKTsKICBiZjE2ICpkX2t2X2xvcmEgPSByZWludGVycHJldF9jYXN0PGJmMTYqPihrdl9sb3JhX3B0cik7CgogICBtYXRtdWxfYmxhc19ybV9jbShkX2lucHV0LCBkX3FfcHJval9kb3duLCBkX3FfbG9yYSwgYmF0Y2hfc2l6ZSwgZGltX3FfZG93biwgZGltX2VtYmVkLGRpbV9lbWJlZCk7CiAgIG1hdG11bF9ibGFzX3JtX2NtKGRfaW5wdXQsIGRfa3ZfcHJval9kb3duLCBkX2t2X2xvcmEsIGJhdGNoX3NpemUsIGRpbV9rdl9kb3duLCBkaW1fZW1iZWQsZGltX2VtYmVkKTsKICAKfQoKCnZvaWQgbWF0bXVsX2JsYXNfY21fcm1fYmF0Y2hlZF9zdHJpZGUoY29uc3QgYmYxNipkQSwgY29uc3QgYmYxNiAqZEIsIGJmMTYgKmRDLCBpbnQgTSwgaW50IE4sIGludCBLLCBpbnQgbl9iYXRjaGVzLCBpbnQgc3RyaWRlTUssIGludCBzdHJpZGVLTil7CiAgY29uc3QgZmxvYXQgYWxwaGEgPSAxLjBmOwogIGNvbnN0IGZsb2F0IGJldGEgID0gMC4wZjsKICByb2NibGFzX2dlbW1fc3RyaWRlZF9iYXRjaGVkX2V4KAogICAgaGFuZGxlLAogICAgcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKICAgIHJvY2JsYXNfb3BlcmF0aW9uX3RyYW5zcG9zZSwKICAgIE4sIE0sIEssCiAgICAmYWxwaGEsCiAgICBkQiwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sc3RyaWRlS04sCiAgICBkQSwgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE0sc3RyaWRlTUssCiAgICAmYmV0YSwKICAgIGRDLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBkQywgcm9jYmxhc19kYXRhdHlwZV9iZjE2X3IsIE4sTipNLAogICAgbl9iYXRjaGVzLAogICAgcm9jYmxhc19kYXRhdHlwZV9mMzJfciwKICAgIHJvY2JsYXNfZ2VtbV9hbGdvX3N0YW5kYXJkLAogICAgMCwgMAogICk7Cn0KCnZvaWQgbWVyZ2VkX21hdG11bCgKICB1aW50cHRyX3QgUV9wcm9qX3VwX3B0ciwKICB1aW50cHRyX3QgS1ZfcHJval91cF9wdHIsCiAgdWludHB0cl90IG1lcmdlZF9wdHIsCiAgaW50IGJhdGNoX3NpemUsCiAgaW50IHFfbG9yYV9kaW0sCiAgaW50IGt2X2xvcmFfZGltKXsKICAKICBjb25zdCBiZjE2ICpkX1dxX1VwX25vcGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihRX3Byb2pfdXBfcHRyKTsKICBjb25zdCBiZjE2ICpkX1drX3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBiZjE2Kj4oS1ZfcHJval91cF9wdHIpOwogIGJmMTYgKmRfbWVyZ2VkID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4obWVyZ2VkX3B0cik7CiAgCiAgY29uc3QgaW50IG5iX2hlYWRzID0gMTI4OwogIGNvbnN0IGludCBNID0gcV9sb3JhX2RpbTsKICBjb25zdCBpbnQgTiA9IGt2X2xvcmFfZGltOwogIGNvbnN0IGludCBLID0gMTI4OwogIGNvbnN0IGludCBzdHJpZGVNSyA9IDE5MipxX2xvcmFfZGltOy8vMTI4KzY0CiAgY29uc3QgaW50IHN0cmlkZUtOID0gMjU2Kmt2X2xvcmFfZGltOyAvLzEyOCsxMjgKICAgIAogIG1hdG11bF9ibGFzX2NtX3JtX2JhdGNoZWRfc3RyaWRlKGRfV3FfVXBfbm9wZSwgZF9Xa191cCwgZF9tZXJnZWQsIE0sICBOLCAgSywgYmF0Y2hfc2l6ZSxzdHJpZGVNSywgc3RyaWRlS04pOwogIAp9Cgp2b2lkIG1hdG11bF9ibGFzX3JtX2NtX2JhdGNoZWRfc3RyaWRlKGNvbnN0IGJmMTYqZEEsIGNvbnN0IGJmMTYgKmRCLCBjb25zdCBiZjE2ICpkQywgYmYxNiAqZEQsIGludCBNLCBpbnQgTiwgaW50IEssIGludCBuX2JhdGNoZXMsIGludCBzdHJpZGVNSywgaW50IHN0cmlkZUtOLCBmbG9hdCBhbHBoYSwgZmxvYXQgYmV0YSl7CgogIHJvY2JsYXNfZ2VtbV9zdHJpZGVkX2JhdGNoZWRfZXgoCiAgICBoYW5kbGUsCiAgICByb2NibGFzX29wZXJhdGlvbl90cmFuc3Bvc2UsCiAgICByb2NibGFzX29wZXJhdGlvbl9ub25lLAogICAgTiwgTSwgSywKICAgICZhbHBoYSwKICAgIGRCLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVLTiwKICAgIGRBLCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgSyxzdHJpZGVNSywKICAgICZiZXRhLAogICAgZEMsIHJvY2JsYXNfZGF0YXR5cGVfYmYxNl9yLCBOLE4qTSwKICAgIGRELCByb2NibGFzX2RhdGF0eXBlX2JmMTZfciwgTixOKk0sCiAgICBuX2JhdGNoZXMsCiAgICByb2NibGFzX2RhdGF0eXBlX2YzMl9yLAogICAgcm9jYmxhc19nZW1tX2FsZ29fc3RhbmRhcmQsCiAgICAwLCAwCiAgKTsKfQoKdm9pZCBjb21iaW5lX3JvcGUoCiAgdWludHB0cl90IFNjb3JlTm9Sb3BlX3B0ciwKICB1aW50cHRyX3QgcV9yb3BlX291dF9wdHIsCiAgdWludHB0cl90IGtfcm9wZV9vdXRfcHRyLAogIHVpbnRwdHJfdCBTY29yZU91dF9wdHIsCiAgaW50IE0sCiAgaW50IE4sCiAgaW50IEssCiAgZmxvYXQgc2NhbGUpewogIAogIGNvbnN0IGJmMTYgKmRfcV9yb3BlX291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KHFfcm9wZV9vdXRfcHRyKTsKICBjb25zdCBiZjE2ICpkX2tfcm9wZV9vdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGJmMTYqPihrX3JvcGVfb3V0X3B0cik7CiAgY29uc3QgYmYxNiAqZF9TY29yZU5vUm9wZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYmYxNio+KFNjb3JlTm9Sb3BlX3B0cik7CiAgYmYxNiAqICBkX1Njb3JlT3V0ID0gcmVpbnRlcnByZXRfY2FzdDxiZjE2Kj4oU2NvcmVPdXRfcHRyKTsKICAKICBjb25zdCBpbnQgbmJfaGVhZHMgPSAxMjg7CiAgaW50IHN0cmlkZU1LID0gSypNOwogIGludCBzdHJpZGVLTiA9IEsqTjsKCiAgbWF0bXVsX2JsYXNfcm1fY21fYmF0Y2hlZF9zdHJpZGUoZF9xX3JvcGVfb3V0LCBkX2tfcm9wZV9vdXQsIGRfU2NvcmVOb1JvcGUsIGRfU2NvcmVPdXQsIE0sICBOLCAgSywgbmJfaGVhZHMsc3RyaWRlTUssIHN0cmlkZUtOLHNjYWxlLHNjYWxlKTsKCiAgCn0KCgoKUFlCSU5EMTFfTU9EVUxFKHJvcGUsIG0pIHsKICBtLmRlZigiaW5pdCIsICZpbml0LCAiSW5pdCBjb2RlIik7CiAgbS5kZWYoInJvcGUiLCAmY29tcHV0ZV9yb3Blc193cmFwcGVyLCAiUm9wZSBrZXJuZWwiKTsKICBtLmRlZigic3RvcmVrdiIsICZzdG9yZV90b19rdl9jYWNoZV93cmFwcGVyLCAiS1ZDYWNoZSBrZXJuZWwiKTsKICBtLmRlZigiZG93bl9wcm9qIiwgJmRvd25fcHJvaiwgIkRvd24gUHJvaiBrZXJuZWwiKTsKICBtLmRlZigibWVyZ2VkX21hdG11bCIsICZtZXJnZWRfbWF0bXVsLCAibWVyZ2VkX21hdG11bCBrZXJuZWwiKTsKICBtLmRlZigiY29tYmluZV9yb3BlIiwgJmNvbWJpbmVfcm9wZSwgImNvbWJpbmVfcm9wZSBrZXJuZWwiKTsKICAKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9InJvcGUiLAogICAgY3BwX3NvdXJjZXM9IiIsCiAgICBjdWRhX3NvdXJjZXM9a2VybmVsX2NwcC5yZXBsYWNlKCdAJywgY2hyKDkyKSksCiAgICB3aXRoX2N1ZGE9VHJ1ZSwKICAgIHZlcmJvc2U9RmFsc2UsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMTciXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKCmNsYXNzIEtWQ2FjaGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jYWNoZV9zaGFwZTogdHVwbGUpIC0+IE5vbmU6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ2RhdGEnLCB0b3JjaC56ZXJvcyhrdl9jYWNoZV9zaGFwZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpKQogICAgICAgIHNlbGYuc2VxX2xlbiA9IDAKICAgICAgICBzZWxmLnplcm8oKQoKICAgIGRlZiB6ZXJvKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYXRhLnplcm9fKCkKICAgIAogICAgZGVmIGdldF9kYXRhKHNlbGYpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIGZvcndhcmQoc2VsZiwgY19rdjogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgYXNzZXJ0IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSA8PSBzZWxmLmRhdGEuc2l6ZSgxKSwgIktWIENhY2hlIEV4Y2VlZGVkIgoKICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEudG8oY19rdi5kdHlwZSkKICAgICAgICBzZWxmLmRhdGFbCiAgICAgICAgICAgIDosIHNlbGYuc2VxX2xlbiA6IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSwgOgogICAgICAgIF0gPSBjX2t2CiAgICAgICAgc2VsZi5zZXFfbGVuICs9IGNfa3Yuc2l6ZSgxKQoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhWzosIDpzZWxmLnNlcV9sZW5dLCBzZWxmLnNlcV9sZW4KICAgIApAZGF0YWNsYXNzCmNsYXNzIENvbmZpZzoKICAgIGJhdGNoX3NpemU6IGludAogICAgZGltOiBpbnQKICAgIG5faGVhZHM6IGludAogICAgcV9sb3JhX3Jhbms6IGludCAKICAgIGt2X2xvcmFfcmFuazogaW50CiAgICBxa19ub3BlX2hlYWRfZGltOiBpbnQKICAgIHFrX3JvcGVfaGVhZF9kaW06IGludAogICAgdl9oZWFkX2RpbTogaW50CiAgICBzZXFfbGVuOiBpbnQKICAgIG1heF9zZXFfbGVuOiBpbnQKICAgIGt2X2NhY2hlX3NoYXBlOiB0dXBsZQogICAgUV9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIFFfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICB3b193ZWlnaHQ6IHRvcmNoLlRlbnNvcgoKICAgICAKY2xhc3MgTUxBKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBDb25maWcpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZGltID0gY29uZmlnLmRpbQogICAgICAgIHNlbGYubl9oZWFkcyA9IGNvbmZpZy5uX2hlYWRzCiAgICAgICAgc2VsZi5xX2xvcmFfcmFuayA9IGNvbmZpZy5xX2xvcmFfcmFuawogICAgICAgIHNlbGYua3ZfbG9yYV9yYW5rID0gY29uZmlnLmt2X2xvcmFfcmFuawogICAgICAgIHNlbGYubm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19ub3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi5yb3BlX2hlYWRfZGltID0gY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnZfaGVhZF9kaW0gPSBjb25maWcudl9oZWFkX2RpbQogICAgICAgICMgRG93bi1wcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBVcC1wcm9qZWN0aW9uIGFuZCByb3BlIHByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLnFfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2VsZi5LVl9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYua3ZfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAgc2VsZi5xX2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5xX2xvcmFfcmFuayxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBzZWxmLmt2X2xvcmEgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgc2VsZi5rdl9sb3JhX3JhbmsrNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCgogICAgICAgICMgT3V0cHV0IHByb2plY3Rpb24KICAgICAgICBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV19tZXJnZWQgPSB0b3JjaC5lbXB0eShjb25maWcuYmF0Y2hfc2l6ZSwgc2VsZi5xX2xvcmFfcmFuaywgc2VsZi5rdl9sb3JhX3JhbmssZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgICAgICAgaGlwX21vZHVsZS5pbml0KCkKICAgICAgICAKICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIGt2X2NhY2hlOiBLVkNhY2hlKSAtPiB0b3JjaC5UZW5zb3I6CgogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIG1vZGVsX2RpbSA9IHguc2l6ZSgpCgogICAgICAgIGhpcF9tb2R1bGUuZG93bl9wcm9qKAogICAgICAgICAgICAgICAgeC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgc2VsZi5RX3Byb2pfZG93bi53ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYucV9sb3JhLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICBzZWxmLktWX3Byb2pfZG93bi53ZWlnaHQuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgIHNlbGYua3ZfbG9yYS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgICAgIHNlbGYucV9sb3JhX3JhbmssCiAgICAgICAgICAgICAgICBzZWxmLmt2X2xvcmFfcmFuays2NCwKICAgICAgICAgICAgICAgIHguc2hhcGVbMl0pCiAgICAgICAgICAgICAgIAogICAgICAgIGhpcF9tb2R1bGUubWVyZ2VkX21hdG11bCgKICAgICAgICAgIHNlbGYuUV9wcm9qX3VwLndlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5LVl9wcm9qX3VwLndlaWdodC5kYXRhX3B0cigpLAogICAgICAgICAgc2VsZi5XX21lcmdlZC5kYXRhX3B0cigpLAogICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgIHNlbGYucV9sb3JhX3JhbmssCiAgICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayk7CiAgCiAgICAgICAgaGlwX21vZHVsZS5zdG9yZWt2KAogICAgICAgICAgICBzZWxmLmt2X2xvcmEuZGF0YV9wdHIoKSwKICAgICAgICAgICAga3ZfY2FjaGUuZ2V0X2RhdGEoKS5kYXRhX3B0cigpLAogICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICBrdl9jYWNoZS5zZXFfbGVuKQogICAgICAgIAogICAgICAgIAogICAgICAgIGt2X2NhY2hlLnNlcV9sZW4rPTEKICAgICAgICBrdl9sZW4gPSBrdl9jYWNoZS5zZXFfbGVuCiAgICAgICAgCiAgICAgICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMQogICAgICAgIGt2X2xvcmEgPSBrdl9jYWNoZS5nZXRfZGF0YSgpWzosIDprdl9sZW4sIDpdCiAgICAgICAgcV9kb3duID0gc2VsZi5xX2xvcmEudW5zcXVlZXplKDEpICMgKDEyOCwxLDE1MzYpIC0+ICgxMjgsMSwxLDE1MzYpCiAgICAgICAgU2NvcmVOb1JvcGUxID0gdG9yY2gubWF0bXVsKHFfZG93bi5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksc2VsZi5XX21lcmdlZCkjMgogICAgICAgIFNjb3JlTm9Sb3BlMSA9IFNjb3JlTm9Sb3BlMS5wZXJtdXRlKDEsMCwyKQogICAgICAgIGt2RG93bl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgICAgICAgICAgICAgIAogICAgICAgIGt2X2Rvd25fcGVybXV0ZSA9IGt2RG93bl9ub3BlLnBlcm11dGUoMCwyLDEpCiAgICAgICAga3ZfZG93bl9wZXJtdXRlID0ga3ZfZG93bl9wZXJtdXRlLnVuc3F1ZWV6ZSgxKSAjKDEyOCw1MTIsc2VxKSAtPiAoMTI4LDEsNTEyLHNlcSkKICAgICAgICAKICAgICAgICBTY29yZU5vUm9wZV90PVNjb3JlTm9Sb3BlMS52aWV3KGJhdGNoX3NpemUsc2VsZi5uX2hlYWRzLDUxMikgI1ticyxuX2hlYWQsNTEyXSkKICAgICAgICBTY29yZU5vUm9wZSA9IHRvcmNoLm1hdG11bChTY29yZU5vUm9wZV90LGt2X2Rvd25fcGVybXV0ZS5zcXVlZXplKDEpKSMzCiAgICAgICAgCiAgICAgICAgCiAgICAgICAgV3FOb3BlUm9wZSA9IHNlbGYuUV9wcm9qX3VwLndlaWdodC50KCkudmlldyhzZWxmLnFfbG9yYV9yYW5rLHNlbGYubl9oZWFkcyxzZWxmLm5vcGVfaGVhZF9kaW0rc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIF8sIFdxX1VwX3JvcGUgPSB0b3JjaC5zcGxpdChXcU5vcGVSb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgIFdrdl91cCA9IHNlbGYuS1ZfcHJval91cC53ZWlnaHQudCgpLnZpZXcoc2VsZi5rdl9sb3JhX3Jhbmssc2VsZi5uX2hlYWRzLHNlbGYubm9wZV9oZWFkX2RpbStzZWxmLnZfaGVhZF9kaW0pCiAgICAgICAgXywgV3ZfdXAgPSB0b3JjaC5zcGxpdChXa3ZfdXAsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYudl9oZWFkX2RpbV0sIGRpbT0tMSkKICAgICAgICAKICAgICAgICBXdl91cCA9IFd2X3VwLnBlcm11dGUoMSwgMCwgMikgICMgc2hhcGU6IChuX2hlYWQsIGRpbSwgaGVhZCkgICAgICAgIAogICAgICAgIFdxX1VwX3JvcGUgPSBXcV9VcF9yb3BlLnJlc2hhcGUoc2VsZi5xX2xvcmFfcmFuayxzZWxmLm5faGVhZHMqc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIFFSb3BlID0gdG9yY2gubWF0bXVsKHNlbGYucV9sb3JhLFdxX1VwX3JvcGUpIzEKICAgICAgICBRUm9wZSA9IFFSb3BlLnZpZXcoMTI4LCAxLCAxMjgsIDY0KQogICAgICAgIHFfcm9wZSA9IFFSb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogCiAgICAgICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIGt2X2xlbiwgNjQsZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT0nY3VkYScpCiAgICAgICAgcV9yb3BlX291dCA9IHRvcmNoLmVtcHR5KGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywxLCA2NCxkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLnJvcGUoa19yb3BlX291dC5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBrX3JvcGUuZGF0YV9wdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAga19yb3BlLnN0cmlkZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHFfcm9wZS5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICBiYXRjaF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5faGVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGt2X2xlbikKICAgICAgICAKICAgICAgICBrX3JvcGVfb3V0ID0ga19yb3BlX291dC51bnNxdWVlemUoMSkKCiAgICAgICAgU2NvcmVPdXQgPSB0b3JjaC5lbXB0eShiYXRjaF9zaXplLCAxMjgsIGt2X2xlbixkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKICAgICAgICBoaXBfbW9kdWxlLmNvbWJpbmVfcm9wZSgKICAgICAgICAgIFNjb3JlTm9Sb3BlLmRhdGFfcHRyKCksCiAgICAgICAgICBxX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBrX3JvcGVfb3V0LmRhdGFfcHRyKCksCiAgICAgICAgICBTY29yZU91dC5kYXRhX3B0cigpLAogICAgICAgICAgU2NvcmVPdXQuc2hhcGVbMV0sCiAgICAgICAgICBrdl9sZW4sCiAgICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0sCiAgICAgICAgICAxLjAgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKSkKICAgICAgICAKICAgICAgICBBdHRuT3V0U01heCA9IEYuc29mdG1heChTY29yZU91dCwgZGltPS0xKSMudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgCiAgICAgICAga3ZfZG93biA9IGt2RG93bl9ub3BlLnVuc3F1ZWV6ZSgxKQogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoQXR0bk91dFNNYXguc3F1ZWV6ZSgyKSxrdl9kb3duLnNxdWVlemUoMSkpCiAgICAgICAgeTBfYz15MF9jLnVuc3F1ZWV6ZSgyKQogICAgICAgIAogICAgICAgIHkwX2MgPSB0b3JjaC5tYXRtdWwoeTBfYy5wZXJtdXRlKDEsMCwyLDMpLnNxdWVlemUoMiksV3ZfdXApCiAgICAgICAgeTBfYyA9IHkwX2MucGVybXV0ZSgxLDAsMikKICAgICAgICB5MF9jID0gc2VsZi53byh5MF9jLmZsYXR0ZW4oc3RhcnRfZGltPTEpKQogICAgICAgIAogICAgICAgIHJldHVybiB5MF9jLnZpZXcoYmF0Y2hfc2l6ZSwxLHNlbGYuZGltKSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKbW9kZWwgPSBOb25lCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgICAgICBnbG9iYWwgbW9kZWwKICAgICAgICBpZiBtb2RlbCA9PSBOb25lOgogICAgICAgICAgICBtb2RlbCA9IE1MQShjb25maWcpLnRvKCdjdWRhOjAnKQogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuUV9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX3VwX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval9kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuS1ZfcHJval9kb3duX3dlaWdodCkKICAgICAgICAgICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLndvX3dlaWdodCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LnNpemUoKSwgY29uZmlnLlFfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQuc2V0Xyhjb25maWcuUV9wcm9qX3VwX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLlFfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuUV9wcm9qX3VwX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQuc2V0Xyhjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC51bnR5cGVkX3N0b3JhZ2UoKSwgMCwgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval9kb3duX3dlaWdodC5zdHJpZGUoKSkgCiAgICAgICAgICAgIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0LnNldF8oY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc2l6ZSgpLCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuc3RyaWRlKCkpIAogICAgICAgICAgICBtb2RlbC53by53ZWlnaHQuc2V0Xyhjb25maWcud29fd2VpZ2h0LnVudHlwZWRfc3RvcmFnZSgpLCAwLCBjb25maWcud29fd2VpZ2h0LnNpemUoKSwgY29uZmlnLndvX3dlaWdodC5zdHJpZGUoKSkgCgogICAgICAgIG91dHB1dCwga3ZfY2FjaGUgPSBtb2RlbCh4LCBrdl9jYWNoZSkKICAgICAgICByZXR1cm4gb3V0cHV0LCBrdl9jYWNoZQ==
No newline at end of file

Best evidence level for this revision: reported

JSON