Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_【最强无套路脚本】你能看见多少我能下载多少&下载公开免费的PPT@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDjgJDmnIDlvLrml6DlpZfot6/ohJrmnKzjgJHkvaDog73nnIvop4HlpJrlsJHmiJHog73kuIvovb3lpJrlsJEm5LiL6L295YWs5byA5YWN6LS555qEUFBU44CBUERG44CBRE9D44CBVFhU562J5paH5Lu2Ci8vIEBuYW1lc3BhY2UgICAgaHR0cDovL3RhbXBlcm1vbmtleS5uZXQvCi8vIEBob21lcGFnZQkgaHR0cHM6Ly9naXRodWIuY29tL3N5c3RlbW1pbi9raWxsLWRvYwovLyBAdmVyc2lvbiAgICAgIDYuNQovLyBAZGVzY3JpcHRpb24gIOeZvuW6pnzljp/liJvlipt85Lq65Lq6fDM2MOaWh+W6k3zosYbkuIF86LGG5LiB5bu6562RfOmBk+WuonxNQkHmmbrlupN85b6X5YqbfOS4g+W9qeWtpuenkXzph5HplITlpLR854ix6ZeufOiaguiagXzor7vmoLnnvZF85pCc5byYfOW+ruS8oOe9kXzmt5josYbnvZF8R0J8SkpHfOihjOS4muagh+WHhnzovbvnq7nlip7lhax86Ieq54S25qCH5YeGfOS6pOmAmuagh+WHhnzpo57kuaZ85rGf6IuP6K6h6YePfOawtOWIqemDqHzmi5vmipXmoId86IO95rqQ5qCH5YeGfOiupOivgeiupOWPr+agh+WHhnzohb7orq/mlofmoaN857u/6Imy5bu656uZfOeUtee9keetieWFrOW8gOWFjei0ueaWh+aho+S4i+i9vQovLyBAYXV0aG9yICAgICAgIE1yLkZhbmcKLy8gQG1hdGNoICAgICAgICBodHRwczovLyouYm9vazExOC5jb20vKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vKi5yZW5yZW5kb2MuY29tLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovLyouZG9jaW4uY29tLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovLyouZG9jODguY29tLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovL2RvYy5tYmFsaWIuY29tLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovLyouZGVsaXdlbmt1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly93d3cuamluY2h1dG91LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly8qLmdvbGRob2UuY29tLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovLyoubWF5aXdlbmt1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly8qLmR1Z2VuLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly8qLjdjeGsuY29tLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovL2lzaGFyZS5pYXNrLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly9zd2YuaWFzay5jb20vKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vKi5kb3duLnNpbmEuY29tLmNuLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovL3dlbmt1LmJhaWR1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly93a2JqY2xvdWRib3MuYmRpbWcuY29tLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovL3drcmV0eXBlLmJkaW1nLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly8qLmNob2NoaW5hLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly8qLndlaXpodWFubmV0LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly93d3cudGFvZG9jcy5jb20vKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd2Vua3Uuc28uY29tLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovLyouMzYwdHJlcy5jb20vKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd3d3Lndlbmt1Yi5jb20vKgovLyBAbWF0Y2ggICAgICAgIGh0dHA6Ly9jLmdiNjg4LmNuLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovL2pqZy5zcGMub3JnLmNuL3Jlc21lYS92aWV3L3N0ZG9ubGluZQovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vcHJvLWltZy1icnRtLmJhaWppYXl1bi5jb20vKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vaGJiYS5zYWNpbmZvLm9yZy5jbi9hdHRhY2htZW50L29ubGluZVJlYWQvKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vd3d3LnF6b2ZmaWNlLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgaHR0cDovL3d3dy5ucnNpcy5vcmcuY24vbW5yX2tmcy9maWxlL3JlYWQvKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vKi5mZWlzaHUuY24vc3BhY2UvKgovLyBAbWF0Y2ggICAgICAgIGh0dHA6Ly93d3cuanR5c2J6LmNuOjgwMDkvcGRmL3ZpZXdlci8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly93d3cubnNzaS5vcmcuY24vY3Nzbi9qcy9wZGZqcy93ZWIvcHJldmlldy5qc3AqCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly9vbmxpbmUuNzFuYy5jbi8qCi8vIEBtYXRjaCAgICAgICAgaHR0cDovLzExNC4yNTEuMTExLjEwMzoxODA4MC9rZnMvZmlsZS9yZWFkLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovL2J1bGxldGluLmNlYnB1YnNlcnZpY2UuY29tL3Jlc291cmNlL2NlYi9qcy9wZGZqcy1kaXN0L3dlYi92aWV3ZXIuaHRtbCoKLy8gQG1hdGNoICAgICAgICBodHRwOi8vMTIxLjM2Ljk0LjgzOjkwMDgvanNwL3lpc2hlbnFpbmcvYXBwbGFkZC9iaWFvemh1bmZpbGUvZmxhc2gvcHJldmlld0ltZy5qc3AqCi8vIEBtYXRjaCAgICAgICAgaHR0cDovL3JidGVzdC5jbmNhLmNuL2NuY2Ffa2ZzL2ZpbGUvcmVhZC8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly93ZWJvZmZpY2UucXEuY29tL3BkZi8qCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly9nYnNlcnZpY2UuY24vKgovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vZWNwLnNnY2MuY29tLmNuLyoKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2xmNi1jZG4tdG9zLmJ5dGVjZG50cC5jb20vY2RuL2V4cGlyZS0xLU0vanNwZGYvMi40LjAvanNwZGYudW1kLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vdW5wa2cuY29tL0B6aXAuanMvemlwLmpzQDIuNy4zNC9kaXN0L3ppcC5taW4uanMKLy8gQHJlcXVpcmUgICAgICBodHRwczovL3VucGtnLmNvbS9odG1sMmNhbnZhc0AxLjQuMS9kaXN0L2h0bWwyY2FudmFzLmpzCi8vIEBpY29uICAgICAgICAgaHR0cHM6Ly9kdGtpbmcuY24vZmF2aWNvbi5pY28KLy8gQHJ1bi1hdCAJCSBkb2N1bWVudC1pZGxlCi8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9kZWxldGVWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01fZG93bmxvYWQKLy8gQGdyYW50ICAgICAgICBHTV9ub3RpZmljYXRpb24KLy8gQGdyYW50ICAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgIHVuc2FmZVdpbmRvdwovLyBAbGljZW5zZSAgICAgIEFwYWNoZS0yLjAKLy8gQGRvd25sb2FkVVJMIGh0dHBzOi8vdXBkYXRlLmdyZWFzeWZvcmsub3JnL3NjcmlwdHMvNDg2MjExLyVFMyU4MCU5MCVFNiU5QyU4MCVFNSVCQyVCQSVFNiU5NyVBMCVFNSVBNSU5NyVFOCVCNyVBRiVFOCU4NCU5QSVFNiU5QyVBQyVFMyU4MCU5MSVFNCVCRCVBMCVFOCU4MyVCRCVFNyU5QyU4QiVFOCVBNyU4MSVFNSVBNCU5QSVFNSVCMCU5MSVFNiU4OCU5MSVFOCU4MyVCRCVFNCVCOCU4QiVFOCVCRCVCRCVFNSVBNCU5QSVFNSVCMCU5MSVFNCVCOCU4QiVFOCVCRCVCRCVFNSU4NSVBQyVFNSVCQyU4MCVFNSU4NSU4RCVFOCVCNCVCOSVFNyU5QSU4NFBQVCVFMyU4MCU4MVBERiVFMyU4MCU4MURPQyVFMyU4MCU4MVRYVCVFNyVBRCU4OSVFNiU5NiU4NyVFNCVCQiVCNi51c2VyLmpzCi8vIEB1cGRhdGVVUkwgaHR0cHM6Ly91cGRhdGUuZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy80ODYyMTEvJUUzJTgwJTkwJUU2JTlDJTgwJUU1JUJDJUJBJUU2JTk3JUEwJUU1JUE1JTk3JUU4JUI3JUFGJUU4JTg0JTlBJUU2JTlDJUFDJUUzJTgwJTkxJUU0JUJEJUEwJUU4JTgzJUJEJUU3JTlDJThCJUU4JUE3JTgxJUU1JUE0JTlBJUU1JUIwJTkxJUU2JTg4JTkxJUU4JTgzJUJEJUU0JUI4JThCJUU4JUJEJUJEJUU1JUE0JTlBJUU1JUIwJTkxJUU0JUI4JThCJUU4JUJEJUJEJUU1JTg1JUFDJUU1JUJDJTgwJUU1JTg1JThEJUU4JUI0JUI5JUU3JTlBJTg0UFBUJUUzJTgwJTgxUERGJUUzJTgwJTgxRE9DJUUzJTgwJTgxVFhUJUU3JUFEJTg5JUU2JTk2JTg3JUU0JUJCJUI2Lm1ldGEuanMKLy8gPT0vVXNlclNjcmlwdD09CihmdW5jdGlvbigpIHsKCSd1c2Ugc3RyaWN0JzsKCWxldCBNRiA9CgkJJyNNRl9maXhlZHtwb3NpdGlvbjpmaXhlZDt0b3A6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO3JpZ2h0OjIwcHg7Z2FwOjIwcHg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3otaW5kZXg6MjE0NzQ4MzY0NztkaXNwbGF5OmZsZXh9JzsKCU1GICs9CgkJJy5NRl9ib3h7cGFkZGluZzoxMHB4O2N1cnNvcjpwb2ludGVyO2JvcmRlci1jb2xvcjpyZ2IoMCwxMDIsMjU1KTtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kLWNvbG9yOndoaXRlO2NvbG9yOnJnYigwLDEwMiwyNTUpO21hcmdpbi1yaWdodDoxMHB4O2JveC1zaGFkb3c6cmdiKDIwNywyMDcsMjA3KSAxcHggMXB4IDlweCAzcHh9Lk1GX2FjdGl2ZXtjb2xvcjogZ3JlZW59I01GX3NwZWVke2NvbG9yOiByZWQ7fSc7CglNRiArPQoJCSdAbWVkaWEgcHJpbnR7aHRtbHtoZWlnaHQ6YXV0byAhaW1wb3J0YW50fWJvZHl7ZGlzcGxheTpibG9jayAhaW1wb3J0YW50fSNhcHAtbGVmdHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0jYXBwLXJpZ2h0e2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fSNNRl9maXhlZHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0ubWVudWJhcntkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0udG9wLWJhci1yaWdodHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0udXNlci1ndWlkZXtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0jYXBwLXJlYWRlci1lZGl0b3ItYmVsb3d7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9Lm5vLWZ1bGwtc2NyZWVue2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fS5jb21wLXZpcC1wb3B7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmNlbnRlci13cmFwcGVye3dpZHRoOmF1dG8gIWltcG9ydGFudH0ucmVhZGVyLXRodW1iLC5yZWxhdGVkLWRvYy1saXN0LC5mb2xkLXBhZ2UtY29udGVudCwudHJ5LWVuZC1mb2xkLXBhZ2UsLmxhenktbG9hZCwjTUZfdGV4dGFyZWEsI25hdi1tZW51LXdyYXB7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9fScKCWNvbnN0IHByZWZpeCA9ICJNRl8iOwoJLy8gY2FudmFzIOemgeatoumHjeWGmSBkcmF3SW1hZ2UKCWNvbnN0IGNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFByb3RvdHlwZSA9IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGU7Cgljb25zdCBvcmlnaW5hbERyYXdJbWFnZSA9IGNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFByb3RvdHlwZS5kcmF3SW1hZ2U7CglPYmplY3QuZGVmaW5lUHJvcGVydHkoY2FudmFzUmVuZGVyaW5nQ29udGV4dDJEUHJvdG90eXBlLCAnZHJhd0ltYWdlJywgewoJCXZhbHVlOiBvcmlnaW5hbERyYXdJbWFnZSwKCQl3cml0YWJsZTogZmFsc2UsCgkJY29uZmlndXJhYmxlOiBmYWxzZQoJfSk7CgoJLy8g6YeN5YaZIHNldFRpbWVvdXQKCWNvbnN0IG9yaWdpbmFsU2V0VGltZW91dCA9IHVuc2FmZVdpbmRvdy5zZXRUaW1lb3V0OwoJdW5zYWZlV2luZG93LnNldFRpbWVvdXQgPSBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIC4uLmFyZ3MpIHsKCQlsZXQgdG9TdHIgPSBjYWxsYmFjaz8udG9TdHJpbmcoKTsKCQlpZiAodG9TdHIgJiYgdG9TdHIuaW5jbHVkZXMoJ3Jldm9rZU9iamVjdFVSTCcpKSByZXR1cm4gdHJ1ZTsKCQljb25zdCB3cmFwcGVkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHsKCQkJaWYgKGNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKCQkJCWNhbGxiYWNrKC4uLmFyZ3MpOwoJCQl9CgkJfTsKCQlyZXR1cm4gb3JpZ2luYWxTZXRUaW1lb3V0KHdyYXBwZWRDYWxsYmFjaywgZGVsYXkpOwoJfTsKCglmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbVN0cmluZygpIHsKCQlsZXQgcmVzdWx0ID0gJyc7CgkJY29uc3QgY2hhcmFjdGVycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JzsKCQljb25zdCBjaGFyYWN0ZXJzTGVuZ3RoID0gY2hhcmFjdGVycy5sZW5ndGg7CgkJZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHsKCQkJcmVzdWx0ICs9IGNoYXJhY3RlcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3RlcnNMZW5ndGgpKTsKCQl9CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWNvbnN0IGJveElkID0gZ2VuZXJhdGVSYW5kb21TdHJpbmcoKQoJY29uc3QgbWFpblN0eWxlID0gTUYucmVwbGFjZUFsbCgnTUZfZml4ZWQnLCBwcmVmaXggKyBib3hJZCk7CglHTV9hZGRTdHlsZShtYWluU3R5bGUpCgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g5re75YqgIFVSTCDliLDmnKzlnLDnvJPlrZgKCSAqIEBhdXRob3IgTXIuRmFuZwoJICogQHRpbWUgMjAyNOW5tDLmnIg05pelCgkgKiBAcGFyYW0ge0FycmF5fSB1cmxzIOaVsOaNrgoJICogQHBhcmFtIGtleQoJICovCgljb25zdCBNRl9hZGRVUkwgPSAodXJscywga2V5ID0gJ2xpc3REYXRhJykgPT4gewoJCWNvbnN0IHZhbHVlID0gR01fZ2V0VmFsdWUoa2V5KSB8fCAiW10iOwoJCWxldCBsaXN0RGF0YSA9IEpTT04ucGFyc2UodmFsdWUpOwoJCWxldCBpbmRleCA9IDA7CgkJbGV0IGxlbmd0aCA9IGxpc3REYXRhLmxlbmd0aDsKCQl1cmxzLmZvckVhY2goKHVybCkgPT4gewoJCQlpZiAoIWxpc3REYXRhLnNvbWUoaXRlbSA9PiBpdGVtLnNyYyA9PT0gdXJsKSkgewoJCQkJLy8g5re75Yqg5paw55qEVVJM5a+56LGhCgkJCQlsaXN0RGF0YS5wdXNoKHsKCQkJCQlzcmM6IHVybCwKCQkJCQlwYWdlOiBsZW5ndGggKyBpbmRleAoJCQkJfSk7CgkJCQlpbmRleCsrOwoJCQl9CgkJfSkKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KGxpc3REYXRhKSk7CgkJR01fc2V0VmFsdWUoa2V5LCBKU09OLnN0cmluZ2lmeShsaXN0RGF0YSkpOwoJCWNvbnNvbGUubG9nKEdNX2dldFZhbHVlKCJsaXN0RGF0YSIpKTsKCQljb25zb2xlLmxvZygn5bey5re75YqgVVJM77yaJywgdXJscy5sZW5ndGgpOwoJfQoJLyoqCgkgKiBVcmwg5Zyw5Z2A5ou85o6l77yM5peg6ZyA6aKE6KeI55u05o6l5LuOIEhUTUwg5Lit6K+75Y+W55u45bqU55qE5Y+C5pWw5Y2z5Y+vCgkgKi8KCWNvbnN0IGxvYWRpbmdVcmxzID0gKHBhcmFtcykgPT4gewoJCWNvbnN0IF9wYWdlQ291bnQgPSBWaWV3ZXIuX3BhZ2VDb3VudDsKCQljb25zb2xlLmxvZyhfcGFnZUNvdW50KTsKCQlsZXQgZHA7CgkJaWYgKHBhcmFtcykgewoJCQlkcCA9IHUucXVlcnkoJyNkcCcpLnZhbHVlLnJlcGxhY2UoJ3d3dycsICd3dycpOyAvLyDor7vmoLnnvZHnibnmrormg4XlhrUKCQl9IGVsc2UgewoJCQlkcCA9IHUucXVlcnkoJyNkcCcpLnZhbHVlOwoJCX0KCQljb25zdCB1cmxzID0gW107CgkJZm9yICh2YXIgaSA9IDE7IGkgPCBfcGFnZUNvdW50ICsgMTsgaSsrKSB7CgkJCWxldCB1ID0gZHAgKyBpICsgIi5naWYiOwoJCQl1cmxzLnB1c2godSk7CgkJfQoJCU1GX2FkZFVSTCh1cmxzKTsKCX0KCgkvKioKCSAqIFVybCDlnLDlnYDmi7zmjqXvvIzml6DpnIDpooTop4jnm7TmjqXku44gSFRNTCDkuK3or7vlj5bnm7jlupTnmoTlj4LmlbDljbPlj68KCSAqLwoJY29uc3Qgam9pbkRvd25sb2FkVVJMID0gKGJhc2VVcmwpID0+IHsKCQljb25zdCBzaXplID0gUGFnZS5zaXplOwoJCWNvbnN0IHVybHMgPSBbXTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQl1cmxzLnB1c2goYmFzZVVybCArICcvJyArIGkgKyAnLnBuZycpOwoJCX0KCQlNRl9hZGRVUkwodXJscyk7Cgl9CgoKCWNsYXNzIEJveCB7CgkJaWQgPSAiIjsgLy8gaWQKCQlsYWJlbCA9ICIiOyAvLyDmjInpkq7mlofmnKwKCQlmdW4gPSAiIjsgLy8g5omn6KGM5pa55rOVCgkJY29uc3RydWN0b3IoaWQsIGxhYmVsLCBmdW4pIHsKCQkJdGhpcy5pZCA9IGlkOwoJCQl0aGlzLmxhYmVsID0gbGFiZWw7CgkJCXRoaXMuZnVuID0gZnVuOwoJCX0KCX0KCgljbGFzcyBVdGlsaXR5IHsKCQlkZWJ1ZyA9IHRydWU7CgoJCS8qKgoJCSAqIOa3u+WKoCBjc3Mg5qC35byPCgkJICogQHBhcmFtIGUg6IqC54K5CgkJICogQHBhcmFtIGRhdGEgSlNPTiDmoLzlvI/moLflvI8KCQkgKi8KCQlzdHlsZShlLCBkYXRhKSB7CgkJCU9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goa2V5ID0+IHsKCQkJCWUuc3R5bGVba2V5XSA9IGRhdGFba2V5XQoJCQl9KQoJCX0KCgkJYXR0cihlLCBrZXksIHZhbCkgewoJCQlpZiAoIXZhbCkgewoJCQkJcmV0dXJuIGUuZ2V0QXR0cmlidXRlKGtleSk7CgkJCX0gZWxzZSB7CgkJCQllLnNldEF0dHJpYnV0ZShrZXksIHZhbCk7CgkJCX0KCgkJfQoKCQkvKioKCQkgKiAg6L+95Yqg5qC35byPCgkJICogQHBhcmFtIGNzcyAg5qC85byP5qC35byPCgkJICovCgkJYXBwZW5kU3R5bGUoY3NzKSB7CgkJCWxldCBzdHlsZSA9IHRoaXMuY3JlYXRlRWwoJycsICdzdHlsZScpOwoJCQlzdHlsZS50ZXh0Q29udGVudCA9IGNzczsKCQkJc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7CgkJCWxldCBkb20gPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCQkJZG9tLmFwcGVuZENoaWxkKHN0eWxlKTsKCQl9CgoJCS8qKgoJCSAqIEBkZXNjcmlwdGlvbiDliJvlu7ogZG9tCgkJICogQHBhcmFtIGlkIOW/heWhqwoJCSAqIEBwYXJhbSBlbFR5cGUKCQkgKiBAcGFyYW0gZGF0YQoJCSAqLwoJCWNyZWF0ZUVsKGlkLCBlbFR5cGUsIGRhdGEpIHsKCQkJY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsVHlwZSk7CgkJCWVsLmlkID0gaWQgfHwgJyc7CgkJCWlmIChkYXRhKSB7CgkJCQl0aGlzLnN0eWxlKGVsLCBkYXRhKTsKCQkJfQoJCQlyZXR1cm4gZWw7CgkJfQoKCQlxdWVyeShlbCkgewoJCQlyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7CgkJfQoKCQlxdWVyeUFsbChlbCkgewoJCQlyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlbCk7CgkJfQoKCQl1cGRhdGUoZWwsIHRleHQpIHsKCQkJY29uc3QgZWxOb2RlID0gdGhpcy5xdWVyeShlbCk7CgkJCWlmICghZWxOb2RlKSB7CgkJCQljb25zb2xlLmxvZygn6IqC54K55LiN5a2Y5ZyoJyk7CgkJCX0gZWxzZSB7CgkJCQllbE5vZGUuaW5uZXJIVE1MID0gdGV4dDsKCQkJfQoJCX0KCgkJLyoqCgkJICog6L+b5bqmCgkJICogQHBhcmFtIGN1cnJlbnQg5b2T5YmN5pWw6YePIC0x6aKE6KeI57uT5p2fCgkJICogQHBhcmFtIHRvdGFsIOaAu+aVsOmHjwoJCSAqIEBwYXJhbSBjb250ZW50IOWGheWuuQoJCSAqLwoJCXByZXZpZXcoY3VycmVudCwgdG90YWwsIGNvbnRlbnQpIHsKCQkJcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHsKCQkJCWlmIChjdXJyZW50ID09PSAtMSkgewoJCQkJCXRoaXMudXBkYXRlKCcjJyArIHByZWZpeCArICd0ZXh0JywgY29udGVudCA/IGNvbnRlbnQgOiAi5bey5a6M5oiQIik7CgkJCQl9IGVsc2UgewoJCQkJCWxldCBwID0gKGN1cnJlbnQgLyB0b3RhbCkgKiAxMDA7CgkJCQkJbGV0IHBzID0gcC50b0ZpeGVkKDApID4gMTAwID8gMTAwIDogcC50b0ZpeGVkKDApOwoJCQkJCWNvbnNvbGUubG9nKCflvZPliY3ov5vluqYnLCBwcykKCQkJCQl0aGlzLnVwZGF0ZSgnIycgKyBwcmVmaXggKyAndGV4dCcsICfov5vluqYnICsgcHMgKyAnJScpOwoJCQkJCWF3YWl0IHRoaXMuc2xlZXAoNTAwKTsKCQkJCQlyZXNvbHZlKCk7CgkJCQl9CgkJCX0pCgoJCX0KCgkJcHJlVGV4dChjb250ZW50KSB7CgkJCXRoaXMudXBkYXRlKCcjJyArIHByZWZpeCArICd0ZXh0JywgY29udGVudCk7CgkJfQoKCQlndWkoYm94cykgewoJCQljb25zdCBib3ggPSB0aGlzLmNyZWF0ZUVsKHByZWZpeCArIGJveElkLCAnZGl2Jyk7CgkJCWZvciAobGV0IHggaW4gYm94cykgewoJCQkJbGV0IGl0ZW0gPSBib3hzW3hdOwoJCQkJaWYgKCFpdGVtLmlkKSBjb250aW51ZTsKCQkJCWxldCBlbCA9IHRoaXMuY3JlYXRlRWwocHJlZml4ICsgaXRlbS5pZCwgJ2J1dHRvbicpOwoJCQkJZWwuYXBwZW5kKG5ldyBUZXh0KGl0ZW0ubGFiZWwpKTsKCQkJCWlmICh4ID09PSAnMCcpIHsKCQkJCQllbC5jbGFzc0xpc3QgPSBwcmVmaXggKyAnYm94ICcgKyBwcmVmaXggKyAiYWN0aXZlIjsKCQkJCX0gZWxzZSB7CgkJCQkJZWwuY2xhc3NOYW1lID0gcHJlZml4ICsgImJveCI7CgkJCQl9CgkJCQlpZiAoaXRlbS5mdW4pIHsKCQkJCQllbC5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CgkJCQkJCWV2YWwoaXRlbS5mdW4pOwoJCQkJCX0KCQkJCX0KCQkJCWlmIChpdGVtLmlkID09PSAnc3BlZWQnKSB7CgkJCQkJdGhpcy5hdHRyKGVsLCAnY29udGVudGVkaXRhYmxlJywgdHJ1ZSkKCQkJCX0KCQkJCWJveC5hcHBlbmQoZWwpOwoJCQl9CgkJCWRvY3VtZW50LmJvZHkuYXBwZW5kKGJveCk7CgkJfQoKCQlzbGVlcChtcykgewoJCQlyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7CgkJfQoKCQlsb2cobXNnKSB7CgkJCWlmICh0aGlzLmRlYnVnKSB7CgkJCQljb25zb2xlLmxvZyhtc2cpOwoJCQl9CgkJfQoKCQlsb2d0KG1zZykgewoJCQlpZiAodGhpcy5kZWJ1ZykgewoJCQkJY29uc29sZS50YWJsZShtc2cpOwoJCQl9CgkJfQoJfQoKCWNvbnN0IHUgPSBuZXcgVXRpbGl0eSgpOwoKCgljb25zdCBidG5zID0gWwoJCW5ldyBCb3goJ3RleHQnLCAn54q25oCBIDAgJScpLAoJCW5ldyBCb3goJ3N0YXJ0JywgJ+iHquWKqOmihOiniCcsICdhdXRvUHJldmlldygpJyksCgkJbmV3IEJveCgnc3RvcCcsICflgZzmraLpooTop4gnLCAnc3RvcFByZXZpZXcoKScpLAoJCW5ldyBCb3goJ2Rvd24nLCAn5LiL6L295Zu+54mHJywgJ2V4ZWN1dGVEb3dubG9hZCgyKScpLAoJCW5ldyBCb3goJ3BkZicsICfkuIvovb1QREYnLCAnZXhlY3V0ZURvd25sb2FkKDEpJykKCV0KCgljb25zdCBkb21haW4gPSB7CgkJcmVucmVuZG9jOiAicmVucmVuZG9jLmNvbSIsCgkJYm9vazExODogJ2Jvb2sxMTguY29tJywKCQlkb2NpbjogJ2RvY2luLmNvbScsCgkJd2Vua3U6ICd3ZW5rdS5iYWlkdS5jb20nLAoJCXNvOiAnd2Vua3Uuc28uY29tJywKCQlkb2M4ODogJ2RvYzg4LmNvbScsCgkJbWJhbGliOiAnZG9jLm1iYWxpYi5jb20nLAoJCWRlbGl3ZW5rdTogJ2RlbGl3ZW5rdS5jb20nLAoJCWN4azogJzdjeGsuY29tJywKCQlqaW5jaHV0b3U6ICdqaW5jaHV0b3UuY29tJywKCQltYXlpd2Vua3U6ICdtYXlpd2Vua3UuY29tJywKCQlkdWdlbjogJ3d3LmR1Z2VuLmNvbScsCgkJaWFzazogJ2lzaGFyZS5pYXNrLmNvbScsCgkJY2hvY2hpbmE6ICdjaG9jaGluYS5jb20nLAoJCXdlaXpodWFuOiAnd2Vpemh1YW5uZXQuY29tJywKCQl0YW9kb2NzOiAndGFvZG9jcy5jb20nLAoJCXdlbmt1YjogJ3dlbmt1Yi5jb20nLAoJCWdiNjg4OiAnZ2I2ODguY24nLAoJCWpqZzogJ2pqZy5zcGMub3JnLmNuJywKCQlzaGVuZ3RvbmdlZHU6ICdwcm8taW1nLWJydG0uYmFpamlheXVuLmNvbScsCgkJc2FjaW5mbzogJ2hiYmEuc2FjaW5mby5vcmcuY24nLAoJCXF6b2ZmaWNlOiAnd3d3LnF6b2ZmaWNlLmNvbScsCgkJbnJzaXM6ICd3d3cubnJzaXMub3JnLmNuJywKCQluZWE6ICcxMTQuMjUxLjExMS4xMDM6MTgwODAnLAoJCW5zc2k6ICd3d3cubnNzaS5vcmcuY24nLAoJCWZlaXNodTogJ2ZlaXNodS5jbicsCgkJanR5c2J6OiAnanR5c2J6LmNuJywKCQlqc2psdzogJ29ubGluZS43MW5jLmNuJywKCQltd3I6ICcxMjEuMzYuOTQuODM6OTAwOCcsCgkJY2VicHVic2VydmljZTogJ2J1bGxldGluLmNlYnB1YnNlcnZpY2UuY29tJywKCQlyYnRlc3Q6ICdyYnRlc3QuY25jYS5jbicsCgkJd2Vib2ZmaWNlOiAnd2Vib2ZmaWNlLnFxLmNvbScsCgkJZ2JzZXJ2aWNlOiAnZ2JzZXJ2aWNlLmNuJywKCQlzZ2NjOiAnZWNwLnNnY2MuY29tLmNuJywKCX07Cgljb25zdCB7CgkJaG9zdCwKCQlocmVmLAoJCW9yaWdpbgoJfSA9IHdpbmRvdy5sb2NhdGlvbjsKCWNvbnN0IGpzUERGID0ganNwZGYuanNQREY7CglsZXQgemlwV3JpdGVyOyAvLyDlo7DmmI7lhajlsYDlj5jph48KCXppcFdyaXRlciA9IG5ldyB6aXAuWmlwV3JpdGVyKG5ldyB6aXAuQmxvYldyaXRlcigiYXBwbGljYXRpb24vemlwIiksIHsKCQlidWZmZXJlZFdyaXRlOiB0cnVlLAoJCXVzZUNvbXByZXNzaW9uU3RyZWFtOiBmYWxzZQoJfSk7Cgljb25zdCBkb2MgPSBuZXcganNQREYoewoJCW9yaWVudGF0aW9uOiAncCcsCgkJdW5pdDogJ3B4JywKCQljb21wcmVzczogdHJ1ZQoJfSk7CglsZXQgcGRmX3cgPSA0NDYsCgkJcGRmX2ggPSA2MzEsCgkJbG9hZGluZyA9IDUwMCwgLy8g5q+r56eSCgkJcGRmX3JhdGlvID0gMC41NiwKCQl0aXRsZSA9IGRvY3VtZW50LnRpdGxlLAoJCWZpbGVUeXBlID0gJycsCgkJZG93blR5cGUgPSAxLCAvLyDkuIvovb3mlofku7bnsbvlnosKCQlzZWxlY3QgPSBudWxsLAoJCXNlbGVjdEJveCA9IG51bGwsCgkJZG9tID0gbnVsbCwKCQliZWZvcmVGdW4gPSBudWxsLAoJCWludGVydmFsID0gbnVsbCwKCQlzdGFydFBhZ2VObyA9IDAsCgkJQkFTRV9VUkwgPSAnaHR0cHM6Ly93a3JldHlwZS5iZGltZy5jb20vcmV0eXBlJywKCQlyZWFkZXJJbmZvQmFpID0gbnVsbCwgLy8g55m+5bqm5paH5qGj5Y+C5pWwCgkJaW50ZXJ2YWxCYWkgPSBudWxsOyAvLyDnmb7luqblrprml7bku7vliqEKCWlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi50YW9kb2NzKSkgewoJCWlzY29weSA9ICdUUlVFJzsgLy8gdGFvZG9jcyBjb3B5IGZsYWcKCX0KCgljb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkpOwoJaWYgKHBhcmFtcy5zaXplICYmIHBhcmFtcy5nZXQoJ2N1c3RvbScpKSB7CgkJd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7CgkJCXR5cGU6ICJvbmxvYWQiLAoJCQl2YWx1ZTogJ3N1Y2Nlc3MnCgkJfSwgIioiKQoJCXUubG9nKCflrZDpobXpnaLliqDovb3lrozmiJDvvIEnKTsKCX0KCgkvLyDnmb7luqbmi7fotJ3mlofmnKwKCWNvbnN0IGJhaWR1Q29weSA9ICgpID0+IHsKCQljb25zdCBjb3B5RXZlbnQgPSAoKSA9PiB7CgkJCWxldCBsaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxpbmsnKTsKCQkJbGV0IHRleHRDb250ZW50ID0gbGluayA/IGxpbmsudGV4dENvbnRlbnQgOiAiIjsKCQkJbGV0IHJlc3VsdCA9IHRleHRDb250ZW50ID8gdGV4dENvbnRlbnQuc3Vic3RyaW5nKHRleHRDb250ZW50LmluZGV4T2YoJ+KAnCcpICsgMSwgdGV4dENvbnRlbnQKCQkJCS5sYXN0SW5kZXhPZign4oCdJykpIDogd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk7CgkJCWxldCB0ZXh0YXJlYSA9IHUucXVlcnkoJyNNRl90ZXh0YXJlYScpOwoJCQlpZiAodGV4dGFyZWEpIHsKCQkJCXRleHRhcmVhLmlubmVyVGV4dCA9IHJlc3VsdDsKCQkJfSBlbHNlIHsKCQkJCXRleHRhcmVhID0gdS5jcmVhdGVFbCgnTUZfdGV4dGFyZWEnLCAndGV4dGFyZWEnKTsKCQkJCWxldCBzdHlsZSA9IHsKCQkJCQl3aWR0aDogIjEwMCUiLAoJCQkJCWhlaWdodDogIjIwMHB4IiwKCQkJCQlvdXRsaW5lOiAibm9uZSIsCgkJCQkJcGFkZGluZzogIjEwcHgiLAoJCQkJCWJveFNpemluZzogImJvcmRlci1ib3giLAoJCQkJCWZvbnRTaXplOiAiMTZweCIsCgkJCQkJYm9yZGVyOiAiMXB4IHNvbGlkIHJnYigyMDQsIDIwNCwgMjA0KSIKCQkJCX0KCQkJCXUuc3R5bGUodGV4dGFyZWEsIHN0eWxlKQoJCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1kSW5wdXQtdGV4dCcpLmlubmVyVGV4dCA9IHJlc3VsdDsKCQkJCWxldCBib3ggPSB1LnF1ZXJ5KCcjY2F0YWxvZy1tYWluJykgfHwgdS5xdWVyeSgnLmNhdGFsb2ctbWFpbicpIHx8IHUucXVlcnkoCgkJCQkJJy5yZWxhdGVkLWRvYy1saXN0JykKCQkJCWJveC5iZWZvcmUodGV4dGFyZWEpOwoJCQl9CgkJfQoKCQljb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7CgkJCWNoYXJhY3RlckRhdGE6IHRydWUsCgkJCXN1YnRyZWU6IHRydWUKCQl9OwoJCS8vIGRvbSDnm5HlkKzlmagKCQljb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9uTGlzdCwgb2JzZXJ2ZXIpIHsKCQkJY29weUV2ZW50KCkKCQl9KTsKCQljb25zdCB0YXJnZXROb2RlV3JhcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtcmVzdWx0LXdyYXAnKTsKCQkvLyDop6blj5Hnm5HlkKwKCQlvYnNlcnZlci5vYnNlcnZlKHRhcmdldE5vZGVXcmFwLCBvYnNlcnZlck9wdGlvbnMpOwoKCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZnVuY3Rpb24oKSB7CgkJCXZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CgkJCWlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHsKCQkJCWNvcHlFdmVudCgpCgkJCX0KCQl9KTsKCX0KCgkvLyDnmb7luqYgeGhyIOaVsOaNruebkeWQrAoJaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLndlbmt1KSkgewoJCWNvbnN0IF9yX3RleHQgPSB3aW5kb3cuUmVzcG9uc2UucHJvdG90eXBlLnRleHQ7CgkJd2luZG93LlJlc3BvbnNlLnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24oKSB7CgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CgkJCQlfcl90ZXh0LmNhbGwodGhpcykudGhlbigodGV4dCkgPT4gewoJCQkJCXJlc29sdmUodGV4dCk7CgkJCQl9KS5jYXRjaChyZWplY3QpOwoJCQl9KTsKCQl9CgkJY29uc3QgX29wZW4gPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW47CgkJd2luZG93LlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oLi4uYXJncykgewoJCQl0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCAoKSA9PiB7CgkJCQl0cnkgewoJCQkJCWxldCBjb250ZW50ID0gdGhpcy5yZXNwb25zZVRleHQ7CgkJCQkJY29uc3QgdXJsID0gYXJnc1sxXTsKCQkJCQlpZiAodXJsLmluY2x1ZGVzKCduZG9jdmlldy9yZWFkZXJpbmZvJykpIHsKCQkJCQkJY29uc3QgewoJCQkJCQkJZGF0YQoJCQkJCQl9ID0gSlNPTi5wYXJzZShjb250ZW50KTsKCQkJCQkJY29uc3QgaHRtbFVybHMgPSBkYXRhLmh0bWxVcmxzOwoJCQkJCQlsZXQgbGlzdCA9IGh0bWxVcmxzLnBuZzsKCQkJCQkJbGV0IGltYWdlcyA9IFtdOwoJCQkJCQlpZiAobGlzdCkgewoJCQkJCQkJaW1hZ2VzID0gaHRtbFVybHMucG5nLm1hcChpdGVtID0+IHsKCQkJCQkJCQlyZXR1cm4gaXRlbS5wYWdlTG9hZFVybAoJCQkJCQkJfSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlpbWFnZXMgPSBodG1sVXJsczsKCQkJCQkJfQoJCQkJCQkvLyDmlofmnKzlhoXlrrnlnLDlnYDkv53lrZgKCQkJCQkJaWYgKGh0bWxVcmxzLmpzb24pIHsKCQkJCQkJCWxldCBwYWdlTG9hZFVybCA9IGh0bWxVcmxzLmpzb24ubWFwKGl0ZW0gPT4gewoJCQkJCQkJCXJldHVybiBpdGVtLnBhZ2VMb2FkVXJsCgkJCQkJCQl9KQoJCQkJCQkJTUZfYWRkVVJMKHBhZ2VMb2FkVXJsLCAncGFnZURhdGEnKTsKCQkJCQkJfQoJCQkJCQkvLyDnuq/mlofmnKznsbvlnovmlofku7YKCQkJCQkJaWYgKGZpbGVUeXBlID09PSAidHh0IikgeyAvLyDnuq/mlofmnKznsbvlnosKCQkJCQkJCWxldCB1cmxzID0gW107CgkJCQkJCQljb25zdCB7CgkJCQkJCQkJZG9jSWQsCgkJCQkJCQkJZnJlZVBhZ2UsCgkJCQkJCQkJcnNpZ24sCgkJCQkJCQkJbWQ1c3VtCgkJCQkJCQl9ID0gZGF0YTsKCQkJCQkJCWZvciAodmFyIGkgPSByZWFkZXJJbmZvQmFpLnNob3dQYWdlICsgMTsgaSA8IGZyZWVQYWdlICsgMTsgaSsrKSB7CgkJCQkJCQkJbGV0IHggPSBtZDVzdW0uc3Vic3RyaW5nKDEpOwoJCQkJCQkJCWxldCBuID0gWyJwbj0iICsgaSwgInJuPTEiLCAidHlwZT10eHQiLCAic3ByPTAiLCAicnNpZ249IiArIHJzaWduLAoJCQkJCQkJCQkiY2FsbGJhY2s9d2Vua3VfIiArIGkKCQkJCQkJCQldLmpvaW4oIiYiKTsKCQkJCQkJCQlsZXQgdXJsID0gQkFTRV9VUkwgKyAiL3RleHQvIiArIGRvY0lkICsgIj8iICsgeCArICImIiArIG47CgkJCQkJCQkJdXJscy5wdXNoKHVybCkKCQkJCQkJCX0KCQkJCQkJCU1GX2FkZFVSTCh1cmxzLCAncGFnZURhdGEnKTsKCQkJCQkJfQoJCQkJCQlNRl9hZGRVUkwoaW1hZ2VzKTsKCQkJCQl9CgkJCQl9IGNhdGNoIHt9CgkJCX0pOwoJCQlyZXR1cm4gX29wZW4uYXBwbHkodGhpcywgYXJncyk7CgkJfQoJfQoKCWNvbnN0IGNoaWxkTWVzc2FnZSA9IChtZXNzYWdlKSA9PiB7CgkJd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7CgkJCXR5cGU6ICJjaGlsZCIsCgkJCXZhbHVlOiBtZXNzYWdlID8gbWVzc2FnZSA6ICcnCgkJfSwgIioiKQoJfQoJY29uc3QgcGFyZW50TWVzc2FnZSA9IChtZXNzYWdlLCBhdHRyKSA9PiB7CgkJY29uc3QgaWZhcm1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYXR0cik7CgkJbGV0IF93aW5kb3cgPSBpZmFybWUuY29udGVudFdpbmRvdzsKCQlfd2luZG93LnBvc3RNZXNzYWdlKHsKCQkJdHlwZTogJ3BhcmVudCcsCgkJCXZhbHVlOiBtZXNzYWdlID8gbWVzc2FnZSA6ICcnCgkJfSwgIioiKQoJfQoJLy8g55uR5ZCs6aG16Z2i5raI5oGv5LqL5Lu2Cgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIChlKSA9PiB7CgkJLy8gY29uc29sZS5sb2coZSkKCQljb25zdCB7CgkJCXR5cGUsCgkJCXZhbHVlCgkJfSA9IGUuZGF0YTsKCQlpZiAodHlwZSA9PT0gJ3BhcmVudCcpIHsgLy8g54i257qnLeWtkOmhtemdoua2iOaBrwoJCQlpZiAodmFsdWUuaW5jbHVkZXMob3JpZ2luKSkgewoJCQkJTUZfSW1hZ2VUb0Jhc2U2NCh2YWx1ZSkudGhlbihkYXRhID0+IHsKCQkJCQljaGlsZE1lc3NhZ2UoZGF0YSk7CgkJCQl9KQoJCQl9CgkJfSBlbHNlIGlmICh0eXBlID09PSAnY2hpbGQnKSB7IC8vIOWtkOmhtemdoi3liLDniLbpobXpnaLmtojmga8KCQkJbGV0IGluZGV4ID0gTnVtYmVyKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjdXJyZW50IikgfHwgIjAiKTsKCQkJbGV0IGxlbmd0aCA9IE51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgibGVuZ3RoIikgfHwgIjAiKTsKCQkJY29uc3QgewoJCQkJYmxvYiwKCQkJCXVpbnQ4LAoJCQkJd2lkdGgsCgkJCQloZWlnaHQKCQkJfSA9IHZhbHVlOwoJCQlpZiAoZmlsZVR5cGUuaW5jbHVkZXMoJ3BwdCcpIHx8IHdpZHRoID4gaGVpZ2h0KSB7CgkJCQlkb2MuYWRkUGFnZShbd2lkdGggKiBwZGZfcmF0aW8sIGhlaWdodCAqIHBkZl9yYXRpb10sICdsJyk7CgkJCQlkb2MuYWRkSW1hZ2UodWludDgsICdKUEVHJywgMCwgMCwgd2lkdGggKiBwZGZfcmF0aW8sIGhlaWdodCAqIHBkZl9yYXRpbywgaW5kZXgsICdGQVNUJykKCQkJfSBlbHNlIHsKCQkJCWRvYy5hZGRQYWdlKCk7CgkJCQlkb2MuYWRkSW1hZ2UodWludDgsICdKUEVHJywgMCwgMCwgcGRmX3csIHBkZl9oLCBpbmRleCwgJ0ZBU1QnKQoJCQl9CgkJCWlmIChpbmRleCA9PT0gMSkgewoJCQkJZG9jLmRlbGV0ZVBhZ2UoMSk7CgkJCX0KCQkJemlwV3JpdGVyLmFkZChpbmRleCArICIucG5nIiwgbmV3IHppcC5CbG9iUmVhZGVyKGJsb2IpKTsKCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2N1cnJlbnQnLCBpbmRleCArIDEgKyAiIik7CgkJCWRvd25pbWcoKTsKCQl9IGVsc2UgaWYgKHR5cGUgPT09ICdvbmxvYWQnKSB7CgkJCWNvbnN0IHVybCA9IG5ldyBVUkwoZS5vcmlnaW4pOwoJCQljb25zdCBhdHRySWQgPSB1cmwuaG9zdC5yZXBsYWNlQWxsKCIuIiwgIiIpOwoJCQljb25zdCBxdWVyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcjJyArIGF0dHJJZCk7CgkJCWlmIChxdWVyeSkgewoJCQkJZG93bmltZygpOwoJCQl9CgkJfQoJfSkKCgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g5YmN572u5pa55rOVCgkgKiBAYXV0aG9yIE1yLkZhbmcKCSAqIEB0aW1lIDIwMjTlubQy5pyIMuaXpQoJICovCgljb25zdCBiZWZvcmUgPSAoKSA9PiB7CgkJaWYgKGJlZm9yZUZ1bikgewoJCQl1LmxvZygnLS0tLS0tLS0tLT5iZWZvcmVGdW4nKTsKCQkJZXZhbChiZWZvcmVGdW4pCgkJfQoJCS8vIOeUu+W4g+a3u+WKoOebkeWQrOS6i+S7tu+8jOW9k+aVsOaNruWKoOi9veWujOaIkOWIoOmZpCBpZO+8jOmYsuatouaVsOaNruiiq+a4heepugoJCWlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi53ZW5rdSkpIHsKCQkJY29uc3QgZWxzID0gdS5xdWVyeUFsbCgnY2FudmFzJyk7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7CgkJCQlsZXQgZU5vZGUgPSBlbHNbaV07CgkJCQljb25zdCBpbnRlcnNlY3Rpb25PYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4gewoJCQkJCWxldCBpc0ludGVyc2VjdGluZyA9IGVudHJpZXNbMF0uaXNJbnRlcnNlY3RpbmcKCQkJCQlpZiAoaXNJbnRlcnNlY3RpbmcgJiYgZU5vZGUud2lkdGggJiYgZU5vZGUuaGVpZ2h0KSB7CgkJCQkJCWVOb2RlLmlkID0gJyc7CgkJCQkJfQoJCQkJfSk7CgkJCQkvLyDlvIDlp4vnm5HlkKwKCQkJCWludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUoZU5vZGUpOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogQGRlc2NyaXB0aW9uIOWIneWni+WMluaWueazlQoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI05bm0MuaciDLml6UKCSAqLwoJY29uc3QgaW5pdCA9ICgpID0+IHsKCQljb25zb2xlLnRhYmxlKHsKCQkJaG9zdCwKCQkJaHJlZiwKCQkJb3JpZ2luCgkJfSkKCQlkb20gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTsKCQlpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4ucmVucmVuZG9jKSkgewoJCQlpZiAoIS8uKnJlbnJlbmRvY1wuY29tXC8uKyQvLnRlc3QoaHJlZikpIHsKCQkJCXUubG9nKCfnu5PmnZ8nKTsKCQkJCXJldHVybjsKCQkJfQoJCQljb25zdCBub2RlID0gdS5xdWVyeSgnaDEnKTsKCQkJdGl0bGUgPSBub2RlLmlubmVyVGV4dC5yZXBsYWNlQWxsKCIgIiwgIiIpOwoJCQlub2RlLm5leHRFbGVtZW50U2libGluZy5jaGlsZHJlbgoJCQljb25zdCBpbm5lclRleHQgPSBub2RlLm5leHRFbGVtZW50U2libGluZy5jaGlsZHJlbls2XS5pbm5lclRleHQ7CgkJCWZpbGVUeXBlID0gaW5uZXJUZXh0LnNwbGl0KCLvvJoiKVsxXS50b0xvd2VyQ2FzZSgpOwoJCQlkb20gPSB1LnF1ZXJ5KCcubWFpbi1jb250ZW50Jyk7CgkJCWJlZm9yZUZ1biA9CgkJCQkibGV0IGVyID0gdS5xdWVyeSgnI2xvYWRfcHJldmlld19idG4nKTtpZiAoZXIgJiYgZXIuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7ZXIuY2xpY2soKX0iOwoJCQlzZWxlY3QgPSAiI3BhZ2UgaW1nIjsKCQkJYnRucy5wdXNoKG5ldyBCb3goJ1BQVCcsICfojrflj5blnLDlnYAnLCAnZG93bnR4dCgpJykpCgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5ib29rMTE4KSkgewoJCQlpZiAoIS8uK2Jvb2sxMThcLmNvbVwvLiskLy50ZXN0KGhyZWYpKSB7CgkJCQl1LmxvZygn57uT5p2fJyk7CgkJCQlyZXR1cm47CgkJCX0KCQkJaWYgKCFocmVmLmluY2x1ZGVzKCdwcHRWaWV3Lmh0bWwnKSAmJiAhcGFyYW1zLmdldCgicmVhZHBhZ2UiKSkgewoJCQkJbGV0IG5vZGUgPSB1LnF1ZXJ5KCdoMScpCgkJCQlub2RlID0gbm9kZSA/IG5vZGUgOiB1LnF1ZXJ5KCdoMicpOwoJCQkJdGl0bGUgPSBub2RlLmlubmVyVGV4dC5yZXBsYWNlQWxsKCIgIiwgIiIpLnJlcGxhY2VBbGwoIlZJUCIsICIiKTsKCQkJCWNvbnN0IG51bWJlciA9IHRpdGxlLmxhc3RJbmRleE9mKCIuIik7CgkJCQlmaWxlVHlwZSA9IHRpdGxlLnN1YnN0cmluZyhudW1iZXIgKyAxKS50b0xvd2VyQ2FzZSgpOwoJCQkJR01fc2V0VmFsdWUoJ3RpdGxlJywgdGl0bGUpOwoJCQkJaWYgKGZpbGVUeXBlLmluY2x1ZGVzKCdwcHQnKSkgewoJCQkJCWJlZm9yZUZ1biA9ICJsZXQgZWIgPSB1LnF1ZXJ5KCcjYnRuX3BwdF9mcm9udF9wYycpO2lmIChlYikge2ViLmNsaWNrKCk7fSI7CgkJCQl9IGVsc2UgewoJCQkJCWJlZm9yZUZ1biA9ICJsZXQgZWIgPSB1LnF1ZXJ5KCcjYnRuX3ByZXZpZXdfcmVtYWluJyk7aWYgKGViKSB7ZWIuY2xpY2soKTt9IjsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZpbGVUeXBlID0gJ3BwdCc7CgkJCQl0aXRsZSA9IEdNX2dldFZhbHVlKCd0aXRsZScpOwoJCQl9CgkJCXNlbGVjdCA9ICIud2VicHJldmlldy1pdGVtIGltZyI7CgkJCWJ0bnMucHVzaChuZXcgQm94KCdQUFQnLCAn6I635Y+W5Zyw5Z2AJywgJ2Rvd250eHQoKScpKQoJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uZG9jaW4pKSB7CgkJCWlmICghLy4rZG9jaW5cLmNvbVwvLiskLy50ZXN0KGhyZWYpKSB7CgkJCQl1LmxvZygn57uT5p2fJyk7CgkJCQlyZXR1cm47CgkJCX0KCQkJc2VsZWN0ID0gIiNjb250ZW50Y29udGFpbmVyIGNhbnZhcyI7CgkJCWNvbnN0IHRvSW1nID0gcGFyYW1zLmdldCgndG9JbWcnKTsKCQkJY29uc29sZS5sb2coJ3RvSW1nJywgdG9JbWcpOwoJCQl0aXRsZSA9IHUucXVlcnkoJ21ldGFbcHJvcGVydHk9Im9nOnRpdGxlIl0nKS5jb250ZW50OwoJCQlmaWxlVHlwZSA9IHUuYXR0cih1LnF1ZXJ5KCdoMScpLmNoaWxkcmVuWzBdLCAndGl0bGUnKS50b0xvd2VyQ2FzZSgpOwoJCQlpZiAodG9JbWcgJiYgdG9JbWcgPT09ICcxJykgewoJCQkJc2VsZWN0ID0gIiNjb250ZW50Y29udGFpbmVyIGltZyIKCQkJfQoJCQljb25zb2xlLmxvZygndG9JbWcnLCBzZWxlY3QpOwoJCQlpZiAoaXNVc2VyTG9naW4gPT09ICcxJykgeyAvLyDnmbvlvZUKCQkJCWJlZm9yZUZ1biA9ICJsZXQgZWIgPSB1LnF1ZXJ5KCcubW9kZWwtZm9sZC1zaG93Jyk7aWYgKGViKSB7ZWIuY2xpY2soKTt9IjsKCQkJfQoJCQlpZiAoZmlsZVR5cGUuaW5jbHVkZXMoJ3BwdCcpIHx8ICh0b0ltZyAmJiB0b0ltZyA9PT0gJzEnKSkgewoJCQkJYnRucy5wdXNoKG5ldyBCb3goJ1BQVCcsICfojrflj5blnLDlnYAnLCAnZG93bnR4dCgpJykpCgkJCX0KCgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi53ZW5rdSkpIHsKCQkJaWYgKCEvLit3ZW5rdVwuYmFpZHVcLmNvbVwvKHRmdmlld3x2aWV3KS4rJC8udGVzdChocmVmKSkgewoJCQkJdS5sb2coJ+e7k+adnycpOwoJCQkJcmV0dXJuOwoJCQl9CgkJCWRvbSA9IHUucXVlcnkoJy5yZWFkZXItd3JhcCcpOwoJCQliZWZvcmVGdW4gPQoJCQkJImxldCBlYiA9IHUucXVlcnkoJy51bmZvbGQnKT91LnF1ZXJ5KCcudW5mb2xkJyk6dS5xdWVyeSgnLnJlYWQtYWxsJyk7aWYgKGViKSB7ZWIuY2xpY2soKTt9IjsKCQkJc2VsZWN0ID0gIiNvcmlnaW5hbC1jcmVhZGVyLXJvb3QgY2FudmFzIjsKCQkJYnRucy5wdXNoKG5ldyBCb3goJ3ByaW50LXBkZicsICfmiZPljbBQREYnLCAnd2luZG93LnByaW50KCknKSkKCQkJaWYgKGZpbGVUeXBlLmluY2x1ZGVzKCdwcHQnKSB8fCBmaWxlVHlwZS5pbmNsdWRlcygncGRmJykpIHsKCQkJCWJ0bnMucHVzaChuZXcgQm94KCdQUFQnLCAn6I635Y+W5Zyw5Z2AJywgJ2Rvd250eHQoKScpKQoJCQl9IGVsc2UgewoJCQkJYnRucy5wdXNoKG5ldyBCb3goJ2dldC10ZXh0JywgJ+iOt+WPluaWh+acrCcsICdmdWxsVGV4dCgpJykpCgkJCX0KCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLnNvKSkgewoJCQlpZiAoIS8uK3dlbmt1XC5zb1wuY29tXC8uKyQvLnRlc3QoaHJlZikpIHsKCQkJCXUubG9nKCfnu5PmnZ8nKTsKCQkJCXJldHVybjsKCQkJfQoJCQljb25zdCB7CgkJCQlUaXRsZSwKCQkJCURvY1R5cGUsCgkJCQlGaWVsZDAzCgkJCX0gPSBhc3luY0RhdGEuRG9jSW5mbzsKCQkJdGl0bGUgPSBUaXRsZTsKCQkJZmlsZVR5cGUgPSBEb2NUeXBlLnRvTG93ZXJDYXNlKCk7OwoJCQlidG5zLnNwbGljZSgxLCAyKTsKCQkJYnRucy5wdXNoKG5ldyBCb3goJ1BQVCcsICfojrflj5blnLDlnYAnLCAnZG93bnR4dCgpJykpOwoJCQlNRl9hZGRVUkwoRmllbGQwMyk7CgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5kb2M4OCkpIHsKCQkJaWYgKCEvLitkb2M4OFwuY29tXC8uKyQvLnRlc3QoaHJlZikpIHsKCQkJCXUubG9nKCfnu5PmnZ8nKTsKCQkJCXJldHVybjsKCQkJfQoJCQl0aXRsZSA9IHUucXVlcnkoJ21ldGFbcHJvcGVydHk9Im9nOnRpdGxlIl0nKS5jb250ZW50OwoJCQlmaWxlVHlwZSA9IHUucXVlcnkoIiNib3gxIC5hdHRyaWJ1dGUiKS5pbm5lclRleHQuc3BsaXQoIiAiKVswXS5zcGxpdCgi77yaIilbMV0udG9Mb3dlckNhc2UoKTsKCQkJYmVmb3JlRnVuID0gImxldCBlYiA9IHUucXVlcnkoJyNjb250aW51ZUJ1dHRvbicpO2lmIChlYikge2ViLmNsaWNrKCk7fSI7CgkJCXNlbGVjdCA9ICIjcGFnZUNvbnRhaW5lciAuaW5uZXJfcGFnZSI7CgkJCWJ0bnMucHVzaChuZXcgQm94KCdnZXQtdGV4dCcsICfojrflj5bmlofmnKwnLCAnZnVsbFRleHQoKScpKQoJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4ubWJhbGliKSkgewoJCQlpZiAoIS9kb2NcLm1iYWxpYlwuY29tXC8uKyQvLnRlc3QoaHJlZikpIHsKCQkJCXUubG9nKCfnu5PmnZ8nKTsKCQkJCXJldHVybjsKCQkJfQoJCQlkb20gPSB1LnF1ZXJ5KCcjc2Nyb2xsLW0tYm94Jyk7CgkJCXRpdGxlID0gdS5xdWVyeSgnaDEgcCcpLmlubmVyVGV4dDsKCQkJZmlsZVR5cGUgPSB0aXRsZS5zdWJzdHJpbmcodGl0bGUuaW5kZXhPZignLicpICsgMSkudG9Mb3dlckNhc2UoKTsKCQkJc2VsZWN0ID0gIiN2aWV3ZXIgLnBhZ2UiCgkJCWJ0bnMuc3BsaWNlKDEsIDAsIG5ldyBCb3goJ3NwZWVkJywgJzUwMCcpKTsKCQkJYnRucy5wdXNoKG5ldyBCb3goJ2dldC10ZXh0JywgJ+iOt+WPluaWh+acrCcsICdmdWxsVGV4dCgpJykpCgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5kZWxpd2Vua3UpIHx8CgkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmN4aykgfHwKCQkJaG9zdC5pbmNsdWRlcyhkb21haW4uamluY2h1dG91KSB8fAoJCQlob3N0LmluY2x1ZGVzKGRvbWFpbi5tYXlpd2Vua3UpIHx8CgkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmR1Z2VuKSB8fAoJCQlob3N0LmluY2x1ZGVzKGRvbWFpbi5jaG9jaGluYSkgfHwKCQkJaG9zdC5pbmNsdWRlcyhkb21haW4ud2Vpemh1YW4pCgkJKSB7CgkJCWlmICgoIS8uK2RlbGl3ZW5rdVwuY29tXC8uKyQvLnRlc3QoaHJlZikpICYmCgkJCQkoIS8uKzdjeGtcLmNvbVwvLiskLy50ZXN0KGhyZWYpKSAmJgoJCQkJKCEvLitqaW5jaHV0b3VcLmNvbVwvLiskLy50ZXN0KGhyZWYpKSAmJgoJCQkJKCEvLittYXlpd2Vua3VcLmNvbVwvLiskLy50ZXN0KGhyZWYpKSAmJgoJCQkJKCEvd3dcLmR1Z2VuXC5jb21cLy4rJC8udGVzdChocmVmKSkgJiYKCQkJCSghLy4rY2hvY2hpbmFcLmNvbVwvLiskLy50ZXN0KGhyZWYpKSAmJgoJCQkJKCEvLit3ZWl6aHVhbm5ldFwuY29tXC8uKyQvLnRlc3QoaHJlZikpCgkJCSkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCUdNX2RlbGV0ZVZhbHVlKCdsaXN0RGF0YScpOyAvLyDmuIXnqboKCQkJLy8g6JqC6JqB6ZyA5omL5Yqo54K55Ye75YWo5paHCgkJCWlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5tYXlpd2Vua3UpIHx8IGhvc3QuaW5jbHVkZXMoZG9tYWluLmR1Z2VuKSkgewoJCQkJcHJldmlldygpOwoJCQkJbG9hZGluZ1VybHMoaG9zdC5pbmNsdWRlcyhkb21haW4uZHVnZW4pKTsKCQkJfSBlbHNlIHsKCQkJCWxvYWRpbmdVcmxzKCk7CgkJCX0KCQkJaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLmNob2NoaW5hKSkgewoJCQkJdGl0bGUgPSB1LnF1ZXJ5KCdoMScpLmlubmVyVGV4dDsKCQkJCWZpbGVUeXBlID0gdGl0bGUuc3Vic3RyaW5nKHRpdGxlLmluZGV4T2YoJy4nKSArIDEpLnRvTG93ZXJDYXNlKCk7CgkJCX0gZWxzZSB7CgkJCQl0aXRsZSA9IHUucXVlcnkoJ21ldGFbcHJvcGVydHk9Im9nOnRpdGxlIl0nKS5jb250ZW50OwoJCQkJZmlsZVR5cGUgPSB1LnF1ZXJ5KCdtZXRhW3Byb3BlcnR5PSJvZzpkb2N1bWVudDp0eXBlIl0nKS5jb250ZW50LnRvTG93ZXJDYXNlKCk7CgkJCX0KCQkJYnRucy5zcGxpY2UoMSwgMik7CgkJCWJ0bnMucHVzaChuZXcgQm94KCdQUFQnLCAn6I635Y+W5Zyw5Z2AJywgJ2Rvd250eHQoKScpKQoKCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLmlhc2spKSB7CgkJCWlmICghL2lzaGFyZVwuaWFza1wuY29tXC8uKyQvLnRlc3QoaHJlZikpIHJldHVybjsKCQkJdGl0bGUgPSBwYWdlQ29uZmlnLmFjY2Vzcy50aXRsZTsKCQkJZmlsZVR5cGUgPSBwYWdlQ29uZmlnLmFjY2Vzcy5mb3JtYXQudG9Mb3dlckNhc2UoKTs7CgkJCWJ0bnMuc3BsaWNlKDEsIDIpOwoJCQlidG5zLnB1c2gobmV3IEJveCgnUFBUJywgJ+iOt+WPluWcsOWdgCcsICdkb3dudHh0KCknKSkKCQkJTUZfYWRkVVJMKHBhZ2VDb25maWcuaW1nVXJsKTsKCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLnRhb2RvY3MpKSB7CgkJCWlmICghL3d3d1wudGFvZG9jc1wuY29tXC8uKyQvLnRlc3QoaHJlZikpIHJldHVybjsKCQkJdGl0bGUgPSB1LnF1ZXJ5KCdoMScpLmlubmVyVGV4dDsKCQkJZmlsZVR5cGUgPSB0aXRsZS5zdWJzdHJpbmcodGl0bGUuaW5kZXhPZignLicpICsgMSkudG9Mb3dlckNhc2UoKTsKCQkJYmVmb3JlRnVuID0gImxldCBlYiA9IHUucXVlcnkoJy5mYzJlJyk7aWYgKGViKSB7ZWIuY2xpY2soKTt9IjsKCQkJc2VsZWN0ID0gIiNjYW52YXMgY2FudmFzIjsKCQkJYnRucy5wdXNoKG5ldyBCb3goJ2dldC10ZXh0JywgJ+iOt+WPluaWh+acrCcsICdmdWxsVGV4dCgpJykpCgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi53ZW5rdWIpKSB7CgkJCWlmICghL3d3d1wud2Vua3ViXC5jb21cLy4rJC8udGVzdChocmVmKSkgcmV0dXJuOwoJCQl0aXRsZSA9IHUucXVlcnkoJ2gxJykuaW5uZXJUZXh0OwoJCQlmaWxlVHlwZSA9IHRpdGxlLnN1YnN0cmluZyh0aXRsZS5pbmRleE9mKCcuJykgKyAxKS50b0xvd2VyQ2FzZSgpOwoJCQliZWZvcmVGdW4gPSAibGV0IGViID0gdS5xdWVyeSgnLmZjMmUnKTtpZiAoZWIpIHtlYi5jbGljaygpO30iOwoJCQlzZWxlY3QgPSAiI3BhZ2VDb250YWluZXIgaW1nIjsKCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLmdiNjg4KSkgewoJCQlpZiAodS5xdWVyeSgnI3ZlcmlmeUNvZGUnKSkgcmV0dXJuOwoJCQlmaWxlVHlwZSA9ICdwZGYnOwoJCQlzZWxlY3QgPSAiI3ZpZXdlciAucGFnZSI7CgkJCWJ0bnMuc3BsaWNlKDEsIDAsIG5ldyBCb3goJ3NwZWVkJywgJzUwMCcpKTsKCQkJYnRucy5wdXNoKG5ldyBCb3goJ2dldC10ZXh0JywgJ+iOt+WPluaWh+acrCcsICdmdWxsVGV4dCgpJykpCgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5qamcpKSB7CgkJCWZpbGVUeXBlID0gIi5wZGYiOwoJCQlzZWxlY3QgPSAiI2RvY1ZpZXdlcl9WaWV3Q29udGFpbmVyIC5md3ItcGFnZS1pbnZpc2libGUiOwoJCQkvLyBzZWxlY3QgPSAiI2RvY1ZpZXdlcl9WaWV3Q29udGFpbmVyIC5md3ItcGFnZS1pbWFnZSBpbWciOwoJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uc2hlbmd0b25nZWR1KSkgewoJCQlmaWxlVHlwZSA9ICJwcHQiOwoJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uc2FjaW5mbykpIHsKCQkJR01fZGVsZXRlVmFsdWUoJ2xpc3REYXRhJyk7IC8vIOa4heepugoJCQlmaWxlVHlwZSA9ICJwZGYiOwoJCQljb25zdCBtZDUgPSBocmVmLnNwbGl0KCcvJykucG9wKCk7IC8vIOenmOmSpQoJCQlqb2luRG93bmxvYWRVUkwoJ2h0dHBzOi8vaGJiYS5zYWNpbmZvLm9yZy5jbi9oYmJhX29ubGluZVJlYWRfcGFnZS8nICsgbWQ1KQoJCQlidG5zLnNwbGljZSgxLCAyKTsKCQkJYnRucy5wdXNoKG5ldyBCb3goJ1BQVCcsICfojrflj5blnLDlnYAnLCAnZG93bnR4dCgpJykpCgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5xem9mZmljZSkpIHsKCQkJZmlsZVR5cGUgPSAicGRmIjsKCQkJdGl0bGUgPSBwYXJhbXMuZ2V0KCdjb250ZW50JykgfHwgJ0FJLVBQVCc7CgkJCWJ0bnMuc3BsaWNlKDEsIDIpOwoJCQlidG5zLnNwbGljZSgyLCAxKTsKCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLm5yc2lzKSkgewoJCQlmaWxlVHlwZSA9ICJwZGYiOwoJCQlzZWxlY3QgPSAiLnBhZ2UgY2FudmFzIjsKCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLm5lYSkpIHsKCQkJZmlsZVR5cGUgPSAicGRmIjsKCQkJc2VsZWN0ID0gIi5wYWdlIGNhbnZhcyI7CgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5uc3NpKSkgewoJCQl0aXRsZSA9IGRvY3VtZW50LnRpdGxlLAoJCQkJZmlsZVR5cGUgPSAicGRmIjsKCQkJc2VsZWN0ID0gIiN2aWV3ZXIgLnBhZ2UiOwoJCQlkb20gPSB1LnF1ZXJ5KCcjdmlld2VyQ29udGFpbmVyJykKCQkJYnRucy5zcGxpY2UoMSwgMCwgbmV3IEJveCgnc3BlZWQnLCAnNTAwJykpOwoJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uZmVpc2h1KSkgewoJCQlmaWxlVHlwZSA9ICJwZGYiOwoJCQlkb20gPSB1LnF1ZXJ5KCcjdmlld2VyQ29udGFpbmVyJykKCQkJZmlsZVR5cGUgPSAncGRmJzsKCQkJc2VsZWN0ID0gIiN2aWV3ZXIgLnBhZ2UiOwoJCQlpZiAodGl0bGUuaW5jbHVkZXMoJ1BERicpKSB7CgkJCQlidG5zLnNwbGljZSgxLCAwLCBuZXcgQm94KCdzcGVlZCcsICc1MDAnKSk7CgkJCQlidG5zLnB1c2gobmV3IEJveCgnZ2V0LXRleHQnLCAn6I635Y+W5paH5pysJywgJ2Z1bGxUZXh0KCknKSkKCQkJfSBlbHNlIHsKCQkJCWJ0bnMuc3BsaWNlKDEsIDUpOwoJCQkJYnRucy5wdXNoKG5ldyBCb3goJ2dldC1idWlsZCcsICfmiZPljIXkuIvovb0nLCAnYnVpbGREb3duKCknKSkKCQkJfQoJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uanR5c2J6KSB8fCBob3N0LmluY2x1ZGVzKGRvbWFpbi5jZWJwdWJzZXJ2aWNlKSkgewoJCQlmaWxlVHlwZSA9ICJwZGYiOwoJCQlzZWxlY3QgPSAiI3ZpZXdlciAucGFnZSI7CgkJCWJ0bnMuc3BsaWNlKDEsIDAsIG5ldyBCb3goJ3NwZWVkJywgJzUwMCcpKTsKCQkJYnRucy5wdXNoKG5ldyBCb3goJ2dldC10ZXh0JywgJ+iOt+WPluaWh+acrCcsICdmdWxsVGV4dCgpJykpCgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5qc2psdykpIHsKCQkJZmlsZVR5cGUgPSAicGRmIjsKCQkJc2VsZWN0ID0gIiNjdG4gaW1nIjsKCQkJZG9tID0gdS5xdWVyeSgnI2N0bicpOwoJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4ubXdyKSkgewoJCQlmaWxlVHlwZSA9ICJwZGYiOwoJCQlzZWxlY3QgPSAiI2ltZ2RpdiBpbWciOwoJCQl0aXRsZSA9IHUucXVlcnkoJy5sZWZ0X3RpdGlsZScpLmlubmVyVGV4dDsKCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLnJidGVzdCkpIHsKCQkJZmlsZVR5cGUgPSAicGRmIjsKCQkJc2VsZWN0ID0gIi5wYWdlIGNhbnZhcyI7CgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi53ZWJvZmZpY2UpKSB7CgkJCWZpbGVUeXBlID0gInBkZiI7CgkJCXNlbGVjdCA9ICIjdmlld2VyIC5wYWdlIjsKCQkJYnRucy5zcGxpY2UoMSwgMCwgbmV3IEJveCgnc3BlZWQnLCAnNTAwJykpOwoJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uZ2JzZXJ2aWNlKSkgewoJCQkvLyDpppbpobUt6Lez6L2s6K+m5oOF6aG16Z2iCgkJCWlmIChocmVmLmluY2x1ZGVzKCdiYXNpY2J6RGV0YWlsJykpIHsKCQkJCWxldCBpZCA9IGxvY2F0aW9uLmhyZWYuc3BsaXQoImlkPSIpLnBvcCgpOwoJCQkJd2luZG93Lm9wZW4oCgkJCQkJYGh0dHBzOi8vZ2JzZXJ2aWNlLmNuL3BkZmpzL3dlYi92aWV3ZXIuaHRtbD9maWxlPWh0dHBzOi8vYXBpLmdic2VydmljZS5jbi9hcGkvc3RhbmRhcmQvZmlsZXVybD9pZD0ke2lkfWAKCQkJCSkKCQkJCXJldHVybjsKCQkJfSBlbHNlIGlmICghaHJlZi5pbmNsdWRlcygncGRmanMnKSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWZpbGVUeXBlID0gInBkZiI7CgkJCWRvbSA9IHUucXVlcnkoJyN2aWV3ZXJDb250YWluZXInKTsKCQkJc2VsZWN0ID0gIiN2aWV3ZXIgLnBhZ2UiOwoJCQlidG5zLnNwbGljZSgxLCAwLCBuZXcgQm94KCdzcGVlZCcsICc1MDAnKSk7CgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5zZ2NjKSkgewoJCQlpZiAoIWhyZWYuaW5jbHVkZXMoJ3BvcnRhbC8jL2RvYy9kb2NpLXdpbi8nKSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWZpbGVUeXBlID0gInBkZiI7CgkJCWRvbSA9IHUucXVlcnkoJyN2aWV3ZXJDb250YWluZXInKTsKCQkJc2VsZWN0ID0gIiN2aWV3ZXIgLnBhZ2UiOwoJCQlidG5zLnNwbGljZSgxLCAwLCBuZXcgQm94KCdzcGVlZCcsICc1MDAnKSk7CgkJCWJ0bnMucHVzaChuZXcgQm94KCdnZXQtdGV4dCcsICfojrflj5bmlofmnKwnLCAnZnVsbFRleHQoKScpKQoJCX0KCQljb25zdCBxdWVyeSA9IHUucXVlcnkoIiNidG5fcHB0X2Zyb250X3BjIik7IC8vIOWOn+WImwoJCWlmICghcXVlcnkpIHsKCQkJdS5ndWkoYnRucyk7CgkJfSBlbHNlIHsKCQkJcXVlcnkuY2xpY2soKTsKCQl9CgkJY29uc29sZS5sb2coJ+aWh+S7tuWQjeensO+8micsIHRpdGxlKTsKCQljb25zb2xlLmxvZygn5paH5Lu257G75Z6L77yaJywgZmlsZVR5cGUpOwoJfQoKCS8vIGIgZCAg5o6l5Y+j5pWw5o2u5aSE55CGCgljb25zdCBoYW5kbGVSZW5kZXJEYXRhID0gKCkgPT4gewoJCWNvbnN0IHsKCQkJcmVhZGVySW5mbywKCQkJdmlld0JpegoJCX0gPSBwYWdlRGF0YTsKCQlmaWxlVHlwZSA9IHZpZXdCaXouZG9jSW5mby5maWxlVHlwZTsKCQl0aXRsZSA9IHZpZXdCaXouZG9jSW5mby5haVF1ZXJ5VGl0bGU7CgkJcmVhZGVySW5mb0JhaSA9IHJlYWRlckluZm87CgkJY29uc3QgaHRtbFVybHMgPSByZWFkZXJJbmZvLmh0bWxVcmxzOwoJCWlmIChodG1sVXJscykgewoJCQlpZiAoZmlsZVR5cGUuaW5jbHVkZXMoJ3BwdCcpKSB7CgkJCQlNRl9hZGRVUkwoaHRtbFVybHMpOwoJCQl9IGVsc2UgaWYgKGZpbGVUeXBlLmluY2x1ZGVzKCdwZGYnKSkgewoJCQkJbGV0IGltYWdlcyA9IFtdOwoJCQkJaWYgKGh0bWxVcmxzLnBuZykgewoJCQkJCWltYWdlcyA9IGh0bWxVcmxzLnBuZy5tYXAoaXRlbSA9PiB7CgkJCQkJCXJldHVybiBpdGVtLnBhZ2VMb2FkVXJsCgkJCQkJfSkKCQkJCX0gZWxzZSB7CgkJCQkJaW1hZ2VzID0gaHRtbFVybHM7CgkJCQl9CgkJCQlNRl9hZGRVUkwoaW1hZ2VzKTsKCQkJfQoJCQkvLyDmlofmnKzlhoXlrrnlnLDlnYDkv53lrZgKCQkJaWYgKGh0bWxVcmxzLmpzb24pIHsKCQkJCWxldCBwYWdlTG9hZFVybCA9IGh0bWxVcmxzLmpzb24ubWFwKGl0ZW0gPT4gewoJCQkJCXJldHVybiBpdGVtLnBhZ2VMb2FkVXJsCgkJCQl9KQoJCQkJTUZfYWRkVVJMKHBhZ2VMb2FkVXJsLCAncGFnZURhdGEnKTsKCQkJfQoJCX0KCQkvLyDnuq/mlofmnKznsbvlnovmlofku7YKCQlpZiAoZmlsZVR5cGUgPT09ICJ0eHQiKSB7IC8vIOe6r+aWh+acrOexu+WeiwoJCQlsZXQgdXJscyA9IFtdOwoJCQljb25zdCB7CgkJCQlkb2NJZCwKCQkJCWZyZWVQYWdlLAoJCQkJcnNpZ24sCgkJCQlzaG93UGFnZSwKCQkJCW1kNXN1bQoJCQl9ID0gcmVhZGVySW5mb0JhaTsKCQkJZm9yICh2YXIgaSA9IDE7IGkgPCBzaG93UGFnZSArIDE7IGkrKykgewoJCQkJbGV0IHggPSBtZDVzdW0uc3Vic3RyaW5nKDEpOwoJCQkJbGV0IG4gPSBbInBuPSIgKyBpLCAicm49MSIsICJ0eXBlPXR4dCIsICJzcHI9MCIsICJyc2lnbj0iICsgcnNpZ24sCgkJCQkJImNhbGxiYWNrPXdlbmt1XyIgKyBpCgkJCQldLmpvaW4oIiYiKTsKCQkJCWxldCB1cmwgPSBCQVNFX1VSTCArICIvdGV4dC8iICsgZG9jSWQgKyAiPyIgKyB4ICsgIiYiICsgbjsKCQkJCXVybHMucHVzaCh1cmwpCgkJCX0KCQkJTUZfYWRkVVJMKHVybHMsICdwYWdlRGF0YScpOwoJCX0KCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJYmFpZHVDb3B5KCkKCQl9LCA1MDApCgl9CgoJLy8g5riF55CG57yT5a2YCgljb25zdCBjbGVhckNhY2hlID0gKCkgPT4gewoJCS8vIOenu+mZpOWkmuS9mSBpZnJhbWUKCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKS5mb3JFYWNoKGl0ZW0gPT4gewoJCQlpdGVtLnJlbW92ZSgpCgkJfSkKCgkJLy8g5riF56m657O757uf57yT5a2Y5pWw5o2uCgkJbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2xpc3REYXRhJyk7CgkJbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2xlbmd0aCcpOwoJCWxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjdXJyZW50Jyk7CgkJbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3BhZ2VEYXRhJyk7CgkJbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2Rvd24nKTsKCQlsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnU1BfdGV4dCcpOwoKCQlpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4ud2Vua3UpKSB7CgkJCS8vIOWKoOi9veS4u+mhtemdogoJCQlpZiAoaHJlZi5pbmNsdWRlcygndGZ2aWV3JykgfHwgaHJlZi5pbmNsdWRlcygndmlldycpKSB7CgkJCQlHTV9kZWxldGVWYWx1ZSgnbGlzdERhdGEnKTsgLy8g5Yig6Zmk57yT5a2YCgkJCQloYW5kbGVSZW5kZXJEYXRhKCkKCQkJfQoJCX0gCgl9CgoJLy8gbG9hZCDkuovku7YKCSgoKSA9PiB7CgkJY2xlYXJDYWNoZSgpCgkJLy8g5Zyo6L+Z6YeM5omn6KGM5riy5p+T5a6M5oiQ5ZCO55qE5pON5L2cCgkJY29uc29sZS5sb2coJ0hUTUwg5riy5p+T5a6M5oiQIScpOwoJCS8vIOebkeWQrOWtkOmhtemdouWKoOi9veWujOaIkO+8jOWPkemAgea2iOaBrwoJCWlmICghcGFyYW1zLnNpemUgfHwgIXBhcmFtcy5nZXQoJ2N1c3RvbScpKSB7CgkJCWluaXQoKQoJCX0KCX0pKCk7CgoKCS8qKgoJICogQGRlc2NyaXB0aW9uIOW8gOWni+aWueazle+8jOiHquWKqOmihOiniAoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI05bm0MuaciDLml6UKCSAqLwoJY29uc3QgYXV0b1ByZXZpZXcgPSBhc3luYyAoKSA9PiB7CgkJaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLmJvb2sxMTgpICYmIGZpbGVUeXBlLmluY2x1ZGVzKCdwcHQnKSkgewoJCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc3RhcnQnLCAnMScpOwoJCQlhd2FpdCBhdXRvUGFyc2luZ1BQVCgpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5zaGVuZ3RvbmdlZHUpICYmIGZpbGVUeXBlLmluY2x1ZGVzKCdwcHQnKSkgewoJCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc3RhcnQnLCAnMScpOwoJCQlhd2FpdCBhdXRvU2hlbmdUb25nUGFyc2luZ1BQVCgpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5tYmFsaWIpIHx8CgkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLm5zc2kpIHx8CgkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmZlaXNodSkgfHwKCQkJaG9zdC5pbmNsdWRlcyhkb21haW4uY2VicHVic2VydmljZSkgfHwKCQkJaG9zdC5pbmNsdWRlcyhkb21haW4uanR5c2J6KSB8fAoJCQkoaG9zdC5pbmNsdWRlcyhkb21haW4uZ2I2ODgpICYmICF1LnF1ZXJ5KCcjdmlld2VyJykuc3R5bGUudHJhbnNmb3JtKSB8fAoJCQlob3N0LmluY2x1ZGVzKGRvbWFpbi53ZWJvZmZpY2UpIHx8CgkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLnNnY2MpIHx8CgkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmdic2VydmljZSkKCQkpIHsKCQkJLy8g54m55q6K5oOF5Ya177yM6I635Y+W6aKE6KeIIGRvbQoJCQlpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uc2djYykpIHsKCQkJCWRvbSA9IHUucXVlcnkoJyN2aWV3ZXJDb250YWluZXInKTsKCQkJCWlmICghZG9tKSB7CgkJCQkJYWxlcnQoIuivt+WFiOeCueWHu+mZhOS7tumihOiniO+8gSIpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc3RhcnQnLCAnMScpOwoJCQlsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnU1BfaW5kZXgnKQoJCQlkb20uc2Nyb2xsVG9wID0gMDsKCQkJYXdhaXQgc2Nyb2xsUHJldmlldygpCgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmIChpbnRlcnZhbCkgcmV0dXJuIGZhbHNlOwoJCWlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5kb2NpbikpIHsKCQkJLy8g6LW35aeL6aG156CBCgkJCXN0YXJ0UGFnZU5vID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3BhZ2VfY3VyIikudmFsdWUgLSAxIHx8IDA7CgkJfSBlbHNlIHsKCQkJZG9tLnNjcm9sbFRvcCA9IDA7CgkJfQoJCWludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gewoJCQlpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uYm9vazExOCkpIHsKCQkJCXNjcm9sbFBhZ2VBcmVhKCkKCQkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5yZW5yZW5kb2MpKSB7CgkJCQlzY3JvbGxQYWdlQXJlYSgpCgkJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uZG9jaW4pKSB7CgkJCQlzY3JvbGxXaW5BcmVhKCkKCQkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi53ZW5rdSkpIHsKCQkJCXNjcm9sbFdpbkFyZWEoKQoJCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLmRvYzg4KSkgewoJCQkJc2Nyb2xsUGFnZUFyZWFEb2M4OCgpCgkJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4udGFvZG9jcykpIHsKCQkJCXNjcm9sbFdpbkFyZWFUYW8oKQoJCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLmdiNjg4KSkgewoJCQkJc2Nyb2xsUGFnZUFyZWFEb2NHQigpCgkJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uampnKSkgewoJCQkJc2Nyb2xsUGFnZUFyZWFKSkcoKQoJCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLm5yc2lzKSB8fAoJCQkJaG9zdC5pbmNsdWRlcyhkb21haW4ubmVhKSB8fAoJCQkJaG9zdC5pbmNsdWRlcyhkb21haW4ubXdyKSB8fAoJCQkJaG9zdC5pbmNsdWRlcyhkb21haW4uanNqbHcpIHx8CgkJCQlob3N0LmluY2x1ZGVzKGRvbWFpbi5yYnRlc3QpCgkJCSkgewoJCQkJc2Nyb2xsV2luQXJlYSgpCgkJCX0KCQl9LCA1MDApOwoJfQoKCgkvKioKCSAqIEBkZXNjcmlwdGlvbiDnu5PmnZ/mlrnms5XvvIzlgZzmraLpooTop4gKCSAqIEBhdXRob3IgTXIuRmFuZwoJICogQHRpbWUgMjAyNOW5tDLmnIgy5pelCgkgKi8KCWNvbnN0IHN0b3BQcmV2aWV3ID0gYXN5bmMgKCkgPT4gewoJCWNvbnNvbGUubG9nKCctLS0tLS0tLS0tPnN0b3BQcmV2aWV3Jyk7CgkJaWYgKGludGVydmFsKSB7CgkJCWNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOwoJCQlpbnRlcnZhbCA9IG51bGw7CgkJfQoJCWxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdzdGFydCcpCgl9CgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g57uT5p2f5pa55rOV77yM5YGc5q2i6aKE6KeI77yM5YmN572u5pa55rOVCgkgKiBAYXV0aG9yIE1yLkZhbmcKCSAqIEB0aW1lIDIwMjTlubQ35pyIMjLml6UKCSAqLwoJY29uc3Qgc3RvcEJlZm9yZVByZXZpZXcgPSBhc3luYyAoKSA9PiB7CgkJaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLm13cikpIHsKCQkJY29uc3QgcGFnZV9pbmRleCA9IHUucXVlcnkoJy5wYWdlX2luZGV4JykuaW5uZXJUZXh0OwoJCQljb25zdCBwYWdlX3RvdGFsID0gdS5xdWVyeSgnLnBhZ2VfdG90YWwnKS5pbm5lclRleHQ7CgkJCWlmIChwYWdlX2luZGV4ID09PSBwYWdlX3RvdGFsKSB7CgkJCQlzdG9wUHJldmlldygpOwoJCQkJdS5wcmV2aWV3KC0xKTsKCQkJfSBlbHNlIHsgLy8g5ZCR5LiK5rua5Yqo5LiA5qyhCgkJCQlkb20uc2Nyb2xsVG8oewoJCQkJCXRvcDogZG9tLnNjcm9sbFRvcCAtIDEwMCwKCQkJCQlsZWZ0OiAwLAoJCQkJCWJlaGF2aW9yOiAic21vb3RoIiwKCQkJCX0pOwoJCQl9CgkJfSBlbHNlIHsKCQkJc3RvcFByZXZpZXcoKTsKCQkJdS5wcmV2aWV3KC0xKTsKCQl9Cgl9CgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g5omn6KGM5paH5Lu25LiL6L29CgkgKiBAYXV0aG9yIE1yLkZhbmcKCSAqIEB0aW1lIDIwMjTlubQy5pyIMjDml6UKCSAqIEBwYXJhbSB0eXBlIOaWh+S7tuexu+WeiwoJICovCgljb25zdCBleGVjdXRlRG93bmxvYWQgPSBhc3luYyAodHlwZSkgPT4gewoJCWRvd25UeXBlID0gdHlwZTsKCQljb25zdCBkb3duID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Rvd24nKTsKCQljb25zb2xlLmxvZygnZG93bicsIGRvd24pCgkJY29uc29sZS5sb2coJ2hvc3QnLCBob3N0KQoJCWNvbnNvbGUubG9nKCdkb3duVHlwZScsIGRvd25UeXBlKQoJCWlmICghZG93bikgewoJCQkvLyDnu5PmnZ/lkI7nu63miafooYznmoTmlrnms5UKCQkJaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLmJvb2sxMTgpIHx8IGhvc3QuaW5jbHVkZXMoZG9tYWluLnNoZW5ndG9uZ2VkdSkpIHsKCQkJCWlmIChmaWxlVHlwZS5pbmNsdWRlcygncHB0JykpIHsKCQkJCQljb25kaXRpb25Eb3dubG9hZCgpOwoJCQkJfSBlbHNlIHsKCQkJCQlhd2FpdCBwYXJzZUltYWdlKCkKCQkJCX0KCQkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5yZW5yZW5kb2MpKSB7CgkJCQlhd2FpdCBwYXJzZUltYWdlKCkKCQkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi53ZW5rdSkpIHsKCQkJCWNvbnN0IGRpc3BsYXkgPSB1LnF1ZXJ5KCcjYXBwLXRvcC1yaWdodC10b29sJyk/LnN0eWxlLmRpc3BsYXk7CgkJCQlpZiAoIWRpc3BsYXkgfHwgZGlzcGxheSA9PT0gJ25vbmUnKSB7CgkJCQkJYXdhaXQgZG93bmltZygpCgkJCQl9CgkJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uZG9jaW4pKSB7CgkJCQlpZiAocGFyYW1zLmdldCgndG9JbWcnKSkgewoJCQkJCWF3YWl0IHBhcnNlSW1hZ2UoKQoJCQkJfSBlbHNlIHsKCQkJCQlhd2FpdCBpbWFnZVRvQmFzZTY0KCkKCQkJCQljb25kaXRpb25Eb3dubG9hZCgpOwoJCQkJfQoJCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLm1iYWxpYikgfHwKCQkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmZlaXNodSkgfHwKCQkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLm5zc2kpIHx8CgkJCQlob3N0LmluY2x1ZGVzKGRvbWFpbi5jZWJwdWJzZXJ2aWNlKSB8fAoJCQkJaG9zdC5pbmNsdWRlcyhkb21haW4ud2Vib2ZmaWNlKSB8fAoJCQkJaG9zdC5pbmNsdWRlcyhkb21haW4uc2djYykgfHwKCQkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmdic2VydmljZSkgfHwKCQkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmp0eXNieikKCQkJKSB7CgkJCQljb25kaXRpb25Eb3dubG9hZCgpOwoJCQl9IGVsc2UgaWYgKAoJCQkJaG9zdC5pbmNsdWRlcyhkb21haW4uZG9jODgpIHx8CgkJCQlob3N0LmluY2x1ZGVzKGRvbWFpbi50YW9kb2NzKSB8fAoJCQkJaG9zdC5pbmNsdWRlcyhkb21haW4ubnJzaXMpIHx8CgkJCQlob3N0LmluY2x1ZGVzKGRvbWFpbi5uZWEpIHx8CgkJCQlob3N0LmluY2x1ZGVzKGRvbWFpbi5yYnRlc3QpCgkJCSkgewoJCQkJYXdhaXQgaW1hZ2VUb0Jhc2U2NCgpCgkJCQljb25kaXRpb25Eb3dubG9hZCgpOwoJCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLmRlbGl3ZW5rdSkgfHwKCQkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmN4aykgfHwKCQkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmppbmNodXRvdSkgfHwKCQkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLm1heWl3ZW5rdSkgfHwKCQkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmR1Z2VuKSB8fAoJCQkJaG9zdC5pbmNsdWRlcyhkb21haW4uaWFzaykgfHwKCQkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmNob2NoaW5hKSB8fAoJCQkJaG9zdC5pbmNsdWRlcyhkb21haW4ud2Vpemh1YW4pIHx8CgkJCQlob3N0LmluY2x1ZGVzKGRvbWFpbi5zbykgfHwKCQkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLnNhY2luZm8pCgkJCSkgewoJCQkJYXdhaXQgZG93bmltZygpCgkJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uZ2I2ODgpKSB7CgkJCQlpZiAodS5xdWVyeSgnI3ZpZXdlcicpLnN0eWxlLnRyYW5zZm9ybSkgeyAvLyBiZwoJCQkJCWF3YWl0IGRvd25sb2FkR0JJbWFnZSgpOwoJCQkJfSBlbHNlIHsKCQkJCQljb25kaXRpb25Eb3dubG9hZCgpOwoJCQkJfQoJCQl9IGVsc2UgaWYgKGhvc3QuaW5jbHVkZXMoZG9tYWluLmpzamx3KSkgewoJCQkJYXdhaXQgcGFyc2VJbWFnZSgpCgkJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uampnKSkgewoJCQkJYXdhaXQgZG93bmxvYWRFbGVtZW50KCkKCQkJCWNvbmRpdGlvbkRvd25sb2FkKCk7CgkJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4ucXpvZmZpY2UpKSB7CgkJCQlhd2FpdCBoYW5kbGVRem9mZmljZSgpOwoJCQkJY29uZGl0aW9uRG93bmxvYWQoKTsKCQkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi5td3IpKSB7CgkJCQlhd2FpdCBkb3dubG9hZEltYWdlKCk7CgkJCQljb25kaXRpb25Eb3dubG9hZCgpOwoJCQl9CgkJfSBlbHNlIHsKCQkJY29uZGl0aW9uRG93bmxvYWQoKTsKCQl9Cgl9CgkvLyDpo57kuabmiZPljIXkuIvovb0KCWNvbnN0IGJ1aWxkRG93biA9IGFzeW5jICgpID0+IHsKCQljb25zdCBzdHlsZXMgPSBbLi4udS5xdWVyeUFsbCgnc3R5bGUnKV0ubWFwKGRpdiA9PiBkaXYub3V0ZXJIVE1MKS5qb2luKCdcbicpOwoJCWlmICh0aXRsZS5pbmNsdWRlcygnZXhjZWwnKSkgewoJCQljb25zdCBjb250YWluZXIgPSB1LnF1ZXJ5KCcuY29udGFpbmVyJykuaW5uZXJIVE1MOwoJCQljb25zdCBjb250ZW50ID0KCQkJCWA8IURPQ1RZUEUgaHRtbD48aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+JHtzdHlsZXN9PC9oZWFkPjxib2R5IHN0eWxlPSJvdmVyZmxvdzogYXV0bzsiPiR7Y29udGFpbmVyfTwvYm9keT48L2h0bWw+YAoJCQljb25zdCBodG1sQmxvYiA9IG5ldyBCbG9iKFtjb250ZW50XSwgewoJCQkJdHlwZTogInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IgoJCQl9KTsKCQkJemlwV3JpdGVyLmFkZCgnaW5kZXguaHRtbCcsIG5ldyB6aXAuQmxvYlJlYWRlcihodG1sQmxvYikpCgkJCXppcFdyaXRlci5hZGQoJ2luZGV4LnR4dCcsIG5ldyB6aXAuVGV4dFJlYWRlcih1LnF1ZXJ5KCcuY29udGFpbmVyJykuaW5uZXJUZXh0KSkKCQl9IGVsc2UgaWYgKHRpdGxlLmluY2x1ZGVzKCd0eHQnKSkgewoJCQljb25zdCBjb250YWluZXIgPSB1LnF1ZXJ5KCcjc2Nyb2xsLWNvbnRhaW5lcicpLmlubmVySFRNTDsKCQkJY29uc3QgY29udGVudCA9CgkJCQlgPCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiPiR7c3R5bGVzfTwvaGVhZD48Ym9keT4ke2NvbnRhaW5lcn08L2JvZHk+PC9odG1sPmAKCQkJY29uc3QgaHRtbEJsb2IgPSBuZXcgQmxvYihbY29udGVudF0sIHsKCQkJCXR5cGU6ICJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIKCQkJfSk7CgkJCXppcFdyaXRlci5hZGQoJ2luZGV4Lmh0bWwnLCBuZXcgemlwLkJsb2JSZWFkZXIoaHRtbEJsb2IpKQoJCQl6aXBXcml0ZXIuYWRkKCdpbmRleC50eHQnLCBuZXcgemlwLlRleHRSZWFkZXIodS5xdWVyeSgnI3Njcm9sbC1jb250YWluZXInKS5pbm5lclRleHQpKQoJCX0KCQlhd2FpdCB1LnNsZWVwKDUwMCkKCQlkb3duemlwKCk7CgkJdS5wcmVUZXh0KCfkuIvovb3lrozmiJAnKQoJfQoKCS8qKgoJICog5qC55o2u5oyH5a6a5p2h5Lu25LiL6L295paH5Lu2CgkgKi8KCWNvbnN0IGNvbmRpdGlvbkRvd25sb2FkID0gKCkgPT4gewoJCWlmIChkb3duVHlwZSA9PT0gMSkgewoJCQlkb3ducGRmKCkKCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Rvd24nLCAnMScpCgkJfSBlbHNlIGlmIChkb3duVHlwZSA9PT0gMikgewoJCQlkb3duemlwKCkKCQkJaWYgKCFob3N0LmluY2x1ZGVzKGRvbWFpbi5xem9mZmljZSkpIC8vIOaOkumZpCBxegoJCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Rvd24nLCAnMScpCgkJfQoJCXUucHJlVGV4dCgn5LiL6L295a6M5oiQJykKCX0KCgkvLyDmu5rliqjmjIflrpogV2luZG93Cgljb25zdCBzY3JvbGxXaW5BcmVhID0gKCkgPT4gewoJCWJlZm9yZSgpOwoJCWNvbnN0IHNjcm9sbFRvcCA9IGRvbS5zY3JvbGxUb3A7CgkJY29uc3QgaGVpZ2h0ID0gZG9tLnNjcm9sbEhlaWdodCAtIGRvbS5jbGllbnRIZWlnaHQ7CgkJaWYgKGhlaWdodCA8PSBzY3JvbGxUb3ApIHsKCQkJc3RvcEJlZm9yZVByZXZpZXcoKTsKCQl9IGVsc2UgewoJCQlsZXQgdG9wID0gc2Nyb2xsVG9wICsgNTAwOwoJCQlkb20uc2Nyb2xsVG8oewoJCQkJdG9wOiB0b3AsCgkJCQlsZWZ0OiAwLAoJCQkJYmVoYXZpb3I6ICJzbW9vdGgiLAoJCQl9KTsKCQkJdS5wcmV2aWV3KHRvcCwgaGVpZ2h0KTsKCQl9Cgl9CgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g5Yik5patIGRvbSDmmK/lkKblnKjlj6/op4bojIPlm7TlhoUKCSAqIEBhdXRob3IgTXIuRmFuZwoJICogQHRpbWUgMjAyNC02LTI1CgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbAoJICovCgljb25zdCBpc0VsZW1lbnRJblZpZXdwb3J0ID0gKGVsKSA9PiB7CgkJY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXJldHVybiAoCgkJCXJlY3QudG9wID49IDAgJiYgcmVjdC50b3AgPD0gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KQoJCSk7Cgl9CgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g5Zu+54mH5re75Yqg5YiwIHppcCDmiJYgcGRmCgkgKiBAYXV0aG9yIE1yLkZhbmcKCSAqIEB0aW1lIDIwMjQtNi0yNQoJICogQHNlZSBodHRwOi8vcmF3LmdpdGhhY2suY29tL01yUmlvL2pzUERGL21hc3Rlci9kb2NzL21vZHVsZS1hZGRJbWFnZS5odG1sI35hZGRJbWFnZQoJICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTENhbnZhc0VsZW1lbnQgfCBVaW50OEFycmF5IHwgUkdCQURhdGF9IGltYWdlRGF0YQoJICogQHBhcmFtIHtCbG9ifSBibG9iCgkgKiBAcGFyYW0ge051bWJlcn0gaSDkuIvmoIcKCSAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCDlrr0gCgkgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IOmrmAoJICogQHBhcmFtIHtCb29sZWFufSBuYXR1cmFsIOWOn+Wni+mrmOW6puWuveW6piB0cnVlIOWOn+Wni+WwuuWvuCBmYWxzZSBBNAoJICovCgljb25zdCBzYXZlSW1hZ2VBbmRQREYgPSAoaW1hZ2VEYXRhLCBibG9iLCBpLCB3aWR0aCwgaGVpZ2h0LCBuYXR1cmFsID0gZmFsc2UpID0+IHsKCQlsZXQgZGlyID0gJ3AnOwoJCWxldCB0YXJnZXRfdyA9IHBkZl93OwoJCWxldCB0YXJnZXRfaCA9IHBkZl9oOwoJCWlmICh3aWR0aCA+IGhlaWdodCkgewoJCQlkaXIgPSAnbCc7CgkJCXRhcmdldF9oID0gcGRmX3c7CgkJCXRhcmdldF93ID0gcGRmX2g7CgkJfQoJCWlmIChuYXR1cmFsKSB7CgkJCXRhcmdldF9oID0gaGVpZ2h0ICogcGRmX3JhdGlvOwoJCQl0YXJnZXRfdyA9IHdpZHRoICogcGRmX3JhdGlvOwoJCX0gZWxzZSB7CgkJCXRhcmdldF9oID0gdGFyZ2V0X2g7CgkJCXRhcmdldF93ID0gdGFyZ2V0X3c7CgkJfQoKCQl6aXBXcml0ZXIuYWRkKGAke2l9LnBuZ2AsIG5ldyB6aXAuQmxvYlJlYWRlcihibG9iKSk7CgkJZG9jLmFkZFBhZ2UoW3RhcmdldF93LCB0YXJnZXRfaF0sIGRpcik7CgkJZG9jLmFkZEltYWdlKGltYWdlRGF0YSwgJ0pQRUcnLCAwLCAwLCB0YXJnZXRfdywgdGFyZ2V0X2gsIGksICdGQVNUJykKCQlpZiAoZG9jLmludGVybmFsLnBhZ2VzWzFdLmxlbmd0aCA9PT0gMikgewoJCQlkb2MuZGVsZXRlUGFnZSgxKTsgLy8g5Yig6Zmk56m655m96aG1CgkJfQoJfQoKCS8qKgoJICogQGRlc2NyaXB0aW9uIOS/neWtmOaVsOaNrgoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI0LTYtMjUKCSAqIEBwYXJhbSB7TnVtYmVyfSBpIOS4i+aghwoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gaW1hZ2VEYXRhIOWbvueJh+WvueixoQoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdGV4dExheWVyIOaWh+acrOWvueixoQoJICovCgljb25zdCBwcmV2aWV3U2F2ZSA9IGFzeW5jIChpLCBpbWFnZURhdGEsIHRleHRMYXllcikgPT4gewoJCWNvbnN0IHsKCQkJYmxvYiwKCQkJd2lkdGgsCgkJCWhlaWdodAoJCX0gPSBhd2FpdCBNRl9DYW52YXNUb0Jhc2U2NChpbWFnZURhdGEpOwoJCXNhdmVJbWFnZUFuZFBERihpbWFnZURhdGEsIGJsb2IsIGksIHdpZHRoLCBoZWlnaHQsIGZhbHNlKQoJCS8v6I635Y+W5paH5pys5YaF5a65CgkJbGV0IHRleHRzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnU1BfdGV4dCcpKSB8fCBbXTsKCQl0ZXh0cy5wdXNoKGZpbGVUeXBlLmluY2x1ZGVzKCdkb2MnKSA/IHRleHRMYXllci5pbm5lclRleHQgOiB0ZXh0TGF5ZXIudGV4dENvbnRlbnQpOwoJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCdTUF90ZXh0JywgSlNPTi5zdHJpbmdpZnkodGV4dHMpKQoJCS8vIOabtOaWsOS4i+aghwoJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCdTUF9pbmRleCcsIGkgKyAxKTsKCX0KCgkvKioKCSAqIEBkZXNjcmlwdGlvbiDpooTop4gm5LiL6L29CgkgKiBAYXV0aG9yIE1yLkZhbmcKCSAqIEB0aW1lIDIwMjQtNi0yNQoJICovCgljb25zdCBzY3JvbGxQcmV2aWV3ID0gYXN5bmMgKCkgPT4gewoJCWlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oInN0YXJ0IikpIHsKCQkJdS5wcmV2aWV3KC0xLCBudWxsLCAi5bey57uI5q2iIik7CgkJCXJldHVybjsKCQl9CgkJYmVmb3JlKCk7CgkJY29uc3QgaSA9IE51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnU1BfaW5kZXgnKSkgfHwgMDsKCQljb25zdCBjaGlsZHJlbnMgPSB1LnF1ZXJ5QWxsKHNlbGVjdCk7CgkJY29uc3QgY3VycmVudCA9IGNoaWxkcmVuc1tpXTsKCQljb25zdCBsZW5ndGggPSBjaGlsZHJlbnMubGVuZ3RoOwoJCS8vIOWmguaenOW9k+WJjeWvueixoeWcqOWPr+inhuiMg+WbtOWGhe+8jOi/m+ihjOS/neWtmOa3u+WKoAoJCWxldCBkYXRhTG9hZGVkOwoJCWxldCBpbWFnZURhdGEgPSBjdXJyZW50LnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcycpOwoJCWlmICghaW1hZ2VEYXRhKSB7CgkJCWltYWdlRGF0YSA9IGN1cnJlbnQucXVlcnlTZWxlY3RvcignLmNhbnZhc1dyYXBwZXIgY2FudmFzJyk7CgkJCWRhdGFMb2FkZWQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1sb2FkZWQnKQoJCX0KCQljb25zdCB0ZXh0TGF5ZXIgPSBjdXJyZW50LnF1ZXJ5U2VsZWN0b3IoJy50ZXh0TGF5ZXInKTsKCQlpZiAoKGRhdGFMb2FkZWQgfHwgaXNFbGVtZW50SW5WaWV3cG9ydChjdXJyZW50KSkgJiYgaW1hZ2VEYXRhICYmIHRleHRMYXllcikgewoJCQlhd2FpdCBwcmV2aWV3U2F2ZShpLCBpbWFnZURhdGEsIHRleHRMYXllcikKCQkJaWYgKGkgIT09IGxlbmd0aCAtIDEpCgkJCQljaGlsZHJlbnNbaSArIDFdLnNjcm9sbEludG9WaWV3KHsKCQkJCQliZWhhdmlvcjogInNtb290aCIKCQkJCX0pOwoJCX0gZWxzZSB7CgkJCWN1cnJlbnQuc2Nyb2xsSW50b1ZpZXcoewoJCQkJYmVoYXZpb3I6ICJzbW9vdGgiCgkJCX0pOwoJCX0KCQl1LnByZXZpZXcoaSwgbGVuZ3RoKTsKCQlpZiAoaSAhPT0gbGVuZ3RoIC0gMSkgewoJCQlsZXQgc3BlZWQgPSA1MDAsCgkJCQlNRl9zcGVlZCA9IE51bWJlcih1LnF1ZXJ5KCcjTUZfc3BlZWQnKS5pbm5lclRleHQpOwoJCQlpZiAoTUZfc3BlZWQgPiAwKSB7CgkJCQlzcGVlZCA9IE1GX3NwZWVkCgkJCX0gZWxzZSB7CgkJCQl1LnF1ZXJ5KCcjTUZfc3BlZWQnKS5pbm5lclRleHQgPSA1MDAKCQkJfQoJCQlzZXRUaW1lb3V0KCgpID0+IHsKCQkJCWNvbnNvbGUubG9nKHNwZWVkLCAnbXMg5ZCO5omn6KGMJyk7CgkJCQlzY3JvbGxQcmV2aWV3KCkKCQkJfSwgc3BlZWQpCgkJfSBlbHNlIHsKCQkJY29uc29sZS5sb2coJ+aJp+ihjOe7k+adnycpOwoJCQl1LnByZXZpZXcoLTEpOwoJCQlsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnU1BfaW5kZXgnKQoJCQlsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnc3RhcnQnKQoJCX0KCX0KCgkvLyDmu5rliqjmjIflrpogV2luZG93Cgljb25zdCBzY3JvbGxXaW5BcmVhVGFvID0gKCkgPT4gewoJCWNvbnN0IHNjcm9sbFRvcCA9IGRvbS5zY3JvbGxUb3A7CgkJY29uc3QgaGVpZ2h0ID0gZG9tLnNjcm9sbEhlaWdodCAtIGRvbS5jbGllbnRIZWlnaHQ7CgkJY29uc3QgZmMyZSA9IHUucXVlcnkoJy5mYzJlJyk7CgkJbGV0IGVuZCA9IDA7CgkJY29uc3QgaW1hZ2VzID0gdS5xdWVyeUFsbChzZWxlY3QpOwoJCWNvbnN0IGxlbmd0aCA9IGltYWdlcy5sZW5ndGg7CgkJZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJCQlsZXQgaXRlbSA9IGltYWdlc1tpXTsKCQkJY29uc3QgewoJCQkJdG9wCgkJCX0gPSBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCQlpZiAoaXRlbS53aWR0aCA9PT0gMzAwIHx8IGl0ZW0uaGVpZ2h0ID09IDE1MCkgewoJCQkJZW5kID0gMTsKCQkJCWRvbS5zY3JvbGxUbyh7CgkJCQkJdG9wOiBkb20uc2Nyb2xsVG9wICsgdG9wLAoJCQkJCWxlZnQ6IDAsCgkJCQkJYmVoYXZpb3I6ICJzbW9vdGgiLAoJCQkJfSk7CgkJCQl1LnByZXZpZXcoZG9tLnNjcm9sbFRvcCArIHRvcCwgaGVpZ2h0KTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmIChlbmQgPT09IDApIHsKCQkJaWYgKCFmYzJlKSB7CgkJCQlzdG9wUHJldmlldygpOwoJCQkJdS5wcmV2aWV3KC0xKTsKCQkJfSBlbHNlIHsKCQkJCWJlZm9yZSgpCgkJCX0KCQl9Cgl9CgkvLyDmu5rliqjmjIflrprljLrln58KCWNvbnN0IHNjcm9sbFBhZ2VBcmVhID0gKCkgPT4gewoJCWJlZm9yZSgpOwoJCWNvbnN0IGNsaWVudEhlaWdodCA9IGRvbS5jbGllbnRIZWlnaHQ7CgkJbGV0IGVuZCA9IDA7CgkJY29uc3QgaW1hZ2VzID0gdS5xdWVyeUFsbChzZWxlY3QpOwoJCWNvbnN0IGxlbmd0aCA9IGltYWdlcy5sZW5ndGg7CgkJZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJCQlsZXQgaXRlbSA9IGltYWdlc1tpXTsKCQkJY29uc3QgewoJCQkJdG9wCgkJCX0gPSBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHsKCQkJCWlmICghaXRlbS5zcmMgJiYgIWl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXNyYycpKSB7CgkJCQkJZW5kID0gMTsKCQkJCQlkb20uc2Nyb2xsVG8oewoJCQkJCQl0b3A6IGRvbS5zY3JvbGxUb3AgKyB0b3AsCgkJCQkJCWxlZnQ6IDAsCgkJCQkJCWJlaGF2aW9yOiAic21vb3RoIiwKCQkJCQl9KTsKCQkJCQl1LnByZXZpZXcoaSArIDEsIGxlbmd0aCk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEhUTUxEaXZFbGVtZW50KSB7CgkJCQllbmQgPSAxOwoJCQkJZG9tLnNjcm9sbFRvKHsKCQkJCQl0b3A6IGRvbS5zY3JvbGxUb3AgKyB0b3AsCgkJCQkJbGVmdDogMCwKCQkJCQliZWhhdmlvcjogInNtb290aCIsCgkJCQl9KTsKCQkJCXUucHJldmlldyhpICsgMSwgbGVuZ3RoKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmIChlbmQgPT09IDApIHsKCQkJdS5wcmV2aWV3KC0xKTsKCQkJc3RvcFByZXZpZXcoKTsKCQl9Cgl9CgoJLy8g6YGT5a6i5rua5Yqo5Ye95pWwCgljb25zdCBzY3JvbGxQYWdlQXJlYURvYzg4ID0gKCkgPT4gewoJCWJlZm9yZSgpOwoJCWNvbnN0IGNsaWVudEhlaWdodCA9IGRvbS5jbGllbnRIZWlnaHQ7CgkJbGV0IGVuZCA9IDA7CgkJY29uc3QgaW1hZ2VzID0gdS5xdWVyeUFsbChzZWxlY3QpOwoJCWNvbnN0IGxlbmd0aCA9IGltYWdlcy5sZW5ndGg7CgkJY29uc3Qgc3RhcnROdW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcGFnZU51bUlucHV0IikudmFsdWUgLSAxIHx8IDA7CgkJZm9yIChsZXQgaSA9IHN0YXJ0TnVtOyBpIDwgbGVuZ3RoOyBpKyspIHsKCQkJbGV0IGl0ZW0gPSBpbWFnZXNbaV07CgkJCWNvbnN0IHsKCQkJCXRvcAoJCQl9ID0gaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCQkJbGV0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcgPSBpdGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmcucHJldmlvdXNFbGVtZW50U2libGluZzsKCQkJbGV0IGZzID0gdS5hdHRyKGl0ZW0sICdmcycpOwoJCQlsZXQgdCA9IHByZXZpb3VzRWxlbWVudFNpYmxpbmcuaW5uZXJUZXh0OwoJCQlpZiAodC5sZW5ndGggIT09IDApIHsKCQkJCWVuZCA9IDE7CgkJCQlpdGVtLnNjcm9sbEludG9WaWV3KHsKCQkJCQliZWhhdmlvcjogInNtb290aCIKCQkJCX0pOwoJCQkJdS5wcmV2aWV3KGkgKyAxLCBsZW5ndGgpOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYgKGVuZCA9PT0gMCkgewoJCQl1LnByZXZpZXcoLTEpOwoJCQlzdG9wUHJldmlldygpOwoJCX0KCX0KCgljb25zdCBzY3JvbGxQYWdlQXJlYURvY0dCID0gKCkgPT4gewoJCS8vIDEwMCUg6aKE6KeICgkJaWYgKHUucXVlcnkoJyNzY2FsZVNlbGVjdCcpLnNlbGVjdGVkSW5kZXggPCA5KSB7CgkJCXUucXVlcnkoJyN6b29tSW4nKS5jbGljaygpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCWNvbnN0IGNsaWVudEhlaWdodCA9IGRvbS5jbGllbnRIZWlnaHQ7CgkJbGV0IGVuZCA9IDA7CgkJY29uc3QgZWxzID0gdS5xdWVyeUFsbChzZWxlY3QpOwoJCWNvbnN0IGxlbmd0aCA9IGVscy5sZW5ndGg7CgkJZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJCQlsZXQgaXRlbSA9IGVsc1tpXTsKCQkJaWYgKHUuYXR0cihpdGVtLCAnYmcnKSkgewoJCQkJZW5kID0gMTsKCQkJCWl0ZW0uc2Nyb2xsSW50b1ZpZXcoewoJCQkJCWJlaGF2aW9yOiAic21vb3RoIgoJCQkJfSk7CgkJCQl1LnByZXZpZXcoaSArIDEsIGxlbmd0aCk7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlpZiAoZW5kID09PSAwKSB7CgkJCXUucHJldmlldygtMSk7CgkJCXN0b3BQcmV2aWV3KCk7CgkJfQoJfQoKCWNvbnN0IHNjcm9sbFBhZ2VBcmVhSkpHID0gKCkgPT4gewoJCWxldCBlbmQgPSAwOwoJCS8vIOaUvuWkpwoJCWlmICh1LnF1ZXJ5KCcuZndyLXJiLXpvb20tYm94IGlucHV0JykudmFsdWUgPT09ICcxMDAlJykgewoJCQl1LnF1ZXJ5KCcuZndyLXJiLWJvdHRvbS16b29taW4nKS5jbGljaygpOwoJCQlyZXR1cm47CgkJfQoJCWNvbnN0IHBhZ2VzID0gdS5xdWVyeSgiLmZ3ci1yYi1ib3R0b20tdGFicyBpbnB1dCIpLnZhbHVlLnNwbGl0KCcvJyk7CgkJY29uc3QgZWxzID0gdS5xdWVyeUFsbChzZWxlY3QpOwoJCWNvbnN0IGxlbmd0aCA9IGVscy5sZW5ndGg7CgkJZm9yIChsZXQgaSA9IE51bWJlcihwYWdlc1swXS50cmltKCkpIC0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CgkJCWNvbnN0IGl0ZW0gPSBlbHNbaV07CgkJCWNvbnN0IHBhZ2UgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5md3ItcGFnZS10aWxlJykKCQkJaWYgKCFwYWdlKSB7CgkJCQllbmQgPSAxOwoJCQkJdS5xdWVyeSgnLmZ3ci1yYi1ib3R0b20tcGFnZS1uZXh0JykuY2xpY2soKTsKCQkJCXUucHJldmlldyhpICsgMSwgbGVuZ3RoKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmIChlbmQgPT09IDApIHsKCQkJdS5wcmV2aWV3KC0xKTsKCQkJc3RvcFByZXZpZXcoKTsKCQl9Cgl9CgoJLyoqCgkgKiBjYW52YXMg6L2sIGJsb2Ig5a+56LGhCgkgKiDlr7zlh7rlhajpg6jmjIkgQTQg5qC85byP5a+85Ye677yM5pa55L6/5YW85a655aSn6YOo5YiG5paH5qGj77yM5pSv5oyB5qiq56uW5qC85byPCgkgKi8KCWNvbnN0IGltYWdlVG9CYXNlNjQgPSBhc3luYyAoKSA9PiB7CgkJY29uc3QgaW1hZ2VzID0gdS5xdWVyeUFsbChzZWxlY3QpOwoJCWNvbnN0IGxlbmd0aCA9IGltYWdlcy5sZW5ndGg7CgkJZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJCQljb25zdCBpdGVtID0gaW1hZ2VzW2ldOwoJCQlpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uZG9jODgpKSB7CgkJCQlsZXQgcHJldmlvdXNFbGVtZW50U2libGluZyA9IGl0ZW0ucHJldmlvdXNFbGVtZW50U2libGluZy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOwoJCQkJbGV0IHQgPSBwcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlubmVyVGV4dDsKCQkJCWlmICh0Lmxlbmd0aCAhPT0gMCkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCWxldCB7CgkJCQlibG9iLAoJCQkJd2lkdGgsCgkJCQloZWlnaHQKCQkJfSA9IGF3YWl0IE1GX0NhbnZhc1RvQmFzZTY0KGl0ZW0pOwoJCQlzYXZlSW1hZ2VBbmRQREYoaXRlbSwgYmxvYiwgaSwgd2lkdGgsIGhlaWdodCwgaG9zdC5pbmNsdWRlcyhkb21haW4uZG9jODgpIHx8IGhvc3QuaW5jbHVkZXMoCgkJCQlkb21haW4ucmJ0ZXN0KSkKCQkJYXdhaXQgdS5wcmV2aWV3KGkgKyAxLCBsZW5ndGgpOwoJCX0KCQljb25zb2xlLmxvZygn5aSE55CG5a6M5oiQJywgbGVuZ3RoKTsKCX0KCgkvKioKCSAqIEBkZXNjcmlwdGlvbiDljp/liJvlipsgUFBUIOino+aekAoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI05bm0MuaciDIx5pelCgkgKi8KCWNvbnN0IGF1dG9QYXJzaW5nUFBUID0gYXN5bmMgKCkgPT4gewoJCWlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oInN0YXJ0IikpIHsKCQkJdS5wcmV2aWV3KC0xLCBudWxsLCAi5bey57uI5q2iIik7CgkJCXJldHVybjsKCQl9CgkJY29uc3QgcGFnZSA9IE51bWJlcih1LnF1ZXJ5KCcjUGFnZUluZGV4JykuaW5uZXJUZXh0KTsKCQljb25zdCB0b3RhbCA9IE51bWJlcih1LnF1ZXJ5KCcjUGFnZUNvdW50JykuaW5uZXJUZXh0KTsKCQljb25zdCBjaGlsZE5vZGVzID0gdS5xdWVyeSgiI3ZpZXciKS5jaGlsZE5vZGVzOwoJCWNvbnN0IGNvdW50ID0gY2hpbGROb2Rlcy5sZW5ndGg7CgkJY29uc3QgbWF4X2luZGV4ID0gcGFnZSAtIDE7CgkJY29uc3QgY3VycmVudCA9IHUucXVlcnkoIiN2aWV3IiArIG1heF9pbmRleCk7CgkJLy8g5Yqo5L2c5pWw6YePCgkJY29uc3QgYV9sZW4gPSB1LnF1ZXJ5QWxsKGAjdmlldyR7bWF4X2luZGV4fSAjYW5pbXQke21heF9pbmRleH0+ZGl2YCkubGVuZ3RoOwoJCWlmIChhX2xlbiAhPT0gMCkgewoJCQlhd2FpdCB1LnNsZWVwKDEwMDApOwoJCX0KCQljb25zdCBiZ3MgPSBNRl9SZWN1cnNpdmVQYXJzaW5nSW1hZ2VzKGN1cnJlbnQpOwoJCWF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CgkJCWh0bWwyY2FudmFzKGN1cnJlbnQsIHsKCQkJCXVzZUNPUlM6IHRydWUsCgkJCQlsb2dnaW5nOiBmYWxzZSwKCQkJfSkudGhlbihmdW5jdGlvbihjYW52YXMpIHsKCQkJCWxldCBmaWxlTmFtZSA9IG1heF9pbmRleCArICJfIiArIGFfbGVuICsgIi5wbmciOwoJCQkJLy8g5bCGY2FudmFz6L2s5o2i5Li65Zu+54mH5bm25LiL6L29LgoJCQkJY2FudmFzLnRvQmxvYihibG9iID0+IHsKCQkJCQkJemlwV3JpdGVyLmFkZChmaWxlTmFtZSwgbmV3IHppcC5CbG9iUmVhZGVyKGJsb2IpKTsKCQkJCQl9LAoJCQkJCSJpbWFnZS9wbmciLAoJCQkJCTEpOwoJCQkJLy8g5re75YqgUERGCgkJCQkvLyA3OTRweCoxMTIzcHggOwoJCQkJZG9jLmFkZFBhZ2UoW2NhbnZhcy53aWR0aCAqIHBkZl9yYXRpbywgY2FudmFzLmhlaWdodCAqIHBkZl9yYXRpb10sICdsJyk7CgkJCQlkb2MuYWRkSW1hZ2UoY2FudmFzLCAnSlBFRycsIDAsIDAsIGNhbnZhcy53aWR0aCAqIHBkZl9yYXRpbywgY2FudmFzCgkJCQkJLmhlaWdodCAqCgkJCQkJcGRmX3JhdGlvLCBtYXhfaW5kZXggKyAiXyIgKyBhX2xlbiwgJ0ZBU1QnKQoJCQkJaWYgKG1heF9pbmRleCA9PT0gMSkgewoJCQkJCWRvYy5kZWxldGVQYWdlKDEpOwoJCQkJfQoJCQkJcmVzb2x2ZSgpOwoJCQl9KTsKCQl9KQoJCWlmIChhX2xlbiA9PT0gMCkgewoJCQl0cnkgewoJCQkJY29uc3QgZGV0YWlsID0gYmdzLm1hcCgoaXRlbSwgaSkgPT4gewoJCQkJCXJldHVybiB6aXBXcml0ZXIuYWRkKG1heF9pbmRleCArICIvIiArIGkgKyAiLnBuZyIsIG5ldyB6aXAuSHR0cFJlYWRlcigKCQkJCQkJaXRlbSkpOwoJCQkJfSk7CgkJCQlhd2FpdCBQcm9taXNlLmFsbChkZXRhaWwpOwoJCQkJemlwV3JpdGVyLmFkZChtYXhfaW5kZXggKyAiLyIgKyAi5paH5pys5o+P6L+wLnR4dCIsIG5ldyB6aXAuVGV4dFJlYWRlcihjdXJyZW50LmlubmVyVGV4dCkpOwoJCQl9IGNhdGNoIChlKSB7CgkJCQljb25zb2xlLmVycm9yKGUpOwoJCQl9CgkJfQoJCXUucHJldmlldyhwYWdlLCB0b3RhbCk7CgkJY29uc3QgcGFnZU5leHQgPSB1LnF1ZXJ5KCcjcGFnZU5leHQnKTsKCQljb25zdCBidG1SaWdodCA9IHUucXVlcnkoJy5idG1SaWdodCcpOwoKCQlpZiAocGFnZSAhPT0gdG90YWwpIHsKCQkJYnRtUmlnaHQuY2xpY2soKTsKCQkJYXdhaXQgYXV0b1BhcnNpbmdQUFQoKTsKCQl9Cgl9CgoJLyoqCgkgKiDplK7nm5jkuovku7Yg4oaQ5bemIOWPs+KGkgoJICovCgljb25zdCB0cmlnZ2VyS2V5RXZlbnQgPSAoZWxlbWVudCwga2V5ID0gJ3JpZ2h0JywgdHlwZSkgPT4gewoJCXZhciBldmVudCA9IG5ldyBLZXlib2FyZEV2ZW50KHR5cGUsIHsKCQkJYnViYmxlczogdHJ1ZSwKCQkJY2FuY2VsYWJsZTogdHJ1ZSwKCQkJa2V5OiBrZXksCgkJCWtleUNvZGU6IGtleSA9PT0gJ2xldGYnID8gMzcgOiAzOSwgLy8gMzfmmK/lt6bnrq3lpLTvvIwzOeaYr+WPs+eureWktAoJCQl3aGljaDoga2V5ID09PSAnbGV0ZicgPyAzNyA6IDM5CgkJfSk7CgkJZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKCX0KCgkvKioKCSAqIEBkZXNjcmlwdGlvbiDnm5vpgJrmlZnogrIgUFBUIOino+aekAoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI05bm0NeaciDEw5pelCgkgKi8KCWNvbnN0IGF1dG9TaGVuZ1RvbmdQYXJzaW5nUFBUID0gYXN5bmMgKCkgPT4gewoJCWlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oInN0YXJ0IikpIHsKCQkJdS5wcmV2aWV3KC0xLCBudWxsLCAi5bey57uI5q2iIik7CgkJCXJldHVybjsKCQl9CgkJY29uc3QgY3VycmVudCA9IHUucXVlcnkoJyNwbGF5ZXJWaWV3ID4gZGl2Om50aC1jaGlsZCgyKScpOwoJCWN1cnJlbnQuc3R5bGUudHJhbnNmb3JtID0gJ25vbmUnCgkJY29uc3QgewoJCQl0b3RhbCwKCQkJcGFnZQoJCX0gPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewoJCQljb25zdCBjaGlsZE5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigKCQkJCSIjcGxheWVyVmlldyA+IGRpdjpudGgtY2hpbGQoMikgPiBkaXY6bnRoLWNoaWxkKDEpID4gZGl2IikuY2hpbGROb2RlczsKCQkJY29uc3QgdG90YWwgPSBjaGlsZE5vZGVzLmxlbmd0aCAtIDE7CgkJCWxldCBwYWdlID0gMTsKCQkJY2hpbGROb2Rlcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gewoJCQkJaWYgKGl0ZW0uY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7CgkJCQkJcGFnZSA9IGluZGV4OwoJCQkJfQoJCQl9KQoJCQlyZXNvbHZlKHsKCQkJCXRvdGFsLAoJCQkJcGFnZQoJCQl9KQoJCX0pCgkJY29uc3QgbWF4X2luZGV4ID0gcGFnZSAtIDE7CgoJCS8vIOWKqOS9nOaVsOmHjwoJCWxldCBhX2xlbiA9IDA7CgkJaWYgKG1heF9pbmRleCA9PT0gTnVtYmVyKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjdXJyZW50UGFnZScpKSkgewoJCQlhX2xlbiA9IE51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY3VycmVudFBhZ2VJbmRleCcpKSArIDE7CgkJfQoJCWlmIChhX2xlbiAhPT0gMCkgewoJCQlhd2FpdCB1LnNsZWVwKDEwMDApOwoJCX0KCQljb25zdCBiZ3MgPSBNRl9SZWN1cnNpdmVQYXJzaW5nSW1hZ2VzKGN1cnJlbnQpOwoJCWF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CgkJCWh0bWwyY2FudmFzKGN1cnJlbnQsIHsKCQkJCXVzZUNPUlM6IHRydWUsCgkJCQlsb2dnaW5nOiBmYWxzZSwKCQkJfSkudGhlbihmdW5jdGlvbihjYW52YXMpIHsKCQkJCS8vIOWwhmNhbnZhc+i9rOaNouS4uuWbvueJh+W5tuS4i+i9vS4KCQkJCWxldCBkYXRhID0gY2FudmFzLnRvRGF0YVVSTCgpOwoKCQkJCWxldCBmaWxlTmFtZSA9IGAke21heF9pbmRleH1fJHthX2xlbn0ucG5nYDsKCQkJCXppcFdyaXRlci5hZGQoZmlsZU5hbWUsIG5ldyB6aXAuRGF0YTY0VVJJUmVhZGVyKGRhdGEpKTsKCQkJCS8vIOa3u+WKoFBERgoJCQkJLy8gNzk0cHgqMTEyM3B4IDsKCQkJCWRvYy5hZGRQYWdlKFtjYW52YXMud2lkdGggKiBwZGZfcmF0aW8sIGNhbnZhcy5oZWlnaHQgKiBwZGZfcmF0aW9dLCAnbCcpOwoJCQkJZG9jLmFkZEltYWdlKGRhdGEsICdKUEVHJywgMCwgMCwgY2FudmFzLndpZHRoICogcGRmX3JhdGlvLCBjYW52YXMKCQkJCQkuaGVpZ2h0ICoKCQkJCQlwZGZfcmF0aW8sIG1heF9pbmRleCArICJfIiArIGFfbGVuLCAnRkFTVCcpCgkJCQlpZiAobWF4X2luZGV4ID09PSAxKSB7CgkJCQkJZG9jLmRlbGV0ZVBhZ2UoMSk7CgkJCQl9CgkJCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY3VycmVudFBhZ2UnLCBtYXhfaW5kZXgpOwoJCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2N1cnJlbnRQYWdlSW5kZXgnLCBhX2xlbik7CgkJCQlyZXNvbHZlKCk7CgkJCX0pOwoJCX0pCgkJaWYgKGFfbGVuID09PSAwKSB7CgkJCXRyeSB7CgkJCQljb25zdCBkZXRhaWwgPSBiZ3MubWFwKChpdGVtLCBpKSA9PiB7CgkJCQkJcmV0dXJuIHppcFdyaXRlci5hZGQobWF4X2luZGV4ICsgIi8iICsgaSArICIucG5nIiwgbmV3IHppcC5IdHRwUmVhZGVyKAoJCQkJCQlpdGVtKSk7CgkJCQl9KTsKCQkJCWF3YWl0IFByb21pc2UuYWxsKGRldGFpbCk7CgkJCQl6aXBXcml0ZXIuYWRkKG1heF9pbmRleCArICIvIiArICLmlofmnKzmj4/ov7AudHh0IiwgbmV3IHppcC5UZXh0UmVhZGVyKGN1cnJlbnQuaW5uZXJUZXh0KSk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCWNvbnNvbGUuZXJyb3IoZSk7CgkJCX0KCQl9CgkJdS5wcmV2aWV3KHBhZ2UsIHRvdGFsKTsKCgkJaWYgKHBhZ2UgIT09IHRvdGFsKSB7CgkJCXRyaWdnZXJLZXlFdmVudChkb2N1bWVudC5ib2R5LCAncmlnaHQnLCAna2V5ZG93bicpOwoJCQl0cmlnZ2VyS2V5RXZlbnQoZG9jdW1lbnQuYm9keSwgJ3JpZ2h0JywgJ2tleXVwJyk7CgkJCWF3YWl0IGF1dG9TaGVuZ1RvbmdQYXJzaW5nUFBUKCk7CgkJfQoJfQoKCS8qKgoJICogQGRlc2NyaXB0aW9uIOi9u+erueWKnuWFrAoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI05bm0NeaciDE35pelCgkgKi8KCWNvbnN0IGhhbmRsZVF6b2ZmaWNlID0gYXN5bmMgKCkgPT4gewoJCWxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdkb3duJykKCQkvLyDpgJLlvZLpgY3ljoYgRE9NIOiKgueCuQoJCWZ1bmN0aW9uIHRyYXZlcnNlRE9NKG5vZGUsIGNhbGxiYWNrKSB7CgkJCWlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkgewoJCQkJY2FsbGJhY2sobm9kZSk7IC8vIOiwg+eUqOWbnuiwg+WHveaVsOWkhOeQhuW9k+WJjeiKgueCuQoJCQkJbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDsgLy8g6I635Y+W56ys5LiA5Liq5a2Q6IqC54K5CgkJCQl3aGlsZSAobm9kZSkgewoJCQkJCXRyYXZlcnNlRE9NKG5vZGUsIGNhbGxiYWNrKTsgLy8g6YCS5b2S6YGN5Y6G5a2Q6IqC54K5CgkJCQkJbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7IC8vIOiOt+WPluS4i+S4gOS4quWFhOW8n+iKgueCuQoJCQkJfQoJCQl9CgkJfQoJCS8vIOafpeaJvuWFt+acieaMh+WumuWxnuaAp+eahCA8aW1hZ2U+IOWFg+e0oAoJCWZ1bmN0aW9uIGZpbmRJbWFnZXNXaXRoQXR0cmlidXRlKG5vZGUpIHsKCQkJdmFyIGltYWdlcyA9IFtdOwoJCQl0cmF2ZXJzZURPTShub2RlLCBmdW5jdGlvbihlbGVtZW50KSB7CgkJCQlpZiAoZWxlbWVudC50YWdOYW1lID09PSAnaW1hZ2UnKSB7CgkJCQkJaW1hZ2VzLnB1c2goZWxlbWVudCk7CgkJCQl9CgkJCX0pOwoJCQlyZXR1cm4gaW1hZ2VzOwoJCX0KCQljb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZW1wbGF0ZUNhbnZhcyIpLmNsb25lTm9kZSh0cnVlKTsKCQl0ZW1wbGF0ZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKCQl0ZW1wbGF0ZS5zdHlsZS5oZWlnaHQgPSAnMHB4JzsKCQl0ZW1wbGF0ZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CgkJdGVtcGxhdGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CgkJLy8g5Zyo5pW05Liq5paH5qGj5Lit5p+l5om+5YW35pyJ5oyH5a6a5bGe5oCn55qEIDxpbWFnZT4g5YWD57SgCgkJY29uc3QgaW1hZ2VzID0gZmluZEltYWdlc1dpdGhBdHRyaWJ1dGUodGVtcGxhdGUpOwoJCWNvbnN0IGltYWdlQXJyYXkgPSBbXTsKCQkvLyDmiZPljbDmib7liLDnmoTlhYPntKAKCQljb25zdCBibG9icyA9IFtdOwoJCXRyeSB7CgkJCWltYWdlcy5mb3JFYWNoKGFzeW5jIChpbWFnZSwgaSkgPT4gewoJCQkJY29uc3QgYW5pbVZhbCA9IGltYWdlLmhyZWYuYW5pbVZhbDsKCQkJCWxldCBpcyA9IGltYWdlQXJyYXkuZmlsdGVyKGl0ZW0gPT4gaXRlbS5ocmVmID09PSBhbmltVmFsKTsKCQkJCWlmIChhbmltVmFsICYmIGlzLmxlbmd0aCA9PT0gMCkgewoJCQkJCWltYWdlLnNldEF0dHJpYnV0ZSgneGxpbms6aHJlZicsIGAuL2ltYWdlcy8ke2l9LnBuZ2ApCgkJCQkJaW1hZ2VBcnJheS5wdXNoKHsKCQkJCQkJbmFtZTogYC4vaW1hZ2VzLyR7aX0ucG5nYCwKCQkJCQkJaHJlZjogYW5pbVZhbAoJCQkJCX0pCgkJCQkJY29uc3QgewoJCQkJCQlibG9iLAoJCQkJCQl3aWR0aCwKCQkJCQkJaGVpZ2h0CgkJCQkJfSA9IGF3YWl0IE1GX0ltYWdlVG9CYXNlNjQoYW5pbVZhbCk7CgkJCQkJemlwV3JpdGVyLmFkZChgaW1hZ2VzLyR7aX0ucG5nYCwgbmV3IHppcC5CbG9iUmVhZGVyKGJsb2IpKTsKCQkJCX0gZWxzZSB7CgkJCQkJaW1hZ2Uuc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywgaXNbMF0ubmFtZSkKCQkJCX0KCQkJfSk7CgkJfSBjYXRjaCAoZSkgewoJCQljb25zb2xlLmxvZyhlKTsKCQl9CgkJY29uc3QgYXZnQXJyYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuY2hpbGQtZWxlbWVudCBzdmciKTsKCQlsZXQgY29udGVudCA9IFtdOwoJCWNvbnN0IG91dGVySFRNTCA9IHRlbXBsYXRlLm91dGVySFRNTDsKCQljb250ZW50LnB1c2gob3V0ZXJIVE1MKTsKCQlmb3IgKGxldCBpID0gMDsgaSA8IGF2Z0FycmF5Lmxlbmd0aDsgaSsrKSB7CgkJCWNvbnN0IGF2Z0FycmF5RWxlbWVudCA9IGF2Z0FycmF5W2ldOwoJCQljb25zdCBjbG9uZU5vZGUgPSBhdmdBcnJheUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpOwoJCQljbG9uZU5vZGUuc3R5bGUucG9zaXRpb24gPSAic3RhdGljIjsKCQkJY2xvbmVOb2RlLnN0eWxlLndpZHRoID0gIjEwMCUiOwoJCQljbG9uZU5vZGUuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwoJCQljbG9uZU5vZGUuc3R5bGUudHJhbnNmb3JtID0gIm5vbmUiOwoJCQljb25zdCBodG1sID0gY2xvbmVOb2RlLm91dGVySFRNTDsKCQkJY29udGVudC5wdXNoKAoJCQkJIjxkaXYgY2xhc3NuYW1lPVwicGFnZS12aWV3XCIgc3R5bGU9XCJ3aWR0aDogMTIwMHB4OyBoZWlnaHQ6IDgyMHB4O1wiPiIgKwoJCQkJaHRtbCArICI8L2Rpdj4iKTsKCQl9CgkJLy8g5re75YqgIGh0bWwKCQljb25zdCBodG1sQmxvYiA9IG5ldyBCbG9iKFsnPCFET0NUWVBFIGh0bWw+JyArIGNvbnRlbnQuam9pbignXG5cbicpXSwgewoJCQl0eXBlOiAidGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiCgkJfSk7CgkJemlwV3JpdGVyLmFkZCgnaW5kZXguaHRtbCcsIG5ldyB6aXAuQmxvYlJlYWRlcihodG1sQmxvYikpCgkJemlwV3JpdGVyLmFkZCgnaW5kZXgudHh0JywgbmV3IHppcC5UZXh0UmVhZGVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50ZXh0cycpLmlubmVyVGV4dCkpCgl9CgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g6Kej5p6Q5Zu+54mHIFtzcmNdCgkgKiBAYXV0aG9yIE1yLkZhbmcKCSAqIEB0aW1lIDIwMjTlubQy5pyIMuaXpQoJICovCgljb25zdCBwYXJzZUltYWdlID0gYXN5bmMgKCkgPT4gewoJCWNvbnN0IGltYWdlcyA9IHUucXVlcnlBbGwoc2VsZWN0KTsKCQlpZiAoIWltYWdlcy5sZW5ndGgpIHsKCQkJdS5sb2coJy0tLS0tLT5wYXJzZUltYWdlIOaaguaXoOaVsOaNricpOwoJCQlyZXR1cm47CgkJfQoJCWNvbnN0IGxpc3REYXRhID0gW107CgkJaW1hZ2VzLmZvckVhY2goKGl0ZW0pID0+IHsKCQkJbGV0IHNyYyA9IHUuYXR0cihpdGVtLCAnZGF0YS1zcmMnKSB8fCBpdGVtLnNyYzsKCQkJaWYgKHNyYy5pbmNsdWRlcygnaHR0cDonKSAmJiBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzJykgewoJCQkJc3JjID0gc3JjLnJlcGxhY2UoImh0dHA6IiwgImh0dHBzOiIpCgkJCX0gZWxzZSBpZiAoc3JjLnN0YXJ0c1dpdGgoIi8vIikpIHsKCQkJCXNyYyA9ICJodHRwczoiICsgc3JjOwoJCQl9CgkJCWlmIChzcmMpIHsKCQkJCWNvbnN0IHBhZ2UgPSB1LmF0dHIoaXRlbSwgJ2RhdGEtcGFnZScpIHx8IHUuYXR0cihpdGVtLnBhcmVudEVsZW1lbnQsICdkYXRhLWlkJyk7CgkJCQlpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uZG9jaW4pKSB7CgkJCQkJY29uc3QgY3VyciA9IE51bWJlcihpdGVtLnBhcmVudEVsZW1lbnQuaWQuc3BsaXQoJ18nKS5wb3AoKSk7CgkJCQkJaWYgKGN1cnIgPj0gc3RhcnRQYWdlTm8gKyAxKSB7CgkJCQkJCWxpc3REYXRhLnB1c2goewoJCQkJCQkJcGFnZSwKCQkJCQkJCXNyYwoJCQkJCQl9KQoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJbGlzdERhdGEucHVzaCh7CgkJCQkJCXBhZ2UsCgkJCQkJCXNyYwoJCQkJCX0pCgkJCQl9CgkJCX0KCQl9KQoJCWNvbnN0IHN0b3JlID0gSlNPTi5zdHJpbmdpZnkobGlzdERhdGEpOwoJCXUubG9ndChsaXN0RGF0YSkKCQl1LmxvZygnc2l6ZTonICsgaW1hZ2VzLmxlbmd0aCk7CgkJR01fc2V0VmFsdWUoJ2xpc3REYXRhJywgc3RvcmUpOwoJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCdsaXN0RGF0YScsIHN0b3JlKQoJCXUubG9nKCctLS0tLS0tLS0+ZG93bmltZycpOwoJCWxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjdXJyZW50JykKCQlkb3duaW1nKCkKCX0KCgkvKioKCSAqIEBkZXNjcmlwdGlvbiDkuIvovb3lm77niYcKCSAqIEBhdXRob3IgTXIuRmFuZwoJICogQHRpbWUgMjAyNOW5tDLmnIgy5pelCgkgKi8KCWNvbnN0IGRvd25pbWcgPSBhc3luYyAoKSA9PiB7CgkJY29uc3QgaW1hZ2VzID0gSlNPTi5wYXJzZShHTV9nZXRWYWx1ZSgnbGlzdERhdGEnKSk7CgkJY29uc3QgbGVuZ3RoID0gaW1hZ2VzLmxlbmd0aDsKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbGVuZ3RoJywgbGVuZ3RoKTsKCQlsZXQgY3VycmVudCA9IE51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY3VycmVudCIpKSB8fCAwOwoJCXUubG9nKCdkb3duaW1nLS0tLS0tLS0tLS0+Y3VycmVudDonICsgY3VycmVudCkKCQlmb3IgKGxldCBpbmRleCA9IGN1cnJlbnQ7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CgkJCWNvbnN0IGltYWdlID0gaW1hZ2VzW2luZGV4XTsKCQkJY29uc3Qgc3JjID0gaW1hZ2Uuc3JjOwoJCQlpZiAoc3JjLmluY2x1ZGVzKGhvc3QpKSB7IC8vIOW9k+WJjeWfnwoJCQkJY29uc3QgewoJCQkJCXVpbnQ4LAoJCQkJCWJsb2IsCgkJCQkJd2lkdGgsCgkJCQkJaGVpZ2h0CgkJCQl9ID0gYXdhaXQgTUZfSW1hZ2VUb0Jhc2U2NChzcmMpOwoJCQkJaWYgKGZpbGVUeXBlLmluY2x1ZGVzKCdwcHQnKSB8fCB3aWR0aCA+IGhlaWdodCkgewoJCQkJCWRvYy5hZGRQYWdlKFt3aWR0aCAqIHBkZl9yYXRpbywgaGVpZ2h0ICogcGRmX3JhdGlvXSwgJ2wnKTsKCQkJCQlkb2MuYWRkSW1hZ2UodWludDgsICdKUEVHJywgMCwgMCwgd2lkdGggKiBwZGZfcmF0aW8sIGhlaWdodCAqIHBkZl9yYXRpbywgaW5kZXgsCgkJCQkJCSdGQVNUJykKCQkJCX0gZWxzZSB7CgkJCQkJZG9jLmFkZFBhZ2UoKTsKCQkJCQlkb2MuYWRkSW1hZ2UodWludDgsICdKUEVHJywgMCwgMCwgcGRmX3csIHBkZl9oLCBpbmRleCwgJ0ZBU1QnKQoJCQkJfQoJCQkJaWYgKGluZGV4ID09PSAxKSB7CgkJCQkJZG9jLmRlbGV0ZVBhZ2UoMSk7CgkJCQl9CgkJCQl6aXBXcml0ZXIuYWRkKGluZGV4ICsgIi5wbmciLCBuZXcgemlwLkJsb2JSZWFkZXIoYmxvYikpOwoJCQkJY3VycmVudCA9IGluZGV4OwoJCQkJYXdhaXQgdS5wcmV2aWV3KGN1cnJlbnQsIGxlbmd0aCk7CgkJCX0gZWxzZSB7CgkJCQljb25zdCB1cmwgPSBuZXcgVVJMKHNyYyk7CgkJCQljb25zdCBhdHRySWQgPSB1cmwuaG9zdC5yZXBsYWNlQWxsKCIuIiwgIiIpCgkJCQljb25zdCBxdWVyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcjJyArIGF0dHJJZCk7CgkJCQlpZiAocXVlcnkpIHsgLy8g5qGG5p625piv5ZCm5a2Y5ZyoCgkJCQkJcGFyZW50TWVzc2FnZShzcmMsICIjIiArIGF0dHJJZCk7CgkJCQl9IGVsc2UgewoJCQkJCWNvbnN0IGVsID0gdS5jcmVhdGVFbCgiIyIgKyBhdHRySWQsICdpZnJhbWUnKTsKCQkJCQllbC5zcmMgPSB1cmwub3JpZ2luICsgJz9jdXN0b209dHJ1ZSc7CgkJCQkJZWwuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOwoJCQkJCWRvY3VtZW50LmJvZHkuYXBwZW5kKGVsKTsKCQkJCX0KCQkJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjdXJyZW50JywgaW5kZXggKyAiIik7CgkJCQl1LnByZXZpZXcoY3VycmVudCwgbGVuZ3RoKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCS8vIOmdnuW9k+WJjeWfn+S4i+i9veaWh+S7tuS4i+agh+S8muWkmuWKoOS4gOS4quaVsOWAvAoJCWlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY3VycmVudCIpKSB7CgkJCWN1cnJlbnQgLT0gMTsKCQl9CgkJY29uc29sZS5sb2coJ2N1cnJlbnQnLCBjdXJyZW50KTsKCQlpZiAoY3VycmVudCA9PT0gbGVuZ3RoIC0gMSkgewoJCQljb25kaXRpb25Eb3dubG9hZCgpOwoJCX0KCX0KCgkvKioKCSAqIOWbvueJh+S4i+i9vSAKCSAqLwoJY29uc3QgZG93bmxvYWRJbWFnZSA9IGFzeW5jICgpID0+IHsKCQljb25zdCBpbWFnZXMgPSBbLi4udS5xdWVyeUFsbChzZWxlY3QpXTsKCQljb25zdCBsZW4gPSBpbWFnZXMubGVuZ3RoOwoJCWZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKCQkJY29uc3QgaW1hZ2UgPSBpbWFnZXNbaV0KCQkJY29uc3QgY2FudmFzID0gYXdhaXQgTUZfSW1hZ2VUb0NhbnZhcyhpbWFnZSk7CgkJCWNvbnN0IHsKCQkJCWJsb2IsCgkJCQl3aWR0aCwKCQkJCWhlaWdodAoJCQl9ID0gYXdhaXQgTUZfQ2FudmFzVG9CYXNlNjQoY2FudmFzKTsKCQkJc2F2ZUltYWdlQW5kUERGKGNhbnZhcywgYmxvYiwgaSwgd2lkdGgsIGhlaWdodCwgZmFsc2UpOwoJCQl1LnByZXZpZXcoaSwgbGVuKTsKCQl9Cgl9CgoJY29uc3QgZG93bmxvYWRFbGVtZW50ID0gYXN5bmMgKCkgPT4gewoJCWNvbnN0IG5vZGVzID0gdS5xdWVyeUFsbCgnI2RvY1ZpZXdlcl9WaWV3Q29udGFpbmVyIC5md3ItcGFnZS10aWxlJyk7CgkJY29uc3QgbGVuID0gbm9kZXMubGVuZ3RoOwoJCWZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKCQkJY29uc3Qgbm9kZSA9IG5vZGVzW2ldCgkJCWNvbnN0IHsKCQkJCWJsb2IsCgkJCQljYW52YXMKCQkJfSA9IGF3YWl0IE1GX0ltYWdlU3RpdGNoaW5nVG9DYW52YXMobm9kZSk7CgkJCXNhdmVJbWFnZUFuZFBERihjYW52YXMsIGJsb2IsIGksIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCwgdHJ1ZSk7CgkJCXUucHJldmlldyhpLCBsZW4pOwoJCX0KCX0KCgljb25zdCBNRl9JbWFnZVRvQ2FudmFzID0gKGltYWdlKSA9PiB7CgkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKCQkJY29uc3QgY2FudmFzID0gdS5jcmVhdGVFbCgnJywgJ2NhbnZhcycpOwoJCQljb25zdCB7CgkJCQluYXR1cmFsV2lkdGg6IHdpZHRoLAoJCQkJbmF0dXJhbEhlaWdodDogaGVpZ2h0CgkJCX0gPSBpbWFnZTsKCQkJY2FudmFzLndpZHRoID0gd2lkdGg7CgkJCWNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7CgkJCWxldCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKCQkJY3R4LmZpbGxTdHlsZSA9ICcjRkZGRkZGJzsKCQkJY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwoJCQljdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKCQkJcmVzb2x2ZShjYW52YXMpOwoJCX0pCgl9CgoJLyoqCgkgKiBiZyBwZGYg5LiL6L29CgkgKi8KCWNvbnN0IGRvd25sb2FkR0JJbWFnZSA9IGFzeW5jICgpID0+IHsKCQljb25zdCBlbHMgPSB1LnF1ZXJ5QWxsKHNlbGVjdCk7CgkJY29uc3QgbGVuZ3RoID0gZWxzLmxlbmd0aDsKCQlmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CgkJCWxldCBpdGVtID0gZWxzW2ldOwoJCQljb25zdCB7CgkJCQlibG9iLAoJCQkJY2FudmFzCgkJCX0gPSBhd2FpdCBNRl9JbWFnZVBvc2l0aW9uVG9CYXNlNjQoaXRlbSk7CgkJCWlmICghYmxvYikgewoJCQkJY29udGludWU7CgkJCX0KCQkJc2F2ZUltYWdlQW5kUERGKGNhbnZhcywgYmxvYiwgaSwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0LCB0cnVlKQoJCQlhd2FpdCB1LnByZXZpZXcoaSArIDEsIGxlbmd0aCk7CgkJfQoJCS8vIOmdnuW9k+WJjeWfn+S4i+i9veaWh+S7tuS4i+agh+S8muWkmuWKoOS4gOS4quaVsOWAvAoJCWNvbmRpdGlvbkRvd25sb2FkKCk7Cgl9CgoKCS8qKgoJICogQHBhcmFtIHtTdHJpbmd9IHVybCDor7fmsYLlnLDlnYAKCSAqLwoJY29uc3QgcmVxdWVzdEdldCA9ICh1cmwpID0+IHsKCQlyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewoJCQl2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJCXhoci5vcGVuKCJHRVQiLCB1cmwsIHRydWUpOwoJCQkvLyB4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL2pzb24iKTsKCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewoJCQkJaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7CgkJCQkJaWYgKHhoci5zdGF0dXMgPT09IDIwNiB8fCB4aHIuc3RhdHVzID09PSAyMDApIHsKCQkJCQkJdHJ5IHsKCQkJCQkJCWxldCByZXNwb25zZVRleHQgPSB4aHIucmVzcG9uc2VUZXh0OwoJCQkJCQkJbGV0IHJlc3VsdCA9IHJlc3BvbnNlVGV4dC5zdWJzdHJpbmcocmVzcG9uc2VUZXh0LmluZGV4T2YoJ1woJykgKyAxLAoJCQkJCQkJCXJlc3BvbnNlVGV4dC5sZW5ndGggLSAxKTsKCQkJCQkJCXUubG9nKHJlc3VsdCkKCQkJCQkJCXJlc29sdmUoSlNPTi5wYXJzZShyZXN1bHQpKTsKCQkJCQkJfSBjYXRjaCAoZSkgewoJCQkJCQkJcmVqZWN0KGUpOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJcmVqZWN0KG5ldyBFcnJvcihgSFRUUCBzdGF0dXMgY29kZSAke3hoci5zdGF0dXN9YCkpOwoJCQkJCX0KCQkJCX0KCQkJfTsKCQkJeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHsKCQkJCXJlamVjdChuZXcgRXJyb3IoIk5ldHdvcmsgZXJyb3IiKSk7CgkJCX07CgkJCXhoci5zZW5kKCk7CgkJfSk7Cgl9CgoJLyoqCgkgKiDlpI3liLbliLDliarliIfmnb8KCSAqIEBwYXJhbSB0ZXh0CgkgKi8KCWNvbnN0IGNvcHlUb0NsaXBib2FyZCA9ICh0ZXh0KSA9PiB7CgkJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsKCQlpbnB1dC52YWx1ZSA9IHRleHQ7CgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbnB1dCk7CgkJaW5wdXQuc2VsZWN0KCk7CgkJZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKTsKCQlkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlucHV0KTsKCX0KCgkvKioKCSAqIEBkZXNjcmlwdGlvbiDpgJrov4fmjqXlj6Pojrflj5bmlofmnKzlhoXlrrkKCSAqIEBhdXRob3IgTXIuRmFuZwoJICogQHRpbWUgMjAyNOW5tDLmnIgyMOaXpQoJICovCgljb25zdCBmdWxsVGV4dCA9IGFzeW5jICgpID0+IHsKCQlsZXQgdGV4dCA9ICcnOwoJCWlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi53ZW5rdSkpIHsKCQkJY29uc3QgcGFnZURhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYWdlRGF0YScpKTsKCQkJaWYgKHBhZ2VEYXRhKSB7CgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VEYXRhLmxlbmd0aDsgaSsrKSB7CgkJCQkJbGV0IHVybCA9IHBhZ2VEYXRhW2ldLnNyYzsKCQkJCQlsZXQgcmVzdWx0RGF0YSA9IGF3YWl0IHJlcXVlc3RHZXQodXJsKTsKCQkJCQlpZiAocmVzdWx0RGF0YSBpbnN0YW5jZW9mIEFycmF5KSB7CgkJCQkJCXRleHQgKz0gcmVzdWx0RGF0YVswXS5wYXJhZ3NbMF0uYzsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXN1bHREYXRhLmJvZHkuZm9yRWFjaChpdGVtID0+IHsKCQkJCQkJCWlmICh0eXBlb2YgaXRlbS5jID09PSAic3RyaW5nIikgewoJCQkJCQkJCXRleHQgKz0gaXRlbS5jOwoJCQkJCQkJfQoJCQkJCQl9KQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXRleHQgPSB1LnF1ZXJ5KCcucWwtZWRpdG9yJykuaW5uZXJUZXh0OwoJCQl9CgoJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4ubWJhbGliKSB8fAoJCQlob3N0LmluY2x1ZGVzKGRvbWFpbi5mZWlzaHUpIHx8CgkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmNlYnB1YnNlcnZpY2UpIHx8CgkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLnNnY2MpIHx8CgkJCWhvc3QuaW5jbHVkZXMoZG9tYWluLmp0eXNieikpIHsKCQkJY29uc3QgdGV4dHMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJTUF90ZXh0IikpIHx8IFtdCgkJCWZvciAobGV0IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKCQkJCWxldCB0ID0gdGV4dHNbaV07CgkJCQl0ZXh0ICs9IGBcblxuPT09PeesrCR7aSsxfemhtT09PT1cblxuYCArIHQ7CgkJCX0KCQkJbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ1NQX3RleHQnKQoJCX0gZWxzZSBpZiAoaG9zdC5pbmNsdWRlcyhkb21haW4uZG9jODgpKSB7CgkJCS8vIGNvbnN0IHRleHRzID0gQ29yZS5hcGkuX1ZNOwoJCQljb25zdCB0ZXh0cyA9IENvcmUuYXBpLl9iZjsKCQkJaWYgKCF0ZXh0cykgewoJCQkJYWxlcnQoJ+ayoeacieaWh+acrOWGheWuuScpCgkJCQlyZXR1cm4KCQkJfQoJCQlmb3IgKGxldCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7CgkJCQl0ZXh0ICs9IGBcblxuPT09PeesrCR7aSsxfemhtT09PT1cblxuYCArIHRleHRzW2ldOwoJCQl9CgkJfSBlbHNlIGlmIChob3N0LmluY2x1ZGVzKGRvbWFpbi50YW9kb2NzKSkgewoJCQljb25zdCB0ZXh0cyA9IHUucXVlcnlBbGwoJyNjYW52YXMgLnRleHRMYXllcicpOwoJCQlmb3IgKGxldCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7CgkJCQlsZXQgdCA9IHRleHRzW2ldOwoJCQkJdGV4dCArPSBgXG5cbj09PT3nrKwke2krMX3pobU9PT09XG5cbmA7CgkJCQl0ZXh0ICs9IHQuaW5uZXJUZXh0OwoJCQl9CgkJfQoJCU1GX0V4cG9ydFR4dCh0ZXh0LCBgJHt0aXRsZX0udHh0YCk7Cgl9CgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g5LiL6L295Y6L57yp5YyF77yM5YyF5ZCr5Zu+54mHCgkgKiBAYXV0aG9yIE1yLkZhbmcKCSAqIEB0aW1lIDIwMjTlubQy5pyIMuaXpQoJICovCgljb25zdCBkb3duemlwID0gKCkgPT4gewoJCS8vIOS/ruaUueaXoOazleinpuWPkea1j+iniOWZqOS4i+i9vemXrumimCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3N5c3RlbW1pbi9raWxsLWRvYy9pc3N1ZXMvOAoJCXppcFdyaXRlci5jbG9zZSgpLnRoZW4oYmxvYiA9PiB7CgkJCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwoJCQlsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwoJCQlsaW5rLmRvd25sb2FkID0gYCR7dGl0bGV9LnppcGA7CgoJCQkvLyDop6blj5HkuIvovb0KCQkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTsKCQkJbGluay5jbGljaygpOwoJCQlkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspOwoJCX0pLmNhdGNoKGVycm9yID0+IHsKCQkJY29uc29sZS5lcnJvcihlcnJvcik7CgkJfSk7Cgl9CgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g5LiL6L29IFBERgoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI05bm0MuaciDLml6UKCSAqLwoJY29uc3QgZG93bnBkZiA9ICgpID0+IHsKCQkvLyDkuIvovb0gUERGIOaWh+S7tgoJCWRvYy5zYXZlKGAke3RpdGxlfS5wZGZgLCB7CgkJCXJldHVyblByb21pc2U6IHRydWUKCQl9KTsKCX0KCgkvKioKCSAqIEBkZXNjcmlwdGlvbiDkuIvovb0gdHh0IOaWh+acrAoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI05bm0MuaciDLml6UKCSAqLwoJY29uc3QgZG93bnR4dCA9ICgpID0+IHsKCQljb25zdCBpbWFnZXMgPSBKU09OLnBhcnNlKEdNX2dldFZhbHVlKCdsaXN0RGF0YScpKTsKCQljb25zdCB0ZXh0ID0gaW1hZ2VzLm1hcChpdGVtID0+IHsKCQkJcmV0dXJuIGl0ZW0uc3JjCgkJfSkuam9pbigiXG4iKTsKCQlNRl9FeHBvcnRUeHQodGV4dCwgYCR7dGl0bGV9LnR4dGApOwoJfQoKCS8qKgoJICogQGRlc2NyaXB0aW9uIOmAkuW9kuWKoOi9veWtkOiKgueCue+8jOiOt+WPluWtkOiKgueCueiDjOaZr++8jGltZyDlsZ7mgKflgLwKCSAqIEBhdXRob3IgTXIuRmFuZwoJICogQHRpbWUgMjAyNOW5tDHmnIgyMOaXpTE4OjA1OjQ5CgkgKiBAcGFyYW0gY2hpbGRyZW4KCSAqIEByZXR1cm5zIHsqW119CgkgKi8KCWNvbnN0IE1GX1JlY3Vyc2l2ZVBhcnNpbmdJbWFnZXMgPSAoY2hpbGRyZW4pID0+IHsKCQljb25zdCBsaXN0ID0gW107CgkJaWYgKGNoaWxkcmVuLmNoaWxkTm9kZXMubGVuZ3RoKSB7CgkJCWNoaWxkcmVuLmNoaWxkTm9kZXMuZm9yRWFjaChpdGVtID0+IHsKCQkJCWlmIChpdGVtIHx8IGl0ZW0gaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7CgkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7IC8vIOWbvueJhwoJCQkJCQlsZXQgc3JjID0gaXRlbS5zcmM7CgkJCQkJCWxpc3QucHVzaChzcmMpOwoJCQkJCX0gZWxzZSBpZiAoaXRlbS5zdHlsZSkgewoJCQkJCQlsZXQgYmdpID0gaXRlbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U7CgkJCQkJCWlmIChiZ2kgJiYgYmdpICE9PSAnaW5pdGlhbCcgJiYgYmdpLmluY2x1ZGVzKCd1cmwnKSkgewoJCQkJCQkJbGV0IHNyYyA9IGJnaS5zdWJzdHJpbmcoYmdpLmluZGV4T2YoIlwiIikgKyAxLCBiZ2kubGFzdEluZGV4T2YoCgkJCQkJCQkJIlwiIikpOwoJCQkJCQkJc3JjID0gc3JjLmluZGV4T2YoIi8iKSA9PT0gMCA/IHNyYyA6ICIvIiArIHNyYzsKCQkJCQkJCWxpc3QucHVzaChvcmlnaW4gKyBzcmMpOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWlmIChpdGVtLmNoaWxkTm9kZXMubGVuZ3RoKSB7CgkJCQkJCWNvbnN0IGltYWdlcyA9IE1GX1JlY3Vyc2l2ZVBhcnNpbmdJbWFnZXMoaXRlbSk7CgkJCQkJCWxpc3QucHVzaCguLi5pbWFnZXMpOwoJCQkJCX0KCQkJCX0KCQkJfSkKCQl9CgkJcmV0dXJuIGxpc3Q7Cgl9CgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g6I635Y+W5paH5Lu25ZCO57yA5ZCNCgkgKiBAYXV0aG9yIE1yLkZhbmcKCSAqIEB0aW1lIDIwMjTlubQ25pyIMTfml6UxNjozMTowNQoJICogQHBhcmFtIHtuYW1lfSBkYXRhIOaWh+S7tuWQjQoJICogQHJldHVybnMge1N0cmluZ30gc3VmZml4IOWQjue8gCDvvIzpu5jorqQgcGRmCgkgKi8KCWNvbnN0IGdldEZpbGVOYW1lU3VmZml4ID0gKG5hbWUpID0+IHsKCQljb25zdCBsYXN0ID0gbmFtZS5sYXN0SW5kZXhPZigiLiIpOwoJCXJldHVybiBsYXN0ID4gMCA/IG5hbWUuc3Vic3RyaW5nKGxhc3QgKyAxKS50b0xvY2FsZUxvd2VyQ2FzZSgpIDogJ3BkZic7Cgl9OwoKCS8qKgoJICogQGRlc2NyaXB0aW9uIOWvvOWHuiB0eHQg5paH5Lu2CgkgKiBAYXV0aG9yIE1yLkZhbmcKCSAqIEB0aW1lIDIwMjTlubQx5pyIMjDml6UxODowNTo0OQoJICogQHBhcmFtIHtPYmplY3R9IGRhdGEg5pWw5o2uCgkgKiBAcGFyYW0ge09iamVjdH0gZmlsZW5hbWUg5paH5Lu25ZCNCgkgKi8KCWNvbnN0IE1GX0V4cG9ydFR4dCA9IChkYXRhLCBmaWxlbmFtZSkgPT4gewoJCWNvbnN0IGNzdkNvbnRlbnQgPSAiZGF0YTp0ZXh0L3R4dDtjaGFyc2V0PXV0Zi04LCIgKyBkYXRhOwoJCWNvbnN0IGVuY29kZWRVcmkgPSBlbmNvZGVVUkkoY3N2Q29udGVudCk7CgkJY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKCQlsaW5rLnNldEF0dHJpYnV0ZSgiaHJlZiIsIGVuY29kZWRVcmkpOwoJCWxpbmsuc2V0QXR0cmlidXRlKCJkb3dubG9hZCIsIGZpbGVuYW1lKTsKCgkJLy8g54K55Ye76ZO+5o6l5Lul5LiL6L295paH5Lu2CgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTsKCQlsaW5rLmNsaWNrKCk7CgkJZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTsKCX0KCgkvKioKCSAqIEBkZXNjcmlwdGlvbiDliqDovb3lm77niYcKCSAqIEBhdXRob3IgTXIuRmFuZwoJICogQHRpbWUgMjAyNOW5tDHmnIgyMOaXpTE4OjA1OjQ5CgkgKiBAcGFyYW0gc3JjIOWbvueJh+WcsOWdgAoJICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59CgkgKi8KCWNvbnN0IE1GX0ltYWdlVG9CYXNlNjQgPSAoc3JjKSA9PiB7CgkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKCQkJLy8gMeOAgeWIm+W7uiBJbWFnZSDlr7nosaEKCQkJY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTsKCQkJLy8gMuOAgW9ubG9hZCDliqDovb3miJDlip/op6blj5EKCQkJaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24oKSB7CgkJCQl0cnkgewoJCQkJCWxldCBjYW52YXMgPSB1LmNyZWF0ZUVsKCcnLCAnY2FudmFzJyk7CgkJCQkJY29uc3QgewoJCQkJCQluYXR1cmFsV2lkdGg6IHdpZHRoLAoJCQkJCQluYXR1cmFsSGVpZ2h0OiBoZWlnaHQKCQkJCQl9ID0gaW1hZ2U7CgkJCQkJY2FudmFzLndpZHRoID0gd2lkdGg7CgkJCQkJY2FudmFzLmhlaWdodCA9IGhlaWdodDsKCQkJCQlsZXQgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CgkJCQkJY3R4LmZpbGxTdHlsZSA9ICcjRkZGRkZGJzsKCQkJCQljdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CgkJCQkJY3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CgkJCQkJY2FudmFzLnRvQmxvYihhc3luYyBibG9iID0+IHsKCQkJCQkJCS8vIGNhbnZhcyDovawgYmxvYiDlr7nosaEKCQkJCQkJCS8vIGJsb2Ig6L2sIHVpbnQ4IOOAgVBERiDpnIDopoEgdWludDgg5a+56LGhCgkJCQkJCQljb25zdCB1aW50OCA9IGF3YWl0IE1GX0Jsb2JUb1VpbnQ4QXJyYXkoYmxvYikKCQkJCQkJCXJlc29sdmUoewoJCQkJCQkJCXVpbnQ4LAoJCQkJCQkJCWJsb2IsCgkJCQkJCQkJd2lkdGgsCgkJCQkJCQkJaGVpZ2h0CgkJCQkJCQl9KTsKCQkJCQkJfSwKCQkJCQkJImltYWdlL3BuZyIsCgkJCQkJCTEsICk7CgkJCQl9IGNhdGNoIChlKSB7CgkJCQkJcmVqZWN0KGUpOwoJCQkJfQoJCQl9CgkJCWltYWdlLm9uZXJyb3IgPSByZWplY3Q7CgkJCWltYWdlLnNyYyA9IHNyYzsKCQl9KQoJfQoKCS8qKgoJICogQGRlc2NyaXB0aW9uIOWfuuS6juiDjOaZr+WbvueJh+WumuS9je+8jOi9rOeUu+W4gwoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI05bm0M+aciDEz5pelCgkgKiBAcGFyYW0gc3JjIOWbvueJh+WcsOWdgAoJICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59CgkgKi8KCWNvbnN0IE1GX0ltYWdlUG9zaXRpb25Ub0Jhc2U2NCA9IChlbCkgPT4gewoJCWNvbnN0IGJhc2VfZ2IgPSAiaHR0cDovL2MuZ2I2ODguY24vYnpnay9nYi8iOwoJCWNvbnN0IHN0eWxlID0gZWwuc3R5bGU7CgkJY29uc3QgY3cgPSBOdW1iZXIoc3R5bGUud2lkdGgucmVwbGFjZSgncHgnLCAnJykpOwoJCWNvbnN0IGNoID0gTnVtYmVyKHN0eWxlLmhlaWdodC5yZXBsYWNlKCdweCcsICcnKSk7CgkJLy8g5omA5pyJ5a2Q6IqC54K5CgkJY29uc3QgY2hpbGRyZW5zID0gZWwuY2hpbGRyZW47CgkJLy8g6IOM5pmv5Zu+54mH5Zyw5Z2A5aSE55CGCgkJaWYgKGNoaWxkcmVucy5sZW5ndGggPCAyKSB7CgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CgkJCQlyZXNvbHZlKHsKCQkJCQlibG9iOiBudWxsCgkJCQl9KQoJCQl9KQoJCX0KCQljb25zdCBpbWFnZVVybCA9IGNoaWxkcmVuc1swXS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U7CgkJY29uc3QgZnVsbFVybCA9IGltYWdlVXJsLnN1YnN0cmluZyg1LCBpbWFnZVVybC5sZW5ndGggLSAyKTsKCQlpZiAoIWltYWdlVXJsKSB7CgkJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CgkJCQlyZXNvbHZlKHsKCQkJCQlibG9iOiBudWxsCgkJCQl9KQoJCQl9KQoJCX0KCQlyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewoJCQkvLyAx44CB5Yib5bu6IEltYWdlIOWvueixoQoJCQljb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpOwoJCQkvLyAy44CBb25sb2FkIOWKoOi9veaIkOWKn+inpuWPkQoJCQlpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbigpIHsKCQkJCXRyeSB7CgkJCQkJbGV0IGNhbnZhcyA9IHUuY3JlYXRlRWwoJycsICdjYW52YXMnKTsKCQkJCQljYW52YXMud2lkdGggPSBjdzsKCQkJCQljYW52YXMuaGVpZ2h0ID0gY2g7CgkJCQkJLy8g6I635Y+W5LiK5LiL5paH5a+56LGhCgkJCQkJY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CgkJCQkJY3R4LmZpbGxTdHlsZSA9ICIjZmZmIjsKCQkJCQljdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKCQkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVucy5sZW5ndGg7IGkrKykgewoJCQkJCQljb25zdCBjaGlsZCA9IGNoaWxkcmVuc1tpXTsKCQkJCQkJY29uc3QgcG9zID0gY2hpbGQuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uLnNwbGl0KCcgJyk7CgkJCQkJCWNvbnN0IGNvb3JkID0gY2hpbGQuY2xhc3NOYW1lLnNwbGl0KCctJyk7CgkJCQkJCWNvbnN0IGR4ID0gTnVtYmVyKGNvb3JkWzFdKTsKCQkJCQkJY29uc3QgZHkgPSBOdW1iZXIoY29vcmRbMl0pOwoJCQkJCQljb25zdCBzeCA9IE1hdGguYWJzKHBvc1swXS5yZXBsYWNlKCdweCcsICcnKSk7CgkJCQkJCWNvbnN0IHN5ID0gTWF0aC5hYnMocG9zWzFdLnJlcGxhY2UoJ3B4JywgJycpKTsKCQkJCQkJY29uc3QgcmVjdCA9IGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCQkJCQljb25zdCB7CgkJCQkJCQl3aWR0aDogc3csCgkJCQkJCQloZWlnaHQ6IHNoCgkJCQkJCX0gPSByZWN0OwoJCQkJCQljdHguZHJhd0ltYWdlKGltYWdlLCBzeCwgc3ksIHN3LCBzaCwgZHggKiBzdywgZHkgKiBzaCwgc3csIHNoKTsKCQkJCQkJaWYgKGkgPT09IGNoaWxkcmVucy5sZW5ndGggLSAxKSB7CgkJCQkJCQkvLyDovawgYmFzZTY0IOi+k+WHugoJCQkJCQkJY2FudmFzLnRvQmxvYigKCQkJCQkJCQkoYmxvYikgPT4gewoJCQkJCQkJCQlyZXNvbHZlKHsKCQkJCQkJCQkJCWJsb2IsCgkJCQkJCQkJCQljYW52YXMKCQkJCQkJCQkJfSk7CgkJCQkJCQkJfSwKCQkJCQkJCQkiaW1hZ2UvcG5nIiwKCQkJCQkJCQkxLAoJCQkJCQkJKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0gY2F0Y2ggKGUpIHsKCQkJCQlyZWplY3QoZSk7CgkJCQl9CgkJCX0KCQkJaW1hZ2Uub25lcnJvciA9IHJlamVjdDsKCQkJaW1hZ2Uuc3JjID0gZnVsbFVybDsKCQl9KQoJfQoKCWNvbnN0IE1GX0ltYWdlU3RpdGNoaW5nVG9DYW52YXMgPSAobm9kZSkgPT4gewoKCQlyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewoJCQl0cnkgewoJCQkJLy8g6I635Y+W5pyA5ZCO5LiA5Liq5YiG6L6o546HIC8gdGlsZXMtbGF5ZXItMTI1IOWIhui+qOeOhy8gZGl2LyDooYwgZGl2IFtpbWddCgkJCQljb25zdCBjaGlsZHJlbiA9IG5vZGUubGFzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbjsKCQkJCWNvbnN0IGZpcnN0Tm9kZSA9IGNoaWxkcmVuWzBdOwoJCQkJLy8g6K6h566X55S75biD5a695bqmCgkJCQljb25zdCBjd2lkdGggPSBbLi4uZmlyc3ROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpXS5yZWR1Y2UoKHN0YXJ0LCBpdGVtKSA9PiBzdGFydCArCgkJCQkJaXRlbS53aWR0aCwgMCk7CgkJCQljb25zdCBjaGVpZ2h0ID0gY2hpbGRyZW4ubGVuZ3RoICogZmlyc3ROb2RlLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpLmhlaWdodDsKCQkJCWNvbnN0IGNhbnZhcyA9IHUuY3JlYXRlRWwoJycsICdjYW52YXMnKTsKCQkJCWNhbnZhcy53aWR0aCA9IGN3aWR0aDsKCQkJCWNhbnZhcy5oZWlnaHQgPSBjaGVpZ2h0OwoJCQkJLy8g6I635Y+W5LiK5LiL5paH5a+56LGhCgkJCQljb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKCQkJCWN0eC5maWxsU3R5bGUgPSAiI2ZmZiI7CgkJCQljdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKCQkJCS8vIOaLvOaOpQoJCQkJZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewoJCQkJCWNvbnN0IGNoaWxzID0gWy4uLmNoaWxkcmVuW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpXTsKCQkJCQlsZXQgaXcgPSAwOwoJCQkJCWZvciAobGV0IGogPSAwOyBqIDwgY2hpbHMubGVuZ3RoOyBqKyspIHsKCQkJCQkJY29uc3QgewoJCQkJCQkJd2lkdGgsCgkJCQkJCQloZWlnaHQKCQkJCQkJfSA9IGNoaWxzW2pdOwoJCQkJCQljdHguZHJhd0ltYWdlKGNoaWxzW2pdLCBpdywgaSAqIGhlaWdodCwgd2lkdGgsIGhlaWdodCk7CgkJCQkJCWl3ICs9IHdpZHRoCgkJCQkJfQoJCQkJfQoJCQkJY2FudmFzLnRvQmxvYigKCQkJCQkoYmxvYikgPT4gewoJCQkJCQlyZXNvbHZlKHsKCQkJCQkJCWJsb2IsCgkJCQkJCQljYW52YXMsCgkJCQkJCX0pOwoJCQkJCX0sCgkJCQkJImltYWdlL3BuZyIsCgkJCQkJMSwKCQkJCSk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCS8vVE9ETyBoYW5kbGUgdGhlIGV4Y2VwdGlvbgoJCQkJcmVqZWN0KGUpCgkJCX0KCgkJfSkKCX0KCgkvKioKCSAqIEBkZXNjcmlwdGlvbiDlm77niYfmi7zmjqXovawgYmxvYgoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI05bm0NuaciDXml6UKCSAqIEBwYXJhbSBlbCDoioLngrnlr7nosaEKCSAqIEByZXR1cm5zIHtQcm9taXNlPGJsb2I+fQoJICovCgljb25zdCBNRl9JbWFnZUpvaW5Ub0Jsb2IgPSAoZWwpID0+IHsKCQlyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewoJCQljb25zdCBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuOwoJCQljb25zdCB7CgkJCQluYXR1cmFsV2lkdGgsCgkJCQluYXR1cmFsSGVpZ2h0CgkJCX0gPSBjaGlsZHJlblswXTsKCQkJLy8gMeOAgeWIm+W7uueUu+W4gwoJCQlsZXQgY2FudmFzID0gdS5jcmVhdGVFbCgnJywgJ2NhbnZhcycpOwoJCQljYW52YXMud2lkdGggPSBuYXR1cmFsV2lkdGggKiA2OwoJCQljYW52YXMuaGVpZ2h0ID0gbmF0dXJhbEhlaWdodDsKCQkJY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CgkJCWN0eC5maWxsU3R5bGUgPSAiI2ZmZiI7CgkJCWN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOwoJCQkvLyAy44CB6I635Y+W5omA5pyJ5Zu+54mH6IqC54K5CgkJCWNvbnN0IGxpc3REYXRhID0gW10KCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewoJCQkJY29uc3QgaW1nID0gY2hpbGRyZW5baV07CgkJCQljb25zdCBsZWZ0ID0gaW1nLnN0eWxlLmxlZnQucmVwbGFjZSgncHgnLCAnJykKCQkJCWxpc3REYXRhLnB1c2goewoJCQkJCWluZGV4OiBpLAoJCQkJCWxlZnQ6IE51bWJlcihsZWZ0KQoJCQkJfSkKCQkJfQoJCQlsaXN0RGF0YS5zb3J0KChhLCBiKSA9PiBhLmxlZnQgLSBiLmxlZnQpOwoJCQkvLyAz44CB6YGN5Y6G57uY5Yi255S75biDCgkJCWZvciAodmFyIGkgPSAwOyBpIDwgbGlzdERhdGEubGVuZ3RoOyBpKyspIHsKCQkJCWNvbnN0IGltZyA9IGNoaWxkcmVuW2xpc3REYXRhW2ldLmluZGV4XTsKCQkJCWN0eC5kcmF3SW1hZ2UoaW1nLCBpICogbmF0dXJhbFdpZHRoLCAwLCBuYXR1cmFsV2lkdGgsIG5hdHVyYWxIZWlnaHQpOwoJCQl9CgkJCS8vIDTjgIHlr7zlh7oKCQkJY2FudmFzLnRvQmxvYigKCQkJCShibG9iKSA9PiB7CgkJCQkJcmVzb2x2ZSh7CgkJCQkJCWJsb2IsCgkJCQkJCWNhbnZhcywKCQkJCQl9KTsKCQkJCX0sCgkJCQkiaW1hZ2UvcG5nIiwKCQkJCTEsCgkJCSk7CgkJfSkKCX0KCgkvKioKCSAqIEBkZXNjcmlwdGlvbiDlsIYgYmxvYiDlr7nosaHovawgdWludDhBcnJheQoJICogQGF1dGhvciBNci5GYW5nCgkgKiBAdGltZSAyMDI05bm0NeaciDI35pelCgkgKiBAcGFyYW0ge09iamVjdH0gYmxvYiDlm77niYflr7nosaEKCSAqIEByZXR1cm5zIHtQcm9taXNlPFVpbnQ4QXJyYXk+fQoJICovCgljb25zdCBNRl9CbG9iVG9VaW50OEFycmF5ID0gKGJsb2IpID0+IHsKCQlyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewoJCQljb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKCQkJZmlsZVJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHsKCQkJCXJlc29sdmUobmV3IFVpbnQ4QXJyYXkodGhpcy5yZXN1bHQpKTsKCQkJfTsKCQkJZmlsZVJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHsKCQkJCXJlamVjdChlcnJvcik7CgkJCX07CgkJCWZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7CgkJfSk7Cgl9CgoJLyoqCgkgKiBAZGVzY3JpcHRpb24g55S75biD6L6T5Ye6IGJsb2Ig5a+56LGhCgkgKiBAYXV0aG9yIE1yLkZhbmcKCSAqIEB0aW1lIDIwMjTlubQx5pyIMjDml6UxODowNTo0OQoJICogQHBhcmFtIHNyYyDlm77niYflnLDlnYAKCSAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59CgkgKi8KCWNvbnN0IE1GX0NhbnZhc1RvQmFzZTY0ID0gKGNhbnZhcykgPT4gewoJCXJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CgkJCWNvbnN0IHsKCQkJCXdpZHRoLAoJCQkJaGVpZ2h0CgkJCX0gPSBjYW52YXM7CgkJCWNhbnZhcy50b0Jsb2IoCgkJCQkoYmxvYikgPT4gewoJCQkJCXJlc29sdmUoewoJCQkJCQlibG9iLAoJCQkJCQl3aWR0aCwKCQkJCQkJaGVpZ2h0CgkJCQkJfSk7CgkJCQl9LAoJCQkJImltYWdlL3BuZyIsCgkJCQkxLAoJCQkpOwoJCX0pCgl9Cn0pKCk7
Add Comment
Please, Sign In to add comment