api
script: Y29uc3QgR0xPQkFMUyA9IHsKICBibG9nZ2VyOiBmYWxzZSwgICAvLyB1c2VkIHRvIHRlbGwgb2Ygd2UgYXJlIHJ1bm5pbmcgb24gYmxvZ2dlcgogIGFwaTogZmFsc2UsICAgICAgIC8vIHVzZWQgdG8gdGVsbCBvZiB3ZSBhcmUgYWN0aW5nIGFzIGEgYm9vayBvciBhbiBhcGkKICBkZXZNb2RlOiBmYWxzZSAgICAvLyB1c2VkIHRvIHRlbGwgaWYgd2UgYXJlIHJ1bm5pbmcgb24gbG9jYWwgaG9zdAp9Ci8vIHRlc3RpbmcgYSBuZXcgY2hhbmdlIDEKCmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemUocGxhdGZvcm0gPSAid2ViIikgewogIEdMT0JBTFMuYmxvZ2dlciA9IHBsYXRmb3JtID09PSAiYmxvZ2dlciIKICBHTE9CQUxTLmFwaSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggPT09ICI/YXBpIgogIEdMT0JBTFMuZGV2TW9kZSA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2xvY2FsaG9zdCcpCgogIFNsaWNrLmNyZWF0ZVJlY2VpdmVyKGFzeW5jIGV2ZW50ID0+IHsKICAgIGxvZygiYXBpLWRhdGEiLCBldmVudC5kYXRhKQogICAgaWYgKGV2ZW50LmRhdGEubW9kZSA9PT0gImdldC1wYWdlIikgewogICAgICAvLyB0aGlzIGlzIGEgcmVxdWVzdCBmb3IgYSBwYWdlCiAgICAgIGxldCBzb3VyY2U9bnVsbAogICAgICBpZihldmVudC5kYXRhLndlYlBhdGgpewogICAgICAgIGxvZygiZ2V0dGluZyBwYWdlIiwgZXZlbnQuZGF0YS53ZWJQYXRoKQogICAgICAgIHNvdXJjZT1hd2FpdCBnZXRfcGFnZV9jb250ZW50KHt3ZWJQYXRoOmV2ZW50LmRhdGEud2ViUGF0aCxsb2NhbFJlcXVlc3Q6dHJ1ZX0pCiAgICAgIH1lbHNlewogICAgICAgIGxvZygiZ2V0dGluZyBwYWdlIiwgZXZlbnQuZGF0YS5wYWdlSWQpCiAgICAgICAgc291cmNlPWF3YWl0IGdldF9wYWdlX2NvbnRlbnQoe3BhZ2VJZDpldmVudC5kYXRhLnBhZ2VJZCxsb2NhbFJlcXVlc3Q6dHJ1ZX0pCiAgICAgIH0KICAgICAgcmV0dXJuIHtzb3VyY2V9CiAgICB9CiAgICByZXR1cm4gewogICAgICBtZXNzYWdlOiAiQmxvZ2dlciBBUEk6IEV4dGVybmFsIGV2ZW50LiBObyBuZWVkIHRvIHByb2Nlc3MgcmVzdWx0IiwKICAgIH0KICB9KQogIGRvY3VtZW50LmJvZHkucmVwbGFjZUNoaWxkcmVuKCJBUEk6ICIgKyB3aW5kb3cubG9jYXRpb24uaG9zdCkKfQoKCi8vIHJldHVybiB0aGUgaWQgb2YgYSBibG9nZ2VyIHBvc3QgYmFzZWQgb24gaXRzIHBhZ2VfcGF0aAphc3luYyBmdW5jdGlvbiBibG9nZ2VySWQocGFnZV9wYXRoKSB7CiAgY29uc3QgbXNnVWludDggPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocGFnZV9wYXRoKTsgLy8gZW5jb2RlIGFzICh1dGYtOCkgVWludDhBcnJheQogIGNvbnN0IGhhc2hCdWZmZXIgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgiU0hBLTEiLCBtc2dVaW50OCk7IC8vIGhhc2ggdGhlIHBhZ2VfcGF0aAogIGNvbnN0IGhhc2hBcnJheSA9IEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoaGFzaEJ1ZmZlcikpOyAvLyBjb252ZXJ0IGJ1ZmZlciB0byBieXRlIGFycmF5CiAgY29uc3QgaGFzaEhleCA9IGhhc2hBcnJheQogICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgIjAiKSkKICAgIC5qb2luKCIiKTsgLy8gY29udmVydCBieXRlcyB0byBoZXggc3RyaW5nCiAgbGV0IGhhc2gzNiA9ICIiCiAgLy8gZW5jb2RlIGJsb2NrcyBvZiAxMCBjaGFyYWN0ZXJzIGF0IGEgdGltZSB0byBiYXNlIDM2CiAgZm9yIChsZXQgeCA9IDA7IHggPCA0OyB4KyspIHsKICAgIGhhc2gzNiArPSBwYXJzZUludChoYXNoSGV4LnN1YnN0cmluZyh4ICogMTAsIHggKiAxMCArIDEwKSwgMTYpLnRvU3RyaW5nKDM2KQogIH0KICByZXR1cm4gaGFzaDM2Owp9bG9nCgoKCi8vIHNlbmQgYSB0YWcgb3IgdGhlIGlkIG9mIHRoZSB0YWcuICByZXR1cm5zIHRoZSByZWxldmFudCB0YWcKZnVuY3Rpb24gdGFnKHRhZ19vcl9pZCkgewogIGlmICh0eXBlb2YgdGFnX29yX2lkID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhZ19vcl9pZCkKICB9IGVsc2UgewogICAgcmV0dXJuIHRhZ19vcl9pZAogIH0KfQoKCi8qKgogKiBBbiBPYmplY3QgZm9yIGhhbmRsaW5nIENyb3NzIG9yaWdpbiBpLWZyYW1lIGNvbW11bmljYXRpb24KICovCmNvbnN0IFNsaWNrID0gewogIC8qKgogICAqIEFkZHMgYW5kIGxpc3RlbmVyIGZvciB0aGUgbWVzc2FnZSBldmVudC4gWW91IHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2Qgb25jZS4KICAgKiBAcGFyYW0geyhldmVudDogTWVzc2FnZUV2ZW50PCo+KT0+IFByb21pc2U8T2JqZWN0LjxzdHJpbmcsIGFueT4+fSBoYW5kbGVyQ2FsbGJhY2sgCiAgICovCiAgY3JlYXRlUmVjZWl2ZXIoaGFuZGxlckNhbGxiYWNrKSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsCiAgICAgIGFzeW5jIGV2ZW50ID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYoZXZlbnQuc291cmNlKXsKICAgICAgICAgICAgbG9nKCAiY3JlYXRlUmVjZWl2ZXIiLCBldmVudCkKICAgICAgICAgICAgLy9kZWJ1Z2dlcgogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgaGFuZGxlckNhbGxiYWNrKGV2ZW50KQogICAgICAgICAgICBldmVudC5zb3VyY2UucG9zdE1lc3NhZ2UoeyAuLi5kYXRhLCBfX3NsaWNrX2lkX186IGV2ZW50LmRhdGEuX19zbGlja19pZF9fIH0sIGV2ZW50Lm9yaWdpbikKICAgICAgICAgIH0vLyBvdGhlcndpc2UsIHRoZXJlIGlzIG5vIHNvdXJjZSwgR292ZSB0aGlua3MgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHRyeSB0byBwb3N0TWVzc2FnZQogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBldmVudC5zb3VyY2UucG9zdE1lc3NhZ2UoeyBfX3NsaWNrX2Vycm9yX186IGVycm9yLCBpZDogZXZlbnQuZGF0YS5pZCB9LCBldmVudC5vcmlnaW4pCiAgICAgICAgfQogICAgICB9CiAgICApOwogIH0sCgogIC8qKgogICAqIEFuIG9iamVjdCB0aGF0IGhhcyB0aGUgcG9zdCBtZXRob2QsIHVzZWQgZm9yIG1ha2luZyBjcm9zcyBvcmlnaW4gcmVxdWVzdHMgYWNyb3NzIGktZnJhbWVzLiAKICAgKi8KICByZXF1ZXN0ZXI6IGZ1bmN0aW9uICgpIHsKICAgIGNvbnN0IHJlcXVlc3RzID0ge30KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKAogICAgICAibWVzc2FnZSIsCiAgICAgIChlKSA9PiB7CiAgICAgICAgaWYgKHJlcXVlc3RzW2UuZGF0YS5fX3NsaWNrX2lkX19dKSB7CiAgICAgICAgICBsb2coIi0tLWF0IHJlcWVzdGVyIixlLmRhdGEpCiAgICAgICAgICBpZiAoZS5kYXRhLl9fc2xpY2tfZXJyb3JfXykgewogICAgICAgICAgICByZXF1ZXN0c1tlLmRhdGEuX19zbGlja19pZF9fXS5yZWplY3QoZS5kYXRhLl9fc2xpY2tfZXJyb3JfXykKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlcXVlc3RzW2UuZGF0YS5fX3NsaWNrX2lkX19dLnJlc29sdmUoZS5kYXRhKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICk7CiAgICByZXR1cm4gewogICAgICBhc3luYyBwb3N0KGNvbnRlbnRXaW5kb3csIGRhdGEsIG9yaWdpbiA9ICIqIikgewogICAgICAgIGNvbnN0IF9fc2xpY2tfaWRfXyA9IE1hdGgucmFuZG9tKCkKICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVxdWVzdHNbX19zbGlja19pZF9fXSA9IHsgcmVzb2x2ZSwgcmVqZWN0IH0KICAgICAgICB9KQogICAgICAgIGNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoeyAuLi5kYXRhLCBfX3NsaWNrX2lkX18gfSwgb3JpZ2luKQogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21pc2UKICAgICAgICBkZWxldGUgcmVxdWVzdHNbX19zbGlja19pZF9fXQogICAgICAgIGxvZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXJlc3VsdCIscmVzdWx0KQogICAgICAgIHJldHVybiByZXN1bHQKICAgICAgfQogICAgfQogIH0oKQp9Cgphc3luYyBmdW5jdGlvbiBhcGlfcmVxdWVzdChtZXNzYWdlX29iamVjdCwgYXBpX3VybCkgewogIC8vY2FsbCB0aGUgc3BlY2lmaWVkIGFwaSwgY3JlYXRpbmcgdGhlIGlmcmFtZSBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCB0byB0aGlzIGFwaQogIC8vYXBpIHVybCBpcyB0aGUgZG9tYWluIG5hbWUgd2hlcmUgd2hlcmUgdGhlIGFwaSBpcyBsb2NhdGVkLgogIC8vZGVidWdnZXIKICBjb25zdCBmcmFtZV9pZCA9IGJ0b2EoYXBpX3VybC5zcGxpdCgiPyIpWzBdKQogIGxldCBpZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmcmFtZV9pZCkKCiAgLy8gaWYgdGhlIGlmcmFtZSBoYXMgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVBJLCBqdXN0IHVzZSBpdAogIGlmIChpZnJhbWU/LmRhdGFzZXQ/LnN0YXR1cyA9PT0gInZlcmlmaWVkIikgewogICAgcmV0dXJuIGF3YWl0IFNsaWNrLnJlcXVlc3Rlci5wb3N0KGlmcmFtZS5jb250ZW50V2luZG93LCBtZXNzYWdlX29iamVjdCwgIioiKQogIH0KCiAgLy8gaWYgd2UganVzdCBjcmVhdGVkIHRoZSBpZnJhbWUsIHRoZSBoYW5kbGVyIGZyb20gaXQncyBjb250ZW50IHdpbGwgbm90IGhhdmUgbG9hZGVkLCBzZXQgdXAKICAvLyBhIHJhY2UgdG8gc2VlIGlmIHRoZSByZXNwb25zZSBjb21lcyBiYWNrIHdpdGggaW4gMTAwIG1pbGxpc2Vjb25kcywgaWYgbm90IHRyeSBhZ2FpbgoKICBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKQogIGlmcmFtZS5pZCA9IGZyYW1lX2lkCiAgaWZyYW1lLnNyYyA9IGFwaV91cmwKICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICJub25lIgogIGRvY3VtZW50LmJvZHkuYXBwZW5kKGlmcmFtZSkKCgogIGxldCByZXN1bHQgPSBudWxsCiAgbGV0IGRlbGF5ID0gMTAwCiAgd2hpbGUgKCFyZXN1bHQpIHsKICAgIGRlbGF5ID0gZGVsYXkgKiAxLjUgIC8vIGluY3JlYXNlIHRoZSB0aW1lIHdlIHdhaXQgIGJ5IDUwJSBmb3IgZWFjaCBpdGVyYXRpb24gaW4gY2FzZSB3ZSBhcmUgb24gYSBzbG93IGNvbm5lY3Rpb24KICAgIC8vbG9nICgid2FpdGluZyIsZGVsYXksIm1pbGxpc2Vjb25kcyIgKQogICAgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFsKICAgICAgU2xpY2sucmVxdWVzdGVyLnBvc3QoaWZyYW1lLmNvbnRlbnRXaW5kb3csIG1lc3NhZ2Vfb2JqZWN0LCAiKiIpLAogICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgbGV0IHdhaXQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIGNsZWFyVGltZW91dCh3YWl0KTsKICAgICAgICAgIHJlc29sdmUobnVsbCk7CiAgICAgICAgfSwgZGVsYXkpCiAgICAgIH0pCiAgICBdKQogIH0KICBpZnJhbWUuZGF0YXNldC5zdGF0dXMgPSAidmVyaWZpZWQiCiAgcmV0dXJuIHJlc3VsdAp9CgoKYXN5bmMgZnVuY3Rpb24gZ2V0X3BhZ2VfY29udGVudChwYXJhbWV0ZXJzKSB7CiAgLy8gZ2V0IHRoZSBjb250ZW50IG9mIGEgZmlsZSB1c2luZyBmZXRjaC4gIGlmIG9uIGJsb2dnZXIsIGl0IHdpbGwgcmV0dXJuIAogIC8vIGp1c3QgdGhlIHBvc3QgY29udGVudCwgcHJvcGVybHkgZGVjb2RlZC4KICBjb25zdCBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHtsb2NhbFJlcXVlc3Q6IGZhbHNlIH0sIHBhcmFtZXRlcnMpCgogIC8vcmVzcG9uc2U9YXdhaXQgbG9hZF9wYWdlKHt3ZWJQYXRoOiJiYXNpcy1kZXYvY29udGVudC9qdW5rNy5odG1sIiwgcmV0dXJuQ29udGVudDp0cnVlfSkKICAKICBjb25zdCBwYWdlX3VybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uKQogIGxldCByZXF1ZXN0X3VybCA9ICIiCiAgbGV0IHBhZ2Vfc291cmNlID0gIiIKICBpZiAoR0xPQkFMUy5ibG9nZ2VyKSB7CiAgICBpZiAocGFyYW1zLmxvY2FsUmVxdWVzdCkgewogICAgICAKICAgICAgLy8gcmVxdWVzdCBibG9nIHBhZ2Ugd2l0aG91dCBpZnJhbWUKICAgICAgbGV0IHJlc3BvbnNlPW51bGwKICAgICAgbGV0IGFwaV9mZXRjaF91cmw9bnVsbAogICAgICAvL2RlYnVnZ2VyCiAgICAgIGlmKHBhcmFtcy53ZWJQYXRoKXsKICAgICAgICBhcGlfZmV0Y2hfdXJsPWAke3BhZ2VfdXJsLnByb3RvY29sfS8vJHtwYWdlX3VybC5ob3N0fS8yMDIyLzAyLyR7YXdhaXQgYmxvZ2dlcklkKHBhcmFtcy53ZWJQYXRoKX0uaHRtbGAKICAgICAgfWVsc2V7CiAgICAgICAgYXBpX2ZldGNoX3VybD1gJHtwYWdlX3VybC5wcm90b2NvbH0vLyR7cGFnZV91cmwuaG9zdH0vMjAyMi8wMi8ke3BhcmFtcy5wYWdlSWR9Lmh0bWxgCiAgICAgIH0KICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChhcGlfZmV0Y2hfdXJsKQoKICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwogICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGF3YWl0IHJlc3BvbnNlLnRleHQoKSwgInRleHQvaHRtbCIpCiAgICAgIGxldCBodG1sPWRvYy5xdWVyeVNlbGVjdG9yKCIuY29kZSIpLmlubmVySFRNTC5zcGxpdCgiPC9kaXY+IikKICAgICAgaHRtbC5zaGlmdCgpCiAgICAgIGh0bWwgPSBodG1sLmpvaW4oIjwvZGl2PiIpLnNwbGl0KCI8ZGl2IikKICAgICAgaHRtbC5wb3AoKQogICAgICBwYWdlX3NvdXJjZSA9ICBodG1sLmpvaW4oIjxkaXYiKQogICAgfSBlbHNlIHsKICAgICAgLy8gcmVxdWVzdCB0aHJvdWdoIGFuIGlmcmFtZQogICAgICAvL2RlYnVnZ2VyCiAgICAgIGNvbnN0IHdlYlBhdGhfYXJyYXkgPSBwYXJhbXMud2ViUGF0aC5zcGxpdCgiLyIpCiAgICAgIGNvbnN0IGhvc3QgPSB3ZWJQYXRoX2FycmF5LnNoaWZ0KCkKICAgICAgY29uc3QgaG9zdF9uYW1lX2FycmF5ID0gcGFnZV91cmwuaG9zdG5hbWUuc3BsaXQoIi4iKQogICAgICBob3N0X25hbWVfYXJyYXkuc2hpZnQoKQogICAgICBob3N0X25hbWVfYXJyYXkudW5zaGlmdChob3N0KQogICAgICAKICAgICAgcmVxdWVzdF91cmwgPSBgJHtwYWdlX3VybC5wcm90b2NvbH0vLyR7aG9zdH0uJHtob3N0X25hbWVfYXJyYXkuam9pbigiLiIpfS8yMDIyLzAyLyR7YXdhaXQgYmxvZ2dlcklkKHdlYlBhdGhfYXJyYXkuam9pbigiLyIpKX0uaHRtbGAKICAgICAgbG9nKCJpZnJhbWUgYXBpIHJlcXVlc3QiLGFwaV9mZXRjaF91cmwpCiAgICAgIHBhZ2Vfc291cmNlID0gYXdhaXQgYXBpX3JlcXVlc3QoeyBtb2RlOiAiZ2V0LXBhZ2UiLCB3ZWJQYXRoOiB3ZWJQYXRoX2FycmF5LmpvaW4oIi8iKSB9LCBgJHtwYWdlX3VybC5wcm90b2NvbH0vLyR7aG9zdF9uYW1lX2FycmF5LmpvaW4oIi4iKX0/YXBpYCkKICAgIH0KICAgIC8vIGRlY29kZSB0aGUgc291cmNlIGlmIG5lY2Vzc2FyeQogICAgLy8gaWYgKHBhcmFtcy53ZWJQYXRoLmVuZHNXaXRoKCIuanMiKSkgewogICAgLy8gICBzb3VyY2UgPSBhdG9iKHNvdXJjZSkKICAgIC8vIH0KICAgIHJldHVybiBwYWdlX3NvdXJjZQogIH0gZWxzZSBpZiAoR0xPQkFMUy5kZXZNb2RlKSB7CiAgICBpZiAocGFyYW1zLmxvY2FsUmVxdWVzdCkgewogICAgICByZXF1ZXN0X3VybCA9IHBhcmFtcy53ZWJQYXRoCiAgICB9IGVsc2UgewogICAgICByZXF1ZXN0X3VybCA9ICIvIiArIHBhcmFtcy53ZWJQYXRoCiAgICB9CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3RfdXJsKQogICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLnRleHQoKQogIH0gZWxzZSB7CiAgICAvLyBwcm9kdWN0aW9uIG5vbi1ibG9nZ2VyIChob3BlZnVsbHkgd2UgbmV2ZXIgZ2V0IGhlcmUpCiAgICAvLyBuZWVkIHRvIHRoaW5rIGFib3V0IHdoYXQgdGhlIHN0cnVjdHVyZSB3b3VsZCBiZSB0aGUgc3RydWN0dXJlIG9uIGF3cyBvciBnaXRodWIgcGFnZXMgCiAgfQoKfQoKCgphc3luYyBmdW5jdGlvbiBsb2FkX3BhZ2UocGFyYW1ldGVycykgewogIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe2Rlc3RpbmF0aW9uVGFnOiBudWxsLCBsb2NhbFJlcXVlc3Q6IGZhbHNlIH0scGFyYW1ldGVycyk7CiAgbG9nKCJwYXJhbWV0ZXJzIiwgcGFyYW1ldGVycykKICBsb2coInBhcmFtcyIsIHBhcmFtcykKICBsZXQgc291cmNlID0gYXdhaXQgZ2V0X3BhZ2VfY29udGVudChwYXJhbXMpOwoKICBpZihwYXJhbXMucmV0dXJuQ29udGVudCl7CiAgICAvLyBzZW5kIGNvbnRlbnQgYmFjayB0byBjYWxsZXIKICAgIHJldHVybiBzb3VyY2UKICB9CiAgCgogIGlmKHBhcmFtcy53ZWJQYXRoLmVuZHNXaXRoKCIuY3NzIikpewogICAgLy8gd3JpdGUgQ1NTIHRvIHRoZSBoZWFkCiAgICBjb25zdCBjc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBzdHlsZWApCiAgICBjc3MuaW5uZXJIVE1MID0gc291cmNlCiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGNzcykKICAgIHJldHVybgogIH0KCiAgaWYocGFyYW1zLndlYlBhdGguZW5kc1dpdGgoIi5qcyIpKXsKICAgIC8vIHdyaXRlIEpTIHRvIGhlYWQgCgogICAganNfdGFnX2lkID0gcGFyYW1zLndlYlBhdGguc3BsaXQoIi8iKS5qb2luKCItIikKICAgIGxldCBqc190YWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqc190YWdfaWQpCiAgCiAgICBpZiAoIWpzX3RhZykgewogICAgICBqc190YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBzY3JpcHRgKQogICAgICBqc190YWcuc2V0QXR0cmlidXRlKCJpZCIsIGpzX3RhZ19pZCkKICAgICAgaWYgKHBhcmFtcy5zY3JpcHRUeXBlKSB7CiAgICAgICAganNfdGFnLnNldEF0dHJpYnV0ZSgidHlwZSIsIHBhcmFtcy5zY3JpcHRUeXBlKQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHR5cGVfYXR0ciA9IHNvdXJjZS5tYXRjaCgvQHR5cGU9WyInXSguKilbJyJdQC8pCiAgICAgICAgaWYgKHR5cGVfYXR0cikgewogICAgICAgICAganNfdGFnLnNldEF0dHJpYnV0ZSgidHlwZSIsIHR5cGVfYXR0clsxXSkKICAgICAgICB9CiAgICAgIH0KICAgICAganNfdGFnLmFzeW5jID0gZmFsc2U7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoanNfdGFnKQogICAgfQogICAgLy8ganNfdGFnLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAvLyAgIC8vbG9nKCJoaSBoaSBoaSIpOwogICAgLy8gfSk7CiAgCiAgICBqc190YWcucmVwbGFjZUNoaWxkcmVuKHNvdXJjZSkKICAKCiAgICByZXR1cm4KICB9CgogIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHNvdXJjZSwgInRleHQvaHRtbCIpCgogIGxvZygiZG9jIiwgZG9jKQogIGlmIChwYXJhbXMuZGVzdGluYXRpb25UYWcpIHsKICAgICAgdGFnKHBhcmFtcy5kZXN0aW5hdGlvblRhZykucmVwbGFjZUNoaWxkcmVuKGRvYykKICB9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkpIHsKICAgIC8vIHRoZSBkb2N1bWVudCBoYXMgYSBib2R5IHRhZywgcmVwbGFjZSBjdXJyZW50IGJvZHkgd2l0aCBpdAogICAgZG9jLmJvZHkuZGF0YXNldC5wYWdlUGF0aCA9IHBhcmFtcy53ZWJQYXRoCiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZSgpCiAgICBkb2N1bWVudC5oZWFkLnBhcmVudE5vZGUuYXBwZW5kKGRvYy5ib2R5KQogIH0gZWxzZSB7CiAgICAvLyBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGEgYm9keSwgYnV0IG5vIGRlc3RpbmF0aW9uIHdhcyBzcGVjaWZpZWQsIHJlcGxhY2UgdGhlIGJvZHkgd2l0aCB0aGUgZG9jCiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZSgpCiAgICBkb2N1bWVudC5oZWFkLnBhcmVudE5vZGUuYXBwZW5kKGRvYykKICB9Cgp9CgpmdW5jdGlvbiBsb2coLi4uYXJncykgewogIC8vIHVzZSB0aGlzIHRvIGxvZyBvbmx5IGluIGRldmVsb3BtZW50IG1vZGUKICAvL2lmICghR0xPQkFMUy5ibG9nZ2VyKSBsb2coLi4uYXJncykKICAKICBjb25zb2xlLmxvZyh3aW5kb3cubG9jYXRpb24uaHJlZiwuLi5hcmdzKQp9Cg==
Comments
Post a Comment