submission 26088
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-26088?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesbf16
Benchmark evidence
1 measurement across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:a62188966b43a6bf1ff15bef8f32ff9f3e43f66118b858ae069eba586d36f758
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
mla_decode_v0.py1 lines
aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCmltcG9ydCB0aW1lCmNsYXNzIFJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCJ0aGV0YSIsIHRoZXRhKQoKICAgIGRlZiByb3RhdGVfaGFsZihzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4MSwgeDIgPSB4LmNodW5rKDIsIGRpbT0tMSkKICAgICAgICByZXR1cm4gdG9yY2guY2F0KCgteDIsIHgxKSwgZGltPS0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgc2VsZi50aGV0YSkKICAgICAgICBpZHhfdGhldGEyID0gdG9yY2guY2F0KFtpZHhfdGhldGEsIGlkeF90aGV0YV0sIGRpbT0tMSkKICAgICAgICBjb3MgPSBpZHhfdGhldGEyLmNvcygpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNpbiA9IGlkeF90aGV0YTIuc2luKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgcmV0dXJuIHggKiBjb3MgKyBzZWxmLnJvdGF0ZV9oYWxmKHgpICogc2luCgpjbGFzcyBNeVJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYudGhldGEgPSB0aGV0YS5jdWRhKCkgCiAgICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIG9sZF9zaGFwZSA9IHguc2hhcGUKICAgICAgICB4ID0geC5yZXNoYXBlKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpICMgKHNlcV9sZW4sKQogICAgICAgIGlkeF90aGV0YSA9IHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHNlcV9pZHgsIHNlbGYudGhldGEpICMgKHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgaWR4X3RoZXRhID0gaWR4X3RoZXRhLnZpZXcoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIHgxID0geFs6LCA6LCA6ZF9tb2RlbC8vMl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgeDIgPSB4WzosIDosIGRfbW9kZWwvLzI6XSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICBuZXdfeDEgPSB4MSAqIGlkeF90aGV0YS5jb3MoKSAtIHgyICogaWR4X3RoZXRhLnNpbigpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIG5ld194MiA9IHgxICogaWR4X3RoZXRhLnNpbigpICsgeDIgKiBpZHhfdGhldGEuY29zKCkgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgbmV3X3ggPSB0b3JjaC5jYXQoW25ld194MSwgbmV3X3gyXSwgZGltPS0xKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICBuZXdfeCA9IG5ld194LnZpZXcob2xkX3NoYXBlKSAjIChiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsKQogICAgICAgIHJldHVybiBuZXdfeAogICAgICAgIAogICAgICAgIApjbGFzcyBLVkNhY2hlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga3ZfY2FjaGVfc2hhcGU6IHR1cGxlKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdkYXRhJywgdG9yY2guemVyb3Moa3ZfY2FjaGVfc2hhcGUsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KSkKICAgICAgICBzZWxmLnNlcV9sZW4gPSAwCiAgICAgICAgc2VsZi56ZXJvKCkKCiAgICBkZWYgemVybyhzZWxmKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGF0YS56ZXJvXygpCiAgICAKICAgIGRlZiBnZXRfZGF0YShzZWxmKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGNfa3Y6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGFzc2VydCBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSkgPD0gc2VsZi5kYXRhLnNpemUoMSksICJLViBDYWNoZSBFeGNlZWRlZCIKCiAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhLnRvKGNfa3YuZHR5cGUpCiAgICAgICAgc2VsZi5kYXRhWwogICAgICAgICAgICA6LCBzZWxmLnNlcV9sZW4gOiBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSksIDoKICAgICAgICBdID0gY19rdgogICAgICAgIHNlbGYuc2VxX2xlbiArPSBjX2t2LnNpemUoMSkKCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVs6LCA6c2VsZi5zZXFfbGVuXSwgc2VsZi5zZXFfbGVuCiAgICAKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAjIERvd24tcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYucV9sb3JhX3JhbmssIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNlbGYuS1ZfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLmt2X2xvcmFfcmFuayArIHNlbGYucm9wZV9oZWFkX2RpbSwgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCgogICAgICAgICMgVXAtcHJvamVjdGlvbiBhbmQgcm9wZSBwcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5xX2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBNeVJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHNlbGYua19yb3BlID0gTXlSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKCiAgICAgICAgIyBPdXRwdXQgcHJvamVjdGlvbgogICAgICAgIHNlbGYud28gPSBubi5MaW5lYXIoc2VsZi52X2hlYWRfZGltICogc2VsZi5uX2hlYWRzLCBzZWxmLmRpbSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgogICAgICAgICMgc2VxX2xlbiA9IDEgYWx3YXlzIGhlcmUKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgIFN0ZXAgMTogSGFuZGxlIGRvd24tcHJvamVjdGlvbiArIEtWIGNhY2hlICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxX2xvcmEgPSBzZWxmLlFfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSA9IHNlbGYuS1ZfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSwga3ZfbGVuID0ga3ZfY2FjaGUoa3ZfbG9yYSkKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgIFN0ZXAgMjogVXAtcHJvamVjdCBhbmQgcHJlcGFyZSBOb1BFICsgUm9QRSAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIEhhbmRsZSBxdWVyaWVzIFEgZmlyc3QKICAgICAgICBxX25vcGVfYW5kX3JvcGUgPSBzZWxmLlFfcHJval91cChxX2xvcmEpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMgSGFuZGxlIGtleXMgYW5kIHZhbHVlcyBLL1YuIFYgZG9lcyBub3QgbmVlZCBSb1BFCiAgICAgICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAga3Zfbm9wZSA9IHNlbGYuS1ZfcHJval91cChrdl9ub3BlKS52aWV3KAogICAgICAgICAgICBiYXRjaF9zaXplLCBrdl9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKQogICAgICAgIGtfbm9wZSwgdiA9IHRvcmNoLnNwbGl0KGt2X25vcGUsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYudl9oZWFkX2RpbV0sIGRpbT0tMSkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgICBTdGVwIDM6IEhhbmRsZSBSb1BFIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICMgQ29tcHV0ZSBSb1BFIGZvciBxdWVyaWVzIGFuZCBjb21iaW5lIHdpdGggbm8tUm9QRSBwYXJ0CiAgICAgICAgcV9yb3BlID0gcV9yb3BlLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBzZXFfbGVuLCBzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgcV9yb3BlID0gc2VsZi5xX3JvcGUocV9yb3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKQogICAgICAgIHFfcm9wZSA9IHFfcm9wZS5yZXNoYXBlKGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHEgPSB0b3JjaC5jb25jYXQoW3Ffbm9wZSwgcV9yb3BlXSwgZGltPS0xKQoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3Iga2V5cyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIGtfcm9wZSA9IGtfcm9wZVs6LCA6LCBOb25lLCA6XQogICAgICAgIGtfcm9wZSA9IHNlbGYua19yb3BlKGtfcm9wZSkuZXhwYW5kKC0xLC0xLHNlbGYubl9oZWFkcywtMSkKICAgICAgICBrID0gdG9yY2guY29uY2F0KFtrX25vcGUsIGtfcm9wZV0sIGRpbT0tMSkKICAgICAgICAgICAgICAgIAogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgTXVsdGktaGVhZCBBdHRlbnRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgIHEgPSBxLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCAxLCBzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgayA9IGsucmVzaGFwZShiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIGt2X2xlbiwgc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIHYgPSB2LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCAtMSwgc2VsZi52X2hlYWRfZGltKQogICAgICAgIHNjb3JlcyA9IHRvcmNoLm1hdG11bChxLCBrLnRyYW5zcG9zZSgtMSwgLTIpKSAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgYXR0biA9IEYuc29mdG1heChzY29yZXMsIGRpbT0tMSkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgeSA9IHRvcmNoLm1hdG11bChhdHRuLCB2KS52aWV3KGJhdGNoX3NpemUsIDEsIC0xKQogICAgICAgIHkgPSBzZWxmLndvKHkpCgogICAgICAgIHJldHVybiB5LCBrdl9jYWNoZS5nZXRfZGF0YSgpCgpkZWYgcHJpbnRfY29uZmlnKGNvbmZpZzogQ29uZmlnKToKICAgIGZvciBrZXkgaW4gY29uZmlnLl9fZGljdF9fOgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29uZmlnLl9fZGljdF9fW2tleV0sIHRvcmNoLlRlbnNvcik6CiAgICAgICAgICAgIHByaW50KGYie2tleX06IHtjb25maWcuX19kaWN0X19ba2V5XS5zaGFwZX0iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KGYie2tleX06IHtjb25maWcuX19kaWN0X19ba2V5XX0iKQoKCmRlZiBmYXN0X21sYV9kZWNvZGUoCiAgICBjb25maWc6IENvbmZpZywKICAgIHg6IHRvcmNoLlRlbnNvciwKICAgIGt2X2NhY2hlOiBLVkNhY2hlLAopIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgS1ZDYWNoZV06CiAgICAjIGRpbTogICAgICAgICAgICAgICAgNzE2OAogICAgIyBuX2hlYWRzOiAgICAgICAgICAgICAxMjgKICAgICMgcV9sb3JhX3Jhbms6ICAgICAgICAxNTM2CiAgICAjIGt2X2xvcmFfcmFuazogICAgICAgNTEyCiAgICAjIHFrX25vcGVfaGVhZF9kaW06ICAgMTI4CiAgICAjIHFrX3JvcGVfaGVhZF9kaW06ICAgNjQKICAgICMgdl9oZWFkX2RpbTogICAgICAgIDEyOAogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKDE1MzYsIDcxNjgpCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKDEyOCArIDY0KSAqIDEyOCwgMTUzNikgPSAoMjQ1NzYsIDE1MzYpCiAgICAjIEtWX3Byb2pfZG93bl93ZWlnaHQ6ICAoNTEyICsgNjQsIDcxNjgpID0gKDU3NiwgNzE2OCkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgoMTI4ICsgMTI4KSAqIDEyOCwgNTEyKSA9ICgzMjc2OCwgNTEyKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKDcxNjgsIDEyOCAqIDEyOCkgPSAoNzE2OCwgMTYzODQpCiAgICAjIGt2X2NhY2hlX3NoYXBlOiAgICAgKGJhdGNoc2l6ZSwgbWF4X3NlcV9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAjIFFfcHJval9kb3duX3dlaWdodDogICAocV9sb3JhX3JhbmssIGRpbSkKICAgICMgUV9wcm9qX3VwX3dlaWdodDogICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pICogbl9oZWFkcywgcV9sb3JhX3JhbmspCiAgICAjIEtWX3Byb2pfZG93bl93ZWlnaHQ6ICAoa3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSwgZGltKQogICAgIyBLVl9wcm9qX3VwX3dlaWdodDogICAgKChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAjIHdvX3dlaWdodDogICAgICAgICAgICAoZGltLCB2X2hlYWRfZGltICogbl9oZWFkcykKICAgICMgeDogICAgICAgICAgICAgICAgKGJhdGNoc2l6ZSwgMSwgZGltKQogICAgcV9sb3JhID0geCBAIGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIHFfbG9yYV9yYW5rKQogICAgY3VyX2t2X2xvcmEgPSB4IEAgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCmRlZiBtbGFfZGVjb2RlKAogICAgY29uZmlnOiBDb25maWcsCiAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICBrdl9jYWNoZTogS1ZDYWNoZSwKKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIEtWQ2FjaGVdOgogICAgIyBkaW06ICAgICAgICAgICAgICAgIDcxNjgKICAgICMgbl9oZWFkczogICAgICAgICAgICAgMTI4CiAgICAjIHFfbG9yYV9yYW5rOiAgICAgICAgMTUzNgogICAgIyBrdl9sb3JhX3Jhbms6ICAgICAgIDUxMgogICAgIyBxa19ub3BlX2hlYWRfZGltOiAgIDEyOAogICAgIyBxa19yb3BlX2hlYWRfZGltOiAgIDY0CiAgICAjIHZfaGVhZF9kaW06ICAgICAgICAxMjgKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgICgxNTM2LCA3MTY4KQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKCgxMjggKyA2NCkgKiAxMjgsIDE1MzYpID0gKDI0NTc2LCAxNTM2KQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKDUxMiArIDY0LCA3MTY4KSA9ICg1NzYsIDcxNjgpCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKDEyOCArIDEyOCkgKiAxMjgsIDUxMikgPSAoMzI3NjgsIDUxMikKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgICg3MTY4LCAxMjggKiAxMjgpID0gKDcxNjgsIDE2Mzg0KQogICAgIyBrdl9jYWNoZV9zaGFwZTogICAgIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKHFfbG9yYV9yYW5rLCBkaW0pCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMsIHFfbG9yYV9yYW5rKQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0sIGRpbSkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pICogbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKGRpbSwgdl9oZWFkX2RpbSAqIG5faGVhZHMpCiAgICAjIHg6ICAgICAgICAgICAgICAgIChiYXRjaHNpemUsIDEsIGRpbSkKICAgIHFfbG9yYSA9IHggQCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBxX2xvcmFfcmFuaykKICAgIGN1cl9rdl9sb3JhID0geCBAIGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICAjIHN0b3JlIGt2X2xvcmEgaW4gY2FjaGUgYW5kIHJldHVybiB0aGUgdXBkYXRlZCBjYWNoZQogICAga3ZfY2FjaGVfZGF0YSA9IGt2X2NhY2hlLmdldF9kYXRhKCkgIyAoYmF0Y2hzaXplLCBtYXhfc2VxX2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGt2X2NhY2hlLnNlcV9sZW4gKz0gMSAKICAgICMgVE9ETzogISEhd3JvbmcgaW1wbGVtZW50YXRpb24hISEsIGN1cl9rdl9sb3JhJ3MgcWtfcm9wZV9oZWFkX2RpbSBzaG91bGQgY2FsbCByb3BlIGJlZm9yZSBzdG9yaW5nLiBEbyBpbiBwbGFjZSBSb1BSCiAgICBrdl9jYWNoZV9kYXRhWzosIGt2X2NhY2hlLnNlcV9sZW4gLSAxLCA6XSA9IGN1cl9rdl9sb3JhLnNxdWVlemUoMSkgCiAgICBrdl9sZW4gPSBrdl9jYWNoZS5zZXFfbGVuICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAga3ZfY2FjaGVfZGF0YSA9IGt2X2NhY2hlLmdldF9kYXRhKCkgIyAoYmF0Y2hzaXplLCBtYXhfc2VxX2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGt2X2xvcmEgPSBrdl9jYWNoZV9kYXRhWzosIDprdl9jYWNoZS5zZXFfbGVuLCA6XSAjIChiYXRjaHNpemUsIGt2X2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkgOiAobWF4X3NlcV9sZW4gKiAoa3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSksIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0gLDEpCiAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxICMKICAgIAogICAgcV9ub3BlX2FuZF9yb3BlID0gcV9sb3JhIEAgY29uZmlnLlFfcHJval91cF93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkgKiBuX2hlYWRzKQogICAgcV9ub3BlX2FuZF9yb3BlID0gcV9ub3BlX2FuZF9yb3BlLnZpZXcoY29uZmlnLmJhdGNoX3NpemUsIDEsIGNvbmZpZy5uX2hlYWRzLCBjb25maWcucWtfbm9wZV9oZWFkX2RpbSArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBxX25vcGUsIHFfcm9wZSA9IHRvcmNoLnNwbGl0KHFfbm9wZV9hbmRfcm9wZSwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgCiAgICAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0pIDogCiAgICAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pCgogICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW2NvbmZpZy5rdl9sb3JhX3JhbmssIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwgZGltPS0xKSAKICAgICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmspCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAga3Zfbm9wZSA9IGt2X25vcGUgQCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuVCAjIChiYXRjaHNpemUsIGt2X2xlbiwgKHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKSAqIG5faGVhZHMpCiAgICBrdl9ub3BlID0ga3Zfbm9wZS52aWV3KGNvbmZpZy5iYXRjaF9zaXplLCBrdl9sZW4sIGNvbmZpZy5uX2hlYWRzLCBjb25maWcucWtfbm9wZV9oZWFkX2RpbSArIGNvbmZpZy52X2hlYWRfZGltKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pCiAgICBrX25vcGUsIHYgPSB0b3JjaC5zcGxpdChrdl9ub3BlLCBbY29uZmlnLnFrX25vcGVfaGVhZF9kaW0sIGNvbmZpZy52X2hlYWRfZGltXSwgZGltPS0xKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0pCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwgbl9oZWFkcywgdl9oZWFkX2RpbSkKICAgIAogICAgcm9wZV9tb2R1bGUgPSBNeVJvUEUoY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pCiAgICAjIHByZXBhcmUgcQogICAgcV9yb3BlID0gcV9yb3BlLnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5uX2hlYWRzLCAxLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBxa19yb3BlX2hlYWRfZGltKQogICAgcV9yb3BlID0gcm9wZV9tb2R1bGUocV9yb3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKSAjIChiYXRjaHNpemUsIG5faGVhZHMsIDEsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBxX3JvcGUgPSBxX3JvcGUucmVzaGFwZShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLm5faGVhZHMsIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBxID0gdG9yY2guY29uY2F0KFtxX25vcGUsIHFfcm9wZV0sIGRpbT0tMSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgIyBwcmVwYXJlIGsKICAgICMgISEhd3JvbmcgaW1wbGVtZW50YXRpb24hISEKICAgIGtfcm9wZSA9IGtfcm9wZVs6LCA6LCBOb25lLCA6XSAjISEhd3JvbmcgaW1wbGVtZW50YXRpb24hISEgKGJhdGNoc2l6ZSwga3ZfbGVuLCAxLCBxa19yb3BlX2hlYWRfZGltKQogICAga19yb3BlID0gcm9wZV9tb2R1bGUoa19yb3BlKS5leHBhbmQoLTEsLTEsY29uZmlnLm5faGVhZHMsLTEpICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKQogICAgayA9IHRvcmNoLmNvbmNhdChba19ub3BlLCBrX3JvcGVdLCBkaW09LTEpICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgIyAhISFjb3JyZWN0IGltcGxlbWVudGF0aW9uISEhCiAgICAjIGtfcm9wZSA9IGtfcm9wZVs6LCA6LCBOb25lLCA6XSAjIChiYXRjaHNpemUsIGt2X2xlbiwgMSwgcWtfcm9wZV9oZWFkX2RpbSkKICAgICMga19yb3BlID0ga19yb3BlLmV4cGFuZCgtMSwgLTEsIGNvbmZpZy5uX2hlYWRzLCAtMSkgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAjIGsgPSB0b3JjaC5jb25jYXQoW2tfbm9wZSwga19yb3BlXSwgZGltPS0xKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKCiAgICAjICEhIXdyb25nIGltcGxlbWVudGF0aW9uISEhCiAgICBxID0gcS5yZXNoYXBlKGNvbmZpZy5iYXRjaF9zaXplLCBjb25maWcubl9oZWFkcywgMSwgY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGsgPSBrLnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5uX2hlYWRzLCBrdl9sZW4sIGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbGVuLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIHYgPSB2LnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5uX2hlYWRzLCAtMSwgY29uZmlnLnZfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbGVuLCB2X2hlYWRfZGltKQogICAgc2NvcmUgPSB0b3JjaC5tYXRtdWwocSwgay50cmFuc3Bvc2UoLTEsIC0yKSkgLyBtYXRoLnNxcnQoY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBrdl9sZW4pCiAgICBhdHRuID0gRi5zb2Z0bWF4KHNjb3JlLCBkaW09LTEpLnRvKHRvcmNoLmJmbG9hdDE2KSAjIChiYXRjaHNpemUsIG5faGVhZHMsIDEsIGt2X2xlbikKICAgIHkgPSB0b3JjaC5tYXRtdWwoYXR0biwgdikudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwgMSwgLTEpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcyAqIHZfaGVhZF9kaW0pCiAgICB5ID0geSBAIGNvbmZpZy53b193ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIGRpbSkKICAgIHJldHVybiB5LCBrdl9jYWNoZS5nZXRfZGF0YSgpCgogICAgIyAhISFjb3JyZWN0IGltcGxlbWVudGF0aW9uISEhCiAgICAKICAgICMgcHJpbnRfY29uZmlnKGNvbmZpZykKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCk6CiAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQogICAgIyBwcmludF9jb25maWcoY29uZmlnKQogICAgb3V0ID0gbWxhX2RlY29kZSgKICAgICAgICBjb25maWcsCiAgICAgICAgeCwKICAgICAgICBrdl9jYWNoZSwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHRpbWUuc2xlZXAoMC44KQogICAgcmV0dXJuIG91dAogICAgCiAgICAjIG1vZGVsID0gTUxBKGNvbmZpZykKICAgICMgbW9kZWwuUV9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQpCiAgICAjIG1vZGVsLlFfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval91cF93ZWlnaHQpCiAgICAjIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQpCiAgICAjIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodCkKICAgICMgbW9kZWwud28ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy53b193ZWlnaHQpCgogICAgIyBvdXRwdXQsIGt2X2NhY2hlID0gbW9kZWwoeCwga3ZfY2FjaGUpCiAgICAjIHJldHVybiBvdXRwdXQsIGt2X2NhY2hlCiAgICAKCmRlZiBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpOgogICAgIyBTaXplcyBkZXJpdmVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9kZWVwc2Vlay1haS9EZWVwU2Vlay1WMy9ibG9iL21haW4vaW5mZXJlbmNlL21vZGVsLnB5CiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQogICAgCiAgICAjIEdlbmVyYXRlIHdlaWdodHMgZm9yIGxpbmVhciBsYXllcnMKICAgIFFfcHJval9kb3duX3dlaWdodCA9IHRvcmNoLnJhbmRuKChkcSwgZGltKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKDUxMiArIDY0LCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIFFfcHJval91cF93ZWlnaHQgPSB0b3JjaC5yYW5kbigoKDEyOCArIDY0KSAqIDEyOCwgZHEpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gdG9yY2gucmFuZG4oKCgxMjggKyAxMjgpICogMTI4LCA1MTIpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIHdvX3dlaWdodCA9IHRvcmNoLnJhbmRuKChkaW0sIDEyOCAqIDEyOCksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQoKICAgIGNvbmZpZyA9IENvbmZpZygKICAgICAgICBiYXRjaF9zaXplPWJhdGNoc2l6ZSwKICAgICAgICBkaW09ZGltLAogICAgICAgIHFfbG9yYV9yYW5rPWRxLAogICAgICAgIG5faGVhZHM9MTI4LAogICAgICAgIGt2X2xvcmFfcmFuaz01MTIsCiAgICAgICAgcWtfbm9wZV9oZWFkX2RpbT0xMjgsCiAgICAgICAgcWtfcm9wZV9oZWFkX2RpbT02NCwKICAgICAgICB2X2hlYWRfZGltPTEyOCwKICAgICAgICBzZXFfbGVuPTEsCiAgICAgICAgbWF4X3NlcV9sZW49ODE5MiwKICAgICAgICBrdl9jYWNoZV9zaGFwZT0oYmF0Y2hzaXplLCA4MTkyLCA1MTIgKyA2NCksCiAgICAgICAgUV9wcm9qX2Rvd25fd2VpZ2h0PVFfcHJval9kb3duX3dlaWdodCwKICAgICAgICBRX3Byb2pfdXBfd2VpZ2h0PVFfcHJval91cF93ZWlnaHQsCiAgICAgICAgS1ZfcHJval9kb3duX3dlaWdodD1LVl9wcm9qX2Rvd25fd2VpZ2h0LAogICAgICAgIEtWX3Byb2pfdXBfd2VpZ2h0PUtWX3Byb2pfdXBfd2VpZ2h0LAogICAgICAgIHdvX3dlaWdodD13b193ZWlnaHQsCiAgICApCiAgICB4ID0gdG9yY2gucmFuZG4oKGNvbmZpZy5iYXRjaF9zaXplLCAxLCBjb25maWcuZGltKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICAKICAgICMgUHJlLWZpbGwgS1YgY2FjaGUKICAgIGt2X2NhY2hlID0gS1ZDYWNoZSgoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5tYXhfc2VxX2xlbiwgY29uZmlnLmt2X2xvcmFfcmFuayArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSkudG8oJ2N1ZGEnKQogICAgcHJlX2ZpbGxlZF9jYWNoZSA9IHRvcmNoLnJhbmRuKChjb25maWcuYmF0Y2hfc2l6ZSwgcHJlZmlsbCwgY29uZmlnLmt2X2xvcmFfcmFuayArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAga3ZfY2FjaGUocHJlX2ZpbGxlZF9jYWNoZSkKCiAgICByZXR1cm4gY29uZmlnLCB4LCBrdl9jYWNoZQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAjIEV4YW1wbGUgdXNhZ2UKICAgIGJhdGNoc2l6ZSA9IDEyOAogICAgZGltID0gNzE2OAogICAgZHEgPSAxNTM2CiAgICBwcmVmaWxsID0gNDA5NgogICAgc2VlZCA9IDk4MTcKICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpCiAgICBjdXN0b21fa2VybmVsKChjb25maWcsIHgsIGt2X2NhY2hlKSk=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 26034.
- aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCgpjbGFzcyBSb1BFKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZF9tb2RlbDogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRfbW9kZWwgPSBkX21vZGVsCiAgICAgICAgdGhldGEgPSAxMDAwMCAqKiAoLXRvcmNoLmFyYW5nZSgwLCBkX21vZGVsLy8yLGR0eXBlPXRvcmNoLmJmbG9hdDE2KSAvIChkX21vZGVsLy8yKSkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcigidGhldGEiLCB0aGV0YSkKCiAgICBkZWYgcm90YXRlX2hhbGYoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgeDEsIHgyID0geC5jaHVuaygyLCBkaW09LTEpCiAgICAgICAgcmV0dXJuIHRvcmNoLmNhdCgoLXgyLCB4MSksIGRpbT0tMSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIHN0YXJ0X3BvczogaW50ID0gMCkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICAgICAgZF9tb2RlbCA9IHguc2l6ZSgtMSkKICAgICAgICBhc3NlcnQgZF9tb2RlbCA9PSBzZWxmLmRfbW9kZWwKICAgICAgICBzZXFfaWR4ID0gdG9yY2guYXJhbmdlKHN0YXJ0X3Bvcywgc3RhcnRfcG9zICsgc2VxX2xlbiwgZGV2aWNlPXguZGV2aWNlKQogICAgICAgIGlkeF90aGV0YSA9IHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHNlcV9pZHgsIHNlbGYudGhldGEpCiAgICAgICAgaWR4X3RoZXRhMiA9IHRvcmNoLmNhdChbaWR4X3RoZXRhLCBpZHhfdGhldGFdLCBkaW09LTEpCiAgICAgICAgY29zID0gaWR4X3RoZXRhMi5jb3MoKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICBzaW4gPSBpZHhfdGhldGEyLnNpbigpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHJldHVybiB4ICogY29zICsgc2VsZi5yb3RhdGVfaGFsZih4KSAqIHNpbgoKY2xhc3MgTXlSb1BFKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZF9tb2RlbDogaW50KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRfbW9kZWwgPSBkX21vZGVsCiAgICAgICAgdGhldGEgPSAxMDAwMCAqKiAoLXRvcmNoLmFyYW5nZSgwLCBkX21vZGVsLy8yLGR0eXBlPXRvcmNoLmJmbG9hdDE2KSAvIChkX21vZGVsLy8yKSkKICAgICAgICBzZWxmLnRoZXRhID0gdGhldGEuY3VkYSgpIAogICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIHN0YXJ0X3BvczogaW50ID0gMCkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNlcV9sZW4gPSB4LnNpemUoLTIpCiAgICAgICAgZF9tb2RlbCA9IHguc2l6ZSgtMSkKICAgICAgICBhc3NlcnQgZF9tb2RlbCA9PSBzZWxmLmRfbW9kZWwKICAgICAgICBvbGRfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeCA9IHgucmVzaGFwZSgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICBzZXFfaWR4ID0gdG9yY2guYXJhbmdlKHN0YXJ0X3Bvcywgc3RhcnRfcG9zICsgc2VxX2xlbiwgZGV2aWNlPXguZGV2aWNlKSAjIChzZXFfbGVuLCkKICAgICAgICBpZHhfdGhldGEgPSB0b3JjaC5laW5zdW0oJ3MsZC0+c2QnLCBzZXFfaWR4LCBzZWxmLnRoZXRhKSAjIChzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIGlkeF90aGV0YSA9IGlkeF90aGV0YS52aWV3KC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICB4MSA9IHhbOiwgOiwgOmRfbW9kZWwvLzJdICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIHgyID0geFs6LCA6LCBkX21vZGVsLy8yOl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgbmV3X3gxID0geDEgKiBpZHhfdGhldGEuY29zKCkgLSB4MiAqIGlkeF90aGV0YS5zaW4oKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICBuZXdfeDIgPSB4MSAqIGlkeF90aGV0YS5zaW4oKSArIHgyICogaWR4X3RoZXRhLmNvcygpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIG5ld194ID0gdG9yY2guY2F0KFtuZXdfeDEsIG5ld194Ml0sIGRpbT0tMSkgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwpCiAgICAgICAgbmV3X3ggPSBuZXdfeC52aWV3KG9sZF9zaGFwZSkgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICByZXR1cm4gbmV3X3gKICAgICAgICAKICAgICAgICAKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgogICAgCkBkYXRhY2xhc3MKY2xhc3MgQ29uZmlnOgogICAgYmF0Y2hfc2l6ZTogaW50CiAgICBkaW06IGludAogICAgbl9oZWFkczogaW50CiAgICBxX2xvcmFfcmFuazogaW50IAogICAga3ZfbG9yYV9yYW5rOiBpbnQKICAgIHFrX25vcGVfaGVhZF9kaW06IGludAogICAgcWtfcm9wZV9oZWFkX2RpbTogaW50CiAgICB2X2hlYWRfZGltOiBpbnQKICAgIHNlcV9sZW46IGludAogICAgbWF4X3NlcV9sZW46IGludAogICAga3ZfY2FjaGVfc2hhcGU6IHR1cGxlCiAgICBRX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgUV9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIHdvX3dlaWdodDogdG9yY2guVGVuc29yCgpjbGFzcyBNTEEobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IENvbmZpZyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5kaW0gPSBjb25maWcuZGltCiAgICAgICAgc2VsZi5uX2hlYWRzID0gY29uZmlnLm5faGVhZHMKICAgICAgICBzZWxmLnFfbG9yYV9yYW5rID0gY29uZmlnLnFfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsgPSBjb25maWcua3ZfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5ub3BlX2hlYWRfZGltID0gY29uZmlnLnFrX25vcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0gPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYudl9oZWFkX2RpbSA9IGNvbmZpZy52X2hlYWRfZGltCiAgICAgICAgIyBEb3duLXByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLnFfbG9yYV9yYW5rLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKICAgICAgICBzZWxmLktWX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5rdl9sb3JhX3JhbmsgKyBzZWxmLnJvcGVfaGVhZF9kaW0sIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQoKICAgICAgICAjIFVwLXByb2plY3Rpb24gYW5kIHJvcGUgcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYucV9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKICAgICAgICBzZWxmLktWX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5rdl9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnZfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNikKCiAgICAgICAgIyBSb1BFIG9uIGhhbGYgZW1iZWRkaW5ncwogICAgICAgIHNlbGYucV9yb3BlID0gTXlSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IE15Um9QRShzZWxmLnJvcGVfaGVhZF9kaW0pCgogICAgICAgICMgT3V0cHV0IHByb2plY3Rpb24KICAgICAgICBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwga3ZfY2FjaGU6IEtWQ2FjaGUpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICAjIHNlcV9sZW4gPSAxIGFsd2F5cyBoZXJlCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgbW9kZWxfZGltID0geC5zaXplKCkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICBTdGVwIDE6IEhhbmRsZSBkb3duLXByb2plY3Rpb24gKyBLViBjYWNoZSAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgcV9sb3JhID0gc2VsZi5RX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEgPSBzZWxmLktWX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEsIGt2X2xlbiA9IGt2X2NhY2hlKGt2X2xvcmEpCiAgICAgICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICBTdGVwIDI6IFVwLXByb2plY3QgYW5kIHByZXBhcmUgTm9QRSArIFJvUEUgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIyBIYW5kbGUgcXVlcmllcyBRIGZpcnN0CiAgICAgICAgcV9ub3BlX2FuZF9yb3BlID0gc2VsZi5RX3Byb2pfdXAocV9sb3JhKS52aWV3KAogICAgICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBxX25vcGUsIHFfcm9wZSA9IHRvcmNoLnNwbGl0KHFfbm9wZV9hbmRfcm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICAjIEhhbmRsZSBrZXlzIGFuZCB2YWx1ZXMgSy9WLiBWIGRvZXMgbm90IG5lZWQgUm9QRQogICAgICAgIGt2X25vcGUsIGtfcm9wZSA9IHRvcmNoLnNwbGl0KGt2X2xvcmEsIFtzZWxmLmt2X2xvcmFfcmFuaywgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIGt2X25vcGUgPSBzZWxmLktWX3Byb2pfdXAoa3Zfbm9wZSkudmlldygKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwga3ZfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkKICAgICAgICBrX25vcGUsIHYgPSB0b3JjaC5zcGxpdChrdl9ub3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnZfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgU3RlcCAzOiBIYW5kbGUgUm9QRSBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3IgcXVlcmllcyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIHFfcm9wZSA9IHFfcm9wZS5yZXNoYXBlKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgc2VxX2xlbiwgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfcm9wZSA9IHNlbGYucV9yb3BlKHFfcm9wZSwgc3RhcnRfcG9zPXF1ZXJ5X3BvcykKICAgICAgICBxX3JvcGUgPSBxX3JvcGUucmVzaGFwZShiYXRjaF9zaXplLCBzZXFfbGVuLCBzZWxmLm5faGVhZHMsIHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBxID0gdG9yY2guY29uY2F0KFtxX25vcGUsIHFfcm9wZV0sIGRpbT0tMSkKCiAgICAgICAgIyBDb21wdXRlIFJvUEUgZm9yIGtleXMgYW5kIGNvbWJpbmUgd2l0aCBuby1Sb1BFIHBhcnQKICAgICAgICBrX3JvcGUgPSBrX3JvcGVbOiwgOiwgTm9uZSwgOl0KICAgICAgICBrX3JvcGUgPSBzZWxmLmtfcm9wZShrX3JvcGUpLmV4cGFuZCgtMSwtMSxzZWxmLm5faGVhZHMsLTEpCiAgICAgICAgayA9IHRvcmNoLmNvbmNhdChba19ub3BlLCBrX3JvcGVdLCBkaW09LTEpCiAgICAgICAgICAgICAgICAKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIE11bHRpLWhlYWQgQXR0ZW50aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxID0gcS5yZXNoYXBlKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgMSwgc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIGsgPSBrLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBrdl9sZW4sIHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkKICAgICAgICB2ID0gdi5yZXNoYXBlKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgLTEsIHNlbGYudl9oZWFkX2RpbSkKICAgICAgICBzY29yZXMgPSB0b3JjaC5tYXRtdWwocSwgay50cmFuc3Bvc2UoLTEsIC0yKSkgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIGF0dG4gPSBGLnNvZnRtYXgoc2NvcmVzLCBkaW09LTEpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHkgPSB0b3JjaC5tYXRtdWwoYXR0biwgdikudmlldyhiYXRjaF9zaXplLCAxLCAtMSkKICAgICAgICB5ID0gc2VsZi53byh5KQoKICAgICAgICByZXR1cm4geSwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKZGVmIHByaW50X2NvbmZpZyhjb25maWc6IENvbmZpZyk6CiAgICBmb3Iga2V5IGluIGNvbmZpZy5fX2RpY3RfXzoKICAgICAgICBpZiBpc2luc3RhbmNlKGNvbmZpZy5fX2RpY3RfX1trZXldLCB0b3JjaC5UZW5zb3IpOgogICAgICAgICAgICBwcmludChmIntrZXl9OiB7Y29uZmlnLl9fZGljdF9fW2tleV0uc2hhcGV9IikKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludChmIntrZXl9OiB7Y29uZmlnLl9fZGljdF9fW2tleV19IikKCmRlZiBtbGFfZGVjb2RlKAogICAgY29uZmlnOiBDb25maWcsCiAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICBrdl9jYWNoZTogS1ZDYWNoZSwKKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIEtWQ2FjaGVdOgogICAgIyBkaW06ICAgICAgICAgICAgICAgIDcxNjgKICAgICMgbl9oZWFkczogICAgICAgICAgICAgMTI4CiAgICAjIHFfbG9yYV9yYW5rOiAgICAgICAgMTUzNgogICAgIyBrdl9sb3JhX3Jhbms6ICAgICAgIDUxMgogICAgIyBxa19ub3BlX2hlYWRfZGltOiAgIDEyOAogICAgIyBxa19yb3BlX2hlYWRfZGltOiAgIDY0CiAgICAjIHZfaGVhZF9kaW06ICAgICAgICAxMjgKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgICgxNTM2LCA3MTY4KQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKCgxMjggKyA2NCkgKiAxMjgsIDE1MzYpID0gKDI0NTc2LCAxNTM2KQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKDUxMiArIDY0LCA3MTY4KSA9ICg1NzYsIDcxNjgpCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKDEyOCArIDEyOCkgKiAxMjgsIDUxMikgPSAoMzI3NjgsIDUxMikKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgICg3MTY4LCAxMjggKiAxMjgpID0gKDcxNjgsIDE2Mzg0KQogICAgIyBrdl9jYWNoZV9zaGFwZTogICAgIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKHFfbG9yYV9yYW5rLCBkaW0pCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMsIHFfbG9yYV9yYW5rKQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0sIGRpbSkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pICogbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKGRpbSwgdl9oZWFkX2RpbSAqIG5faGVhZHMpCiAgICAjIHg6ICAgICAgICAgICAgICAgIChiYXRjaHNpemUsIDEsIGRpbSkKICAgIHFfbG9yYSA9IHggQCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBxX2xvcmFfcmFuaykKICAgIGt2X2xvcmEgPSB4IEAgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKICAgICMgIyBzdG9yZSBrdl9sb3JhIGluIGNhY2hlIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgY2FjaGUKICAgIGt2X2xvcmEsIGt2X2xlbiA9IGt2X2NhY2hlKGt2X2xvcmEpICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMSAjCiAgICAKICAgIHFfbm9wZV9hbmRfcm9wZSA9IHFfbG9yYSBAIGNvbmZpZy5RX3Byb2pfdXBfd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pICogbl9oZWFkcykKICAgIHFfbm9wZV9hbmRfcm9wZSA9IHFfbm9wZV9hbmRfcm9wZS52aWV3KGNvbmZpZy5iYXRjaF9zaXplLCAxLCBjb25maWcubl9oZWFkcywgY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgcV9ub3BlLCBxX3JvcGUgPSB0b3JjaC5zcGxpdChxX25vcGVfYW5kX3JvcGUsIFtjb25maWcucWtfbm9wZV9oZWFkX2RpbSwgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW1dLCBkaW09LTEpIAogICAgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltKQogICAgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKQoKICAgIGt2X25vcGUsIGtfcm9wZSA9IHRvcmNoLnNwbGl0KGt2X2xvcmEsIFtjb25maWcua3ZfbG9yYV9yYW5rLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwga3ZfbG9yYV9yYW5rKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKICAgIGt2X25vcGUgPSBrdl9ub3BlIEAgY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBuX2hlYWRzKQogICAga3Zfbm9wZSA9IGt2X25vcGUudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwga3ZfbGVuLCBjb25maWcubl9oZWFkcywgY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcudl9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKQogICAga19ub3BlLCB2ID0gdG9yY2guc3BsaXQoa3Zfbm9wZSwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcudl9oZWFkX2RpbV0sIGRpbT0tMSkKICAgICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHZfaGVhZF9kaW0pCiAgICAKICAgIHJvcGVfbW9kdWxlID0gUm9QRShjb25maWcucWtfcm9wZV9oZWFkX2RpbSkKICAgICMgcV9yb3BlID0gCiAgICAKICAgIAogICAgcHJpbnRfY29uZmlnKGNvbmZpZykKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCk6CiAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQogICAgcHJpbnRfY29uZmlnKGNvbmZpZykKICAgICMgbWxhX2RlY29kZSgKICAgICMgICAgIGNvbmZpZywKICAgICMgICAgIHgsCiAgICAjICAgICBrdl9jYWNoZSwKICAgICMgKQogICAgCiAgICBtb2RlbCA9IE1MQShjb25maWcpCiAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval91cF93ZWlnaHQpCiAgICBtb2RlbC5LVl9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0KQogICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgbW9kZWwud28ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy53b193ZWlnaHQpCgogICAgb3V0cHV0LCBrdl9jYWNoZSA9IG1vZGVsKHgsIGt2X2NhY2hlKQogICAgcmV0dXJuIG91dHB1dCwga3ZfY2FjaGUKICAgIAoKZGVmIGdlbmVyYXRlX2lucHV0KGJhdGNoc2l6ZSwgZGltLCBkcSwgcHJlZmlsbCwgc2VlZCk6CiAgICAjIFNpemVzIGRlcml2ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2RlZXBzZWVrLWFpL0RlZXBTZWVrLVYzL2Jsb2IvbWFpbi9pbmZlcmVuY2UvbW9kZWwucHkKICAgIGdlbiA9IHRvcmNoLkdlbmVyYXRvcihkZXZpY2U9J2N1ZGEnKQogICAgZ2VuLm1hbnVhbF9zZWVkKHNlZWQpCiAgICAKICAgICMgR2VuZXJhdGUgd2VpZ2h0cyBmb3IgbGluZWFyIGxheWVycwogICAgUV9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKGRxLCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQgPSB0b3JjaC5yYW5kbigoNTEyICsgNjQsIGRpbSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgUV9wcm9qX3VwX3dlaWdodCA9IHRvcmNoLnJhbmRuKCgoMTI4ICsgNjQpICogMTI4LCBkcSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgS1ZfcHJval91cF93ZWlnaHQgPSB0b3JjaC5yYW5kbigoKDEyOCArIDEyOCkgKiAxMjgsIDUxMiksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgd29fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKGRpbSwgMTI4ICogMTI4KSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCgogICAgY29uZmlnID0gQ29uZmlnKAogICAgICAgIGJhdGNoX3NpemU9YmF0Y2hzaXplLAogICAgICAgIGRpbT1kaW0sCiAgICAgICAgcV9sb3JhX3Jhbms9ZHEsCiAgICAgICAgbl9oZWFkcz0xMjgsCiAgICAgICAga3ZfbG9yYV9yYW5rPTUxMiwKICAgICAgICBxa19ub3BlX2hlYWRfZGltPTEyOCwKICAgICAgICBxa19yb3BlX2hlYWRfZGltPTY0LAogICAgICAgIHZfaGVhZF9kaW09MTI4LAogICAgICAgIHNlcV9sZW49MSwKICAgICAgICBtYXhfc2VxX2xlbj04MTkyLAogICAgICAgIGt2X2NhY2hlX3NoYXBlPShiYXRjaHNpemUsIDgxOTIsIDUxMiArIDY0KSwKICAgICAgICBRX3Byb2pfZG93bl93ZWlnaHQ9UV9wcm9qX2Rvd25fd2VpZ2h0LAogICAgICAgIFFfcHJval91cF93ZWlnaHQ9UV9wcm9qX3VwX3dlaWdodCwKICAgICAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0PUtWX3Byb2pfZG93bl93ZWlnaHQsCiAgICAgICAgS1ZfcHJval91cF93ZWlnaHQ9S1ZfcHJval91cF93ZWlnaHQsCiAgICAgICAgd29fd2VpZ2h0PXdvX3dlaWdodCwKICAgICkKICAgIHggPSB0b3JjaC5yYW5kbigoY29uZmlnLmJhdGNoX3NpemUsIDEsIGNvbmZpZy5kaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIAogICAgIyBQcmUtZmlsbCBLViBjYWNoZQogICAga3ZfY2FjaGUgPSBLVkNhY2hlKChjb25maWcuYmF0Y2hfc2l6ZSwgY29uZmlnLm1heF9zZXFfbGVuLCBjb25maWcua3ZfbG9yYV9yYW5rICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pKS50bygnY3VkYScpCiAgICBwcmVfZmlsbGVkX2NhY2hlID0gdG9yY2gucmFuZG4oKGNvbmZpZy5iYXRjaF9zaXplLCBwcmVmaWxsLCBjb25maWcua3ZfbG9yYV9yYW5rICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICBrdl9jYWNoZShwcmVfZmlsbGVkX2NhY2hlKQoKICAgIHJldHVybiBjb25maWcsIHgsIGt2X2NhY2hlCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICMgRXhhbXBsZSB1c2FnZQogICAgYmF0Y2hzaXplID0gMTI4CiAgICBkaW0gPSA3MTY4CiAgICBkcSA9IDE1MzYKICAgIHByZWZpbGwgPSA0MDk2CiAgICBzZWVkID0gOTgxNwogICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGdlbmVyYXRlX2lucHV0KGJhdGNoc2l6ZSwgZGltLCBkcSwgcHJlZmlsbCwgc2VlZCkKICAgIGN1c3RvbV9rZXJuZWwoKGNvbmZpZywgeCwga3ZfY2FjaGUpKQ==No newline at end of file+ aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCmltcG9ydCB0aW1lCmNsYXNzIFJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCJ0aGV0YSIsIHRoZXRhKQoKICAgIGRlZiByb3RhdGVfaGFsZihzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4MSwgeDIgPSB4LmNodW5rKDIsIGRpbT0tMSkKICAgICAgICByZXR1cm4gdG9yY2guY2F0KCgteDIsIHgxKSwgZGltPS0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgc2VsZi50aGV0YSkKICAgICAgICBpZHhfdGhldGEyID0gdG9yY2guY2F0KFtpZHhfdGhldGEsIGlkeF90aGV0YV0sIGRpbT0tMSkKICAgICAgICBjb3MgPSBpZHhfdGhldGEyLmNvcygpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNpbiA9IGlkeF90aGV0YTIuc2luKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgcmV0dXJuIHggKiBjb3MgKyBzZWxmLnJvdGF0ZV9oYWxmKHgpICogc2luCgpjbGFzcyBNeVJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYudGhldGEgPSB0aGV0YS5jdWRhKCkgCiAgICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIG9sZF9zaGFwZSA9IHguc2hhcGUKICAgICAgICB4ID0geC5yZXNoYXBlKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpICMgKHNlcV9sZW4sKQogICAgICAgIGlkeF90aGV0YSA9IHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHNlcV9pZHgsIHNlbGYudGhldGEpICMgKHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgaWR4X3RoZXRhID0gaWR4X3RoZXRhLnZpZXcoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIHgxID0geFs6LCA6LCA6ZF9tb2RlbC8vMl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgeDIgPSB4WzosIDosIGRfbW9kZWwvLzI6XSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgICAgICBuZXdfeDEgPSB4MSAqIGlkeF90aGV0YS5jb3MoKSAtIHgyICogaWR4X3RoZXRhLnNpbigpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgICAgIG5ld194MiA9IHgxICogaWR4X3RoZXRhLnNpbigpICsgeDIgKiBpZHhfdGhldGEuY29zKCkgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICAgICAgbmV3X3ggPSB0b3JjaC5jYXQoW25ld194MSwgbmV3X3gyXSwgZGltPS0xKSAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgICAgICBuZXdfeCA9IG5ld194LnZpZXcob2xkX3NoYXBlKSAjIChiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsKQogICAgICAgIHJldHVybiBuZXdfeAogICAgICAgIAogICAgICAgIApjbGFzcyBLVkNhY2hlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga3ZfY2FjaGVfc2hhcGU6IHR1cGxlKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdkYXRhJywgdG9yY2guemVyb3Moa3ZfY2FjaGVfc2hhcGUsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KSkKICAgICAgICBzZWxmLnNlcV9sZW4gPSAwCiAgICAgICAgc2VsZi56ZXJvKCkKCiAgICBkZWYgemVybyhzZWxmKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGF0YS56ZXJvXygpCiAgICAKICAgIGRlZiBnZXRfZGF0YShzZWxmKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGNfa3Y6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGFzc2VydCBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSkgPD0gc2VsZi5kYXRhLnNpemUoMSksICJLViBDYWNoZSBFeGNlZWRlZCIKCiAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhLnRvKGNfa3YuZHR5cGUpCiAgICAgICAgc2VsZi5kYXRhWwogICAgICAgICAgICA6LCBzZWxmLnNlcV9sZW4gOiBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSksIDoKICAgICAgICBdID0gY19rdgogICAgICAgIHNlbGYuc2VxX2xlbiArPSBjX2t2LnNpemUoMSkKCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVs6LCA6c2VsZi5zZXFfbGVuXSwgc2VsZi5zZXFfbGVuCiAgICAKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAjIERvd24tcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYucV9sb3JhX3JhbmssIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNlbGYuS1ZfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLmt2X2xvcmFfcmFuayArIHNlbGYucm9wZV9oZWFkX2RpbSwgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpCgogICAgICAgICMgVXAtcHJvamVjdGlvbiBhbmQgcm9wZSBwcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5xX2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBNeVJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHNlbGYua19yb3BlID0gTXlSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKCiAgICAgICAgIyBPdXRwdXQgcHJvamVjdGlvbgogICAgICAgIHNlbGYud28gPSBubi5MaW5lYXIoc2VsZi52X2hlYWRfZGltICogc2VsZi5uX2hlYWRzLCBzZWxmLmRpbSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgogICAgICAgICMgc2VxX2xlbiA9IDEgYWx3YXlzIGhlcmUKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgIFN0ZXAgMTogSGFuZGxlIGRvd24tcHJvamVjdGlvbiArIEtWIGNhY2hlICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxX2xvcmEgPSBzZWxmLlFfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSA9IHNlbGYuS1ZfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSwga3ZfbGVuID0ga3ZfY2FjaGUoa3ZfbG9yYSkKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgIFN0ZXAgMjogVXAtcHJvamVjdCBhbmQgcHJlcGFyZSBOb1BFICsgUm9QRSAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIEhhbmRsZSBxdWVyaWVzIFEgZmlyc3QKICAgICAgICBxX25vcGVfYW5kX3JvcGUgPSBzZWxmLlFfcHJval91cChxX2xvcmEpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMgSGFuZGxlIGtleXMgYW5kIHZhbHVlcyBLL1YuIFYgZG9lcyBub3QgbmVlZCBSb1BFCiAgICAgICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAga3Zfbm9wZSA9IHNlbGYuS1ZfcHJval91cChrdl9ub3BlKS52aWV3KAogICAgICAgICAgICBiYXRjaF9zaXplLCBrdl9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKQogICAgICAgIGtfbm9wZSwgdiA9IHRvcmNoLnNwbGl0KGt2X25vcGUsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYudl9oZWFkX2RpbV0sIGRpbT0tMSkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgICBTdGVwIDM6IEhhbmRsZSBSb1BFIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICMgQ29tcHV0ZSBSb1BFIGZvciBxdWVyaWVzIGFuZCBjb21iaW5lIHdpdGggbm8tUm9QRSBwYXJ0CiAgICAgICAgcV9yb3BlID0gcV9yb3BlLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBzZXFfbGVuLCBzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgcV9yb3BlID0gc2VsZi5xX3JvcGUocV9yb3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKQogICAgICAgIHFfcm9wZSA9IHFfcm9wZS5yZXNoYXBlKGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHEgPSB0b3JjaC5jb25jYXQoW3Ffbm9wZSwgcV9yb3BlXSwgZGltPS0xKQoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3Iga2V5cyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIGtfcm9wZSA9IGtfcm9wZVs6LCA6LCBOb25lLCA6XQogICAgICAgIGtfcm9wZSA9IHNlbGYua19yb3BlKGtfcm9wZSkuZXhwYW5kKC0xLC0xLHNlbGYubl9oZWFkcywtMSkKICAgICAgICBrID0gdG9yY2guY29uY2F0KFtrX25vcGUsIGtfcm9wZV0sIGRpbT0tMSkKICAgICAgICAgICAgICAgIAogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgTXVsdGktaGVhZCBBdHRlbnRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgIHEgPSBxLnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCAxLCBzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgayA9IGsucmVzaGFwZShiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIGt2X2xlbiwgc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgIHYgPSB2LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCAtMSwgc2VsZi52X2hlYWRfZGltKQogICAgICAgIHNjb3JlcyA9IHRvcmNoLm1hdG11bChxLCBrLnRyYW5zcG9zZSgtMSwgLTIpKSAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgYXR0biA9IEYuc29mdG1heChzY29yZXMsIGRpbT0tMSkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgeSA9IHRvcmNoLm1hdG11bChhdHRuLCB2KS52aWV3KGJhdGNoX3NpemUsIDEsIC0xKQogICAgICAgIHkgPSBzZWxmLndvKHkpCgogICAgICAgIHJldHVybiB5LCBrdl9jYWNoZS5nZXRfZGF0YSgpCgpkZWYgcHJpbnRfY29uZmlnKGNvbmZpZzogQ29uZmlnKToKICAgIGZvciBrZXkgaW4gY29uZmlnLl9fZGljdF9fOgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29uZmlnLl9fZGljdF9fW2tleV0sIHRvcmNoLlRlbnNvcik6CiAgICAgICAgICAgIHByaW50KGYie2tleX06IHtjb25maWcuX19kaWN0X19ba2V5XS5zaGFwZX0iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KGYie2tleX06IHtjb25maWcuX19kaWN0X19ba2V5XX0iKQoKCmRlZiBmYXN0X21sYV9kZWNvZGUoCiAgICBjb25maWc6IENvbmZpZywKICAgIHg6IHRvcmNoLlRlbnNvciwKICAgIGt2X2NhY2hlOiBLVkNhY2hlLAopIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgS1ZDYWNoZV06CiAgICAjIGRpbTogICAgICAgICAgICAgICAgNzE2OAogICAgIyBuX2hlYWRzOiAgICAgICAgICAgICAxMjgKICAgICMgcV9sb3JhX3Jhbms6ICAgICAgICAxNTM2CiAgICAjIGt2X2xvcmFfcmFuazogICAgICAgNTEyCiAgICAjIHFrX25vcGVfaGVhZF9kaW06ICAgMTI4CiAgICAjIHFrX3JvcGVfaGVhZF9kaW06ICAgNjQKICAgICMgdl9oZWFkX2RpbTogICAgICAgIDEyOAogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKDE1MzYsIDcxNjgpCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKDEyOCArIDY0KSAqIDEyOCwgMTUzNikgPSAoMjQ1NzYsIDE1MzYpCiAgICAjIEtWX3Byb2pfZG93bl93ZWlnaHQ6ICAoNTEyICsgNjQsIDcxNjgpID0gKDU3NiwgNzE2OCkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgoMTI4ICsgMTI4KSAqIDEyOCwgNTEyKSA9ICgzMjc2OCwgNTEyKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKDcxNjgsIDEyOCAqIDEyOCkgPSAoNzE2OCwgMTYzODQpCiAgICAjIGt2X2NhY2hlX3NoYXBlOiAgICAgKGJhdGNoc2l6ZSwgbWF4X3NlcV9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAjIFFfcHJval9kb3duX3dlaWdodDogICAocV9sb3JhX3JhbmssIGRpbSkKICAgICMgUV9wcm9qX3VwX3dlaWdodDogICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pICogbl9oZWFkcywgcV9sb3JhX3JhbmspCiAgICAjIEtWX3Byb2pfZG93bl93ZWlnaHQ6ICAoa3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSwgZGltKQogICAgIyBLVl9wcm9qX3VwX3dlaWdodDogICAgKChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAjIHdvX3dlaWdodDogICAgICAgICAgICAoZGltLCB2X2hlYWRfZGltICogbl9oZWFkcykKICAgICMgeDogICAgICAgICAgICAgICAgKGJhdGNoc2l6ZSwgMSwgZGltKQogICAgcV9sb3JhID0geCBAIGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIHFfbG9yYV9yYW5rKQogICAgY3VyX2t2X2xvcmEgPSB4IEAgY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCmRlZiBtbGFfZGVjb2RlKAogICAgY29uZmlnOiBDb25maWcsCiAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICBrdl9jYWNoZTogS1ZDYWNoZSwKKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIEtWQ2FjaGVdOgogICAgIyBkaW06ICAgICAgICAgICAgICAgIDcxNjgKICAgICMgbl9oZWFkczogICAgICAgICAgICAgMTI4CiAgICAjIHFfbG9yYV9yYW5rOiAgICAgICAgMTUzNgogICAgIyBrdl9sb3JhX3Jhbms6ICAgICAgIDUxMgogICAgIyBxa19ub3BlX2hlYWRfZGltOiAgIDEyOAogICAgIyBxa19yb3BlX2hlYWRfZGltOiAgIDY0CiAgICAjIHZfaGVhZF9kaW06ICAgICAgICAxMjgKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgICgxNTM2LCA3MTY4KQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKCgxMjggKyA2NCkgKiAxMjgsIDE1MzYpID0gKDI0NTc2LCAxNTM2KQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKDUxMiArIDY0LCA3MTY4KSA9ICg1NzYsIDcxNjgpCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKDEyOCArIDEyOCkgKiAxMjgsIDUxMikgPSAoMzI3NjgsIDUxMikKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgICg3MTY4LCAxMjggKiAxMjgpID0gKDcxNjgsIDE2Mzg0KQogICAgIyBrdl9jYWNoZV9zaGFwZTogICAgIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKHFfbG9yYV9yYW5rLCBkaW0pCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMsIHFfbG9yYV9yYW5rKQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0sIGRpbSkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pICogbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKGRpbSwgdl9oZWFkX2RpbSAqIG5faGVhZHMpCiAgICAjIHg6ICAgICAgICAgICAgICAgIChiYXRjaHNpemUsIDEsIGRpbSkKICAgIHFfbG9yYSA9IHggQCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBxX2xvcmFfcmFuaykKICAgIGN1cl9rdl9sb3JhID0geCBAIGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICAjIHN0b3JlIGt2X2xvcmEgaW4gY2FjaGUgYW5kIHJldHVybiB0aGUgdXBkYXRlZCBjYWNoZQogICAga3ZfY2FjaGVfZGF0YSA9IGt2X2NhY2hlLmdldF9kYXRhKCkgIyAoYmF0Y2hzaXplLCBtYXhfc2VxX2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGt2X2NhY2hlLnNlcV9sZW4gKz0gMSAKICAgICMgVE9ETzogISEhd3JvbmcgaW1wbGVtZW50YXRpb24hISEsIGN1cl9rdl9sb3JhJ3MgcWtfcm9wZV9oZWFkX2RpbSBzaG91bGQgY2FsbCByb3BlIGJlZm9yZSBzdG9yaW5nLiBEbyBpbiBwbGFjZSBSb1BSCiAgICBrdl9jYWNoZV9kYXRhWzosIGt2X2NhY2hlLnNlcV9sZW4gLSAxLCA6XSA9IGN1cl9rdl9sb3JhLnNxdWVlemUoMSkgCiAgICBrdl9sZW4gPSBrdl9jYWNoZS5zZXFfbGVuICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAga3ZfY2FjaGVfZGF0YSA9IGt2X2NhY2hlLmdldF9kYXRhKCkgIyAoYmF0Y2hzaXplLCBtYXhfc2VxX2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGt2X2xvcmEgPSBrdl9jYWNoZV9kYXRhWzosIDprdl9jYWNoZS5zZXFfbGVuLCA6XSAjIChiYXRjaHNpemUsIGt2X2xlbiwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSkgOiAobWF4X3NlcV9sZW4gKiAoa3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSksIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0gLDEpCiAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxICMKICAgIAogICAgcV9ub3BlX2FuZF9yb3BlID0gcV9sb3JhIEAgY29uZmlnLlFfcHJval91cF93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkgKiBuX2hlYWRzKQogICAgcV9ub3BlX2FuZF9yb3BlID0gcV9ub3BlX2FuZF9yb3BlLnZpZXcoY29uZmlnLmJhdGNoX3NpemUsIDEsIGNvbmZpZy5uX2hlYWRzLCBjb25maWcucWtfbm9wZV9oZWFkX2RpbSArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBxX25vcGUsIHFfcm9wZSA9IHRvcmNoLnNwbGl0KHFfbm9wZV9hbmRfcm9wZSwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgCiAgICAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0pIDogCiAgICAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pCgogICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW2NvbmZpZy5rdl9sb3JhX3JhbmssIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwgZGltPS0xKSAKICAgICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmspCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAga3Zfbm9wZSA9IGt2X25vcGUgQCBjb25maWcuS1ZfcHJval91cF93ZWlnaHQuVCAjIChiYXRjaHNpemUsIGt2X2xlbiwgKHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKSAqIG5faGVhZHMpCiAgICBrdl9ub3BlID0ga3Zfbm9wZS52aWV3KGNvbmZpZy5iYXRjaF9zaXplLCBrdl9sZW4sIGNvbmZpZy5uX2hlYWRzLCBjb25maWcucWtfbm9wZV9oZWFkX2RpbSArIGNvbmZpZy52X2hlYWRfZGltKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pCiAgICBrX25vcGUsIHYgPSB0b3JjaC5zcGxpdChrdl9ub3BlLCBbY29uZmlnLnFrX25vcGVfaGVhZF9kaW0sIGNvbmZpZy52X2hlYWRfZGltXSwgZGltPS0xKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0pCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwgbl9oZWFkcywgdl9oZWFkX2RpbSkKICAgIAogICAgcm9wZV9tb2R1bGUgPSBNeVJvUEUoY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pCiAgICAjIHByZXBhcmUgcQogICAgcV9yb3BlID0gcV9yb3BlLnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5uX2hlYWRzLCAxLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBxa19yb3BlX2hlYWRfZGltKQogICAgcV9yb3BlID0gcm9wZV9tb2R1bGUocV9yb3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKSAjIChiYXRjaHNpemUsIG5faGVhZHMsIDEsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBxX3JvcGUgPSBxX3JvcGUucmVzaGFwZShjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLm5faGVhZHMsIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBxID0gdG9yY2guY29uY2F0KFtxX25vcGUsIHFfcm9wZV0sIGRpbT0tMSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgIyBwcmVwYXJlIGsKICAgICMgISEhd3JvbmcgaW1wbGVtZW50YXRpb24hISEKICAgIGtfcm9wZSA9IGtfcm9wZVs6LCA6LCBOb25lLCA6XSAjISEhd3JvbmcgaW1wbGVtZW50YXRpb24hISEgKGJhdGNoc2l6ZSwga3ZfbGVuLCAxLCBxa19yb3BlX2hlYWRfZGltKQogICAga19yb3BlID0gcm9wZV9tb2R1bGUoa19yb3BlKS5leHBhbmQoLTEsLTEsY29uZmlnLm5faGVhZHMsLTEpICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKQogICAgayA9IHRvcmNoLmNvbmNhdChba19ub3BlLCBrX3JvcGVdLCBkaW09LTEpICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIAogICAgIyAhISFjb3JyZWN0IGltcGxlbWVudGF0aW9uISEhCiAgICAjIGtfcm9wZSA9IGtfcm9wZVs6LCA6LCBOb25lLCA6XSAjIChiYXRjaHNpemUsIGt2X2xlbiwgMSwgcWtfcm9wZV9oZWFkX2RpbSkKICAgICMga19yb3BlID0ga19yb3BlLmV4cGFuZCgtMSwgLTEsIGNvbmZpZy5uX2hlYWRzLCAtMSkgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAjIGsgPSB0b3JjaC5jb25jYXQoW2tfbm9wZSwga19yb3BlXSwgZGltPS0xKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAKCiAgICAjICEhIXdyb25nIGltcGxlbWVudGF0aW9uISEhCiAgICBxID0gcS5yZXNoYXBlKGNvbmZpZy5iYXRjaF9zaXplLCBjb25maWcubl9oZWFkcywgMSwgY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGsgPSBrLnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5uX2hlYWRzLCBrdl9sZW4sIGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbGVuLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgIHYgPSB2LnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5uX2hlYWRzLCAtMSwgY29uZmlnLnZfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbGVuLCB2X2hlYWRfZGltKQogICAgc2NvcmUgPSB0b3JjaC5tYXRtdWwocSwgay50cmFuc3Bvc2UoLTEsIC0yKSkgLyBtYXRoLnNxcnQoY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCAxLCBrdl9sZW4pCiAgICBhdHRuID0gRi5zb2Z0bWF4KHNjb3JlLCBkaW09LTEpLnRvKHRvcmNoLmJmbG9hdDE2KSAjIChiYXRjaHNpemUsIG5faGVhZHMsIDEsIGt2X2xlbikKICAgIHkgPSB0b3JjaC5tYXRtdWwoYXR0biwgdikudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwgMSwgLTEpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcyAqIHZfaGVhZF9kaW0pCiAgICB5ID0geSBAIGNvbmZpZy53b193ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIGRpbSkKICAgIHJldHVybiB5LCBrdl9jYWNoZS5nZXRfZGF0YSgpCgogICAgIyAhISFjb3JyZWN0IGltcGxlbWVudGF0aW9uISEhCiAgICAKICAgICMgcHJpbnRfY29uZmlnKGNvbmZpZykKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCk6CiAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQogICAgIyBwcmludF9jb25maWcoY29uZmlnKQogICAgb3V0ID0gbWxhX2RlY29kZSgKICAgICAgICBjb25maWcsCiAgICAgICAgeCwKICAgICAgICBrdl9jYWNoZSwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHRpbWUuc2xlZXAoMC44KQogICAgcmV0dXJuIG91dAogICAgCiAgICAjIG1vZGVsID0gTUxBKGNvbmZpZykKICAgICMgbW9kZWwuUV9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQpCiAgICAjIG1vZGVsLlFfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval91cF93ZWlnaHQpCiAgICAjIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQpCiAgICAjIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodCkKICAgICMgbW9kZWwud28ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy53b193ZWlnaHQpCgogICAgIyBvdXRwdXQsIGt2X2NhY2hlID0gbW9kZWwoeCwga3ZfY2FjaGUpCiAgICAjIHJldHVybiBvdXRwdXQsIGt2X2NhY2hlCiAgICAKCmRlZiBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpOgogICAgIyBTaXplcyBkZXJpdmVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9kZWVwc2Vlay1haS9EZWVwU2Vlay1WMy9ibG9iL21haW4vaW5mZXJlbmNlL21vZGVsLnB5CiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQogICAgCiAgICAjIEdlbmVyYXRlIHdlaWdodHMgZm9yIGxpbmVhciBsYXllcnMKICAgIFFfcHJval9kb3duX3dlaWdodCA9IHRvcmNoLnJhbmRuKChkcSwgZGltKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKDUxMiArIDY0LCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIFFfcHJval91cF93ZWlnaHQgPSB0b3JjaC5yYW5kbigoKDEyOCArIDY0KSAqIDEyOCwgZHEpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gdG9yY2gucmFuZG4oKCgxMjggKyAxMjgpICogMTI4LCA1MTIpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIHdvX3dlaWdodCA9IHRvcmNoLnJhbmRuKChkaW0sIDEyOCAqIDEyOCksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQoKICAgIGNvbmZpZyA9IENvbmZpZygKICAgICAgICBiYXRjaF9zaXplPWJhdGNoc2l6ZSwKICAgICAgICBkaW09ZGltLAogICAgICAgIHFfbG9yYV9yYW5rPWRxLAogICAgICAgIG5faGVhZHM9MTI4LAogICAgICAgIGt2X2xvcmFfcmFuaz01MTIsCiAgICAgICAgcWtfbm9wZV9oZWFkX2RpbT0xMjgsCiAgICAgICAgcWtfcm9wZV9oZWFkX2RpbT02NCwKICAgICAgICB2X2hlYWRfZGltPTEyOCwKICAgICAgICBzZXFfbGVuPTEsCiAgICAgICAgbWF4X3NlcV9sZW49ODE5MiwKICAgICAgICBrdl9jYWNoZV9zaGFwZT0oYmF0Y2hzaXplLCA4MTkyLCA1MTIgKyA2NCksCiAgICAgICAgUV9wcm9qX2Rvd25fd2VpZ2h0PVFfcHJval9kb3duX3dlaWdodCwKICAgICAgICBRX3Byb2pfdXBfd2VpZ2h0PVFfcHJval91cF93ZWlnaHQsCiAgICAgICAgS1ZfcHJval9kb3duX3dlaWdodD1LVl9wcm9qX2Rvd25fd2VpZ2h0LAogICAgICAgIEtWX3Byb2pfdXBfd2VpZ2h0PUtWX3Byb2pfdXBfd2VpZ2h0LAogICAgICAgIHdvX3dlaWdodD13b193ZWlnaHQsCiAgICApCiAgICB4ID0gdG9yY2gucmFuZG4oKGNvbmZpZy5iYXRjaF9zaXplLCAxLCBjb25maWcuZGltKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpCiAgICAKICAgICMgUHJlLWZpbGwgS1YgY2FjaGUKICAgIGt2X2NhY2hlID0gS1ZDYWNoZSgoY29uZmlnLmJhdGNoX3NpemUsIGNvbmZpZy5tYXhfc2VxX2xlbiwgY29uZmlnLmt2X2xvcmFfcmFuayArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSkudG8oJ2N1ZGEnKQogICAgcHJlX2ZpbGxlZF9jYWNoZSA9IHRvcmNoLnJhbmRuKChjb25maWcuYmF0Y2hfc2l6ZSwgcHJlZmlsbCwgY29uZmlnLmt2X2xvcmFfcmFuayArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAga3ZfY2FjaGUocHJlX2ZpbGxlZF9jYWNoZSkKCiAgICByZXR1cm4gY29uZmlnLCB4LCBrdl9jYWNoZQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAjIEV4YW1wbGUgdXNhZ2UKICAgIGJhdGNoc2l6ZSA9IDEyOAogICAgZGltID0gNzE2OAogICAgZHEgPSAxNTM2CiAgICBwcmVmaWxsID0gNDA5NgogICAgc2VlZCA9IDk4MTcKICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpCiAgICBjdXN0b21fa2VybmVsKChjb25maWcsIHgsIGt2X2NhY2hlKSk=No newline at end of file
Best evidence level for this revision: reported
JSON