local b64 = "LS0gSGF2b2MgcGVyZiBwYXRjaAotLSBMb2FkIGFmdGVyIHRoZSBtYWluIHNjcmlwdCAob3IgYW55IHRpbWUgbGF0ZXIgLSBpdCB3YWl0cyBmb3IgaXQpLgotLSAgIGxvYWRzdHJpbmcocmVhZGZpbGUoIkhhdm9jUGVyZlBhdGNoLmx1YSIpKSgpCi0tCi0tIEZpeGVzIHRoZSBydW50aW1lIGxlYWtzIHRoYXQgbWFrZSB0aGUgZnJhbWVyYXRlIGRlY2F5OgotLSAgIDEuICJTZWxlY3RlZCBQbGF5ZXIiIGhlYXJ0YmVhdCByZS1jb25uZWN0cyBSZW5kZXJTdGVwcGVkIGV2ZXJ5IGZyYW1lIC0+IGNhcHMgZHVwbGljYXRlcwotLSAgIDIuIENvbmZpZ3VyYXRpb24uQ29ubmVjdGlvbnMgLyBDb25maWd1cmF0aW9uLlRocmVhZHMgZ3JvdyBmb3JldmVyICAgICAtPiBjb21wYWN0cyB0aGVtCi0tICAgMy4gRVNQIGhlYWx0aC9hcm1vciBTY3JlZW5HdWlzIGFyZSBuZXZlciBkZXN0cm95ZWQgb24gUGxheWVyUmVtb3ZpbmcgICAgLT4gc3dlZXBzIG9ycGhhbnMKLS0gICA0LiBIaWdobGlnaHQgYWRvcm5lZXMgdGhhdCBubyBsb25nZXIgZXhpc3Qgc3RheSBpbiBDb3JlR3VpICAgICAgICAgICAgICAtPiBzd2VlcHMgb3JwaGFucwoKbG9jYWwgQ09ORklHID0gewogICAgU2Nhbkh6ICAgICAgICA9IDIwLCAgIC0tIGR1cGxpY2F0ZSBzY2FuIHJhdGUgKHBlciBzZWNvbmQpCiAgICBNYXhQZXJMaW5lICAgID0gOCwgICAgLS0gYSBjYWxsc2l0ZSB3aXRoIG1vcmUgY29ubmVjdGlvbnMgdGhhbiB0aGlzIGlzIGEgbGVhawogICAgS2VlcFBlckxpbmUgICA9IDIsICAgIC0tIGhvdyBtYW55IG9mIGEgbGVha2luZyBjYWxsc2l0ZSB0byBsZWF2ZSBhbGl2ZQogICAgQ29tcGFjdEV2ZXJ5ICA9IDIsICAgIC0tIHJlZ2lzdHJ5IGNvbXBhY3Rpb24gaW50ZXJ2YWwgKHNlY29uZHMpCiAgICBTd2VlcEV2ZXJ5ICAgID0gNSwgICAgLS0gZ3VpIC8gaGlnaGxpZ2h0IHN3ZWVwIGludGVydmFsIChzZWNvbmRzKQogICAgVmVyYm9zZSAgICAgICA9IGZhbHNlLAp9CgppZiBnZXRnZW52KCkuSGF2b2NQZXJmUGF0Y2ggdGhlbgogICAgcGNhbGwoZnVuY3Rpb24oKSBnZXRnZW52KCkuSGF2b2NQZXJmUGF0Y2g6U3RvcCgpIGVuZCkKZW5kCgpsb2NhbCBSdW5TZXJ2aWNlID0gZ2FtZTpHZXRTZXJ2aWNlKCJSdW5TZXJ2aWNlIikKbG9jYWwgUGxheWVycyAgICA9IGdhbWU6R2V0U2VydmljZSgiUGxheWVycyIpCmxvY2FsIENvcmVHdWkgICAgPSBnYW1lOkdldFNlcnZpY2UoIkNvcmVHdWkiKQoKbG9jYWwgU3RhdHMgPSB7CiAgICBLaWxsZWQgICAgICAgPSAwLAogICAgQ29tcGFjdGlvbnMgID0gMCwKICAgIENvbm5UcmltbWVkICA9IDAsCiAgICBUaHJlYWRUcmltbWVkPSAwLAogICAgR3VpU3dlcHQgICAgID0gMCwKICAgIEhsU3dlcHQgICAgICA9IDAsCiAgICBMYXN0RnBzICAgICAgPSAwLAp9Cgpsb2NhbCBmdW5jdGlvbiBsb2coLi4uKQogICAgaWYgQ09ORklHLlZlcmJvc2UgdGhlbiBwcmludCgiW3BlcmZdIiwgLi4uKSBlbmQKZW5kCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBsb2NhdGUgdGhlIHNjcmlwdCdzIG93biB0YWJsZXMgKGdsb2JhbHMsIGVsc2UgYnkgc2lnbmF0dXJlIGluIHRoZSBHQykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9jYWwgZnVuY3Rpb24gaXNDb25uZWN0aW9uKHYpCiAgICBpZiB0eXBlKHYpIH49ICJ1c2VyZGF0YSIgYW5kIHR5cGUodikgfj0gInRhYmxlIiB0aGVuIHJldHVybiBmYWxzZSBlbmQKICAgIGxvY2FsIG9rLCBjID0gcGNhbGwoZnVuY3Rpb24oKSByZXR1cm4gdi5Db25uZWN0ZWQgZW5kKQogICAgcmV0dXJuIG9rIGFuZCB0eXBlKGMpID09ICJib29sZWFuIgplbmQKCmxvY2FsIENhY2hlZENmZywgQ2FjaGVkTWFpbiwgQ2FjaGVkQXQgPSBuaWwsIG5pbCwgMAoKbG9jYWwgZnVuY3Rpb24gc2NhbkZvclRhYmxlcygpCiAgICBsb2NhbCBjZmcsIG1uCiAgICBmb3IgXywgdiBpbiBuZXh0LCBnZXRnYyh0cnVlKSBkbwogICAgICAgIGlmIHR5cGUodikgPT0gInRhYmxlIiB0aGVuCiAgICAgICAgICAgIGlmIG5vdCBjZmcKICAgICAgICAgICAgICAgIGFuZCB0eXBlKHJhd2dldCh2LCAiQ29ubmVjdGlvbnMiKSkgPT0gInRhYmxlIgogICAgICAgICAgICAgICAgYW5kIHR5cGUocmF3Z2V0KHYsICJUaHJlYWRzIikpID09ICJ0YWJsZSIKICAgICAgICAgICAgICAgIGFuZCByYXdnZXQodiwgIkV4cGVjdGVkIFZlcnNpb25zIikKICAgICAgICAgICAgICAgIGFuZCByYXdnZXQodiwgIkxvY2FsIFBsYXllciBNb2RpZmljYXRpb25zIikKICAgICAgICAgICAgdGhlbgogICAgICAgICAgICAgICAgY2ZnID0gdgogICAgICAgICAgICBlbHNlaWYgbm90IG1uCiAgICAgICAgICAgICAgICBhbmQgdHlwZShyYXdnZXQodiwgIkhpZ2hsaWdodCBDYWNoZSIpKSA9PSAidGFibGUiCiAgICAgICAgICAgICAgICBhbmQgdHlwZShyYXdnZXQodiwgIlRhcmdldCBDaGVja3MiKSkgPT0gInRhYmxlIgogICAgICAgICAgICAgICAgYW5kIHR5cGUocmF3Z2V0KHYsICJGaXN0IEtpbGwgQXVyYSIpKSA9PSAidGFibGUiCiAgICAgICAgICAgIHRoZW4KICAgICAgICAgICAgICAgIG1uID0gdgogICAgICAgICAgICBlbmQKICAgICAgICAgICAgaWYgY2ZnIGFuZCBtbiB0aGVuIGJyZWFrIGVuZAogICAgICAgIGVuZAogICAgZW5kCiAgICBDYWNoZWRDZmcsIENhY2hlZE1haW4sIENhY2hlZEF0ID0gY2ZnLCBtbiwgb3MuY2xvY2soKQogICAgcmV0dXJuIENhY2hlZENmZywgQ2FjaGVkTWFpbgplbmQKCmxvY2FsIGZ1bmN0aW9uIGZpbmRUYWJsZXMoKQogICAgbG9jYWwgZW52Q2ZnID0gZ2V0Z2VudigpLkNvbmZpZ3VyYXRpb24KICAgICAgICBvciAoZ2V0ZmVudiBhbmQgZ2V0ZmVudigwKSBhbmQgZ2V0ZmVudigwKS5Db25maWd1cmF0aW9uKQogICAgbG9jYWwgZW52TWFpbiA9IGdldGdlbnYoKS5NYWluCiAgICAgICAgb3IgKGdldGZlbnYgYW5kIGdldGZlbnYoMCkgYW5kIGdldGZlbnYoMCkuTWFpbikKCiAgICBpZiB0eXBlKGVudkNmZykgPT0gInRhYmxlIiBhbmQgdHlwZShyYXdnZXQoZW52Q2ZnLCAiQ29ubmVjdGlvbnMiKSkgPT0gInRhYmxlIgogICAgICAgIGFuZCB0eXBlKHJhd2dldChlbnZDZmcsICJUaHJlYWRzIikpID09ICJ0YWJsZSIgdGhlbgogICAgICAgIENhY2hlZENmZywgQ2FjaGVkQXQgPSBlbnZDZmcsIG9zLmNsb2NrKCkKICAgIGVuZAogICAgaWYgdHlwZShlbnZNYWluKSA9PSAidGFibGUiIGFuZCB0eXBlKHJhd2dldChlbnZNYWluLCAiVGFyZ2V0IENoZWNrcyIpKSA9PSAidGFibGUiIHRoZW4KICAgICAgICBDYWNoZWRNYWluLCBDYWNoZWRBdCA9IGVudk1haW4sIG9zLmNsb2NrKCkKICAgIGVuZAoKICAgIC0tIHJlc2NhbiBhdCBtb3N0IGV2ZXJ5IDEwczogY2hlYXAgd2hlbiB0aGUgZ2xvYmFscyBhcmUgdmlzaWJsZSwgYmFja2VkIG9mZgogICAgLS0gd2hlbiB0aGV5IGFyZSBub3QgKGEgZnVsbCBnZXRnYyh0cnVlKSBwYXNzIGlzIG5vdCBmcmVlKQogICAgbG9jYWwgbm93ID0gb3MuY2xvY2soKQogICAgaWYgKG5vdyAtIENhY2hlZEF0KSA8IDEwIHRoZW4KICAgICAgICByZXR1cm4gQ2FjaGVkQ2ZnLCBDYWNoZWRNYWluCiAgICBlbmQKCiAgICByZXR1cm4gc2NhbkZvclRhYmxlcygpCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gMS4gZHVwbGljYXRlIGNvbm5lY3Rpb24gZGFtcGVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmxvY2FsIGZ1bmN0aW9uIHNjYW5TaWduYWwoc2lnbmFsLCBtYXhQZXJMaW5lLCBrZWVwUGVyTGluZSkKICAgIGxvY2FsIG9rLCBsaXN0ID0gcGNhbGwoZ2V0Y29ubmVjdGlvbnMsIHNpZ25hbCkKICAgIGlmIG5vdCBvayBvciB0eXBlKGxpc3QpIH49ICJ0YWJsZSIgdGhlbiByZXR1cm4gZW5kCgogICAgbG9jYWwgZ3JvdXBzLCBvcmRlciA9IHt9LCB7fQogICAgZm9yIF8sIGNvbm4gaW4gaXBhaXJzKGxpc3QpIGRvCiAgICAgICAgbG9jYWwgZiA9IGNvbm4uRnVuY3Rpb24KICAgICAgICBpZiB0eXBlKGYpID09ICJmdW5jdGlvbiIgdGhlbgogICAgICAgICAgICBsb2NhbCBzLCBsID0gZGVidWcuaW5mbyhmLCAicyIpLCBkZWJ1Zy5pbmZvKGYsICJsIikKICAgICAgICAgICAgbG9jYWwga2V5ID0gdG9zdHJpbmcocykgLi4gInwiIC4uIHRvc3RyaW5nKGwpCiAgICAgICAgICAgIGxvY2FsIGcgPSBncm91cHNba2V5XQogICAgICAgICAgICBpZiBub3QgZyB0aGVuCiAgICAgICAgICAgICAgICBnID0geyBuID0gMCwgY29ubnMgPSB7fSB9CiAgICAgICAgICAgICAgICBncm91cHNba2V5XSA9IGcKICAgICAgICAgICAgICAgIHRhYmxlLmluc2VydChvcmRlciwga2V5KQogICAgICAgICAgICBlbmQKICAgICAgICAgICAgZy5uID0gZy5uICsgMQogICAgICAgICAgICB0YWJsZS5pbnNlcnQoZy5jb25ucywgY29ubikKICAgICAgICBlbmQKICAgIGVuZAoKICAgIGZvciBfLCBrZXkgaW4gaXBhaXJzKG9yZGVyKSBkbwogICAgICAgIGxvY2FsIGcgPSBncm91cHNba2V5XQogICAgICAgIGlmIGcubiA+IG1heFBlckxpbmUgdGhlbgogICAgICAgICAgICBmb3IgaSA9IGtlZXBQZXJMaW5lICsgMSwgI2cuY29ubnMgZG8KICAgICAgICAgICAgICAgIGxvY2FsIGMgPSBnLmNvbm5zW2ldCiAgICAgICAgICAgICAgICBwY2FsbChmdW5jdGlvbigpIGM6RGlzY29ubmVjdCgpIGVuZCkKICAgICAgICAgICAgICAgIFN0YXRzLktpbGxlZCA9IFN0YXRzLktpbGxlZCArIDEKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGxvZygidHJpbW1lZCIsIGcubiwgImNvbm5lY3Rpb25zIGF0Iiwga2V5KQogICAgICAgIGVuZAogICAgZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gc2NhblJlbmRlclN0ZXBwZWQoKQogICAgc2NhblNpZ25hbChSdW5TZXJ2aWNlLlJlbmRlclN0ZXBwZWQsIENPTkZJRy5NYXhQZXJMaW5lLCBDT05GSUcuS2VlcFBlckxpbmUpCmVuZAoKbG9jYWwgZnVuY3Rpb24gc2Nhbk90aGVyU2lnbmFscygpCiAgICBzY2FuU2lnbmFsKFJ1blNlcnZpY2UuSGVhcnRiZWF0LCBDT05GSUcuTWF4UGVyTGluZSAqIDIsIENPTkZJRy5LZWVwUGVyTGluZSAqIDIpCiAgICBzY2FuU2lnbmFsKFJ1blNlcnZpY2UuU3RlcHBlZCwgQ09ORklHLk1heFBlckxpbmUgKiAyLCBDT05GSUcuS2VlcFBlckxpbmUgKiAyKQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIDIuIHJlZ2lzdHJ5IGNvbXBhY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9jYWwgZnVuY3Rpb24gdHJpbUFycmF5KGFyciwgZHJvcCkKICAgIGlmIHR5cGUoYXJyKSB+PSAidGFibGUiIHRoZW4gcmV0dXJuIDAgZW5kCiAgICBsb2NhbCBuID0gI2FycgogICAgbG9jYWwgd3JpdGUsIHJlbW92ZWQgPSAxLCAwCiAgICBmb3IgaSA9IDEsIG4gZG8KICAgICAgICBsb2NhbCB2ID0gYXJyW2ldCiAgICAgICAgbG9jYWwga2VlcCA9IHYgfj0gbmlsIGFuZCBub3QgZHJvcCh2KQogICAgICAgIGlmIGtlZXAgdGhlbgogICAgICAgICAgICBhcnJbd3JpdGVdID0gdgogICAgICAgICAgICB3cml0ZSA9IHdyaXRlICsgMQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmVtb3ZlZCA9IHJlbW92ZWQgKyAxCiAgICAgICAgZW5kCiAgICBlbmQKICAgIGZvciBpID0gbiwgd3JpdGUsIC0xIGRvIGFycltpXSA9IG5pbCBlbmQKICAgIHJldHVybiByZW1vdmVkCmVuZAoKbG9jYWwgZnVuY3Rpb24gY29tcGFjdFJlZ2lzdHJpZXMoKQogICAgbG9jYWwgY2ZnID0gc2VsZWN0KDEsIGZpbmRUYWJsZXMoKSkKICAgIGlmIG5vdCBjZmcgdGhlbiByZXR1cm4gZW5kCgogICAgbG9jYWwgdHJpbW1lZENvbm4gPSB0cmltQXJyYXkoY2ZnLkNvbm5lY3Rpb25zLCBmdW5jdGlvbihjKQogICAgICAgIGlmIG5vdCBpc0Nvbm5lY3Rpb24oYykgdGhlbiByZXR1cm4gZmFsc2UgZW5kCiAgICAgICAgbG9jYWwgb2ssIGNvbm5lY3RlZCA9IHBjYWxsKGZ1bmN0aW9uKCkgcmV0dXJuIGMuQ29ubmVjdGVkIGVuZCkKICAgICAgICByZXR1cm4gb2sgYW5kIGNvbm5lY3RlZCA9PSBmYWxzZQogICAgZW5kKQoKICAgIGxvY2FsIHRyaW1tZWRUaHJlYWQgPSB0cmltQXJyYXkoY2ZnLlRocmVhZHMsIGZ1bmN0aW9uKHQpCiAgICAgICAgaWYgdHlwZSh0KSB+PSAidGhyZWFkIiB0aGVuIHJldHVybiBmYWxzZSBlbmQKICAgICAgICBsb2NhbCBvaywgc3RhdHVzID0gcGNhbGwoY29yb3V0aW5lLnN0YXR1cywgdCkKICAgICAgICByZXR1cm4gb2sgYW5kIHN0YXR1cyA9PSAiZGVhZCIKICAgIGVuZCkKCiAgICBpZiB0cmltbWVkQ29ubiA+IDAgb3IgdHJpbW1lZFRocmVhZCA+IDAgdGhlbgogICAgICAgIFN0YXRzLkNvbXBhY3Rpb25zICA9IFN0YXRzLkNvbXBhY3Rpb25zICsgMQogICAgICAgIFN0YXRzLkNvbm5UcmltbWVkICA9IFN0YXRzLkNvbm5UcmltbWVkICsgdHJpbW1lZENvbm4KICAgICAgICBTdGF0cy5UaHJlYWRUcmltbWVkPSBTdGF0cy5UaHJlYWRUcmltbWVkICsgdHJpbW1lZFRocmVhZAogICAgICAgIGxvZygiY29tcGFjdGVkIGNvbm5zIC0iIC4uIHRyaW1tZWRDb25uLCAidGhyZWFkcyAtIiAuLiB0cmltbWVkVGhyZWFkKQogICAgZW5kCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gMy80LiBndWkgKyBoaWdobGlnaHQgc3dlZXAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9jYWwgZnVuY3Rpb24gc3dlZXBHdWlzKCkKICAgIGxvY2FsIHByZXNlbnQgPSB7fQogICAgZm9yIF8sIHBsciBpbiBpcGFpcnMoUGxheWVyczpHZXRQbGF5ZXJzKCkpIGRvIHByZXNlbnRbcGxyLk5hbWVdID0gdHJ1ZSBlbmQKCiAgICBsb2NhbCBzZWVuID0ge30KICAgIGZvciBfLCBvYmogaW4gaXBhaXJzKENvcmVHdWk6R2V0Q2hpbGRyZW4oKSkgZG8KICAgICAgICBsb2NhbCBiYXNlID0gb2JqLk5hbWU6bWF0Y2goIl4oLi0pX0hlYWx0aEJhciQiKSBvciBvYmouTmFtZTptYXRjaCgiXiguLSlfQXJtb3JCYXIkIikKICAgICAgICBpZiBiYXNlIHRoZW4KICAgICAgICAgICAgbG9jYWwgdmFsaWQgPSBwcmVzZW50W2Jhc2VdCiAgICAgICAgICAgIGlmIHZhbGlkIHRoZW4KICAgICAgICAgICAgICAgIC0tIGtlZXAgdGhlIG5ld2VzdCBndWkgZm9yIHRoYXQgcGxheWVyLCBkcm9wIGR1cGxpY2F0ZXMKICAgICAgICAgICAgICAgIGlmIHNlZW5bb2JqLk5hbWVdIHRoZW4gdmFsaWQgPSBmYWxzZSBlbmQKICAgICAgICAgICAgICAgIHNlZW5bb2JqLk5hbWVdID0gdHJ1ZQogICAgICAgICAgICBlbmQKICAgICAgICAgICAgaWYgbm90IHZhbGlkIHRoZW4KICAgICAgICAgICAgICAgIHBjYWxsKGZ1bmN0aW9uKCkgb2JqOkRlc3Ryb3koKSBlbmQpCiAgICAgICAgICAgICAgICBTdGF0cy5HdWlTd2VwdCA9IFN0YXRzLkd1aVN3ZXB0ICsgMQogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIHN3ZWVwSGlnaGxpZ2h0cygpCiAgICBsb2NhbCBob2xkZXIgPSAoZ2V0aHVpIGFuZCBnZXRodWkoKSkgb3IgQ29yZUd1aQogICAgZm9yIF8sIG9iaiBpbiBpcGFpcnMoaG9sZGVyOkdldENoaWxkcmVuKCkpIGRvCiAgICAgICAgaWYgb2JqOklzQSgiSGlnaGxpZ2h0IikgdGhlbgogICAgICAgICAgICBsb2NhbCBhZG9ybmVlID0gb2JqLkFkb3JuZWUKICAgICAgICAgICAgaWYgYWRvcm5lZSA9PSBuaWwgb3IgYWRvcm5lZS5QYXJlbnQgPT0gbmlsIHRoZW4KICAgICAgICAgICAgICAgIHBjYWxsKGZ1bmN0aW9uKCkgb2JqOkRlc3Ryb3koKSBlbmQpCiAgICAgICAgICAgICAgICBTdGF0cy5IbFN3ZXB0ID0gU3RhdHMuSGxTd2VwdCArIDEKICAgICAgICAgICAgZW5kCiAgICAgICAgZW5kCiAgICBlbmQKZW5kCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSBkcml2ZXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9jYWwgUnVubmluZyA9IHRydWUKbG9jYWwgVGhyZWFkcyA9IHt9Cgpsb2NhbCBmdW5jdGlvbiBmcHNMb29wKCkKICAgIGxvY2FsIGZyYW1lcywgdDAgPSAwLCBvcy5jbG9jaygpCiAgICB3aGlsZSBSdW5uaW5nIGRvCiAgICAgICAgZnJhbWVzID0gZnJhbWVzICsgMQogICAgICAgIFJ1blNlcnZpY2UuUmVuZGVyU3RlcHBlZDpXYWl0KCkKICAgICAgICBpZiBvcy5jbG9jaygpIC0gdDAgPj0gMSB0aGVuCiAgICAgICAgICAgIFN0YXRzLkxhc3RGcHMgPSBmcmFtZXMgLyAob3MuY2xvY2soKSAtIHQwKQogICAgICAgICAgICBmcmFtZXMsIHQwID0gMCwgb3MuY2xvY2soKQogICAgICAgIGVuZAogICAgZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gZGFtcGVyTG9vcCgpCiAgICBsb2NhbCB3YWl0ID0gMSAvIENPTkZJRy5TY2FuSHoKICAgIGxvY2FsIHRpY2sgPSAwCiAgICB3aGlsZSBSdW5uaW5nIGRvCiAgICAgICAgcGNhbGwoc2NhblJlbmRlclN0ZXBwZWQpCiAgICAgICAgdGljayA9IHRpY2sgKyAxCiAgICAgICAgaWYgdGljayAlIDEwID09IDAgdGhlbiBwY2FsbChzY2FuT3RoZXJTaWduYWxzKSBlbmQKICAgICAgICB0YXNrLndhaXQod2FpdCkKICAgIGVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIGhvdXNla2VlcGluZ0xvb3AoKQogICAgbG9jYWwgdGlja3MgPSAwCiAgICB3aGlsZSBSdW5uaW5nIGRvCiAgICAgICAgdGFzay53YWl0KDAuNSkKICAgICAgICB0aWNrcyA9IHRpY2tzICsgMQogICAgICAgIGlmIHRpY2tzICUgbWF0aC5tYXgoMSwgbWF0aC5mbG9vcihDT05GSUcuQ29tcGFjdEV2ZXJ5ICogMikpID09IDAgdGhlbgogICAgICAgICAgICBwY2FsbChjb21wYWN0UmVnaXN0cmllcykKICAgICAgICBlbmQKICAgICAgICBpZiB0aWNrcyAlIG1hdGgubWF4KDEsIG1hdGguZmxvb3IoQ09ORklHLlN3ZWVwRXZlcnkgKiAyKSkgPT0gMCB0aGVuCiAgICAgICAgICAgIHBjYWxsKHN3ZWVwR3VpcykKICAgICAgICAgICAgcGNhbGwoc3dlZXBIaWdobGlnaHRzKQogICAgICAgIGVuZAogICAgZW5kCmVuZAoKdGFibGUuaW5zZXJ0KFRocmVhZHMsIHRhc2suc3Bhd24oZGFtcGVyTG9vcCkpCnRhYmxlLmluc2VydChUaHJlYWRzLCB0YXNrLnNwYXduKGhvdXNla2VlcGluZ0xvb3ApKQp0YWJsZS5pbnNlcnQoVGhyZWFkcywgdGFzay5zcGF3bihmcHNMb29wKSkKCmxvY2FsIEFQSSA9IHt9CgpmdW5jdGlvbiBBUEk6U3RhdHMoKQogICAgbG9jYWwgY2ZnID0gc2VsZWN0KDEsIGZpbmRUYWJsZXMoKSkKICAgIHJldHVybiB7CiAgICAgICAgRnBzICAgICAgICAgID0gbWF0aC5mbG9vcihTdGF0cy5MYXN0RnBzICsgMC41KSwKICAgICAgICBSZW5kZXJTdGVwcGVkPSAoZnVuY3Rpb24oKQogICAgICAgICAgICBsb2NhbCBvaywgbCA9IHBjYWxsKGdldGNvbm5lY3Rpb25zLCBSdW5TZXJ2aWNlLlJlbmRlclN0ZXBwZWQpCiAgICAgICAgICAgIHJldHVybiBvayBhbmQgI2wgb3IgLTEKICAgICAgICBlbmQpKCksCiAgICAgICAgS2lsbGVkICAgICAgID0gU3RhdHMuS2lsbGVkLAogICAgICAgIENvbXBhY3Rpb25zICA9IFN0YXRzLkNvbXBhY3Rpb25zLAogICAgICAgIENvbm5UcmltbWVkICA9IFN0YXRzLkNvbm5UcmltbWVkLAogICAgICAgIFRocmVhZFRyaW1tZWQ9IFN0YXRzLlRocmVhZFRyaW1tZWQsCiAgICAgICAgR3VpU3dlcHQgICAgID0gU3RhdHMuR3VpU3dlcHQsCiAgICAgICAgSGxTd2VwdCAgICAgID0gU3RhdHMuSGxTd2VwdCwKICAgICAgICBDb25uUmVnaXN0cnkgPSBjZmcgYW5kICMoY2ZnLkNvbm5lY3Rpb25zIG9yIHt9KSBvciAtMSwKICAgICAgICBUaHJlYWRSZWdpc3RyeSA9IGNmZyBhbmQgIyhjZmcuVGhyZWFkcyBvciB7fSkgb3IgLTEsCiAgICB9CmVuZAoKZnVuY3Rpb24gQVBJOlN0b3AoKQogICAgUnVubmluZyA9IGZhbHNlCiAgICBmb3IgXywgdCBpbiBpcGFpcnMoVGhyZWFkcykgZG8gcGNhbGwodGFzay5jYW5jZWwsIHQpIGVuZAogICAgVGhyZWFkcyA9IHt9CiAgICBpZiBnZXRnZW52KCkuSGF2b2NQZXJmUGF0Y2ggPT0gQVBJIHRoZW4KICAgICAgICBnZXRnZW52KCkuSGF2b2NQZXJmUGF0Y2ggPSBuaWwKICAgIGVuZAplbmQKCmZ1bmN0aW9uIEFQSTpTZXRWZXJib3NlKHYpIENPTkZJRy5WZXJib3NlID0gdiBhbmQgdHJ1ZSBvciBmYWxzZSBlbmQKCmZ1bmN0aW9uIEFQSTpSZWZyZXNoKCkKICAgIENhY2hlZEF0ID0gMAogICAgcmV0dXJuIGZpbmRUYWJsZXMoKQplbmQKCmdldGdlbnYoKS5IYXZvY1BlcmZQYXRjaCA9IEFQSQoKcHJpbnQoIltwZXJmXSBwYXRjaCBhcm1lZCAtIGR1cCBzY2FuICIgLi4gQ09ORklHLlNjYW5IeiAuLiAiaHosIGNvbXBhY3QgZXZlcnkgIgogICAgLi4gQ09ORklHLkNvbXBhY3RFdmVyeSAuLiAicywgc3dlZXAgZXZlcnkgIiAuLiBDT05GSUcuU3dlZXBFdmVyeSAuLiAicyIpCg==" local out = {} local map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" local buf, n = 0, 0 for i = 1, #b64 do local v = map:find(b64:sub(i, i), 1, true) if v then n = n + 1; buf = buf * 64 + (v - 1) if n == 4 then out[#out+1] = string.char(bit32.rshift(buf, 16) % 256, bit32.rshift(buf, 8) % 256, buf % 256) buf, n = 0, 0 end end end writefile("HavocPerfPatch.lua", table.concat(out)) print("wrote", #table.concat(out), "bytes")