Skip to content
KernelIndex
Search⌘K

submission 29913

KernelBot user 87 · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.

submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mla-decode-29913?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
8.92ms
#37 of 79
2025-06-01

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:7e9d1dabef50e4e16e29eb4def2851265c1dcf463daad9630ba8296ebbb41952
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission.py1 lines
aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKCgppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKX2lzX2hpcCA9IFRydWUKCmNsYXNzIFJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCJ0aGV0YSIsIHRoZXRhKQoKICAgIGRlZiByb3RhdGVfaGFsZihzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4MSwgeDIgPSB4LmNodW5rKDIsIGRpbT0tMSkKICAgICAgICByZXR1cm4gdG9yY2guY2F0KCgteDIsIHgxKSwgZGltPS0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgc2VsZi50aGV0YSkKICAgICAgICBpZHhfdGhldGEyID0gdG9yY2guY2F0KFtpZHhfdGhldGEsIGlkeF90aGV0YV0sIGRpbT0tMSkKICAgICAgICBjb3MgPSBpZHhfdGhldGEyLmNvcygpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNpbiA9IGlkeF90aGV0YTIuc2luKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgcmV0dXJuIHggKiBjb3MgKyBzZWxmLnJvdGF0ZV9oYWxmKHgpICogc2luCgpjbGFzcyBLVkNhY2hlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga3ZfY2FjaGVfc2hhcGU6IHR1cGxlLCAqKmt3YXJncykgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdkYXRhJywgdG9yY2guemVyb3Moa3ZfY2FjaGVfc2hhcGUsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KSkKICAgICAgICBzZWxmLnNlcV9sZW4gPSAwCiAgICAgICAgc2VsZi56ZXJvKCkKCiAgICBkZWYgemVybyhzZWxmKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGF0YS56ZXJvXygpCiAgICAKICAgIGRlZiBnZXRfZGF0YShzZWxmKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGNfa3Y6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGFzc2VydCBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSkgPD0gc2VsZi5kYXRhLnNpemUoMSksICJLViBDYWNoZSBFeGNlZWRlZCIKCiAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhLnRvKGNfa3YuZHR5cGUpCiAgICAgICAgc2VsZi5kYXRhWwogICAgICAgICAgICA6LCBzZWxmLnNlcV9sZW4gOiBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSksIDoKICAgICAgICBdID0gY19rdgogICAgICAgIHNlbGYuc2VxX2xlbiArPSBjX2t2LnNpemUoMSkKCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVs6LCA6c2VsZi5zZXFfbGVuXSwgc2VsZi5zZXFfbGVuCiAgICAKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICBzZWxmLlFfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLnFfbG9yYV9yYW5rLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKICAgICAgICBzZWxmLktWX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5rdl9sb3JhX3JhbmsgKyBzZWxmLnJvcGVfaGVhZF9kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuUV9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYucV9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKICAgICAgICBzZWxmLktWX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5rdl9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnZfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKCiAgICAgICAgIyBSb1BFIG9uIGhhbGYgZW1iZWRkaW5ncwogICAgICAgIHNlbGYucV9yb3BlID0gUm9QRShzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgc2VsZi5rX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKCiAgICAgICAgIyBPdXRwdXQgcHJvamVjdGlvbgogICAgICAgIHNlbGYud28gPSBubi5MaW5lYXIoc2VsZi52X2hlYWRfZGltICogc2VsZi5uX2hlYWRzLCBzZWxmLmRpbSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgogICAgICAgICMgc2VxX2xlbiA9IDEgYWx3YXlzIGhlcmUKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgIFN0ZXAgMTogSGFuZGxlIGRvd24tcHJvamVjdGlvbiArIEtWIGNhY2hlICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxX2xvcmEgPSBzZWxmLlFfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSA9IHNlbGYuS1ZfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSwga3ZfbGVuID0ga3ZfY2FjaGUoa3ZfbG9yYSkKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgIFN0ZXAgMjogVXAtcHJvamVjdCBhbmQgcHJlcGFyZSBOb1BFICsgUm9QRSAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIEhhbmRsZSBxdWVyaWVzIFEgZmlyc3QKICAgICAgICBxX25vcGVfYW5kX3JvcGUgPSBzZWxmLlFfcHJval91cChxX2xvcmEpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMgSGFuZGxlIGtleXMgYW5kIHZhbHVlcyBLL1YuIFYgZG9lcyBub3QgbmVlZCBSb1BFCiAgICAgICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAga3Zfbm9wZSA9IHNlbGYuS1ZfcHJval91cChrdl9ub3BlKS52aWV3KAogICAgICAgICAgICBiYXRjaF9zaXplLCBrdl9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKQogICAgICAgIGtfbm9wZSwgdiA9IHRvcmNoLnNwbGl0KGt2X25vcGUsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYudl9oZWFkX2RpbV0sIGRpbT0tMSkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgICBTdGVwIDM6IEhhbmRsZSBSb1BFIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICMgQ29tcHV0ZSBSb1BFIGZvciBxdWVyaWVzIGFuZCBjb21iaW5lIHdpdGggbm8tUm9QRSBwYXJ0CiAgICAgICAgcV9yb3BlID0gcV9yb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogICAgICAgIHFfcm9wZSA9IHNlbGYucV9yb3BlKHFfcm9wZSwgc3RhcnRfcG9zPXF1ZXJ5X3BvcykKCiAgICAgICAgcV9ub3BlID0gcV9ub3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogICAgICAgIHEgPSB0b3JjaC5jb25jYXQoW3Ffbm9wZSwgcV9yb3BlXSwgZGltPS0xKQoKCiAgICAgICAgIyBDb21wdXRlIFJvUEUgZm9yIGtleXMgYW5kIGNvbWJpbmUgd2l0aCBuby1Sb1BFIHBhcnQKICAgICAgICBrX3JvcGUgPSBrX3JvcGVbOiwgTm9uZSwgOiwgOl0KICAgICAgICBrX3JvcGUgPSBzZWxmLmtfcm9wZShrX3JvcGUpLmV4cGFuZCgtMSxzZWxmLm5faGVhZHMsLTEsLTEpCiAgICAgICAga19ub3BlID0ga19ub3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IGt2X2xlbiB4IG5faGVhZHMgeCByb3BlX2hlYWRfZGltCiAgICAgICAgayA9IHRvcmNoLmNvbmNhdChba19ub3BlLCBrX3JvcGVdLCBkaW09LTEpCiAgICAgICAgICAgICAgICAKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIE11bHRpLWhlYWQgQXR0ZW50aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICB2ID0gdi5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBuX2hlYWRzIHgga3ZfbGVuIHggdl9oZWFkX2RpbQogICAgICAgIHNjb3JlcyA9IHRvcmNoLm1hdG11bChxLCBrLnRyYW5zcG9zZSgtMSwgLTIpKSAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgYXR0biA9IEYuc29mdG1heChzY29yZXMsIGRpbT0tMSkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgeSA9IHRvcmNoLm1hdG11bChhdHRuLCB2KS52aWV3KGJhdGNoX3NpemUsIDEsIC0xKQogICAgICAgIHkgPSBzZWxmLndvKHkpCgogICAgICAgIHJldHVybiB5LCBrdl9jYWNoZS5nZXRfZGF0YSgpCgpfTUlOX0JMT0NLX0tWID0gMzIKCkB0cml0b24uaml0CmRlZiBfZndkX2dyb3VwZWRfa2VybmVsX3N0YWdlMSgKICAgIFEsCiAgICBLX0J1ZmZlciwKICAgIFZfQnVmZmVyLAogICAgc21fc2NhbGUsCiAgICBrdl9pbmRwdHIsCiAgICBrdl9pbmRpY2VzLAogICAgQXR0X091dCwKICAgIEF0dF9Mc2UsCiAgICBudW1fa3Zfc3BsaXRzLAogICAgc3RyaWRlX3FicywKICAgIHN0cmlkZV9xaCwKICAgIHN0cmlkZV9idWZfa2JzLAogICAgc3RyaWRlX2J1Zl9raCwKICAgIHN0cmlkZV9idWZfdmJzLAogICAgc3RyaWRlX2J1Zl92aCwKICAgIHN0cmlkZV9taWRfb2IsCiAgICBzdHJpZGVfbWlkX29oLAogICAgc3RyaWRlX21pZF9vcywKICAgIGt2X2dyb3VwX251bTogdGwuY29uc3RleHByLAogICAgcV9oZWFkX251bTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfRE1PREVMOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19EUEU6IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0RWOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19IOiB0bC5jb25zdGV4cHIsCiAgICBNSU5fQkxPQ0tfS1Y6IHRsLmNvbnN0ZXhwciwKICAgIGxvZ2l0X2NhcDogdGwuY29uc3RleHByLAogICAgTGs6IHRsLmNvbnN0ZXhwciwKICAgIEx2OiB0bC5jb25zdGV4cHIsCik6CiAgICBjdXJfYmF0Y2ggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBjdXJfaGVhZF9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGN1cl9rdl9oZWFkID0gY3VyX2hlYWRfaWQgLy8gdGwuY2Rpdihrdl9ncm91cF9udW0sIEJMT0NLX0gpCiAgICBzcGxpdF9rdl9pZCA9IHRsLnByb2dyYW1faWQoMikKCiAgICBpZiBCTE9DS19IIDwga3ZfZ3JvdXBfbnVtOgogICAgICAgIFZBTElEX0JMT0NLX0g6IHRsLmNvbnN0ZXhwciA9IEJMT0NLX0gKICAgIGVsc2U6CiAgICAgICAgVkFMSURfQkxPQ0tfSDogdGwuY29uc3RleHByID0ga3ZfZ3JvdXBfbnVtCiAgICBjdXJfaGVhZCA9IGN1cl9oZWFkX2lkICogVkFMSURfQkxPQ0tfSCArIHRsLmFyYW5nZSgwLCBCTE9DS19IKQogICAgbWFza19oID0gY3VyX2hlYWQgPCAoY3VyX2hlYWRfaWQgKyAxKSAqIFZBTElEX0JMT0NLX0gKICAgIG1hc2tfaCA9IG1hc2tfaCAmIChjdXJfaGVhZCA8IHFfaGVhZF9udW0pCgogICAgb2Zmc19kID0gdGwuYXJhbmdlKDAsIEJMT0NLX0RNT0RFTCkKICAgIG9mZnNfZHYgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfRFYpCiAgICBtYXNrX2QgPSBvZmZzX2QgPCBMawogICAgbWFza19kdiA9IG9mZnNfZHYgPCBMdgoKICAgIGN1cl9iYXRjaF9rdl9zdGFydF9pZHggPSB0bC5sb2FkKGt2X2luZHB0ciArIGN1cl9iYXRjaCkKICAgIGN1cl9iYXRjaF9zZXFfbGVuID0gdGwubG9hZChrdl9pbmRwdHIgKyBjdXJfYmF0Y2ggKyAxKSAtIGN1cl9iYXRjaF9rdl9zdGFydF9pZHgKICAgIGt2X3NwbGl0cyA9IHRsLmxvYWQobnVtX2t2X3NwbGl0cyArIGN1cl9iYXRjaCkKCiAgICBvZmZzX3EgPSBjdXJfYmF0Y2ggKiBzdHJpZGVfcWJzICsgY3VyX2hlYWRbOiwgTm9uZV0gKiBzdHJpZGVfcWggKyBvZmZzX2RbTm9uZSwgOl0KCiAgICBpZiBCTE9DS19EUEUgPiAwOgogICAgICAgIG9mZnNfZHBlID0gQkxPQ0tfRE1PREVMICsgdGwuYXJhbmdlKDAsIEJMT0NLX0RQRSkKICAgICAgICBtYXNrX2RwZSA9IG9mZnNfZHBlIDwgTGsKICAgICAgICBvZmZfcXBlID0gKAogICAgICAgICAgICBjdXJfYmF0Y2ggKiBzdHJpZGVfcWJzICsgY3VyX2hlYWRbOiwgTm9uZV0gKiBzdHJpZGVfcWggKyBvZmZzX2RwZVtOb25lLCA6XQogICAgICAgICkKCiAgICBrdl9sZW5fcGVyX3NwbGl0ID0gKAogICAgICAgIHRsLmNkaXYodGwuY2RpdihjdXJfYmF0Y2hfc2VxX2xlbiwga3Zfc3BsaXRzKSwgTUlOX0JMT0NLX0tWKSAqIE1JTl9CTE9DS19LVgogICAgKQogICAgc3BsaXRfa3Zfc3RhcnQgPSBrdl9sZW5fcGVyX3NwbGl0ICogc3BsaXRfa3ZfaWQKICAgIHNwbGl0X2t2X2VuZCA9IHRsLm1pbmltdW0oc3BsaXRfa3Zfc3RhcnQgKyBrdl9sZW5fcGVyX3NwbGl0LCBjdXJfYmF0Y2hfc2VxX2xlbikKCiAgICBlX21heCA9IHRsLnplcm9zKFtCTE9DS19IXSwgZHR5cGU9dGwuZmxvYXQzMikgLSBmbG9hdCgiaW5mIikKICAgIGVfc3VtID0gdGwuemVyb3MoW0JMT0NLX0hdLCBkdHlwZT10bC5mbG9hdDMyKQogICAgYWNjID0gdGwuemVyb3MoW0JMT0NLX0gsIEJMT0NLX0RWXSwgZHR5cGU9dGwuZmxvYXQzMikKCiAgICBpZiBzcGxpdF9rdl9lbmQgPiBzcGxpdF9rdl9zdGFydDoKICAgICAgICBxID0gdGwubG9hZChRICsgb2Zmc19xLCBtYXNrPShtYXNrX2hbOiwgTm9uZV0pICYgKG1hc2tfZFtOb25lLCA6XSksIG90aGVyPTAuMCkKICAgICAgICBpZiBCTE9DS19EUEUgPiAwOgogICAgICAgICAgICBxcGUgPSB0bC5sb2FkKAogICAgICAgICAgICAgICAgUSArIG9mZl9xcGUsIG1hc2s9KG1hc2tfaFs6LCBOb25lXSkgJiAobWFza19kcGVbTm9uZSwgOl0pLCBvdGhlcj0wLjAKICAgICAgICAgICAgKQogICAgICAgIGZvciBzdGFydF9uIGluIHJhbmdlKHNwbGl0X2t2X3N0YXJ0LCBzcGxpdF9rdl9lbmQsIEJMT0NLX04pOgogICAgICAgICAgICBvZmZzX24gPSBzdGFydF9uICsgdGwuYXJhbmdlKDAsIEJMT0NLX04pCiAgICAgICAgICAgIGt2X2xvYyA9IHRsLmxvYWQoCiAgICAgICAgICAgICAgICBrdl9pbmRpY2VzICsgY3VyX2JhdGNoX2t2X3N0YXJ0X2lkeCArIG9mZnNfbiwKICAgICAgICAgICAgICAgIG1hc2s9b2Zmc19uIDwgc3BsaXRfa3ZfZW5kLAogICAgICAgICAgICAgICAgb3RoZXI9MCwKICAgICAgICAgICAgKQogICAgICAgICAgICBvZmZzX2J1Zl9rID0gKAogICAgICAgICAgICAgICAga3ZfbG9jW05vbmUsIDpdICogc3RyaWRlX2J1Zl9rYnMKICAgICAgICAgICAgICAgICsgY3VyX2t2X2hlYWQgKiBzdHJpZGVfYnVmX2toCiAgICAgICAgICAgICAgICArIG9mZnNfZFs6LCBOb25lXQogICAgICAgICAgICApCiAgICAgICAgICAgIGsgPSB0bC5sb2FkKAogICAgICAgICAgICAgICAgS19CdWZmZXIgKyBvZmZzX2J1Zl9rLAogICAgICAgICAgICAgICAgbWFzaz0ob2Zmc19uW05vbmUsIDpdIDwgc3BsaXRfa3ZfZW5kKSAmIChtYXNrX2RbOiwgTm9uZV0pLAogICAgICAgICAgICAgICAgb3RoZXI9MC4wLAogICAgICAgICAgICApCiAgICAgICAgICAgIHFrID0gdGwuZG90KHEsIGsudG8ocS5kdHlwZSkpCiAgICAgICAgICAgIGlmIEJMT0NLX0RQRSA+IDA6CiAgICAgICAgICAgICAgICBvZmZzX2J1Zl9rcGUgPSAoCiAgICAgICAgICAgICAgICAgICAga3ZfbG9jW05vbmUsIDpdICogc3RyaWRlX2J1Zl9rYnMKICAgICAgICAgICAgICAgICAgICArIGN1cl9rdl9oZWFkICogc3RyaWRlX2J1Zl9raAogICAgICAgICAgICAgICAgICAgICsgb2Zmc19kcGVbOiwgTm9uZV0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGtwZSA9IHRsLmxvYWQoCiAgICAgICAgICAgICAgICAgICAgS19CdWZmZXIgKyBvZmZzX2J1Zl9rcGUsCiAgICAgICAgICAgICAgICAgICAgbWFzaz0ob2Zmc19uW05vbmUsIDpdIDwgc3BsaXRfa3ZfZW5kKSAmIChtYXNrX2RwZVs6LCBOb25lXSksCiAgICAgICAgICAgICAgICAgICAgb3RoZXI9MC4wLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcWsgKz0gdGwuZG90KHFwZSwga3BlLnRvKHFwZS5kdHlwZSkpCiAgICAgICAgICAgIHFrICo9IHNtX3NjYWxlCgogICAgICAgICAgICBpZiBsb2dpdF9jYXAgPiAwOgogICAgICAgICAgICAgICAgcWsgPSBsb2dpdF9jYXAgKiB0YW5oKHFrIC8gbG9naXRfY2FwKQoKICAgICAgICAgICAgcWsgPSB0bC53aGVyZSgKICAgICAgICAgICAgICAgIG1hc2tfaFs6LCBOb25lXSAmIChvZmZzX25bTm9uZSwgOl0gPCBzcGxpdF9rdl9lbmQpLCBxaywgZmxvYXQoIi1pbmYiKQogICAgICAgICAgICApCgogICAgICAgICAgICBvZmZzX2J1Zl92ID0gKAogICAgICAgICAgICAgICAga3ZfbG9jWzosIE5vbmVdICogc3RyaWRlX2J1Zl92YnMKICAgICAgICAgICAgICAgICsgY3VyX2t2X2hlYWQgKiBzdHJpZGVfYnVmX3ZoCiAgICAgICAgICAgICAgICArIG9mZnNfZHZbTm9uZSwgOl0KICAgICAgICAgICAgKQogICAgICAgICAgICB2ID0gdGwubG9hZCgKICAgICAgICAgICAgICAgIFZfQnVmZmVyICsgb2Zmc19idWZfdiwKICAgICAgICAgICAgICAgIG1hc2s9KG9mZnNfbls6LCBOb25lXSA8IHNwbGl0X2t2X2VuZCkgJiAobWFza19kdltOb25lLCA6XSksCiAgICAgICAgICAgICAgICBvdGhlcj0wLjAsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIG5fZV9tYXggPSB0bC5tYXhpbXVtKHRsLm1heChxaywgMSksIGVfbWF4KQogICAgICAgICAgICByZV9zY2FsZSA9IHRsLmV4cChlX21heCAtIG5fZV9tYXgpCiAgICAgICAgICAgIHAgPSB0bC5leHAocWsgLSBuX2VfbWF4WzosIE5vbmVdKQogICAgICAgICAgICBhY2MgKj0gcmVfc2NhbGVbOiwgTm9uZV0KICAgICAgICAgICAgYWNjICs9IHRsLmRvdChwLnRvKHYuZHR5cGUpLCB2KQoKICAgICAgICAgICAgZV9zdW0gPSBlX3N1bSAqIHJlX3NjYWxlICsgdGwuc3VtKHAsIDEpCiAgICAgICAgICAgIGVfbWF4ID0gbl9lX21heAoKICAgICAgICBvZmZzX21pZF9vID0gKAogICAgICAgICAgICBjdXJfYmF0Y2ggKiBzdHJpZGVfbWlkX29iCiAgICAgICAgICAgICsgY3VyX2hlYWRbOiwgTm9uZV0gKiBzdHJpZGVfbWlkX29oCiAgICAgICAgICAgICsgc3BsaXRfa3ZfaWQgKiBzdHJpZGVfbWlkX29zCiAgICAgICAgICAgICsgb2Zmc19kdltOb25lLCA6XQogICAgICAgICkKCiAgICAgICAgdGwuc3RvcmUoCiAgICAgICAgICAgIEF0dF9PdXQgKyBvZmZzX21pZF9vLAogICAgICAgICAgICBhY2MgLyBlX3N1bVs6LCBOb25lXSwKICAgICAgICAgICAgbWFzaz0obWFza19oWzosIE5vbmVdKSAmIChtYXNrX2R2W05vbmUsIDpdKSwKICAgICAgICApCgogICAgICAgIG9mZnNfbWlkX29fMSA9ICgKICAgICAgICAgICAgY3VyX2JhdGNoICogc3RyaWRlX21pZF9vYgogICAgICAgICAgICArIGN1cl9oZWFkICogc3RyaWRlX21pZF9vaAogICAgICAgICAgICArIHNwbGl0X2t2X2lkICogc3RyaWRlX21pZF9vcwogICAgICAgICkgLy8gTHYKCiAgICAgICAgdGwuc3RvcmUoCiAgICAgICAgICAgIEF0dF9Mc2UgKyBvZmZzX21pZF9vXzEsCiAgICAgICAgICAgIGVfbWF4ICsgdGwubG9nKGVfc3VtKSwKICAgICAgICAgICAgbWFzaz1tYXNrX2gsCiAgICAgICAgKQoKZGVmIF9kZWNvZGVfZ3JvdXBlZF9hdHRfbV9md2QoCiAgICBxLAogICAga19idWZmZXIsCiAgICB2X2J1ZmZlciwKICAgIGF0dF9vdXQsCiAgICBhdHRfbHNlLAogICAga3ZfaW5kcHRyLAogICAga3ZfaW5kaWNlcywKICAgIG51bV9rdl9zcGxpdHMsCiAgICBtYXhfa3Zfc3BsaXRzLAogICAgc21fc2NhbGUsCiAgICBsb2dpdF9jYXAsCik6CiAgICBCTE9DSyA9IDMyCiAgICBMayA9IGtfYnVmZmVyLnNoYXBlWy0xXQogICAgTHYgPSB2X2J1ZmZlci5zaGFwZVstMV0KCiAgICAjIFtUT0RPXSB3b3JrIGFyb3VuZCBzaG1lbSBsaW1pdCBvbiBNSTN4eAogICAgaWYgX2lzX2hpcCBhbmQgTGsgPj0gNTc2OgogICAgICAgIEJMT0NLID0gMTYKCiAgICBpZiBMayA9PSA1NzY6CiAgICAgICAgQkxPQ0tfRE1PREVMID0gNTEyCiAgICAgICAgQkxPQ0tfRFBFID0gNjQKICAgIGVsaWYgTGsgPT0gMjg4OgogICAgICAgIEJMT0NLX0RNT0RFTCA9IDI1NgogICAgICAgIEJMT0NLX0RQRSA9IDMyCiAgICBlbHNlOgogICAgICAgIEJMT0NLX0RNT0RFTCA9IHRyaXRvbi5uZXh0X3Bvd2VyX29mXzIoTGspCiAgICAgICAgQkxPQ0tfRFBFID0gMAogICAgQkxPQ0tfRFYgPSB0cml0b24ubmV4dF9wb3dlcl9vZl8yKEx2KQoKICAgIGJhdGNoLCBoZWFkX251bSA9IGt2X2luZHB0ci5zaGFwZVswXSAtIDEsIHEuc2hhcGVbMV0KICAgIGt2X2dyb3VwX251bSA9IHEuc2hhcGVbMV0gLy8ga19idWZmZXIuc2hhcGVbMV0KCiAgICBCTE9DS19IID0gMTYKICAgIE1BWF9LVl9TUExJVFMgPSBtYXhfa3Zfc3BsaXRzCiAgICBncmlkID0gKAogICAgICAgIGJhdGNoLAogICAgICAgIHRyaXRvbi5jZGl2KGhlYWRfbnVtLCBtaW4oQkxPQ0tfSCwga3ZfZ3JvdXBfbnVtKSksCiAgICAgICAgTUFYX0tWX1NQTElUUywKICAgICkKCiAgICBleHRyYV9rYXJncyA9IHt9CiAgICBudW1fc3RhZ2VzID0gMgoKICAgIGlmIF9pc19oaXA6CiAgICAgICAgIyBodHRwczovL3JvY20uZG9jcy5hbWQuY29tL2VuL2RvY3MtNi4yLjAvaG93LXRvL2xsbS1maW5lLXR1bmluZy1vcHRpbWl6YXRpb24vb3B0aW1pemluZy10cml0b24ta2VybmVsLmh0bWwKICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS90cml0b24tbGFuZy90cml0b24vYmxvYi9tYWluL3RoaXJkX3BhcnR5L2FtZC9iYWNrZW5kL2NvbXBpbGVyLnB5CiAgICAgICAgZXh0cmFfa2FyZ3MgPSB7IndhdmVzX3Blcl9ldSI6IDEsICJtYXRyaXhfaW5zdHJfbm9ua2RpbSI6IDE2LCAia3BhY2siOiAyfQogICAgICAgIG51bV9zdGFnZXMgPSAxCgogICAgX2Z3ZF9ncm91cGVkX2tlcm5lbF9zdGFnZTFbZ3JpZF0oCiAgICAgICAgcSwKICAgICAgICBrX2J1ZmZlciwKICAgICAgICB2X2J1ZmZlciwKICAgICAgICBzbV9zY2FsZSwKICAgICAgICBrdl9pbmRwdHIsCiAgICAgICAga3ZfaW5kaWNlcywKICAgICAgICBhdHRfb3V0LAogICAgICAgIGF0dF9sc2UsCiAgICAgICAgbnVtX2t2X3NwbGl0cywKICAgICAgICBxLnN0cmlkZSgwKSwKICAgICAgICBxLnN0cmlkZSgxKSwKICAgICAgICBrX2J1ZmZlci5zdHJpZGUoMCksCiAgICAgICAga19idWZmZXIuc3RyaWRlKDEpLAogICAgICAgIHZfYnVmZmVyLnN0cmlkZSgwKSwKICAgICAgICB2X2J1ZmZlci5zdHJpZGUoMSksCiAgICAgICAgYXR0X291dC5zdHJpZGUoMCksCiAgICAgICAgYXR0X291dC5zdHJpZGUoMSksCiAgICAgICAgYXR0X291dC5zdHJpZGUoMiksCiAgICAgICAga3ZfZ3JvdXBfbnVtPWt2X2dyb3VwX251bSwKICAgICAgICBxX2hlYWRfbnVtPWhlYWRfbnVtLAogICAgICAgIEJMT0NLX0RNT0RFTD1CTE9DS19ETU9ERUwsCiAgICAgICAgQkxPQ0tfRFBFPUJMT0NLX0RQRSwKICAgICAgICBCTE9DS19EVj1CTE9DS19EViwKICAgICAgICBCTE9DS19OPUJMT0NLLAogICAgICAgIEJMT0NLX0g9QkxPQ0tfSCwKICAgICAgICBNSU5fQkxPQ0tfS1Y9X01JTl9CTE9DS19LViwKICAgICAgICBsb2dpdF9jYXA9bG9naXRfY2FwLAogICAgICAgIG51bV93YXJwcz00LAogICAgICAgIG51bV9zdGFnZXM9bnVtX3N0YWdlcywKICAgICAgICBMaz1MaywKICAgICAgICBMdj1MdiwKICAgICAgICAqKmV4dHJhX2thcmdzLAogICAgKQoKCgoKQHRyaXRvbi5qaXQKZGVmIF9md2Rfa2VybmVsX3N0YWdlMigKICAgIE1pZF9PLAogICAgTWlkX09fMSwKICAgIE8sCiAgICBrdl9pbmRwdHIsCiAgICBudW1fa3Zfc3BsaXRzLAogICAgc3RyaWRlX21pZF9vYiwKICAgIHN0cmlkZV9taWRfb2gsCiAgICBzdHJpZGVfbWlkX29zLAogICAgc3RyaWRlX29icywKICAgIHN0cmlkZV9vaCwKICAgIE1BWF9LVl9TUExJVFM6IHRsLmNvbnN0ZXhwciwKICAgIE1JTl9CTE9DS19LVjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfRFY6IHRsLmNvbnN0ZXhwciwKICAgIEx2OiB0bC5jb25zdGV4cHIsCik6CiAgICBjdXJfYmF0Y2ggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBjdXJfaGVhZCA9IHRsLnByb2dyYW1faWQoMSkKCiAgICBjdXJfYmF0Y2hfc2VxX2xlbiA9IHRsLmxvYWQoa3ZfaW5kcHRyICsgY3VyX2JhdGNoICsgMSkgLSB0bC5sb2FkKAogICAgICAgIGt2X2luZHB0ciArIGN1cl9iYXRjaAogICAgKQogICAga3Zfc3BsaXRzID0gdGwubG9hZChudW1fa3Zfc3BsaXRzICsgY3VyX2JhdGNoKQoKICAgIG9mZnNfZCA9IHRsLmFyYW5nZSgwLCBCTE9DS19EVikKICAgIG1hc2tfZCA9IG9mZnNfZCA8IEx2CgogICAgZV9zdW0gPSAwLjAKICAgIGVfbWF4ID0gLWZsb2F0KCJpbmYiKQogICAgYWNjID0gdGwuemVyb3MoW0JMT0NLX0RWXSwgZHR5cGU9dGwuZmxvYXQzMikKCiAgICBvZmZzX3YgPSBjdXJfYmF0Y2ggKiBzdHJpZGVfbWlkX29iICsgY3VyX2hlYWQgKiBzdHJpZGVfbWlkX29oICsgb2Zmc19kCiAgICBvZmZzX2xvZ2ljID0gKGN1cl9iYXRjaCAqIHN0cmlkZV9taWRfb2IgKyBjdXJfaGVhZCAqIHN0cmlkZV9taWRfb2gpIC8vIEx2CiAgICBrdl9sZW5fcGVyX3NwbGl0ID0gKAogICAgICAgIHRsLmNkaXYodGwuY2RpdihjdXJfYmF0Y2hfc2VxX2xlbiwga3Zfc3BsaXRzKSwgTUlOX0JMT0NLX0tWKSAqIE1JTl9CTE9DS19LVgogICAgKQoKICAgIGZvciBzcGxpdF9rdl9pZCBpbiByYW5nZSgwLCBNQVhfS1ZfU1BMSVRTKToKICAgICAgICBzcGxpdF9rdl9zdGFydCA9IGt2X2xlbl9wZXJfc3BsaXQgKiBzcGxpdF9rdl9pZAogICAgICAgIHNwbGl0X2t2X2VuZCA9IHRsLm1pbmltdW0oc3BsaXRfa3Zfc3RhcnQgKyBrdl9sZW5fcGVyX3NwbGl0LCBjdXJfYmF0Y2hfc2VxX2xlbikKCiAgICAgICAgaWYgc3BsaXRfa3ZfZW5kID4gc3BsaXRfa3Zfc3RhcnQ6CiAgICAgICAgICAgIHR2ID0gdGwubG9hZCgKICAgICAgICAgICAgICAgIE1pZF9PICsgb2Zmc192ICsgc3BsaXRfa3ZfaWQgKiBzdHJpZGVfbWlkX29zLCBtYXNrPW1hc2tfZCwgb3RoZXI9MC4wCiAgICAgICAgICAgICkKICAgICAgICAgICAgdGxvZ2ljID0gdGwubG9hZChNaWRfT18xICsgb2Zmc19sb2dpYyArIHNwbGl0X2t2X2lkICogc3RyaWRlX21pZF9vcyAvLyBMdikKICAgICAgICAgICAgbl9lX21heCA9IHRsLm1heGltdW0odGxvZ2ljLCBlX21heCkKCiAgICAgICAgICAgIG9sZF9zY2FsZSA9IHRsLmV4cChlX21heCAtIG5fZV9tYXgpCiAgICAgICAgICAgIGFjYyAqPSBvbGRfc2NhbGUKICAgICAgICAgICAgZXhwX2xvZ2ljID0gdGwuZXhwKHRsb2dpYyAtIG5fZV9tYXgpCiAgICAgICAgICAgIGFjYyArPSBleHBfbG9naWMgKiB0dgoKICAgICAgICAgICAgZV9zdW0gPSBlX3N1bSAqIG9sZF9zY2FsZSArIGV4cF9sb2dpYwogICAgICAgICAgICBlX21heCA9IG5fZV9tYXgKCiAgICB0bC5zdG9yZSgKICAgICAgICBPICsgY3VyX2JhdGNoICogc3RyaWRlX29icyArIGN1cl9oZWFkICogc3RyaWRlX29oICsgb2Zmc19kLAogICAgICAgIGFjYyAvIGVfc3VtLAogICAgICAgIG1hc2s9bWFza19kLAogICAgKQoKCmRlZiBfZGVjb2RlX3NvZnRtYXhfcmVkdWNldl9md2QoCiAgICBsb2dpdHMsCiAgICBsc2UsCiAgICBxLAogICAgbywKICAgIHZfYnVmZmVyLAogICAga3ZfaW5kcHRyLAogICAgbnVtX2t2X3NwbGl0cywKICAgIG1heF9rdl9zcGxpdHMsCik6CiAgICBiYXRjaCwgaGVhZF9udW0gPSBxLnNoYXBlWzBdLCBxLnNoYXBlWzFdCiAgICBMdiA9IHZfYnVmZmVyLnNoYXBlWy0xXQogICAgQkxPQ0tfRFYgPSB0cml0b24ubmV4dF9wb3dlcl9vZl8yKEx2KQoKICAgIE1BWF9LVl9TUExJVFMgPSBtYXhfa3Zfc3BsaXRzCgogICAgZXh0cmFfa2FyZ3MgPSB7fQogICAgaWYgX2lzX2hpcDoKICAgICAgICAjIGh0dHBzOi8vcm9jbS5kb2NzLmFtZC5jb20vZW4vZG9jcy02LjIuMC9ob3ctdG8vbGxtLWZpbmUtdHVuaW5nLW9wdGltaXphdGlvbi9vcHRpbWl6aW5nLXRyaXRvbi1rZXJuZWwuaHRtbAogICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3RyaXRvbi1sYW5nL3RyaXRvbi9ibG9iL21haW4vdGhpcmRfcGFydHkvYW1kL2JhY2tlbmQvY29tcGlsZXIucHkKICAgICAgICBleHRyYV9rYXJncyA9IHsid2F2ZXNfcGVyX2V1IjogNCwgIm1hdHJpeF9pbnN0cl9ub25rZGltIjogMTYsICJrcGFjayI6IDJ9CgogICAgZ3JpZCA9IChiYXRjaCwgaGVhZF9udW0pCiAgICBfZndkX2tlcm5lbF9zdGFnZTJbZ3JpZF0oCiAgICAgICAgbG9naXRzLAogICAgICAgIGxzZSwKICAgICAgICBvLAogICAgICAgIGt2X2luZHB0ciwKICAgICAgICBudW1fa3Zfc3BsaXRzLAogICAgICAgIGxvZ2l0cy5zdHJpZGUoMCksCiAgICAgICAgbG9naXRzLnN0cmlkZSgxKSwKICAgICAgICBsb2dpdHMuc3RyaWRlKDIpLAogICAgICAgIG8uc3RyaWRlKDApLAogICAgICAgIG8uc3RyaWRlKDEpLAogICAgICAgIE1BWF9LVl9TUExJVFM9TUFYX0tWX1NQTElUUywKICAgICAgICBNSU5fQkxPQ0tfS1Y9X01JTl9CTE9DS19LViwKICAgICAgICBCTE9DS19EVj1CTE9DS19EViwKICAgICAgICBMdj1MdiwKICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICBudW1fc3RhZ2VzPTIsCiAgICAgICAgKipleHRyYV9rYXJncywKICAgICkKCgoKZGVmIGRlY29kZV9hdHRlbnRpb25fZndkX2dyb3VwZWQoCiAgICBxLAogICAga19idWZmZXIsCiAgICB2X2J1ZmZlciwKICAgIG8sCiAgICBrdl9pbmRwdHIsCiAgICBrdl9pbmRpY2VzLAogICAgYXR0bl9sb2dpdHMsCiAgICBhdHRuX2xzZSwKICAgIG51bV9rdl9zcGxpdHMsCiAgICBtYXhfa3Zfc3BsaXRzLAogICAgc21fc2NhbGUsCiAgICBsb2dpdF9jYXA9MC4wLAopOgogICAgX2RlY29kZV9ncm91cGVkX2F0dF9tX2Z3ZCgKICAgICAgICBxLAogICAgICAgIGtfYnVmZmVyLAogICAgICAgIHZfYnVmZmVyLAogICAgICAgIGF0dG5fbG9naXRzLAogICAgICAgIGF0dG5fbHNlLAogICAgICAgIGt2X2luZHB0ciwKICAgICAgICBrdl9pbmRpY2VzLAogICAgICAgIG51bV9rdl9zcGxpdHMsCiAgICAgICAgbWF4X2t2X3NwbGl0cywKICAgICAgICBzbV9zY2FsZSwKICAgICAgICBsb2dpdF9jYXAsCiAgICApCgogICAgX2RlY29kZV9zb2Z0bWF4X3JlZHVjZXZfZndkKAogICAgICAgIGF0dG5fbG9naXRzLAogICAgICAgIGF0dG5fbHNlLAogICAgICAgIHEsCiAgICAgICAgbywKICAgICAgICB2X2J1ZmZlciwKICAgICAgICBrdl9pbmRwdHIsCiAgICAgICAgbnVtX2t2X3NwbGl0cywKICAgICAgICBtYXhfa3Zfc3BsaXRzLAogICAgKQoKY2xhc3MgUGVuZ2N1b01MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAjIERvd24tcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX2Rvd25fd2VpZ2h0ID0gTm9uZQogICAgICAgICMgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd25fd2VpZ2h0ID0gTm9uZQogICAgICAgICMgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKCiAgICAgICAgIyBVcC1wcm9qZWN0aW9uIGFuZCByb3BlIHByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval91cF93ZWlnaHQgPSBOb25lCiAgICAgICAgIyBzZWxmLlFfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLnFfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5LVl9wcm9qX3VwX3dlaWdodCA9IE5vbmUKICAgICAgICAjIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IFJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQoKICAgICAgICAjIE91dHB1dCBwcm9qZWN0aW9uCiAgICAgICAgc2VsZi53b193ZWlnaHQgPSBOb25lCiAgICAgICAgIyBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwga3ZfY2FjaGU6IEtWQ2FjaGUpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgIFN0ZXAgMTogSGFuZGxlIGRvd24tcHJvamVjdGlvbiArIEtWIGNhY2hlICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjIHFfbG9yYSA9IHNlbGYuUV9wcm9qX2Rvd24oeCkKICAgICAgICBxX2xvcmEgPSB4IEAgc2VsZi5RX3Byb2pfZG93bl93ZWlnaHQuVAogICAgICAgICMga3ZfbG9yYSA9IHNlbGYuS1ZfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSA9IHggQCBzZWxmLktWX3Byb2pfZG93bl93ZWlnaHQuVAogICAgICAgIGt2X2xvcmEsIGt2X2xlbiA9IGt2X2NhY2hlKGt2X2xvcmEpCiAgICAgICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICBTdGVwIDI6IFVwLXByb2plY3QgYW5kIHByZXBhcmUgTm9QRSArIFJvUEUgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxX25vcGVfYW5kX3JvcGUgPSAocV9sb3JhIEAgc2VsZi5RX3Byb2pfdXBfd2VpZ2h0LlQpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMgSGFuZGxlIGtleXMgYW5kIHZhbHVlcyBLL1YuIFYgZG9lcyBub3QgbmVlZCBSb1BFCiAgICAgICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgU3RlcCAzOiBIYW5kbGUgUm9QRSBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3IgcXVlcmllcyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIHFfcm9wZSA9IHFfcm9wZS5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBuX2hlYWRzIHggc2VxX2xlbiB4IHJvcGVfaGVhZF9kaW0KICAgICAgICBxX3JvcGUgPSBzZWxmLnFfcm9wZShxX3JvcGUsIHN0YXJ0X3Bvcz1xdWVyeV9wb3MpCgogICAgICAgIHFfbm9wZSA9IHFfbm9wZS5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBuX2hlYWRzIHggc2VxX2xlbiB4IHJvcGVfaGVhZF9kaW0KICAgICAgICBxID0gdG9yY2guY29uY2F0KFtxX25vcGUsIHFfcm9wZV0sIGRpbT0tMSkKCiAgICAgICAgIyBDb21wdXRlIFJvUEUgZm9yIGtleXMgYW5kIGNvbWJpbmUgd2l0aCBuby1Sb1BFIHBhcnQKICAgICAgICBrX3JvcGUgPSBrX3JvcGVbOiwgTm9uZSwgOiwgOl0KICAgICAgICBrX3JvcGUgPSBzZWxmLmtfcm9wZShrX3JvcGUpCgogICAgICAgIGt2X3VwX3dlaWdodCA9IHNlbGYuS1ZfcHJval91cF93ZWlnaHQudmlldyhzZWxmLm5faGVhZHMsIHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSwgLTEpCiAgICAgICAgd19rYyA9IGt2X3VwX3dlaWdodFs6LCA6c2VsZi5ub3BlX2hlYWRfZGltLCA6XQogICAgICAgIHdfdmMgPSBrdl91cF93ZWlnaHRbOiwgc2VsZi5ub3BlX2hlYWRfZGltOiwgOl0KICAgICAgICB3X3ZjID0gd192Yy5wZXJtdXRlKDAsIDIsIDEpCgogICAgICAgIG1sYV9pbnB1dF9ub3BlID0gcV9ub3BlIEAgd19rYwogICAgICAgIG1sYV9xX2lucHV0ID0gdG9yY2guY29uY2F0KFttbGFfaW5wdXRfbm9wZSwgcV9yb3BlXSwgZGltPS0xKQogICAgICAgIG1sYV9rX2lucHV0ID0ga3ZfbG9yYS5jbG9uZSgpLnVuc3F1ZWV6ZSgxKQogICAgICAgIG1sYV9rX2lucHV0Wy4uLiwgc2VsZi5rdl9sb3JhX3Jhbms6XSA9IGtfcm9wZQoKICAgICAgICBmbGFzaF9tbGFfa19idWYgPSBtbGFfa19pbnB1dAogICAgICAgIGZsYXNoX21sYV9xID0gbWxhX3FfaW5wdXQudmlldyhiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIC0xKQoKICAgICAgICB0b3RhbF90b2tlbnMgPSBiYXRjaF9zaXplICoga3ZfbGVuCiAgICAgICAga19idWZmZXIgPSBmbGFzaF9tbGFfa19idWYuc3F1ZWV6ZSgxKS5yZXNoYXBlKC0xLCAxLCBzZWxmLmt2X2xvcmFfcmFuayArIHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICB2X2J1ZmZlciA9IGtfYnVmZmVyWy4uLiwgOnNlbGYua3ZfbG9yYV9yYW5rXQoKICAgICAgICBmbGFzaF9vdXRwdXQgPSB0b3JjaC56ZXJvcyhiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIHNlbGYua3ZfbG9yYV9yYW5rLCBkdHlwZT14LmR0eXBlLCBkZXZpY2U9ImN1ZGEiKQoKICAgICAgICBiX3NlcV9sZW4gPSB0b3JjaC5mdWxsKChiYXRjaF9zaXplLCksIGt2X2xlbiwgZGV2aWNlPSJjdWRhIikKICAgICAgICBrdl9pbmRwdHIgPSB0b3JjaC56ZXJvcygoYmF0Y2hfc2l6ZSArIDEsKSwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0iY3VkYSIpCiAgICAgICAga3ZfaW5kcHRyWzEgOiBiYXRjaF9zaXplICsgMV0gPSB0b3JjaC5jdW1zdW0oYl9zZXFfbGVuWzpiYXRjaF9zaXplXSwgZGltPTApCiAgICAgICAga3ZfaW5kaWNlcyA9IHRvcmNoLmFyYW5nZSh0b3RhbF90b2tlbnMsIGRldmljZT0iY3VkYSIpCgogICAgICAgIG1heF9rdl9zcGxpdHMgPSA4CiAgICAgICAgbnVtX2t2X3NwbGl0cyA9IHRvcmNoLmZ1bGwoKGJhdGNoX3NpemUsKSwgMSwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0iY3VkYSIpCiAgICAgICAgYXR0bl9sb2dpdHMxID0gdG9yY2guZW1wdHkoCiAgICAgICAgICAgIChiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIG1heF9rdl9zcGxpdHMsIHNlbGYua3ZfbG9yYV9yYW5rKSwKICAgICAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQzMiwKICAgICAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICApCiAgICAgICAgYXR0bl9sc2UxID0gdG9yY2guZW1wdHkoCiAgICAgICAgICAgIChiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIG1heF9rdl9zcGxpdHMsIHNlbGYua3ZfbG9yYV9yYW5rKSwKICAgICAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQzMiwKICAgICAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICApCgogICAgICAgIHNtX3NjYWxlID0gMS4wIC8gbWF0aC5zcXJ0KHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkKICAgICAgICBkZWNvZGVfYXR0ZW50aW9uX2Z3ZF9ncm91cGVkKAogICAgICAgICAgICBmbGFzaF9tbGFfcSwKICAgICAgICAgICAga19idWZmZXIsCiAgICAgICAgICAgIHZfYnVmZmVyLAogICAgICAgICAgICBmbGFzaF9vdXRwdXQsCiAgICAgICAgICAgIGt2X2luZHB0ciwKICAgICAgICAgICAga3ZfaW5kaWNlcywKICAgICAgICAgICAgYXR0bl9sb2dpdHMxLAogICAgICAgICAgICBhdHRuX2xzZTEsCiAgICAgICAgICAgIG51bV9rdl9zcGxpdHMsCiAgICAgICAgICAgIG1heF9rdl9zcGxpdHMsCiAgICAgICAgICAgIHNtX3NjYWxlLAogICAgICAgICkKICAgICAgICAjIGZsYXNoX291dHB1dCA9IGZsYXNoX291dHB1dC51bnNxdWVlemUoMikKICAgICAgICAjIG1sYV9vdXQgPSBmbGFzaF9vdXRwdXQgQCB3X3ZjCiAgICAgICAgIyBtbGFfb3V0ID0gbWxhX291dC52aWV3KGJhdGNoX3NpemUsIDEsIC0xKQogICAgICAgICMgbWxhX291dCA9IG1sYV9vdXQgQCBzZWxmLndvX3dlaWdodC5UCgogICAgICAgIGZsYXNoX291dHB1dCA9IGZsYXNoX291dHB1dC5wZXJtdXRlKDEsIDAsIDIpCiAgICAgICAgIyBoLCBiLCAxMjggPSBoLCBiLCA1MTIgQCBoLCA1MTIsIDEyOAogICAgICAgIG1sYV9vdXQgPSBmbGFzaF9vdXRwdXQgQCB3X3ZjCgogICAgICAgICMgaCwgYiwgNzE2OCA9IGgsIGIsIDEyOCBAIGgsIDEyOCA3MTY4CiAgICAgICAgbWxhX291dCA9IG1sYV9vdXQgQCBzZWxmLndvX3dlaWdodC5ULnZpZXcoLTEsIDEyOCwgNzE2OCkKICAgICAgICAKICAgICAgICAjIGgsIGIsIDcxNjggPT4gYiwgMSA3MTY4CiAgICAgICAgbWxhX291dCA9IHRvcmNoLnN1bShtbGFfb3V0LCBkaW09MCkKICAgICAgICBtbGFfb3V0ID0gbWxhX291dC52aWV3KGJhdGNoX3NpemUsIDEsIC0xKQoKICAgICAgICByZXR1cm4gbWxhX291dCwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQoKICAgIG1vZGVsID0gUGVuZ2N1b01MQShjb25maWcpLnRvKCdjdWRhJykKICAgIG1vZGVsLlFfcHJval9kb3duX3dlaWdodCA9IGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQKICAgIG1vZGVsLlFfcHJval91cF93ZWlnaHQgPSBjb25maWcuUV9wcm9qX3VwX3dlaWdodAogICAgbW9kZWwuS1ZfcHJval9kb3duX3dlaWdodCA9IGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0CiAgICBtb2RlbC5LVl9wcm9qX3VwX3dlaWdodCA9IGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodAogICAgbW9kZWwud29fd2VpZ2h0ID0gY29uZmlnLndvX3dlaWdodAoKICAgIG91dHB1dCwga3ZfY2FjaGUgPSBtb2RlbCh4LCBrdl9jYWNoZSkKICAgIHJldHVybiBvdXRwdXQsIGt2X2NhY2hl

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

- aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKCgppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKX2lzX2hpcCA9IFRydWUKCmNsYXNzIFJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCJ0aGV0YSIsIHRoZXRhKQoKICAgIGRlZiByb3RhdGVfaGFsZihzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4MSwgeDIgPSB4LmNodW5rKDIsIGRpbT0tMSkKICAgICAgICByZXR1cm4gdG9yY2guY2F0KCgteDIsIHgxKSwgZGltPS0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgc2VsZi50aGV0YSkKICAgICAgICBpZHhfdGhldGEyID0gdG9yY2guY2F0KFtpZHhfdGhldGEsIGlkeF90aGV0YV0sIGRpbT0tMSkKICAgICAgICBjb3MgPSBpZHhfdGhldGEyLmNvcygpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNpbiA9IGlkeF90aGV0YTIuc2luKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgcmV0dXJuIHggKiBjb3MgKyBzZWxmLnJvdGF0ZV9oYWxmKHgpICogc2luCgpjbGFzcyBLVkNhY2hlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga3ZfY2FjaGVfc2hhcGU6IHR1cGxlLCAqKmt3YXJncykgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdkYXRhJywgdG9yY2guemVyb3Moa3ZfY2FjaGVfc2hhcGUsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KSkKICAgICAgICBzZWxmLnNlcV9sZW4gPSAwCiAgICAgICAgc2VsZi56ZXJvKCkKCiAgICBkZWYgemVybyhzZWxmKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGF0YS56ZXJvXygpCiAgICAKICAgIGRlZiBnZXRfZGF0YShzZWxmKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGNfa3Y6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGFzc2VydCBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSkgPD0gc2VsZi5kYXRhLnNpemUoMSksICJLViBDYWNoZSBFeGNlZWRlZCIKCiAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhLnRvKGNfa3YuZHR5cGUpCiAgICAgICAgc2VsZi5kYXRhWwogICAgICAgICAgICA6LCBzZWxmLnNlcV9sZW4gOiBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSksIDoKICAgICAgICBdID0gY19rdgogICAgICAgIHNlbGYuc2VxX2xlbiArPSBjX2t2LnNpemUoMSkKCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVs6LCA6c2VsZi5zZXFfbGVuXSwgc2VsZi5zZXFfbGVuCiAgICAKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAjIERvd24tcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYucV9sb3JhX3JhbmssIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuS1ZfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLmt2X2xvcmFfcmFuayArIHNlbGYucm9wZV9oZWFkX2RpbSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCgogICAgICAgICMgVXAtcHJvamVjdGlvbiBhbmQgcm9wZSBwcm9qZWN0aW9uIG1hdHJpY2VzCiAgICAgICAgc2VsZi5RX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5xX2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IFJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQoKICAgICAgICAjIE91dHB1dCBwcm9qZWN0aW9uCiAgICAgICAgc2VsZi53byA9IG5uLkxpbmVhcihzZWxmLnZfaGVhZF9kaW0gKiBzZWxmLm5faGVhZHMsIHNlbGYuZGltLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKICAgICAgICBzZWxmLmVwcyA9IDFlLTYKICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIGt2X2NhY2hlOiBLVkNhY2hlKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgIyBzZXFfbGVuID0gMSBhbHdheXMgaGVyZQogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIG1vZGVsX2RpbSA9IHguc2l6ZSgpCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgU3RlcCAxOiBIYW5kbGUgZG93bi1wcm9qZWN0aW9uICsgS1YgY2FjaGUgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgIHFfbG9yYSA9IHNlbGYuUV9wcm9qX2Rvd24oeCkKICAgICAgICBrdl9sb3JhID0gc2VsZi5LVl9wcm9qX2Rvd24oeCkKICAgICAgICBrdl9sb3JhLCBrdl9sZW4gPSBrdl9jYWNoZShrdl9sb3JhKQogICAgICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgU3RlcCAyOiBVcC1wcm9qZWN0IGFuZCBwcmVwYXJlIE5vUEUgKyBSb1BFICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICMgSGFuZGxlIHF1ZXJpZXMgUSBmaXJzdAogICAgICAgIHFfbm9wZV9hbmRfcm9wZSA9IHNlbGYuUV9wcm9qX3VwKHFfbG9yYSkudmlldygKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgc2VsZi5uX2hlYWRzLCBzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgcV9ub3BlLCBxX3JvcGUgPSB0b3JjaC5zcGxpdChxX25vcGVfYW5kX3JvcGUsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkKCiAgICAgICAgIyBIYW5kbGUga2V5cyBhbmQgdmFsdWVzIEsvVi4gViBkb2VzIG5vdCBuZWVkIFJvUEUKICAgICAgICBrdl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbc2VsZi5rdl9sb3JhX3JhbmssIHNlbGYucm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkKICAgICAgICBrdl9ub3BlID0gc2VsZi5LVl9wcm9qX3VwKGt2X25vcGUpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIGt2X2xlbiwgc2VsZi5uX2hlYWRzLCBzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnZfaGVhZF9kaW0pCiAgICAgICAga19ub3BlLCB2ID0gdG9yY2guc3BsaXQoa3Zfbm9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi52X2hlYWRfZGltXSwgZGltPS0xKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICAgIFN0ZXAgMzogSGFuZGxlIFJvUEUgU3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgIyBDb21wdXRlIFJvUEUgZm9yIHF1ZXJpZXMgYW5kIGNvbWJpbmUgd2l0aCBuby1Sb1BFIHBhcnQKICAgICAgICBxX3JvcGUgPSBxX3JvcGUucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHggbl9oZWFkcyB4IHNlcV9sZW4geCByb3BlX2hlYWRfZGltCiAgICAgICAgcV9yb3BlID0gc2VsZi5xX3JvcGUocV9yb3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKQoKICAgICAgICBxX25vcGUgPSBxX25vcGUucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHggbl9oZWFkcyB4IHNlcV9sZW4geCByb3BlX2hlYWRfZGltCiAgICAgICAgcSA9IHRvcmNoLmNvbmNhdChbcV9ub3BlLCBxX3JvcGVdLCBkaW09LTEpCgoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3Iga2V5cyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIGtfcm9wZSA9IGtfcm9wZVs6LCBOb25lLCA6LCA6XQogICAgICAgIGtfcm9wZSA9IHNlbGYua19yb3BlKGtfcm9wZSkuZXhwYW5kKC0xLHNlbGYubl9oZWFkcywtMSwtMSkKICAgICAgICBrX25vcGUgPSBrX25vcGUucGVybXV0ZSgwLCAyLCAxLCAzKSAjIGJzIHgga3ZfbGVuIHggbl9oZWFkcyB4IHJvcGVfaGVhZF9kaW0KICAgICAgICBrID0gdG9yY2guY29uY2F0KFtrX25vcGUsIGtfcm9wZV0sIGRpbT0tMSkKICAgICAgICAgICAgICAgIAogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgIENvbXB1dGUgTXVsdGktaGVhZCBBdHRlbnRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgIHYgPSB2LnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBrdl9sZW4geCB2X2hlYWRfZGltCiAgICAgICAgc2NvcmVzID0gdG9yY2gubWF0bXVsKHEsIGsudHJhbnNwb3NlKC0xLCAtMikpIC8gbWF0aC5zcXJ0KHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkKICAgICAgICBhdHRuID0gRi5zb2Z0bWF4KHNjb3JlcywgZGltPS0xKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICB5ID0gdG9yY2gubWF0bXVsKGF0dG4sIHYpLnZpZXcoYmF0Y2hfc2l6ZSwgMSwgLTEpCiAgICAgICAgeSA9IHNlbGYud28oeSkKCiAgICAgICAgcmV0dXJuIHksIGt2X2NhY2hlLmdldF9kYXRhKCkKCgpfTUlOX0JMT0NLX0tWID0gMzIKCkB0cml0b24uaml0CmRlZiBfZndkX2dyb3VwZWRfa2VybmVsX3N0YWdlMSgKICAgIFEsCiAgICBLX0J1ZmZlciwKICAgIFZfQnVmZmVyLAogICAgc21fc2NhbGUsCiAgICBrdl9pbmRwdHIsCiAgICBrdl9pbmRpY2VzLAogICAgQXR0X091dCwKICAgIEF0dF9Mc2UsCiAgICBudW1fa3Zfc3BsaXRzLAogICAgc3RyaWRlX3FicywKICAgIHN0cmlkZV9xaCwKICAgIHN0cmlkZV9idWZfa2JzLAogICAgc3RyaWRlX2J1Zl9raCwKICAgIHN0cmlkZV9idWZfdmJzLAogICAgc3RyaWRlX2J1Zl92aCwKICAgIHN0cmlkZV9taWRfb2IsCiAgICBzdHJpZGVfbWlkX29oLAogICAgc3RyaWRlX21pZF9vcywKICAgIGt2X2dyb3VwX251bTogdGwuY29uc3RleHByLAogICAgcV9oZWFkX251bTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfRE1PREVMOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19EUEU6IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0RWOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19IOiB0bC5jb25zdGV4cHIsCiAgICBNSU5fQkxPQ0tfS1Y6IHRsLmNvbnN0ZXhwciwKICAgIGxvZ2l0X2NhcDogdGwuY29uc3RleHByLAogICAgTGs6IHRsLmNvbnN0ZXhwciwKICAgIEx2OiB0bC5jb25zdGV4cHIsCik6CiAgICBjdXJfYmF0Y2ggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBjdXJfaGVhZF9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGN1cl9rdl9oZWFkID0gY3VyX2hlYWRfaWQgLy8gdGwuY2Rpdihrdl9ncm91cF9udW0sIEJMT0NLX0gpCiAgICBzcGxpdF9rdl9pZCA9IHRsLnByb2dyYW1faWQoMikKCiAgICBpZiBCTE9DS19IIDwga3ZfZ3JvdXBfbnVtOgogICAgICAgIFZBTElEX0JMT0NLX0g6IHRsLmNvbnN0ZXhwciA9IEJMT0NLX0gKICAgIGVsc2U6CiAgICAgICAgVkFMSURfQkxPQ0tfSDogdGwuY29uc3RleHByID0ga3ZfZ3JvdXBfbnVtCiAgICBjdXJfaGVhZCA9IGN1cl9oZWFkX2lkICogVkFMSURfQkxPQ0tfSCArIHRsLmFyYW5nZSgwLCBCTE9DS19IKQogICAgbWFza19oID0gY3VyX2hlYWQgPCAoY3VyX2hlYWRfaWQgKyAxKSAqIFZBTElEX0JMT0NLX0gKICAgIG1hc2tfaCA9IG1hc2tfaCAmIChjdXJfaGVhZCA8IHFfaGVhZF9udW0pCgogICAgb2Zmc19kID0gdGwuYXJhbmdlKDAsIEJMT0NLX0RNT0RFTCkKICAgIG9mZnNfZHYgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfRFYpCiAgICBtYXNrX2QgPSBvZmZzX2QgPCBMawogICAgbWFza19kdiA9IG9mZnNfZHYgPCBMdgoKICAgIGN1cl9iYXRjaF9rdl9zdGFydF9pZHggPSB0bC5sb2FkKGt2X2luZHB0ciArIGN1cl9iYXRjaCkKICAgIGN1cl9iYXRjaF9zZXFfbGVuID0gdGwubG9hZChrdl9pbmRwdHIgKyBjdXJfYmF0Y2ggKyAxKSAtIGN1cl9iYXRjaF9rdl9zdGFydF9pZHgKICAgIGt2X3NwbGl0cyA9IHRsLmxvYWQobnVtX2t2X3NwbGl0cyArIGN1cl9iYXRjaCkKCiAgICBvZmZzX3EgPSBjdXJfYmF0Y2ggKiBzdHJpZGVfcWJzICsgY3VyX2hlYWRbOiwgTm9uZV0gKiBzdHJpZGVfcWggKyBvZmZzX2RbTm9uZSwgOl0KCiAgICBpZiBCTE9DS19EUEUgPiAwOgogICAgICAgIG9mZnNfZHBlID0gQkxPQ0tfRE1PREVMICsgdGwuYXJhbmdlKDAsIEJMT0NLX0RQRSkKICAgICAgICBtYXNrX2RwZSA9IG9mZnNfZHBlIDwgTGsKICAgICAgICBvZmZfcXBlID0gKAogICAgICAgICAgICBjdXJfYmF0Y2ggKiBzdHJpZGVfcWJzICsgY3VyX2hlYWRbOiwgTm9uZV0gKiBzdHJpZGVfcWggKyBvZmZzX2RwZVtOb25lLCA6XQogICAgICAgICkKCiAgICBrdl9sZW5fcGVyX3NwbGl0ID0gKAogICAgICAgIHRsLmNkaXYodGwuY2RpdihjdXJfYmF0Y2hfc2VxX2xlbiwga3Zfc3BsaXRzKSwgTUlOX0JMT0NLX0tWKSAqIE1JTl9CTE9DS19LVgogICAgKQogICAgc3BsaXRfa3Zfc3RhcnQgPSBrdl9sZW5fcGVyX3NwbGl0ICogc3BsaXRfa3ZfaWQKICAgIHNwbGl0X2t2X2VuZCA9IHRsLm1pbmltdW0oc3BsaXRfa3Zfc3RhcnQgKyBrdl9sZW5fcGVyX3NwbGl0LCBjdXJfYmF0Y2hfc2VxX2xlbikKCiAgICBlX21heCA9IHRsLnplcm9zKFtCTE9DS19IXSwgZHR5cGU9dGwuZmxvYXQzMikgLSBmbG9hdCgiaW5mIikKICAgIGVfc3VtID0gdGwuemVyb3MoW0JMT0NLX0hdLCBkdHlwZT10bC5mbG9hdDMyKQogICAgYWNjID0gdGwuemVyb3MoW0JMT0NLX0gsIEJMT0NLX0RWXSwgZHR5cGU9dGwuZmxvYXQzMikKCiAgICBpZiBzcGxpdF9rdl9lbmQgPiBzcGxpdF9rdl9zdGFydDoKICAgICAgICBxID0gdGwubG9hZChRICsgb2Zmc19xLCBtYXNrPShtYXNrX2hbOiwgTm9uZV0pICYgKG1hc2tfZFtOb25lLCA6XSksIG90aGVyPTAuMCkKICAgICAgICBpZiBCTE9DS19EUEUgPiAwOgogICAgICAgICAgICBxcGUgPSB0bC5sb2FkKAogICAgICAgICAgICAgICAgUSArIG9mZl9xcGUsIG1hc2s9KG1hc2tfaFs6LCBOb25lXSkgJiAobWFza19kcGVbTm9uZSwgOl0pLCBvdGhlcj0wLjAKICAgICAgICAgICAgKQogICAgICAgIGZvciBzdGFydF9uIGluIHJhbmdlKHNwbGl0X2t2X3N0YXJ0LCBzcGxpdF9rdl9lbmQsIEJMT0NLX04pOgogICAgICAgICAgICBvZmZzX24gPSBzdGFydF9uICsgdGwuYXJhbmdlKDAsIEJMT0NLX04pCiAgICAgICAgICAgIGt2X2xvYyA9IHRsLmxvYWQoCiAgICAgICAgICAgICAgICBrdl9pbmRpY2VzICsgY3VyX2JhdGNoX2t2X3N0YXJ0X2lkeCArIG9mZnNfbiwKICAgICAgICAgICAgICAgIG1hc2s9b2Zmc19uIDwgc3BsaXRfa3ZfZW5kLAogICAgICAgICAgICAgICAgb3RoZXI9MCwKICAgICAgICAgICAgKQogICAgICAgICAgICBvZmZzX2J1Zl9rID0gKAogICAgICAgICAgICAgICAga3ZfbG9jW05vbmUsIDpdICogc3RyaWRlX2J1Zl9rYnMKICAgICAgICAgICAgICAgICsgY3VyX2t2X2hlYWQgKiBzdHJpZGVfYnVmX2toCiAgICAgICAgICAgICAgICArIG9mZnNfZFs6LCBOb25lXQogICAgICAgICAgICApCiAgICAgICAgICAgIGsgPSB0bC5sb2FkKAogICAgICAgICAgICAgICAgS19CdWZmZXIgKyBvZmZzX2J1Zl9rLAogICAgICAgICAgICAgICAgbWFzaz0ob2Zmc19uW05vbmUsIDpdIDwgc3BsaXRfa3ZfZW5kKSAmIChtYXNrX2RbOiwgTm9uZV0pLAogICAgICAgICAgICAgICAgb3RoZXI9MC4wLAogICAgICAgICAgICApCiAgICAgICAgICAgIHFrID0gdGwuZG90KHEsIGsudG8ocS5kdHlwZSkpCiAgICAgICAgICAgIGlmIEJMT0NLX0RQRSA+IDA6CiAgICAgICAgICAgICAgICBvZmZzX2J1Zl9rcGUgPSAoCiAgICAgICAgICAgICAgICAgICAga3ZfbG9jW05vbmUsIDpdICogc3RyaWRlX2J1Zl9rYnMKICAgICAgICAgICAgICAgICAgICArIGN1cl9rdl9oZWFkICogc3RyaWRlX2J1Zl9raAogICAgICAgICAgICAgICAgICAgICsgb2Zmc19kcGVbOiwgTm9uZV0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGtwZSA9IHRsLmxvYWQoCiAgICAgICAgICAgICAgICAgICAgS19CdWZmZXIgKyBvZmZzX2J1Zl9rcGUsCiAgICAgICAgICAgICAgICAgICAgbWFzaz0ob2Zmc19uW05vbmUsIDpdIDwgc3BsaXRfa3ZfZW5kKSAmIChtYXNrX2RwZVs6LCBOb25lXSksCiAgICAgICAgICAgICAgICAgICAgb3RoZXI9MC4wLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcWsgKz0gdGwuZG90KHFwZSwga3BlLnRvKHFwZS5kdHlwZSkpCiAgICAgICAgICAgIHFrICo9IHNtX3NjYWxlCgogICAgICAgICAgICBpZiBsb2dpdF9jYXAgPiAwOgogICAgICAgICAgICAgICAgcWsgPSBsb2dpdF9jYXAgKiB0YW5oKHFrIC8gbG9naXRfY2FwKQoKICAgICAgICAgICAgcWsgPSB0bC53aGVyZSgKICAgICAgICAgICAgICAgIG1hc2tfaFs6LCBOb25lXSAmIChvZmZzX25bTm9uZSwgOl0gPCBzcGxpdF9rdl9lbmQpLCBxaywgZmxvYXQoIi1pbmYiKQogICAgICAgICAgICApCgogICAgICAgICAgICBvZmZzX2J1Zl92ID0gKAogICAgICAgICAgICAgICAga3ZfbG9jWzosIE5vbmVdICogc3RyaWRlX2J1Zl92YnMKICAgICAgICAgICAgICAgICsgY3VyX2t2X2hlYWQgKiBzdHJpZGVfYnVmX3ZoCiAgICAgICAgICAgICAgICArIG9mZnNfZHZbTm9uZSwgOl0KICAgICAgICAgICAgKQogICAgICAgICAgICB2ID0gdGwubG9hZCgKICAgICAgICAgICAgICAgIFZfQnVmZmVyICsgb2Zmc19idWZfdiwKICAgICAgICAgICAgICAgIG1hc2s9KG9mZnNfbls6LCBOb25lXSA8IHNwbGl0X2t2X2VuZCkgJiAobWFza19kdltOb25lLCA6XSksCiAgICAgICAgICAgICAgICBvdGhlcj0wLjAsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIG5fZV9tYXggPSB0bC5tYXhpbXVtKHRsLm1heChxaywgMSksIGVfbWF4KQogICAgICAgICAgICByZV9zY2FsZSA9IHRsLmV4cChlX21heCAtIG5fZV9tYXgpCiAgICAgICAgICAgIHAgPSB0bC5leHAocWsgLSBuX2VfbWF4WzosIE5vbmVdKQogICAgICAgICAgICBhY2MgKj0gcmVfc2NhbGVbOiwgTm9uZV0KICAgICAgICAgICAgYWNjICs9IHRsLmRvdChwLnRvKHYuZHR5cGUpLCB2KQoKICAgICAgICAgICAgZV9zdW0gPSBlX3N1bSAqIHJlX3NjYWxlICsgdGwuc3VtKHAsIDEpCiAgICAgICAgICAgIGVfbWF4ID0gbl9lX21heAoKICAgICAgICBvZmZzX21pZF9vID0gKAogICAgICAgICAgICBjdXJfYmF0Y2ggKiBzdHJpZGVfbWlkX29iCiAgICAgICAgICAgICsgY3VyX2hlYWRbOiwgTm9uZV0gKiBzdHJpZGVfbWlkX29oCiAgICAgICAgICAgICsgc3BsaXRfa3ZfaWQgKiBzdHJpZGVfbWlkX29zCiAgICAgICAgICAgICsgb2Zmc19kdltOb25lLCA6XQogICAgICAgICkKCiAgICAgICAgdGwuc3RvcmUoCiAgICAgICAgICAgIEF0dF9PdXQgKyBvZmZzX21pZF9vLAogICAgICAgICAgICBhY2MgLyBlX3N1bVs6LCBOb25lXSwKICAgICAgICAgICAgbWFzaz0obWFza19oWzosIE5vbmVdKSAmIChtYXNrX2R2W05vbmUsIDpdKSwKICAgICAgICApCgogICAgICAgIG9mZnNfbWlkX29fMSA9ICgKICAgICAgICAgICAgY3VyX2JhdGNoICogc3RyaWRlX21pZF9vYgogICAgICAgICAgICArIGN1cl9oZWFkICogc3RyaWRlX21pZF9vaAogICAgICAgICAgICArIHNwbGl0X2t2X2lkICogc3RyaWRlX21pZF9vcwogICAgICAgICkgLy8gTHYKCiAgICAgICAgdGwuc3RvcmUoCiAgICAgICAgICAgIEF0dF9Mc2UgKyBvZmZzX21pZF9vXzEsCiAgICAgICAgICAgIGVfbWF4ICsgdGwubG9nKGVfc3VtKSwKICAgICAgICAgICAgbWFzaz1tYXNrX2gsCiAgICAgICAgKQoKZGVmIF9kZWNvZGVfZ3JvdXBlZF9hdHRfbV9md2QoCiAgICBxLAogICAga19idWZmZXIsCiAgICB2X2J1ZmZlciwKICAgIGF0dF9vdXQsCiAgICBhdHRfbHNlLAogICAga3ZfaW5kcHRyLAogICAga3ZfaW5kaWNlcywKICAgIG51bV9rdl9zcGxpdHMsCiAgICBtYXhfa3Zfc3BsaXRzLAogICAgc21fc2NhbGUsCiAgICBsb2dpdF9jYXAsCik6CiAgICBCTE9DSyA9IDMyCiAgICBMayA9IGtfYnVmZmVyLnNoYXBlWy0xXQogICAgTHYgPSB2X2J1ZmZlci5zaGFwZVstMV0KCiAgICAjIFtUT0RPXSB3b3JrIGFyb3VuZCBzaG1lbSBsaW1pdCBvbiBNSTN4eAogICAgaWYgX2lzX2hpcCBhbmQgTGsgPj0gNTc2OgogICAgICAgIEJMT0NLID0gMTYKCiAgICBpZiBMayA9PSA1NzY6CiAgICAgICAgQkxPQ0tfRE1PREVMID0gNTEyCiAgICAgICAgQkxPQ0tfRFBFID0gNjQKICAgIGVsaWYgTGsgPT0gMjg4OgogICAgICAgIEJMT0NLX0RNT0RFTCA9IDI1NgogICAgICAgIEJMT0NLX0RQRSA9IDMyCiAgICBlbHNlOgogICAgICAgIEJMT0NLX0RNT0RFTCA9IHRyaXRvbi5uZXh0X3Bvd2VyX29mXzIoTGspCiAgICAgICAgQkxPQ0tfRFBFID0gMAogICAgQkxPQ0tfRFYgPSB0cml0b24ubmV4dF9wb3dlcl9vZl8yKEx2KQoKICAgIGJhdGNoLCBoZWFkX251bSA9IGt2X2luZHB0ci5zaGFwZVswXSAtIDEsIHEuc2hhcGVbMV0KICAgIGt2X2dyb3VwX251bSA9IHEuc2hhcGVbMV0gLy8ga19idWZmZXIuc2hhcGVbMV0KCiAgICBCTE9DS19IID0gMTYKICAgIE1BWF9LVl9TUExJVFMgPSBtYXhfa3Zfc3BsaXRzCiAgICBncmlkID0gKAogICAgICAgIGJhdGNoLAogICAgICAgIHRyaXRvbi5jZGl2KGhlYWRfbnVtLCBtaW4oQkxPQ0tfSCwga3ZfZ3JvdXBfbnVtKSksCiAgICAgICAgTUFYX0tWX1NQTElUUywKICAgICkKCiAgICBleHRyYV9rYXJncyA9IHt9CiAgICBudW1fc3RhZ2VzID0gMgoKICAgIGlmIF9pc19oaXA6CiAgICAgICAgIyBodHRwczovL3JvY20uZG9jcy5hbWQuY29tL2VuL2RvY3MtNi4yLjAvaG93LXRvL2xsbS1maW5lLXR1bmluZy1vcHRpbWl6YXRpb24vb3B0aW1pemluZy10cml0b24ta2VybmVsLmh0bWwKICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS90cml0b24tbGFuZy90cml0b24vYmxvYi9tYWluL3RoaXJkX3BhcnR5L2FtZC9iYWNrZW5kL2NvbXBpbGVyLnB5CiAgICAgICAgZXh0cmFfa2FyZ3MgPSB7IndhdmVzX3Blcl9ldSI6IDEsICJtYXRyaXhfaW5zdHJfbm9ua2RpbSI6IDE2LCAia3BhY2siOiAyfQogICAgICAgIG51bV9zdGFnZXMgPSAxCgogICAgX2Z3ZF9ncm91cGVkX2tlcm5lbF9zdGFnZTFbZ3JpZF0oCiAgICAgICAgcSwKICAgICAgICBrX2J1ZmZlciwKICAgICAgICB2X2J1ZmZlciwKICAgICAgICBzbV9zY2FsZSwKICAgICAgICBrdl9pbmRwdHIsCiAgICAgICAga3ZfaW5kaWNlcywKICAgICAgICBhdHRfb3V0LAogICAgICAgIGF0dF9sc2UsCiAgICAgICAgbnVtX2t2X3NwbGl0cywKICAgICAgICBxLnN0cmlkZSgwKSwKICAgICAgICBxLnN0cmlkZSgxKSwKICAgICAgICBrX2J1ZmZlci5zdHJpZGUoMCksCiAgICAgICAga19idWZmZXIuc3RyaWRlKDEpLAogICAgICAgIHZfYnVmZmVyLnN0cmlkZSgwKSwKICAgICAgICB2X2J1ZmZlci5zdHJpZGUoMSksCiAgICAgICAgYXR0X291dC5zdHJpZGUoMCksCiAgICAgICAgYXR0X291dC5zdHJpZGUoMSksCiAgICAgICAgYXR0X291dC5zdHJpZGUoMiksCiAgICAgICAga3ZfZ3JvdXBfbnVtPWt2X2dyb3VwX251bSwKICAgICAgICBxX2hlYWRfbnVtPWhlYWRfbnVtLAogICAgICAgIEJMT0NLX0RNT0RFTD1CTE9DS19ETU9ERUwsCiAgICAgICAgQkxPQ0tfRFBFPUJMT0NLX0RQRSwKICAgICAgICBCTE9DS19EVj1CTE9DS19EViwKICAgICAgICBCTE9DS19OPUJMT0NLLAogICAgICAgIEJMT0NLX0g9QkxPQ0tfSCwKICAgICAgICBNSU5fQkxPQ0tfS1Y9X01JTl9CTE9DS19LViwKICAgICAgICBsb2dpdF9jYXA9bG9naXRfY2FwLAogICAgICAgIG51bV93YXJwcz00LAogICAgICAgIG51bV9zdGFnZXM9bnVtX3N0YWdlcywKICAgICAgICBMaz1MaywKICAgICAgICBMdj1MdiwKICAgICAgICAqKmV4dHJhX2thcmdzLAogICAgKQoKCgoKQHRyaXRvbi5qaXQKZGVmIF9md2Rfa2VybmVsX3N0YWdlMigKICAgIE1pZF9PLAogICAgTWlkX09fMSwKICAgIE8sCiAgICBrdl9pbmRwdHIsCiAgICBudW1fa3Zfc3BsaXRzLAogICAgc3RyaWRlX21pZF9vYiwKICAgIHN0cmlkZV9taWRfb2gsCiAgICBzdHJpZGVfbWlkX29zLAogICAgc3RyaWRlX29icywKICAgIHN0cmlkZV9vaCwKICAgIE1BWF9LVl9TUExJVFM6IHRsLmNvbnN0ZXhwciwKICAgIE1JTl9CTE9DS19LVjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfRFY6IHRsLmNvbnN0ZXhwciwKICAgIEx2OiB0bC5jb25zdGV4cHIsCik6CiAgICBjdXJfYmF0Y2ggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBjdXJfaGVhZCA9IHRsLnByb2dyYW1faWQoMSkKCiAgICBjdXJfYmF0Y2hfc2VxX2xlbiA9IHRsLmxvYWQoa3ZfaW5kcHRyICsgY3VyX2JhdGNoICsgMSkgLSB0bC5sb2FkKAogICAgICAgIGt2X2luZHB0ciArIGN1cl9iYXRjaAogICAgKQogICAga3Zfc3BsaXRzID0gdGwubG9hZChudW1fa3Zfc3BsaXRzICsgY3VyX2JhdGNoKQoKICAgIG9mZnNfZCA9IHRsLmFyYW5nZSgwLCBCTE9DS19EVikKICAgIG1hc2tfZCA9IG9mZnNfZCA8IEx2CgogICAgZV9zdW0gPSAwLjAKICAgIGVfbWF4ID0gLWZsb2F0KCJpbmYiKQogICAgYWNjID0gdGwuemVyb3MoW0JMT0NLX0RWXSwgZHR5cGU9dGwuZmxvYXQzMikKCiAgICBvZmZzX3YgPSBjdXJfYmF0Y2ggKiBzdHJpZGVfbWlkX29iICsgY3VyX2hlYWQgKiBzdHJpZGVfbWlkX29oICsgb2Zmc19kCiAgICBvZmZzX2xvZ2ljID0gKGN1cl9iYXRjaCAqIHN0cmlkZV9taWRfb2IgKyBjdXJfaGVhZCAqIHN0cmlkZV9taWRfb2gpIC8vIEx2CiAgICBrdl9sZW5fcGVyX3NwbGl0ID0gKAogICAgICAgIHRsLmNkaXYodGwuY2RpdihjdXJfYmF0Y2hfc2VxX2xlbiwga3Zfc3BsaXRzKSwgTUlOX0JMT0NLX0tWKSAqIE1JTl9CTE9DS19LVgogICAgKQoKICAgIGZvciBzcGxpdF9rdl9pZCBpbiByYW5nZSgwLCBNQVhfS1ZfU1BMSVRTKToKICAgICAgICBzcGxpdF9rdl9zdGFydCA9IGt2X2xlbl9wZXJfc3BsaXQgKiBzcGxpdF9rdl9pZAogICAgICAgIHNwbGl0X2t2X2VuZCA9IHRsLm1pbmltdW0oc3BsaXRfa3Zfc3RhcnQgKyBrdl9sZW5fcGVyX3NwbGl0LCBjdXJfYmF0Y2hfc2VxX2xlbikKCiAgICAgICAgaWYgc3BsaXRfa3ZfZW5kID4gc3BsaXRfa3Zfc3RhcnQ6CiAgICAgICAgICAgIHR2ID0gdGwubG9hZCgKICAgICAgICAgICAgICAgIE1pZF9PICsgb2Zmc192ICsgc3BsaXRfa3ZfaWQgKiBzdHJpZGVfbWlkX29zLCBtYXNrPW1hc2tfZCwgb3RoZXI9MC4wCiAgICAgICAgICAgICkKICAgICAgICAgICAgdGxvZ2ljID0gdGwubG9hZChNaWRfT18xICsgb2Zmc19sb2dpYyArIHNwbGl0X2t2X2lkICogc3RyaWRlX21pZF9vcyAvLyBMdikKICAgICAgICAgICAgbl9lX21heCA9IHRsLm1heGltdW0odGxvZ2ljLCBlX21heCkKCiAgICAgICAgICAgIG9sZF9zY2FsZSA9IHRsLmV4cChlX21heCAtIG5fZV9tYXgpCiAgICAgICAgICAgIGFjYyAqPSBvbGRfc2NhbGUKICAgICAgICAgICAgZXhwX2xvZ2ljID0gdGwuZXhwKHRsb2dpYyAtIG5fZV9tYXgpCiAgICAgICAgICAgIGFjYyArPSBleHBfbG9naWMgKiB0dgoKICAgICAgICAgICAgZV9zdW0gPSBlX3N1bSAqIG9sZF9zY2FsZSArIGV4cF9sb2dpYwogICAgICAgICAgICBlX21heCA9IG5fZV9tYXgKCiAgICB0bC5zdG9yZSgKICAgICAgICBPICsgY3VyX2JhdGNoICogc3RyaWRlX29icyArIGN1cl9oZWFkICogc3RyaWRlX29oICsgb2Zmc19kLAogICAgICAgIGFjYyAvIGVfc3VtLAogICAgICAgIG1hc2s9bWFza19kLAogICAgKQoKCmRlZiBfZGVjb2RlX3NvZnRtYXhfcmVkdWNldl9md2QoCiAgICBsb2dpdHMsCiAgICBsc2UsCiAgICBxLAogICAgbywKICAgIHZfYnVmZmVyLAogICAga3ZfaW5kcHRyLAogICAgbnVtX2t2X3NwbGl0cywKICAgIG1heF9rdl9zcGxpdHMsCik6CiAgICBiYXRjaCwgaGVhZF9udW0gPSBxLnNoYXBlWzBdLCBxLnNoYXBlWzFdCiAgICBMdiA9IHZfYnVmZmVyLnNoYXBlWy0xXQogICAgQkxPQ0tfRFYgPSB0cml0b24ubmV4dF9wb3dlcl9vZl8yKEx2KQoKICAgIE1BWF9LVl9TUExJVFMgPSBtYXhfa3Zfc3BsaXRzCgogICAgZXh0cmFfa2FyZ3MgPSB7fQogICAgaWYgX2lzX2hpcDoKICAgICAgICAjIGh0dHBzOi8vcm9jbS5kb2NzLmFtZC5jb20vZW4vZG9jcy02LjIuMC9ob3ctdG8vbGxtLWZpbmUtdHVuaW5nLW9wdGltaXphdGlvbi9vcHRpbWl6aW5nLXRyaXRvbi1rZXJuZWwuaHRtbAogICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3RyaXRvbi1sYW5nL3RyaXRvbi9ibG9iL21haW4vdGhpcmRfcGFydHkvYW1kL2JhY2tlbmQvY29tcGlsZXIucHkKICAgICAgICBleHRyYV9rYXJncyA9IHsid2F2ZXNfcGVyX2V1IjogNCwgIm1hdHJpeF9pbnN0cl9ub25rZGltIjogMTYsICJrcGFjayI6IDJ9CgogICAgZ3JpZCA9IChiYXRjaCwgaGVhZF9udW0pCiAgICBfZndkX2tlcm5lbF9zdGFnZTJbZ3JpZF0oCiAgICAgICAgbG9naXRzLAogICAgICAgIGxzZSwKICAgICAgICBvLAogICAgICAgIGt2X2luZHB0ciwKICAgICAgICBudW1fa3Zfc3BsaXRzLAogICAgICAgIGxvZ2l0cy5zdHJpZGUoMCksCiAgICAgICAgbG9naXRzLnN0cmlkZSgxKSwKICAgICAgICBsb2dpdHMuc3RyaWRlKDIpLAogICAgICAgIG8uc3RyaWRlKDApLAogICAgICAgIG8uc3RyaWRlKDEpLAogICAgICAgIE1BWF9LVl9TUExJVFM9TUFYX0tWX1NQTElUUywKICAgICAgICBNSU5fQkxPQ0tfS1Y9X01JTl9CTE9DS19LViwKICAgICAgICBCTE9DS19EVj1CTE9DS19EViwKICAgICAgICBMdj1MdiwKICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICBudW1fc3RhZ2VzPTIsCiAgICAgICAgKipleHRyYV9rYXJncywKICAgICkKCgoKZGVmIGRlY29kZV9hdHRlbnRpb25fZndkX2dyb3VwZWQoCiAgICBxLAogICAga19idWZmZXIsCiAgICB2X2J1ZmZlciwKICAgIG8sCiAgICBrdl9pbmRwdHIsCiAgICBrdl9pbmRpY2VzLAogICAgYXR0bl9sb2dpdHMsCiAgICBhdHRuX2xzZSwKICAgIG51bV9rdl9zcGxpdHMsCiAgICBtYXhfa3Zfc3BsaXRzLAogICAgc21fc2NhbGUsCiAgICBsb2dpdF9jYXA9MC4wLAopOgogICAgX2RlY29kZV9ncm91cGVkX2F0dF9tX2Z3ZCgKICAgICAgICBxLAogICAgICAgIGtfYnVmZmVyLAogICAgICAgIHZfYnVmZmVyLAogICAgICAgIGF0dG5fbG9naXRzLAogICAgICAgIGF0dG5fbHNlLAogICAgICAgIGt2X2luZHB0ciwKICAgICAgICBrdl9pbmRpY2VzLAogICAgICAgIG51bV9rdl9zcGxpdHMsCiAgICAgICAgbWF4X2t2X3NwbGl0cywKICAgICAgICBzbV9zY2FsZSwKICAgICAgICBsb2dpdF9jYXAsCiAgICApCgogICAgX2RlY29kZV9zb2Z0bWF4X3JlZHVjZXZfZndkKAogICAgICAgIGF0dG5fbG9naXRzLAogICAgICAgIGF0dG5fbHNlLAogICAgICAgIHEsCiAgICAgICAgbywKICAgICAgICB2X2J1ZmZlciwKICAgICAgICBrdl9pbmRwdHIsCiAgICAgICAgbnVtX2t2X3NwbGl0cywKICAgICAgICBtYXhfa3Zfc3BsaXRzLAogICAgKQoKY2xhc3MgUGVuZ2N1b01MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAjIERvd24tcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX2Rvd25fd2VpZ2h0ID0gTm9uZQogICAgICAgICMgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd25fd2VpZ2h0ID0gTm9uZQogICAgICAgICMgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKCiAgICAgICAgIyBVcC1wcm9qZWN0aW9uIGFuZCByb3BlIHByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval91cF93ZWlnaHQgPSBOb25lCiAgICAgICAgIyBzZWxmLlFfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLnFfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5LVl9wcm9qX3VwX3dlaWdodCA9IE5vbmUKICAgICAgICAjIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IFJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQoKICAgICAgICAjIE91dHB1dCBwcm9qZWN0aW9uCiAgICAgICAgc2VsZi53b193ZWlnaHQgPSBOb25lCiAgICAgICAgIyBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwga3ZfY2FjaGU6IEtWQ2FjaGUpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICAjIHNlcV9sZW4gPSAxIGFsd2F5cyBoZXJlCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgbW9kZWxfZGltID0geC5zaXplKCkKCiAgICAgICAgc3RhcnQgPSB0b3JjaC5jdWRhLkV2ZW50KGVuYWJsZV90aW1pbmc9VHJ1ZSkKICAgICAgICBlbmQgPSB0b3JjaC5jdWRhLkV2ZW50KGVuYWJsZV90aW1pbmc9VHJ1ZSkKCgogICAgICAgIHN0YXJ0LnJlY29yZCgpCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICBTdGVwIDE6IEhhbmRsZSBkb3duLXByb2plY3Rpb24gKyBLViBjYWNoZSAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyBxX2xvcmEgPSBzZWxmLlFfcHJval9kb3duKHgpCiAgICAgICAgcV9sb3JhID0geCBAIHNlbGYuUV9wcm9qX2Rvd25fd2VpZ2h0LlQKICAgICAgICAjIGt2X2xvcmEgPSBzZWxmLktWX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEgPSB4IEAgc2VsZi5LVl9wcm9qX2Rvd25fd2VpZ2h0LlQKICAgICAgICBrdl9sb3JhLCBrdl9sZW4gPSBrdl9jYWNoZShrdl9sb3JhKQogICAgICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEKCiAgICAgICAgZW5kLnJlY29yZCgpCiAgICAgICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAgICAgcHJpbnQoZiIgICAgZG93biB7c3RhcnQuZWxhcHNlZF90aW1lKGVuZCl9IikKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgU3RlcCAyOiBVcC1wcm9qZWN0IGFuZCBwcmVwYXJlIE5vUEUgKyBSb1BFICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKICAgICAgICBzdGFydC5yZWNvcmQoKQoKICAgICAgICAjIEhhbmRsZSBxdWVyaWVzIFEgZmlyc3QKICAgICAgICAjIHFfbm9wZV9hbmRfcm9wZSA9IHNlbGYuUV9wcm9qX3VwKHFfbG9yYSkudmlldygKICAgICAgICBxX25vcGVfYW5kX3JvcGUgPSAocV9sb3JhIEAgc2VsZi5RX3Byb2pfdXBfd2VpZ2h0LlQpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMgSGFuZGxlIGtleXMgYW5kIHZhbHVlcyBLL1YuIFYgZG9lcyBub3QgbmVlZCBSb1BFCiAgICAgICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgIGVuZC5yZWNvcmQoKQogICAgICAgIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgIHByaW50KGYiICAgIHVwIHtzdGFydC5lbGFwc2VkX3RpbWUoZW5kKX0iKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICAgIFN0ZXAgMzogSGFuZGxlIFJvUEUgU3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICAgICAgc3RhcnQucmVjb3JkKCkKCgogICAgICAgICMgQ29tcHV0ZSBSb1BFIGZvciBxdWVyaWVzIGFuZCBjb21iaW5lIHdpdGggbm8tUm9QRSBwYXJ0CiAgICAgICAgcV9yb3BlID0gcV9yb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogICAgICAgIHFfcm9wZSA9IHNlbGYucV9yb3BlKHFfcm9wZSwgc3RhcnRfcG9zPXF1ZXJ5X3BvcykKCiAgICAgICAgcV9ub3BlID0gcV9ub3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogICAgICAgIHEgPSB0b3JjaC5jb25jYXQoW3Ffbm9wZSwgcV9yb3BlXSwgZGltPS0xKQoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3Iga2V5cyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIGtfcm9wZSA9IGtfcm9wZVs6LCBOb25lLCA6LCA6XQogICAgICAgIGtfcm9wZSA9IHNlbGYua19yb3BlKGtfcm9wZSkKCiAgICAgICAga3ZfdXBfd2VpZ2h0ID0gc2VsZi5LVl9wcm9qX3VwX3dlaWdodC52aWV3KHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltLCAtMSkKICAgICAgICB3X2tjID0ga3ZfdXBfd2VpZ2h0WzosIDpzZWxmLm5vcGVfaGVhZF9kaW0sIDpdCiAgICAgICAgd192YyA9IGt2X3VwX3dlaWdodFs6LCBzZWxmLm5vcGVfaGVhZF9kaW06LCA6XQogICAgICAgIHdfdmMgPSB3X3ZjLnBlcm11dGUoMCwgMiwgMSkudW5zcXVlZXplKDApCgogICAgICAgIGVuZC5yZWNvcmQoKQogICAgICAgIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgIHByaW50KGYiICAgIHJvcGUge3N0YXJ0LmVsYXBzZWRfdGltZShlbmQpfSIpCgogICAgICAgIHN0YXJ0LnJlY29yZCgpCgogICAgICAgIG1sYV9pbnB1dF9ub3BlID0gcV9ub3BlIEAgd19rYwogICAgICAgIG1sYV9xX2lucHV0ID0gdG9yY2guY29uY2F0KFttbGFfaW5wdXRfbm9wZSwgcV9yb3BlXSwgZGltPS0xKQogICAgICAgIG1sYV9rX2lucHV0ID0ga3ZfbG9yYS5jbG9uZSgpLnVuc3F1ZWV6ZSgxKQogICAgICAgIG1sYV9rX2lucHV0Wy4uLiwgc2VsZi5rdl9sb3JhX3Jhbms6XSA9IGtfcm9wZQoKICAgICAgICBmbGFzaF9tbGFfa19idWYgPSBtbGFfa19pbnB1dAogICAgICAgICMgbWxhX3ZfaW5wdXQgPSBtbGFfa19pbnB1dFsuLi4sIDpzZWxmLmt2X2xvcmFfcmFua10KICAgICAgICAjIG1sYV9rX2lucHV0ID0gbWxhX2tfaW5wdXQucGVybXV0ZSgwLCAxLCAzLCAyKQoKICAgICAgICAjIG1sYV9xayA9IChtbGFfcV9pbnB1dCBAIG1sYV9rX2lucHV0KSAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgIyBtbGFfYXR0biA9IEYuc29mdG1heChtbGFfcWssIGRpbT0tMSkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgIyBtbGFfYXR0bl9vdXQgPSBtbGFfYXR0biBAIG1sYV92X2lucHV0CgogICAgICAgICMgcHJpbnQoZiJtbGFfYXR0bl9vdXQgOiB7bWxhX2F0dG5fb3V0LnNoYXBlfSB7bWxhX2F0dG5fb3V0LmFicygpLm1lYW4oKX0ge21sYV9hdHRuX291dC52aWV3KC0xKVs6MTBdfSIpCgoKICAgICAgICAjIGltcGxlbWVudCBoZXJlCgogICAgICAgIHByaW50KCIjIiAqIDIwKQogICAgICAgIGZsYXNoX21sYV9xID0gbWxhX3FfaW5wdXQudmlldyhiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIC0xKQogICAgICAgICMgcHJpbnQoZiJmbGFzaF9tbGFfcSB7Zmxhc2hfbWxhX3Euc2hhcGV9IikKICAgICAgICAjIHByaW50KGYiZmxhc2hfbWxhX2tfYnVmIHtmbGFzaF9tbGFfa19idWYuc2hhcGV9IHtmbGFzaF9tbGFfa19idWYuc3RyaWRlKCl9IikKCiAgICAgICAgdG90YWxfdG9rZW5zID0gYmF0Y2hfc2l6ZSAqIGt2X2xlbgogICAgICAgICMga19idWZmZXIgPSBmbGFzaF9tbGFfa19idWYucmVzaGFwZSh0b3RhbF90b2tlbnMsIDEsIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIGtfYnVmZmVyID0gZmxhc2hfbWxhX2tfYnVmLnNxdWVlemUoMSkucmVzaGFwZSgtMSwgMSwgc2VsZi5rdl9sb3JhX3JhbmsgKyBzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgdl9idWZmZXIgPSBrX2J1ZmZlclsuLi4sIDpzZWxmLmt2X2xvcmFfcmFua10KICAgICAgICAjIHByaW50KGYia19idWZmZXIgOiB7a19idWZmZXIuc2hhcGV9IHtrX2J1ZmZlci5zdHJpZGUoKX0iKQogICAgICAgICMgcHJpbnQoZiJ2X2J1ZmZlciA6IHt2X2J1ZmZlci5zaGFwZX0ge3ZfYnVmZmVyLnN0cmlkZSgpfSIpCgogICAgICAgIGZsYXNoX291dHB1dCA9IHRvcmNoLnplcm9zKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgc2VsZi5rdl9sb3JhX3JhbmssIGR0eXBlPXguZHR5cGUsIGRldmljZT0iY3VkYSIpCgogICAgICAgICMgcHJpbnQoZiJmbGFzaF9vdXRwdXQgOiB7Zmxhc2hfb3V0cHV0LnNoYXBlfSIpCgoKICAgICAgICAjIHByaW50KGYic2VxX2xlbiA6IHtzZXFfbGVufSIpCiAgICAgICAgYl9zZXFfbGVuID0gdG9yY2guZnVsbCgoYmF0Y2hfc2l6ZSwpLCBrdl9sZW4sIGRldmljZT0iY3VkYSIpCiAgICAgICAga3ZfaW5kcHRyID0gdG9yY2guemVyb3MoKGJhdGNoX3NpemUgKyAxLCksIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9ImN1ZGEiKQogICAgICAgIGt2X2luZHB0clsxIDogYmF0Y2hfc2l6ZSArIDFdID0gdG9yY2guY3Vtc3VtKGJfc2VxX2xlbls6YmF0Y2hfc2l6ZV0sIGRpbT0wKQogICAgICAgIGt2X2luZGljZXMgPSB0b3JjaC5hcmFuZ2UodG90YWxfdG9rZW5zLCBkZXZpY2U9ImN1ZGEiKQoKICAgICAgICAjIHByaW50KGYia3ZfaW5kcHRyIHtrdl9pbmRwdHJ9IikKICAgICAgICAjIHByaW50KGYia3ZfaW5kaWNlcyB7a3ZfaW5kaWNlc30iKQoKCiAgICAgICAgbWF4X2t2X3NwbGl0cyA9IDEgIzgKICAgICAgICAjIG51bV9rdl9zcGxpdHMgPSB0b3JjaC5mdWxsKChiYXRjaF9zaXplLCksIDQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9ImN1ZGEiKQogICAgICAgIG51bV9rdl9zcGxpdHMgPSB0b3JjaC5mdWxsKChiYXRjaF9zaXplLCksIDEsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9ImN1ZGEiKQogICAgICAgIGF0dG5fbG9naXRzMSA9IHRvcmNoLmVtcHR5KAogICAgICAgICAgICAoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBtYXhfa3Zfc3BsaXRzLCBzZWxmLmt2X2xvcmFfcmFuayksCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MzIsCiAgICAgICAgICAgIGRldmljZT0iY3VkYSIsCiAgICAgICAgKQogICAgICAgIGF0dG5fbHNlMSA9IHRvcmNoLmVtcHR5KAogICAgICAgICAgICAoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBtYXhfa3Zfc3BsaXRzLCBzZWxmLmt2X2xvcmFfcmFuayksCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MzIsCiAgICAgICAgICAgIGRldmljZT0iY3VkYSIsCiAgICAgICAgKQoKICAgICAgICBzbV9zY2FsZSA9IDEuMCAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgZGVjb2RlX2F0dGVudGlvbl9md2RfZ3JvdXBlZCgKICAgICAgICAgICAgZmxhc2hfbWxhX3EsCiAgICAgICAgICAgIGtfYnVmZmVyLAogICAgICAgICAgICB2X2J1ZmZlciwKICAgICAgICAgICAgZmxhc2hfb3V0cHV0LAogICAgICAgICAgICBrdl9pbmRwdHIsCiAgICAgICAgICAgIGt2X2luZGljZXMsCiAgICAgICAgICAgIGF0dG5fbG9naXRzMSwKICAgICAgICAgICAgYXR0bl9sc2UxLAogICAgICAgICAgICBudW1fa3Zfc3BsaXRzLAogICAgICAgICAgICBtYXhfa3Zfc3BsaXRzLAogICAgICAgICAgICBzbV9zY2FsZSwKICAgICAgICApCgogICAgICAgIGVuZC5yZWNvcmQoKQogICAgICAgIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgIHByaW50KGYiICAgIGRlY29kZV9hdHRlbnRpb25fZndkX2dyb3VwZWQge3N0YXJ0LmVsYXBzZWRfdGltZShlbmQpfSIpCgoKICAgICAgICAjIHByaW50KGYiZmxhc2hfb3V0cHV0IDoge2ZsYXNoX291dHB1dC5zaGFwZX0ge2ZsYXNoX291dHB1dC5hYnMoKS5tZWFuKCl9IHtmbGFzaF9vdXRwdXQudmlldygtMSlbOjEwXX0iKQoKICAgICAgICBwcmludCgiIyIgKiAyMCkKCiAgICAgICAgIyBlbmQKCiAgICAgICAgc3RhcnQucmVjb3JkKCkKCiAgICAgICAgZmxhc2hfb3V0cHV0ID0gZmxhc2hfb3V0cHV0LnVuc3F1ZWV6ZSgyKQoKICAgICAgICAjIHByaW50KGYid192YyB7d192Yy5zaGFwZX0iKQoKICAgICAgICBtbGFfb3V0ID0gZmxhc2hfb3V0cHV0IEAgd192YwogICAgICAgICMgbWxhX291dCA9IG1sYV9hdHRuX291dCBAIHdfdmMKCiAgICAgICAgbWxhX291dCA9IG1sYV9vdXQudmlldyhiYXRjaF9zaXplLCAxLCAtMSkKICAgICAgICAjIG1sYV9vdXQgPSBzZWxmLndvKG1sYV9vdXQpCiAgICAgICAgbWxhX291dCA9IG1sYV9vdXQgQCBzZWxmLndvX3dlaWdodC5UCgogICAgICAgIGVuZC5yZWNvcmQoKQogICAgICAgIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgIHByaW50KGYiICAgIHZjIHdvIHtzdGFydC5lbGFwc2VkX3RpbWUoZW5kKX0iKQoKICAgICAgICByZXR1cm4gbWxhX291dCwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBzdGFydCA9IHRvcmNoLmN1ZGEuRXZlbnQoZW5hYmxlX3RpbWluZz1UcnVlKQogICAgZW5kID0gdG9yY2guY3VkYS5FdmVudChlbmFibGVfdGltaW5nPVRydWUpCgogICAgc3RhcnQucmVjb3JkKCkKICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBkYXRhCiAgICBlbmQucmVjb3JkKCkKICAgIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgcHJpbnQoZiIgZGF0YSB7c3RhcnQuZWxhcHNlZF90aW1lKGVuZCl9IikKCgogICAgc3RhcnQucmVjb3JkKCkKCiAgICAjIExvYWQgaW4gbW9kZWwgd2VpZ2h0cwogICAgbW9kZWwgPSBQZW5nY3VvTUxBKGNvbmZpZykudG8oJ2N1ZGEnKQogICAgIyBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgIG1vZGVsLlFfcHJval9kb3duX3dlaWdodCA9IGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQKICAgICMgbW9kZWwuUV9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX3VwX3dlaWdodCkKICAgIG1vZGVsLlFfcHJval91cF93ZWlnaHQgPSBjb25maWcuUV9wcm9qX3VwX3dlaWdodAogICAgIyBtb2RlbC5LVl9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0KQogICAgbW9kZWwuS1ZfcHJval9kb3duX3dlaWdodCA9IGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0CiAgICAjIG1vZGVsLktWX3Byb2pfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodCkKICAgIG1vZGVsLktWX3Byb2pfdXBfd2VpZ2h0ID0gY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0CiAgICAjIG1vZGVsLndvLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcud29fd2VpZ2h0KQogICAgbW9kZWwud29fd2VpZ2h0ID0gY29uZmlnLndvX3dlaWdodAoKICAgIGVuZC5yZWNvcmQoKQogICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICBwcmludChmIiBwYXJhbWV0ZXIge3N0YXJ0LmVsYXBzZWRfdGltZShlbmQpfSIpCgogICAgc3RhcnQucmVjb3JkKCkKCiAgICBvdXRwdXQsIGt2X2NhY2hlID0gbW9kZWwoeCwga3ZfY2FjaGUpCgogICAgZW5kLnJlY29yZCgpCiAgICB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgIHByaW50KGYiIGNvbXB1dGUge3N0YXJ0LmVsYXBzZWRfdGltZShlbmQpfSIpCgogICAgcmV0dXJuIG91dHB1dCwga3ZfY2FjaGU=
No newline at end of file
+ aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKCgppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKX2lzX2hpcCA9IFRydWUKCmNsYXNzIFJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCJ0aGV0YSIsIHRoZXRhKQoKICAgIGRlZiByb3RhdGVfaGFsZihzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4MSwgeDIgPSB4LmNodW5rKDIsIGRpbT0tMSkKICAgICAgICByZXR1cm4gdG9yY2guY2F0KCgteDIsIHgxKSwgZGltPS0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgc2VsZi50aGV0YSkKICAgICAgICBpZHhfdGhldGEyID0gdG9yY2guY2F0KFtpZHhfdGhldGEsIGlkeF90aGV0YV0sIGRpbT0tMSkKICAgICAgICBjb3MgPSBpZHhfdGhldGEyLmNvcygpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNpbiA9IGlkeF90aGV0YTIuc2luKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgcmV0dXJuIHggKiBjb3MgKyBzZWxmLnJvdGF0ZV9oYWxmKHgpICogc2luCgpjbGFzcyBLVkNhY2hlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga3ZfY2FjaGVfc2hhcGU6IHR1cGxlLCAqKmt3YXJncykgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdkYXRhJywgdG9yY2guemVyb3Moa3ZfY2FjaGVfc2hhcGUsIGR0eXBlPXRvcmNoLmJmbG9hdDE2KSkKICAgICAgICBzZWxmLnNlcV9sZW4gPSAwCiAgICAgICAgc2VsZi56ZXJvKCkKCiAgICBkZWYgemVybyhzZWxmKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGF0YS56ZXJvXygpCiAgICAKICAgIGRlZiBnZXRfZGF0YShzZWxmKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGNfa3Y6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGFzc2VydCBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSkgPD0gc2VsZi5kYXRhLnNpemUoMSksICJLViBDYWNoZSBFeGNlZWRlZCIKCiAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhLnRvKGNfa3YuZHR5cGUpCiAgICAgICAgc2VsZi5kYXRhWwogICAgICAgICAgICA6LCBzZWxmLnNlcV9sZW4gOiBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSksIDoKICAgICAgICBdID0gY19rdgogICAgICAgIHNlbGYuc2VxX2xlbiArPSBjX2t2LnNpemUoMSkKCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVs6LCA6c2VsZi5zZXFfbGVuXSwgc2VsZi5zZXFfbGVuCiAgICAKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICBzZWxmLlFfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLnFfbG9yYV9yYW5rLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKICAgICAgICBzZWxmLktWX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5rdl9sb3JhX3JhbmsgKyBzZWxmLnJvcGVfaGVhZF9kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuUV9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYucV9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKICAgICAgICBzZWxmLktWX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5rdl9sb3JhX3JhbmssIChzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnZfaGVhZF9kaW0pICogc2VsZi5uX2hlYWRzLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKCiAgICAgICAgIyBSb1BFIG9uIGhhbGYgZW1iZWRkaW5ncwogICAgICAgIHNlbGYucV9yb3BlID0gUm9QRShzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAgc2VsZi5rX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKCiAgICAgICAgIyBPdXRwdXQgcHJvamVjdGlvbgogICAgICAgIHNlbGYud28gPSBubi5MaW5lYXIoc2VsZi52X2hlYWRfZGltICogc2VsZi5uX2hlYWRzLCBzZWxmLmRpbSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5lcHMgPSAxZS02CiAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBrdl9jYWNoZTogS1ZDYWNoZSkgLT4gdG9yY2guVGVuc29yOgogICAgICAgICMgc2VxX2xlbiA9IDEgYWx3YXlzIGhlcmUKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgIFN0ZXAgMTogSGFuZGxlIGRvd24tcHJvamVjdGlvbiArIEtWIGNhY2hlICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxX2xvcmEgPSBzZWxmLlFfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSA9IHNlbGYuS1ZfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSwga3ZfbGVuID0ga3ZfY2FjaGUoa3ZfbG9yYSkKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgIFN0ZXAgMjogVXAtcHJvamVjdCBhbmQgcHJlcGFyZSBOb1BFICsgUm9QRSAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIEhhbmRsZSBxdWVyaWVzIFEgZmlyc3QKICAgICAgICBxX25vcGVfYW5kX3JvcGUgPSBzZWxmLlFfcHJval91cChxX2xvcmEpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMgSGFuZGxlIGtleXMgYW5kIHZhbHVlcyBLL1YuIFYgZG9lcyBub3QgbmVlZCBSb1BFCiAgICAgICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAga3Zfbm9wZSA9IHNlbGYuS1ZfcHJval91cChrdl9ub3BlKS52aWV3KAogICAgICAgICAgICBiYXRjaF9zaXplLCBrdl9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKQogICAgICAgIGtfbm9wZSwgdiA9IHRvcmNoLnNwbGl0KGt2X25vcGUsIFtzZWxmLm5vcGVfaGVhZF9kaW0sIHNlbGYudl9oZWFkX2RpbV0sIGRpbT0tMSkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjICAgICAgICAgICAgICAgICAgICBTdGVwIDM6IEhhbmRsZSBSb1BFIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgICAgICMgQ29tcHV0ZSBSb1BFIGZvciBxdWVyaWVzIGFuZCBjb21iaW5lIHdpdGggbm8tUm9QRSBwYXJ0CiAgICAgICAgcV9yb3BlID0gcV9yb3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogICAgICAgIHFfcm9wZSA9IHNlbGYucV9yb3BlKHFfcm9wZSwgc3RhcnRfcG9zPXF1ZXJ5X3BvcykKCiAgICAgICAgcV9ub3BlID0gcV9ub3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IG5faGVhZHMgeCBzZXFfbGVuIHggcm9wZV9oZWFkX2RpbQogICAgICAgIHEgPSB0b3JjaC5jb25jYXQoW3Ffbm9wZSwgcV9yb3BlXSwgZGltPS0xKQoKCiAgICAgICAgIyBDb21wdXRlIFJvUEUgZm9yIGtleXMgYW5kIGNvbWJpbmUgd2l0aCBuby1Sb1BFIHBhcnQKICAgICAgICBrX3JvcGUgPSBrX3JvcGVbOiwgTm9uZSwgOiwgOl0KICAgICAgICBrX3JvcGUgPSBzZWxmLmtfcm9wZShrX3JvcGUpLmV4cGFuZCgtMSxzZWxmLm5faGVhZHMsLTEsLTEpCiAgICAgICAga19ub3BlID0ga19ub3BlLnBlcm11dGUoMCwgMiwgMSwgMykgIyBicyB4IGt2X2xlbiB4IG5faGVhZHMgeCByb3BlX2hlYWRfZGltCiAgICAgICAgayA9IHRvcmNoLmNvbmNhdChba19ub3BlLCBrX3JvcGVdLCBkaW09LTEpCiAgICAgICAgICAgICAgICAKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRlIE11bHRpLWhlYWQgQXR0ZW50aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICB2ID0gdi5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBuX2hlYWRzIHgga3ZfbGVuIHggdl9oZWFkX2RpbQogICAgICAgIHNjb3JlcyA9IHRvcmNoLm1hdG11bChxLCBrLnRyYW5zcG9zZSgtMSwgLTIpKSAvIG1hdGguc3FydChzZWxmLnJvcGVfaGVhZF9kaW0gKyBzZWxmLm5vcGVfaGVhZF9kaW0pCiAgICAgICAgYXR0biA9IEYuc29mdG1heChzY29yZXMsIGRpbT0tMSkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgeSA9IHRvcmNoLm1hdG11bChhdHRuLCB2KS52aWV3KGJhdGNoX3NpemUsIDEsIC0xKQogICAgICAgIHkgPSBzZWxmLndvKHkpCgogICAgICAgIHJldHVybiB5LCBrdl9jYWNoZS5nZXRfZGF0YSgpCgpfTUlOX0JMT0NLX0tWID0gMzIKCkB0cml0b24uaml0CmRlZiBfZndkX2dyb3VwZWRfa2VybmVsX3N0YWdlMSgKICAgIFEsCiAgICBLX0J1ZmZlciwKICAgIFZfQnVmZmVyLAogICAgc21fc2NhbGUsCiAgICBrdl9pbmRwdHIsCiAgICBrdl9pbmRpY2VzLAogICAgQXR0X091dCwKICAgIEF0dF9Mc2UsCiAgICBudW1fa3Zfc3BsaXRzLAogICAgc3RyaWRlX3FicywKICAgIHN0cmlkZV9xaCwKICAgIHN0cmlkZV9idWZfa2JzLAogICAgc3RyaWRlX2J1Zl9raCwKICAgIHN0cmlkZV9idWZfdmJzLAogICAgc3RyaWRlX2J1Zl92aCwKICAgIHN0cmlkZV9taWRfb2IsCiAgICBzdHJpZGVfbWlkX29oLAogICAgc3RyaWRlX21pZF9vcywKICAgIGt2X2dyb3VwX251bTogdGwuY29uc3RleHByLAogICAgcV9oZWFkX251bTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfRE1PREVMOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19EUEU6IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0RWOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19IOiB0bC5jb25zdGV4cHIsCiAgICBNSU5fQkxPQ0tfS1Y6IHRsLmNvbnN0ZXhwciwKICAgIGxvZ2l0X2NhcDogdGwuY29uc3RleHByLAogICAgTGs6IHRsLmNvbnN0ZXhwciwKICAgIEx2OiB0bC5jb25zdGV4cHIsCik6CiAgICBjdXJfYmF0Y2ggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBjdXJfaGVhZF9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGN1cl9rdl9oZWFkID0gY3VyX2hlYWRfaWQgLy8gdGwuY2Rpdihrdl9ncm91cF9udW0sIEJMT0NLX0gpCiAgICBzcGxpdF9rdl9pZCA9IHRsLnByb2dyYW1faWQoMikKCiAgICBpZiBCTE9DS19IIDwga3ZfZ3JvdXBfbnVtOgogICAgICAgIFZBTElEX0JMT0NLX0g6IHRsLmNvbnN0ZXhwciA9IEJMT0NLX0gKICAgIGVsc2U6CiAgICAgICAgVkFMSURfQkxPQ0tfSDogdGwuY29uc3RleHByID0ga3ZfZ3JvdXBfbnVtCiAgICBjdXJfaGVhZCA9IGN1cl9oZWFkX2lkICogVkFMSURfQkxPQ0tfSCArIHRsLmFyYW5nZSgwLCBCTE9DS19IKQogICAgbWFza19oID0gY3VyX2hlYWQgPCAoY3VyX2hlYWRfaWQgKyAxKSAqIFZBTElEX0JMT0NLX0gKICAgIG1hc2tfaCA9IG1hc2tfaCAmIChjdXJfaGVhZCA8IHFfaGVhZF9udW0pCgogICAgb2Zmc19kID0gdGwuYXJhbmdlKDAsIEJMT0NLX0RNT0RFTCkKICAgIG9mZnNfZHYgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfRFYpCiAgICBtYXNrX2QgPSBvZmZzX2QgPCBMawogICAgbWFza19kdiA9IG9mZnNfZHYgPCBMdgoKICAgIGN1cl9iYXRjaF9rdl9zdGFydF9pZHggPSB0bC5sb2FkKGt2X2luZHB0ciArIGN1cl9iYXRjaCkKICAgIGN1cl9iYXRjaF9zZXFfbGVuID0gdGwubG9hZChrdl9pbmRwdHIgKyBjdXJfYmF0Y2ggKyAxKSAtIGN1cl9iYXRjaF9rdl9zdGFydF9pZHgKICAgIGt2X3NwbGl0cyA9IHRsLmxvYWQobnVtX2t2X3NwbGl0cyArIGN1cl9iYXRjaCkKCiAgICBvZmZzX3EgPSBjdXJfYmF0Y2ggKiBzdHJpZGVfcWJzICsgY3VyX2hlYWRbOiwgTm9uZV0gKiBzdHJpZGVfcWggKyBvZmZzX2RbTm9uZSwgOl0KCiAgICBpZiBCTE9DS19EUEUgPiAwOgogICAgICAgIG9mZnNfZHBlID0gQkxPQ0tfRE1PREVMICsgdGwuYXJhbmdlKDAsIEJMT0NLX0RQRSkKICAgICAgICBtYXNrX2RwZSA9IG9mZnNfZHBlIDwgTGsKICAgICAgICBvZmZfcXBlID0gKAogICAgICAgICAgICBjdXJfYmF0Y2ggKiBzdHJpZGVfcWJzICsgY3VyX2hlYWRbOiwgTm9uZV0gKiBzdHJpZGVfcWggKyBvZmZzX2RwZVtOb25lLCA6XQogICAgICAgICkKCiAgICBrdl9sZW5fcGVyX3NwbGl0ID0gKAogICAgICAgIHRsLmNkaXYodGwuY2RpdihjdXJfYmF0Y2hfc2VxX2xlbiwga3Zfc3BsaXRzKSwgTUlOX0JMT0NLX0tWKSAqIE1JTl9CTE9DS19LVgogICAgKQogICAgc3BsaXRfa3Zfc3RhcnQgPSBrdl9sZW5fcGVyX3NwbGl0ICogc3BsaXRfa3ZfaWQKICAgIHNwbGl0X2t2X2VuZCA9IHRsLm1pbmltdW0oc3BsaXRfa3Zfc3RhcnQgKyBrdl9sZW5fcGVyX3NwbGl0LCBjdXJfYmF0Y2hfc2VxX2xlbikKCiAgICBlX21heCA9IHRsLnplcm9zKFtCTE9DS19IXSwgZHR5cGU9dGwuZmxvYXQzMikgLSBmbG9hdCgiaW5mIikKICAgIGVfc3VtID0gdGwuemVyb3MoW0JMT0NLX0hdLCBkdHlwZT10bC5mbG9hdDMyKQogICAgYWNjID0gdGwuemVyb3MoW0JMT0NLX0gsIEJMT0NLX0RWXSwgZHR5cGU9dGwuZmxvYXQzMikKCiAgICBpZiBzcGxpdF9rdl9lbmQgPiBzcGxpdF9rdl9zdGFydDoKICAgICAgICBxID0gdGwubG9hZChRICsgb2Zmc19xLCBtYXNrPShtYXNrX2hbOiwgTm9uZV0pICYgKG1hc2tfZFtOb25lLCA6XSksIG90aGVyPTAuMCkKICAgICAgICBpZiBCTE9DS19EUEUgPiAwOgogICAgICAgICAgICBxcGUgPSB0bC5sb2FkKAogICAgICAgICAgICAgICAgUSArIG9mZl9xcGUsIG1hc2s9KG1hc2tfaFs6LCBOb25lXSkgJiAobWFza19kcGVbTm9uZSwgOl0pLCBvdGhlcj0wLjAKICAgICAgICAgICAgKQogICAgICAgIGZvciBzdGFydF9uIGluIHJhbmdlKHNwbGl0X2t2X3N0YXJ0LCBzcGxpdF9rdl9lbmQsIEJMT0NLX04pOgogICAgICAgICAgICBvZmZzX24gPSBzdGFydF9uICsgdGwuYXJhbmdlKDAsIEJMT0NLX04pCiAgICAgICAgICAgIGt2X2xvYyA9IHRsLmxvYWQoCiAgICAgICAgICAgICAgICBrdl9pbmRpY2VzICsgY3VyX2JhdGNoX2t2X3N0YXJ0X2lkeCArIG9mZnNfbiwKICAgICAgICAgICAgICAgIG1hc2s9b2Zmc19uIDwgc3BsaXRfa3ZfZW5kLAogICAgICAgICAgICAgICAgb3RoZXI9MCwKICAgICAgICAgICAgKQogICAgICAgICAgICBvZmZzX2J1Zl9rID0gKAogICAgICAgICAgICAgICAga3ZfbG9jW05vbmUsIDpdICogc3RyaWRlX2J1Zl9rYnMKICAgICAgICAgICAgICAgICsgY3VyX2t2X2hlYWQgKiBzdHJpZGVfYnVmX2toCiAgICAgICAgICAgICAgICArIG9mZnNfZFs6LCBOb25lXQogICAgICAgICAgICApCiAgICAgICAgICAgIGsgPSB0bC5sb2FkKAogICAgICAgICAgICAgICAgS19CdWZmZXIgKyBvZmZzX2J1Zl9rLAogICAgICAgICAgICAgICAgbWFzaz0ob2Zmc19uW05vbmUsIDpdIDwgc3BsaXRfa3ZfZW5kKSAmIChtYXNrX2RbOiwgTm9uZV0pLAogICAgICAgICAgICAgICAgb3RoZXI9MC4wLAogICAgICAgICAgICApCiAgICAgICAgICAgIHFrID0gdGwuZG90KHEsIGsudG8ocS5kdHlwZSkpCiAgICAgICAgICAgIGlmIEJMT0NLX0RQRSA+IDA6CiAgICAgICAgICAgICAgICBvZmZzX2J1Zl9rcGUgPSAoCiAgICAgICAgICAgICAgICAgICAga3ZfbG9jW05vbmUsIDpdICogc3RyaWRlX2J1Zl9rYnMKICAgICAgICAgICAgICAgICAgICArIGN1cl9rdl9oZWFkICogc3RyaWRlX2J1Zl9raAogICAgICAgICAgICAgICAgICAgICsgb2Zmc19kcGVbOiwgTm9uZV0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGtwZSA9IHRsLmxvYWQoCiAgICAgICAgICAgICAgICAgICAgS19CdWZmZXIgKyBvZmZzX2J1Zl9rcGUsCiAgICAgICAgICAgICAgICAgICAgbWFzaz0ob2Zmc19uW05vbmUsIDpdIDwgc3BsaXRfa3ZfZW5kKSAmIChtYXNrX2RwZVs6LCBOb25lXSksCiAgICAgICAgICAgICAgICAgICAgb3RoZXI9MC4wLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcWsgKz0gdGwuZG90KHFwZSwga3BlLnRvKHFwZS5kdHlwZSkpCiAgICAgICAgICAgIHFrICo9IHNtX3NjYWxlCgogICAgICAgICAgICBpZiBsb2dpdF9jYXAgPiAwOgogICAgICAgICAgICAgICAgcWsgPSBsb2dpdF9jYXAgKiB0YW5oKHFrIC8gbG9naXRfY2FwKQoKICAgICAgICAgICAgcWsgPSB0bC53aGVyZSgKICAgICAgICAgICAgICAgIG1hc2tfaFs6LCBOb25lXSAmIChvZmZzX25bTm9uZSwgOl0gPCBzcGxpdF9rdl9lbmQpLCBxaywgZmxvYXQoIi1pbmYiKQogICAgICAgICAgICApCgogICAgICAgICAgICBvZmZzX2J1Zl92ID0gKAogICAgICAgICAgICAgICAga3ZfbG9jWzosIE5vbmVdICogc3RyaWRlX2J1Zl92YnMKICAgICAgICAgICAgICAgICsgY3VyX2t2X2hlYWQgKiBzdHJpZGVfYnVmX3ZoCiAgICAgICAgICAgICAgICArIG9mZnNfZHZbTm9uZSwgOl0KICAgICAgICAgICAgKQogICAgICAgICAgICB2ID0gdGwubG9hZCgKICAgICAgICAgICAgICAgIFZfQnVmZmVyICsgb2Zmc19idWZfdiwKICAgICAgICAgICAgICAgIG1hc2s9KG9mZnNfbls6LCBOb25lXSA8IHNwbGl0X2t2X2VuZCkgJiAobWFza19kdltOb25lLCA6XSksCiAgICAgICAgICAgICAgICBvdGhlcj0wLjAsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIG5fZV9tYXggPSB0bC5tYXhpbXVtKHRsLm1heChxaywgMSksIGVfbWF4KQogICAgICAgICAgICByZV9zY2FsZSA9IHRsLmV4cChlX21heCAtIG5fZV9tYXgpCiAgICAgICAgICAgIHAgPSB0bC5leHAocWsgLSBuX2VfbWF4WzosIE5vbmVdKQogICAgICAgICAgICBhY2MgKj0gcmVfc2NhbGVbOiwgTm9uZV0KICAgICAgICAgICAgYWNjICs9IHRsLmRvdChwLnRvKHYuZHR5cGUpLCB2KQoKICAgICAgICAgICAgZV9zdW0gPSBlX3N1bSAqIHJlX3NjYWxlICsgdGwuc3VtKHAsIDEpCiAgICAgICAgICAgIGVfbWF4ID0gbl9lX21heAoKICAgICAgICBvZmZzX21pZF9vID0gKAogICAgICAgICAgICBjdXJfYmF0Y2ggKiBzdHJpZGVfbWlkX29iCiAgICAgICAgICAgICsgY3VyX2hlYWRbOiwgTm9uZV0gKiBzdHJpZGVfbWlkX29oCiAgICAgICAgICAgICsgc3BsaXRfa3ZfaWQgKiBzdHJpZGVfbWlkX29zCiAgICAgICAgICAgICsgb2Zmc19kdltOb25lLCA6XQogICAgICAgICkKCiAgICAgICAgdGwuc3RvcmUoCiAgICAgICAgICAgIEF0dF9PdXQgKyBvZmZzX21pZF9vLAogICAgICAgICAgICBhY2MgLyBlX3N1bVs6LCBOb25lXSwKICAgICAgICAgICAgbWFzaz0obWFza19oWzosIE5vbmVdKSAmIChtYXNrX2R2W05vbmUsIDpdKSwKICAgICAgICApCgogICAgICAgIG9mZnNfbWlkX29fMSA9ICgKICAgICAgICAgICAgY3VyX2JhdGNoICogc3RyaWRlX21pZF9vYgogICAgICAgICAgICArIGN1cl9oZWFkICogc3RyaWRlX21pZF9vaAogICAgICAgICAgICArIHNwbGl0X2t2X2lkICogc3RyaWRlX21pZF9vcwogICAgICAgICkgLy8gTHYKCiAgICAgICAgdGwuc3RvcmUoCiAgICAgICAgICAgIEF0dF9Mc2UgKyBvZmZzX21pZF9vXzEsCiAgICAgICAgICAgIGVfbWF4ICsgdGwubG9nKGVfc3VtKSwKICAgICAgICAgICAgbWFzaz1tYXNrX2gsCiAgICAgICAgKQoKZGVmIF9kZWNvZGVfZ3JvdXBlZF9hdHRfbV9md2QoCiAgICBxLAogICAga19idWZmZXIsCiAgICB2X2J1ZmZlciwKICAgIGF0dF9vdXQsCiAgICBhdHRfbHNlLAogICAga3ZfaW5kcHRyLAogICAga3ZfaW5kaWNlcywKICAgIG51bV9rdl9zcGxpdHMsCiAgICBtYXhfa3Zfc3BsaXRzLAogICAgc21fc2NhbGUsCiAgICBsb2dpdF9jYXAsCik6CiAgICBCTE9DSyA9IDMyCiAgICBMayA9IGtfYnVmZmVyLnNoYXBlWy0xXQogICAgTHYgPSB2X2J1ZmZlci5zaGFwZVstMV0KCiAgICAjIFtUT0RPXSB3b3JrIGFyb3VuZCBzaG1lbSBsaW1pdCBvbiBNSTN4eAogICAgaWYgX2lzX2hpcCBhbmQgTGsgPj0gNTc2OgogICAgICAgIEJMT0NLID0gMTYKCiAgICBpZiBMayA9PSA1NzY6CiAgICAgICAgQkxPQ0tfRE1PREVMID0gNTEyCiAgICAgICAgQkxPQ0tfRFBFID0gNjQKICAgIGVsaWYgTGsgPT0gMjg4OgogICAgICAgIEJMT0NLX0RNT0RFTCA9IDI1NgogICAgICAgIEJMT0NLX0RQRSA9IDMyCiAgICBlbHNlOgogICAgICAgIEJMT0NLX0RNT0RFTCA9IHRyaXRvbi5uZXh0X3Bvd2VyX29mXzIoTGspCiAgICAgICAgQkxPQ0tfRFBFID0gMAogICAgQkxPQ0tfRFYgPSB0cml0b24ubmV4dF9wb3dlcl9vZl8yKEx2KQoKICAgIGJhdGNoLCBoZWFkX251bSA9IGt2X2luZHB0ci5zaGFwZVswXSAtIDEsIHEuc2hhcGVbMV0KICAgIGt2X2dyb3VwX251bSA9IHEuc2hhcGVbMV0gLy8ga19idWZmZXIuc2hhcGVbMV0KCiAgICBCTE9DS19IID0gMTYKICAgIE1BWF9LVl9TUExJVFMgPSBtYXhfa3Zfc3BsaXRzCiAgICBncmlkID0gKAogICAgICAgIGJhdGNoLAogICAgICAgIHRyaXRvbi5jZGl2KGhlYWRfbnVtLCBtaW4oQkxPQ0tfSCwga3ZfZ3JvdXBfbnVtKSksCiAgICAgICAgTUFYX0tWX1NQTElUUywKICAgICkKCiAgICBleHRyYV9rYXJncyA9IHt9CiAgICBudW1fc3RhZ2VzID0gMgoKICAgIGlmIF9pc19oaXA6CiAgICAgICAgIyBodHRwczovL3JvY20uZG9jcy5hbWQuY29tL2VuL2RvY3MtNi4yLjAvaG93LXRvL2xsbS1maW5lLXR1bmluZy1vcHRpbWl6YXRpb24vb3B0aW1pemluZy10cml0b24ta2VybmVsLmh0bWwKICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS90cml0b24tbGFuZy90cml0b24vYmxvYi9tYWluL3RoaXJkX3BhcnR5L2FtZC9iYWNrZW5kL2NvbXBpbGVyLnB5CiAgICAgICAgZXh0cmFfa2FyZ3MgPSB7IndhdmVzX3Blcl9ldSI6IDEsICJtYXRyaXhfaW5zdHJfbm9ua2RpbSI6IDE2LCAia3BhY2siOiAyfQogICAgICAgIG51bV9zdGFnZXMgPSAxCgogICAgX2Z3ZF9ncm91cGVkX2tlcm5lbF9zdGFnZTFbZ3JpZF0oCiAgICAgICAgcSwKICAgICAgICBrX2J1ZmZlciwKICAgICAgICB2X2J1ZmZlciwKICAgICAgICBzbV9zY2FsZSwKICAgICAgICBrdl9pbmRwdHIsCiAgICAgICAga3ZfaW5kaWNlcywKICAgICAgICBhdHRfb3V0LAogICAgICAgIGF0dF9sc2UsCiAgICAgICAgbnVtX2t2X3NwbGl0cywKICAgICAgICBxLnN0cmlkZSgwKSwKICAgICAgICBxLnN0cmlkZSgxKSwKICAgICAgICBrX2J1ZmZlci5zdHJpZGUoMCksCiAgICAgICAga19idWZmZXIuc3RyaWRlKDEpLAogICAgICAgIHZfYnVmZmVyLnN0cmlkZSgwKSwKICAgICAgICB2X2J1ZmZlci5zdHJpZGUoMSksCiAgICAgICAgYXR0X291dC5zdHJpZGUoMCksCiAgICAgICAgYXR0X291dC5zdHJpZGUoMSksCiAgICAgICAgYXR0X291dC5zdHJpZGUoMiksCiAgICAgICAga3ZfZ3JvdXBfbnVtPWt2X2dyb3VwX251bSwKICAgICAgICBxX2hlYWRfbnVtPWhlYWRfbnVtLAogICAgICAgIEJMT0NLX0RNT0RFTD1CTE9DS19ETU9ERUwsCiAgICAgICAgQkxPQ0tfRFBFPUJMT0NLX0RQRSwKICAgICAgICBCTE9DS19EVj1CTE9DS19EViwKICAgICAgICBCTE9DS19OPUJMT0NLLAogICAgICAgIEJMT0NLX0g9QkxPQ0tfSCwKICAgICAgICBNSU5fQkxPQ0tfS1Y9X01JTl9CTE9DS19LViwKICAgICAgICBsb2dpdF9jYXA9bG9naXRfY2FwLAogICAgICAgIG51bV93YXJwcz00LAogICAgICAgIG51bV9zdGFnZXM9bnVtX3N0YWdlcywKICAgICAgICBMaz1MaywKICAgICAgICBMdj1MdiwKICAgICAgICAqKmV4dHJhX2thcmdzLAogICAgKQoKCgoKQHRyaXRvbi5qaXQKZGVmIF9md2Rfa2VybmVsX3N0YWdlMigKICAgIE1pZF9PLAogICAgTWlkX09fMSwKICAgIE8sCiAgICBrdl9pbmRwdHIsCiAgICBudW1fa3Zfc3BsaXRzLAogICAgc3RyaWRlX21pZF9vYiwKICAgIHN0cmlkZV9taWRfb2gsCiAgICBzdHJpZGVfbWlkX29zLAogICAgc3RyaWRlX29icywKICAgIHN0cmlkZV9vaCwKICAgIE1BWF9LVl9TUExJVFM6IHRsLmNvbnN0ZXhwciwKICAgIE1JTl9CTE9DS19LVjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfRFY6IHRsLmNvbnN0ZXhwciwKICAgIEx2OiB0bC5jb25zdGV4cHIsCik6CiAgICBjdXJfYmF0Y2ggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBjdXJfaGVhZCA9IHRsLnByb2dyYW1faWQoMSkKCiAgICBjdXJfYmF0Y2hfc2VxX2xlbiA9IHRsLmxvYWQoa3ZfaW5kcHRyICsgY3VyX2JhdGNoICsgMSkgLSB0bC5sb2FkKAogICAgICAgIGt2X2luZHB0ciArIGN1cl9iYXRjaAogICAgKQogICAga3Zfc3BsaXRzID0gdGwubG9hZChudW1fa3Zfc3BsaXRzICsgY3VyX2JhdGNoKQoKICAgIG9mZnNfZCA9IHRsLmFyYW5nZSgwLCBCTE9DS19EVikKICAgIG1hc2tfZCA9IG9mZnNfZCA8IEx2CgogICAgZV9zdW0gPSAwLjAKICAgIGVfbWF4ID0gLWZsb2F0KCJpbmYiKQogICAgYWNjID0gdGwuemVyb3MoW0JMT0NLX0RWXSwgZHR5cGU9dGwuZmxvYXQzMikKCiAgICBvZmZzX3YgPSBjdXJfYmF0Y2ggKiBzdHJpZGVfbWlkX29iICsgY3VyX2hlYWQgKiBzdHJpZGVfbWlkX29oICsgb2Zmc19kCiAgICBvZmZzX2xvZ2ljID0gKGN1cl9iYXRjaCAqIHN0cmlkZV9taWRfb2IgKyBjdXJfaGVhZCAqIHN0cmlkZV9taWRfb2gpIC8vIEx2CiAgICBrdl9sZW5fcGVyX3NwbGl0ID0gKAogICAgICAgIHRsLmNkaXYodGwuY2RpdihjdXJfYmF0Y2hfc2VxX2xlbiwga3Zfc3BsaXRzKSwgTUlOX0JMT0NLX0tWKSAqIE1JTl9CTE9DS19LVgogICAgKQoKICAgIGZvciBzcGxpdF9rdl9pZCBpbiByYW5nZSgwLCBNQVhfS1ZfU1BMSVRTKToKICAgICAgICBzcGxpdF9rdl9zdGFydCA9IGt2X2xlbl9wZXJfc3BsaXQgKiBzcGxpdF9rdl9pZAogICAgICAgIHNwbGl0X2t2X2VuZCA9IHRsLm1pbmltdW0oc3BsaXRfa3Zfc3RhcnQgKyBrdl9sZW5fcGVyX3NwbGl0LCBjdXJfYmF0Y2hfc2VxX2xlbikKCiAgICAgICAgaWYgc3BsaXRfa3ZfZW5kID4gc3BsaXRfa3Zfc3RhcnQ6CiAgICAgICAgICAgIHR2ID0gdGwubG9hZCgKICAgICAgICAgICAgICAgIE1pZF9PICsgb2Zmc192ICsgc3BsaXRfa3ZfaWQgKiBzdHJpZGVfbWlkX29zLCBtYXNrPW1hc2tfZCwgb3RoZXI9MC4wCiAgICAgICAgICAgICkKICAgICAgICAgICAgdGxvZ2ljID0gdGwubG9hZChNaWRfT18xICsgb2Zmc19sb2dpYyArIHNwbGl0X2t2X2lkICogc3RyaWRlX21pZF9vcyAvLyBMdikKICAgICAgICAgICAgbl9lX21heCA9IHRsLm1heGltdW0odGxvZ2ljLCBlX21heCkKCiAgICAgICAgICAgIG9sZF9zY2FsZSA9IHRsLmV4cChlX21heCAtIG5fZV9tYXgpCiAgICAgICAgICAgIGFjYyAqPSBvbGRfc2NhbGUKICAgICAgICAgICAgZXhwX2xvZ2ljID0gdGwuZXhwKHRsb2dpYyAtIG5fZV9tYXgpCiAgICAgICAgICAgIGFjYyArPSBleHBfbG9naWMgKiB0dgoKICAgICAgICAgICAgZV9zdW0gPSBlX3N1bSAqIG9sZF9zY2FsZSArIGV4cF9sb2dpYwogICAgICAgICAgICBlX21heCA9IG5fZV9tYXgKCiAgICB0bC5zdG9yZSgKICAgICAgICBPICsgY3VyX2JhdGNoICogc3RyaWRlX29icyArIGN1cl9oZWFkICogc3RyaWRlX29oICsgb2Zmc19kLAogICAgICAgIGFjYyAvIGVfc3VtLAogICAgICAgIG1hc2s9bWFza19kLAogICAgKQoKCmRlZiBfZGVjb2RlX3NvZnRtYXhfcmVkdWNldl9md2QoCiAgICBsb2dpdHMsCiAgICBsc2UsCiAgICBxLAogICAgbywKICAgIHZfYnVmZmVyLAogICAga3ZfaW5kcHRyLAogICAgbnVtX2t2X3NwbGl0cywKICAgIG1heF9rdl9zcGxpdHMsCik6CiAgICBiYXRjaCwgaGVhZF9udW0gPSBxLnNoYXBlWzBdLCBxLnNoYXBlWzFdCiAgICBMdiA9IHZfYnVmZmVyLnNoYXBlWy0xXQogICAgQkxPQ0tfRFYgPSB0cml0b24ubmV4dF9wb3dlcl9vZl8yKEx2KQoKICAgIE1BWF9LVl9TUExJVFMgPSBtYXhfa3Zfc3BsaXRzCgogICAgZXh0cmFfa2FyZ3MgPSB7fQogICAgaWYgX2lzX2hpcDoKICAgICAgICAjIGh0dHBzOi8vcm9jbS5kb2NzLmFtZC5jb20vZW4vZG9jcy02LjIuMC9ob3ctdG8vbGxtLWZpbmUtdHVuaW5nLW9wdGltaXphdGlvbi9vcHRpbWl6aW5nLXRyaXRvbi1rZXJuZWwuaHRtbAogICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3RyaXRvbi1sYW5nL3RyaXRvbi9ibG9iL21haW4vdGhpcmRfcGFydHkvYW1kL2JhY2tlbmQvY29tcGlsZXIucHkKICAgICAgICBleHRyYV9rYXJncyA9IHsid2F2ZXNfcGVyX2V1IjogNCwgIm1hdHJpeF9pbnN0cl9ub25rZGltIjogMTYsICJrcGFjayI6IDJ9CgogICAgZ3JpZCA9IChiYXRjaCwgaGVhZF9udW0pCiAgICBfZndkX2tlcm5lbF9zdGFnZTJbZ3JpZF0oCiAgICAgICAgbG9naXRzLAogICAgICAgIGxzZSwKICAgICAgICBvLAogICAgICAgIGt2X2luZHB0ciwKICAgICAgICBudW1fa3Zfc3BsaXRzLAogICAgICAgIGxvZ2l0cy5zdHJpZGUoMCksCiAgICAgICAgbG9naXRzLnN0cmlkZSgxKSwKICAgICAgICBsb2dpdHMuc3RyaWRlKDIpLAogICAgICAgIG8uc3RyaWRlKDApLAogICAgICAgIG8uc3RyaWRlKDEpLAogICAgICAgIE1BWF9LVl9TUExJVFM9TUFYX0tWX1NQTElUUywKICAgICAgICBNSU5fQkxPQ0tfS1Y9X01JTl9CTE9DS19LViwKICAgICAgICBCTE9DS19EVj1CTE9DS19EViwKICAgICAgICBMdj1MdiwKICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICBudW1fc3RhZ2VzPTIsCiAgICAgICAgKipleHRyYV9rYXJncywKICAgICkKCgoKZGVmIGRlY29kZV9hdHRlbnRpb25fZndkX2dyb3VwZWQoCiAgICBxLAogICAga19idWZmZXIsCiAgICB2X2J1ZmZlciwKICAgIG8sCiAgICBrdl9pbmRwdHIsCiAgICBrdl9pbmRpY2VzLAogICAgYXR0bl9sb2dpdHMsCiAgICBhdHRuX2xzZSwKICAgIG51bV9rdl9zcGxpdHMsCiAgICBtYXhfa3Zfc3BsaXRzLAogICAgc21fc2NhbGUsCiAgICBsb2dpdF9jYXA9MC4wLAopOgogICAgX2RlY29kZV9ncm91cGVkX2F0dF9tX2Z3ZCgKICAgICAgICBxLAogICAgICAgIGtfYnVmZmVyLAogICAgICAgIHZfYnVmZmVyLAogICAgICAgIGF0dG5fbG9naXRzLAogICAgICAgIGF0dG5fbHNlLAogICAgICAgIGt2X2luZHB0ciwKICAgICAgICBrdl9pbmRpY2VzLAogICAgICAgIG51bV9rdl9zcGxpdHMsCiAgICAgICAgbWF4X2t2X3NwbGl0cywKICAgICAgICBzbV9zY2FsZSwKICAgICAgICBsb2dpdF9jYXAsCiAgICApCgogICAgX2RlY29kZV9zb2Z0bWF4X3JlZHVjZXZfZndkKAogICAgICAgIGF0dG5fbG9naXRzLAogICAgICAgIGF0dG5fbHNlLAogICAgICAgIHEsCiAgICAgICAgbywKICAgICAgICB2X2J1ZmZlciwKICAgICAgICBrdl9pbmRwdHIsCiAgICAgICAgbnVtX2t2X3NwbGl0cywKICAgICAgICBtYXhfa3Zfc3BsaXRzLAogICAgKQoKY2xhc3MgUGVuZ2N1b01MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICAjIERvd24tcHJvamVjdGlvbiBtYXRyaWNlcwogICAgICAgIHNlbGYuUV9wcm9qX2Rvd25fd2VpZ2h0ID0gTm9uZQogICAgICAgICMgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd25fd2VpZ2h0ID0gTm9uZQogICAgICAgICMgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSkKCiAgICAgICAgIyBVcC1wcm9qZWN0aW9uIGFuZCByb3BlIHByb2plY3Rpb24gbWF0cmljZXMKICAgICAgICBzZWxmLlFfcHJval91cF93ZWlnaHQgPSBOb25lCiAgICAgICAgIyBzZWxmLlFfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLnFfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5LVl9wcm9qX3VwX3dlaWdodCA9IE5vbmUKICAgICAgICAjIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IFJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQoKICAgICAgICAjIE91dHB1dCBwcm9qZWN0aW9uCiAgICAgICAgc2VsZi53b193ZWlnaHQgPSBOb25lCiAgICAgICAgIyBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwga3ZfY2FjaGU6IEtWQ2FjaGUpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBtb2RlbF9kaW0gPSB4LnNpemUoKQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgIFN0ZXAgMTogSGFuZGxlIGRvd24tcHJvamVjdGlvbiArIEtWIGNhY2hlICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjIHFfbG9yYSA9IHNlbGYuUV9wcm9qX2Rvd24oeCkKICAgICAgICBxX2xvcmEgPSB4IEAgc2VsZi5RX3Byb2pfZG93bl93ZWlnaHQuVAogICAgICAgICMga3ZfbG9yYSA9IHNlbGYuS1ZfcHJval9kb3duKHgpCiAgICAgICAga3ZfbG9yYSA9IHggQCBzZWxmLktWX3Byb2pfZG93bl93ZWlnaHQuVAogICAgICAgIGt2X2xvcmEsIGt2X2xlbiA9IGt2X2NhY2hlKGt2X2xvcmEpCiAgICAgICAgcXVlcnlfcG9zID0ga3ZfbGVuIC0gMQoKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgICAgICMgICAgICAgICAgICAgICAgICBTdGVwIDI6IFVwLXByb2plY3QgYW5kIHByZXBhcmUgTm9QRSArIFJvUEUgICAgICAgICAgICAgICAgICAjCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICBxX25vcGVfYW5kX3JvcGUgPSAocV9sb3JhIEAgc2VsZi5RX3Byb2pfdXBfd2VpZ2h0LlQpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHFfbm9wZSwgcV9yb3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9yb3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMgSGFuZGxlIGtleXMgYW5kIHZhbHVlcyBLL1YuIFYgZG9lcyBub3QgbmVlZCBSb1BFCiAgICAgICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgU3RlcCAzOiBIYW5kbGUgUm9QRSBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgICAgICAjIENvbXB1dGUgUm9QRSBmb3IgcXVlcmllcyBhbmQgY29tYmluZSB3aXRoIG5vLVJvUEUgcGFydAogICAgICAgIHFfcm9wZSA9IHFfcm9wZS5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBuX2hlYWRzIHggc2VxX2xlbiB4IHJvcGVfaGVhZF9kaW0KICAgICAgICBxX3JvcGUgPSBzZWxmLnFfcm9wZShxX3JvcGUsIHN0YXJ0X3Bvcz1xdWVyeV9wb3MpCgogICAgICAgIHFfbm9wZSA9IHFfbm9wZS5wZXJtdXRlKDAsIDIsIDEsIDMpICMgYnMgeCBuX2hlYWRzIHggc2VxX2xlbiB4IHJvcGVfaGVhZF9kaW0KICAgICAgICBxID0gdG9yY2guY29uY2F0KFtxX25vcGUsIHFfcm9wZV0sIGRpbT0tMSkKCiAgICAgICAgIyBDb21wdXRlIFJvUEUgZm9yIGtleXMgYW5kIGNvbWJpbmUgd2l0aCBuby1Sb1BFIHBhcnQKICAgICAgICBrX3JvcGUgPSBrX3JvcGVbOiwgTm9uZSwgOiwgOl0KICAgICAgICBrX3JvcGUgPSBzZWxmLmtfcm9wZShrX3JvcGUpCgogICAgICAgIGt2X3VwX3dlaWdodCA9IHNlbGYuS1ZfcHJval91cF93ZWlnaHQudmlldyhzZWxmLm5faGVhZHMsIHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSwgLTEpCiAgICAgICAgd19rYyA9IGt2X3VwX3dlaWdodFs6LCA6c2VsZi5ub3BlX2hlYWRfZGltLCA6XQogICAgICAgIHdfdmMgPSBrdl91cF93ZWlnaHRbOiwgc2VsZi5ub3BlX2hlYWRfZGltOiwgOl0KICAgICAgICB3X3ZjID0gd192Yy5wZXJtdXRlKDAsIDIsIDEpCgogICAgICAgIG1sYV9pbnB1dF9ub3BlID0gcV9ub3BlIEAgd19rYwogICAgICAgIG1sYV9xX2lucHV0ID0gdG9yY2guY29uY2F0KFttbGFfaW5wdXRfbm9wZSwgcV9yb3BlXSwgZGltPS0xKQogICAgICAgIG1sYV9rX2lucHV0ID0ga3ZfbG9yYS5jbG9uZSgpLnVuc3F1ZWV6ZSgxKQogICAgICAgIG1sYV9rX2lucHV0Wy4uLiwgc2VsZi5rdl9sb3JhX3Jhbms6XSA9IGtfcm9wZQoKICAgICAgICBmbGFzaF9tbGFfa19idWYgPSBtbGFfa19pbnB1dAogICAgICAgIGZsYXNoX21sYV9xID0gbWxhX3FfaW5wdXQudmlldyhiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIC0xKQoKICAgICAgICB0b3RhbF90b2tlbnMgPSBiYXRjaF9zaXplICoga3ZfbGVuCiAgICAgICAga19idWZmZXIgPSBmbGFzaF9tbGFfa19idWYuc3F1ZWV6ZSgxKS5yZXNoYXBlKC0xLCAxLCBzZWxmLmt2X2xvcmFfcmFuayArIHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICB2X2J1ZmZlciA9IGtfYnVmZmVyWy4uLiwgOnNlbGYua3ZfbG9yYV9yYW5rXQoKICAgICAgICBmbGFzaF9vdXRwdXQgPSB0b3JjaC56ZXJvcyhiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIHNlbGYua3ZfbG9yYV9yYW5rLCBkdHlwZT14LmR0eXBlLCBkZXZpY2U9ImN1ZGEiKQoKICAgICAgICBiX3NlcV9sZW4gPSB0b3JjaC5mdWxsKChiYXRjaF9zaXplLCksIGt2X2xlbiwgZGV2aWNlPSJjdWRhIikKICAgICAgICBrdl9pbmRwdHIgPSB0b3JjaC56ZXJvcygoYmF0Y2hfc2l6ZSArIDEsKSwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0iY3VkYSIpCiAgICAgICAga3ZfaW5kcHRyWzEgOiBiYXRjaF9zaXplICsgMV0gPSB0b3JjaC5jdW1zdW0oYl9zZXFfbGVuWzpiYXRjaF9zaXplXSwgZGltPTApCiAgICAgICAga3ZfaW5kaWNlcyA9IHRvcmNoLmFyYW5nZSh0b3RhbF90b2tlbnMsIGRldmljZT0iY3VkYSIpCgogICAgICAgIG1heF9rdl9zcGxpdHMgPSA4CiAgICAgICAgbnVtX2t2X3NwbGl0cyA9IHRvcmNoLmZ1bGwoKGJhdGNoX3NpemUsKSwgMSwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0iY3VkYSIpCiAgICAgICAgYXR0bl9sb2dpdHMxID0gdG9yY2guZW1wdHkoCiAgICAgICAgICAgIChiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIG1heF9rdl9zcGxpdHMsIHNlbGYua3ZfbG9yYV9yYW5rKSwKICAgICAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQzMiwKICAgICAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICApCiAgICAgICAgYXR0bl9sc2UxID0gdG9yY2guZW1wdHkoCiAgICAgICAgICAgIChiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIG1heF9rdl9zcGxpdHMsIHNlbGYua3ZfbG9yYV9yYW5rKSwKICAgICAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQzMiwKICAgICAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICApCgogICAgICAgIHNtX3NjYWxlID0gMS4wIC8gbWF0aC5zcXJ0KHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkKICAgICAgICBkZWNvZGVfYXR0ZW50aW9uX2Z3ZF9ncm91cGVkKAogICAgICAgICAgICBmbGFzaF9tbGFfcSwKICAgICAgICAgICAga19idWZmZXIsCiAgICAgICAgICAgIHZfYnVmZmVyLAogICAgICAgICAgICBmbGFzaF9vdXRwdXQsCiAgICAgICAgICAgIGt2X2luZHB0ciwKICAgICAgICAgICAga3ZfaW5kaWNlcywKICAgICAgICAgICAgYXR0bl9sb2dpdHMxLAogICAgICAgICAgICBhdHRuX2xzZTEsCiAgICAgICAgICAgIG51bV9rdl9zcGxpdHMsCiAgICAgICAgICAgIG1heF9rdl9zcGxpdHMsCiAgICAgICAgICAgIHNtX3NjYWxlLAogICAgICAgICkKICAgICAgICAjIGZsYXNoX291dHB1dCA9IGZsYXNoX291dHB1dC51bnNxdWVlemUoMikKICAgICAgICAjIG1sYV9vdXQgPSBmbGFzaF9vdXRwdXQgQCB3X3ZjCiAgICAgICAgIyBtbGFfb3V0ID0gbWxhX291dC52aWV3KGJhdGNoX3NpemUsIDEsIC0xKQogICAgICAgICMgbWxhX291dCA9IG1sYV9vdXQgQCBzZWxmLndvX3dlaWdodC5UCgogICAgICAgIGZsYXNoX291dHB1dCA9IGZsYXNoX291dHB1dC5wZXJtdXRlKDEsIDAsIDIpCiAgICAgICAgIyBoLCBiLCAxMjggPSBoLCBiLCA1MTIgQCBoLCA1MTIsIDEyOAogICAgICAgIG1sYV9vdXQgPSBmbGFzaF9vdXRwdXQgQCB3X3ZjCgogICAgICAgICMgaCwgYiwgNzE2OCA9IGgsIGIsIDEyOCBAIGgsIDEyOCA3MTY4CiAgICAgICAgbWxhX291dCA9IG1sYV9vdXQgQCBzZWxmLndvX3dlaWdodC5ULnZpZXcoLTEsIDEyOCwgNzE2OCkKICAgICAgICAKICAgICAgICAjIGgsIGIsIDcxNjggPT4gYiwgMSA3MTY4CiAgICAgICAgbWxhX291dCA9IHRvcmNoLnN1bShtbGFfb3V0LCBkaW09MCkKICAgICAgICBtbGFfb3V0ID0gbWxhX291dC52aWV3KGJhdGNoX3NpemUsIDEsIC0xKQoKICAgICAgICByZXR1cm4gbWxhX291dCwga3ZfY2FjaGUuZ2V0X2RhdGEoKQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQoKICAgIG1vZGVsID0gUGVuZ2N1b01MQShjb25maWcpLnRvKCdjdWRhJykKICAgIG1vZGVsLlFfcHJval9kb3duX3dlaWdodCA9IGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQKICAgIG1vZGVsLlFfcHJval91cF93ZWlnaHQgPSBjb25maWcuUV9wcm9qX3VwX3dlaWdodAogICAgbW9kZWwuS1ZfcHJval9kb3duX3dlaWdodCA9IGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0CiAgICBtb2RlbC5LVl9wcm9qX3VwX3dlaWdodCA9IGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodAogICAgbW9kZWwud29fd2VpZ2h0ID0gY29uZmlnLndvX3dlaWdodAoKICAgIG91dHB1dCwga3ZfY2FjaGUgPSBtb2RlbCh4LCBrdl9jYWNoZSkKICAgIHJldHVybiBvdXRwdXQsIGt2X2NhY2hl
No newline at end of file

Best evidence level for this revision: reported

JSON