Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 29838

KernelBot user 87 · 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.

submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-29838?include=source"
interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16

Benchmark evidence

2 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD DeepSeek-style MoE layerfp16 · [1, 2048, 7168]
AMD Instinct MI300X
8.64ms
#52 of 118
2025-06-01
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
24.9ms
#59 of 118
2025-06-01

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:6adb9fd7c3fb6405c97149c4ba73572da47300c206d0c502e82c9be5f7770c18
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission.py1 lines
ZnJvbSB1dGlscyBpbXBvcnQgbWFrZV9tYXRjaF9yZWZlcmVuY2UKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKaW1wb3J0IHRvcmNoLm5uIGFzIG5uCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAppbXBvcnQgbWF0aAoKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCmZyb20gdHlwaW5nIGltcG9ydCBBbnksIENhbGxhYmxlLCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVHVwbGUKCmltcG9ydCBvcyAKb3MuZW52aXJvblsnUFlUT1JDSF9ST0NNX0FSQ0gnXSA9ICdnZng5NDInCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUKCgpDUFBfV1JBUFBFUiA9ICIiIgp2b2lkIGhpcF9tb2UodG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYywgdG9yY2g6OlRlbnNvciB0b3BrX3dlaWdodCwKICAgICAgICAgICAgdG9yY2g6OlRlbnNvciBzb3J0ZWRfdG9rZW4sIHRvcmNoOjpUZW5zb3IgZXhwZXJ0X2lkcywgaW50IG51bV90b2tlbnNfcG9zdF9wYWRkZWQsCiAgICAgICAgICAgIGludCB0b3BrLCBpbnQgbnVtX3ZhbGlkX3Rva2VucywgYm9vbCBNVUxfUk9VVEVEX1dFSUdIVCk7CiIiIgoKQ1BQX1dSQVBQRVIyID0gIiIiCnZvaWQgbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3JjaDo6VGVuc29yIHRvcGtfaWRzLAogICAgaW50NjRfdCBudW1fZXhwZXJ0cywKICAgIGludDY0X3QgYmxvY2tfc2l6ZSwKICAgIHRvcmNoOjpUZW5zb3Igc29ydGVkX3Rva2VuX2lkcywKICAgIHRvcmNoOjpUZW5zb3IgZXhwZXJ0c19pZHMsCiAgICB0b3JjaDo6VGVuc29yIG51bV90b2tlbnNfcG9zdF9wYWQsCiAgICB0b3JjaDo6VGVuc29yIHRva2VuX2NudHNfYnVmZmVyLAogICAgdG9yY2g6OlRlbnNvciBjdW1zdW1fYnVmZmVyKTsKIiIiCgpDVURBX1NSQyA9ICIiIgojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwMTYuaD4KCiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCnVzaW5nIGhhbGYgPSBfX2hhbGY7CnVzaW5nIGZsb2F0MTZfdCA9IF9GbG9hdDE2OwoKI2luY2x1ZGUgPHJhbmRvbT4KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+CgoKI2RlZmluZSBGUkFHX00gMTYKI2RlZmluZSBGUkFHX04gMTYKI2RlZmluZSBGUkFHX0sgMTYKCiNkZWZpbmUgTlVNX1JFUEVBVF9NTiAoNCkKCiNkZWZpbmUgQkxPQ0tfU0laRV9NIChGUkFHX00gKiBOVU1fUkVQRUFUX01OKQojZGVmaW5lIEJMT0NLX1NJWkVfTiAoRlJBR19OICogTlVNX1JFUEVBVF9NTikKI2RlZmluZSBCTE9DS19TSVpFX0sgKEZSQUdfSyAqIDgpCgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDx2ZWN0b3I+CgoKY29uc3RleHByIGNvbnN0IGludCBCTE9DSyA9IDEyODsKCl9fZGV2aWNlX18gX19pbmxpbmVfXyB2b2lkIF9fc3luY193YXJwKHZvaWQpIHsgX19hc21fXyB2b2xhdGlsZSgic19iYXJyaWVyIiA6IDogOiAibWVtb3J5Iik7IH0KCl9fZ2xvYmFsX18gdm9pZCBoaXBfaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoZmxvYXQxNl90ICogaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQxNl90ICoqIHdlaWdodF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQxNl90ICogb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0MTZfdCAqIHRvcGtfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICogZXhwZXJ0X2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wX2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV92YWxpZF90b2tlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNVUxfUk9VVEVEX1dFSUdIVCkgewogICAgaW50IGxhbmVfaWQgPSB0aHJlYWRJZHgueCAlIHdhcnBTaXplOwogICAgY29uc3RleHByIHVuc2lnbmVkIGludCBlbGVfcGVyX3RocmVhZCA9IEZSQUdfTSAqIEZSQUdfTiAvIHdhcnBTaXplOwogICAKICAgIGludCBjX3Jvd19iYXNlID0gYmxvY2tJZHgueCAqIEJMT0NLX1NJWkVfTTsKICAgIGludCBjX2NvbF9iYXNlID0gYmxvY2tJZHgueSAqIEJMT0NLX1NJWkVfTjsKCiAgICBfX3NoYXJlZF9fIGludDIgbGhzX3RpbGVbQkxPQ0tfU0laRV9LIC8gNF1bQkxPQ0tfU0laRV9NXTsKICAgIF9fc2hhcmVkX18gaW50MiByaHNfdGlsZVtCTE9DS19TSVpFX0sgLyA0XVtCTE9DS19TSVpFX05dOwoKICAgIGludDIqIGxoc190aWxlX2Jhc2VfcHRyID0gJihsaHNfdGlsZVswXVswXSk7CiAgICBpbnQyKiByaHNfdGlsZV9iYXNlX3B0ciA9ICYocmhzX3RpbGVbMF1bMF0pOwoKICAgIHVzaW5nIGZsb2F0MTZ4NCA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKGZsb2F0MTZfdCkpKSkgZmxvYXQxNl90OwogICAgdXNpbmcgZmxvYXR4NCA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiAgICB1aW50IHJlc3VsdF9mcmFnWzJdWzRdID0gezB9OwoKICAgIGlmIChjX3Jvd19iYXNlID49IG51bV90b2tlbnNfcG9zdF9wYWRkZWQpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaW50IHRocmVhZF9pZF9pbl9hX2Jsb2NrID0gdGhyZWFkSWR4LnggKyB0aHJlYWRJZHgueSAqIGJsb2NrRGltLng7CiAgICBpbnQgcm93X2Zvcl9pbnB1dCA9IHRocmVhZF9pZF9pbl9hX2Jsb2NrIC8gMzI7CiAgICBpbnQgY29sX2Zvcl9pbnB1dCA9IHRocmVhZF9pZF9pbl9hX2Jsb2NrICUgMzI7CgogICAgZmxvYXQxNl90ICogaW5wdXRfcHRyc1s4XTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCA4OyArK2kpIHsKICAgICAgICBpbnQgaWR4ID0gY19yb3dfYmFzZSArIHJvd19mb3JfaW5wdXQgKiA4ICsgaTsKICAgICAgICBpbnQgb2Zmc190b2tlbiA9IHNvcnRlZF90b2tlbl9pZHNbaWR4XTsKICAgICAgICBpbnQgaW5wdXRfb2Zmc190b2tlbiA9IG9mZnNfdG9rZW4gLyB0b3BfazsKCiAgICAgICAgaWYob2Zmc190b2tlbiA8IG51bV92YWxpZF90b2tlbnMpIHsKICAgICAgICAgICAgaW5wdXRfcHRyc1tpXSA9ICZpbnB1dFtpbnB1dF9vZmZzX3Rva2VuICogS107CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpbnB1dF9wdHJzW2ldID0gbnVsbHB0cjsKICAgICAgICB9CiAgICB9CgogICAgaW50IG9mZl9leHBlcnRzID0gZXhwZXJ0X2lkc1tibG9ja0lkeC54XTsKICAgIGZsb2F0MTZfdCAqIGN1cl9leHBlcnRfcHRyID0gd2VpZ2h0X3B0cltvZmZfZXhwZXJ0c107CiAgICBmb3IgKGludCBiaSA9IDA7IGJpIDwgSzsgYmkgKz0gQkxPQ0spIHsKCiAgICAgICAgaWYodGhyZWFkSWR4LnkgPCA0KSB7CiAgICAgICAgICAgIC8vIGlucHV0IDogTSB4IEsKICAgICAgICAgICAgY29uc3RleHByIGludCB0aHJfcGVyX3JvdyA9IDMyOwogICAgICAgICAgICBpbnQgc19jb2wgPSAodGhyZWFkX2lkX2luX2FfYmxvY2sgJSB0aHJfcGVyX3Jvdyk7CiAgICAgICAgICAgIGludCBzX3JvdyA9ICh0aHJlYWRfaWRfaW5fYV9ibG9jayAvIHRocl9wZXJfcm93KTsKCiAgICAgICAgICAgIGludCBnX2NvbCA9IGJpICsgc19jb2wgKiA0OwogICAgICAgICAgICBmbG9hdDE2X3QgdG1wWzggKiA0XSA9IHswfTsKCiAgICAgICAgICAgIGZvcihpbnQgciA9IDA7IHIgPCA4OyArK3IpIHsKICAgICAgICAgICAgICAgIGlmKGlucHV0X3B0cnNbcl0gIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgIGludDIgKiBsaHNfMmlfcHRyID0gKGludDIgKikoaW5wdXRfcHRyc1tyXSArIGdfY29sKTsKICAgICAgICAgICAgICAgICAgICBhdXRvIHB0ciA9IHRtcCArIHIgKiA0OwogICAgICAgICAgICAgICAgICAgIGludDIgKiBwdHJfMmlfcHRyID0gKGludDIgKikgcHRyOwogICAgICAgICAgICAgICAgICAgICpwdHJfMmlfcHRyID0gKmxoc18yaV9wdHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcihpbnQgciA9IDA7IHIgPCA4OyArK3IpIHsKICAgICAgICAgICAgICAgIGludCBpZHggPSBzX2NvbCAqIEJMT0NLX1NJWkVfTSArIHNfcm93ICogOCArIHI7CiAgICAgICAgICAgICAgICBpbnQyKiBwdHIgPSAoaW50MiAqKSh0bXAgKyByICogNCk7CgogICAgICAgICAgICAgICAgaW50MiogbGhzX3RpbGVfMmlfcHRyID0gKGludDIgKikobGhzX3RpbGVfYmFzZV9wdHIgKyBpZHgpOwogICAgICAgICAgICAgICAgKiBsaHNfdGlsZV8yaV9wdHIgPSAqIHB0cjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhyZWFkX2lkX2luX2FfYmxvY2sgPSB0aHJlYWRfaWRfaW5fYV9ibG9jayAlIDI1NjsKICAgICAgICAgICAgY29uc3RleHByIGludCB0aHJfcGVyX3JvdyA9IDg7CiAgICAgICAgICAgIGludCBzX2NvbCA9ICh0aHJlYWRfaWRfaW5fYV9ibG9jayAlIHRocl9wZXJfcm93KTsKICAgICAgICAgICAgaW50IHNfcm93ID0gKHRocmVhZF9pZF9pbl9hX2Jsb2NrIC8gdGhyX3Blcl9yb3cpOwoKICAgICAgICAgICAgaW50IGdfY29sID0gY19jb2xfYmFzZSArIHNfY29sICogODsKICAgICAgICAgICAgaW50IGdfcm93ID0gYmkgKyBzX3JvdyAqIDQ7CgogICAgICAgICAgICBmbG9hdDE2X3QgdG1wMFs0ICogOF0gPSB7MH07CiAgICAgICAgICAgIGZsb2F0MTZfdCB0bXAxWzggKiA0XSA9IHswfTsKCiAgICAgICAgICAgIGZvcihpbnQga2sgPSAwOyBrayA8IDQ7ICsra2spIHsKICAgICAgICAgICAgICAgIGludDQqIHJoc180aV9wdHIgPSAoaW50NCopKGN1cl9leHBlcnRfcHRyICsgKGdfcm93ICsga2spICogTiArIGdfY29sKTsKICAgICAgICAgICAgICAgIGF1dG8gcHRyID0gdG1wMCArIGtrICogODsKICAgICAgICAgICAgICAgIGludDQqIHB0cl80aV9wdHIgPSAoaW50NCopcHRyOwogICAgICAgICAgICAgICAgKnB0cl80aV9wdHIgPSAqcmhzXzRpX3B0cjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yKGludCB0ciA9IDA7IHRyIDwgNDsgKyt0cikgewogICAgICAgICAgICAgICAgZm9yKGludCB0YyA9IDA7IHRjIDwgODsgKyt0YykgewogICAgICAgICAgICAgICAgICAgIGludCBpZHgwID0gdHIgKiA4ICsgdGM7CiAgICAgICAgICAgICAgICAgICAgaW50IGlkeDEgPSB0YyAqIDQgKyB0cjsKCiAgICAgICAgICAgICAgICAgICAgdG1wMVtpZHgxXSA9IHRtcDBbaWR4MF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcihpbnQgYyA9IDA7IGMgPCA4OyArK2MpIHsKICAgICAgICAgICAgICAgIGludDIgKiByaHNfdGlsZV8yaV9wdHIgPSByaHNfdGlsZV9iYXNlX3B0ciArIHNfcm93ICogQkxPQ0tfU0laRV9OICsgc19jb2wgKiA4ICsgYzsKICAgICAgICAgICAgICAgICpyaHNfdGlsZV8yaV9wdHIgPSAqKChpbnQyKikodG1wMSArIGMgKiA0KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IC8vIGxvYWRfdGlsZV9iCiAgICAgICAgX19zeW5jdGhyZWFkcygpOwoKICAgICAgICBmb3IoaW50IGlpID0gMDsgaWkgPCBCTE9DSzsgaWkgKz0gMTYpIHsKICAgICAgICAgICAgaW50IGkgPSBiaSArIGlpOwoKICAgICAgICAgICAgZmxvYXQxNl90IHZfYV9mcmFnWzJdWzRdID0gezB9OwogICAgICAgICAgICBmbG9hdDE2X3QgYl9mcmFnWzRdID0gezB9OwoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gLy8gKEsgLyA0KSAqIE0gKiA0CiAgICAgICAgICAgICAgICBpbnQgc19yb3cgPSAobGFuZV9pZCAvIDE2KTsKICAgICAgICAgICAgICAgIGludCBzX2NvbCA9IChsYW5lX2lkICUgMTYpOwogICAgICAgICAgICAgICAgaW50IHdhcnBfY29sID0gdGhyZWFkSWR4LnkgLyA0OwogICAgICAgICAgICAgICAgaW50MiogbGhzX3RpbGVfcHRyID0gbGhzX3RpbGVfYmFzZV9wdHIgKyAoc19yb3cgKyBpaSAvIDQpICogQkxPQ0tfU0laRV9NICsgc19jb2wgKyB3YXJwX2NvbCAqIDMyOwoKICAgICAgICAgICAgICAgIGZvcihpbnQgcmkgPSAwOyByaSA8IDI7ICsrcmkpIHsKICAgICAgICAgICAgICAgICAgICBpbnQyICogcHRyID0gKGludDIqKXZfYV9mcmFnW3JpXTsKICAgICAgICAgICAgICAgICAgICAqIHB0ciA9IGxoc190aWxlX3B0cltyaSAqIDE2XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAvLyBsb2FkX3RpbGVfYQoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gKEsgLyA0KSAqICBOICogNAogICAgICAgICAgICAgICAgaW50IHNfcm93ID0gKGxhbmVfaWQgLyAxNik7CiAgICAgICAgICAgICAgICBpbnQgc19jb2wgPSAobGFuZV9pZCAlIDE2KTsKICAgICAgICAgICAgICAgIGludCB3YXJwX2NvbCA9IHRocmVhZElkeC55ICUgNDsKICAgICAgICAgICAgICAgIGludDIqIHJoc190aWxlX3B0ciA9IHJoc190aWxlX2Jhc2VfcHRyICsgKHNfcm93ICsgaWkgLyA0KSAqIEJMT0NLX1NJWkVfTiArIHNfY29sICsgd2FycF9jb2wgKiAxNjsKCiAgICAgICAgICAgICAgICBpbnQyKiBiX3B0ciA9IChpbnQyICopYl9mcmFnOwogICAgICAgICAgICAgICAgKmJfcHRyID0gKiByaHNfdGlsZV9wdHI7CiAgICAgICAgICAgIH0gLy8gbG9hZF90aWxlX2IKCiAgICAgICAgICAgIGZvcihpbnQgcmkgPSAwOyByaSA8IDI7ICsrcmkpIHsKICAgICAgICAgICAgICAgIGF1dG8gYV9mcmFnID0gdl9hX2ZyYWdbcmldOwoKICAgICAgICAgICAgICAgIGZsb2F0MTZ4NCAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQxNng0ICo+KGFfZnJhZyk7CiAgICAgICAgICAgICAgICBmbG9hdDE2eDQgKmIgPSByZWludGVycHJldF9jYXN0PGZsb2F0MTZ4NCAqPihiX2ZyYWcpOwoKICAgICAgICAgICAgICAgIGZsb2F0eDQgKmQgPSByZWludGVycHJldF9jYXN0PGZsb2F0eDQgKj4ocmVzdWx0X2ZyYWdbcmldKTsKICAgICAgICAgICAgICAgIF9fc3luY193YXJwKCk7CgogICAgICAgICAgICAgICAgKmQgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDE2ZjE2KAogICAgICAgICAgICAgICAgICAgICphLAogICAgICAgICAgICAgICAgICAgICpiLAogICAgICAgICAgICAgICAgICAgICpkLCAwLCAwLCAwKTsKCiAgICAgICAgICAgIH0KICAgICAgICB9IC8vIGZvciBpaQogICAgfS8vIGZvciBiaQoKICAgIGZsb2F0MTZfdCBtb2Vfd2VpZ2h0WzhdID0gezB9OwogICAgZmxvYXQxNl90ICogb3V0cHV0X3B0cnNbOF07CiAgICBpbnQgcm93X2Zvcl9vdXRwdXQgPSBsYW5lX2lkIC8gMTY7CiAgICBpbnQgY29sX2Zvcl9vdXRwdXQgPSBsYW5lX2lkICUgMTY7CgogICAgaW50IG9mZnNbOF07CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgODsgKytpKSB7CiAgICAgICAgaW50IGlkeCA9IGNfcm93X2Jhc2UgKyAodGhyZWFkSWR4LnkgLyA0KSAqIDMyICsgcm93X2Zvcl9vdXRwdXQgKiA0ICsgKGkgLyA0KSAqIDE2ICsgaSAlIDQ7CiAgICAgICAgaW50IG9mZnNfdG9rZW4gPSBzb3J0ZWRfdG9rZW5faWRzW2lkeF07CiAgICAgICAgaWYob2Zmc190b2tlbiA8IG51bV92YWxpZF90b2tlbnMpIHsKICAgICAgICAgICAgaWYoTVVMX1JPVVRFRF9XRUlHSFQpIHsKICAgICAgICAgICAgICAgIG1vZV93ZWlnaHRbaV0gPSB0b3BrX3dlaWdodFtvZmZzX3Rva2VuXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgb3V0cHV0X3B0cnNbaV0gPSAmb3V0cHV0W29mZnNfdG9rZW4gKiBOXTsKCiAgICAgICAgICAgIG9mZnNbaV0gPSBvZmZzX3Rva2VuOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgb3V0cHV0X3B0cnNbaV0gPSBudWxscHRyOwogICAgICAgIH0KICAgIH0KCiAgICBpZihNVUxfUk9VVEVEX1dFSUdIVCkgewogICAgICAgIGF1dG8gcmVzdWx0X3B0ciA9IChmbG9hdCopJnJlc3VsdF9mcmFnWzBdWzBdOwogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCA4OyArK2kpIHsKICAgICAgICAgICAgcmVzdWx0X3B0cltpXSA9IHJlc3VsdF9wdHJbaV0gKiBtb2Vfd2VpZ2h0W2ldOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBzYXZlIHRoZSByZXN1bHQuCiAgICBmb3IoaW50IHJpID0gMDsgcmkgPCAyOyArK3JpKSB7CiAgICAgICAgZmxvYXR4NCAqZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXR4NCAqPihyZXN1bHRfZnJhZ1tyaV0pOwogICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBlbGVfcGVyX3RocmVhZDsgKytqKSB7CiAgICAgICAgICAgIGF1dG8geSA9IGxhbmVfaWQgJSAxNjsKICAgICAgICAgICAgLy8gYXV0byB4ID0gbGFuZV9pZCAvIDE2OwogICAgICAgICAgICBpbnQgb3V0SWR4ID0gcmkgKiA0ICsgajsKICAgICAgICAgICAgaWYob3V0cHV0X3B0cnNbb3V0SWR4XSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICBhdXRvIHB0ciA9IG91dHB1dF9wdHJzW291dElkeF0gKyAodGhyZWFkSWR4LnkgJSA0KSAqIDE2ICsgY19jb2xfYmFzZTsKICAgICAgICAgICAgICAgICoocHRyICsgeSkgPSAoKmQpW2pdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIGhpcF9tb2UodG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIHdlaWdodF92cHRyLCB0b3JjaDo6VGVuc29yIGMsIHRvcmNoOjpUZW5zb3IgdG9wa193ZWlnaHQsCiAgICAgICAgICAgIHRvcmNoOjpUZW5zb3Igc29ydGVkX3Rva2VuLCB0b3JjaDo6VGVuc29yIGV4cGVydF9pZHMsIGludCBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLAogICAgICAgICAgICBpbnQgdG9waywgaW50IG51bV92YWxpZF90b2tlbnMsIGJvb2wgTVVMX1JPVVRFRF9XRUlHSFQpIHsKICAgIGludCBNID0gYS5zaXplKDApOwogICAgaW50IEsgPSBhLnNpemUoMSk7CiAgICBpbnQgTiA9IGMuc2l6ZSgyKTsKICAgIGludCBzb3J0ZWRfdG9rZW5fbnVtID0gc29ydGVkX3Rva2VuLnNpemUoMCk7CiAgICAKICAgICNkZWZpbmUgQ0VJTERJVih4LCB5KSAoKCh4KSArICh5KS0xKSAvICh5KSkKICAgIGRpbTMgZ3JpZChDRUlMRElWKHNvcnRlZF90b2tlbl9udW0sIEJMT0NLX1NJWkVfTSksIENFSUxESVYoTiwgQkxPQ0tfU0laRV9OKSk7CiAgICBkaW0zIGJsb2NrKDY0LCA4KTsKICAgIAogICAgZmxvYXQxNl90ICogbGhzX2QgPSAoZmxvYXQxNl90ICopYS5kYXRhX3B0cigpOwogICAgZmxvYXQxNl90ICoqIHJoc19kID0gKGZsb2F0MTZfdCAqKil3ZWlnaHRfdnB0ci5kYXRhX3B0cigpOwogICAgZmxvYXQxNl90ICogb3V0cHV0X2QgPSAoZmxvYXQxNl90ICopYy5kYXRhX3B0cigpOwogICAgZmxvYXQxNl90ICogdG9wa193ZWlnaHRfZCA9IChmbG9hdDE2X3QgKil0b3BrX3dlaWdodC5kYXRhX3B0cigpOwogICAgaW50ICogc29ydGVkX3Rva2VuX2QgPSAoaW50ICopc29ydGVkX3Rva2VuLmRhdGFfcHRyKCk7CiAgICBpbnQgKiBleHBlcnRfaWRzX2QgPSAoaW50ICopZXhwZXJ0X2lkcy5kYXRhX3B0cigpOwogICAgCiAgICBoaXBfaW52b2tlX2Z1c2VkX21vZV9rZXJuZWw8PDxncmlkLCBibG9jaz4+PihsaHNfZCwgcmhzX2QsIG91dHB1dF9kLCB0b3BrX3dlaWdodF9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF90b2tlbl9kLCBleHBlcnRfaWRzX2QsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTSwgTiwgSywgdG9waywgbnVtX3ZhbGlkX3Rva2VucywgTVVMX1JPVVRFRF9XRUlHSFQpOwp9CiIiIgoKQ1VEQV9TUkMyID0gIiIiCiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9oaXBfZnAxNi5oPgoKI2luY2x1ZGUgPGhpcC9oaXBfZnA4Lmg+CgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgoKdXNpbmcgaGFsZiA9IF9faGFsZjsKdXNpbmcgZmxvYXQxNl90ID0gX0Zsb2F0MTY7CgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8cm9jd21tYS9yb2N3bW1hLmhwcD4KCiNkZWZpbmUgQ0VJTERJVih4LCB5KSAoKCh4KSArICh5KS0xKSAvICh5KSkKCiNkZWZpbmUgV0FSUF9TSVpFIDY0CnRlbXBsYXRlIDx0eXBlbmFtZSBzY2FsYXJfdD4KX19nbG9iYWxfXyB2b2lkIGNvdW50X2FuZF9zb3J0X2V4cGVydF90b2tlbnNfa2VybmVsKAogICAgY29uc3Qgc2NhbGFyX3QqIF9fcmVzdHJpY3RfXyB0b3BrX2lkcywKICAgIGludDMyX3QqIF9fcmVzdHJpY3RfXyBzb3J0ZWRfdG9rZW5faWRzLAogICAgaW50MzJfdCogX19yZXN0cmljdF9fIGN1bXN1bV9idWZmZXIsCiAgICBzaXplX3QgbnVtZWwpIHsKICBjb25zdCBzaXplX3QgdGlkID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKICBjb25zdCBzaXplX3Qgc3RyaWRlID0gYmxvY2tEaW0ueCAqIGdyaWREaW0ueDsKCiAgZm9yIChzaXplX3QgaSA9IHRpZDsgaSA8IG51bWVsOyBpICs9IHN0cmlkZSkgewogICAgaW50MzJfdCBleHBlcnRfaWQgPSB0b3BrX2lkc1tpXTsKICAgIGludDMyX3QgcmFua19wb3N0X3BhZCA9IGF0b21pY0FkZCgmY3Vtc3VtX2J1ZmZlcltleHBlcnRfaWRdLCAxKTsKICAgIHNvcnRlZF90b2tlbl9pZHNbcmFua19wb3N0X3BhZF0gPSBpOwogIH0KfQoKdGVtcGxhdGUgPHR5cGVuYW1lIHNjYWxhcl90PgpfX2dsb2JhbF9fIHZvaWQgbW9lX2FsaWduX2Jsb2NrX3NpemVfa2VybmVsKAogICAgY29uc3Qgc2NhbGFyX3QqIF9fcmVzdHJpY3RfXyB0b3BrX2lkcywKICAgIGludDMyX3QqIF9fcmVzdHJpY3RfXyBzb3J0ZWRfdG9rZW5faWRzLAogICAgaW50MzJfdCogX19yZXN0cmljdF9fIGV4cGVydF9pZHMsCiAgICBpbnQzMl90KiBfX3Jlc3RyaWN0X18gdG90YWxfdG9rZW5zX3Bvc3RfcGFkLAogICAgaW50MzJfdCBudW1fZXhwZXJ0cywKICAgIGludDMyX3QgcGFkZGVkX251bV9leHBlcnRzLAogICAgaW50MzJfdCBleHBlcnRzX3Blcl93YXJwLAogICAgaW50MzJfdCBibG9ja19zaXplLAogICAgc2l6ZV90IG51bWVsLAogICAgaW50MzJfdCogX19yZXN0cmljdF9fIGN1bXN1bSkgewogIGV4dGVybiBfX3NoYXJlZF9fIGludDMyX3Qgc2hhcmVkX2NvdW50c1tdOwoKICBjb25zdCBpbnQgd2FycF9pZCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOwogIGNvbnN0IGludCBteV9leHBlcnRfc3RhcnQgPSB3YXJwX2lkICogZXhwZXJ0c19wZXJfd2FycDsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlcnRzX3Blcl93YXJwOyArK2kpIHsKICAgIGlmIChteV9leHBlcnRfc3RhcnQgKyBpIDwgcGFkZGVkX251bV9leHBlcnRzKSB7CiAgICAgIHNoYXJlZF9jb3VudHNbd2FycF9pZCAqIGV4cGVydHNfcGVyX3dhcnAgKyBpXSA9IDA7CiAgICB9CiAgfQoKICBfX3N5bmN0aHJlYWRzKCk7CgogIGNvbnN0IHNpemVfdCB0aWQgPSB0aHJlYWRJZHgueDsKICBjb25zdCBzaXplX3Qgc3RyaWRlID0gYmxvY2tEaW0ueDsKCiAgZm9yIChzaXplX3QgaSA9IHRpZDsgaSA8IG51bWVsOyBpICs9IHN0cmlkZSkgewogICAgaW50IGV4cGVydF9pZCA9IHRvcGtfaWRzW2ldOwogICAgaW50IHdhcnBfaWR4ID0gZXhwZXJ0X2lkIC8gZXhwZXJ0c19wZXJfd2FycDsKICAgIGludCBleHBlcnRfb2Zmc2V0ID0gZXhwZXJ0X2lkICUgZXhwZXJ0c19wZXJfd2FycDsKICAgIGF0b21pY0FkZCgmc2hhcmVkX2NvdW50c1t3YXJwX2lkeCAqIGV4cGVydHNfcGVyX3dhcnAgKyBleHBlcnRfb2Zmc2V0XSwgMSk7CiAgfQoKICBfX3N5bmN0aHJlYWRzKCk7CgogIGlmICh0aHJlYWRJZHgueCA9PSAwKSB7CiAgICBjdW1zdW1bMF0gPSAwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtX2V4cGVydHM7ICsraSkgewogICAgICBpbnQgZXhwZXJ0X2NvdW50ID0gMDsKICAgICAgaW50IHdhcnBfaWR4ID0gKGkgLSAxKSAvIGV4cGVydHNfcGVyX3dhcnA7CiAgICAgIGludCBleHBlcnRfb2Zmc2V0ID0gKGkgLSAxKSAlIGV4cGVydHNfcGVyX3dhcnA7CiAgICAgIGV4cGVydF9jb3VudCA9IHNoYXJlZF9jb3VudHNbd2FycF9pZHggKiBleHBlcnRzX3Blcl93YXJwICsgZXhwZXJ0X29mZnNldF07CgogICAgICBjdW1zdW1baV0gPSBjdW1zdW1baSAtIDFdICsgQ0VJTERJVihleHBlcnRfY291bnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZTsKICAgIH0KICAgICp0b3RhbF90b2tlbnNfcG9zdF9wYWQgPSBjdW1zdW1bbnVtX2V4cGVydHNdOwogIH0KCiAgX19zeW5jdGhyZWFkcygpOwoKICBpZiAodGhyZWFkSWR4LnggPCBudW1fZXhwZXJ0cykgewogICAgZm9yIChpbnQgaSA9IGN1bXN1bVt0aHJlYWRJZHgueF07IGkgPCBjdW1zdW1bdGhyZWFkSWR4LnggKyAxXTsgaSArPSBibG9ja19zaXplKSB7CiAgICAgIGV4cGVydF9pZHNbaSAvIGJsb2NrX3NpemVdID0gdGhyZWFkSWR4Lng7CiAgICB9CiAgfQp9Cgp2b2lkIG1vZV9hbGlnbl9ibG9ja19zaXplKAogICAgdG9yY2g6OlRlbnNvciB0b3BrX2lkcywKICAgIGludDY0X3QgbnVtX2V4cGVydHMsCiAgICBpbnQ2NF90IGJsb2NrX3NpemUsCiAgICB0b3JjaDo6VGVuc29yIHNvcnRlZF90b2tlbl9pZHMsCiAgICB0b3JjaDo6VGVuc29yIGV4cGVydHNfaWRzLAogICAgdG9yY2g6OlRlbnNvciBudW1fdG9rZW5zX3Bvc3RfcGFkLAogICAgdG9yY2g6OlRlbnNvciB0b2tlbl9jbnRzX2J1ZmZlciwKICAgIHRvcmNoOjpUZW5zb3IgY3Vtc3VtX2J1ZmZlcikgewogICAgaW50NjRfdCBwYWRkZWRfbnVtX2V4cGVydHMgPSAoKG51bV9leHBlcnRzICsgV0FSUF9TSVpFIC0gMSkgLyBXQVJQX1NJWkUpICogV0FSUF9TSVpFOwoKICAgIGludCBleHBlcnRzX3Blcl93YXJwID0gV0FSUF9TSVpFOwogICAgaW50IHRocmVhZHMgPSAxMDI0OwoKICAgIHRocmVhZHMgPSAoKHRocmVhZHMgKyBXQVJQX1NJWkUgLSAxKSAvIFdBUlBfU0laRSkgKiBXQVJQX1NJWkU7CiAgICBhdXRvIGFsaWduX2tlcm5lbCA9IG1vZV9hbGlnbl9ibG9ja19zaXplX2tlcm5lbDxpbnQzMl90PjsKCiAgICBzaXplX3QgbnVtX3dhcnBzID0gQ0VJTERJVihwYWRkZWRfbnVtX2V4cGVydHMsIGV4cGVydHNfcGVyX3dhcnApOwogICAgc2l6ZV90IHNoYXJlZF9tZW1fc2l6ZSA9IG51bV93YXJwcyAqIGV4cGVydHNfcGVyX3dhcnAgKiBzaXplb2YoaW50MzJfdCk7CgogICAgY3Vtc3VtX2J1ZmZlci56ZXJvXygpOwoKICAgIGFsaWduX2tlcm5lbDw8PDEsIHRocmVhZHMsIHNoYXJlZF9tZW1fc2l6ZT4+PigKICAgICAgICB0b3BrX2lkcy5kYXRhX3B0cjxpbnQzMl90PigpLAogICAgICAgIHNvcnRlZF90b2tlbl9pZHMuZGF0YV9wdHI8aW50MzJfdD4oKSwKICAgICAgICBleHBlcnRzX2lkcy5kYXRhX3B0cjxpbnQzMl90PigpLAogICAgICAgIG51bV90b2tlbnNfcG9zdF9wYWQuZGF0YV9wdHI8aW50MzJfdD4oKSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBwYWRkZWRfbnVtX2V4cGVydHMsCiAgICAgICAgZXhwZXJ0c19wZXJfd2FycCwKICAgICAgICBibG9ja19zaXplLAogICAgICAgIHRvcGtfaWRzLm51bWVsKCksCiAgICAgICAgY3Vtc3VtX2J1ZmZlci5kYXRhX3B0cjxpbnQzMl90PigpKTsKCiAgICBjb25zdCBpbnQgYmxvY2tfdGhyZWFkcyA9IHN0ZDo6bWluKDI1NiwgKGludCl0aHJlYWRzKTsKICAgIGNvbnN0IGludCBudW1fYmxvY2tzID0gKHRvcGtfaWRzLm51bWVsKCkgKyBibG9ja190aHJlYWRzIC0gMSkgLyBibG9ja190aHJlYWRzOwogICAgY29uc3QgaW50IG1heF9ibG9ja3MgPSA2NTUzNTsKICAgIGNvbnN0IGludCBhY3R1YWxfYmxvY2tzID0gc3RkOjptaW4obnVtX2Jsb2NrcywgbWF4X2Jsb2Nrcyk7CgogICAgYXV0byBzb3J0X2tlcm5lbCA9IGNvdW50X2FuZF9zb3J0X2V4cGVydF90b2tlbnNfa2VybmVsPGludDMyX3Q+OwogICAgc29ydF9rZXJuZWw8PDxhY3R1YWxfYmxvY2tzLCBibG9ja190aHJlYWRzLCAwPj4+KAogICAgICAgIHRvcGtfaWRzLmRhdGFfcHRyPGludDMyX3Q+KCksCiAgICAgICAgc29ydGVkX3Rva2VuX2lkcy5kYXRhX3B0cjxpbnQzMl90PigpLAogICAgICAgIGN1bXN1bV9idWZmZXIuZGF0YV9wdHI8aW50MzJfdD4oKSwKICAgICAgICB0b3BrX2lkcy5udW1lbCgpKTsKfQoiIiIKCgppbXBvcnQgb3MKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSdoaXBfbW9lJywKICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwKICAgIGZ1bmN0aW9ucz1bJ2hpcF9tb2UnXSwKICAgIHZlcmJvc2U9VHJ1ZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiXSwKKQptb2R1bGUyID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSdtb2VfYWxpZ25fYmxvY2tfc2l6ZScsCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVIyXSwKICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkMyXSwKICAgIGZ1bmN0aW9ucz1bJ21vZV9hbGlnbl9ibG9ja19zaXplJ10sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIl0sCikKCmNsYXNzIEV4cGVydChubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgZF9leHBlcnQ6IE9wdGlvbmFsW2ludF0gPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdIGlmIGRfZXhwZXJ0IGlzIE5vbmUgZWxzZSBkX2V4cGVydAoKICAgICAgICBzZWxmLldfZ2F0ZSA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKS5jdWRhKCkKICAgICAgICBzZWxmLldfdXAgPSBubi5MaW5lYXIoc2VsZi5kX2hpZGRlbiwgc2VsZi5kX2V4cGVydCwgYmlhcz1GYWxzZSkuY3VkYSgpCiAgICAgICAgc2VsZi5XX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kX2V4cGVydCwgc2VsZi5kX2hpZGRlbiwgYmlhcz1GYWxzZSkuY3VkYSgpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZ2F0ZSA9IHNlbGYuYWN0X2ZuKHNlbGYuV19nYXRlKHgpKQogICAgICAgIG91dCA9IHNlbGYuV19kb3duKGdhdGUgKiBzZWxmLldfdXAoeCkpCiAgICAgICAgcmV0dXJuIG91dAoKY2xhc3MgUGVuZ2N1b1NoYXJlZEV4cGVydChubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgZF9leHBlcnQ6IE9wdGlvbmFsW2ludF0gPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdIGlmIGRfZXhwZXJ0IGlzIE5vbmUgZWxzZSBkX2V4cGVydAoKICAgIGRlZiB1cGRhdGVfdyhzZWxmLCB3X2dhdGUsIHdfdXAsIHdfZG93bik6CiAgICAgICAgc2VsZi53X2dhdGUgPSB3X2dhdGUKICAgICAgICBzZWxmLndfdXAgPSB3X3VwCiAgICAgICAgc2VsZi53X2Rvd24gPSB3X2Rvd24KCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZ2F0ZSA9IHNlbGYuYWN0X2ZuKHggQCBzZWxmLndfZ2F0ZSkKICAgICAgICBvdXQgPSAoZ2F0ZSAqICh4IEAgc2VsZi53X3VwKSkgQCBzZWxmLndfZG93bgogICAgICAgIHJldHVybiBvdXQKCmNsYXNzIFBlbmdjdW9Nb0VHYXRlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnRvcF9rOiBpbnQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHNlbGYubnVtX2V4cGVydHM6IGludCA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCgogICAgZGVmIHVwZGF0ZV93KHNlbGYsIHdfZyk6CiAgICAgICAgc2VsZi53X2cgPSB3X2cKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICBsb2dpdHMgPSB4IEAgc2VsZi53X2cKICAgICAgICBzY29yZXMgPSBsb2dpdHMuc29mdG1heChkaW09LTEpCiAgICAgICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXNlbGYudG9wX2ssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgICAgICByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcwoKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplKAogICAgdG9wa19pZHM6IHRvcmNoLlRlbnNvciwgYmxvY2tfc2l6ZTogaW50LCBudW1fZXhwZXJ0czogaW50CikgLT4gVHVwbGVbdG9yY2guVGVuc29yLCB0b3JjaC5UZW5zb3IsIHRvcmNoLlRlbnNvcl06CiAgICBtYXhfbnVtX3Rva2Vuc19wYWRkZWQgPSB0b3BrX2lkcy5udW1lbCgpICsgbnVtX2V4cGVydHMgKiAoYmxvY2tfc2l6ZSAtIDEpCiAgICBzb3J0ZWRfaWRzID0gdG9yY2guZW1wdHkoCiAgICAgICAgKG1heF9udW1fdG9rZW5zX3BhZGRlZCwpLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPXRvcGtfaWRzLmRldmljZQogICAgKQogICAgc29ydGVkX2lkcy5maWxsXyh0b3BrX2lkcy5udW1lbCgpKQogICAgbWF4X251bV9tX2Jsb2NrcyA9IHRyaXRvbi5jZGl2KG1heF9udW1fdG9rZW5zX3BhZGRlZCwgYmxvY2tfc2l6ZSkKICAgIGV4cGVydF9pZHMgPSB0b3JjaC5lbXB0eSgKICAgICAgICAobWF4X251bV9tX2Jsb2NrcywpLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPXRvcGtfaWRzLmRldmljZQogICAgKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCgogICAgdG9rZW5fY250c19idWZmZXIgPSB0b3JjaC5lbXB0eSgKICAgICAgICAobnVtX2V4cGVydHMgKyAxKSAqIG51bV9leHBlcnRzLAogICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UsCiAgICApCiAgICBjdW1zdW1fYnVmZmVyID0gdG9yY2guZW1wdHkoCiAgICAgICAgbnVtX2V4cGVydHMgKyAxLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPXRvcGtfaWRzLmRldmljZQogICAgKQogICAgbW9kdWxlMi5tb2VfYWxpZ25fYmxvY2tfc2l6ZSh0b3BrX2lkcywgbnVtX2V4cGVydHMsIGJsb2NrX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF9pZHMsIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuX2NudHNfYnVmZmVyLCBjdW1zdW1fYnVmZmVyKQogCiAgICByZXR1cm4gc29ydGVkX2lkcywgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZAoKZGVmIGZ1c2VkX2V4cGVydHNfaW1wbCgKICAgIGhpZGRlbl9zdGF0ZXM6IHRvcmNoLlRlbnNvciwKICAgIHcxOiB0b3JjaC5UZW5zb3IsCiAgICB3MjogdG9yY2guVGVuc29yLAogICAgdG9wa193ZWlnaHRzOiB0b3JjaC5UZW5zb3IsCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgdzFfZ2F0ZV9wdHJfYXJyYXk6IHRvcmNoLlRlbnNvciwKICAgIHcxX3VwX3B0cl9hcnJheTogdG9yY2guVGVuc29yLAogICAgdzJfcHRyX2FycmF5OiB0b3JjaC5UZW5zb3IsCiAgICBpbnBsYWNlOiBib29sID0gRmFsc2UsCiAgICBhY3RpdmF0aW9uOiBzdHIgPSAic2lsdSIsCiAgICBhcHBseV9yb3V0ZXJfd2VpZ2h0X29uX2lucHV0OiBib29sID0gRmFsc2UsCiAgICB1c2VfZnA4X3c4YTg6IGJvb2wgPSBGYWxzZSwKICAgIHVzZV9pbnQ4X3c4YTg6IGJvb2wgPSBGYWxzZSwKICAgIHVzZV9pbnQ4X3c4YTE2OiBib29sID0gRmFsc2UsCiAgICB1c2VfaW50NF93NGExNjogYm9vbCA9IEZhbHNlLAogICAgcGVyX2NoYW5uZWxfcXVhbnQ6IGJvb2wgPSBGYWxzZSwKICAgIHcxX3NjYWxlOiBPcHRpb25hbFt0b3JjaC5UZW5zb3JdID0gTm9uZSwKICAgIHcyX3NjYWxlOiBPcHRpb25hbFt0b3JjaC5UZW5zb3JdID0gTm9uZSwKICAgIHcxX3pwOiBPcHRpb25hbFt0b3JjaC5UZW5zb3JdID0gTm9uZSwKICAgIHcyX3pwOiBPcHRpb25hbFt0b3JjaC5UZW5zb3JdID0gTm9uZSwKICAgIGExX3NjYWxlOiBPcHRpb25hbFt0b3JjaC5UZW5zb3JdID0gTm9uZSwKICAgIGEyX3NjYWxlOiBPcHRpb25hbFt0b3JjaC5UZW5zb3JdID0gTm9uZSwKICAgIGJsb2NrX3NoYXBlOiBPcHRpb25hbFtMaXN0W2ludF1dID0gTm9uZSwKICAgIG5vX2NvbWJpbmU6IGJvb2wgPSBGYWxzZSwKKToKICAgIHBhZGRlZF9zaXplID0gMAogICAgYXNzZXJ0IHRvcGtfd2VpZ2h0cy5zaGFwZSA9PSB0b3BrX2lkcy5zaGFwZSwgInRvcGsgc2hhcGUgbWlzbWF0Y2giCiAgICBhc3NlcnQgaGlkZGVuX3N0YXRlcy5pc19jb250aWd1b3VzKCksICJIaWRkZW5fc3RhdGVzIG11c3QgYmUgY29udGlndW91cyIKICAgIGFzc2VydCB3MS5pc19jb250aWd1b3VzKCksICJFeHBlcnQgd2VpZ2h0czEgbXVzdCBiZSBjb250aWd1b3VzIgogICAgYXNzZXJ0IHcyLmlzX2NvbnRpZ3VvdXMoKSwgIkV4cGVydCB3ZWlnaHRzMiBtdXN0IGJlIGNvbnRpZ3VvdXMiCiAgICBhc3NlcnQgaGlkZGVuX3N0YXRlcy5kdHlwZSBpbiBbdG9yY2guZmxvYXQzMiwgdG9yY2guZmxvYXQxNiwgdG9yY2guYmZsb2F0MTZdCgogICAgaGlkZGVuX2RpbSA9IGhpZGRlbl9zdGF0ZXMuc2hhcGVbLTFdCiAgICBoaWRkZW5fc3RhdGVzID0gaGlkZGVuX3N0YXRlcy52aWV3KC0xLCBoaWRkZW5fZGltKQogICAgCiAgICBudW1fdG9rZW5zLCBfID0gaGlkZGVuX3N0YXRlcy5zaGFwZQogICAgRSwgTiwgXyA9IHcxLnNoYXBlCiAgICBDSFVOS19TSVpFID0gNjQgKiAxMDI0CiAgICBNID0gbWluKG51bV90b2tlbnMsIENIVU5LX1NJWkUpCgogICAgY29uZmlnID0gewogICAgICAgICJCTE9DS19TSVpFX00iOiA2NCwKICAgICAgICAiQkxPQ0tfU0laRV9OIjogNjQsCiAgICAgICAgIkJMT0NLX1NJWkVfSyI6IDI1NiwKICAgICAgICAiR1JPVVBfU0laRV9NIjogMSwKICAgICAgICAibnVtX3dhcnBzIjogNCwKICAgICAgICAibnVtX3N0YWdlcyI6IDIsCiAgICB9CgogICAgY2FjaGUgPSB0b3JjaC5lbXB0eSgKICAgICAgICBNICogdG9wa19pZHMuc2hhcGVbMV0gKiBtYXgoTiwgdzIuc2hhcGVbMV0pLAogICAgICAgIGRldmljZT1oaWRkZW5fc3RhdGVzLmRldmljZSwKICAgICAgICBkdHlwZT1oaWRkZW5fc3RhdGVzLmR0eXBlLAogICAgKQoKICAgIGludGVybWVkaWF0ZV9jYWNoZTEgPSBjYWNoZVs6IE0gKiB0b3BrX2lkcy5zaGFwZVsxXSAqIE5dLnZpZXcoCiAgICAgICAgKE0sIHRvcGtfaWRzLnNoYXBlWzFdLCBOKSkKCiAgICBjYWNoZTFfbnVtID0gTSAqIHRvcGtfaWRzLnNoYXBlWzFdICogKE4gLy8gMikKICAgIGNhY2hlMTAgPSB0b3JjaC5lbXB0eSgKICAgICAgICBjYWNoZTFfbnVtLAogICAgICAgIGRldmljZT1oaWRkZW5fc3RhdGVzLmRldmljZSwKICAgICAgICBkdHlwZT1oaWRkZW5fc3RhdGVzLmR0eXBlLAogICAgKS52aWV3KE0sIHRvcGtfaWRzLnNoYXBlWzFdLCBOIC8vIDIpCiAgICBjYWNoZTExID0gdG9yY2guZW1wdHkoCiAgICAgICAgY2FjaGUxX251bSwKICAgICAgICBkZXZpY2U9aGlkZGVuX3N0YXRlcy5kZXZpY2UsCiAgICAgICAgZHR5cGU9aGlkZGVuX3N0YXRlcy5kdHlwZSwKICAgICkudmlldyhNLCB0b3BrX2lkcy5zaGFwZVsxXSwgTiAvLyAyKQogICAgCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUzID0gY2FjaGVbOiBNICogdG9wa19pZHMuc2hhcGVbMV0gKiB3Mi5zaGFwZVsxXV0udmlldygKICAgICAgICAoTSwgdG9wa19pZHMuc2hhcGVbMV0sIHcyLnNoYXBlWzFdKSkKCiAgICBjb21wdXRlX3R5cGUgPSB0bC5iZmxvYXQxNiBpZiBoaWRkZW5fc3RhdGVzLmR0eXBlID09IHRvcmNoLmJmbG9hdDE2IGVsc2UgdGwuZmxvYXQxNgogICAgb3V0X2hpZGRlbl9zdGF0ZXMgPSB0b3JjaC5lbXB0eV9saWtlKGhpZGRlbl9zdGF0ZXMpCgogICAgIyBzdGFydCA9IHRvcmNoLmN1ZGEuRXZlbnQoZW5hYmxlX3RpbWluZz1UcnVlKQogICAgIyBlbmQgPSB0b3JjaC5jdWRhLkV2ZW50KGVuYWJsZV90aW1pbmc9VHJ1ZSkKCiAgICBmb3IgY2h1bmsgaW4gcmFuZ2UoKG51bV90b2tlbnMgLy8gQ0hVTktfU0laRSkgKyAxKToKICAgICAgICBiZWdpbl9jaHVua19pZHgsIGVuZF9jaHVua19pZHggPSAoCiAgICAgICAgICAgIGNodW5rICogQ0hVTktfU0laRSwKICAgICAgICAgICAgbWluKChjaHVuayArIDEpICogQ0hVTktfU0laRSwgbnVtX3Rva2VucyksCiAgICAgICAgKQogICAgICAgIGN1cnJfaGlkZGVuX3N0YXRlcyA9IGhpZGRlbl9zdGF0ZXNbYmVnaW5fY2h1bmtfaWR4OmVuZF9jaHVua19pZHhdCiAgICAgICAgdG9rZW5zX2luX2NodW5rLCBfID0gY3Vycl9oaWRkZW5fc3RhdGVzLnNoYXBlCgogICAgICAgIGN1cnJfdG9wa19pZHMgPSB0b3BrX2lkc1tiZWdpbl9jaHVua19pZHg6ZW5kX2NodW5rX2lkeF0KICAgICAgICBjdXJyX3RvcGtfd2VpZ2h0cyA9IHRvcGtfd2VpZ2h0c1tiZWdpbl9jaHVua19pZHg6ZW5kX2NodW5rX2lkeF0KCiAgICAgICAgIyBzdGFydC5yZWNvcmQoKQoKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkID0gbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICAgICAgICAgIGN1cnJfdG9wa19pZHMsIGNvbmZpZ1siQkxPQ0tfU0laRV9NIl0sIEUpCgogICAgICAgICMgZW5kLnJlY29yZCgpCiAgICAgICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICAgICAjIHByaW50KGYiICAgbW9lX2FsaWduX2Jsb2NrX3NpemUgZHVyYXRpb24gOiB7c3RhcnQuZWxhcHNlZF90aW1lKGVuZCl9IHtjdXJyX3RvcGtfaWRzLnNoYXBlfSIpCgogICAgICAgICMgc3RhcnQucmVjb3JkKCkKICAgICAgICBtb2R1bGUuaGlwX21vZShjdXJyX2hpZGRlbl9zdGF0ZXMsIHcxX2dhdGVfcHRyX2FycmF5LCBjYWNoZTEwLCBjdXJyX3RvcGtfd2VpZ2h0cywKICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLCAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwKICAgICAgICAgICAgICAgICAgICAgICB0b3BrX2lkcy5zaGFwZVsxXSwgY3Vycl90b3BrX2lkcy5udW1lbCgpLCBGYWxzZSkKICAgICAgICBtb2R1bGUuaGlwX21vZShjdXJyX2hpZGRlbl9zdGF0ZXMsIHcxX3VwX3B0cl9hcnJheSwgY2FjaGUxMSwgY3Vycl90b3BrX3dlaWdodHMsCiAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkX3Rva2VuX2lkcywgIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQsCiAgICAgICAgICAgICAgICAgICAgICAgdG9wa19pZHMuc2hhcGVbMV0sIGN1cnJfdG9wa19pZHMubnVtZWwoKSwgRmFsc2UpCgogICAgICAgIGludGVybWVkaWF0ZV9jYWNoZTIgPSB0b3JjaC5ubi5mdW5jdGlvbmFsLnNpbHUoY2FjaGUxMCkgKiBjYWNoZTExCiAgICAgICAgCiAgICAgICAgIyBpbnRlcm1lZGlhdGVfY2FjaGUyID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGludGVybWVkaWF0ZV9jYWNoZTFbLi4uLCA6IE4gLy8gMl0pICogaW50ZXJtZWRpYXRlX2NhY2hlMVsuLi4sIE4gLy8gMiA6XQoKICAgICAgICBpbnRlcm1lZGlhdGVfY2FjaGUyID0gaW50ZXJtZWRpYXRlX2NhY2hlMi52aWV3KC0xLCBOIC8vIDIpCiAgICAgICAgbW9kdWxlLmhpcF9tb2UoaW50ZXJtZWRpYXRlX2NhY2hlMiwgdzJfcHRyX2FycmF5LCBpbnRlcm1lZGlhdGVfY2FjaGUzLCBjdXJyX3RvcGtfd2VpZ2h0cywKICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLAogICAgICAgICAgICAgICAgICAgICAgIDEsIGN1cnJfdG9wa19pZHMubnVtZWwoKSwgVHJ1ZSkKICAgICAgICAKICAgICAgICAjIGVuZC5yZWNvcmQoKQogICAgICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAgICAgIyBwcmludChmIiAgIGhpcF9tb2UgZHVyYXRpb24gOiB7c3RhcnQuZWxhcHNlZF90aW1lKGVuZCl9IHtjdXJyX3RvcGtfaWRzLnNoYXBlfSIpCgogICAgICAgIG91dF9oaWRkZW5fc3RhdGVzID0gaW50ZXJtZWRpYXRlX2NhY2hlMy5zdW0oZGltID0gMSkKCiAgICByZXR1cm4gb3V0X2hpZGRlbl9zdGF0ZXMKCmNsYXNzIFBlbmdjdW9FeHBlcnQobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX2hpZGRlbiwgZF9leHBlcnQsIG5fcm91dGVkX2V4cGVydHMpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5kX2hpZGRlbiA9IGRfaGlkZGVuCiAgICAgICAgc2VsZi5kX2V4cGVydCA9IGRfZXhwZXJ0CiAgICAgICAgCiAgICAgICAgRSA9IG5fcm91dGVkX2V4cGVydHMKICAgICAgICBOID0gZF9leHBlcnQKICAgICAgICBEID0gZF9oaWRkZW4KCiAgICAgICAgc2VsZi53MSA9IHRvcmNoLnplcm9zKChFLCBOICogMiwgRCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nbWV0YScpCiAgICAgICAgc2VsZi53MiA9IHRvcmNoLnplcm9zKChFLCBELCBOKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdtZXRhJykKICAgICAgICAKICAgICAgICBzZWxmLncxX2dhdGVfcHRyX2FycmF5ID0gdG9yY2guemVyb3MoRSwgZHR5cGU9dG9yY2guaW50NjQsIGRldmljZT0iY3VkYSIpCiAgICAgICAgc2VsZi53MV91cF9wdHJfYXJyYXkgPSB0b3JjaC56ZXJvcyhFLCBkdHlwZT10b3JjaC5pbnQ2NCwgZGV2aWNlPSJjdWRhIikKICAgICAgICBzZWxmLncyX3B0cl9hcnJheSA9IHRvcmNoLnplcm9zKEUsIGR0eXBlPXRvcmNoLmludDY0LCBkZXZpY2U9ImN1ZGEiKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgdG9wa193ZWlnaHRzLCB0b3BrX2lkcykgLT4gdG9yY2guVGVuc29yOgogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeCA9IHgudmlldygtMSwgeC5zaGFwZVstMV0pCiAgICAgICAgdG9wa193ZWlnaHRzID0gdG9wa193ZWlnaHRzLnZpZXcoLTEsIHRvcGtfd2VpZ2h0cy5zaGFwZVstMV0pCiAgICAgICAgdG9wa19pZHMgPSB0b3BrX2lkcy50byh0b3JjaC5pbnQzMikudmlldygtMSwgdG9wa19pZHMuc2hhcGVbLTFdKQoKICAgICAgICBvdXQgPSBmdXNlZF9leHBlcnRzX2ltcGwoeCwgc2VsZi53MSwgc2VsZi53MiwgdG9wa193ZWlnaHRzLCB0b3BrX2lkcywgc2VsZi53MV9nYXRlX3B0cl9hcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53MV91cF9wdHJfYXJyYXksIHNlbGYudzJfcHRyX2FycmF5KS52aWV3KCpvcmlnX3NoYXBlKQogICAgICAgIHJldHVybiBvdXQKCmNsYXNzIFBlbmdjdW9Nb0Uobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCgogICAgICAgIHNlbGYuZXhwZXJ0cyA9IFBlbmdjdW9FeHBlcnQoY29uZmlnWyJkX2hpZGRlbiJdLCBjb25maWdbImRfZXhwZXJ0Il0sIGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKQogICAgICAgIHNlbGYuZ2F0aW5nX25ldHdvcmsgPSBQZW5nY3VvTW9FR2F0ZShjb25maWcpCgogICAgICAgIHNoYXJlZF9leHBlcnRfZGltID0gY29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLnNoYXJlZF9leHBlcnQgPSBQZW5nY3VvU2hhcmVkRXhwZXJ0KGNvbmZpZz1jb25maWcsIGRfZXhwZXJ0PXNoYXJlZF9leHBlcnRfZGltKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNoYXJlZF9vdXRwdXQgPSBzZWxmLnNoYXJlZF9leHBlcnQoeCkKICAgICAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IHNlbGYuZ2F0aW5nX25ldHdvcmsoeCkKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltID0geC5zaGFwZQogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgcm91dGVkX291dHB1dCA9IHNlbGYuZXhwZXJ0cyh4LCBleHBlcnRfc2NvcmVzLCBleHBlcnRfaW5kaWNlcykKICAgICAgICBvdXRwdXQgPSBzaGFyZWRfb3V0cHV0ICsgcm91dGVkX291dHB1dAogICAgICAgIHJldHVybiBvdXRwdXQKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBudW1fZXhwZXJ0cyA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICBtb2UgPSBQZW5nY3VvTW9FKGNvbmZpZykKICAgIG1vZS5nYXRpbmdfbmV0d29yay51cGRhdGVfdyh3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10uVCkKICAgIAogICAgTiA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgdzEgPSBtb2UuZXhwZXJ0cy53MQogICAgdzIgPSBtb2UuZXhwZXJ0cy53MgogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgICMgZ2F0ZV9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddCiAgICAgICAgIyB1cF9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddCiAgICAgICAgIyBkb3duX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10KICAgICAgICAKICAgICAgICBtb2UuZXhwZXJ0cy53MV9nYXRlX3B0cl9hcnJheVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLmRhdGFfcHRyKCkKICAgICAgICBtb2UuZXhwZXJ0cy53MV91cF9wdHJfYXJyYXlbaV0gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpCiAgICAgICAgbW9lLmV4cGVydHMudzJfcHRyX2FycmF5W2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKQoKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LnVwZGF0ZV93KHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10sCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10sCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10pCgogICAgb3V0cHV0ID0gbW9lKGlucHV0X3RlbnNvcikKCiAgICByZXR1cm4gb3V0cHV0

Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0

Best evidence level for this revision: reported

JSON