IyBHZW5lcmF0ZSBhIHNob3J0IG1hbiBwYWdlIGZyb20gLS1oZWxwIGFuZCAtLXZlcnNpb24gb3V0cHV0LgojIENvcHlyaWdodCCpIDE5OTcsIDk4LCA5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKIyBhbnkgbGF0ZXIgdmVyc2lvbi4KCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAojIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSAgVVNBLgoKIyBXcml0dGVuIGJ5IEJyZW5kYW4gTydEZWEgPGJvZEBjb21wdXNvbC5jb20uYXU+CiMgQXZhaWxhYmxlIGZyb20gZnRwOi8vZnRwLmdudS5vcmcvZ251L2hlbHAybWFuLwoKdXNlIDUuMDA0Owp1c2Ugc3RyaWN0Owp1c2UgR2V0b3B0OjpMb25nOwp1c2UgVGV4dDo6VGFicyBxdyhleHBhbmQpOwp1c2UgUE9TSVggcXcoc3RyZnRpbWUgc2V0bG9jYWxlIExDX1RJTUUpOwoKbXkgJHRoaXNfcHJvZ3JhbSA9ICdoZWxwMm1hbic7Cm15ICR0aGlzX3ZlcnNpb24gPSAnMS4wMjAnOwpteSAkdmVyc2lvbl9pbmZvID0gPDxFT1Q7CiR0aGlzX3Byb2dyYW0gJHRoaXNfdmVyc2lvbgoKQ29weXJpZ2h0IChDKSAxOTk3LCA5OCwgOTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuClRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCndhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgoKV3JpdHRlbiBieSBCcmVuZGFuIE8nRGVhIDxib2RcQGNvbXB1c29sLmNvbS5hdT4KRU9UCgpteSAkaGVscF9pbmZvID0gPDxFT1Q7CmAkdGhpc19wcm9ncmFtJyBnZW5lcmF0ZXMgYSBtYW4gcGFnZSBvdXQgb2YgYC0taGVscCcgYW5kIGAtLXZlcnNpb24nIG91dHB1dC4KClVzYWdlOiAkdGhpc19wcm9ncmFtIFtPUFRJT05dLi4uIEVYRUNVVEFCTEUKCiAtbiwgLS1uYW1lPVNUUklORyAgICAgICB1c2UgYFNUUklORycgYXMgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgTkFNRSBwYXJhZ3JhcGgKIC1zLCAtLXNlY3Rpb249U0VDVElPTiAgIHVzZSBgU0VDVElPTicgYXMgdGhlIHNlY3Rpb24gZm9yIHRoZSBtYW4gcGFnZQogLWksIC0taW5jbHVkZT1GSUxFICAgICAgaW5jbHVkZSBtYXRlcmlhbCBmcm9tIGBGSUxFJwogLUksIC0tb3B0LWluY2x1ZGU9RklMRSAgaW5jbHVkZSBtYXRlcmlhbCBmcm9tIGBGSUxFJyBpZiBpdCBleGlzdHMKIC1vLCAtLW91dHB1dD1GSUxFICAgICAgIHNlbmQgb3V0cHV0IHRvIGBGSUxFJwogLU4sIC0tbm8taW5mbyAgICAgICAgICAgc3VwcHJlc3MgcG9pbnRlciB0byBUZXhpbmZvIG1hbnVhbAogICAgIC0taGVscCAgICAgICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKICAgICAtLXZlcnNpb24gICAgICAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKCkVYRUNVVEFCTEUgc2hvdWxkIGFjY2VwdCBgLS1oZWxwJyBhbmQgYC0tdmVyc2lvbicgb3B0aW9ucy4KRU9UCgpteSAkc2VjdGlvbiA9IDE7Cm15ICgkb3B0X25hbWUsIEBvcHRfaW5jbHVkZSwgJG9wdF9vdXRwdXQsICRvcHRfbm9faW5mbyk7CgojIFBhcnNlIG9wdGlvbnMuCkdldG9wdDo6TG9uZzo6Y29uZmlnKCdidW5kbGluZycpOwpHZXRPcHRpb25zICgKICAgICdufG5hbWU9cycJCT0+IFwkb3B0X25hbWUsCiAgICAnc3xzZWN0aW9uPXMnCT0+IFwkc2VjdGlvbiwKICAgICdpfGluY2x1ZGU9cycJPT4gc3ViIHsgcHVzaCBAb3B0X2luY2x1ZGUsIFsgcG9wLCAxIF0gfSwKICAgICdJfG9wdC1pbmNsdWRlPXMnCT0+IHN1YiB7IHB1c2ggQG9wdF9pbmNsdWRlLCBbIHBvcCwgMCBdIH0sCiAgICAnb3xvdXRwdXQ9cycJPT4gXCRvcHRfb3V0cHV0LAogICAgJ058bm8taW5mbycJCT0+IFwkb3B0X25vX2luZm8sCiAgICBoZWxwCQk9PiBzdWIgeyBwcmludCAkaGVscF9pbmZvOyBleGl0IH0sCiAgICB2ZXJzaW9uCQk9PiBzdWIgeyBwcmludCAkdmVyc2lvbl9pbmZvOyBleGl0IH0sCikgb3IgZGllICRoZWxwX2luZm87CgpkaWUgJGhlbHBfaW5mbyB1bmxlc3MgQEFSR1YgPT0gMTsKCm15ICVpbmNsdWRlID0gKCk7Cm15ICVhcHBlbmQgPSAoKTsKbXkgQGluY2x1ZGUgPSAoKTsgIyByZXRhaW4gb3JkZXIgZ2l2ZW4gaW4gaW5jbHVkZSBmaWxlCgojIFByb3ZpZGUgcmVwbGFjZW1lbnQgYHF1b3RlLXJlZ2V4JyBvcGVyYXRvciBmb3IgcHJlLTUuMDA1LgpCRUdJTiB7IGV2YWwgcShzdWIgcXIgeyAnJyA9fiAkX1swXTsgJF9bMF0gfSkgaWYgJF0gPCA1LjAwNSB9CgojIFByb2Nlc3MgaW5jbHVkZSBmaWxlIChpZiBnaXZlbikuICBGb3JtYXQgaXM6CiMKIyAgIFtzZWN0aW9uIG5hbWVdCiMgICB2ZXJiYXRpbSB0ZXh0CiMKIyBvcgojCiMgICAvcGF0dGVybi8KIyAgIHZlcmJhdGltIHRleHQKIwoKZm9yIChAb3B0X2luY2x1ZGUpCnsKICAgIG15ICgkaW5jLCAkcmVxdWlyZWQpID0gQCRfOwoKICAgIG5leHQgdW5sZXNzIC1mICRpbmMgb3IgJHJlcXVpcmVkOwogICAgZGllICIkdGhpc19wcm9ncmFtOiBjYW4ndCBvcGVuIGAkaW5jJyAoJCEpXG4iCgl1bmxlc3Mgb3BlbiBJTkMsICRpbmM7CgogICAgbXkgJGtleTsKICAgIG15ICRoYXNoID0gXCVpbmNsdWRlOwoKICAgIHdoaWxlICg8SU5DPikKICAgIHsKCSMgW3NlY3Rpb25dCglpZiAoL15cWyhbXl1dKylcXS8pCgl7CgkgICAgJGtleSA9IHVjICQxOwoJICAgICRrZXkgPX4gcy9eXHMrLy87CgkgICAgJGtleSA9fiBzL1xzKyQvLzsKCSAgICAkaGFzaCA9IFwlaW5jbHVkZTsKCSAgICBwdXNoIEBpbmNsdWRlLCAka2V5IHVubGVzcyAkaW5jbHVkZXska2V5fTsKCSAgICBuZXh0OwoJfQoKCSMgL3BhdHRlcm4vCglpZiAobSFeLyguKikvKFtpbXNdKikhKQoJewoJICAgIG15ICRwYXQgPSAkMiA/ICIoPyQyKSQxIiA6ICQxOwoKCSAgICAjIENoZWNrIHBhdHRlcm4uCgkgICAgZXZhbCB7ICRrZXkgPSBxcigkcGF0KSB9OwoJICAgIGlmICgkQCkKCSAgICB7CgkJJEAgPX4gcy8gYXQgLio/IGxpbmUgXGQuKi8vOwoJCWRpZSAiJGluYzokLjokQCI7CgkgICAgfQoKCSAgICAkaGFzaCA9IFwlYXBwZW5kOwoJICAgIG5leHQ7Cgl9CgoJIyBTaWxlbnRseSBpZ25vcmUgYW55dGhpbmcgYmVmb3JlIHRoZSBmaXJzdAoJIyBzZWN0aW9uLS1hbGxvd3MgZm9yIGNvbW1lbnRzIGFuZCByZXZpc2lvbiBpbmZvLgoJbmV4dCB1bmxlc3MgJGtleTsKCgkkaGFzaC0+eyRrZXl9IHx8PSAnJzsKCSRoYXNoLT57JGtleX0gLj0gJF87CiAgICB9CgogICAgY2xvc2UgSU5DOwoKICAgIGRpZSAiJHRoaXNfcHJvZ3JhbTogbm8gdmFsaWQgaW5mb3JtYXRpb24gZm91bmQgaW4gYCRpbmMnXG4iCgl1bmxlc3MgJGtleTsKfQoKIyBDb21wcmVzcyB0cmFpbGluZyBibGFuayBsaW5lcy4KZm9yIG15ICRoYXNoIChcKCVpbmNsdWRlLCAlYXBwZW5kKSkKewogICAgZm9yIChrZXlzICUkaGFzaCkgeyAkaGFzaC0+eyRffSA9fiBzL1xuKyQvXG4vIH0KfQoKIyBUdXJuIG9mZiBsb2NhbGlzYXRpb24gb2YgZXhlY3V0YWJsZSdzIG91cHV0LgpARU5We3F3KExBTkdVQUdFIExBTkcgTENfQUxMKX0gPSAoJ0MnKSB4IDM7CgojIFR1cm4gb2ZmIGxvY2FsaXNhdGlvbiBvZiBkYXRlIChmb3Igc3RyZnRpbWUpLgpzZXRsb2NhbGUgTENfVElNRSwgJ0MnOwoKIyBHcmFiIGhlbHAgYW5kIHZlcnNpb24gaW5mbyBmcm9tIGV4ZWN1dGFibGUuCm15ICgkaGVscF90ZXh0LCAkdmVyc2lvbl90ZXh0KSA9IG1hcCB7CiAgICBqb2luICcnLCBtYXAgeyBzLyArJC8vOyBleHBhbmQgJF8gfSBgJEFSR1ZbMF0gLS0kXyAyPi9kZXYvbnVsbGAKCW9yIGRpZSAiJHRoaXNfcHJvZ3JhbTogY2FuJ3QgZ2V0IGAtLSRfJyBpbmZvIGZyb20gJEFSR1ZbMF1cbiIKfSBxdyhoZWxwIHZlcnNpb24pOwoKbXkgJGRhdGUgPSBzdHJmdGltZSAiJUIgJVkiLCBsb2NhbHRpbWU7CihteSAkcHJvZ3JhbSA9ICRBUkdWWzBdKSA9fiBzIS4qLyEhOwpteSAkcGFja2FnZSA9ICRwcm9ncmFtOwpteSAkdmVyc2lvbjsKCmlmICgkb3B0X291dHB1dCkKewogICAgdW5saW5rICRvcHRfb3V0cHV0CglvciBkaWUgIiR0aGlzX3Byb2dyYW06IGNhbid0IHVubGluayAkb3B0X291dHB1dCAoJCEpXG4iCglpZiAtZSAkb3B0X291dHB1dDsKCiAgICBvcGVuIFNURE9VVCwgIj4kb3B0X291dHB1dCIKCW9yIGRpZSAiJHRoaXNfcHJvZ3JhbTogY2FuJ3QgY3JlYXRlICRvcHRfb3V0cHV0ICgkISlcbiI7Cn0KCiMgVGhlIGZpcnN0IGxpbmUgb2YgdGhlIC0tdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBhc3N1bWVkIHRvIGJlIGluIG9uZQojIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKIwojICAgPHZlcnNpb24+CiMgICA8cHJvZ3JhbT4gPHZlcnNpb24+CiMgICB7R05VLEZyZWV9IDxwcm9ncmFtPiA8dmVyc2lvbj4KIyAgIDxwcm9ncmFtPiAoe0dOVSxGcmVlfSA8cGFja2FnZT4pIDx2ZXJzaW9uPgojICAgPHByb2dyYW0+IC0ge0dOVSxGcmVlfSA8cGFja2FnZT4gPHZlcnNpb24+CiMKIyBhbmQgc2VwZXJhdGVkIGZyb20gYW55IGNvcHlyaWdodC9hdXRob3IgZGV0YWlscyBieSBhIGJsYW5rIGxpbmUuCgooJF8sICR2ZXJzaW9uX3RleHQpID0gc3BsaXQgL1xuKy8sICR2ZXJzaW9uX3RleHQsIDI7CgppZiAoL14oXFMrKSArXCgoKD86R05VfEZyZWUpICtbXildKylcKSArKC4qKS8gb3IKICAgIC9eKFxTKykgKy0gKigoPzpHTlV8RnJlZSkgK1xTKykgKyguKikvKQp7CiAgICAkcHJvZ3JhbSA9ICQxOwogICAgJHBhY2thZ2UgPSAkMjsKICAgICR2ZXJzaW9uID0gJDM7CiAgICAkdmVyc2lvbiA9fiBzL152ZXJzaW9uIC8vZzsJIyBGTAogICAgJHZlcnNpb24gPX4gcy8gLiovL2c7CSMgS0gKfQplbHNpZiAoL14oKD86R05VfEZyZWUpICspPyhcUyspICsoLiopLykKewogICAgJHByb2dyYW0gPSAkMjsKICAgICRwYWNrYWdlID0gJDEgPyAiJDEkMiIgOiAkMjsKICAgICR2ZXJzaW9uID0gJDM7CiAgICAkdmVyc2lvbiA9fiBzL152ZXJzaW9uIC8vZzsJIyBGTAogICAgJHZlcnNpb24gPX4gcy8gLiovL2c7CSMgS0gKfQplbHNlCnsKICAgICR2ZXJzaW9uID0gJF87Cn0KCiRwcm9ncmFtID1+IHMhLiovISE7CgojIE5vIGluZm8gZm9yIGBpbmZvJyBpdHNlbGYuCiRvcHRfbm9faW5mbyA9IDEgaWYgJHByb2dyYW0gZXEgJ2luZm8nOwoKIyAtLW5hbWUgb3ZlcnJpZGVzIC0taW5jbHVkZSBjb250ZW50cy4KJGluY2x1ZGV7TkFNRX0gPSAiJHByb2dyYW0gXFwtICRvcHRfbmFtZVxuIiBpZiAkb3B0X25hbWU7CgojIERlZmF1bHQgKHVzZWxlc3MpIE5BTUUgcGFyYWdyYXBoLgokaW5jbHVkZXtOQU1FfSB8fD0gIiRwcm9ncmFtIFxcLSBtYW51YWwgcGFnZSBmb3IgJHByb2dyYW0gJHZlcnNpb25cbiI7CgojIE1hbiBwYWdlcyB0cmFkaXRpb25hbGx5IGhhdmUgdGhlIHBhZ2UgdGl0bGUgaW4gY2Fwcy4KbXkgJFBST0dSQU0gPSB1YyAkcHJvZ3JhbTsKCiMgRXh0cmFjdCB1c2FnZSBjbGF1c2UocykgW2lmIGFueV0gZm9yIFNZTk9QU0lTLgppZiAoJGhlbHBfdGV4dCA9fiBzL15Vc2FnZTooICsoXFMrKSkoLiopKCg/OlxuKD86IHs2fVwxfCAqb3I6ICtcUykuKikqKS8vbSkKewogICAgbXkgQHN5biA9ICQyIC4gJDM7CgogICAgaWYgKCRfID0gJDQpCiAgICB7CglzL15cbi8vOwoJZm9yIChzcGxpdCAvXG4vKSB7IHMvXiAqKG9yOiArKT8vLzsgcHVzaCBAc3luLCAkXyB9CiAgICB9CgogICAgbXkgJHN5bm9wc2lzID0gJyc7CiAgICBmb3IgKEBzeW4pCiAgICB7Cgkkc3lub3BzaXMgLj0gIi5iclxuIiBpZiAkc3lub3BzaXM7CglzIV5cUyovISE7CglzL14oXFMrKSAqLy87Cgkkc3lub3BzaXMgLj0gIi5CICQxXG4iOwoJcy9ccyskLy87CglzLygoW11bXXxcLlwuKykrKS9cXGZSJDFcXGZJL2c7CglzL14vXFxmSS8gdW5sZXNzIHMvXlxcZlIvLzsKCSRfIC49ICdcZlInOwoJcy8oXFxmSSkoICopLyQyJDEvZzsKCXMvXFxmSVxcZlIvL2c7CglzL15cXGZSLy87CglzL1xcZkkkLy87CglzL15cLi9cXCYuLzsKCgkkc3lub3BzaXMgLj0gIiRfXG4iOwogICAgfQoKICAgICRpbmNsdWRle1NZTk9QU0lTfSB8fD0gJHN5bm9wc2lzOwp9CgojIFByb2Nlc3MgdGV4dCwgaW5pdGlhbCBzZWN0aW9uIGlzIERFU0NSSVBUSU9OLgpteSAkc2VjdCA9ICdERVNDUklQVElPTic7CiRfID0gIiRoZWxwX3RleHRcblxuJHZlcnNpb25fdGV4dCI7CgojIE5vcm1hbGlzZSBwYXJhZ3JhcGggYnJlYWtzLgpzL15cbisvLzsKcy9cbiokL1xuLzsKcy9cblxuKy9cblxuL2c7CgojIFRlbXBvcmFyaWx5IGV4Y2hhbmdlIGxlYWRpbmcgZG90cyBhbmQgYmFja3NsYXNoZXMgZm9yIHRva2Vucy4Kcy9eXC4vXHg4MC9tZzsKcy9cXC9ceDgxL2c7CgojIFN0YXJ0IGEgbmV3IHBhcmFncmFwaCAoaWYgcmVxdWlyZWQpIGZvciB0aGVzZS4Kcy8oW15cbl0pXG4oUmVwb3J0ICtidWdzfEVtYWlsICtidWcgK3JlcG9ydHMgK3RvfFdyaXR0ZW4gK2J5KS8kMVxuXG4kMi9nOwoKc3ViIGNvbnZlcnRfb3B0aW9uOwoKd2hpbGUgKGxlbmd0aCkKewogICAgIyBDb252ZXJ0IHNvbWUgc3RhbmRhcmQgcGFyYWdyYXBoIG5hbWVzLgogICAgaWYgKHMvXihPcHRpb25zfEV4YW1wbGVzKTogKlxuLy8pCiAgICB7Cgkkc2VjdCA9IHVjICQxOwoJbmV4dDsKICAgIH0KCiAgICAjIENvcHlyaWdodCBzZWN0aW9uCiAgICBpZiAoL15Db3B5cmlnaHQgK1soXHhhOV0vKQogICAgewoJJHNlY3QgPSAnQ09QWVJJR0hUJzsKCSRpbmNsdWRleyRzZWN0fSB8fD0gJyc7CgkkaW5jbHVkZXskc2VjdH0gLj0gIi5QUFxuIiBpZiAkaW5jbHVkZXskc2VjdH07CgoJbXkgJGNvcHk7CgkoJGNvcHksICRfKSA9IHNwbGl0IC9cblxuLywgJF8sIDI7CgoJZm9yICgkY29weSkKCXsKCSAgICAjIEFkZCBiYWNrIG5ld2xpbmUKCSAgICBzL1xuKiQvXG4vOwoKCSAgICAjIENvbnZlcnQgaXNvOTk1OS0xIGNvcHlyaWdodCBzeW1ib2wgb3IgKGMpIHRvIG5yb2ZmCgkgICAgIyBjaGFyYWN0ZXIuCgkgICAgcy9eQ29weXJpZ2h0ICsoPzpceGE5fFwoW0NjXVwpKS9Db3B5cmlnaHQgXFwoY28vbWc7CgoJICAgICMgSW5zZXJ0IGxpbmUgYnJlYWtzIGJlZm9yZSBhZGRpdGlvbmFsIGNvcHlyaWdodCBtZXNzYWdlcwoJICAgICMgYW5kIHRoZSBkaXNjbGFpbWVyLgoJICAgIHMvKC4pXG4oQ29weXJpZ2h0IHxUaGlzICtpcyArZnJlZSArc29mdHdhcmUpLyQxXG4uYnJcbiQyL2c7CgoJICAgICMgSm9pbiBoeXBoZW5hdGVkIGxpbmVzLgoJICAgIHMvKFtBLVphLXpdKS1cbiAqLyQxL2c7Cgl9CgoJJGluY2x1ZGV7JHNlY3R9IC49ICRjb3B5OwoJJF8gfHw9ICcnOwoJbmV4dDsKICAgIH0KCiAgICAjIENhdGNoIGJ1ZyByZXBvcnQgdGV4dC4KICAgIGlmICgvXihSZXBvcnQgK2J1Z3N8RW1haWwgK2J1ZyArcmVwb3J0cyArdG8pIC8pCiAgICB7Cgkkc2VjdCA9ICdSRVBPUlRJTkcgQlVHUyc7CiAgICB9CgogICAgIyBBdXRob3Igc2VjdGlvbi4KICAgIGVsc2lmICgvXldyaXR0ZW4gK2J5LykKICAgIHsKCSRzZWN0ID0gJ0FVVEhPUic7CiAgICB9CgogICAgIyBFeGFtcGxlcywgaW5kaWNhdGVkIGJ5IGFuIGluZGVudGVkIGxlYWRpbmcgJCwgJSBvciA+IGFyZQogICAgIyByZW5kZXJlZCBpbiBhIGNvbnN0YW50IHdpZHRoIGZvbnQuCiAgICBpZiAoL14oICspKFtcJFwlPl0gKVxTLykKICAgIHsKCW15ICRpbmRlbnQgPSAkMTsKCW15ICRwcmVmaXggPSAkMjsKCW15ICRicmVhayA9ICcuSVAnOwoJJGluY2x1ZGV7JHNlY3R9IHx8PSAnJzsKCXdoaWxlIChzL14kaW5kZW50XFEkcHJlZml4XEUoXFMuKilcbiovLykKCXsKCSAgICAkaW5jbHVkZXskc2VjdH0gLj0gIiRicmVha1xuXFxmKENXJHByZWZpeCQxXFxmUlxuIjsKCSAgICAkYnJlYWsgPSAnLmJyJzsKCX0KCgluZXh0OwogICAgfQoKICAgIG15ICRtYXRjaGVkID0gJyc7CiAgICAkaW5jbHVkZXskc2VjdH0gfHw9ICcnOwoKICAgICMgU3ViLXNlY3Rpb25zIGhhdmUgYSB0cmFpbGluZyBjb2xvbiBhbmQgdGhlIHNlY29uZCBsaW5lIGluZGVudGVkLgogICAgaWYgKHMvXihcUy4qOikgKlxuIC8gLykKICAgIHsKCSRtYXRjaGVkIC49ICQmIGlmICVhcHBlbmQ7CgkkaW5jbHVkZXskc2VjdH0gLj0gcXEoLlNTICIkMSJcbik7CiAgICB9CgogICAgbXkgJGluZGVudCA9IDA7CiAgICBteSAkY29udGVudCA9ICcnOwoKICAgICMgT3B0aW9uIHdpdGggZGVzY3JpcHRpb24uCiAgICBpZiAocy9eKCB7MSwxMH0oWystXVxTLio/KSkoPzooICArKXxcbiggezIwLH0pKShcUy4qKVxuLy8pCiAgICB7CgkkbWF0Y2hlZCAuPSAkJiBpZiAlYXBwZW5kOwoJJGluZGVudCA9IGxlbmd0aCAoJDQgfHwgIiQxJDMiKTsKCSRjb250ZW50ID0gIi5UUFxuXHg4MiQyXG5ceDgyJDVcbiI7Cgl1bmxlc3MgKCQ0KQoJewoJICAgICMgSW5kZW50IG1heSBiZSBkaWZmZXJlbnQgb24gc2Vjb25kIGxpbmUuCgkgICAgJGluZGVudCA9IGxlbmd0aCAkJiBpZiAvXiB7MjAsfS87Cgl9CiAgICB9CgogICAgIyBPcHRpb24gd2l0aG91dCBkZXNjcmlwdGlvbi4KICAgIGVsc2lmIChzL14gezEsMTB9KFsrLV1cUy4qKVxuLy8pCiAgICB7CgkkbWF0Y2hlZCAuPSAkJiBpZiAlYXBwZW5kOwoJJGNvbnRlbnQgPSAiLkhQXG5ceDgyJDFcbiI7CgkkaW5kZW50ID0gODA7ICMgbm90IGNvbnRpbnVlZAogICAgfQoKICAgICMgSW5kZW50ZWQgcGFyYWdyYXBoIHdpdGggdGFnLgogICAgZWxzaWYgKHMvXiggKyhcUy4qPykgICspKFxTLiopXG4vLykKICAgIHsKCSRtYXRjaGVkIC49ICQmIGlmICVhcHBlbmQ7CgkkaW5kZW50ID0gbGVuZ3RoICQxOwoJJGNvbnRlbnQgPSAiLlRQXG5ceDgyJDJcblx4ODIkM1xuIjsKICAgIH0KCiAgICAjIEluZGVudGVkIHBhcmFncmFwaC4KICAgIGVsc2lmIChzL14oICspKFxTLiopXG4vLykKICAgIHsKCSRtYXRjaGVkIC49ICQmIGlmICVhcHBlbmQ7CgkkaW5kZW50ID0gbGVuZ3RoICQxOwoJJGNvbnRlbnQgPSAiLklQXG5ceDgyJDJcbiI7CiAgICB9CgogICAgIyBMZWZ0IGp1c3RpZmllZCBwYXJhZ3JhcGguCiAgICBlbHNlCiAgICB7CglzLyguKilcbi8vOwoJJG1hdGNoZWQgLj0gJCYgaWYgJWFwcGVuZDsKCSRjb250ZW50ID0gIi5QUFxuIiBpZiAkaW5jbHVkZXskc2VjdH07CgkkY29udGVudCAuPSAiJDFcbiI7CiAgICB9CgogICAgIyBBcHBlbmQgY29udGludWF0aW9ucy4KICAgIHdoaWxlIChzL14geyRpbmRlbnR9KFxTLiopXG4vLykKICAgIHsKCSRtYXRjaGVkIC49ICQmIGlmICVhcHBlbmQ7CgkkY29udGVudCAuPSAiXHg4MiQxXG4iCiAgICB9CgogICAgIyBNb3ZlIHRvIG5leHQgcGFyYWdyYXBoLgogICAgcy9eXG4rLy87CgogICAgZm9yICgkY29udGVudCkKICAgIHsKCSMgTGVhZGluZyBkb3QgcHJvdGVjdGlvbi4KCXMvXHg4MlwuL1x4ODAvZzsKCXMvXHg4Mi8vZzsKCgkjIENvbnZlcnQgb3B0aW9ucy4KCXMvKF58ICkoLVtdW1x3PS1dKykvJDEgLiBjb252ZXJ0X29wdGlvbiAkMi9tZ2U7CiAgICB9CgogICAgIyBDaGVjayBpZiBtYXRjaGVkIHBhcmFncmFwaCBjb250YWlucyAvcGF0Ly4KICAgIGlmICglYXBwZW5kKQogICAgewoJZm9yIG15ICRwYXQgKGtleXMgJWFwcGVuZCkKCXsKCSAgICBpZiAoJG1hdGNoZWQgPX4gJHBhdCkKCSAgICB7CgkJJGNvbnRlbnQgLj0gIi5QUFxuIiB1bmxlc3MgJGFwcGVuZHskcGF0fSA9fiAvXlwuLzsKCQkkY29udGVudCAuPSAkYXBwZW5keyRwYXR9OwoJICAgIH0KCX0KICAgIH0KCiAgICAkaW5jbHVkZXskc2VjdH0gLj0gJGNvbnRlbnQ7Cn0KCiMgUmVmZXIgdG8gdGhlIHJlYWwgZG9jdW1lbnRhdGlvbi4KdW5sZXNzICgkb3B0X25vX2luZm8pCnsKICAgICRzZWN0ID0gJ1NFRSBBTFNPJzsKICAgICRpbmNsdWRleyRzZWN0fSB8fD0gJyc7CiAgICAkaW5jbHVkZXskc2VjdH0gLj0gIi5QUFxuIiBpZiAkaW5jbHVkZXskc2VjdH07CiAgICAkaW5jbHVkZXskc2VjdH0gLj0gPDxFT1Q7ClRoZSBmdWxsIGRvY3VtZW50YXRpb24gZm9yCi5CICRwcm9ncmFtCmlzIG1haW50YWluZWQgYXMgYSBUZXhpbmZvIG1hbnVhbC4gIElmIHRoZQouQiBpbmZvCmFuZAouQiAkcHJvZ3JhbQpwcm9ncmFtcyBhcmUgcHJvcGVybHkgaW5zdGFsbGVkIGF0IHlvdXIgc2l0ZSwgdGhlIGNvbW1hbmQKLklQCi5CIGluZm8gJHByb2dyYW0KLlBQCnNob3VsZCBnaXZlIHlvdSBhY2Nlc3MgdG8gdGhlIGNvbXBsZXRlIG1hbnVhbC4KRU9UCn0KCiMgT3V0cHV0IGhlYWRlci4KcHJpbnQgPDxFT1Q7Ci5cXCIgRE8gTk9UIE1PRElGWSBUSElTIEZJTEUhICBJdCB3YXMgZ2VuZXJhdGVkIGJ5ICR0aGlzX3Byb2dyYW0gJHRoaXNfdmVyc2lvbi4KLlRIICRQUk9HUkFNICIkc2VjdGlvbiIgIiRkYXRlIiAiJHBhY2thZ2UgJHZlcnNpb24iIEZTRgpFT1QKCiMgU2VjdGlvbiBvcmRlcmluZy4KbXkgQHByZSA9IHF3KE5BTUUgU1lOT1BTSVMgREVTQ1JJUFRJT04gT1BUSU9OUyBFWEFNUExFUyk7Cm15IEBwb3N0ID0gKCdBVVRIT1InLCAnUkVQT1JUSU5HIEJVR1MnLCAnQ09QWVJJR0hUJywgJ1NFRSBBTFNPJyk7Cm15ICRmaWx0ZXIgPSBqb2luICd8JywgQHByZSwgQHBvc3Q7CgojIE91dHB1dCBjb250ZW50Lgpmb3IgKEBwcmUsIChncmVwICEgL14oJGZpbHRlcikkL28sIEBpbmNsdWRlKSwgQHBvc3QpCnsKICAgIGlmICgkaW5jbHVkZXskX30pCiAgICB7CglteSAkcXVvdGUgPSAvXFcvID8gJyInIDogJyc7CglwcmludCAiLlNIICRxdW90ZSRfJHF1b3RlXG4iOwoJCglmb3IgKCRpbmNsdWRleyRffSkKCXsKCSAgICAjIFJlcGxhY2UgbGVhZGluZyBkb3QgYW4gYmFja3NsYXNoIHRva2Vucy4KCSAgICBzL1x4ODAvXFwmLi9nOwoJICAgIHMvXHg4MS9cXGUvZzsKCSAgICBwcmludDsKCX0KICAgIH0KfQoKZXhpdDsKCiMgQ29udmVydCBvcHRpb24gZGFzaGVzIHRvIFwtIHRvIHN0b3AgbnJvZmYgZnJvbSBoeXBoZW5hdGluZyAnZW0sIGFuZAojIGVtYm9sZGVuLiAgT3B0aW9uIGFyZ3VtZW50cyBnZXQgaXRhbGljaXNlZC4Kc3ViIGNvbnZlcnRfb3B0aW9uCnsKICAgIGxvY2FsICRfID0gJ1xmQicgLiBzaGlmdDsKCiAgICBzLy0vXFwtL2c7CiAgICB1bmxlc3MgKHMvXFs9KC4qKVxdJC9cXGZSWz1cXGZJJDFcXGZSXS8pCiAgICB7CglzLz0oLikvXFxmUj1cXGZJJDEvOwoJcy8gKC4pLyBcXGZJJDEvOwoJJF8gLj0gJ1xmUic7CiAgICB9CgogICAgJF87Cn0K