Skip to content
KernelIndex
Search⌘K

submission 26034

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

mla_decode_v0.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mla-decode-26034?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
1.22s
#73 of 79
2025-05-22

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:5295b2de474149724026363bcb7058b45ce86075effd263e2f3c35ab46e651b8
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

mla_decode_v0.py1 lines
aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCgpjbGFzcyBSb1BFKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZF9tb2RlbDogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRfbW9kZWwgPSBkX21vZGVsCiAgICAgICAgdGhldGEgPSAxMDAwMCAqKiAoLXRvcmNoLmFyYW5nZSgwLCBkX21vZGVsLy8yLGR0eXBlPXRvcmNoLmJmbG9hdDE2KSAvIChkX21vZGVsLy8yKSkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcigidGhldGEiLCB0aGV0YSkKCiAgICBkZWYgcm90YXRlX2hhbGYoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgeDEsIHgyID0geC5jaHVuaygyLCBkaW09LTEpCiAgICAgICAgcmV0dXJuIHRvcmNoLmNhdCgoLXgyLCB4MSksIGRpbT0tMSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIHN0YXJ0X3BvczogaW50ID0gMCkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICAgICAgZF9tb2RlbCA9IHguc2l6ZSgtMSkKICAgICAgICBhc3NlcnQgZF9tb2RlbCA9PSBzZWxmLmRfbW9kZWwKICAgICAgICBzZXFfaWR4ID0gdG9yY2guYXJhbmdlKHN0YXJ0X3Bvcywgc3RhcnRfcG9zICsgc2VxX2xlbiwgZGV2aWNlPXguZGV2aWNlKQogICAgICAgIGlkeF90aGV0YSA9IHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHNlcV9pZHgsIHNlbGYudGhldGEpCiAgICAgICAgaWR4X3RoZXRhMiA9IHRvcmNoLmNhdChbaWR4X3RoZXRhLCBpZHhfdGhldGFdLCBkaW09LTEpCiAgICAgICAgY29zID0gaWR4X3RoZXRhMi5jb3MoKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICBzaW4gPSBpZHhfdGhldGEyLnNpbigpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHJldHVybiB4ICogY29zICsgc2VsZi5yb3RhdGVfaGFsZih4KSAqIHNpbgoKY2xhc3MgTXlSb1BFKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZF9tb2RlbDogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRfbW9kZWwgPSBkX21vZGVsCiAgICAgICAgdGhldGEgPSAxMDAwMCAqKiAoLXRvcmNoLmFyYW5nZSgwLCBkX21vZGVsLy8yLGR0eXBlPXRvcmNoLmJmbG9hdDE2KSAvIChkX21vZGVsLy8yKSkKICAgICAgICBzZWxmLnRoZXRhID0gdGhldGEuY3VkYSgpIAogICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIHN0YXJ0X3BvczogaW50ID0gMCkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICAgICAgZF9tb2RlbCA9IHguc2l6ZSgtMSkKICAgICAgICBhc3NlcnQgZF9tb2RlbCA9PSBzZWxmLmRfbW9kZWwKICAgICAgICBvbGRfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeCA9IHgucmVzaGFwZSgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICBzZXFfaWR4ID0gdG9yY2guYXJhbmdlKHN0YXJ0X3Bvcywgc3RhcnRfcG9zICsgc2VxX2xlbiwgZGV2aWNlPXguZGV2aWNlKSAjIChzZXFfbGVuLCkKICAgICAgICBpZHhfdGhldGEgPSB0b3JjaC5laW5zdW0oJ3MsZC0+c2QnLCBzZXFfaWR4LCBzZWxmLnRoZXRhKSAjIChzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIGlkeF90aGV0YSA9IGlkeF90aGV0YS52aWV3KC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICB4MSA9IHhbOiwgOiwgOmRfbW9kZWwvLzJdICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIHgyID0geFs6LCA6LCBkX21vZGVsLy8yOl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgbmV3X3gxID0geDEgKiBpZHhfdGhldGEuY29zKCkgLSB4MiAqIGlkeF90aGV0YS5zaW4oKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICBuZXdfeDIgPSB4MSAqIGlkeF90aGV0YS5zaW4oKSArIHgyICogaWR4X3RoZXRhLmNvcygpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIG5ld194ID0gdG9yY2guY2F0KFtuZXdfeDEsIG5ld194Ml0sIGRpbT0tMSkgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwpCiAgICAgICAgbmV3X3ggPSBuZXdfeC52aWV3KG9sZF9zaGFwZSkgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICByZXR1cm4gbmV3X3gKICAgICAgICAKICAgICAgICAKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgogICAgCkBkYXRhY2xhc3MKY2xhc3MgQ29uZmlnOgogICAgYmF0Y2hfc2l6ZTogaW50CiAgICBkaW06IGludAogICAgbl9oZWFkczogaW50CiAgICBxX2xvcmFfcmFuazogaW50IAogICAga3ZfbG9yYV9yYW5rOiBpbnQKICAgIHFrX25vcGVfaGVhZF9kaW06IGludAogICAgcWtfcm9wZV9oZWFkX2RpbTogaW50CiAgICB2X2hlYWRfZGltOiBpbnQKICAgIHNlcV9sZW46IGludAogICAgbWF4X3NlcV9sZW46IGludAogICAga3ZfY2FjaGVfc2hhcGU6IHR1cGxlCiAgICBRX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgUV9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIHdvX3dlaWdodDogdG9yY2guVGVuc29yCgpjbGFzcyBNTEEobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IENvbmZpZyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5kaW0gPSBjb25maWcuZGltCiAgICAgICAgc2VsZi5uX2hlYWRzID0gY29uZmlnLm5faGVhZHMKICAgICAgICBzZWxmLnFfbG9yYV9yYW5rID0gY29uZmlnLnFfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsgPSBjb25maWcua3ZfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5ub3BlX2hlYWRfZGltID0gY29uZmlnLnFrX25vcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0gPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYudl9oZWFkX2RpbSA9IGNvbmZpZy52X2hlYWRfZGltCiAgICAgICAgIyBEb3duLXByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLnFfbG9yYV9yYW5rLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKICAgICAgICBzZWxmLktWX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5rdl9sb3JhX3JhbmsgKyBzZWxmLnJvcGVfaGVhZF9kaW0sIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQoKICAgICAgICAjIFVwLXByb2plY3Rpb24gYW5kIHJvcGUgcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYucV9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKICAgICAgICBzZWxmLktWX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5rdl9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnZfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBSb1BFIG9uIGhhbGYgZW1iZWRkaW5ncwogICAgICAgIHNlbGYucV9yb3BlID0gTXlSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IE15Um9QRShzZWxmLnJvcGVfaGVhZF9kaW0pCgogICAgICAgICMgT3V0cHV0IHByb2plY3Rpb24KICAgICAgICBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwga3ZfY2FjaGU6IEtWQ2FjaGUpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICAjIHNlcV9sZW4gPSAxIGFsd2F5cyBoZXJlCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgbW9kZWxfZGltID0geC5zaXplKCkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICBTdGVwIDE6IEhhbmRsZSBkb3duLXByb2plY3Rpb24gKyBLViBjYWNoZSAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgcV9sb3JhID0gc2VsZi5RX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEgPSBzZWxmLktWX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEsIGt2X2xlbiA9IGt2X2NhY2hlKGt2X2xvcmEpCiAgICAgICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICBTdGVwIDI6IFVwLXByb2plY3QgYW5kIHByZXBhcmUgTm9QRSArIFJvUEUgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIyBIYW5kbGUgcXVlcmllcyBRIGZpcnN0CiAgICAgICAgcV9ub3BlX2FuZF9yb3BlID0gc2VsZi5RX3Byb2pfdXAocV9sb3JhKS52aWV3KAogICAgICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBxX25vcGUsIHFfcm9wZSA9IHRvcmNoLnNwbGl0KHFfbm9wZV9hbmRfcm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICAjIEhhbmRsZSBrZXlzIGFuZCB2YWx1ZXMgSy9WLiBWIGRvZXMgbm90IG5lZWQgUm9QRQogICAgICAgIGt2X25vcGUsIGtfcm9wZSA9IHRvcmNoLnNwbGl0KGt2X2xvcmEsIFtzZWxmLmt2X2xvcmFfcmFuaywgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIGt2X25vcGUgPSBzZWxmLktWX3Byb2pfdXAoa3Zfbm9wZSkudmlldygKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwga3ZfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkKICAgICAgICBrX25vcGUsIHYgPSB0b3JjaC5zcGxpdChrdl9ub3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnZfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgU3RlcCAzOiBIYW5kbGUgUm9QRSBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3IgcXVlcmllcyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIHFfcm9wZSA9IHFfcm9wZS5yZXNoYXBlKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgc2VxX2xlbiwgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfcm9wZSA9IHNlbGYucV9yb3BlKHFfcm9wZSwgc3RhcnRfcG9zPXF1ZXJ5X3BvcykKICAgICAgICBxX3JvcGUgPSBxX3JvcGUucmVzaGFwZShiYXRjaF9zaXplLCBzZXFfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBxID0gdG9yY2guY29uY2F0KFtxX25vcGUsIHFfcm9wZV0sIGRpbT0tMSkKCiAgICAgICAgIyBDb21wdXRlIFJvUEUgZm9yIGtleXMgYW5kIGNvbWJpbmUgd2l0aCBuby1Sb1BFIHBhcnQKICAgICAgICBrX3JvcGUgPSBrX3JvcGVbOiwgOiwgTm9uZSwgOl0KICAgICAgICBrX3JvcGUgPSBzZWxmLmtfcm9wZShrX3JvcGUpLmV4cGFuZCgtMSwtMSxzZWxmLm5faGVhZHMsLTEpCiAgICAgICAgayA9IHRvcmNoLmNvbmNhdChba19ub3BlLCBrX3JvcGVdLCBkaW09LTEpCiAgICAgICAgICAgICAgICAKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIE11bHRpLWhlYWQgQXR0ZW50aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxID0gcS5yZXNoYXBlKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgMSwgc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIGsgPSBrLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBrdl9sZW4sIHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkKICAgICAgICB2ID0gdi5yZXNoYXBlKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgLTEsIHNlbGYudl9oZWFkX2RpbSkKICAgICAgICBzY29yZXMgPSB0b3JjaC5tYXRtdWwocSwgay50cmFuc3Bvc2UoLTEsIC0yKSkgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIGF0dG4gPSBGLnNvZnRtYXgoc2NvcmVzLCBkaW09LTEpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHkgPSB0b3JjaC5tYXRtdWwoYXR0biwgdikudmlldyhiYXRjaF9zaXplLCAxLCAtMSkKICAgICAgICB5ID0gc2VsZi53byh5KQoKICAgICAgICByZXR1cm4geSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKZGVmIHByaW50X2NvbmZpZyhjb25maWc6IENvbmZpZyk6CiAgICBmb3Iga2V5IGluIGNvbmZpZy5fX2RpY3RfXzoKICAgICAgICBpZiBpc2luc3RhbmNlKGNvbmZpZy5fX2RpY3RfX1trZXldLCB0b3JjaC5UZW5zb3IpOgogICAgICAgICAgICBwcmludChmIntrZXl9OiB7Y29uZmlnLl9fZGljdF9fW2tleV0uc2hhcGV9IikKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludChmIntrZXl9OiB7Y29uZmlnLl9fZGljdF9fW2tleV19IikKCmRlZiBtbGFfZGVjb2RlKAogICAgY29uZmlnOiBDb25maWcsCiAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICBrdl9jYWNoZTogS1ZDYWNoZSwKKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIEtWQ2FjaGVdOgogICAgIyBkaW06ICAgICAgICAgICAgICAgIDcxNjgKICAgICMgbl9oZWFkczogICAgICAgICAgICAgMTI4CiAgICAjIHFfbG9yYV9yYW5rOiAgICAgICAgMTUzNgogICAgIyBrdl9sb3JhX3Jhbms6ICAgICAgIDUxMgogICAgIyBxa19ub3BlX2hlYWRfZGltOiAgIDEyOAogICAgIyBxa19yb3BlX2hlYWRfZGltOiAgIDY0CiAgICAjIHZfaGVhZF9kaW06ICAgICAgICAxMjgKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgICgxNTM2LCA3MTY4KQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKCgxMjggKyA2NCkgKiAxMjgsIDE1MzYpID0gKDI0NTc2LCAxNTM2KQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKDUxMiArIDY0LCA3MTY4KSA9ICg1NzYsIDcxNjgpCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKDEyOCArIDEyOCkgKiAxMjgsIDUxMikgPSAoMzI3NjgsIDUxMikKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgICg3MTY4LCAxMjggKiAxMjgpID0gKDcxNjgsIDE2Mzg0KQogICAgIyBrdl9jYWNoZV9zaGFwZTogICAgIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKHFfbG9yYV9yYW5rLCBkaW0pCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMsIHFfbG9yYV9yYW5rKQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0sIGRpbSkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pICogbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKGRpbSwgdl9oZWFkX2RpbSAqIG5faGVhZHMpCiAgICAjIHg6ICAgICAgICAgICAgICAgIChiYXRjaHNpemUsIDEsIGRpbSkKICAgIHFfbG9yYSA9IHggQCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBxX2xvcmFfcmFuaykKICAgIGt2X2xvcmEgPSB4IEAgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKICAgICMgIyBzdG9yZSBrdl9sb3JhIGluIGNhY2hlIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgY2FjaGUKICAgIGt2X2xvcmEsIGt2X2xlbiA9IGt2X2NhY2hlKGt2X2xvcmEpICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMSAjCiAgICAKICAgIHFfbm9wZV9hbmRfcm9wZSA9IHFfbG9yYSBAIGNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pICogbl9oZWFkcykKICAgIHFfbm9wZV9hbmRfcm9wZSA9IHFfbm9wZV9hbmRfcm9wZS52aWV3KGNvbmZpZy5iYXRjaF9zaXplLCAxLCBjb25maWcubl9oZWFkcywgY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgcV9ub3BlLCBxX3JvcGUgPSB0b3JjaC5zcGxpdChxX25vcGVfYW5kX3JvcGUsIFtjb25maWcucWtfbm9wZV9oZWFkX2RpbSwgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW1dLCBkaW09LTEpIAogICAgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltKQogICAgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKQoKICAgIGt2X25vcGUsIGtfcm9wZSA9IHRvcmNoLnNwbGl0KGt2X2xvcmEsIFtjb25maWcua3ZfbG9yYV9yYW5rLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwga3ZfbG9yYV9yYW5rKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKICAgIGt2X25vcGUgPSBrdl9ub3BlIEAgY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBuX2hlYWRzKQogICAga3Zfbm9wZSA9IGt2X25vcGUudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwga3ZfbGVuLCBjb25maWcubl9oZWFkcywgY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcudl9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKQogICAga19ub3BlLCB2ID0gdG9yY2guc3BsaXQoa3Zfbm9wZSwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcudl9oZWFkX2RpbV0sIGRpbT0tMSkKICAgICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHZfaGVhZF9kaW0pCiAgICAKICAgIHJvcGVfbW9kdWxlID0gUm9QRShjb25maWcucWtfcm9wZV9oZWFkX2RpbSkKICAgICMgcV9yb3BlID0gCiAgICAKICAgIAogICAgcHJpbnRfY29uZmlnKGNvbmZpZykKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCk6CiAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQogICAgcHJpbnRfY29uZmlnKGNvbmZpZykKICAgICMgbWxhX2RlY29kZSgKICAgICMgICAgIGNvbmZpZywKICAgICMgICAgIHgsCiAgICAjICAgICBrdl9jYWNoZSwKICAgICMgKQogICAgCiAgICBtb2RlbCA9IE1MQShjb25maWcpCiAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval91cF93ZWlnaHQpCiAgICBtb2RlbC5LVl9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0KQogICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgbW9kZWwud28ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy53b193ZWlnaHQpCgogICAgb3V0cHV0LCBrdl9jYWNoZSA9IG1vZGVsKHgsIGt2X2NhY2hlKQogICAgcmV0dXJuIG91dHB1dCwga3ZfY2FjaGUKICAgIAoKZGVmIGdlbmVyYXRlX2lucHV0KGJhdGNoc2l6ZSwgZGltLCBkcSwgcHJlZmlsbCwgc2VlZCk6CiAgICAjIFNpemVzIGRlcml2ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2RlZXBzZWVrLWFpL0RlZXBTZWVrLVYzL2Jsb2IvbWFpbi9pbmZlcmVuY2UvbW9kZWwucHkKICAgIGdlbiA9IHRvcmNoLkdlbmVyYXRvcihkZXZpY2U9J2N1ZGEnKQogICAgZ2VuLm1hbnVhbF9zZWVkKHNlZWQpCiAgICAKICAgICMgR2VuZXJhdGUgd2VpZ2h0cyBmb3IgbGluZWFyIGxheWVycwogICAgUV9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKGRxLCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQgPSB0b3JjaC5yYW5kbigoNTEyICsgNjQsIGRpbSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgUV9wcm9qX3VwX3dlaWdodCA9IHRvcmNoLnJhbmRuKCgoMTI4ICsgNjQpICogMTI4LCBkcSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgS1ZfcHJval91cF93ZWlnaHQgPSB0b3JjaC5yYW5kbigoKDEyOCArIDEyOCkgKiAxMjgsIDUxMiksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgd29fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKGRpbSwgMTI4ICogMTI4KSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCgogICAgY29uZmlnID0gQ29uZmlnKAogICAgICAgIGJhdGNoX3NpemU9YmF0Y2hzaXplLAogICAgICAgIGRpbT1kaW0sCiAgICAgICAgcV9sb3JhX3Jhbms9ZHEsCiAgICAgICAgbl9oZWFkcz0xMjgsCiAgICAgICAga3ZfbG9yYV9yYW5rPTUxMiwKICAgICAgICBxa19ub3BlX2hlYWRfZGltPTEyOCwKICAgICAgICBxa19yb3BlX2hlYWRfZGltPTY0LAogICAgICAgIHZfaGVhZF9kaW09MTI4LAogICAgICAgIHNlcV9sZW49MSwKICAgICAgICBtYXhfc2VxX2xlbj04MTkyLAogICAgICAgIGt2X2NhY2hlX3NoYXBlPShiYXRjaHNpemUsIDgxOTIsIDUxMiArIDY0KSwKICAgICAgICBRX3Byb2pfZG93bl93ZWlnaHQ9UV9wcm9qX2Rvd25fd2VpZ2h0LAogICAgICAgIFFfcHJval91cF93ZWlnaHQ9UV9wcm9qX3VwX3dlaWdodCwKICAgICAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0PUtWX3Byb2pfZG93bl93ZWlnaHQsCiAgICAgICAgS1ZfcHJval91cF93ZWlnaHQ9S1ZfcHJval91cF93ZWlnaHQsCiAgICAgICAgd29fd2VpZ2h0PXdvX3dlaWdodCwKICAgICkKICAgIHggPSB0b3JjaC5yYW5kbigoY29uZmlnLmJhdGNoX3NpemUsIDEsIGNvbmZpZy5kaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIAogICAgIyBQcmUtZmlsbCBLViBjYWNoZQogICAga3ZfY2FjaGUgPSBLVkNhY2hlKChjb25maWcuYmF0Y2hfc2l6ZSwgY29uZmlnLm1heF9zZXFfbGVuLCBjb25maWcua3ZfbG9yYV9yYW5rICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pKS50bygnY3VkYScpCiAgICBwcmVfZmlsbGVkX2NhY2hlID0gdG9yY2gucmFuZG4oKGNvbmZpZy5iYXRjaF9zaXplLCBwcmVmaWxsLCBjb25maWcua3ZfbG9yYV9yYW5rICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICBrdl9jYWNoZShwcmVfZmlsbGVkX2NhY2hlKQoKICAgIHJldHVybiBjb25maWcsIHgsIGt2X2NhY2hlCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICMgRXhhbXBsZSB1c2FnZQogICAgYmF0Y2hzaXplID0gMTI4CiAgICBkaW0gPSA3MTY4CiAgICBkcSA9IDE1MzYKICAgIHByZWZpbGwgPSA0MDk2CiAgICBzZWVkID0gOTgxNwogICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGdlbmVyYXRlX2lucHV0KGJhdGNoc2l6ZSwgZGltLCBkcSwgcHJlZmlsbCwgc2VlZCkKICAgIGN1c3RvbV9rZXJuZWwoKGNvbmZpZywgeCwga3ZfY2FjaGUpKQ==

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

- aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKCmNsYXNzIFJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCJ0aGV0YSIsIHRoZXRhKQoKICAgIGRlZiByb3RhdGVfaGFsZihzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4MSwgeDIgPSB4LmNodW5rKDIsIGRpbT0tMSkKICAgICAgICByZXR1cm4gdG9yY2guY2F0KCgteDIsIHgxKSwgZGltPS0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgc2VsZi50aGV0YSkKICAgICAgICBpZHhfdGhldGEyID0gdG9yY2guY2F0KFtpZHhfdGhldGEsIGlkeF90aGV0YV0sIGRpbT0tMSkKICAgICAgICBjb3MgPSBpZHhfdGhldGEyLmNvcygpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNpbiA9IGlkeF90aGV0YTIuc2luKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgcmV0dXJuIHggKiBjb3MgKyBzZWxmLnJvdGF0ZV9oYWxmKHgpICogc2luCgoKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgogICAgCkBkYXRhY2xhc3MKY2xhc3MgQ29uZmlnOgogICAgYmF0Y2hfc2l6ZTogaW50CiAgICBkaW06IGludAogICAgbl9oZWFkczogaW50CiAgICBxX2xvcmFfcmFuazogaW50IAogICAga3ZfbG9yYV9yYW5rOiBpbnQKICAgIHFrX25vcGVfaGVhZF9kaW06IGludAogICAgcWtfcm9wZV9oZWFkX2RpbTogaW50CiAgICB2X2hlYWRfZGltOiBpbnQKICAgIHNlcV9sZW46IGludAogICAgbWF4X3NlcV9sZW46IGludAogICAga3ZfY2FjaGVfc2hhcGU6IHR1cGxlCiAgICBRX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgUV9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIHdvX3dlaWdodDogdG9yY2guVGVuc29yCgpjbGFzcyBNTEEobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IENvbmZpZyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5kaW0gPSBjb25maWcuZGltCiAgICAgICAgc2VsZi5uX2hlYWRzID0gY29uZmlnLm5faGVhZHMKICAgICAgICBzZWxmLnFfbG9yYV9yYW5rID0gY29uZmlnLnFfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsgPSBjb25maWcua3ZfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5ub3BlX2hlYWRfZGltID0gY29uZmlnLnFrX25vcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0gPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYudl9oZWFkX2RpbSA9IGNvbmZpZy52X2hlYWRfZGltCiAgICAgICAgIyBEb3duLXByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLnFfbG9yYV9yYW5rLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKICAgICAgICBzZWxmLktWX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5rdl9sb3JhX3JhbmsgKyBzZWxmLnJvcGVfaGVhZF9kaW0sIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQoKICAgICAgICAjIFVwLXByb2plY3Rpb24gYW5kIHJvcGUgcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYucV9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKICAgICAgICBzZWxmLktWX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5rdl9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnZfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBSb1BFIG9uIGhhbGYgZW1iZWRkaW5ncwogICAgICAgIHNlbGYucV9yb3BlID0gUm9QRShzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgc2VsZi5rX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKCiAgICAgICAgIyBPdXRwdXQgcHJvamVjdGlvbgogICAgICAgIHNlbGYud28gPSBubi5MaW5lYXIoc2VsZi52X2hlYWRfZGltICogc2VsZi5uX2hlYWRzLCBzZWxmLmRpbSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgogICAgICAgICMgc2VxX2xlbiA9IDEgYWx3YXlzIGhlcmUKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgIFN0ZXAgMTogSGFuZGxlIGRvd24tcHJvamVjdGlvbiArIEtWIGNhY2hlICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxX2xvcmEgPSBzZWxmLlFfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSA9IHNlbGYuS1ZfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSwga3ZfbGVuID0ga3ZfY2FjaGUoa3ZfbG9yYSkKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgIFN0ZXAgMjogVXAtcHJvamVjdCBhbmQgcHJlcGFyZSBOb1BFICsgUm9QRSAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIEhhbmRsZSBxdWVyaWVzIFEgZmlyc3QKICAgICAgICBxX25vcGVfYW5kX3JvcGUgPSBzZWxmLlFfcHJval91cChxX2xvcmEpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMgSGFuZGxlIGtleXMgYW5kIHZhbHVlcyBLL1YuIFYgZG9lcyBub3QgbmVlZCBSb1BFCiAgICAgICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAga3Zfbm9wZSA9IHNlbGYuS1ZfcHJval91cChrdl9ub3BlKS52aWV3KAogICAgICAgICAgICBiYXRjaF9zaXplLCBrdl9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKQogICAgICAgIGtfbm9wZSwgdiA9IHRvcmNoLnNwbGl0KGt2X25vcGUsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYudl9oZWFkX2RpbV0sIGRpbT0tMSkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgICBTdGVwIDM6IEhhbmRsZSBSb1BFIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICMgQ29tcHV0ZSBSb1BFIGZvciBxdWVyaWVzIGFuZCBjb21iaW5lIHdpdGggbm8tUm9QRSBwYXJ0CiAgICAgICAgcV9yb3BlID0gcV9yb3BlLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBzZXFfbGVuLCBzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgcV9yb3BlID0gc2VsZi5xX3JvcGUocV9yb3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKQogICAgICAgIHFfcm9wZSA9IHFfcm9wZS5yZXNoYXBlKGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHEgPSB0b3JjaC5jb25jYXQoW3Ffbm9wZSwgcV9yb3BlXSwgZGltPS0xKQoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3Iga2V5cyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIGtfcm9wZSA9IGtfcm9wZVs6LCA6LCBOb25lLCA6XQogICAgICAgIGtfcm9wZSA9IHNlbGYua19yb3BlKGtfcm9wZSkuZXhwYW5kKC0xLC0xLHNlbGYubl9oZWFkcywtMSkKICAgICAgICBrID0gdG9yY2guY29uY2F0KFtrX25vcGUsIGtfcm9wZV0sIGRpbT0tMSkKICAgICAgICAgICAgICAgIAogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgTXVsdGktaGVhZCBBdHRlbnRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgIHEgPSBxLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCAxLCBzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgayA9IGsucmVzaGFwZShiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIGt2X2xlbiwgc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIHYgPSB2LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCAtMSwgc2VsZi52X2hlYWRfZGltKQogICAgICAgIHNjb3JlcyA9IHRvcmNoLm1hdG11bChxLCBrLnRyYW5zcG9zZSgtMSwgLTIpKSAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgYXR0biA9IEYuc29mdG1heChzY29yZXMsIGRpbT0tMSkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgeSA9IHRvcmNoLm1hdG11bChhdHRuLCB2KS52aWV3KGJhdGNoX3NpemUsIDEsIC0xKQogICAgICAgIHkgPSBzZWxmLndvKHkpCgogICAgICAgIHJldHVybiB5LCBrdl9jYWNoZS5nZXRfZGF0YSgpCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBkYXRhCiAgICBtb2RlbCA9IE1MQShjb25maWcpCiAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval91cF93ZWlnaHQpCiAgICBtb2RlbC5LVl9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0KQogICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgbW9kZWwud28ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy53b193ZWlnaHQpCgogICAgb3V0cHV0LCBrdl9jYWNoZSA9IG1vZGVsKHgsIGt2X2NhY2hlKQogICAgcmV0dXJuIG91dHB1dCwga3ZfY2FjaGU=
No newline at end of file
+ aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCgpjbGFzcyBSb1BFKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZF9tb2RlbDogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRfbW9kZWwgPSBkX21vZGVsCiAgICAgICAgdGhldGEgPSAxMDAwMCAqKiAoLXRvcmNoLmFyYW5nZSgwLCBkX21vZGVsLy8yLGR0eXBlPXRvcmNoLmJmbG9hdDE2KSAvIChkX21vZGVsLy8yKSkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcigidGhldGEiLCB0aGV0YSkKCiAgICBkZWYgcm90YXRlX2hhbGYoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgeDEsIHgyID0geC5jaHVuaygyLCBkaW09LTEpCiAgICAgICAgcmV0dXJuIHRvcmNoLmNhdCgoLXgyLCB4MSksIGRpbT0tMSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIHN0YXJ0X3BvczogaW50ID0gMCkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICAgICAgZF9tb2RlbCA9IHguc2l6ZSgtMSkKICAgICAgICBhc3NlcnQgZF9tb2RlbCA9PSBzZWxmLmRfbW9kZWwKICAgICAgICBzZXFfaWR4ID0gdG9yY2guYXJhbmdlKHN0YXJ0X3Bvcywgc3RhcnRfcG9zICsgc2VxX2xlbiwgZGV2aWNlPXguZGV2aWNlKQogICAgICAgIGlkeF90aGV0YSA9IHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHNlcV9pZHgsIHNlbGYudGhldGEpCiAgICAgICAgaWR4X3RoZXRhMiA9IHRvcmNoLmNhdChbaWR4X3RoZXRhLCBpZHhfdGhldGFdLCBkaW09LTEpCiAgICAgICAgY29zID0gaWR4X3RoZXRhMi5jb3MoKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICBzaW4gPSBpZHhfdGhldGEyLnNpbigpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHJldHVybiB4ICogY29zICsgc2VsZi5yb3RhdGVfaGFsZih4KSAqIHNpbgoKY2xhc3MgTXlSb1BFKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZF9tb2RlbDogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRfbW9kZWwgPSBkX21vZGVsCiAgICAgICAgdGhldGEgPSAxMDAwMCAqKiAoLXRvcmNoLmFyYW5nZSgwLCBkX21vZGVsLy8yLGR0eXBlPXRvcmNoLmJmbG9hdDE2KSAvIChkX21vZGVsLy8yKSkKICAgICAgICBzZWxmLnRoZXRhID0gdGhldGEuY3VkYSgpIAogICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIHN0YXJ0X3BvczogaW50ID0gMCkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICAgICAgZF9tb2RlbCA9IHguc2l6ZSgtMSkKICAgICAgICBhc3NlcnQgZF9tb2RlbCA9PSBzZWxmLmRfbW9kZWwKICAgICAgICBvbGRfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeCA9IHgucmVzaGFwZSgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICBzZXFfaWR4ID0gdG9yY2guYXJhbmdlKHN0YXJ0X3Bvcywgc3RhcnRfcG9zICsgc2VxX2xlbiwgZGV2aWNlPXguZGV2aWNlKSAjIChzZXFfbGVuLCkKICAgICAgICBpZHhfdGhldGEgPSB0b3JjaC5laW5zdW0oJ3MsZC0+c2QnLCBzZXFfaWR4LCBzZWxmLnRoZXRhKSAjIChzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIGlkeF90aGV0YSA9IGlkeF90aGV0YS52aWV3KC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICB4MSA9IHhbOiwgOiwgOmRfbW9kZWwvLzJdICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIHgyID0geFs6LCA6LCBkX21vZGVsLy8yOl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgbmV3X3gxID0geDEgKiBpZHhfdGhldGEuY29zKCkgLSB4MiAqIGlkeF90aGV0YS5zaW4oKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICBuZXdfeDIgPSB4MSAqIGlkeF90aGV0YS5zaW4oKSArIHgyICogaWR4X3RoZXRhLmNvcygpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIG5ld194ID0gdG9yY2guY2F0KFtuZXdfeDEsIG5ld194Ml0sIGRpbT0tMSkgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwpCiAgICAgICAgbmV3X3ggPSBuZXdfeC52aWV3KG9sZF9zaGFwZSkgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICByZXR1cm4gbmV3X3gKICAgICAgICAKICAgICAgICAKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgogICAgCkBkYXRhY2xhc3MKY2xhc3MgQ29uZmlnOgogICAgYmF0Y2hfc2l6ZTogaW50CiAgICBkaW06IGludAogICAgbl9oZWFkczogaW50CiAgICBxX2xvcmFfcmFuazogaW50IAogICAga3ZfbG9yYV9yYW5rOiBpbnQKICAgIHFrX25vcGVfaGVhZF9kaW06IGludAogICAgcWtfcm9wZV9oZWFkX2RpbTogaW50CiAgICB2X2hlYWRfZGltOiBpbnQKICAgIHNlcV9sZW46IGludAogICAgbWF4X3NlcV9sZW46IGludAogICAga3ZfY2FjaGVfc2hhcGU6IHR1cGxlCiAgICBRX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgUV9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIHdvX3dlaWdodDogdG9yY2guVGVuc29yCgpjbGFzcyBNTEEobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IENvbmZpZyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5kaW0gPSBjb25maWcuZGltCiAgICAgICAgc2VsZi5uX2hlYWRzID0gY29uZmlnLm5faGVhZHMKICAgICAgICBzZWxmLnFfbG9yYV9yYW5rID0gY29uZmlnLnFfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsgPSBjb25maWcua3ZfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5ub3BlX2hlYWRfZGltID0gY29uZmlnLnFrX25vcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0gPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYudl9oZWFkX2RpbSA9IGNvbmZpZy52X2hlYWRfZGltCiAgICAgICAgIyBEb3duLXByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLnFfbG9yYV9yYW5rLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKICAgICAgICBzZWxmLktWX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5rdl9sb3JhX3JhbmsgKyBzZWxmLnJvcGVfaGVhZF9kaW0sIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQoKICAgICAgICAjIFVwLXByb2plY3Rpb24gYW5kIHJvcGUgcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYucV9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKICAgICAgICBzZWxmLktWX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5rdl9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnZfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBSb1BFIG9uIGhhbGYgZW1iZWRkaW5ncwogICAgICAgIHNlbGYucV9yb3BlID0gTXlSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IE15Um9QRShzZWxmLnJvcGVfaGVhZF9kaW0pCgogICAgICAgICMgT3V0cHV0IHByb2plY3Rpb24KICAgICAgICBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwga3ZfY2FjaGU6IEtWQ2FjaGUpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICAjIHNlcV9sZW4gPSAxIGFsd2F5cyBoZXJlCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgbW9kZWxfZGltID0geC5zaXplKCkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICBTdGVwIDE6IEhhbmRsZSBkb3duLXByb2plY3Rpb24gKyBLViBjYWNoZSAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgcV9sb3JhID0gc2VsZi5RX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEgPSBzZWxmLktWX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEsIGt2X2xlbiA9IGt2X2NhY2hlKGt2X2xvcmEpCiAgICAgICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICBTdGVwIDI6IFVwLXByb2plY3QgYW5kIHByZXBhcmUgTm9QRSArIFJvUEUgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIyBIYW5kbGUgcXVlcmllcyBRIGZpcnN0CiAgICAgICAgcV9ub3BlX2FuZF9yb3BlID0gc2VsZi5RX3Byb2pfdXAocV9sb3JhKS52aWV3KAogICAgICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBxX25vcGUsIHFfcm9wZSA9IHRvcmNoLnNwbGl0KHFfbm9wZV9hbmRfcm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICAjIEhhbmRsZSBrZXlzIGFuZCB2YWx1ZXMgSy9WLiBWIGRvZXMgbm90IG5lZWQgUm9QRQogICAgICAgIGt2X25vcGUsIGtfcm9wZSA9IHRvcmNoLnNwbGl0KGt2X2xvcmEsIFtzZWxmLmt2X2xvcmFfcmFuaywgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIGt2X25vcGUgPSBzZWxmLktWX3Byb2pfdXAoa3Zfbm9wZSkudmlldygKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwga3ZfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkKICAgICAgICBrX25vcGUsIHYgPSB0b3JjaC5zcGxpdChrdl9ub3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnZfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgU3RlcCAzOiBIYW5kbGUgUm9QRSBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3IgcXVlcmllcyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIHFfcm9wZSA9IHFfcm9wZS5yZXNoYXBlKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgc2VxX2xlbiwgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfcm9wZSA9IHNlbGYucV9yb3BlKHFfcm9wZSwgc3RhcnRfcG9zPXF1ZXJ5X3BvcykKICAgICAgICBxX3JvcGUgPSBxX3JvcGUucmVzaGFwZShiYXRjaF9zaXplLCBzZXFfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBxID0gdG9yY2guY29uY2F0KFtxX25vcGUsIHFfcm9wZV0sIGRpbT0tMSkKCiAgICAgICAgIyBDb21wdXRlIFJvUEUgZm9yIGtleXMgYW5kIGNvbWJpbmUgd2l0aCBuby1Sb1BFIHBhcnQKICAgICAgICBrX3JvcGUgPSBrX3JvcGVbOiwgOiwgTm9uZSwgOl0KICAgICAgICBrX3JvcGUgPSBzZWxmLmtfcm9wZShrX3JvcGUpLmV4cGFuZCgtMSwtMSxzZWxmLm5faGVhZHMsLTEpCiAgICAgICAgayA9IHRvcmNoLmNvbmNhdChba19ub3BlLCBrX3JvcGVdLCBkaW09LTEpCiAgICAgICAgICAgICAgICAKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIE11bHRpLWhlYWQgQXR0ZW50aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxID0gcS5yZXNoYXBlKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgMSwgc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIGsgPSBrLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBrdl9sZW4sIHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkKICAgICAgICB2ID0gdi5yZXNoYXBlKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgLTEsIHNlbGYudl9oZWFkX2RpbSkKICAgICAgICBzY29yZXMgPSB0b3JjaC5tYXRtdWwocSwgay50cmFuc3Bvc2UoLTEsIC0yKSkgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIGF0dG4gPSBGLnNvZnRtYXgoc2NvcmVzLCBkaW09LTEpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHkgPSB0b3JjaC5tYXRtdWwoYXR0biwgdikudmlldyhiYXRjaF9zaXplLCAxLCAtMSkKICAgICAgICB5ID0gc2VsZi53byh5KQoKICAgICAgICByZXR1cm4geSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKZGVmIHByaW50X2NvbmZpZyhjb25maWc6IENvbmZpZyk6CiAgICBmb3Iga2V5IGluIGNvbmZpZy5fX2RpY3RfXzoKICAgICAgICBpZiBpc2luc3RhbmNlKGNvbmZpZy5fX2RpY3RfX1trZXldLCB0b3JjaC5UZW5zb3IpOgogICAgICAgICAgICBwcmludChmIntrZXl9OiB7Y29uZmlnLl9fZGljdF9fW2tleV0uc2hhcGV9IikKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludChmIntrZXl9OiB7Y29uZmlnLl9fZGljdF9fW2tleV19IikKCmRlZiBtbGFfZGVjb2RlKAogICAgY29uZmlnOiBDb25maWcsCiAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICBrdl9jYWNoZTogS1ZDYWNoZSwKKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIEtWQ2FjaGVdOgogICAgIyBkaW06ICAgICAgICAgICAgICAgIDcxNjgKICAgICMgbl9oZWFkczogICAgICAgICAgICAgMTI4CiAgICAjIHFfbG9yYV9yYW5rOiAgICAgICAgMTUzNgogICAgIyBrdl9sb3JhX3Jhbms6ICAgICAgIDUxMgogICAgIyBxa19ub3BlX2hlYWRfZGltOiAgIDEyOAogICAgIyBxa19yb3BlX2hlYWRfZGltOiAgIDY0CiAgICAjIHZfaGVhZF9kaW06ICAgICAgICAxMjgKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgICgxNTM2LCA3MTY4KQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKCgxMjggKyA2NCkgKiAxMjgsIDE1MzYpID0gKDI0NTc2LCAxNTM2KQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKDUxMiArIDY0LCA3MTY4KSA9ICg1NzYsIDcxNjgpCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKDEyOCArIDEyOCkgKiAxMjgsIDUxMikgPSAoMzI3NjgsIDUxMikKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgICg3MTY4LCAxMjggKiAxMjgpID0gKDcxNjgsIDE2Mzg0KQogICAgIyBrdl9jYWNoZV9zaGFwZTogICAgIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKHFfbG9yYV9yYW5rLCBkaW0pCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMsIHFfbG9yYV9yYW5rKQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0sIGRpbSkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pICogbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKGRpbSwgdl9oZWFkX2RpbSAqIG5faGVhZHMpCiAgICAjIHg6ICAgICAgICAgICAgICAgIChiYXRjaHNpemUsIDEsIGRpbSkKICAgIHFfbG9yYSA9IHggQCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBxX2xvcmFfcmFuaykKICAgIGt2X2xvcmEgPSB4IEAgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKICAgICMgIyBzdG9yZSBrdl9sb3JhIGluIGNhY2hlIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgY2FjaGUKICAgIGt2X2xvcmEsIGt2X2xlbiA9IGt2X2NhY2hlKGt2X2xvcmEpICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMSAjCiAgICAKICAgIHFfbm9wZV9hbmRfcm9wZSA9IHFfbG9yYSBAIGNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pICogbl9oZWFkcykKICAgIHFfbm9wZV9hbmRfcm9wZSA9IHFfbm9wZV9hbmRfcm9wZS52aWV3KGNvbmZpZy5iYXRjaF9zaXplLCAxLCBjb25maWcubl9oZWFkcywgY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgcV9ub3BlLCBxX3JvcGUgPSB0b3JjaC5zcGxpdChxX25vcGVfYW5kX3JvcGUsIFtjb25maWcucWtfbm9wZV9oZWFkX2RpbSwgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW1dLCBkaW09LTEpIAogICAgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltKQogICAgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKQoKICAgIGt2X25vcGUsIGtfcm9wZSA9IHRvcmNoLnNwbGl0KGt2X2xvcmEsIFtjb25maWcua3ZfbG9yYV9yYW5rLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwga3ZfbG9yYV9yYW5rKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKICAgIGt2X25vcGUgPSBrdl9ub3BlIEAgY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBuX2hlYWRzKQogICAga3Zfbm9wZSA9IGt2X25vcGUudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwga3ZfbGVuLCBjb25maWcubl9oZWFkcywgY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcudl9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKQogICAga19ub3BlLCB2ID0gdG9yY2guc3BsaXQoa3Zfbm9wZSwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcudl9oZWFkX2RpbV0sIGRpbT0tMSkKICAgICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHZfaGVhZF9kaW0pCiAgICAKICAgIHJvcGVfbW9kdWxlID0gUm9QRShjb25maWcucWtfcm9wZV9oZWFkX2RpbSkKICAgICMgcV9yb3BlID0gCiAgICAKICAgIAogICAgcHJpbnRfY29uZmlnKGNvbmZpZykKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCk6CiAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQogICAgcHJpbnRfY29uZmlnKGNvbmZpZykKICAgICMgbWxhX2RlY29kZSgKICAgICMgICAgIGNvbmZpZywKICAgICMgICAgIHgsCiAgICAjICAgICBrdl9jYWNoZSwKICAgICMgKQogICAgCiAgICBtb2RlbCA9IE1MQShjb25maWcpCiAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval91cF93ZWlnaHQpCiAgICBtb2RlbC5LVl9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0KQogICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgbW9kZWwud28ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy53b193ZWlnaHQpCgogICAgb3V0cHV0LCBrdl9jYWNoZSA9IG1vZGVsKHgsIGt2X2NhY2hlKQogICAgcmV0dXJuIG91dHB1dCwga3ZfY2FjaGUKICAgIAoKZGVmIGdlbmVyYXRlX2lucHV0KGJhdGNoc2l6ZSwgZGltLCBkcSwgcHJlZmlsbCwgc2VlZCk6CiAgICAjIFNpemVzIGRlcml2ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2RlZXBzZWVrLWFpL0RlZXBTZWVrLVYzL2Jsb2IvbWFpbi9pbmZlcmVuY2UvbW9kZWwucHkKICAgIGdlbiA9IHRvcmNoLkdlbmVyYXRvcihkZXZpY2U9J2N1ZGEnKQogICAgZ2VuLm1hbnVhbF9zZWVkKHNlZWQpCiAgICAKICAgICMgR2VuZXJhdGUgd2VpZ2h0cyBmb3IgbGluZWFyIGxheWVycwogICAgUV9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKGRxLCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQgPSB0b3JjaC5yYW5kbigoNTEyICsgNjQsIGRpbSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgUV9wcm9qX3VwX3dlaWdodCA9IHRvcmNoLnJhbmRuKCgoMTI4ICsgNjQpICogMTI4LCBkcSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgS1ZfcHJval91cF93ZWlnaHQgPSB0b3JjaC5yYW5kbigoKDEyOCArIDEyOCkgKiAxMjgsIDUxMiksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgd29fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKGRpbSwgMTI4ICogMTI4KSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCgogICAgY29uZmlnID0gQ29uZmlnKAogICAgICAgIGJhdGNoX3NpemU9YmF0Y2hzaXplLAogICAgICAgIGRpbT1kaW0sCiAgICAgICAgcV9sb3JhX3Jhbms9ZHEsCiAgICAgICAgbl9oZWFkcz0xMjgsCiAgICAgICAga3ZfbG9yYV9yYW5rPTUxMiwKICAgICAgICBxa19ub3BlX2hlYWRfZGltPTEyOCwKICAgICAgICBxa19yb3BlX2hlYWRfZGltPTY0LAogICAgICAgIHZfaGVhZF9kaW09MTI4LAogICAgICAgIHNlcV9sZW49MSwKICAgICAgICBtYXhfc2VxX2xlbj04MTkyLAogICAgICAgIGt2X2NhY2hlX3NoYXBlPShiYXRjaHNpemUsIDgxOTIsIDUxMiArIDY0KSwKICAgICAgICBRX3Byb2pfZG93bl93ZWlnaHQ9UV9wcm9qX2Rvd25fd2VpZ2h0LAogICAgICAgIFFfcHJval91cF93ZWlnaHQ9UV9wcm9qX3VwX3dlaWdodCwKICAgICAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0PUtWX3Byb2pfZG93bl93ZWlnaHQsCiAgICAgICAgS1ZfcHJval91cF93ZWlnaHQ9S1ZfcHJval91cF93ZWlnaHQsCiAgICAgICAgd29fd2VpZ2h0PXdvX3dlaWdodCwKICAgICkKICAgIHggPSB0b3JjaC5yYW5kbigoY29uZmlnLmJhdGNoX3NpemUsIDEsIGNvbmZpZy5kaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIAogICAgIyBQcmUtZmlsbCBLViBjYWNoZQogICAga3ZfY2FjaGUgPSBLVkNhY2hlKChjb25maWcuYmF0Y2hfc2l6ZSwgY29uZmlnLm1heF9zZXFfbGVuLCBjb25maWcua3ZfbG9yYV9yYW5rICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pKS50bygnY3VkYScpCiAgICBwcmVfZmlsbGVkX2NhY2hlID0gdG9yY2gucmFuZG4oKGNvbmZpZy5iYXRjaF9zaXplLCBwcmVmaWxsLCBjb25maWcua3ZfbG9yYV9yYW5rICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICBrdl9jYWNoZShwcmVfZmlsbGVkX2NhY2hlKQoKICAgIHJldHVybiBjb25maWcsIHgsIGt2X2NhY2hlCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICMgRXhhbXBsZSB1c2FnZQogICAgYmF0Y2hzaXplID0gMTI4CiAgICBkaW0gPSA3MTY4CiAgICBkcSA9IDE1MzYKICAgIHByZWZpbGwgPSA0MDk2CiAgICBzZWVkID0gOTgxNwogICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGdlbmVyYXRlX2lucHV0KGJhdGNoc2l6ZSwgZGltLCBkcSwgcHJlZmlsbCwgc2VlZCkKICAgIGN1c3RvbV9rZXJuZWwoKGNvbmZpZywgeCwga3ZfY2FjaGUpKQ==
No newline at end of file

Best evidence level for this revision: reported

JSON