Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 19361

KernelBot user 126 · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

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

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

Benchmark evidence

2 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD DeepSeek-style MoE layerfp16 · [1, 2048, 7168]
AMD Instinct MI300X
202.1ms
#78 of 118
2025-05-10
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
211.8ms
#78 of 118
2025-05-10

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:689be84de82038059c5d2ed393c20d4608d014732886cff7d6da279fbea913f8
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission.py1 lines
aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCgpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CgoKY2xhc3MgRXhwZXJ0X3JlZihubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgZF9leHBlcnQ6IE9wdGlvbmFsW2ludF0gPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdIGlmIGRfZXhwZXJ0IGlzIE5vbmUgZWxzZSBkX2V4cGVydAoKICAgICAgICBzZWxmLldfZ2F0ZSA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV191cCA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV19kb3duID0gbm4uTGluZWFyKHNlbGYuZF9leHBlcnQsIHNlbGYuZF9oaWRkZW4sIGJpYXM9RmFsc2UpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZ2F0ZSA9IHNlbGYuYWN0X2ZuKHNlbGYuV19nYXRlKHgpKQogICAgICAgIG91dCA9IHNlbGYuV19kb3duKGdhdGUgKiBzZWxmLldfdXAoeCkpCiAgICAgICAgcmV0dXJuIG91dAoKCmNsYXNzIE1vRUdhdGVfcmVmKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnRvcF9rOiBpbnQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHNlbGYubnVtX2V4cGVydHM6IGludCA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCgogICAgICAgIHNlbGYuV19nID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYubnVtX2V4cGVydHMsIGJpYXM9RmFsc2UpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIHRvcmNoLlRlbnNvcl06CiAgICAgICAgbG9naXRzID0gc2VsZi5XX2coeCkKICAgICAgICBzY29yZXMgPSBsb2dpdHMuc29mdG1heChkaW09LTEpCiAgICAgICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXNlbGYudG9wX2ssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgICAgICByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcwogICAgICAgICMgcmV0dXJuIHRvcGtfaW5kaWNlcywgdG9wa19zY29yZXMsIGxvZ2l0cywgc2NvcmVzCgoKY2xhc3MgTW9FX3JlZihubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBzZWxmLmV4cGVydHMgPSBubi5Nb2R1bGVMaXN0KFsKICAgICAgICAgICAgRXhwZXJ0X3JlZihjb25maWcpCiAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKQogICAgICAgIF0pCiAgICAgICAgc2VsZi5nYXRpbmdfbmV0d29yayA9IE1vRUdhdGVfcmVmKGNvbmZpZykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2RpbSA9IGNvbmZpZ1siZF9leHBlcnQiXSAqIGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5zaGFyZWRfZXhwZXJ0ID0gRXhwZXJ0X3JlZihjb25maWc9Y29uZmlnLCBkX2V4cGVydD1zaGFyZWRfZXhwZXJ0X2RpbSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBzaGFyZWRfb3V0cHV0ID0gc2VsZi5zaGFyZWRfZXhwZXJ0KHgpCiAgICAgICAgZXhwZXJ0X2luZGljZXMsIGV4cGVydF9zY29yZXMgPSBzZWxmLmdhdGluZ19uZXR3b3JrKHgpCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX2RpbSA9IHguc2hhcGUKICAgICAgICBvcmlnX3NoYXBlID0geC5zaGFwZQogICAgICAgIHhfZmxhdCA9IHgudmlldygtMSwgaGlkZGVuX2RpbSkKICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzID0gZXhwZXJ0X2luZGljZXMudmlldygtMSkKICAgICAgICBmbGF0X2V4cGVydF93ZWlnaHRzID0gZXhwZXJ0X3Njb3Jlcy52aWV3KC0xLCAxKQogICAgICAgIHJvdXRlZF9vdXRwdXRfZmxhdCA9IHNlbGYubW9lX2luZmVyKHhfZmxhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMpCgogICAgICAgIHJvdXRlZF9vdXRwdXQgPSByb3V0ZWRfb3V0cHV0X2ZsYXQudmlldygqb3JpZ19zaGFwZSkKICAgICAgICByZXR1cm4gcm91dGVkX291dHB1dCArIHNoYXJlZF9vdXRwdXQKCiAgICBAdG9yY2gubm9fZ3JhZCgpCiAgICBkZWYgbW9lX2luZmVyKHNlbGYsCiAgICAgICAgICAgICAgICAgIHg6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlczogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF93ZWlnaHRzOiB0b3JjaC5UZW5zb3IKICAgICAgICAgICAgICAgICApIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBleHBlcnRfY2FjaGUgPSB0b3JjaC56ZXJvc19saWtlKHgpCiAgICAgICAgaWR4cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYXJnc29ydCgpCiAgICAgICAgY291bnRzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5iaW5jb3VudCgpLmNwdSgpLm51bXB5KCkKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydCA9IGNvdW50cy5jdW1zdW0oKQogICAgICAgIG51bV9wZXJfdG9rID0gc2VsZi5jb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHRva2VuX2lkeHMgPSBpZHhzIC8vIG51bV9wZXJfdG9rCiAgICAgICAgZm9yIGV4cGVydF9pZCwgZW5kX2lkeCBpbiBlbnVtZXJhdGUodG9rZW5zX3Blcl9leHBlcnQpOgogICAgICAgICAgICBzdGFydF9pZHggPSAwIGlmIGV4cGVydF9pZCA9PSAwIGVsc2UgdG9rZW5zX3Blcl9leHBlcnRbZXhwZXJ0X2lkIC0gMV0KICAgICAgICAgICAgaWYgc3RhcnRfaWR4ID09IGVuZF9pZHg6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZXhwZXJ0ID0gc2VsZi5leHBlcnRzW2V4cGVydF9pZF0KICAgICAgICAgICAgZXhwX3Rva2VuX2lkeHMgPSB0b2tlbl9pZHhzW3N0YXJ0X2lkeDplbmRfaWR4XQogICAgICAgICAgICBleHBlcnRfdG9rZW5zID0geFtleHBfdG9rZW5faWR4c10KICAgICAgICAgICAgZXhwZXJ0X291dCAgICA9IGV4cGVydChleHBlcnRfdG9rZW5zKQogICAgICAgICAgICBleHBlcnRfb3V0Lm11bF8oZmxhdF9leHBlcnRfd2VpZ2h0c1tpZHhzW3N0YXJ0X2lkeDplbmRfaWR4XV0pCiAgICAgICAgICAgIGV4cGVydF9jYWNoZS5zY2F0dGVyX3JlZHVjZV8oCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgZXhwX3Rva2VuX2lkeHMudmlldygtMSwgMSkucmVwZWF0KDEsIHguc2hhcGVbLTFdKSwKICAgICAgICAgICAgICAgIGV4cGVydF9vdXQsCiAgICAgICAgICAgICAgICByZWR1Y2U9J3N1bScKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gZXhwZXJ0X2NhY2hlCiAgICAKCiMgY2xhc3MgRXhwZXJ0KG5uLk1vZHVsZSk6CiMgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QsIHdlaWdodHM6IERpY3QsIHNoYXJlZDogYm9vbCwgaTogaW50KToKIyAgICAgICAgIHN1cGVyKCkuX19pbml0X18oKQojICAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKIyAgICAgICAgIHNlbGYuZF9oaWRkZW46IGludCA9IGNvbmZpZ1siZF9oaWRkZW4iXQojICAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdCgojICAgICAgICAgaWYgc2hhcmVkOgojICAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udCgpLmNsb25lKCkKIyAgICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS50KCkuY2xvbmUoKQojICAgICAgICAgZWxzZToKIyAgICAgICAgICAgICBzZWxmLldfZ2F0ZSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICAgICAgc2VsZi5XX3VwICAgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS50KCkuY2xvbmUoKQojICAgICAgICAgICAgIHNlbGYuV19kb3duID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10udCgpLmNsb25lKCkKCiMgICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgojICAgICAgICAgeF9nYXRlID0gRi5saW5lYXIoeCwgc2VsZi5XX2dhdGUpCiMgICAgICAgICB4X2dhdGUgPSBGLnNpbHUoeF9nYXRlKQojICAgICAgICAgeF91cCA9IEYubGluZWFyKHgsIHNlbGYuV191cCkKIyAgICAgICAgIG91dCA9IHhfZ2F0ZSAqIHhfdXAKIyAgICAgICAgIG91dCA9IEYubGluZWFyKG91dCwgc2VsZi5XX2Rvd24pCgojICAgICAgICAgcmV0dXJuIG91dAoKY2xhc3MgRXhwZXJ0KG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCB3ZWlnaHRzOiBEaWN0LCBzaGFyZWQ6IGJvb2wsIGk6IGludCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0KCiAgICAgICAgaWYgc2hhcmVkOgogICAgICAgICAgICBzZWxmLldfZ2F0ZSA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLmNsb25lKCkKICAgICAgICAgICAgc2VsZi5XX3VwICAgPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXS5jbG9uZSgpCiAgICAgICAgICAgIHNlbGYuV19kb3duID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10uY2xvbmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10uY2xvbmUoKQogICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddLmNsb25lKCkKICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5jbG9uZSgpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgeF9nYXRlID0geCBAIHNlbGYuV19nYXRlCiAgICAgICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICAgICB4X3VwID0geCBAIHNlbGYuV191cAogICAgICAgIG91dCA9IHhfZ2F0ZSAqIHhfdXAKICAgICAgICBvdXQgPSBvdXQgQCBzZWxmLldfZG93bgoKICAgICAgICByZXR1cm4gb3V0CgoKY2xhc3MgTW9FR2F0ZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgd2VpZ2h0czogRGljdCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi50b3BfazogaW50ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KICAgICAgICBzZWxmLm51bV9leHBlcnRzOiBpbnQgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgICAgIHNlbGYuZF9oaWRkZW46IGludCA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgICAgICBzZWxmLldfZyA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXS5jbG9uZSgpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIHRvcmNoLlRlbnNvcl06CiAgICAgICAgIyBsb2dpdHMgPSB4IEAgc2VsZi5XX2cKICAgICAgICBsb2dpdHMgPSBGLmxpbmVhcih4LCBzZWxmLldfZykKICAgICAgICBzY29yZXMgPSBsb2dpdHMuc29mdG1heChkaW09LTEpCiAgICAgICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXNlbGYudG9wX2ssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgICAgICByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcwogICAgICAgICMgcmV0dXJuIHRvcGtfaW5kaWNlcywgdG9wa19zY29yZXMsIGxvZ2l0cywgc2NvcmVzCgoKY2xhc3MgTW9FKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCB3ZWlnaHRzOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZXhwZXJ0cyA9IG5uLk1vZHVsZUxpc3QoWwogICAgICAgICAgICAjIEV4cGVydF9yZWYoY29uZmlnKQogICAgICAgICAgICBFeHBlcnQoY29uZmlnLCB3ZWlnaHRzLCBGYWxzZSwgaSkKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pCiAgICAgICAgXSkKICAgICAgICBzZWxmLmdhdGluZ19uZXR3b3JrID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgICAgICMgc2VsZi5nYXRpbmdfbmV0d29yayA9IE1vRUdhdGUoY29uZmlnLCB3ZWlnaHRzKQogICAgICAgIHNoYXJlZF9leHBlcnRfZGltID0gY29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLnNoYXJlZF9leHBlcnQgPSBFeHBlcnRfcmVmKGNvbmZpZywgZF9leHBlcnQ9c2hhcmVkX2V4cGVydF9kaW0pCiAgICAgICAgIyBzZWxmLnNoYXJlZF9leHBlcnQgPSBFeHBlcnQoY29uZmlnLCB3ZWlnaHRzLCBUcnVlLCAwKQoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNoYXJlZF9vdXRwdXQgPSBzZWxmLnNoYXJlZF9leHBlcnQoeCkKICAgICAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IHNlbGYuZ2F0aW5nX25ldHdvcmsoeCkKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltID0geC5zaGFwZQogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeF9mbGF0ID0geC52aWV3KC0xLCBoaWRkZW5fZGltKQogICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCiAgICAgICAgcm91dGVkX291dHB1dF9mbGF0ID0gc2VsZi5tb2VfaW5mZXIoeF9mbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cykKCiAgICAgICAgcm91dGVkX291dHB1dCA9IHJvdXRlZF9vdXRwdXRfZmxhdC52aWV3KCpvcmlnX3NoYXBlKQogICAgICAgIHJldHVybiByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBtb2VfaW5mZXIoc2VsZiwKICAgICAgICAgICAgICAgICAgeDogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHM6IHRvcmNoLlRlbnNvcgogICAgICAgICAgICAgICAgICkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGV4cGVydF9jYWNoZSA9IHRvcmNoLnplcm9zX2xpa2UoeCkKICAgICAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgICAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKQogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0ID0gY291bnRzLmN1bXN1bSgpCiAgICAgICAgbnVtX3Blcl90b2sgPSBzZWxmLmNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgICAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydCk6CiAgICAgICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydFtleHBlcnRfaWQgLSAxXQogICAgICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBleHBlcnQgPSBzZWxmLmV4cGVydHNbZXhwZXJ0X2lkXQogICAgICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMgPSB4W2V4cF90b2tlbl9pZHhzXQogICAgICAgICAgICBleHBlcnRfb3V0ICAgID0gZXhwZXJ0KGV4cGVydF90b2tlbnMpCiAgICAgICAgICAgIGV4cGVydF9vdXQubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICAgICAgZXhwZXJ0X2NhY2hlLnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBleHBfdG9rZW5faWR4cy52aWV3KC0xLCAxKS5yZXBlYXQoMSwgeC5zaGFwZVstMV0pLAogICAgICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgICAgIHJlZHVjZT0nc3VtJwogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBleHBlcnRfY2FjaGUKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIERlZXBTZWVrLXN0eWxlIE1peHR1cmUgb2YgRXhwZXJ0cyB1c2luZyBQeVRvcmNoLgogICAgCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIG9mIChpbnB1dDogdG9yY2guVGVuc29yLCB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwgY29uZmlnOiBEaWN0KQogICAgICAgICAgICAtIGlucHV0OiBJbnB1dCB0ZW5zb3Igb2Ygc2hhcGUgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW1dCiAgICAgICAgICAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKICAgICAgICAgICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICAgCiAgICBSZXR1cm5zOgogICAgICAgIFR1cGxlIGNvbnRhaW5pbmc6CiAgICAgICAgICAgIC0gb3V0cHV0OiBQcm9jZXNzZWQgdGVuc29yIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsXQogICAgICAgICAgICAtIGF1eF9kYXRhOiBEaWN0aW9uYXJ5IHdpdGggYXV4aWxpYXJ5IGRhdGEKICAgICIiIgogICAgIyBwcmludChmImJlZ2luIGtlcm5lbCB7dGltZS50aW1lX25zKCl9IikKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgbW9lID0gTW9FKGNvbmZpZywgd2VpZ2h0cykKCiAgICAjIHByaW50KGYiYmVnaW4gY29weSB7dGltZS50aW1lX25zKCl9IikKCiAgICBtb2UuZ2F0aW5nX25ldHdvcmsuV19nLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10pCgogICAgIyBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAjICAgICBnYXRlX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10KICAgICMgICAgIHVwX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10KICAgICMgICAgIGRvd25fcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXQoKICAgICMgICAgICMgVHJhbnNwb3NlIHdlaWdodHMgdG8gbWF0Y2ggZXhwZWN0ZWQgc2hhcGUgZm9yIG5uLkxpbmVhcgogICAgIyAgICAgbW9lLmV4cGVydHNbaV0uV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcihnYXRlX3Byb2pfd2VpZ2h0LnQoKSkKICAgICMgICAgIG1vZS5leHBlcnRzW2ldLldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHVwX3Byb2pfd2VpZ2h0LnQoKSkKICAgICMgICAgIG1vZS5leHBlcnRzW2ldLldfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoZG93bl9wcm9qX3dlaWdodC50KCkpCgogICAgbW9lLnNoYXJlZF9leHBlcnQuV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLnQoKSkKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpKQogICAgbW9lLnNoYXJlZF9leHBlcnQuV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLnQoKSkKCiAgICAjIHByaW50KGYiYmVnaW4gY29tcHV0ZSB7dGltZS50aW1lX25zKCl9IikKICAgIG91dHB1dCA9IG1vZShpbnB1dF90ZW5zb3IpCiAgICAjIHByaW50KGYiZW5kIGNvbXB1dGUge3RpbWUudGltZV9ucygpfSIpCgogICAgcmV0dXJuIG91dHB1dAoKCiMgaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKIyAgICAgZGF0YSA9IGdlbmVyYXRlX2lucHV0KDcxNjgsIDIwNDgsIDEyOCwgMSwgOCwgMSwgMTAyNCwgMTcpCiMgICAgIGN1c3RvbV9rZXJuZWwoZGF0YSkKCiAgICAjIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQoKICAgICMgbW9lX2dhdGUgPSBNb0VHYXRlKGNvbmZpZywgd2VpZ2h0cykKICAgICMgbW9lX2dhdGVfcmVmID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgIyBtb2VfZ2F0ZV9yZWYuV19nLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10pCgogICAgIyBvdXRwdXQgPSBtb2VfZ2F0ZShpbnB1dF90ZW5zb3IpCiAgICAjIG91dHB1dF9yZWYgPSBtb2VfZ2F0ZV9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMF0sIG91dHB1dF9yZWZbMF0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMV0sIG91dHB1dF9yZWZbMV0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMl0sIG91dHB1dF9yZWZbMl0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbM10sIG91dHB1dF9yZWZbM10sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGV4cGVydCA9IEV4cGVydChjb25maWcsIHdlaWdodHMsIEZhbHNlLCBpKQogICAgIyAgICAgZXhwZXJ0X3JlZiA9IEV4cGVydF9yZWYoY29uZmlnKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLnQoKSkKICAgICMgICAgIGV4cGVydF9yZWYuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10udCgpKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddLnQoKSkKCiAgICAjICAgICBvdXRwdXQgPSBleHBlcnQoaW5wdXRfdGVuc29yKQogICAgIyAgICAgb3V0cHV0X3JlZiA9IGV4cGVydF9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgICAgIHByaW50KGYiZXhwZXJ0IHtpfSIpCiAgICAjICAgICBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dCwgb3V0cHV0X3JlZiwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKICAgICMgbW9lID0gTW9FKGNvbmZpZywgd2VpZ2h0cykKICAgICMgbW9lX3JlZiA9IE1vRV9yZWYoY29uZmlnKQoKICAgICMgbW9lX3JlZi5nYXRpbmdfbmV0d29yay5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGdhdGVfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQogICAgIyAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgIyAgICAgZG93bl9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddCgogICAgIyAgICAgIyBUcmFuc3Bvc2Ugd2VpZ2h0cyB0byBtYXRjaCBleHBlY3RlZCBzaGFwZSBmb3Igbm4uTGluZWFyCiAgICAjICAgICBtb2VfcmVmLmV4cGVydHNbaV0uV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcihnYXRlX3Byb2pfd2VpZ2h0LnQoKSkKICAgICMgICAgIG1vZV9yZWYuZXhwZXJ0c1tpXS5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih1cF9wcm9qX3dlaWdodC50KCkpCiAgICAjICAgICBtb2VfcmVmLmV4cGVydHNbaV0uV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihkb3duX3Byb2pfd2VpZ2h0LnQoKSkKCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udCgpKQogICAgIyBtb2VfcmVmLnNoYXJlZF9leHBlcnQuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXS50KCkpCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udCgpKQoKICAgICMgb3V0cHV0ID0gbW9lKGlucHV0X3RlbnNvcikKICAgICMgb3V0cHV0X3JlZiA9IG1vZV9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXQsIG91dHB1dF9yZWYsIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkK

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 amd-mixture-of-experts · submission 19328.

- aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCgpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CgoKY2xhc3MgRXhwZXJ0X3JlZihubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgZF9leHBlcnQ6IE9wdGlvbmFsW2ludF0gPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdIGlmIGRfZXhwZXJ0IGlzIE5vbmUgZWxzZSBkX2V4cGVydAoKICAgICAgICBzZWxmLldfZ2F0ZSA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV191cCA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV19kb3duID0gbm4uTGluZWFyKHNlbGYuZF9leHBlcnQsIHNlbGYuZF9oaWRkZW4sIGJpYXM9RmFsc2UpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZ2F0ZSA9IHNlbGYuYWN0X2ZuKHNlbGYuV19nYXRlKHgpKQogICAgICAgIG91dCA9IHNlbGYuV19kb3duKGdhdGUgKiBzZWxmLldfdXAoeCkpCiAgICAgICAgcmV0dXJuIG91dAoKCmNsYXNzIE1vRUdhdGVfcmVmKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnRvcF9rOiBpbnQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHNlbGYubnVtX2V4cGVydHM6IGludCA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCgogICAgICAgIHNlbGYuV19nID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYubnVtX2V4cGVydHMsIGJpYXM9RmFsc2UpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIHRvcmNoLlRlbnNvcl06CiAgICAgICAgbG9naXRzID0gc2VsZi5XX2coeCkKICAgICAgICBzY29yZXMgPSBsb2dpdHMuc29mdG1heChkaW09LTEpCiAgICAgICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXNlbGYudG9wX2ssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgICAgICByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcwogICAgICAgICMgcmV0dXJuIHRvcGtfaW5kaWNlcywgdG9wa19zY29yZXMsIGxvZ2l0cywgc2NvcmVzCgoKY2xhc3MgTW9FX3JlZihubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBzZWxmLmV4cGVydHMgPSBubi5Nb2R1bGVMaXN0KFsKICAgICAgICAgICAgRXhwZXJ0X3JlZihjb25maWcpCiAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKQogICAgICAgIF0pCiAgICAgICAgc2VsZi5nYXRpbmdfbmV0d29yayA9IE1vRUdhdGVfcmVmKGNvbmZpZykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2RpbSA9IGNvbmZpZ1siZF9leHBlcnQiXSAqIGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5zaGFyZWRfZXhwZXJ0ID0gRXhwZXJ0X3JlZihjb25maWc9Y29uZmlnLCBkX2V4cGVydD1zaGFyZWRfZXhwZXJ0X2RpbSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBzaGFyZWRfb3V0cHV0ID0gc2VsZi5zaGFyZWRfZXhwZXJ0KHgpCiAgICAgICAgZXhwZXJ0X2luZGljZXMsIGV4cGVydF9zY29yZXMgPSBzZWxmLmdhdGluZ19uZXR3b3JrKHgpCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX2RpbSA9IHguc2hhcGUKICAgICAgICBvcmlnX3NoYXBlID0geC5zaGFwZQogICAgICAgIHhfZmxhdCA9IHgudmlldygtMSwgaGlkZGVuX2RpbSkKICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzID0gZXhwZXJ0X2luZGljZXMudmlldygtMSkKICAgICAgICBmbGF0X2V4cGVydF93ZWlnaHRzID0gZXhwZXJ0X3Njb3Jlcy52aWV3KC0xLCAxKQogICAgICAgIHJvdXRlZF9vdXRwdXRfZmxhdCA9IHNlbGYubW9lX2luZmVyKHhfZmxhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMpCgogICAgICAgIHJvdXRlZF9vdXRwdXQgPSByb3V0ZWRfb3V0cHV0X2ZsYXQudmlldygqb3JpZ19zaGFwZSkKICAgICAgICByZXR1cm4gcm91dGVkX291dHB1dCArIHNoYXJlZF9vdXRwdXQKCiAgICBAdG9yY2gubm9fZ3JhZCgpCiAgICBkZWYgbW9lX2luZmVyKHNlbGYsCiAgICAgICAgICAgICAgICAgIHg6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlczogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF93ZWlnaHRzOiB0b3JjaC5UZW5zb3IKICAgICAgICAgICAgICAgICApIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBleHBlcnRfY2FjaGUgPSB0b3JjaC56ZXJvc19saWtlKHgpCiAgICAgICAgaWR4cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYXJnc29ydCgpCiAgICAgICAgY291bnRzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5iaW5jb3VudCgpLmNwdSgpLm51bXB5KCkKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydCA9IGNvdW50cy5jdW1zdW0oKQogICAgICAgIG51bV9wZXJfdG9rID0gc2VsZi5jb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHRva2VuX2lkeHMgPSBpZHhzIC8vIG51bV9wZXJfdG9rCiAgICAgICAgZm9yIGV4cGVydF9pZCwgZW5kX2lkeCBpbiBlbnVtZXJhdGUodG9rZW5zX3Blcl9leHBlcnQpOgogICAgICAgICAgICBzdGFydF9pZHggPSAwIGlmIGV4cGVydF9pZCA9PSAwIGVsc2UgdG9rZW5zX3Blcl9leHBlcnRbZXhwZXJ0X2lkIC0gMV0KICAgICAgICAgICAgaWYgc3RhcnRfaWR4ID09IGVuZF9pZHg6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZXhwZXJ0ID0gc2VsZi5leHBlcnRzW2V4cGVydF9pZF0KICAgICAgICAgICAgZXhwX3Rva2VuX2lkeHMgPSB0b2tlbl9pZHhzW3N0YXJ0X2lkeDplbmRfaWR4XQogICAgICAgICAgICBleHBlcnRfdG9rZW5zID0geFtleHBfdG9rZW5faWR4c10KICAgICAgICAgICAgZXhwZXJ0X291dCAgICA9IGV4cGVydChleHBlcnRfdG9rZW5zKQogICAgICAgICAgICBleHBlcnRfb3V0Lm11bF8oZmxhdF9leHBlcnRfd2VpZ2h0c1tpZHhzW3N0YXJ0X2lkeDplbmRfaWR4XV0pCiAgICAgICAgICAgIGV4cGVydF9jYWNoZS5zY2F0dGVyX3JlZHVjZV8oCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgZXhwX3Rva2VuX2lkeHMudmlldygtMSwgMSkucmVwZWF0KDEsIHguc2hhcGVbLTFdKSwKICAgICAgICAgICAgICAgIGV4cGVydF9vdXQsCiAgICAgICAgICAgICAgICByZWR1Y2U9J3N1bScKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gZXhwZXJ0X2NhY2hlCiAgICAKCiMgY2xhc3MgRXhwZXJ0KG5uLk1vZHVsZSk6CiMgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QsIHdlaWdodHM6IERpY3QsIHNoYXJlZDogYm9vbCwgaTogaW50KToKIyAgICAgICAgIHN1cGVyKCkuX19pbml0X18oKQojICAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKIyAgICAgICAgIHNlbGYuZF9oaWRkZW46IGludCA9IGNvbmZpZ1siZF9oaWRkZW4iXQojICAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdCgojICAgICAgICAgaWYgc2hhcmVkOgojICAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udCgpLmNsb25lKCkKIyAgICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS50KCkuY2xvbmUoKQojICAgICAgICAgZWxzZToKIyAgICAgICAgICAgICBzZWxmLldfZ2F0ZSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICAgICAgc2VsZi5XX3VwICAgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS50KCkuY2xvbmUoKQojICAgICAgICAgICAgIHNlbGYuV19kb3duID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10udCgpLmNsb25lKCkKCiMgICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgojICAgICAgICAgeF9nYXRlID0gRi5saW5lYXIoeCwgc2VsZi5XX2dhdGUpCiMgICAgICAgICB4X2dhdGUgPSBGLnNpbHUoeF9nYXRlKQojICAgICAgICAgeF91cCA9IEYubGluZWFyKHgsIHNlbGYuV191cCkKIyAgICAgICAgIG91dCA9IHhfZ2F0ZSAqIHhfdXAKIyAgICAgICAgIG91dCA9IEYubGluZWFyKG91dCwgc2VsZi5XX2Rvd24pCgojICAgICAgICAgcmV0dXJuIG91dAoKY2xhc3MgRXhwZXJ0KG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCB3ZWlnaHRzOiBEaWN0LCBzaGFyZWQ6IGJvb2wsIGk6IGludCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0KCiAgICAgICAgaWYgc2hhcmVkOgogICAgICAgICAgICBzZWxmLldfZ2F0ZSA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLmNsb25lKCkKICAgICAgICAgICAgc2VsZi5XX3VwICAgPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXS5jbG9uZSgpCiAgICAgICAgICAgIHNlbGYuV19kb3duID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10uY2xvbmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10uY2xvbmUoKQogICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddLmNsb25lKCkKICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5jbG9uZSgpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgeF9nYXRlID0geCBAIHNlbGYuV19nYXRlCiAgICAgICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICAgICB4X3VwID0geCBAIHNlbGYuV191cAogICAgICAgIG91dCA9IHhfZ2F0ZSAqIHhfdXAKICAgICAgICBvdXQgPSBvdXQgQCBzZWxmLldfZG93bgoKICAgICAgICByZXR1cm4gb3V0CgoKY2xhc3MgTW9FR2F0ZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgd2VpZ2h0czogRGljdCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi50b3BfazogaW50ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KICAgICAgICBzZWxmLm51bV9leHBlcnRzOiBpbnQgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgICAgIHNlbGYuZF9oaWRkZW46IGludCA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgICAgICBzZWxmLldfZyA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXS5jbG9uZSgpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIHRvcmNoLlRlbnNvcl06CiAgICAgICAgIyBsb2dpdHMgPSB4IEAgc2VsZi5XX2cKICAgICAgICBsb2dpdHMgPSBGLmxpbmVhcih4LCBzZWxmLldfZykKICAgICAgICBzY29yZXMgPSBsb2dpdHMuc29mdG1heChkaW09LTEpCiAgICAgICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXNlbGYudG9wX2ssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgICAgICByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcwogICAgICAgICMgcmV0dXJuIHRvcGtfaW5kaWNlcywgdG9wa19zY29yZXMsIGxvZ2l0cywgc2NvcmVzCgoKY2xhc3MgTW9FKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCB3ZWlnaHRzOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZXhwZXJ0cyA9IG5uLk1vZHVsZUxpc3QoWwogICAgICAgICAgICBFeHBlcnRfcmVmKGNvbmZpZykKICAgICAgICAgICAgIyBFeHBlcnQoY29uZmlnLCB3ZWlnaHRzLCBGYWxzZSwgaSkKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pCiAgICAgICAgXSkKICAgICAgICBzZWxmLmdhdGluZ19uZXR3b3JrID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgICAgICMgc2VsZi5nYXRpbmdfbmV0d29yayA9IE1vRUdhdGUoY29uZmlnLCB3ZWlnaHRzKQogICAgICAgIHNoYXJlZF9leHBlcnRfZGltID0gY29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0KICAgICAgICAjIHNlbGYuc2hhcmVkX2V4cGVydCA9IEV4cGVydF9yZWYoY29uZmlnLCBkX2V4cGVydD1zaGFyZWRfZXhwZXJ0X2RpbSkKICAgICAgICBzZWxmLnNoYXJlZF9leHBlcnQgPSBFeHBlcnQoY29uZmlnLCB3ZWlnaHRzLCBUcnVlLCAwKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNoYXJlZF9vdXRwdXQgPSBzZWxmLnNoYXJlZF9leHBlcnQoeCkKICAgICAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IHNlbGYuZ2F0aW5nX25ldHdvcmsoeCkKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltID0geC5zaGFwZQogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeF9mbGF0ID0geC52aWV3KC0xLCBoaWRkZW5fZGltKQogICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCiAgICAgICAgcm91dGVkX291dHB1dF9mbGF0ID0gc2VsZi5tb2VfaW5mZXIoeF9mbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cykKCiAgICAgICAgcm91dGVkX291dHB1dCA9IHJvdXRlZF9vdXRwdXRfZmxhdC52aWV3KCpvcmlnX3NoYXBlKQogICAgICAgIHJldHVybiByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBtb2VfaW5mZXIoc2VsZiwKICAgICAgICAgICAgICAgICAgeDogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHM6IHRvcmNoLlRlbnNvcgogICAgICAgICAgICAgICAgICkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGV4cGVydF9jYWNoZSA9IHRvcmNoLnplcm9zX2xpa2UoeCkKICAgICAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgICAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKQogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0ID0gY291bnRzLmN1bXN1bSgpCiAgICAgICAgbnVtX3Blcl90b2sgPSBzZWxmLmNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgICAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydCk6CiAgICAgICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydFtleHBlcnRfaWQgLSAxXQogICAgICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBleHBlcnQgPSBzZWxmLmV4cGVydHNbZXhwZXJ0X2lkXQogICAgICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMgPSB4W2V4cF90b2tlbl9pZHhzXQogICAgICAgICAgICBleHBlcnRfb3V0ICAgID0gZXhwZXJ0KGV4cGVydF90b2tlbnMpCiAgICAgICAgICAgIGV4cGVydF9vdXQubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICAgICAgZXhwZXJ0X2NhY2hlLnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBleHBfdG9rZW5faWR4cy52aWV3KC0xLCAxKS5yZXBlYXQoMSwgeC5zaGFwZVstMV0pLAogICAgICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgICAgIHJlZHVjZT0nc3VtJwogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBleHBlcnRfY2FjaGUKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIERlZXBTZWVrLXN0eWxlIE1peHR1cmUgb2YgRXhwZXJ0cyB1c2luZyBQeVRvcmNoLgogICAgCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIG9mIChpbnB1dDogdG9yY2guVGVuc29yLCB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwgY29uZmlnOiBEaWN0KQogICAgICAgICAgICAtIGlucHV0OiBJbnB1dCB0ZW5zb3Igb2Ygc2hhcGUgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW1dCiAgICAgICAgICAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKICAgICAgICAgICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICAgCiAgICBSZXR1cm5zOgogICAgICAgIFR1cGxlIGNvbnRhaW5pbmc6CiAgICAgICAgICAgIC0gb3V0cHV0OiBQcm9jZXNzZWQgdGVuc29yIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsXQogICAgICAgICAgICAtIGF1eF9kYXRhOiBEaWN0aW9uYXJ5IHdpdGggYXV4aWxpYXJ5IGRhdGEKICAgICIiIgogICAgIyBwcmludChmImJlZ2luIGtlcm5lbCB7dGltZS50aW1lX25zKCl9IikKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgbW9lID0gTW9FKGNvbmZpZywgd2VpZ2h0cykKCiAgICAjIHByaW50KGYiYmVnaW4gY29weSB7dGltZS50aW1lX25zKCl9IikKCiAgICBtb2UuZ2F0aW5nX25ldHdvcmsuV19nLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10pCgogICAgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pOgogICAgICAgIGdhdGVfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQogICAgICAgIHVwX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10KICAgICAgICBkb3duX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10KCiAgICAgICAgIyBUcmFuc3Bvc2Ugd2VpZ2h0cyB0byBtYXRjaCBleHBlY3RlZCBzaGFwZSBmb3Igbm4uTGluZWFyCiAgICAgICAgbW9lLmV4cGVydHNbaV0uV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcihnYXRlX3Byb2pfd2VpZ2h0LnQoKSkKICAgICAgICBtb2UuZXhwZXJ0c1tpXS5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih1cF9wcm9qX3dlaWdodC50KCkpCiAgICAgICAgbW9lLmV4cGVydHNbaV0uV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihkb3duX3Byb2pfd2VpZ2h0LnQoKSkKCiAgICAjIG1vZS5zaGFyZWRfZXhwZXJ0LldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkpCiAgICAjIG1vZS5zaGFyZWRfZXhwZXJ0LldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpKQogICAgIyBtb2Uuc2hhcmVkX2V4cGVydC5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udCgpKQoKICAgICMgcHJpbnQoZiJiZWdpbiBjb21wdXRlIHt0aW1lLnRpbWVfbnMoKX0iKQogICAgb3V0cHV0ID0gbW9lKGlucHV0X3RlbnNvcikKICAgICMgcHJpbnQoZiJlbmQgY29tcHV0ZSB7dGltZS50aW1lX25zKCl9IikKCiAgICByZXR1cm4gb3V0cHV0CgoKIyBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgojICAgICBkYXRhID0gZ2VuZXJhdGVfaW5wdXQoNzE2OCwgMjA0OCwgMTI4LCAxLCA4LCAxLCAxMDI0LCAxNykKIyAgICAgY3VzdG9tX2tlcm5lbChkYXRhKQoKICAgICMgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCgogICAgIyBtb2VfZ2F0ZSA9IE1vRUdhdGUoY29uZmlnLCB3ZWlnaHRzKQogICAgIyBtb2VfZ2F0ZV9yZWYgPSBNb0VHYXRlX3JlZihjb25maWcpCiAgICAjIG1vZV9nYXRlX3JlZi5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKCiAgICAjIG91dHB1dCA9IG1vZV9nYXRlKGlucHV0X3RlbnNvcikKICAgICMgb3V0cHV0X3JlZiA9IG1vZV9nYXRlX3JlZihpbnB1dF90ZW5zb3IpCgogICAgIyBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dFswXSwgb3V0cHV0X3JlZlswXSwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQogICAgIyBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dFsxXSwgb3V0cHV0X3JlZlsxXSwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQogICAgIyBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dFsyXSwgb3V0cHV0X3JlZlsyXSwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQogICAgIyBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dFszXSwgb3V0cHV0X3JlZlszXSwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKICAgICMgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pOgogICAgIyAgICAgZXhwZXJ0ID0gRXhwZXJ0KGNvbmZpZywgd2VpZ2h0cywgRmFsc2UsIGkpCiAgICAjICAgICBleHBlcnRfcmVmID0gRXhwZXJ0X3JlZihjb25maWcpCiAgICAjICAgICBleHBlcnRfcmVmLldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10udCgpKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS50KCkpCiAgICAjICAgICBleHBlcnRfcmVmLldfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10udCgpKQoKICAgICMgICAgIG91dHB1dCA9IGV4cGVydChpbnB1dF90ZW5zb3IpCiAgICAjICAgICBvdXRwdXRfcmVmID0gZXhwZXJ0X3JlZihpbnB1dF90ZW5zb3IpCgogICAgIyAgICAgcHJpbnQoZiJleHBlcnQge2l9IikKICAgICMgICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0LCBvdXRwdXRfcmVmLCBydG9sPTFlLTIsIGF0b2w9MWUtMikpCgogICAgIyBtb2UgPSBNb0UoY29uZmlnLCB3ZWlnaHRzKQogICAgIyBtb2VfcmVmID0gTW9FX3JlZihjb25maWcpCgogICAgIyBtb2VfcmVmLmdhdGluZ19uZXR3b3JrLldfZy53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1sncm91dGVyLndlaWdodCddKQoKICAgICMgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pOgogICAgIyAgICAgZ2F0ZV9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddCiAgICAjICAgICB1cF9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddCiAgICAjICAgICBkb3duX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10KCiAgICAjICAgICAjIFRyYW5zcG9zZSB3ZWlnaHRzIHRvIG1hdGNoIGV4cGVjdGVkIHNoYXBlIGZvciBubi5MaW5lYXIKICAgICMgICAgIG1vZV9yZWYuZXhwZXJ0c1tpXS5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGdhdGVfcHJval93ZWlnaHQudCgpKQogICAgIyAgICAgbW9lX3JlZi5leHBlcnRzW2ldLldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHVwX3Byb2pfd2VpZ2h0LnQoKSkKICAgICMgICAgIG1vZV9yZWYuZXhwZXJ0c1tpXS5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGRvd25fcHJval93ZWlnaHQudCgpKQoKICAgICMgbW9lX3JlZi5zaGFyZWRfZXhwZXJ0LldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkpCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnQoKSkKICAgICMgbW9lX3JlZi5zaGFyZWRfZXhwZXJ0LldfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS50KCkpCgogICAgIyBvdXRwdXQgPSBtb2UoaW5wdXRfdGVuc29yKQogICAgIyBvdXRwdXRfcmVmID0gbW9lX3JlZihpbnB1dF90ZW5zb3IpCgogICAgIyBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dCwgb3V0cHV0X3JlZiwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQo=
No newline at end of file
+ aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCgpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CgoKY2xhc3MgRXhwZXJ0X3JlZihubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgZF9leHBlcnQ6IE9wdGlvbmFsW2ludF0gPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdIGlmIGRfZXhwZXJ0IGlzIE5vbmUgZWxzZSBkX2V4cGVydAoKICAgICAgICBzZWxmLldfZ2F0ZSA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV191cCA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV19kb3duID0gbm4uTGluZWFyKHNlbGYuZF9leHBlcnQsIHNlbGYuZF9oaWRkZW4sIGJpYXM9RmFsc2UpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZ2F0ZSA9IHNlbGYuYWN0X2ZuKHNlbGYuV19nYXRlKHgpKQogICAgICAgIG91dCA9IHNlbGYuV19kb3duKGdhdGUgKiBzZWxmLldfdXAoeCkpCiAgICAgICAgcmV0dXJuIG91dAoKCmNsYXNzIE1vRUdhdGVfcmVmKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnRvcF9rOiBpbnQgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHNlbGYubnVtX2V4cGVydHM6IGludCA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCgogICAgICAgIHNlbGYuV19nID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYubnVtX2V4cGVydHMsIGJpYXM9RmFsc2UpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIHRvcmNoLlRlbnNvcl06CiAgICAgICAgbG9naXRzID0gc2VsZi5XX2coeCkKICAgICAgICBzY29yZXMgPSBsb2dpdHMuc29mdG1heChkaW09LTEpCiAgICAgICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXNlbGYudG9wX2ssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgICAgICByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcwogICAgICAgICMgcmV0dXJuIHRvcGtfaW5kaWNlcywgdG9wa19zY29yZXMsIGxvZ2l0cywgc2NvcmVzCgoKY2xhc3MgTW9FX3JlZihubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBzZWxmLmV4cGVydHMgPSBubi5Nb2R1bGVMaXN0KFsKICAgICAgICAgICAgRXhwZXJ0X3JlZihjb25maWcpCiAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKQogICAgICAgIF0pCiAgICAgICAgc2VsZi5nYXRpbmdfbmV0d29yayA9IE1vRUdhdGVfcmVmKGNvbmZpZykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2RpbSA9IGNvbmZpZ1siZF9leHBlcnQiXSAqIGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5zaGFyZWRfZXhwZXJ0ID0gRXhwZXJ0X3JlZihjb25maWc9Y29uZmlnLCBkX2V4cGVydD1zaGFyZWRfZXhwZXJ0X2RpbSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBzaGFyZWRfb3V0cHV0ID0gc2VsZi5zaGFyZWRfZXhwZXJ0KHgpCiAgICAgICAgZXhwZXJ0X2luZGljZXMsIGV4cGVydF9zY29yZXMgPSBzZWxmLmdhdGluZ19uZXR3b3JrKHgpCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX2RpbSA9IHguc2hhcGUKICAgICAgICBvcmlnX3NoYXBlID0geC5zaGFwZQogICAgICAgIHhfZmxhdCA9IHgudmlldygtMSwgaGlkZGVuX2RpbSkKICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzID0gZXhwZXJ0X2luZGljZXMudmlldygtMSkKICAgICAgICBmbGF0X2V4cGVydF93ZWlnaHRzID0gZXhwZXJ0X3Njb3Jlcy52aWV3KC0xLCAxKQogICAgICAgIHJvdXRlZF9vdXRwdXRfZmxhdCA9IHNlbGYubW9lX2luZmVyKHhfZmxhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMpCgogICAgICAgIHJvdXRlZF9vdXRwdXQgPSByb3V0ZWRfb3V0cHV0X2ZsYXQudmlldygqb3JpZ19zaGFwZSkKICAgICAgICByZXR1cm4gcm91dGVkX291dHB1dCArIHNoYXJlZF9vdXRwdXQKCiAgICBAdG9yY2gubm9fZ3JhZCgpCiAgICBkZWYgbW9lX2luZmVyKHNlbGYsCiAgICAgICAgICAgICAgICAgIHg6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlczogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF93ZWlnaHRzOiB0b3JjaC5UZW5zb3IKICAgICAgICAgICAgICAgICApIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBleHBlcnRfY2FjaGUgPSB0b3JjaC56ZXJvc19saWtlKHgpCiAgICAgICAgaWR4cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYXJnc29ydCgpCiAgICAgICAgY291bnRzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5iaW5jb3VudCgpLmNwdSgpLm51bXB5KCkKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydCA9IGNvdW50cy5jdW1zdW0oKQogICAgICAgIG51bV9wZXJfdG9rID0gc2VsZi5jb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQogICAgICAgIHRva2VuX2lkeHMgPSBpZHhzIC8vIG51bV9wZXJfdG9rCiAgICAgICAgZm9yIGV4cGVydF9pZCwgZW5kX2lkeCBpbiBlbnVtZXJhdGUodG9rZW5zX3Blcl9leHBlcnQpOgogICAgICAgICAgICBzdGFydF9pZHggPSAwIGlmIGV4cGVydF9pZCA9PSAwIGVsc2UgdG9rZW5zX3Blcl9leHBlcnRbZXhwZXJ0X2lkIC0gMV0KICAgICAgICAgICAgaWYgc3RhcnRfaWR4ID09IGVuZF9pZHg6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZXhwZXJ0ID0gc2VsZi5leHBlcnRzW2V4cGVydF9pZF0KICAgICAgICAgICAgZXhwX3Rva2VuX2lkeHMgPSB0b2tlbl9pZHhzW3N0YXJ0X2lkeDplbmRfaWR4XQogICAgICAgICAgICBleHBlcnRfdG9rZW5zID0geFtleHBfdG9rZW5faWR4c10KICAgICAgICAgICAgZXhwZXJ0X291dCAgICA9IGV4cGVydChleHBlcnRfdG9rZW5zKQogICAgICAgICAgICBleHBlcnRfb3V0Lm11bF8oZmxhdF9leHBlcnRfd2VpZ2h0c1tpZHhzW3N0YXJ0X2lkeDplbmRfaWR4XV0pCiAgICAgICAgICAgIGV4cGVydF9jYWNoZS5zY2F0dGVyX3JlZHVjZV8oCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgZXhwX3Rva2VuX2lkeHMudmlldygtMSwgMSkucmVwZWF0KDEsIHguc2hhcGVbLTFdKSwKICAgICAgICAgICAgICAgIGV4cGVydF9vdXQsCiAgICAgICAgICAgICAgICByZWR1Y2U9J3N1bScKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gZXhwZXJ0X2NhY2hlCiAgICAKCiMgY2xhc3MgRXhwZXJ0KG5uLk1vZHVsZSk6CiMgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QsIHdlaWdodHM6IERpY3QsIHNoYXJlZDogYm9vbCwgaTogaW50KToKIyAgICAgICAgIHN1cGVyKCkuX19pbml0X18oKQojICAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKIyAgICAgICAgIHNlbGYuZF9oaWRkZW46IGludCA9IGNvbmZpZ1siZF9oaWRkZW4iXQojICAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdCgojICAgICAgICAgaWYgc2hhcmVkOgojICAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udCgpLmNsb25lKCkKIyAgICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS50KCkuY2xvbmUoKQojICAgICAgICAgZWxzZToKIyAgICAgICAgICAgICBzZWxmLldfZ2F0ZSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLnQoKS5jbG9uZSgpCiMgICAgICAgICAgICAgc2VsZi5XX3VwICAgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS50KCkuY2xvbmUoKQojICAgICAgICAgICAgIHNlbGYuV19kb3duID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10udCgpLmNsb25lKCkKCiMgICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgojICAgICAgICAgeF9nYXRlID0gRi5saW5lYXIoeCwgc2VsZi5XX2dhdGUpCiMgICAgICAgICB4X2dhdGUgPSBGLnNpbHUoeF9nYXRlKQojICAgICAgICAgeF91cCA9IEYubGluZWFyKHgsIHNlbGYuV191cCkKIyAgICAgICAgIG91dCA9IHhfZ2F0ZSAqIHhfdXAKIyAgICAgICAgIG91dCA9IEYubGluZWFyKG91dCwgc2VsZi5XX2Rvd24pCgojICAgICAgICAgcmV0dXJuIG91dAoKY2xhc3MgRXhwZXJ0KG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCB3ZWlnaHRzOiBEaWN0LCBzaGFyZWQ6IGJvb2wsIGk6IGludCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0KCiAgICAgICAgaWYgc2hhcmVkOgogICAgICAgICAgICBzZWxmLldfZ2F0ZSA9IHdlaWdodHNbZidzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLmNsb25lKCkKICAgICAgICAgICAgc2VsZi5XX3VwICAgPSB3ZWlnaHRzW2Ync2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXS5jbG9uZSgpCiAgICAgICAgICAgIHNlbGYuV19kb3duID0gd2VpZ2h0c1tmJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10uY2xvbmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuV19nYXRlID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10uY2xvbmUoKQogICAgICAgICAgICBzZWxmLldfdXAgICA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddLmNsb25lKCkKICAgICAgICAgICAgc2VsZi5XX2Rvd24gPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5jbG9uZSgpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgeF9nYXRlID0geCBAIHNlbGYuV19nYXRlCiAgICAgICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICAgICB4X3VwID0geCBAIHNlbGYuV191cAogICAgICAgIG91dCA9IHhfZ2F0ZSAqIHhfdXAKICAgICAgICBvdXQgPSBvdXQgQCBzZWxmLldfZG93bgoKICAgICAgICByZXR1cm4gb3V0CgoKY2xhc3MgTW9FR2F0ZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgd2VpZ2h0czogRGljdCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi50b3BfazogaW50ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KICAgICAgICBzZWxmLm51bV9leHBlcnRzOiBpbnQgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgICAgIHNlbGYuZF9oaWRkZW46IGludCA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgICAgICBzZWxmLldfZyA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXS5jbG9uZSgpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiBUdXBsZVt0b3JjaC5UZW5zb3IsIHRvcmNoLlRlbnNvcl06CiAgICAgICAgIyBsb2dpdHMgPSB4IEAgc2VsZi5XX2cKICAgICAgICBsb2dpdHMgPSBGLmxpbmVhcih4LCBzZWxmLldfZykKICAgICAgICBzY29yZXMgPSBsb2dpdHMuc29mdG1heChkaW09LTEpCiAgICAgICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXNlbGYudG9wX2ssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgICAgICByZXR1cm4gdG9wa19pbmRpY2VzLCB0b3BrX3Njb3JlcwogICAgICAgICMgcmV0dXJuIHRvcGtfaW5kaWNlcywgdG9wa19zY29yZXMsIGxvZ2l0cywgc2NvcmVzCgoKY2xhc3MgTW9FKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCB3ZWlnaHRzOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZXhwZXJ0cyA9IG5uLk1vZHVsZUxpc3QoWwogICAgICAgICAgICAjIEV4cGVydF9yZWYoY29uZmlnKQogICAgICAgICAgICBFeHBlcnQoY29uZmlnLCB3ZWlnaHRzLCBGYWxzZSwgaSkKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pCiAgICAgICAgXSkKICAgICAgICBzZWxmLmdhdGluZ19uZXR3b3JrID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgICAgICMgc2VsZi5nYXRpbmdfbmV0d29yayA9IE1vRUdhdGUoY29uZmlnLCB3ZWlnaHRzKQogICAgICAgIHNoYXJlZF9leHBlcnRfZGltID0gY29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLnNoYXJlZF9leHBlcnQgPSBFeHBlcnRfcmVmKGNvbmZpZywgZF9leHBlcnQ9c2hhcmVkX2V4cGVydF9kaW0pCiAgICAgICAgIyBzZWxmLnNoYXJlZF9leHBlcnQgPSBFeHBlcnQoY29uZmlnLCB3ZWlnaHRzLCBUcnVlLCAwKQoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNoYXJlZF9vdXRwdXQgPSBzZWxmLnNoYXJlZF9leHBlcnQoeCkKICAgICAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IHNlbGYuZ2F0aW5nX25ldHdvcmsoeCkKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltID0geC5zaGFwZQogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeF9mbGF0ID0geC52aWV3KC0xLCBoaWRkZW5fZGltKQogICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCiAgICAgICAgcm91dGVkX291dHB1dF9mbGF0ID0gc2VsZi5tb2VfaW5mZXIoeF9mbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cykKCiAgICAgICAgcm91dGVkX291dHB1dCA9IHJvdXRlZF9vdXRwdXRfZmxhdC52aWV3KCpvcmlnX3NoYXBlKQogICAgICAgIHJldHVybiByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBtb2VfaW5mZXIoc2VsZiwKICAgICAgICAgICAgICAgICAgeDogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHM6IHRvcmNoLlRlbnNvcgogICAgICAgICAgICAgICAgICkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGV4cGVydF9jYWNoZSA9IHRvcmNoLnplcm9zX2xpa2UoeCkKICAgICAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgICAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKQogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0ID0gY291bnRzLmN1bXN1bSgpCiAgICAgICAgbnVtX3Blcl90b2sgPSBzZWxmLmNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgICAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydCk6CiAgICAgICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydFtleHBlcnRfaWQgLSAxXQogICAgICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBleHBlcnQgPSBzZWxmLmV4cGVydHNbZXhwZXJ0X2lkXQogICAgICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMgPSB4W2V4cF90b2tlbl9pZHhzXQogICAgICAgICAgICBleHBlcnRfb3V0ICAgID0gZXhwZXJ0KGV4cGVydF90b2tlbnMpCiAgICAgICAgICAgIGV4cGVydF9vdXQubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICAgICAgZXhwZXJ0X2NhY2hlLnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBleHBfdG9rZW5faWR4cy52aWV3KC0xLCAxKS5yZXBlYXQoMSwgeC5zaGFwZVstMV0pLAogICAgICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgICAgIHJlZHVjZT0nc3VtJwogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBleHBlcnRfY2FjaGUKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIERlZXBTZWVrLXN0eWxlIE1peHR1cmUgb2YgRXhwZXJ0cyB1c2luZyBQeVRvcmNoLgogICAgCiAgICBBcmdzOgogICAgICAgIGRhdGE6IFR1cGxlIG9mIChpbnB1dDogdG9yY2guVGVuc29yLCB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwgY29uZmlnOiBEaWN0KQogICAgICAgICAgICAtIGlucHV0OiBJbnB1dCB0ZW5zb3Igb2Ygc2hhcGUgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW1dCiAgICAgICAgICAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKICAgICAgICAgICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICAgCiAgICBSZXR1cm5zOgogICAgICAgIFR1cGxlIGNvbnRhaW5pbmc6CiAgICAgICAgICAgIC0gb3V0cHV0OiBQcm9jZXNzZWQgdGVuc29yIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsXQogICAgICAgICAgICAtIGF1eF9kYXRhOiBEaWN0aW9uYXJ5IHdpdGggYXV4aWxpYXJ5IGRhdGEKICAgICIiIgogICAgIyBwcmludChmImJlZ2luIGtlcm5lbCB7dGltZS50aW1lX25zKCl9IikKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgbW9lID0gTW9FKGNvbmZpZywgd2VpZ2h0cykKCiAgICAjIHByaW50KGYiYmVnaW4gY29weSB7dGltZS50aW1lX25zKCl9IikKCiAgICBtb2UuZ2F0aW5nX25ldHdvcmsuV19nLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10pCgogICAgIyBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAjICAgICBnYXRlX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10KICAgICMgICAgIHVwX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10KICAgICMgICAgIGRvd25fcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXQoKICAgICMgICAgICMgVHJhbnNwb3NlIHdlaWdodHMgdG8gbWF0Y2ggZXhwZWN0ZWQgc2hhcGUgZm9yIG5uLkxpbmVhcgogICAgIyAgICAgbW9lLmV4cGVydHNbaV0uV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcihnYXRlX3Byb2pfd2VpZ2h0LnQoKSkKICAgICMgICAgIG1vZS5leHBlcnRzW2ldLldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHVwX3Byb2pfd2VpZ2h0LnQoKSkKICAgICMgICAgIG1vZS5leHBlcnRzW2ldLldfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoZG93bl9wcm9qX3dlaWdodC50KCkpCgogICAgbW9lLnNoYXJlZF9leHBlcnQuV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLnQoKSkKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpKQogICAgbW9lLnNoYXJlZF9leHBlcnQuV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLnQoKSkKCiAgICAjIHByaW50KGYiYmVnaW4gY29tcHV0ZSB7dGltZS50aW1lX25zKCl9IikKICAgIG91dHB1dCA9IG1vZShpbnB1dF90ZW5zb3IpCiAgICAjIHByaW50KGYiZW5kIGNvbXB1dGUge3RpbWUudGltZV9ucygpfSIpCgogICAgcmV0dXJuIG91dHB1dAoKCiMgaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKIyAgICAgZGF0YSA9IGdlbmVyYXRlX2lucHV0KDcxNjgsIDIwNDgsIDEyOCwgMSwgOCwgMSwgMTAyNCwgMTcpCiMgICAgIGN1c3RvbV9rZXJuZWwoZGF0YSkKCiAgICAjIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQoKICAgICMgbW9lX2dhdGUgPSBNb0VHYXRlKGNvbmZpZywgd2VpZ2h0cykKICAgICMgbW9lX2dhdGVfcmVmID0gTW9FR2F0ZV9yZWYoY29uZmlnKQogICAgIyBtb2VfZ2F0ZV9yZWYuV19nLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10pCgogICAgIyBvdXRwdXQgPSBtb2VfZ2F0ZShpbnB1dF90ZW5zb3IpCiAgICAjIG91dHB1dF9yZWYgPSBtb2VfZ2F0ZV9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMF0sIG91dHB1dF9yZWZbMF0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMV0sIG91dHB1dF9yZWZbMV0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbMl0sIG91dHB1dF9yZWZbMl0sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRbM10sIG91dHB1dF9yZWZbM10sIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGV4cGVydCA9IEV4cGVydChjb25maWcsIHdlaWdodHMsIEZhbHNlLCBpKQogICAgIyAgICAgZXhwZXJ0X3JlZiA9IEV4cGVydF9yZWYoY29uZmlnKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLnQoKSkKICAgICMgICAgIGV4cGVydF9yZWYuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10udCgpKQogICAgIyAgICAgZXhwZXJ0X3JlZi5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddLnQoKSkKCiAgICAjICAgICBvdXRwdXQgPSBleHBlcnQoaW5wdXRfdGVuc29yKQogICAgIyAgICAgb3V0cHV0X3JlZiA9IGV4cGVydF9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgICAgIHByaW50KGYiZXhwZXJ0IHtpfSIpCiAgICAjICAgICBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dCwgb3V0cHV0X3JlZiwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKICAgICMgbW9lID0gTW9FKGNvbmZpZywgd2VpZ2h0cykKICAgICMgbW9lX3JlZiA9IE1vRV9yZWYoY29uZmlnKQoKICAgICMgbW9lX3JlZi5nYXRpbmdfbmV0d29yay5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKCiAgICAjIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICMgICAgIGdhdGVfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXQogICAgIyAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgIyAgICAgZG93bl9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddCgogICAgIyAgICAgIyBUcmFuc3Bvc2Ugd2VpZ2h0cyB0byBtYXRjaCBleHBlY3RlZCBzaGFwZSBmb3Igbm4uTGluZWFyCiAgICAjICAgICBtb2VfcmVmLmV4cGVydHNbaV0uV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcihnYXRlX3Byb2pfd2VpZ2h0LnQoKSkKICAgICMgICAgIG1vZV9yZWYuZXhwZXJ0c1tpXS5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih1cF9wcm9qX3dlaWdodC50KCkpCiAgICAjICAgICBtb2VfcmVmLmV4cGVydHNbaV0uV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihkb3duX3Byb2pfd2VpZ2h0LnQoKSkKCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udCgpKQogICAgIyBtb2VfcmVmLnNoYXJlZF9leHBlcnQuV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXS50KCkpCiAgICAjIG1vZV9yZWYuc2hhcmVkX2V4cGVydC5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10udCgpKQoKICAgICMgb3V0cHV0ID0gbW9lKGlucHV0X3RlbnNvcikKICAgICMgb3V0cHV0X3JlZiA9IG1vZV9yZWYoaW5wdXRfdGVuc29yKQoKICAgICMgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXQsIG91dHB1dF9yZWYsIHJ0b2w9MWUtMiwgYXRvbD0xZS0yKSkK
No newline at end of file

Best evidence level for this revision: reported

JSON