@agoric/wallet 0.18.4-other-dev-3eb1a1d.0 → 0.18.4-other-dev-d15096d.0.d15096d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/bundles/bundle-wallet-js-meta.json +317 -272
- package/api/bundles/bundle-wallet.js +1 -1
- package/api/package.json +27 -25
- package/api/src/issuerTable.js +2 -2
- package/api/src/types-ambient.js +4 -4
- package/api/test/lib-wallet.test.js +3 -3
- package/api/test/middleware.test.js +2 -0
- package/package.json +7 -6
- package/api/LICENSE +0 -201
|
@@ -1 +1 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAACjlp9HT/kAAE/5AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvd2FsbGV0LmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYmFzZS16b25lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS40LjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaGVhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJoZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2U0ZjMwMDAwMDgzMGIwZDQwYTQ1ZDFkNDUxM2RmODFlMTRiMzUzMWU0YjBiMWMzMzU2N2FkNGQ2YzFjMjI1NDQ0YjYyN2ViYjIzODQ5ZTIwYjgwNzM5ZDYyOTBiYTRmYTVlN2Y4NjgzNDc0Yzc4MGQxZGMzYmE1NDA3MDU2MDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU0NjU1ZTg1OTMxOTg4NDcwYmRkYWIxZmVmNTU2ZWY4YmZiN2UyNjI1MGI2ZWVlNDU1NjBkODBlZDFlM2VmOGQ1YmI4ZTVkMDU4YjYwODVlY2UyZTE3YWYyMTZkODNhYTkzOTA3MGU0ZTJjMTk1MjU4OTg2YjczNjA5OWZhZDljIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhM2ZmMDZjMjY1YjM4NmU3YTBkOTBlMTdkZjQwZDc5OTU0YjFhMTE4N2U5ZDY0OGUxODg4NDdiYWJjNzZkYTM1ZWJkYzkzNjE0MWZlYWUzZTE4ZTNhZTMwYzc4YmQ5MmY3ZTgyMjZmYmNhMTRhZjhkM2Q3ODRlOWJiNjFkYjk2ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMWJjYmRkYTQ3M2Y3ZmQ0MjVlNDdjMzMxODA5NTZkZjEzYmNjYzRjNWU4ZjhlODk5ZmQ0YjlmNWUyODg3YTcxZTg4ZTcxZGMwM2UwOWRmMTg5MGRiZWM0ODI5ODVkMjVhYjJhOTlhMjhmOWE5OWY0NmQzODU4Y2QyN2RiYjMzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MWQyYTg1ZjliMjg5MDc3N2E4MTBjY2VhNzQyY2YzNTg4NmVlMDQ3NDdmMDJjZjRkNjM2NzU0MzU3MjRjYWRhMDBkMThmYWE1NjcxNTZiNmMzMWU5YWNkZjQwNzdlNzk1MDYwZjIyNzEzZDVjN2QwMDRiZGZhZWMxOTgxMDMzZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTA1ZTg3NTdjNzE1MDY5NmRjZjk0NTNiY2ZlNmI0MjM4MDk0MTQ0NDAzODQ2OTc2MzU1MjM4NDAxNjVhZDY2YWI2OTA2M2FhYmQ3NmQyNmNlMzc3MjBmNDFhZjE5N2FmNjE3NzgyYWIyMjMzZmIxZmQyMWMzNDhjZTNlNmY1Y2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1vbmNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLW9uY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ODM5ZGJmMTg0NjFlYmVlM2NjNzE0NjYzMmE3NDk3ZTYwNGMyMGI5Yjc1OGZhMGE2Zjc5NjZiNmMyNTVjODhmNDI1Y2IyZjIzNjIyNjM2ZDlkOWE2MGExM2E1ZmVmYTc3MjkzZGJiNzY4ODRhZjVkMDk4MDNhNzU3ZmRiOGYxMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93YXRjaC1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy93YXRjaC1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDVlZDc3Yzc0ZTczYjM4ZjJkODBkYjYzMDIyZmI4NGM0NTVkNzI5YTI1YjI3ZTZjZjg4NWMxMzQwODkzYWU5YzFiNWFlN2U1NmIzYjZhYWZmNDIwMzk5MTAwMTgxMzVlMmQyOTYyOWYxYmRhNmI0ZTdiMGI0MzRlODE4ZTNmYWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvY2FjaGUtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2NhY2hlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvY2FjaGUtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvY2FjaGUtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FjaGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhY2hlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2RmNWRkNDAxOWQ0MjgyNGRiODg2MWMwM2U4YWQ0OGVhZWYyMDk2ZDUxNDYxNjg5ZjRjZTRkZDE3MWJlM2E2NWIzOGEwYTBiMTViMGI5NDhmNDdhYWYxNmFhMTg0MmQ4MDlkZjc2NzdhNDBhZWRiOTI1ODMwYTlhMTdlNDkxOWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxNGMwYWEwYmRjODljM2NiM2I2MDNhN2Q2NGNiNDA4MzkzZTk0ZGYwNjE3MDg1ZmVlY2U3NDAwMTcyMDUwMTY2NjIzYjczZjZjMGU1YzBhZTk0NDRkMDJmYzIxYjIzYzU4MjhlMzc3NjczYjRlOThhYmYxYmEyOTcxZDRiMjIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0YXRlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdGF0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1MzU0ZmMzMWE3NDE3MWMxOTk3OGIxNjQwNmE0ZDY1N2EyZjRhOTAyYzkyM2M1MGM2ZTc1ODkyOWQzYjdhNTFlMjAyNTQ1OGMwOGQ5NWMzMzAyMzBjZjliNjY0OTBiMTg4NDUxY2I4MTQyMWYzMGNjNjcxYjk3YWY1Zjg2MWIyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY0MmQyY2JkMGY4YmQ4ZmEyZWVkYjFkYmE3NTA3YTI3ZTFiMGExM2M1ZmUzMTg2YjMwZDQzODk2YTFlMTBiNDI4OWM4NjUwYzVjY2FjMTRjNDczNjAyN2I0ZDY2YWE0MGM2NWU3NGUwYjBhMTcyZDVjY2ZiOGU0MTRmMjA1YjMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU0NjU1ZTg1OTMxOTg4NDcwYmRkYWIxZmVmNTU2ZWY4YmZiN2UyNjI1MGI2ZWVlNDU1NjBkODBlZDFlM2VmOGQ1YmI4ZTVkMDU4YjYwODVlY2UyZTE3YWYyMTZkODNhYTkzOTA3MGU0ZTJjMTk1MjU4OTg2YjczNjA5OWZhZDljIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMC4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjQuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzAyNzUxMTMwNzdhNTNiM2M2NWE4NmJlNzk0NzIxNWNmZWQ5YTBmNjUyMTY2OTVkODVkNTkxN2I2NTRkYmQyYTNhNTAwODA0YmY4YmY5YmNiYTM5NzIzZDhlNmQ3MDRkYzYwN2IzOTVlNGNjNTI4ZjY4NzczMDU0NjUxNGVmNGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzA1OTNkOTg3ZTBhMGUzZTNlODRlZjAwN2I2MzJlMjkwMzNiMmExMWM4MDU0M2Q1Yjg4M2Q2NjNjMDRiY2Y1MDdiNGUxZDFhZjEyMTY3YTU3ODkzZGVjMzgxNzU0OGY0YzRmMGRiYjczMjBiMWM0MGY4N2ExMzVmNDA1NzNjY2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGlzcGxheUluZm8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Rpc3BsYXlJbmZvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmNlNmQ4YjM4NDUxM2E1MDUyZDI1YzRkYmI1YjIxZTBkNTc0MmZhYzhhOTQ4OTY4ODY2Zjc3YmI5MjE3Y2EzNzJmOWRiMTMyMjVlOTEyOTAyMGFmZGQ3YmU2OTMxYTNhZWQxNGMyNGE4MTE0YzI1NWNkNzc4YmQ0YWE5NTA5OTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmJmNDAwZWNkZmE5YTBhYWI5OWVhZDgzZjRiMmJjMWJlNmJlMGE1ODI4MDc2ZGZmZGVkNWMxZjdhMDkwZDk4MmZjYjI5NWQ0MzU4ZTIzZWNmMDIyYWM0MDMxNDljYTdiMTgyMWZkMDRjNTY3NGMzNDNlMTc3ODI3OGQyNDdmMWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTAxZjczMDA1YTA1M2Y2Njk4NGE3MDIwNDI2MzVmY2NlMjYxNmI4NmZkM2MxMTAxZGUxMWU5ZTcwNGE1OGEyMjU1NDdjYzFjZDUwNjk3NGMyYzM3MGQ0NmFlYTA1ZjJlMDg5ZTU1MDYzYjI2ZTRlMjhmZjg0OGFiNTEwMWQ4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkZDBlZDBmZjdmMTBiYTU0N2E2MTQxMTI0ZGQyOWZhNzAxM2NkZmQ4ODQ2NTJkOGQzNWM0ZGY4OTQ5OTc2YjM2OWMzMmJjOWQwZmJmODc3NWRmM2E1YTU2ZTBhYzU2NWIyOTQ5ODVkOWU5ZGJiMmE4ODA1YzU0NTVlMGU5ZTQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2NkNDAxZDUyZjc0YWQ1NTQ2YzY5YmVmNzE3OTU3N2ZmYzc4NGE5NzBhNzA0MmE2ZWQ1YmEwMDczNmUzMjgxNWExYzA0OTIzZDE2ZTI0ZWQ0NzgzYzExYzg2ZWYxMzE1NTA5MzdhZDdiNTExNDg5NDkwMDFmMDYzMmEwYjI0OTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjNlMGMyODc0MmEyNTE1OTBkNzE0ZWUzMjBiYzc4Y2FmMjI1NzVhNGZjMmI3MGQ3NjU3YWNmMDM2OTViOTUxZDJjNWEyYmE1YWZhNWQ4NjgyNGVmZmQ2ZTU1MzA3ZGJlN2NjZDlkOTQzZGY4MDA3Y2Q5ZDYxZDI1OTNlM2RhMTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmYwMGUxYjdhODk3M2NlM2EzM2MzNTA1YTc5NTlmMjg1OTZhYjRiZmM1ODAyOTk5OWRhZDRjYzZiOWRhYmQyMjg4YmY2NzRjOWY5NTEwNTYwZWRmNzVkNjY2NjcyOTQzZWU0YjMyNDI4MWVjYzc2ZDNjZTcwMmU4YjQ4ZmY4M2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM2ZjY3NDVlNzJkMzg0YjJmOTUyMjlmMmZmOTliMWFjM2UxNWQ1ODg1NzA1MTU0MTRlNjc5YzA0YTRkYmNlMDNiZWVhOGJkOWQ2NjhhNzA3MTlhYWRjZmI4ZTJjY2RiMGM5OGZkNjM1ZGU2NzRkMmVmNDc2ZGJlOTYyOTZhZWExIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnRMZWRnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnRMZWRnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NmRiZTI2YjJkZjdlMjNlOTQ2NDA3MGU2Y2ZhNjYxODBlYzRmZDhjNmFjMjlkMGM2ZWJhZGRlMGIwMWEwNjE4Nzc2NDAzYjAyNzJiYWVhNzJkNDNjN2NiMTVlNTkyYjMxOGI0Njc2MTkxYjk3YThmYmVlOTEwZGYxMjc4YjU0YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdXJzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVyc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNDIyMDQwNzhmYjY4NDEzMTQwYzhmZjQ5ZTAyODAxMWQyMTBiMDhkNmFlZDc4NDZlYmVjOGU2ODlkYTE1YTdmZGFmM2FjMzk0ZDY2NDcwOWE4YjRlMTAyZjA5NDNmNDAyMWJlZWFiMDZlZjgwZmY0MDNhYjZkOGI2MDQ0YjQ0MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFuc2llbnROb3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTU0NjZkNDg1ZGVmMTNlNjEzNDU5YzcxYmI5MGFiODZjMGFjNTJjN2NmYTkyMGI3ZTRjMDBiOTk0YjEzNzc1ZjNiZTA3MjA0YzgxM2Q4ZWQyYmNmYzFlMjEyNzgyMDY1YmFkZDE1ODk4NmYxYTI4ZDE0ODEzZmExMDFhZmI4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDlkYmViY2JiN2VkOTkxZjk4YWE4NDgyMjA3NTlmMjU0MTI1YTY4OGEwMzgxZmRmNDYwM2FhOTQ5NzQ0ZThmYmNmZTNmNTk0Y2YzNjU5NGM5Yjg3MGFlYzRlMzkzYWU1MjUyNzNkYTY3OTZlNzkzNWUxYjdmMWZmYTdhOWMyNTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTQ2NTVlODU5MzE5ODg0NzBiZGRhYjFmZWY1NTZlZjhiZmI3ZTI2MjUwYjZlZWU0NTU2MGQ4MGVkMWUzZWY4ZDViYjhlNWQwNThiNjA4NWVjZTJlMTdhZjIxNmQ4M2FhOTM5MDcwZTRlMmMxOTUyNTg5ODZiNzM2MDk5ZmFkOWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVybmFsIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9oZWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tZXRhLW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS40LjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jYWxsYmFjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2FsbGJhY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhM2QwOGNjNjIzOGFmODczNmE3OGEzYTI2YzQ2OWIyYmYzMGZlNDE4ODA0YzU3ZTg5MGNlNmYzZWJkNDIzMWRmMjQ3ZGM4YjAwNWU3ZGRkMjM3ZWFhOGNiNWM1ODkxZDA5NWU3ODI0OWQzZjZjM2NlNWNiYmJhMTQzZjViYjM0ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk1YmI4NjhjMjQ1ZTUzN2RjNTIxZmI2Mjc4MGYwNGE5NjkzMmFkNWRjOGNjYTNmNDIyMTkzM2MyZmM2YmFlZmUzOWY2NTM0ZTc5NTFlODU4MzVmNTY2NTcxM2I5MzZmZDM2ZTA0YjFmNmU4ZTA4MjJkZDM1ZGE2YWU2YmU3MGZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlYnVnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWJ1Zy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIyMmJhZTVjMzZkODM5MzFiM2RmN2RmZmQ5Y2NiMGEzM2IxZjIxYTk0NWFhOGI1ZWM3YzdmZGIyMjg4MTNkMGY4ODU4MmYyZTI5ZmFhOTY1NzEwMTk4MDE4ZDVlOWFmYTljMjkzMWUzYjIyYzcxNDE2YWQ0MTY4MzIwOTdhN2IwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjMzZDk1ZmY5M2JlN2FjNGJiN2RlZjFkNzNlMTA5YWY1OTE5ZjRkMmFlYjVhZjA4ZmIwNGQ0MGQ2Yzg3N2RlODBhMjdkNWJiMWE3MjJjZDcxMjk2ZTQ3ZDI2OWJjYWFiODA1NGJlZWNkZmFmMWZjNzBmNTRmMTVlYWFkODVlMTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmZmMTE1ZjJjMDJmMGI1NjM2MDRlZDYxMTdlNzg3YzRlODdjMjZhYjYwYmNiMTMzMWI2ODcwZDNhNTA3ZDRiOWQwNzFhNmMyMzcwOThkYTlkOGJmNTQ5OTU1YTYwMDM0ZmJkOGIwYjM2ZTEyMDg0ZDk3ZTcyZGU3YTBhODY5NDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvanMtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2pzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWM5OTAzMjM0ZDM4YjRkYzQ4M2NmZTRmYWI4MDUzMDJmZTI1NDhlMmZmOGM0ZGQ4OGY2NzI1NzJmZWRiNWQwY2M1NTg5N2YyYzMwMjYxZTY3YjJiZDg5MzQxYzEzYzE4YWQ1YTQxMjlmMDEwNWYxNTEzY2FkZDcxYzczMmIxOTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg3MzFmMWMzMDM2NjAyYWQ5MGQ1OTliMzVhNjA2ZmZiMTI4NjY4YjBmY2YyMDAzYzUzYThiNDgwNDE0YWRkNTFmNGU3YzE2MTFiNjhkM2M4M2Y1MTk1MTE5ZGY1YjQ2ZDVmMjlmNDQxMmI3Y2Q3YjY1ZjFmYzU1MmUwZDBhYzgyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2Y2UwN2UwYjkxMzlhNzIwMTllZmFkMWVmYzMyZDRkZWNhYjg0ODk0ZDA1MDFkOTdjMDJiYjExZmJhMTFiMjIzMDIxMWViNmQ5NzIwNjRhZjY4NDM5MzJhOTRmY2MxMzUzZjhjNGE2ZWMyODU1MGMwODVlZjdmYTQ0NWU4ODMyYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRob2QtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldGhvZC10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgwNDQ1NjlkYzc0YTYyZTQyMGRjOGUzOTE3YjVmYWYxZjdhYTBkZWRlYTA2MTczNDkzNTJiYmFhN2U5ZTA1ZGZhOTBmNmZlZDAwNTg5NjZiMTIxMTIxZWRhODM1YzQxNDA1YWMxNjMwNmRiZmIwNjI5MjUwMzIxOTQwOWFmMDAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Nlcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2VzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmQyZjY4NzI3M2VjNTkxNjU3OTA2MjA1NmM2NWEzODZmMGM5OWNkY2E3YTU5Y2EyMTA4MmE3MDM1YTY0MzAwY2NmYzAzYTEyMzM2MjJiNWExYTMxZjM3MThjMGE4ZTVhZDYwNGJjNjFhZTgyNTE3YzcyOTc0NmE0YTJjYmJjMTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yYWdlLXRlc3QtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjM2EwYWQ4NWNjNTI2NDUzZjU1Y2EyMjVkM2NjNDdjYjA5NmU4NGExMGU5YmMyNjQzZWMwMjA1NTU4NDc2OGFjZWZiYzhiYWQ4OTliMzkyZTViN2MwNzk1ZmJkNjRmMTU0Y2Q3YTM1N2I3NDA5ZDNmMmMzMGRjYTFjMTlkYzBhYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90ZXN0aW5nLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjI2NmYxMGEwYjlhNzMzYTcwZWVkM2NlMWY2YTE0NjcyODNhNjU3OGU5MTUxMzUxMDEyNmY2OGFiY2Q0MWQ4ZTFkNzQ0NDQ3NmI5ZWI5MGU0NzA5ZjU2MjQ0OTczODRhN2U3NDVkYTY4ODJmMTVkMWY2NDBkNGNhYmM4NmVjODQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUNoZWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlQ2hlY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MWU1MjA1MGZkODlmZTc4MTVlZmVjNjI4ZWFhZWIyMDBiN2Y3Y2RkYTg0ZWU3Y2RiYzZmMjAzYzAzZWRlZjA2MTcxYmYyZWM2N2MyMDgxMmY4MzIxYTRlMjU5Y2Q5N2VkODUzNzdjZjU2NDVlNzMxMTQxYzljMjNmN2VlYjU3ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODZmZjdjZDZiNmRkYWZmNTc5YTVhNjFmODIzMWM4NDVmZTM5NDA5YjJkODRmZmY0NzFmYmI3YzZmYzIxOWVhYzg4ZWEyZTY1YmRkODI4OWRkMWQ4YWQ4OWE4Nzc3OWI5MmFjYmJlNjc2NTkxMmI3ZWM3ZjI2OWM2YjMwMjdhNmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTQ2NTVlODU5MzE5ODg0NzBiZGRhYjFmZWY1NTZlZjhiZmI3ZTI2MjUwYjZlZWU0NTU2MGQ4MGVkMWUzZWY4ZDViYjhlNWQwNThiNjA4NWVjZTJlMTdhZjIxNmQ4M2FhOTM5MDcwZTRlMmMxOTUyNTg5ODZiNzM2MDk5ZmFkOWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3VwZ3JhZGUtYXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTBlYzJjNGQwZTU2OWUzM2ZmODdjM2YzNTQ1N2JjZDQ2NzY2OGJjZGQ5ZDJiM2Q3NTA5NWI4N2I5YWViM2IxMzFjOWQ5ZDgzOGM4OWU4MzQ3MzU2YzA3M2UwY2RhZTkzMDQwNDRhYzk1NjQ3OTZkYzk0NzI2NGUxNzZkNGI0YjQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdGVzdGluZy11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS40LjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjliOWM1NDZmYzFiMzJkZDdlMTNjZjM4OGIxNWYwYWJkODk4OTU5ZWJlMTc4YTc3MWRjNzkyNWVlMWQzYWZmMDdiZDg2ZGFkYzAwMjUwNmQ5N2JiMmI5OTA1ZDIxYzNhNjQ5NjNkOGRkZDRjOTM4OGVhNDgzNmU4OWU4OTZiOGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDAxMTAwYWQxZWMwY2MxNTQ1NWNmZmJhYTYwNDAzMDNiMWMzMWZjZDgxODRiOTQ0ZmI5YzdjYWU4NjIxNmMyMDA5ODBjYmY2ZTY4NmI0YjlkY2I0NTM0YmQ4MDQyMDViNzJlZDk3Zjc5ZmE2MTA1YTdmODA5YzZmZGZiNmVlNjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGUwYzY5ODIxNjljMTkyODk0MGFmNjY5NjFkZjlkNzdkZmExN2M4ZTkyNThjN2M3ZGIxYzViMjk3ZTU3MTM0YjhiNTQ3ZTM0M2RiZTZkNTU1YjYwN2YxYzg3M2JkZTJiZmVmMjUwNzI1NTM4Mzc0NmE5NmY4YWU2YTVmNzIzNjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVibGlzaC1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1Ymxpc2gta2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTQyYmMwNDYxNGQ3ZWI5MjMxOTkxODIwYmRkYWQ5ODYxYzRkYTRlZmNhZTg3NGZmMGUxNTY2MGYwN2Y1YTc1ZTE1NDFjMjcxOWM0MTRiMDI0N2I0ZDBiZTJhNTllNDY4N2FlYzI0MWYzNzc4MTNlZTlkNWU1OGNiODBkNWI0MDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZWQtbm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOWM4YTA3ZDc1OTdhNzU1ZjEzMjNiMTdhMzU3ZTJmZWM4ZjRmZGNkMTc3NTNlYjdiNWQyNDc0ODhkNDgxNzcwYmQ3OTU4ODdjZDc3OWMxZGIxN2UyODcwOGNlYWRlOGU3MjQ4N2IzMDVjYTYzZmE4NWNmNDc2ZGYwNDlmYzdjNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXN1Yi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MWU1ZmE4MWY1OWFmMmIzY2QxM2NhZDZjNTdmMjZjNjIxNTE1OGQ3MDQzODQ3NTQzZjIwMmUwZDZjM2NmNGJmNzJkZDNkZWNjYzNiMzMzYzliZGMzNWY0YWE5ODM5NGFhOWZkODU4MGJjOTdkOTQwYzI2YmE0NjdlYTJmZmRlNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ0Y2I4YmU2ZmNiOGEwMzMxYmYyOWQyYTk5NGQ4MmJjZjc1ZGYwODRjZDkyZGY3MzYwY2VkNGQ4NzUzYWRlMjg2YzYxMzZhN2ZkMjQzZThmMDVlZDZkYzlhZmIxMGZjYTc5YmM5OWU1MjEyZDA5ODZhZWRiNDE2YWJlMTg4OWYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOTY2MzFlNTc3NGU3NTQ1OWY1NjE4MGI0MjkxMzFmMzIwZjYxYmI3ODU0NDIzNzdhYTc4MGQ0Nzg1MGRkNWI3NDcwYTk0ODBmMDM5NjI5NDQyMTcwNzMyNWI5OTM1YjEzNTFjNjc3MmRlMzFmOTRjYWYwOWU0OGIxYzJmNTEwZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90b3BpYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YTVhNDZkNzQ1YmMxZjVjMTAxNmFmNjI5NTRjODM0OTBkMTU2ZjVkZmY3MTU5NzU1ZjNjMjU5N2Y4YmFjYzVjMjJhNTBmN2JjY2NlYmVlODYyYmQ4N2Q0NDg0YzBiNjA2NzUzNDQ3NDI5MjczNDU2OTQ4MzE5NDYxMThmMWJiYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NDY1NWU4NTkzMTk4ODQ3MGJkZGFiMWZlZjU1NmVmOGJmYjdlMjYyNTBiNmVlZTQ1NTYwZDgwZWQxZTNlZjhkNWJiOGU1ZDA1OGI2MDg1ZWNlMmUxN2FmMjE2ZDgzYWE5MzkwNzBlNGUyYzE5NTI1ODk4NmI3MzYwOTlmYWQ5YyIKICAgICAgICB9LAogICAgICAgICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ0b29scy90ZXN0U3VwcG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2OTcyZjA4YWZhMDcxYTY0YmU3MmZmNTIwNjZjMWUwOWJjMmY0NDAzNjgwZGZjM2JlN2YzMzJmMTFmYzQyYzc0ZmUzYTM0NTRjYmM1N2JlYjE1MDhmMWJhYWE0YWE2MTRmMzJiNmQwNGJmNGIzZjliMWJjNjliOGE1NTE1OGI2MCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NtYXJ0LXdhbGxldCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMvc3JjL2xpYi1ib2FyZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1ib2FyZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1jb250ZXh0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1jb250ZXh0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE5ZDU1MDI4ZGFkODQyYmZhMzhhNDdkYzA4YTY1ZmFhYWIzMGQ1ZWUyYTQzYTc4Mzg1YjZmYjRlYTUyZDYzMmQ2NzMwYzY5NDU4MGQ1MTU2YmMzMjNjYzc0ZDA3YTE2MTI4ZTk4M2E4MDVmMmVkZGIxZjMwMjVkNjMyZGNmNzhiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N0b3JlLXYwLjkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zdG9yZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MS41LjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjQuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWE4YTFlYjNjNWI3MTNmYTkwZDk2NTFiNDY3NzNhNDQwMWNkNTE5MzYxZWJkMGRhNDZlMjAxMWZhYTA3NDI4YTI0ZmJlYjI5NjRhYzgzMmI0MmQ4MmNkMmQ5NGRlZWI4MjFmNTc1Y2ExM2ZhMWFlZDVjZDNmMGQwMTU3MzZjZTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU4ODQ4NzMyYTI0OGJmM2Q4MjQxZDE5ZWFiOTQwNjZmZDI5MTEwYzVjYjM3YmJmOGE1YzE1YjZlNDRjN2NkOTEwMjVmMTNjOGJjMmRlOGE1NjYxZjhmMjlmMzRiMjE3YzZmMmJhNWIzYzE0OWU2ZGFiOGE0MWNmYWQ5NmE0YThkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRiMGQzM2MxZDVkMWNjZTc4MjZiMzc5NmZmZmNmYjBmOGU5OWM1MzgwMzNhODNjM2I0ODc3ZTA4YmQ5Nzk2YzJhNGMxZmZmYWRjMzI4Y2EwNGVkZTExNjRkNDZjYjI1ZDliYzcwODQ4ZWFkNzVhMjk4MmZjNWIzNDg2ZWI1NTQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDhiODZiMWMyYWM1ZGI2MWY1NjBiYzE1ZmYwNWZjYzUzNTViOTk5ZGYxMjhkMWM4MzQzODM5MzViYmY2ODM3OGVlYmEzZDE3YWUyZDM4ZjU2MjAxNDEzNzgxNzg1ODFlNzhjOGIxNGIwZGNiMzdkMDNiZWY3MTE4NGFlMzRhYjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNjMxMjBjYzE3NmUyMGE0M2NmOWNkOTg1OWZmMmQyNGJhZTdkZDkyMWMxZTBlODJkYTBkYThlMjVhOTk4NjE2NjA0MGIwYmYyZjYwNWZiYTEzNmU4Zjc3MmM1MmUwMzlhZjgyZTU4YTIyODJjMWNmNmY3ZjM3M2RjMzUyNmE5YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTBjZmViMDFlOGYyOWExZWNlYWEyNDEzZDQ3NmRlMzA5NTEzODliNDk3YjM0MmZkNjRjNjJjNWU5Zjc2MGUyOTFmYjY2ZDk3ZWEzYzJhZWFlMjlhNzZkNDA0NDE1MWFkODU0MTU5ODM4MjdmMWUxODllNWI0NmI1ODY1M2E4ODkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNjMTg4NjVkZWU0YjlmMWUxMDU0YWNkNmQxZTRlZmY2ZGMwMGM3N2QxZDBlNTFmZWI3ZjAzM2RmZDQzM2E0MDY2YzA0NjkxNjUwMWJkYjEyZTQ1YjEwY2IwNDIzNTJkYmFlOWQwZWE3ZTU1ZjliMmFjZmJmZjI1MGI1MzNmMjFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjU4OWE2ODFjMjYzNjFmMWE1MzZiMzMzYWY2NDU0ODcwOTcwM2EyYzgwN2EyNTY2MjdhODhjOTU0YTMzNGYwMzg3YmMzNGIyMWExM2Y2NGI0ZWYwYzUwZjAyN2UwYzdkNzM5MzMzN2MwNTdjMDA3OWZmM2FmNjUxMWYxMWNmMGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTQ2NTVlODU5MzE5ODg0NzBiZGRhYjFmZWY1NTZlZjhiZmI3ZTI2MjUwYjZlZWU0NTU2MGQ4MGVkMWUzZWY4ZDViYjhlNWQwNThiNjA4NWVjZTJlMTdhZjIxNmQ4M2FhOTM5MDcwZTRlMmMxOTUyNTg5ODZiNzM2MDk5ZmFkOWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdC1kYXRhIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZWZlMGU1ZWZmOWRkMjAyMDM2OTU0MTg5MzkwOWIyNWUwNWYwMjViNTJjMjU3ZGI4OTZjZDkwYjNhNDk5MzVlYTYzZjZkNjUyOWE1MTIxZjFjNzdiOGMwMGVkYjBhMTkwMmIwNWI3ZTk4YTk2NTFjN2NmZmYwMDVmOWUyNTczNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNmU1ZGRjODI0NDIxOWM2OWFlNTdlOWUxMjFlMjQ2ZTJkMDVkYzM2ODhkOGRkM2RiOWViMmJkZTZmYWMwM2M3NDE5NDhlMWJkNTMwYmYxNGNjNjM5NjFiNzhjYzRjMjUwOWQyYWVkZmZkNzcwYTkwNzU4ODg2MzY4MTIzNTE1OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NDhkMWQ3OTI4Mjc0ZjFkNmJmOWQ5MzBjODI0MmFiZjNiZDYwNmIwNjEzZjUyMWQ3ZGY4MzYwZTkxZTYwYWM1ZmYyNzJlMDQwMzllYjRkZjFjYWY4NmY2Yjk3M2M4NjJlZDQ2OWNmMjgwOGJiMzBlMGY4OTNkN2UxMTJlNWZjOSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXRzLXYwLjE1LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0cyIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdHMtdjAuMTUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdHMtdjAuMTUuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jcmMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NyYy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA0YTFjMTFlOGI0ODk5YzlhM2Y1NDAyOGQ5OWJjZjNmNmNkYjU2OTgxZmI0NWMzZmE4ODJhYzU1MGRkZjc0MjQwYjczYWFlYWUwZTU5ODdhNDQzYTM2ODJjODc4YWRkZjg0YjFlYTkxYjFkODRkMWJmYmU4OWY1NTJiNjJkNWQ1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1ib2FyZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWJvYXJkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzQxMDM3MmRiNjk2YjkxZDVmNDUwOGRiNWQ3OGI3YmMyZjdjNzUzMDY1ZGExZWE0NmRjZWUzNDRmODUyYzM3ZTQzNTcxZjYzM2UxYTUyZTRlYjYwMDkxMzkwMDM3Y2U3MGIyNjUyZDlmOTc1OTlmN2RmNTMxOTVhYTlhNzQxMDAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy93YWxsZXQtYmFja2VuZCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvY2FjaGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9jYWNoZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9qcy11dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2pzLXV0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3N0b3JhZ2UtdGVzdC11dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3N0b3JhZ2UtdGVzdC11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zbWFydC13YWxsZXQvc3JjL21hcnNoYWwtY29udGV4dHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFyc2hhbC1jb250ZXh0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjAuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FjdGlvbnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FjdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMmIzZTNiM2ZjMjU4YTczMmNkMmExNTdmNjg5ZjMzNjc3ZjU1ZTVkN2Q5Y2I0YmFkZmQzNWMzMTZlNTM3YjAxODZmMmI0ZGJiOTQ4OWY5ZTU2ODk3ZmQ3NzhhOTk5MTc1MjY1MzI2OWEwODdlYTNlNTcwZTliNTBlZjg1YzRkNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9iaWdpbnRTdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2JpZ2ludFN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNlYzJhOGE4NzZkODU4MmYwOTgxZjAzZjNmOTBhY2Q2NjM5NmFhZDY5ZDgyNDQ0ZDdjYjViZGRiMDJiNmIwZDcwZTc5YjE2NDY0ZDc5M2E3NTJiYzdmZjc2Y2U1OWM4ODc0YzhmYmZhYzBkMTU2OTc2ZmQ0NjYwYTE4ZDA0Mzg2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RhdGUtbm93LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kYXRlLW5vdy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBmMTVjMzcwYzk5NTdkMjUyOWFmYWU5YzE5NmQxZTlmYzAwY2RlN2FjZTFkYjdkMTE3NDc4NGYyYzVlZDZmZjNjYmZiNDBlZjAyNDVlYmUxNDNhNmE1ZmQ2MWZjNGEyZTIyNTBiY2VkYTNjZWYyYjZkMjJmM2VjZjc1NTJjZjc4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ZpbmRPck1ha2VJbnZpdGF0aW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9maW5kT3JNYWtlSW52aXRhdGlvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUxM2ZhOGU3Nzk2MjllZTkzMGUxOGYyYjQ0NzBiMzE5MjUyN2VjOTY3OTA2NGNiNzkwOTZjYzRkNDI0OWM4YmI2ZDUxMjBhMDIzZWMzM2RhNWUyMzRjN2JiOWFiNWIzN2ZmN2ZiNDIzMDRlMjdlMmZmNGFiZTI0NjdjYWExYjRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ludGVybmFsLXR5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbnRlcm5hbC10eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3NmJlNGUyY2ZmODE4ZDhhMjI2MDUxMTQzNTVmYTNiMDUyYWQyN2Q1N2RlMjk5OTA1OTU1MjU1MmJlZDRhMzliMmIwNDRmOGRmM2RkMWI4MTFhMDI2ZmQ4ZjUyMzVkMmY2ZDE2OWRlNmU1MjdhODI0ZGI3OGI4ZWY0OWMxZWE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlclRhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJUYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViOGU0ZmU0MjA3ODQwNWFiODAzYTk0ZDU1NzFhZjBhYzNjOTUzNGUxYzE3YWQ1YTcyYWUzOGQxNjI4ZTg1YTRmMzg0MTIzOWZiM2IwNTRkYzRmMjk3OTI4NjUxYWIzZmJkMjJmYmYxNzlhZGQyNDg0NThhZTVlMjc5MTQxYjllIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1kZWh5ZHJhdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi1kZWh5ZHJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMDUxNjk1NTNjNTlmYWIzNmI0ZjZkMTc5YWY2OGJmNmUwZjkzZGY1Mjk1Mjc0YWE0MDcxZjE4MDA3ZTM5YzZjYTlhOWIzZWNiODA1YTY1NmM1MWI0MzdhZGIyMmJjZGRjN2I1NjZlYjI2NGJiZDE0NGU0ZjlmN2RjNzljNGUxNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saWItd2FsbGV0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItd2FsbGV0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjFiZTZlYzc1NWRkNTRhOWRkN2QxM2M1OTExZmUyYjFmNGFiYjcwYjUzYTg5YjA5ZThlMWYwYWYzYmZjZTg5MmJlNmNmNGRhZDhlZjdhMWNkYzUwODAwNDZmYzMyOTlmNGY4YjE5MjE2M2Y2NWQ3MzNhNzMxYjI4OTVhYmMyODUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVic3ViLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNjY3NzNlOWQ2ZjAwOWQ0YWI2MWUyMWNiMTc2OWVhZDY1ODMwODM4YjYwM2RkMDE0Yzg5MTYxNjA4MGY4MWY0MWNmMTMxODFkMjBjYjg1ZWUwM2VjM2M2YTZhMjVkM2ZjMmU4NDQ2YTlhNzBmNmMzNDAyNjU1NmVjMmVmMzlkOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93YWxsZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dhbGxldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1ZDI2MWNhMmIzMTc0YWRlZTE0NjRlOTk3ZTJjZDQ2NmYxMTMxZTIyZTMzOTVjNjE2M2Y5M2RkMjJjYWYxNWQzN2U0NTk3NmEwMWRjOTBkN2VmZjdmM2Q2MDhmNDA2NzNlNTliODg2YTQ5ZmZkNDliM2Q0Mzg1ZDYwODFlZmExIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODEwOTE3ODVmMmU2MTdhMWRmOTVmYjdiNTU0Njg4YTNmZDk2OTdhN2Q4YTViNzQ2OWMwNWI3ODVjNGI5N2Q2ZWZlYTU1OTUyNzdmNDQ2NWVkZTI4ODAzNWE0YzAyZWMwNmY2NGZiYjI5MTFlNGFkN2JmZDZlNTIyNjZlNDY1NTUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9uZS12MC4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0ZGYyNjQ2NGIwZWQxYmZkMWVjMzAyMzUyM2EzMTgzYjc5YmM5ZTAzNzYwMmQ2YzE5MjI2ZGI3OWYyZDg5Y2MyOTBiMTRhNWY1Yjc1NzQzZmY5YThlYTE2MjQ1NDA2OTdjNzA4NTVkYjcwOGZhN2FiODQ5NDFiZGQzNTNlZmM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2R1cmFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YWIxYTY4ZmE1OTJhZTU4ZTJlNmY0ODhlODhjMDExYTUyZWMyMGUwYjFhOWM4YTQ3ZTcwN2MzNzIwMmY0NTkxZjQxYjc5MmFjNzQ5ZGFkYzM2OTQ4NzE1NTRiOGU0ZWVhMWY1ZTJiNTk5NWJlYmY0YjRmNjU5MGE4ZTdlYmJiMyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tbW9uLXYxLjIuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY29tbW9uLXYxLjIuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImFwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhNDdhODlkYmRlYWU0ZDBmY2I3Yzk0NGIyM2FlMTg5ZDU1MGJiMzZkNmFmNDZkMDM3YTA0NGY5NzgwMmFiZWViZjk0MzhkY2M5MTE0YTRmNmQxMjY5OGIwMmRkYTI4YzhjYzQxNzNkMDZhODZmMTZjMTc0OTE3N2RiODc1NGEiCiAgICAgICAgfSwKICAgICAgICAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImZyb20tdW5pcXVlLWVudHJpZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YTQwZmQwYzdiMjlkMmY0NjE3MTUxZTUwM2Y3MjBmZDU1NGI2NDFmMTgyYzFiM2NkNWRhNGY0ZTE3MTNlZjUyMTJiNTc2NThjZThjZjUzNmVhMDg0YjY0ZGExOTg5YTlkZmRhNTViMjQzOGIyYjZhMzA1MmFlYzFjMzM4ZWJmZCIKICAgICAgICB9LAogICAgICAgICIuL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaWRlbnQtY2hlY2tlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEwMDZhM2U0MjEyZDgxNzM3OWI0ZjE3MDIwNzljYWQyODQzNWQ0OTBkOGM1YWIzYmRhMDYwYzE1N2QxOGNhYzAxYzFlMzE0NWY5NDdjYzRjMjQzNjMwOWQwODk1OTAxMTlmOWJkNWE1ZDQyMTE3MjAwYmM4OTc0ZDhiMGYyZDM3IgogICAgICAgIH0sCiAgICAgICAgIi4vbGlzdC1kaWZmZXJlbmNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImxpc3QtZGlmZmVyZW5jZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYxMzYzMWZjNGZhZjhiYWE2NzRiYjQ4Mjg4ZTZhNDZiN2RhYWUyZmRlNzg3YzVmMWEwNTFmOTZkMTFmZDg5YWJkMjVjZDZlODkwMDU1MDEyMWY1NmZlMWY1MTBkMzJmYzllNDQ3MzhjOGZmNzgxY2JhNjdiYmQxYWNlNjUxYjA4IgogICAgICAgIH0sCiAgICAgICAgIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJtYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTg5OGM2MjYxNmI0Y2RiM2ZjODFlOTcxMjkwOGEzN2RkYjU3YmVmNmIxZDU4MjNlMDRjZjI4MWNhOTVlODYwNjA1MTAyM2U1NDVkZDZiZGRjMjk2ZmVkZWJlNGU2NjU5NGU5OTg2OTk4MDVlMjA5ZWU3ZGE0MWE5MWFmODE3YzgiCiAgICAgICAgfSwKICAgICAgICAiLi9tYWtlLWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm1ha2UtaXRlcmF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNDM2ZWM0YzY2NmMyYTU1Njc0NWM1ZmE1NGVjODY0OGEzZWNkMGYzMTIwMTA5NmExNTEwY2ExNDMzNDk5ODk2NmE2NDZjMWQwNjNiNjEwMTljY2Y2NDU1MWIzY2I1ZjEyOTBlMDZhNTkxNGQ4YTFkNWYwM2VjNmIxNzFhMzFkZiIKICAgICAgICB9LAogICAgICAgICIuL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAib2JqZWN0LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmNDM3YjVmM2UzM2I3NzNkZTZjYmVkMTBlNTBhOWUwYjk0OGM3M2E2YWUxNjQ2NjQwMTQ5Y2M4ZjBmODE2OTU4NWFhZjI1N2QxMDI2NmZjMjZiZTVlMWRjMzk0ZjVhMzUxZWM2YTZhZjg1ZDNiOTkyMjg4MTk5ZGI4ZDE2NmU4IgogICAgICAgIH0sCiAgICAgICAgIi4vb2JqZWN0LW1ldGEtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tZXRhLW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFhZjA0NTFiMmU2ZDBlZTQxMzA1ODkxZWY2Y2Y1YTllYzRhMDM0NWYxODQ4ZmU5YjJkOWM1MTIzMjQzNjY5YzU0YWM1MWM1Mzg4MjRjMzAxOTBkMjA3ZTQ4ZjUwYzA4NDU2M2Y5MzhkYTVlNjQxZmI3OWJjNDY1MGVkMGVjZjE3IgogICAgICAgIH0sCiAgICAgICAgIi4vdGhyb3ctbGFiZWxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ0aHJvdy1sYWJlbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2I1ZDM0MjZhMTRjMGY3NTYyNTA0ZmI3ODZhOWIwMjQwZGU0Y2I4NTI3OTRhMzhiMDYwMzMwMGE5OTBlNTEwMzlkNTM1ZTUzYWU2N2VjNzEwNWM5YTMyNTNkNDk2YWFmYzczMjA1NGI2YWMyNTUxNzYzYzkwZDc1M2Y1OWY2YmEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZW52LW9wdGlvbnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDE3NzZlZWIyMWIxYzU1MWRhM2Y5YjhkY2RmNWFiZDg4YmNiZjVmOGUzOGNiMDRlZGFiYzhjYjk2NGJiOTc1MThmZjRjYWNiNzQzZThhYmJhYWMyMjg2MTY4MTVmYmU0MGU4NmJlMmQ3ZDQyODE1Nzg5NTJmOGFhODY2YTFiOTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW52LW9wdGlvbnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vudi1vcHRpb25zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWRiMTVkNGI2NjkzMzI1ZDM0NTIzODBjYTYyZGQ5N2E3YWU0ZDAzM2JmNjc1M2FiZjQxNzViZjhmMmE0MDVkY2M5M2Q4NzdkZGRlYzEwYTdiZTViNGZjMzIzNjdkNzJlM2U3NjgwMGY3ZjQ4YzYwOGRhNDUzYzNkMmQxMTQ0ODUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Vycm9ycy12MS4yLjgiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi44IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Vycm9ycy12MS4yLjgiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQxZjhmNGY1N2Y0ZjZlMmM4YjVkMjk2NzM2N2ZmZTRkMDdjOWNiMTc2MWE3YzVjODg0ODZmNGIyN2E0ZTNmZTU3ZDI5ODRhNTkwODNjZjUyOTcxOTE4ZmY5OWViZmE2YjgyYThjMGQ5YzVkMzRlYzVkOTQ4YjE1Yzk5ZDJlYjEzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ZDNlOTEwNGI2ZTI1YjAyYTczNDk3OWFkNGYxOTc4NmJhODcxNjllODBmOGIwZDhhNTExNjc4MWQ5MTZjYTFjYWEwY2NhYWQ5ZWNiM2E0NWFmMTIwMTU2MmYwMDVlYThhMGEyZTBhZDI2MjJjMDdhOTU4ZWM4N2ZlNDU4MTA5YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTQ2NTVlODU5MzE5ODg0NzBiZGRhYjFmZWY1NTZlZjhiZmI3ZTI2MjUwYjZlZWU0NTU2MGQ4MGVkMWUzZWY4ZDViYjhlNWQwNThiNjA4NWVjZTJlMTdhZjIxNmQ4M2FhOTM5MDcwZTRlMmMxOTUyNTg5ODZiNzM2MDk5ZmFkOWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbG9jYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xvY2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTk1ZGY0Y2EzMjgyMDk2OGYxMjAzYWI1ZWEyNzJiOTYxYWUzMTE2MzQwNzBjZjE1MjBlOGFhYTYyY2E4ZWEyMjI5NzA0NGFjNGU4ODkyNjc0ZmJiOTFhMzQzYTc2NTBkY2JhZjUzYjdjNzQ1MjFhZDVlNTU2YjhmMzNhMzNhNGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY5MTExNDZjOGUwNDUyMjcwMGUyM2M5MzhlNmJhNTcwYWM3ZWExZTkxNWQ5ZTdjNGRjYmM1M2ZjMGY3YWI4YWNiOGRkN2NmYzA3YzUyZTAyZjJjNjU3NDA0ZWU4OWVmNzMxMWEzMjc5NGE4NzExYWE3YWI0M2E1NDIwYjMyYzg4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwOTIwNTFmNjk0NDJkYjEzZjllMmI2YzE5ZGRkMTg5YzUxYWIyMWE4NDA0MjEwMzAxZjhkMjYxYjNiMzE5NDhiZDUwY2I2Zjg1MjNlMDM1YzRmM2RmNzYzMTE1ODI4ZmMyZWFkYzljMmIxMjcxN2ZhMzkzOGZkNGYxZDc4NGIxMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MGNiYTc1Nzk4YmRhMzkyMGQ3NWQ2ODVkZjM4M2E2YmJhMDcxNWUxMzI2NDg0YzYzYWY4MWViZGU3ZTg0YjM4NWYwN2E3Mzc3ZmM1MmZjM2M4MGU4MDMxYmE3ZjkxYjViZDI1Yzg3YzQ5OTQ2OWVhMWQxMzcwNzc3NzlhYjFlOCIKICAgICAgICB9LAogICAgICAgICIuL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmVhMDQxMWIyMTZjNzE0MTUxNDM5NjY2NGY4ZjgyMTNhY2QxMTJlOTMwYzBmNGZhYzAzNDI3ZjU3MzdkNzM3ZDBlOTQ2YjZjYzRjNjA4ODRkMDQwNTdiNzdmODgwOGEzOTY3MzY4NTk1NTg4NzI0MzVlYWVlZWQyZjEzMjY0N2QiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V4by12MS41LjciOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V4byIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9leG8tdjEuNS43IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V4by12MS41LjciLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXN0LWRpZmZlcmVuY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjQuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ0MjljODVjMmFmZjY3Njk5ZDA2ZDA3ZGQwYTk3MWFjMjBmNzcyNjM1ZTY5NjhhNmVhYzBhYWEzZDM3Yzc3ZDg5ODZhYjMyOTdmOTdjNjYyMTM3NDNlY2QyNTM4ZmQyYzVlODYxMmYxNWUyYmZjZDVkNmU1NjU2N2FjZjM3Y2IyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by1tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by1tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYjc5NDE1MTJlZGUwNTEyOWYzYjIwY2Q1MDgwN2Q1YWExMDUzOWIzMDg5ZGI0MGU0YmRlZGRkNjY0YjU3OWY3ZDY0ODkwMzI1N2YwYzE1ZWQwNjZiZGE5NWUzNmY4OTA4MDM4MmY2ZjZhOTMxMWNhNmYyZWUwODczZDA2OGE3YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ1MGM2OGJhYWViMTA2NmE4YTVlMzIyNjBlNDJjZmE1NzVkNDkzOTA4MDc0YWZjYTM2ZWJmNjgyZjE4MGRkMDFmZjdiOWVkN2EyZDAwZjc3MzQwODRlMDg2ZmU2ZGUzNGVmN2QxYmRlZThhMDBjNWVkNTYxYjhjMzU4NDBlNjEyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2dldC1pbnRlcmZhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMDAzMzc4MmQ1NzAyMzk2MzNhMTkxOTQ3OGI3OWI2ZDE0ZmFlNTM4YzEwZTY5MzdmZjAyZDJmNGFjNjY0Y2EwZWM2OWJiMjM0OTMxMDVkNjRjMDhjM2FmNjlkMGRmYTViZDUxYjcwODU0ZGNlY2M2YjA2MTUxOWU3M2NkYmMxNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NDY1NWU4NTkzMTk4ODQ3MGJkZGFiMWZlZjU1NmVmOGJmYjdlMjYyNTBiNmVlZTQ1NTYwZDgwZWQxZTNlZjhkNWJiOGU1ZDA1OGI2MDg1ZWNlMmUxN2FmMjE2ZDgzYWE5MzkwNzBlNGUyYzE5NTI1ODk4NmI3MzYwOTlmYWQ5YyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZmFyLXYxLjEuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZmFyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Zhci12MS4xLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYxLjEuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMDQzNTNjMWUyODJjN2YwOGE0OWQxNmFjMmVlYTA2OWExYzMyNTM0MDViZTYzZDg1NWE4MzliMDhiODBkOWJkM2MyNzQ0NWFlMWRhMmJjMzFiZjQ2MjEzZDViMmQ0MTQzOTExN2NmMWVjMGYxMWFmMDI0N2Q5NTVhNzYxNzc1NiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS42LjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS42LjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS42LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY5OTcxYTRiYWY5MmI1NDhlMjQ3NDg4MGMwN2RhYmYzNjFmMmZkMDM4YzQwMGRhNTFkMGE0NDY4MDkyZTM2NTU1NzY5N2M4ZWIxY2FlMzI1Y2ZkOWZhZjcyYWI4NmMxM2YwNDI0MGE2ZTE0NzNhN2UzOTM4NjJkZDA0MTFiNTRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc5ZGQ2NGQ2ZmUyZTI1ODRhNjlhMDZmMzZiOTlkNmJmODAyZDQ2NDQzYzU3NTQ0ZjhlNWY0NDBhMjAyNjRjYjBmOGQ0YzQzNjJhZjNjNTk3NjAzZjI0N2ZkMTMzNGNlOTJiOWE4YTIxMGM4YzYwYzIzOWRiYmYzYjQzMmJhNjkzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTMyYjQ4YzdiMGE3YzRhZjFmMDU4YzQ1MDMwY2M1MWEyMTYxMTYwNzVjMjRlNTA4ZGE5ZWNlZjZiZDZkNDFjNGRiMDgwYTJhODM4MzIyODdmZjYyMDg3M2U2N2YzMThlY2E0MjMxNTQxZDIxMGI5NGI0NDIxYzllMzRhMzk4OGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGNiZGY5YWFlMzE2YmMzZTM0MDVlZmRmNzAwM2NhYWUxODdhOTMyOTg5NGQ5MjkyZGFjNjZkNTk5MGNjNWRmYjgxMTJmNDMzYTg3ZGMzZDJkMWVjMDI2ZGQ4NTY2MGRkZmEzZDE5ZWRlNDlhZWJiYWEyODRkMWMwMDllZjgxZDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTBiOGMxYTljNWI2NmQ3ZGYwNjE4NDViYjczOGZlYWYzMGRlNzU0ODNkZGQ4NTNkMmI1NTdmYWJkODMyNzlkNDA0YWM0OWZmNTUzYjJlMzNhMTkwMDFmNTAxMTY0MjM1ODdhOWM0MmQzNjNkZDVlOWZjMTQ1MzEyMjhlYTk0NjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2MyYmQyNDFlMjI5M2JhMjFhZTZhYjJjNGZmZTM2MDQ3MWZkNWI5MTVhNDk3NmRhNDFmMTY4Zjk4MDAyNDAyZmQ0N2NlZWE4MThiOGQwYjM0Y2I4YzU3YWE5NTAyOTJmNzI5NzNhMTBiNDdjMDhiMDQxN2E0Y2NiM2YwNTgyYzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJlZWM2NTZkNWQ0ZmQyM2MyOWE1NGJhNjg1ZWZiYjA5MmRjZjJmOTRlMGNiY2M4ODE4YTExMjljYWM2ODE2YTkzZTE1MDRjNWFlZDBmZmMzMWU2NjJlZjQwNTQyMWJhNWM5ZTFiODRkOGQ0MzMwYzA2ODAzYWMyMmM1MDFhZDExIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzBkOGZjZmU0YzM3YmI1N2JhNjIzMGRiNjUxZjY4MzViNmVkNDI5MjQzNjFjMjg0YThmYzVlZGJhMjliZDcxZjkwMzBkMWU1Y2UwNmYxYjNhY2Q1ZTRjNzg3OTI3OTA5ODk4ZGRmNjkyYTNhNjE0MGRmYWU5NGJkMzJmYmJjZDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTQ2NTVlODU5MzE5ODg0NzBiZGRhYjFmZWY1NTZlZjhiZmI3ZTI2MjUwYjZlZWU0NTU2MGQ4MGVkMWUzZWY4ZDViYjhlNWQwNThiNjA4NWVjZTJlMTdhZjIxNmQ4M2FhOTM5MDcwZTRlMmMxOTUyNTg5ODZiNzM2MDk5ZmFkOWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NS4wLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjAuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY1LjAuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjIwYTk0N2YxMmZkZDUyNjYxMDJjZjZlMjAwMzgzYTQyODk3ZTlkYjM5OWEyNzJiNmNjZGMwNTAyMzIzNTYzZTI5OWM5ZDYzZmZlYmQ3MDUxZTFjYzY4OGVmYTVmOTFkNjhlNDNlNjRjNWM5MzFmMGI3YTU0ODU1ZTQzYTA0NmQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43IjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXNzLXN0eWxlIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY5OTMyZDU0ZjViNDFhYzdiMjQxYjA0NDdkZWJiNWY3OTM1OWE0Y2FjNTJkN2NiNjg0NTU0ZDI1MTUxOTliOTlhNDVmMDFmZWM5MmFjYTQ3YWE1YjcxNTllNGVkYjk0YWM3Y2M0YjFiYTg2MTViMjM5NDQyODgxZWQ4OTBmZTE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2YwN2FiOWQxNzNjNTAzODM4ZWM1YWM5MzA2MWI5N2JjMWUwMjc5YzZiZTNjNGQ3YmE0NmMxZTlhY2Y0MWMwYzk4MDBkYWRiOWEyNWJiOWU3OWJhNzIyYTBkNDM0NGJjY2ZiOTBiMjBlYjY3ZjFjZjkwODU4ODRmMmM3MmZiYWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYxYzQ5Y2M2ZDU3N2FhYjJiZWE3OGQ0NDNjZThkZTcxMzhhNDhhZGQwMThhMjIxNTY0ZmExNDQ0YjE1ZWFhNjliNjIyMTYxMTgwODVlZTI2NTU1MmVlNDhjNmVkZjZlYTU5YTAwMzhlODM3NWU1NDE0OTgyZTIxMmE4OTFmZTI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODNjMGJjMGJlYzE5NGZkOTExYjQ5Yzg3OTM5OTg4NmRmNmQ2NmRiNzlmNzUwZDI0M2Q2NjVkOWJhZmExY2NjNDQ3MmY4NDMzODY0MWIwZTE4NGNhYzM5YzU3N2RmYTExNWU4YjNkYmJmNjkyN2Y5Yjc3YjBkNzI4Mzc0YzcwNmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmVjZDBlM2RlYTY0YTkxOTJjNTc4ZDA3OGJhZmRhNjhkMTVmM2JmOGM1ZjdmNzJkZWE1M2JmNjA0MmVkZTI2NjJhMWEzMGU1ZDVkYTRmMTYyNzY0ZTQxMTExZGIwNmRhOWI0YjI1YzQzYTkxNzlkYTI2MTJhYjA2ZDhhNWU4M2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYThkN2NlMDUxYmVjODc1NjRlN2M0ZjZhZDEyMDM2MjY5ODJmNDFhMzIzOGE1MTAyNWZhYTUzMTAxZDYyN2E1MzAwY2JiNDA2NjFiMzhlOGRiMTIwMDAzMjJkN2FkZjk1OTJjZjBhNWJhN2NkNjMxNjljMjE3YjQwYmM0OGMzMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZWRhYjU5NjhiNjkxYTI5YTJmZDg1NGNhMzMxYmQ0NzVlMGY0N2Y1NTRiZjFmOWRkNjdjYzE3Y2YyN2ExMmM5ZDc2NTQ2YWQ2ZmI2ZTI5ZWI5OTYxNWY0NGNiNWYwMTU1MTQyODZhOWFiMjNmNDQ4YmJjNDViMDg0MWMxZGFmOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTAxZjgyZjliNDA2NDNmNTlhZGMyMDJkYTcxYTAxYTU3YWY2MDQ0ZmE1ZGU5ZjliZjg5M2I5MzI3OWNhMWExNWNiYTEwYmZkNTZjMGFkOTMwMDYzN2FlMmQ2MmQwOGViODNiYTcwNjNiYTgwNWRmZDFiZWFmMTI0YmMyZmVhMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2U1NTYwNDdlZjAzMWRiNDM2Yzg0ZmEzMjhiMzczZmI0OGJhOWU0NjZlYzI0MmQ0MGYxZmYyZmZiMmU2ZmUwZDI5MGNiY2NkMDkwNWQxZjI4MTA5NmRkZDUzN2I4MGNmYWQwMTY3Y2EyNjE5NTM1OTk3YTIzMjg4YjM2ODhjYzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTQyYTllZmJiMjg1NmU2ZmZjMGYzODljODVkZmRkYTg0ZTYxMWMzYmY0N2JhNDc4MGYyMDc4MWI5NjM3YjYwMjIxYmUxNDgwMzhhODA5ZjJkNmZiNzZlMmRlNjQ2OWZkYWU2M2MwMDUyNTZiYTU0ZTQ5NmU3NGZiZWQ1Mzk3YWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjOTEwMDkzODc0NzVjYjk3MzdiYzhhZDUwZjk4YTQ4OGM4YTUxMTEwMzMyNmI1M2I0Mjk0OTE3YWQ2ODY4ODNhMGE0YmFkNmRiMDZhOTRjMDUwNmJlZjE0YWNiYWRmMzA4NTI4YjkxZGEyNGIyYTUwZTk1ODFhM2VjYTkyMDc1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFkNmNiZmIzYzNmOWUxOGEwMDU2ODdjNTk3ZjFlZmI3Nzk1ZGIzYWMzNjk3NDQ3Y2FhMmIyODI0Y2MxYmFiMTRjYjFiOGExYTcwNmFkYTEyOWQ3OThiMGE5MmQwOWE5MTNmMDgzYmZjN2I2MzY3NmU3MTM4ZjVmYmZlOWMwYzg1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzliMjEwMTcxZGZmMjk2ZjM4YjQ1NzcwNmFiMDIxZWFiYjc1NjBlMjU4ZDkzZmZmNjhiNTZlOTZjNmMyYTZjMmM5ZDk3MTZiOTY2MGVhOThjZWQ5ZmY0YWI2ZGYwMmFhMDFiOGY4MTg2YjcwNmU1ZjcwYmEyN2RmZTk1ZWQ4OWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ODVjNGVhY2E3OWU4MWNlNzMwYzVjY2FjNDEyMGY5MmJmNDhiMzE3ZjM0ZDgzNWFkMjEzOWVjNzExMTU1OTNjZTRlOWY5YWM2OGQ3N2I5ZGQ2YjZiMzk3NWJmMTY2YmY0MWRlMzgyNGVlY2ZlNWJiMTY5ZTU3MWIzM2JhZmVjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkZDBjZTkyZWU4YjVlNmQwMDk3YTU3ODgyNDJhODc5ZTcyNmM2N2M1NGZmYjBlM2JhNGVhZTM5OTY0MWRjNGQxYWM1ZTU2MTlmNWY1NjZlNmEzZWRkODQ2Y2Y4NzNiNWMxYzU5Nzg1YjI1MWZkMjA0ZTkwODliMTdhYzAxNDk2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMjlmYzE1NDA1Mzc3MTVkZjg1NGEzOGE1ZTQ1YWU2ZDIyODZlOWZiMTUxYzUyODU2YzliOWRmYzFlMjJjZDYzMDllZDMyMjIzMGU2ZmVjYzZhMjQ4YTZiMzQ1MGEzZmYxNjRhNjc0ZWVmZjgyOGM5MTVlYzQ4MjAzYmRjNjY0NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NDY1NWU4NTkzMTk4ODQ3MGJkZGFiMWZlZjU1NmVmOGJmYjdlMjYyNTBiNmVlZTQ1NTYwZDgwZWQxZTNlZjhkNWJiOGU1ZDA1OGI2MDg1ZWNlMmUxN2FmMjE2ZDgzYWE5MzkwNzBlNGUyYzE5NTI1ODk4NmI3MzYwOTlmYWQ5YyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGF0dGVybnMtdjEuNC43IjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXR0ZXJucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXR0ZXJucy12MS40LjciLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGF0dGVybnMtdjEuNC43IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXN0LWRpZmZlcmVuY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NjllY2E5OTJhZTJjZjA5ZDQ2ZWFlN2VlYTAwN2U5NWJiNGM2NGFhYTM3YmE1ZTQ2NjI1ODZiOWZkZmNmMDk0NDhmOWYxZDVkYjlmNDE2N2UwYTdiNzk2ZmU5MjBhNWZkMGE5OGQwYzU0NjQ5ZTIxNzYzMDNkYWY3ZWE0NDk4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NoZWNrS2V5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTk3MmZhMDA0YmJjZGVjMzNkMmIxZTNiN2Q5MTgwNDBmNWY4MmE0OGZmN2UwY2MzYTI0YzYwNjYyMjZkNjExMWVjYzc0OTQ2NGM4ZGVkNWE4NThmODVkOWQ2ODk0ZDY3OTFmMWIyNTc3Y2U4NTQ2YTU5ZDk2ZDUyMzdiNDI5MjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb21wYXJlS2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxZDg1NDhiMzkwY2MyNjYxNzVjYzlmZTY3OTU4NjFhNDIzN2E5ZDk0MmEzZDg5Y2ZmNjI1OTQ2MjMwNDQ5MzQwZTQ2YzU3NWUzNmE3M2Y2YmEzODU1ZTBiZmU1OTJlMmE1ZGZiNjc1MmFjMDBlNjdlMTNhYzVkMDQwMzgxYjgyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weUJhZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5QmFnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjU1OTQ4NThkZTgzZDM1N2M1Y2U4ZGIwY2VlZDZmMWZlYmJmMzVhZGYwYWY3MWNiNjcwYTQ4ZGYxNDM4OTdkYmI5Y2Q5YWVjNmZmN2IxYmM2M2U2ZDNlMmQ3MzIwMTdhODA4OGQ5ZmRiNGQ3NTZmYjIwZGE5NjlkOGU0MmU0NzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlTZXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYmIxM2JhMDZhYzg2Y2FlNTE4YmNiYjRiZmI3NTY4OTgwMTBjN2ZiZjA4MTgwZTU0ZDZiMWRkNTQ0NzU2N2M4ODNkNGU4MGY4NTVmODE2M2JiOTYzZGY5NzkzYzM0NWU5YzNmZjJiMzRhYzAzYzQzYmUyZTJkNTYwYzJjOTM0NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGQ4ZmRjNzAwMzQ0NTg4N2VkYjdkYTIzMTc4NzdlN2RmNTNjNjNiZmM4ODRmZDVjZGI1ODdiYjY2ZTg3Yzc4MGRmMzdmZGViZDMyM2Q2ZWJjMGNkNjEzODZjOTI1NTI1MTlkNGVkYTk3MGUyZjhjNTAyYTFiN2RlZmJiYjMwZjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMWIzYTJmNDQ4ZjkwZjIzODI5YjQ2Yzk3M2NiNmM2OTZhOWZlMmMyMzRkNmYyZTBiZmNjZWUxZTdjOGU1MjdjNDg1MWY4YmQ1YmE4N2UwMGVlZWFhZjljYzQyNzNhZWRmNmZhMzcxNWRkMjc2NDA3ZTcyYjhjNjEzNDA2ZjA1MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNiODViODEwZTMzYTJjY2I5NTNhMDFmY2VhZjAwMzZiNjkxNDFhMWJlOWQ4MzI4ZWViNTkwYzk3MDk2ZGE2YzNmMTU3NDViYjAzNzgzOTFkZTJmNzkwMDg1YzBlYTZjZjU4MGFkOWQwZDA5NGEwMjQ0MjRiODJmYjhmY2E2Mjg3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMWI5ZTg1N2NlZTg4NGFiMDhiOGY5OGY4YzJmZDBlYzYyMDE5MmMyZjIxNDBlNzFhMmM5YzJhNGRiYWFkZDc4ZmRlZjc5YTY5NWQ3Zjk2MmNmOTE5YmQ2MDkxMTU0YmQ1Y2NiM2JjNDVkYjIzNGVlOTA1NTkwZjIzMWNkNTlmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1YzA3NWI3NGU3NGQ1YmIwODg4ODkxZTNjM2QyMWY0YjYzMjk1MTZmNDVhM2NjNThhYjQ3YzE0NDRmZDgxNjgyODUyY2JhOWI5MTJlOGQxOWFlNmNhMTM4ZDk5ZTA0MmFmNzk4ZWE0Njg5OTg1Mzc0MDZlMjE2NGU2MDNlYzEyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU0NjU1ZTg1OTMxOTg4NDcwYmRkYWIxZmVmNTU2ZWY4YmZiN2UyNjI1MGI2ZWVlNDU1NjBkODBlZDFlM2VmOGQ1YmI4ZTVkMDU4YjYwODVlY2UyZTE3YWYyMTZkODNhYTkzOTA3MGU0ZTJjMTk1MjU4OTg2YjczNjA5OWZhZDljIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjgiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjgiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgzNzY1MDVmNjhiZGMzY2I5NGU2NTc2NGUyZmUzMmVjZTkwMjZhMTM3N2U3MDQxZWVhZGM3NTAxODBhOTdlOTgyZjdjNGFiOGY3MzE4ODg0ODQyZGQyMjU4NTI5ZGI0MjU0NGY1OGJkMDk5MDkzOTQ4YjBjNWMzNDBiODZlZTlmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YzYyYjU4MDVjNDI1NTc2YmQxMWJhMzg3MTA2ZTcyYWQ2OTVhNzQyMjNmNThkNmY4OTFjYmYxOGE2NmNlNDI2ODExYjEyZjM4ZGIxMzg0ODc3MGM5MmZlOWE4MzQ3M2I0MmYxNzBkZjQ2Y2I4NmQyNTQ4OGI3ZjVmZDFkOWVhNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2MjI1ZjFiNTNkZjFiMjhiMzllMzc3MjdiYTBkZjQ5MTU4YzEyNzJiZmMxMTUxZTNlZDk3OGRlNWU4MGJiNTM1ODBmOTA1YTM3MjU4NjIyYmFjM2ZjOGY4M2UwOTA0MWViZjc0MWQ4MDU2YWZmYjYxZDJiNjFkMmRiNGMzZWI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdhOGM1MjM0NzVlZTA1ZGUyODAxYmQzNmQ5NzY3ZDY4MjVhYTYwZGRhMDRkNDdlNDQwNDllYzRmNDkwODYzNjFhMzllM2ZiMTk4ZmFjODQ4YzM1NjBmZjVmNTVjNzczNTIyNTUzNWVjYTU2M2VlYTI3Njc1YjE4YTRmOTQ3NmYxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU0NjU1ZTg1OTMxOTg4NDcwYmRkYWIxZmVmNTU2ZWY4YmZiN2UyNjI1MGI2ZWVlNDU1NjBkODBlZDFlM2VmOGQ1YmI4ZTVkMDU4YjYwODVlY2UyZTE3YWYyMTZkODNhYTkzOTA3MGU0ZTJjMTk1MjU4OTg2YjczNjA5OWZhZDljIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9zdHJlYW0tdjEuMi44IjogewogICAgICAibmFtZSI6ICJAZW5kby9zdHJlYW0iLAogICAgICAibGFiZWwiOiAiQGVuZG8vc3RyZWFtLXYxLjIuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9zdHJlYW0tdjEuMi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkZGZhM2FlZmFkOTQ2YTJlMWE0ZTNhZGQ3Y2UxOGQxYzNlYzEzZmRjZjFkNWI3NGMxYzlmZGIzYTVkNWY4NmVhMDVmYmExYTQ3NGQ5MDBlN2VmOGEyYWZiNTM3YmU4ZmRjM2M4YmM0MjU0ZjA2MDdjYjQxNmYyZmQ1OTRmYzY5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJqZXNzaWUuanMtdjAuMy40IjogewogICAgICAibmFtZSI6ICJqZXNzaWUuanMiLAogICAgICAibGFiZWwiOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyN2Q3ZGQ2MjNlZmZhZGRlZTA3ZDVkYTA2YjIwMThlNjZjZjI4YWQwOTQ0NGYxZmE3MmRjMWUwZTY5MmUzYmIzNGQ5N2I4MDVmMzc0NjA0OWRlYzc4NTFhYmJiZWYxYjg1YjJmZjEwMGYxNjhlZGU0MGY0MWYxN2E5Mzc0ZDY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlODkyNmFmZGI1OWM1ZTVhMDg2M2Q0NzEzMjQ5M2VhOGJlNjM5MjEzMTBlZTY3ZGE2ZmY0NzlkNTYzYzk1NTJkZDlhMjI0MjU1YTgxODc2NGYyNzgxMmI4Y2IzNDQ3YTFmYzljZGJjZTdjNzcxMThiZjAwYjcyZDkzMzYzMjNmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNmNlYjE5ODNmZTRkMTJhYzYyN2Q5ZjFiZDA1NjUwZGJhY2YxNDRiN2YzOWY2MWUwY2E3NDIzZjk4Y2Y5YjA2MTY1ZGZjZDg4ZjYxN2FmODY2YTBkMTU3MDcwYTk3NGU4ZjkyY2UxYzUwMTA5ZDAwNzc0ODhmNDI4YzJlMDc5ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTZmZWUxNmRhYjM4YTIxZjBiNWM4YTBiMWYxMGMzYjczYTMxNTdmNmU5ZjU4OTM4MDk2YjRiODc5YjJhMDk5M2ZkN2M5ZGRkN2IzOTMwZTgwMjYwZTFhODdhYjFhNGFjNjc2MWNiNzU3OTg1OGZlMzllMDEwOWRjNWExNjA1M2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwOWE4ZTMzODQwZjUwYTdkYTIzMmM4ODM2YzZmYmEyNGIzZjc1MGVmMmIzMzFkYWIxNjVhZmVkNjA1MDhiZjczYTc4MThlMjc5OGMyZWVkYjNkMDRmM2Q2NzE3Zjk0M2ZiOTMwODg2ZmU2NGU4YTc4MzA0ODY1OTY3NGE5NDJhOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9hc3luYy10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZmYzMTg5NTk2MWYyYzlmZGYzMTQ0NWRkNjg4ZjNkY2Y3ZmY1MTUwNzJmODIyOWJlNDU1MTg1Njg0MjIyMmY3MWM2NWM4NTMzMWFiYmRhZDllM2Q1NTVkOTFkNWY5ZmI2ZmYxODE2YjkyYzZjZjA5N2NjOWYyYzhjY2NjYmRhMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGVkMzljNDVkOTdjMGZkMmExNDFiZGExY2M1NDg0NDk0Y2Y1OWY2NjBiNDc4YzRkMzlhM2Y3MmJlMGQzNGFlMDAwOTIzZTc4M2Y2MGVjYjFlNzEzMjlhMzBkZTczMTUwNDg5NWE2ZDRjZjAyMmU2ZTFjNzI2Y2U5ZDlkZDZkM2QiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAAFC72gfwEAAH8BAAAgAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL2hlYXAuanN7ImltcG9ydHMiOlsiLi9zcmMvaGVhcC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2hlYXAuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2hlYXAuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABLrDk0oBAABKAQAAJwAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEtx/5FkKAABZCgAAJAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXhvIiwiQGFnb3JpYy9zdG9yZSIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOlsibWFrZUhlYXBab25lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhcixpc1Bhc3NhYmxlLG1ha2VFeG8sZGVmaW5lRXhvQ2xhc3MsZGVmaW5lRXhvQ2xhc3NLaXQsbWFrZVNjYWxhck1hcFN0b3JlLG1ha2VTY2FsYXJTZXRTdG9yZSxtYWtlU2NhbGFyV2Vha01hcFN0b3JlLG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUsbWFrZU9uY2VLaXQsa2V5cyx3YXRjaFByb21pc2U7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVcIiwgWyRozY9fYSA9PiAoaXNQYXNzYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V4b1wiLCBbW1wibWFrZUV4b1wiLCBbJGjNj19hID0+IChtYWtlRXhvID0gJGjNj19hKV1dLFtcImRlZmluZUV4b0NsYXNzXCIsIFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsIFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsIFskaM2PX2EgPT4gKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUgPSAkaM2PX2EpXV1dXSxbXCIuL21ha2Utb25jZS5qc1wiLCBbW1wibWFrZU9uY2VLaXRcIiwgWyRozY9fYSA9PiAobWFrZU9uY2VLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2tleXMuanNcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsIFskaM2PX2EgPT4gKGtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL3dhdGNoLXByb21pc2UuanNcIiwgW1tcIndhdGNoUHJvbWlzZVwiLCBbJGjNj19hID0+ICh3YXRjaFByb21pc2UgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuICovXG5jb25zdCBkZXRhY2hlZEhlYXBTdG9yZXM9RmFyKCdoZWFwU3RvcmVzJyx7XG5kZXRhY2hlZDooKT0+ZGV0YWNoZWRIZWFwU3RvcmVzLFxuaXNTdG9yYWJsZTppc1Bhc3NhYmxlLFxuXG5zZXRTdG9yZTptYWtlU2NhbGFyU2V0U3RvcmUsXG5tYXBTdG9yZTptYWtlU2NhbGFyTWFwU3RvcmUsXG53ZWFrTWFwU3RvcmU6bWFrZVNjYWxhcldlYWtNYXBTdG9yZSxcbndlYWtTZXRTdG9yZTptYWtlU2NhbGFyV2Vha1NldFN0b3JlfSk7XG5cblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUhlYXBab25lPShiYXNlTGFiZWw9J2hlYXBab25lJyk9PntcbmNvbnN0e21ha2VPbmNlLHdyYXBQcm92aWRlcn09bWFrZU9uY2VLaXQoYmFzZUxhYmVsLGRldGFjaGVkSGVhcFN0b3Jlcyk7XG5cbi8qXG5cblxuICAgKi9cbmNvbnN0IG1ha2VTdWJab25lPShsYWJlbCxfb3B0aW9ucyk9PlxubWFrZUhlYXBab25lKCBgJHtiYXNlTGFiZWx9LiR7bGFiZWx9YCk7XG5cbnJldHVybiBGYXIoJ2hlYXBab25lJyx7XG5leG86d3JhcFByb3ZpZGVyKG1ha2VFeG8sa2V5cy5leG8pLFxuZXhvQ2xhc3M6d3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzLGtleXMuZXhvQ2xhc3MpLFxuZXhvQ2xhc3NLaXQ6d3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzS2l0LGtleXMuZXhvQ2xhc3NLaXQpLFxuc3ViWm9uZTp3cmFwUHJvdmlkZXIobWFrZVN1YlpvbmUpLFxuXG5tYWtlT25jZSxcbndhdGNoUHJvbWlzZSxcbmRldGFjaGVkOmRldGFjaGVkSGVhcFN0b3Jlcy5kZXRhY2hlZCxcbmlzU3RvcmFibGU6ZGV0YWNoZWRIZWFwU3RvcmVzLmlzU3RvcmFibGUsXG5cbm1hcFN0b3JlOndyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMubWFwU3RvcmUpLFxuc2V0U3RvcmU6d3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5zZXRTdG9yZSksXG53ZWFrTWFwU3RvcmU6d3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrTWFwU3RvcmUpLFxud2Vha1NldFN0b3JlOndyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMud2Vha1NldFN0b3JlKX0pO1xuXG4gfTskaM2PX29uY2UubWFrZUhlYXBab25lKG1ha2VIZWFwWm9uZSk7XG5oYXJkZW4obWFrZUhlYXBab25lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VIZWFwWm9uZSI6WyJtYWtlSGVhcFpvbmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7lq3z2sCAABrAgAAJQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9leHBvcnRzLmpzIiwiLi9tYWtlLW9uY2UuanMiLCIuL2tleXMuanMiLCIuL2lzLXBhc3NhYmxlLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyIsIi4va2V5cy5qcyIsIi4vbWFrZS1vbmNlLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL2V4cG9ydHMuanNcIiwgW11dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtdXSxbXCIuL2tleXMuanNcIiwgW11dLFtcIi4vaXMtcGFzc2FibGUuanNcIiwgW11dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB16UGuWAIAAFgCAAArAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pcy1wYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiaXNQYXNzYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCByZWFsSXNQYXNzYWJsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImlzUGFzc2FibGVcIiwgWyRozY9fYSA9PiAocmVhbElzUGFzc2FibGUgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZT0oc3BlY2ltZW4pPT5yZWFsSXNQYXNzYWJsZShzcGVjaW1lbik7JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHmlMGXUDAAB1AwAAJAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMva2V5cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWdvcmljVmF0RGF0YUtleXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIC8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGtpbmQ9KGxhYmVsKT0+IGAke2xhYmVsfV9raW5kSGFuZGxlYDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgc2luZ2xldG9uPShsYWJlbCk9PiBgJHtsYWJlbH1fc2luZ2xldG9uYDtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFnb3JpY1ZhdERhdGFLZXlzPXtcbmV4b0NsYXNzOihsYWJlbCk9PmhhcmRlbihba2luZChsYWJlbCldKSxcbmV4b0NsYXNzS2l0OihsYWJlbCk9PmhhcmRlbihba2luZChsYWJlbCldKSxcbmV4bzoobGFiZWwpPT5oYXJkZW4oW2tpbmQobGFiZWwpLHNpbmdsZXRvbihsYWJlbCldKSxcbnN0b3JlOihsYWJlbCk9PmhhcmRlbihbbGFiZWxdKSxcbnpvbmU6KGxhYmVsKT0+aGFyZGVuKFtsYWJlbF0pfTskaM2PX29uY2UuYWdvcmljVmF0RGF0YUtleXMoYWdvcmljVmF0RGF0YUtleXMpO1xuXG5oYXJkZW4oYWdvcmljVmF0RGF0YUtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYWdvcmljVmF0RGF0YUtleXMiOlsiYWdvcmljVmF0RGF0YUtleXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAH0KGKeIGAADiBgAAKQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvbWFrZS1vbmNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VPbmNlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGVmYXVsdExhYmVsVG9LZXlzPShsYWJlbCk9PmhhcmRlbihbbGFiZWxdKTtcbmhhcmRlbihkZWZhdWx0TGFiZWxUb0tleXMpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZU9uY2VLaXQ9KGRlYnVnTmFtZSxzdG9yZXMsYmFja2luZ1N0b3JlPXVuZGVmaW5lZCk9Pntcbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgdXNlZEtleXM9c3RvcmVzLmRldGFjaGVkKCkuc2V0U3RvcmUoIGAke2RlYnVnTmFtZX0gdXNlZCBrZXlzYCk7XG5cbi8qXG5cbiAgICovXG5jb25zdCBhc3NlcnRPbmx5T25jZT0oa2V5KT0+e1xudHlwZW9mIGtleT09PSdzdHJpbmcnfHxGYWlsIGBrZXkgJHtrZXl9IG11c3QgYmUgYSBzdHJpbmdgO1xuIXVzZWRLZXlzLmhhcyhrZXkpfHxcbkZhaWwgYGtleSAke2tleX0gaGFzIGFscmVhZHkgYmVlbiB1c2VkIGluIHRoaXMgem9uZSBhbmQgaW5jYXJuYXRpb25gO1xuXG4vL1xuLy9cbnVzZWRLZXlzLmFkZChrZXkpO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCB3cmFwUHJvdmlkZXI9KHByb3ZpZGVyLGxhYmVsVG9LZXlzPWRlZmF1bHRMYWJlbFRvS2V5cyk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB3cmFwcGVyPShsYWJlbCwuLi5yZXN0KT0+e1xuZm9yKGNvbnN0IGtleSBvZiBsYWJlbFRvS2V5cyhsYWJlbCkpe1xuYXNzZXJ0T25seU9uY2Uoa2V5KTtcbiB9XG5yZXR1cm4gcHJvdmlkZXIobGFiZWwsLi4ucmVzdCk7XG4gfTtcbnJldHVybiAoLyogICAgICAgICAgICAqL3dyYXBwZXIpO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBtYWtlT25jZT0oa2V5LG1ha2VyKT0+e1xuYXNzZXJ0T25seU9uY2Uoa2V5KTtcbmlmKGJhY2tpbmdTdG9yZSYmYmFja2luZ1N0b3JlLmhhcyhrZXkpKXtcbnJldHVybiBiYWNraW5nU3RvcmUuZ2V0KGtleSk7XG4gfVxuY29uc3QgdmFsdWU9bWFrZXIoa2V5KTtcbnN0b3Jlcy5pc1N0b3JhYmxlKHZhbHVlKXx8XG5GYWlsIGBtYWtlciByZXR1cm4gdmFsdWUgJHt2YWx1ZX0gaXMgbm90IHN0b3JhYmxlYDtcbmJhY2tpbmdTdG9yZSYmYmFja2luZ1N0b3JlLmluaXQoa2V5LHZhbHVlKTtcbnJldHVybiB2YWx1ZTtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHttYWtlT25jZSx3cmFwUHJvdmlkZXJ9KTtcbiB9OyRozY9fb25jZS5tYWtlT25jZUtpdChtYWtlT25jZUtpdCk7XG5oYXJkZW4obWFrZU9uY2VLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU9uY2VLaXQiOlsibWFrZU9uY2VLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA72q0kl8JAABfCQAALQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXR0ZXJucyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSIsIlByb21pc2VXYXRjaGVySGFuZGxlciIsIlByb21pc2VXYXRjaGVySSIsIlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwsTSxFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHthcHBseX09UmVmbGVjdDtcblxuLypcblxuICovXG5jb25zdCAgICAgICAgUHJvbWlzZVdhdGNoZXJIYW5kbGVyPU0uY2FsbChNLnJhdygpKS5yZXN0KE0ucmF3KCkpLnJldHVybnMoKTtcblxuLypcblxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySGFuZGxlcihQcm9taXNlV2F0Y2hlckhhbmRsZXIpO1xuY29uc3QgICAgICAgIFByb21pc2VXYXRjaGVyST1NLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXInLHtcbm9uRnVsZmlsbGVkOlByb21pc2VXYXRjaGVySGFuZGxlcixcbm9uUmVqZWN0ZWQ6UHJvbWlzZVdhdGNoZXJIYW5kbGVyfSk7XG5cblxuLypcblxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySShQcm9taXNlV2F0Y2hlckkpO1xuY29uc3QgICAgICAgIFByb21pc2VXYXRjaGVyRnVsZmlsbGVkST1NLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWQnLHtcbm9uRnVsZmlsbGVkOlByb21pc2VXYXRjaGVySGFuZGxlcn0pO1xuXG5cbi8qXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkoUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJKTtcbmNvbnN0ICAgICAgICBQcm9taXNlV2F0Y2hlclJlamVjdGVkST1NLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJSZWplY3RlZCcse1xub25SZWplY3RlZDpQcm9taXNlV2F0Y2hlckhhbmRsZXJ9KTtcblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlclJlamVjdGVkSShQcm9taXNlV2F0Y2hlclJlamVjdGVkSSk7XG5jb25zdCBjYWxsTWVNYXliZT0odGhhdCxwcm9wLHBvc3RBcmdzKT0+e1xuY29uc3QgZm49dGhhdFtwcm9wXTtcbmlmKCFmbil7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmFzc2VydC50eXBlb2YoZm4sJ2Z1bmN0aW9uJyk7XG4vKlxuXG4gICAqL1xuY29uc3Qgd3JhcHBlZD0oYXJnKT0+e1xuLy9cbi8vXG5hcHBseShmbix0aGF0LFthcmcsLi4ucG9zdEFyZ3NdKTtcbiB9O1xucmV0dXJuIHdyYXBwZWQ7XG4gfTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHdhdGNoUHJvbWlzZT0ocCx3YXRjaGVyLC4uLndhdGNoZXJBcmdzKT0+e1xuUHJvbWlzZS5yZXNvbHZlKHApPT09cHx8RmFpbCBgd2F0Y2hQcm9taXNlIG9ubHkgd2F0Y2hlcyBwcm9taXNlc2A7XG5jb25zdCBvbkZ1bGZpbGxlZD1jYWxsTWVNYXliZSh3YXRjaGVyLCdvbkZ1bGZpbGxlZCcsd2F0Y2hlckFyZ3MpO1xuY29uc3Qgb25SZWplY3RlZD1jYWxsTWVNYXliZSh3YXRjaGVyLCdvblJlamVjdGVkJyx3YXRjaGVyQXJncyk7XG5vbkZ1bGZpbGxlZHx8XG5vblJlamVjdGVkfHxcbkZhaWwgYHByb21pc2Ugd2F0Y2hlciBtdXN0IGltcGxlbWVudCBhdCBsZWFzdCBvbmUgaGFuZGxlciBtZXRob2RgO1xudm9pZCBFLndoZW4ocCxvbkZ1bGZpbGxlZCxvblJlamVjdGVkKTtcbiB9OyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTtcbmhhcmRlbih3YXRjaFByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIjpbIlByb21pc2VXYXRjaGVySGFuZGxlciJdLCJQcm9taXNlV2F0Y2hlckkiOlsiUHJvbWlzZVdhdGNoZXJJIl0sIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiXSwiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiOlsiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB19M2c+QQAAPkEAAAhAAAAQGFnb3JpYy9jYWNoZS12MC4zLjIvc3JjL2NhY2hlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vc3RvcmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlQ2FjaGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRSxGYXIsbWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9zdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3JcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuICovXG5jb25zdCAgICAgICAgbWFrZUNhY2hlPShjb29yZGluYXRvcj1tYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvcigpKT0+e1xuLypcblxuXG5cblxuXG4gICAqL1xuY29uc3QgY2FjaGU9KGtleSwuLi5vcHRVcGRhdGVHdWFyZFBhdHRlcm4pPT57XG5pZihvcHRVcGRhdGVHdWFyZFBhdHRlcm4ubGVuZ3RoPT09MCl7XG5yZXR1cm4gRShjb29yZGluYXRvcikuZ2V0UmVjZW50VmFsdWUoa2V5KTtcbiB9XG5cbmNvbnN0W3VwZGF0ZSxndWFyZFBhdHRlcm5dPW9wdFVwZGF0ZUd1YXJkUGF0dGVybjtcbmlmKHR5cGVvZiB1cGRhdGUhPT0nZnVuY3Rpb24nKXtcbnJldHVybiBFKGNvb3JkaW5hdG9yKS5zZXRDYWNoZVZhbHVlKGtleSx1cGRhdGUsZ3VhcmRQYXR0ZXJuKTtcbiB9XG5cbmNvbnN0IHVwZGF0ZXI9RmFyKCdjYWNoZSB1cGRhdGVyJyx7XG51cGRhdGU6KG9sZFZhbHVlKT0+e1xucmV0dXJuIHVwZGF0ZShvbGRWYWx1ZSk7XG4gfX0pO1xuXG5yZXR1cm4gRShjb29yZGluYXRvcikudXBkYXRlQ2FjaGVWYWx1ZShrZXksdXBkYXRlcixndWFyZFBhdHRlcm4pO1xuIH07XG5cbnJldHVybiBjYWNoZTtcbiB9OyRozY9fb25jZS5tYWtlQ2FjaGUobWFrZUNhY2hlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDYWNoZSI6WyJtYWtlQ2FjaGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvQC5yAMCAAADAgAAIAAAAEBhZ29yaWMvY2FjaGUtdjAuMy4yL3NyYy9tYWluLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiLCIuL3N0b3JlLmpzIiwiLi9jYWNoZS5qcyIsIi4vc3RhdGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2NhY2hlLmpzIiwiLi9zdGF0ZS5qcyIsIi4vc3RvcmUuanMiLCIuL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3N0b3JlLmpzXCIsIFtdXSxbXCIuL2NhY2hlLmpzXCIsIFtdXSxbXCIuL3N0YXRlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB7Z1uwMBAAADAQAACEAAABAYWdvcmljL2NhY2hlLXYwLjMuMi9zcmMvc3RhdGUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkdST1VORF9TVEFURSIsIm1ha2VTdGF0ZSIsIndpdGhHcm91bmRTdGF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBHUk9VTkRfU1RBVEU9aGFyZGVuKHtnZW5lcmF0aW9uOjBuLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5HUk9VTkRfU1RBVEUoR1JPVU5EX1NUQVRFKTtcbmNvbnN0ICAgICAgICBtYWtlU3RhdGU9KHZhbHVlLHByaW9yU3RhdGU9R1JPVU5EX1NUQVRFKT0+XG5oYXJkZW4oe1xuZ2VuZXJhdGlvbjpwcmlvclN0YXRlLmdlbmVyYXRpb24rMW4sXG52YWx1ZX0pO1xuXG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVN0YXRlKG1ha2VTdGF0ZSk7XG5jb25zdCAgICAgICAgd2l0aEdyb3VuZFN0YXRlPShzdGF0ZVN0b3JlKT0+KHtcbi4uLnN0YXRlU3RvcmUsXG5nZXQ6KGtleSk9PntcbmlmKCFzdGF0ZVN0b3JlLmhhcyhrZXkpKXtcbnJldHVybiBHUk9VTkRfU1RBVEU7XG4gfVxucmV0dXJuIHN0YXRlU3RvcmUuZ2V0KGtleSk7XG4gfX0pOyRozY9fb25jZS53aXRoR3JvdW5kU3RhdGUod2l0aEdyb3VuZFN0YXRlKTtcblxuaGFyZGVuKHdpdGhHcm91bmRTdGF0ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJHUk9VTkRfU1RBVEUiOlsiR1JPVU5EX1NUQVRFIl0sIm1ha2VTdGF0ZSI6WyJtYWtlU3RhdGUiXSwid2l0aEdyb3VuZFN0YXRlIjpbIndpdGhHcm91bmRTdGF0ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADte8F7ghcAAIIXAAAhAAAAQGFnb3JpYy9jYWNoZS12MC4zLjIvc3JjL3N0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvaW50ZXJuYWwiLCIuL3N0YXRlLmpzIl0sImV4cG9ydHMiOlsibWFrZUNoYWluU3RvcmFnZUNvb3JkaW5hdG9yIiwibWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRSxGYXIsZGVlcGx5RnVsZmlsbGVkLG1ha2VNYXJzaGFsLG1hdGNoZXMsbWFrZVNjYWxhck1hcFN0b3JlLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSx1bnRpbFRydWUsd2l0aEdyb3VuZFN0YXRlLG1ha2VTdGF0ZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjNj19hKV1dLFtcIm1ha2VNYXJzaGFsXCIsIFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWF0Y2hlc1wiLCBbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1widW50aWxUcnVlXCIsIFskaM2PX2EgPT4gKHVudGlsVHJ1ZSA9ICRozY9fYSldXV1dLFtcIi4vc3RhdGUuanNcIiwgW1tcIndpdGhHcm91bmRTdGF0ZVwiLCBbJGjNj19hID0+ICh3aXRoR3JvdW5kU3RhdGUgPSAkaM2PX2EpXV0sW1wibWFrZVN0YXRlXCIsIFskaM2PX2EgPT4gKG1ha2VTdGF0ZSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFrZUtleVRvU3RyaW5nPShzYW5pdGl6ZT0ob2JqKT0+b2JqKT0+e1xubGV0IGxhc3ROb25jZT0wO1xuY29uc3QgdmFsVG9Ob25jZT1uZXcgV2Vha01hcCgpO1xuY29uc3QgdmFsVG9TbG90PSh2YWwpPT57XG5sZXQgc2xvdD12YWxUb05vbmNlLmdldCh2YWwpO1xuaWYoIXNsb3Qpe1xubGFzdE5vbmNlKz0xO1xuc2xvdD1sYXN0Tm9uY2U7XG52YWxUb05vbmNlLnNldCh2YWwsc2xvdCk7XG4gfVxucmV0dXJuIHNsb3Q7XG4gfTtcblxuY29uc3R7dG9DYXBEYXRhOmtleVRvSnNvbmFibGV9PW1ha2VNYXJzaGFsKHZhbFRvU2xvdCx1bmRlZmluZWQse1xuc2VyaWFsaXplQm9keUZvcm1hdDonc21hbGxjYXBzJ30pO1xuXG5jb25zdCBrZXlUb1N0cmluZz1hc3luYyhrZXlQKT0+e1xuY29uc3Qga2V5PWF3YWl0IHNhbml0aXplKGtleVApO1xuY29uc3Qgb2JqPWtleVRvSnNvbmFibGUoa2V5KTtcbnJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xuIH07XG5yZXR1cm4ga2V5VG9TdHJpbmc7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGFwcGx5Q2FjaGVUcmFuc2FjdGlvbj1hc3luYyhcbmtleVN0cixcbnR4bixcbmd1YXJkUGF0dGVybixcbnNhbml0aXplLFxuc3RhdGVTdG9yZSk9Plxue1xuLypcblxuXG5cblxuICAgKi9cbmNvbnN0IGdldFVwZGF0ZWRTdGF0ZT1hc3luYyhiYXNpc1N0YXRlKT0+e1xuY29uc3R7dmFsdWV9PWJhc2lzU3RhdGU7XG5pZighbWF0Y2hlcyh2YWx1ZSxndWFyZFBhdHRlcm4pKXtcbi8vXG5yZXR1cm4gbnVsbDtcbiB9XG5cbmNvbnN0IG5ld1ZhbHVlPWF3YWl0IHNhbml0aXplKHR4bih2YWx1ZSkpO1xucmV0dXJuIG1ha2VTdGF0ZShuZXdWYWx1ZSxiYXNpc1N0YXRlKTtcbiB9O1xuXG5sZXQgYmFzaXNTdGF0ZT1zdGF0ZVN0b3JlLmdldChrZXlTdHIpO1xubGV0IHVwZGF0ZWRTdGF0ZT1hd2FpdCBnZXRVcGRhdGVkU3RhdGUoYmFzaXNTdGF0ZSk7XG5cbi8vXG5cbi8vXG5iYXNpc1N0YXRlPXN0YXRlU3RvcmUuZ2V0KGtleVN0cik7XG5jb25zdCB1bnRpbFVwZGF0ZVN5bmNlZD11bnRpbFRydWUoXG4oKT0+IXVwZGF0ZWRTdGF0ZXx8dXBkYXRlZFN0YXRlLmdlbmVyYXRpb24+YmFzaXNTdGF0ZS5nZW5lcmF0aW9uKTtcblxuZm9yIGF3YWl0KGNvbnN0IF8gb2YgdW50aWxVcGRhdGVTeW5jZWQpe1xudXBkYXRlZFN0YXRlPWF3YWl0IGdldFVwZGF0ZWRTdGF0ZShiYXNpc1N0YXRlKTtcbi8vXG5iYXNpc1N0YXRlPXN0YXRlU3RvcmUuZ2V0KGtleVN0cik7XG4gfVxuXG5pZighdXBkYXRlZFN0YXRlKXtcbi8vXG4vL1xucmV0dXJuIGJhc2lzU3RhdGUudmFsdWU7XG4gfVxuXG4vL1xuLy9cbmlmKGJhc2lzU3RhdGUuZ2VuZXJhdGlvbjwxbil7XG4vL1xuc3RhdGVTdG9yZS5pbml0KGtleVN0cix1cGRhdGVkU3RhdGUpO1xuIH1lbHNle1xuc3RhdGVTdG9yZS5zZXQoa2V5U3RyLHVwZGF0ZWRTdGF0ZSk7XG4gfVxuXG4vL1xucmV0dXJuIHVwZGF0ZWRTdGF0ZS52YWx1ZTtcbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBzdHJpbmdpZnlTdGF0ZVN0b3JlPWFzeW5jKHN0YXRlU3RvcmUsbWFyc2hhbGxlcik9Pntcbi8qICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBvYmo9e307XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIHN0YXRlU3RvcmUuZW50cmllcygpKXtcbm9ialtrZXldPUUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbiB9XG5yZXR1cm4gZGVlcGx5RnVsZmlsbGVkKGhhcmRlbihvYmopKS50aGVuKChmdWxmaWxsZWRPYmopPT5cbkpTT04uc3RyaW5naWZ5KGZ1bGZpbGxlZE9iaikpO1xuXG4gfTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yPShcbnN0YXRlU3RvcmU9bWFrZVNjYWxhck1hcFN0b3JlKCksXG5zYW5pdGl6ZT1kZWVwbHlGdWxmaWxsZWQpPT5cbntcbmNvbnN0IHNlcmlhbGl6ZVBhc3NhYmxlPW1ha2VLZXlUb1N0cmluZyhzYW5pdGl6ZSk7XG5cbmNvbnN0IGRlZmF1bHRTdGF0ZVN0b3JlPXdpdGhHcm91bmRTdGF0ZShzdGF0ZVN0b3JlKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvb3JkPUZhcignc3RvcmUgY2FjaGUgY29vcmRpbmF0b3InLHtcbmdldFJlY2VudFZhbHVlOmFzeW5jKGtleSk9PntcbmNvbnN0IGtleVN0cj1hd2FpdCBzZXJpYWxpemVQYXNzYWJsZShrZXkpO1xucmV0dXJuIGRlZmF1bHRTdGF0ZVN0b3JlLmdldChrZXlTdHIpLnZhbHVlO1xuIH0sXG5zZXRDYWNoZVZhbHVlOmFzeW5jKGtleSxuZXdWYWx1ZSxndWFyZFBhdHRlcm4pPT57XG5jb25zdCBrZXlTdHI9YXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbnJldHVybiBhcHBseUNhY2hlVHJhbnNhY3Rpb24oXG5rZXlTdHIsXG4oKT0+bmV3VmFsdWUsXG5ndWFyZFBhdHRlcm4sXG5zYW5pdGl6ZSxcbmRlZmF1bHRTdGF0ZVN0b3JlKTtcblxuIH0sXG51cGRhdGVDYWNoZVZhbHVlOmFzeW5jKGtleSx1cGRhdGVyLGd1YXJkUGF0dGVybik9PntcbmNvbnN0IGtleVN0cj1hd2FpdCBzZXJpYWxpemVQYXNzYWJsZShrZXkpO1xucmV0dXJuIGFwcGx5Q2FjaGVUcmFuc2FjdGlvbihcbmtleVN0cixcbihvbGRWYWx1ZSk9PkUodXBkYXRlcikudXBkYXRlKG9sZFZhbHVlKSxcbmd1YXJkUGF0dGVybixcbnNhbml0aXplLFxuZGVmYXVsdFN0YXRlU3RvcmUpO1xuXG4gfX0pO1xuXG5yZXR1cm4gY29vcmQ7XG4gfTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvcihtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvcik7XG5jb25zdCBtYWtlTGFzdFdpbnNVcGRhdGVyPShzdGF0ZVN0b3JlLG1hcnNoYWxsZXIsc3RvcmFnZU5vZGUpPT57XG5sZXQgbGFzdFByZXBhcmVUaWNrZXQ9MG47XG5sZXQgbGFzdENvbW1pdFRpY2tldD0wbjtcblxucmV0dXJuIGFzeW5jKHN0b3JlZFZhbHVlKT0+e1xuLy9cbi8vXG4vL1xubGFzdFByZXBhcmVUaWNrZXQrPTFuO1xuY29uc3QgbWFyc2hhbGxUaWNrZXQ9bGFzdFByZXBhcmVUaWNrZXQ7XG5jb25zdCBzZXJpYWxpemVkU3RvcmU9YXdhaXQgc3RyaW5naWZ5U3RhdGVTdG9yZShzdGF0ZVN0b3JlLG1hcnNoYWxsZXIpO1xuaWYobWFyc2hhbGxUaWNrZXQ8bGFzdENvbW1pdFRpY2tldCl7XG4vL1xucmV0dXJuIHN0b3JlZFZhbHVlO1xuIH1cbmF3YWl0IEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWRTdG9yZSk7XG5sYXN0Q29tbWl0VGlja2V0PW1hcnNoYWxsVGlja2V0O1xucmV0dXJuIHN0b3JlZFZhbHVlO1xuIH07XG4gfTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ2hhaW5TdG9yYWdlQ29vcmRpbmF0b3I9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5jb25zdCBzdGF0ZVN0b3JlPW1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnc3RhdGVLZXknKTtcblxuY29uc3Qgc2FuaXRpemU9ZGVlcGx5RnVsZmlsbGVkO1xuY29uc3Qgc2VyaWFsaXplUGFzc2FibGU9bWFrZUtleVRvU3RyaW5nKHNhbml0aXplKTtcblxuY29uc3QgZGVmYXVsdFN0YXRlU3RvcmU9d2l0aEdyb3VuZFN0YXRlKHN0YXRlU3RvcmUpO1xuXG5jb25zdCB1cGRhdGVTdG9yYWdlTm9kZT1tYWtlTGFzdFdpbnNVcGRhdGVyKFxuZGVmYXVsdFN0YXRlU3RvcmUsXG5tYXJzaGFsbGVyLFxuc3RvcmFnZU5vZGUpO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb29yZD1GYXIoJ3N0b3JlIGNhY2hlIGNvb3JkaW5hdG9yJyx7XG5nZXRSZWNlbnRWYWx1ZTphc3luYyhrZXkpPT57XG5jb25zdCBrZXlTdHI9YXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbnJldHVybiBkZWZhdWx0U3RhdGVTdG9yZS5nZXQoa2V5U3RyKS52YWx1ZTtcbiB9LFxuc2V0Q2FjaGVWYWx1ZTphc3luYyhrZXksbmV3VmFsdWUsZ3VhcmRQYXR0ZXJuKT0+e1xuY29uc3Qga2V5U3RyPWF3YWl0IHNlcmlhbGl6ZVBhc3NhYmxlKGtleSk7XG5jb25zdCBzdG9yZWRWYWx1ZT1hd2FpdCBhcHBseUNhY2hlVHJhbnNhY3Rpb24oXG5rZXlTdHIsXG4oKT0+bmV3VmFsdWUsXG5ndWFyZFBhdHRlcm4sXG5zYW5pdGl6ZSxcbmRlZmF1bHRTdGF0ZVN0b3JlKTtcblxucmV0dXJuIHVwZGF0ZVN0b3JhZ2VOb2RlKHN0b3JlZFZhbHVlKTtcbiB9LFxudXBkYXRlQ2FjaGVWYWx1ZTphc3luYyhrZXksdXBkYXRlcixndWFyZFBhdHRlcm4pPT57XG5jb25zdCBrZXlTdHI9YXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbmNvbnN0IHN0b3JlZFZhbHVlPWF3YWl0IGFwcGx5Q2FjaGVUcmFuc2FjdGlvbihcbmtleVN0cixcbihvbGRWYWx1ZSk9PkUodXBkYXRlcikudXBkYXRlKG9sZFZhbHVlKSxcbmd1YXJkUGF0dGVybixcbnNhbml0aXplLFxuZGVmYXVsdFN0YXRlU3RvcmUpO1xuXG5yZXR1cm4gdXBkYXRlU3RvcmFnZU5vZGUoc3RvcmVkVmFsdWUpO1xuIH19KTtcblxucmV0dXJuIGNvb3JkO1xuIH07JGjNj19vbmNlLm1ha2VDaGFpblN0b3JhZ2VDb29yZGluYXRvcihtYWtlQ2hhaW5TdG9yYWdlQ29vcmRpbmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IiOlsibWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IiXSwibWFrZUNoYWluU3RvcmFnZUNvb3JkaW5hdG9yIjpbIm1ha2VDaGFpblN0b3JhZ2VDb29yZGluYXRvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEusOTSgEAAEoBAAAhAAAAQGFnb3JpYy9jYWNoZS12MC4zLjIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABczaqHAB0AAAAdAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHEsRmFpbCxwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaM2PX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIiwgWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNcIiwgW1tcIm5hdE1hdGhIZWxwZXJzXCIsIFskaM2PX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIiwgWyRozY9fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsIFskaM2PX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5QmFnTWF0aEhlbHBlcnNcIiwgWyRozY9fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vL1xuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIEFzc2V0S2luZD0vKiAgICAgICAgICAgICAgICAqL3tcbk5BVDonbmF0JyxcblNFVDonc2V0JyxcbkNPUFlfU0VUOidjb3B5U2V0JyxcbkNPUFlfQkFHOidjb3B5QmFnJ307JGjNj19vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuXG5oYXJkZW4oQXNzZXRLaW5kKTtcbmNvbnN0IGFzc2V0S2luZE5hbWVzPWhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuRmFpbCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xuIH07JGjNj19vbmNlLmFzc2VydEFzc2V0S2luZChhc3NlcnRBc3NldEtpbmQpO1xuaGFyZGVuKGFzc2VydEFzc2V0S2luZCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBoZWxwZXJzPXtcbm5hdDpuYXRNYXRoSGVscGVycyxcbnNldDpzZXRNYXRoSGVscGVycyxcbmNvcHlTZXQ6Y29weVNldE1hdGhIZWxwZXJzLFxuY29weUJhZzpjb3B5QmFnTWF0aEhlbHBlcnN9O1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xucmV0dXJuJ25hdCc7XG4gfVxuaWYocGFzc1N0eWxlPT09J2NvcHlBcnJheScpe1xucmV0dXJuJ3NldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLnNldCgpKSl7XG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG5yZXR1cm4nY29weUJhZyc7XG4gfVxuLy9cbi8vXG4vL1xuLy9cbi8vXG50aHJvdyBGYWlsIGB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIGEgYmlnaW50LCBjb3B5U2V0LCBjb3B5QmFnLCBvciBhbiBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRWYWx1ZUdldEhlbHBlcnM9KHZhbHVlKT0+XG4vL1xuaGVscGVyc1thc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSldO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjaz0oYWxsZWdlZEJyYW5kLGJyYW5kKT0+e1xuaWYoYnJhbmQhPT11bmRlZmluZWQpe1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYWxsZWdlZEJyYW5kPT09YnJhbmR8fFxuRmFpbCBgYW1vdW50J3MgYnJhbmQgJHtxKGFsbGVnZWRCcmFuZCl9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfWA7XG4gfVxuIH07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja0xSQW5kR2V0SGVscGVycz0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQobGVmdEFtb3VudCwnbGVmdEFtb3VudCcpO1xuYXNzZXJ0UmVjb3JkKHJpZ2h0QW1vdW50LCdyaWdodEFtb3VudCcpO1xuY29uc3R7dmFsdWU6bGVmdFZhbHVlLGJyYW5kOmxlZnRCcmFuZH09bGVmdEFtb3VudDtcbmNvbnN0e3ZhbHVlOnJpZ2h0VmFsdWUsYnJhbmQ6cmlnaHRCcmFuZH09cmlnaHRBbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUobGVmdEJyYW5kLCdsZWZ0QnJhbmQnKTtcbmFzc2VydFJlbW90YWJsZShyaWdodEJyYW5kLCdyaWdodEJyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2sobGVmdEJyYW5kLGJyYW5kKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhyaWdodEJyYW5kLGJyYW5kKTtcbmxlZnRCcmFuZD09PXJpZ2h0QnJhbmR8fFxuRmFpbCBgQnJhbmRzIGluIGxlZnQgJHtxKGxlZnRCcmFuZCl9IGFuZCByaWdodCAke3EoXG5yaWdodEJyYW5kKVxuIH0gc2hvdWxkIG1hdGNoIGJ1dCBkbyBub3RgO1xuY29uc3QgbGVmdEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGxlZnRWYWx1ZSk7XG5jb25zdCByaWdodEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xubGVmdEhlbHBlcnM9PT1yaWdodEhlbHBlcnN8fFxuRmFpbCBgVGhlIGxlZnQgJHtsZWZ0QW1vdW50fSBhbmQgcmlnaHQgYW1vdW50ICR7cmlnaHRBbW91bnR9IGhhZCBkaWZmZXJlbnQgYXNzZXRLaW5kc2A7XG5yZXR1cm4gbGVmdEhlbHBlcnM7XG4gfTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGNvZXJjZUxSPShoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpPT57XG4vL1xucmV0dXJuW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpc0dURT0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgQW1vdW50TWF0aD17XG4vL1xuLy9cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5tYWtlOihicmFuZCxhbGxlZ2VkVmFsdWUpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuY29uc3QgdmFsdWU9aC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xuLy9cbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qXG5cblxuXG5cblxuXG5cbiAgICovXG5jb2VyY2U6KGJyYW5kLGFsbGVnZWRBbW91bnQpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWU6YWxsZWdlZFZhbHVlfT1hbGxlZ2VkQW1vdW50O1xuYnJhbmQ9PT1hbGxlZ2VkQnJhbmR8fFxuRmFpbCBgVGhlIGJyYW5kIGluIHRoZSBhbGxlZ2VkQW1vdW50ICR7YWxsZWdlZEFtb3VudH0gaW4gJ2NvZXJjZScgZGlkbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgYnJhbmQgJHticmFuZH0uYDtcbi8vXG4vL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCxhbGxlZ2VkVmFsdWUpO1xuIH0sXG4vKlxuXG5cblxuXG5cblxuICAgKi9cbmdldFZhbHVlOihicmFuZCxhbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbW91bnQpLnZhbHVlLFxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbm1ha2VFbXB0eTooYnJhbmQsYXNzZXRLaW5kPS8qICAgICAgICAgICAgICAgICovJ25hdCcpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcbmNvbnN0IHZhbHVlPWhlbHBlcnNbYXNzZXRLaW5kXS5kb01ha2VFbXB0eSgpO1xuLy9cbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qXG5cblxuXG5cblxuXG4gICAqL1xubWFrZUVtcHR5RnJvbUFtb3VudDooYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZCx2YWx1ZX09YW1vdW50O1xuY29uc3QgYXNzZXRLaW5kPWFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbi8vXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbiB9LFxuLypcblxuXG5cblxuXG4gICAqL1xuaXNFbXB0eTooYW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlfT1hbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUoYWxsZWdlZEJyYW5kLCdicmFuZCcpO1xub3B0aW9uYWxCcmFuZENoZWNrKGFsbGVnZWRCcmFuZCxicmFuZCk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyh2YWx1ZSk7XG5yZXR1cm4gaC5kb0lzRW1wdHkoaC5kb0NvZXJjZSh2YWx1ZSkpO1xuIH0sXG5pc0dURSxcbi8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmlzRXF1YWw6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNFcXVhbCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9LFxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuYWRkOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5jb25zdCB2YWx1ZT1oLmRvQWRkKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuLy9cbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5zdWJ0cmFjdDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuLy9cbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbm1pbjooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PlxuLy9cbmlzR1RFKHgseSxicmFuZCk/XG55OlxuaXNHVEUoeSx4LGJyYW5kKT9cbng6XG5GYWlsIGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbm1heDooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PlxuLy9cbmlzR1RFKHgseSxicmFuZCk/XG54OlxuaXNHVEUoeSx4KT9cbnk6XG5GYWlsIGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgfTskaM2PX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcblxuaGFyZGVuKEFtb3VudE1hdGgpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgICAgICAgIGdldEFzc2V0S2luZD0oYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHt2YWx1ZX09YW1vdW50O1xucmV0dXJuIGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbiB9OyRozY9fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgUbFhdQDAADUAwAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiXSwiZXhwb3J0cyI6WyJtYWtlQW1vdW50U3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgQW1vdW50TWF0aDskaM2PX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV1dKTsgICBcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQW1vdW50U3RvcmU9KHN0YXRlLGtleSk9PntcbnJldHVybiBoYXJkZW4oe1xuZ2V0QW1vdW50OigpPT5zdGF0ZVtrZXldLFxuaW5jcmVtZW50OihkZWx0YSk9PntcbnN0YXRlW2tleV09QW1vdW50TWF0aC5hZGQoc3RhdGVba2V5XSxkZWx0YSk7XG4gfSxcbmRlY3JlbWVudDooZGVsdGEpPT57XG5pZihBbW91bnRNYXRoLmlzR1RFKHN0YXRlW2tleV0sZGVsdGEpKXtcbnN0YXRlW2tleV09QW1vdW50TWF0aC5zdWJ0cmFjdChzdGF0ZVtrZXldLGRlbHRhKTtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBmYWxzZTtcbiB9fSk7XG5cbiB9OyRozY9fb25jZS5tYWtlQW1vdW50U3RvcmUobWFrZUFtb3VudFN0b3JlKTtcbmhhcmRlbihtYWtlQW1vdW50U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFtb3VudFN0b3JlIjpbIm1ha2VBbW91bnRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADood0axwUAAMcFAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLG11c3RNYXRjaCxEaXNwbGF5SW5mb1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaM2PX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNvZXJjZURpc3BsYXlJbmZvPShhbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kKT0+e1xubXVzdE1hdGNoKGFsbGVnZWREaXNwbGF5SW5mbyxEaXNwbGF5SW5mb1NoYXBlLCdkaXNwbGF5SW5mbycpO1xuXG5pZihhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kIT09dW5kZWZpbmVkKXtcbmFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQ9PT1hc3NldEtpbmR8fFxuRmFpbCBgZGlzcGxheUluZm8uYXNzZXRLaW5kIHdhcyBwcmVzZW50ICgke2FsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmR9KSBhbmQgZGlkIG5vdCBtYXRjaCB0aGUgYXNzZXRLaW5kIGFyZ3VtZW50ICgke2Fzc2V0S2luZH0pYDtcbiB9XG5jb25zdCBkaXNwbGF5SW5mbz1oYXJkZW4oey4uLmFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmR9KTtcblxuaWYoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyE9PXVuZGVmaW5lZCl7XG5OdW1iZXIuaXNTYWZlSW50ZWdlcihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzKXx8XG5GYWlsIGBkZWNpbWFsUGxhY2VzICR7ZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlc30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYDtcbiB9XG5cbnJldHVybiBkaXNwbGF5SW5mbztcbiB9OyRozY9fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb2VyY2VEaXNwbGF5SW5mbyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjjjJqPwIAAD8CAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGiU08lqFgAAahYAACUAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b25lL2R1cmFibGUuanMiLCIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIl0sImV4cG9ydHMiOlsiaGFzSXNzdWVyIiwibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0IiwicHJlcGFyZUlzc3VlcktpdCIsInVwZ3JhZGVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYXNzZXJ0LEZhaWwsYXNzZXJ0UGF0dGVybixtYWtlU2NhbGFyQmlnTWFwU3RvcmUsbWFrZUR1cmFibGVab25lLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8scHJlcGFyZVBheW1lbnRMZWRnZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLCBbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzXCIsIFtbXCJtYWtlRHVyYWJsZVpvbmVcIiwgWyRozY9fYSA9PiAobWFrZUR1cmFibGVab25lID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIiwgWyRozY9fYSA9PiAoQXNzZXRLaW5kID0gJGjNj19hKV1dLFtcImFzc2VydEFzc2V0S2luZFwiLCBbJGjNj19hID0+IChhc3NlcnRBc3NldEtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL2Rpc3BsYXlJbmZvLmpzXCIsIFtbXCJjb2VyY2VEaXNwbGF5SW5mb1wiLCBbJGjNj19hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRozY9fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRMZWRnZXJcIiwgWyRozY9fYSA9PiAocHJlcGFyZVBheW1lbnRMZWRnZXIgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzZXR1cElzc3VlcktpdD0oXG57bmFtZSxhc3NldEtpbmQsZGlzcGxheUluZm8sZWxlbWVudFNoYXBlfSxcbmlzc3VlclpvbmUsXG5yZWNvdmVyeVNldHNTdGF0ZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbi8vXG5jb25zdCBjbGVhbkRpc3BsYXlJbmZvPWNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLGFzc2V0S2luZCk7XG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwnZnVuY3Rpb24nKTtcbiB9XG5cbmlmKGVsZW1lbnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gfVxuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbmNvbnN0e2lzc3VlcixtaW50LGJyYW5kLG1pbnRSZWNvdmVyeVB1cnNlfT1wcmVwYXJlUGF5bWVudExlZGdlcihcbmlzc3VlclpvbmUsXG5uYW1lLFxuYXNzZXRLaW5kLFxuY2xlYW5EaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbnJlY292ZXJ5U2V0c1N0YXRlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5icmFuZCxcbmlzc3Vlcixcbm1pbnQsXG5taW50UmVjb3ZlcnlQdXJzZSxcbmRpc3BsYXlJbmZvOmNsZWFuRGlzcGxheUluZm99KTtcblxuIH07XG5oYXJkZW4oc2V0dXBJc3N1ZXJLaXQpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBJTlNUQU5DRV9LRVk9J2lzc3Vlcic7XG4vKlxuXG5cblxuICovXG5jb25zdCBSRUNPVkVSWV9TRVRTX1NUQVRFPSdyZWNvdmVyeVNldHNTdGF0ZSc7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICB1cGdyYWRlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbnJlY292ZXJ5U2V0c09wdGlvbj11bmRlZmluZWQpPT5cbntcbmNvbnN0IGlzc3VlclJlY29yZD1pc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xuY29uc3QgaXNzdWVyWm9uZT1tYWtlRHVyYWJsZVpvbmUoaXNzdWVyQmFnZ2FnZSk7XG5jb25zdCBvbGRSZWNvdmVyeVNldHNTdGF0ZT1pc3N1ZXJCYWdnYWdlLmhhcyhSRUNPVkVSWV9TRVRTX1NUQVRFKT9cbmlzc3VlckJhZ2dhZ2UuZ2V0KFJFQ09WRVJZX1NFVFNfU1RBVEUpOlxuJ2hhc1JlY292ZXJ5U2V0cyc7XG5pZihcbm9sZFJlY292ZXJ5U2V0c1N0YXRlPT09J25vUmVjb3ZlcnlTZXRzJyYmXG5yZWNvdmVyeVNldHNPcHRpb249PT0naGFzUmVjb3ZlcnlTZXRzJylcbntcbkZhaWwgYENhbm5vdCAoeWV0PykgdXBncmFkZSBmcm9tICdub1JlY292ZXJ5U2V0cycgdG8gJ2hhc1JlY292ZXJ5U2V0cydgO1xuIH1cbi8vXG4vL1xuLy9cbmNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlPXJlY292ZXJ5U2V0c09wdGlvbnx8b2xkUmVjb3ZlcnlTZXRzU3RhdGU7XG5yZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG5pc3N1ZXJSZWNvcmQsXG5pc3N1ZXJab25lLFxucmVjb3ZlcnlTZXRzU3RhdGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcblxuIH07JGjNj19vbmNlLnVwZ3JhZGVJc3N1ZXJLaXQodXBncmFkZUlzc3VlcktpdCk7XG5oYXJkZW4odXBncmFkZUlzc3VlcktpdCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBoYXNJc3N1ZXI9KGJhZ2dhZ2UpPT5iYWdnYWdlLmhhcyhJTlNUQU5DRV9LRVkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaGFzSXNzdWVyKGhhc0lzc3Vlcik7XG5jb25zdCAgICAgICAgbWFrZUR1cmFibGVJc3N1ZXJLaXQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG4vL1xuYXNzZXRLaW5kPUFzc2V0S2luZC5OQVQsXG5kaXNwbGF5SW5mbz1oYXJkZW4oe30pLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQsXG57ZWxlbWVudFNoYXBlPXVuZGVmaW5lZCxyZWNvdmVyeVNldHNPcHRpb249dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QgaXNzdWVyRGF0YT1oYXJkZW4oe1xubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlfSk7XG5cbmlzc3VlckJhZ2dhZ2UuaW5pdChJTlNUQU5DRV9LRVksaXNzdWVyRGF0YSk7XG5jb25zdCBpc3N1ZXJab25lPW1ha2VEdXJhYmxlWm9uZShpc3N1ZXJCYWdnYWdlKTtcbmNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlPXJlY292ZXJ5U2V0c09wdGlvbnx8J2hhc1JlY292ZXJ5U2V0cyc7XG5pc3N1ZXJCYWdnYWdlLmluaXQoUkVDT1ZFUllfU0VUU19TVEFURSxyZWNvdmVyeVNldHNTdGF0ZSk7XG5yZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG5pc3N1ZXJEYXRhLFxuaXNzdWVyWm9uZSxcbnJlY292ZXJ5U2V0c1N0YXRlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cbiB9OyRozY9fb25jZS5tYWtlRHVyYWJsZUlzc3VlcktpdChtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuLy9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxub3B0aW9ucz17fSk9Plxue1xuaWYoaGFzSXNzdWVyKGlzc3VlckJhZ2dhZ2UpKXtcbmNvbnN0e2VsZW1lbnRTaGFwZTpfPXVuZGVmaW5lZCxyZWNvdmVyeVNldHNPcHRpb249dW5kZWZpbmVkfT1cbm9wdGlvbnM7XG5jb25zdCBpc3N1ZXJLaXQ9dXBncmFkZUlzc3VlcktpdChcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxucmVjb3ZlcnlTZXRzT3B0aW9uKTtcblxuXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cbnJldHVybiBpc3N1ZXJLaXQ7XG4gfWVsc2V7XG5jb25zdCBpc3N1ZXJLaXQ9bWFrZUR1cmFibGVJc3N1ZXJLaXQoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbm9wdGlvbnMpO1xuXG5yZXR1cm4gaXNzdWVyS2l0O1xuIH1cbiB9OyRozY9fb25jZS5wcmVwYXJlSXNzdWVyS2l0KHByZXBhcmVJc3N1ZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJLaXQ9KFxubmFtZSxcbi8vXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkLHJlY292ZXJ5U2V0c09wdGlvbj11bmRlZmluZWR9PXt9KT0+XG5cbm1ha2VEdXJhYmxlSXNzdWVyS2l0KFxubWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLHtkdXJhYmxlOnRydWV9KSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG57ZWxlbWVudFNoYXBlLHJlY292ZXJ5U2V0c09wdGlvbn0pOyRozY9fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuXG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ1cGdyYWRlSXNzdWVyS2l0IjpbInVwZ3JhZGVJc3N1ZXJLaXQiXSwiaGFzSXNzdWVyIjpbImhhc0lzc3VlciJdLCJtYWtlRHVyYWJsZUlzc3VlcktpdCI6WyJtYWtlRHVyYWJsZUlzc3VlcktpdCJdLCJwcmVwYXJlSXNzdWVyS2l0IjpbInByZXBhcmVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOSrY+7hBQAA4QUAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQga2V5RVEsbWFrZUNvcHlCYWcsbXVzdE1hdGNoLE0sZ2V0Q29weUJhZ0VudHJpZXMsYmFnSXNTdXBlcmJhZyxiYWdVbmlvbixiYWdEaXNqb2ludFN1YnRyYWN0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlCYWdcIiwgWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjNj19hID0+IChiYWdJc1N1cGVyYmFnID0gJGjNj19hKV1dLFtcImJhZ1VuaW9uXCIsIFskaM2PX2EgPT4gKGJhZ1VuaW9uID0gJGjNj19hKV1dLFtcImJhZ0Rpc2pvaW50U3VidHJhY3RcIiwgWyRozY9fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlCYWcoW10pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBjb3B5QmFnTWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihiYWcpPT57XG5tdXN0TWF0Y2goYmFnLE0uYmFnKCksJ2JhZyBvZiBhbW91bnQnKTtcbnJldHVybiBiYWc7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooYmFnKT0+Z2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpiYWdJc1N1cGVyYmFnLFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6YmFnVW5pb24sXG5kb1N1YnRyYWN0OmJhZ0Rpc2pvaW50U3VidHJhY3R9KTskaM2PX29uY2UuY29weUJhZ01hdGhIZWxwZXJzKGNvcHlCYWdNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEGFj3ifBQAAnwUAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQga2V5RVEsbWFrZUNvcHlTZXQsbXVzdE1hdGNoLE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLCBbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIiwgWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsIFskaM2PX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaM2PX2EpXV0sW1wic2V0RGlzam9pbnRVbmlvblwiLCBbJGjNj19hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjNj19hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRozY9fYSA9PiAoc2V0RGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG5jb25zdCBlbXB0eT1tYWtlQ29weVNldChbXSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCAgICAgICAgY29weVNldE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooc2V0KT0+e1xubXVzdE1hdGNoKHNldCxNLnNldCgpLCdzZXQgb2YgYW1vdW50Jyk7XG5yZXR1cm4gc2V0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KHNldCk9PmdldENvcHlTZXRLZXlzKHNldCkubGVuZ3RoPT09MCxcbmRvSXNHVEU6c2V0SXNTdXBlcnNldCxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOnNldERpc2pvaW50VW5pb24sXG5kb1N1YnRyYWN0OnNldERpc2pvaW50U3VidHJhY3R9KTskaM2PX29uY2UuY29weVNldE1hdGhIZWxwZXJzKGNvcHlTZXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJUrcMlnBAAAZwQAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibmF0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxOYXQsaXNOYXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXSxbXCJpc05hdFwiLCBbJGjNj19hID0+IChpc05hdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBlbXB0eT0wbjtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLy9cbmFzc2VydC50eXBlb2YobmF0LCdiaWdpbnQnKTtcbmlzTmF0KG5hdCl8fEZhaWwgYHZhbHVlICR7bmF0fSBtdXN0IGJlIGEgbmF0dXJhbCBudW1iZXJgO1xucmV0dXJuIE5hdChuYXQpO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KG5hdCk9Pm5hdD09PWVtcHR5LFxuZG9Jc0dURToobGVmdCxyaWdodCk9PmxlZnQ+PXJpZ2h0LFxuZG9Jc0VxdWFsOihsZWZ0LHJpZ2h0KT0+bGVmdD09PXJpZ2h0LFxuLy9cbmRvQWRkOihsZWZ0LHJpZ2h0KT0+bGVmdCtyaWdodCxcbmRvU3VidHJhY3Q6KGxlZnQscmlnaHQpPT5OYXQobGVmdC1yaWdodCl9KTskaM2PX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0TWF0aEhlbHBlcnMiOlsibmF0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARwq540gGAABIBgAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbInNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydEtleSxlbGVtZW50c0lzU3VwZXJzZXQsZWxlbWVudHNEaXNqb2ludFVuaW9uLGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxjb2VyY2VUb0VsZW1lbnRzLGVsZW1lbnRzQ29tcGFyZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaM2PX2EgPT4gKGFzc2VydEtleSA9ICRozY9fYSldXSxbXCJlbGVtZW50c0lzU3VwZXJzZXRcIiwgWyRozY9fYSA9PiAoZWxlbWVudHNJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjNj19hID0+IChlbGVtZW50c0Rpc2pvaW50VW5pb24gPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0XCIsIFskaM2PX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXSxbXCJjb2VyY2VUb0VsZW1lbnRzXCIsIFskaM2PX2EgPT4gKGNvZXJjZVRvRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaM2PX2EgPT4gKGVsZW1lbnRzQ29tcGFyZSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGVtcHR5PWhhcmRlbihbXSk7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLy9cbi8vXG4vL1xuLy9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaM2PX29uY2Uuc2V0TWF0aEhlbHBlcnMoc2V0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANj9K1X8DAAB/AwAAIwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgaW5pdEVtcHR5OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaM2PX2EgPT4gKGluaXRFbXB0eSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLy9cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudEtpbmQ9KGlzc3VlclpvbmUsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PWlzc3VlclpvbmUuZXhvQ2xhc3MoXG4gYCR7bmFtZX0gcGF5bWVudGAsXG5QYXltZW50SSxcbmluaXRFbXB0eSxcbntcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH19KTtcblxuXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRLaW5kKHByZXBhcmVQYXltZW50S2luZCk7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50S2luZCI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASy2n++sfAADrHwAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGFnb3JpYy9zdG9yZSIsIi4vYW1vdW50TWF0aC5qcyIsIi4vcGF5bWVudC5qcyIsIi4vcHVyc2UuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudExlZGdlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLHEsRmFpbCxhbm5vdGF0ZUVycm9yLGlzUHJvbWlzZSxtdXN0TWF0Y2gsTSxrZXlFUSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLCBbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIiwgWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJrZXlFUVwiLCBbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi9wYXltZW50LmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudEtpbmRcIiwgWyRozY9fYSA9PiAocHJlcGFyZVBheW1lbnRLaW5kID0gJGjNj19hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLCBbJGjNj19hID0+IChwcmVwYXJlUHVyc2VLaW5kID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJCcmFuZElcIiwgWyRozY9fYSA9PiAoQnJhbmRJID0gJGjNj19hKV1dLFtcIm1ha2VJc3N1ZXJJbnRlcmZhY2VzXCIsIFskaM2PX2EgPT4gKG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZT0oYnJhbmQsYXNzZXRLaW5kLGVsZW1lbnRTaGFwZSk9PntcbmxldCB2YWx1ZVNoYXBlO1xuc3dpdGNoKGFzc2V0S2luZCl7XG5jYXNlJ25hdCc6e1xudmFsdWVTaGFwZT1NLm5hdCgpO1xuZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkfHxcbkZhaWwgYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWA7XG5icmVhaztcbiB9XG5jYXNlJ3NldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5hbmQoTS5rZXkoKSxlbGVtZW50U2hhcGUpKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlTZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uc2V0KCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYmFnKCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbkZhaWwgYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gO1xuIH19XG5cblxuY29uc3QgYW1vdW50U2hhcGU9aGFyZGVuKHtcbmJyYW5kLC8vXG52YWx1ZTp2YWx1ZVNoYXBlfSk7XG5cbnJldHVybiBhbW91bnRTaGFwZTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZVBheW1lbnRMZWRnZXI9KFxuaXNzdWVyWm9uZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbnJlY292ZXJ5U2V0c1N0YXRlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbi8qICAgICAgICAgICAgICAgICAgICovXG4vL1xuY29uc3QgYnJhbmQ9aXNzdWVyWm9uZS5leG8oIGAke25hbWV9IGJyYW5kYCxCcmFuZEkse1xuaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKXtcbi8vXG5yZXR1cm4gYWxsZWdlZElzc3Vlcj09PWlzc3VlcjtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG4vL1xuZ2V0RGlzcGxheUluZm8oKXtcbnJldHVybiBkaXNwbGF5SW5mbztcbiB9LFxuZ2V0QW1vdW50U2hhcGUoKXtcbnJldHVybiBhbW91bnRTaGFwZTtcbiB9fSk7XG5cblxuY29uc3QgYW1vdW50U2hhcGU9YW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5lbGVtZW50U2hhcGUpO1xuXG5cbmNvbnN0e0lzc3VlckksTWludEksUGF5bWVudEksUHVyc2VJS2l0fT1tYWtlSXNzdWVySW50ZXJmYWNlcyhcbmJyYW5kLFxuYXNzZXRLaW5kLFxuYW1vdW50U2hhcGUpO1xuXG5cbmNvbnN0IG1ha2VQYXltZW50PXByZXBhcmVQYXltZW50S2luZChpc3N1ZXJab25lLG5hbWUsYnJhbmQsUGF5bWVudEkpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlPShyZWFzb24pPT57XG4vL1xuLy9cbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xudHJ5e1xub3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuIH1jYXRjaChlcnJJblNodXRkb3duKXtcbmFubm90YXRlRXJyb3IoZXJySW5TaHV0ZG93bixYIGBDYXVzZWQgYnk6ICR7cmVhc29ufWApO1xudGhyb3cgZXJySW5TaHV0ZG93bjtcbiB9XG4gfVxudGhyb3cgcmVhc29uO1xuIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwYXltZW50TGVkZ2VyPWlzc3VlclpvbmUud2Vha01hcFN0b3JlKCdwYXltZW50TGVkZ2VyJyx7XG52YWx1ZVNoYXBlOmFtb3VudFNoYXBlfSk7XG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgcGF5bWVudFJlY292ZXJ5U2V0cz1pc3N1ZXJab25lLndlYWtNYXBTdG9yZSgncGF5bWVudFJlY292ZXJ5U2V0cycpO1xuXG4vKlxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGluaXRQYXltZW50PShwYXltZW50LGFtb3VudCxvcHRSZWNvdmVyeVNldD11bmRlZmluZWQpPT57XG5pZihyZWNvdmVyeVNldHNTdGF0ZT09PSdub1JlY292ZXJ5U2V0cycpe1xub3B0UmVjb3ZlcnlTZXQ9PT11bmRlZmluZWR8fFxuRmFpbCBgd2hlbiByZWNvdmVyU2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnLCBvcHRSZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcbiB9XG5pZihvcHRSZWNvdmVyeVNldCE9PXVuZGVmaW5lZCYmIUFtb3VudE1hdGguaXNFbXB0eShhbW91bnQpKXtcbm9wdFJlY292ZXJ5U2V0LmFkZChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuaW5pdChwYXltZW50LG9wdFJlY292ZXJ5U2V0KTtcbiB9XG5wYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCxhbW91bnQpO1xuIH07XG5cbi8qXG5cblxuXG5cbiAgICovXG5jb25zdCBkZWxldGVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG5pZihwYXltZW50UmVjb3ZlcnlTZXRzLmhhcyhwYXltZW50KSl7XG5jb25zdCByZWNvdmVyeVNldD1wYXltZW50UmVjb3ZlcnlTZXRzLmdldChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuZGVsZXRlKHBheW1lbnQpO1xucmVjb3ZlcnlTZXQuZGVsZXRlKHBheW1lbnQpO1xuIH1cbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvZXJjZT0oYWxsZWdlZEFtb3VudCk9PkFtb3VudE1hdGguY29lcmNlKGJyYW5kLGFsbGVnZWRBbW91bnQpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQ9KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKT0+e1xuaWYob3B0QW1vdW50U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlLCdhbW91bnQnKTtcbiB9XG4gfTtcblxuLypcblxuXG4gICAqL1xuY29uc3QgYXNzZXJ0TGl2ZVBheW1lbnQ9KHBheW1lbnQpPT57XG5wYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KXx8XG5GYWlsIGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbmJyYW5kKVxuIH0uIEl0IGNvdWxkIGJlIGEgdXNlZC11cCBwYXltZW50LCBhIHBheW1lbnQgZm9yIGFub3RoZXIgYnJhbmQsIG9yIGl0IG1pZ2h0IG5vdCBiZSBhIHBheW1lbnQgYXQgYWxsLmA7XG4gfTtcblxuLypcblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBkZXBvc2l0SW50ZXJuYWw9KFxuYmFsYW5jZVN0b3JlLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9Plxue1xuIWlzUHJvbWlzZShzcmNQYXltZW50KXx8XG5hc3NlcnQuZmFpbChcbiBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcblR5cGVFcnJvcik7XG5cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbnRyeXtcbi8vXG4vL1xuLy9cbmRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5iYWxhbmNlU3RvcmUuaW5jcmVtZW50KHNyY1BheW1lbnRCYWxhbmNlKTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gfTtcblxuLypcblxuXG5cblxuXG5cbiAgICovXG5jb25zdCB3aXRoZHJhd0ludGVybmFsPShiYWxhbmNlU3RvcmUsYW1vdW50LHJlY292ZXJ5U2V0PXVuZGVmaW5lZCk9PntcbmFtb3VudD1jb2VyY2UoYW1vdW50KTtcbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbi8vXG4vL1xuYmFsYW5jZVN0b3JlLmRlY3JlbWVudChhbW91bnQpfHxcbkZhaWwgYFdpdGhkcmF3YWwgb2YgJHthbW91bnR9IGZhaWxlZCBiZWNhdXNlIHRoZSBwdXJzZSBvbmx5IGNvbnRhaW5lZCAke2JhbGFuY2VTdG9yZS5nZXRBbW91bnQoKX1gO1xudHJ5e1xuaW5pdFBheW1lbnQocGF5bWVudCxhbW91bnQscmVjb3ZlcnlTZXQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50O1xuIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuY29uc3QgbWFrZUVtcHR5UHVyc2U9cHJlcGFyZVB1cnNlS2luZChcbmlzc3VlclpvbmUsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5oYXJkZW4oe1xuZGVwb3NpdEludGVybmFsLFxud2l0aGRyYXdJbnRlcm5hbH0pLFxuXG5yZWNvdmVyeVNldHNTdGF0ZSxcbnBheW1lbnRSZWNvdmVyeVNldHMpO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbmNvbnN0IGlzc3Vlcj1pc3N1ZXJab25lLmV4byggYCR7bmFtZX0gaXNzdWVyYCxJc3N1ZXJJLHtcbmdldEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuZ2V0QXNzZXRLaW5kKCl7XG5yZXR1cm4gYXNzZXRLaW5kO1xuIH0sXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5tYWtlRW1wdHlQdXJzZSgpe1xucmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gfSxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuaXNMaXZlKHBheW1lbnQpe1xuLy9cbnJldHVybiBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KTtcbiB9LFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5nZXRBbW91bnRPZihwYXltZW50KXtcbi8vXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbnJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiB9LFxuLypcblxuXG4gICAgICovXG5idXJuKHBheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8vXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbmNvbnN0IHBheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChwYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG50cnl7XG4vL1xuZGVsZXRlUGF5bWVudChwYXltZW50KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudEJhbGFuY2U7XG4gfX0pO1xuXG5cbi8qXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlPS8qICAgICAgICAgICAgICAgICAgICovXG5pc3N1ZXJab25lLm1ha2VPbmNlKCdtaW50UmVjb3ZlcnlQdXJzZScsKCk9Pm1ha2VFbXB0eVB1cnNlKCkpO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1pbnQ9aXNzdWVyWm9uZS5leG8oIGAke25hbWV9IG1pbnRgLE1pbnRJLHtcbmdldElzc3Vlcigpe1xucmV0dXJuIGlzc3VlcjtcbiB9LFxubWludFBheW1lbnQobmV3QW1vdW50KXtcbm5ld0Ftb3VudD1jb2VyY2UobmV3QW1vdW50KTtcbm11c3RNYXRjaChuZXdBbW91bnQsYW1vdW50U2hhcGUsJ21pbnRlZCBhbW91bnQnKTtcbi8vXG4vL1xuY29uc3QgcmF3UGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQocmF3UGF5bWVudCxuZXdBbW91bnQsdW5kZWZpbmVkKTtcblxuY29uc3QgbWludFJlY292ZXJ5UHVyc2VCZWZvcmU9bWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xubWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LG5ld0Ftb3VudCk7XG5jb25zdCBwYXltZW50PW1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyPW1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbmFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSxtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRMZWRnZXIocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50TGVkZ2VyIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB3E0Qq6EAAAuhAAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vYW1vdW50TWF0aC5qcyIsIi4vdHJhbnNpZW50Tm90aWZpZXIuanMiLCIuL2Ftb3VudFN0b3JlLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVB1cnNlS2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLE0sbWFrZUNvcHlTZXQsQW1vdW50TWF0aCxtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQsbWFrZUFtb3VudFN0b3JlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLCBbJGjNj19hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudFN0b3JlLmpzXCIsIFtbXCJtYWtlQW1vdW50U3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZUFtb3VudFN0b3JlID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBFTVBUWV9DT1BZX1NFVD1tYWtlQ29weVNldChbXSk7XG5cbi8vXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVQdXJzZUtpbmQ9KFxuaXNzdWVyWm9uZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5icmFuZCxcblB1cnNlSUtpdCxcbnB1cnNlTWV0aG9kcyxcbnJlY292ZXJ5U2V0c1N0YXRlLFxucGF5bWVudFJlY292ZXJ5U2V0cyk9Plxue1xuY29uc3QgYW1vdW50U2hhcGU9YnJhbmQuZ2V0QW1vdW50U2hhcGUoKTtcblxuLy9cbi8vXG4vL1xuY29uc3R7cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZTp1cGRhdGVCYWxhbmNlfT1tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IG1heWJlUmVjb3ZlcnlTZXQ9KHN0YXRlKT0+e1xuY29uc3R7cmVjb3ZlcnlTZXR9PXN0YXRlO1xuaWYocmVjb3ZlcnlTZXRzU3RhdGU9PT0naGFzUmVjb3ZlcnlTZXRzJyl7XG5yZXR1cm4gcmVjb3ZlcnlTZXQ7XG4gfWVsc2V7XG5yZWNvdmVyeVNldHNTdGF0ZT09PSdub1JlY292ZXJ5U2V0cyd8fFxuRmFpbCBgcmVjb3ZlclNldHNTdGF0ZSBtdXN0IGJlIG5vUmVjb3ZlcnlTZXRzIGlmIGl0IGlzbid0IGhhc1JlY292ZXJTZXRzYDtcbnBheW1lbnRSZWNvdmVyeVNldHMhPT11bmRlZmluZWR8fFxuRmFpbCBgcGF5bWVudFJlY292ZXJ5U2V0cyBtdXN0IGFsd2F5cyBiZSBkZWZpbmVkYDtcbnJlY292ZXJ5U2V0LmdldFNpemUoKT09PTB8fFxuRmFpbCBgV2l0aCBub1JlY292ZXJ5U2V0cywgcmVjb3ZlcnlTZXQgbXVzdCBiZSBlbXB0eWA7XG5cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuIH07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0e2RlcG9zaXRJbnRlcm5hbCx3aXRoZHJhd0ludGVybmFsfT1wdXJzZU1ldGhvZHM7XG5jb25zdCBtYWtlUHVyc2VLaXQ9aXNzdWVyWm9uZS5leG9DbGFzc0tpdChcbiBgJHtuYW1lfSBQdXJzZWAsXG5QdXJzZUlLaXQsXG4oKT0+e1xuY29uc3QgY3VycmVudEJhbGFuY2U9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlY292ZXJ5U2V0PWlzc3VlclpvbmUuZGV0YWNoZWQoKS5zZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyk7XG5cbnJldHVybntcbmN1cnJlbnRCYWxhbmNlLFxucmVjb3ZlcnlTZXR9O1xuXG4gfSxcbntcbnB1cnNlOntcbmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLy9cbi8vXG5jb25zdHtzdGF0ZX09dGhpcztcbmNvbnN0e3B1cnNlfT10aGlzLmZhY2V0cztcbmNvbnN0IGJhbGFuY2VTdG9yZT1tYWtlQW1vdW50U3RvcmUoc3RhdGUsJ2N1cnJlbnRCYWxhbmNlJyk7XG4vL1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9ZGVwb3NpdEludGVybmFsKFxuYmFsYW5jZVN0b3JlLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlKTtcblxudXBkYXRlQmFsYW5jZShwdXJzZSxiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCkpO1xucmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuIH0sXG53aXRoZHJhdyhhbW91bnQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5jb25zdHtwdXJzZX09dGhpcy5mYWNldHM7XG5cbmNvbnN0IG9wdFJlY292ZXJ5U2V0PW1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuY29uc3QgYmFsYW5jZVN0b3JlPW1ha2VBbW91bnRTdG9yZShzdGF0ZSwnY3VycmVudEJhbGFuY2UnKTtcbi8vXG5jb25zdCBwYXltZW50PXdpdGhkcmF3SW50ZXJuYWwoXG5iYWxhbmNlU3RvcmUsXG5hbW91bnQsXG5vcHRSZWNvdmVyeVNldCk7XG5cbnVwZGF0ZUJhbGFuY2UocHVyc2UsYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbnJldHVybiBwYXltZW50O1xuIH0sXG5nZXRDdXJyZW50QW1vdW50KCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbmNvbnN0IGJhbGFuY2VTdG9yZT1tYWtlQW1vdW50U3RvcmUoc3RhdGUsJ2N1cnJlbnRCYWxhbmNlJyk7XG5yZXR1cm4gYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpO1xuIH0sXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKXtcbnJldHVybiBwcm92aWRlTm90aWZpZXIodGhpcy5mYWNldHMucHVyc2UpO1xuIH0sXG5nZXRBbGxlZ2VkQnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuXG5nZXREZXBvc2l0RmFjZXQoKXtcbnJldHVybiB0aGlzLmZhY2V0cy5kZXBvc2l0RmFjZXQ7XG4gfSxcblxuZ2V0UmVjb3ZlcnlTZXQoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuY29uc3Qgb3B0UmVjb3ZlcnlTZXQ9bWF5YmVSZWNvdmVyeVNldChzdGF0ZSk7XG5pZihvcHRSZWNvdmVyeVNldD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gRU1QVFlfQ09QWV9TRVQ7XG4gfVxucmV0dXJuIG9wdFJlY292ZXJ5U2V0LnNuYXBzaG90KCk7XG4gfSxcbnJlY292ZXJBbGwoKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbmxldCBhbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbmNvbnN0IG9wdFJlY292ZXJ5U2V0PW1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuaWYob3B0UmVjb3ZlcnlTZXQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGFtb3VudDsvL1xuIH1cbmZvcihjb25zdCBwYXltZW50IG9mIG9wdFJlY292ZXJ5U2V0LmtleXMoKSl7XG4vL1xuLy9cbmNvbnN0IGRlbHRhPWZhY2V0cy5wdXJzZS5kZXBvc2l0KHBheW1lbnQpO1xuYW1vdW50PUFtb3VudE1hdGguYWRkKGFtb3VudCxkZWx0YSxicmFuZCk7XG4gfVxub3B0UmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpPT09MHx8XG5GYWlsIGBpbnRlcm5hbDogUmVtYWluaW5nIHVucmVjb3ZlcmVkIHBheW1lbnRzOiAke2ZhY2V0cy5wdXJzZS5nZXRSZWNvdmVyeVNldCgpfWA7XG5yZXR1cm4gYW1vdW50O1xuIH19LFxuXG5kZXBvc2l0RmFjZXQ6e1xucmVjZWl2ZSguLi5hcmdzKXtcbnJldHVybiB0aGlzLmZhY2V0cy5wdXJzZS5kZXBvc2l0KC4uLmFyZ3MpO1xuIH19fSxcblxuXG57XG5zdGF0ZVNoYXBlOntcbmN1cnJlbnRCYWxhbmNlOmFtb3VudFNoYXBlLFxucmVjb3ZlcnlTZXQ6TS5yZW1vdGFibGUoJ3JlY292ZXJ5U2V0Jyl9fSk7XG5cblxuXG5yZXR1cm4oKT0+bWFrZVB1cnNlS2l0KCkucHVyc2U7XG4gfTskaM2PX29uY2UucHJlcGFyZVB1cnNlS2luZChwcmVwYXJlUHVyc2VLaW5kKTtcbmhhcmRlbihwcmVwYXJlUHVyc2VLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQdXJzZUtpbmQiOlsicHJlcGFyZVB1cnNlS2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACKmWPI1gUAANYFAAAtAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9ub3RpZmllciJdLCJleHBvcnRzIjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLHByb3ZpZGVMYXp5LG1ha2VOb3RpZmllcktpdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLy9cbi8vXG5jb25zdCAgICAgICAgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0PSgpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cz1tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0PShrZXkpPT5cbnByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLGtleSwoKT0+XG5tYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSkpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcj0oa2V5KT0+cHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG5jb25zdCB1cGRhdGU9KGtleSxuZXdWYWx1ZSk9PntcbmlmKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKXtcbmNvbnN0e3VwZGF0ZXJ9PXRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xudXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gfVxuIH07XG5cbnJldHVybntwcm92aWRlTm90aWZpZXIsdXBkYXRlfTtcbiB9OyRozY9fb25jZS5tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbmhhcmRlbihtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAASMHBOzBgAAMwYAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiLCJBbW91bnRTaGFwZSIsIkFzc2V0S2luZFNoYXBlIiwiQnJhbmRJIiwiQnJhbmRTaGFwZSIsIkRlcG9zaXRGYWNldFNoYXBlIiwiRGlzcGxheUluZm9TaGFwZSIsIklzc3VlcktpdFNoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJOb3RpZmllclNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsIlJhdGlvU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBNLG1hdGNoZXMsZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIiwgWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsIFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsIFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuLypcblxuXG4gKi9cblxuY29uc3QgICAgICAgIEJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ0JyYW5kJyk7JGjNj19vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyU2hhcGU9TS5yZW1vdGFibGUoJ0lzc3VlcicpOyRozY9fb25jZS5Jc3N1ZXJTaGFwZShJc3N1ZXJTaGFwZSk7XG5jb25zdCAgICAgICAgUGF5bWVudFNoYXBlPU0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjNj19vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuY29uc3QgICAgICAgIFB1cnNlU2hhcGU9TS5yZW1vdGFibGUoJ1B1cnNlJyk7JGjNj19vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG5jb25zdCAgICAgICAgRGVwb3NpdEZhY2V0U2hhcGU9TS5yZW1vdGFibGUoJ0RlcG9zaXRGYWNldCcpOyRozY9fb25jZS5EZXBvc2l0RmFjZXRTaGFwZShEZXBvc2l0RmFjZXRTaGFwZSk7XG5jb25zdCAgICAgICAgTm90aWZpZXJTaGFwZT1NLnJlbW90YWJsZSgnTm90aWZpZXInKTskaM2PX29uY2UuTm90aWZpZXJTaGFwZShOb3RpZmllclNoYXBlKTtcbmNvbnN0ICAgICAgICBNaW50U2hhcGU9TS5yZW1vdGFibGUoJ01pbnQnKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLk1pbnRTaGFwZShNaW50U2hhcGUpO1xuY29uc3QgTmF0VmFsdWVTaGFwZT1NLm5hdCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgQ29weVNldFZhbHVlU2hhcGU9TS5zZXQoKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZT1NLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlPU0ub3IoXG5OYXRWYWx1ZVNoYXBlLFxuQ29weVNldFZhbHVlU2hhcGUsXG5TZXRWYWx1ZVNoYXBlLFxuQ29weUJhZ1ZhbHVlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBBbW91bnRTaGFwZT17YnJhbmQ6QnJhbmRTaGFwZSx2YWx1ZTpBbW91bnRWYWx1ZVNoYXBlfTskaM2PX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuaGFyZGVuKEFtb3VudFNoYXBlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIEFtb3VudFBhdHRlcm5TaGFwZT1NLnBhdHRlcm4oKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5BbW91bnRQYXR0ZXJuU2hhcGUoQW1vdW50UGF0dGVyblNoYXBlKTtcbmNvbnN0ICAgICAgICBSYXRpb1NoYXBlPXtudW1lcmF0b3I6QW1vdW50U2hhcGUsZGVub21pbmF0b3I6QW1vdW50U2hhcGV9OyRozY9fb25jZS5SYXRpb1NoYXBlKFJhdGlvU2hhcGUpO1xuaGFyZGVuKFJhdGlvU2hhcGUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpc05hdFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsTmF0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzTmF0VmFsdWUoaXNOYXRWYWx1ZSk7XG5oYXJkZW4oaXNOYXRWYWx1ZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weVNldFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlTZXRWYWx1ZShpc0NvcHlTZXRWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5U2V0VmFsdWUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpc1NldFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsU2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzU2V0VmFsdWUoaXNTZXRWYWx1ZSk7XG5oYXJkZW4oaXNTZXRWYWx1ZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weUJhZ1ZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weUJhZ1ZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vL1xuY29uc3QgICAgICAgIE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUz0xMDA7JGjNj19vbmNlLk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyhNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpO1xuXG5jb25zdCAgICAgICAgQXNzZXRLaW5kU2hhcGU9TS5vcignbmF0Jywnc2V0JywnY29weVNldCcsJ2NvcHlCYWcnKTskaM2PX29uY2UuQXNzZXRLaW5kU2hhcGUoQXNzZXRLaW5kU2hhcGUpO1xuXG5jb25zdCAgICAgICAgRGlzcGxheUluZm9TaGFwZT1NLnNwbGl0UmVjb3JkKFxue30sXG57XG5kZWNpbWFsUGxhY2VzOk0uYW5kKFxuTS5ndGUoLU1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG5NLmx0ZShNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpKSxcblxuYXNzZXRLaW5kOkFzc2V0S2luZFNoYXBlfSxcblxue1xuLy9cbi8vXG59KTskaM2PX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgSXNzdWVyS2l0U2hhcGU9e1xuYnJhbmQ6QnJhbmRTaGFwZSxcbm1pbnQ6TWludFNoYXBlLFxubWludFJlY292ZXJ5UHVyc2U6UHVyc2VTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9OyRozY9fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5cbmhhcmRlbihJc3N1ZXJLaXRTaGFwZSk7XG5cbi8vXG5cbmNvbnN0ICAgICAgICBCcmFuZEk9TS5pbnRlcmZhY2UoJ0JyYW5kJyx7XG5pc015SXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5nZXRBbW91bnRTaGFwZTpNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKX0pO1xuXG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuQnJhbmRJKEJyYW5kSSk7XG5jb25zdCAgICAgICAgbWFrZUlzc3VlckludGVyZmFjZXM9KFxuYnJhbmRTaGFwZT1CcmFuZFNoYXBlLFxuYXNzZXRLaW5kU2hhcGU9QXNzZXRLaW5kU2hhcGUsXG5hbW91bnRTaGFwZT1BbW91bnRTaGFwZSk9Plxue1xuY29uc3QgSXNzdWVyST1NLmludGVyZmFjZSgnSXNzdWVyJyx7XG5nZXRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldEFzc2V0S2luZDpNLmNhbGwoKS5yZXR1cm5zKGFzc2V0S2luZFNoYXBlKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5tYWtlRW1wdHlQdXJzZTpNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG5pc0xpdmU6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QW1vdW50T2Y6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuYnVybjpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkuXG5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpLlxucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBNaW50ST1NLmludGVyZmFjZSgnTWludCcse1xuZ2V0SXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxubWludFBheW1lbnQ6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSl9KTtcblxuXG5jb25zdCBQYXltZW50ST1NLmludGVyZmFjZSgnUGF5bWVudCcse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSl9KTtcblxuXG5jb25zdCBQdXJzZUk9TS5pbnRlcmZhY2UoJ1B1cnNlJyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6TS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5kZXBvc2l0Ok0uY2FsbChQYXltZW50U2hhcGUpLlxub3B0aW9uYWwoQW1vdW50UGF0dGVyblNoYXBlKS5cbnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0RGVwb3NpdEZhY2V0Ok0uY2FsbCgpLnJldHVybnMoRGVwb3NpdEZhY2V0U2hhcGUpLFxud2l0aGRyYXc6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5nZXRSZWNvdmVyeVNldDpNLmNhbGwoKS5yZXR1cm5zKE0uc2V0T2YoUGF5bWVudFNoYXBlKSksXG5yZWNvdmVyQWxsOk0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpfSk7XG5cblxuY29uc3QgRGVwb3NpdEZhY2V0ST1NLmludGVyZmFjZSgnRGVwb3NpdEZhY2V0Jyx7XG5yZWNlaXZlOmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChQdXJzZUkpLm1ldGhvZEd1YXJkcy5kZXBvc2l0fSk7XG5cblxuY29uc3QgUHVyc2VJS2l0PXtcbnB1cnNlOlB1cnNlSSxcbmRlcG9zaXRGYWNldDpEZXBvc2l0RmFjZXRJfTtcblxuaGFyZGVuKFB1cnNlSUtpdCk7XG5cbnJldHVybiBoYXJkZW4oe1xuSXNzdWVySSxcbk1pbnRJLFxuUGF5bWVudEksXG5QdXJzZUlLaXR9KTtcblxuIH07JGjNj19vbmNlLm1ha2VJc3N1ZXJJbnRlcmZhY2VzKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbmhhcmRlbihtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmFuZFNoYXBlIjpbIkJyYW5kU2hhcGUiXSwiSXNzdWVyU2hhcGUiOlsiSXNzdWVyU2hhcGUiXSwiUGF5bWVudFNoYXBlIjpbIlBheW1lbnRTaGFwZSJdLCJQdXJzZVNoYXBlIjpbIlB1cnNlU2hhcGUiXSwiRGVwb3NpdEZhY2V0U2hhcGUiOlsiRGVwb3NpdEZhY2V0U2hhcGUiXSwiTm90aWZpZXJTaGFwZSI6WyJOb3RpZmllclNoYXBlIl0sIk1pbnRTaGFwZSI6WyJNaW50U2hhcGUiXSwiQW1vdW50U2hhcGUiOlsiQW1vdW50U2hhcGUiXSwiQW1vdW50UGF0dGVyblNoYXBlIjpbIkFtb3VudFBhdHRlcm5TaGFwZSJdLCJSYXRpb1NoYXBlIjpbIlJhdGlvU2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJJc3N1ZXJLaXRTaGFwZSI6WyJJc3N1ZXJLaXRTaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAS6w5NKAQAASgEAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFbRVxHpGQAA6RkAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FsbEUiLCJjYWxsU3luYyIsImlzQ2FsbGJhY2siLCJtYWtlRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VNZXRob2RDYWxsYmFjayIsIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siLCJwcmVwYXJlQXR0ZW51YXRvciIsInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLG1ha2VFcnJvcixxLEUsaXNPYmplY3QsaXNQYXNzYWJsZVN5bWJvbCxnZXRJbnRlcmZhY2VNZXRob2RLZXlzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsIFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzT2JqZWN0XCIsIFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIiwgWyRozY9fYSA9PiAoaXNQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzXCIsIFskaM2PX2EgPT4gKGdldEludGVyZmFjZU1ldGhvZEtleXMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuY29uc3R7b3duS2V5czpyYXdPd25LZXlzfT1SZWZsZWN0O1xuY29uc3Qgb3duS2V5cz1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5yYXdPd25LZXlzO1xuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpc1Byb3BlcnR5S2V5PShrZXkpPT57XG5zd2l0Y2godHlwZW9mIGtleSl7XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ251bWJlcic6XG5jYXNlJ3N5bWJvbCc6XG5yZXR1cm4gdHJ1ZTtcbmRlZmF1bHQ6XG5yZXR1cm4gZmFsc2U7fVxuXG4gfTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNhbGxTeW5jPShjYWxsYmFjaywuLi5hcmdzKT0+e1xuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdGFyZ2V0KC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH1cbnJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oLi4uYm91bmQsLi4uYXJncyk7XG4gfTskaM2PX29uY2UuY2FsbFN5bmMoY2FsbFN5bmMpO1xuaGFyZGVuKGNhbGxTeW5jKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNhbGxFPShjYWxsYmFjaywuLi5hcmdzKT0+e1xuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gRSh0YXJnZXQpKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH1cbnJldHVybiBFKHRhcmdldClbbWV0aG9kTmFtZV0oLi4uYm91bmQsLi4uYXJncyk7XG4gfTskaM2PX29uY2UuY2FsbEUoY2FsbEUpO1xuaGFyZGVuKGNhbGxFKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2s9KHRhcmdldCwuLi5ib3VuZCk9PntcbnR5cGVvZiB0YXJnZXQ9PT0nZnVuY3Rpb24nfHxcbkZhaWwgYHN5bmMgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbjogJHt0YXJnZXR9YDtcbi8qICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LGJvdW5kLGlzU3luYzp0cnVlfSk7XG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL2NiKTtcbiB9OyRozY9fb25jZS5tYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sobWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VGdW5jdGlvbkNhbGxiYWNrPSh0YXJnZXQsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxcbkZhaWwgYGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb24gcHJlc2VuY2U6ICR7dGFyZ2V0fWA7XG4vKiAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjYj1oYXJkZW4oe3RhcmdldCxib3VuZH0pO1xucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAqL2NiKTtcbiB9OyRozY9fb25jZS5tYWtlRnVuY3Rpb25DYWxsYmFjayhtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVN5bmNNZXRob2RDYWxsYmFjaz0odGFyZ2V0LG1ldGhvZE5hbWUsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxcbkZhaWwgYHN5bmMgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbnR5cGVvZiBtZXRob2ROYW1lPT09J3N0cmluZyd8fFxuaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKXx8XG5GYWlsIGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4vKiAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjYj1oYXJkZW4oe3RhcmdldCxtZXRob2ROYW1lLGJvdW5kLGlzU3luYzp0cnVlfSk7XG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL2NiKTtcbiB9OyRozY9fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZU1ldGhvZENhbGxiYWNrPSh0YXJnZXQsbWV0aG9kTmFtZSwuLi5ib3VuZCk9PntcbmlzT2JqZWN0KHRhcmdldCl8fEZhaWwgYG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG50eXBlb2YgbWV0aG9kTmFtZT09PSdzdHJpbmcnfHxcbmlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSl8fFxuRmFpbCBgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuLyogICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsbWV0aG9kTmFtZSxib3VuZH0pO1xucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAqL2NiKTtcbiB9OyRozY9fb25jZS5tYWtlTWV0aG9kQ2FsbGJhY2sobWFrZU1ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlTWV0aG9kQ2FsbGJhY2spO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzQ2FsbGJhY2s9KGNhbGxiYWNrKT0+e1xuaWYoIWlzT2JqZWN0KGNhbGxiYWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xucmV0dXJuKFxuaXNPYmplY3QodGFyZ2V0KSYmKFxubWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8XG50eXBlb2YgbWV0aG9kTmFtZT09PSdzdHJpbmcnfHxcbmlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkpJiZcbkFycmF5LmlzQXJyYXkoYm91bmQpKTtcblxuIH07JGjNj19vbmNlLmlzQ2FsbGJhY2soaXNDYWxsYmFjayk7XG5oYXJkZW4oaXNDYWxsYmFjayk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlQXR0ZW51YXRvcj0oXG56b25lLFxubWV0aG9kTmFtZXMsXG57aW50ZXJmYWNlR3VhcmQsdGFnPSdBdHRlbnVhdG9yJ309e30pPT5cbntcbi8qXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IG1ldGhvZHM9LyogICAgICAgICAgICAgICAgICAqL1xuZnJvbUVudHJpZXMoXG5tZXRob2ROYW1lcy5tYXAoKGtleSk9Pntcbi8vXG5pZighaXNQcm9wZXJ0eUtleShrZXkpKXtcbnRocm93IEZhaWwgYGtleSAke3Eoa2V5KX0gaXMgbm90IGEgUHJvcGVydHlLZXlgO1xuIH1cblxuY29uc3QgbT0vKiAgICAgICAgICAgICAgICAgICove1xuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgKi9cbltrZXldKC4uLmFyZ3Mpe1xuLy9cbmNvbnN0IGNiPXRoaXMuc3RhdGUuY2JzW2tleV07XG5pZighY2Ipe1xuY29uc3QgZXJyPW1ha2VFcnJvciggYHVuaW1wbGVtZW50ZWQgJHtxKHRhZyl9IG1ldGhvZCAke3Eoa2V5KX1gKTtcbmlmKHRoaXMuc3RhdGUuaXNTeW5jKXtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiB9XG5pZihjYi5pc1N5bmMpe1xucmV0dXJuIGNhbGxTeW5jKGNiLC4uLmFyZ3MpO1xuIH1cbnJldHVybiBjYWxsRShjYiwuLi5hcmdzKTtcbiB9fVtcbmtleV07XG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICovW2tleSxtXSk7XG4gfSkpO1xuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZUF0dGVudWF0b3I9em9uZS5leG9DbGFzcyhcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuLypcblxuXG5cblxuICAgICAqL1xuKHtcbnRhcmdldD1udWxsLFxuaXNTeW5jPWZhbHNlLFxub3ZlcnJpZGVzPS8qICAgICAgICAgICAgICAgICAgICAqL3t9fSk9Plxue1xuY29uc3QgY2JzPS8qICAgICAgICAgICAgICAgICAgICAqL3t9O1xuXG5jb25zdCByZW1haW5pbmc9bmV3IFNldChtZXRob2ROYW1lcyk7XG5mb3IoY29uc3Qga2V5IG9mIG93bktleXMob3ZlcnJpZGVzKSl7XG5yZW1haW5pbmcuaGFzKGtleSl8fFxuRmFpbCBgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIG5vdCBhbGxvd2VkIGJ5IG1ldGhvZE5hbWVzYDtcblxucmVtYWluaW5nLmRlbGV0ZShrZXkpO1xuY29uc3QgY2I9b3ZlcnJpZGVzW2tleV07XG5jYj09bnVsbHx8XG5pc0NhbGxiYWNrKGNiKXx8XG5GYWlsIGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gaXMgbm90IGEgY2FsbGJhY2s7IGdvdCAke2NifWA7XG5jYnNba2V5XT1jYjtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIHJlbWFpbmluZyl7XG5pZihpc1N5bmMpe1xuY2JzW2tleV09bWFrZVN5bmNNZXRob2RDYWxsYmFjayh0YXJnZXQsa2V5KTtcbiB9ZWxzZXtcbmNic1trZXldPW1ha2VNZXRob2RDYWxsYmFjayh0YXJnZXQsa2V5KTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7Y2JzLGlzU3luY30pO1xuIH0sXG4vKiAgICAgICAgICAgICAgICAgICovbWV0aG9kcyk7XG5cbnJldHVybiBtYWtlQXR0ZW51YXRvcjtcbiB9OyRozY9fb25jZS5wcmVwYXJlQXR0ZW51YXRvcihwcmVwYXJlQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUF0dGVudWF0b3IpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3I9KHpvbmUsaW50ZXJmYWNlR3VhcmQsb3B0cz17fSk9PntcbmNvbnN0IG1ldGhvZE5hbWVzPWdldEludGVyZmFjZU1ldGhvZEtleXMoaW50ZXJmYWNlR3VhcmQpO1xuY29uc3QgbWFrZUF0dGVudWF0b3I9cHJlcGFyZUF0dGVudWF0b3Ioem9uZSxtZXRob2ROYW1lcyx7XG4uLi5vcHRzLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovbWFrZUF0dGVudWF0b3IpO1xuIH07JGjNj19vbmNlLnByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxsU3luYyI6WyJjYWxsU3luYyJdLCJjYWxsRSI6WyJjYWxsRSJdLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siOlsibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siOlsibWFrZVN5bmNNZXRob2RDYWxsYmFjayJdLCJtYWtlTWV0aG9kQ2FsbGJhY2siOlsibWFrZU1ldGhvZENhbGxiYWNrIl0sImlzQ2FsbGJhY2siOlsiaXNDYWxsYmFjayJdLCJwcmVwYXJlQXR0ZW51YXRvciI6WyJwcmVwYXJlQXR0ZW51YXRvciJdLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiOlsicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADID/RnNBQAAzQUAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY29uZmlnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCcmlkZ2VJZCIsIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPS8qICAgICAgICAgICAgICAgICove1xuQkFOSzonYmFuaycsXG5DT1JFOidjb3JlJyxcbkRJQkM6J2RpYmMnLFxuU1RPUkFHRTonc3RvcmFnZScsXG5QUk9WSVNJT046J3Byb3Zpc2lvbicsXG5QUk9WSVNJT05fU01BUlRfV0FMTEVUOidwcm92aXNpb25XYWxsZXQnLFxuVkxPQ0FMQ0hBSU46J3Zsb2NhbGNoYWluJyxcblZUUkFOU0ZFUjondnRyYW5zZmVyJyxcbldBTExFVDond2FsbGV0J307JGjNj19vbmNlLkJyaWRnZUlkKEJyaWRnZUlkKTtcblxuaGFyZGVuKEJyaWRnZUlkKTtcblxuY29uc3QgICAgICAgIENvc21vc0luaXRLZXlUb0JyaWRnZUlkPXtcbnZiYW5rUG9ydDpCcmlkZ2VJZC5CQU5LLFxudmliY1BvcnQ6QnJpZGdlSWQuRElCQ307JGjNj19vbmNlLkNvc21vc0luaXRLZXlUb0JyaWRnZUlkKENvc21vc0luaXRLZXlUb0JyaWRnZUlkKTtcblxuXG5jb25zdCAgICAgICAgV2FsbGV0TmFtZT0vKiAgICAgICAgICAgICAgICAqL3tcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjNj19vbmNlLldhbGxldE5hbWUoV2FsbGV0TmFtZSk7XG5cbmhhcmRlbihXYWxsZXROYW1lKTtcblxuLy9cbmNvbnN0ICAgICAgICBWQmFua0FjY291bnQ9LyogICAgICAgICAgICAgICAgKi97XG5yZXNlcnZlOntcbm1vZHVsZTondmJhbmsvcmVzZXJ2ZScsXG5hZGRyZXNzOidhZ29yaWMxYWUwbG10emxncmNubGE5eGprcGFhcnE1ZDVkZmV6NjNoM251Y2wnfSxcblxucHJvdmlzaW9uOntcbm1vZHVsZTondmJhbmsvcHJvdmlzaW9uJyxcbmFkZHJlc3M6J2Fnb3JpYzFtZWd6eXRnNjVjeXJnenM2ZnZ6eGdyY3F2d3dsN3VncHQ2MjM0Nid9fTskaM2PX29uY2UuVkJhbmtBY2NvdW50KFZCYW5rQWNjb3VudCk7XG5cblxuaGFyZGVuKFZCYW5rQWNjb3VudCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCI6WyJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACcqLSXSAQAAEgEAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICAvL1xuXG5sZXQgZGVidWdJbnN0YW5jZT0xO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VUcmFjZXI9KG5hbWUsZW5hYmxlPXRydWUpPT57XG5kZWJ1Z0luc3RhbmNlKz0xO1xubGV0IGRlYnVnQ291bnQ9MTtcbmNvbnN0IGtleT0gYC0tLS0tICR7bmFtZX0uJHtkZWJ1Z0luc3RhbmNlfSBgO1xuLy9cbnN3aXRjaChlbmFibGUpe1xuY2FzZSBmYWxzZTp7XG5jb25zdCBsb2dEaXNhYmxlZD0oLi4uX2FyZ3MpPT57IH07XG5yZXR1cm4gbG9nRGlzYWJsZWQ7XG4gfVxuY2FzZSd2ZXJib3NlJzp7XG5jb25zdCBpbmZvVGljaz0ob3B0TG9nLC4uLmFyZ3MpPT57XG5pZihvcHRMb2cubG9nKXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gaW5mb1RpY2s7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBkZWJ1Z1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5vcHRMb2cubG9nKGtleSxkZWJ1Z0NvdW50Kz0xLC4uLmFyZ3MpO1xuIH1lbHNle1xuY29uc29sZS5pbmZvKGtleSxkZWJ1Z0NvdW50Kz0xLG9wdExvZywuLi5hcmdzKTtcbiB9XG4gfTtcbnJldHVybiBkZWJ1Z1RpY2s7XG4gfX1cblxuIH07JGjNj19vbmNlLm1ha2VUcmFjZXIobWFrZVRyYWNlcik7XG5oYXJkZW4obWFrZVRyYWNlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAtXgwo4CAACOAgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiTm9uTnVsbGlzaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBOb25OdWxsaXNoPSh2YWwsb3B0RGV0YWlscz0gYHVuZXhwZWN0ZWQgJHtxKHZhbCl9YCk9PntcbmlmKHZhbCE9bnVsbCl7XG4vL1xucmV0dXJuIHZhbDtcbiB9XG5hc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbiB9OyRozY9fb25jZS5Ob25OdWxsaXNoKE5vbk51bGxpc2gpO1xuaGFyZGVuKE5vbk51bGxpc2gpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiTm9uTnVsbGlzaCI6WyJOb25OdWxsaXNoIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB/2q4QLBQAACwUAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9jb25maWcuanMiLCIuL2RlYnVnLmpzIiwiLi9lcnJvcnMuanMiLCIuL2pzLXV0aWxzLmpzIiwiLi9tZXRob2QtdG9vbHMuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdHlwZUNoZWNrLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyIsIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL2Vycm9ycy5qcyIsIi4vanMtdXRpbHMuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vc2VzLXV0aWxzLmpzIiwiLi90eXBlQ2hlY2suanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi9lcnJvcnMuanNcIiwgW11dLFtcIi4vanMtdXRpbHMuanNcIiwgW11dLFtcIi4vbWV0aG9kLXRvb2xzLmpzXCIsIFtdXSxbXCIuL3Nlcy11dGlscy5qc1wiLCBbXV0sW1wiLi90eXBlQ2hlY2suanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW11dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanNcIiwgW11dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOltbIm9iamVjdE1hcCIsIm9iamVjdE1hcCJdXSwiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyI6W1sib2JqZWN0TWV0YU1hcCIsIm9iamVjdE1ldGFNYXAiXV0sIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjpbWyJmcm9tVW5pcXVlRW50cmllcyIsImZyb21VbmlxdWVFbnRyaWVzIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADML6bVHwcAAB8HAAAnAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2pzLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWVwQ29weUpzb25hYmxlIiwiZGVlcE1hcE9iamVjdCIsIm1ha2VNZWFzdXJlU2Vjb25kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cbi8vXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBkZWVwQ29weUpzb25hYmxlPSh2YWx1ZSk9PkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVlcENvcHlKc29uYWJsZShkZWVwQ29weUpzb25hYmxlKTtcbmNvbnN0IGRlZXBNYXBPYmplY3RJbnRlcm5hbD0odmFsdWUsbmFtZSxjb250YWluZXIsbWFwcGVyKT0+e1xuaWYoY29udGFpbmVyJiZ0eXBlb2YgbmFtZT09PSdzdHJpbmcnKXtcbmNvbnN0IG1hcHBlZD1tYXBwZXIodmFsdWUsbmFtZSxjb250YWluZXIpO1xuaWYobWFwcGVkIT09dmFsdWUpe1xucmV0dXJuIG1hcHBlZDtcbiB9XG4gfVxuXG5pZih0eXBlb2YgdmFsdWUhPT0nb2JqZWN0J3x8IXZhbHVlKXtcbnJldHVybiB2YWx1ZTtcbiB9XG5cbmxldCB3YXNNYXBwZWQ9ZmFsc2U7XG5jb25zdCBtYXBwZWRFbnRyaWVzPU9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtpbm5lck5hbWUsaW5uZXJWYWx1ZV0pPT57XG5jb25zdCBtYXBwZWRJbm5lclZhbHVlPWRlZXBNYXBPYmplY3RJbnRlcm5hbChcbmlubmVyVmFsdWUsXG5pbm5lck5hbWUsXG52YWx1ZSxcbm1hcHBlcik7XG5cbndhc01hcHBlZHx8PW1hcHBlZElubmVyVmFsdWUhPT1pbm5lclZhbHVlO1xucmV0dXJuW2lubmVyTmFtZSxtYXBwZWRJbm5lclZhbHVlXTtcbiB9KTtcblxucmV0dXJuIHdhc01hcHBlZD9PYmplY3QuZnJvbUVudHJpZXMobWFwcGVkRW50cmllcyk6dmFsdWU7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBkZWVwTWFwT2JqZWN0PShvYmosbWFwcGVyKT0+XG5kZWVwTWFwT2JqZWN0SW50ZXJuYWwob2JqLHVuZGVmaW5lZCx1bmRlZmluZWQsbWFwcGVyKTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVlcE1hcE9iamVjdChkZWVwTWFwT2JqZWN0KTtcbmNvbnN0ICAgICAgICBtYWtlTWVhc3VyZVNlY29uZHM9KGN1cnJlbnRUaW1lTWlsbGlzZWMpPT57XG4vKlxuXG5cblxuICAgKi9cbmNvbnN0IG1lYXN1cmVTZWNvbmRzPWFzeW5jKGZuKT0+e1xuY29uc3QgdDA9Y3VycmVudFRpbWVNaWxsaXNlYygpO1xuY29uc3QgcmVzdWx0PWF3YWl0IGZuKCk7XG5jb25zdCBkdXJhdGlvbk1pbGxpc2VjPWN1cnJlbnRUaW1lTWlsbGlzZWMoKS10MDtcbnJldHVybntyZXN1bHQsZHVyYXRpb246ZHVyYXRpb25NaWxsaXNlYy8xMDAwfTtcbiB9O1xucmV0dXJuIG1lYXN1cmVTZWNvbmRzO1xuIH07JGjNj19vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcENvcHlKc29uYWJsZSI6WyJkZWVwQ29weUpzb25hYmxlIl0sImRlZXBNYXBPYmplY3QiOlsiZGVlcE1hcE9iamVjdCJdLCJtYWtlTWVhc3VyZVNlY29uZHMiOlsibWFrZU1lYXN1cmVTZWNvbmRzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACZtFKvTFQAA0xUAAC8AAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbGliLWNoYWluU3RvcmFnZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyIsIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanMiLCIuL2NhbGxiYWNrLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q2FwRGF0YSIsImFzc2VydFBhdGhTZWdtZW50IiwiaXNTdHJlYW1DZWxsIiwibWFrZUNoYWluU3RvcmFnZVJvb3QiLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIiwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiLCJwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLEUsRmFyLE0sbWFrZUhlYXBab25lLGNiOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIiwgWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanNcIiwgW1tcIm1ha2VIZWFwWm9uZVwiLCBbJGjNj19hID0+IChtYWtlSGVhcFpvbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2NhbGxiYWNrLmpzXCIsIFtbXCIqXCIsIFskaM2PX2EgPT4gKGNiID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZUNoYWluU3RvcmFnZVJvb3QsICduYW1lJywge3ZhbHVlOiBcIm1ha2VDaGFpblN0b3JhZ2VSb290XCJ9KTskaM2PX29uY2UubWFrZUNoYWluU3RvcmFnZVJvb3QobWFrZUNoYWluU3RvcmFnZVJvb3QpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlU3RvcmFnZU5vZGVDaGlsZCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVN0b3JhZ2VOb2RlQ2hpbGRcIn0pOyRozY9fb25jZS5tYWtlU3RvcmFnZU5vZGVDaGlsZChtYWtlU3RvcmFnZU5vZGVDaGlsZCk7ICAgXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgQ2hhaW5TdG9yYWdlTm9kZUk9TS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJyx7XG5zZXRWYWx1ZTpNLmNhbGxXaGVuKE0uc3RyaW5nKCkpLnJldHVybnMoKSxcbmdldFBhdGg6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldFN0b3JlS2V5Ok0uY2FsbFdoZW4oKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxubWFrZUNoaWxkTm9kZTpNLmNhbGwoTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LHtzZXF1ZW5jZTpNLmJvb2xlYW4oKX0se30pKS5cbnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJykpfSk7XG5cblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzU3RyZWFtQ2VsbD0oY2VsbCk9PlxuY2VsbCYmXG50eXBlb2YgY2VsbD09PSdvYmplY3QnJiZcbkFycmF5LmlzQXJyYXkoY2VsbC52YWx1ZXMpJiZcbnR5cGVvZiBjZWxsLmJsb2NrSGVpZ2h0PT09J3N0cmluZycmJlxuL14wJHxeWzEtOV1bMC05XSokLy50ZXN0KGNlbGwuYmxvY2tIZWlnaHQpOyRozY9fb25jZS5pc1N0cmVhbUNlbGwoaXNTdHJlYW1DZWxsKTtcbmhhcmRlbihpc1N0cmVhbUNlbGwpO1xuXG4vL1xuLy9cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2FwRGF0YT0oZGF0YSk9PntcbmFzc2VydC50eXBlb2YoZGF0YSwnb2JqZWN0Jyk7XG5hc3NlcnQoZGF0YSk7XG5hc3NlcnQudHlwZW9mKGRhdGEuYm9keSwnc3RyaW5nJyk7XG5hc3NlcnQoQXJyYXkuaXNBcnJheShkYXRhLnNsb3RzKSk7XG4vL1xuIH07JGjNj19vbmNlLmFzc2VydENhcERhdGEoYXNzZXJ0Q2FwRGF0YSk7XG5oYXJkZW4oYXNzZXJ0Q2FwRGF0YSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBwYXRoU2VnbWVudFBhdHRlcm49L15bYS16QS1aMC05Xy1dezEsMTAwfSQvO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCAgICAgICAgYXNzZXJ0UGF0aFNlZ21lbnQ9KG5hbWUpPT57XG5wYXRoU2VnbWVudFBhdHRlcm4udGVzdChuYW1lKXx8XG5GYWlsIGBQYXRoIHNlZ21lbnQgbmFtZXMgbXVzdCBjb25zaXN0IG9mIDEgdG8gMTAwIGNoYXJhY3RlcnMgbGltaXRlZCB0byBBU0NJSSBhbHBoYW51bWVyaWNzLCB1bmRlcnNjb3JlcywgYW5kL29yIGRhc2hlczogJHtuYW1lfWA7XG4gfTskaM2PX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUNoYWluU3RvcmFnZU5vZGU9KHpvbmUpPT57XG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBtYWtlQ2hhaW5TdG9yYWdlTm9kZT16b25lLmV4b0NsYXNzKFxuJ0NoYWluU3RvcmFnZU5vZGUnLFxuQ2hhaW5TdG9yYWdlTm9kZUksXG4vKlxuXG5cblxuXG5cblxuICAgICAqL1xuKG1lc3NlbmdlcixwYXRoLHtzZXF1ZW5jZT1mYWxzZX09e30pPT57XG5hc3NlcnQudHlwZW9mKHBhdGgsJ3N0cmluZycpO1xuYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwnYm9vbGVhbicpO1xucmV0dXJuIGhhcmRlbih7cGF0aCxtZXNzZW5nZXIsc2VxdWVuY2V9KTtcbiB9LFxue1xuZ2V0UGF0aCgpe1xucmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiB9LFxuLypcblxuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIGdldFN0b3JlS2V5KCl7XG5jb25zdHtwYXRoLG1lc3Nlbmdlcn09dGhpcy5zdGF0ZTtcbnJldHVybiBjYi5jYWxsRShtZXNzZW5nZXIse1xubWV0aG9kOidnZXRTdG9yZUtleScsXG5hcmdzOltwYXRoXX0pO1xuXG4gfSxcbi8qXG5cblxuXG5cbiAgICAgICAqL1xubWFrZUNoaWxkTm9kZShuYW1lLGNoaWxkTm9kZU9wdGlvbnM9e30pe1xuY29uc3R7c2VxdWVuY2UscGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5hc3NlcnRQYXRoU2VnbWVudChuYW1lKTtcbmNvbnN0IG1lcmdlZE9wdGlvbnM9e3NlcXVlbmNlLC4uLmNoaWxkTm9kZU9wdGlvbnN9O1xucmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VOb2RlKFxubWVzc2VuZ2VyLFxuIGAke3BhdGh9LiR7bmFtZX1gLFxubWVyZ2VkT3B0aW9ucyk7XG5cbiB9LFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGFzeW5jIHNldFZhbHVlKHZhbHVlKXtcbmNvbnN0e3NlcXVlbmNlLHBhdGgsbWVzc2VuZ2VyfT10aGlzLnN0YXRlO1xuYXNzZXJ0LnR5cGVvZih2YWx1ZSwnc3RyaW5nJyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBlbnRyeTtcbmlmKCFzZXF1ZW5jZSYmIXZhbHVlKXtcbmVudHJ5PVtwYXRoXTtcbiB9ZWxzZXtcbmVudHJ5PVtwYXRoLHZhbHVlXTtcbiB9XG5hd2FpdCBjYi5jYWxsRShtZXNzZW5nZXIse1xubWV0aG9kOnNlcXVlbmNlPydhcHBlbmQnOidzZXQnLFxuYXJnczpbZW50cnldfSk7XG5cbiB9XG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xufSk7XG5cbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZTtcbiB9OyRozY9fb25jZS5wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSk7XG5cbmNvbnN0IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZT1wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShtYWtlSGVhcFpvbmUoKSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZUNoYWluU3RvcmFnZVJvb3QoXG5oYW5kbGVTdG9yYWdlTWVzc2FnZSxcbnJvb3RQYXRoLFxucm9vdE9wdGlvbnM9e30pXG57XG5jb25zdCBtZXNzZW5nZXI9Y2IubWFrZUZ1bmN0aW9uQ2FsbGJhY2soaGFuZGxlU3RvcmFnZU1lc3NhZ2UpO1xuXG4vL1xuY29uc3Qgcm9vdE5vZGU9bWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlKG1lc3Nlbmdlcixyb290UGF0aCxyb290T3B0aW9ucyk7XG5yZXR1cm4gcm9vdE5vZGU7XG4gfVxuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFrZU51bGxTdG9yYWdlTm9kZT0oKT0+e1xuLy9cbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbkZhcignTnVsbE1lc3NlbmdlcicsKCk9Pm51bGwpLFxuJ251bGwnKTtcblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gICAgICAgIG1ha2VTdG9yYWdlTm9kZUNoaWxkKHN0b3JhZ2VOb2RlUmVmLGNoaWxkTmFtZSl7XG5jb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlPWF3YWl0IHN0b3JhZ2VOb2RlUmVmO1xuY29uc3Qgc3RvcmFnZU5vZGU9ZXhpc3RpbmdTdG9yYWdlTm9kZXx8bWFrZU51bGxTdG9yYWdlTm9kZSgpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGROYW1lKTtcbiB9XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vL1xuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXJpYWxpemVUb1N0b3JhZ2U9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5yZXR1cm4gYXN5bmModmFsdWUpPT57XG5jb25zdCBtYXJzaGFsbGVkPWF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbmNvbnN0IHNlcmlhbGl6ZWQ9SlNPTi5zdHJpbmdpZnkobWFyc2hhbGxlZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gfTtcbiB9OyRozY9fb25jZS5tYWtlU2VyaWFsaXplVG9TdG9yYWdlKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTdHJlYW1DZWxsIjpbImlzU3RyZWFtQ2VsbCJdLCJhc3NlcnRDYXBEYXRhIjpbImFzc2VydENhcERhdGEiXSwiYXNzZXJ0UGF0aFNlZ21lbnQiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiXSwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiOlsicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwibWFrZUNoYWluU3RvcmFnZVJvb3QiOlsibWFrZUNoYWluU3RvcmFnZVJvb3QiXSwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiOlsibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiXSwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSI6WyJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN9Z4U2eDgAAng4AACYAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiLi9saWItY2hhaW5TdG9yYWdlLmpzIl0sImV4cG9ydHMiOlsiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiLCJtYWtlQm9hcmRSZW1vdGUiLCJtYWtlSGlzdG9yeVJldml2ZXIiLCJzbG90VG9Cb2FyZFJlbW90ZSIsInVubWFyc2hhbEZyb21Wc3RvcmFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLEZhcixtYWtlTWFyc2hhbCxpc1N0cmVhbUNlbGw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiLi9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJpc1N0cmVhbUNlbGxcIiwgWyRozY9fYSA9PiAoaXNTdHJlYW1DZWxsID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQm9hcmRSZW1vdGU9KHtib2FyZElkLGlmYWNlfSk9PntcbmNvbnN0IG5vbmFsbGVnZWQ9aWZhY2U/aWZhY2UucmVwbGFjZSgvXkFsbGVnZWQ6IC8sJycpOicnO1xucmV0dXJuIEZhciggYEJvYXJkUmVtb3RlJHtub25hbGxlZ2VkfWAse2dldEJvYXJkSWQ6KCk9PmJvYXJkSWR9KTtcbiB9O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5tYWtlQm9hcmRSZW1vdGUobWFrZUJvYXJkUmVtb3RlKTtcbmNvbnN0ICAgICAgICBzbG90VG9Cb2FyZFJlbW90ZT0oYm9hcmRJZCxpZmFjZSk9PlxubWFrZUJvYXJkUmVtb3RlKHtib2FyZElkLGlmYWNlfSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2Uuc2xvdFRvQm9hcmRSZW1vdGUoc2xvdFRvQm9hcmRSZW1vdGUpO1xuY29uc3QgYm9hcmRWYWxUb1Nsb3Q9KHZhbCk9PntcbmlmKCdnZXRCb2FyZElkJ2luIHZhbCl7XG5yZXR1cm4gdmFsLmdldEJvYXJkSWQoKTtcbiB9XG50aHJvdyBGYWlsIGB1bmtub3duIG9iaiBpbiBib2FyZFNsb3R0aW5nTWFyc2hhbGxlci52YWxUb1Nsb3QgJHt2YWx9YDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgYm9hcmRTbG90dGluZ01hcnNoYWxsZXI9KHNsb3RUb1ZhbD11bmRlZmluZWQpPT57XG5yZXR1cm4gbWFrZU1hcnNoYWwoYm9hcmRWYWxUb1Nsb3Qsc2xvdFRvVmFsLHtcbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KTtcblxuIH07XG5cbi8vXG4vL1xuLypcblxuXG4gKi8kaM2PX29uY2UuYm9hcmRTbG90dGluZ01hcnNoYWxsZXIoYm9hcmRTbG90dGluZ01hcnNoYWxsZXIpO1xuY29uc3QgYXNzZXJ0Q2FwRGF0YT0oZGF0YSk9PntcbmFzc2VydC50eXBlb2YoZGF0YSwnb2JqZWN0Jyk7XG5hc3NlcnQoZGF0YSk7XG5hc3NlcnQudHlwZW9mKGRhdGEuYm9keSwnc3RyaW5nJyk7XG5hc3NlcnQoQXJyYXkuaXNBcnJheShkYXRhLnNsb3RzKSk7XG4vL1xuIH07XG5oYXJkZW4oYXNzZXJ0Q2FwRGF0YSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHVubWFyc2hhbEZyb21Wc3RvcmFnZT0oZGF0YSxrZXksZnJvbUNhcERhdGEsaW5kZXgpPT57XG5jb25zdCBzZXJpYWxpemVkPWRhdGEuZ2V0KGtleSl8fEZhaWwgYG5vIGRhdGEgZm9yICR7a2V5fWA7XG5hc3NlcnQudHlwZW9mKHNlcmlhbGl6ZWQsJ3N0cmluZycpO1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5cbmNvbnN0IHN0cmVhbUNlbGw9SlNPTi5wYXJzZShzZXJpYWxpemVkKTtcbmlmKCFpc1N0cmVhbUNlbGwoc3RyZWFtQ2VsbCkpe1xudGhyb3cgRmFpbCBgbm90IGEgU3RyZWFtQ2VsbDogJHtzdHJlYW1DZWxsfWA7XG4gfVxuXG5jb25zdHt2YWx1ZXN9PXN0cmVhbUNlbGw7XG52YWx1ZXMubGVuZ3RoPjB8fEZhaWwgYG5vIFN0cmVhbUNlbGwgdmFsdWVzOiAke3N0cmVhbUNlbGx9YDtcblxuY29uc3QgbWFyc2hhbGxlZD12YWx1ZXMuYXQoaW5kZXgpO1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsbGVkLCdzdHJpbmcnKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjYXBEYXRhPWhhcmRlbihKU09OLnBhcnNlKG1hcnNoYWxsZWQpKTtcbmFzc2VydENhcERhdGEoY2FwRGF0YSk7XG5cbmNvbnN0IHVubWFyc2hhbGxlZD1mcm9tQ2FwRGF0YShjYXBEYXRhKTtcbnJldHVybiB1bm1hcnNoYWxsZWQ7XG4gfTskaM2PX29uY2UudW5tYXJzaGFsRnJvbVZzdG9yYWdlKHVubWFyc2hhbEZyb21Wc3RvcmFnZSk7XG5oYXJkZW4odW5tYXJzaGFsRnJvbVZzdG9yYWdlKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUhpc3RvcnlSZXZpdmVyPShlbnRyaWVzLHNsb3RUb1ZhbD11bmRlZmluZWQpPT57XG5jb25zdCBib2FyZD1ib2FyZFNsb3R0aW5nTWFyc2hhbGxlcihzbG90VG9WYWwpO1xuY29uc3QgdnNNYXA9bmV3IE1hcChlbnRyaWVzKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZnJvbUNhcERhdGE9KC4uLmFyZ3MpPT5cblJlZmxlY3QuYXBwbHkoYm9hcmQuZnJvbUNhcERhdGEsYm9hcmQsYXJncyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBnZXRJdGVtPShrZXkpPT51bm1hcnNoYWxGcm9tVnN0b3JhZ2UodnNNYXAsa2V5LGZyb21DYXBEYXRhLC0xKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNoaWxkcmVuPShwcmVmaXgpPT57XG5wcmVmaXguZW5kc1dpdGgoJy4nKXx8RmFpbCBgcHJlZml4IG11c3QgZW5kIHdpdGggJy4nYDtcbnJldHVybiBoYXJkZW4oW1xuLi4ubmV3IFNldChcbmVudHJpZXMuXG5tYXAoKFtrLF9dKT0+aykuXG5maWx0ZXIoKGspPT5rLnN0YXJ0c1dpdGgocHJlZml4KSkuXG5tYXAoKGspPT5rLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJylbMF0pKV0pO1xuXG5cbiB9O1xuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGhhcz0oayk9PnZzTWFwLmdldChrKSE9PXVuZGVmaW5lZDtcblxucmV0dXJuIGhhcmRlbih7Z2V0SXRlbSxjaGlsZHJlbixoYXN9KTtcbiB9OyRozY9fb25jZS5tYWtlSGlzdG9yeVJldml2ZXIobWFrZUhpc3RvcnlSZXZpdmVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VCb2FyZFJlbW90ZSI6WyJtYWtlQm9hcmRSZW1vdGUiXSwic2xvdFRvQm9hcmRSZW1vdGUiOlsic2xvdFRvQm9hcmRSZW1vdGUiXSwiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiOlsiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiXSwidW5tYXJzaGFsRnJvbVZzdG9yYWdlIjpbInVubWFyc2hhbEZyb21Wc3RvcmFnZSJdLCJtYWtlSGlzdG9yeVJldml2ZXIiOlsibWFrZUhpc3RvcnlSZXZpdmVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALa9IV5rCAAAawgAACsAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJiaW5kQWxsTWV0aG9kcyIsImdldE1ldGhvZE5hbWVzIiwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgaXNPYmplY3Q7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuLypcblxuXG4gKi9cblxuY29uc3R7Z2V0UHJvdG90eXBlT2YsY3JlYXRlLGZyb21FbnRyaWVzLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuY29uc3R7b3duS2V5cyxhcHBseX09UmVmbGVjdDtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGNvbXBhcmVTdHJpbmdpZmllZD0oYSxiKT0+e1xuaWYodHlwZW9mIGE9PT10eXBlb2YgYil7XG5jb25zdCBsZWZ0PVN0cmluZyhhKTtcbmNvbnN0IHJpZ2h0PVN0cmluZyhiKTtcbi8vXG5yZXR1cm4gbGVmdDxyaWdodD8tMTpsZWZ0PnJpZ2h0PzE6MDtcbiB9XG5pZih0eXBlb2YgYT09PSdzeW1ib2wnKXtcbmFzc2VydCh0eXBlb2YgYj09PSdzdHJpbmcnKTtcbnJldHVybi0xO1xuIH1cbmFzc2VydCh0eXBlb2YgYT09PSdzdHJpbmcnKTtcbmFzc2VydCh0eXBlb2YgYj09PSdzeW1ib2wnKTtcbnJldHVybiAxO1xuIH07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kTmFtZXM9KHZhbCk9PntcbmxldCBsYXllcj12YWw7XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7Ly9cbndoaWxlKGxheWVyIT09bnVsbCYmbGF5ZXIhPT1PYmplY3QucHJvdG90eXBlKXtcbi8vXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGxheWVyKTtcbmNvbnN0IG93bk5hbWVzPS8qICAgICAgICAgICAgICAqL293bktleXMoZGVzY3MpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duTmFtZXMpe1xuLy9cbi8vXG5pZih0eXBlb2YgdmFsW25hbWVdPT09J2Z1bmN0aW9uJyl7XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxuIH1cbmlmKCFpc09iamVjdCh2YWwpKXtcbmJyZWFrO1xuIH1cbmxheWVyPWdldFByb3RvdHlwZU9mKGxheWVyKTtcbiB9XG5yZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbiB9OyRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5oYXJkZW4oZ2V0TWV0aG9kTmFtZXMpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldFN0cmluZ01ldGhvZE5hbWVzPSh2YWwpPT5cbi8qICAgICAgICAgICAgICAgICAgICovXG5nZXRNZXRob2ROYW1lcyh2YWwpLmZpbHRlcigobmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycpO1xuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZ2V0U3RyaW5nTWV0aG9kTmFtZXMoZ2V0U3RyaW5nTWV0aG9kTmFtZXMpO1xuY29uc3QgICAgICAgIGJpbmRBbGxNZXRob2RzPShvYmopPT5cbmhhcmRlbihcbmNyZWF0ZShcbm9iaixcbmZyb21FbnRyaWVzKFxuZ2V0TWV0aG9kTmFtZXMob2JqKS5tYXAoKG5hbWUpPT5bXG5uYW1lLFxue1xudmFsdWU6KC8qICAgICAgICAgICAgICAgICAgICAqLy4uLmFyZ3MpPT5cbmFwcGx5KG9ialtuYW1lXSxvYmosYXJncyksXG5lbnVtZXJhYmxlOnRydWV9XSkpKSk7JGjNj19vbmNlLmJpbmRBbGxNZXRob2RzKGJpbmRBbGxNZXRob2RzKTtcblxuXG5cblxuXG5oYXJkZW4oYmluZEFsbE1ldGhvZHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiOlsiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmgUfr4YdAACGHQAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9zZXMtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vc3RyZWFtIiwiamVzc2llLmpzIl0sImV4cG9ydHMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIiwiYWdncmVnYXRlVHJ5RmluYWxseSIsImFsbFZhbHVlcyIsImFzc2VydEFsbERlZmluZWQiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmb3JldmVyIiwic3luY2hyb25pemVkVGVlIiwidW50aWxUcnVlIiwid2hpbGVUcnVlIiwid2l0aERlZmVycmVkQ2xlYW51cCIsInppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBxLEZhaWwsbWFrZUVycm9yLGFubm90YXRlRXJyb3IsWCxkZWVwbHlGdWxmaWxsZWQsaXNPYmplY3QsbWFrZVByb21pc2VLaXQsbWFrZVF1ZXVlLGFzeW5jR2VuZXJhdGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsIFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsIFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaM2PX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLCBbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsIFskaM2PX2EgPT4gKG1ha2VRdWV1ZSA9ICRozY9fYSldXV1dLFtcImplc3NpZS5qc1wiLCBbW1wiYXN5bmNHZW5lcmF0ZVwiLCBbJGjNj19hID0+IChhc3luY0dlbmVyYXRlID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2Zyb21FbnRyaWVzLGtleXMsdmFsdWVzfT1PYmplY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWRPYmplY3Q9YXN5bmMob2JqKT0+e1xuaXNPYmplY3Qob2JqKXx8RmFpbCBgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xucmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xuIH07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCBtYWtlQWdncmVnYXRlRXJyb3I9XG50eXBlb2YgQWdncmVnYXRlRXJyb3I9PT0nZnVuY3Rpb24nP1xuKGVycm9ycyxtZXNzYWdlLG9wdGlvbnMpPT5BZ2dyZWdhdGVFcnJvcihlcnJvcnMsbWVzc2FnZSxvcHRpb25zKTpcbihlcnJvcnMsbWVzc2FnZSxvcHRpb25zKT0+e1xucmV0dXJuIG1ha2VFcnJvcihtZXNzYWdlPz8nbXVsdGlwbGUgZXJyb3JzJyx1bmRlZmluZWQse1xuLi4ub3B0aW9ucyxcbmVycm9yc30pO1xuXG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIFByb21pc2VBbGxPckVycm9ycz1hc3luYyhpdGVtcyk9PntcbnJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoaXRlbXMpLnRoZW4oKHJlc3VsdHMpPT57XG5jb25zdCBlcnJvcnM9LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbnJlc3VsdHMuZmlsdGVyKCh7c3RhdHVzfSk9PnN0YXR1cz09PSdyZWplY3RlZCcpLlxubWFwKChyZXN1bHQpPT5yZXN1bHQucmVhc29uKTtcbmlmKCFlcnJvcnMubGVuZ3RoKXtcbnJldHVybiAoLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovcmVzdWx0cy5tYXAoXG4ocmVzdWx0KT0+cmVzdWx0LnZhbHVlKSk7XG5cbiB9ZWxzZSBpZihlcnJvcnMubGVuZ3RoPT09MSl7XG50aHJvdyBlcnJvcnNbMF07XG4gfWVsc2V7XG50aHJvdyBtYWtlQWdncmVnYXRlRXJyb3IoZXJyb3JzKTtcbiB9XG4gfSk7XG4gfTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLlByb21pc2VBbGxPckVycm9ycyhQcm9taXNlQWxsT3JFcnJvcnMpO1xuY29uc3QgICAgICAgIGFnZ3JlZ2F0ZVRyeUZpbmFsbHk9YXN5bmModHJpZXIsZmluYWxpemVyKT0+XG50cmllcigpLnRoZW4oXG5hc3luYyhyZXN1bHQpPT5maW5hbGl6ZXIoKS50aGVuKCgpPT5yZXN1bHQpLFxuYXN5bmModHJ5RXJyb3IpPT5cbmZpbmFsaXplcih0cnlFcnJvcikuXG50aGVuKFxuKCk9PnRyeUVycm9yLFxuKGZpbmFsaXplRXJyb3IpPT5tYWtlQWdncmVnYXRlRXJyb3IoW3RyeUVycm9yLGZpbmFsaXplRXJyb3JdKSkuXG5cbnRoZW4oKGVycm9yKT0+UHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG5cblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG5jb25zdCAgICAgICAgd2l0aERlZmVycmVkQ2xlYW51cD1hc3luYyhmbik9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY2xlYW51cHNMSUZPPVtdO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBhZGRDbGVhbnVwPShjbGVhbnVwKT0+e1xuY2xlYW51cHNMSUZPLnVuc2hpZnQoY2xlYW51cCk7XG4gfTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBmaW5hbGl6ZXI9YXN5bmMoZXJyKT0+e1xuLy9cbmNvbnN0IGNsZWFudXBSZXN1bHRzPWNsZWFudXBzTElGTy5tYXAoYXN5bmMoY2xlYW51cCk9PntcbmF3YWl0IG51bGw7XG5yZXR1cm4gY2xlYW51cChlcnIpO1xuIH0pO1xuYXdhaXQgUHJvbWlzZUFsbE9yRXJyb3JzKGNsZWFudXBSZXN1bHRzKTtcbiB9O1xucmV0dXJuIGFnZ3JlZ2F0ZVRyeUZpbmFsbHkoKCk9PmZuKGFkZENsZWFudXApLGZpbmFsaXplcik7XG4gfTtcblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLndpdGhEZWZlcnJlZENsZWFudXAod2l0aERlZmVycmVkQ2xlYW51cCk7XG5jb25zdCAgICAgICAgYXNzZXJ0QWxsRGVmaW5lZD0ob2JqKT0+e1xuY29uc3QgbWlzc2luZz1bXTtcbmZvcihjb25zdFtrZXksdmFsXW9mIE9iamVjdC5lbnRyaWVzKG9iaikpe1xuaWYodmFsPT09dW5kZWZpbmVkKXtcbm1pc3NpbmcucHVzaChrZXkpO1xuIH1cbiB9XG5pZihtaXNzaW5nLmxlbmd0aD4wKXtcbkZhaWwgYG1pc3NpbmcgJHtxKG1pc3NpbmcpfWA7XG4gfVxuIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG5jb25zdCBub3REb25lPWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTp1bmRlZmluZWR9KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBhbHdheXNEb25lPWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG5jb25zdCAgICAgICAgZm9yZXZlcj1hc3luY0dlbmVyYXRlKCgpPT5ub3REb25lKTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZm9yZXZlcihmb3JldmVyKTtcbmNvbnN0ICAgICAgICB3aGlsZVRydWU9KHByb2R1Y2UpPT5cbmFzeW5jR2VuZXJhdGUoYXN5bmMoKT0+e1xuY29uc3QgdmFsdWU9YXdhaXQgcHJvZHVjZSgpO1xuaWYoIXZhbHVlKXtcbnJldHVybiBhbHdheXNEb25lO1xuIH1cbnJldHVybiBoYXJkZW4oe1xuZG9uZTpmYWxzZSxcbnZhbHVlfSk7XG5cbiB9KTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2Uud2hpbGVUcnVlKHdoaWxlVHJ1ZSk7XG5jb25zdCAgICAgICAgdW50aWxUcnVlPShwcm9kdWNlKT0+XG5hc3luY0dlbmVyYXRlKGFzeW5jKCk9PntcbmNvbnN0IHZhbHVlPWF3YWl0IHByb2R1Y2UoKTtcbmlmKHZhbHVlKXtcbnJldHVybiBoYXJkZW4oe1xuZG9uZTp0cnVlLFxudmFsdWV9KTtcblxuIH1cbnJldHVybiBoYXJkZW4oe1xuZG9uZTpmYWxzZSxcbnZhbHVlfSk7XG5cbiB9KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnVudGlsVHJ1ZSh1bnRpbFRydWUpO1xuY29uc3QgICAgICAgIHppcD0oeHMseXMpPT5oYXJkZW4oeHMubWFwKCh4LGkpPT5beCx5c1sraV1dKSk7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuemlwKHppcCk7XG5jb25zdCAgICAgICAgYWxsVmFsdWVzPWFzeW5jKG9iaik9PntcbmNvbnN0IHJlc29sdmVkPWF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbi8vXG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKHppcChrZXlzKG9iaikscmVzb2x2ZWQpKSk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmFsbFZhbHVlcyhhbGxWYWx1ZXMpO1xuY29uc3QgICAgICAgIHN5bmNocm9uaXplZFRlZT0oc291cmNlU3RyZWFtLHJlYWRlckNvdW50KT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBkb25lUmVzdWx0O1xuXG4vKlxuXG5cblxuICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHF1ZXVlcz1bXTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHVsbE5leHQ9YXN5bmMoKT0+e1xuY29uc3QgcmVxdWVzdHM9YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHF1ZXVlcy5tYXAoKHF1ZXVlKT0+cXVldWUuZ2V0KCkpKTtcbmNvbnN0IHJlamVjdGlvbnM9W107XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlc29sdmVycz1bXTtcbmxldCBkb25lPWZhbHNlO1xuZm9yKGNvbnN0IHNldHRsZWRSZXN1bHQgb2YgcmVxdWVzdHMpe1xuaWYoc2V0dGxlZFJlc3VsdC5zdGF0dXM9PT0ncmVqZWN0ZWQnKXtcbnJlamVjdGlvbnMucHVzaChzZXR0bGVkUmVzdWx0LnJlYXNvbik7XG4gfWVsc2V7XG5kb25lfHw9ISFzZXR0bGVkUmVzdWx0LnZhbHVlLmRvbmU7XG5yZXNvbHZlcnMucHVzaChzZXR0bGVkUmVzdWx0LnZhbHVlLnZhbHVlKTtcbiB9XG4gfVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCByZXN1bHQ7XG5pZihkb25lUmVzdWx0KXtcbnJlc3VsdD1Qcm9taXNlLnJlc29sdmUoZG9uZVJlc3VsdCk7XG4gfWVsc2UgaWYocmVqZWN0aW9ucy5sZW5ndGgpe1xuY29uc3QgZXJyb3I9bWFrZUVycm9yKFggYFRlZWQgc3RyZWFtIHRocmV3YCk7XG5hbm5vdGF0ZUVycm9yKGVycm9yLFggYFRlZWQgcmVqZWN0aW9uczogJHtyZWplY3Rpb25zfWApO1xucmVzdWx0PVxuc291cmNlU3RyZWFtLnRocm93Py4oZXJyb3IpfHxcblByb21pc2UucmVzb2x2ZShzb3VyY2VTdHJlYW0ucmV0dXJuPy4oKSkudGhlbigoKT0+XG5Qcm9taXNlLnJlamVjdChlcnJvcikpO1xuXG4gfWVsc2UgaWYoZG9uZSl7XG5yZXN1bHQ9XG5zb3VyY2VTdHJlYW0ucmV0dXJuPy4oKXx8XG5Qcm9taXNlLnJlc29sdmUoe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9ZWxzZXtcbnJlc3VsdD1zb3VyY2VTdHJlYW0ubmV4dCgpO1xuIH1cbnJlc3VsdC50aGVuKFxuKHIpPT57XG5pZihyLmRvbmUpe1xuZG9uZVJlc3VsdD1yO1xuIH1cbiB9LFxuKCk9PntcbmRvbmVSZXN1bHQ9e2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9O1xuIH0pO1xuXG5mb3IoY29uc3QgcmVzb2x2ZSBvZiByZXNvbHZlcnMpe1xucmVzb2x2ZShyZXN1bHQpO1xuIH1cbnJldHVybiBwdWxsTmV4dCgpO1xuIH07XG5cbmNvbnN0IHJlYWRlcnM9QXJyYXkuZnJvbSh7bGVuZ3RoOnJlYWRlckNvdW50fSkubWFwKCgpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcXVldWU9bWFrZVF1ZXVlKCk7XG5xdWV1ZXMucHVzaChxdWV1ZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCByZWFkZXI9aGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKXtcbi8qXG5cblxuXG4gICAgICAgICAqL1xuY29uc3R7cHJvbWlzZSxyZXNvbHZlfT1tYWtlUHJvbWlzZUtpdCgpO1xucXVldWUucHV0KHt2YWx1ZTpyZXNvbHZlLGRvbmU6ZmFsc2V9KTtcbnJldHVybiBwcm9taXNlO1xuIH0sXG4gICAgICBhc3luYyByZXR1cm4oKXtcbi8qXG5cblxuXG4gICAgICAgICAqL1xuY29uc3R7cHJvbWlzZSxyZXNvbHZlfT1tYWtlUHJvbWlzZUtpdCgpO1xucXVldWUucHV0KHt2YWx1ZTpyZXNvbHZlLGRvbmU6dHJ1ZX0pO1xucmV0dXJuIHByb21pc2U7XG4gfSxcbiAgICAgIGFzeW5jIHRocm93KHJlYXNvbil7XG5jb25zdCByZWplY3Rpb249UHJvbWlzZS5yZWplY3QocmVhc29uKTtcbnF1ZXVlLnB1dChyZWplY3Rpb24pO1xucmV0dXJuIHJlamVjdGlvbjtcbiB9LFxuLy9cbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiByZWFkZXI7XG4gfSxcbi8vXG4gICAgICBhc3luY1tTeW1ib2wuYXN5bmNEaXNwb3NlXSgpe1xuYXdhaXQgcmVhZGVyLnJldHVybigpO1xuIH19KTtcblxucmV0dXJuIHJlYWRlcjtcbiB9KTtcblxudm9pZCBwdWxsTmV4dCgpO1xucmV0dXJuIHJlYWRlcnM7XG4gfTskaM2PX29uY2Uuc3luY2hyb25pemVkVGVlKHN5bmNocm9uaXplZFRlZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIlByb21pc2VBbGxPckVycm9ycyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiXSwiYWdncmVnYXRlVHJ5RmluYWxseSI6WyJhZ2dyZWdhdGVUcnlGaW5hbGx5Il0sIndpdGhEZWZlcnJlZENsZWFudXAiOlsid2l0aERlZmVycmVkQ2xlYW51cCJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAJewgWEB0AABAdAAAxAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3N0b3JhZ2UtdGVzdC11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiLi9tYXJzaGFsLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbGliLWNoYWluU3RvcmFnZS5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90ZXN0aW5nLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdE1hcnNoYWxsZXIiLCJkb2N1bWVudFN0b3JhZ2VTY2hlbWEiLCJtYWtlRmFrZVN0b3JhZ2VLaXQiLCJtYWtlTW9ja0NoYWluU3RvcmFnZVJvb3QiLCJzbG90U3RyaW5nVW5zZXJpYWxpemUiLCJzbG90VG9SZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxGYXIsbWFrZU1hcnNoYWwsUmVtb3RhYmxlLHVubWFyc2hhbEZyb21Wc3RvcmFnZSxtYWtlVHJhY2VyLGlzU3RyZWFtQ2VsbCxtYWtlQ2hhaW5TdG9yYWdlUm9vdCxiaW5kQWxsTWV0aG9kcyxldmVudExvb3BJdGVyYXRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZVwiLCBbJGjNj19hID0+IChSZW1vdGFibGUgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcInVubWFyc2hhbEZyb21Wc3RvcmFnZVwiLCBbJGjNj19hID0+ICh1bm1hcnNoYWxGcm9tVnN0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCIuL2RlYnVnLmpzXCIsIFtbXCJtYWtlVHJhY2VyXCIsIFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcImlzU3RyZWFtQ2VsbFwiLCBbJGjNj19hID0+IChpc1N0cmVhbUNlbGwgPSAkaM2PX2EpXV0sW1wibWFrZUNoYWluU3RvcmFnZVJvb3RcIiwgWyRozY9fYSA9PiAobWFrZUNoYWluU3RvcmFnZVJvb3QgPSAkaM2PX2EpXV1dXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbW1wiYmluZEFsbE1ldGhvZHNcIiwgWyRozY9fYSA9PiAoYmluZEFsbE1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3Rlc3RpbmctdXRpbHMuanNcIiwgW1tcImV2ZW50TG9vcEl0ZXJhdGlvblwiLCBbJGjNj19hID0+IChldmVudExvb3BJdGVyYXRpb24gPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3QgdHJhY2U9bWFrZVRyYWNlcignU3RvclRVJyxmYWxzZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgc2xvdFRvUmVtb3RhYmxlPShfc2xvdElkLGlmYWNlPSdSZW1vdGFibGUnKT0+XG5SZW1vdGFibGUoaWZhY2UpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5zbG90VG9SZW1vdGFibGUoc2xvdFRvUmVtb3RhYmxlKTtcbmNvbnN0ICAgICAgICBkZWZhdWx0TWFyc2hhbGxlcj1tYWtlTWFyc2hhbCh1bmRlZmluZWQsc2xvdFRvUmVtb3RhYmxlLHtcbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KTtcblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZhdWx0TWFyc2hhbGxlcihkZWZhdWx0TWFyc2hhbGxlcik7XG5jb25zdCBtYWtlU2xvdFN0cmluZ1Vuc2VyaWFsaXplPSgpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlkZW50aXR5U2xvdFRvVmFsRm49KHNsb3QsXyk9PkZhcigndW5rJyx7dG9KU09OOigpPT5zbG90fSk7XG5jb25zdHtmcm9tQ2FwRGF0YX09bWFrZU1hcnNoYWwodW5kZWZpbmVkLGlkZW50aXR5U2xvdFRvVmFsRm4pO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB1bnNlcmlhbGl6ZT0oY2FwRGF0YSk9PlxuSlNPTi5wYXJzZShcbkpTT04uc3RyaW5naWZ5KGZyb21DYXBEYXRhKGNhcERhdGEpLChfLHZhbCk9PntcbmlmKHR5cGVvZiB2YWw9PT0nYmlnaW50Jyl7XG4vL1xuLy9cbnJldHVybiBgQGVuY3JvbXVsYXRlOiR7dmFsfWA7XG4gfWVsc2V7XG5yZXR1cm4gdmFsO1xuIH1cbiB9KSxcbihfa2V5LHZhbCk9PntcbmlmKHR5cGVvZiB2YWw9PT0nc3RyaW5nJyYmdmFsLnN0YXJ0c1dpdGgoJ0BlbmNyb211bGF0ZScpKXtcbnJldHVybiBCaWdJbnQodmFsLnNwbGl0KCc6JylbMV0pO1xuIH1lbHNle1xucmV0dXJuIHZhbDtcbiB9XG4gfSk7XG5cbnJldHVybiBoYXJkZW4odW5zZXJpYWxpemUpO1xuIH07XG5jb25zdCAgICAgICAgc2xvdFN0cmluZ1Vuc2VyaWFsaXplPW1ha2VTbG90U3RyaW5nVW5zZXJpYWxpemUoKTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5zbG90U3RyaW5nVW5zZXJpYWxpemUoc2xvdFN0cmluZ1Vuc2VyaWFsaXplKTtcbmNvbnN0ICAgICAgICBtYWtlRmFrZVN0b3JhZ2VLaXQ9KHJvb3RQYXRoLHJvb3RPcHRpb25zKT0+e1xuY29uc3QgcmVzb2x2ZWRPcHRpb25zPXtzZXF1ZW5jZTp0cnVlLC4uLnJvb3RPcHRpb25zfTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGF0YT1uZXcgTWFwKCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZ2V0Q2hpbGRFbnRyaWVzPShwcmVmaXgpPT57XG5hc3NlcnQocHJlZml4LmVuZHNXaXRoKCcuJykpO1xuY29uc3QgY2hpbGRFbnRyaWVzPW5ldyBNYXAoKTtcbmZvcihjb25zdFtwYXRoLHZhbHVlXW9mIGRhdGEuZW50cmllcygpKXtcbmlmKCFwYXRoLnN0YXJ0c1dpdGgocHJlZml4KSl7XG5jb250aW51ZTtcbiB9XG5jb25zdFtzZWdtZW50LC4uLnN1ZmZpeF09cGF0aC5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdCgnLicpO1xuaWYoc3VmZml4Lmxlbmd0aD09PTApe1xuY2hpbGRFbnRyaWVzLnNldChzZWdtZW50LHZhbHVlKTtcbiB9ZWxzZSBpZighY2hpbGRFbnRyaWVzLmhhcyhzZWdtZW50KSl7XG5jaGlsZEVudHJpZXMuc2V0KHNlZ21lbnQsbnVsbCk7XG4gfVxuIH1cbnJldHVybiBjaGlsZEVudHJpZXM7XG4gfTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1lc3NhZ2VzPVtdO1xuXG5jb25zdCB0b1N0b3JhZ2U9RmFyKFxuJ1RvU3RvcmFnZScsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuKG1lc3NhZ2UpPT57XG5tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuc3dpdGNoKG1lc3NhZ2UubWV0aG9kKXtcbmNhc2UnZ2V0U3RvcmVLZXknOntcbmNvbnN0W2tleV09bWVzc2FnZS5hcmdzO1xucmV0dXJue3N0b3JlTmFtZTonc3dpbmdzZXQnLHN0b3JlU3Via2V5OiBgZmFrZToke2tleX1gfTtcbiB9XG5jYXNlJ2dldCc6e1xuY29uc3Rba2V5XT1tZXNzYWdlLmFyZ3M7XG5yZXR1cm4gZGF0YS5oYXMoa2V5KT9kYXRhLmdldChrZXkpOm51bGw7XG4gfVxuY2FzZSdjaGlsZHJlbic6e1xuY29uc3Rba2V5XT1tZXNzYWdlLmFyZ3M7XG5jb25zdCBjaGlsZEVudHJpZXM9Z2V0Q2hpbGRFbnRyaWVzKCBgJHtrZXl9LmApO1xucmV0dXJuWy4uLmNoaWxkRW50cmllcy5rZXlzKCldO1xuIH1cbmNhc2UnZW50cmllcyc6e1xuY29uc3Rba2V5XT1tZXNzYWdlLmFyZ3M7XG5jb25zdCBjaGlsZEVudHJpZXM9Z2V0Q2hpbGRFbnRyaWVzKCBgJHtrZXl9LmApO1xucmV0dXJuWy4uLmNoaWxkRW50cmllcy5lbnRyaWVzKCldLm1hcCgoZW50cnkpPT5cbmVudHJ5WzFdIT1udWxsP2VudHJ5OltlbnRyeVswXV0pO1xuXG4gfVxuY2FzZSdzZXQnOlxuY2FzZSdzZXRXaXRob3V0Tm90aWZ5Jzp7XG50cmFjZSgndG9TdG9yYWdlIHNldCcsbWVzc2FnZSk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbmV3RW50cmllcz1tZXNzYWdlLmFyZ3M7XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIG5ld0VudHJpZXMpe1xuaWYodmFsdWUhPW51bGwpe1xuZGF0YS5zZXQoa2V5LHZhbHVlKTtcbiB9ZWxzZXtcbmRhdGEuZGVsZXRlKGtleSk7XG4gfVxuIH1cbmJyZWFrO1xuIH1cbmNhc2UnYXBwZW5kJzp7XG50cmFjZSgndG9TdG9yYWdlIGFwcGVuZCcsbWVzc2FnZSk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbmV3RW50cmllcz1tZXNzYWdlLmFyZ3M7XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIG5ld0VudHJpZXMpe1xudmFsdWUhPW51bGx8fEZhaWwgYGF0dGVtcHQgdG8gYXBwZW5kIHdpdGggbm8gdmFsdWVgO1xuLy9cbmNvbnN0IG9sZFZhbD1kYXRhLmdldChrZXkpO1xubGV0IHN0cmVhbUNlbGw7XG5pZihvbGRWYWwhPW51bGwpe1xudHJ5e1xuc3RyZWFtQ2VsbD1KU09OLnBhcnNlKG9sZFZhbCk7XG5hc3NlcnQoaXNTdHJlYW1DZWxsKHN0cmVhbUNlbGwpKTtcbiB9Y2F0Y2goX2Vycil7XG5zdHJlYW1DZWxsPXVuZGVmaW5lZDtcbiB9XG4gfVxuaWYoc3RyZWFtQ2VsbD09PXVuZGVmaW5lZCl7XG5zdHJlYW1DZWxsPXtcbmJsb2NrSGVpZ2h0OicwJyxcbnZhbHVlczpvbGRWYWwhPW51bGw/W29sZFZhbF06W119O1xuXG4gfVxuc3RyZWFtQ2VsbC52YWx1ZXMucHVzaCh2YWx1ZSk7XG5kYXRhLnNldChrZXksSlNPTi5zdHJpbmdpZnkoc3RyZWFtQ2VsbCkpO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2Unc2l6ZSc6XG4vL1xuLy9cbnJldHVyblsuLi5kYXRhLmtleXMoKV0uZmlsdGVyKChrKT0+XG5rLnN0YXJ0c1dpdGgoIGAke21lc3NhZ2UuYXJnc1swXX0uYCkpLlxubGVuZ3RoO1xuZGVmYXVsdDpcbnRocm93IEVycm9yKCBgdW5zdXBwb3J0ZWQgbWV0aG9kOiAke21lc3NhZ2UubWV0aG9kfWApO31cblxuIH0pO1xuXG5jb25zdCByb290Tm9kZT1tYWtlQ2hhaW5TdG9yYWdlUm9vdCh0b1N0b3JhZ2Uscm9vdFBhdGgscmVzb2x2ZWRPcHRpb25zKTtcbnJldHVybntcbnJvb3ROb2RlLFxuLy9cbmRhdGE6LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL2RhdGEsXG5tZXNzYWdlcyxcbnRvU3RvcmFnZX07XG5cbiB9OyRozY9fb25jZS5tYWtlRmFrZVN0b3JhZ2VLaXQobWFrZUZha2VTdG9yYWdlS2l0KTtcbmhhcmRlbihtYWtlRmFrZVN0b3JhZ2VLaXQpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBtYWtlTW9ja0NoYWluU3RvcmFnZVJvb3Q9KCk9PntcbmNvbnN0e3Jvb3ROb2RlLGRhdGF9PW1ha2VGYWtlU3RvcmFnZUtpdCgnbW9ja0NoYWluU3RvcmFnZVJvb3QnKTtcbnJldHVybiBGYXIoJ21vY2tDaGFpblN0b3JhZ2UnLHtcbi4uLmJpbmRBbGxNZXRob2RzKHJvb3ROb2RlKSxcbi8qXG5cblxuXG5cblxuXG5cblxuXG4gICAgICovXG5nZXRCb2R5OihwYXRoLG1hcnNoYWxsZXI9ZGVmYXVsdE1hcnNoYWxsZXIsaW5kZXg9LTEpPT57XG5kYXRhLnNpemV8fEZhaWwgYG5vIGRhdGEgaW4gc3RvcmFnZWA7XG4vKlxuXG5cblxuICAgICAgICovXG5jb25zdCBmcm9tQ2FwRGF0YT0oLi4uYXJncyk9PlxuUmVmbGVjdC5hcHBseShtYXJzaGFsbGVyLmZyb21DYXBEYXRhLG1hcnNoYWxsZXIsYXJncyk7XG5yZXR1cm4gdW5tYXJzaGFsRnJvbVZzdG9yYWdlKGRhdGEscGF0aCxmcm9tQ2FwRGF0YSxpbmRleCk7XG4gfSxcbmtleXM6KCk9PlsuLi5kYXRhLmtleXMoKV19KTtcblxuIH07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlTW9ja0NoYWluU3RvcmFnZVJvb3QobWFrZU1vY2tDaGFpblN0b3JhZ2VSb290KTtcbmNvbnN0ICAgICAgICBkb2N1bWVudFN0b3JhZ2VTY2hlbWE9YXN5bmModCxzdG9yYWdlLG9wdHMpPT57XG4vL1xuYXdhaXQgZXZlbnRMb29wSXRlcmF0aW9uKCk7XG5cbmNvbnN0W2tleXMsZ2V0Qm9keV09XG4na2V5cydpbiBzdG9yYWdlP1xuW3N0b3JhZ2Uua2V5cygpLCgvKiAgICAgICAgICAgICAgICAgKi9rKT0+c3RvcmFnZS5nZXRCb2R5KGspXTpcbltzdG9yYWdlLmRhdGEua2V5cygpLCgvKiAgICAgICAgICAgICAgICAgKi9rKT0+c3RvcmFnZS5kYXRhLmdldChrKV07XG5cbmNvbnN0e3BhdHRlcm4scmVwbGFjZW1lbnR9PVxuJ3BhdHRlcm4naW4gb3B0cz9cbm9wdHM6XG57cGF0dGVybjonbW9ja0NoYWluU3RvcmFnZVJvb3QuJyxyZXBsYWNlbWVudDoncHVibGlzaGVkLid9O1xuY29uc3QgaWxsdXN0cmF0aW9uPVsuLi5rZXlzXS5zb3J0KCkubWFwKFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbihrZXkpPT5ba2V5LnJlcGxhY2UocGF0dGVybixyZXBsYWNlbWVudCksZ2V0Qm9keShrZXkpXSk7XG5cbmNvbnN0IHBydW5lZD1pbGx1c3RyYXRpb24uZmlsdGVyKFxuJ25vZGUnaW4gb3B0cz9cbihba2V5LF9dKT0+a2V5LnN0YXJ0c1dpdGgoIGBwdWJsaXNoZWQuJHtvcHRzLm5vZGV9YCk6XG4oX2VudHJ5KT0+dHJ1ZSk7XG5cblxuY29uc3Qgbm90ZT1cbidub3RlJ2luIG9wdHM/XG5vcHRzLm5vdGU6XG4gYFVuZGVyIFwicHVibGlzaGVkXCIsIHRoZSBcIiR7b3B0cy5ub2RlfVwiIG5vZGUgaXMgZGVsZWdhdGVkIHRvICR7b3B0cy5vd25lcn0uYDtcbmNvbnN0IGJvaWxlcnBsYXRlPSBgXG5UaGUgZXhhbXBsZSBiZWxvdyBpbGx1c3RyYXRlcyB0aGUgc2NoZW1hIG9mIHRoZSBkYXRhIHB1Ymxpc2hlZCB0aGVyZS5cblxuU2VlIGFsc28gYm9hcmQgbWFyc2hhbGxpbmcgY29udmVudGlvbnMgKF90byBhcHBlYXJfKS5gO1xudC5zbmFwc2hvdChwcnVuZWQsbm90ZStib2lsZXJwbGF0ZSk7XG4gfTskaM2PX29uY2UuZG9jdW1lbnRTdG9yYWdlU2NoZW1hKGRvY3VtZW50U3RvcmFnZVNjaGVtYSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzbG90VG9SZW1vdGFibGUiOlsic2xvdFRvUmVtb3RhYmxlIl0sImRlZmF1bHRNYXJzaGFsbGVyIjpbImRlZmF1bHRNYXJzaGFsbGVyIl0sInNsb3RTdHJpbmdVbnNlcmlhbGl6ZSI6WyJzbG90U3RyaW5nVW5zZXJpYWxpemUiXSwibWFrZUZha2VTdG9yYWdlS2l0IjpbIm1ha2VGYWtlU3RvcmFnZUtpdCJdLCJtYWtlTW9ja0NoYWluU3RvcmFnZVJvb3QiOlsibWFrZU1vY2tDaGFpblN0b3JhZ2VSb290Il0sImRvY3VtZW50U3RvcmFnZVNjaGVtYSI6WyJkb2N1bWVudFN0b3JhZ2VTY2hlbWEiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASflQRSEGAAAhBgAALAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90ZXN0aW5nLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJldmVudExvb3BJdGVyYXRpb24iLCJpbnNwZWN0TWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIC8vXG4vKlxuXG5cbiAqL1xuLyogICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBldmVudExvb3BJdGVyYXRpb249YXN5bmMoKT0+XG5uZXcgUHJvbWlzZSgocmVzb2x2ZSk9PnNldEltbWVkaWF0ZShyZXNvbHZlKSk7JGjNj19vbmNlLmV2ZW50TG9vcEl0ZXJhdGlvbihldmVudExvb3BJdGVyYXRpb24pO1xuaGFyZGVuKGV2ZW50TG9vcEl0ZXJhdGlvbik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN0cmluZ09yVGFnPSh2YWx1ZSk9PntcbmlmKHR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnKXtcbnJldHVybiB2YWx1ZTtcbiB9ZWxzZSBpZih0eXBlb2YgdmFsdWU9PT0nb2JqZWN0JyYmU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKXtcbnJldHVybiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddO1xuIH1cbnJldHVybiBTdHJpbmcodmFsdWUpO1xuIH07XG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGluc3BlY3RNYXBTdG9yZT0oc3RvcmUpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgb2JqPXt9O1xuZm9yKGNvbnN0IGtleSBvZiBzdG9yZS5rZXlzKCkpe1xuY29uc3QgdmFsdWU9c3RvcmUuZ2V0KGtleSk7XG5jb25zdCBoYXNLZXlzPXR5cGVvZiB2YWx1ZT09PSdvYmplY3QnJiYna2V5cydpbiB2YWx1ZTtcbmNvbnN0IGluZGV4PXN0cmluZ09yVGFnKGtleSk7XG5pZihoYXNLZXlzJiYnZ2V0J2luIHZhbHVlKXtcbm9ialtpbmRleF09aW5zcGVjdE1hcFN0b3JlKHZhbHVlKTtcbiB9ZWxzZSBpZihoYXNLZXlzKXtcbm9ialtpbmRleF09QXJyYXkuZnJvbSh2YWx1ZS5rZXlzKCkpO1xuIH1lbHNle1xub2JqW2luZGV4XT1cbnZhbHVlIGluc3RhbmNlb2YgT2JqZWN0JiZTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWU/XG52YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddOlxudmFsdWU7XG4gfVxuIH1cbnJldHVybiBvYmo7XG4gfTskaM2PX29uY2UuaW5zcGVjdE1hcFN0b3JlKGluc3BlY3RNYXBTdG9yZSk7XG5oYXJkZW4oaW5zcGVjdE1hcFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV2ZW50TG9vcEl0ZXJhdGlvbiI6WyJldmVudExvb3BJdGVyYXRpb24iXSwiaW5zcGVjdE1hcFN0b3JlIjpbImluc3BlY3RNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHqlog/QIAAP0CAAAoAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVDaGVjay5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImNhc3QiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsIFskaM2PX2EgPT4gKHR5cGVsZXNzTXVzdE1hdGNoID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG4vKlxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICovXG5jb25zdCAgICAgICAgbXVzdE1hdGNoPXR5cGVsZXNzTXVzdE1hdGNoO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG5jb25zdCAgICAgICAgY2FzdD0oc3BlY2ltZW4scGF0dCk9Pntcbi8vXG4vL1xuLy9cbm11c3RNYXRjaChzcGVjaW1lbixwYXR0KTtcbnJldHVybiBzcGVjaW1lbjtcbiB9OyRozY9fb25jZS5jYXN0KGNhc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJjYXN0IjpbImNhc3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAopUBEE4DAABOAwAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiU3RvcmFnZU5vZGVTaGFwZSIsIlVuZ3VhcmRlZEhlbHBlckkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgTTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3QgICAgICAgIFN0b3JhZ2VOb2RlU2hhcGU9TS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5TdG9yYWdlTm9kZVNoYXBlKFN0b3JhZ2VOb2RlU2hhcGUpO1xuY29uc3QgICAgICAgIFVuZ3VhcmRlZEhlbHBlckk9TS5pbnRlcmZhY2UoXG4naGVscGVyJyxcbnt9LFxuLy9cbntzbG9wcHk6dHJ1ZX0pOyRozY9fb25jZS5Vbmd1YXJkZWRIZWxwZXJJKFVuZ3VhcmRlZEhlbHBlckkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RvcmFnZU5vZGVTaGFwZSI6WyJTdG9yYWdlTm9kZVNoYXBlIl0sIlVuZ3VhcmRlZEhlbHBlckkiOlsiVW5ndWFyZGVkSGVscGVySSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEusOTSgEAAEoBAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACbh0FqEgcAABIHAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSIsImlzQWJhbmRvbmVkRXJyb3IiLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIiwibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IE0sbWF0Y2hlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7aXNGcm96ZW59PU9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgICAgICAgIFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGU9aGFyZGVuKHtcbm5hbWU6J3ZhdFVwZ3JhZGVkJyxcbnVwZ3JhZGVNZXNzYWdlOk0uc3RyaW5nKCksXG5pbmNhcm5hdGlvbk51bWJlcjpNLm51bWJlcigpfSk7XG5cblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5VcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbj0odXBncmFkZU1lc3NhZ2UsdG9JbmNhcm5hdGlvbk51bWJlcik9PlxuaGFyZGVuKHtcbm5hbWU6J3ZhdFVwZ3JhZGVkJyxcbnVwZ3JhZGVNZXNzYWdlLFxuaW5jYXJuYXRpb25OdW1iZXI6dG9JbmNhcm5hdGlvbk51bWJlcn0pOyRozY9fb25jZS5tYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuaGFyZGVuKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzVXBncmFkZURpc2Nvbm5lY3Rpb249KHJlYXNvbik9PlxucmVhc29uIT1udWxsJiYvL1xuaXNGcm96ZW4ocmVhc29uKSYmXG5tYXRjaGVzKHJlYXNvbixVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKTskaM2PX29uY2UuaXNVcGdyYWRlRGlzY29ubmVjdGlvbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcbmhhcmRlbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpc0FiYW5kb25lZEVycm9yPShyZWFzb24pPT5cbnJlYXNvbiE9bnVsbCYmLy9cbmlzRnJvemVuKHJlYXNvbikmJlxubWF0Y2hlcyhyZWFzb24sTS5lcnJvcigpKSYmXG4vL1xuLy9cbnJlYXNvbi5tZXNzYWdlPT09J3ZhdCB0ZXJtaW5hdGVkJzskaM2PX29uY2UuaXNBYmFuZG9uZWRFcnJvcihpc0FiYW5kb25lZEVycm9yKTtcbmhhcmRlbihpc0FiYW5kb25lZEVycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSJdLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc0FiYW5kb25lZEVycm9yIjpbImlzQWJhbmRvbmVkRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArvhjAwcIAAAHCAAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBFLHN1YnNjcmliZUxhdGVzdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjNj19hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyPXN1YnNjcmliZUxhdGVzdDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdG9yPShhc3luY0l0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik9PntcbnJldHVybiBuZXcgUHJvbWlzZSgoYWNrLG9ic2VydmVyRXJyb3IpPT57XG5jb25zdCByZWN1cj0oKT0+e1xuRS53aGVuKFxuRShhc3luY0l0ZXJhdG9yUCkubmV4dCgpLFxuKHt2YWx1ZSxkb25lfSk9PntcbmlmKGRvbmUpe1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoJiZpdGVyYXRpb25PYnNlcnZlci5maW5pc2godmFsdWUpO1xuYWNrKHVuZGVmaW5lZCk7XG4gfWVsc2V7XG5pdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSYmXG5pdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSh2YWx1ZSk7XG5yZWN1cigpO1xuIH1cbiB9LFxuKHJlYXNvbik9Pntcbml0ZXJhdGlvbk9ic2VydmVyLmZhaWwmJml0ZXJhdGlvbk9ic2VydmVyLmZhaWwocmVhc29uKTtcbmFjayh1bmRlZmluZWQpO1xuIH0pLlxuY2F0Y2gob2JzZXJ2ZXJFcnJvcik7XG4gfTtcbnJlY3VyKCk7XG4gfSk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5vYnNlcnZlSXRlcmF0b3Iob2JzZXJ2ZUl0ZXJhdG9yKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0aW9uPShhc3luY0l0ZXJhYmxlUCxpdGVyYXRpb25PYnNlcnZlcik9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbnJldHVybiBvYnNlcnZlSXRlcmF0b3IoaXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaWJlTGF0ZXN0KG5vdGlmaWVyUCksaXRlcmF0aW9uT2JzZXJ2ZXIpOyRozY9fb25jZS5vYnNlcnZlTm90aWZpZXIob2JzZXJ2ZU5vdGlmaWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtRbSkN0HAADdBwAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi90b3BpYy5qcyIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW11dLFtcIi4vbm90aWZpZXIuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbXV0sW1wiLi90b3BpYy5qc1wiLCBbXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV0sW1wiLi9zdG9yZWQtbm90aWZpZXIuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3B1Ymxpc2gta2l0LmpzIjpbWyJtYWtlUHVibGlzaEtpdCIsIm1ha2VQdWJsaXNoS2l0Il0sWyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSxbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sWyJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUVhY2hUb3BpY0kiXSxbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSxbIlN1YnNjcmliZXJTaGFwZSIsIlN1YnNjcmliZXJTaGFwZSJdXSwiLi9zdWJzY3JpYmUuanMiOltbInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVFYWNoIl0sWyJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXV0sIi4vbm90aWZpZXIuanMiOltbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllciJdLFsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0Il0sWyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl0sWyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl1dLCIuL3N1YnNjcmliZXIuanMiOltbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uIl0sWyJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCJdXSwiLi90b3BpYy5qcyI6W1sibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyIsIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXV0sIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOltbIm9ic2VydmVOb3RpZmllciIsIm9ic2VydmVOb3RpZmllciJdLFsib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIl0sWyJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdGlvbiJdLFsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2VuiwnEQAABxEAAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydCxFLEZhcixtYWtlUHVibGlzaEtpdCxzdWJzY3JpYmVMYXRlc3Q7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLCBbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaM2PX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXI9KHNoYXJhYmxlSW50ZXJuYWxzUCk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5zdWJzY3JpYmVMYXRlc3Qoc2hhcmFibGVJbnRlcm5hbHNQKSxcbmdldFVwZGF0ZVNpbmNlOmFzeW5jKHVwZGF0ZUNvdW50KT0+XG5FKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4vKlxuXG5cblxuXG4gICAgICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOmFzeW5jKCk9PnNoYXJhYmxlSW50ZXJuYWxzUCxcbi8qXG5cblxuXG4gICAgICovXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyPShzdWJzY3JpYmVyKT0+e1xuLypcblxuICAgKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1oYXJkZW4oe1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50PXVuZGVmaW5lZCk9PlxuRShzdWJzY3JpYmVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJLaXQ9KC4uLmluaXRpYWxTdGF0ZUFycik9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5jb25zdCBub3RpZmllcj1tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyKTtcblxuY29uc3QgdXBkYXRlcj1GYXIoJ3VwZGF0ZXInLHtcbnVwZGF0ZVN0YXRlOihzdGF0ZSk9PnB1Ymxpc2hlci5wdWJsaXNoKHN0YXRlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxuYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGg8PTEsJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuaWYoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aD09PTEpe1xudXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuIH1cblxuLy9cbi8vXG5yZXR1cm4gaGFyZGVuKHtub3RpZmllcix1cGRhdGVyfSk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlPShhc3luY0l0ZXJhYmxlUCk9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IG9wdE5leHRQcm9taXNlO1xubGV0IGN1cnJlbnRVcGRhdGVDb3VudD0wbjtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBjdXJyZW50UmVzcG9uc2U7XG5sZXQgZmluYWw9ZmFsc2U7XG5cbi8qXG5cbiAgICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5pZih1cGRhdGVDb3VudDxjdXJyZW50VXBkYXRlQ291bnQpe1xuaWYoY3VycmVudFJlc3BvbnNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4gfWVsc2UgaWYodXBkYXRlQ291bnQhPT1jdXJyZW50VXBkYXRlQ291bnQpe1xudGhyb3cgRXJyb3IoXG4nZ2V0VXBkYXRlU2luY2UgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicpO1xuXG4gfVxuXG4vL1xuaWYoZmluYWwpe1xuYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZCk7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuaWYoIW9wdE5leHRQcm9taXNlKXtcbmNvbnN0IG5leHRJdGVyUmVzdWx0UD1FKGl0ZXJhdG9yUCkubmV4dCgpO1xub3B0TmV4dFByb21pc2U9RS53aGVuKFxubmV4dEl0ZXJSZXN1bHRQLFxuKHtkb25lLHZhbHVlfSk9PntcbmFzc2VydCghZmluYWwpO1xuaWYoZG9uZSl7XG5maW5hbD10cnVlO1xuIH1cbmN1cnJlbnRVcGRhdGVDb3VudCs9MW47XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlLFxudXBkYXRlQ291bnQ6ZG9uZT91bmRlZmluZWQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbm9wdE5leHRQcm9taXNlPXVuZGVmaW5lZDtcbnJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gfSxcbihfcmVhc29uKT0+e1xuZmluYWw9dHJ1ZTtcbmN1cnJlbnRSZXNwb25zZT1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubmV4dEl0ZXJSZXN1bHRQO1xub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9KTtcblxuIH1cbnJldHVybiBvcHROZXh0UHJvbWlzZTtcbiB9fSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi8vXG4vL1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIl0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdHozoS0rAAAtKwAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwscSxFLEZhcixtYWtlUHJvbWlzZUtpdCxNLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCxjYW5CZUR1cmFibGUscHJlcGFyZUV4b0NsYXNzS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsIFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLCBbJGjNj19hID0+IChjYW5CZUR1cmFibGUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHNpbms9KCk9PnsgfTtcbmNvbnN0IG1ha2VRdWlldFJlamVjdGlvbj0ocmVhc29uKT0+e1xuY29uc3QgcmVqZWN0aW9uPWhhcmRlbihQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbnZvaWQgRS53aGVuKHJlamVjdGlvbixzaW5rLHNpbmspO1xucmV0dXJuIHJlamVjdGlvbjtcbiB9O1xuY29uc3QgdG9vRmFyUmVqZWN0aW9uPW1ha2VRdWlldFJlamVjdGlvbihcbmhhcmRlbihFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKSk7XG5cblxuY29uc3QgICAgICAgIFB1Ymxpc2hlckk9TS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicse1xucHVibGlzaDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmluaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCl9KTtcblxuXG4vL1xuJGjNj19vbmNlLlB1Ymxpc2hlckkoUHVibGlzaGVySSk7Y29uc3QgVXBkYXRlQ291bnRTaGFwZT1NLm9yKE0uYmlnaW50KCksTS5udW1iZXIoKSk7JGjNj19vbmNlLlVwZGF0ZUNvdW50U2hhcGUoVXBkYXRlQ291bnRTaGFwZSk7XG5jb25zdCAgICAgICAgU3Vic2NyaWJlckk9TS5pbnRlcmZhY2UoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOk0uY2FsbCgpLm9wdGlvbmFsKE0uYmlnaW50KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0VXBkYXRlU2luY2U6TS5jYWxsKCkub3B0aW9uYWwoVXBkYXRlQ291bnRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSl9KTskaM2PX29uY2UuU3Vic2NyaWJlckkoU3Vic2NyaWJlckkpO1xuXG5jb25zdCAgICAgICAgcHVibGlzaEtpdElLaXQ9aGFyZGVuKHtcbnB1Ymxpc2hlcjpQdWJsaXNoZXJJLFxuc3Vic2NyaWJlcjpTdWJzY3JpYmVySX0pOyRozY9fb25jZS5wdWJsaXNoS2l0SUtpdChwdWJsaXNoS2l0SUtpdCk7XG5cblxuY29uc3QgICAgICAgIEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGU9TS5pbnRlcmZhY2UoXG4nRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InLFxue1xuZm9yazpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLC8vXG5uZXh0Ok0uY2FsbFdoZW4oKS5yZXR1cm5zKE0uYW55KCkpfSk7JGjNj19vbmNlLkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUoRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgSXRlcmFibGVFYWNoVG9waWNJPU0uaW50ZXJmYWNlKCdJdGVyYWJsZUVhY2hUb3BpYycse1xuc3Vic2NyaWJlQWZ0ZXI6XG5nZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoU3Vic2NyaWJlckkpLm1ldGhvZEd1YXJkcy5zdWJzY3JpYmVBZnRlcixcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06TS5jYWxsKCkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpKX0pOyRozY9fb25jZS5JdGVyYWJsZUVhY2hUb3BpY0koSXRlcmFibGVFYWNoVG9waWNJKTtcblxuXG5cbmNvbnN0ICAgICAgICBJdGVyYWJsZUxhdGVzdFRvcGljST1NLmludGVyZmFjZSgnSXRlcmFibGVMYXRlc3RUb3BpYycse1xuZ2V0VXBkYXRlU2luY2U6XG5nZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoU3Vic2NyaWJlckkpLm1ldGhvZEd1YXJkcy5nZXRVcGRhdGVTaW5jZSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06TS5jYWxsKCkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpKX0pO1xuXG5cblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLkl0ZXJhYmxlTGF0ZXN0VG9waWNJKEl0ZXJhYmxlTGF0ZXN0VG9waWNJKTtcbmNvbnN0IHdlYWtNZW1vaXplVW5hcnk9KGZuKT0+e1xuY29uc3QgY2FjaGU9bmV3IFdlYWtNYXAoKTtcbnJldHVybihhcmcpPT57XG4vKiAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG9hcmc9YXJnO1xuaWYoY2FjaGUuaGFzKG9hcmcpKXtcbnJldHVybiBjYWNoZS5nZXQob2FyZyk7XG4gfVxuY29uc3QgcmVzdWx0PWZuKGFyZyk7XG5jYWNoZS5zZXQob2FyZyxyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ9KHJlY29yZCk9PntcbmNvbnN0e1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnR9PVxucmVjb3JkO1xuaWYoZG9uZSl7XG4vL1xucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6cHVibGlzaENvdW50fSk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQdWJsaXNoS2l0PSgpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IHRhaWxQO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgdGFpbFI7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG5cbmxldCBjdXJyZW50UHVibGlzaENvdW50PTBuO1xubGV0IGN1cnJlbnRQPXRhaWxQO1xuY29uc3QgYWR2YW5jZUN1cnJlbnQ9KGRvbmUsdmFsdWUscmVqZWN0aW9uKT0+e1xuaWYodGFpbFI9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG5jdXJyZW50UHVibGlzaENvdW50Kz0xbjtcbmN1cnJlbnRQPXRhaWxQO1xuY29uc3QgcmVzb2x2ZUN1cnJlbnQ9dGFpbFI7XG5cbmlmKGRvbmUpe1xudGFpbFA9dG9vRmFyUmVqZWN0aW9uO1xudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xuIH1cblxuaWYocmVqZWN0aW9uKXtcbnJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gfWVsc2V7XG5yZXNvbHZlQ3VycmVudChcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudDpjdXJyZW50UHVibGlzaENvdW50LFxudGFpbDp0YWlsUH0pKTtcblxuXG4gfVxuIH07XG5cbmNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZD13ZWFrTWVtb2l6ZVVuYXJ5KFxubWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZCk7XG5cblxuLypcblxuXG4gICAqL1xuY29uc3Qgc3Vic2NyaWJlcj1GYXIoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQ9LTFuKT0+e1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1lbHNle1xudGhyb3cgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+e1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8vXG4vL1xuLy9cbi5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbi8vXG4vL1xuLnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQsbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcbiB9OyRozY9fb25jZS5tYWtlUHVibGlzaEtpdChtYWtlUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVB1Ymxpc2hLaXQpO1xuXG5jb25zdCBEdXJhYmxlUHVibGlzaEtpdFN0YXRlU2hhcGU9aGFyZGVuKHtcbnZhbHVlRHVyYWJpbGl0eTpNLmFueSgpLFxucHVibGlzaENvdW50Ok0uYW55KCksXG5zdGF0dXM6TS5hbnkoKSxcbmhhc1ZhbHVlOk0uYW55KCksXG52YWx1ZTpNLmFueSgpfSk7XG5cblxuLy9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGU9KG9wdGlvbnM9e30pPT57XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHk9J21hbmRhdG9yeSd9PW9wdGlvbnM7XG5hc3NlcnQuZXF1YWwodmFsdWVEdXJhYmlsaXR5LCdtYW5kYXRvcnknKTtcbnJldHVybntcbi8vXG52YWx1ZUR1cmFiaWxpdHksXG5cbi8vXG5wdWJsaXNoQ291bnQ6MG4sXG5zdGF0dXM6J2xpdmUnLC8vXG5cbi8vXG4vL1xuLy9cbmhhc1ZhbHVlOmZhbHNlLFxudmFsdWU6dW5kZWZpbmVkfTtcblxuIH07XG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKlxuXG5cbiAqL1xuY29uc3QgZ2V0RXBoZW1lcmFsS2V5PShmYWNldHMpPT5mYWNldHMucHVibGlzaGVyO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT1uZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcHJvdmlkZUN1cnJlbnRQPShzdGF0ZSxmYWNldHMsdGFpbCk9PntcbmNvbnN0IGVwaGVtZXJhbEtleT1nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbmNvbnN0IGZvdW5kRGF0YT1kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG5jb25zdCBjdXJyZW50UD1mb3VuZERhdGEmJmZvdW5kRGF0YS5jdXJyZW50UDtcbmlmKGN1cnJlbnRQKXtcbnJldHVybiBjdXJyZW50UDtcbiB9XG5cbmNvbnN0e3B1Ymxpc2hDb3VudCxzdGF0dXMsaGFzVmFsdWUsdmFsdWV9PXN0YXRlO1xuaWYoIWhhc1ZhbHVlKXtcbmFzc2VydChzdGF0dXM9PT0nbGl2ZScpO1xucmV0dXJuIHRhaWw7XG4gfVxuaWYoc3RhdHVzPT09J2xpdmUnfHxzdGF0dXM9PT0nZmluaXNoZWQnKXtcbmNvbnN0IGNlbGw9aGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmU6c3RhdHVzIT09J2xpdmUnfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWx9KTtcblxucmV0dXJuIEUucmVzb2x2ZShjZWxsKTtcbiB9ZWxzZSBpZihzdGF0dXM9PT0nZmFpbGVkJyl7XG5yZXR1cm4gbWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gfVxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPShzdGF0ZSxmYWNldHMpPT57XG5jb25zdCBlcGhlbWVyYWxLZXk9Z2V0RXBoZW1lcmFsS2V5KGZhY2V0cyk7XG5jb25zdCBmb3VuZERhdGE9ZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuaWYoZm91bmREYXRhKXtcbnJldHVybiBmb3VuZERhdGE7XG4gfVxuXG5jb25zdHtzdGF0dXN9PXN0YXRlO1xubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuaWYoc3RhdHVzPT09J2xpdmUnKXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbnZvaWQgRS53aGVuKHRhaWxQLHNpbmssc2luayk7XG4gfWVsc2UgaWYoc3RhdHVzPT09J2ZpbmlzaGVkJ3x8c3RhdHVzPT09J2ZhaWxlZCcpe1xudGFpbFA9dG9vRmFyUmVqZWN0aW9uO1xuIH1lbHNle1xudGhyb3cgRmFpbCBgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiB9XG4vL1xuY29uc3Qgb2JqPWhhcmRlbih7Y3VycmVudFA6dW5kZWZpbmVkLHRhaWxQLHRhaWxSfSk7XG5kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSxvYmopO1xucmV0dXJuIG9iajtcbiB9O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0PShjb250ZXh0LHZhbHVlLHRhcmdldFN0YXR1cz0nbGl2ZScpPT57XG5jb25zdHtzdGF0ZSxmYWNldHN9PWNvbnRleHQ7XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHksc3RhdHVzfT1zdGF0ZTtcbmlmKHN0YXR1cyE9PSdsaXZlJyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5jb25zdCBkb25lPXRhcmdldFN0YXR1cyE9PSdsaXZlJztcbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eT09PSdtYW5kYXRvcnknKXtcbmNhbkJlRHVyYWJsZSh2YWx1ZSl8fEZhaWwgYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiB9XG5jb25zdHt0YWlsUDpvbGRUYWlsUCx0YWlsUjpyZXNvbHZlT2xkVGFpbH09XG5wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLGZhY2V0cyk7XG5hc3NlcnQudHlwZW9mKHJlc29sdmVPbGRUYWlsLCdmdW5jdGlvbicpO1xuXG5jb25zdCBwdWJsaXNoQ291bnQ9c3RhdGUucHVibGlzaENvdW50KzFuO1xuc3RhdGUucHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcblxubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuaWYoZG9uZSl7XG5zdGF0ZS5zdGF0dXM9dGFyZ2V0U3RhdHVzO1xudGFpbFA9dG9vRmFyUmVqZWN0aW9uO1xudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xudm9pZCBFLndoZW4odGFpbFAsc2luayxzaW5rKTtcbiB9XG5cbmxldCBjdXJyZW50UDtcbmlmKHRhcmdldFN0YXR1cz09PSdmYWlsZWQnKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbmNvbnN0IHJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xucmVzb2x2ZU9sZFRhaWwocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbi8vXG4vL1xuaWYoZG9uZXx8dmFsdWVEdXJhYmlsaXR5IT09J2lnbm9yZWQnJiZjYW5CZUR1cmFibGUodmFsdWUpKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbiB9ZWxzZXtcbnN0YXRlLmhhc1ZhbHVlPWZhbHNlO1xuc3RhdGUudmFsdWU9dW5kZWZpbmVkO1xuLy9cbmN1cnJlbnRQPW9sZFRhaWxQO1xuIH1cblxucmVzb2x2ZU9sZFRhaWwoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG5cbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG5nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbmhhcmRlbih7Y3VycmVudFAsdGFpbFAsdGFpbFJ9KSk7XG5cbiB9O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdD0oYmFnZ2FnZSxraW5kTmFtZSk9Pntcbi8vXG4vL1xuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPW1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ7XG5cbi8qXG5cbiAgICovXG5yZXR1cm4gcHJlcGFyZUV4b0NsYXNzS2l0KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxucHVibGlzaEtpdElLaXQsXG5pbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSxcbntcbi8vXG4vL1xucHVibGlzaGVyOntcbnB1Ymxpc2godmFsdWUpe1xuYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsdmFsdWUpO1xuIH0sXG5maW5pc2goZmluYWxWYWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyxmaW5hbFZhbHVlLCdmaW5pc2hlZCcpO1xuIH0sXG5mYWlsKHJlYXNvbil7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyxyZWFzb24sJ2ZhaWxlZCcpO1xuIH19LFxuXG5cbi8vXG4vL1xuc3Vic2NyaWJlcjp7XG5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQ9LTFuKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbmNvbnN0e3B1Ymxpc2hDb3VudDpjdXJyZW50UHVibGlzaENvdW50fT1zdGF0ZTtcbmNvbnN0e2N1cnJlbnRQLHRhaWxQfT1wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKFxuc3RhdGUsXG5mYWNldHMpO1xuXG5pZihwdWJsaXNoQ291bnQ9PT1jdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiB0YWlsUDtcbiB9ZWxzZSBpZihwdWJsaXNoQ291bnQ8Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gY3VycmVudFB8fHByb3ZpZGVDdXJyZW50UChzdGF0ZSxmYWNldHMsdGFpbFApO1xuIH1lbHNle1xudGhyb3cgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpe1xuY29uc3R7XG5mYWNldHM6e3N1YnNjcmliZXJ9fT1cbnRoaXM7XG5pZih1cGRhdGVDb3VudD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiB9XG51cGRhdGVDb3VudD1CaWdJbnQodXBkYXRlQ291bnQpO1xucmV0dXJuKFxuc3Vic2NyaWJlclxuLy9cbi8vXG4vL1xuLnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuLy9cbi8vXG4udGhlbigoKT0+c3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKSk7XG5cbiB9fX0sXG5cblxue1xuc3RhdGVTaGFwZTpEdXJhYmxlUHVibGlzaEtpdFN0YXRlU2hhcGV9KTtcblxuXG4gfTskaM2PX29uY2UucHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5oYXJkZW4ocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcblxuY29uc3QgICAgICAgIFN1YnNjcmliZXJTaGFwZT1NLnJlbW90YWJsZSgnU3Vic2NyaWJlcicpOyRozY9fb25jZS5TdWJzY3JpYmVyU2hhcGUoU3Vic2NyaWJlclNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJVcGRhdGVDb3VudFNoYXBlIjpbIlVwZGF0ZUNvdW50U2hhcGUiXSwiU3Vic2NyaWJlckkiOlsiU3Vic2NyaWJlckkiXSwicHVibGlzaEtpdElLaXQiOlsicHVibGlzaEtpdElLaXQiXSwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sIkl0ZXJhYmxlRWFjaFRvcGljSSI6WyJJdGVyYWJsZUVhY2hUb3BpY0kiXSwiSXRlcmFibGVMYXRlc3RUb3BpY0kiOlsiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSwibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKidGFwRCAAAEQgAAC4AAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdG9yZWROb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UsRSxGYXIsb2JzZXJ2ZU5vdGlmaWVyOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjNj19hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLCBbJGjNj19hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjNj19hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWROb3RpZmllcj0obm90aWZpZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmFzc2VydEFsbERlZmluZWQoe25vdGlmaWVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXJ9KTtcblxuY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2U9bWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKTtcblxub2JzZXJ2ZU5vdGlmaWVyKG5vdGlmaWVyLHtcbnVwZGF0ZVN0YXRlKHZhbHVlKXtcbm1hcnNoYWxsVG9TdG9yYWdlKHZhbHVlKS5jYXRjaCgocmVhc29uKT0+XG5jb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gdXBkYXRlU3RhdGUnLHJlYXNvbikpO1xuXG4gfSxcbmZhaWwocmVhc29uKXtcbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byBpdGVyYXRlJyxyZWFzb24pO1xuIH19KS5cbmNhdGNoKChyZWFzb24pPT57XG5jb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBoYWx0ZWQgaXRlcmF0aW9uJyxyZWFzb24pO1xuIH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xuZnJvbUNhcERhdGE6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN0b3JlZE5vdGlmaWVyPUZhcignU3RvcmVkTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlOih1cGRhdGVDb3VudCk9PkUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbmdldFBhdGg6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyfSk7XG5cbnJldHVybiBzdG9yZWROb3RpZmllcjtcbiB9OyRozY9fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdG9yZWROb3RpZmllciI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApxMCM+0VAADtFQAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIiwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEUsRmFyLG1ha2VNYXJzaGFsLGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LG1ha2VTdWJzY3JpcHRpb25LaXQsc3Vic2NyaWJlRWFjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIiwgWyRozY9fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIiwgWyRozY9fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRozY9fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjNj19hID0+IChzdWJzY3JpYmVFYWNoID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQ9YXN5bmMoc3Vic2NyaWJlcixjb25zdW1lVmFsdWUpPT57XG4vL1xuLy9cbmNvbnN0IGl0ZXJhdG9yPXN1YnNjcmliZUVhY2goc3Vic2NyaWJlcilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbmxldCBmaW5pc2hlZD1mYWxzZTtcbmF3YWl0IG51bGw7XG53aGlsZSghZmluaXNoZWQpe1xuY29uc3R7dmFsdWUsZG9uZX09YXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbmZpbmlzaGVkPSEhZG9uZTtcbiB9XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpYmVyPShzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHtzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXJ9KTtcblxuY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2U9bWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKTtcblxuLy9cbmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChzdWJzY3JpYmVyLG1hcnNoYWxsVG9TdG9yYWdlKS5jYXRjaCgoZXJyKT0+e1xuLy9cbi8vXG5jb25zb2xlLmVycm9yKCdTdG9yZWRTdWJzY3JpYmVyIGZhaWxlZCB0byBpdGVyYXRlJyxlcnIpO1xuIH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xuZnJvbUNhcERhdGE6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50KT0+c3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+c3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5nZXRQYXRoOigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG5nZXRTdG9yZUtleTooKT0+RShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmlwdGlvbj0oXG5zdWJzY3JpcHRpb24sXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXI9bWFrZU1hcnNoYWwodW5kZWZpbmVkLHVuZGVmaW5lZCx7XG5tYXJzaGFsU2F2ZUVycm9yOigpPT57IH0sXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSkpPT5cblxue1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8vXG5sZXQgcHVibGlzaEZhaWxlZD1mYWxzZTtcbmxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG5jb25zdCBmYWlsPShlcnIpPT57XG5wdWJsaXNoRmFpbGVkPXRydWU7XG5wdWJsaXNoRXhjZXB0aW9uPWVycjtcbiB9O1xuXG4vL1xuLy9cbmNvbnN0IHB1Ymxpc2hWYWx1ZT0ob2JqKT0+e1xuYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbmlmKHB1Ymxpc2hGYWlsZWQpe1xuLy9cbnRocm93IHB1Ymxpc2hFeGNlcHRpb247XG4gfVxuXG4vL1xuRShtYXJzaGFsbGVyKS5cbnRvQ2FwRGF0YShvYmopLlxudGhlbigoc2VyaWFsaXplZCk9PntcbmNvbnN0IGVuY29kZWQ9SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gfSkuXG5jYXRjaChmYWlsKTtcbiB9O1xuXG5pZihzdG9yYWdlTm9kZSl7XG4vL1xub2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpcHRpb24se1xudXBkYXRlU3RhdGU6cHVibGlzaFZhbHVlLFxuZmluaXNoOnB1Ymxpc2hWYWx1ZX0pLlxuY2F0Y2goZmFpbCk7XG4gfVxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaXB0aW9uJyx7XG4vL1xuZ2V0U3RvcmVLZXk6YXN5bmMoKT0+e1xuaWYoIXN0b3JhZ2VOb2RlKXtcbnJldHVybiBoYXJkZW4oe3N1YnNjcmlwdGlvbn0pO1xuIH1cbmNvbnN0IHN0b3JlS2V5PWF3YWl0IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCk7XG5yZXR1cm4gaGFyZGVuKHsuLi5zdG9yZUtleSxzdWJzY3JpcHRpb259KTtcbiB9LFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXIsXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczooKT0+XG5zdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQpPT5zdWJzY3JpcHRpb24uc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KX0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTskaM2PX29uY2UubWFrZVN0b3JlZFN1YnNjcmlwdGlvbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hlcktpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcixjaGlsZFBhdGgpPT57XG5jb25zdHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259PW1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuaWYoc3RvcmFnZU5vZGUmJmNoaWxkUGF0aCl7XG5zdG9yYWdlTm9kZT1FKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gfVxuXG4vL1xuY29uc3Qgc3Vic2NyaWJlcj1tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyKTtcblxuXG5yZXR1cm57XG5wdWJsaXNoZXI6cHVibGljYXRpb24sXG5zdWJzY3JpYmVyfTtcblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5yZXR1cm57XG5wdWJsaXNoZXIsXG4vL1xuc3Vic2NyaWJlcjptYWtlU3RvcmVkU3Vic2NyaWJlcihzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpfTtcblxuIH07JGjNj19vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIl0sIm1ha2VTdG9yZWRTdWJzY3JpYmVyIjpbIm1ha2VTdG9yZWRTdWJzY3JpYmVyIl0sIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iOlsibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiXSwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFQde8yESAAAhEgAAKAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIl0sImV4cG9ydHMiOlsic3Vic2NyaWJlIiwic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUxhdGVzdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLEZhaWwsYW5ub3RhdGVFcnJvcixFLEZhcixpc09iamVjdCxpc1VwZ3JhZGVEaXNjb25uZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIiwgWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsIFskaM2PX2EgPT4gKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCBzaW5rPSgpPT57IH07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmVjb25uZWN0QXNOZWVkZWQ9YXN5bmMoZ2V0dGVyLHNlZWQ9W10pPT57XG5sZXQgZGlzY29ubmVjdGlvbjtcbmxldCBsYXN0VmVyc2lvbj0tSW5maW5pdHk7XG4vL1xuYXdhaXQgbnVsbDtcbmZvcihsZXQgaT0wOztpKz0xKXtcbnRyeXtcbmNvbnN0IHJlc3VsdFA9aTxzZWVkLmxlbmd0aD9zZWVkW2ldOmdldHRlcigpO1xuY29uc3QgcmVzdWx0PWF3YWl0IHJlc3VsdFA7XG5yZXR1cm4gcmVzdWx0O1xuIH1jYXRjaChlcnIpe1xuaWYoaXNVcGdyYWRlRGlzY29ubmVjdGlvbihlcnIpKXtcbmlmKCFkaXNjb25uZWN0aW9uKXtcbmRpc2Nvbm5lY3Rpb249ZXJyO1xuIH1cbmNvbnN0e2luY2FybmF0aW9uTnVtYmVyOnZlcnNpb259PWVycjtcbmlmKHZlcnNpb24+bGFzdFZlcnNpb24pe1xuLy9cbi8vXG4vL1xubGFzdFZlcnNpb249dmVyc2lvbjtcbmNvbnRpbnVlO1xuIH1cbiB9XG4vL1xuLy9cbi8vXG5pZihpc09iamVjdChlcnIpJiZkaXNjb25uZWN0aW9uJiZkaXNjb25uZWN0aW9uIT09ZXJyKXtcbnRyeXtcbmFubm90YXRlRXJyb3IoXG5lcnIsXG5YIGBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBkaXNjb25uZWN0aW9uOiAke2Rpc2Nvbm5lY3Rpb259YCk7XG5cbiB9Y2F0Y2goX2Vycil7XG4vL1xuIH1cbiB9XG50aHJvdyBlcnI7XG4gfVxuIH1cbiB9O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmU9KGl0UCk9PlxuRmFyKCdBc3luY0l0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBpdD1FKGl0UClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5jb25zdCBzZWxmPUZhcignQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDphc3luYygpPT5FKGl0KS5uZXh0KCl9KTtcblxucmV0dXJuIHNlbGY7XG4gfX0pO1xuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uuc3Vic2NyaWJlKHN1YnNjcmliZSk7XG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yPSh0b3BpYyxuZXh0Q2VsbFApPT57XG4vL1xuLy9cbmNvbnN0IHNlbGY9RmFyKCdFYWNoSXRlcmF0b3InLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnNlbGYsXG5uZXh0OigpPT57XG5jb25zdHtcbmhlYWQ6cmVzdWx0UCxcbnB1Ymxpc2hDb3VudDpwdWJsaXNoQ291bnRQLFxudGFpbDp0YWlsUH09XG5FLmdldChuZXh0Q2VsbFApO1xuXG4vL1xuLy9cbmNvbnN0IGdldFN1Y2Nlc3Nvcj1hc3luYygpPT57XG5jb25zdCBwdWJsaXNoQ291bnQ9YXdhaXQgcHVibGlzaENvdW50UDtcbmFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCdiaWdpbnQnKTtcbmNvbnN0IHN1Y2Nlc3Nvcj1hd2FpdCBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuY29uc3QgbmV3UHVibGlzaENvdW50PXN1Y2Nlc3Nvci5wdWJsaXNoQ291bnQ7XG5pZihuZXdQdWJsaXNoQ291bnQhPT1wdWJsaXNoQ291bnQrMW4pe1xuRmFpbCBgZWFjaEl0ZXJhdG9yIGJyb2tlbiBieSBnYXAgZnJvbSBwdWJsaXNoQ291bnQgJHtwdWJsaXNoQ291bnR9IHRvICR7bmV3UHVibGlzaENvdW50fWA7XG4gfVxucmV0dXJuIHN1Y2Nlc3NvcjtcbiB9O1xuXG4vL1xuLy9cbm5leHRDZWxsUD1yZWNvbm5lY3RBc05lZWRlZChnZXRTdWNjZXNzb3IsW3RhaWxQXSk7XG5cbi8vXG4vL1xuLy9cbi8vXG52b2lkIEUud2hlbihwdWJsaXNoQ291bnRQLHNpbmssc2luayk7XG52b2lkIEUud2hlbihuZXh0Q2VsbFAsc2luayxzaW5rKTtcbnJldHVybiByZXN1bHRQO1xuIH0sXG5mb3JrOigpPT5tYWtlRWFjaEl0ZXJhdG9yKHRvcGljLG5leHRDZWxsUCl9KTtcblxucmV0dXJuIHNlbGY7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVFYWNoPSh0b3BpYyk9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignRWFjaEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBmaXJzdENlbGxQPXJlY29ubmVjdEFzTmVlZGVkKCgpPT5FKHRvcGljKS5zdWJzY3JpYmVBZnRlcigpKTtcbnJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLGZpcnN0Q2VsbFApO1xuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjNj19vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjbG9uZUxhdGVzdEl0ZXJhdG9yPSh0b3BpYyxsb2NhbFVwZGF0ZUNvdW50LHRlcm1pbmFsUmVzdWx0KT0+e1xubGV0IG11dGV4PVByb21pc2UucmVzb2x2ZSgpO1xuXG4vKlxuXG5cblxuXG4gICAqL1xuY29uc3QgbWF5YmVSZXF1ZXN0TmV4dFJlc3VsdD1hc3luYygpPT57XG5pZih0ZXJtaW5hbFJlc3VsdCl7XG4vL1xuLy9cbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5cbi8vXG4vL1xuY29uc3R7dmFsdWUsdXBkYXRlQ291bnR9PWF3YWl0IHJlY29ubmVjdEFzTmVlZGVkKCgpPT5cbkUodG9waWMpLmdldFVwZGF0ZVNpbmNlKGxvY2FsVXBkYXRlQ291bnQpKTtcblxuLy9cbmxvY2FsVXBkYXRlQ291bnQ9dXBkYXRlQ291bnQ7XG5cbi8vXG5pZih1cGRhdGVDb3VudD09PXVuZGVmaW5lZCl7XG50ZXJtaW5hbFJlc3VsdD1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZX0pO1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9O1xuXG5jb25zdCBzZWxmPUZhcignTGF0ZXN0SXRlcmF0b3InLHtcbmZvcms6KCk9PmNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMsbG9jYWxVcGRhdGVDb3VudCx0ZXJtaW5hbFJlc3VsdCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDphc3luYygpPT57XG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbmlmKHRlcm1pbmFsUmVzdWx0KXtcbi8vXG4vL1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cblxuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IG5leHRSZXN1bHQ9bXV0ZXgudGhlbihtYXliZVJlcXVlc3ROZXh0UmVzdWx0KTtcbm11dGV4PW5leHRSZXN1bHQudGhlbihzaW5rLHNpbmspO1xuLy9cblxucmV0dXJuIG5leHRSZXN1bHQ7XG4gfX0pO1xuXG5yZXR1cm4gc2VsZjtcbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3I9KHRvcGljKT0+Y2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlTGF0ZXN0PSh0b3BpYyk9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignTGF0ZXN0SXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VMYXRlc3RJdGVyYXRvcih0b3BpYyl9KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjNj19vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdWJzY3JpYmUiOlsic3Vic2NyaWJlIl0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIdoe1/RBwAA0QcAACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3RvcGljLmpzIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRSxGYXIsc3Vic2NyaWJlRWFjaCxtYWtlUHVibGlzaEtpdCxtYWtlUGlubmVkSGlzdG9yeVRvcGljOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsIFskaM2PX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vdG9waWMuanNcIiwgW1tcIm1ha2VQaW5uZWRIaXN0b3J5VG9waWNcIiwgWyRozY9fYSA9PiAobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbj0odG9waWMpPT57XG5jb25zdCBzdWJzY3JpcHRpb249RmFyKCdTdWJzY3JpcHRpb24nLHtcbi4uLnN1YnNjcmliZUVhY2godG9waWMpLFxuc3Vic2NyaWJlQWZ0ZXI6YXN5bmMocHVibGlzaENvdW50KT0+RSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcblxuLypcblxuXG5cblxuICAgICAqL1xuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6YXN5bmMoKT0+dG9waWMsXG5cbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe3N1YnNjcmlwdGlvbn0pfSk7XG5cbnJldHVybiBzdWJzY3JpcHRpb247XG4gfTskaM2PX29uY2UubWFrZVN1YnNjcmlwdGlvbihtYWtlU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uKTtcblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25LaXQ9KCk9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG4vL1xuLy9cblxuY29uc3QgcGlubmVkSGlzdG9yeVRvcGljPW1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG5jb25zdCBzdWJzY3JpcHRpb249bWFrZVN1YnNjcmlwdGlvbihwaW5uZWRIaXN0b3J5VG9waWMpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHVibGljYXRpb249RmFyKCdwdWJsaWNhdGlvbicse1xudXBkYXRlU3RhdGU6KG5vbkZpbmFsVmFsdWUpPT5wdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufSk7XG4gfTskaM2PX29uY2UubWFrZVN1YnNjcmlwdGlvbktpdChtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiJdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAR1oa2u0DAADtAwAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVBpbm5lZEhpc3RvcnlUb3BpYz0odG9waWMpPT57XG4vL1xuXG4vL1xuY29uc3QgcGlubmVkUHViTGlzdD10b3BpYy5zdWJzY3JpYmVBZnRlcigpO1xuXG5yZXR1cm4gRmFyKCdQaW5uZWRIaXN0b3J5VG9waWMnLHtcbnN1YnNjcmliZUFmdGVyOmFzeW5jKHB1Ymxpc2hDb3VudD0tMW4pPT57XG5pZihwdWJsaXNoQ291bnQ9PT0tMW4pe1xucmV0dXJuIHBpbm5lZFB1Ykxpc3Q7XG4gfVxucmV0dXJuIHRvcGljLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCk7XG4gfSxcbmdldFVwZGF0ZVNpbmNlOmFzeW5jKHVwZGF0ZUNvdW50PXVuZGVmaW5lZCk9Pntcbi8vXG5yZXR1cm4gdG9waWMuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuIH19KTtcblxuIH07JGjNj19vbmNlLm1ha2VQaW5uZWRIaXN0b3J5VG9waWMobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG5oYXJkZW4obWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABLrDk0oBAABKAQAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8UWFMoIGAACCBgAALQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VGYWtlTWFyc2hhbGxlciIsIm1ha2VGYWtlU3RvcmFnZSIsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhcixtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wibWFrZU1hcnNoYWxcIiwgWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUZha2VTdG9yYWdlPShwYXRoLHB1YmxpY2F0aW9uKT0+e1xubGV0IHNldFZhbHVlQ2FsbHM9MDtcbmNvbnN0IGZ1bGxQYXRoPSBgcHVibGlzaC4ke3BhdGh9YDtcbmNvbnN0IHN0b3JlS2V5PWhhcmRlbih7XG5zdG9yZU5hbWU6J3N3aW5nc2V0JyxcbnN0b3JlU3Via2V5OiBgc3dpbmdzZXQvZGF0YToke2Z1bGxQYXRofWAsXG5kYXRhUHJlZml4Qnl0ZXM6Jyd9KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgc3RvcmFnZT1GYXIoJ1N0b3JhZ2VOb2RlJyx7XG5nZXRQYXRoOigpPT5wYXRoLFxuZ2V0U3RvcmVLZXk6YXN5bmMoKT0+c3RvcmVLZXksXG5zZXRWYWx1ZTphc3luYyh2YWx1ZSk9PntcbnNldFZhbHVlQ2FsbHMrPTE7XG5hc3NlcnQudHlwZW9mKHZhbHVlLCdzdHJpbmcnKTtcbmlmKHB1YmxpY2F0aW9uKXtcbnB1YmxpY2F0aW9uLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbiB9XG4gfSxcbm1ha2VDaGlsZE5vZGU6KCk9PnN0b3JhZ2UsXG5jb3VudFNldFZhbHVlQ2FsbHM6KCk9PnNldFZhbHVlQ2FsbHN9KTtcblxucmV0dXJuIHN0b3JhZ2U7XG4gfTskaM2PX29uY2UubWFrZUZha2VTdG9yYWdlKG1ha2VGYWtlU3RvcmFnZSk7XG5oYXJkZW4obWFrZUZha2VTdG9yYWdlKTtcblxuY29uc3QgICAgICAgIG1ha2VGYWtlTWFyc2hhbGxlcj0oKT0+XG5tYWtlTWFyc2hhbCh1bmRlZmluZWQsdW5kZWZpbmVkLHtcbm1hcnNoYWxTYXZlRXJyb3I6KCk9PnsgfX0pOyRozY9fb25jZS5tYWtlRmFrZU1hcnNoYWxsZXIobWFrZUZha2VNYXJzaGFsbGVyKTtcblxuaGFyZGVuKG1ha2VGYWtlTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjpbWyJldmVudExvb3BJdGVyYXRpb24iLCJldmVudExvb3BJdGVyYXRpb24iXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUZha2VTdG9yYWdlIjpbIm1ha2VGYWtlU3RvcmFnZSJdLCJtYWtlRmFrZU1hcnNoYWxsZXIiOlsibWFrZUZha2VNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEHu35qLHQAAix0AADMAAABAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjMvc3JjL21hcnNoYWwtY29udGV4dHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy92YXRzL3NyYy9saWItYm9hcmQuanMiXSwiZXhwb3J0cyI6WyJtYWtlRXhwb3J0Q29udGV4dCIsIm1ha2VJbXBvcnRDb250ZXh0IiwibWFrZUxvZ2dpbmdQcmVzZW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLHEsSGFuZGxlZFByb21pc2UsbWFrZVNjYWxhck1hcFN0b3JlLEZhcixtYWtlTWFyc2hhbCxSZW1vdGFibGUsREVGQVVMVF9QUkVGSVg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJIYW5kbGVkUHJvbWlzZVwiLCBbJGjNj19hID0+IChIYW5kbGVkUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcIm1ha2VNYXJzaGFsXCIsIFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZVwiLCBbJGjNj19hID0+IChSZW1vdGFibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdHMvc3JjL2xpYi1ib2FyZC5qc1wiLCBbW1wiREVGQVVMVF9QUkVGSVhcIiwgWyRozY9fYSA9PiAoREVGQVVMVF9QUkVGSVggPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgaXNEZWZhdWx0Qm9hcmRJZD0oc3BlY2ltZW4pPT57XG5yZXR1cm4gdHlwZW9mIHNwZWNpbWVuPT09J3N0cmluZycmJnNwZWNpbWVuLnN0YXJ0c1dpdGgoREVGQVVMVF9QUkVGSVgpO1xuIH07XG5cbi8qXG5cblxuXG5cbiAqL1xuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VXYWxsZXRTbG90PShfdGFibGVzLGtpbmQsaWQpPT57XG5jb25zdCBkaWdpdHM9LyogICAgICAgICAgICAgICAgICovIGAke2lkfWA7XG5yZXR1cm4gYCR7a2luZH06JHtkaWdpdHN9YDtcbiB9O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZpbmRLZXk9KHJlY29yZCxwcmVkaWNhdGUpPT57XG5jb25zdCBrZXk9T2JqZWN0LmtleXMocmVjb3JkKS5maW5kKHByZWRpY2F0ZSk7XG5yZXR1cm4ga2V5O1xuIH07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgcGFyc2VXYWxsZXRTbG90PSh0YWJsZXMsc2xvdCk9PntcbmNvbnN0IGtpbmQ9ZmluZEtleSh0YWJsZXMsKGspPT5zbG90LnN0YXJ0c1dpdGgoIGAke2t9OmApKTtcbmNvbnN0IGlkPWtpbmQ/TnVtYmVyKHNsb3Quc2xpY2Uoa2luZC5sZW5ndGgrMSkpOk5hTjtcbnJldHVybntraW5kLGlkfTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgaW5pdFNsb3RWYWw9KHRhYmxlLHNsb3QsdmFsKT0+e1xudGFibGUuYnlTbG90LmluaXQoc2xvdCx2YWwpO1xudGFibGUuYnlWYWwuaW5pdCh2YWwsc2xvdCk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRXhwb3J0Q29udGV4dD0oKT0+e1xuY29uc3Qgd2FsbGV0T2JqZWN0cz17XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5wdXJzZTp7XG5ieVNsb3Q6bWFrZVNjYWxhck1hcFN0b3JlKCksXG5ieVZhbDptYWtlU2NhbGFyTWFwU3RvcmUoKX0sXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xucGF5bWVudDp7XG5ieVNsb3Q6bWFrZVNjYWxhck1hcFN0b3JlKCksXG5ieVZhbDptYWtlU2NhbGFyTWFwU3RvcmUoKX0sXG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG51bmtub3duOntcbmJ5U2xvdDptYWtlU2NhbGFyTWFwU3RvcmUoKSxcbmJ5VmFsOm1ha2VTY2FsYXJNYXBTdG9yZSgpfX07XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJvYXJkT2JqZWN0cz17XG5ieVNsb3Q6bWFrZVNjYWxhck1hcFN0b3JlKCksXG5ieVZhbDptYWtlU2NhbGFyTWFwU3RvcmUoKX07XG5cblxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IHNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT57XG5pZihpc0RlZmF1bHRCb2FyZElkKHNsb3QpJiZib2FyZE9iamVjdHMuYnlTbG90LmhhcyhzbG90KSl7XG5yZXR1cm4gYm9hcmRPYmplY3RzLmJ5U2xvdC5nZXQoc2xvdCk7XG4gfVxuY29uc3R7a2luZCxpZH09cGFyc2VXYWxsZXRTbG90KHdhbGxldE9iamVjdHMsc2xvdCk7XG5raW5kfHxGYWlsIGBiYWQgc2xvdCBraW5kOiAke3Nsb3R9YDtcbmNvbnN0IHZhbD13YWxsZXRPYmplY3RzW2tpbmRdLmJ5U2xvdC5nZXQoaWQpOy8vXG5yZXR1cm4gdmFsO1xuIH07XG5cbmxldCB1bmtub3duTm9uY2U9MDtcblxuLypcblxuXG4gICAqL1xuY29uc3QgdmFsVG9TbG90PSh2YWwpPT57XG5pZihib2FyZE9iamVjdHMuYnlWYWwuaGFzKHZhbCkpe1xucmV0dXJuIGJvYXJkT2JqZWN0cy5ieVZhbC5nZXQodmFsKTtcbiB9XG5jb25zdCBraW5kPWZpbmRLZXkod2FsbGV0T2JqZWN0cywoayk9PndhbGxldE9iamVjdHNba10uYnlWYWwuaGFzKHZhbCkpO1xuaWYoa2luZCl7XG4vL1xuY29uc3QgaWQ9d2FsbGV0T2JqZWN0c1traW5kXS5ieVZhbC5nZXQodmFsKTtcbnJldHVybiBtYWtlV2FsbGV0U2xvdCh3YWxsZXRPYmplY3RzLGtpbmQsaWQpO1xuIH1cbnVua25vd25Ob25jZSs9MTtcbmNvbnN0IHNsb3Q9bWFrZVdhbGxldFNsb3Qod2FsbGV0T2JqZWN0cywndW5rbm93bicsdW5rbm93bk5vbmNlKTtcbmluaXRTbG90VmFsKHdhbGxldE9iamVjdHMudW5rbm93bix1bmtub3duTm9uY2UsdmFsKTtcbnJldHVybiBzbG90O1xuIH07XG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZVNhdmVyPShraW5kLHRhYmxlKT0+e1xubGV0IG5vbmNlPTA7XG4vKiAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHNhdmVyPSh2YWwpPT57XG5ub25jZSs9MTtcbmluaXRTbG90VmFsKHRhYmxlLG5vbmNlLHZhbCk7XG4gfTtcbnJldHVybiBzYXZlcjtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnNhdmVQdXJzZUFjdGlvbnM6bWFrZVNhdmVyKCdwdXJzZScsd2FsbGV0T2JqZWN0cy5wdXJzZSksXG5zYXZlUGF5bWVudEFjdGlvbnM6bWFrZVNhdmVyKCdwYXltZW50Jyx3YWxsZXRPYmplY3RzLnBheW1lbnQpLFxuLypcblxuXG4gICAgICovXG5pbml0UHVyc2VJZDooaWQscHVyc2UpPT57XG5pbml0U2xvdFZhbCh3YWxsZXRPYmplY3RzLnB1cnNlLGlkLHB1cnNlKTtcbiB9LFxucHVyc2VFbnRyaWVzOndhbGxldE9iamVjdHMucHVyc2UuYnlTbG90LmVudHJpZXMsXG4vKlxuXG5cbiAgICAgKi9cbmluaXRCb2FyZElkOihpZCx2YWwpPT57XG5pbml0U2xvdFZhbChib2FyZE9iamVjdHMsaWQsdmFsKTtcbiB9LFxuLypcblxuXG4gICAgICovXG5lbnN1cmVCb2FyZElkOihpZCx2YWwpPT57XG5pZihib2FyZE9iamVjdHMuYnlWYWwuaGFzKHZhbCkpe1xuYXNzZXJ0LmVxdWFsKGJvYXJkT2JqZWN0cy5ieVZhbC5nZXQodmFsKSxpZCk7XG5yZXR1cm47XG4gfVxuaW5pdFNsb3RWYWwoYm9hcmRPYmplY3RzLGlkLHZhbCk7XG4gfSxcbi4uLm1ha2VNYXJzaGFsKHZhbFRvU2xvdCxzbG90VG9WYWwse3NlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KX0pO1xuXG4gfTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLm1ha2VFeHBvcnRDb250ZXh0KG1ha2VFeHBvcnRDb250ZXh0KTtcblxuY29uc3QgZGVmYXVsdE1ha2VQcmVzZW5jZT0oaWZhY2UpPT57XG5jb25zdCBzZXZlcmVkPSBgU0VWRVJFRDogJHtpZmFjZS5yZXBsYWNlKC9eQWxsZWdlZDogLywnJyl9YDtcbnJldHVybiBGYXIoc2V2ZXJlZCx7fSk7XG4gfTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUltcG9ydENvbnRleHQ9KG1ha2VQcmVzZW5jZT1kZWZhdWx0TWFrZVByZXNlbmNlKT0+e1xuY29uc3Qgd2FsbGV0T2JqZWN0cz17XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5wdXJzZTp7XG5ieVNsb3Q6bWFrZVNjYWxhck1hcFN0b3JlKCksXG5ieVZhbDptYWtlU2NhbGFyTWFwU3RvcmUoKX0sXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbnBheW1lbnQ6e1xuYnlTbG90Om1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuYnlWYWw6bWFrZVNjYWxhck1hcFN0b3JlKCl9LFxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG51bmtub3duOntcbmJ5U2xvdDptYWtlU2NhbGFyTWFwU3RvcmUoKSxcbmJ5VmFsOm1ha2VTY2FsYXJNYXBTdG9yZSgpfX07XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJvYXJkT2JqZWN0cz17XG5ieVNsb3Q6bWFrZVNjYWxhck1hcFN0b3JlKCksXG5ieVZhbDptYWtlU2NhbGFyTWFwU3RvcmUoKX07XG5cblxuLypcblxuXG5cblxuXG4gICAqL1xuY29uc3QgcHJvdmlkZVZhbD0odGFibGUsc2xvdCxpZmFjZSk9PntcbmlmKHRhYmxlLmJ5U2xvdC5oYXMoc2xvdCkpe1xucmV0dXJuIHRhYmxlLmJ5U2xvdC5nZXQoc2xvdCk7XG4gfVxuY29uc3QgdmFsPW1ha2VQcmVzZW5jZShpZmFjZSk7XG5pbml0U2xvdFZhbCh0YWJsZSxzbG90LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbmNvbnN0IHNsb3RUb1ZhbD17XG4vKlxuXG5cbiAgICAgKi9cbmZyb21Cb2FyZDooc2xvdCxpZmFjZSk9PntcbmlzRGVmYXVsdEJvYXJkSWQoc2xvdCl8fEZhaWwgYGJhZCBib2FyZCBzbG90ICR7cShzbG90KX1gO1xucmV0dXJuIHByb3ZpZGVWYWwoYm9hcmRPYmplY3RzLHNsb3QsaWZhY2UpO1xuIH0sXG5cbi8qXG5cblxuICAgICAqL1xuZnJvbU15V2FsbGV0OihzbG90LGlmYWNlKT0+e1xuaWYoIXNsb3Qpe1xuLy9cbnJldHVybiBtYWtlUHJlc2VuY2UoIGAke3Nsb3R9YCk7XG4gfVxuY29uc3R7a2luZCxpZH09cGFyc2VXYWxsZXRTbG90KHdhbGxldE9iamVjdHMsc2xvdCk7XG5yZXR1cm4ga2luZD9cbnByb3ZpZGVWYWwod2FsbGV0T2JqZWN0c1traW5kXSxpZCxpZmFjZSk6XG5zbG90VG9WYWwuZnJvbUJvYXJkKHNsb3QsaWZhY2UpO1xuIH19O1xuXG5cbmNvbnN0IHZhbFRvU2xvdD17XG5mcm9tQm9hcmQ6KHZhbCk9PmJvYXJkT2JqZWN0cy5ieVZhbC5nZXQodmFsKSxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmZyb21NeVdhbGxldDoodmFsKT0+e1xuY29uc3Qga2luZD1maW5kS2V5KHdhbGxldE9iamVjdHMsKGspPT53YWxsZXRPYmplY3RzW2tdLmJ5VmFsLmhhcyh2YWwpKTtcbmlmKGtpbmQ9PT11bmRlZmluZWQpe1xudGhyb3cgRmFpbCBgY2Fubm90IHNlcmlhbGl6ZSB1bnJlZ2lzdGVyZWQgJHt2YWx9YDtcbiB9XG5cbmNvbnN0IGlkPXdhbGxldE9iamVjdHNba2luZF0uYnlWYWwuZ2V0KHZhbCk7XG5yZXR1cm4gbWFrZVdhbGxldFNsb3Qod2FsbGV0T2JqZWN0cyxraW5kLGlkKTtcbiB9fTtcblxuXG5jb25zdCBtYXJzaGFsPXtcbmZyb21Cb2FyZDptYWtlTWFyc2hhbCh2YWxUb1Nsb3QuZnJvbUJvYXJkLHNsb3RUb1ZhbC5mcm9tQm9hcmQse1xubWFyc2hhbE5hbWU6J2Zyb21Cb2FyZCcsXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSksXG5cbmZyb21NeVdhbGxldDptYWtlTWFyc2hhbCh2YWxUb1Nsb3QuZnJvbU15V2FsbGV0LHNsb3RUb1ZhbC5mcm9tTXlXYWxsZXQse1xubWFyc2hhbE5hbWU6J2Zyb21NeVdhbGxldCcsXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSl9O1xuXG5cblxucmV0dXJuIGhhcmRlbih7XG4vKlxuXG5cbiAgICAgKi9cbmluaXRCb2FyZElkOihpZCx2YWwpPT57XG5pbml0U2xvdFZhbChib2FyZE9iamVjdHMsaWQsdmFsKTtcbiB9LFxuLypcblxuXG4gICAgICovXG5lbnN1cmVCb2FyZElkOihpZCx2YWwpPT57XG5pZihib2FyZE9iamVjdHMuYnlWYWwuaGFzKHZhbCkpe1xuYXNzZXJ0LmVxdWFsKGJvYXJkT2JqZWN0cy5ieVZhbC5nZXQodmFsKSxpZCk7XG5yZXR1cm47XG4gfVxuaW5pdFNsb3RWYWwoYm9hcmRPYmplY3RzLGlkLHZhbCk7XG4gfSxcbmZyb21NeVdhbGxldDpGYXIoJ3dhbGxldCBtYXJzaGFsbGVyJyx7Li4ubWFyc2hhbC5mcm9tTXlXYWxsZXR9KSxcbmZyb21Cb2FyZDpGYXIoJ2JvYXJkIG1hcnNoYWxsZXInLHsuLi5tYXJzaGFsLmZyb21Cb2FyZH0pfSk7XG5cbiB9O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlSW1wb3J0Q29udGV4dChtYWtlSW1wb3J0Q29udGV4dCk7XG5jb25zdCBtYWtlUHJlc2VuY2U9KGlmYWNlLGhhbmRsZXIpPT57XG5sZXQgb2JqO1xuXG52b2lkIG5ldyBIYW5kbGVkUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QscmVzb2x2ZVdpdGhQcmVzZW5jZSk9Pntcbm9iaj1yZXNvbHZlV2l0aFByZXNlbmNlKGhhbmRsZXIpO1xuIH0pO1xuYXNzZXJ0KG9iaik7XG5yZXR1cm4gUmVtb3RhYmxlKGlmYWNlLHVuZGVmaW5lZCxvYmopO1xuIH07XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUxvZ2dpbmdQcmVzZW5jZT0oaWZhY2UsbG9nKT0+e1xuLyogICAgICAgICAgICAgICovIC8vXG5jb25zdCBpdD1tYWtlUHJlc2VuY2UoaWZhY2Use1xuYXBwbHlNZXRob2Q6KHRhcmdldCxtZXRob2QsYXJncyk9PntcbmxvZyhoYXJkZW4oWydhcHBseU1ldGhvZCcsdGFyZ2V0LG1ldGhvZCxhcmdzXSkpO1xuIH0sXG5hcHBseUZ1bmN0aW9uOih0YXJnZXQsYXJncyk9PntcbmxvZyhoYXJkZW4oWydhcHBseUZ1bmN0aW9uJyx0YXJnZXQsYXJnc10pKTtcbiB9fSk7XG5cbnJldHVybiBpdDtcbiB9OyRozY9fb25jZS5tYWtlTG9nZ2luZ1ByZXNlbmNlKG1ha2VMb2dnaW5nUHJlc2VuY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUV4cG9ydENvbnRleHQiOlsibWFrZUV4cG9ydENvbnRleHQiXSwibWFrZUltcG9ydENvbnRleHQiOlsibWFrZUltcG9ydENvbnRleHQiXSwibWFrZUxvZ2dpbmdQcmVzZW5jZSI6WyJtYWtlTG9nZ2luZ1ByZXNlbmNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMhA0AaUDQAAlA0AACEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAZW5kby9leG8iLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiLCJtdXN0TWF0Y2giLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCB0eXBlbGVzc011c3RNYXRjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAodHlwZWxlc3NNdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbXV0sW1wiQGVuZG8vZXhvXCIsIFtdXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW11dLFtcIi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICovXG5jb25zdCAgICAgICAgbXVzdE1hdGNoPXR5cGVsZXNzTXVzdE1hdGNoOyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXV0sIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjpbWyJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5Il1dLCJAZW5kby9wYXR0ZXJucyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXSxbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl0sWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl0sWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il0sWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXSxbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdXSwiQGVuZG8vZXhvIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8CKrrjUFAAA1BQAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeU1hcD0odGFnPSdrZXknKT0+e1xuY29uc3QgbT1uZXcgTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIW0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxubS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vL1xuLy9cbi8vXG5yZXR1cm4gbS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xucmV0dXJuIG0uZ2V0KGtleSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5kZWxldGUoa2V5KTtcbiB9LFxua2V5czooKT0+bS5rZXlzKCksXG52YWx1ZXM6KCk9Pm0udmFsdWVzKCksXG5lbnRyaWVzOigpPT5tLmVudHJpZXMoKSxcbmdldFNpemU6KCk9Pm0uc2l6ZSxcbmNsZWFyOigpPT5tLmNsZWFyKCl9KTtcblxuIH07JGjNj19vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAusRN7fcEAAD3BAAAMAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeVdlYWtNYXA9KHRhZz0na2V5Jyk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHdtPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIXdtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbndtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8vXG4vL1xuLy9cbnJldHVybiB3bS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8vXG5yZXR1cm4gKC8qICAgICAgICAgICAgKi93bS5nZXQoa2V5KSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLmRlbGV0ZShrZXkpO1xuIH19KTtcblxuIH07JGjNj19vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA7XjyCnBAAAJwQAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBxLEZhcixhc3NlcnRQYXNzYWJsZSxmaWx0ZXJJdGVyYWJsZSxtYXBJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlNYXAsbWF0Y2hlcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRozY9fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRozY9fYSA9PiAobWFwSXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjNj19hID0+IChjb21wYXJlUmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIiwgWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kc1wiLCBbJGjNj19hID0+IChtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG50YWc9J2tleScpPT5cbntcbmNvbnN0e2Fzc2VydFVwZGF0ZU9uQWRkLGFzc2VydFVwZGF0ZU9uRGVsZXRlLGl0ZXJhYmxlS2V5c309XG5tYWtlQ3VycmVudEtleXNLaXQoXG4oKT0+anNtYXAua2V5cygpLFxuKGspPT5qc21hcC5oYXMoayksXG5jb21wYXJlUmFuayxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG50YWcpO1xuXG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaXRlcmFibGVLZXlzO1xuIH1cbmNvbnN0IGZpbHRlcj0oayk9PntcbmlmKGtleVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGssa2V5UGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8vXG5pZih2YWx1ZVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGpzbWFwLmdldChrKSx2YWx1ZVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xucmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cyxmaWx0ZXIpO1xuIH07XG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3QgdmFsdWVzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSwoayk9Pi8qICAgICAgICAgICAgKi9qc21hcC5nZXQoaykpO1xuXG4vKlxuXG5cblxuICAgKi9cbmNvbnN0IGVudHJpZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+W1xuayxcbi8qICAgICAgICAgICAgKi9qc21hcC5nZXQoayldKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL2Fzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG50YWcpLFxuXG5rZXlzLFxudmFsdWVzLFxuZW50cmllcyxcblxuc25hcHNob3Q6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1ha2VDb3B5TWFwKGVudHJpZXMoa2V5UGF0dCx2YWx1ZVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkP1xuanNtYXAuc2l6ZTpcblsuLi5rZXlzKGtleVBhdHQsdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5qc21hcC5jbGVhcigpO1xuIH1cbmZvcihjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0LHZhbHVlUGF0dCkpe1xuanNtYXAuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlTWFwU3RvcmVNZXRob2RzKG1ha2VNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJNYXBTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3IE1hcCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLy9cbi8vXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlLCdtYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8vXG4vL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnbWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaM2PX29uY2UubWFrZVNjYWxhck1hcFN0b3JlKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhck1hcFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXBTdG9yZU1ldGhvZHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgs3yXNCwAAzQsAADEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiLCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHEsRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjNj19hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjNj19hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsIFskaM2PX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjNj19hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVNldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0e2Fzc2VydFVwZGF0ZU9uQWRkLGFzc2VydFVwZGF0ZU9uRGVsZXRlLGl0ZXJhYmxlS2V5c309XG5tYWtlQ3VycmVudEtleXNLaXQoXG4oKT0+anNzZXQua2V5cygpLFxuKGspPT5qc3NldC5oYXMoayksXG5jb21wYXJlUmFuayxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlLFxua2V5TmFtZSk7XG5cblxuLypcblxuXG4gICAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VTZXRTdG9yZU1ldGhvZHMobWFrZVNldFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhclNldFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcgU2V0KCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8vXG4vL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnc2V0U3RvcmUga2V5Jyk7XG4gfVxuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjNj19vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADpDjncsA0AALANAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHEsRmFpbCxGYXIsYXNzZXJ0UGFzc2FibGUscGFzc1N0eWxlT2YsZ2V0Q29weU1hcEVudHJpZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4saXNDb3B5TWFwOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlNYXBcIiwgWyRozY9fYSA9PiAoaXNDb3B5TWFwID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLy9cbi8vXG4vL1xucmV0dXJuIGpzbWFwLmhhcyhrZXkpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLy9cbnJldHVybiAoLyogICAgICAgICAgICAqL2pzbWFwLmdldChrZXkpKTtcbiB9LFxuXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNtYXAuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihlbnRyaWVzKT0+e1xuaWYodHlwZW9mIGVudHJpZXNbU3ltYm9sLml0ZXJhdG9yXSE9PSdmdW5jdGlvbicpe1xuaWYoT2JqZWN0LmlzRnJvemVuKGVudHJpZXMpJiZpc0NvcHlNYXAoZW50cmllcykpe1xuLy9cbmVudHJpZXM9Z2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gfWVsc2V7XG5GYWlsIGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuIH1cbiB9XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL2VudHJpZXMpe1xuLy9cbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtNYXBTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3KGxvbmdMaXZlZD9XZWFrTWFwOk1hcCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtWT2tUb1NldD0oX2tleSx2YWx1ZSk9Pntcbi8vXG4vL1xuaGFyZGVuKHZhbHVlKTtcblxuYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2godmFsdWUsdmFsdWVTaGFwZSwnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLy9cbi8vXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtNYXBTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRozY9fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFR9JxVzCgAAcwoAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcSxGYWlsLEZhcixwYXNzU3R5bGVPZixnZXRDb3B5U2V0S2V5cyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlTZXRLZXlzXCIsIFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dLFtcImlzQ29weVNldFwiLCBbJGjNj19hID0+IChpc0NvcHlTZXQgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc3NldC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vL1xuLy9cbi8vXG5yZXR1cm4ganNzZXQuaGFzKGtleSk7XG4gfSxcblxuYWRkOihrZXkpPT57XG5hc3NlcnRLZXlPa1RvQWRkKGtleSk7XG5qc3NldC5hZGQoa2V5KTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooa2V5cyk9PntcbmlmKHR5cGVvZiBrZXlzW1N5bWJvbC5pdGVyYXRvcl0hPT0nZnVuY3Rpb24nKXtcbmlmKE9iamVjdC5pc0Zyb3plbihrZXlzKSYmaXNDb3B5U2V0KGtleXMpKXtcbi8vXG5rZXlzPWdldENvcHlTZXRLZXlzKGtleXMpO1xuIH1lbHNle1xuRmFpbCBgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2tleXN9YDtcbiB9XG4gfVxuZm9yKGNvbnN0IGtleSBvZi8qICAgICAgICAgICAgICAgICAgICAgICova2V5cyl7XG5hc3NlcnRLZXlPa1RvQWRkKGtleSk7XG5qc3NldC5hZGQoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtTZXRTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3KGxvbmdMaXZlZD9XZWFrU2V0OlNldCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLy9cbi8vXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gfVxuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha1NldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB52wuHqw4AAKsOAAAuAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhcHBlbmRUb1N0b3JlZEFycmF5IiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxxLEZhcixNLG1hdGNoZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIiwgWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsIFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuLypcblxuXG5cblxuICovXG5cbi8vXG4vL1xuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldD0ocyk9Pm1hdGNoZXMocyxNLnNldCgpKTtcblxuLy9cbi8vXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9Pm1hdGNoZXMobSxNLm1hcCgpKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuY29uc3QgICAgICAgIG1ha2VDdXJyZW50S2V5c0tpdD0oXG5nZXRSYXdLZXlzLFxuY2hlY2tIYXMsXG5jb21wYXJlLFxuYXNzZXJ0T2tUb0FkZCxcbmFzc2VydE9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xubGV0IHVwZGF0ZUNvdW50PTA7XG5sZXQgc29ydGVkS2V5c01lbW87XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkPShrLHY9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0T2tUb0FkZChrLHYpO1xudXBkYXRlQ291bnQrPTE7XG5zb3J0ZWRLZXlzTWVtbz11bmRlZmluZWQ7XG4gfTtcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGU9KGspPT5hc3NlcnRPa1RvRGVsZXRlJiZhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG5jb25zdCBnZXRTb3J0ZWRLZXlzPSgpPT57XG5pZihzb3J0ZWRLZXlzTWVtbz09PXVuZGVmaW5lZCl7XG5zb3J0ZWRLZXlzTWVtbz1oYXJkZW4oWy4uLmdldFJhd0tleXMoKV0uc29ydChjb21wYXJlKSk7XG4gfVxucmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuIH07XG5cbmNvbnN0IGl0ZXJhYmxlS2V5cz1GYXIoJ0l0ZXJhYmxlIG9mIGtleXMnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBnZW5lcmF0aW9uPXVwZGF0ZUNvdW50O1xuZ2V0U29ydGVkS2V5cygpO1xuY29uc3QgbGVuPXNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdJdGVyYXRvciBvZiBrZXlzJyx7XG5uZXh0OigpPT57XG5nZW5lcmF0aW9uPT09dXBkYXRlQ291bnR8fEZhaWwgYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYDtcbi8vXG4vL1xuZm9yKDs7KXtcbmlmKGk8bGVuKXtcbmNvbnN0IHZhbHVlPXNvcnRlZEtleXNNZW1vW2ldO1xuaSs9MTtcbmlmKGNoZWNrSGFzKHZhbHVlKSl7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbml0ZXJhYmxlS2V5c30pO1xuXG4gfTskaM2PX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUxhenk9KG1hcFN0b3JlLGtleSxtYWtlVmFsdWUpPT57XG5pZighbWFwU3RvcmUuaGFzKGtleSkpe1xubWFwU3RvcmUuaW5pdChrZXksbWFrZVZhbHVlKGtleSkpO1xuIH1cbnJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbiB9OyRozY9fb25jZS5wcm92aWRlTGF6eShwcm92aWRlTGF6eSk7XG5oYXJkZW4ocHJvdmlkZUxhenkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXRvbWljUHJvdmlkZXI9KHN0b3JlKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwZW5kaW5nPW5ldyBNYXAoKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgcHJvdmlkZUFzeW5jPShrZXksbWFrZVZhbHVlLGZpbmlzaFZhbHVlKT0+e1xuaWYoc3RvcmUuaGFzKGtleSkpe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShzdG9yZS5nZXQoa2V5KSk7XG4gfVxuaWYoIXBlbmRpbmcuaGFzKGtleSkpe1xuY29uc3QgdmFsUD1tYWtlVmFsdWUoa2V5KS5cbnRoZW4oKHYpPT57XG5zdG9yZS5pbml0KGtleSx2KTtcbnJldHVybiB2O1xuIH0pLlxudGhlbigodik9PntcbmlmKGZpbmlzaFZhbHVlKXtcbnJldHVybiBmaW5pc2hWYWx1ZShrZXksdikudGhlbigoKT0+dik7XG4gfVxucmV0dXJuIHY7XG4gfSkuXG5maW5hbGx5KCgpPT57XG5wZW5kaW5nLmRlbGV0ZShrZXkpO1xuIH0pO1xucGVuZGluZy5zZXQoa2V5LHZhbFApO1xuIH1cbmNvbnN0IHZhbFA9cGVuZGluZy5nZXQoa2V5KTtcbmFzc2VydCh2YWxQKTtcbnJldHVybiB2YWxQO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Byb3ZpZGVBc3luY30pO1xuIH07JGjNj19vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgYXBwZW5kVG9TdG9yZWRBcnJheT0obWFwU3RvcmUsa2V5LGl0ZW0pPT57XG5pZihtYXBTdG9yZS5oYXMoa2V5KSl7XG5jb25zdCBleHRhbnQ9bWFwU3RvcmUuZ2V0KGtleSk7XG5tYXBTdG9yZS5zZXQoa2V5LGhhcmRlbihbLi4uZXh0YW50LGl0ZW1dKSk7XG4gfWVsc2V7XG5tYXBTdG9yZS5pbml0KGtleSxoYXJkZW4oW2l0ZW1dKSk7XG4gfVxuIH07JGjNj19vbmNlLmFwcGVuZFRvU3RvcmVkQXJyYXkoYXBwZW5kVG9TdG9yZWRBcnJheSk7XG5oYXJkZW4oYXBwZW5kVG9TdG9yZWRBcnJheSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl0sImFwcGVuZFRvU3RvcmVkQXJyYXkiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEusOTSgEAAEoBAAAhAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAF/+bAoBYAAKAWAAAoAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImlnbm9yZUNvbnRleHQiLCJtYWtlRXhvVXRpbHMiLCJwcmVwYXJlRXhvIiwicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZVNpbmdsZXRvbiIsInByb3ZpZGVLaW5kSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGluaXRFbXB0eSxwcm92aWRlLGdsb2JhbFZhdERhdGE7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wicHJvdmlkZVwiLCBbJGjNj19hID0+IChwcm92aWRlID0gJGjNj19hKV1dLFtcIlZhdERhdGFcIiwgWyRozY9fYSA9PiAoZ2xvYmFsVmF0RGF0YSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLypcblxuICovXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgaWdub3JlQ29udGV4dD1cbihmbik9PlxuKF9jb250ZXh0LC4uLmFyZ3MpPT5cbmZuKC4uLmFyZ3MpOyRozY9fb25jZS5pZ25vcmVDb250ZXh0KGlnbm9yZUNvbnRleHQpO1xuaGFyZGVuKGlnbm9yZUNvbnRleHQpO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBtYWtlRXhvVXRpbHM9KFZhdERhdGEpPT57XG5jb25zdHtcbmRlZmluZUtpbmQsXG5kZWZpbmVLaW5kTXVsdGksXG5kZWZpbmVEdXJhYmxlS2luZCxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGksXG5tYWtlS2luZEhhbmRsZX09XG5WYXREYXRhO1xuXG4vKlxuXG5cblxuXG4gICAqL1xuY29uc3QgcHJvdmlkZUtpbmRIYW5kbGU9KGJhZ2dhZ2Usa2luZE5hbWUpPT5cbnByb3ZpZGUoYmFnZ2FnZSwgYCR7a2luZE5hbWV9X2tpbmRIYW5kbGVgLCgpPT5tYWtlS2luZEhhbmRsZShraW5kTmFtZSkpO1xuaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuLypcblxuXG4gICAqL1xuY29uc3QgcHJlcGFyZUtpbmQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUtpbmQpO1xuXG4vKlxuXG5cbiAgICovXG5jb25zdCBwcmVwYXJlS2luZE11bHRpPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUtpbmRNdWx0aSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzPSh0YWcsaW50ZXJmYWNlR3VhcmQsaW5pdCxtZXRob2RzLG9wdGlvbnMpPT5cbi8vXG5kZWZpbmVLaW5kKHRhZyxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pO1xuXG5oYXJkZW4oZGVmaW5lVmlydHVhbEV4b0NsYXNzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQ9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk9PlxuXG4vL1xuZGVmaW5lS2luZE11bHRpKHRhZyxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0fSk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzcz0oXG5raW5kSGFuZGxlLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuLy9cbmRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0PShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbi8vXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGtpbmRIYW5kbGUsaW5pdCxmYWNldHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZEtpdH0pO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IHByZXBhcmVFeG9DbGFzcz0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlRXhvQ2xhc3MpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgcHJlcGFyZUV4b0NsYXNzS2l0PShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlRXhvQ2xhc3NLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgcHJlcGFyZUV4bz0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgbWFrZVNpbmdsZXRvbj1wcmVwYXJlRXhvQ2xhc3MoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXRFbXB0eSxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxuXG5yZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fc2luZ2xldG9uYCwoKT0+bWFrZVNpbmdsZXRvbigpKTtcbiB9O1xuaGFyZGVuKHByZXBhcmVFeG8pO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgcHJlcGFyZVNpbmdsZXRvbj0oYmFnZ2FnZSxraW5kTmFtZSxtZXRob2RzLG9wdGlvbnM9dW5kZWZpbmVkKT0+XG5wcmVwYXJlRXhvKGJhZ2dhZ2Usa2luZE5hbWUsdW5kZWZpbmVkLG1ldGhvZHMsb3B0aW9ucyk7XG5oYXJkZW4ocHJlcGFyZVNpbmdsZXRvbik7XG5cbnJldHVybiBoYXJkZW4oe1xuZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4b0NsYXNzLFxucHJlcGFyZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4byxcblxucHJlcGFyZVNpbmdsZXRvbixcbnByb3ZpZGVLaW5kSGFuZGxlLFxucHJlcGFyZUtpbmQsXG5wcmVwYXJlS2luZE11bHRpfSk7XG5cbiB9OyRozY9fb25jZS5tYWtlRXhvVXRpbHMobWFrZUV4b1V0aWxzKTtcblxuY29uc3QgZ2xvYmFsRXhvVXRpbHM9bWFrZUV4b1V0aWxzKGdsb2JhbFZhdERhdGEpO1xuXG5jb25zdCAgICAgICB7XG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvQ2xhc3MsXG5wcmVwYXJlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvLFxucHJlcGFyZVNpbmdsZXRvbn09XG5nbG9iYWxFeG9VdGlscztcblxuLypcblxuICovJGjNj19vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzcyhkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7JGjNj19vbmNlLnByZXBhcmVFeG8ocHJlcGFyZUV4byk7JGjNj19vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG5jb25zdCAgICAgICB7cHJvdmlkZUtpbmRIYW5kbGUscHJlcGFyZUtpbmQscHJlcGFyZUtpbmRNdWx0aX09XG5nbG9iYWxFeG9VdGlsczskaM2PX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpOyRozY9fb25jZS5wcmVwYXJlS2luZChwcmVwYXJlS2luZCk7JGjNj19vbmNlLnByZXBhcmVLaW5kTXVsdGkocHJlcGFyZUtpbmRNdWx0aSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwibWFrZUV4b1V0aWxzIjpbIm1ha2VFeG9VdGlscyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIl0sInByb3ZpZGVLaW5kSGFuZGxlIjpbInByb3ZpZGVLaW5kSGFuZGxlIl0sInByZXBhcmVLaW5kIjpbInByZXBhcmVLaW5kIl0sInByZXBhcmVLaW5kTXVsdGkiOlsicHJlcGFyZUtpbmRNdWx0aSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC49RYwqAgAAKgIAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiLi9leG8tdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW11dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW11dLFtcIi4vZXhvLXV0aWxzLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGFnb3JpYy9zdG9yZSI6W1siTSIsIk0iXSxbIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLFsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSJdLFsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXV0sIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiOltbIm1ha2VLaW5kSGFuZGxlIiwibWFrZUtpbmRIYW5kbGUiXSxbInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLFsid2F0Y2hQcm9taXNlIiwid2F0Y2hQcm9taXNlIl0sWyJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIl0sWyJjYW5CZUR1cmFibGUiLCJjYW5CZUR1cmFibGUiXSxbInBpY2tGYWNldCIsInBpY2tGYWNldCJdLFsicGFydGlhbEFzc2lnbiIsInBhcnRpYWxBc3NpZ24iXSxbInByb3ZpZGUiLCJwcm92aWRlIl0sWyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiXSxbImRlZmluZUtpbmQiLCJkZWZpbmVLaW5kIl0sWyJkZWZpbmVLaW5kTXVsdGkiLCJkZWZpbmVLaW5kTXVsdGkiXSxbImRlZmluZUR1cmFibGVLaW5kIiwiZGVmaW5lRHVyYWJsZUtpbmQiXSxbImRlZmluZUR1cmFibGVLaW5kTXVsdGkiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl1dLCIuL2V4by11dGlscy5qcyI6W1siZGVmaW5lVmlydHVhbEV4b0NsYXNzIiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIl0sWyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzcyJdLFsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0Il0sWyJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3MiXSxbInByZXBhcmVFeG9DbGFzc0tpdCIsInByZXBhcmVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4byIsInByZXBhcmVFeG8iXSxbInByZXBhcmVTaW5nbGV0b24iLCJwcmVwYXJlU2luZ2xldG9uIl0sWyJpZ25vcmVDb250ZXh0IiwiaWdub3JlQ29udGV4dCJdLFsicHJvdmlkZUtpbmRIYW5kbGUiLCJwcm92aWRlS2luZEhhbmRsZSJdLFsicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZCJdLFsicHJlcGFyZUtpbmRNdWx0aSIsInByZXBhcmVLaW5kTXVsdGkiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAwRcumsFgAArBYAADAAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIlZhdERhdGEiLCJjYW5CZUR1cmFibGUiLCJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiLCJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZE11bHRpIiwibWFrZUtpbmRIYW5kbGUiLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTdG9yZVV0aWxzIiwicGFydGlhbEFzc2lnbiIsInBpY2tGYWNldCIsInByb3ZpZGUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJ3YXRjaFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxwcm92aWRlTGF6eTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRozY9fYSA9PiAocHJvdmlkZUxhenkgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAqL1xubGV0IFZhdERhdGFHbG9iYWw7XG5pZignVmF0RGF0YSdpbiBnbG9iYWxUaGlzKXtcbmdsb2JhbFRoaXMuVmF0RGF0YXx8RmFpbCBgVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZGA7XG4vL1xuVmF0RGF0YUdsb2JhbD0vKiAgICAgICAgICAgICAgKi9nbG9iYWxUaGlzLlZhdERhdGE7XG4gfWVsc2V7XG4vL1xuLy9cbi8vXG5jb25zdCB1bmF2YWlsYWJsZT0oKT0+RmFpbCBgVmF0RGF0YSB1bmF2YWlsYWJsZWA7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW5hdmFpbGFibGUsXG5kZWZpbmVLaW5kTXVsdGk6dW5hdmFpbGFibGUsXG5kZWZpbmVEdXJhYmxlS2luZDp1bmF2YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW5hdmFpbGFibGUsXG5tYWtlS2luZEhhbmRsZTp1bmF2YWlsYWJsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcjp1bmF2YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bmF2YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZTp1bmF2YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmU6dW5hdmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW5hdmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlOnVuYXZhaWxhYmxlLFxuY2FuQmVEdXJhYmxlOnVuYXZhaWxhYmxlfTtcblxuIH1cblxuY29uc3QgVmF0RGF0YUV4cG9ydD1WYXREYXRhR2xvYmFsOyRozY9fb25jZS5WYXREYXRhRXhwb3J0KFZhdERhdGFFeHBvcnQpO1xuXG5cbi8qXG5cbiAqL1xuY29uc3QgICAgICAge1xuZGVmaW5lS2luZCxcbmRlZmluZUtpbmRNdWx0aSxcbmRlZmluZUR1cmFibGVLaW5kLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aX09XG5WYXREYXRhR2xvYmFsOyRozY9fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRozY9fb25jZS5kZWZpbmVLaW5kTXVsdGkoZGVmaW5lS2luZE11bHRpKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUtpbmQoZGVmaW5lRHVyYWJsZUtpbmQpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRozY9fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbmNvbnN0ICAgICAgICBwaWNrRmFjZXQ9XG4obWFrZXIsZmFjZXROYW1lKT0+XG4oLi4uYXJncyk9PlxubWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaM2PX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHBhcnRpYWxBc3NpZ249KHRhcmdldCxzb3VyY2UpPT57XG5PYmplY3QuYXNzaWduKHRhcmdldCxzb3VyY2UpO1xuIH07JGjNj19vbmNlLnBhcnRpYWxBc3NpZ24ocGFydGlhbEFzc2lnbik7XG5oYXJkZW4ocGFydGlhbEFzc2lnbik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCAgICAgICAgcHJvdmlkZT1cbi8vXG4vKlxuXG5cblxuXG5cbiAgICovcHJvdmlkZUxhenk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnByb3ZpZGUocHJvdmlkZSk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlVXRpbHM9KFZhdERhdGEpPT57XG5jb25zdHtcbi8vXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4vL1xubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbi8vXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG4vL1xubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZX09XG5WYXREYXRhO1xuXG4vKlxuXG5cblxuICAgKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuLypcblxuXG5cbiAgICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVTZXRTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xuXG4vKlxuXG5cblxuICAgKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxucmV0dXJuIGhhcmRlbih7XG5wcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVNldFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmV9KTtcblxuIH07JGjNj19vbmNlLm1ha2VTdG9yZVV0aWxzKG1ha2VTdG9yZVV0aWxzKTtcblxuY29uc3QgZ2xvYmFsU3RvcmVVdGlscz1tYWtlU3RvcmVVdGlscyhWYXREYXRhR2xvYmFsKTtcbmNvbnN0ICAgICAgIHtcbnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZX09XG5nbG9iYWxTdG9yZVV0aWxzOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZU1hcFN0b3JlKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlZhdERhdGEiOlsiVmF0RGF0YUV4cG9ydCJdLCJkZWZpbmVLaW5kIjpbImRlZmluZUtpbmQiXSwiZGVmaW5lS2luZE11bHRpIjpbImRlZmluZUtpbmRNdWx0aSJdLCJkZWZpbmVEdXJhYmxlS2luZCI6WyJkZWZpbmVEdXJhYmxlS2luZCJdLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIjpbImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXSwibWFrZUtpbmRIYW5kbGUiOlsibWFrZUtpbmRIYW5kbGUiXSwicHJvdmlkZVByb21pc2VXYXRjaGVyIjpbInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl0sIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIl0sImNhbkJlRHVyYWJsZSI6WyJjYW5CZUR1cmFibGUiXSwicGlja0ZhY2V0IjpbInBpY2tGYWNldCJdLCJwYXJ0aWFsQXNzaWduIjpbInBhcnRpYWxBc3NpZ24iXSwicHJvdmlkZSI6WyJwcm92aWRlIl0sIm1ha2VTdG9yZVV0aWxzIjpbIm1ha2VTdG9yZVV0aWxzIl0sInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAM7Zt+DYRAAA2EQAAHwAAAEBhZ29yaWMvdmF0cy12MC4xNS4xL3NyYy9jcmMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkNSQyIsImNyYzEiLCJjcmMxMCIsImNyYzE2IiwiY3JjMjQiLCJjcmMzMiIsImNyYzMyYyIsImNyYzYiLCJjcmM4IiwibW9kZWxzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICAvKlxuXG5cblxuXG5cblxuICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IGVuY29kZXI9bmV3IFRleHRFbmNvZGVyKCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbmZ1bmN0aW9uIGNvbnZlcnQoZGF0YSl7XG5pZih0eXBlb2YgZGF0YT09PSdudW1iZXInKXtcbmNvbnN0IGJ5dGVzPVtdO1xuLy9cbi8vXG53aGlsZShkYXRhPjB8fGJ5dGVzLmxlbmd0aDw0KXtcbmJ5dGVzLnVuc2hpZnQoZGF0YSUyNTYpO1xuZGF0YT1NYXRoLmZsb29yKGRhdGEvMjU2KTtcbiB9XG5yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuIH1lbHNlIGlmKHR5cGVvZiBkYXRhPT09J3N0cmluZycpe1xucmV0dXJuIGVuY29kZXIuZW5jb2RlKGRhdGEpO1xuIH1lbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhkYXRhKSl7XG5yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsZGF0YS5ieXRlT2Zmc2V0LGRhdGEuYnl0ZUxlbmd0aCk7XG4gfWVsc2UgaWYoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXtcbnJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTtcbiB9XG50aHJvdyBUeXBlRXJyb3IoXG4gYGNyYyByZXF1aXJlcyAzMiBiaXQgbnVtYmVyLCBhIHN0cmluZyBvciBUeXBlZEFycmF5IGZvciBpbnB1dGApO1xuXG4gfVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gbWlycm9yKGRhdGEsd2lkdGgpe1xubGV0IHJlcz0wO1xuZm9yKGxldCBpPTA7aTx3aWR0aDtpKz0xKXtcbnJlcz1yZXM8PDF8ZGF0YSYxO1xuZGF0YT4+PTE7XG4gfVxucmV0dXJuIHJlcztcbiB9XG5cbmNsYXNzICAgICAgICBDUkN7XG4vKlxuXG5cblxuXG5cbiAgICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKHdpZHRoLHBvbHkseG9ySW4seG9yT3V0LHJlZmxlY3Qpe1xudGhpcy53aWR0aD13aWR0aDtcbnRoaXMucG9seT1wb2x5O1xudGhpcy54b3JJbj14b3JJbjtcbnRoaXMucmVmbGVjdGVkWG9ySW49bWlycm9yKHhvckluLHdpZHRoKTtcbnRoaXMueG9yT3V0PXhvck91dDtcbnRoaXMucmVmbGVjdD1yZWZsZWN0O1xudGhpcy5tc2JNYXNrPTE8PHRoaXMud2lkdGgtMTtcbnRoaXMubWFzaz10aGlzLm1zYk1hc2stMTw8MXwxO1xudGhpcy5jcmNTaGlmdD10aGlzLndpZHRoPDg/OC10aGlzLndpZHRoOjA7XG50aGlzLnNoaWZ0ZWRYb3JJbj10aGlzLnhvckluPDx0aGlzLmNyY1NoaWZ0O1xuXG5jb25zdCB0YWJsZT10aGlzLmdlblRhYmxlKCk7XG50aGlzLnRhYmxlPXRhYmxlO1xuXG5pZih0aGlzLndpZHRoPT09OCYmIXRoaXMueG9ySW4mJiF0aGlzLnhvck91dCYmIXRoaXMucmVmbGVjdCl7XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG50aGlzLmNhbGN1bGF0ZT1mdW5jdGlvbiBjYWxjdWxhdGUoZGF0YSl7XG5jb25zdCBidWZmZXI9Y29udmVydChkYXRhKTtcbmxldCBjcmM9MDtcbmZvcihsZXQgaT0wO2k8YnVmZmVyLmxlbmd0aDtpKz0xKXtcbmNyYz10YWJsZVtjcmNeYnVmZmVyW2ldXTtcbiB9XG5yZXR1cm4gY3JjO1xuIH07XG4gfVxuIH1cblxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgY2FsY3VsYXRlKGRhdGEpe1xuY29uc3QgYnVmZmVyPWNvbnZlcnQoZGF0YSk7XG5sZXQgY3JjO1xuY29uc3R7dGFibGUsd2lkdGgsY3JjU2hpZnQsbWFza309dGhpcztcbmlmKHRoaXMucmVmbGVjdCl7XG5jcmM9dGhpcy5yZWZsZWN0ZWRYb3JJbjtcbmZvcihsZXQgaT0wO2k8YnVmZmVyLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGJ5dGU9YnVmZmVyW2ldO1xuY3JjPSh0YWJsZVsoY3JjXmJ5dGUpJjB4ZmZdXmNyYz4+PjgpJm1hc2s7XG4gfVxuIH1lbHNle1xuY3JjPXRoaXMuc2hpZnRlZFhvckluO1xuZm9yKGxldCBpPTA7aTxidWZmZXIubGVuZ3RoO2krPTEpe1xuY3JjPVxudGFibGVbKGNyYz4+d2lkdGgtOCtjcmNTaGlmdF5idWZmZXJbaV0pJjB4ZmZdPDxcbmNyY1NoaWZ0XlxuY3JjPDw4LWNyY1NoaWZ0Jm1hc2s8PGNyY1NoaWZ0O1xuIH1cbmNyYz4+PWNyY1NoaWZ0O1xuIH1cbmNyY149dGhpcy54b3JPdXQ7XG5yZXR1cm4gY3JjPj4+MDtcbiB9XG5cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVOb1RhYmxlKGRhdGEpe1xuY29uc3QgYnVmZmVyPWNvbnZlcnQoZGF0YSk7XG5sZXQgY3JjPXRoaXMueG9ySW47XG5mb3IobGV0IGk9MDtpPGJ1ZmZlci5sZW5ndGg7aSs9MSl7XG5sZXQgb2N0ZXQ9YnVmZmVyW2ldO1xuaWYodGhpcy5yZWZsZWN0KW9jdGV0PW1pcnJvcihvY3RldCw4KTtcbmZvcihsZXQgaj0wO2o8ODtqKz0xKXtcbmxldCB0b3BiaXQ9Y3JjJnRoaXMubXNiTWFzaztcbmlmKG9jdGV0JjB4ODA+PmopdG9wYml0Xj10aGlzLm1zYk1hc2s7XG5jcmM8PD0xO1xuaWYodG9wYml0KWNyY149dGhpcy5wb2x5O1xuIH1cbmNyYyY9dGhpcy5tYXNrO1xuIH1cbmlmKHRoaXMucmVmbGVjdCljcmM9bWlycm9yKGNyYyx0aGlzLndpZHRoKTtcbmNyY149dGhpcy54b3JPdXQ7XG5yZXR1cm4gY3JjPj4+MDtcbiB9XG5cbiAgICAgICAgZ2VuVGFibGUoKXtcbmNvbnN0IHRhYmxlTGVuZ3RoPTI1NjtcbmNvbnN0IHRhYmxlPVtdO1xuZm9yKGxldCBpPTA7aTx0YWJsZUxlbmd0aDtpKz0xKXtcbmxldCByZWc9aTtcbmlmKHRoaXMucmVmbGVjdClyZWc9bWlycm9yKHJlZyw4KTtcbnJlZzw8PXRoaXMud2lkdGgtOCt0aGlzLmNyY1NoaWZ0O1xuZm9yKGxldCBqPTA7ajw4O2orPTEpe1xuaWYoKHJlZyZ0aGlzLm1zYk1hc2s8PHRoaXMuY3JjU2hpZnQpIT09MCl7XG5yZWc8PD0xO1xucmVnXj10aGlzLnBvbHk8PHRoaXMuY3JjU2hpZnQ7XG4gfWVsc2V7XG5yZWc8PD0xO1xuIH1cbiB9XG5pZih0aGlzLnJlZmxlY3QpXG5yZWc9bWlycm9yKHJlZz4+dGhpcy5jcmNTaGlmdCx0aGlzLndpZHRoKTw8dGhpcy5jcmNTaGlmdDtcbnJlZz1yZWc+PnRoaXMuY3JjU2hpZnQmdGhpcy5tYXNrO1xudGFibGVbaV09cmVnPj4+MDtcbiB9XG5yZXR1cm4gbmV3IEludDMyQXJyYXkodGFibGUpO1xuIH19JGjNj19vbmNlLiBDUkMoQ1JDKTtcblxuXG5jb25zdCAgICAgICAgY3JjMT1uZXcgQ1JDKDEsMHgwMSwweDAwLDB4MDAsZmFsc2UpOyRozY9fb25jZS5jcmMxKGNyYzEpO1xuY29uc3QgICAgICAgIGNyYzY9bmV3IENSQyg2LDB4MmYsMHgwMCwweDAwLGZhbHNlKTskaM2PX29uY2UuY3JjNihjcmM2KTtcbmNvbnN0ICAgICAgICBjcmM4PW5ldyBDUkMoOCwweDA3LDB4MDAsMHgwMCxmYWxzZSk7JGjNj19vbmNlLmNyYzgoY3JjOCk7XG5jb25zdCAgICAgICAgY3JjMTA9bmV3IENSQygxMCwweDIzMywweDAwMDAsMHgwMDAwLGZhbHNlKTskaM2PX29uY2UuY3JjMTAoY3JjMTApO1xuY29uc3QgICAgICAgIGNyYzE2PW5ldyBDUkMoMTYsMHg4MDA1LDB4MDAwMCwweDAwMDAsdHJ1ZSk7JGjNj19vbmNlLmNyYzE2KGNyYzE2KTtcbmNvbnN0ICAgICAgICBjcmMyND1uZXcgQ1JDKDI0LDB4ODY0Y2ZiLDB4YjcwNGNlLDB4MDAwMDAwLGZhbHNlKTskaM2PX29uY2UuY3JjMjQoY3JjMjQpO1xuY29uc3QgICAgICAgIGNyYzMyPW5ldyBDUkMoMzIsMHgwNGMxMWRiNywweGZmZmZmZmZmLDB4ZmZmZmZmZmYsdHJ1ZSk7JGjNj19vbmNlLmNyYzMyKGNyYzMyKTtcbmNvbnN0ICAgICAgICBjcmMzMmM9bmV3IENSQygzMiwweDFlZGM2ZjQxLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZix0cnVlKTskaM2PX29uY2UuY3JjMzJjKGNyYzMyYyk7XG5cbmNvbnN0ICAgICAgICBtb2RlbHM9e2NyYzEsY3JjNixjcmM4LGNyYzEwLGNyYzE2LGNyYzI0LGNyYzMyLGNyYzMyY307JGjNj19vbmNlLm1vZGVscyhtb2RlbHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ1JDIjpbIkNSQyJdLCJjcmMxIjpbImNyYzEiXSwiY3JjNiI6WyJjcmM2Il0sImNyYzgiOlsiY3JjOCJdLCJjcmMxMCI6WyJjcmMxMCJdLCJjcmMxNiI6WyJjcmMxNiJdLCJjcmMyNCI6WyJjcmMyNCJdLCJjcmMzMiI6WyJjcmMzMiJdLCJjcmMzMmMiOlsiY3JjMzJjIl0sIm1vZGVscyI6WyJtb2RlbHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8o+UljQhAAA0IQAAJQAAAEBhZ29yaWMvdmF0cy12MC4xNS4xL3NyYy9saWItYm9hcmQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIi4vY3JjLmpzIl0sImV4cG9ydHMiOlsiREVGQVVMVF9DUkNfRElHSVRTIiwiREVGQVVMVF9QUkVGSVgiLCJwcmVwYXJlQm9hcmRLaXQiLCJwcmVwYXJlUmVjb3JkZXJGYWN0b3J5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydCxGYWlsLHEscHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0LE0sbWFrZVNjYWxhckJpZ01hcFN0b3JlLHByZXBhcmVFeG9DbGFzc0tpdCxkZWZpbmVSZWNvcmRlcktpdCxwcmVwYXJlUmVjb3JkZXIsRSxGYXIsaXNSZW1vdGFibGUsbWFrZU1hcnNoYWwsY3JjNjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsIFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0XCIsIFskaM2PX2EgPT4gKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIiwgWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzXCIsIFtbXCJkZWZpbmVSZWNvcmRlcktpdFwiLCBbJGjNj19hID0+IChkZWZpbmVSZWNvcmRlcktpdCA9ICRozY9fYSldXSxbXCJwcmVwYXJlUmVjb3JkZXJcIiwgWyRozY9fYSA9PiAocHJlcGFyZVJlY29yZGVyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzUmVtb3RhYmxlXCIsIFskaM2PX2EgPT4gKGlzUmVtb3RhYmxlID0gJGjNj19hKV1dLFtcIm1ha2VNYXJzaGFsXCIsIFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiLi9jcmMuanNcIiwgW1tcImNyYzZcIiwgWyRozY9fYSA9PiAoY3JjNiA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0ICAgICAgICBERUZBVUxUX0NSQ19ESUdJVFM9MjskaM2PX29uY2UuREVGQVVMVF9DUkNfRElHSVRTKERFRkFVTFRfQ1JDX0RJR0lUUyk7XG5jb25zdCAgICAgICAgREVGQVVMVF9QUkVGSVg9J2JvYXJkMCc7XG5cbi8vXG4vL1xuJGjNj19vbmNlLkRFRkFVTFRfUFJFRklYKERFRkFVTFRfUFJFRklYKTtjb25zdCBDYXBEYXRhU2hhcGU9e2JvZHk6TS5zdHJpbmcoKSxzbG90czpNLmFycmF5KCl9O1xuY29uc3QgTWFyc2hhbEk9TS5pbnRlcmZhY2UoJ01hcnNoYWxsZXInLHtcbnRvQ2FwRGF0YTpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhDYXBEYXRhU2hhcGUpLFxuc2VyaWFsaXplOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKENhcERhdGFTaGFwZSksXG5mcm9tQ2FwRGF0YTpNLmNhbGwoQ2FwRGF0YVNoYXBlKS5yZXR1cm5zKE0uYW55KCkpLFxudW5zZXJpYWxpemU6TS5jYWxsKENhcERhdGFTaGFwZSkucmV0dXJucyhNLmFueSgpKX0pO1xuXG5cbmNvbnN0IElkU2hhcGU9TS5zdHJpbmcoKTtcbmNvbnN0IFZhbFNoYXBlPU0uc2NhbGFyKCk7XG5jb25zdCBCb2FyZEtpdElLaXQ9e1xuYm9hcmQ6TS5pbnRlcmZhY2UoJ0JvYXJkJyx7XG5oYXM6TS5jYWxsKFZhbFNoYXBlKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldFZhbHVlOk0uY2FsbChJZFNoYXBlKS5yZXR1cm5zKFZhbFNoYXBlKSxcbmxvb2t1cDpNLmNhbGwoKS5yZXN0KE0uYXJyYXlPZihJZFNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRJZDpNLmNhbGwoVmFsU2hhcGUpLnJldHVybnMoSWRTaGFwZSksXG5pZHM6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoSWRTaGFwZSkpLFxuZ2V0UHVibGlzaGluZ01hcnNoYWxsZXI6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgpKSxcbmdldFJlYWRvbmx5TWFyc2hhbGxlcjpNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCkpfSksXG5cbnB1Ymxpc2hpbmdNYXJzaGFsbGVyOk1hcnNoYWxJLFxucmVhZG9ubHlNYXJzaGFsbGVyOk1hcnNoYWxJfTtcblxuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGNhbGNDcmM9KGRhdGEsY3JjRGlnaXRzKT0+e1xuLy9cbi8vXG5jb25zdCBjcmM9Y3JjNi5jYWxjdWxhdGUoZGF0YSkrMTtcbmNvbnN0IGNyY1N0cj1jcmMudG9TdHJpbmcoKS5wYWRTdGFydChjcmNEaWdpdHMsJzAnKTtcbmFzc2VydChjcmNTdHIubGVuZ3RoPD1jcmNEaWdpdHMsIGBDUkMgdG9vIGJpZyBmb3IgaXRzIGJyaXRjaGVzICR7Y3JjU3RyfWApO1xucmV0dXJuIGNyY1N0cjtcbiB9O1xuXG4vKlxuXG5cbiAqL1xuXG4vL1xuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpbml0RHVyYWJsZUJvYXJkU3RhdGU9KFxuaW5pdFNlcXVlbmNlPTAsXG57cHJlZml4PURFRkFVTFRfUFJFRklYLGNyY0RpZ2l0cz1ERUZBVUxUX0NSQ19ESUdJVFN9PXt9KT0+XG57XG5jb25zdCBpbW11dGFibGU9e3ByZWZpeCxjcmNEaWdpdHN9O1xuXG5jb25zdCBsYXN0U2VxdWVuY2U9QmlnSW50KGluaXRTZXF1ZW5jZSk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpZFRvVmFsPW1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnaWRUb1ZhbCcse1xuZHVyYWJsZTp0cnVlLFxua2V5U2hhcGU6SWRTaGFwZSxcbnZhbHVlU2hhcGU6VmFsU2hhcGV9KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgdmFsVG9JZD1tYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ3ZhbFRvSWQnLHtcbmR1cmFibGU6dHJ1ZSxcbmtleVNoYXBlOlZhbFNoYXBlLFxudmFsdWVTaGFwZTpJZFNoYXBlfSk7XG5cblxuY29uc3QgbXV0YWJsZT17bGFzdFNlcXVlbmNlLGlkVG9WYWwsdmFsVG9JZH07XG5cbnJldHVybntcbi4uLmltbXV0YWJsZSxcbi4uLm11dGFibGV9O1xuXG4gfTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuICovXG5jb25zdCBnZXRJZD0odmFsdWUsc3RhdGUpPT57XG5jb25zdHtpZFRvVmFsLHZhbFRvSWQscHJlZml4LGNyY0RpZ2l0c309c3RhdGU7XG5pZighaXNSZW1vdGFibGUodmFsdWUpKXtcbkZhaWwgYEJvYXJkIGNhbm5vdCBjcmVhdGUgaWQgZm9yIG5vbi1yZW1vdGFibGVgO1xuIH1cblxuaWYodmFsVG9JZC5oYXModmFsdWUpKXtcbnJldHVybiB2YWxUb0lkLmdldCh2YWx1ZSk7XG4gfVxuXG5zdGF0ZS5sYXN0U2VxdWVuY2UrPTFuO1xuY29uc3Qgc2VxPXN0YXRlLmxhc3RTZXF1ZW5jZTtcblxuY29uc3QgY3JjSW5wdXQ9IGAke3ByZWZpeH0ke3NlcX1gO1xuY29uc3QgY3JjPWNhbGNDcmMoY3JjSW5wdXQsY3JjRGlnaXRzKTtcblxuY29uc3QgaWQ9IGAke3ByZWZpeH0ke2NyY30ke3NlcX1gO1xuXG52YWxUb0lkLmluaXQodmFsdWUsaWQpO1xuaWRUb1ZhbC5pbml0KGlkLHZhbHVlKTtcbnJldHVybiBpZDtcbiB9O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgZ2V0VmFsdWU9KGlkLHtwcmVmaXgsY3JjRGlnaXRzLGlkVG9WYWx9KT0+e1xuaWQuc3RhcnRzV2l0aChwcmVmaXgpfHxGYWlsIGBpZCBtdXN0IHN0YXJ0IHdpdGggJHtxKHByZWZpeCl9OiAke2lkfWA7XG5jb25zdCBkaWdpdHM9aWQuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4vL1xuY29uc3QgRElHSVRTX1JFR0VYUD1uZXcgUmVnRXhwKCBgXlswLTldeyR7Y3JjRGlnaXRzKzF9LH0kYCk7XG5ESUdJVFNfUkVHRVhQLnRlc3QoZGlnaXRzKXx8XG5GYWlsIGBpZCBtdXN0IGVuZCBpbiBhdCBsZWFzdCAke3EoY3JjRGlnaXRzKzEpfSBkaWdpdHM6ICR7aWR9YDtcblxuaWYoaWRUb1ZhbC5oYXMoaWQpKXtcbnJldHVybiBpZFRvVmFsLmdldChpZCk7XG4gfVxuXG5jb25zdCBhbGxlZ2VkQ3JjPWRpZ2l0cy5zbGljZSgwLGNyY0RpZ2l0cyk7XG5cbmNvbnN0IHNlcT1kaWdpdHMuc2xpY2UoY3JjRGlnaXRzKTtcbmNvbnN0IGNyY0lucHV0PSBgJHtwcmVmaXh9JHtzZXF9YDtcbmNvbnN0IGNyYz1jYWxjQ3JjKGNyY0lucHV0LGNyY0RpZ2l0cyk7XG5cbmFsbGVnZWRDcmM9PT1jcmN8fEZhaWwgYGlkIGlzIHByb2JhYmx5IGEgdHlwbywgY2Fubm90IHZlcmlmeSBDUkM6ICR7aWR9YDtcbi8vXG50aHJvdyBGYWlsIGBib2FyZCBkb2VzIG5vdCBoYXZlIGlkOiAke2lkfWA7XG4gfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1ha2VTbG90VG9WYWw9KHN0YXRlKT0+e1xuY29uc3QgaWZhY2VBbGxlZ2VkUHJlZml4PSdBbGxlZ2VkOiAnO1xuY29uc3QgaWZhY2VJbmFjY2Vzc2libGVQcmVmaXg9J1NFVkVSRUQ6ICc7XG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3Qgc2xvdFRvVmFsPShzbG90LGlmYWNlKT0+e1xuaWYoc2xvdCE9PW51bGwpe1xucmV0dXJuIGdldFZhbHVlKHNsb3Qsc3RhdGUpO1xuIH1cblxuLy9cbmlmKHR5cGVvZiBpZmFjZT09PSdzdHJpbmcnJiZpZmFjZS5zdGFydHNXaXRoKGlmYWNlQWxsZWdlZFByZWZpeCkpe1xuaWZhY2U9aWZhY2Uuc2xpY2UoaWZhY2VBbGxlZ2VkUHJlZml4Lmxlbmd0aCk7XG4gfVxucmV0dXJuIEZhciggYCR7aWZhY2VJbmFjY2Vzc2libGVQcmVmaXh9JHtpZmFjZX1gLHt9KTtcbiB9O1xucmV0dXJuIHNsb3RUb1ZhbDtcbiB9O1xuXG4vL1xuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VSZWFkb25seU1hcnNoYWxsZXI9KHN0YXRlKT0+e1xuY29uc3R7dmFsVG9JZH09c3RhdGU7XG5jb25zdCBzbG90VG9WYWw9bWFrZVNsb3RUb1ZhbChzdGF0ZSk7XG5jb25zdCB2YWxUb1Nsb3Q9KHZhbCk9PntcbmlmKCF2YWxUb0lkLmhhcyh2YWwpKXtcbi8vXG5yZXR1cm4gbnVsbDtcbiB9XG5cbi8vXG5yZXR1cm4gdmFsVG9JZC5nZXQodmFsKTtcbiB9O1xucmV0dXJuIG1ha2VNYXJzaGFsKHZhbFRvU2xvdCxzbG90VG9WYWwse1xuc2VyaWFsaXplQm9keUZvcm1hdDonc21hbGxjYXBzJ30pO1xuXG4gfTtcblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VQdWJsaXNoaW5nTWFyc2hhbGxlcj0oc3RhdGUpPT57XG5jb25zdCBzbG90VG9WYWw9bWFrZVNsb3RUb1ZhbChzdGF0ZSk7XG4vL1xuY29uc3QgdmFsVG9TbG90PSh2YWwpPT5nZXRJZCh2YWwsc3RhdGUpO1xucmV0dXJuIG1ha2VNYXJzaGFsKHZhbFRvU2xvdCxzbG90VG9WYWwse1xuc2VyaWFsaXplQm9keUZvcm1hdDonc21hbGxjYXBzJ30pO1xuXG4gfTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlQm9hcmRLaXQ9KGJhZ2dhZ2UpPT57XG5yZXR1cm4gcHJlcGFyZUV4b0NsYXNzS2l0KFxuYmFnZ2FnZSxcbidCb2FyZCcsXG5Cb2FyZEtpdElLaXQsXG5pbml0RHVyYWJsZUJvYXJkU3RhdGUsXG57XG5ib2FyZDp7XG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG5nZXRJZCh2YWx1ZSl7XG5yZXR1cm4gZ2V0SWQodmFsdWUsdGhpcy5zdGF0ZSk7XG4gfSxcbi8qXG5cblxuICAgICAgICAgKi9cbmdldFZhbHVlKGlkKXtcbnJldHVybiBnZXRWYWx1ZShpZCx0aGlzLnN0YXRlKTtcbiB9LFxuLypcblxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgYXN5bmMgbG9va3VwKC4uLnBhdGgpe1xuY29uc3R7XG5mYWNldHM6e2JvYXJkfX09XG50aGlzO1xuaWYocGF0aC5sZW5ndGg9PT0wKXtcbnJldHVybiBib2FyZDtcbiB9XG5jb25zdFtmaXJzdCwuLi5yZXN0XT1wYXRoO1xuLyogICAgICAgICAgICAgICovXG5jb25zdCBmaXJzdFZhbHVlPWJvYXJkLmdldFZhbHVlKC8qICAgICAgICAgICAgICAgICAgKi9maXJzdCk7XG5pZihyZXN0Lmxlbmd0aD09PTApe1xucmV0dXJuIGZpcnN0VmFsdWU7XG4gfVxucmV0dXJuIEUoZmlyc3RWYWx1ZSkubG9va3VwKC4uLnJlc3QpO1xuIH0sXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuaGFzKHZhbCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS52YWxUb0lkLmhhcyh2YWwpO1xuIH0sXG5pZHMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIGhhcmRlbihbLi4uc3RhdGUuaWRUb1ZhbC5rZXlzKCldKTtcbiB9LFxuLypcblxuXG4gICAgICAgICAqL1xuZ2V0UHVibGlzaGluZ01hcnNoYWxsZXIoKXtcbnJldHVybiB0aGlzLmZhY2V0cy5wdWJsaXNoaW5nTWFyc2hhbGxlcjtcbiB9LFxuLypcblxuXG5cblxuXG5cbiAgICAgICAgICovXG5nZXRSZWFkb25seU1hcnNoYWxsZXIoKXtcbnJldHVybiB0aGlzLmZhY2V0cy5yZWFkb25seU1hcnNoYWxsZXI7XG4gfX0sXG5cbnJlYWRvbmx5TWFyc2hhbGxlcjp7XG50b0NhcERhdGEodmFsKXtcbmNvbnN0IHJlYWRvbmx5PW1ha2VSZWFkb25seU1hcnNoYWxsZXIodGhpcy5zdGF0ZSk7XG5yZXR1cm4gcmVhZG9ubHkudG9DYXBEYXRhKHZhbCk7XG4gfSxcbmZyb21DYXBEYXRhKGRhdGEpe1xuY29uc3QgcmVhZG9ubHk9bWFrZVJlYWRvbmx5TWFyc2hhbGxlcih0aGlzLnN0YXRlKTtcbnJldHVybiByZWFkb25seS5mcm9tQ2FwRGF0YShkYXRhKTtcbiB9LFxuc2VyaWFsaXplKGRhdGEpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnJlYWRvbmx5TWFyc2hhbGxlci50b0NhcERhdGEoZGF0YSk7XG4gfSxcbnVuc2VyaWFsaXplKGRhdGEpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnJlYWRvbmx5TWFyc2hhbGxlci5mcm9tQ2FwRGF0YShkYXRhKTtcbiB9fSxcblxucHVibGlzaGluZ01hcnNoYWxsZXI6e1xudG9DYXBEYXRhKHZhbCl7XG5jb25zdCBwdWJsaXNoaW5nPW1ha2VQdWJsaXNoaW5nTWFyc2hhbGxlcih0aGlzLnN0YXRlKTtcbnJldHVybiBwdWJsaXNoaW5nLnRvQ2FwRGF0YSh2YWwpO1xuIH0sXG5mcm9tQ2FwRGF0YShkYXRhKXtcbmNvbnN0IHB1Ymxpc2hpbmc9bWFrZVB1Ymxpc2hpbmdNYXJzaGFsbGVyKHRoaXMuc3RhdGUpO1xucmV0dXJuIHB1Ymxpc2hpbmcuZnJvbUNhcERhdGEoZGF0YSk7XG4gfSxcbnNlcmlhbGl6ZShkYXRhKXtcbnJldHVybiB0aGlzLmZhY2V0cy5wdWJsaXNoaW5nTWFyc2hhbGxlci50b0NhcERhdGEoZGF0YSk7XG4gfSxcbnVuc2VyaWFsaXplKGRhdGEpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnB1Ymxpc2hpbmdNYXJzaGFsbGVyLmZyb21DYXBEYXRhKGRhdGEpO1xuIH19fSk7XG5cblxuXG4gfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnByZXBhcmVCb2FyZEtpdChwcmVwYXJlQm9hcmRLaXQpO1xuY29uc3QgICAgICAgIHByZXBhcmVSZWNvcmRlckZhY3Rvcnk9KHpvbmUpPT57XG5jb25zdCBiYWdnYWdlPXpvbmUubWFwU3RvcmUoIGBSZWNvcmRlciBCYWdnYWdlYCk7XG5jb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ9cHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuYmFnZ2FnZSxcbidEdXJhYmxlUHVibGlzaEtpdCcpO1xuXG5cbi8qXG5cblxuICAgKi9cbmNvbnN0IHByZXBhcmVSZWNvcmRlcktpdD0obGFiZWwsbWFyc2hhbGxlcik9PntcbmNvbnN0IG15Wm9uZT16b25lLnN1YlpvbmUobGFiZWwpO1xuY29uc3QgbWFrZVJlY29yZGVyPXByZXBhcmVSZWNvcmRlcihcbm15Wm9uZS5tYXBTdG9yZSggYFJlY29yZGVyIEJhZ2dhZ2U6ICR7bGFiZWx9YCksXG5tYXJzaGFsbGVyKTtcblxucmV0dXJuIGRlZmluZVJlY29yZGVyS2l0KHttYWtlUmVjb3JkZXIsbWFrZUR1cmFibGVQdWJsaXNoS2l0fSk7XG4gfTtcblxucmV0dXJuIHByZXBhcmVSZWNvcmRlcktpdDtcbiB9OyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXJGYWN0b3J5KHByZXBhcmVSZWNvcmRlckZhY3RvcnkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiREVGQVVMVF9DUkNfRElHSVRTIjpbIkRFRkFVTFRfQ1JDX0RJR0lUUyJdLCJERUZBVUxUX1BSRUZJWCI6WyJERUZBVUxUX1BSRUZJWCJdLCJwcmVwYXJlQm9hcmRLaXQiOlsicHJlcGFyZUJvYXJkS2l0Il0sInByZXBhcmVSZWNvcmRlckZhY3RvcnkiOlsicHJlcGFyZVJlY29yZGVyRmFjdG9yeSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC0UF1CtgsAALYLAAAtAAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9hY3Rpb25zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJtYWtlUGF5bWVudEFjdGlvbnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZVByb21pc2VLaXQsRmFyLEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdCAgICAgICAgbWFrZVBheW1lbnRBY3Rpb25zPSh7XG5nZXRCcmFuZFJlY29yZCxcbmdldFB1cnNlQnlQZXRuYW1lLFxuZ2V0UmVjb3JkLFxudXBkYXRlUmVjb3JkLFxuZ2V0QXV0b0RlcG9zaXRQdXJzZSxcbmdldElzc3VlckJvYXJkSWR9KT0+XG57XG5jb25zdCBkZXBvc2l0ZWRQSz1tYWtlUHJvbWlzZUtpdCgpO1xuXG5yZXR1cm4gRmFyKCdwYXltZW50IGFjdGlvbnMnLHtcbmRlcG9zaXQ6YXN5bmMocHVyc2VPclBldG5hbWU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgb2xkUGF5bWVudFJlY29yZD1nZXRSZWNvcmQoKTtcbmNvbnN0e2JyYW5kLHBheW1lbnR9PW9sZFBheW1lbnRSZWNvcmQ7XG5hc3NlcnQocGF5bWVudCk7XG5cbi8qICAgICAgICAgICAgICAgICovXG5sZXQgcHVyc2U7XG5pZihwdXJzZU9yUGV0bmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBhdXRvRGVwb3NpdFB1cnNlPWdldEF1dG9EZXBvc2l0UHVyc2UoYnJhbmQpO1xuaWYoIWF1dG9EZXBvc2l0UHVyc2Upe1xuLy9cbnJldHVybiBkZXBvc2l0ZWRQSy5wcm9taXNlO1xuIH1cbi8vXG5wdXJzZT1nZXRBdXRvRGVwb3NpdFB1cnNlKGJyYW5kKTtcbiB9ZWxzZSBpZihcbkFycmF5LmlzQXJyYXkocHVyc2VPclBldG5hbWUpfHxcbnR5cGVvZiBwdXJzZU9yUGV0bmFtZT09PSdzdHJpbmcnKVxue1xucHVyc2U9Z2V0UHVyc2VCeVBldG5hbWUocHVyc2VPclBldG5hbWUpO1xuIH1lbHNle1xucHVyc2U9cHVyc2VPclBldG5hbWU7XG4gfVxuY29uc3QgYnJhbmRSZWNvcmQ9Z2V0QnJhbmRSZWNvcmQoYnJhbmQpO1xudXBkYXRlUmVjb3JkKHsuLi5vbGRQYXltZW50UmVjb3JkLHN0YXR1czoncGVuZGluZyd9LGJyYW5kUmVjb3JkKTtcbi8vXG5FKHB1cnNlKS5cbmRlcG9zaXQocGF5bWVudCkuXG50aGVuKFxuKGRlcG9zaXRlZEFtb3VudCk9PntcbnVwZGF0ZVJlY29yZChcbntcbi4uLmdldFJlY29yZCgpLFxuLy9cbnBheW1lbnQ6dW5kZWZpbmVkLFxuc3RhdHVzOidkZXBvc2l0ZWQnLFxuZGVwb3NpdGVkQW1vdW50fSxcblxuYnJhbmRSZWNvcmQpO1xuXG5kZXBvc2l0ZWRQSy5yZXNvbHZlKGRlcG9zaXRlZEFtb3VudCk7XG4gfSxcbihlKT0+e1xuY29uc29sZS5lcnJvcihcbidFcnJvciBkZXBvc2l0aW5nIHBheW1lbnQgaW4nLFxucHVyc2VPclBldG5hbWV8fCdkZWZhdWx0IHB1cnNlJyxcbmUpO1xuXG5pZihwdXJzZU9yUGV0bmFtZT09PXVuZGVmaW5lZCl7XG4vL1xuLy9cbnVwZGF0ZVJlY29yZCh7XG4uLi5nZXRSZWNvcmQoKSxcbnN0YXR1czp1bmRlZmluZWR9KTtcblxuZGVwb3NpdGVkUEsucmVqZWN0KGUpO1xuIH1lbHNle1xuLy9cbi8vXG5kZXBvc2l0ZWRQSy5yZXNvbHZlKGdldFJlY29yZCgpLmFjdGlvbnMuZGVwb3NpdCh1bmRlZmluZWQpKTtcbiB9XG4gfSk7XG5cbnJldHVybiBkZXBvc2l0ZWRQSy5wcm9taXNlO1xuIH0sXG5yZWZyZXNoOmFzeW5jKCk9PntcbmNvbnN0IG9sZFBheW1lbnRSZWNvcmQ9Z2V0UmVjb3JkKCk7XG5jb25zdHticmFuZCxpc3N1ZXIscGF5bWVudH09b2xkUGF5bWVudFJlY29yZDtcbmNvbnN0IGJyYW5kUmVjb3JkPWdldEJyYW5kUmVjb3JkKGJyYW5kKTtcbmlmKCFicmFuZFJlY29yZCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5pZighaXNzdWVyKXtcbnVwZGF0ZVJlY29yZChcbntcbi4uLm9sZFBheW1lbnRSZWNvcmQsXG5pc3N1ZXJCb2FyZElkOmdldElzc3VlckJvYXJkSWQoYnJhbmRSZWNvcmQuaXNzdWVyKX0sXG5cbmJyYW5kUmVjb3JkKTtcblxucmV0dXJuIHRydWU7XG4gfVxuXG5pZighcGF5bWVudCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5jb25zdCBpc0xpdmU9YXdhaXQgRShpc3N1ZXIpLmlzTGl2ZShwYXltZW50KTtcbmlmKGlzTGl2ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG51cGRhdGVSZWNvcmQoe1xuLi4ub2xkUGF5bWVudFJlY29yZCxcbi8vXG5wYXltZW50OnVuZGVmaW5lZCxcbnN0YXR1czonZXhwaXJlZCd9KTtcblxucmV0dXJuIHRydWU7XG4gfSxcbmdldEFtb3VudE9mOmFzeW5jKCk9PntcbmNvbnN0IG9sZFBheW1lbnRSZWNvcmQ9Z2V0UmVjb3JkKCk7XG5jb25zdHtpc3N1ZXIscGF5bWVudH09b2xkUGF5bWVudFJlY29yZDtcbmFzc2VydChpc3N1ZXIpO1xuYXNzZXJ0KHBheW1lbnQpO1xuXG4vL1xuY29uc3QgbGFzdEFtb3VudD1hd2FpdCBFKGlzc3VlcikuZ2V0QW1vdW50T2YocGF5bWVudCk7XG5cbnVwZGF0ZVJlY29yZCh7XG4uLi5vbGRQYXltZW50UmVjb3JkLFxubGFzdEFtb3VudH0pO1xuXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cbiB9OyRozY9fb25jZS5tYWtlUGF5bWVudEFjdGlvbnMobWFrZVBheW1lbnRBY3Rpb25zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQYXltZW50QWN0aW9ucyI6WyJtYWtlUGF5bWVudEFjdGlvbnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjYUuNagCAACoAgAANQAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMy9zcmMvYmlnaW50U3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJiaWdpbnRTdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIC8vXG4vL1xuLy9cbi8vXG5jb25zdCAgICAgICAgYmlnaW50U3RyaW5naWZ5PSh4KT0+XG5KU09OLnN0cmluZ2lmeSh4LChfa2V5LHZhbHVlKT0+e1xuaWYodHlwZW9mIHZhbHVlIT09J2JpZ2ludCcpe1xuLy9cbnJldHVybiB2YWx1ZTtcbiB9XG5pZih2YWx1ZTw9QmlnSW50KE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSl7XG4vL1xucmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gfVxuLy9cbi8vXG5yZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiB9KTskaM2PX29uY2UuYmlnaW50U3RyaW5naWZ5KGJpZ2ludFN0cmluZ2lmeSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiaWdpbnRTdHJpbmdpZnkiOlsiYmlnaW50U3RyaW5naWZ5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL0613haCQAAWgkAAC4AAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2RhdGUtbm93LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL25vdGlmaWVyIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRSIsIkRFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMIiwibWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyIsIm1ha2VUaW1lclNlcnZpY2VEYXRlTm93Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEUsb2JzZXJ2ZU5vdGlmaWVyLG1ha2VQcm9taXNlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsIFskaM2PX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCAgICAgICAgREVGQVVMVF9USU1FUl9TRVJWSUNFX1BPTExfSU5URVJWQUw9NjBfMDAwbjskaM2PX29uY2UuREVGQVVMVF9USU1FUl9TRVJWSUNFX1BPTExfSU5URVJWQUwoREVGQVVMVF9USU1FUl9TRVJWSUNFX1BPTExfSU5URVJWQUwpO1xuY29uc3QgICAgICAgIERFRkFVTFRfVElNRVJfREVWSUNFX1NDQUxFPTE7XG5cbi8vXG4vL1xuJGjNj19vbmNlLkRFRkFVTFRfVElNRVJfREVWSUNFX1NDQUxFKERFRkFVTFRfVElNRVJfREVWSUNFX1NDQUxFKTtjb25zdCBtYWtlVGltZXJEZXZpY2VEYXRlTm93PVxuKEQsdGltZXJEZXZpY2UsdGltZXJEZXZpY2VTY2FsZT1ERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRSk9PlxuKCk9PntcbmNvbnN0IHN0YW1wPUQodGltZXJEZXZpY2UpLmdldExhc3RQb2xsZWQoKTtcbmNvbnN0IGxhc3RQb2xsZWRTdGFtcD1wYXJzZUludCggYCR7c3RhbXB9YCwxMCkqdGltZXJEZXZpY2VTY2FsZTtcbnJldHVybiBsYXN0UG9sbGVkU3RhbXA7XG4gfTtcblxuLy9cbi8vXG4kaM2PX29uY2UubWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyhtYWtlVGltZXJEZXZpY2VEYXRlTm93KTtjb25zdCBtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdz0oXG50aW1lclNlcnZpY2UsXG50aW1lclBvbGxJbnRlcnZhbD1ERUZBVUxUX1RJTUVSX1NFUlZJQ0VfUE9MTF9JTlRFUlZBTCk9Plxue1xubGV0IGxhc3RQb2xsZWRTdGFtcD1OYU47XG5jb25zdCBkYXRlTm93PSgpPT5sYXN0UG9sbGVkU3RhbXA7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkYXRlTm93UEs9bWFrZVByb21pc2VLaXQoKTtcblxuLy9cbmNvbnN0IG9ic2VydmVUaW1lcj1hc3luYygpPT57XG5jb25zdCBvYnNlcnZlcj17XG51cGRhdGVTdGF0ZShzdGFtcCl7XG5sYXN0UG9sbGVkU3RhbXA9cGFyc2VJbnQoIGAke3N0YW1wfWAsMTApO1xuZGF0ZU5vd1BLLnJlc29sdmUoZGF0ZU5vdyk7XG4gfX07XG5cblxuLy9cbmNvbnN0IHN0YW1wPWF3YWl0IEUodGltZXJTZXJ2aWNlKS5nZXRDdXJyZW50VGltZXN0YW1wKCk7XG5vYnNlcnZlci51cGRhdGVTdGF0ZShzdGFtcCk7XG5cbi8vXG4vL1xuY29uc3QgdGltZXJOb3RpZmllcj1FKHRpbWVyU2VydmljZSkubWFrZU5vdGlmaWVyKDBuLHRpbWVyUG9sbEludGVydmFsKTtcblxuLy9cbmF3YWl0IG9ic2VydmVOb3RpZmllcih0aW1lck5vdGlmaWVyLG9ic2VydmVyKTtcbiB9O1xuXG5vYnNlcnZlVGltZXIoKS5jYXRjaCgoZSk9PmRhdGVOb3dQSy5yZWplY3QoZSkpO1xuXG4vL1xucmV0dXJuIGRhdGVOb3dQSy5wcm9taXNlO1xuIH07JGjNj19vbmNlLm1ha2VUaW1lclNlcnZpY2VEYXRlTm93KG1ha2VUaW1lclNlcnZpY2VEYXRlTm93KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkRFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMIjpbIkRFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMIl0sIkRFRkFVTFRfVElNRVJfREVWSUNFX1NDQUxFIjpbIkRFRkFVTFRfVElNRVJfREVWSUNFX1NDQUxFIl0sIm1ha2VUaW1lckRldmljZURhdGVOb3ciOlsibWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyJdLCJtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyI6WyJtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABCws3O2hIAANoSAAA6AAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9maW5kT3JNYWtlSW52aXRhdGlvbi5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvZXJ0cCJdLCJleHBvcnRzIjpbImZpbmRPck1ha2VJbnZpdGF0aW9uIiwibWFrZUlkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydCxGYWlsLHEsRSxwYXNzU3R5bGVPZixBbW91bnRNYXRoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIiwgWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3QgICAgICAgIG1ha2VJZD0oZGFwcE9yaWdpbixyYXdJZCk9PiBgJHtkYXBwT3JpZ2lufSMke3Jhd0lkfWA7JGjNj19vbmNlLm1ha2VJZChtYWtlSWQpO1xuXG5jb25zdCBhc3NlcnRGaXJzdENhcEFTQ0lJPShzdHIpPT57XG5hc3NlcnQudHlwZW9mKHN0ciwnc3RyaW5nJyk7XG5jb25zdCBmaXJzdENhcEFTQ0lJPS9eW0EtWl1bYS16QS1aMC05XyRdKiQvO1xuZmlyc3RDYXBBU0NJSS50ZXN0KHN0cil8fFxuRmFpbCBgVGhlIHN0cmluZyAke3EoXG5zdHIpXG4gfSBtdXN0IGJlIGFuIGFzY2lpIGlkZW50aWZpZXIgc3RhcnRpbmcgd2l0aCB1cHBlciBjYXNlLmA7XG5zdHIhPT0nTmFOJyYmc3RyIT09J0luZmluaXR5J3x8XG5GYWlsIGBrZXl3b3JkICR7cShzdHIpfSBtdXN0IG5vdCBiZSBhIG51bWJlcidzIG5hbWVgO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGZpbmRCeUJvYXJkSWQ9YXN5bmMoaW52aXRhdGlvblB1cnNlQmFsYW5jZSx7Ym9hcmQsYm9hcmRJZH0pPT57XG5hc3NlcnQudHlwZW9mKGJvYXJkSWQsJ3N0cmluZycpO1xuY29uc3QgaW52aXRhdGlvbkhhbmRsZT1hd2FpdCBFKGJvYXJkKS5nZXRWYWx1ZShib2FyZElkKTtcbmNvbnN0IG1hdGNoPShlbGVtZW50KT0+ZWxlbWVudC5oYW5kbGU9PT1pbnZpdGF0aW9uSGFuZGxlO1xuY29uc3QgbWF0Y2hpbmdWYWx1ZT1pbnZpdGF0aW9uUHVyc2VCYWxhbmNlLnZhbHVlLmZpbmQobWF0Y2gpO1xubWF0Y2hpbmdWYWx1ZXx8RmFpbCBgQ2Fubm90IGZpbmQgaW52aXRhdGlvbiBjb3JyZXNwb25kaW5nIHRvICR7cShib2FyZElkKX1gO1xuXG5yZXR1cm4gaGFyZGVuKFttYXRjaGluZ1ZhbHVlXSk7XG4gfTtcblxuLy9cbi8vXG4vKlxuXG5cbiAqL1xuY29uc3QgZmluZEJ5S2V5VmFsdWVQYWlycz1hc3luYyhpbnZpdGF0aW9uUHVyc2VCYWxhbmNlLGt2cyk9Pntcbi8vXG4vL1xuLy9cbmNvbnN0IG1hdGNoZXM9KGludml0YXRpb25EZXRhaWwpPT5cbk9iamVjdC5lbnRyaWVzKGt2cykuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5pbnZpdGF0aW9uRGV0YWlsW2tleV09PT12YWx1ZSk7XG5cblxuY29uc3QgbWF0Y2hpbmdWYWx1ZT1pbnZpdGF0aW9uUHVyc2VCYWxhbmNlLnZhbHVlLmZpbmQobWF0Y2hlcyk7XG5tYXRjaGluZ1ZhbHVlfHxGYWlsIGBDYW5ub3QgZmluZCBpbnZpdGF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gJHtxKGt2cyl9YDtcbnJldHVybiBoYXJkZW4oW21hdGNoaW5nVmFsdWVdKTtcbiB9O1xuXG5jb25zdCBtYWtlRmluZEludml0YXRpb249KGludml0YXRpb25QdXJzZSxpbnZpdGF0aW9uQnJhbmQpPT57XG5jb25zdCBmaW5kSW52aXRhdGlvbj1hc3luYyhxdWVyeUZuLHF1ZXJ5UGFyYW1zKT0+e1xuY29uc3QgcHVyc2VCYWxhbmNlPWF3YWl0IEUoaW52aXRhdGlvblB1cnNlKS5nZXRDdXJyZW50QW1vdW50KCk7XG5jb25zdCB2YWx1ZT1hd2FpdCBxdWVyeUZuKHB1cnNlQmFsYW5jZSxxdWVyeVBhcmFtcyk7XG5jb25zdCBpbnZpdGF0aW9uQW1vdW50PUFtb3VudE1hdGgubWFrZShpbnZpdGF0aW9uQnJhbmQsdmFsdWUpO1xuY29uc3QgaW52aXRhdGlvblA9RShpbnZpdGF0aW9uUHVyc2UpLndpdGhkcmF3KGludml0YXRpb25BbW91bnQpO1xucmV0dXJuIGludml0YXRpb25QO1xuIH07XG5yZXR1cm4gZmluZEludml0YXRpb247XG4gfTtcblxuY29uc3QgbWFrZUNvbnRpbnVpbmdJbnZpdGF0aW9uPWFzeW5jKFxuaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdCxcbmRhcHBPcmlnaW4sXG57cHJpb3JPZmZlcklkOnJhd1ByaW9yT2ZmZXJJZCxkZXNjcmlwdGlvbn0pPT5cbntcbmFzc2VydEZpcnN0Q2FwQVNDSUkoZGVzY3JpcHRpb24pO1xuXG5jb25zdCBwcmlvck9mZmVySWQ9bWFrZUlkKGRhcHBPcmlnaW4scmF3UHJpb3JPZmZlcklkKTtcbmNvbnN0IG9mZmVyUmVzdWx0PWF3YWl0IGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuZ2V0KHByaW9yT2ZmZXJJZCkucHJvbWlzZTtcbmFzc2VydChcbnBhc3NTdHlsZU9mKG9mZmVyUmVzdWx0KT09PSdjb3B5UmVjb3JkJyxcbiBgb2ZmZXJSZXN1bHQgbXVzdCBiZSBhIHJlY29yZCB0byBoYXZlIGFuIGludml0YXRpb25NYWtlcnMgcHJvcGVydHlgKTtcblxuYXNzZXJ0KFxub2ZmZXJSZXN1bHQuaW52aXRhdGlvbk1ha2VycyxcbiBgb2ZmZXJSZXN1bHQgZG9lcyBub3QgaGF2ZSBhbiBpbnZpdGF0aW9uTWFrZXJzIHByb3BlcnR5YCk7XG5cblxuY29uc3QgaW52aXRhdGlvblA9RShvZmZlclJlc3VsdC5pbnZpdGF0aW9uTWFrZXJzKVtkZXNjcmlwdGlvbl0oKTtcbnJldHVybiBpbnZpdGF0aW9uUDtcbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlSW52aXRhdGlvbj1hc3luYyhcbmludml0YXRpb25NYWtlcixcbmluc3RhbmNlSGFuZGxlQm9hcmRJZCxcbmJvYXJkLFxuem9lKT0+XG57XG5jb25zdCBpbnN0YW5jZT0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuRShib2FyZCkuZ2V0VmFsdWUoaW5zdGFuY2VIYW5kbGVCb2FyZElkKTtcblxuY29uc3QgcHVibGljRmFjZXQ9RSh6b2UpLmdldFB1YmxpY0ZhY2V0KGluc3RhbmNlKTtcbmNvbnN0e21ldGhvZCxhcmdzPVtdfT1pbnZpdGF0aW9uTWFrZXI7XG5cbnJldHVybiBFKHB1YmxpY0ZhY2V0KVttZXRob2RdKC4uLmFyZ3MpO1xuIH07XG5cbmNvbnN0ICAgICAgICBmaW5kT3JNYWtlSW52aXRhdGlvbj1hc3luYyhcbmlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQsXG5ib2FyZCxcbnpvZSxcbmludml0YXRpb25QdXJzZSxcbmludml0YXRpb25CcmFuZCxcbm9mZmVyKT0+XG57XG5pZihvZmZlci5pbnZpdGF0aW9uKXtcbi8vXG5yZXR1cm4gb2ZmZXIuaW52aXRhdGlvbjtcbiB9XG5cbmNvbnN0IGZpbmRJbnZpdGF0aW9uPW1ha2VGaW5kSW52aXRhdGlvbihpbnZpdGF0aW9uUHVyc2UsaW52aXRhdGlvbkJyYW5kKTtcblxuLy9cbmlmKG9mZmVyLmludml0ZUhhbmRsZUJvYXJkSWQpe1xuY29uc3QgcXVlcnlQYXJhbXM9e1xuYm9hcmQsXG5ib2FyZElkOm9mZmVyLmludml0ZUhhbmRsZUJvYXJkSWR9O1xuXG5yZXR1cm4gZmluZEludml0YXRpb24oZmluZEJ5Qm9hcmRJZCxxdWVyeVBhcmFtcyk7XG4gfVxuXG4vL1xuaWYob2ZmZXIuaW52aXRhdGlvbkhhbmRsZUJvYXJkSWQpe1xuY29uc3QgcXVlcnlQYXJhbXM9e1xuYm9hcmQsXG5ib2FyZElkOm9mZmVyLmludml0YXRpb25IYW5kbGVCb2FyZElkfTtcblxucmV0dXJuIGZpbmRJbnZpdGF0aW9uKGZpbmRCeUJvYXJkSWQscXVlcnlQYXJhbXMpO1xuIH1cblxuaWYob2ZmZXIuaW52aXRhdGlvbk1ha2VyKXtcbnJldHVybiBtYWtlSW52aXRhdGlvbihcbm9mZmVyLmludml0YXRpb25NYWtlcixcbm9mZmVyLmluc3RhbmNlSGFuZGxlQm9hcmRJZCxcbmJvYXJkLFxuem9lKTtcblxuIH1cblxuaWYob2ZmZXIuaW52aXRhdGlvblF1ZXJ5KXtcbnJldHVybiBmaW5kSW52aXRhdGlvbihmaW5kQnlLZXlWYWx1ZVBhaXJzLG9mZmVyLmludml0YXRpb25RdWVyeSk7XG4gfVxuXG5pZihvZmZlci5jb250aW51aW5nSW52aXRhdGlvbil7XG5jb25zdCBkYXBwT3JpZ2luPVxub2ZmZXIucmVxdWVzdENvbnRleHQmJm9mZmVyLnJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW4/XG5vZmZlci5yZXF1ZXN0Q29udGV4dC5kYXBwT3JpZ2luOlxuIGB1bmtub3duYDtcbnJldHVybiBtYWtlQ29udGludWluZ0ludml0YXRpb24oXG5pZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LFxuZGFwcE9yaWdpbixcbm9mZmVyLmNvbnRpbnVpbmdJbnZpdGF0aW9uKTtcblxuIH1cblxudGhyb3cgRmFpbCBgbm8gaW52aXRhdGlvbiB3YXMgZm91bmQgb3IgbWFkZSBmb3IgdGhpcyBvZmZlciAke29mZmVyLmlkfWA7XG4gfTskaM2PX29uY2UuZmluZE9yTWFrZUludml0YXRpb24oZmluZE9yTWFrZUludml0YXRpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUlkIjpbIm1ha2VJZCJdLCJmaW5kT3JNYWtlSW52aXRhdGlvbiI6WyJmaW5kT3JNYWtlSW52aXRhdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB0LQgqSwIAAEsCAAA0AAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9pbnRlcm5hbC10eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADKu/3DnAgAAJwIAAAxAAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9pc3N1ZXJUYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9zdG9yZSIsIi4vaW50ZXJuYWwtdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlSXNzdWVyVGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYXNzZXJ0LEUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsIFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlSXNzdWVyVGFibGU9KCk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBicmFuZFRvSXNzdWVyUmVjb3JkPW1ha2VTY2FsYXJXZWFrTWFwU3RvcmUoJ2JyYW5kJyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzc3VlclRvSXNzdWVyUmVjb3JkPW1ha2VTY2FsYXJXZWFrTWFwU3RvcmUoJ2lzc3VlcicpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaXNzdWVyVGFibGU9e1xuaGFzQnlCcmFuZDpicmFuZFRvSXNzdWVyUmVjb3JkLmhhcyxcbmdldEJ5QnJhbmQ6YnJhbmRUb0lzc3VlclJlY29yZC5nZXQsXG5oYXNCeUlzc3Vlcjppc3N1ZXJUb0lzc3VlclJlY29yZC5oYXMsXG5nZXRCeUlzc3Vlcjppc3N1ZXJUb0lzc3VlclJlY29yZC5nZXQsXG4vL1xuLy9cbmluaXRJc3N1ZXI6YXN5bmMoaXNzdWVyUCxhZGRNZXRhPSh4KT0+eCk9PntcbmNvbnN0IGJyYW5kUD1FKGlzc3VlclApLmdldEJyYW5kKCk7XG5jb25zdCBicmFuZElzc3Vlck1hdGNoUD1FKGJyYW5kUCkuaXNNeUlzc3Vlcihpc3N1ZXJQKTtcbmNvbnN0IGRpc3BsYXlJbmZvUD1FKGJyYW5kUCkuZ2V0RGlzcGxheUluZm8oKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0W2lzc3VlcixicmFuZCxicmFuZElzc3Vlck1hdGNoLGRpc3BsYXlJbmZvXT1hd2FpdCBQcm9taXNlLmFsbChbXG5pc3N1ZXJQLFxuYnJhbmRQLFxuYnJhbmRJc3N1ZXJNYXRjaFAsXG5kaXNwbGF5SW5mb1BdKTtcblxuLy9cblxuaWYoaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuaGFzKGlzc3Vlcikpe1xucmV0dXJuIGlzc3VlclRvSXNzdWVyUmVjb3JkLmdldChpc3N1ZXIpO1xuIH1cbmFzc2VydChcbmJyYW5kSXNzdWVyTWF0Y2gsXG4gYGlzc3VlciB3YXMgdXNpbmcgYSBicmFuZCB3aGljaCB3YXMgbm90IGl0cyBvd25gKTtcblxuaXNzdWVyVGFibGUuaW5pdElzc3VlckJ5UmVjb3JkKFxuYWRkTWV0YSh7XG5icmFuZCxcbmlzc3VlcixcbmFzc2V0S2luZDpkaXNwbGF5SW5mby5hc3NldEtpbmQsXG5kaXNwbGF5SW5mb30pKTtcblxuXG5yZXR1cm4gaXNzdWVyVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG4gfSxcbmluaXRJc3N1ZXJCeVJlY29yZDooaXNzdWVyUmVjb3JkKT0+e1xuY29uc3R7YnJhbmQsaXNzdWVyfT1pc3N1ZXJSZWNvcmQ7XG5icmFuZFRvSXNzdWVyUmVjb3JkLmluaXQoYnJhbmQsaXNzdWVyUmVjb3JkKTtcbmlzc3VlclRvSXNzdWVyUmVjb3JkLmluaXQoaXNzdWVyLGlzc3VlclJlY29yZCk7XG4gfX07XG5cblxucmV0dXJuIGlzc3VlclRhYmxlO1xuIH07JGjNj19vbmNlLm1ha2VJc3N1ZXJUYWJsZShtYWtlSXNzdWVyVGFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUlzc3VlclRhYmxlIjpbIm1ha2VJc3N1ZXJUYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABIUOvaBR4AAAUeAAAzAAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9saWItZGVoeWRyYXRlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiaXNQYXRoIiwibWFrZURlaHlkcmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYXNzZXJ0LEZhaWwscSxtYWtlTWFyc2hhbCxtYXBJdGVyYWJsZSxtYWtlTGVnYWN5TWFwLG1ha2VTY2FsYXJNYXBTdG9yZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsIFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRozY9fYSA9PiAobWFwSXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlTGVnYWN5TWFwXCIsIFskaM2PX2EgPT4gKG1ha2VMZWdhY3lNYXAgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgaXNQYXRoPSh4KT0+e1xuaWYoIUFycmF5LmlzQXJyYXkoeCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbngubGVuZ3RoPjB8fEZhaWwgYFBhdGggJHtxKHgpfSBtdXN0IG5vdCBiZSBlbXB0eWA7XG5mb3IoY29uc3QgbmFtZSBvZiB4KXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9OyRozY9fb25jZS5pc1BhdGgoaXNQYXRoKTtcblxuY29uc3QgSU1QTE9ERV9QUkVGSVg9J0lFOic7XG5cbi8vXG4vL1xuLy9cbmNvbnN0ICAgICAgICBtYWtlRGVoeWRyYXRvcj0oaW5pdGlhbFVubmFtZWRDb3VudD0wKT0+e1xubGV0IHVubmFtZWRDb3VudD1pbml0aWFsVW5uYW1lZENvdW50O1xuXG4vL1xuY29uc3QgcGV0bmFtZUtpbmRUb01hcHBpbmc9bWFrZUxlZ2FjeU1hcCgncGV0bmFtZUtpbmQnKTtcblxuLyogICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHNlYXJjaE9yZGVyPVtdO1xuXG4vL1xuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHZhbFRvUGF0aHM9bWFrZVNjYWxhck1hcFN0b3JlKCd2YWx1ZScpO1xuXG4vKlxuXG5cbiAgICovXG5jb25zdCBleHBsb2RlPShkYXRhKT0+e1xuZGF0YS5zdGFydHNXaXRoKElNUExPREVfUFJFRklYKXx8XG5GYWlsIGBleHBsb2RlZCBzdHJpbmcgJHtkYXRhfSBtdXN0IHN0YXJ0IHdpdGggJHtxKElNUExPREVfUFJFRklYKX1gO1xuY29uc3Qgc3Ryb25nbmFtZT1KU09OLnBhcnNlKGRhdGEuc2xpY2UoSU1QTE9ERV9QUkVGSVgubGVuZ3RoKSk7XG5pZighaXNQYXRoKHN0cm9uZ25hbWUpKXtcbnJldHVybiBzdHJvbmduYW1lO1xuIH1cbmNvbnN0e3ZhbFRvUGV0bmFtZTpyb290VG9QZXRuYW1lfT1lZGdlTWFwcGluZztcbmNvbnN0IHBldG5hbWU9cm9vdFRvUGV0bmFtZS5nZXQoc3Ryb25nbmFtZVswXSk7XG5hc3NlcnQoIWlzUGF0aChwZXRuYW1lKSk7XG5zdHJvbmduYW1lWzBdPXBldG5hbWU7XG5yZXR1cm4gaGFyZGVuKHN0cm9uZ25hbWUpO1xuIH07XG5cbi8qXG5cblxuICAgKi9cbmNvbnN0IGltcGxvZGU9KHN0cm9uZ25hbWUpPT57XG5pZighaXNQYXRoKHN0cm9uZ25hbWUpKXtcbnJldHVybiBgJHtJTVBMT0RFX1BSRUZJWH0ke0pTT04uc3RyaW5naWZ5KHN0cm9uZ25hbWUpfWA7XG4gfVxuXG4vL1xuY29uc3QgcGF0aD1bLi4uc3Ryb25nbmFtZV07XG5jb25zdHtwZXRuYW1lVG9WYWw6cGV0bmFtZVRvUm9vdH09ZWRnZU1hcHBpbmc7XG5pZighcGV0bmFtZVRvUm9vdC5oYXMocGF0aFswXSkpe1xuLy9cbkZhaWwgYEVkZ2VuYW1lIGZvciAke3EocGF0aFswXSl9IHBldG5hbWUgbm90IGZvdW5kYDtcbiB9XG5jb25zdCByb290PXBldG5hbWVUb1Jvb3QuZ2V0KHBhdGhbMF0pO1xucGF0aFswXT1yb290O1xuXG5yZXR1cm4gYCR7SU1QTE9ERV9QUkVGSVh9JHtKU09OLnN0cmluZ2lmeShwYXRoKX1gO1xuIH07XG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZU1hcHBpbmc9KGtpbmQse3VzZUxlZ2FjeU1hcD1mYWxzZX09e30pPT57XG50eXBlb2Yga2luZD09PSdzdHJpbmcnfHwgYGtpbmQgJHtraW5kfSBtdXN0IGJlIGEgc3RyaW5nYDtcbmNvbnN0IG1ha2VNYXA9dXNlTGVnYWN5TWFwP21ha2VMZWdhY3lNYXA6bWFrZVNjYWxhck1hcFN0b3JlO1xuLy9cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmF3VmFsVG9QZXRuYW1lPW1ha2VNYXAoJ3ZhbHVlJyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgdmFsVG9QZXRuYW1lPXtcbi4uLnJhd1ZhbFRvUGV0bmFtZSxcbnNldChrZXksdmFsKXtcbnJhd1ZhbFRvUGV0bmFtZS5zZXQoa2V5LGltcGxvZGUodmFsKSk7XG4gfSxcbmluaXQoa2V5LHZhbCl7XG5yYXdWYWxUb1BldG5hbWUuaW5pdChrZXksaW1wbG9kZSh2YWwpKTtcbiB9LFxuZ2V0KGtleSl7XG5yZXR1cm4gZXhwbG9kZShyYXdWYWxUb1BldG5hbWUuZ2V0KGtleSkpO1xuIH0sXG5lbnRyaWVzKCl7XG5yZXR1cm4gbWFwSXRlcmFibGUocmF3VmFsVG9QZXRuYW1lLmVudHJpZXMoKSwoW2tleSx2YWxdKT0+W1xua2V5LFxuZXhwbG9kZSh2YWwpXSk7XG5cbiB9LFxudmFsdWVzKCl7XG5yZXR1cm4gbWFwSXRlcmFibGUocmF3VmFsVG9QZXRuYW1lLnZhbHVlcygpLCh2YWwpPT5leHBsb2RlKHZhbCkpO1xuIH19O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJhd1BldG5hbWVUb1ZhbD1tYWtlU2NhbGFyTWFwU3RvcmUoJ3BldG5hbWUnKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHBldG5hbWVUb1ZhbD17XG4uLi5yYXdQZXRuYW1lVG9WYWwsXG5pbml0KGtleSx2YWwpe1xucmV0dXJuIHJhd1BldG5hbWVUb1ZhbC5pbml0KGltcGxvZGUoa2V5KSx2YWwpO1xuIH0sXG5zZXQoa2V5LHZhbCl7XG5yZXR1cm4gcmF3UGV0bmFtZVRvVmFsLnNldChpbXBsb2RlKGtleSksdmFsKTtcbiB9LFxuaGFzKGtleSl7XG50cnl7XG5yZXR1cm4gcmF3UGV0bmFtZVRvVmFsLmhhcyhpbXBsb2RlKGtleSkpO1xuIH1jYXRjaChlKXtcbi8vXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH0sXG5nZXQoa2V5KXtcbnJldHVybiByYXdQZXRuYW1lVG9WYWwuZ2V0KGltcGxvZGUoa2V5KSk7XG4gfSxcbmRlbGV0ZShrZXkpe1xucmV0dXJuIHJhd1BldG5hbWVUb1ZhbC5kZWxldGUoaW1wbG9kZShrZXkpKTtcbiB9LFxua2V5cygpe1xucmV0dXJuIG1hcEl0ZXJhYmxlKHJhd1BldG5hbWVUb1ZhbC5rZXlzKCksKGtleSk9PmV4cGxvZGUoa2V5KSk7XG4gfSxcbmVudHJpZXMoKXtcbnJldHVybiBtYXBJdGVyYWJsZShyYXdQZXRuYW1lVG9WYWwuZW50cmllcygpLChba2V5LHZhbF0pPT5bXG5leHBsb2RlKGtleSksXG52YWxdKTtcblxuIH19O1xuXG5cbi8qXG5cblxuICAgICAqL1xuY29uc3QgYWRkUGF0aD0ocGF0aCx2YWwpPT57XG5pc1BhdGgocGF0aCl8fEZhaWwgYHBhdGggJHtxKHBhdGgpfSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3NgO1xuXG5pZighdmFsVG9QZXRuYW1lLmhhcyh2YWwpJiZlZGdlTWFwcGluZy52YWxUb1BldG5hbWUuaGFzKHBhdGhbMF0pKXtcbi8vXG4vL1xudmFsVG9QZXRuYW1lLmluaXQodmFsLHBhdGgpO1xuIH1cblxuLy9cbmlmKCF2YWxUb1BhdGhzLmhhcyh2YWwpKXtcbnZhbFRvUGF0aHMuaW5pdCh2YWwsaGFyZGVuKFtwYXRoXSkpO1xucmV0dXJuO1xuIH1cbmNvbnN0IHBhdGhzPXZhbFRvUGF0aHMuZ2V0KHZhbCk7XG5cbi8vXG5jb25zdCBmb3VuZD1wYXRocy5maW5kKChlbmFtZSk9PntcbmlmKGVuYW1lLmxlbmd0aCE9PXBhdGgubGVuZ3RoKXtcbnJldHVybiBmYWxzZTtcbiB9XG5mb3IobGV0IGk9MDtpPGVuYW1lLmxlbmd0aDtpKz0xKXtcbmlmKGVuYW1lW2ldIT09cGF0aFtpXSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH0pO1xuXG4vL1xuaWYoIWZvdW5kKXtcbnZhbFRvUGF0aHMuc2V0KHZhbCxoYXJkZW4oWy4uLnBhdGhzLHBhdGhdKSk7XG4gfVxuIH07XG5cbmNvbnN0IGFkZFBldG5hbWU9KHBldG5hbWUsdmFsKT0+e1xuaWYocGV0bmFtZVRvVmFsLmhhcyhwZXRuYW1lKSYmcGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKT09PXZhbCl7XG5yZXR1cm47XG4gfVxuIXBldG5hbWVUb1ZhbC5oYXMocGV0bmFtZSl8fEZhaWwgYHBldG5hbWUgJHtwZXRuYW1lfSBpcyBhbHJlYWR5IGluIHVzZWA7XG4hdmFsVG9QZXRuYW1lLmhhcyh2YWwpfHxGYWlsIGB2YWwgJHt2YWx9IGFscmVhZHkgaGFzIGEgcGV0bmFtZWA7XG5wZXRuYW1lVG9WYWwuaW5pdChwZXRuYW1lLHZhbCk7XG52YWxUb1BldG5hbWUuaW5pdCh2YWwscGV0bmFtZSk7XG5cbmlmKGlzUGF0aChwZXRuYW1lKSl7XG5hZGRQYXRoKHBldG5hbWUsdmFsKTtcbiB9XG4gfTtcblxuY29uc3QgcmVuYW1lUGV0bmFtZT0ocGV0bmFtZSx2YWwpPT57XG52YWxUb1BldG5hbWUuaGFzKHZhbCl8fFxuRmFpbCBgdmFsICR7dmFsfSBoYXMgbm90IGJlZW4gcHJldmlvdXNseSBuYW1lZCwgd291bGQgeW91IGxpa2UgdG8gYWRkIGl0IGluc3RlYWQ/YDtcbiFwZXRuYW1lVG9WYWwuaGFzKHBldG5hbWUpfHxGYWlsIGBwZXRuYW1lICR7cGV0bmFtZX0gaXMgYWxyZWFkeSBpbiB1c2VgO1xuLy9cbmNvbnN0IG9sZFBldG5hbWU9dmFsVG9QZXRuYW1lLmdldCh2YWwpO1xucGV0bmFtZVRvVmFsLmRlbGV0ZShvbGRQZXRuYW1lKTtcbnZhbFRvUGV0bmFtZS5kZWxldGUodmFsKTtcblxuLy9cbnBldG5hbWVUb1ZhbC5pbml0KHBldG5hbWUsdmFsKTtcbnZhbFRvUGV0bmFtZS5pbml0KHZhbCxwZXRuYW1lKTtcbiB9O1xuXG4vKlxuXG5cblxuICAgICAqL1xuY29uc3Qgc3VnZ2VzdFBldG5hbWU9KHBldG5hbWUsdmFsKT0+e1xuaWYodmFsVG9QZXRuYW1lLmhhcyh2YWwpKXtcbi8vXG5yZXR1cm4gdmFsVG9QZXRuYW1lLmdldCh2YWwpO1xuIH1cblxuLy9cbmxldCB1bmlxdWVQYXRoPXBldG5hbWU7XG5sZXQgbm9uY2U9MjtcbndoaWxlKHBldG5hbWVUb1ZhbC5oYXModW5pcXVlUGF0aCkpe1xuLy9cbmlmKGlzUGF0aChwZXRuYW1lKSl7XG51bmlxdWVQYXRoPVsuLi5wZXRuYW1lLCBgJHtub25jZX1gXTtcbiB9ZWxzZXtcbnVuaXF1ZVBhdGg9IGAke3BldG5hbWV9JHtub25jZX1gO1xuIH1cbm5vbmNlKz0xO1xuIH1cblxuLy9cbi8vXG4vL1xuYWRkUGV0bmFtZSh1bmlxdWVQYXRoLHZhbCk7XG5yZXR1cm4gdW5pcXVlUGF0aDtcbiB9O1xuXG5jb25zdCBkZWxldGVQZXRuYW1lPShwZXRuYW1lKT0+e1xucGV0bmFtZVRvVmFsLmhhcyhwZXRuYW1lKXx8XG5GYWlsIGBwZXRuYW1lICR7cShcbnBldG5hbWUpXG4gfSBoYXMgbm90IGJlZW4gcHJldmlvdXNseSBuYW1lZCwgd291bGQgeW91IGxpa2UgdG8gYWRkIGl0IGluc3RlYWQ/YDtcblxuLy9cbmNvbnN0IHZhbD1wZXRuYW1lVG9WYWwuZ2V0KHBldG5hbWUpO1xucGV0bmFtZVRvVmFsLmRlbGV0ZShwZXRuYW1lKTtcbnZhbFRvUGV0bmFtZS5kZWxldGUodmFsKTtcbiB9O1xuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXBwaW5nPWhhcmRlbih7XG5pbXBsb2RlLFxuZXhwbG9kZSxcbnZhbFRvUGV0bmFtZSxcbnZhbFRvUGF0aHMsXG5wZXRuYW1lVG9WYWwsXG5hZGRQZXRuYW1lLFxuYWRkUGF0aCxcbnJlbmFtZVBldG5hbWUsXG5kZWxldGVQZXRuYW1lLFxuc3VnZ2VzdFBldG5hbWUsXG5raW5kfSk7XG5cbnBldG5hbWVLaW5kVG9NYXBwaW5nLmluaXQoa2luZCxtYXBwaW5nKTtcbnJldHVybiBtYXBwaW5nO1xuIH07XG5cbmNvbnN0IGVkZ2VNYXBwaW5nPW1ha2VNYXBwaW5nKCdlZGdlJyk7XG5jb25zdCB1bm5hbWVkTWFwcGluZz1tYWtlTWFwcGluZygndW5uYW1lZCcpO1xuXG5jb25zdCBhZGRUb1VubmFtZWQ9KHZhbCk9PntcbnVubmFtZWRDb3VudCs9MTtcbmNvbnN0IHBsYWNlaG9sZGVyPSBgdW5uYW1lZC0ke3VubmFtZWRDb3VudH1gO1xudW5uYW1lZE1hcHBpbmcuYWRkUGV0bmFtZShwbGFjZWhvbGRlcix2YWwpO1xuY29uc3QgcGxhY2Vob2xkZXJOYW1lPWhhcmRlbih7XG5raW5kOid1bm5hbWVkJyxcbnBldG5hbWU6cGxhY2Vob2xkZXJ9KTtcblxucmV0dXJuIHBsYWNlaG9sZGVyTmFtZTtcbiB9O1xuXG4vL1xuLy9cbmNvbnN0IGNvbnZlcnRWYWxUb05hbWU9KHZhbCk9PntcbmZvcihsZXQgaT0wO2k8c2VhcmNoT3JkZXIubGVuZ3RoO2krPTEpe1xuY29uc3Qga2luZD1zZWFyY2hPcmRlcltpXTtcbmNvbnN0e3ZhbFRvUGV0bmFtZX09cGV0bmFtZUtpbmRUb01hcHBpbmcuZ2V0KGtpbmQpO1xuaWYodmFsVG9QZXRuYW1lLmhhcyh2YWwpKXtcbnJldHVybiBoYXJkZW4oe1xua2luZCxcbnBldG5hbWU6dmFsVG9QZXRuYW1lLmdldCh2YWwpfSk7XG5cbiB9XG4gfVxuLy9cbi8vXG5pZih1bm5hbWVkTWFwcGluZy52YWxUb1BldG5hbWUuaGFzKHZhbCkpe1xucmV0dXJuIGhhcmRlbih7XG5raW5kOid1bm5hbWVkJyxcbnBldG5hbWU6dW5uYW1lZE1hcHBpbmcudmFsVG9QZXRuYW1lLmdldCh2YWwpfSk7XG5cbiB9XG4vL1xuY29uc3QgcGxhY2Vob2xkZXJOYW1lPWFkZFRvVW5uYW1lZCh2YWwpO1xucmV0dXJuIHBsYWNlaG9sZGVyTmFtZTtcbiB9O1xuXG5jb25zdCBjb252ZXJ0TmFtZVRvVmFsPSh7a2luZCxwZXRuYW1lfSxfaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7cGV0bmFtZVRvVmFsfT1wZXRuYW1lS2luZFRvTWFwcGluZy5nZXQoa2luZCk7XG5yZXR1cm4gcGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKTtcbiB9O1xuXG5jb25zdHt0b0NhcERhdGE6ZGVoeWRyYXRlLGZyb21DYXBEYXRhOmh5ZHJhdGV9PW1ha2VNYXJzaGFsKFxuY29udmVydFZhbFRvTmFtZSxcbmNvbnZlcnROYW1lVG9WYWwsXG57XG5tYXJzaGFsTmFtZTonaHlkcmF0aW9uJyxcbi8vXG4vL1xuZXJyb3JJZE51bTozMF8wMDAsXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5oeWRyYXRlLFxuZGVoeWRyYXRlLFxuZWRnZU1hcHBpbmcsXG4vKlxuXG5cblxuXG4gICAgICovXG5tYWtlTWFwcGluZzooa2luZCxsZWdhY3lPcHRpb25zPXVuZGVmaW5lZCk9PntcbmNvbnN0IG1hcHBpbmc9bWFrZU1hcHBpbmcoa2luZCxsZWdhY3lPcHRpb25zKTtcbnNlYXJjaE9yZGVyLnB1c2goa2luZCk7XG5yZXR1cm4gbWFwcGluZztcbiB9fSk7XG5cbiB9OyRozY9fb25jZS5tYWtlRGVoeWRyYXRvcihtYWtlRGVoeWRyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1BhdGgiOlsiaXNQYXRoIl0sIm1ha2VEZWh5ZHJhdG9yIjpbIm1ha2VEZWh5ZHJhdG9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOGw46YvpQAAL6UAADAAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2xpYi13YWxsZXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9jYWNoZSIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9zdG9yYWdlLXRlc3QtdXRpbHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvZXJ0cCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbmF0IiwiQGFnb3JpYy9ub3RpZmllciIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGFnb3JpYy9zbWFydC13YWxsZXQvc3JjL21hcnNoYWwtY29udGV4dHMuanMiLCIuL2lzc3VlclRhYmxlLmpzIiwiLi9saWItZGVoeWRyYXRlLmpzIiwiLi9maW5kT3JNYWtlSW52aXRhdGlvbi5qcyIsIi4vYmlnaW50U3RyaW5naWZ5LmpzIiwiLi9hY3Rpb25zLmpzIiwiLi9pbnRlcm5hbC10eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VXYWxsZXRSb290Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydCxxLEZhaWwsbWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3Isb2JqZWN0TWFwLFdhbGxldE5hbWUsc2xvdFN0cmluZ1Vuc2VyaWFsaXplLG1ha2VMZWdhY3lNYXAsbWFrZVNjYWxhck1hcFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhckJpZ01hcFN0b3JlLEFtb3VudE1hdGgsRSxwYXNzU3R5bGVPZixGYXIsbWFwSXRlcmFibGUsTmF0LG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLG1ha2VOb3RpZmllcktpdCxvYnNlcnZlSXRlcmF0aW9uLG9ic2VydmVOb3RpZmllcixzdWJzY3JpYmVFYWNoLG1ha2VQcm9taXNlS2l0LG1ha2VFeHBvcnRDb250ZXh0LG1ha2VJc3N1ZXJUYWJsZSxtYWtlRGVoeWRyYXRvcixtYWtlSWQsZmluZE9yTWFrZUludml0YXRpb24sYmlnaW50U3RyaW5naWZ5LG1ha2VQYXltZW50QWN0aW9uczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsIFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9jYWNoZVwiLCBbW1wibWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3JcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIiwgWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dLFtcIldhbGxldE5hbWVcIiwgWyRozY9fYSA9PiAoV2FsbGV0TmFtZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3N0b3JhZ2UtdGVzdC11dGlscy5qc1wiLCBbW1wic2xvdFN0cmluZ1Vuc2VyaWFsaXplXCIsIFskaM2PX2EgPT4gKHNsb3RTdHJpbmdVbnNlcmlhbGl6ZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VMZWdhY3lNYXBcIiwgWyRozY9fYSA9PiAobWFrZUxlZ2FjeU1hcCA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRozY9fYSA9PiAobWFwSXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlclwiLCBbJGjNj19hID0+IChtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciA9ICRozY9fYSldXSxbXCJtYWtlTm90aWZpZXJLaXRcIiwgWyRozY9fYSA9PiAobWFrZU5vdGlmaWVyS2l0ID0gJGjNj19hKV1dLFtcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRozY9fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRozY9fYSldXSxbXCJvYnNlcnZlTm90aWZpZXJcIiwgWyRozY9fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjNj19hKV1dLFtcInN1YnNjcmliZUVhY2hcIiwgWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc21hcnQtd2FsbGV0L3NyYy9tYXJzaGFsLWNvbnRleHRzLmpzXCIsIFtbXCJtYWtlRXhwb3J0Q29udGV4dFwiLCBbJGjNj19hID0+IChtYWtlRXhwb3J0Q29udGV4dCA9ICRozY9fYSldXV1dLFtcIi4vaXNzdWVyVGFibGUuanNcIiwgW1tcIm1ha2VJc3N1ZXJUYWJsZVwiLCBbJGjNj19hID0+IChtYWtlSXNzdWVyVGFibGUgPSAkaM2PX2EpXV1dXSxbXCIuL2xpYi1kZWh5ZHJhdGUuanNcIiwgW1tcIm1ha2VEZWh5ZHJhdG9yXCIsIFskaM2PX2EgPT4gKG1ha2VEZWh5ZHJhdG9yID0gJGjNj19hKV1dXV0sW1wiLi9maW5kT3JNYWtlSW52aXRhdGlvbi5qc1wiLCBbW1wibWFrZUlkXCIsIFskaM2PX2EgPT4gKG1ha2VJZCA9ICRozY9fYSldXSxbXCJmaW5kT3JNYWtlSW52aXRhdGlvblwiLCBbJGjNj19hID0+IChmaW5kT3JNYWtlSW52aXRhdGlvbiA9ICRozY9fYSldXV1dLFtcIi4vYmlnaW50U3RyaW5naWZ5LmpzXCIsIFtbXCJiaWdpbnRTdHJpbmdpZnlcIiwgWyRozY9fYSA9PiAoYmlnaW50U3RyaW5naWZ5ID0gJGjNj19hKV1dXV0sW1wiLi9hY3Rpb25zLmpzXCIsIFtbXCJtYWtlUGF5bWVudEFjdGlvbnNcIiwgWyRozY9fYSA9PiAobWFrZVBheW1lbnRBY3Rpb25zID0gJGjNj19hKV1dXV0sW1wiLi9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVdhbGxldFJvb3QsICduYW1lJywge3ZhbHVlOiBcIm1ha2VXYWxsZXRSb290XCJ9KTskaM2PX29uY2UubWFrZVdhbGxldFJvb3QobWFrZVdhbGxldFJvb3QpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy9cbmNvbnN0IG5vQWN0aW9uU3RhdGVDaGFuZ2VIYW5kbGVyPShfbmV3U3RhdGUpPT57IH07XG5cbmNvbnN0IGNtcD0oYSxiKT0+e1xuaWYoYT5iKXtcbnJldHVybiAxO1xuIH1cbmlmKGE9PT1iKXtcbnJldHVybiAwO1xuIH1cbnJldHVybi0xO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlV2FsbGV0Um9vdCh7XG56b2UsXG5ib2FyZCxcbmFnb3JpY05hbWVzLFxubmFtZXNCeUFkZHJlc3MsXG5teUFkZHJlc3NOYW1lQWRtaW4sXG5wdXJzZXNTdGF0ZUNoYW5nZUhhbmRsZXI9bm9BY3Rpb25TdGF0ZUNoYW5nZUhhbmRsZXIsXG5pbmJveFN0YXRlQ2hhbmdlSGFuZGxlcj1ub0FjdGlvblN0YXRlQ2hhbmdlSGFuZGxlcixcbmRhdGVOb3c9dW5kZWZpbmVkfSlcbntcbmFzc2VydChteUFkZHJlc3NOYW1lQWRtaW4sJ21pc3NpbmcgbXlBZGRyZXNzTmFtZUFkbWluJyk7XG5cbmxldCBsYXN0SWQ9MDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGFkZE1ldGE9KHJlY29yZCk9PntcbmNvbnN0e21ldGE6b2xkTWV0YT17fX09cmVjb3JkO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWV0YT17Li4ub2xkTWV0YX07XG5pZighbWV0YS5pZCl7XG4vL1xubGFzdElkKz0xO1xubWV0YS5pZD1sYXN0SWQ7XG4gfVxuaWYoZGF0ZU5vdyl7XG5jb25zdCBub3dTdGFtcD1kYXRlTm93KCk7XG5pZighbWV0YS5jcmVhdGlvblN0YW1wKXtcbi8vXG5tZXRhLmNyZWF0aW9uU3RhbXA9bm93U3RhbXA7XG4gfVxubWV0YS51cGRhdGVkU3RhbXA9bm93U3RhbXA7XG4gfVxucmV0dXJuey4uLnJlY29yZCxtZXRhfTtcbiB9O1xuXG5jb25zdCBjb250ZXh0PW1ha2VFeHBvcnRDb250ZXh0KCk7XG5cbi8vXG4vL1xuY29uc3R7bWFrZU1hcHBpbmcsZGVoeWRyYXRlLGVkZ2VNYXBwaW5nfT1tYWtlRGVoeWRyYXRvcigpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHB1cnNlTWFwcGluZz1tYWtlTWFwcGluZygncHVyc2UnKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBicmFuZE1hcHBpbmc9bWFrZU1hcHBpbmcoJ2JyYW5kJyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb250YWN0TWFwcGluZz1tYWtlTWFwcGluZyhcbidjb250YWN0Jyxcbnt1c2VMZWdhY3lNYXA6dHJ1ZX0vL1xuKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpbnN0YW5jZU1hcHBpbmc9bWFrZU1hcHBpbmcoJ2luc3RhbmNlJyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGluc3RhbGxhdGlvbk1hcHBpbmc9bWFrZU1hcHBpbmcoJ2luc3RhbGxhdGlvbicpO1xuXG5jb25zdCBicmFuZFRhYmxlPW1ha2VJc3N1ZXJUYWJsZSgpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaXNzdWVyVG9Cb2FyZElkPW1ha2VTY2FsYXJXZWFrTWFwU3RvcmUoJ2lzc3VlcicpO1xuXG4vL1xuY29uc3QgaW5pdElzc3VlclRvQm9hcmRJZD1hc3luYyhpc3N1ZXIsYnJhbmQpPT57XG5pZihpc3N1ZXJUb0JvYXJkSWQuaGFzKGlzc3Vlcikpe1xuLy9cbnJldHVybiBpc3N1ZXJUb0JvYXJkSWQuZ2V0KGlzc3Vlcik7XG4gfVxuXG4vL1xuY29uc3RbaXNzdWVyQm9hcmRJZCxicmFuZEJvYXJkSWRdPWF3YWl0IFByb21pc2UuYWxsKFtcbkUoYm9hcmQpLmdldElkKGlzc3VlciksXG5FKGJvYXJkKS5nZXRJZChicmFuZCldKTtcblxuaWYoaXNzdWVyVG9Cb2FyZElkLmhhcyhpc3N1ZXIpKXtcbi8vXG5yZXR1cm4gaXNzdWVyVG9Cb2FyZElkLmdldChpc3N1ZXIpO1xuIH1cblxuLy9cbi8vXG5jb250ZXh0LmVuc3VyZUJvYXJkSWQoaXNzdWVyQm9hcmRJZCxpc3N1ZXIpO1xuY29udGV4dC5pbml0Qm9hcmRJZChicmFuZEJvYXJkSWQsYnJhbmQpO1xuXG4vL1xuaXNzdWVyVG9Cb2FyZElkLmluaXQoaXNzdWVyLGlzc3VlckJvYXJkSWQpO1xucmV0dXJuIGlzc3VlckJvYXJkSWQ7XG4gfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHB1cnNlVG9CcmFuZD1tYWtlU2NhbGFyV2Vha01hcFN0b3JlKCdwdXJzZScpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJyYW5kVG9EZXBvc2l0RmFjZXRJZD1tYWtlU2NhbGFyTWFwU3RvcmUoJ2JyYW5kJyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBicmFuZFRvQXV0b0RlcG9zaXRQdXJzZT1tYWtlU2NhbGFyTWFwU3RvcmUoJ2JyYW5kJyk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlkVG9PZmZlcj1tYWtlU2NhbGFyTWFwU3RvcmUoJ29mZmVySWQnKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG5jb25zdCBpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0PW1ha2VMZWdhY3lNYXAoJ2lkJyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaW52aXRhdGlvbkhhbmRsZVRvT2ZmZXJSZXN1bHQ9XG5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKCdpbnZpdGF0aW9uSGFuZGxlJyk7XG5cbi8vXG5jb25zdCBpZFRvQ29tcGlsZWRPZmZlclA9bmV3IE1hcCgpO1xuY29uc3QgaWRUb0NvbXBsZXRlPW5ldyBNYXAoKTtcbmNvbnN0IGlkVG9TZWF0PW5ldyBNYXAoKTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHB1cnNlc1N0YXRlPW5ldyBNYXAoKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwdXJzZXNGdWxsU3RhdGU9bmV3IE1hcCgpO1xuY29uc3QgaW5ib3hTdGF0ZT1uZXcgTWFwKCk7XG5cbi8qXG5cblxuXG4gICAqL1xubGV0IHpvZUludml0ZVB1cnNlO1xuXG5jb25zdCBaT0VfSU5WSVRFX0JSQU5EX1BFVE5BTUU9J3pvZSBpbnZpdGUnO1xuXG5mdW5jdGlvbiBnZXRTb3J0ZWRWYWx1ZXMobWFwKXtcbmNvbnN0IGVudHJpZXM9Wy4uLm1hcC5lbnRyaWVzKCldO1xuLy9cbmNvbnN0IHZhbHVlcz1lbnRyaWVzLlxuc29ydCgoW2lkMV0sW2lkMl0pPT5jbXAoaWQxLGlkMikpLlxubWFwKChbX2lkLHZhbHVlXSk9PnZhbHVlKTtcblxucmV0dXJuIGJpZ2ludFN0cmluZ2lmeShoYXJkZW4odmFsdWVzKSk7XG4gfVxuXG5mdW5jdGlvbiBnZXRQdXJzZXNTdGF0ZSgpe1xucmV0dXJuIGdldFNvcnRlZFZhbHVlcyhwdXJzZXNTdGF0ZSk7XG4gfVxuXG5mdW5jdGlvbiBnZXRJbmJveFN0YXRlKCl7XG5yZXR1cm4gZ2V0U29ydGVkVmFsdWVzKGluYm94U3RhdGUpO1xuIH1cblxuLy9cbi8vXG4vL1xuY29uc3QgZmlsbEluU2xvdHM9c2xvdFN0cmluZ1Vuc2VyaWFsaXplO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdHtub3RpZmllcjpvZmZlcnNOb3RpZmllcix1cGRhdGVyOm9mZmVyc1VwZGF0ZXJ9PW1ha2VOb3RpZmllcktpdChcbltdKTtcblxuXG5jb25zdHtwdXJzZXNOb3RpZmllcixhdHRlbnVhdGVkUHVyc2VzTm90aWZpZXIscHVyc2VzVXBkYXRlcn09KCgpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0e25vdGlmaWVyOmlwbix1cGRhdGVyOmlwdX09bWFrZU5vdGlmaWVyS2l0KFtdKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3R7bm90aWZpZXI6YXBuLHVwZGF0ZXI6YXB1fT1tYWtlTm90aWZpZXJLaXQoW10pO1xuLy9cbi8qXG5cblxuICAgICAqL1xuY29uc3QgaW5uZXJGaWx0ZXI9KHtcbmJyYW5kLFxuYnJhbmRCb2FyZElkLFxuZGVwb3NpdEJvYXJkSWQsXG5icmFuZFBldG5hbWUsXG5wdXJzZVBldG5hbWUsXG5kaXNwbGF5SW5mbyxcbnZhbHVlLFxuY3VycmVudEFtb3VudFNsb3RzLFxuY3VycmVudEFtb3VudH0pPT5cblxuaGFyZGVuKHtcbmJyYW5kLFxuYnJhbmRCb2FyZElkLFxuLi4uKGRlcG9zaXRCb2FyZElkJiZ7ZGVwb3NpdEJvYXJkSWR9KSxcbmJyYW5kUGV0bmFtZSxcbnB1cnNlUGV0bmFtZSxcbi4uLihkaXNwbGF5SW5mbyYme2Rpc3BsYXlJbmZvfSksXG52YWx1ZSxcbmN1cnJlbnRBbW91bnRTbG90cyxcbmN1cnJlbnRBbW91bnR9KTtcblxuY29uc3QgZmlsdGVyPShzdGF0ZSk9PnN0YXRlLm1hcChpbm5lckZpbHRlcik7XG5jb25zdCBwdT1GYXIoJ3B1cnNlc1VwZGF0ZXInLHtcbnVwZGF0ZVN0YXRlOihuZXdTdGF0ZSk9PntcbmlwdS51cGRhdGVTdGF0ZShuZXdTdGF0ZSk7XG5hcHUudXBkYXRlU3RhdGUoZmlsdGVyKG5ld1N0YXRlKSk7XG4gfSxcbmZpbmlzaDooZmluYWxTdGF0ZSk9PntcbmlwdS5maW5pc2goZmluYWxTdGF0ZSk7XG5hcHUuZmluaXNoKGZpbHRlcihmaW5hbFN0YXRlKSk7XG4gfSxcbmZhaWw6KHJlYXNvbik9PntcbmlwdS5mYWlsKHJlYXNvbik7XG5hcHUuZmFpbChyZWFzb24pO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7XG5wdXJzZXNOb3RpZmllcjppcG4sXG5hdHRlbnVhdGVkUHVyc2VzTm90aWZpZXI6YXBuLFxucHVyc2VzVXBkYXRlcjpwdX0pO1xuXG4gfSkoKTtcblxuLypcblxuXG4gICAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHVyc2VzU3RhdGUocHVyc2VQZXRuYW1lLHB1cnNlKXtcbmNvbnN0IHB1cnNlS2V5PXB1cnNlTWFwcGluZy5pbXBsb2RlKHB1cnNlUGV0bmFtZSk7XG5mb3IoY29uc3Qga2V5IG9mIHB1cnNlc1N0YXRlLmtleXMoKSl7XG5pZighcHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5oYXMocHVyc2VNYXBwaW5nLmV4cGxvZGUoa2V5KSkpe1xucHVyc2VzU3RhdGUuZGVsZXRlKGtleSk7XG4gfVxuIH1cbmNvbnN0IGN1cnJlbnRBbW91bnQ9YXdhaXQgRShwdXJzZSkuZ2V0Q3VycmVudEFtb3VudCgpO1xuY29uc3R7dmFsdWUsYnJhbmR9PWN1cnJlbnRBbW91bnQ7XG5jb25zdCBicmFuZFBldG5hbWU9YnJhbmRNYXBwaW5nLnZhbFRvUGV0bmFtZS5nZXQoYnJhbmQpO1xuY29uc3QgZGVoeWRyYXRlZEN1cnJlbnRBbW91bnQ9ZGVoeWRyYXRlKGN1cnJlbnRBbW91bnQpO1xuY29uc3QgYnJhbmRCb2FyZElkPWF3YWl0IEUoYm9hcmQpLmdldElkKGJyYW5kKTtcblxubGV0IGRlcG9zaXRCb2FyZElkO1xuaWYoXG5icmFuZFRvQXV0b0RlcG9zaXRQdXJzZS5oYXMoYnJhbmQpJiZcbmJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmdldChicmFuZCk9PT1wdXJzZSYmXG5icmFuZFRvRGVwb3NpdEZhY2V0SWQuaGFzKGJyYW5kKSlcbntcbi8vXG5kZXBvc2l0Qm9hcmRJZD1icmFuZFRvRGVwb3NpdEZhY2V0SWQuZ2V0KGJyYW5kKTtcbiB9XG5cbmNvbnN0IGlzc3VlclJlY29yZD1cbmJyYW5kVGFibGUuaGFzQnlCcmFuZChicmFuZCkmJmJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG4vKlxuXG4gICAgICovXG5jb25zdCBqc3RhdGU9YWRkTWV0YSh7XG4uLi5wdXJzZXNTdGF0ZS5nZXQocHVyc2VLZXkpLFxuYnJhbmQsXG5icmFuZEJvYXJkSWQsXG4uLi4oZGVwb3NpdEJvYXJkSWQmJntkZXBvc2l0Qm9hcmRJZH0pLFxuYnJhbmRQZXRuYW1lLFxucHVyc2VQZXRuYW1lLFxuZGlzcGxheUluZm86aXNzdWVyUmVjb3JkJiZpc3N1ZXJSZWNvcmQuZGlzcGxheUluZm8sXG52YWx1ZSxcbmN1cnJlbnRBbW91bnRTbG90czpkZWh5ZHJhdGVkQ3VycmVudEFtb3VudCxcbmN1cnJlbnRBbW91bnQ6ZmlsbEluU2xvdHMoZGVoeWRyYXRlZEN1cnJlbnRBbW91bnQpfSk7XG5cbnB1cnNlc1N0YXRlLnNldChwdXJzZUtleSxqc3RhdGUpO1xuXG5wdXJzZXNGdWxsU3RhdGUuc2V0KFxucHVyc2UsXG5oYXJkZW4oe1xuLi4uanN0YXRlLFxucHVyc2UsXG5icmFuZCxcbmFjdGlvbnM6RmFyKCdwdXJzZS5hY3Rpb25zJyx7XG4vL1xuICAgICAgYXN5bmMgc2VuZChyZWNlaXZlclAsc2VuZFZhbHVlKXtcbmNvbnN0IGFtb3VudD1BbW91bnRNYXRoLm1ha2UoYnJhbmQsc2VuZFZhbHVlKTtcbmNvbnN0IHBheW1lbnQ9YXdhaXQgRShwdXJzZSkud2l0aGRyYXcoYW1vdW50KTtcbnRyeXtcbmF3YWl0IEUocmVjZWl2ZXJQKS5yZWNlaXZlKHBheW1lbnQpO1xuIH1jYXRjaChlKXtcbi8vXG5hd2FpdCBFKHB1cnNlKS5kZXBvc2l0KHBheW1lbnQpO1xudGhyb3cgZTtcbiB9XG4gfSxcbiAgICAgIGFzeW5jIHJlY2VpdmUocGF5bWVudFApe1xuY29uc3QgcGF5bWVudD1hd2FpdCBwYXltZW50UDtcbnJldHVybiBFKHB1cnNlKS5kZXBvc2l0KHBheW1lbnQpO1xuIH0sXG5kZXBvc2l0KHBheW1lbnQsYW1vdW50PXVuZGVmaW5lZCl7XG5yZXR1cm4gRShwdXJzZSkuZGVwb3NpdChwYXltZW50LGFtb3VudCk7XG4gfX0pfSkpO1xuXG5cblxucHVyc2VzVXBkYXRlci51cGRhdGVTdGF0ZShbLi4ucHVyc2VzRnVsbFN0YXRlLnZhbHVlcygpXSk7XG5wdXJzZXNTdGF0ZUNoYW5nZUhhbmRsZXIoZ2V0UHVyc2VzU3RhdGUoKSk7XG4gfVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVBbGxQdXJzZVN0YXRlKCl7XG5yZXR1cm4gUHJvbWlzZS5hbGwoXG5tYXBJdGVyYWJsZShwdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmVudHJpZXMoKSwoW3BldG5hbWUscHVyc2VdKT0+XG51cGRhdGVQdXJzZXNTdGF0ZShwZXRuYW1lLHB1cnNlKSkpO1xuXG5cbiB9XG5cbmNvbnN0IGRpc3BsYXk9KHZhbHVlKT0+ZmlsbEluU2xvdHMoZGVoeWRyYXRlKGhhcmRlbih2YWx1ZSkpKTtcblxuY29uc3QgZXhwYW5kSW52aXRhdGlvbkJyYW5kcz1hc3luYyhpbnZpdGF0aW9uRGV0YWlscyk9Pntcbi8vXG5jb25zdHtmZWV9PWludml0YXRpb25EZXRhaWxzO1xuaWYoIWZlZSl7XG5yZXR1cm4gaW52aXRhdGlvbkRldGFpbHM7XG4gfVxuXG4vL1xuY29uc3QgZGlzcGxheUluZm89YXdhaXQgRShFKHpvZSkuZ2V0RmVlSXNzdWVyKCkpLmdldERpc3BsYXlJbmZvKCk7XG5jb25zdCBhdWdtZW50ZWREZXRhaWxzPXtcbi4uLmludml0YXRpb25EZXRhaWxzLFxuZmVlOnsuLi5mZWUsZGlzcGxheUluZm99fTtcblxucmV0dXJuIGRpc3BsYXkoYXVnbWVudGVkRGV0YWlscyk7XG4gfTtcblxuY29uc3QgZGlzcGxheVByb3Bvc2FsPShwcm9wb3NhbFRlbXBsYXRlKT0+e1xuY29uc3R7XG53YW50LFxuZ2l2ZSxcbmV4aXQ9e29uRGVtYW5kOm51bGx9LFxuYXJndW1lbnRzOmFyZ3N9PVxucHJvcG9zYWxUZW1wbGF0ZTtcbmNvbnN0IGRpc3BsYXlSZWNvcmQ9KHB1cnNlUGV0bmFtZVZhbHVlS2V5d29yZFJlY29yZCk9PntcbmlmKHB1cnNlUGV0bmFtZVZhbHVlS2V5d29yZFJlY29yZD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG5PYmplY3QuZW50cmllcyhwdXJzZVBldG5hbWVWYWx1ZUtleXdvcmRSZWNvcmQpLm1hcChcbihba2V5d29yZCx7cHVyc2VQZXRuYW1lLHZhbHVlLGFtb3VudCxwdXJzZX1dKT0+e1xuaWYoIWFtb3VudCl7XG5wdXJzZT1nZXRQdXJzZShwdXJzZVBldG5hbWUpO1xuYW1vdW50PXt2YWx1ZX07XG4gfWVsc2V7XG5wdXJzZVBldG5hbWU9cHVyc2VNYXBwaW5nLnZhbFRvUGV0bmFtZS5nZXQocHVyc2UpO1xuIH1cblxuY29uc3QgYnJhbmQ9cHVyc2VUb0JyYW5kLmdldChwdXJzZSk7XG5jb25zdCBpc3N1ZXJSZWNvcmQ9XG5icmFuZFRhYmxlLmhhc0J5QnJhbmQoYnJhbmQpJiZicmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xuYW1vdW50PWhhcmRlbih7XG4uLi5hbW91bnQsXG5icmFuZCxcbmRpc3BsYXlJbmZvOmlzc3VlclJlY29yZCYmaXNzdWVyUmVjb3JkLmRpc3BsYXlJbmZvfSk7XG5cbmNvbnN0IGRpc3BsYXlBbW91bnQ9ZGlzcGxheShhbW91bnQpO1xucmV0dXJuW1xua2V5d29yZCxcbntcbnB1cnNlUGV0bmFtZSxcbnB1cnNlLFxuYW1vdW50OmRpc3BsYXlBbW91bnR9XTtcblxuXG4gfSkpO1xuXG5cbiB9O1xuY29uc3QgcHJvcG9zYWxGb3JEaXNwbGF5PXtcbndhbnQ6ZGlzcGxheVJlY29yZCh3YW50KSxcbmdpdmU6ZGlzcGxheVJlY29yZChnaXZlKSxcbmV4aXR9O1xuXG5pZihhcmdzIT09dW5kZWZpbmVkKXtcbnByb3Bvc2FsRm9yRGlzcGxheS5hcmd1bWVudHM9ZGlzcGxheShhcmdzKTtcbiB9XG5yZXR1cm4gcHJvcG9zYWxGb3JEaXNwbGF5O1xuIH07XG5cbi8qXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IHBydW5lT2ZmZXJXaGVuSW5hY3RpdmU9KGlkKT0+e1xuYXNzZXJ0KGluYm94U3RhdGUuaGFzKGlkKSk7XG5jb25zdCBvZmZlcj1pbmJveFN0YXRlLmdldChpZCk7XG5jb25zdHtzdGF0dXN9PW9mZmVyO1xuXG5zd2l0Y2goc3RhdHVzKXtcbmNhc2UnZGVjbGluZSc6XG5jYXNlJ2NhbmNlbCc6XG5jYXNlJ3JlamVjdGVkJzpcbmluYm94U3RhdGUuZGVsZXRlKGlkKTtcbnJldHVybjtcbmNhc2UnYWNjZXB0JzpcbmFzc2VydChpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LmhhcyhpZCkpO1xudm9pZCBFLndoZW4oaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdC5nZXQoaWQpLnByb21pc2UsKHJlc3VsdCk9PntcbmNvbnN0IHN0eWxlPXBhc3NTdHlsZU9mKHJlc3VsdCk7XG5jb25zdCBhY3RpdmU9XG5zdHlsZT09PSdyZW1vdGFibGUnfHxcbnN0eWxlPT09J2NvcHlSZWNvcmQnJiYnaW52aXRhdGlvbk1ha2VycydpbiByZXN1bHQ7XG5pZighYWN0aXZlKXtcbmluYm94U3RhdGUuZGVsZXRlKGlkKTtcbiB9XG4gfSk7XG5icmVhaztcbmNhc2UncGVuZGluZyc6XG5jYXNlJ2NvbXBsZXRlJzpcbmRlZmF1bHQ6fVxuXG4gfTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSW5ib3hTdGF0ZShpZCxvZmZlcixkb1B1c2g9dHJ1ZSl7XG4vL1xuY29uc3R7cHJvcG9zYWxUZW1wbGF0ZX09b2ZmZXI7XG5jb25zdHtpbnN0YW5jZSxpbnN0YWxsYXRpb24saW52aXRhdGlvbkRldGFpbHN9PWlkVG9PZmZlci5nZXQoaWQpO1xuaWYoIWluc3RhbmNlfHwhaW5zdGFsbGF0aW9uKXtcbi8vXG4vL1xucmV0dXJuO1xuIH1cbmNvbnN0IGluc3RhbmNlRGlzcGxheT1kaXNwbGF5KGluc3RhbmNlKTtcbmNvbnN0IGluc3RhbGxhdGlvbkRpc3BsYXk9ZGlzcGxheShpbnN0YWxsYXRpb24pO1xuY29uc3QgYWxyZWFkeURpc3BsYXllZD1cbmluYm94U3RhdGUuaGFzKGlkKSYmaW5ib3hTdGF0ZS5nZXQoaWQpLnByb3Bvc2FsRm9yRGlzcGxheTtcblxuY29uc3QgYXVnbWVudGVkSW52aXRhdGlvbkRldGFpbHM9XG5hd2FpdCBleHBhbmRJbnZpdGF0aW9uQnJhbmRzKGludml0YXRpb25EZXRhaWxzKTtcblxuY29uc3Qgb2ZmZXJGb3JEaXNwbGF5PXtcbi4uLm9mZmVyLFxuLy9cbi8vXG4vL1xuYWN0aW9uczp1bmRlZmluZWQsXG5pbnN0YWxsYXRpb246dW5kZWZpbmVkLFxuaW5zdGFuY2U6dW5kZWZpbmVkLFxucHJvcG9zYWxUZW1wbGF0ZSxcbmludml0YXRpb25EZXRhaWxzOmRpc3BsYXkoYXVnbWVudGVkSW52aXRhdGlvbkRldGFpbHMpLFxuaW5zdGFuY2VQZXRuYW1lOmluc3RhbmNlRGlzcGxheS5wZXRuYW1lLFxuaW5zdGFsbGF0aW9uUGV0bmFtZTppbnN0YWxsYXRpb25EaXNwbGF5LnBldG5hbWUsXG5wcm9wb3NhbEZvckRpc3BsYXk6ZGlzcGxheVByb3Bvc2FsKGFscmVhZHlEaXNwbGF5ZWR8fHByb3Bvc2FsVGVtcGxhdGUpfTtcblxuXG5pbmJveFN0YXRlLnNldChpZCxvZmZlckZvckRpc3BsYXkpO1xuaWYoZG9QdXNoKXtcbi8vXG5vZmZlcnNVcGRhdGVyLnVwZGF0ZVN0YXRlKFtvZmZlckZvckRpc3BsYXldKTtcbmluYm94U3RhdGVDaGFuZ2VIYW5kbGVyKGdldEluYm94U3RhdGUoKSk7XG4gfVxucHJ1bmVPZmZlcldoZW5JbmFjdGl2ZShpZCk7XG4gfVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVBbGxJbmJveFN0YXRlKCl7XG5hd2FpdCBQcm9taXNlLmFsbChcbkFycmF5LmZyb20oaW5ib3hTdGF0ZS5lbnRyaWVzKCkpLm1hcCgoW2lkLG9mZmVyXSk9PlxuLy9cbnVwZGF0ZUluYm94U3RhdGUoaWQsb2ZmZXIsZmFsc2UpKSk7XG5cblxuLy9cbm9mZmVyc1VwZGF0ZXIudXBkYXRlU3RhdGUoWy4uLmluYm94U3RhdGUudmFsdWVzKCldKTtcbmluYm94U3RhdGVDaGFuZ2VIYW5kbGVyKGdldEluYm94U3RhdGUoKSk7XG4gfVxuXG5jb25zdHt1cGRhdGVyOmlzc3VlcnNVcGRhdGVyLG5vdGlmaWVyOmlzc3VlcnNOb3RpZmllcn09XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbm1ha2VOb3RpZmllcktpdChbXSk7XG5cblxuZnVuY3Rpb24gdXBkYXRlQWxsSXNzdWVyc1N0YXRlKCl7XG5pc3N1ZXJzVXBkYXRlci51cGRhdGVTdGF0ZShcblsuLi5icmFuZE1hcHBpbmcucGV0bmFtZVRvVmFsLmVudHJpZXMoKV0ubWFwKChbcGV0bmFtZSxicmFuZF0pPT57XG5jb25zdCBpc3N1ZXJSZWNvcmQ9YnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKTtcbnJldHVybltcbnBldG5hbWUsXG57XG4uLi5pc3N1ZXJSZWNvcmQsXG5pc3N1ZXJCb2FyZElkOmlzc3VlclRvQm9hcmRJZC5nZXQoaXNzdWVyUmVjb3JkLmlzc3Vlcil9XTtcblxuXG4gfSkpO1xuXG4gfVxuXG4vL1xuLy9cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbFN0YXRlKCl7XG51cGRhdGVBbGxJc3N1ZXJzU3RhdGUoKTtcbmF3YWl0IHVwZGF0ZUFsbFB1cnNlU3RhdGUoKTtcbmF3YWl0IHVwZGF0ZUFsbEluYm94U3RhdGUoKTtcbiB9XG5cbi8vXG4vL1xuZnVuY3Rpb24gdXBkYXRlT3JSZXN1YnNjcmliZShpZCxzZWF0LHVwZGF0ZSl7XG5jb25zdHt1cGRhdGVDb3VudH09dXBkYXRlO1xuYXNzZXJ0KHVwZGF0ZUNvdW50PT09dW5kZWZpbmVkKTtcbmlkVG9TZWF0LmRlbGV0ZShpZCk7XG5cbmNvbnN0IG9mZmVyPWlkVG9PZmZlci5nZXQoaWQpO1xuY29uc3QgY29tcGxldGVkT2ZmZXI9YWRkTWV0YSh7XG4uLi5vZmZlcixcbnN0YXR1czonY29tcGxldGUnfSk7XG5cbmlkVG9PZmZlci5zZXQoaWQsY29tcGxldGVkT2ZmZXIpO1xudm9pZCB1cGRhdGVJbmJveFN0YXRlKGlkLGNvbXBsZXRlZE9mZmVyKTtcbiB9XG5cbi8qXG5cblxuXG5cbiAgICovXG5mdW5jdGlvbiBzdWJzY3JpYmVUb1VwZGF0ZXMoaWQsc2VhdCl7XG5yZXR1cm4gRShFKHNlYXQpLmdldEV4aXRTdWJzY3JpYmVyKCkpLlxuc3Vic2NyaWJlQWZ0ZXIoKS5cbnRoZW4oKHVwZGF0ZSk9PnVwZGF0ZU9yUmVzdWJzY3JpYmUoaWQsc2VhdCx1cGRhdGUpKTtcbiB9XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVPZmZlcihjb21waWxlZE9mZmVyUCl7XG4vL1xuLy9cbi8vXG5jb25zdHtcbmludml0ZVAsXG5wdXJzZUtleXdvcmRSZWNvcmQsXG5wcm9wb3NhbCxcbmFyZ3VtZW50czphcmdzfT1cbmF3YWl0IGNvbXBpbGVkT2ZmZXJQO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcGF5bWVudFRvUHVyc2U9bmV3IE1hcCgpO1xuXG4vL1xuLy9cbmNvbnN0IGtleXdvcmRQYXltZW50UHM9T2JqZWN0LmVudHJpZXMocHJvcG9zYWwuZ2l2ZXx8aGFyZGVuKHt9KSkubWFwKFxuYXN5bmMoW2tleXdvcmQsYW1vdW50XSk9PntcbmNvbnN0IHB1cnNlPXB1cnNlS2V5d29yZFJlY29yZFtrZXl3b3JkXTtcbnB1cnNlIT09dW5kZWZpbmVkfHxcbkZhaWwgYHB1cnNlIHdhcyBub3QgZm91bmQgZm9yIGtleXdvcmQgJHtxKGtleXdvcmQpfWA7XG5cbmNvbnN0IHBheW1lbnQ9YXdhaXQgRShwdXJzZSkud2l0aGRyYXcoYW1vdW50KTtcbnBheW1lbnRUb1B1cnNlLnNldChwYXltZW50LHB1cnNlKTtcbnJldHVybltrZXl3b3JkLHBheW1lbnRdO1xuIH0pO1xuXG5cbi8vXG4vL1xuY29uc3QgdHJ5UmVjbGFpbWluZ1dpdGhkcmF3blBheW1lbnRzPSgpPT5cbi8vXG4vL1xuUHJvbWlzZS5hbGxTZXR0bGVkKFxua2V5d29yZFBheW1lbnRQcy5tYXAoYXN5bmMoa2V5d29yZFBheW1lbnRQKT0+e1xuLy9cbi8vXG5jb25zdFtfa2V5d29yZCxwYXltZW50XT1hd2FpdCBrZXl3b3JkUGF5bWVudFA7XG5cbi8vXG5jb25zdCBwdXJzZT1wYXltZW50VG9QdXJzZS5nZXQocGF5bWVudCk7XG5pZihwdXJzZT09PXVuZGVmaW5lZCl7XG4vL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5cbi8vXG50cnl7XG5yZXR1cm4gYWRkUGF5bWVudChwYXltZW50LHB1cnNlKTtcbiB9ZmluYWxseXtcbi8vXG5wYXltZW50VG9QdXJzZS5kZWxldGUocGF5bWVudCk7XG4gfVxuIH0pKTtcblxuXG4vL1xuLy9cbmNvbnN0IHdpdGhkcmF3QWxsUGF5bWVudHM9UHJvbWlzZS5hbGwoa2V5d29yZFBheW1lbnRQcyk7XG53aXRoZHJhd0FsbFBheW1lbnRzLmNhdGNoKHRyeVJlY2xhaW1pbmdXaXRoZHJhd25QYXltZW50cyk7XG5cbi8vXG4vL1xuLy9cblxuLy9cbi8vXG4vL1xuY29uc3QgcGF5bWVudEtleXdvcmRzPWF3YWl0IHdpdGhkcmF3QWxsUGF5bWVudHM7XG5cbmNvbnN0IHBheW1lbnRLZXl3b3JkUmVjb3JkPWhhcmRlbihPYmplY3QuZnJvbUVudHJpZXMocGF5bWVudEtleXdvcmRzKSk7XG5cbmNvbnN0IHNlYXQ9RSh6b2UpLm9mZmVyKFxuaW52aXRlUCxcbmhhcmRlbihwcm9wb3NhbCksXG5wYXltZW50S2V5d29yZFJlY29yZCxcbmFyZ3MpO1xuXG4vL1xuLy9cbnZvaWQgc2VhdC5maW5hbGx5KHRyeVJlY2xhaW1pbmdXaXRoZHJhd25QYXltZW50cyk7XG5cbi8vXG4vL1xuY29uc3QgZGVwb3NpdGVkUD1FKHNlYXQpLlxuZ2V0UGF5b3V0cygpLlxudGhlbigocGF5b3V0T2JqKT0+e1xucmV0dXJuIFByb21pc2UuYWxsKFxuT2JqZWN0LmVudHJpZXMocGF5b3V0T2JqKS5tYXAoKFtrZXl3b3JkLHBheW91dFBdKT0+e1xuLy9cbi8vXG5jb25zdCBwdXJzZU9yVW5kZWZpbmVkPXB1cnNlS2V5d29yZFJlY29yZFtrZXl3b3JkXTtcblxucmV0dXJuIGFkZFBheW1lbnQocGF5b3V0UCxwdXJzZU9yVW5kZWZpbmVkKTtcbiB9KSk7XG5cbiB9KTtcblxuLy9cbi8vXG4vL1xudm9pZCBkZXBvc2l0ZWRQLmZpbmFsbHkodHJ5UmVjbGFpbWluZ1dpdGhkcmF3blBheW1lbnRzKTtcblxuLy9cbi8vXG5yZXR1cm57ZGVwb3NpdGVkUCxzZWF0fTtcbiB9XG5cbi8vXG5cbmNvbnN0IGFkZElzc3Vlcj1hc3luYyhwZXRuYW1lRm9yQnJhbmQsaXNzdWVyUCxtYWtlUHVyc2U9ZmFsc2UpPT57XG5jb25zdCBpc3N1ZXI9YXdhaXQgaXNzdWVyUDtcbmNvbnN0IHJlY1A9YnJhbmRUYWJsZS5oYXNCeUlzc3Vlcihpc3N1ZXIpP1xuYnJhbmRUYWJsZS5nZXRCeUlzc3Vlcihpc3N1ZXIpOlxuYnJhbmRUYWJsZS5pbml0SXNzdWVyKGlzc3VlcixhZGRNZXRhKTtcbmNvbnN0e2JyYW5kfT1hd2FpdCByZWNQO1xuYXdhaXQgaW5pdElzc3VlclRvQm9hcmRJZChpc3N1ZXIsYnJhbmQpO1xuY29uc3QgYWRkQnJhbmRQZXRuYW1lPSgpPT57XG5sZXQgcDtcbmNvbnN0IGFscmVhZHk9YnJhbmRNYXBwaW5nLnZhbFRvUGV0bmFtZS5oYXMoYnJhbmQpO1xucGV0bmFtZUZvckJyYW5kPWJyYW5kTWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lRm9yQnJhbmQsYnJhbmQpO1xuaWYoIWFscmVhZHkmJm1ha2VQdXJzZSl7XG5wPW1ha2VFbXB0eVB1cnNlKHBldG5hbWVGb3JCcmFuZCxwZXRuYW1lRm9yQnJhbmQsdHJ1ZSk7XG4gfWVsc2V7XG5wPVByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuIH1cbnJldHVybiBFLndoZW4ocCwoXyk9PnBldG5hbWVGb3JCcmFuZCk7XG4gfTtcbnJldHVybiBhZGRCcmFuZFBldG5hbWUoKS50aGVuKGFzeW5jKGJyYW5kTmFtZSk9PntcbmF3YWl0IHVwZGF0ZUFsbElzc3VlcnNTdGF0ZSgpO1xucmV0dXJuIGJyYW5kTmFtZTtcbiB9KTtcbiB9O1xuXG5jb25zdCBwdWJsaXNoSXNzdWVyPWFzeW5jKGJyYW5kKT0+e1xuY29uc3R7aXNzdWVyfT1icmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xuY29uc3QgaXNzdWVyQm9hcmRJZD1hd2FpdCBpbml0SXNzdWVyVG9Cb2FyZElkKGlzc3VlcixicmFuZCk7XG51cGRhdGVBbGxJc3N1ZXJzU3RhdGUoKTtcbnJldHVybiBpc3N1ZXJCb2FyZElkO1xuIH07XG5cbmNvbnN0e3VwZGF0ZXI6Y29udGFjdHNVcGRhdGVyLG5vdGlmaWVyOmNvbnRhY3RzTm90aWZpZXJ9PVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbm1ha2VOb3RpZmllcktpdChbXSk7XG5cblxuLypcblxuXG5cbiAgICovXG5jb25zdCBhZGRDb250YWN0PWFzeW5jKHBldG5hbWUsYWN0aW9ucyxhZGRyZXNzPXVuZGVmaW5lZCk9Pntcbi8vXG5jb25zdCBhbHJlYWR5PWF3YWl0IEUoYm9hcmQpLmhhcyhhY3Rpb25zKTtcbi8qICAgICAgICAgICAgICAqL1xubGV0IGRlcG9zaXRGYWNldDtcbmlmKGFscmVhZHkpe1xuZGVwb3NpdEZhY2V0PWFjdGlvbnM7XG4gfWVsc2V7XG5kZXBvc2l0RmFjZXQ9RmFyKFdhbGxldE5hbWUuZGVwb3NpdEZhY2V0LHtcbnJlY2VpdmUocGF5bWVudFApe1xucmV0dXJuIEUoYWN0aW9ucykucmVjZWl2ZShwYXltZW50UCk7XG4gfX0pO1xuXG4gfVxuY29uc3QgZGVwb3NpdEJvYXJkSWQ9YXdhaXQgRShib2FyZCkuZ2V0SWQoZGVwb3NpdEZhY2V0KTtcbmNvbnN0IGZvdW5kPVsuLi5jb250YWN0TWFwcGluZy5wZXRuYW1lVG9WYWwuZW50cmllcygpXS5maW5kKFxuKFtfcG4se2RlcG9zaXRCb2FyZElkOmRiaWR9XSk9PmRlcG9zaXRCb2FyZElkPT09ZGJpZCk7XG5cbiFmb3VuZHx8XG5GYWlsIGAke3EoZm91bmQmJmZvdW5kWzBdKX0gaXMgYWxyZWFkeSB0aGUgcGV0bmFtZSBmb3IgYm9hcmQgSUQgJHtxKFxuZGVwb3NpdEJvYXJkSWQpXG4gfWA7XG5cbmNvbnN0IGNvbnRhY3Q9aGFyZGVuKFxuYWRkTWV0YSh7XG5hY3Rpb25zLFxuYWRkcmVzcyxcbmRlcG9zaXRCb2FyZElkfSkpO1xuXG5cblxuY29udGFjdE1hcHBpbmcuc3VnZ2VzdFBldG5hbWUocGV0bmFtZSxjb250YWN0KTtcbmNvbnRhY3RzVXBkYXRlci51cGRhdGVTdGF0ZShbLi4uY29udGFjdE1hcHBpbmcucGV0bmFtZVRvVmFsLmVudHJpZXMoKV0pO1xucmV0dXJuIGNvbnRhY3Q7XG4gfTtcblxuY29uc3QgYWRkSW5zdGFuY2U9KHBldG5hbWUsaW5zdGFuY2VIYW5kbGUpPT57XG4vL1xuLy9cbi8vXG5wZXRuYW1lPWluc3RhbmNlTWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lLGluc3RhbmNlSGFuZGxlKTtcbi8vXG52b2lkIHVwZGF0ZUFsbFN0YXRlKCk7XG5yZXR1cm4gYGluc3RhbmNlICR7cShwZXRuYW1lKX0gc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIHdhbGxldGA7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGludGVybmFsVW5zYWZlSW1wb3J0UHVyc2U9YXN5bmMoXG5icmFuZFBldG5hbWUsXG5wZXRuYW1lRm9yUHVyc2UsXG5kZWZhdWx0QXV0b0RlcG9zaXQsXG5wdXJzZVRvSW1wb3J0KT0+XG57XG5jb25zdCBicmFuZD1icmFuZE1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChicmFuZFBldG5hbWUpO1xuY29uc3R7aXNzdWVyfT1icmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xuXG4vKiAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHVyc2U9YXdhaXQocHVyc2VUb0ltcG9ydHx8RShpc3N1ZXIpLm1ha2VFbXB0eVB1cnNlKCkpO1xuXG5wdXJzZVRvQnJhbmQuaW5pdChwdXJzZSxicmFuZCk7XG5wZXRuYW1lRm9yUHVyc2U9cHVyc2VNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKHBldG5hbWVGb3JQdXJzZSxwdXJzZSk7XG5cbmlmKGRlZmF1bHRBdXRvRGVwb3NpdCYmIWJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmhhcyhicmFuZCkpe1xuLy9cbi8vXG5hd2FpdCBkb0VuYWJsZUF1dG9EZXBvc2l0KHBldG5hbWVGb3JQdXJzZSxmYWxzZSk7XG4gfVxuXG5hd2FpdCB1cGRhdGVQdXJzZXNTdGF0ZShwZXRuYW1lRm9yUHVyc2UscHVyc2UpO1xuXG4vL1xudm9pZCBvYnNlcnZlTm90aWZpZXIoRShwdXJzZSkuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCkse1xudXBkYXRlU3RhdGUoX2JhbGFuY2Upe1xudXBkYXRlUHVyc2VzU3RhdGUocHVyc2VNYXBwaW5nLnZhbFRvUGV0bmFtZS5nZXQocHVyc2UpLHB1cnNlKS5jYXRjaChcbihlKT0+Y29uc29sZS5lcnJvcignY2Fubm90IHVwZGF0ZVN0YXRlJyxlKSk7XG5cbiB9LFxuZmFpbChyZWFzb24pe1xuY29uc29sZS5lcnJvciggYGZhaWxlZCB1cGRhdGVTdGF0ZSBvYnNlcnZlcmAscmVhc29uKTtcbiB9fSk7XG5cblxucmV0dXJuIHBldG5hbWVGb3JQdXJzZTtcbiB9O1xuXG4vL1xuLypcblxuXG5cbiAgICovXG5jb25zdCBtYWtlRW1wdHlQdXJzZT0oXG5icmFuZFBldG5hbWUsXG5wZXRuYW1lRm9yUHVyc2UsXG5kZWZhdWx0QXV0b0RlcG9zaXQ9dHJ1ZSk9PlxuXG5pbnRlcm5hbFVuc2FmZUltcG9ydFB1cnNlKFxuYnJhbmRQZXRuYW1lLFxucGV0bmFtZUZvclB1cnNlLFxuZGVmYXVsdEF1dG9EZXBvc2l0LFxudW5kZWZpbmVkKTtcblxuXG4vKlxuXG5cbiAgICovXG5hc3luYyBmdW5jdGlvbiBkZXBvc2l0KHB1cnNlUGV0bmFtZSxwYXltZW50KXtcbmNvbnN0IHB1cnNlPXB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHB1cnNlUGV0bmFtZSk7XG5yZXR1cm4gRShwdXJzZSkuZGVwb3NpdChwYXltZW50KTtcbiB9XG5cbmZ1bmN0aW9uIGdldFB1cnNlcygpe1xucmV0dXJuWy4uLnB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZW50cmllcygpXTtcbiB9XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuZnVuY3Rpb24gZ2V0UHVyc2UocHVyc2VQZXRuYW1lKXtcbnJldHVybiBwdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwdXJzZVBldG5hbWUpO1xuIH1cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5mdW5jdGlvbiBnZXRQdXJzZUlzc3VlcihwdXJzZVBldG5hbWUpe1xuY29uc3QgcHVyc2U9cHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQocHVyc2VQZXRuYW1lKTtcbmNvbnN0IGJyYW5kPXB1cnNlVG9CcmFuZC5nZXQocHVyc2UpO1xuY29uc3R7aXNzdWVyfT1icmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xucmV0dXJuIGlzc3VlcjtcbiB9XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5mdW5jdGlvbiBnZXRPZmZlcnMoe29yaWdpbj1udWxsfT17fSl7XG4vL1xucmV0dXJuWy4uLmlkVG9PZmZlci5lbnRyaWVzKCldLlxuZmlsdGVyKFxuKFtfaWQsb2ZmZXJdKT0+XG5vcmlnaW49PT1udWxsfHxcbm9mZmVyLnJlcXVlc3RDb250ZXh0JiZvZmZlci5yZXF1ZXN0Q29udGV4dC5kYXBwT3JpZ2luPT09b3JpZ2luKS5cblxuc29ydCgoW2lkMV0sW2lkMl0pPT5jbXAoaWQxLGlkMikpLlxubWFwKChbX2lkLG9mZmVyXSk9PmhhcmRlbihvZmZlcikpO1xuIH1cblxuY29uc3QgY29tcGlsZVByb3Bvc2FsPShwcm9wb3NhbFRlbXBsYXRlKT0+e1xuY29uc3R7XG53YW50PWhhcmRlbih7fSksXG5naXZlPWhhcmRlbih7fSksXG5leGl0PXtvbkRlbWFuZDpudWxsfSxcbmFyZ3VtZW50czphcmdzfT1cbnByb3Bvc2FsVGVtcGxhdGU7XG5cbmNvbnN0IHB1cnNlS2V5d29yZFJlY29yZD17fTtcblxuY29uc3QgY29tcGlsZT0oYW1vdW50S2V5d29yZFJlY29yZCk9PntcbnJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG5PYmplY3QuZW50cmllcyhhbW91bnRLZXl3b3JkUmVjb3JkKS5tYXAoXG4oW2tleXdvcmQse3B1cnNlUGV0bmFtZSx2YWx1ZX1dKT0+e1xuLy9cbmlmKHR5cGVvZiB2YWx1ZT09PSdudW1iZXInKXtcbnZhbHVlPU5hdCh2YWx1ZSk7XG4gfVxuY29uc3QgcHVyc2U9Z2V0UHVyc2UocHVyc2VQZXRuYW1lKTtcbnB1cnNlS2V5d29yZFJlY29yZFtrZXl3b3JkXT1wdXJzZTtcbmNvbnN0IGJyYW5kPXB1cnNlVG9CcmFuZC5nZXQocHVyc2UpO1xuXG5yZXR1cm5ba2V5d29yZCx7YnJhbmQsdmFsdWV9XTtcbiB9KSk7XG5cblxuIH07XG5cbmNvbnN0IHByb3Bvc2FsPXtcbndhbnQ6Y29tcGlsZSh3YW50KSxcbmdpdmU6Y29tcGlsZShnaXZlKSxcbmV4aXR9O1xuXG5cbnJldHVybntwcm9wb3NhbCxhcmd1bWVudHM6YXJncyxwdXJzZUtleXdvcmRSZWNvcmR9O1xuIH07XG5cbmNvbnN0IGNvbXBpbGVPZmZlcj1hc3luYyhvZmZlcik9PntcbmNvbnN0e1xucHJvcG9zYWwsXG5wdXJzZUtleXdvcmRSZWNvcmQsXG5hcmd1bWVudHM6YXJnc309XG5jb21waWxlUHJvcG9zYWwob2ZmZXIucHJvcG9zYWxUZW1wbGF0ZSk7XG5cbmNvbnN0IHpvZUlzc3Vlcj1pc3N1ZXJNYW5hZ2VyLmdldChaT0VfSU5WSVRFX0JSQU5EX1BFVE5BTUUpO1xuY29uc3R7YnJhbmQ6aW52aXRhdGlvbkJyYW5kfT1icmFuZFRhYmxlLmdldEJ5SXNzdWVyKHpvZUlzc3Vlcik7XG5jb25zdCBpbnZpdGF0aW9uUD1maW5kT3JNYWtlSW52aXRhdGlvbihcbmlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQsXG5ib2FyZCxcbnpvZSxcbnpvZUludml0ZVB1cnNlLFxuaW52aXRhdGlvbkJyYW5kLFxub2ZmZXIpO1xuXG5cbmNvbnN0IGludml0YXRpb25EZXRhaWxzPWF3YWl0IEUoem9lKS5nZXRJbnZpdGF0aW9uRGV0YWlscyhpbnZpdGF0aW9uUCk7XG5jb25zdHtpbnN0YWxsYXRpb24saW5zdGFuY2V9PWludml0YXRpb25EZXRhaWxzO1xuXG5jb25zdCBjb21waWxlZD17XG5hcmd1bWVudHM6YXJncyxcbnByb3Bvc2FsLFxuaW52aXRlUDppbnZpdGF0aW9uUCxcbnB1cnNlS2V5d29yZFJlY29yZCxcbmludml0YXRpb25EZXRhaWxzLFxuaW5zdGFsbGF0aW9uLFxuaW5zdGFuY2V9O1xuXG5yZXR1cm4gY29tcGlsZWQ7XG4gfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGFwcE9yaWdpbnM9bWFrZVNjYWxhck1hcFN0b3JlKCdkYXBwT3JpZ2luJyk7XG5jb25zdHtub3RpZmllcjpkYXBwc05vdGlmaWVyLHVwZGF0ZXI6ZGFwcHNVcGRhdGVyfT1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9tYWtlTm90aWZpZXJLaXQoW10pO1xuXG5jb25zdCB1cGRhdGVEYXBwPShkYXBwUmVjb3JkKT0+e1xuaGFyZGVuKGFkZE1ldGEoZGFwcFJlY29yZCkpO1xuZGFwcE9yaWdpbnMuc2V0KGRhcHBSZWNvcmQub3JpZ2luLGRhcHBSZWNvcmQpO1xuZGFwcHNVcGRhdGVyLnVwZGF0ZVN0YXRlKFsuLi5kYXBwT3JpZ2lucy52YWx1ZXMoKV0pO1xuIH07XG5cbmNvbnN0IGRlbGV0ZURhcHA9KHtvcmlnaW59KT0+e1xuZGFwcE9yaWdpbnMuZGVsZXRlKG9yaWdpbik7XG5kYXBwc1VwZGF0ZXIudXBkYXRlU3RhdGUoWy4uLmRhcHBPcmlnaW5zLnZhbHVlcygpXSk7XG4gfTtcblxuY29uc3Qgc2hhcmVkQ2FjaGVDb29yZGluYXRvcj1tYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvcihcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSggYHNoYXJlZCBjYWNoZWApKTtcblxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRGFwcEFwcHJvdmFsKFxuc3VnZ2VzdGVkUGV0bmFtZSxcbm9yaWdpbixcbm5vdFlldEVuYWJsZWQ9KCk9PnsgfSlcbntcbmxldCBkYXBwUmVjb3JkO1xuaWYoZGFwcE9yaWdpbnMuaGFzKG9yaWdpbikpe1xuZGFwcFJlY29yZD1kYXBwT3JpZ2lucy5nZXQob3JpZ2luKTtcbiB9ZWxzZXtcbmxldCByZXNvbHZlO1xubGV0IHJlamVjdDtcbmxldCBhcHByb3ZhbFA7XG5cbmNvbnN0IGNhY2hlQ29vcmRpbmF0b3I9bWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IoXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUoIGBvcmlnaW4gJHtvcmlnaW59IGNhY2hlYCkpO1xuXG5kYXBwUmVjb3JkPWFkZE1ldGEoe1xuc3VnZ2VzdGVkUGV0bmFtZSxcbnBldG5hbWU6c3VnZ2VzdGVkUGV0bmFtZSxcbm9yaWdpbixcbmNhY2hlQ29vcmRpbmF0b3IsXG5hcHByb3ZhbFAsXG5lbmFibGU6ZmFsc2UsXG5hY3Rpb25zOkZhcignZGFwcC5hY3Rpb25zJyx7XG5zZXRQZXRuYW1lKHBldG5hbWUpe1xuaWYoZGFwcFJlY29yZC5wZXRuYW1lPT09cGV0bmFtZSl7XG5yZXR1cm4gZGFwcFJlY29yZC5hY3Rpb25zO1xuIH1cbmlmKGVkZ2VNYXBwaW5nLnZhbFRvUGV0bmFtZS5oYXMob3JpZ2luKSl7XG5lZGdlTWFwcGluZy5yZW5hbWVQZXRuYW1lKHBldG5hbWUsb3JpZ2luKTtcbiB9ZWxzZXtcbnBldG5hbWU9ZWRnZU1hcHBpbmcuc3VnZ2VzdFBldG5hbWUocGV0bmFtZSxvcmlnaW4pO1xuIH1cbmRhcHBSZWNvcmQ9YWRkTWV0YSh7XG4uLi5kYXBwUmVjb3JkLFxucGV0bmFtZX0pO1xuXG51cGRhdGVEYXBwKGRhcHBSZWNvcmQpO1xudm9pZCB1cGRhdGVBbGxTdGF0ZSgpO1xucmV0dXJuIGRhcHBSZWNvcmQuYWN0aW9ucztcbiB9LFxuZW5hYmxlKCl7XG4vL1xuZGFwcFJlY29yZD1hZGRNZXRhKHtcbi4uLmRhcHBSZWNvcmQsXG5lbmFibGU6dHJ1ZX0pO1xuXG5lZGdlTWFwcGluZy5zdWdnZXN0UGV0bmFtZShkYXBwUmVjb3JkLnBldG5hbWUsb3JpZ2luKTtcbnVwZGF0ZURhcHAoZGFwcFJlY29yZCk7XG5cbi8vXG5yZXNvbHZlKCk7XG5yZXR1cm4gZGFwcFJlY29yZC5hY3Rpb25zO1xuIH0sXG5kaXNhYmxlKHJlYXNvbj11bmRlZmluZWQpe1xuLy9cbmlmKHJlamVjdCl7XG5yZWplY3QocmVhc29uKTtcbiB9XG4vL1xuKHtyZXNvbHZlLHJlamVjdCxwcm9taXNlOmFwcHJvdmFsUH09bWFrZVByb21pc2VLaXQoKSk7XG5kYXBwUmVjb3JkPWFkZE1ldGEoe1xuLi4uZGFwcFJlY29yZCxcbmVuYWJsZTpmYWxzZSxcbmFwcHJvdmFsUH0pO1xuXG51cGRhdGVEYXBwKGRhcHBSZWNvcmQpO1xucmV0dXJuIGRhcHBSZWNvcmQuYWN0aW9ucztcbiB9LFxuZGVsZXRlKCl7XG5pZihyZWplY3Qpe1xucmVqZWN0KCdEYXBwIGRlbGV0ZWQnKTtcbiB9XG5kZWxldGVEYXBwKGRhcHBSZWNvcmQpO1xuIH19KX0pO1xuXG5cblxuLy9cbmRhcHBPcmlnaW5zLmluaXQob3JpZ2luLGRhcHBSZWNvcmQpO1xuXG4vL1xuZGFwcFJlY29yZC5hY3Rpb25zLmRpc2FibGUoKTtcbiB9XG5cbmlmKCFkYXBwUmVjb3JkLmVuYWJsZSl7XG5ub3RZZXRFbmFibGVkKCk7XG4gfVxuYXdhaXQgZGFwcFJlY29yZC5hcHByb3ZhbFA7XG4vL1xuLy9cbnJldHVybiBkYXBwT3JpZ2lucy5nZXQob3JpZ2luKTtcbiB9XG5cbmFzeW5jIGZ1bmN0aW9uIGFkZE9mZmVyKHJhd09mZmVyLHJlcXVlc3RDb250ZXh0PXt9KXtcbmNvbnN0IGRhcHBPcmlnaW49XG5yZXF1ZXN0Q29udGV4dC5kYXBwT3JpZ2lufHxyZXF1ZXN0Q29udGV4dC5vcmlnaW58fCd1bmtub3duJztcbmNvbnN0e2lkOnJhd0lkfT1yYXdPZmZlcjtcbmNvbnN0IGlkPW1ha2VJZChkYXBwT3JpZ2luLHJhd0lkKTtcbmNvbnN0IG9mZmVyPWhhcmRlbihcbmFkZE1ldGEoe1xuLi4ucmF3T2ZmZXIsXG5yYXdJZCxcbmlkLFxucmVxdWVzdENvbnRleHQ6ey4uLnJlcXVlc3RDb250ZXh0LGRhcHBPcmlnaW59LFxuc3RhdHVzOnVuZGVmaW5lZH0pKTtcblxuXG5pZFRvT2ZmZXIuaW5pdChpZCxvZmZlcik7XG5pZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LmluaXQoaWQsbWFrZVByb21pc2VLaXQoKSk7XG5hd2FpdCB1cGRhdGVJbmJveFN0YXRlKGlkLG9mZmVyKTtcblxuLy9cbmNvbnN0IGNvbXBpbGVkT2ZmZXJQPWNvbXBpbGVPZmZlcihvZmZlcik7XG5pZFRvQ29tcGlsZWRPZmZlclAuc2V0KGlkLGNvbXBpbGVkT2ZmZXJQKTtcblxuLy9cbmF3YWl0IHVwZGF0ZUluYm94U3RhdGUoaWQsaWRUb09mZmVyLmdldChpZCkpO1xuY29uc3R7aW5zdGFsbGF0aW9uLGluc3RhbmNlLGludml0YXRpb25EZXRhaWxzfT1hd2FpdCBjb21waWxlZE9mZmVyUDtcblxuaWYoIWlkVG9PZmZlci5oYXMoaWQpKXtcbnJldHVybiByYXdJZDtcbiB9XG5pZFRvT2ZmZXIuc2V0KFxuaWQsXG5oYXJkZW4oXG5hZGRNZXRhKHtcbi4uLmlkVG9PZmZlci5nZXQoaWQpLFxuaW5zdGFsbGF0aW9uLFxuaW5zdGFuY2UsXG5pbnZpdGF0aW9uRGV0YWlsc30pKSk7XG5cblxuXG5hd2FpdCB1cGRhdGVJbmJveFN0YXRlKGlkLGlkVG9PZmZlci5nZXQoaWQpKTtcbnJldHVybiByYXdJZDtcbiB9XG5cbmZ1bmN0aW9uIGNvbnN1bW1hdGVkKG9mZmVyKXtcbmlmKG9mZmVyLnN0YXR1cyE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihvZmZlci5hY3Rpb25zKXtcbkUob2ZmZXIuYWN0aW9ucykuaGFuZGxlZChvZmZlcik7XG4gfVxucmV0dXJuIGZhbHNlO1xuIH1cblxuYXN5bmMgZnVuY3Rpb24gZGVjbGluZU9mZmVyKGlkKXtcbmNvbnN0IG9mZmVyPWlkVG9PZmZlci5nZXQoaWQpO1xuaWYoY29uc3VtbWF0ZWQob2ZmZXIpKXtcbnJldHVybjtcbiB9XG5cbi8vXG5jb25zdCBkZWNsaW5lZE9mZmVyPWFkZE1ldGEoe1xuLi4ub2ZmZXIsXG5zdGF0dXM6J2RlY2xpbmUnfSk7XG5cbmlkVG9PZmZlci5zZXQoaWQsZGVjbGluZWRPZmZlcik7XG52b2lkIHVwZGF0ZUluYm94U3RhdGUoaWQsZGVjbGluZWRPZmZlcik7XG5cbi8vXG5jb25zdCBjb21waWxlZE9mZmVyUD1pZFRvQ29tcGlsZWRPZmZlclAuZ2V0KGlkKTtcbmlmKCFjb21waWxlZE9mZmVyUCl7XG5yZXR1cm47XG4gfVxuXG5hd2FpdCBhZGRQYXltZW50KEUuZ2V0KGNvbXBpbGVkT2ZmZXJQKS5pbnZpdGVQKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiB9XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbmNlbE9mZmVyKGlkKXtcbmNvbnN0IGNvbXBsZXRlRm49aWRUb0NvbXBsZXRlLmdldChpZCk7XG5pZighY29tcGxldGVGbil7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5jb21wbGV0ZUZuKCkuXG50aGVuKChfKT0+e1xuaWRUb0NvbXBsZXRlLmRlbGV0ZShpZCk7XG5jb25zdCBvZmZlcj1pZFRvT2ZmZXIuZ2V0KGlkKTtcbmNvbnN0IGNhbmNlbGxlZE9mZmVyPWFkZE1ldGEoe1xuLi4ub2ZmZXIsXG5zdGF0dXM6J2NhbmNlbCd9KTtcblxuaWRUb09mZmVyLnNldChpZCxjYW5jZWxsZWRPZmZlcik7XG5yZXR1cm4gdXBkYXRlSW5ib3hTdGF0ZShpZCxjYW5jZWxsZWRPZmZlcik7XG4gfSkuXG5jYXRjaCgoZSk9PmNvbnNvbGUuZXJyb3IoIGBDYW5ub3QgY2FuY2VsIG9mZmVyICR7aWR9OmAsZSkpO1xuXG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmFzeW5jIGZ1bmN0aW9uIGFjY2VwdE9mZmVyKGlkKXtcbmNvbnN0IG9mZmVyPWlkVG9PZmZlci5nZXQoaWQpO1xuaWYoY29uc3VtbWF0ZWQob2ZmZXIpKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IHJldD17fTtcbmxldCBhbHJlYWR5UmVzb2x2ZWQ9ZmFsc2U7XG5jb25zdCByZWplY3RlZD0oZSk9PntcbmlmKGFscmVhZHlSZXNvbHZlZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgcmVqZWN0T2ZmZXI9YWRkTWV0YSh7XG4uLi5vZmZlcixcbnN0YXR1czoncmVqZWN0ZWQnLFxuZXJyb3I6IGAke2V9YH0pO1xuXG5pZFRvT2ZmZXIuc2V0KGlkLHJlamVjdE9mZmVyKTtcbnZvaWQgdXBkYXRlSW5ib3hTdGF0ZShpZCxyZWplY3RPZmZlcik7XG4gfTtcblxuYXdhaXQgbnVsbDtcbnRyeXtcbmNvbnN0IHBlbmRpbmdPZmZlcj1hZGRNZXRhKHtcbi4uLm9mZmVyLFxuc3RhdHVzOidwZW5kaW5nJ30pO1xuXG5pZFRvT2ZmZXIuc2V0KGlkLHBlbmRpbmdPZmZlcik7XG52b2lkIHVwZGF0ZUluYm94U3RhdGUoaWQscGVuZGluZ09mZmVyKTtcbmNvbnN0IGNvbXBpbGVkT2ZmZXI9YXdhaXQgaWRUb0NvbXBpbGVkT2ZmZXJQLmdldChpZCk7XG5cbmNvbnN0e2RlcG9zaXRlZFAsc2VhdH09YXdhaXQgZXhlY3V0ZU9mZmVyKGNvbXBpbGVkT2ZmZXIpO1xuXG5pZFRvQ29tcGxldGUuc2V0KGlkLCgpPT57XG5hbHJlYWR5UmVzb2x2ZWQ9dHJ1ZTtcbnJldHVybiBFKHNlYXQpLnRyeUV4aXQoKTtcbiB9KTtcbmlkVG9TZWF0LnNldChpZCxzZWF0KTtcbi8vXG4vL1xudm9pZCBFKHNlYXQpLlxuaGFzRXhpdGVkKCkuXG50aGVuKChleGl0ZWQpPT57XG5pZighZXhpdGVkKXtcbnJldHVybiBzdWJzY3JpYmVUb1VwZGF0ZXMoaWQsc2VhdCk7XG4gfVxuIH0pO1xuXG5jb25zdCBvZmZlclJlc3VsdFA9RShzZWF0KS5nZXRPZmZlclJlc3VsdCgpO1xuaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdC5nZXQoaWQpLnJlc29sdmUob2ZmZXJSZXN1bHRQKTtcblxucmV0PXtcbmRlcG9zaXRlZFAsXG5kYXBwQ29udGV4dDpvZmZlci5kYXBwQ29udGV4dH07XG5cblxuLy9cbmRlcG9zaXRlZFAuXG50aGVuKChfKT0+e1xuLy9cbmlmKCFhbHJlYWR5UmVzb2x2ZWQpe1xuYWxyZWFkeVJlc29sdmVkPXRydWU7XG5jb25zdCBhY2NlcHRlZE9mZmVyPWFkZE1ldGEoe1xuLi4ucGVuZGluZ09mZmVyLFxuc3RhdHVzOidhY2NlcHQnfSk7XG5cbmlkVG9PZmZlci5zZXQoaWQsYWNjZXB0ZWRPZmZlcik7XG52b2lkIHVwZGF0ZUluYm94U3RhdGUoaWQsYWNjZXB0ZWRPZmZlcik7XG4gfVxuIH0pLlxuY2F0Y2gocmVqZWN0ZWQpO1xuIH1jYXRjaChlKXtcbmlmKG9mZmVyLmFjdGlvbnMpe1xuRShvZmZlci5hY3Rpb25zKS5lcnJvcihvZmZlcixlKTtcbiB9XG5yZWplY3RlZChlKTtcbnRocm93IGU7XG4gfVxucmV0dXJuIHJldDtcbiB9XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlkVG9QYXltZW50UmVjb3JkPW1ha2VTY2FsYXJNYXBTdG9yZSgncGF5bWVudElkJyk7XG5jb25zdHt1cGRhdGVyOnBheW1lbnRzVXBkYXRlcixub3RpZmllcjpwYXltZW50c05vdGlmaWVyfT1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9tYWtlTm90aWZpZXJLaXQoW10pO1xuLypcblxuICAgKi9cbmNvbnN0IHVwZGF0ZVBheW1lbnRSZWNvcmQ9KHthY3Rpb25zLC4uLnByZURpc3BsYXl9KT0+e1xuLy9cbi8vXG5kZWxldGUgcHJlRGlzcGxheS5kaXNwbGF5UGF5bWVudDtcbmNvbnN0IGRpc3BsYXlQYXltZW50PWZpbGxJblNsb3RzKGRlaHlkcmF0ZShoYXJkZW4ocHJlRGlzcGxheSkpKTtcbmNvbnN0IHBheW1lbnRSZWNvcmQ9YWRkTWV0YSh7XG4uLi5wcmVEaXNwbGF5LFxuYWN0aW9ucyxcbmRpc3BsYXlQYXltZW50fSk7XG5cbmNvbnN0e2lkfT1wYXltZW50UmVjb3JkLm1ldGE7XG5pZFRvUGF5bWVudFJlY29yZC5zZXQoaWQsaGFyZGVuKHBheW1lbnRSZWNvcmQpKTtcbnBheW1lbnRzVXBkYXRlci51cGRhdGVTdGF0ZShbcGF5bWVudFJlY29yZF0pO1xuIH07XG5cbmNvbnN0IG1ha2VQYXltZW50QWN0aW9uc0ZvcklkPShpZCk9PlxubWFrZVBheW1lbnRBY3Rpb25zKHtcbmdldFJlY29yZDooKT0+aWRUb1BheW1lbnRSZWNvcmQuZ2V0KGlkKSxcbnVwZGF0ZVJlY29yZDoocmVjb3JkLHdpdGhvdXRNZXRhPXt9KT0+e1xuLy9cbi8vXG51cGRhdGVQYXltZW50UmVjb3JkKHsuLi53aXRob3V0TWV0YSwuLi5hZGRNZXRhKHJlY29yZCl9KTtcbiB9LFxuZ2V0QnJhbmRSZWNvcmQ6KGJyYW5kKT0+XG5icmFuZFRhYmxlLmhhc0J5QnJhbmQoYnJhbmQpJiZicmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpLFxuZ2V0UHVyc2VCeVBldG5hbWU6KHBldG5hbWUpPT5wdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKSxcbmdldEF1dG9EZXBvc2l0UHVyc2U6KGIpPT5cbmJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmhhcyhiKT9cbmJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmdldChiKTpcbnVuZGVmaW5lZCxcbmdldElzc3VlckJvYXJkSWQ6aXNzdWVyVG9Cb2FyZElkLmdldH0pO1xuXG5cbi8qXG5cblxuICAgKi9cbmNvbnN0IGFkZFBheW1lbnQ9YXN5bmMocGF5bWVudFAsZGVwb3NpdFRvPXVuZGVmaW5lZCk9Pntcbi8vXG5jb25zdFtwYXltZW50LGJyYW5kXT1hd2FpdCBQcm9taXNlLmFsbChbXG5wYXltZW50UCxcbkUocGF5bWVudFApLmdldEFsbGVnZWRCcmFuZCgpXSk7XG5cblxuY29uc3QgYmFzZVBheW1lbnRSZWNvcmQ9YWRkTWV0YSh7XG5wYXltZW50LFxuYnJhbmR9KTtcblxuY29uc3R7aWR9PWJhc2VQYXltZW50UmVjb3JkLm1ldGE7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHBheW1lbnRSZWNvcmQ9e1xuLi4uYmFzZVBheW1lbnRSZWNvcmQsXG5hY3Rpb25zOm1ha2VQYXltZW50QWN0aW9uc0ZvcklkKGlkKX07XG5cbmlkVG9QYXltZW50UmVjb3JkLmluaXQoaWQsaGFyZGVuKHBheW1lbnRSZWNvcmQpKTtcblxuY29uc3QgcmVmcmVzaGVkPWF3YWl0IHBheW1lbnRSZWNvcmQuYWN0aW9ucy5yZWZyZXNoKCk7XG5pZighcmVmcmVzaGVkKXtcbi8vXG51cGRhdGVQYXltZW50UmVjb3JkKHBheW1lbnRSZWNvcmQpO1xuIH1cblxuLy9cbmF3YWl0IHBheW1lbnRSZWNvcmQuYWN0aW9ucy5kZXBvc2l0KGRlcG9zaXRUbyk7XG4gfTtcblxubGV0IHNlbGZDb250YWN0UDtcbmFzeW5jIGZ1bmN0aW9uIGdldERlcG9zaXRGYWNldElkKF9icmFuZEJvYXJkSWQpe1xuLy9cbnJldHVybiBFLmdldChzZWxmQ29udGFjdFApLmRlcG9zaXRCb2FyZElkO1xuIH1cblxuYXN5bmMgZnVuY3Rpb24gZGlzYWJsZUF1dG9EZXBvc2l0KHB1cnNlUGV0bmFtZSl7XG5jb25zdCBwdXJzZT1wdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwdXJzZVBldG5hbWUpO1xuY29uc3QgYnJhbmQ9cHVyc2VUb0JyYW5kLmdldChwdXJzZSk7XG5pZihcbiFicmFuZFRvQXV0b0RlcG9zaXRQdXJzZS5oYXMoYnJhbmQpfHxcbmJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmdldChicmFuZCkhPT1wdXJzZSlcbntcbnJldHVybjtcbiB9XG5cbmJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmRlbGV0ZShicmFuZCk7XG5hd2FpdCB1cGRhdGVBbGxQdXJzZVN0YXRlKCk7XG4gfVxuXG5jb25zdCBwZW5kaW5nRW5hYmxlQXV0b0RlcG9zaXRzPW1ha2VTY2FsYXJNYXBTdG9yZSgnYnJhbmQnKTtcbmFzeW5jIGZ1bmN0aW9uIGRvRW5hYmxlQXV0b0RlcG9zaXQocHVyc2VQZXRuYW1lLHVwZGF0ZVN0YXRlKXtcbmNvbnN0IHB1cnNlPXB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHB1cnNlUGV0bmFtZSk7XG5jb25zdCBicmFuZD1wdXJzZVRvQnJhbmQuZ2V0KHB1cnNlKTtcbmlmKGJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmhhcyhicmFuZCkpe1xuYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2Uuc2V0KGJyYW5kLHB1cnNlKTtcbiB9ZWxzZXtcbmJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmluaXQoYnJhbmQscHVyc2UpO1xuIH1cblxuYXdhaXQgbnVsbDtcbmlmKHVwZGF0ZVN0YXRlKXtcbmF3YWl0IHVwZGF0ZUFsbFB1cnNlU3RhdGUoKTtcbiB9XG5cbmNvbnN0IHBlbmRpbmdQPVxucGVuZGluZ0VuYWJsZUF1dG9EZXBvc2l0cy5oYXMoYnJhbmQpJiZcbnBlbmRpbmdFbmFibGVBdXRvRGVwb3NpdHMuZ2V0KGJyYW5kKTtcbmlmKHBlbmRpbmdQKXtcbnJldHVybiBwZW5kaW5nUDtcbiB9XG5cbmNvbnN0IGJvYXJkSWRQPUUuZ2V0KHNlbGZDb250YWN0UCkuZGVwb3NpdEJvYXJkSWQ7XG5wZW5kaW5nRW5hYmxlQXV0b0RlcG9zaXRzLmluaXQoYnJhbmQsYm9hcmRJZFApO1xuY29uc3QgYm9hcmRJZD1hd2FpdCBib2FyZElkUDtcbmJyYW5kVG9EZXBvc2l0RmFjZXRJZC5pbml0KGJyYW5kLGJvYXJkSWQpO1xuXG5pZih1cGRhdGVTdGF0ZSl7XG5hd2FpdCB1cGRhdGVBbGxQdXJzZVN0YXRlKCk7XG4gfVxucmV0dXJuIGJvYXJkSWRQO1xuIH1cblxuLypcblxuXG5cblxuICAgKi9cbmZ1bmN0aW9uIGFjY2VwdFBldG5hbWUoXG5hY2NlcHRGbixcbnN1Z2dlc3RlZFBldG5hbWUsXG5ib2FyZElkLFxuZGFwcE9yaWdpbj11bmRlZmluZWQpXG57XG4vKiAgICAgICAgICAgICAgICAgICovXG5sZXQgcGV0bmFtZTtcbmlmKGRhcHBPcmlnaW49PT11bmRlZmluZWQpe1xucGV0bmFtZT1zdWdnZXN0ZWRQZXRuYW1lO1xuIH1lbHNle1xuY29uc3QgZWRnZW5hbWU9ZWRnZU1hcHBpbmcudmFsVG9QZXRuYW1lLmdldChkYXBwT3JpZ2luKTtcbi8vXG5wZXRuYW1lPVtlZGdlbmFtZSxzdWdnZXN0ZWRQZXRuYW1lXTtcbiB9XG5cbnJldHVybiBFKGJvYXJkKS5cbmdldFZhbHVlKGJvYXJkSWQpLlxudGhlbigodmFsdWUpPT57XG5jb250ZXh0LmVuc3VyZUJvYXJkSWQoYm9hcmRJZCx2YWx1ZSk7XG5yZXR1cm4gYWNjZXB0Rm4ocGV0bmFtZSx2YWx1ZSk7XG4gfSk7XG4gfVxuXG4vKlxuXG5cblxuICAgKi9cbmFzeW5jIGZ1bmN0aW9uIHN1Z2dlc3RJc3N1ZXIoXG5zdWdnZXN0ZWRQZXRuYW1lLFxuaXNzdWVyQm9hcmRJZCxcbmRhcHBPcmlnaW49dW5kZWZpbmVkKVxue1xuLy9cbi8vXG4vL1xucmV0dXJuIGFjY2VwdFBldG5hbWUoXG4vL1xuKHBldG5hbWUsdmFsdWUpPT5hZGRJc3N1ZXIocGV0bmFtZSx2YWx1ZSx0cnVlKSxcbnN1Z2dlc3RlZFBldG5hbWUsXG5pc3N1ZXJCb2FyZElkLFxuZGFwcE9yaWdpbik7XG5cbiB9XG5cbi8qXG5cblxuXG4gICAqL1xuYXN5bmMgZnVuY3Rpb24gc3VnZ2VzdEluc3RhbmNlKFxuc3VnZ2VzdGVkUGV0bmFtZSxcbmluc3RhbmNlSGFuZGxlQm9hcmRJZCxcbmRhcHBPcmlnaW49dW5kZWZpbmVkKVxue1xuLy9cbi8vXG4vL1xuXG5yZXR1cm4gYWNjZXB0UGV0bmFtZShcbmFkZEluc3RhbmNlLFxuc3VnZ2VzdGVkUGV0bmFtZSxcbmluc3RhbmNlSGFuZGxlQm9hcmRJZCxcbmRhcHBPcmlnaW4pO1xuXG4gfVxuXG4vKlxuXG5cblxuICAgKi9cbmFzeW5jIGZ1bmN0aW9uIHN1Z2dlc3RJbnN0YWxsYXRpb24oXG5zdWdnZXN0ZWRQZXRuYW1lLFxuaW5zdGFsbGF0aW9uSGFuZGxlQm9hcmRJZCxcbmRhcHBPcmlnaW49dW5kZWZpbmVkKVxue1xuLy9cbi8vXG4vL1xucmV0dXJuIGFjY2VwdFBldG5hbWUoXG5pbnN0YWxsYXRpb25NYW5hZ2VyLmFkZCxcbnN1Z2dlc3RlZFBldG5hbWUsXG5pbnN0YWxsYXRpb25IYW5kbGVCb2FyZElkLFxuZGFwcE9yaWdpbik7XG5cbiB9XG5cbmZ1bmN0aW9uIGdldEJyYW5kKHBldG5hbWUpe1xuY29uc3QgYnJhbmQ9YnJhbmRNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQocGV0bmFtZSk7XG5yZXR1cm4gYnJhbmQ7XG4gfVxuXG5mdW5jdGlvbiBnZXRCcmFuZFBldG5hbWVzKGJyYW5kcyl7XG5yZXR1cm4gYnJhbmRzLm1hcChicmFuZE1hcHBpbmcudmFsVG9QZXRuYW1lLmdldCk7XG4gfVxuXG5mdW5jdGlvbiBnZXRTZWxmQ29udGFjdCgpe1xucmV0dXJuIHNlbGZDb250YWN0UDtcbiB9XG5cbmNvbnN0IG1ha2VNYW5hZ2VyPShwZXRuYW1lTWFwcGluZyxtYW5hZ2VyVHlwZSk9PntcbmNvbnN0IG1hbmFnZXI9RmFyKG1hbmFnZXJUeXBlLHtcbnJlbmFtZTphc3luYyhwZXRuYW1lLHRoaW5nKT0+e1xucGV0bmFtZU1hcHBpbmcucmVuYW1lUGV0bmFtZShwZXRuYW1lLHRoaW5nKTtcbmF3YWl0IHVwZGF0ZUFsbFN0YXRlKCk7XG4gfSxcbmdldDpwZXRuYW1lTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0LFxuZ2V0QWxsOnBldG5hbWVNYXBwaW5nLnBldG5hbWVUb1ZhbC5lbnRyaWVzLFxuYWRkOmFzeW5jKHBldG5hbWUsdGhpbmcpPT57XG5wZXRuYW1lTWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lLHRoaW5nKTtcbmF3YWl0IHVwZGF0ZUFsbFN0YXRlKCk7XG4gfX0pO1xuXG5yZXR1cm4gbWFuYWdlcjtcbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpbnN0YWxsYXRpb25NYW5hZ2VyPW1ha2VNYW5hZ2VyKFxuaW5zdGFsbGF0aW9uTWFwcGluZyxcbidJbnN0YWxsYXRpb25NYW5hZ2VyJyk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpbnN0YW5jZU1hbmFnZXI9bWFrZU1hbmFnZXIoaW5zdGFuY2VNYXBwaW5nLCdJbnN0YW5jZU1hbmFnZXInKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaXNzdWVyTWFuYWdlcj1GYXIoJ0lzc3Vlck1hbmFnZXInLHtcbnJlbmFtZTphc3luYyhwZXRuYW1lLGlzc3Vlcik9PntcbmJyYW5kVGFibGUuaGFzQnlJc3N1ZXIoaXNzdWVyKXx8XG5GYWlsIGBpc3N1ZXIgaGFzIG5vdCBiZWVuIHByZXZpb3VzbHkgYWRkZWRgO1xuY29uc3QgYnJhbmRSZWNvcmQ9YnJhbmRUYWJsZS5nZXRCeUlzc3Vlcihpc3N1ZXIpO1xuYnJhbmRNYXBwaW5nLnJlbmFtZVBldG5hbWUocGV0bmFtZSxicmFuZFJlY29yZC5icmFuZCk7XG5hd2FpdCB1cGRhdGVBbGxTdGF0ZSgpO1xuIH0sXG5nZXQ6KHBldG5hbWUpPT57XG5jb25zdCBicmFuZD1icmFuZE1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKTtcbnJldHVybiBicmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpLmlzc3VlcjtcbiB9LFxuZ2V0QWxsOigpPT57XG5yZXR1cm5bLi4uYnJhbmRNYXBwaW5nLnBldG5hbWVUb1ZhbC5lbnRyaWVzKCldLm1hcChcbihbcGV0bmFtZSxicmFuZF0pPT57XG5jb25zdHtpc3N1ZXJ9PWJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG5yZXR1cm5bcGV0bmFtZSxpc3N1ZXJdO1xuIH0pO1xuXG4gfSxcbmFkZDphc3luYyhwZXRuYW1lLGlzc3VlclApPT57XG5jb25zdHticmFuZCxpc3N1ZXJ9PWF3YWl0IGJyYW5kVGFibGUuaW5pdElzc3Vlcihpc3N1ZXJQLGFkZE1ldGEpO1xuYXdhaXQgaW5pdElzc3VlclRvQm9hcmRJZChpc3N1ZXIsYnJhbmQpO1xuYnJhbmRNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKHBldG5hbWUsYnJhbmQpO1xuYXdhaXQgdXBkYXRlQWxsSXNzdWVyc1N0YXRlKCk7XG4gfX0pO1xuXG5cbmZ1bmN0aW9uIGdldEluc3RhbGxhdGlvbk1hbmFnZXIoKXtcbnJldHVybiBpbnN0YWxsYXRpb25NYW5hZ2VyO1xuIH1cblxuZnVuY3Rpb24gZ2V0SW5zdGFuY2VNYW5hZ2VyKCl7XG5yZXR1cm4gaW5zdGFuY2VNYW5hZ2VyO1xuIH1cblxuZnVuY3Rpb24gZ2V0SXNzdWVyTWFuYWdlcigpe1xucmV0dXJuIGlzc3Vlck1hbmFnZXI7XG4gfVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlT2ZmZXJSZXN1bHQoaW52aXRhdGlvbkhhbmRsZSxvZmZlclJlc3VsdCl7XG5pbnZpdGF0aW9uSGFuZGxlVG9PZmZlclJlc3VsdC5pbml0KGludml0YXRpb25IYW5kbGUsb2ZmZXJSZXN1bHQpO1xuIH1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0T2ZmZXJSZXN1bHQoaW52aXRhdGlvbkhhbmRsZSl7XG5yZXR1cm4gaW52aXRhdGlvbkhhbmRsZVRvT2ZmZXJSZXN1bHQuZ2V0KGludml0YXRpb25IYW5kbGUpO1xuIH1cblxuLypcblxuXG5cblxuXG4gICAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0VUlOb3RpZmllcihyYXdJZCxkYXBwT3JpZ2luPSd1bmtub3duJyl7XG5jb25zdCBpZD1tYWtlSWQoZGFwcE9yaWdpbixyYXdJZCk7XG5jb25zdCBvZmZlclJlc3VsdD1hd2FpdCBpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LmdldChpZCkucHJvbWlzZTtcbmFzc2VydChcbnBhc3NTdHlsZU9mKG9mZmVyUmVzdWx0KT09PSdjb3B5UmVjb3JkJyxcbiBgb2ZmZXJSZXN1bHQgbXVzdCBiZSBhIHJlY29yZCB0byBoYXZlIGEgdWlOb3RpZmllcmApO1xuXG5vZmZlclJlc3VsdC51aU5vdGlmaWVyfHxGYWlsIGBvZmZlclJlc3VsdCBkb2VzIG5vdCBoYXZlIGEgdWlOb3RpZmllcmA7XG5yZXR1cm4gb2ZmZXJSZXN1bHQudWlOb3RpZmllcjtcbiB9XG5cbi8qXG5cblxuXG5cblxuXG4gICAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljU3Vic2NyaWJlcnMocmF3SWQsZGFwcE9yaWdpbj0ndW5rbm93bicpe1xuY29uc3QgaWQ9bWFrZUlkKGRhcHBPcmlnaW4scmF3SWQpO1xuXG5jb25zdCBvZmZlclJlc3VsdD1hd2FpdCBpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LmdldChpZCkucHJvbWlzZTtcbmFzc2VydChcbnBhc3NTdHlsZU9mKG9mZmVyUmVzdWx0KT09PSdjb3B5UmVjb3JkJyxcbiBgb2ZmZXJSZXN1bHQgJHtvZmZlclJlc3VsdH0gbXVzdCBiZSBhIHJlY29yZCB0byBoYXZlIHB1YmxpY1N1YnNjcmliZXJzYCk7XG5cblxuY29uc3R7cHVibGljU3Vic2NyaWJlcnN9PW9mZmVyUmVzdWx0O1xucHVibGljU3Vic2NyaWJlcnN8fFxuRmFpbCBgb2ZmZXJSZXN1bHQgJHtvZmZlclJlc3VsdH0gZG9lcyBub3QgaGF2ZSBwdWJsaWNTdWJzY3JpYmVyc2A7XG5wYXNzU3R5bGVPZihwdWJsaWNTdWJzY3JpYmVycyk9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgcHVibGljU3Vic2NyaWJlcnMgJHtwdWJsaWNTdWJzY3JpYmVyc30gbXVzdCBiZSBhIHJlY29yZGA7XG5cbnJldHVybiBwdWJsaWNTdWJzY3JpYmVycztcbiB9XG5cbi8qXG5cblxuXG5cblxuXG4gICAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljTm90aWZpZXJzKHJhd0lkLGRhcHBPcmlnaW49J3Vua25vd24nKXtcbmNvbnN0IHB1YmxpY1N1YnNjcmliZXJzPWF3YWl0IGdldFB1YmxpY1N1YnNjcmliZXJzKHJhd0lkLGRhcHBPcmlnaW4pO1xucmV0dXJuIG9iamVjdE1hcChwdWJsaWNTdWJzY3JpYmVycyxtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG4gfVxuXG4vL1xuLy9cbmNvbnN0IGNyZWF0ZVJvb3RMb29rdXBzPSgpPT57XG5jb25zdCByb290UGF0aFRvTG9va3VwPW1ha2VMZWdhY3lNYXAoJ2xvb2t1cHMnKTtcblxuLypcblxuXG4gICAgICovXG5jb25zdCBtYWtlTG9va3VwPShraW5kLGxvb2t1cCk9PntcbnJvb3RQYXRoVG9Mb29rdXAuaW5pdChcbmtpbmQsXG5GYXIoIGAke2tpbmR9TG9va3VwYCx7XG5sb29rdXB9KSk7XG5cblxuIH07XG5cbi8vXG4vL1xuY29uc3QgcGV0bmFtZU9yUGF0aD1cbihsb29rdXApPT5cbiguLi5wYXRoKT0+e1xudHJ5e1xuaWYocGF0aC5sZW5ndGg9PT0xKXtcbi8vXG5yZXR1cm4gbG9va3VwKHBhdGhbMF0pO1xuIH1cbiB9Y2F0Y2goZSl7XG4vL1xuIH1cbnJldHVybiBsb29rdXAocGF0aCk7XG4gfTtcblxubWFrZUxvb2t1cCgnYnJhbmQnLHBldG5hbWVPclBhdGgoYnJhbmRNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQpKTtcbm1ha2VMb29rdXAoJ2NvbnRhY3QnLHBldG5hbWVPclBhdGgoY29udGFjdE1hcHBpbmcucGV0bmFtZVRvVmFsLmdldCkpO1xubWFrZUxvb2t1cCgnaXNzdWVyJyxwZXRuYW1lT3JQYXRoKGlzc3Vlck1hbmFnZXIuZ2V0KSk7XG5tYWtlTG9va3VwKCdpbnN0YW5jZScscGV0bmFtZU9yUGF0aChpbnN0YW5jZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldCkpO1xubWFrZUxvb2t1cChcbidpbnN0YWxsYXRpb24nLFxucGV0bmFtZU9yUGF0aChpbnN0YWxsYXRpb25NYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQpKTtcblxubWFrZUxvb2t1cCgncHVyc2UnLHBldG5hbWVPclBhdGgocHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQpKTtcblxuLy9cbmNvbnN0IGlkT25seT1cbihraW5kLGxvb2t1cCk9PlxuKC4uLnBhdGgpPT57XG5wYXRoLmxlbmd0aD09PTF8fFxuRmFpbCBgJHtxKFxua2luZClcbiB9IGxvb2t1cCBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgc2luZ2xlIG9mZmVyIElELCBub3QgJHtwYXRofWA7XG5yZXR1cm4gbG9va3VwKHBhdGhbMF0pO1xuIH07XG5tYWtlTG9va3VwKCdvZmZlcicsaWRPbmx5KCdvZmZlcicsaWRUb09mZmVyLmdldCkpO1xubWFrZUxvb2t1cChcbidvZmZlclJlc3VsdCcsXG5pZE9ubHkoJ29mZmVyUmVzdWx0JywoaWQpPT5pZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LmdldChpZCkucHJvbWlzZSkpO1xuXG5cbnJldHVybiByb290UGF0aFRvTG9va3VwO1xuIH07XG5cbmNvbnN0IGZpcnN0UGF0aFRvTG9va3VwPWNyZWF0ZVJvb3RMb29rdXBzKCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWFyc2hhbGxlcj1oYXJkZW4oe1xuZnJvbUNhcERhdGE6Y29udGV4dC5mcm9tQ2FwRGF0YSxcbnRvQ2FwRGF0YTpjb250ZXh0LnRvQ2FwRGF0YSxcbnVuc2VyaWFsaXplOmNvbnRleHQuZnJvbUNhcERhdGEsXG5zZXJpYWxpemU6Y29udGV4dC50b0NhcERhdGF9KTtcblxuXG5jb25zdCBoYW5kbGVBY2NlcHRPZmZlckFjdGlvbj1hc3luYyhvZmZlcik9PntcbmNvbnN0e3JlcXVlc3RDb250ZXh0fT1vZmZlcjtcbmNvbnN0IHJhd0lkPWF3YWl0IGFkZE9mZmVyKG9mZmVyLHJlcXVlc3RDb250ZXh0KTtcbmNvbnN0IGRhcHBPcmlnaW49XG5yZXF1ZXN0Q29udGV4dC5kYXBwT3JpZ2lufHxyZXF1ZXN0Q29udGV4dC5vcmlnaW58fCd1bmtub3duJztcbnJldHVybiBhY2NlcHRPZmZlciggYCR7ZGFwcE9yaWdpbn0jJHtyYXdJZH1gKTtcbiB9O1xuXG5jb25zdCBoYW5kbGVTdWdnZXN0SXNzdWVyQWN0aW9uPSh7cGV0bmFtZSxib2FyZElkfSk9Plxuc3VnZ2VzdElzc3VlcihwZXRuYW1lLGJvYXJkSWQpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKlxuXG5cbiAgICovXG5jb25zdCBwZXJmb3JtQWN0aW9uPShvYmopPT57XG5jb25zdHt0eXBlLGRhdGF9PUpTT04ucGFyc2Uob2JqLnNwZW5kQWN0aW9uKTtcbnN3aXRjaCh0eXBlKXtcbmNhc2UnYWNjZXB0T2ZmZXInOlxucmV0dXJuIGhhbmRsZUFjY2VwdE9mZmVyQWN0aW9uKGRhdGEpO1xuY2FzZSdzdWdnZXN0SXNzdWVyJzpcbnJldHVybiBoYW5kbGVTdWdnZXN0SXNzdWVyQWN0aW9uKGRhdGEpO1xuZGVmYXVsdDpcbnRocm93IEVycm9yKCBgVW5rbm93biB3YWxsZXQgYWN0aW9uICR7dHlwZX1gKTt9XG5cbiB9O1xuXG5jb25zdCB3YWxsZXQ9RmFyKCd3YWxsZXQnLHtcbmxvb2t1cDooLi4ucGF0aCk9Pntcbi8vXG5pZihwYXRoLmxlbmd0aD09PTApe1xucmV0dXJuIHdhbGxldDtcbiB9XG5jb25zdFtmaXJzdCwuLi5yZW1haW5pbmddPXBhdGg7XG5jb25zdCBmaXJzdFZhbHVlPWZpcnN0UGF0aFRvTG9va3VwLmdldChmaXJzdCk7XG5pZihyZW1haW5pbmcubGVuZ3RoPT09MCl7XG5yZXR1cm4gZmlyc3RWYWx1ZTtcbiB9XG5yZXR1cm4gRShmaXJzdFZhbHVlKS5sb29rdXAoLi4ucmVtYWluaW5nKTtcbiB9LFxuZ2V0TWFyc2hhbGxlcjooKT0+bWFyc2hhbGxlcixcbmdldERhcHBDYWNoZUNvb3JkaW5hdG9yOihkYXBwT3JpZ2luKT0+XG5kYXBwT3JpZ2lucy5nZXQoZGFwcE9yaWdpbikuY2FjaGVDb29yZGluYXRvcixcbmdldENhY2hlQ29vcmRpbmF0b3I6KCk9PnNoYXJlZENhY2hlQ29vcmRpbmF0b3IsXG5zYXZlT2ZmZXJSZXN1bHQsXG5nZXRPZmZlclJlc3VsdCxcbndhaXRGb3JEYXBwQXBwcm92YWwsXG5nZXREYXBwc05vdGlmaWVyKCl7XG5yZXR1cm4gZGFwcHNOb3RpZmllcjtcbiB9LFxuZ2V0UHVyc2VzTm90aWZpZXIoKXtcbnJldHVybiBwdXJzZXNOb3RpZmllcjtcbiB9LFxuZ2V0QXR0ZW51YXRlZFB1cnNlc05vdGlmaWVyKCl7XG5yZXR1cm4gYXR0ZW51YXRlZFB1cnNlc05vdGlmaWVyO1xuIH0sXG5nZXRJc3N1ZXJzTm90aWZpZXIoKXtcbnJldHVybiBpc3N1ZXJzTm90aWZpZXI7XG4gfSxcbmdldE9mZmVyc05vdGlmaWVyKCl7XG5yZXR1cm4gb2ZmZXJzTm90aWZpZXI7XG4gfSxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuYWRkSXNzdWVyOmlzc3Vlck1hbmFnZXIuYWRkLFxuZ2V0QnJhbmQsXG5nZXRCcmFuZFBldG5hbWVzLFxucHVibGlzaElzc3Vlcixcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5hZGRJbnN0YW5jZTppbnN0YW5jZU1hbmFnZXIuYWRkLFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5hZGRJbnN0YWxsYXRpb246aW5zdGFsbGF0aW9uTWFuYWdlci5hZGQsXG5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyLFxuZ2V0SW5zdGFuY2VNYW5hZ2VyLFxuZ2V0SXNzdWVyTWFuYWdlcixcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xucmVuYW1lSXNzdWVyOmlzc3Vlck1hbmFnZXIucmVuYW1lLFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbnJlbmFtZUluc3RhbmNlOmluc3RhbmNlTWFuYWdlci5yZW5hbWUsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbnJlbmFtZUluc3RhbGxhdGlvbjppbnN0YWxsYXRpb25NYW5hZ2VyLnJlbmFtZSxcbmdldFNlbGZDb250YWN0LFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmdldEluc3RhbmNlOmluc3RhbmNlTWFuYWdlci5nZXQsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmdldEluc3RhbGxhdGlvbjppbnN0YWxsYXRpb25NYW5hZ2VyLmdldCxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuZ2V0SW5zdGFsbGF0aW9uczppbnN0YWxsYXRpb25NYW5hZ2VyLmdldEFsbCxcbm1ha2VFbXB0eVB1cnNlLFxuZGVwb3NpdCxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuZ2V0SXNzdWVyOmlzc3Vlck1hbmFnZXIuZ2V0LFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5nZXRJc3N1ZXJzOmlzc3Vlck1hbmFnZXIuZ2V0QWxsLFxuZ2V0UHVyc2VzLFxuZ2V0UHVyc2UsXG5nZXRQdXJzZUlzc3VlcixcbmFkZE9mZmVyLFxuZGVjbGluZU9mZmVyLFxuY2FuY2VsT2ZmZXIsXG5hY2NlcHRPZmZlcixcbmdldE9mZmVycyxcbmdldFNlYXQ6KGlkKT0+aWRUb1NlYXQuZ2V0KGlkKSxcbmdldFNlYXRzOihpZHMpPT5pZHMubWFwKHdhbGxldC5nZXRTZWF0KSxcbmVuYWJsZUF1dG9EZXBvc2l0KHB1cnNlUGV0bmFtZSl7XG4vL1xucmV0dXJuIGRvRW5hYmxlQXV0b0RlcG9zaXQocHVyc2VQZXRuYW1lLHRydWUpO1xuIH0sXG5kaXNhYmxlQXV0b0RlcG9zaXQsXG5wZXJmb3JtQWN0aW9uLFxuZ2V0RGVwb3NpdEZhY2V0SWQsXG5zdWdnZXN0SXNzdWVyLFxuc3VnZ2VzdEluc3RhbmNlLFxuc3VnZ2VzdEluc3RhbGxhdGlvbixcbmFkZENvbnRhY3QsXG5nZXRDb250YWN0c05vdGlmaWVyKCl7XG5yZXR1cm4gY29udGFjdHNOb3RpZmllcjtcbiB9LFxuYWRkUGF5bWVudCxcbmdldFBheW1lbnRzTm90aWZpZXIoKXtcbnJldHVybiBwYXltZW50c05vdGlmaWVyO1xuIH0sXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmdldFVJTm90aWZpZXIsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmdldFB1YmxpY05vdGlmaWVycyxcbmdldFB1YmxpY1N1YnNjcmliZXJzLFxuZ2V0Wm9lKCl7XG5yZXR1cm4gem9lO1xuIH0sXG5nZXRCb2FyZCgpe1xucmV0dXJuIGJvYXJkO1xuIH0sXG5nZXRBZ29yaWNOYW1lcyguLi5wYXRoKXtcbmlmKCFhZ29yaWNOYW1lcyl7XG50aHJvdyBGYWlsIGBhZ29yaWNOYW1lcyB3YXMgbm90IHN1cHBsaWVkIHRvIHRoZSB3YWxsZXQgbWFrZXJgO1xuIH1cbnJldHVybiBFKGFnb3JpY05hbWVzKS5sb29rdXAoLi4ucGF0aCk7XG4gfSxcbmdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpe1xuaWYobmFtZXNCeUFkZHJlc3M9PT11bmRlZmluZWQpe1xuLy9cbi8vXG50aHJvdyBGYWlsIGBuYW1lc0J5QWRkcmVzcyB3YXMgbm90IHN1cHBsaWVkIHRvIHRoZSB3YWxsZXQgbWFrZXJgO1xuIH1cbnJldHVybiBFKG5hbWVzQnlBZGRyZXNzKS5sb29rdXAoLi4ucGF0aCk7XG4gfX0pO1xuXG5cbmNvbnN0IGluaXRpYWxpemU9YXN5bmMoKT0+e1xuLy9cbmNvbnN0IHNlbGZEZXBvc2l0RmFjZXQ9RmFyKCdjb250YWN0Jyx7XG5yZWNlaXZlKHBheW1lbnQpe1xucmV0dXJuIGFkZFBheW1lbnQocGF5bWVudCk7XG4gfX0pO1xuXG5cbmNvbnN0IGFkZHJlc3M9YXdhaXQgRShteUFkZHJlc3NOYW1lQWRtaW4pLmdldE15QWRkcmVzcygpO1xuLy9cbnNlbGZDb250YWN0UD1hZGRDb250YWN0KCdTZWxmJyxzZWxmRGVwb3NpdEZhY2V0LGFkZHJlc3MpO1xuXG4vL1xuY29uc3QgWk9FX0lOVklURV9QVVJTRV9QRVROQU1FPSdEZWZhdWx0IFpvZSBpbnZpdGUgcHVyc2UnO1xuY29uc3QgaW52aXRlSXNzdWVyUD1FKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpO1xuY29uc3QgYWRkWm9lSXNzdWVyPShpc3N1ZXJQKT0+XG5pc3N1ZXJNYW5hZ2VyLmFkZChaT0VfSU5WSVRFX0JSQU5EX1BFVE5BTUUsaXNzdWVyUCk7XG5jb25zdCBtYWtlSW52aXRlUHVyc2U9KCk9Plxud2FsbGV0Lm1ha2VFbXB0eVB1cnNlKFpPRV9JTlZJVEVfQlJBTkRfUEVUTkFNRSxaT0VfSU5WSVRFX1BVUlNFX1BFVE5BTUUpO1xuY29uc3QgYWRkSW52aXRlRGVwb3NpdEZhY2V0PSgpPT5cbkUod2FsbGV0KS5lbmFibGVBdXRvRGVwb3NpdChaT0VfSU5WSVRFX1BVUlNFX1BFVE5BTUUpO1xuXG5hd2FpdCBhZGRab2VJc3N1ZXIoaW52aXRlSXNzdWVyUCkuXG50aGVuKG1ha2VJbnZpdGVQdXJzZSkuXG50aGVuKGFkZEludml0ZURlcG9zaXRGYWNldCk7XG56b2VJbnZpdGVQdXJzZT13YWxsZXQuZ2V0UHVyc2UoWk9FX0lOVklURV9QVVJTRV9QRVROQU1FKTtcblxuYXdhaXQgRShteUFkZHJlc3NOYW1lQWRtaW4pLnVwZGF0ZShcbldhbGxldE5hbWUuZGVwb3NpdEZhY2V0LFxuc2VsZkRlcG9zaXRGYWNldCk7XG5cbiB9O1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGltcG9ydEJhbmtBc3NldHM9YXN5bmMoYmFuayk9PntcbnZvaWQgb2JzZXJ2ZUl0ZXJhdGlvbihcbnN1YnNjcmliZUVhY2goRShiYW5rKS5nZXRBc3NldFN1YnNjcmlwdGlvbigpKSxcbmhhcmRlbih7XG4gICAgICBhc3luYyB1cGRhdGVTdGF0ZSh7cHJvcG9zZWROYW1lLGlzc3Vlck5hbWUsaXNzdWVyLGJyYW5kfSl7XG5hd2FpdCBudWxsO1xudHJ5e1xuaXNzdWVyTmFtZT1hd2FpdCBhZGRJc3N1ZXIoaXNzdWVyTmFtZSxpc3N1ZXIpO1xuY29uc3QgcHVyc2U9YXdhaXQgRShiYW5rKS5nZXRQdXJzZShicmFuZCk7XG4vL1xuYXdhaXQgaW50ZXJuYWxVbnNhZmVJbXBvcnRQdXJzZShcbmlzc3Vlck5hbWUsXG5wcm9wb3NlZE5hbWUsXG50cnVlLFxucHVyc2UpO1xuXG4gfWNhdGNoKGUpe1xuY29uc29sZS5lcnJvcignLy8vIGNvdWxkIG5vdCBhZGQgYmFuayBhc3NldCBwdXJzZScsZSx7XG5pc3N1ZXJOYW1lLFxucHJvcG9zZWROYW1lLFxuaXNzdWVyLFxuYnJhbmR9KTtcblxuIH1cbiB9fSkpLlxuXG5maW5hbGx5KCgpPT5jb25zb2xlLmVycm9yKCcvLy8gVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBiYW5rIGFzc2V0cycpKTtcbiB9O1xucmV0dXJue1xuYWRtaW46d2FsbGV0LFxuaW5pdGlhbGl6ZWQ6aW5pdGlhbGl6ZSgpLFxuaW1wb3J0QmFua0Fzc2V0c307XG5cbiB9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdhbGxldFJvb3QiOlsibWFrZVdhbGxldFJvb3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADDHVpbkCAAC5AgAALAAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMy9zcmMvcHVic3ViLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBmdW5jdGlvbiAgICAgICAgICAgICAgICBtYWtlUHVic3ViKEUpe1xubGV0IGxhc3RQdWJsaXNoZWQ7XG5jb25zdCBzdWJzY3JpYmVycz1bXTtcblxucmV0dXJuIGhhcmRlbih7XG5zdWJzY3JpYmUocyl7XG5zdWJzY3JpYmVycy5wdXNoKHMpO1xuaWYobGFzdFB1Ymxpc2hlZCE9PXVuZGVmaW5lZCl7XG5FKHMpLm5vdGlmeShsYXN0UHVibGlzaGVkKTtcbiB9XG4gfSxcbnB1Ymxpc2gobSl7XG5sYXN0UHVibGlzaGVkPW07XG5mb3IoY29uc3QgcyBvZiBzdWJzY3JpYmVycyl7XG5FKHMpLm5vdGlmeShtKTtcbiB9XG4gfX0pO1xuXG4gfSRozY9fb25jZS5kZWZhdWx0KCAgICAgbWFrZVB1YnN1Yik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7+xhxJE1AACRNQAALAAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMy9zcmMvd2FsbGV0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvanMtdXRpbHMuanMiLCJAYWdvcmljL25vdGlmaWVyIiwiLi9saWItd2FsbGV0LmpzIiwiLi9wdWJzdWIuanMiLCIuL2JpZ2ludFN0cmluZ2lmeS5qcyIsIi4vZGF0ZS1ub3cuanMiLCIuL2ludGVybmFsLXR5cGVzLmpzIl0sImV4cG9ydHMiOlsiYnVpbGRSb290T2JqZWN0IiwiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBFLEZhcixkZWVwQ29weUpzb25hYmxlLG1ha2VOb3RpZmllcktpdCxvYnNlcnZlSXRlcmF0aW9uLG1ha2VXYWxsZXRSb290LHB1YnN1YixiaWdpbnRTdHJpbmdpZnksbWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyxtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9qcy11dGlscy5qc1wiLCBbW1wiZGVlcENvcHlKc29uYWJsZVwiLCBbJGjNj19hID0+IChkZWVwQ29weUpzb25hYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRozY9fYSldXSxbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaM2PX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaM2PX2EpXV1dXSxbXCIuL2xpYi13YWxsZXQuanNcIiwgW1tcIm1ha2VXYWxsZXRSb290XCIsIFskaM2PX2EgPT4gKG1ha2VXYWxsZXRSb290ID0gJGjNj19hKV1dXV0sW1wiLi9wdWJzdWIuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRozY9fYSA9PiAocHVic3ViID0gJGjNj19hKV1dXV0sW1wiLi9iaWdpbnRTdHJpbmdpZnkuanNcIiwgW1tcImJpZ2ludFN0cmluZ2lmeVwiLCBbJGjNj19hID0+IChiaWdpbnRTdHJpbmdpZnkgPSAkaM2PX2EpXV1dXSxbXCIuL2RhdGUtbm93LmpzXCIsIFtbXCJtYWtlVGltZXJEZXZpY2VEYXRlTm93XCIsIFskaM2PX2EgPT4gKG1ha2VUaW1lckRldmljZURhdGVOb3cgPSAkaM2PX2EpXV0sW1wibWFrZVRpbWVyU2VydmljZURhdGVOb3dcIiwgWyRozY9fYSA9PiAobWFrZVRpbWVyU2VydmljZURhdGVOb3cgPSAkaM2PX2EpXV1dXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShidWlsZFJvb3RPYmplY3QsICduYW1lJywge3ZhbHVlOiBcImJ1aWxkUm9vdE9iamVjdFwifSk7JGjNj19vbmNlLmJ1aWxkUm9vdE9iamVjdChidWlsZFJvb3RPYmplY3QpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuZnVuY3Rpb24gICAgICAgIGJ1aWxkUm9vdE9iamVjdCh2YXRQb3dlcnMpe1xuLy9cbmNvbnN0e0R9PXZhdFBvd2Vyc3x8e307XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IHdhbGxldFJvb3Q7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgd2FsbGV0QWRtaW47XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgcHVyc2VzU3RhdGU9W107XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IGluYm94U3RhdGU9W107XG5sZXQgaHR0cDtcblxuY29uc3QgYnJpZGdlSGFuZGxlcz1uZXcgU2V0KCk7XG5jb25zdCBvZmZlclN1YnNjcmlwdGlvbnM9bmV3IE1hcCgpO1xuXG5jb25zdCBodHRwU2VuZD0ob2JqLGNoYW5uZWxIYW5kbGVzKT0+XG5FKGh0dHApLnNlbmQoZGVlcENvcHlKc29uYWJsZShvYmopLGNoYW5uZWxIYW5kbGVzKTtcblxuY29uc3QgcHVzaE9mZmVyU3Vic2NyaXB0aW9ucz0oY2hhbm5lbEhhbmRsZSxvZmZlcnMpPT57XG5jb25zdCBzdWJzPW9mZmVyU3Vic2NyaXB0aW9ucy5nZXQoY2hhbm5lbEhhbmRsZSk7XG5mb3IoY29uc3R7b3JpZ2luLHN0YXR1c31vZiBzdWJzfHxbXSl7XG4vL1xuY29uc3QgcmVzdWx0PWhhcmRlbihcbm9mZmVycy5maWx0ZXIoXG4ob2ZmZXIpPT5cbihzdGF0dXM9PT1udWxsfHxvZmZlci5zdGF0dXM9PT1zdGF0dXMpJiZcbm9mZmVyLnJlcXVlc3RDb250ZXh0JiZcbm9mZmVyLnJlcXVlc3RDb250ZXh0Lm9yaWdpbj09PW9yaWdpbikpO1xuXG5cbmh0dHBTZW5kKFxue1xudHlwZTond2FsbGV0T2ZmZXJEZXNjcmlwdGlvbnMnLFxuZGF0YTpyZXN1bHR9LFxuXG5bY2hhbm5lbEhhbmRsZV0pO1xuXG4gfVxuIH07XG5cbmNvbnN0IHN1YnNjcmliZVRvT2ZmZXJzPShjaGFubmVsSGFuZGxlLHtvcmlnaW4sc3RhdHVzPW51bGx9KT0+e1xubGV0IHN1YnM9b2ZmZXJTdWJzY3JpcHRpb25zLmdldChjaGFubmVsSGFuZGxlKTtcbmlmKCFzdWJzKXtcbnN1YnM9W107XG5vZmZlclN1YnNjcmlwdGlvbnMuc2V0KGNoYW5uZWxIYW5kbGUsc3Vicyk7XG4gfVxuc3Vicy5wdXNoKHtvcmlnaW4sc3RhdHVzfSk7XG5wdXNoT2ZmZXJTdWJzY3JpcHRpb25zKGNoYW5uZWxIYW5kbGUsaW5ib3hTdGF0ZSk7XG4gfTtcblxuY29uc3R7cHVibGlzaDpwdXJzZXNQdWJsaXNoLHN1YnNjcmliZTpwdXJzZXNTdWJzY3JpYmV9PXB1YnN1YihFKTtcbmNvbnN0e3VwZGF0ZXI6aW5ib3hVcGRhdGVyLG5vdGlmaWVyOm9mZmVyTm90aWZpZXJ9PVxubWFrZU5vdGlmaWVyS2l0KGluYm94U3RhdGUpO1xuY29uc3R7cHVibGlzaDppbmJveFB1Ymxpc2gsc3Vic2NyaWJlOmluYm94U3Vic2NyaWJlfT1wdWJzdWIoRSk7XG5cbmNvbnN0IG5vdGlmaWVycz1oYXJkZW4oe1xuZ2V0SW5ib3hOb3RpZmllcigpe1xucmV0dXJuIG9mZmVyTm90aWZpZXI7XG4gfX0pO1xuXG5cbi8qXG5cbiAgICovXG5hc3luYyBmdW5jdGlvbiBzdGFydHVwKHtcbnpvZSxcbmJvYXJkLFxuYWdvcmljTmFtZXMsXG5uYW1lc0J5QWRkcmVzcyxcbm15QWRkcmVzc05hbWVBZG1pbixcbnRpbWVyRGV2aWNlLFxudGltZXJEZXZpY2VTY2FsZSxcbmxvY2FsVGltZXJTZXJ2aWNlLFxubG9jYWxUaW1lclBvbGxJbnRlcnZhbH0pXG57XG5hc3NlcnQobXlBZGRyZXNzTmFtZUFkbWluLCdtaXNzaW5nIG15QWRkcmVzc05hbWVBZG1pbicpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBkYXRlTm93UDtcbmlmKHRpbWVyRGV2aWNlKXtcbmRhdGVOb3dQPW1ha2VUaW1lckRldmljZURhdGVOb3coRCx0aW1lckRldmljZSx0aW1lckRldmljZVNjYWxlKTtcbiB9XG5pZihsb2NhbFRpbWVyU2VydmljZSl7XG5kYXRlTm93UD1tYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyhcbmxvY2FsVGltZXJTZXJ2aWNlLFxubG9jYWxUaW1lclBvbGxJbnRlcnZhbCk7XG5cbiB9XG5cbmNvbnN0IGRhdGVOb3c9YXdhaXQgZGF0ZU5vd1A7XG5jb25zdCB3PW1ha2VXYWxsZXRSb290KHtcbmFnb3JpY05hbWVzLFxubmFtZXNCeUFkZHJlc3MsXG5teUFkZHJlc3NOYW1lQWRtaW4sXG56b2UsXG5ib2FyZCxcbnB1cnNlc1N0YXRlQ2hhbmdlSGFuZGxlcjpwdXJzZXNQdWJsaXNoLFxuaW5ib3hTdGF0ZUNoYW5nZUhhbmRsZXI6aW5ib3hQdWJsaXNoLFxuZGF0ZU5vd30pO1xuXG5jb25zb2xlLmRlYnVnKCd3YWl0aW5nIGZvciB3YWxsZXQgdG8gaW5pdGlhbGl6ZScpO1xuYXdhaXQgdy5pbml0aWFsaXplZDtcbmNvbnNvbGUuZGVidWcoJ3dhbGxldCBpbml0aWFsaXplZCcpO1xud2FsbGV0QWRtaW49dy5hZG1pbjtcbndhbGxldFJvb3Q9dztcbiB9XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZUJyaWRnZT0oYXBwcm92ZSxkYXBwT3JpZ2luLG1ldGE9e30pPT57XG5hc3luYyBmdW5jdGlvbiptYWtlQXBwcm92ZWROb3RpZmllcihzb3VyY2VOb3RpZmllcil7XG5hd2FpdCBhcHByb3ZlKCk7XG5mb3IgYXdhaXQoY29uc3Qgc3RhdGUgb2Ygc291cmNlTm90aWZpZXIpe1xuYXdhaXQgYXBwcm92ZSgpO1xueWllbGQgc3RhdGU7XG4gfVxuIH1cbmhhcmRlbihtYWtlQXBwcm92ZWROb3RpZmllcik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYnJpZGdlPUZhcignYnJpZGdlJyx7XG4gICAgICBhc3luYyBnZXRQdXJzZXNOb3RpZmllcigpe1xuYXdhaXQgYXBwcm92ZSgpO1xuY29uc3QgcHVyc2VzTm90aWZpZXI9d2FsbGV0QWRtaW4uZ2V0QXR0ZW51YXRlZFB1cnNlc05vdGlmaWVyKCk7XG5jb25zdHtub3RpZmllcix1cGRhdGVyfT1tYWtlTm90aWZpZXJLaXQoKTtcbnZvaWQgb2JzZXJ2ZUl0ZXJhdGlvbihtYWtlQXBwcm92ZWROb3RpZmllcihwdXJzZXNOb3RpZmllciksdXBkYXRlcik7XG5yZXR1cm4gbm90aWZpZXI7XG4gfSxcbiAgICAgIGFzeW5jIGdldENhY2hlQ29vcmRpbmF0b3IoKXtcbmF3YWl0IGFwcHJvdmUoKTtcbnJldHVybiB3YWxsZXRBZG1pbi5nZXREYXBwQ2FjaGVDb29yZGluYXRvcihkYXBwT3JpZ2luKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0SXNzdWVyc05vdGlmaWVyKCl7XG5hd2FpdCBhcHByb3ZlKCk7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0SXNzdWVyc05vdGlmaWVyKCk7XG4gfSxcbiAgICAgIGFzeW5jIGFkZE9mZmVyKG9mZmVyKXtcbmF3YWl0IGFwcHJvdmUoKTtcbnJldHVybiB3YWxsZXRBZG1pbi5hZGRPZmZlcihvZmZlcix7Li4ubWV0YSxkYXBwT3JpZ2lufSk7XG4gfSxcbiAgICAgIGFzeW5jIGdldE9mZmVyc05vdGlmaWVyKHN0YXR1cz1udWxsKXtcbmF3YWl0IGFwcHJvdmUoKTtcbmNvbnN0e25vdGlmaWVyLHVwZGF0ZXJ9PW1ha2VOb3RpZmllcktpdChpbmJveFN0YXRlKTtcbmNvbnN0IGZpbHRlcj0ob2ZmZXIpPT5cbihzdGF0dXM9PT1udWxsfHxvZmZlci5zdGF0dXM9PT1zdGF0dXMpJiZcbm9mZmVyLnJlcXVlc3RDb250ZXh0JiZcbm9mZmVyLnJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW49PT1kYXBwT3JpZ2luO1xuY29uc3QgZmlsdGVyZWRPZmZlcnM9KG9mZmVycyk9PntcbnJldHVybiBvZmZlcnMuZmlsdGVyKGZpbHRlcikubWFwKCh7cmF3SWQsLi4udn0pPT4oe1xuLi4udixcbmlkOnJhd0lkfSkpO1xuXG4gfTtcblxudm9pZCBvYnNlcnZlSXRlcmF0aW9uKG1ha2VBcHByb3ZlZE5vdGlmaWVyKG9mZmVyTm90aWZpZXIpLHtcbnVwZGF0ZVN0YXRlKG9mZmVycyl7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKGZpbHRlcmVkT2ZmZXJzKG9mZmVycykpO1xuIH0sXG5maW5pc2gob2ZmZXJzKXtcbnVwZGF0ZXIuZmluaXNoKGZpbHRlcmVkT2ZmZXJzKG9mZmVycykpO1xuIH0sXG5mYWlsKGUpe1xudXBkYXRlci5mYWlsKGUpO1xuIH19KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH0sXG4gICAgICBhc3luYyBnZXREZXBvc2l0RmFjZXRJZChicmFuZEJvYXJkSWQpe1xuYXdhaXQgYXBwcm92ZSgpO1xucmV0dXJuIHdhbGxldEFkbWluLmdldERlcG9zaXRGYWNldElkKGJyYW5kQm9hcmRJZCk7XG4gfSxcbiAgICAgIGFzeW5jIHN1Z2dlc3RJc3N1ZXIocGV0bmFtZSxib2FyZElkKXtcbmF3YWl0IGFwcHJvdmUoKTtcbnJldHVybiB3YWxsZXRBZG1pbi5zdWdnZXN0SXNzdWVyKHBldG5hbWUsYm9hcmRJZCxkYXBwT3JpZ2luKTtcbiB9LFxuICAgICAgYXN5bmMgc3VnZ2VzdEluc3RhbGxhdGlvbihwZXRuYW1lLGJvYXJkSWQpe1xuYXdhaXQgYXBwcm92ZSgpO1xucmV0dXJuIHdhbGxldEFkbWluLnN1Z2dlc3RJbnN0YWxsYXRpb24ocGV0bmFtZSxib2FyZElkLGRhcHBPcmlnaW4pO1xuIH0sXG4gICAgICBhc3luYyBzdWdnZXN0SW5zdGFuY2UocGV0bmFtZSxib2FyZElkKXtcbmF3YWl0IGFwcHJvdmUoKTtcbnJldHVybiB3YWxsZXRBZG1pbi5zdWdnZXN0SW5zdGFuY2UocGV0bmFtZSxib2FyZElkLGRhcHBPcmlnaW4pO1xuIH0sXG4gICAgICBhc3luYyBnZXRVSU5vdGlmaWVyKHJhd0lkKXtcbmF3YWl0IGFwcHJvdmUoKTtcbnJldHVybiB3YWxsZXRBZG1pbi5nZXRVSU5vdGlmaWVyKHJhd0lkLGRhcHBPcmlnaW4pO1xuIH0sXG4gICAgICBhc3luYyBnZXRQdWJsaWNOb3RpZmllcnMocmF3SWQpe1xuYXdhaXQgYXBwcm92ZSgpO1xucmV0dXJuIHdhbGxldEFkbWluLmdldFB1YmxpY05vdGlmaWVycyhyYXdJZCxkYXBwT3JpZ2luKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0Wm9lKCl7XG5hd2FpdCBhcHByb3ZlKCk7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Wm9lKCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldEJvYXJkKCl7XG5hd2FpdCBhcHByb3ZlKCk7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Qm9hcmQoKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCl7XG5hd2FpdCBhcHByb3ZlKCk7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpe1xuYXdhaXQgYXBwcm92ZSgpO1xucmV0dXJuIHdhbGxldEFkbWluLmdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpO1xuIH0sXG4gICAgICBhc3luYyBnZXRCcmFuZFBldG5hbWVzKGJyYW5kcyl7XG5hd2FpdCBhcHByb3ZlKCk7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QnJhbmRQZXRuYW1lcyhicmFuZHMpO1xuIH19KTtcblxucmV0dXJuIGJyaWRnZTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cbiAgICovXG5jb25zdCBwcmVhcHByb3ZlZEJyaWRnZT1GYXIoJ3ByZWFwcHJvdmVkQnJpZGdlJyx7XG4vKlxuXG5cbiAgICAgKi9cbmFkZE9mZmVyKG9mZmVyLG1ldGEpe1xucmV0dXJuIHdhbGxldEFkbWluLmFkZE9mZmVyKG9mZmVyLG1ldGEpO1xuIH0sXG5nZXREZXBvc2l0RmFjZXRJZChicmFuZEJvYXJkSWQpe1xucmV0dXJuIHdhbGxldEFkbWluLmdldERlcG9zaXRGYWNldElkKGJyYW5kQm9hcmRJZCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldE9mZmVyc05vdGlmaWVyKCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0T2ZmZXJzTm90aWZpZXIoKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0UHVyc2VzTm90aWZpZXIoKXtcbnJldHVybiB3YWxsZXRBZG1pbi5nZXRBdHRlbnVhdGVkUHVyc2VzTm90aWZpZXIoKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0SXNzdWVyc05vdGlmaWVyKCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0SXNzdWVyc05vdGlmaWVyKCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldENhY2hlQ29vcmRpbmF0b3IoKXtcbnJldHVybiB3YWxsZXRBZG1pbi5nZXRDYWNoZUNvb3JkaW5hdG9yKCk7XG4gfSxcbnN1Z2dlc3RJbnN0YWxsYXRpb24ocGV0bmFtZSxpbnN0YWxsYXRpb25Cb2FyZElkKXtcbnJldHVybiB3YWxsZXRBZG1pbi5zdWdnZXN0SW5zdGFsbGF0aW9uKHBldG5hbWUsaW5zdGFsbGF0aW9uQm9hcmRJZCk7XG4gfSxcbnN1Z2dlc3RJbnN0YW5jZShwZXRuYW1lLGluc3RhbmNlQm9hcmRJZCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uc3VnZ2VzdEluc3RhbmNlKHBldG5hbWUsaW5zdGFuY2VCb2FyZElkKTtcbiB9LFxuc3VnZ2VzdElzc3VlcihwZXRuYW1lLGlzc3VlckJvYXJkSWQpe1xucmV0dXJuIHdhbGxldEFkbWluLnN1Z2dlc3RJc3N1ZXIocGV0bmFtZSxpc3N1ZXJCb2FyZElkKTtcbiB9LFxuZ2V0VUlOb3RpZmllcihyYXdJZCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0VUlOb3RpZmllcihyYXdJZCk7XG4gfSxcbmdldFB1YmxpY05vdGlmaWVycyhyYXdJZCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0UHVibGljTm90aWZpZXJzKHJhd0lkKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0Wm9lKCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Wm9lKCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldEJvYXJkKCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Qm9hcmQoKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpe1xucmV0dXJuIHdhbGxldEFkbWluLmdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpO1xuIH0sXG4gICAgICBhc3luYyBnZXRCcmFuZFBldG5hbWVzKGJyYW5kcyl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QnJhbmRQZXRuYW1lcyhicmFuZHMpO1xuIH19KTtcblxuaGFyZGVuKHByZWFwcHJvdmVkQnJpZGdlKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0V2FsbGV0KGJhbmspe1xuYXdhaXQgd2FsbGV0Um9vdC5pbXBvcnRCYW5rQXNzZXRzKGJhbmspO1xuXG4vKlxuXG4gICAgICovXG5jb25zdCB3YWxsZXQ9RmFyKCd3YWxsZXQnLHtcbmFkZFBheW1lbnQ6d2FsbGV0QWRtaW4uYWRkUGF5bWVudCxcbiAgICAgIGFzeW5jIGdldFNjb3BlZEJyaWRnZShzdWdnZXN0ZWREYXBwUGV0bmFtZSxkYXBwT3JpZ2luKXtcbmNvbnN0IGFwcHJvdmU9YXN5bmMoKT0+e1xuYXdhaXQgd2FsbGV0QWRtaW4ud2FpdEZvckRhcHBBcHByb3ZhbChcbnN1Z2dlc3RlZERhcHBQZXRuYW1lLFxuZGFwcE9yaWdpbik7XG5cbiB9O1xuXG5yZXR1cm4gbWFrZUJyaWRnZShhcHByb3ZlLGRhcHBPcmlnaW4pO1xuIH0sXG4gICAgICBhc3luYyBnZXRCcmlkZ2UoKXtcbnJldHVybiBwcmVhcHByb3ZlZEJyaWRnZTtcbiB9LFxuZ2V0RGVwb3NpdEZhY2V0SWQ6d2FsbGV0QWRtaW4uZ2V0RGVwb3NpdEZhY2V0SWQsXG5nZXRBZG1pbkZhY2V0KCl7XG5yZXR1cm4gRmFyKCdhZG1pbkZhY2V0Jyx7XG4uLi53YWxsZXRBZG1pbixcbi4uLm5vdGlmaWVycyxcbmdldFNjb3BlZEJyaWRnZTp3YWxsZXQuZ2V0U2NvcGVkQnJpZGdlfSk7XG5cbiB9LFxuZ2V0SXNzdWVyOndhbGxldEFkbWluLmdldElzc3VlcixcbmdldElzc3VlcnM6d2FsbGV0QWRtaW4uZ2V0SXNzdWVycyxcbmdldFB1cnNlOndhbGxldEFkbWluLmdldFB1cnNlLFxuZ2V0UHVyc2VzOndhbGxldEFkbWluLmdldFB1cnNlcyxcblxuZ2V0TWFyc2hhbGxlcjp3YWxsZXRBZG1pbi5nZXRNYXJzaGFsbGVyLFxuXG5sb29rdXA6d2FsbGV0QWRtaW4ubG9va3VwfSk7XG5cbnJldHVybiBoYXJkZW4od2FsbGV0KTtcbiB9XG5cbmZ1bmN0aW9uIHNldEhUVFBPYmplY3Qobyl7XG5odHRwPW87XG4gfVxuXG5mdW5jdGlvbiBzdGFydFN1YnNjcmlwdGlvbnMoKXtcbi8vXG4vL1xucHVyc2VzU3Vic2NyaWJlKFxuaGFyZGVuKHtcbm5vdGlmeShtKXtcbnB1cnNlc1N0YXRlPUpTT04ucGFyc2UobSk7XG4gfX0pKTtcblxuXG5cbi8vXG4vL1xuaW5ib3hTdWJzY3JpYmUoXG5oYXJkZW4oe1xubm90aWZ5KG0pe1xuaW5ib3hTdGF0ZT1KU09OLnBhcnNlKG0pO1xuaW5ib3hVcGRhdGVyLnVwZGF0ZVN0YXRlKGluYm94U3RhdGUpO1xuaWYoaHR0cCl7XG4vL1xuZm9yKGNvbnN0IGNoYW5uZWxIYW5kbGUgb2Ygb2ZmZXJTdWJzY3JpcHRpb25zLmtleXMoKSl7XG5wdXNoT2ZmZXJTdWJzY3JpcHRpb25zKGNoYW5uZWxIYW5kbGUsaW5ib3hTdGF0ZSk7XG4gfVxuIH1cbiB9fSkpO1xuXG5cbiB9XG5cbmZ1bmN0aW9uIGdldEJyaWRnZVVSTEhhbmRsZXIoKXtcbnJldHVybiBGYXIoJ2JyaWRnZVVSTEhhbmRsZXInLHtcbi8qXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyBnZXRCb290c3RyYXAob3RoZXJTaWRlLG1ldGEsb2JqKXtcbmNvbnN0e2RhcHBPcmlnaW49bWV0YS5vcmlnaW59PW9iajtcbmNvbnN0IHN1Z2dlc3RlZERhcHBQZXRuYW1lPVN0cmluZyhcbm1ldGEucXVlcnkmJm1ldGEucXVlcnkuc3VnZ2VzdGVkRGFwcFBldG5hbWV8fFxubWV0YS5kYXBwT3JpZ2lufHxcbmRhcHBPcmlnaW4pO1xuXG5cbmNvbnN0IGFwcHJvdmU9YXN5bmMoKT0+e1xubGV0IG5vdFlldEVuYWJsZWQ9ZmFsc2U7XG5hd2FpdCB3YWxsZXRBZG1pbi53YWl0Rm9yRGFwcEFwcHJvdmFsKFxuc3VnZ2VzdGVkRGFwcFBldG5hbWUsXG5kYXBwT3JpZ2luLFxuKCk9Pntcbm5vdFlldEVuYWJsZWQ9dHJ1ZTtcbkUob3RoZXJTaWRlKS5cbm5lZWREYXBwQXBwcm92YWwoZGFwcE9yaWdpbixzdWdnZXN0ZWREYXBwUGV0bmFtZSkuXG5jYXRjaCgoXyk9PnsgfSk7XG4gfSk7XG5cbmlmKG5vdFlldEVuYWJsZWQpe1xuYXdhaXQgRShvdGhlclNpZGUpLmRhcHBBcHByb3ZlZChkYXBwT3JpZ2luKTtcbiB9XG4gfTtcblxucmV0dXJuIG1ha2VCcmlkZ2UoYXBwcm92ZSxkYXBwT3JpZ2luLG1ldGEpO1xuIH0sXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG5nZXRDb21tYW5kSGFuZGxlcigpe1xucmV0dXJuIEZhcignY29tbWFuZEhhbmRsZXInLHtcbm9uT3Blbihfb2JqLG1ldGEpe1xuYnJpZGdlSGFuZGxlcy5hZGQobWV0YS5jaGFubmVsSGFuZGxlKTtcbiB9LFxub25DbG9zZShfb2JqLG1ldGEpe1xuYnJpZGdlSGFuZGxlcy5kZWxldGUobWV0YS5jaGFubmVsSGFuZGxlKTtcbm9mZmVyU3Vic2NyaXB0aW9ucy5kZWxldGUobWV0YS5jaGFubmVsSGFuZGxlKTtcbiB9LFxuXG4gICAgICBhc3luYyBvbk1lc3NhZ2Uob2JqLG1ldGEpe1xuY29uc3R7XG50eXBlLFxuZGFwcE9yaWdpbj1tZXRhLm9yaWdpbixcbnN1Z2dlc3RlZERhcHBQZXRuYW1lPW1ldGEucXVlcnkmJlxubWV0YS5xdWVyeS5zdWdnZXN0ZWREYXBwUGV0bmFtZXx8XG5vYmouZGFwcE9yaWdpbnx8XG5tZXRhLm9yaWdpbn09XG5vYmo7XG5cbi8vXG5sZXQgbmVlZEFwcHJvdmFsPWZhbHNlO1xuYXdhaXQgd2FsbGV0QWRtaW4ud2FpdEZvckRhcHBBcHByb3ZhbChcbnN1Z2dlc3RlZERhcHBQZXRuYW1lLFxuZGFwcE9yaWdpbixcbigpPT57XG5uZWVkQXBwcm92YWw9dHJ1ZTtcbmh0dHBTZW5kKFxue1xudHlwZTond2FsbGV0TmVlZERhcHBBcHByb3ZhbCcsXG5kYXRhOntcbmRhcHBPcmlnaW4sXG5zdWdnZXN0ZWREYXBwUGV0bmFtZX19LFxuXG5cblttZXRhLmNoYW5uZWxIYW5kbGVdKTtcblxuIH0pO1xuXG5pZihuZWVkQXBwcm92YWwpe1xuaHR0cFNlbmQoXG57XG50eXBlOid3YWxsZXRIYXZlRGFwcEFwcHJvdmFsJyxcbmRhdGE6e1xuZGFwcE9yaWdpbn19LFxuXG5cblttZXRhLmNoYW5uZWxIYW5kbGVdKTtcblxuIH1cblxuc3dpdGNoKHR5cGUpe1xuY2FzZSd3YWxsZXRHZXRQdXJzZXMnOntcbnJldHVybntcbnR5cGU6J3dhbGxldFVwZGF0ZVB1cnNlcycsXG5kYXRhOmJpZ2ludFN0cmluZ2lmeShwdXJzZXNTdGF0ZSl9O1xuXG4gfVxuY2FzZSd3YWxsZXRBZGRPZmZlcic6e1xubGV0IGhhbmRsZWQ9ZmFsc2U7XG5jb25zdCBhY3Rpb25zPUZhcignYWN0aW9ucycse1xuaGFuZGxlZChvZmZlcil7XG5pZihoYW5kbGVkKXtcbnJldHVybjtcbiB9XG5oYW5kbGVkPXRydWU7XG5odHRwU2VuZChcbntcbnR5cGU6J3dhbGxldE9mZmVySGFuZGxlZCcsXG5kYXRhOm9mZmVyLmlkfSxcblxuW21ldGEuY2hhbm5lbEhhbmRsZV0pO1xuXG4gfX0pO1xuXG5yZXR1cm57XG50eXBlOid3YWxsZXRPZmZlckFkZGVkJyxcbmRhdGE6YXdhaXQgd2FsbGV0QWRtaW4uYWRkT2ZmZXIoXG57Li4ub2JqLmRhdGEsYWN0aW9uc30sXG57Li4ubWV0YSxkYXBwT3JpZ2lufSl9O1xuXG5cbiB9XG5cbmNhc2Und2FsbGV0U3Vic2NyaWJlT2ZmZXJzJzp7XG5jb25zdHtzdGF0dXM9bnVsbH09b2JqO1xuY29uc3R7Y2hhbm5lbEhhbmRsZX09bWV0YTtcblxuaWYoIWNoYW5uZWxIYW5kbGUpe1xucmV0dXJue1xudHlwZTond2FsbGV0U3Vic2NyaWJlZE9mZmVycycsXG5kYXRhOmZhbHNlfTtcblxuIH1cblxuLy9cbnN1YnNjcmliZVRvT2ZmZXJzKGNoYW5uZWxIYW5kbGUse1xub3JpZ2luOmRhcHBPcmlnaW4sXG5zdGF0dXN9KTtcblxucmV0dXJue1xudHlwZTond2FsbGV0U3Vic2NyaWJlZE9mZmVycycsXG5kYXRhOnRydWV9O1xuXG4gfVxuXG5jYXNlJ3dhbGxldEdldE9mZmVycyc6e1xuY29uc3R7c3RhdHVzPW51bGx9PW9iajtcblxuLy9cbmxldCByZXN1bHQ9YXdhaXQgd2FsbGV0QWRtaW4uZ2V0T2ZmZXJzKHtcbm9yaWdpbjpkYXBwT3JpZ2lufSk7XG5cbmlmKHN0YXR1cyE9PW51bGwpe1xuLy9cbnJlc3VsdD1oYXJkZW4oXG5yZXN1bHQuZmlsdGVyKChvZmZlcik9Pm9mZmVyLnN0YXR1cz09PXN0YXR1cykpO1xuXG4gfVxuXG5yZXR1cm57XG50eXBlOid3YWxsZXRPZmZlckRlc2NyaXB0aW9ucycsXG5kYXRhOnJlc3VsdH07XG5cbiB9XG5cbmNhc2Und2FsbGV0R2V0RGVwb3NpdEZhY2V0SWQnOntcbmNvbnN0e2JyYW5kQm9hcmRJZH09b2JqO1xuY29uc3QgcmVzdWx0PVxuYXdhaXQgd2FsbGV0QWRtaW4uZ2V0RGVwb3NpdEZhY2V0SWQoYnJhbmRCb2FyZElkKTtcbnJldHVybntcbnR5cGU6J3dhbGxldERlcG9zaXRGYWNldElkUmVzcG9uc2UnLFxuZGF0YTpyZXN1bHR9O1xuXG4gfVxuXG5jYXNlJ3dhbGxldFN1Z2dlc3RJc3N1ZXInOntcbmNvbnN0e3BldG5hbWUsYm9hcmRJZH09b2JqO1xuY29uc3QgcmVzdWx0PWF3YWl0IHdhbGxldEFkbWluLnN1Z2dlc3RJc3N1ZXIoXG5wZXRuYW1lLFxuYm9hcmRJZCxcbmRhcHBPcmlnaW4pO1xuXG5yZXR1cm57XG50eXBlOid3YWxsZXRTdWdnZXN0SXNzdWVyUmVzcG9uc2UnLFxuZGF0YTpyZXN1bHR9O1xuXG4gfVxuXG5jYXNlJ3dhbGxldFN1Z2dlc3RJbnN0YW5jZSc6e1xuY29uc3R7cGV0bmFtZSxib2FyZElkfT1vYmo7XG5jb25zdCByZXN1bHQ9YXdhaXQgd2FsbGV0QWRtaW4uc3VnZ2VzdEluc3RhbmNlKFxucGV0bmFtZSxcbmJvYXJkSWQsXG5kYXBwT3JpZ2luKTtcblxucmV0dXJue1xudHlwZTond2FsbGV0U3VnZ2VzdEluc3RhbmNlUmVzcG9uc2UnLFxuZGF0YTpyZXN1bHR9O1xuXG4gfVxuXG5jYXNlJ3dhbGxldFN1Z2dlc3RJbnN0YWxsYXRpb24nOntcbmNvbnN0e3BldG5hbWUsYm9hcmRJZH09b2JqO1xuY29uc3QgcmVzdWx0PWF3YWl0IHdhbGxldEFkbWluLnN1Z2dlc3RJbnN0YWxsYXRpb24oXG5wZXRuYW1lLFxuYm9hcmRJZCxcbmRhcHBPcmlnaW4pO1xuXG5yZXR1cm57XG50eXBlOid3YWxsZXRTdWdnZXN0SW5zdGFsbGF0aW9uUmVzcG9uc2UnLFxuZGF0YTpyZXN1bHR9O1xuXG4gfVxuXG5kZWZhdWx0OlxucmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7fVxuXG4gfX0pO1xuXG4gfX0pO1xuXG4gfVxuXG5zdGFydFN1YnNjcmlwdGlvbnMoKTtcblxuZnVuY3Rpb24gZ2V0Q29tbWFuZEhhbmRsZXIoLi4ucGFyYW1zKXtcbmNvbnNvbGUuZGVidWcoXG4nZ2V0Q29tbWFuZEhhbmRsZXIgY2FsbGVkIGluIHdhbGxldCwgYnV0IGRvZXMgbm90IGV4aXN0JyxcbnBhcmFtcyk7XG5cbiB9XG5cbnJldHVybiBGYXIoJ3Jvb3QnLHtcbnN0YXJ0dXAsXG5nZXRXYWxsZXQsXG5zZXRIVFRQT2JqZWN0LFxuZ2V0QnJpZGdlVVJMSGFuZGxlcixcbmdldENvbW1hbmRIYW5kbGVyfSk7XG5cbiB9XG5cbi8qXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiAgICAgICAgICAgICAgICBzcGF3bih0ZXJtcyxfaW52aXRlTWFrZXIpe1xuY29uc3Qgd2FsbGV0VmF0PWJ1aWxkUm9vdE9iamVjdCgpO1xucmV0dXJuIHdhbGxldFZhdC5zdGFydHVwKHRlcm1zKS50aGVuKChfKT0+d2FsbGV0VmF0KTtcbiB9JGjNj19vbmNlLmRlZmF1bHQoICAgICBzcGF3bik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwiYnVpbGRSb290T2JqZWN0IjpbImJ1aWxkUm9vdE9iamVjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADJaiyDURgAAFEYAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJkZWZpbmVFUmVjb3JkZXJLaXQiLCJkZWZpbmVSZWNvcmRlcktpdCIsInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiLCJwcmVwYXJlUmVjb3JkZXIiLCJwcmVwYXJlUmVjb3JkZXJLaXQiLCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxTdG9yYWdlTm9kZVNoYXBlLHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCxtYWtlRmFrZU1hcnNoYWxsZXIsbWFrZUZha2VTdG9yYWdlLG11c3RNYXRjaCxNLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcmVwYXJlRXhvQ2xhc3MsRTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiU3RvcmFnZU5vZGVTaGFwZVwiLCBbJGjNj19hID0+IChTdG9yYWdlTm9kZVNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0XCIsIFskaM2PX2EgPT4gKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzXCIsIFtbXCJtYWtlRmFrZU1hcnNoYWxsZXJcIiwgWyRozY9fYSA9PiAobWFrZUZha2VNYXJzaGFsbGVyID0gJGjNj19hKV1dLFtcIm1ha2VGYWtlU3RvcmFnZVwiLCBbJGjNj19hID0+IChtYWtlRmFrZVN0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVSZWNvcmRlcj0oYmFnZ2FnZSxtYXJzaGFsbGVyKT0+e1xuY29uc3QgbWFrZVJlY29yZGVyPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG4nUmVjb3JkZXInLFxuTS5pbnRlcmZhY2UoJ1JlY29yZGVyJyx7XG5nZXRTdG9yYWdlTm9kZTpNLmNhbGwoKS5yZXR1cm5zKFN0b3JhZ2VOb2RlU2hhcGUpLFxuZ2V0U3RvcmFnZVBhdGg6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG53cml0ZTpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG53cml0ZUZpbmFsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pLFxuXG4vKlxuXG5cblxuXG4gICAgICovXG4oXG5wdWJsaXNoZXIsXG5zdG9yYWdlTm9kZSxcbnZhbHVlU2hhcGU9LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9NLmFueSgpKT0+XG57XG5yZXR1cm57XG5jbG9zZWQ6ZmFsc2UsXG5wdWJsaXNoZXIsXG5zdG9yYWdlTm9kZSxcbnN0b3JhZ2VQYXRoOi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL3VuZGVmaW5lZCxcbnZhbHVlU2hhcGV9O1xuXG4gfSxcbntcbmdldFN0b3JhZ2VOb2RlKCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5zdG9yYWdlTm9kZTtcbiB9LFxuLypcblxuXG5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgZ2V0U3RvcmFnZVBhdGgoKXtcbmNvbnN0e3N0b3JhZ2VQYXRoOmhlbGRQYXRofT10aGlzLnN0YXRlO1xuLy9cbmF3YWl0IG51bGw7XG5pZihoZWxkUGF0aCE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGVsZFBhdGg7XG4gfVxuY29uc3QgcGF0aD1hd2FpdCBFKHRoaXMuc3RhdGUuc3RvcmFnZU5vZGUpLmdldFBhdGgoKTtcbnRoaXMuc3RhdGUuc3RvcmFnZVBhdGg9cGF0aDtcbnJldHVybiBwYXRoO1xuIH0sXG4vKlxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHdyaXRlKHZhbHVlKXtcbmNvbnN0e2Nsb3NlZCxwdWJsaXNoZXIsc3RvcmFnZU5vZGUsdmFsdWVTaGFwZX09dGhpcy5zdGF0ZTtcbiFjbG9zZWR8fEZhaWwgYGNhbm5vdCB3cml0ZSB0byBjbG9zZWQgcmVjb3JkZXJgO1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUpO1xuY29uc3QgZW5jb2RlZD1hd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG5jb25zdCBzZXJpYWxpemVkPUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbi8vXG5yZXR1cm4gcHVibGlzaGVyLnB1Ymxpc2godmFsdWUpO1xuIH0sXG4vKlxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHdyaXRlRmluYWwodmFsdWUpe1xuY29uc3R7Y2xvc2VkLHB1Ymxpc2hlcixzdG9yYWdlTm9kZSx2YWx1ZVNoYXBlfT10aGlzLnN0YXRlO1xuIWNsb3NlZHx8RmFpbCBgY2Fubm90IHdyaXRlIHRvIGNsb3NlZCByZWNvcmRlcmA7XG5tdXN0TWF0Y2godmFsdWUsdmFsdWVTaGFwZSk7XG5jb25zdCBlbmNvZGVkPWF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbmNvbnN0IHNlcmlhbGl6ZWQ9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5hd2FpdCBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcblxuLy9cbnRoaXMuc3RhdGUuY2xvc2VkPXRydWU7XG5yZXR1cm4gcHVibGlzaGVyLmZpbmlzaCh2YWx1ZSk7XG4gfX0pO1xuXG5cblxucmV0dXJuIG1ha2VSZWNvcmRlcjtcbiB9OyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXIocHJlcGFyZVJlY29yZGVyKTtcbmhhcmRlbihwcmVwYXJlUmVjb3JkZXIpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVSZWNvcmRlcktpdD0oe21ha2VSZWNvcmRlcixtYWtlRHVyYWJsZVB1Ymxpc2hLaXR9KT0+e1xuLypcblxuXG5cblxuICAgKi9cbmNvbnN0IG1ha2VSZWNvcmRlcktpdD0oc3RvcmFnZU5vZGUsdmFsdWVTaGFwZSk9PntcbmNvbnN0e3N1YnNjcmliZXIscHVibGlzaGVyfT1tYWtlRHVyYWJsZVB1Ymxpc2hLaXQoKTtcbmNvbnN0IHJlY29yZGVyPW1ha2VSZWNvcmRlcihcbnB1Ymxpc2hlcixcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5zdG9yYWdlTm9kZSxcblxudmFsdWVTaGFwZSk7XG5cbnJldHVybiBoYXJkZW4oe3N1YnNjcmliZXIscmVjb3JkZXJ9KTtcbiB9O1xucmV0dXJuIG1ha2VSZWNvcmRlcktpdDtcbiB9O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZpbmVSZWNvcmRlcktpdChkZWZpbmVSZWNvcmRlcktpdCk7XG5jb25zdCAgICAgICAgZGVmaW5lRVJlY29yZGVyS2l0PSh7bWFrZVJlY29yZGVyLG1ha2VEdXJhYmxlUHVibGlzaEtpdH0pPT57XG4vKlxuXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZUVSZWNvcmRlcktpdD0oc3RvcmFnZU5vZGVQLHZhbHVlU2hhcGUpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG5jb25zdCByZWNvcmRlclA9RS53aGVuKHN0b3JhZ2VOb2RlUCwoc3RvcmFnZU5vZGUpPT5cbm1ha2VSZWNvcmRlcihcbnB1Ymxpc2hlcixcbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL3N0b3JhZ2VOb2RlLFxudmFsdWVTaGFwZSkpO1xuXG5cbnJldHVybntzdWJzY3JpYmVyLHJlY29yZGVyUH07XG4gfTtcbnJldHVybiBtYWtlRVJlY29yZGVyS2l0O1xuIH07JGjNj19vbmNlLmRlZmluZUVSZWNvcmRlcktpdChkZWZpbmVFUmVjb3JkZXJLaXQpO1xuaGFyZGVuKGRlZmluZUVSZWNvcmRlcktpdCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZVJlY29yZGVyS2l0PShiYWdnYWdlLG1hcnNoYWxsZXIpPT57XG5jb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ9cHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuYmFnZ2FnZSxcbidEdXJhYmxlIFB1Ymxpc2ggS2l0Jyk7XG5cbmNvbnN0IG1ha2VSZWNvcmRlcj1wcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSxtYXJzaGFsbGVyKTtcbnJldHVybiBkZWZpbmVSZWNvcmRlcktpdCh7bWFrZUR1cmFibGVQdWJsaXNoS2l0LG1ha2VSZWNvcmRlcn0pO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UucHJlcGFyZVJlY29yZGVyS2l0KHByZXBhcmVSZWNvcmRlcktpdCk7XG5jb25zdCAgICAgICAgcHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzPShiYWdnYWdlLG1hcnNoYWxsZXIpPT57XG5jb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ9cHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuYmFnZ2FnZSxcbidEdXJhYmxlIFB1Ymxpc2ggS2l0Jyk7XG5cbmNvbnN0IG1ha2VSZWNvcmRlcj1wcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSxtYXJzaGFsbGVyKTtcblxuY29uc3QgbWFrZVJlY29yZGVyS2l0PWRlZmluZVJlY29yZGVyS2l0KHtcbm1ha2VSZWNvcmRlcixcbm1ha2VEdXJhYmxlUHVibGlzaEtpdH0pO1xuXG5jb25zdCBtYWtlRVJlY29yZGVyS2l0PWRlZmluZUVSZWNvcmRlcktpdCh7XG5tYWtlUmVjb3JkZXIsXG5tYWtlRHVyYWJsZVB1Ymxpc2hLaXR9KTtcblxuXG5yZXR1cm57XG5tYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG5tYWtlUmVjb3JkZXIsXG5tYWtlUmVjb3JkZXJLaXQsXG5tYWtlRVJlY29yZGVyS2l0fTtcblxuIH07XG5cbi8qXG5cbiAqLyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKTtcbmNvbnN0ICAgICAgICBwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzPSgpPT57XG5jb25zdCBiYWdnYWdlPW1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnbW9jayByZWNvcmRlciBiYWdnYWdlJyk7XG5jb25zdCBtYXJzaGFsbGVyPW1ha2VGYWtlTWFyc2hhbGxlcigpO1xucmV0dXJue1xuLi4ucHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKGJhZ2dhZ2UsbWFyc2hhbGxlciksXG5zdG9yYWdlTm9kZTptYWtlRmFrZVN0b3JhZ2UoJ21vY2sgcmVjb3JkZXIgc3RvcmFnZScpfTtcblxuIH07JGjNj19vbmNlLnByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2Vycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUmVjb3JkZXIiOlsicHJlcGFyZVJlY29yZGVyIl0sImRlZmluZVJlY29yZGVyS2l0IjpbImRlZmluZVJlY29yZGVyS2l0Il0sImRlZmluZUVSZWNvcmRlcktpdCI6WyJkZWZpbmVFUmVjb3JkZXJLaXQiXSwicHJlcGFyZVJlY29yZGVyS2l0IjpbInByZXBhcmVSZWNvcmRlcktpdCJdLCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADbdTr/iAEAAIgBAAAeAAAAQGFnb3JpYy96b25lLXYwLjIuMi9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2R1cmFibGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9kdXJhYmxlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kdXJhYmxlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPe62dYKEQAAChEAACIAAABAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9iYXNlLXpvbmUiXSwiZXhwb3J0cyI6WyJtYWtlRHVyYWJsZVpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxGYXIsaXNQYXNzYWJsZSxjYW5CZUR1cmFibGUsbWFrZVNjYWxhck1hcFN0b3JlLHByZXBhcmVFeG8scHJlcGFyZUV4b0NsYXNzLHByZXBhcmVFeG9DbGFzc0tpdCxwcm92aWRlRHVyYWJsZU1hcFN0b3JlLHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUscHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUscHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsd2F0Y2hQcm9taXNlLGtleXMsbWFrZU9uY2VLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiaXNQYXNzYWJsZVwiLCBbJGjNj19hID0+IChpc1Bhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsIFskaM2PX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9cIiwgWyRozY9fYSA9PiAocHJlcGFyZUV4byA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiLCBbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlU2V0U3RvcmVcIiwgWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZVwiLCBbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJ3YXRjaFByb21pc2VcIiwgWyRozY9fYSA9PiAod2F0Y2hQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9iYXNlLXpvbmVcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsIFskaM2PX2EgPT4gKGtleXMgPSAkaM2PX2EpXV0sW1wibWFrZU9uY2VLaXRcIiwgWyRozY9fYSA9PiAobWFrZU9uY2VLaXQgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgaXNTdG9yYWJsZT0oc3BlY2ltZW4pPT5pc1Bhc3NhYmxlKHNwZWNpbWVuKSYmY2FuQmVEdXJhYmxlKHNwZWNpbWVuKTtcbmhhcmRlbihpc1N0b3JhYmxlKTtcblxuLypcblxuICovXG5jb25zdCBhdHRhY2hEdXJhYmxlU3RvcmVzPShnZXRCYWdnYWdlKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWFwU3RvcmU9KGxhYmVsLG9wdGlvbnMpPT57XG5jb25zdCBiYWdnYWdlPWdldEJhZ2dhZ2UoKTtcbmNvbnN0IHJldD1wcm92aWRlRHVyYWJsZU1hcFN0b3JlKGJhZ2dhZ2UsbGFiZWwsb3B0aW9ucyk7XG5yZXR1cm4gcmV0O1xuIH07XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBzZXRTdG9yZT0obGFiZWwsb3B0aW9ucyk9PlxucHJvdmlkZUR1cmFibGVTZXRTdG9yZShnZXRCYWdnYWdlKCksbGFiZWwsb3B0aW9ucyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgd2Vha1NldFN0b3JlPShsYWJlbCxvcHRpb25zKT0+XG5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShnZXRCYWdnYWdlKCksbGFiZWwsb3B0aW9ucyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgd2Vha01hcFN0b3JlPShsYWJlbCxvcHRpb25zKT0+XG5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShnZXRCYWdnYWdlKCksbGFiZWwsb3B0aW9ucyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xucmV0dXJuIEZhcignZHVyYWJsZVN0b3Jlcycse1xuZGV0YWNoZWQ6KCk9PmRldGFjaGVkRHVyYWJsZVN0b3JlcyxcbmlzU3RvcmFibGUsXG5tYXBTdG9yZSxcbnNldFN0b3JlLFxud2Vha01hcFN0b3JlLFxud2Vha1NldFN0b3JlfSk7XG5cbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRldGFjaGVkRHVyYWJsZVN0b3Jlcz1hdHRhY2hEdXJhYmxlU3RvcmVzKCgpPT5cbm1ha2VTY2FsYXJNYXBTdG9yZSgnZGV0YWNoZWQnKSk7XG5cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRHVyYWJsZVpvbmU9KGJhZ2dhZ2UsYmFzZUxhYmVsPSdkdXJhYmxlWm9uZScpPT57XG5iYWdnYWdlfHxGYWlsIGBiYWdnYWdlIHJlcXVpcmVkYDtcblxuY29uc3QgYXR0YWNoZWRTdG9yZXM9YXR0YWNoRHVyYWJsZVN0b3JlcygoKT0+YmFnZ2FnZSk7XG5cbmNvbnN0e21ha2VPbmNlLHdyYXBQcm92aWRlcn09bWFrZU9uY2VLaXQoXG5iYXNlTGFiZWwsXG5hdHRhY2hlZFN0b3JlcyxcbmJhZ2dhZ2UpO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGV4b0NsYXNzPSguLi5hcmdzKT0+cHJlcGFyZUV4b0NsYXNzKGJhZ2dhZ2UsLi4uYXJncyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuLy9cbmNvbnN0IGV4b0NsYXNzS2l0PSguLi5hcmdzKT0+cHJlcGFyZUV4b0NsYXNzS2l0KGJhZ2dhZ2UsLi4uYXJncyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZXhvPSguLi5hcmdzKT0+cHJlcGFyZUV4byhiYWdnYWdlLC4uLmFyZ3MpO1xuXG5jb25zdCBzdWJab25lU3RvcmU9d3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLm1hcFN0b3JlLGtleXMuem9uZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgc3ViWm9uZT0obGFiZWwsb3B0aW9ucz17fSk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBzdWJCYWdnYWdlPXN1YlpvbmVTdG9yZShsYWJlbCxvcHRpb25zKTtcbnJldHVybiBtYWtlRHVyYWJsZVpvbmUoc3ViQmFnZ2FnZSwgYCR7YmFzZUxhYmVsfS4ke2xhYmVsfWApO1xuIH07XG5cbnJldHVybiBGYXIoJ2R1cmFibGVab25lJyx7XG5leG86d3JhcFByb3ZpZGVyKGV4byxrZXlzLmV4byksXG5leG9DbGFzczp3cmFwUHJvdmlkZXIoZXhvQ2xhc3Msa2V5cy5leG9DbGFzcyksXG5leG9DbGFzc0tpdDp3cmFwUHJvdmlkZXIoZXhvQ2xhc3NLaXQsa2V5cy5leG9DbGFzc0tpdCksXG5zdWJab25lLFxuXG5tYWtlT25jZSxcbndhdGNoUHJvbWlzZSxcbmRldGFjaGVkOmF0dGFjaGVkU3RvcmVzLmRldGFjaGVkLFxuaXNTdG9yYWJsZTphdHRhY2hlZFN0b3Jlcy5pc1N0b3JhYmxlLFxuXG5tYXBTdG9yZTp3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMubWFwU3RvcmUsa2V5cy5zdG9yZSksXG5zZXRTdG9yZTp3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMuc2V0U3RvcmUsa2V5cy5zdG9yZSksXG53ZWFrTWFwU3RvcmU6d3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLndlYWtNYXBTdG9yZSxrZXlzLnN0b3JlKSxcbndlYWtTZXRTdG9yZTp3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMud2Vha1NldFN0b3JlLGtleXMuc3RvcmUpfSk7XG5cbiB9OyRozY9fb25jZS5tYWtlRHVyYWJsZVpvbmUobWFrZUR1cmFibGVab25lKTtcbmhhcmRlbihtYWtlRHVyYWJsZVpvbmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUR1cmFibGVab25lIjpbIm1ha2VEdXJhYmxlWm9uZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABU4lu4xwQAAMcEAAArAAAAQGVuZG8vY29tbW9uLXYxLjIuOC9hcHBseS1sYWJlbGluZy1lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Rocm93LWxhYmVsZWQuanMiXSwiZXhwb3J0cyI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRSxpc1Byb21pc2UsdGhyb3dMYWJlbGVkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Rocm93LWxhYmVsZWQuanNcIiwgW1tcInRocm93TGFiZWxlZFwiLCBbJGjNj19hID0+ICh0aHJvd0xhYmVsZWQgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yPShmdW5jLGFyZ3MsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYobGFiZWw9PT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmMoLi4uYXJncyk7XG4gfVxubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xudGhyb3dMYWJlbGVkKGVycixsYWJlbCk7XG4gfVxuaWYoaXNQcm9taXNlKHJlc3VsdCkpe1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xucmV0dXJuIEUud2hlbihyZXN1bHQsdW5kZWZpbmVkLChyZWFzb24pPT50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRozY9fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACQBleGXAQAAFwEAAAqAAAAQGVuZG8vY29tbW9uLXYxLjIuOC9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImZyb21VbmlxdWVFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjNj19vbmNlLmZyb21VbmlxdWVFbnRyaWVzKGZyb21VbmlxdWVFbnRyaWVzKTtcbmhhcmRlbihmcm9tVW5pcXVlRW50cmllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABRcw2kNwIAADcCAAAkAAAAQGVuZG8vY29tbW9uLXYxLjIuOC9pZGVudC1jaGVja2VyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpZGVudENoZWNrZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIC8vXG4vL1xuLy9cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpZGVudENoZWNrZXI9KGNvbmQsX2RldGFpbHMpPT5jb25kOyRozY9fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABhWP6GeAIAAHgCAAAmAAAAQGVuZG8vY29tbW9uLXYxLjIuOC9saXN0LWRpZmZlcmVuY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImxpc3REaWZmZXJlbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnRMaXN0LHJpZ2h0TGlzdCk9PntcbmNvbnN0IHJpZ2h0U2V0PW5ldyBTZXQocmlnaHRMaXN0KTtcbnJldHVybiBsZWZ0TGlzdC5maWx0ZXIoKGVsZW1lbnQpPT4hcmlnaHRTZXQuaGFzKGVsZW1lbnQpKTtcbiB9OyRozY9fb25jZS5saXN0RGlmZmVyZW5jZShsaXN0RGlmZmVyZW5jZSk7XG5oYXJkZW4obGlzdERpZmZlcmVuY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibGlzdERpZmZlcmVuY2UiOlsibGlzdERpZmZlcmVuY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAD5vAqF0DAABdAwAAKgAAAEBlbmRvL2NvbW1vbi12MS4yLjgvbWFrZS1hcnJheS1pdGVyYXRvci5qc3siaW1wb3J0cyI6WyIuL21ha2UtaXRlcmF0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXJyYXlJdGVyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBtYWtlSXRlcmF0b3I7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VJdGVyYXRvclwiLCBbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VBcnJheUl0ZXJhdG9yPShhcnIpPT57XG5jb25zdHtsZW5ndGh9PWFycjtcbmxldCBpPTA7XG5yZXR1cm4gbWFrZUl0ZXJhdG9yKCgpPT57XG4vKiAgICAgICAgICAgICovXG5sZXQgdmFsdWU7XG5pZihpPGxlbmd0aCl7XG52YWx1ZT1hcnJbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbi8vXG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWV9KTtcbiB9KTtcbiB9OyRozY9fb25jZS5tYWtlQXJyYXlJdGVyYXRvcihtYWtlQXJyYXlJdGVyYXRvcik7XG5oYXJkZW4obWFrZUFycmF5SXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFycmF5SXRlcmF0b3IiOlsibWFrZUFycmF5SXRlcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVosJ4zkCAAA5AgAAJAAAAEBlbmRvL2NvbW1vbi12MS4yLjgvbWFrZS1pdGVyYXRvci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZUl0ZXJhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICAvKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VJdGVyYXRvcj0obmV4dCk9PntcbmNvbnN0IGl0ZXI9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5pdGVyLFxubmV4dH0pO1xuXG5yZXR1cm4gaXRlcjtcbiB9OyRozY9fb25jZS5tYWtlSXRlcmF0b3IobWFrZUl0ZXJhdG9yKTtcbmhhcmRlbihtYWtlSXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUl0ZXJhdG9yIjpbIm1ha2VJdGVyYXRvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACtVwZ+AgMAAAIDAAAhAAAAQGVuZG8vY29tbW9uLXYxLjIuOC9vYmplY3QtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIGNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgb2JqZWN0TWFwPShvcmlnaW5hbCxtYXBGbik9PntcbmNvbnN0IGVudHM9ZW50cmllcyhvcmlnaW5hbCk7XG5jb25zdCBtYXBFbnRzPWVudHMubWFwKFxuKFtrLHZdKT0+LyogICAgICAgICAgICAgICAgICAgICAgICovW2ssbWFwRm4odixrKV0pO1xuXG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL2hhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSkpO1xuIH07JGjNj19vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADufX47hAwAA4QMAACYAAABAZW5kby9jb21tb24tdjEuMi44L29iamVjdC1tZXRhLW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWV0YU1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxjcmVhdGUsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgb2JqZWN0TWV0YU1hcD0oXG5vcmlnaW5hbCxcbm1ldGFNYXBGbixcbnByb3RvPU9iamVjdC5wcm90b3R5cGUpPT5cbntcbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob3JpZ2luYWwpO1xuY29uc3Qga2V5cz1vd25LZXlzKG9yaWdpbmFsKTtcblxuY29uc3QgZGVzY0VudHJpZXM9LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xua2V5cy5cbm1hcCgoa2V5KT0+W2tleSxtZXRhTWFwRm4oZGVzY3Nba2V5XSxrZXkpXSkuXG5maWx0ZXIoKFtfa2V5LG9wdERlc2NdKT0+b3B0RGVzYyE9PXVuZGVmaW5lZCk7XG5cbnJldHVybiBoYXJkZW4oY3JlYXRlKHByb3RvLGZyb21FbnRyaWVzKGRlc2NFbnRyaWVzKSkpO1xuIH07JGjNj19vbmNlLm9iamVjdE1ldGFNYXAob2JqZWN0TWV0YU1hcCk7XG5oYXJkZW4ob2JqZWN0TWV0YU1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNZXRhTWFwIjpbIm9iamVjdE1ldGFNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwgIay+EDAADhAwAAJAAAAEBlbmRvL2NvbW1vbi12MS4yLjgvdGhyb3ctbGFiZWxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJ0aHJvd0xhYmVsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLCBbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLCBbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV1dKTsgICBcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHRocm93TGFiZWxlZD0oXG5pbm5lckVycixcbmxhYmVsLFxuZXJyQ29uc3RydWN0b3I9dW5kZWZpbmVkLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmlmKHR5cGVvZiBsYWJlbD09PSdudW1iZXInKXtcbmxhYmVsPSBgWyR7bGFiZWx9XWA7XG4gfVxuY29uc3Qgb3V0ZXJFcnI9bWFrZUVycm9yKFxuIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG5lcnJDb25zdHJ1Y3Rvcixcbm9wdGlvbnMpO1xuXG5hbm5vdGF0ZUVycm9yKG91dGVyRXJyLFggYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xudGhyb3cgb3V0ZXJFcnI7XG4gfTskaM2PX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxRjnOpQBAACUAQAAIQAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACSt0d+7A0AAOwNAAArAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG5cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5cbi8vXG4vL1xuY29uc3QgdW5jdXJyeVRoaXM9XG4oZm4pPT5cbihyZWNlaXZlciwuLi5hcmdzKT0+XG5hcHBseShmbixyZWNlaXZlcixhcmdzKTtcbmNvbnN0IGFycmF5UHVzaD11bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5jb25zdCBhcnJheUluY2x1ZGVzPXVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyk7XG5jb25zdCBzdHJpbmdTcGxpdD11bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnNwbGl0KTtcblxuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgRmFpbD0obGl0ZXJhbHMsLi4uYXJncyk9PntcbmxldCBtc2c9bGl0ZXJhbHNbMF07XG5mb3IobGV0IGk9MDtpPGFyZ3MubGVuZ3RoO2krPTEpe1xubXNnPSBgJHttc2d9JHthcmdzW2ldfSR7bGl0ZXJhbHNbaSsxXX1gO1xuIH1cbnRocm93IEVycm9yKG1zZyk7XG4gfTtcblxuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbnZpcm9ubWVudENhcHRvcj0oYUdsb2JhbCxkcm9wTmFtZXM9ZmFsc2UpPT57XG5jb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9W107XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uPShcbm9wdGlvbk5hbWUsXG5kZWZhdWx0U2V0dGluZyxcbm9wdE90aGVyVmFsdWVzPXVuZGVmaW5lZCk9Plxue1xudHlwZW9mIG9wdGlvbk5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYDtcbnR5cGVvZiBkZWZhdWx0U2V0dGluZz09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuZGVmYXVsdFNldHRpbmcpXG4gfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG5cbi8qICAgICAgICAgICAgICAgICAqL1xubGV0IHNldHRpbmc9ZGVmYXVsdFNldHRpbmc7XG5jb25zdCBnbG9iYWxQcm9jZXNzPWFHbG9iYWwucHJvY2Vzc3x8dW5kZWZpbmVkO1xuY29uc3QgZ2xvYmFsRW52PVxudHlwZW9mIGdsb2JhbFByb2Nlc3M9PT0nb2JqZWN0JyYmZ2xvYmFsUHJvY2Vzcy5lbnZ8fHVuZGVmaW5lZDtcbmlmKHR5cGVvZiBnbG9iYWxFbnY9PT0nb2JqZWN0Jyl7XG5pZihvcHRpb25OYW1lIGluIGdsb2JhbEVudil7XG5pZighZHJvcE5hbWVzKXtcbmFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsb3B0aW9uTmFtZSk7XG4gfVxuY29uc3Qgb3B0aW9uVmFsdWU9Z2xvYmFsRW52W29wdGlvbk5hbWVdO1xuLy9cbnR5cGVvZiBvcHRpb25WYWx1ZT09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG5vcHRpb25OYW1lKVxuIH0sIGlmIHByZXNlbnQsIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc3RyaW5nIHZhbHVlLCBnb3QgJHtxKFxub3B0aW9uVmFsdWUpXG4gfWA7XG5zZXR0aW5nPW9wdGlvblZhbHVlO1xuIH1cbiB9XG5vcHRPdGhlclZhbHVlcz09PXVuZGVmaW5lZHx8XG5zZXR0aW5nPT09ZGVmYXVsdFNldHRpbmd8fFxuYXJyYXlJbmNsdWRlcyhvcHRPdGhlclZhbHVlcyxzZXR0aW5nKXx8XG5GYWlsIGBVbnJlY29nbml6ZWQgJHtxKG9wdGlvbk5hbWUpfSB2YWx1ZSAke3EoXG5zZXR0aW5nKVxuIH0uIEV4cGVjdGVkIG9uZSBvZiAke3EoW2RlZmF1bHRTZXR0aW5nLC4uLm9wdE90aGVyVmFsdWVzXSl9YDtcbnJldHVybiBzZXR0aW5nO1xuIH07XG5mcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4vKlxuXG5cbiAgICovXG5jb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0PShvcHRpb25OYW1lKT0+e1xuY29uc3Qgb3B0aW9uPWdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsJycpO1xucmV0dXJuIGZyZWV6ZShvcHRpb249PT0nJz9bXTpzdHJpbmdTcGxpdChvcHRpb24sJywnKSk7XG4gfTtcbmZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTtcblxuY29uc3QgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcz0ob3B0aW9uTmFtZSxlbGVtZW50KT0+XG5hcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksZWxlbWVudCk7XG5cbmNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcz0oKT0+e1xucmV0dXJuIGZyZWV6ZShbLi4uY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzXSk7XG4gfTtcbmZyZWV6ZShnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMpO1xuXG5yZXR1cm4gZnJlZXplKHtcbmdldEVudmlyb25tZW50T3B0aW9uLFxuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG5nZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXN9KTtcblxuIH07JGjNj19vbmNlLm1ha2VFbnZpcm9ubWVudENhcHRvcihtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuZnJlZXplKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICB7XG5nZXRFbnZpcm9ubWVudE9wdGlvbixcbmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG5lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzfT1cbm1ha2VFbnZpcm9ubWVudENhcHRvcihnbG9iYWxUaGlzLHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/HBpMd8HAADfBwAAHAAAAEBlbmRvL2Vycm9ycy12MS4yLjgvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cblxuY29uc3QgZ2xvYmFsQXNzZXJ0PWdsb2JhbFRoaXMuYXNzZXJ0O1xuXG5pZihnbG9iYWxBc3NlcnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCwgaW1wb3J0ICdzZXMnIGJlZm9yZSAnQGVuZG8vZXJyb3JzJ2ApO1xuXG4gfVxuXG5jb25zdCBtaXNzaW5nPS8qICAgICAgICAgICAgICAgICovW1xuJ3R5cGVvZicsXG4nZXJyb3InLFxuJ2ZhaWwnLFxuJ2VxdWFsJyxcbidzdHJpbmcnLFxuJ25vdGUnLFxuJ2RldGFpbHMnLFxuJ0ZhaWwnLFxuJ3F1b3RlJyxcbi8vXG4vL1xuLy9cbi8vXG4nbWFrZUFzc2VydCddLlxuZmlsdGVyKChuYW1lKT0+Z2xvYmFsQXNzZXJ0W25hbWVdPT09dW5kZWZpbmVkKTtcbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuJywgJylcbiB9YCk7XG5cbiB9XG5cbi8vXG4vL1xuLy9cbmNvbnN0e1xuYmFyZSxcbmRldGFpbHM6cmVkYWN0ZWQsXG5lcnJvcjptYWtlRXJyb3IsXG5GYWlsOnRocm93UmVkYWN0ZWQsXG5tYWtlQXNzZXJ0Ol9vbWl0dGVkTWFrZUFzc2VydCxcbm5vdGUsXG5xdW90ZSxcbi4uLmFzc2VydGlvbnN9PVxuZ2xvYmFsQXNzZXJ0O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuJGjNj19vbmNlLnJlZGFjdGVkKHJlZGFjdGVkKTskaM2PX29uY2UubWFrZUVycm9yKG1ha2VFcnJvcik7JGjNj19vbmNlLnRocm93UmVkYWN0ZWQodGhyb3dSZWRhY3RlZCk7JGjNj19vbmNlLm5vdGUobm90ZSk7JGjNj19vbmNlLnF1b3RlKHF1b3RlKTtjb25zdCBhc3NlcnQ9KHZhbHVlLG9wdERldGFpbHMsZXJyQ29udHJ1Y3RvcixvcHRpb25zKT0+XG5nbG9iYWxBc3NlcnQodmFsdWUsb3B0RGV0YWlscyxlcnJDb250cnVjdG9yLG9wdGlvbnMpOyRozY9fb25jZS5hc3NlcnQoYXNzZXJ0KTtcbk9iamVjdC5hc3NpZ24oYXNzZXJ0LGFzc2VydGlvbnMpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBiYXJlT3JRdW90ZT1iYXJlfHxxdW90ZTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5iYXJlT3JRdW90ZShiYXJlT3JRdW90ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWRhY3RlZCI6WyJyZWRhY3RlZCJdLCJYIjpbInJlZGFjdGVkIl0sIm1ha2VFcnJvciI6WyJtYWtlRXJyb3IiXSwidGhyb3dSZWRhY3RlZCI6WyJ0aHJvd1JlZGFjdGVkIl0sIkZhaWwiOlsidGhyb3dSZWRhY3RlZCJdLCJub3RlIjpbIm5vdGUiXSwiYW5ub3RhdGVFcnJvciI6WyJub3RlIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwiYXNzZXJ0IjpbImFzc2VydCJdLCJiYXJlIjpbImJhcmVPclF1b3RlIl0sImIiOlsiYmFyZU9yUXVvdGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfl1VK6UQAAClEAAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi44L3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiLCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHRyYWNrVHVybnMsbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLCBbJGjNj19hID0+ICh0cmFja1R1cm5zID0gJGjNj19hKV1dXV0sW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIiwgWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsLGVycm9yOm1ha2VFcnJvcn09YXNzZXJ0O1xuY29uc3R7YXNzaWduLGNyZWF0ZX09T2JqZWN0O1xuXG4vKlxuXG4gKi9cblxuY29uc3Qgb25TZW5kPW1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19TRU5EX0JSRUFLUE9JTlRTJyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyPXtcbnNldChfdGFyZ2V0LF9wcm9wLF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmlzRXh0ZW5zaWJsZShfdGFyZ2V0KXtcbnJldHVybiBmYWxzZTtcbiB9LFxuc2V0UHJvdG90eXBlT2YoX3RhcmdldCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5kZWxldGVQcm9wZXJ0eShfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiBmYWxzZTtcbiB9fTtcblxuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFUHJveHlIYW5kbGVyPShyZWNpcGllbnQsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHByb3BlcnR5S2V5LHJlY2VpdmVyKT0+e1xucmV0dXJuIGhhcmRlbihcbntcbi8vXG4vL1xuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbltwcm9wZXJ0eUtleV0oLi4uYXJncyl7XG5pZih0aGlzIT09cmVjZWl2ZXIpe1xuLy9cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG5tYWtlRXJyb3IoXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShwcm9wZXJ0eUtleSl9XCIgbWV0aG9kIG9mIEUoJHtxKFxucmVjaXBpZW50KVxuIH0pYCkpO1xuXG5cbiB9XG5cbmlmKG9uU2VuZCYmb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LHByb3BlcnR5S2V5KSl7XG4vL1xuZGVidWdnZXI7Ly9cbi8vXG4vL1xuLy9cbi8vXG4gfVxucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHJlY2lwaWVudCxwcm9wZXJ0eUtleSxhcmdzKTtcbiB9XG4vL1xufVtwcm9wZXJ0eUtleV0pO1xuXG4gfSxcbmFwcGx5OihfdGFyZ2V0LF90aGlzQXJnLGFyZ0FycmF5PVtdKT0+e1xuaWYob25TZW5kJiZvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsdW5kZWZpbmVkKSl7XG4vL1xuZGVidWdnZXI7Ly9cbi8vXG4vL1xuLy9cbiB9XG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbihyZWNpcGllbnQsYXJnQXJyYXkpO1xuIH0sXG5oYXM6KF90YXJnZXQsX3ApPT57XG4vL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXI9KHJlY2lwaWVudCxIYW5kbGVkUHJvbWlzZSk9PlxuaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQ6KF90YXJnZXQscHJvcGVydHlLZXkscmVjZWl2ZXIpPT57XG5yZXR1cm4gaGFyZGVuKFxue1xuLy9cbi8vXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5bcHJvcGVydHlLZXldKC4uLmFyZ3Mpe1xuLy9cbnRoaXM9PT1yZWNlaXZlcnx8XG5GYWlsIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShcbnByb3BlcnR5S2V5KVxuIH1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EocmVjaXBpZW50KX0pYDtcbmlmKG9uU2VuZCYmb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LHByb3BlcnR5S2V5KSl7XG4vL1xuZGVidWdnZXI7Ly9cbi8vXG4vL1xuLy9cbi8vXG4gfVxuSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seShyZWNpcGllbnQscHJvcGVydHlLZXksYXJncyk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbi8vXG59W3Byb3BlcnR5S2V5XSk7XG5cbiB9LFxuYXBwbHk6KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKT0+e1xuaWYob25TZW5kJiZvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsdW5kZWZpbmVkKSl7XG4vL1xuZGVidWdnZXI7Ly9cbi8vXG4vL1xuLy9cbiB9XG5IYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXM6KF90YXJnZXQsX3ApPT57XG4vL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyPSh4LEhhbmRsZWRQcm9taXNlKT0+XG5oYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhczooX3RhcmdldCxfcHJvcCk9PnRydWUsXG5nZXQ6KF90YXJnZXQscHJvcCk9PkhhbmRsZWRQcm9taXNlLmdldCh4LHByb3ApfSk7XG5cblxuLypcblxuICovXG5jb25zdCBtYWtlRT0oSGFuZGxlZFByb21pc2UpPT57XG5yZXR1cm4gaGFyZGVuKFxuYXNzaWduKFxuLypcblxuXG5cblxuXG5cblxuICAgICAgICovXG4vL1xuKHgpPT5oYXJkZW4obmV3IFByb3h5KCgpPT57IH0sbWFrZUVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSkpKSxcbntcbi8qXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuZ2V0Oih4KT0+XG4vL1xuaGFyZGVuKFxubmV3IFByb3h5KGNyZWF0ZShudWxsKSxtYWtlRUdldFByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKSkpLFxuXG5cbi8qXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG5yZXNvbHZlOkhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbi8qXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG5zZW5kT25seTooeCk9PlxuLy9cbmhhcmRlbihcbm5ldyBQcm94eSgoKT0+eyB9LG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSkpKSxcblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xud2hlbjooeCxvbmZ1bGZpbGxlZCxvbnJlamVjdGVkKT0+XG5IYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4oXG4uLi50cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSkpfSkpO1xuXG5cblxuXG4gfTtcblxuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0Om1ha2VFfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABLrDk0oBAABKAQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi44L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAQIOOsqgwAAKoMAAAnAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjgvc3JjL2xvY2FsLmpzeyJpbXBvcnRzIjpbIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImdldE1ldGhvZE5hbWVzIiwibG9jYWxBcHBseUZ1bmN0aW9uIiwibG9jYWxBcHBseU1ldGhvZCIsImxvY2FsR2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsIFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxnZXRQcm90b3R5cGVPZixmcmVlemV9PU9iamVjdDtcbmNvbnN0e2FwcGx5LG93bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0IG50eXBlb2Y9KHNwZWNpbWVuKT0+c3BlY2ltZW49PT1udWxsPydudWxsJzp0eXBlb2Ygc3BlY2ltZW47XG5cbmNvbnN0IG9uRGVsaXZlcnk9bWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX0RFTElWRVJZX0JSRUFLUE9JTlRTJyk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkPShhLGIpPT57XG5pZih0eXBlb2YgYT09PXR5cGVvZiBiKXtcbmNvbnN0IGxlZnQ9U3RyaW5nKGEpO1xuY29uc3QgcmlnaHQ9U3RyaW5nKGIpO1xuLy9cbnJldHVybiBsZWZ0PHJpZ2h0Py0xOmxlZnQ+cmlnaHQ/MTowO1xuIH1cbmlmKHR5cGVvZiBhPT09J3N5bWJvbCcpe1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N0cmluZycpO1xucmV0dXJuLTE7XG4gfVxuYXNzZXJ0KHR5cGVvZiBhPT09J3N0cmluZycpO1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N5bWJvbCcpO1xucmV0dXJuIDE7XG4gfTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLy9cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhkZXNjcykpe1xuLy9cbi8vXG5pZih0eXBlb2YgdmFsW25hbWVdPT09J2Z1bmN0aW9uJyl7XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxuIH1cbmlmKCFpc09iamVjdCh2YWwpKXtcbmJyZWFrO1xuIH1cbmxheWVyPWdldFByb3RvdHlwZU9mKGxheWVyKTtcbiB9XG5yZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbiB9O1xuLy9cbi8vXG4kaM2PX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO2ZyZWV6ZShnZXRNZXRob2ROYW1lcyk7XG5cbmNvbnN0ICAgICAgICBsb2NhbEFwcGx5RnVuY3Rpb249KHJlY2lwaWVudCxhcmdzKT0+e1xudHlwZW9mIHJlY2lwaWVudD09PSdmdW5jdGlvbid8fFxuYXNzZXJ0LmZhaWwoXG5YIGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbm50eXBlb2YocmVjaXBpZW50KSlcbiB9YCxcblR5cGVFcnJvcik7XG5cbmlmKG9uRGVsaXZlcnkmJm9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsdW5kZWZpbmVkKSl7XG4vL1xuZGVidWdnZXI7Ly9cbi8vXG4vL1xuLy9cbi8vXG4gfVxuY29uc3QgcmVzdWx0PWFwcGx5KHJlY2lwaWVudCx1bmRlZmluZWQsYXJncyk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjNj19vbmNlLmxvY2FsQXBwbHlGdW5jdGlvbihsb2NhbEFwcGx5RnVuY3Rpb24pO1xuXG5jb25zdCAgICAgICAgbG9jYWxBcHBseU1ldGhvZD0ocmVjaXBpZW50LG1ldGhvZE5hbWUsYXJncyk9PntcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWR8fG1ldGhvZE5hbWU9PT1udWxsKXtcbi8vXG5yZXR1cm4gbG9jYWxBcHBseUZ1bmN0aW9uKHJlY2lwaWVudCxhcmdzKTtcbiB9XG5pZihyZWNpcGllbnQ9PT11bmRlZmluZWR8fHJlY2lwaWVudD09PW51bGwpe1xuYXNzZXJ0LmZhaWwoXG5YIGBDYW5ub3QgZGVsaXZlciAke3EobWV0aG9kTmFtZSl9IHRvIHRhcmdldDsgdHlwZW9mIHRhcmdldCBpcyAke3EoXG5udHlwZW9mKHJlY2lwaWVudCkpXG4gfWAsXG5UeXBlRXJyb3IpO1xuXG4gfVxuY29uc3QgZm49cmVjaXBpZW50W21ldGhvZE5hbWVdO1xuaWYoZm49PT11bmRlZmluZWQpe1xuYXNzZXJ0LmZhaWwoXG5YIGB0YXJnZXQgaGFzIG5vIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9LCBoYXMgJHtxKFxuZ2V0TWV0aG9kTmFtZXMocmVjaXBpZW50KSlcbiB9YCxcblR5cGVFcnJvcik7XG5cbiB9XG5jb25zdCBmdHlwZT1udHlwZW9mKGZuKTtcbnR5cGVvZiBmbj09PSdmdW5jdGlvbid8fFxuRmFpbCBgaW52b2tlZCBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSBpcyBub3QgYSBmdW5jdGlvbjsgaXQgaXMgYSAke3EoXG5mdHlwZSlcbiB9YDtcbmlmKG9uRGVsaXZlcnkmJm9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsbWV0aG9kTmFtZSkpe1xuLy9cbmRlYnVnZ2VyOy8vXG4vL1xuLy9cbi8vXG4vL1xuIH1cbmNvbnN0IHJlc3VsdD1hcHBseShmbixyZWNpcGllbnQsYXJncyk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjNj19vbmNlLmxvY2FsQXBwbHlNZXRob2QobG9jYWxBcHBseU1ldGhvZCk7XG5cbmNvbnN0ICAgICAgICBsb2NhbEdldD0odCxrZXkpPT50W2tleV07JGjNj19vbmNlLmxvY2FsR2V0KGxvY2FsR2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImxvY2FsQXBwbHlGdW5jdGlvbiI6WyJsb2NhbEFwcGx5RnVuY3Rpb24iXSwibG9jYWxBcHBseU1ldGhvZCI6WyJsb2NhbEFwcGx5TWV0aG9kIl0sImxvY2FsR2V0IjpbImxvY2FsR2V0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAGOcEzpDAAA6QwAADUAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuOC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRFbnZpcm9ubWVudE9wdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLCBbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dXSk7ICAgXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtoYXNPd24sZnJlZXplLGVudHJpZXN9PU9iamVjdDtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuLypcblxuXG5cblxuXG4gKi9cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgaXNKU09OUmVjb3JkPSh2YWwpPT5cbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmdmFsIT09bnVsbCYmIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2ltcGxpZnlUYWc9KHRhZyk9PntcbmZvcihjb25zdCBwcmVmaXggb2ZbJ0FsbGVnZWQ6ICcsJ0RlYnVnTmFtZTogJ10pe1xuaWYodGFnLnN0YXJ0c1dpdGgocHJlZml4KSl7XG5yZXR1cm4gdGFnLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuIH1cbiB9XG5yZXR1cm4gdGFnO1xuIH07XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyPShvcHRpb25OYW1lKT0+e1xubGV0IGJyZWFrcG9pbnRzPUpTT04ucGFyc2UoZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwnbnVsbCcpKTtcblxuaWYoYnJlYWtwb2ludHM9PT1udWxsKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBicmVha3BvaW50c1RhYmxlO1xuXG5jb25zdCBnZXRCcmVha3BvaW50cz0oKT0+YnJlYWtwb2ludHM7XG5mcmVlemUoZ2V0QnJlYWtwb2ludHMpO1xuXG5jb25zdCBzZXRCcmVha3BvaW50cz0obmV3QnJlYWtwb2ludHM9YnJlYWtwb2ludHMpPT57XG5pc0pTT05SZWNvcmQobmV3QnJlYWtwb2ludHMpfHxcbkZhaWwgYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uIHRvIGJlIGEgSlNPTiBicmVha3BvaW50cyByZWNvcmRgO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG5jb25zdCBuZXdCcmVha3BvaW50c1RhYmxlPXtfX3Byb3RvX186bnVsbH07XG5cbmZvcihjb25zdFt0YWcsbWV0aG9kQlBzXW9mIGVudHJpZXMobmV3QnJlYWtwb2ludHMpKXtcbnRhZz09PXNpbXBsaWZ5VGFnKHRhZyl8fFxuRmFpbCBgSnVzdCB1c2Ugc2ltcGxlIHRhZyAke3Eoc2ltcGxpZnlUYWcodGFnKSl9IHJhdGhlciB0aGFuICR7cSh0YWcpfWA7XG5pc0pTT05SZWNvcmQobWV0aG9kQlBzKXx8XG5GYWlsIGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cShcbnRhZylcbiB9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5mb3IoY29uc3RbbWV0aG9kTmFtZSxjb3VudF1vZiBlbnRyaWVzKG1ldGhvZEJQcykpe1xuY291bnQ9PT0nKid8fFxudHlwZW9mIGNvdW50PT09J251bWJlcicmJlxuTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpJiZcbmNvdW50Pj0wfHxcbkZhaWwgYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKHRhZyl9LiR7cShcbm1ldGhvZE5hbWUpXG4gfSB0byBiZSBcIipcIiBvciBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYDtcblxuY29uc3QgY2xhc3NCUHM9aGFzT3duKG5ld0JyZWFrcG9pbnRzVGFibGUsbWV0aG9kTmFtZSk/XG5uZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdOlxubmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXT17XG4vL1xuX19wcm90b19fOm51bGx9O1xuXG5jbGFzc0JQc1t0YWddPWNvdW50O1xuIH1cbiB9XG5icmVha3BvaW50cz1uZXdCcmVha3BvaW50cztcbmJyZWFrcG9pbnRzVGFibGU9bmV3QnJlYWtwb2ludHNUYWJsZTtcbiB9O1xuZnJlZXplKHNldEJyZWFrcG9pbnRzKTtcblxuY29uc3Qgc2hvdWxkQnJlYWtwb2ludD0ocmVjaXBpZW50LG1ldGhvZE5hbWUpPT57XG5pZihtZXRob2ROYW1lPT09dW5kZWZpbmVkfHxtZXRob2ROYW1lPT09bnVsbCl7XG4vL1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IGNsYXNzQlBzPWJyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV18fGJyZWFrcG9pbnRzVGFibGVbJyonXTtcbmlmKGNsYXNzQlBzPT09dW5kZWZpbmVkKXtcbnJldHVybiBmYWxzZTtcbiB9XG5sZXQgdGFnPXNpbXBsaWZ5VGFnKHJlY2lwaWVudFtTeW1ib2wudG9TdHJpbmdUYWddKTtcbmxldCBjb3VudD1jbGFzc0JQc1t0YWddO1xuaWYoY291bnQ9PT11bmRlZmluZWQpe1xudGFnPScqJztcbmNvdW50PWNsYXNzQlBzW3RhZ107XG5pZihjb3VudD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbmlmKGNvdW50PT09JyonKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNvdW50PT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5hc3NlcnQodHlwZW9mIGNvdW50PT09J251bWJlcicmJmNvdW50Pj0xKTtcbmNsYXNzQlBzW3RhZ109Y291bnQtMTtcbnJldHVybiBmYWxzZTtcbiB9O1xuZnJlZXplKHNob3VsZEJyZWFrcG9pbnQpO1xuXG5jb25zdCBicmVha3BvaW50VGVzdGVyPWZyZWV6ZSh7XG5nZXRCcmVha3BvaW50cyxcbnNldEJyZWFrcG9pbnRzLFxuc2hvdWxkQnJlYWtwb2ludH0pO1xuXG5icmVha3BvaW50VGVzdGVyLnNldEJyZWFrcG9pbnRzKCk7XG5yZXR1cm4gYnJlYWtwb2ludFRlc3RlcjtcbiB9OyRozY9fb25jZS5tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbmZyZWV6ZShtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAZbLtFMwMAADMDAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjgvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZUU7JGjNj19pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRozY9fYSA9PiAobWFrZUUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7ICAgXG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBocD1IYW5kbGVkUHJvbWlzZTskaM2PX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoaHApOyRozY9fb25jZS5FKEUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSGFuZGxlZFByb21pc2UiOlsiaHAiXSwiRSI6WyJFIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIaopsdfCQAAXwkAAC0AAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuOC9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJ0cmFja1R1cm5zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIiwgWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV0sW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLCBbJGjNj19hID0+IChlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybj0wO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudD0wO1xuXG4vL1xuY29uc3QgVkVSQk9TRT1lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsJ3RyYWNrLXR1cm5zJyk7XG5cbi8vXG4vL1xuY29uc3QgRU5BQkxFRD1cbmdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsJ2Rpc2FibGVkJyxbJ2VuYWJsZWQnXSk9PT0nZW5hYmxlZCc7XG5cbi8vXG4vL1xuLy9cbi8vXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUocmVhc29uLGRldGFpbHNOb3RlKTtcbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcscmVhc29uKTtcbiB9XG4gfTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uPVxuKGZ1bmMsc2VuZGluZ0Vycm9yLFgpPT5cbiguLi5hcmdzKT0+e1xuaGlkZGVuUHJpb3JFcnJvcj1zZW5kaW5nRXJyb3I7XG5oaWRkZW5DdXJyZW50VHVybis9MTtcbmhpZGRlbkN1cnJlbnRFdmVudD0wO1xudHJ5e1xubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xuaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xuZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShcbmVycixcblggYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJyxlcnIpO1xuIH1cbnRocm93IGVycjtcbiB9XG4vL1xuY29uc3QgZGV0YWlsc05vdGU9WCBgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcblByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbnJldHVybiByZXN1bHQ7XG4gfWZpbmFsbHl7XG5oaWRkZW5QcmlvckVycm9yPXVuZGVmaW5lZDtcbiB9XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgdHJhY2tUdXJucz0oZnVuY3MpPT57XG5pZighRU5BQkxFRHx8dHlwZW9mIGdsb2JhbFRoaXM9PT0ndW5kZWZpbmVkJ3x8IWdsb2JhbFRoaXMuYXNzZXJ0KXtcbnJldHVybiBmdW5jcztcbiB9XG5jb25zdHtkZXRhaWxzOlgsbm90ZTphbm5vdGF0ZUVycm9yfT1nbG9iYWxUaGlzLmFzc2VydDtcblxuaGlkZGVuQ3VycmVudEV2ZW50Kz0xO1xuY29uc3Qgc2VuZGluZ0Vycm9yPUVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYW5ub3RhdGVFcnJvcihzZW5kaW5nRXJyb3IsWCBgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gfVxuXG5yZXR1cm4gKC8qICAgICAgICAgICAgKi9cbmZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSkpO1xuXG4gfTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP/DnOlYCAABWAgAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi44L3V0aWxzLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2xvY2FsLmpzIiwiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2xvY2FsLmpzXCIsIFtdXSxbXCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvbG9jYWwuanMiOltbImdldE1ldGhvZE5hbWVzIiwiZ2V0TWV0aG9kTmFtZXMiXV0sIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOltbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciIsIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsVg2mFICAABSAgAAGQAAAEBlbmRvL2V4by12MS41LjcvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9leG8tbWFrZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2V4by1tYWtlcnMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6W1siR0VUX0lOVEVSRkFDRV9HVUFSRCIsIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD6B373XFAAA1xQAACIAAABAZW5kby9leG8tdjEuNS43L3NyYy9leG8tbWFrZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiLCIuL2V4by10b29scy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3NLaXQiLCJpbml0RW1wdHkiLCJtYWtlRXhvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IG9iamVjdE1hcCxlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLEZhaWwscSxkZWZlbmRQcm90b3R5cGUsZGVmZW5kUHJvdG90eXBlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLCBbJGjNj19hID0+IChlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9leG8tdG9vbHMuanNcIiwgW1tcImRlZmVuZFByb3RvdHlwZVwiLCBbJGjNj19hID0+IChkZWZlbmRQcm90b3R5cGUgPSAkaM2PX2EpXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsIFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZUtpdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLypcblxuICovXG5cbmNvbnN0e2NyZWF0ZSxzZWFsLGZyZWV6ZSxkZWZpbmVQcm9wZXJ0eSx2YWx1ZXN9PU9iamVjdDtcblxuLy9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUz1lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsJ2xhYmVsLWluc3RhbmNlcycpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VTZWxmPShwcm90byxpbnN0YW5jZUNvdW50KT0+e1xuY29uc3Qgc2VsZj1jcmVhdGUocHJvdG8pO1xuaWYoTEFCRUxfSU5TVEFOQ0VTKXtcbmRlZmluZVByb3BlcnR5KHNlbGYsU3ltYm9sLnRvU3RyaW5nVGFnLHtcbnZhbHVlOiBgJHtwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddfSMke2luc3RhbmNlQ291bnR9YCxcbndyaXRhYmxlOmZhbHNlLFxuZW51bWVyYWJsZTpmYWxzZSxcbmNvbmZpZ3VyYWJsZTpmYWxzZX0pO1xuXG4gfVxucmV0dXJuIGhhcmRlbihzZWxmKTtcbiB9O1xuXG5jb25zdCBlbXB0eVJlY29yZD1oYXJkZW4oe30pO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpbml0RW1wdHk9KCk9PmVtcHR5UmVjb3JkO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5pbml0RW1wdHkoaW5pdEVtcHR5KTtcbmNvbnN0ICAgICAgICBkZWZpbmVFeG9DbGFzcz0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz17fSk9Plxue1xuaGFyZGVuKG1ldGhvZHMpO1xuY29uc3R7XG5maW5pc2g9dW5kZWZpbmVkLFxucmVjZWl2ZUFtcGxpZmllcj11bmRlZmluZWQsXG5yZWNlaXZlSW5zdGFuY2VUZXN0ZXI9dW5kZWZpbmVkfT1cbm9wdGlvbnM7XG5yZWNlaXZlQW1wbGlmaWVyPT09dW5kZWZpbmVkfHxcbkZhaWwgYE9ubHkgZmFjZXRzIG9mIGFuIGV4byBjbGFzcyBraXQgY2FuIGJlIGFtcGxpZmllZCAke3EodGFnKX1gO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvbnRleHRNYXA9bmV3IFdlYWtNYXAoKTtcbmNvbnN0IHByb3RvPWRlZmVuZFByb3RvdHlwZShcbnRhZyxcbihzZWxmKT0+LyogICAgICAgICAgICAgICovY29udGV4dE1hcC5nZXQoc2VsZiksXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkKTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qXG5cbiAgICovXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbmluc3RhbmNlQ291bnQrPTE7XG5jb25zdCBzZWxmPW1ha2VTZWxmKHByb3RvLGluc3RhbmNlQ291bnQpO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvbnRleHQ9ZnJlZXplKHtzdGF0ZSxzZWxmfSk7XG5jb250ZXh0TWFwLnNldChzZWxmLGNvbnRleHQpO1xuaWYoZmluaXNoKXtcbmZpbmlzaChjb250ZXh0KTtcbiB9XG5yZXR1cm4gc2VsZjtcbiB9O1xuXG5pZihyZWNlaXZlSW5zdGFuY2VUZXN0ZXIpe1xuLyogICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaXNJbnN0YW5jZT0oZXhvLGZhY2V0TmFtZT11bmRlZmluZWQpPT57XG5mYWNldE5hbWU9PT11bmRlZmluZWR8fFxuRmFpbCBgZmFjZXROYW1lIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhbiBleG8gY2xhc3Mga2l0OiAke3EoXG50YWcpXG4gfSBoYXMgbm8gZmFjZXQgJHtxKGZhY2V0TmFtZSl9YDtcbnJldHVybiBjb250ZXh0TWFwLmhhcyhleG8pO1xuIH07XG5oYXJkZW4oaXNJbnN0YW5jZSk7XG5yZWNlaXZlSW5zdGFuY2VUZXN0ZXIoaXNJbnN0YW5jZSk7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG4gfTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3MoZGVmaW5lRXhvQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVFeG9DbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5tZXRob2RzS2l0LFxub3B0aW9ucz17fSk9Plxue1xuaGFyZGVuKG1ldGhvZHNLaXQpO1xuY29uc3R7XG5maW5pc2g9dW5kZWZpbmVkLFxucmVjZWl2ZUFtcGxpZmllcj11bmRlZmluZWQsXG5yZWNlaXZlSW5zdGFuY2VUZXN0ZXI9dW5kZWZpbmVkfT1cbm9wdGlvbnM7XG5jb25zdCBjb250ZXh0TWFwS2l0PW9iamVjdE1hcChtZXRob2RzS2l0LCgpPT5uZXcgV2Vha01hcCgpKTtcbmNvbnN0IGdldENvbnRleHRLaXQ9b2JqZWN0TWFwKFxuY29udGV4dE1hcEtpdCxcbihjb250ZXh0TWFwKT0+KGZhY2V0KT0+Y29udGV4dE1hcC5nZXQoZmFjZXQpKTtcblxuY29uc3QgcHJvdG90eXBlS2l0PWRlZmVuZFByb3RvdHlwZUtpdChcbnRhZyxcbmdldENvbnRleHRLaXQsXG5tZXRob2RzS2l0LFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0KTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qXG5cbiAgICovXG5jb25zdCBtYWtlSW5zdGFuY2VLaXQ9KC4uLmFyZ3MpPT57XG4vL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb250ZXh0PXtzdGF0ZSxmYWNldHM6bnVsbH07XG5pbnN0YW5jZUNvdW50Kz0xO1xuY29uc3QgZmFjZXRzPW9iamVjdE1hcChwcm90b3R5cGVLaXQsKHByb3RvLGZhY2V0TmFtZSk9PntcbmNvbnN0IHNlbGY9bWFrZVNlbGYocHJvdG8saW5zdGFuY2VDb3VudCk7XG5jb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0uc2V0KHNlbGYsY29udGV4dCk7XG5yZXR1cm4gc2VsZjtcbiB9KTtcbmNvbnRleHQuZmFjZXRzPWZhY2V0cztcbi8vXG5mcmVlemUoY29udGV4dCk7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbnJldHVybiAoLyogICAgICAgICAgICAgICAgICAgICAgICAqL2NvbnRleHQuZmFjZXRzKTtcbiB9O1xuXG5pZihyZWNlaXZlQW1wbGlmaWVyKXtcbi8qICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGFtcGxpZnk9KGV4b0ZhY2V0KT0+e1xuZm9yKGNvbnN0IGNvbnRleHRNYXAgb2YgdmFsdWVzKGNvbnRleHRNYXBLaXQpKXtcbmlmKGNvbnRleHRNYXAuaGFzKGV4b0ZhY2V0KSl7XG5jb25zdHtmYWNldHN9PWNvbnRleHRNYXAuZ2V0KGV4b0ZhY2V0KTtcbnJldHVybiBmYWNldHM7XG4gfVxuIH1cbnRocm93IEZhaWwgYE11c3QgYmUgYSBmYWNldCBvZiAke3EodGFnKX06ICR7ZXhvRmFjZXR9YDtcbiB9O1xuaGFyZGVuKGFtcGxpZnkpO1xucmVjZWl2ZUFtcGxpZmllcihhbXBsaWZ5KTtcbiB9XG5cbmlmKHJlY2VpdmVJbnN0YW5jZVRlc3Rlcil7XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpc0luc3RhbmNlPShleG9GYWNldCxmYWNldE5hbWU9dW5kZWZpbmVkKT0+e1xuaWYoZmFjZXROYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiB2YWx1ZXMoY29udGV4dE1hcEtpdCkuc29tZSgoY29udGV4dE1hcCk9PlxuY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpKTtcblxuIH1cbmFzc2VydC50eXBlb2YoZmFjZXROYW1lLCdzdHJpbmcnKTtcbmNvbnN0IGNvbnRleHRNYXA9Y29udGV4dE1hcEtpdFtmYWNldE5hbWVdO1xuY29udGV4dE1hcCE9PXVuZGVmaW5lZHx8XG5GYWlsIGBleG8gY2xhc3Mga2l0ICR7cSh0YWcpfSBoYXMgbm8gZmFjZXQgbmFtZWQgJHtxKGZhY2V0TmFtZSl9YDtcbnJldHVybiBjb250ZXh0TWFwLmhhcyhleG9GYWNldCk7XG4gfTtcbmhhcmRlbihpc0luc3RhbmNlKTtcbnJlY2VpdmVJbnN0YW5jZVRlc3Rlcihpc0luc3RhbmNlKTtcbiB9XG5cbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbiB9OyRozY9fb25jZS5kZWZpbmVFeG9DbGFzc0tpdChkZWZpbmVFeG9DbGFzc0tpdCk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3NLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFeG89KHRhZyxpbnRlcmZhY2VHdWFyZCxtZXRob2RzLG9wdGlvbnM9dW5kZWZpbmVkKT0+e1xuY29uc3QgbWFrZUluc3RhbmNlPWRlZmluZUV4b0NsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbnJldHVybiBtYWtlSW5zdGFuY2UoKTtcbiB9OyRozY9fb25jZS5tYWtlRXhvKG1ha2VFeG8pO1xuaGFyZGVuKG1ha2VFeG8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVFeG9DbGFzcyI6WyJkZWZpbmVFeG9DbGFzcyJdLCJkZWZpbmVFeG9DbGFzc0tpdCI6WyJkZWZpbmVFeG9DbGFzc0tpdCJdLCJtYWtlRXhvIjpbIm1ha2VFeG8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAzu5bBuYvAADmLwAAIQAAAEBlbmRvL2V4by12MS41Ljcvc3JjL2V4by10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2ZhciIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9nZXQtaW50ZXJmYWNlLmpzIl0sImV4cG9ydHMiOlsiZGVmZW5kUHJvdG90eXBlIiwiZGVmZW5kUHJvdG90eXBlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldE1ldGhvZE5hbWVzLGhhc093blByb3BlcnR5T2YsdG9UaHJvd2FibGUsRSxGYXIsbXVzdE1hdGNoLE0saXNBd2FpdEFyZ0d1YXJkLGlzUmF3R3VhcmQsZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQsZ2V0TWV0aG9kR3VhcmRQYXlsb2FkLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCxnZXRDb3B5TWFwRW50cmllcyxsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAscSxGYWlsLEdFVF9JTlRFUkZBQ0VfR1VBUkQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLCBbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImhhc093blByb3BlcnR5T2ZcIiwgWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJ0b1Rocm93YWJsZVwiLCBbJGjNj19hID0+ICh0b1Rocm93YWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsIFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiaXNBd2FpdEFyZ0d1YXJkXCIsIFskaM2PX2EgPT4gKGlzQXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJpc1Jhd0d1YXJkXCIsIFskaM2PX2EgPT4gKGlzUmF3R3VhcmQgPSAkaM2PX2EpXV0sW1wiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWRcIiwgWyRozY9fYSA9PiAoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkXCIsIFskaM2PX2EgPT4gKGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIiwgWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyaWVzXCIsIFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIiwgWyRozY9fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsIFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vZ2V0LWludGVyZmFjZS5qc1wiLCBbW1wiR0VUX0lOVEVSRkFDRV9HVUFSRFwiLCBbJGjNj19hID0+IChHRVRfSU5URVJGQUNFX0dVQVJEID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdHthcHBseSxvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZGVmaW5lUHJvcGVydGllcyxmcm9tRW50cmllc309T2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgUmF3TWV0aG9kR3VhcmQ9TS5jYWxsKCkucmVzdChNLnJhdygpKS5yZXR1cm5zKE0ucmF3KCkpO1xuXG5jb25zdCBSRURBQ1RFRF9SQVdfQVJHPSc8cmVkYWN0ZWQgcmF3IGFyZz4nO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgUGFzc2FibGVNZXRob2RHdWFyZD1NLmNhbGwoKS5yZXN0KE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVmZW5kU3luY0FyZ3M9KHN5bmNBcmdzLG1hdGNoQ29uZmlnLGxhYmVsPXVuZGVmaW5lZCk9PntcbmNvbnN0e1xuZGVjbGFyZWRMZW4sXG5oYXNSZXN0QXJnR3VhcmQsXG5yZXN0QXJnR3VhcmRJc1JhdyxcbnBhcmFtc1BhdHRlcm4sXG5yZWRhY3RlZEluZGljZXN9PVxubWF0Y2hDb25maWc7XG5cbi8vXG4vL1xubGV0IG1hdGNoYWJsZUFyZ3M9c3luY0FyZ3M7XG5pZihyZXN0QXJnR3VhcmRJc1JhdyYmc3luY0FyZ3MubGVuZ3RoPmRlY2xhcmVkTGVuKXtcbmNvbnN0IHJlc3RMZW49c3luY0FyZ3MubGVuZ3RoLWRlY2xhcmVkTGVuO1xuY29uc3QgcmVkYWN0ZWRSZXN0PUFycmF5KHJlc3RMZW4pLmZpbGwoUkVEQUNURURfUkFXX0FSRyk7XG5tYXRjaGFibGVBcmdzPVsuLi5zeW5jQXJncy5zbGljZSgwLGRlY2xhcmVkTGVuKSwuLi5yZWRhY3RlZFJlc3RdO1xuIH1lbHNlIGlmKFxucmVkYWN0ZWRJbmRpY2VzLmxlbmd0aD4wJiZcbnJlZGFjdGVkSW5kaWNlc1swXTxzeW5jQXJncy5sZW5ndGgpXG57XG4vL1xuLy9cbm1hdGNoYWJsZUFyZ3M9Wy4uLnN5bmNBcmdzXTtcbiB9XG5cbmZvcihjb25zdCBpIG9mIHJlZGFjdGVkSW5kaWNlcyl7XG5pZihpPj1tYXRjaGFibGVBcmdzLmxlbmd0aCl7XG5icmVhaztcbiB9XG5tYXRjaGFibGVBcmdzW2ldPVJFREFDVEVEX1JBV19BUkc7XG4gfVxuXG5tdXN0TWF0Y2goaGFyZGVuKG1hdGNoYWJsZUFyZ3MpLHBhcmFtc1BhdHRlcm4sbGFiZWwpO1xuXG5pZihoYXNSZXN0QXJnR3VhcmQpe1xucmV0dXJuIHN5bmNBcmdzO1xuIH1cbnN5bmNBcmdzLmxlbmd0aDw9ZGVjbGFyZWRMZW58fFxuRmFpbCBgJHtxKGxhYmVsKX0gYWNjZXB0cyBhdCBtb3N0ICR7cShkZWNsYXJlZExlbil9IGFyZ3VtZW50cywgbm90ICR7cShcbnN5bmNBcmdzLmxlbmd0aClcbiB9OiAke3N5bmNBcmdzfWA7XG5yZXR1cm4gc3luY0FyZ3M7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBidWlsZE1hdGNoQ29uZmlnPShtZXRob2RHdWFyZFBheWxvYWQpPT57XG5jb25zdHtcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzPVtdLFxucmVzdEFyZ0d1YXJkfT1cbm1ldGhvZEd1YXJkUGF5bG9hZDtcblxuY29uc3QgbWF0Y2hhYmxlQXJnR3VhcmRzPVsuLi5hcmdHdWFyZHMsLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG5jb25zdCByZWRhY3RlZEluZGljZXM9W107XG5mb3IobGV0IGk9MDtpPG1hdGNoYWJsZUFyZ0d1YXJkcy5sZW5ndGg7aSs9MSl7XG5pZihpc1Jhd0d1YXJkKG1hdGNoYWJsZUFyZ0d1YXJkc1tpXSkpe1xubWF0Y2hhYmxlQXJnR3VhcmRzW2ldPVJFREFDVEVEX1JBV19BUkc7XG5yZWRhY3RlZEluZGljZXMucHVzaChpKTtcbiB9XG4gfVxuXG4vL1xubGV0IG1hdGNoYWJsZVJlc3RBcmdHdWFyZD1yZXN0QXJnR3VhcmQ7XG5pZihpc1Jhd0d1YXJkKG1hdGNoYWJsZVJlc3RBcmdHdWFyZCkpe1xubWF0Y2hhYmxlUmVzdEFyZ0d1YXJkPU0uYXJyYXlPZihSRURBQ1RFRF9SQVdfQVJHKTtcbiB9XG5jb25zdCBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQ9aGFyZGVuKHtcbi4uLm1ldGhvZEd1YXJkUGF5bG9hZCxcbmFyZ0d1YXJkczptYXRjaGFibGVBcmdHdWFyZHMuc2xpY2UoMCxhcmdHdWFyZHMubGVuZ3RoKSxcbm9wdGlvbmFsQXJnR3VhcmRzOm1hdGNoYWJsZUFyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbnJlc3RBcmdHdWFyZDptYXRjaGFibGVSZXN0QXJnR3VhcmR9KTtcblxuXG5jb25zdCBwYXJhbXNQYXR0ZXJuPU0uc3BsaXRBcnJheShcbm1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5hcmdHdWFyZHMsXG5tYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQub3B0aW9uYWxBcmdHdWFyZHMsXG5tYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQucmVzdEFyZ0d1YXJkKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmRlY2xhcmVkTGVuOm1hdGNoYWJsZUFyZ0d1YXJkcy5sZW5ndGgsXG5oYXNSZXN0QXJnR3VhcmQ6cmVzdEFyZ0d1YXJkIT09dW5kZWZpbmVkLFxucmVzdEFyZ0d1YXJkSXNSYXc6cmVzdEFyZ0d1YXJkIT09bWF0Y2hhYmxlUmVzdEFyZ0d1YXJkLFxucGFyYW1zUGF0dGVybixcbnJlZGFjdGVkSW5kaWNlcyxcbm1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZH0pO1xuXG4gfTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNNZXRob2Q9KFxuZ2V0Q29udGV4dCxcbmJlaGF2aW9yTWV0aG9kLFxubWV0aG9kR3VhcmRQYXlsb2FkLFxubGFiZWwpPT5cbntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZFBheWxvYWQ7XG5jb25zdCBpc1Jhd1JldHVybj1pc1Jhd0d1YXJkKHJldHVybkd1YXJkKTtcbmNvbnN0IG1hdGNoQ29uZmlnPWJ1aWxkTWF0Y2hDb25maWcobWV0aG9kR3VhcmRQYXlsb2FkKTtcbmNvbnN0e3N5bmNNZXRob2R9PXtcbi8vXG5zeW5jTWV0aG9kKC4uLnN5bmNBcmdzKXtcbnRyeXtcbmNvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCh0aGlzKTtcbi8vXG5jb25zdCByZWFsQXJncz1kZWZlbmRTeW5jQXJncyhzeW5jQXJncyxtYXRjaENvbmZpZyxsYWJlbCk7XG5jb25zdCByZXN1bHQ9YXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxyZWFsQXJncyk7XG5pZighaXNSYXdSZXR1cm4pe1xubXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfWNhdGNoKHRocm93blRoaW5nKXtcbnRocm93IHRvVGhyb3dhYmxlKHRocm93blRoaW5nKTtcbiB9XG4gfX07XG5cbnJldHVybiBzeW5jTWV0aG9kO1xuIH07XG5cbi8qXG5cbiAqL1xuY29uc3QgZGVzeW5jPShtZXRob2RHdWFyZFBheWxvYWQpPT57XG5jb25zdHtcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzPVtdLFxucmVzdEFyZ0d1YXJkfT1cbm1ldGhvZEd1YXJkUGF5bG9hZDtcbiFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKXx8XG5GYWlsIGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuY29uc3QgcmF3QXJnR3VhcmRzPVsuLi5hcmdHdWFyZHMsLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG5jb25zdCBhd2FpdEluZGV4ZXM9W107XG5mb3IobGV0IGk9MDtpPHJhd0FyZ0d1YXJkcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBhcmdHdWFyZD1yYXdBcmdHdWFyZHNbaV07XG5pZihpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKXtcbnJhd0FyZ0d1YXJkc1tpXT1nZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChhcmdHdWFyZCkuYXJnR3VhcmQ7XG5hd2FpdEluZGV4ZXMucHVzaChpKTtcbiB9XG4gfVxucmV0dXJue1xuYXdhaXRJbmRleGVzLFxucmF3TWV0aG9kR3VhcmRQYXlsb2FkOntcbi4uLm1ldGhvZEd1YXJkUGF5bG9hZCxcbmFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoMCxhcmdHdWFyZHMubGVuZ3RoKSxcbm9wdGlvbmFsQXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKX19O1xuXG5cbiB9O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlZmVuZEFzeW5jTWV0aG9kPShcbmdldENvbnRleHQsXG5iZWhhdmlvck1ldGhvZCxcbm1ldGhvZEd1YXJkUGF5bG9hZCxcbmxhYmVsKT0+XG57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmRQYXlsb2FkO1xuY29uc3QgaXNSYXdSZXR1cm49aXNSYXdHdWFyZChyZXR1cm5HdWFyZCk7XG5cbmNvbnN0e2F3YWl0SW5kZXhlcyxyYXdNZXRob2RHdWFyZFBheWxvYWR9PWRlc3luYyhtZXRob2RHdWFyZFBheWxvYWQpO1xuY29uc3QgbWF0Y2hDb25maWc9YnVpbGRNYXRjaENvbmZpZyhyYXdNZXRob2RHdWFyZFBheWxvYWQpO1xuXG5jb25zdHthc3luY01ldGhvZH09e1xuLy9cbmFzeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgYXdhaXRMaXN0PVtdO1xuZm9yKGNvbnN0IGkgb2YgYXdhaXRJbmRleGVzKXtcbmlmKGk+PWFyZ3MubGVuZ3RoKXtcbmJyZWFrO1xuIH1cbmF3YWl0TGlzdC5wdXNoKGFyZ3NbaV0pO1xuIH1cbmNvbnN0IHA9UHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbmNvbnN0IHN5bmNBcmdzPVsuLi5hcmdzXTtcbmNvbnN0IHJlc3VsdFA9RS53aGVuKFxucCxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhhd2FpdGVkQXJncyk9PntcbmZvcihsZXQgaj0wO2o8YXdhaXRlZEFyZ3MubGVuZ3RoO2orPTEpe1xuc3luY0FyZ3NbYXdhaXRJbmRleGVzW2pdXT1hd2FpdGVkQXJnc1tqXTtcbiB9XG4vL1xuLy9cbmNvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCh0aGlzKTtcbmNvbnN0IHJlYWxBcmdzPWRlZmVuZFN5bmNBcmdzKHN5bmNBcmdzLG1hdGNoQ29uZmlnLGxhYmVsKTtcbnJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCxjb250ZXh0LHJlYWxBcmdzKTtcbiB9KTtcblxucmV0dXJuIEUud2hlbihyZXN1bHRQLChmdWxmaWxsbWVudCk9PntcbmlmKCFpc1Jhd1JldHVybil7XG5tdXN0TWF0Y2goaGFyZGVuKGZ1bGZpbGxtZW50KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbiB9XG5yZXR1cm4gZnVsZmlsbG1lbnQ7XG4gfSkuY2F0Y2goKHJlYXNvbik9PlxuLy9cbi8vXG5Qcm9taXNlLnJlamVjdCh0b1Rocm93YWJsZShyZWFzb24pKSk7XG5cbiB9fTtcblxucmV0dXJuIGFzeW5jTWV0aG9kO1xuIH07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBkZWZlbmRNZXRob2Q9KGdldENvbnRleHQsYmVoYXZpb3JNZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdCBtZXRob2RHdWFyZFBheWxvYWQ9Z2V0TWV0aG9kR3VhcmRQYXlsb2FkKG1ldGhvZEd1YXJkKTtcbmNvbnN0e2NhbGxLaW5kfT1tZXRob2RHdWFyZFBheWxvYWQ7XG5pZihjYWxsS2luZD09PSdzeW5jJyl7XG5yZXR1cm4gZGVmZW5kU3luY01ldGhvZChcbmdldENvbnRleHQsXG5iZWhhdmlvck1ldGhvZCxcbm1ldGhvZEd1YXJkUGF5bG9hZCxcbmxhYmVsKTtcblxuIH1lbHNle1xuYXNzZXJ0KGNhbGxLaW5kPT09J2FzeW5jJyk7XG5yZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QoXG5nZXRDb250ZXh0LFxuYmVoYXZpb3JNZXRob2QsXG5tZXRob2RHdWFyZFBheWxvYWQsXG5sYWJlbCk7XG5cbiB9XG4gfTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kLFxubWV0aG9kR3VhcmQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbi8qXG5cblxuICAgKi9cbmNvbnN0IGdldENvbnRleHQ9KHJlcHJlc2VudGF0aXZlKT0+e1xucmVwcmVzZW50YXRpdmV8fFxuLy9cbkZhaWwgYE1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG5jb25zdCBjb250ZXh0PWNvbnRleHRQcm92aWRlcihyZXByZXNlbnRhdGl2ZSk7XG5pZihjb250ZXh0PT09dW5kZWZpbmVkKXtcbnRocm93IEZhaWwgYCR7cShcbm1ldGhvZFRhZylcbiB9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtyZXByZXNlbnRhdGl2ZX1gO1xuIH1cbnJldHVybiBjb250ZXh0O1xuIH07XG5cbmNvbnN0IG1ldGhvZD1kZWZlbmRNZXRob2QoXG5nZXRDb250ZXh0LFxuYmVoYXZpb3JNZXRob2QsXG5tZXRob2RHdWFyZCxcbm1ldGhvZFRhZyk7XG5cblxuZGVmaW5lUHJvcGVydGllcyhtZXRob2Qse1xubmFtZTp7dmFsdWU6bWV0aG9kVGFnfSxcbmxlbmd0aDp7dmFsdWU6YmVoYXZpb3JNZXRob2QubGVuZ3RofX0pO1xuXG5yZXR1cm4gbWV0aG9kO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGU9KFxudGFnLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZD11bmRlZmluZWQpPT5cbntcbmNvbnN0IHByb3RvdHlwZT17fTtcbmNvbnN0IG1ldGhvZE5hbWVzPWdldE1ldGhvZE5hbWVzKGJlaGF2aW9yTWV0aG9kcykuZmlsdGVyKFxuLy9cbi8vXG4oa2V5KT0+e1xuaWYoa2V5IT09J2NvbnN0cnVjdG9yJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCBjb25zdHJ1Y3Rvcj1iZWhhdmlvck1ldGhvZHMuY29uc3RydWN0b3I7XG5yZXR1cm4hKFxuY29uc3RydWN0b3IucHJvdG90eXBlJiZcbmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj09PWNvbnN0cnVjdG9yKTtcblxuIH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IG1ldGhvZEd1YXJkcztcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgZGVmYXVsdEd1YXJkcztcbmlmKGludGVyZmFjZUd1YXJkKXtcbmNvbnN0e1xuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczptZyxcbnN5bWJvbE1ldGhvZEd1YXJkcyxcbnNsb3BweSxcbmRlZmF1bHRHdWFyZHM6ZGc9c2xvcHB5PydwYXNzYWJsZSc6ZGVmYXVsdEd1YXJkc309XG5nZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoaW50ZXJmYWNlR3VhcmQpO1xubWV0aG9kR3VhcmRzPWhhcmRlbih7XG4uLi5tZyxcbi4uLihzeW1ib2xNZXRob2RHdWFyZHMmJlxuZnJvbUVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMoc3ltYm9sTWV0aG9kR3VhcmRzKSkpfSk7XG5cbmRlZmF1bHRHdWFyZHM9ZGc7XG57XG5jb25zdCBtZXRob2RHdWFyZE5hbWVzPW93bktleXMobWV0aG9kR3VhcmRzKTtcbmNvbnN0IHVuaW1wbGVtZW50ZWQ9bGlzdERpZmZlcmVuY2UobWV0aG9kR3VhcmROYW1lcyxtZXRob2ROYW1lcyk7XG51bmltcGxlbWVudGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5pbXBsZW1lbnRlZCl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuaWYoZGVmYXVsdEd1YXJkcz09PXVuZGVmaW5lZCl7XG5jb25zdCB1bmd1YXJkZWQ9bGlzdERpZmZlcmVuY2UobWV0aG9kTmFtZXMsbWV0aG9kR3VhcmROYW1lcyk7XG51bmd1YXJkZWQubGVuZ3RoPT09MHx8XG5GYWlsIGBtZXRob2RzICR7cSh1bmd1YXJkZWQpfSBub3QgZ3VhcmRlZCBieSAke3EoaW50ZXJmYWNlTmFtZSl9YDtcbiB9XG4gfVxuIH1cblxuZm9yKGNvbnN0IHByb3Agb2YgbWV0aG9kTmFtZXMpe1xuY29uc3Qgb3JpZ2luYWxNZXRob2Q9YmVoYXZpb3JNZXRob2RzW3Byb3BdO1xuY29uc3R7c2hpZnRlZE1ldGhvZH09e1xuc2hpZnRlZE1ldGhvZCguLi5hcmdzKXtcbnJldHVybiBvcmlnaW5hbE1ldGhvZCh0aGlzLC4uLmFyZ3MpO1xuIH19O1xuXG5jb25zdCBiZWhhdmlvck1ldGhvZD10aGlzZnVsTWV0aG9kcz9vcmlnaW5hbE1ldGhvZDpzaGlmdGVkTWV0aG9kO1xuLy9cbi8vXG5sZXQgbWV0aG9kR3VhcmQ9bWV0aG9kR3VhcmRzJiZtZXRob2RHdWFyZHNbcHJvcF07XG5pZighbWV0aG9kR3VhcmQpe1xuc3dpdGNoKGRlZmF1bHRHdWFyZHMpe1xuY2FzZSB1bmRlZmluZWQ6e1xuaWYodGhpc2Z1bE1ldGhvZHMpe1xubWV0aG9kR3VhcmQ9UGFzc2FibGVNZXRob2RHdWFyZDtcbiB9ZWxzZXtcbm1ldGhvZEd1YXJkPVJhd01ldGhvZEd1YXJkO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UncGFzc2FibGUnOntcbm1ldGhvZEd1YXJkPVBhc3NhYmxlTWV0aG9kR3VhcmQ7XG5icmVhaztcbiB9XG5jYXNlJ3Jhdyc6e1xubWV0aG9kR3VhcmQ9UmF3TWV0aG9kR3VhcmQ7XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBkZWZhdWx0R3VhcmRzICR7cShkZWZhdWx0R3VhcmRzKX1gO1xuIH19XG5cbiB9XG5wcm90b3R5cGVbcHJvcF09YmluZE1ldGhvZChcbiBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2QsXG5tZXRob2RHdWFyZCk7XG5cbiB9XG5cbmlmKCFoYXNPd25Qcm9wZXJ0eU9mKHByb3RvdHlwZSxHRVRfSU5URVJGQUNFX0dVQVJEKSl7XG5jb25zdCBnZXRJbnRlcmZhY2VHdWFyZE1ldGhvZD17XG5bR0VUX0lOVEVSRkFDRV9HVUFSRF0oKXtcbi8vXG5yZXR1cm4gaW50ZXJmYWNlR3VhcmQ7XG4gfX1bXG5HRVRfSU5URVJGQUNFX0dVQVJEXTtcbnByb3RvdHlwZVtHRVRfSU5URVJGQUNFX0dVQVJEXT1iaW5kTWV0aG9kKFxuIGBJbiAke3EoR0VUX0lOVEVSRkFDRV9HVUFSRCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG5jb250ZXh0UHJvdmlkZXIsXG5nZXRJbnRlcmZhY2VHdWFyZE1ldGhvZCxcblBhc3NhYmxlTWV0aG9kR3VhcmQpO1xuXG4gfVxuXG5yZXR1cm4gRmFyKFxudGFnLFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbnByb3RvdHlwZSk7XG5cblxuIH07JGjNj19vbmNlLmRlZmVuZFByb3RvdHlwZShkZWZlbmRQcm90b3R5cGUpO1xuaGFyZGVuKGRlZmVuZFByb3RvdHlwZSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGVLaXQ9KFxudGFnLFxuY29udGV4dFByb3ZpZGVyS2l0LFxuYmVoYXZpb3JNZXRob2RzS2l0LFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZEtpdD11bmRlZmluZWQpPT5cbntcbmNvbnN0IGZhY2V0TmFtZXM9b3duS2V5cyhiZWhhdmlvck1ldGhvZHNLaXQpLnNvcnQoKTtcbmZhY2V0TmFtZXMubGVuZ3RoPjF8fEZhaWwgYEEgbXVsdGktZmFjZXQgb2JqZWN0IG11c3QgaGF2ZSBtdWx0aXBsZSBmYWNldHNgO1xuaWYoaW50ZXJmYWNlR3VhcmRLaXQpe1xuY29uc3QgaW50ZXJmYWNlTmFtZXM9b3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG5jb25zdCBleHRyYUludGVyZmFjZU5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsaW50ZXJmYWNlTmFtZXMpO1xuZXh0cmFJbnRlcmZhY2VOYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEludGVyZmFjZXMgJHtxKGV4dHJhSW50ZXJmYWNlTmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmNvbnN0IGV4dHJhRmFjZXROYW1lcz1saXN0RGlmZmVyZW5jZShpbnRlcmZhY2VOYW1lcyxmYWNldE5hbWVzKTtcbmV4dHJhRmFjZXROYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG5vdCBndWFyZGVkIGJ5IGludGVyZmFjZXNgO1xuIH1cbmNvbnN0IGNvbnRleHRNYXBOYW1lcz1vd25LZXlzKGNvbnRleHRQcm92aWRlcktpdCk7XG5jb25zdCBleHRyYUNvbnRleHROYW1lcz1saXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLGNvbnRleHRNYXBOYW1lcyk7XG5leHRyYUNvbnRleHROYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYENvbnRleHRzICR7cShleHRyYUNvbnRleHROYW1lcyl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuY29uc3QgZXh0cmFGYWNldE5hbWVzPWxpc3REaWZmZXJlbmNlKGNvbnRleHRNYXBOYW1lcyxmYWNldE5hbWVzKTtcbmV4dHJhRmFjZXROYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG1pc3NpbmcgY29udGV4dHNgO1xuY29uc3QgcHJvdG9LaXQ9b2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwoYmVoYXZpb3JNZXRob2RzLGZhY2V0TmFtZSk9PlxuZGVmZW5kUHJvdG90eXBlKFxuIGAke3RhZ30gJHtTdHJpbmcoZmFjZXROYW1lKX1gLFxuY29udGV4dFByb3ZpZGVyS2l0W2ZhY2V0TmFtZV0sXG5iZWhhdmlvck1ldGhvZHMsXG50aGlzZnVsTWV0aG9kcyxcbmludGVyZmFjZUd1YXJkS2l0JiZpbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdKSk7XG5cblxucmV0dXJuIHByb3RvS2l0O1xuIH07JGjNj19vbmNlLmRlZmVuZFByb3RvdHlwZUtpdChkZWZlbmRQcm90b3R5cGVLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEaTPG42AgAANgIAACUAAABAZW5kby9leG8tdjEuNS43L3NyYy9nZXQtaW50ZXJmYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJHRVRfSU5URVJGQUNFX0dVQVJEIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICAvL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIEdFVF9JTlRFUkZBQ0VfR1VBUkQ9J19fZ2V0SW50ZXJmYWNlR3VhcmRfXyc7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5HRVRfSU5URVJGQUNFX0dVQVJEKEdFVF9JTlRFUkZBQ0VfR1VBUkQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiR0VUX0lOVEVSRkFDRV9HVUFSRCI6WyJHRVRfSU5URVJGQUNFX0dVQVJEIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAS6w5NKAQAASgEAAB0AAABAZW5kby9leG8tdjEuNS43L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAC0qYOFYCAABWAgAAHQAAAEBlbmRvL2Zhci12MS4xLjkvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiIsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGVuZG8vZXZlbnR1YWwtc2VuZCI6W1siRSIsIkUiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbIkZhciIsIkZhciJdLFsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdLFsicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuIFp8HQHAAB0BwAAHQAAAEBlbmRvL21hcnNoYWwtdjEuNi4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3NyYy9yYW5rT3JkZXIuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlUGFzc2FibGVLaXQiLCJtYWtlUGFzc2FibGVLaXQiXSxbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1sidHJpdmlhbENvbXBhcmF0b3IiLCJ0cml2aWFsQ29tcGFyYXRvciJdLFsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXSwiQGVuZG8vcGFzcy1zdHlsZSI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADXbFulWUMAAFlDAAAqAAAAQGVuZG8vbWFyc2hhbC12MS42LjIvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlUGFzc2FibGVLaXQiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixhc3NlcnRSZWNvcmQsaXNFcnJvckxpa2UsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxiLHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsIFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZnJvbUVudHJpZXMsaXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8vXG5jb25zdCByQzA9L1tcXHgwMC1cXHgxRl0vO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdldFN1ZmZpeD0oc3RyLGluZGV4KT0+aW5kZXg9PT0wP3N0cjpzdHIuc3Vic3RyaW5nKGluZGV4KTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgcmVjb3JkTmFtZXM9KHJlY29yZCk9PlxuLy9cbi8vXG4vL1xuLy9cbi8vXG5oYXJkZW4oLyogICAgICAgICAgICAgICAgICAgKi9vd25LZXlzKHJlY29yZCkuc29ydCgpLnJldmVyc2UoKSk7JGjNj19vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZFZhbHVlcz0ocmVjb3JkLG5hbWVzKT0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKSk7JGjNj19vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0IHplcm9lcz1BcnJheSgxNikuXG5maWxsKHVuZGVmaW5lZCkuXG5tYXAoKF8saSk9PicwJy5yZXBlYXQoaSkpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgemVyb1BhZD0obixzaXplKT0+e1xuY29uc3QgblN0cj0gYCR7bn1gO1xuY29uc3QgZmlsbExlbj1zaXplLW5TdHIubGVuZ3RoO1xuaWYoZmlsbExlbj09PTApcmV0dXJuIG5TdHI7XG5hc3NlcnQoZmlsbExlbj4wJiZmaWxsTGVuPHplcm9lcy5sZW5ndGgpO1xucmV0dXJuIGAke3plcm9lc1tmaWxsTGVuXX0ke25TdHJ9YDtcbiB9OyRozY9fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHM9J2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQ9KG4pPT57XG4vL1xuaWYoaXMobiwtMCkpe1xubj0wO1xuIH1lbHNlIGlmKGlzKG4sTmFOKSl7XG5yZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiB9XG5hc051bWJlclswXT1uO1xubGV0IGJpdHM9YXNCaXRzWzBdO1xuaWYobjwwKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbnJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwxNil9YDtcbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBkZWNvZGVCaW5hcnk2ND0oZW5jb2RlZCxza2lwPTApPT57XG5lbmNvZGVkLmNoYXJBdChza2lwKT09PSdmJ3x8RmFpbCBgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IGJpdHM9QmlnSW50KCBgMHgke2dldFN1ZmZpeChlbmNvZGVkLHNraXArMSl9YCk7XG5pZihlbmNvZGVkLmNoYXJBdChza2lwKzEpPCc4Jyl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5hc0JpdHNbMF09Yml0cztcbmNvbnN0IHJlc3VsdD1hc051bWJlclswXTtcbiFpcyhyZXN1bHQsLTApfHxcbkZhaWwgYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVCaWdJbnQ9KG4pPT57XG5jb25zdCBhYnM9bjwwbj8tbjpuO1xuY29uc3QgbkRpZ2l0cz1hYnMudG9TdHJpbmcoKS5sZW5ndGg7XG5jb25zdCBsRGlnaXRzPW5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG5pZihuPDBuKXtcbnJldHVybiBgbiR7XG4vL1xuLy9cbicjJy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLy9cbigxMCoqbERpZ2l0cy1uRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsJzAnKVxuIH06JHtcbi8vXG4oMTBuKipCaWdJbnQobkRpZ2l0cykrbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCcwJylcbiB9YDtcbiB9ZWxzZXtcbnJldHVybiBgcCR7XG4vL1xuLy9cbid+Jy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLy9cbm5EaWdpdHNcbiB9OiR7XG4vL1xublxuIH1gO1xuIH1cbiB9O1xuXG5jb25zdCByQmlnSW50UGF5bG9hZD0vKFswLTldKykoOihbMC05XSskfCl8KS9zO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQmlnSW50PShlbmNvZGVkKT0+e1xuY29uc3QgdHlwZVByZWZpeD1lbmNvZGVkLmNoYXJBdCgwKTsvL1xudHlwZVByZWZpeD09PSdwJ3x8XG50eXBlUHJlZml4PT09J24nfHxcbkZhaWwgYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuY29uc3R7XG5pbmRleDpsRGlnaXRzLFxuMTpzbkRpZ2l0cyxcbjI6dGFpbCxcbjM6ZGlnaXRzfT1cbmVuY29kZWQubWF0Y2gockJpZ0ludFBheWxvYWQpfHxGYWlsIGBEaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbnNuRGlnaXRzLmxlbmd0aD09PWxEaWdpdHN8fFxuRmFpbCBgVW5hcnktcHJlZml4ZWQgZGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8vXG4vL1xubkRpZ2l0cz0xMCoqLyogICAgICAgICAgICAgICAgICovbERpZ2l0cy1uRGlnaXRzO1xuIH1cblxudGFpbC5jaGFyQXQoMCk9PT0nOid8fEZhaWwgYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5kaWdpdHMubGVuZ3RoPT09bkRpZ2l0c3x8XG5GYWlsIGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG49QmlnSW50KGRpZ2l0cyk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8vXG4vL1xubj0tKDEwbioqQmlnSW50KG5EaWdpdHMpLW4pO1xuIH1cblxucmV0dXJuIG47XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzdHJpbmdFc2NhcGVzPUFycmF5KDB4MjIpLlxuZmlsbCh1bmRlZmluZWQpLlxubWFwKChfLGNwKT0+e1xuc3dpdGNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApKXtcbmNhc2UnICc6XG5yZXR1cm4nIV8nO1xuY2FzZSchJzpcbnJldHVybichfCc7XG5kZWZhdWx0OlxucmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKzB4MjEpfWA7fVxuXG4gfSk7XG5zdHJpbmdFc2NhcGVzWydeJy5jaGFyQ29kZUF0KDApXT0nX0AnO1xuc3RyaW5nRXNjYXBlc1snXycuY2hhckNvZGVBdCgwKV09J19fJztcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeD0oc3RyKT0+XG5zdHIucmVwbGFjZSgvW1xcMC0hXl9dL2csKGNoKT0+c3RyaW5nRXNjYXBlc1tjaC5jaGFyQ29kZUF0KDApXSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXg9KGVuY29kZWQpPT57XG5yZXR1cm4gZW5jb2RlZC5yZXBsYWNlKC8oW1xcMC0hX10pKC58XFxuKT8vZywoZXNjLHByZWZpeCxzdWZmaXgpPT57XG5zd2l0Y2goZXNjKXtcbmNhc2UnIV8nOlxucmV0dXJuJyAnO1xuY2FzZSchfCc6XG5yZXR1cm4nISc7XG5jYXNlJ19AJzpcbnJldHVybideJztcbmNhc2UnX18nOlxucmV0dXJuJ18nO1xuZGVmYXVsdDp7XG5jb25zdCBjaD0vKiAgICAgICAgICAgICAgICAgKi9zdWZmaXg7XG4vL1xuLy9cbnByZWZpeD09PSchJyYmc3VmZml4IT09dW5kZWZpbmVkJiZjaD49JyEnJiZjaDw9J0AnfHxcbkZhaWwgYGludmFsaWQgc3RyaW5nIGVzY2FwZTogJHtxKGVzYyl9YDtcbnJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCktMHgyMSk7XG4gfX1cblxuIH0pO1xuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeD0oc3RyKT0+c3RyO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXg9KGVuY29kZWQpPT5lbmNvZGVkO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RBcnJheT0oYXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBjaGFycz1bJ14nXTtcbmZvcihjb25zdCBlbGVtZW50IG9mIGFycmF5KXtcbmNvbnN0IGVuYz1lbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbmNoYXJzLnB1c2goZW5jLCcgJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdEFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlLHNraXA9MCk9PntcbmNvbnN0IGVsZW1lbnRzPVtdO1xubGV0IGRlcHRoPTA7XG4vL1xuLy9cbmxldCBuZXh0SW5kZXg9c2tpcCsxO1xubGV0IGN1cnJlbnRFbGVtZW50U3RhcnQ9c2tpcCsxO1xuZm9yKGNvbnN0ezA6Y2gsaW5kZXg6aX1vZiBlbmNvZGVkLm1hdGNoQWxsKC9bXFxeIF0vZykpe1xuY29uc3QgaW5kZXg9LyogICAgICAgICAgICAgICAgICovaTtcbmlmKGluZGV4PD1za2lwKXtcbmlmKGluZGV4PT09c2tpcCl7XG5jaD09PSdeJ3x8RmFpbCBgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuIH1cbiB9ZWxzZSBpZihjaD09PSdeJyl7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbmRlcHRoKz0xO1xuIH1lbHNle1xuLy9cbmlmKGluZGV4PT09bmV4dEluZGV4KXtcbi8vXG5kZXB0aC09MTtcbmRlcHRoPj0wfHxcbi8vXG5GYWlsIGB1bmV4cGVjdGVkIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcjogJHtlbmNvZGVkLnNsaWNlKHNraXAsaW5kZXgrMil9YDtcbiB9XG5pZihkZXB0aD09PTApe1xuLy9cbmVsZW1lbnRzLnB1c2goXG5kZWNvZGVQYXNzYWJsZShlbmNvZGVkLnNsaWNlKGN1cnJlbnRFbGVtZW50U3RhcnQsaW5kZXgpKSk7XG5cbmN1cnJlbnRFbGVtZW50U3RhcnQ9aW5kZXgrMTtcbiB9XG4gfVxuLy9cbm5leHRJbmRleD1pbmRleCsxO1xuIH1cbmRlcHRoPT09MHx8RmFpbCBgdW50ZXJtaW5hdGVkIGFycmF5OiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5uZXh0SW5kZXg9PT1lbmNvZGVkLmxlbmd0aHx8XG5GYWlsIGB1bnRlcm1pbmF0ZWQgYXJyYXkgZWxlbWVudDogJHtnZXRTdWZmaXgoXG5lbmNvZGVkLFxuY3VycmVudEVsZW1lbnRTdGFydClcbiB9YDtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeUFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnWyddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuZm9yKGNvbnN0IGMgb2YgZW5jKXtcbmlmKGM9PT0nXFx1MDAwMCd8fGM9PT0nXFx1MDAwMScpe1xuY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuIH1cbmNoYXJzLnB1c2goYyk7XG4gfVxuY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeUFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlLHNraXA9MCk9PntcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuLy9cbi8vXG5sZXQgc3RpbGxUb1NraXA9c2tpcCsxO1xubGV0IGluRXNjYXBlPWZhbHNlO1xuZm9yKGNvbnN0IGMgb2YgZW5jb2RlZCl7XG5pZihzdGlsbFRvU2tpcD4wKXtcbnN0aWxsVG9Ta2lwLT0xO1xuaWYoc3RpbGxUb1NraXA9PT0wKXtcbmM9PT0nWyd8fEZhaWwgYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbiB9XG4gfWVsc2UgaWYoaW5Fc2NhcGUpe1xuYz09PSdcXHUwMDAwJ3x8XG5jPT09J1xcdTAwMDEnfHxcbkZhaWwgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjfWA7XG5lbGVtQ2hhcnMucHVzaChjKTtcbiB9ZWxzZSBpZihjPT09J1xcdTAwMDAnKXtcbmNvbnN0IGVuY29kZWRFbGVtZW50PWVsZW1DaGFycy5qb2luKCcnKTtcbmVsZW1DaGFycy5sZW5ndGg9MDtcbmNvbnN0IGVsZW1lbnQ9ZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiB9ZWxzZSBpZihjPT09J1xcdTAwMDEnKXtcbmluRXNjYXBlPXRydWU7XG4vL1xuY29udGludWU7XG4gfWVsc2V7XG5lbGVtQ2hhcnMucHVzaChjKTtcbiB9XG5pbkVzY2FwZT1mYWxzZTtcbiB9XG4haW5Fc2NhcGV8fEZhaWwgYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbmVsZW1DaGFycy5sZW5ndGg9PT0wfHxcbkZhaWwgYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlY29yZD0ocmVjb3JkLGVuY29kZUFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgbmFtZXM9cmVjb3JkTmFtZXMocmVjb3JkKTtcbmNvbnN0IHZhbHVlcz1yZWNvcmRWYWx1ZXMocmVjb3JkLG5hbWVzKTtcbnJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcyx2YWx1ZXNdKSxlbmNvZGVQYXNzYWJsZSl9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQ9KGVuY29kZWQsZGVjb2RlQXJyYXksZGVjb2RlUGFzc2FibGUsc2tpcD0wKT0+e1xuYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApPT09JygnKTtcbi8vXG4vL1xuY29uc3QgdW56aXBwZWRFbnRyaWVzPWRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUsc2tpcCsxKTtcbnVuemlwcGVkRW50cmllcy5sZW5ndGg9PT0yfHxcbkZhaWwgYGV4cGVjdGVkIGtleXMsdmFsdWVzIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbmNvbnN0W2tleXMsdmFsc109dW56aXBwZWRFbnRyaWVzO1xuXG5wYXNzU3R5bGVPZihrZXlzKT09PSdjb3B5QXJyYXknJiZcbnBhc3NTdHlsZU9mKHZhbHMpPT09J2NvcHlBcnJheScmJlxua2V5cy5sZW5ndGg9PT12YWxzLmxlbmd0aCYmXG5rZXlzLmV2ZXJ5KChrZXkpPT50eXBlb2Yga2V5PT09J3N0cmluZycpfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuY29uc3QgbWFwRW50cmllcz1rZXlzLm1hcCgoa2V5LGkpPT5ba2V5LHZhbHNbaV1dKTtcbmNvbnN0IHJlY29yZD1oYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cmllcykpO1xuYXNzZXJ0UmVjb3JkKHJlY29yZCwnZGVjb2RlZCByZWNvcmQnKTtcbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkPSh0YWdnZWQsZW5jb2RlQXJyYXksZW5jb2RlUGFzc2FibGUpPT5cbiBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSx0YWdnZWQucGF5bG9hZF0pLGVuY29kZVBhc3NhYmxlKX1gO1xuXG5jb25zdCBkZWNvZGVUYWdnZWQ9KGVuY29kZWQsZGVjb2RlQXJyYXksZGVjb2RlUGFzc2FibGUsc2tpcD0wKT0+e1xuYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApPT09JzonKTtcbi8vXG4vL1xuY29uc3QgdGFnZ2VkUGF5bG9hZD1kZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlLHNraXArMSk7XG50YWdnZWRQYXlsb2FkLmxlbmd0aD09PTJ8fFxuRmFpbCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuY29uc3RbdGFnLHBheWxvYWRdPXRhZ2dlZFBheWxvYWQ7XG5wYXNzU3R5bGVPZih0YWcpPT09J3N0cmluZyd8fFxuRmFpbCBgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG4gfTtcblxuY29uc3QgbWFrZUVuY29kZVJlbW90YWJsZT0odW5zYWZlRW5jb2RlUmVtb3RhYmxlLHZlcmlmeUVuY29kaW5nKT0+e1xuY29uc3QgZW5jb2RlUmVtb3RhYmxlPShyLGlubmVyRW5jb2RlKT0+e1xuY29uc3QgZW5jb2Rpbmc9dW5zYWZlRW5jb2RlUmVtb3RhYmxlKHIsaW5uZXJFbmNvZGUpO1xudHlwZW9mIGVuY29kaW5nPT09J3N0cmluZycmJmVuY29kaW5nLmNoYXJBdCgwKT09PSdyJ3x8XG5GYWlsIGBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke2VuY29kaW5nfWA7XG52ZXJpZnlFbmNvZGluZyhlbmNvZGluZywnUmVtb3RhYmxlJyk7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfTtcbnJldHVybiBlbmNvZGVSZW1vdGFibGU7XG4gfTtcblxuY29uc3QgbWFrZUVuY29kZVByb21pc2U9KHVuc2FmZUVuY29kZVByb21pc2UsdmVyaWZ5RW5jb2RpbmcpPT57XG5jb25zdCBlbmNvZGVQcm9taXNlPShwLGlubmVyRW5jb2RlKT0+e1xuY29uc3QgZW5jb2Rpbmc9dW5zYWZlRW5jb2RlUHJvbWlzZShwLGlubmVyRW5jb2RlKTtcbnR5cGVvZiBlbmNvZGluZz09PSdzdHJpbmcnJiZlbmNvZGluZy5jaGFyQXQoMCk9PT0nPyd8fFxuRmFpbCBgUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7ZW5jb2Rpbmd9YDtcbnZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCdQcm9taXNlJyk7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfTtcbnJldHVybiBlbmNvZGVQcm9taXNlO1xuIH07XG5cbmNvbnN0IG1ha2VFbmNvZGVFcnJvcj0odW5zYWZlRW5jb2RlRXJyb3IsdmVyaWZ5RW5jb2RpbmcpPT57XG5jb25zdCBlbmNvZGVFcnJvcj0oZXJyLGlubmVyRW5jb2RlKT0+e1xuY29uc3QgZW5jb2Rpbmc9dW5zYWZlRW5jb2RlRXJyb3IoZXJyLGlubmVyRW5jb2RlKTtcbnR5cGVvZiBlbmNvZGluZz09PSdzdHJpbmcnJiZlbmNvZGluZy5jaGFyQXQoMCk9PT0nISd8fFxuRmFpbCBgRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke2VuY29kaW5nfWA7XG52ZXJpZnlFbmNvZGluZyhlbmNvZGluZywnRXJyb3InKTtcbnJldHVybiBlbmNvZGluZztcbiB9O1xucmV0dXJuIGVuY29kZUVycm9yO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlubmVyRW5jb2RlPShlbmNvZGVTdHJpbmdTdWZmaXgsZW5jb2RlQXJyYXksb3B0aW9ucyk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlOnVuc2FmZUVuY29kZVJlbW90YWJsZSxcbmVuY29kZVByb21pc2U6dW5zYWZlRW5jb2RlUHJvbWlzZSxcbmVuY29kZUVycm9yOnVuc2FmZUVuY29kZUVycm9yLFxudmVyaWZ5RW5jb2Rpbmc9KCk9PnsgfX09XG5vcHRpb25zO1xuY29uc3QgZW5jb2RlUmVtb3RhYmxlPW1ha2VFbmNvZGVSZW1vdGFibGUoXG51bnNhZmVFbmNvZGVSZW1vdGFibGUsXG52ZXJpZnlFbmNvZGluZyk7XG5cbmNvbnN0IGVuY29kZVByb21pc2U9bWFrZUVuY29kZVByb21pc2UodW5zYWZlRW5jb2RlUHJvbWlzZSx2ZXJpZnlFbmNvZGluZyk7XG5jb25zdCBlbmNvZGVFcnJvcj1tYWtlRW5jb2RlRXJyb3IodW5zYWZlRW5jb2RlRXJyb3IsdmVyaWZ5RW5jb2RpbmcpO1xuXG5jb25zdCBpbm5lckVuY29kZT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxpbm5lckVuY29kZSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4ndic7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybid6JztcbiB9XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xucmV0dXJuIGBzJHtlbmNvZGVTdHJpbmdTdWZmaXgocGFzc2FibGUpfWA7XG4gfVxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLGlubmVyRW5jb2RlKTtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGVuY29kZVByb21pc2UocGFzc2FibGUsaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vL1xuY29uc3QgbmFtZT1uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbnJldHVybiBgeSR7ZW5jb2RlU3RyaW5nU3VmZml4KG5hbWUpfWA7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSxpbm5lckVuY29kZSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5yZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLGVuY29kZUFycmF5LGlubmVyRW5jb2RlKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSxlbmNvZGVBcnJheSxpbm5lckVuY29kZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBhICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbGxlY3Rpb24gcGFzc2FibGVgO1xuIH19XG5cbiB9O1xucmV0dXJuIGlubmVyRW5jb2RlO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnM9LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgKi97XG5kZWNvZGVSZW1vdGFibGU6KF9lbmNvZGluZyxfaW5uZXJEZWNvZGUpPT51bmRlZmluZWQsXG5kZWNvZGVQcm9taXNlOihfZW5jb2RpbmcsX2lubmVyRGVjb2RlKT0+dW5kZWZpbmVkLFxuZGVjb2RlRXJyb3I6KF9lbmNvZGluZyxfaW5uZXJEZWNvZGUpPT51bmRlZmluZWR9O1xuXG5cblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlSW5uZXJEZWNvZGU9KGRlY29kZVN0cmluZ1N1ZmZpeCxkZWNvZGVBcnJheSxvcHRpb25zKT0+e1xuY29uc3R7ZGVjb2RlUmVtb3RhYmxlLGRlY29kZVByb21pc2UsZGVjb2RlRXJyb3J9PW9wdGlvbnM7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaW5uZXJEZWNvZGU9KGVuY29kZWQsc2tpcD0wKT0+e1xuc3dpdGNoKGVuY29kZWQuY2hhckF0KHNraXApKXtcbmNhc2Undic6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd6Jzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnZic6e1xucmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQsc2tpcCk7XG4gfVxuY2FzZSdzJzp7XG5yZXR1cm4gZGVjb2RlU3RyaW5nU3VmZml4KGdldFN1ZmZpeChlbmNvZGVkLHNraXArMSkpO1xuIH1cbmNhc2UnYic6e1xuY29uc3Qgc3Vic3RyaW5nPWdldFN1ZmZpeChlbmNvZGVkLHNraXArMSk7XG5pZihzdWJzdHJpbmc9PT0ndHJ1ZScpe1xucmV0dXJuIHRydWU7XG4gfWVsc2UgaWYoc3Vic3RyaW5nPT09J2ZhbHNlJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxudGhyb3cgRmFpbCBgZXhwZWN0ZWQgZW5jb2RlZCBib29sZWFuIHRvIGJlIFwiYnRydWVcIiBvciBcImJmYWxzZVwiOiAke3N1YnN0cmluZ31gO1xuIH1cbmNhc2Unbic6XG5jYXNlJ3AnOntcbnJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCkpO1xuIH1cbmNhc2Uncic6e1xucmV0dXJuIGRlY29kZVJlbW90YWJsZShnZXRTdWZmaXgoZW5jb2RlZCxza2lwKSxpbm5lckRlY29kZSk7XG4gfVxuY2FzZSc/Jzp7XG5yZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCxza2lwKSxpbm5lckRlY29kZSk7XG4gfVxuY2FzZSchJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3IoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCksaW5uZXJEZWNvZGUpO1xuIH1cbmNhc2UneSc6e1xuLy9cbmNvbnN0IG5hbWU9ZGVjb2RlU3RyaW5nU3VmZml4KGdldFN1ZmZpeChlbmNvZGVkLHNraXArMSkpO1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiB9XG5jYXNlJ1snOlxuY2FzZSdeJzp7XG4vL1xucmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsaW5uZXJEZWNvZGUsc2tpcCk7XG4gfVxuY2FzZScoJzp7XG5yZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsZGVjb2RlQXJyYXksaW5uZXJEZWNvZGUsc2tpcCk7XG4gfVxuY2FzZSc6Jzp7XG5yZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsZGVjb2RlQXJyYXksaW5uZXJEZWNvZGUsc2tpcCk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuIH19XG5cbiB9O1xucmV0dXJuIGlubmVyRGVjb2RlO1xuIH07XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUGFzc2FibGVLaXQ9KG9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZT0ocixfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuZW5jb2RlUHJvbWlzZT0ocCxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3B9YCxcbmVuY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWAsXG5mb3JtYXQ9J2xlZ2FjeU9yZGVyZWQnLFxuXG5kZWNvZGVSZW1vdGFibGU9KGVuY29kaW5nLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuZGVjb2RlUHJvbWlzZT0oZW5jb2RpbmcsXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuZGVjb2RlRXJyb3I9KGVuY29kaW5nLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWB9PVxub3B0aW9ucztcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBlbmNvZGVQYXNzYWJsZTtcbmNvbnN0IGVuY29kZU9wdGlvbnM9e2VuY29kZVJlbW90YWJsZSxlbmNvZGVQcm9taXNlLGVuY29kZUVycm9yLGZvcm1hdH07XG5pZihmb3JtYXQ9PT0nY29tcGFjdE9yZGVyZWQnKXtcbmNvbnN0IGxpYmVyYWxEZWNvZGU9bWFrZUlubmVyRGVjb2RlKFxuZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbmRlY29kZUNvbXBhY3RBcnJheSxcbmxpYmVyYWxEZWNvZGVycyk7XG5cbi8qXG5cblxuXG4gICAgICovXG5jb25zdCB2ZXJpZnlFbmNvZGluZz0oZW5jb2RpbmcsbGFiZWwpPT57XG4hZW5jb2RpbmcubWF0Y2gockMwKXx8XG5GYWlsIGAke2IoXG5sYWJlbClcbiB9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuY29uc3QgZGVjb2RlZD1kZWNvZGVDb21wYWN0QXJyYXkoIGBediAke2VuY29kaW5nfSB2IGAsbGliZXJhbERlY29kZSk7XG5pc0FycmF5KGRlY29kZWQpJiZcbmRlY29kZWQubGVuZ3RoPT09MyYmXG5kZWNvZGVkWzBdPT09bnVsbCYmXG5kZWNvZGVkWzJdPT09bnVsbHx8XG5GYWlsIGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiB9O1xuY29uc3QgZW5jb2RlQ29tcGFjdD1tYWtlSW5uZXJFbmNvZGUoXG5lbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuZW5jb2RlQ29tcGFjdEFycmF5LFxuey4uLmVuY29kZU9wdGlvbnMsdmVyaWZ5RW5jb2Rpbmd9KTtcblxuZW5jb2RlUGFzc2FibGU9KHBhc3NhYmxlKT0+IGB+JHtlbmNvZGVDb21wYWN0KHBhc3NhYmxlKX1gO1xuIH1lbHNlIGlmKGZvcm1hdD09PSdsZWdhY3lPcmRlcmVkJyl7XG5lbmNvZGVQYXNzYWJsZT1tYWtlSW5uZXJFbmNvZGUoXG5lbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG5lbmNvZGVMZWdhY3lBcnJheSxcbmVuY29kZU9wdGlvbnMpO1xuXG4gfWVsc2V7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuIH1cblxuY29uc3QgZGVjb2RlT3B0aW9ucz17ZGVjb2RlUmVtb3RhYmxlLGRlY29kZVByb21pc2UsZGVjb2RlRXJyb3J9O1xuY29uc3QgZGVjb2RlQ29tcGFjdD1tYWtlSW5uZXJEZWNvZGUoXG5kZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuZGVjb2RlQ29tcGFjdEFycmF5LFxuZGVjb2RlT3B0aW9ucyk7XG5cbmNvbnN0IGRlY29kZUxlZ2FjeT1tYWtlSW5uZXJEZWNvZGUoXG5kZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG5kZWNvZGVMZWdhY3lBcnJheSxcbmRlY29kZU9wdGlvbnMpO1xuXG5jb25zdCBkZWNvZGVQYXNzYWJsZT0oZW5jb2RlZCk9Pntcbi8vXG4vL1xuLy9cbmlmKGVuY29kZWQuY2hhckF0KDApPT09J34nKXtcbnJldHVybiBkZWNvZGVDb21wYWN0KGVuY29kZWQsMSk7XG4gfVxucmV0dXJuIGRlY29kZUxlZ2FjeShlbmNvZGVkKTtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtlbmNvZGVQYXNzYWJsZSxkZWNvZGVQYXNzYWJsZX0pO1xuIH07JGjNj19vbmNlLm1ha2VQYXNzYWJsZUtpdChtYWtlUGFzc2FibGVLaXQpO1xuaGFyZGVuKG1ha2VQYXNzYWJsZUtpdCk7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVBhc3NhYmxlPShlbmNvZGVPcHRpb25zKT0+e1xuY29uc3R7ZW5jb2RlUGFzc2FibGV9PW1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbnJldHVybiBlbmNvZGVQYXNzYWJsZTtcbiB9OyRozY9fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVQYXNzYWJsZT0oZGVjb2RlT3B0aW9ucyk9PntcbmNvbnN0e2RlY29kZVBhc3NhYmxlfT1tYWtlUGFzc2FibGVLaXQoZGVjb2RlT3B0aW9ucyk7XG5yZXR1cm4gZGVjb2RlUGFzc2FibGU7XG4gfTskaM2PX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuY29uc3QgICAgICAgIGlzRW5jb2RlZFJlbW90YWJsZT0oZW5jb2RlZCk9PmVuY29kZWQuY2hhckF0KDApPT09J3InOyRozY9fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgcGFzc1N0eWxlUHJlZml4ZXM9e1xuZXJyb3I6JyEnLFxuY29weVJlY29yZDonKCcsXG50YWdnZWQ6JzonLFxucHJvbWlzZTonPycsXG5jb3B5QXJyYXk6J1teJyxcbmJvb2xlYW46J2InLFxubnVtYmVyOidmJyxcbmJpZ2ludDonbnAnLFxucmVtb3RhYmxlOidyJyxcbnN0cmluZzoncycsXG5udWxsOid2JyxcbnN5bWJvbDoneScsXG4vL1xuLy9cbi8vXG51bmRlZmluZWQ6J3onfTskaM2PX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZVBhc3NhYmxlS2l0IjpbIm1ha2VQYXNzYWJsZUtpdCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABfnPAyUiIAAFIiAAArAAAAQGVuZG8vbWFyc2hhbC12MS42LjIvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsIFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbmRlZmluZVByb3BlcnRpZXMsXG5pcyxcbmVudHJpZXMsXG5mcm9tRW50cmllcyxcbmZyZWV6ZX09XG5PYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBRQ0xBU1M9J0BxY2xhc3MnOyRozY9fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKlxuXG5cbiAqL1xuY29uc3QgaGFzUUNsYXNzPShlbmNvZGVkKT0+aGFzT3duUHJvcGVydHlPZihlbmNvZGVkLFFDTEFTUyk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXM9KGVuY29kZWQscWNsYXNzKT0+XG5pc09iamVjdChlbmNvZGVkKSYmXG4haXNBcnJheShlbmNvZGVkKSYmXG5oYXNRQ2xhc3MoZW5jb2RlZCkmJlxuZW5jb2RlZFtRQ0xBU1NdPT09cWNsYXNzO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0ocmVtKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIpPT5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9DYXBEYXRhPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9ZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGE9ZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YT1kb250RW5jb2RlRXJyb3JUb0NhcERhdGF9PVxuZW5jb2RlT3B0aW9ucztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8vXG4vL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ3N0cmluZyc6e1xuLy9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ251bWJlcic6e1xuLy9cbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJue1tRQ0xBU1NdOidOYU4nfTtcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonSW5maW5pdHknfTtcbiB9ZWxzZSBpZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106Jy1JbmZpbml0eSd9O1xuIH1cbi8vXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybntcbltRQ0xBU1NdOidiaWdpbnQnLFxuZGlnaXRzOlN0cmluZyhwYXNzYWJsZSl9O1xuXG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyogICAgICAgICAgICAgICAgICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybntcbltRQ0xBU1NdOidzeW1ib2wnLFxubmFtZX07XG5cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsUUNMQVNTKSl7XG4vL1xuY29uc3R7W1FDTEFTU106cWNsYXNzVmFsdWUsLi4ucmVzdH09cGFzc2FibGU7XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmVzdWx0PXtcbltRQ0xBU1NdOidoaWxiZXJ0Jyxcbm9yaWdpbmFsOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKX07XG5cbmlmKG93bktleXMocmVzdCkubGVuZ3RoPj0xKXtcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbnJlc3VsdC5yZXN0PWVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vL1xuLy9cbi8vXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbltRQ0xBU1NdOid0YWdnZWQnLFxudGFnOmdldFRhZyhwYXNzYWJsZSksXG5wYXlsb2FkOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbnBhc3NhYmxlLFxuZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuXG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG4vL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUylcbiB9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nc2xvdCcpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ2Vycm9yJykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ2Vycm9yJylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRozY9fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShzbG90RW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0oZXJyb3JFbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21DYXBEYXRhPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT1kb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX09XG5kZWNvZGVPcHRpb25zO1xuXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT09PWRlY29kZVByb21pc2VGcm9tQ2FwRGF0YXx8XG5GYWlsIGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEpXG4gfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8vXG5yZXR1cm4ganNvbkVuY29kZWQ7XG4gfVxuaWYoaXNBcnJheShqc29uRW5jb2RlZCkpe1xucmV0dXJuIGpzb25FbmNvZGVkLm1hcCgoZW5jb2RlZFZhbCk9PmRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiB9ZWxzZSBpZihoYXNRQ2xhc3MoanNvbkVuY29kZWQpKXtcbmNvbnN0IHFjbGFzcz1qc29uRW5jb2RlZFtRQ0xBU1NdO1xudHlwZW9mIHFjbGFzcz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgJHtxKFFDTEFTUyl9IHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbnN3aXRjaChxY2xhc3Mpe1xuLy9cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PWpzb25FbmNvZGVkO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLy9cbi8vXG4vL1xuLy9cbnJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09anNvbkVuY29kZWQ7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09anNvbkVuY29kZWQ7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcsZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuIH1cbmNhc2Unc2xvdCc6e1xuLy9cbi8vXG4vL1xuY29uc3QgZGVjb2RlZD1kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG4vL1xuLy9cbi8vXG4vL1xucmV0dXJuIGRlY29kZWQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZGVjb2RlZD1kZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbmlmKHBhc3NTdHlsZU9mKGRlY29kZWQpPT09J2Vycm9yJyl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09anNvbkVuY29kZWQ7XG5oYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdvcmlnaW5hbCcpfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4vL1xuY29uc3QgcmVzdWx0PXtbUUNMQVNTXTpkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCl9O1xuaWYoaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwncmVzdCcpKXtcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3Q9XG50eXBlb2YgcmVzdD09PSdvYmplY3QnJiZcbnJlc3QhPT1udWxsJiZcbm93bktleXMocmVzdCkubGVuZ3RoPj0xO1xuaWYoIWlzTm9uRW1wdHlPYmplY3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gfVxuY29uc3QgcmVzdE9iaj1kZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbi8vXG4vL1xuLy9cbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosUUNMQVNTKXx8XG5GYWlsIGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG5kZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8vXG5jYXNlJ2liaWQnOntcbnRocm93IEZhaWwgYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxucWNsYXNzKVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgZGVjb2RlRW50cnk9KFtuYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xuIH07JGjNj19vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAPShurLiIAAC4iAAAtAAAAQGVuZG8vbWFyc2hhbC12MS42LjIvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsIFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsPShlbmNvZGVkU3RyKT0+e1xuaWYoZW5jb2RlZFN0cj09PScnKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vL1xucmV0dXJuIEJBTkc8PWNvZGUmJmNvZGU8PURBU0g7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb1NtYWxsY2Fwcz0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzPWRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGFzc2VydEVuY29kZWRFcnJvcj0oZW5jb2RpbmcpPT57XG50eXBlb2YgZW5jb2Rpbmc9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG5lbmNvZGluZylcbiB9YDtcbi8vXG5jb25zdCBtZXNzYWdlPWVuY29kaW5nWycjZXJyb3InXTtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLmNoYXJBdCgwKT09PSchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLy9cbi8vXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzp7XG4vL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4nI3VuZGVmaW5lZCc7XG4gfVxuY2FzZSdudW1iZXInOntcbi8vXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybicjTmFOJztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdCBzdHI9U3RyaW5nKHBhc3NhYmxlKTtcbnJldHVybiAoLyogICAgICAgICAgICAgICAgICovcGFzc2FibGU8MG4/c3RyOmArJHtzdHJ9YCk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyogICAgICAgICAgICAgICAgICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLy9cbi8vXG4vL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LmNoYXJBdCgwKT09PSckJyl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8vXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5jaGFyQXQoMCk9PT0nJicpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IHJlc3VsdD1oYXJkZW4oXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpKTtcblxuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbiB9OyRozY9fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9PVxuZGVjb2RlT3B0aW9ucztcblxuLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgZGVjb2RlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT57XG5zd2l0Y2godHlwZW9mIGVuY29kaW5nKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZighc3RhcnRzU3BlY2lhbChlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNvbnN0IGM9ZW5jb2RpbmcuY2hhckF0KDApO1xuc3dpdGNoKGMpe1xuY2FzZSchJzp7XG4vL1xucmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuIH1cbmNhc2UnJSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZScjJzp7XG5zd2l0Y2goZW5jb2Rpbmcpe1xuY2FzZScjdW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnI05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJyNJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnIy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH1cbmNhc2UnKyc6XG5jYXNlJy0nOntcbnJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuIH1cbmNhc2UnJCc6e1xuY29uc3QgcmVzdWx0PWRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG4vL1xuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnJic6e1xuY29uc3QgcmVzdWx0PWRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdwcm9taXNlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgU3BlY2lhbCBjaGFyICR7cShcbmMpXG4gfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuIH19XG5cbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoZW5jb2Rpbmc9PT1udWxsKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5cbmlmKGlzQXJyYXkoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZy5tYXAoKHZhbCk9PmRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjdGFnJykpe1xuY29uc3R7JyN0YWcnOnRhZyxwYXlsb2FkLC4uLnJlc3R9PWVuY29kaW5nO1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSk7XG5cbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpKXtcbmNvbnN0IHJlc3VsdD1kZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5wYXNzU3R5bGVPZihyZXN1bHQpPT09J2Vycm9yJ3x8XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG5jb25zdCBkZWNvZGVFbnRyeT0oW2VuY29kZWROYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIGVuY29kZWROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuZW5jb2RlZE5hbWUuY2hhckF0KDApIT09JyMnfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEULMv0QIwAAECMAACoAAABAZW5kby9tYXJzaGFsLXYxLjYuMi9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgTmF0LGdldEVycm9yQ29uc3RydWN0b3IsaXNPYmplY3QscGFzc2FibGVTeW1ib2xGb3JOYW1lLHEsWCxGYWlsLFFDTEFTUzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLCBbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtzdHJpbmdpZnk6cXVvdGV9PUpTT047XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGJhZFBhaXJQYXR0ZXJuPS9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXI9KCk9Pntcbi8qICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBzdHJpbmdzPVtdO1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PnN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG5saW5lOigpPT5zdHJpbmdzLmxlbmd0aCxcbm5leHQ6KHRva2VuKT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEpe1xuY29uc3QgbGFzdD1zdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdO1xuLy9cbmlmKGxhc3QubGVuZ3RoPj0xJiZ0b2tlbi5sZW5ndGg+PTEpe1xuY29uc3QgcGFpcj0gYCR7bGFzdFtsYXN0Lmxlbmd0aC0xXX0ke3Rva2VuWzBdfWA7XG5pZihiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbiB9XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSYmc3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXT09PScsJyl7XG5zdHJpbmdzLnBvcCgpO1xuIH1cbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+c3RyaW5ncy5qb2luKCcnKX0pO1xuXG4gfTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuPS9eW2EtekEtWl1cXHcqJC87XG5oYXJkZW4oaWRlbnRQYXR0ZXJuKTtcbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluPShlbmNvZGluZyxzaG91bGRJbmRlbnQ9ZmFsc2Usc2xvdHM9W10pPT57XG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgcHJlcGFyZT0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG5yZXR1cm47XG4gfVxuLy9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm47XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbnR5cGVvZiBkaWdpdHM9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG5yZXR1cm47XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbnJldHVybjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG5wcmVwYXJlKG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuaWYodHlwZW9mIHJlc3QhPT0nb2JqZWN0Jyl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuIH1cbmlmKHJlc3Q9PT1udWxsKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiB9XG5pZihpc0FycmF5KHJlc3QpKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gfVxuaWYoUUNMQVNTIGluIHJlc3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbiB9XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnByZXBhcmUocmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuIH1cbmdldEVycm9yQ29uc3RydWN0b3IobmFtZSkhPT11bmRlZmluZWR8fFxuRmFpbCBgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG5yZXR1cm47XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucHJlcGFyZShyYXdUcmVlW2ldKTtcbiB9XG4gfWVsc2V7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJhd1RyZWUpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiB9XG5wcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgbWFrZUluZGVudGVyPXNob3VsZEluZGVudD9tYWtlWWVzSW5kZW50ZXI6bWFrZU5vSW5kZW50ZXI7XG5sZXQgb3V0PW1ha2VJbmRlbnRlcigpO1xuXG4vKlxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGRlY29kZT0ocmF3VHJlZSk9Pntcbi8vXG5yZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gfTtcblxuY29uc3QgZGVjb2RlUHJvcGVydHk9KG5hbWUsdmFsdWUpPT57XG5vdXQubGluZSgpO1xuaWYobmFtZT09PSdfX3Byb3RvX18nKXtcbi8vXG4vL1xuLy9cbi8vXG5vdXQubmV4dCggYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiB9ZWxzZSBpZihpZGVudFBhdHRlcm4udGVzdChuYW1lKSl7XG5vdXQubmV4dCggYCR7bmFtZX06YCk7XG4gfWVsc2V7XG5vdXQubmV4dCggYCR7cXVvdGUobmFtZSl9OmApO1xuIH1cbmRlY29kZSh2YWx1ZSk7XG5vdXQubmV4dCgnLCcpO1xuIH07XG5cbi8qXG5cblxuXG5cbiAgICovXG5jb25zdCByZWN1cj0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG4vL1xucmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiB9XG4vL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihxY2xhc3MsJ3N0cmluZycpO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbi8vXG4vL1xuLy9cbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuLy9cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbi8vXG5yZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihkaWdpdHMsJ3N0cmluZycpO1xucmV0dXJuIG91dC5uZXh0KCBgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8vXG5yZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbmNvbnN0IHJlZ2lzdGVyZWROYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKHJlZ2lzdGVyZWROYW1lPT09dW5kZWZpbmVkKXtcbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5hc3NlcnQobWF0Y2ghPT1udWxsKTtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmFzc2VydChTeW1ib2xbc3VmZml4XT09PXN5bSk7XG5hc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gfVxucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xub3V0Lm5leHQoIGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG5kZWNvZGUocGF5bG9hZCk7XG5yZXR1cm4gb3V0Lm5leHQoJyknKTtcbiB9XG5cbmNhc2Unc2xvdCc6e1xubGV0e2lmYWNlfT1yYXdUcmVlO1xuY29uc3QgaW5kZXg9TnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG5jb25zdCBuZXN0ZWRSZW5kZXI9KGFyZyk9PntcbmNvbnN0IG9sZE91dD1vdXQ7XG50cnl7XG5vdXQ9bWFrZU5vSW5kZW50ZXIoKTtcbmRlY29kZShhcmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfWZpbmFsbHl7XG5vdXQ9b2xkT3V0O1xuIH1cbiB9O1xuaWYoaW5kZXg8c2xvdHMubGVuZ3RoKXtcbmNvbnN0IHNsb3Q9bmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90VG9WYWwoJHtzbG90fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0sJHtpZmFjZX0pYCk7XG4gfWVsc2UgaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiB9XG5cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbm91dC5vcGVuKCd7Jyk7XG5kZWNvZGVQcm9wZXJ0eShRQ0xBU1Msb3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKHJlc3QsJ29iamVjdCcpO1xuYXNzZXJ0KHJlc3QhPT1udWxsKTtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxubmFtZSlcbiB9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxuZGVjb2RlUHJvcGVydHkobmFtZSxyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cblxuY2FzZSdlcnJvcic6e1xuY29uc3R7XG5uYW1lLFxubWVzc2FnZSxcbmNhdXNlPXVuZGVmaW5lZCxcbmVycm9ycz11bmRlZmluZWR9PVxucmF3VHJlZTtcbmNhdXNlPT09dW5kZWZpbmVkfHxcbkZhaWwgYGVycm9yIGNhdXNlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xubmFtZSE9PSBgQWdncmVnYXRlRXJyb3JgfHxcbkZhaWwgYEFnZ3JlZ2F0ZUVycm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuZXJyb3JzPT09dW5kZWZpbmVkfHxcbkZhaWwgYGVycm9yIGVycm9ycyBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8vXG4vL1xuY29uc3QgbmFtZXM9LyogICAgICAgICAgICAgICAgICAgKi9vd25LZXlzKHJhd1RyZWUpO1xuaWYobmFtZXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gfWVsc2V7XG5vdXQub3BlbigneycpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuZGVjb2RlUHJvcGVydHkobmFtZSxyYXdUcmVlW25hbWVdKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuIH1cbiB9O1xucHJlcGFyZShlbmNvZGluZyk7XG5kZWNvZGUoZW5jb2RpbmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfTskaM2PX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEQSpudcBgAAXAYAAC0AAABAZW5kby9tYXJzaGFsLXYxLjYuMi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3Q9KHZhbCk9PlxuRmFpbCBgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWw9KHNsb3QsX2lmYWNlKT0+XG5GYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyPWhhcmRlbih7XG5nZXQ6KF90YXJnZXQsbmFtZSxfcmVjZWl2ZXIpPT57XG5pZihuYW1lPT09J2xlbmd0aCcpe1xucmV0dXJuIDA7XG4gfVxuLy9cbnRocm93IEZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuIH19KTtcblxuXG5jb25zdCBiYWRBcnJheT1oYXJkZW4obmV3IFByb3h5KGhhcmRlbihbXSksYmFkQXJyYXlIYW5kbGVyKSk7XG5cbmNvbnN0e3NlcmlhbGl6ZSx1bnNlcmlhbGl6ZX09bWFrZU1hcnNoYWwoXG5kb05vdENvbnZlcnRWYWxUb1Nsb3QsXG5kb05vdENvbnZlcnRTbG90VG9WYWwsXG57XG5lcnJvclRhZ2dpbmc6J29mZicsXG4vL1xuc2VyaWFsaXplQm9keUZvcm1hdDonY2FwZGF0YSd9KTtcblxuXG5cbi8qXG5cblxuICovXG5jb25zdCBzdHJpbmdpZnk9KHZhbCk9PnNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjNj19vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qXG5cblxuICovXG5jb25zdCBwYXJzZT0oc3RyKT0+XG51bnNlcmlhbGl6ZShcbmhhcmRlbih7XG5ib2R5OnN0cixcbnNsb3RzOmJhZEFycmF5fSkpOyRozY9fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKcNSTionAAAqJwAAIwAAAEBlbmRvL21hcnNoYWwtdjEuNi4yL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5T2YsdG9QYXNzYWJsZUVycm9yLFgsRmFpbCxxLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLG9iamVjdE1hcCxRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIiwgWyRozY9fYSA9PiAodG9QYXNzYWJsZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIiwgWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIiwgWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIiwgWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjNj19hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjNj19hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLCBbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLCBbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRozY9fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5cbmNvbnN0e2RlZmluZVByb3BlcnRpZXN9PU9iamVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm49KHgpPT54O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm49KHgsXyk9Png7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXJzaGFsPShcbmNvbnZlcnRWYWxUb1Nsb3Q9ZGVmYXVsdFZhbFRvU2xvdEZuLFxuY29udmVydFNsb3RUb1ZhbD1kZWZhdWx0U2xvdFRvVmFsRm4sXG57XG5lcnJvclRhZ2dpbmc9J29uJyxcbm1hcnNoYWxOYW1lPSdhbm9uLW1hcnNoYWwnLFxuLy9cbi8vXG5lcnJvcklkTnVtPTEwMDAwLFxuLy9cbi8vXG5tYXJzaGFsU2F2ZUVycm9yPShlcnIpPT5cbmNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJyxlcnIpLFxuLy9cbi8vXG5zZXJpYWxpemVCb2R5Rm9ybWF0PSdjYXBkYXRhJ309XG57fSk9Plxue1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwnc3RyaW5nJyk7XG5lcnJvclRhZ2dpbmc9PT0nb24nfHxcbmVycm9yVGFnZ2luZz09PSdvZmYnfHxcbkZhaWwgYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG5jb25zdCBuZXh0RXJyb3JJZD0oKT0+e1xuZXJyb3JJZE51bSs9MTtcbnJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gfTtcblxuLypcblxuICAgKi9cbmNvbnN0IHRvQ2FwRGF0YT0ocm9vdCk9PntcbmNvbnN0IHNsb3RzPVtdO1xuLy9cbmNvbnN0IHNsb3RNYXA9bmV3IE1hcCgpO1xuXG4vKlxuXG5cbiAgICAgKi9cbmNvbnN0IGVuY29kZVNsb3RDb21tb249KHBhc3NhYmxlKT0+e1xubGV0IGluZGV4PXNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbmlmKGluZGV4IT09dW5kZWZpbmVkKXtcbi8vXG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDp0cnVlfSk7XG4gfVxuXG5pbmRleD1zbG90cy5sZW5ndGg7XG5jb25zdCBzbG90PWNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuc2xvdHMucHVzaChzbG90KTtcbnNsb3RNYXAuc2V0KHBhc3NhYmxlLGluZGV4KTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDpmYWxzZX0pO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICAgICAqL1xuY29uc3QgZW5jb2RlRXJyb3JDb21tb249KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IG1lc3NhZ2U9ZW5jb2RlUmVjdXIoIGAke2Vyci5tZXNzYWdlfWApO1xuYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCdzdHJpbmcnKTtcbmNvbnN0IG5hbWU9ZW5jb2RlUmVjdXIoIGAke2Vyci5uYW1lfWApO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbi8vXG4vL1xuLy9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGVycm9ySWQ9ZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG5hc3NlcnQudHlwZW9mKGVycm9ySWQsJ3N0cmluZycpO1xuYW5ub3RhdGVFcnJvcihlcnIsWCBgU2VudCBhcyAke2Vycm9ySWR9YCk7XG5tYXJzaGFsU2F2ZUVycm9yKGVycik7XG5yZXR1cm4gaGFyZGVuKHtlcnJvcklkLG1lc3NhZ2UsbmFtZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7bWVzc2FnZSxuYW1lfSk7XG4gfVxuIH07XG5cbmlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nY2FwZGF0YScpe1xuLypcblxuXG5cbiAgICAgICAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHZhbCxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEodmFsLGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gICAgICAgKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qXG5cblxuXG5cbiAgICAgICAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLy9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vL1xuLy9cbmJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG5zbG90c30pO1xuXG4gfWVsc2V7XG4vL1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgdmFsTWFwPW5ldyBNYXAoKTtcblxuLypcblxuXG4gICAgICovXG5jb25zdCBkZWNvZGVTbG90Q29tbW9uPShzbG90RGF0YSk9PntcbmNvbnN0e2lmYWNlPXVuZGVmaW5lZCxpbmRleCwuLi5yZXN0fT1zbG90RGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuY29uc3QgZXh0YW50PXZhbE1hcC5nZXQoaW5kZXgpO1xuaWYoZXh0YW50KXtcbnJldHVybiBleHRhbnQ7XG4gfVxuLy9cbi8vXG5jb25zdCBzbG90PXNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG5jb25zdCB2YWw9Y29udmVydFNsb3RUb1ZhbChzbG90LGlmYWNlKTtcbnZhbE1hcC5zZXQoaW5kZXgsdmFsKTtcbnJldHVybiB2YWw7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAgICAgKi9cbmNvbnN0IGRlY29kZUVycm9yQ29tbW9uPShlcnJEYXRhLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7XG5lcnJvcklkPXVuZGVmaW5lZCxcbm1lc3NhZ2UsXG5uYW1lLFxuY2F1c2U9dW5kZWZpbmVkLFxuZXJyb3JzPXVuZGVmaW5lZCxcbi4uLnJlc3R9PVxuZXJyRGF0YTtcbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBkTmFtZT1kZWNvZGVSZWN1cihuYW1lKTtcbmNvbnN0IGRNZXNzYWdlPWRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuLy9cbmNvbnN0IGRFcnJvcklkPS8qICAgICAgICAgICAgICAgICAqL2Vycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xuaWYodHlwZW9mIGROYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xuIH1cbmlmKHR5cGVvZiBkTWVzc2FnZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbiB9XG5jb25zdCBlcnJDb25zdHJ1Y3Rvcj1nZXRFcnJvckNvbnN0cnVjdG9yKGROYW1lKXx8RXJyb3I7XG5jb25zdCBlcnJvck5hbWU9XG5kRXJyb3JJZD09PXVuZGVmaW5lZD9cbiBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfWA6XG4gYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX0oJHtkRXJyb3JJZH0pYDtcbmNvbnN0IG9wdGlvbnM9e1xuZXJyb3JOYW1lLFxuc2FuaXRpemU6ZmFsc2V9O1xuXG5pZihjYXVzZSl7XG5vcHRpb25zLmNhdXNlPWRlY29kZVJlY3VyKGNhdXNlKTtcbiB9XG5pZihlcnJvcnMpe1xub3B0aW9ucy5lcnJvcnM9ZGVjb2RlUmVjdXIoZXJyb3JzKTtcbiB9XG5jb25zdCByYXdFcnJvcj1tYWtlRXJyb3IoZE1lc3NhZ2UsZXJyQ29uc3RydWN0b3Isb3B0aW9ucyk7XG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgZGVzY3M9b2JqZWN0TWFwKHJlc3QsKGRhdGEpPT4oe1xudmFsdWU6ZGVjb2RlUmVjdXIoZGF0YSksXG53cml0YWJsZTpmYWxzZSxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2V9KSk7XG5cbmRlZmluZVByb3BlcnRpZXMocmF3RXJyb3IsZGVzY3MpO1xuaGFyZGVuKHJhd0Vycm9yKTtcbnJldHVybiB0b1Bhc3NhYmxlRXJyb3IocmF3RXJyb3IpO1xuIH07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9Pntcbi8qXG5cblxuXG4gICAgICAgKi9cbnJldHVybihzdHJpbmdFbmNvZGluZyxfZGVjb2RlUmVjdXIpPT57XG5hc3NlcnQoc3RyaW5nRW5jb2RpbmcuY2hhckF0KDApPT09cHJlZml4KTtcbi8vXG5jb25zdCBpPXN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbmNvbnN0IGluZGV4PU51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLGk8MD91bmRlZmluZWQ6aSkpO1xuLy9cbmNvbnN0IGlmYWNlPWk8MD91bmRlZmluZWQ6c3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSsxKTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHtpZmFjZSxpbmRleH0pO1xuIH07XG4gfTtcbmNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG5jb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyxkZWNvZGVSZWN1cik9PntcbmNvbnN0eycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdEVyckRhdGF9PWVuY29kaW5nO1xuIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsJ21lc3NhZ2UnKXx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX0sZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuLy9cbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4vL1xuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfSk7XG4gfTtcblxuLypcblxuICAgKi9cbmNvbnN0IGZyb21DYXBEYXRhPShkYXRhKT0+e1xuY29uc3R7Ym9keSxzbG90c309ZGF0YTtcbnR5cGVvZiBib2R5PT09J3N0cmluZyd8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuaXNBcnJheShkYXRhLnNsb3RzKXx8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuY29uc3R7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc309bWFrZUZ1bGxSZXZpdmUoc2xvdHMpO1xubGV0IHJlc3VsdDtcbi8vXG5pZihib2R5LmNoYXJBdCgwKT09PScjJyl7XG5jb25zdCBzbWFsbGNhcHNCb2R5PWJvZHkuc2xpY2UoMSk7XG5jb25zdCBlbmNvZGluZz1oYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiB9ZWxzZXtcbmNvbnN0IHJhd1RyZWU9aGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gfVxuLy9cbi8vXG4vL1xuYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbnJldHVybiAoLyogICAgICAgICAgICAgICAgICAgICAgKi9yZXN1bHQpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe1xudG9DYXBEYXRhLFxuZnJvbUNhcERhdGEsXG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuc2VyaWFsaXplOnRvQ2FwRGF0YSxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbnVuc2VyaWFsaXplOmZyb21DYXBEYXRhfSk7XG5cbiB9OyRozY9fb25jZS5tYWtlTWFyc2hhbChtYWtlTWFyc2hhbCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC7402JnCcAAJwnAAAlAAAAQGVuZG8vbWFyc2hhbC12MS42LjIvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIiwiLi9lbmNvZGVQYXNzYWJsZS5qcyJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZVJhbmsiLCJjb3ZlcmVkRW50cmllcyIsImdldEluZGV4Q292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciIsImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpc1JhbmtTb3J0ZWQiLCJtYWtlQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Iiwic29ydEJ5UmFuayIsInRyaXZpYWxDb21wYXJhdG9yIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsRmFpbCxxLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm89KHgseSk9Png9PT15fHxpcyh4LHkpO1xuXG5jb25zdCAgICAgICAgdHJpdmlhbENvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT5cbi8vXG5sZWZ0PHJpZ2h0Py0xOmxlZnQ9PT1yaWdodD8wOjE7XG5cbi8qXG5cbiAqLyRozY9fb25jZS50cml2aWFsQ29tcGFyYXRvcih0cml2aWFsQ29tcGFyYXRvcik7XG5cbmNvbnN0IHBhc3NTdHlsZVJhbmtzPS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5mcm9tRW50cmllcyhcbmVudHJpZXMocGFzc1N0eWxlUHJlZml4ZXMpXG4vL1xuLnNvcnQoKFtfbGVmdFN0eWxlLGxlZnRQcmVmaXhlc10sW19yaWdodFN0eWxlLHJpZ2h0UHJlZml4ZXNdKT0+e1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcyxyaWdodFByZWZpeGVzKTtcbiB9KS5cbm1hcCgoW3Bhc3NTdHlsZSxwcmVmaXhlc10saW5kZXgpPT57XG4vL1xuLy9cbi8vXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0UGFzc1N0eWxlQ292ZXI9KHBhc3NTdHlsZSk9PnBhc3NTdHlsZVJhbmtzW3Bhc3NTdHlsZV0uY292ZXI7JGjNj19vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qXG5cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkPW5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29tcGFyYXRvcktpdD0oY29tcGFyZVJlbW90YWJsZXM9KF94LF95KT0+TmFOKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuLypcblxuICAgICAqL1xuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLy9cbi8vXG5yZXR1cm4gMDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOntcbi8vXG4vL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGNvbXBhcmF0b3IoXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpKTtcblxuIH1cbmNhc2UnbnVtYmVyJzp7XG4vL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8vXG4vL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0TmFtZXMscmlnaHROYW1lcyk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbGVmdFZhbHVlcz1yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpO1xuY29uc3QgcmlnaHRWYWx1ZXM9cmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpO1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdFZhbHVlcyxyaWdodFZhbHVlcyk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8vXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8vXG4vL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLy9cbmNvbnN0IGxhYmVsQ29tcD1jb21wYXJhdG9yKGdldFRhZyhsZWZ0KSxnZXRUYWcocmlnaHQpKTtcbmlmKGxhYmVsQ29tcCE9PTApe1xucmV0dXJuIGxhYmVsQ29tcDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQscmlnaHQucGF5bG9hZCk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuIH19XG5cbi8qICAgICAgICAgICAgICAgKi9cbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgb3V0ZXJDb21wYXJhdG9yPSh4LHkpPT5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL2NvbXBhcmF0b3IoeCx5KXx8MDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGFudGlDb21wYXJhdG9yPSh4LHkpPT5vdXRlckNvbXBhcmF0b3IoeSx4KTtcblxubWVtb09mU29ydGVkLnNldChvdXRlckNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQob3V0ZXJDb21wYXJhdG9yLGFudGlDb21wYXJhdG9yKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLG91dGVyQ29tcGFyYXRvcik7XG5cbnJldHVybiBoYXJkZW4oe2NvbXBhcmF0b3I6b3V0ZXJDb21wYXJhdG9yLGFudGlDb21wYXJhdG9yfSk7XG4gfTtcbi8qXG5cblxuICovJGjNj19vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuY29uc3QgICAgICAgIGlzUmFua1NvcnRlZD0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuaWYoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpPT09J2NvcHlBcnJheScpO1xuZm9yKGxldCBpPTE7aTxwYXNzYWJsZXMubGVuZ3RoO2krPTEpe1xuaWYoY29tcGFyZShwYXNzYWJsZXNbaS0xXSxwYXNzYWJsZXNbaV0pPj0xKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xucmV0dXJuIHRydWU7XG4gfTskaM2PX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRSYW5rU29ydGVkPShzb3J0ZWQsY29tcGFyZSk9PlxuaXNSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKXx8XG4vL1xuLy9cbkZhaWwgYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLGNvbXBhcmUpfWA7JGjNj19vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHNvcnRCeVJhbms9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuaWYoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKXtcbmhhcmRlbihwYXNzYWJsZXMpO1xuLy9cbi8vXG4vL1xuaWYoaXNSYW5rU29ydGVkKHBhc3NhYmxlcyxjb21wYXJlKSl7XG5yZXR1cm4gcGFzc2FibGVzO1xuIH1cbiB9XG5jb25zdCB1bnNvcnRlZD1bLi4ucGFzc2FibGVzXTtcbnVuc29ydGVkLmZvckVhY2goaGFyZGVuKTtcbmNvbnN0IHNvcnRlZD11bnNvcnRlZC5zb3J0KGNvbXBhcmUpO1xuLy9cbi8vXG4vL1xuaWYoY29tcGFyZSh0cnVlLHVuZGVmaW5lZCk+MCl7XG5sZXQgaT1zb3J0ZWQubGVuZ3RoLTE7XG53aGlsZShpPj0wJiZzb3J0ZWRbaV09PT11bmRlZmluZWQpaS09MTtcbmNvbnN0IG49c29ydGVkLmxlbmd0aC1pLTE7XG5pZihuPjAmJm48c29ydGVkLmxlbmd0aCl7XG5zb3J0ZWQuY29weVdpdGhpbihuLDApO1xuc29ydGVkLmZpbGwoLyogICAgICAgICAgICAqL3VuZGVmaW5lZCwwLG4pO1xuIH1cbiB9XG5oYXJkZW4oc29ydGVkKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjNj19vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRJbmRleENvdmVyPShzb3J0ZWQsY29tcGFyZSxbbGVmdEtleSxyaWdodEtleV0pPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmNvbnN0IGxlZnRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLGxlZnRLZXksJ2xlZnRNb3N0Jyk7XG5jb25zdCByaWdodEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUscmlnaHRLZXksJ3JpZ2h0TW9zdCcpO1xucmV0dXJuW2xlZnRJbmRleCxyaWdodEluZGV4XTtcbiB9OyRozY9fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbmNvbnN0ICAgICAgICBjb3ZlcmVkRW50cmllcz0oc29ydGVkLFtsZWZ0SW5kZXgscmlnaHRJbmRleF0pPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpdGVyYWJsZT1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPWxlZnRJbmRleDtcbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuaWYoaTw9cmlnaHRJbmRleCl7XG5jb25zdCBlbGVtZW50PXNvcnRlZFtpXTtcbmkrPTE7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTpbaSxlbGVtZW50XSxkb25lOmZhbHNlfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTp1bmRlZmluZWQsZG9uZTp0cnVlfSk7XG4gfVxuIH19KTtcblxuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjNj19vbmNlLmNvdmVyZWRFbnRyaWVzKGNvdmVyZWRFbnRyaWVzKTtcbmhhcmRlbihjb3ZlcmVkRW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYXhSYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKT49MD9hOmI7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtaW5SYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKTw9MD9hOmI7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLypcblxuXG5cbiAgICovXG5jb25zdCB1bmlvblJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWluUmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1heFJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKHVuaW9uUmFua0NvdmVyUGFpcixbJ3snLCcnXSk7XG4gfTskaM2PX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLypcblxuXG5cbiAgICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRozY9fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG5jb25zdCAgICAgICB7Y29tcGFyYXRvcjpjb21wYXJlUmFuayxhbnRpQ29tcGFyYXRvcjpjb21wYXJlQW50aVJhbmt9PVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjNj19vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuY29uc3QgICAgICAgIG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0PShsb25nTGl2ZWQ9ZmFsc2UpPT57XG5sZXQgbnVtU2Vlbj0wO1xuLy9cbi8vXG4vL1xuY29uc3QgTWFwQ29uc3RydWN0b3I9bG9uZ0xpdmVkP1dlYWtNYXA6TWFwO1xuY29uc3Qgc2Vlbj1uZXcgTWFwQ29uc3RydWN0b3IoKTtcbmNvbnN0IHRhZz0ocik9PntcbmlmKHNlZW4uaGFzKHIpKXtcbnJldHVybiBzZWVuLmdldChyKTtcbiB9XG5udW1TZWVuKz0xO1xuc2Vlbi5zZXQocixudW1TZWVuKTtcbnJldHVybiBudW1TZWVuO1xuIH07XG5jb25zdCBjb21wYXJlUmVtb3RhYmxlcz0oeCx5KT0+Y29tcGFyZVJhbmsodGFnKHgpLHRhZyh5KSk7XG5yZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xuIH07JGjNj19vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cml2aWFsQ29tcGFyYXRvciI6WyJ0cml2aWFsQ29tcGFyYXRvciJdLCJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABLrDk0oBAABKAQAAIQAAAEBlbmRvL21hcnNoYWwtdjEuNi4yL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAX+pOglkFAABZBQAAHgAAAEBlbmRvL25hdC12NS4wLjEzL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRozY9fb25jZS5pc05hdChpc05hdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdCwgJ25hbWUnLCB7dmFsdWU6IFwiTmF0XCJ9KTskaM2PX29uY2UuTmF0KE5hdCk7ICAgLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5yZXR1cm4gYWxsZWdlZE51bT49MDtcbiB9XG5pZih0eXBlb2YgYWxsZWdlZE51bSE9PSdudW1iZXInKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbnJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSYmYWxsZWdlZE51bT49MDtcbiB9XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiB9XG5cbnRocm93IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKEpqrw/CgAAPwoAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvc3RyaW5nLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIiwiaXNPYmplY3QiLCJpc09iamVjdCIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9zdHJpbmcuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2l0ZXItaGVscGVycy5qcyI6W1sibWFwSXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLFsiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSJdXSwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOltbIlBBU1NfU1RZTEUiLCJQQVNTX1NUWUxFIl0sWyJpc09iamVjdCIsImlzT2JqZWN0Il0sWyJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q2hlY2tlciJdLFsiZ2V0VGFnIiwiZ2V0VGFnIl0sWyJoYXNPd25Qcm9wZXJ0eU9mIiwiaGFzT3duUHJvcGVydHlPZiJdXSwiLi9zcmMvZXJyb3IuanMiOltbImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRFcnJvckNvbnN0cnVjdG9yIl0sWyJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIl1dLCIuL3NyYy9yZW1vdGFibGUuanMiOltbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXV0sIi4vc3JjL3N5bWJvbC5qcyI6W1siYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLFsiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiXSxbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLFsicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl1dLCIuL3NyYy9zdHJpbmcuanMiOltbImlzV2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0UGFzc2FibGVTdHJpbmciXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSJdLFsiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSJdLFsidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIl0sWyJ0b1Rocm93YWJsZSIsInRvVGhyb3dhYmxlIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdLFsiR0VUX01FVEhPRF9OQU1FUyIsIkdFVF9NRVRIT0RfTkFNRVMiXV0sIi4vc3JjL3R5cGVHdWFyZHMuanMiOltbImFzc2VydFJlY29yZCIsImFzc2VydFJlY29yZCJdLFsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5Il0sWyJhc3NlcnRSZW1vdGFibGUiLCJhc3NlcnRSZW1vdGFibGUiXSxbImlzUmVtb3RhYmxlIiwiaXNSZW1vdGFibGUiXSxbImlzUmVjb3JkIiwiaXNSZWNvcmQiXSxbImlzQ29weUFycmF5IiwiaXNDb3B5QXJyYXkiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJeovyVUBgAAVAYAACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9zcmMvY29weUFycmF5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5QXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWCxhc3NlcnRDaGVja2VyLGdldE93bkRhdGFEZXNjcmlwdG9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIiwgWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2FuQmVWYWxpZD0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PlxuaXNBcnJheShjYW5kaWRhdGUpfHxcbiEhY2hlY2smJmNoZWNrKGZhbHNlLFggYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZCxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGV8fFxuYXNzZXJ0LmZhaWwoWCBgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vL1xuLy9cbmNvbnN0IGxlbj0vKiAgICAgICAgICAgICAgICAgKi9cbmdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwnbGVuZ3RoJyxmYWxzZSxhc3NlcnRDaGVja2VyKS52YWx1ZTtcblxuLy9cbi8vXG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbnBhc3NTdHlsZU9mUmVjdXIoXG5nZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpLnZhbHVlKTtcblxuIH1cbi8vXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbiB9fSk7JGjNj19vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAyz0q1KQgAACkIAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxnZXRPd25EYXRhRGVzY3JpcHRvcixDWDskaM2PX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLCBbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJDWFwiLCBbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZixwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBjaGVja09iamVjdFByb3RvdHlwZT0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbnJldHVybihcbmdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk9PT1vYmplY3RQcm90b3R5cGV8fFxuISFjaGVjayYmXG5DWChjaGVjaykgYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YCk7XG5cbiB9O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkPShjYW5kaWRhdGUsa2V5LHZhbHVlLGNoZWNrPXVuZGVmaW5lZCk9PntcbnJldHVybihcbih0eXBlb2Yga2V5PT09J3N0cmluZyd8fFxuISFjaGVjayYmXG5DWChcbmNoZWNrKVxuIGBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApJiYoXG4hY2FuQmVNZXRob2QodmFsdWUpfHxcbiEhY2hlY2smJlxuLy9cbkNYKFxuY2hlY2spXG4gYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBDb3B5UmVjb3JkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlSZWNvcmQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xucmV0dXJuKFxuY2hlY2tPYmplY3RQcm90b3R5cGUoY2FuZGlkYXRlLGNoZWNrKSYmXG4vL1xuLy9cbm93bktleXMoY2FuZGlkYXRlKS5ldmVyeSgoa2V5KT0+XG5jaGVja1Byb3BlcnR5Q2FuQmVWYWxpZChjYW5kaWRhdGUsa2V5LGNhbmRpZGF0ZVtrZXldLGNoZWNrKSkpO1xuXG5cbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jaGVja09iamVjdFByb3RvdHlwZShjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8vXG4vL1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKXtcbmNvbnN0e3ZhbHVlfT1nZXRPd25EYXRhRGVzY3JpcHRvcihcbmNhbmRpZGF0ZSxcbm5hbWUsXG50cnVlLFxuYXNzZXJ0Q2hlY2tlcik7XG5cbmNoZWNrUHJvcGVydHlDYW5CZVZhbGlkKGNhbmRpZGF0ZSxuYW1lLHZhbHVlLGFzc2VydENoZWNrZXIpO1xucGFzc1N0eWxlT2ZSZWN1cih2YWx1ZSk7XG4gfVxuIH19KTskaM2PX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABwIuV6VgoAAFYKAAAuAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vbWFrZVRhZ2dlZC5qcyJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLHEsRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LHBhc3NTdHlsZU9mLG1ha2VUYWdnZWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLCBbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkPWFzeW5jKHZhbCk9Pntcbi8vXG4vL1xuLy9cblxuaWYoIWlzT2JqZWN0KHZhbCkpe1xucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovdmFsKTtcbiB9XG5pZihpc1Byb21pc2UodmFsKSl7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuY29uc3QgcmVjPS8qICAgICAgICAgICAgICAgICAgICAgKi92YWw7XG5jb25zdCBuYW1lcz0vKiAgICAgICAgICAgICAgICAgICAqL293bktleXMocmVjKTtcbmNvbnN0IHZhbFBzPW5hbWVzLm1hcCgobmFtZSk9PmRlZXBseUZ1bGZpbGxlZChyZWNbbmFtZV0pKTtcbi8vXG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PlxuaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLGkpPT5bbmFtZXNbaV0sY10pKSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IGFycj0vKiAgICAgICAgICAgICAgICAgICAgKi92YWw7XG5jb25zdCB2YWxQcz1hcnIubWFwKChwKT0+ZGVlcGx5RnVsZmlsbGVkKHApKTtcbi8vXG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PmhhcmRlbih2YWxzKSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRnZD0vKiAgICAgICAgICAgICAgICAgICAgICovdmFsO1xuY29uc3QgdGFnPWdldFRhZyh0Z2QpO1xuLy9cbnJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHRnZC5wYXlsb2FkKSwocGF5bG9hZCk9PlxubWFrZVRhZ2dlZCh0YWcscGF5bG9hZCkpO1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlbT0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi92YWw7XG4vL1xucmV0dXJuIHJlbTtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBlcnI9LyogICAgICAgICAgICAgICAgKi92YWw7XG4vL1xucmV0dXJuIGVycjtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHByb209LyogICAgICAgICAgICAgICAgICAqLyAvKiAgICAgICAgICAgICAgICAgICovdmFsO1xucmV0dXJuIEUud2hlbihwcm9tLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTskaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQ5uKqDQSAAA0EgAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43L3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHEsYXNzZXJ0Q2hlY2tlcixDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsIFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdHtnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLGhhc093bixlbnRyaWVzfT1PYmplY3Q7XG5cbi8vXG4vL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnM9bmV3IE1hcChcbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5bXG5bJ0Vycm9yJyxFcnJvcl0sXG5bJ0V2YWxFcnJvcicsRXZhbEVycm9yXSxcblsnUmFuZ2VFcnJvcicsUmFuZ2VFcnJvcl0sXG5bJ1JlZmVyZW5jZUVycm9yJyxSZWZlcmVuY2VFcnJvcl0sXG5bJ1N5bnRheEVycm9yJyxTeW50YXhFcnJvcl0sXG5bJ1R5cGVFcnJvcicsVHlwZUVycm9yXSxcblsnVVJJRXJyb3InLFVSSUVycm9yXVxuXG4vL1xuLy9cbi8vXG4vL1xuXSk7XG5cblxuaWYodHlwZW9mIEFnZ3JlZ2F0ZUVycm9yIT09J3VuZGVmaW5lZCcpe1xuLy9cbmVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLEFnZ3JlZ2F0ZUVycm9yKTtcbiB9XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3Rvcj0obmFtZSk9PmVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaM2PX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tFcnJvckxpa2U9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG4vL1xucmV0dXJuKFxuY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3J8fFxuISFjaGVjayYmQ1goY2hlY2spIGBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzRXJyb3JMaWtlPShjYW5kaWRhdGUpPT5jaGVja0Vycm9yTGlrZShjYW5kaWRhdGUpOyRozY9fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjPShcbnByb3BOYW1lLFxuZGVzYyxcbnBhc3NTdHlsZU9mUmVjdXIsXG5jaGVjaz11bmRlZmluZWQpPT5cbntcbmlmKGRlc2MuZW51bWVyYWJsZSl7XG5yZXR1cm4oXG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgUGFzc2FibGUgRXJyb3IgJHtxKFxucHJvcE5hbWUpXG4gfSBvd24gcHJvcGVydHkgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtkZXNjfWApO1xuXG4gfVxuaWYoIWhhc093bihkZXNjLCd2YWx1ZScpKXtcbnJldHVybihcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWApO1xuXG4gfVxuY29uc3R7dmFsdWV9PWRlc2M7XG5zd2l0Y2gocHJvcE5hbWUpe1xuY2FzZSdtZXNzYWdlJzpcbmNhc2Unc3RhY2snOntcbnJldHVybihcbnR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnfHxcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3ZhbHVlfWApO1xuXG4gfVxuY2FzZSdjYXVzZSc6e1xuLy9cbnJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSxwYXNzU3R5bGVPZlJlY3VyLGNoZWNrKTtcbiB9XG5jYXNlJ2Vycm9ycyc6e1xuaWYoIUFycmF5LmlzQXJyYXkodmFsdWUpfHxwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybihcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgY29weUFycmF5OiAke3ZhbHVlfWApO1xuXG4gfVxucmV0dXJuIHZhbHVlLmV2ZXJ5KChlcnIpPT5cbi8vXG5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIscGFzc1N0eWxlT2ZSZWN1cixjaGVjaykpO1xuXG4gfVxuZGVmYXVsdDp7XG5icmVhaztcbiB9fVxuXG5yZXR1cm4oXG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgUGFzc2FibGUgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnR5ICR7cShwcm9wTmFtZSl9YCk7XG5cbiB9OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcj0oXG5jYW5kaWRhdGUsXG5wYXNzU3R5bGVPZlJlY3VyLFxuY2hlY2s9dW5kZWZpbmVkKT0+XG57XG5pZighY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgZXJyQ29uc3RydWN0b3I9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbmlmKGVyckNvbnN0cnVjdG9yPT09dW5kZWZpbmVkfHxlcnJDb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT1wcm90byl7XG5yZXR1cm4oXG4hIWNoZWNrJiZcbkNYKFxuY2hlY2spXG4gYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApO1xuXG4gfVxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYoISgnbWVzc2FnZSdpbiBkZXNjcykpe1xucmV0dXJuKFxuISFjaGVjayYmXG5DWChcbmNoZWNrKVxuIGBQYXNzYWJsZSBFcnJvciBtdXN0IGhhdmUgYW4gb3duIFwibWVzc2FnZVwiIHN0cmluZyBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk7XG5cbiB9XG5cbnJldHVybiBlbnRyaWVzKGRlc2NzKS5ldmVyeSgoW3Byb3BOYW1lLGRlc2NdKT0+XG5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhcbnByb3BOYW1lLFxuZGVzYyxcbnBhc3NTdHlsZU9mUmVjdXIsXG5jaGVjaykpO1xuXG5cbiB9OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG4gKi9cbmNvbnN0ICAgICAgICBFcnJvckhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidlcnJvcicsXG5cbmNhbkJlVmFsaWQ6Y2hlY2tFcnJvckxpa2UsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PlxuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIsYXNzZXJ0Q2hlY2tlcil9KTskaM2PX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sImlzRXJyb3JMaWtlIjpbImlzRXJyb3JMaWtlIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEFP/E+PBQAAjwUAACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9zcmMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRozY9fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5cbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBmaWx0ZXJJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLHByZWQpPT5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5GYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuZm9yKDs7KXtcbmNvbnN0IHJlc3VsdD1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3R7dmFsdWUsZG9uZX09cmVzdWx0O1xuaWYoZG9uZXx8cHJlZCh2YWx1ZSkpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuIH19KTtcblxuIH19KTskaM2PX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuXG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZM/ib0ERAABBEQAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43L3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZ2V0TWV0aG9kTmFtZXMscSxGYWlsLGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLCBbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRozY9fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGU9KFxuLy9cbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qICAgICAgICAgICAgKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8vXG4vL1xucHJvcHM9PT11bmRlZmluZWR8fEZhaWwgYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuLy9cbmFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbi8vXG4hKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxucmVtb3RhYmxlW1BBU1NfU1RZTEVdKVxuIH1gO1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5oYXJkZW4uaXNGYWtlfHxcbi8vXG4haXNGcm96ZW4ocmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbmNvbnN0IHJlbW90YWJsZVByb3RvPW1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsaWZhY2UpO1xuXG4vL1xuLy9cbmNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrPSh0YXJnZXQpPT57XG4vL1xuc2V0UHJvdG90eXBlT2YodGFyZ2V0LHJlbW90YWJsZVByb3RvKTtcbmhhcmRlbih0YXJnZXQpO1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiB9O1xuXG4vL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4vL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuLy9cbi8vXG5hc3NlcnQoaWZhY2UhPT11bmRlZmluZWQpOy8vXG5yZXR1cm4gKC8qICAgICAgICAgICAgICAqL3JlbW90YWJsZSk7XG4gfTskaM2PX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIEdFVF9NRVRIT0RfTkFNRVM9J19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2Q9aGFyZGVuKHtcbltHRVRfTUVUSE9EX05BTUVTXSgpe1xucmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuIH19KVtcbkdFVF9NRVRIT0RfTkFNRVNdO1xuXG5jb25zdCBnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3I9aGFyZGVuKHtcbnZhbHVlOmdldE1ldGhvZE5hbWVzTWV0aG9kLFxuZW51bWVyYWJsZTpmYWxzZSxcbmNvbmZpZ3VyYWJsZTpmYWxzZSxcbndyaXRhYmxlOmZhbHNlfSk7XG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIEZhcj0oZmFyTmFtZSxyZW1vdGFibGU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgcj1yZW1vdGFibGU9PT11bmRlZmluZWQ/LyogICAgICAgICAgICAqL3t9OnJlbW90YWJsZTtcbmlmKHR5cGVvZiByPT09J29iamVjdCcmJiEoR0VUX01FVEhPRF9OQU1FUyBpbiByKSl7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsR0VUX01FVEhPRF9OQU1FUyxnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3IpO1xuIH1cbnJldHVybiBSZW1vdGFibGUoIGBBbGxlZ2VkOiAke2Zhck5hbWV9YCx1bmRlZmluZWQscik7XG4gfTskaM2PX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIFRvRmFyRnVuY3Rpb249KGZhck5hbWUsZnVuYyk9PntcbmlmKGdldEludGVyZmFjZU9mKGZ1bmMpIT09dW5kZWZpbmVkKXtcbi8vXG5yZXR1cm4gZnVuYztcbiB9XG4vL1xucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaM2PX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACvRoL+ABAAAgAQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVGFnZ2VkPSh0YWcscGF5bG9hZCk9PntcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gO1xuYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2JqZWN0UHJvdG90eXBlLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3RhZ2dlZCd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOnRhZ30sXG5wYXlsb2FkOnt2YWx1ZTpwYXlsb2FkLGVudW1lcmFibGU6dHJ1ZX19KSk7XG5cblxuIH07JGjNj19vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADSKSdxQVAAAUFQAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43L3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJDWCIsIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldE93bkRhdGFEZXNjcmlwdG9yIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IFgscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbmdldFByb3RvdHlwZU9mLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZzp0b1N0cmluZ1RhZ1N5bWJvbH09U3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlPWdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxudHlwZWRBcnJheVByb3RvdHlwZSxcbnRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPXR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9PT0nZnVuY3Rpb24nKTtcblxuY29uc3QgICAgICAgIGhhc093blByb3BlcnR5T2Y9KG9iaixwcm9wKT0+XG5hcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSxvYmosW3Byb3BdKTskaM2PX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbmhhcmRlbihoYXNPd25Qcm9wZXJ0eU9mKTtcblxuLy9cbmNvbnN0ICAgICAgICBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7JGjNj19vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpc1R5cGVkQXJyYXk9KG9iamVjdCk9Pntcbi8vXG5jb25zdCB0YWc9YXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLG9iamVjdCxbXSk7XG5yZXR1cm4gdGFnIT09dW5kZWZpbmVkO1xuIH07JGjNj19vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuY29uc3QgICAgICAgIGNhbkJlTWV0aG9kPShmdW5jKT0+XG50eXBlb2YgZnVuYz09PSdmdW5jdGlvbicmJiEoUEFTU19TVFlMRSBpbiBmdW5jKTskaM2PX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENoZWNrZXI9KGNvbmQsZGV0YWlscyk9PntcbmFzc2VydChjb25kLGRldGFpbHMpO1xucmV0dXJuIHRydWU7XG4gfTskaM2PX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgQ1g9KGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpO1xucmV0dXJuIHJlamVjdDtcbiB9OyRozY9fb25jZS5DWChDWCk7XG5oYXJkZW4oQ1gpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yPShcbmNhbmRpZGF0ZSxcbnByb3BOYW1lLFxuc2hvdWxkQmVFbnVtZXJhYmxlLFxuY2hlY2spPT5cbntcbmNvbnN0IGRlc2M9LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLHByb3BOYW1lKTtcblxucmV0dXJuKGRlc2MhPT11bmRlZmluZWR8fFxuISFjaGVjayYmQ1goY2hlY2spIGAke3EocHJvcE5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkmJihcbmhhc093blByb3BlcnR5T2YoZGVzYywndmFsdWUnKXx8XG4hIWNoZWNrJiZcbkNYKFxuY2hlY2spXG4gYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSYmKFxuc2hvdWxkQmVFbnVtZXJhYmxlP1xuZGVzYy5lbnVtZXJhYmxlfHxcbiEhY2hlY2smJlxuQ1goXG5jaGVjaylcbiBgJHtxKHByb3BOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gOlxuIWRlc2MuZW51bWVyYWJsZXx8XG4hIWNoZWNrJiZcbkNYKFxuY2hlY2spXG4gYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApP1xuZGVzYzpcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAvKiAgICAgICAgICAgICAgICAgICovdW5kZWZpbmVkO1xuIH07JGjNj19vbmNlLmdldE93bkRhdGFEZXNjcmlwdG9yKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcbmhhcmRlbihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRUYWc9KHRhZ1JlY29yZCk9PnRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRozY9fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG5jb25zdCAgICAgICAgY2hlY2tQYXNzU3R5bGU9KG9iaixwYXNzU3R5bGUsZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5yZXR1cm4oXG5wYXNzU3R5bGU9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EocGFzc1N0eWxlKX06ICR7b2JqfWApO1xuXG4gfTskaM2PX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLypcblxuXG5cblxuICAgKi9cbmNvbnN0IGNoZWNrVGFnUmVjb3JkPSh0YWdSZWNvcmQsZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5yZXR1cm4oXG4oaXNPYmplY3QodGFnUmVjb3JkKXx8XG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkmJihcbmlzRnJvemVuKHRhZ1JlY29yZCl8fFxuISFjaGVjayYmQ1goY2hlY2spIGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkmJihcbiFpc0FycmF5KHRhZ1JlY29yZCl8fFxuISFjaGVjayYmQ1goY2hlY2spIGBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApJiZcbmNoZWNrUGFzc1N0eWxlKFxudGFnUmVjb3JkLFxuZ2V0T3duRGF0YURlc2NyaXB0b3IodGFnUmVjb3JkLFBBU1NfU1RZTEUsZmFsc2UsY2hlY2spLnZhbHVlLFxuZXhwZWN0ZWRQYXNzU3R5bGUsXG5jaGVjaykmJihcblxudHlwZW9mIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCxTeW1ib2wudG9TdHJpbmdUYWcsZmFsc2UsY2hlY2spLlxudmFsdWU9PT0nc3RyaW5nJ3x8XG4hIWNoZWNrJiZcbkNYKFxuY2hlY2spXG4gYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkmJlxuY2hlY2tQcm90byh0YWdSZWNvcmQsZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSxjaGVjaykpO1xuXG4gfTtcbnJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuIH07XG5cbmNvbnN0ICAgICAgICBjaGVja1RhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKGZhbHNlLFggYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKTskaM2PX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuXG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY2hlY2tGdW5jdGlvblRhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbnByb3RvIT09bnVsbCYmZ2V0UHJvdG90eXBlT2YocHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhcbmZhbHNlLFxuWCBgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5cblxuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJDWCI6WyJDWCJdLCJnZXRPd25EYXRhRGVzY3JpcHRvciI6WyJnZXRPd25EYXRhRGVzY3JpcHRvciJdLCJnZXRUYWciOlsiZ2V0VGFnIl0sImNoZWNrUGFzc1N0eWxlIjpbImNoZWNrUGFzc1N0eWxlIl0sImNoZWNrVGFnUmVjb3JkIjpbImNoZWNrVGFnUmVjb3JkIl0sImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiOlsiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAUDE1+sCQAALAkAAAqAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vY29weUFycmF5LmpzIiwiLi9jb3B5UmVjb3JkLmpzIiwiLi90YWdnZWQuanMiLCIuL2Vycm9yLmpzIiwiLi9yZW1vdGFibGUuanMiLCIuL3N5bWJvbC5qcyIsIi4vc2FmZS1wcm9taXNlLmpzIiwiLi9zdHJpbmcuanMiXSwiZXhwb3J0cyI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCIsImFzc2VydFBhc3NhYmxlIiwiaXNQYXNzYWJsZSIsInBhc3NTdHlsZU9mIiwidG9QYXNzYWJsZUVycm9yIiwidG9UaHJvd2FibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgaXNQcm9taXNlLFgsRmFpbCxxLGFubm90YXRlRXJyb3IsbWFrZUVycm9yLGlzT2JqZWN0LGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsIFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsIFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcImlzVHlwZWRBcnJheVwiLCBbJGjNj19hID0+IChpc1R5cGVkQXJyYXkgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLCBbJGjNj19hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIiwgWyRozY9fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIiwgWyRozY9fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRozY9fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2NcIiwgWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JcIiwgWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRozY9fYSA9PiAoYXNzZXJ0U2FmZVByb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3N0cmluZy5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTdHJpbmdcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLHZhbHVlc309T2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZVBhc3NTdHlsZU9mPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuY29uc3QgSGVscGVyVGFibGU9bWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuY29uc3QgcmVtb3RhYmxlSGVscGVyPUhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gICAqL1xuLy9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8vXG4vL1xuLy9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5jb25zdCBpbm5lclN0eWxlPXBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbmlmKGlubmVyU3R5bGUpe1xucmV0dXJuIGlubmVyU3R5bGU7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbD0oaW5uZXIpPT57XG5jb25zdCB0eXBlc3RyPXR5cGVvZiBpbm5lcjtcbnN3aXRjaCh0eXBlc3RyKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIHR5cGVzdHI7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmFzc2VydFBhc3NhYmxlU3RyaW5nKGlubmVyKTtcbnJldHVybidzdHJpbmcnO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLy9cbi8vXG5pc1R5cGVkQXJyYXkoaW5uZXIpP1xuWCBgQ2Fubm90IHBhc3MgbXV0YWJsZSB0eXBlZCBhcnJheXMgbGlrZSAke2lubmVyfS5gOlxuWCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWApO1xuXG4gfVxuaWYoaXNQcm9taXNlKGlubmVyKSl7XG5hc3NlcnRTYWZlUHJvbWlzZShpbm5lcik7XG5yZXR1cm4ncHJvbWlzZSc7XG4gfVxudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5jb25zdCBwYXNzU3R5bGVUYWc9aW5uZXJbUEFTU19TVFlMRV07XG5pZihwYXNzU3R5bGVUYWchPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihwYXNzU3R5bGVUYWcsJ3N0cmluZycpO1xuY29uc3QgaGVscGVyPUhlbHBlclRhYmxlW3Bhc3NTdHlsZVRhZ107XG5oZWxwZXIhPT11bmRlZmluZWR8fFxuRmFpbCBgVW5yZWNvZ25pemVkIFBhc3NTdHlsZTogJHtxKHBhc3NTdHlsZVRhZyl9YDtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiAoLyogICAgICAgICAgICAgICAgICAgICovcGFzc1N0eWxlVGFnKTtcbiB9XG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuaWYoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKXtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiBoZWxwZXIuc3R5bGVOYW1lO1xuIH1cbiB9XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5jYXNlJ2Z1bmN0aW9uJzp7XG5pc0Zyb3plbihpbm5lcil8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWA7XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoWCBgVW5yZWNvZ25pemVkIHR5cGVvZiAke3EodHlwZXN0cil9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9O1xuXG5yZXR1cm4gcGFzc1N0eWxlT2ZSZWN1cihwYXNzYWJsZSk7XG4gfTtcbnJldHVybiBoYXJkZW4ocGFzc1N0eWxlT2YpO1xuIH07XG5cbmNvbnN0ICAgICAgICBQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbD1TeW1ib2wuZm9yKCdAZW5kbyBwYXNzU3R5bGVPZicpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPVxuZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF18fFxubWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5FcnJvckhlbHBlcixcblJlbW90YWJsZUhlbHBlcl0pOyRozY9fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlPSh2YWwpPT57XG5wYXNzU3R5bGVPZih2YWwpOy8vXG4gfTskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpc1Bhc3NhYmxlPShzcGVjaW1lbik9PntcbnRyeXtcbi8vXG4vL1xucmV0dXJuIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSE9PXVuZGVmaW5lZDtcbiB9Y2F0Y2goXyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH07JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG5oYXJkZW4oaXNQYXNzYWJsZSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYz0obmFtZSxkZXNjKT0+XG5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhuYW1lLGRlc2MscGFzc1N0eWxlT2YpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuaGFyZGVuKGVycik7XG5pZihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIscGFzc1N0eWxlT2YpKXtcbnJldHVybiBlcnI7XG4gfVxuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5jb25zdHtjYXVzZTpjYXVzZURlc2MsZXJyb3JzOmVycm9yc0Rlc2N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlcnIpO1xubGV0IGNhdXNlO1xubGV0IGVycm9ycztcbmlmKGNhdXNlRGVzYyYmaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdjYXVzZScsY2F1c2VEZXNjKSl7XG5jYXVzZT1jYXVzZURlc2MudmFsdWU7XG4gfVxuaWYoZXJyb3JzRGVzYyYmaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdlcnJvcnMnLGVycm9yc0Rlc2MpKXtcbmVycm9ycz1lcnJvcnNEZXNjLnZhbHVlO1xuIH1cblxuY29uc3QgZXJyQ29uc3RydWN0b3I9Z2V0RXJyb3JDb25zdHJ1Y3RvciggYCR7bmFtZX1gKXx8RXJyb3I7XG5jb25zdCBuZXdFcnJvcj1tYWtlRXJyb3IoIGAke21lc3NhZ2V9YCxlcnJDb25zdHJ1Y3Rvcix7XG4vL1xuY2F1c2UsXG5lcnJvcnN9KTtcblxuLy9cbmhhcmRlbihuZXdFcnJvcik7XG4vL1xuLy9cbi8vXG5hbm5vdGF0ZUVycm9yKG5ld0Vycm9yLFggYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xucGFzc1N0eWxlT2YobmV3RXJyb3IpPT09J2Vycm9yJ3x8XG5GYWlsIGBFeHBlY3RlZCAke25ld0Vycm9yfSB0byBiZSBhIHBhc3NhYmxlIGVycm9yYDtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRozY9fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgdG9UaHJvd2FibGU9KHNwZWNpbWVuKT0+e1xuaGFyZGVuKHNwZWNpbWVuKTtcbmlmKGlzRXJyb3JMaWtlKHNwZWNpbWVuKSl7XG5yZXR1cm4gdG9QYXNzYWJsZUVycm9yKC8qICAgICAgICAgICAgICAgICovc3BlY2ltZW4pO1xuIH1cbi8vXG4vL1xuLy9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihpc09iamVjdChzcGVjaW1lbikpe1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgZWxlbWVudHM9LyogICAgICAgICAgICAgICAgICAgICovc3BlY2ltZW47XG5mb3IoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cyl7XG5lbGVtZW50PT09dG9UaHJvd2FibGUoZWxlbWVudCl8fFxuRmFpbCBgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZWxlbWVudH1gO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuY29uc3QgcmVjPS8qICAgICAgICAgICAgICAgICAgICAgKi9zcGVjaW1lbjtcbmZvcihjb25zdCB2YWwgb2YgdmFsdWVzKHJlYykpe1xudmFsPT09dG9UaHJvd2FibGUodmFsKXx8XG5GYWlsIGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHt2YWx9YDtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGc9LyogICAgICAgICAgICAgICAgICAgICAqL3NwZWNpbWVuO1xuY29uc3R7cGF5bG9hZH09dGc7XG5wYXlsb2FkPT09dG9UaHJvd2FibGUocGF5bG9hZCl8fFxuRmFpbCBgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7cGF5bG9hZH1gO1xuYnJlYWs7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZXI9LyogICAgICAgICAgICAgICAgKi9zcGVjaW1lbjtcbmVyPT09dG9UaHJvd2FibGUoZXIpfHxcbkZhaWwgYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VyfWA7XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYEEgJHtxKHBhc3NTdHlsZSl9IGlzIG5vdCB0aHJvd2FibGU6ICR7c3BlY2ltZW59YDtcbiB9fVxuXG4gfVxucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9zcGVjaW1lbik7XG4gfTskaM2PX29uY2UudG9UaHJvd2FibGUodG9UaHJvd2FibGUpO1xuaGFyZGVuKHRvVGhyb3dhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIl0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl0sImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl0sInRvVGhyb3dhYmxlIjpbInRvVGhyb3dhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFKEe3qmFwAAphcAACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwscSxhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGhhc093blByb3BlcnR5T2YsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZyxDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRozY9fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLCBbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIiwgWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIkNYXCIsIFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZSxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5yZXR1cm4oXG4vL1xuKHR5cGVvZiBpZmFjZT09PSdzdHJpbmcnfHxcbiEhY2hlY2smJlxuQ1goXG5jaGVjaylcbiBgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSYmKFxuaWZhY2U9PT0nUmVtb3RhYmxlJ3x8XG5pZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKXx8XG5pZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpfHxcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBGb3Igbm93LCBpZmFjZSAke3EoXG5pZmFjZSlcbiB9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpO1xuXG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRJZmFjZT0oaWZhY2UpPT5jaGVja0lmYWNlKGlmYWNlLGFzc2VydENoZWNrZXIpOyRozY9fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuaXNPYmplY3Qob3JpZ2luYWwpfHxcbkZhaWwgYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbmlmKFxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxucHJvdG89PT1udWxsfHxcbnByb3RvPT09RnVuY3Rpb24ucHJvdG90eXBlKVxue1xucmV0dXJuKFxuISFjaGVjayYmXG5DWChjaGVjaykgYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWApO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8vXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLy9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiAgICAgICAgICAgICAgICAgICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiAgICAgICAgICAgICAgICAgICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vL1xuWy8qICAgICAgICAgICAgICAgICAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyogICAgICAgICAgICAgICAgICovdGFnS2V5XTp7dmFsdWU6aWZhY2V9LFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG5yZXR1cm4oXG4ob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuISFjaGVjayYmXG5DWChcbmNoZWNrKVxuIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApJiZcbmNoZWNrSWZhY2UoaWZhY2UsY2hlY2spKTtcblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcz1uZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZighaXNGcm96ZW4odmFsKSl7XG5yZXR1cm4oXG4hIWNoZWNrJiZDWChjaGVjaykgYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG5cbiB9XG4vL1xuaWYoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHJlc3VsdD1jaGVja1JlbW90YWJsZVByb3RvT2YodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlT2Y9KHZhbCk9PntcbmlmKFxuIWlzT2JqZWN0KHZhbCl8fFxudmFsW1BBU1NfU1RZTEVdIT09J3JlbW90YWJsZSd8fFxuIWNoZWNrUmVtb3RhYmxlKHZhbCkpXG57XG4vL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vL1xucmV0dXJuIGdldFRhZyh2YWwpO1xuIH07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3JlbW90YWJsZScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCB2YWxpZFR5cGU9XG4oaXNPYmplY3QoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkmJihcbiFpc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmXG5DWChjaGVjaykgYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKTtcbmlmKCF2YWxpZFR5cGUpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdvYmplY3QnKXtcbi8vXG4vL1xucmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4vL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyogICAgICAgICAgICAgICAgICova2V5XSwndmFsdWUnKXx8XG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSYmKFxua2V5PT09U3ltYm9sLnRvU3RyaW5nVGFnJiZjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLGNoZWNrKXx8XG4oY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkmJihcbmtleSE9PVBBU1NfU1RZTEV8fFxuISFjaGVjayYmXG5DWChjaGVjaykgYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKTtcblxuIH0pO1xuIH1lbHNlIGlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nZnVuY3Rpb24nKXtcbi8vXG4vL1xuY29uc3R7XG5uYW1lOm5hbWVEZXNjLFxubGVuZ3RoOmxlbmd0aERlc2MsXG4vL1xuW1N5bWJvbC50b1N0cmluZ1RhZ106dG9TdHJpbmdUYWdEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmRlc2NzO1xuY29uc3QgcmVzdEtleXM9b3duS2V5cyhyZXN0RGVzY3MpO1xucmV0dXJuKFxuKG5hbWVEZXNjJiZ0eXBlb2YgbmFtZURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkmJihcbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxuISFjaGVjayYmXG5DWChcbmNoZWNrKVxuIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApJiYoXG50b1N0cmluZ1RhZ0Rlc2M9PT11bmRlZmluZWR8fFxuKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG4hIWNoZWNrJiZcbkNYKFxuY2hlY2spXG4gYEZhciBmdW5jdGlvbiBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApJiZcbmNoZWNrSWZhY2UodG9TdHJpbmdUYWdEZXNjLnZhbHVlLGNoZWNrKSkmJihcbnJlc3RLZXlzLmxlbmd0aD09PTB8fFxuISFjaGVjayYmXG5DWChcbmNoZWNrKVxuIGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpO1xuXG4gfVxucmV0dXJuISFjaGVjayYmQ1goY2hlY2spIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADFGADMhgwAAIYMAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgaXNQcm9taXNlLHEsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiQ1hcIiwgWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3J9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZ309U3ltYm9sO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IGtleXM9b3duS2V5cyhwcik7XG5cbmlmKGtleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCB1bmtub3duS2V5cz1rZXlzLmZpbHRlcihcbihrZXkpPT50eXBlb2Yga2V5IT09J3N5bWJvbCd8fCFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLGtleSkpO1xuXG5cbmlmKHVua25vd25LZXlzLmxlbmd0aCE9PTApe1xucmV0dXJuIENYKFxuY2hlY2spXG4gYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YDtcbiB9XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBjaGVja1NhZmVPd25LZXk9KGtleSk9PntcbmlmKGtleT09PXRvU3RyaW5nVGFnKXtcbi8vXG4vL1xuY29uc3QgdGFnRGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHIsdG9TdHJpbmdUYWcpO1xuYXNzZXJ0KHRhZ0Rlc2MhPT11bmRlZmluZWQpO1xucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YodGFnRGVzYywndmFsdWUnKXx8XG5DWChcbmNoZWNrKVxuIGBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eSwgbm90IGFuIGFjY2Vzc29yOiAke3EodGFnRGVzYyl9YCkmJihcbnR5cGVvZiB0YWdEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxuQ1goXG5jaGVjaylcbiBgT3duIEBAdG9TdHJpbmdUYWcgdmFsdWUgbXVzdCBiZSBhIHN0cmluZzogJHtxKHRhZ0Rlc2MudmFsdWUpfWApJiYoXG4hdGFnRGVzYy5lbnVtZXJhYmxlfHxcbkNYKGNoZWNrKSBgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtxKHRhZ0Rlc2MpfWApKTtcblxuIH1cbmNvbnN0IHZhbD1wcltrZXldO1xuaWYodmFsPT09dW5kZWZpbmVkfHx0eXBlb2YgdmFsPT09J251bWJlcicpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoXG50eXBlb2YgdmFsPT09J29iamVjdCcmJlxudmFsIT09bnVsbCYmXG5pc0Zyb3plbih2YWwpJiZcbmdldFByb3RvdHlwZU9mKHZhbCk9PT1PYmplY3QucHJvdG90eXBlKVxue1xuY29uc3Qgc3ViS2V5cz1vd25LZXlzKHZhbCk7XG5pZihzdWJLZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5pZihcbnN1YktleXMubGVuZ3RoPT09MSYmXG5zdWJLZXlzWzBdPT09J2Rlc3Ryb3llZCcmJlxudmFsLmRlc3Ryb3llZD09PWZhbHNlKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBDWChcbmNoZWNrKVxuIGBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcblN0cmluZyhrZXkpKVxuIH0gaXMgJHt2YWx9YDtcbiB9O1xuXG5yZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVPd25LZXkpO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlPShwcixjaGVjayk9PntcbnJldHVybihcbihpc0Zyb3plbihwcil8fENYKGNoZWNrKSBgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApJiYoXG5pc1Byb21pc2UocHIpfHxDWChjaGVjaykgYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxuQ1goY2hlY2spIGAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG5nZXRQcm90b3R5cGVPZihwcikpXG4gfWApJiZcbmNoZWNrUHJvbWlzZU93bktleXMoLyogICAgICAgICAgICAgICAgICAqL3ByLGNoZWNrKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpc1NhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsKHgpPT54KTskaM2PX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgICAgICAgIGFzc2VydFNhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYl18ssgcAALIHAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL3N0cmluZy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRFbnZpcm9ubWVudE9wdGlvbixGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsIFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cbi8vXG5jb25zdCBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kPSEhU3RyaW5nLnByb3RvdHlwZS5pc1dlbGxGb3JtZWQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgaXNXZWxsRm9ybWVkU3RyaW5nPWhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2Q/XG4oc3RyKT0+dHlwZW9mIHN0cj09PSdzdHJpbmcnJiZzdHIuaXNXZWxsRm9ybWVkKCk6XG4oc3RyKT0+e1xuaWYodHlwZW9mIHN0ciE9PSdzdHJpbmcnKXtcbnJldHVybiBmYWxzZTtcbiB9XG5mb3IoY29uc3QgY2ggb2Ygc3RyKXtcbi8vXG4vL1xuLy9cbmNvbnN0IGNwPS8qICAgICAgICAgICAgICAgICAqL2NoLmNvZGVQb2ludEF0KDApO1xuaWYoY3A+PTB4ZDgwMCYmY3A8PTB4ZGZmZil7XG4vL1xuLy9cbi8vXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07JGjNj19vbmNlLmlzV2VsbEZvcm1lZFN0cmluZyhpc1dlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZz0oc3RyKT0+e1xuaXNXZWxsRm9ybWVkU3RyaW5nKHN0cil8fEZhaWwgYEV4cGVjdGVkIHdlbGwtZm9ybWVkIHVuaWNvZGUgc3RyaW5nOiAke3N0cn1gO1xuIH07JGjNj19vbmNlLmFzc2VydFdlbGxGb3JtZWRTdHJpbmcoYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5cbmNvbnN0IE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRT1cbmdldEVudmlyb25tZW50T3B0aW9uKCdPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUnLCdkaXNhYmxlZCcsW1xuJ2VuYWJsZWQnXSk9PT1cbidlbmFibGVkJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3RyaW5nPShzdHIpPT57XG50eXBlb2Ygc3RyPT09J3N0cmluZyd8fEZhaWwgYEV4cGVjdGVkIHN0cmluZyAke3N0cn1gO1xuIU9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRXx8YXNzZXJ0V2VsbEZvcm1lZFN0cmluZyhzdHIpO1xuIH07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3RyaW5nKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1dlbGxGb3JtZWRTdHJpbmciOlsiaXNXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFdlbGxGb3JtZWRTdHJpbmciOlsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRQYXNzYWJsZVN0cmluZyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABmP1mV/AkAAPwJAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTsgICBcblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLypcblxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz1uZXcgTWFwKFxub3duS2V5cyhTeW1ib2wpLlxuZmlsdGVyKFxuKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnJiZ0eXBlb2YgU3ltYm9sW25hbWVdPT09J3N5bWJvbCcpLlxuXG5maWx0ZXIoKG5hbWUpPT57XG4vL1xuIW5hbWUuc3RhcnRzV2l0aCgnQEAnKXx8XG5GYWlsIGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG5uYW1lKVxuIH1gO1xucmV0dXJuIHRydWU7XG4gfSlcbi8vXG4ubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGVTeW1ib2w9KHN5bSk9PlxudHlwZW9mIHN5bT09PSdzeW1ib2wnJiYoXG50eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pPT09J3N0cmluZyd8fHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaM2PX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRozY9fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzYWJsZVN5bWJvbEZvck5hbWU9KG5hbWUpPT57XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmlmKG1hdGNoKXtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmlmKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gfWVsc2V7XG5jb25zdCBzeW09U3ltYm9sW3N1ZmZpeF07XG5pZih0eXBlb2Ygc3ltPT09J3N5bWJvbCcpe1xucmV0dXJuIHN5bTtcbiB9XG5GYWlsIGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiB9XG4gfVxucmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG4gfTskaM2PX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYNVjnhQHAAAUBwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43L3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxnZXRPd25EYXRhRGVzY3JpcHRvcixjaGVja1Bhc3NTdHlsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLCBbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLCBbJGjNj19hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSxjYW5kaWRhdGVbUEFTU19TVFlMRV0sJ3RhZ2dlZCcsY2hlY2spLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsJ3RhZ2dlZCcsYXNzZXJ0Q2hlY2tlcik7XG5cbi8vXG5jb25zdCBwYXNzU3R5bGVLZXk9LyogICAgICAgICAgICAgICAgICAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyogICAgICAgICAgICAgICAgICAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLy9cblsvKiAgICAgICAgICAgICAgICAgKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qICAgICAgICAgICAgICAgICAqL3RhZ0tleV06X2xhYmVsRGVzYyxcbnBheWxvYWQ6X3BheWxvYWREZXNjLC8vXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuRmFpbCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuLy9cbi8vXG5wYXNzU3R5bGVPZlJlY3VyKFxuZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpLnZhbHVlKTtcblxuIH19KTskaM2PX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA6/CS3+CAAA/ggAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwscSxwYXNzU3R5bGVPZjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgaXNDb3B5QXJyYXk9KGFycik9PnBhc3NTdHlsZU9mKGFycik9PT0nY29weUFycmF5JzskaM2PX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRozY9fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjNj19vbmNlLmlzUmVtb3RhYmxlKGlzUmVtb3RhYmxlKTtcbmhhcmRlbihpc1JlbW90YWJsZSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydENvcHlBcnJheT0oYXJyYXksb3B0TmFtZU9mQXJyYXk9J0FsbGVnZWQgYXJyYXknKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKGFycmF5KTtcbnBhc3NTdHlsZT09PSdjb3B5QXJyYXknfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyYXl9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaM2PX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkPShyZWNvcmQsb3B0TmFtZU9mUmVjb3JkPSdBbGxlZ2VkIHJlY29yZCcpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVjb3JkKTtcbnBhc3NTdHlsZT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjNj19vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZT0oXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGU9J0FsbGVnZWQgcmVtb3RhYmxlJyk9Plxue1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG5wYXNzU3R5bGU9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaM2PX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAS6w5NKAQAASgEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMWHV+m3DgAAtw4AAB4AAABAZW5kby9wYXR0ZXJucy12MS40LjcvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMva2V5cy9jaGVja0tleS5qcyIsIi4vc3JjL2tleXMvY29weVNldC5qcyIsIi4vc3JjL2tleXMvY29weUJhZy5qcyIsIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiLCJiYWdVbmlvbiIsImJhZ1VuaW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIiwic2V0Q29tcGFyZSIsInNldENvbXBhcmUiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2tleXMvY2hlY2tLZXkuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weVNldC5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5QmFnLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0Q29weVNldCJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsiaXNDb3B5QmFnIiwiaXNDb3B5QmFnIl0sWyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weUJhZyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIl0sWyJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weU1hcCJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjpbWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdXSwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjpbWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXV0sIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOltbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsiY29tcGFyZUtleXMiLCJjb21wYXJlS2V5cyJdLFsia2V5TFQiLCJrZXlMVCJdLFsia2V5TFRFIiwia2V5TFRFIl0sWyJrZXlFUSIsImtleUVRIl0sWyJrZXlHVEUiLCJrZXlHVEUiXSxbImtleUdUIiwia2V5R1QiXV0sIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6W1siZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOltbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOltbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXSxbImlzQXdhaXRBcmdHdWFyZCIsImlzQXdhaXRBcmdHdWFyZCJdLFsiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEF3YWl0QXJnR3VhcmQiXSxbImlzUmF3R3VhcmQiLCJpc1Jhd0d1YXJkIl0sWyJhc3NlcnRSYXdHdWFyZCIsImFzc2VydFJhd0d1YXJkIl0sWyJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIl0sWyJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIl0sWyJraW5kT2YiLCJraW5kT2YiXV0sIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOltbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSxbImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLFsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdXSwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6W1sibGlzdERpZmZlcmVuY2UiLCJsaXN0RGlmZmVyZW5jZSJdXSwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOltbIm9iamVjdE1hcCIsIm9iamVjdE1hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAW6U5DDkyAAA5MgAAKgAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuNy9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlTZXQuanMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlTZXQiLCJhc3NlcnRLZXkiLCJhc3NlcnRQcmltaXRpdmVLZXkiLCJhc3NlcnRTY2FsYXJLZXkiLCJjaGVja0NvcHlCYWciLCJjaGVja0NvcHlNYXAiLCJjaGVja0NvcHlTZXQiLCJjaGVja0tleSIsImNoZWNrU2NhbGFyS2V5IiwiY29weU1hcEtleVNldCIsImV2ZXJ5Q29weUJhZ0VudHJ5IiwiZXZlcnlDb3B5TWFwS2V5IiwiZXZlcnlDb3B5TWFwVmFsdWUiLCJldmVyeUNvcHlTZXRLZXkiLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJ5QXJyYXkiLCJnZXRDb3B5TWFwS2V5cyIsImdldENvcHlNYXBWYWx1ZXMiLCJnZXRDb3B5U2V0S2V5cyIsImlzQ29weUJhZyIsImlzQ29weU1hcCIsImlzQ29weVNldCIsImlzS2V5IiwiaXNQcmltaXRpdmVLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydENoZWNrZXIsYXNzZXJ0UGFzc2FibGUsRmFyLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGlkZW50Q2hlY2tlcixYLHEsRmFpbCxjaGVja0VsZW1lbnRzLG1ha2VTZXRPZkVsZW1lbnRzLGNoZWNrQmFnRW50cmllcyxtYWtlQmFnT2ZFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsIFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLCBbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIiwgWyRozY9fYSA9PiAoY2hlY2tFbGVtZW50cyA9ICRozY9fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjNj19hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiY2hlY2tCYWdFbnRyaWVzXCIsIFskaM2PX2EgPT4gKGNoZWNrQmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaM2PX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKlxuXG5cblxuICovXG5cbi8vXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJpbWl0aXZlS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc09iamVjdCh2YWwpKXtcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgJHtxKHR5cGVvZiB2YWwpfSBjYW5ub3QgYmUgYSBwcmltaXRpdmU6ICR7dmFsfWApKTtcblxuIH1cbi8vXG4vL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH07XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgaXNQcmltaXRpdmVLZXk9KHZhbCk9PmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc1ByaW1pdGl2ZUtleShpc1ByaW1pdGl2ZUtleSk7XG5oYXJkZW4oaXNQcmltaXRpdmVLZXkpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFByaW1pdGl2ZUtleT0odmFsKT0+e1xuY2hlY2tQcmltaXRpdmVLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjNj19vbmNlLmFzc2VydFByaW1pdGl2ZUtleShhc3NlcnRQcmltaXRpdmVLZXkpO1xuaGFyZGVuKGFzc2VydFByaW1pdGl2ZUtleSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1NjYWxhcktleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNQcmltaXRpdmVLZXkodmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbmlmKHBhc3NTdHlsZT09PSdyZW1vdGFibGUnKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBzY2FsYXIga2V5OiAke3ZhbH1gKTtcbiB9O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5jaGVja1NjYWxhcktleShjaGVja1NjYWxhcktleSk7XG5jb25zdCAgICAgICAgaXNTY2FsYXJLZXk9KHZhbCk9PmNoZWNrU2NhbGFyS2V5KHZhbCxpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFNjYWxhcktleT0odmFsKT0+e1xuY2hlY2tTY2FsYXJLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjNj19vbmNlLmFzc2VydFNjYWxhcktleShhc3NlcnRTY2FsYXJLZXkpO1xuaGFyZGVuKGFzc2VydFNjYWxhcktleSk7XG5cbi8vXG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG5jb25zdCBrZXlNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0tleT0odmFsLGNoZWNrKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xuLy9cbi8vXG5hc3NlcnRQYXNzYWJsZSh2YWwpO1xucmV0dXJuIHRydWU7XG4gfVxuLy9cbmlmKGtleU1lbW8uaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLy9cbmNvbnN0IHJlc3VsdD1jaGVja0tleUludGVybmFsKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuLy9cbi8vXG4vL1xua2V5TWVtby5hZGQodmFsKTtcbiB9XG4vL1xuLy9cbnJldHVybiByZXN1bHQ7XG4gfTskaM2PX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgaXNLZXk9KHZhbCk9PmNoZWNrS2V5KHZhbCxpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0tleShpc0tleSk7XG5oYXJkZW4oaXNLZXkpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydEtleT0odmFsKT0+e1xuY2hlY2tLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjNj19vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8vXG5cbi8vXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb3B5U2V0TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5U2V0PShzLGNoZWNrKT0+e1xuaWYoY29weVNldE1lbW8uaGFzKHMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihzKT09PSd0YWdnZWQnJiZnZXRUYWcocyk9PT0nY29weVNldCd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weVNldDogJHtzfWApKSYmXG5jaGVja0VsZW1lbnRzKHMucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkocy5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5U2V0TWVtby5hZGQocyk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRozY9fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldD0ocyk9PmNoZWNrQ29weVNldChzLGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlTZXQ9KHMpPT57XG5jaGVja0NvcHlTZXQocyxhc3NlcnRDaGVja2VyKTtcbiB9OyRozY9fb25jZS5hc3NlcnRDb3B5U2V0KGFzc2VydENvcHlTZXQpO1xuaGFyZGVuKGFzc2VydENvcHlTZXQpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weVNldEtleXM9KHMpPT57XG5hc3NlcnRDb3B5U2V0KHMpO1xucmV0dXJuIHMucGF5bG9hZDtcbiB9OyRozY9fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlTZXRLZXk9KHMsZm4pPT5cbmdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5U2V0S2V5KGV2ZXJ5Q29weVNldEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5U2V0S2V5KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5U2V0PShlbGVtZW50SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50SXRlcik7XG5hc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjNj19vbmNlLm1ha2VDb3B5U2V0KG1ha2VDb3B5U2V0KTtcbmhhcmRlbihtYWtlQ29weVNldCk7XG5cbi8vXG5cbi8vXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb3B5QmFnTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5QmFnPShiLGNoZWNrKT0+e1xuaWYoY29weUJhZ01lbW8uaGFzKGIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihiKT09PSd0YWdnZWQnJiZnZXRUYWcoYik9PT0nY29weUJhZyd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weUJhZzogJHtifWApKSYmXG5jaGVja0JhZ0VudHJpZXMoYi5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShiLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlCYWdNZW1vLmFkZChiKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjNj19vbmNlLmNoZWNrQ29weUJhZyhjaGVja0NvcHlCYWcpO1xuaGFyZGVuKGNoZWNrQ29weUJhZyk7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnPShiKT0+Y2hlY2tDb3B5QmFnKGIsaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLypcblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weUJhZz0oYik9PntcbmNoZWNrQ29weUJhZyhiLGFzc2VydENoZWNrZXIpO1xuIH07JGjNj19vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5QmFnRW50cmllcz0oYik9PntcbmFzc2VydENvcHlCYWcoYik7XG5yZXR1cm4gYi5wYXlsb2FkO1xuIH07JGjNj19vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weUJhZ0VudHJ5PShiLGZuKT0+XG5nZXRDb3B5QmFnRW50cmllcyhiKS5ldmVyeSgoZW50cnksaW5kZXgpPT5mbihlbnRyeSxpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlCYWdFbnRyeShldmVyeUNvcHlCYWdFbnRyeSk7XG5oYXJkZW4oZXZlcnlDb3B5QmFnRW50cnkpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlCYWc9KGJhZ0VudHJ5SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJ5SXRlcik7XG5hc3NlcnRDb3B5QmFnKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjNj19vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZ0Zyb21FbGVtZW50cz0oZWxlbWVudEl0ZXIpPT57XG4vL1xuLy9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5jb25zdCBzb3J0ZWQ9c29ydEJ5UmFuayhlbGVtZW50SXRlcixmdWxsQ29tcGFyZSk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGVudHJpZXM9W107XG5mb3IobGV0IGk9MDtpPHNvcnRlZC5sZW5ndGg7KXtcbmNvbnN0IGs9c29ydGVkW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxzb3J0ZWQubGVuZ3RoJiZmdWxsQ29tcGFyZShrLHNvcnRlZFtqXSk9PT0wKXtcbmorPTE7XG4gfVxuZW50cmllcy5wdXNoKFtrLEJpZ0ludChqLWkpXSk7XG5pPWo7XG4gfVxucmV0dXJuIG1ha2VDb3B5QmFnKGVudHJpZXMpO1xuIH07JGjNj19vbmNlLm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcbmhhcmRlbihtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5cbi8vXG5cbi8vXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb3B5TWFwTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5TWFwPShtLGNoZWNrKT0+e1xuaWYoY29weU1hcE1lbW8uaGFzKG0pKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKCEocGFzc1N0eWxlT2YobSk9PT0ndGFnZ2VkJyYmZ2V0VGFnKG0pPT09J2NvcHlNYXAnKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgTm90IGEgY29weU1hcDogJHttfWApO1xuIH1cbmNvbnN0e3BheWxvYWR9PW07XG5pZihwYXNzU3R5bGVPZihwYXlsb2FkKSE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gfVxuY29uc3R7a2V5cyx2YWx1ZXMsLi4ucmVzdH09cGF5bG9hZDtcbmNvbnN0IHJlc3VsdD1cbihvd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBvbmx5IGhhdmUgLmtleXMgYW5kIC52YWx1ZXM6ICR7bX1gKSkmJlxuXG5jaGVja0VsZW1lbnRzKGtleXMsY2hlY2spJiZcbmNoZWNrS2V5KGtleXMsY2hlY2spJiYoXG5wYXNzU3R5bGVPZih2YWx1ZXMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgLnZhbHVlcyBtdXN0IGJlIGEgY29weUFycmF5OiAke219YCkpJiYoXG5rZXlzLmxlbmd0aD09PXZhbHVlcy5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWApKTtcblxuaWYocmVzdWx0KXtcbmNvcHlNYXBNZW1vLmFkZChtKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjNj19vbmNlLmNoZWNrQ29weU1hcChjaGVja0NvcHlNYXApO1xuaGFyZGVuKGNoZWNrQ29weU1hcCk7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+Y2hlY2tDb3B5TWFwKG0saWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5TWFwKGlzQ29weU1hcCk7XG5oYXJkZW4oaXNDb3B5TWFwKTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5TWFwPShtKT0+e1xuY2hlY2tDb3B5TWFwKG0sYXNzZXJ0Q2hlY2tlcik7XG4gfTskaM2PX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcEtleXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xucmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xuIH07JGjNj19vbmNlLmdldENvcHlNYXBLZXlzKGdldENvcHlNYXBLZXlzKTtcbmhhcmRlbihnZXRDb3B5TWFwS2V5cyk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBWYWx1ZXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xucmV0dXJuIG0ucGF5bG9hZC52YWx1ZXM7XG4gfTskaM2PX29uY2UuZ2V0Q29weU1hcFZhbHVlcyhnZXRDb3B5TWFwVmFsdWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwVmFsdWVzKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBFbnRyeUFycmF5PShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbmNvbnN0e1xucGF5bG9hZDp7a2V5cyx2YWx1ZXN9fT1cbm07XG5yZXR1cm4gaGFyZGVuKGtleXMubWFwKChrZXksaSk9PltrZXksdmFsdWVzW2ldXSkpO1xuIH07JGjNj19vbmNlLmdldENvcHlNYXBFbnRyeUFycmF5KGdldENvcHlNYXBFbnRyeUFycmF5KTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cnlBcnJheSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBFbnRyaWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbmNvbnN0e1xucGF5bG9hZDp7a2V5cyx2YWx1ZXN9fT1cbm07XG5jb25zdHtsZW5ndGh9PS8qICAgICAgICAgICAgICAgICova2V5cztcbnJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmF0b3InLHtcbm5leHQ6KCk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgcmVzdWx0O1xuaWYoaTxsZW5ndGgpe1xucmVzdWx0PWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTpba2V5c1tpXSx2YWx1ZXNbaV1dfSk7XG5pKz0xO1xucmV0dXJuIHJlc3VsdDtcbiB9ZWxzZXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH19KTtcblxuIH19KTtcblxuIH07JGjNj19vbmNlLmdldENvcHlNYXBFbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwS2V5PShtLGZuKT0+XG5nZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWU9KG0sZm4pPT5cbmdldENvcHlNYXBWYWx1ZXMobSkuZXZlcnkoKHZhbHVlLGluZGV4KT0+Zm4odmFsdWUsaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5TWFwVmFsdWUoZXZlcnlDb3B5TWFwVmFsdWUpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcFZhbHVlKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgY29weU1hcEtleVNldD0obSk9PlxuLy9cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLG0ucGF5bG9hZC5rZXlzKTskaM2PX29uY2UuY29weU1hcEtleVNldChjb3B5TWFwS2V5U2V0KTtcbmhhcmRlbihjb3B5TWFwS2V5U2V0KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlNYXA9KGVudHJpZXMpPT57XG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IHNvcnRlZEVudHJpZXM9c29ydEJ5UmFuayhlbnRyaWVzLGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCBrZXlzPXNvcnRlZEVudHJpZXMubWFwKChbayxfdl0pPT5rKTtcbmNvbnN0IHZhbHVlcz1zb3J0ZWRFbnRyaWVzLm1hcCgoW19rLHZdKT0+dik7XG5jb25zdCByZXN1bHQ9bWFrZVRhZ2dlZCgnY29weU1hcCcse2tleXMsdmFsdWVzfSk7XG5hc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjNj19vbmNlLm1ha2VDb3B5TWFwKG1ha2VDb3B5TWFwKTtcbmhhcmRlbihtYWtlQ29weU1hcCk7XG5cbi8vXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrS2V5SW50ZXJuYWw9KHZhbCxjaGVjayk9PntcbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tLZXkoY2hpbGQsY2hlY2spO1xuXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG4vL1xucmV0dXJuIE9iamVjdC52YWx1ZXModmFsKS5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLy9cbnJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4oXG5jaGVja0NvcHlNYXAodmFsLGNoZWNrKSYmXG4vL1xuLy9cbi8vXG5ldmVyeUNvcHlNYXBWYWx1ZSh2YWwsY2hlY2tJdCkpO1xuXG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4oXG5jaGVjayE9PWlkZW50Q2hlY2tlciYmXG5jaGVjayhmYWxzZSxYIGBBIHBhc3NhYmxlIHRhZ2dlZCAke3EodGFnKX0gaXMgbm90IGEga2V5OiAke3ZhbH1gKSk7XG5cbiB9fVxuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbi8vXG5yZXR1cm4gdHJ1ZTtcbiB9XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIGtleWApO1xuIH1cbmRlZmF1bHQ6e1xuLy9cbi8vXG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7dmFsfWA7XG4gfX1cblxuIH07XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1ByaW1pdGl2ZUtleSI6WyJpc1ByaW1pdGl2ZUtleSJdLCJhc3NlcnRQcmltaXRpdmVLZXkiOlsiYXNzZXJ0UHJpbWl0aXZlS2V5Il0sImNoZWNrU2NhbGFyS2V5IjpbImNoZWNrU2NhbGFyS2V5Il0sImlzU2NhbGFyS2V5IjpbImlzU2NhbGFyS2V5Il0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiXSwiY2hlY2tLZXkiOlsiY2hlY2tLZXkiXSwiaXNLZXkiOlsiaXNLZXkiXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSJdLCJjaGVja0NvcHlTZXQiOlsiY2hlY2tDb3B5U2V0Il0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiYXNzZXJ0Q29weVNldCI6WyJhc3NlcnRDb3B5U2V0Il0sImdldENvcHlTZXRLZXlzIjpbImdldENvcHlTZXRLZXlzIl0sImV2ZXJ5Q29weVNldEtleSI6WyJldmVyeUNvcHlTZXRLZXkiXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiXSwiY2hlY2tDb3B5QmFnIjpbImNoZWNrQ29weUJhZyJdLCJpc0NvcHlCYWciOlsiaXNDb3B5QmFnIl0sImFzc2VydENvcHlCYWciOlsiYXNzZXJ0Q29weUJhZyJdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyJdLCJldmVyeUNvcHlCYWdFbnRyeSI6WyJldmVyeUNvcHlCYWdFbnRyeSJdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyJdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLCJjaGVja0NvcHlNYXAiOlsiY2hlY2tDb3B5TWFwIl0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwiYXNzZXJ0Q29weU1hcCI6WyJhc3NlcnRDb3B5TWFwIl0sImdldENvcHlNYXBLZXlzIjpbImdldENvcHlNYXBLZXlzIl0sImdldENvcHlNYXBWYWx1ZXMiOlsiZ2V0Q29weU1hcFZhbHVlcyJdLCJnZXRDb3B5TWFwRW50cnlBcnJheSI6WyJnZXRDb3B5TWFwRW50cnlBcnJheSJdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyJdLCJldmVyeUNvcHlNYXBLZXkiOlsiZXZlcnlDb3B5TWFwS2V5Il0sImV2ZXJ5Q29weU1hcFZhbHVlIjpbImV2ZXJ5Q29weU1hcFZhbHVlIl0sImNvcHlNYXBLZXlTZXQiOlsiY29weU1hcEtleVNldCJdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACEP4sHExUAABMVAAAtAAAAQGVuZG8vcGF0dGVybnMtdjEuNC43L3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NoZWNrS2V5LmpzIiwiLi9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyJdLCJleHBvcnRzIjpbImJhZ0NvbXBhcmUiLCJjb21wYXJlS2V5cyIsImtleUVRIiwia2V5R1QiLCJrZXlHVEUiLCJrZXlMVCIsImtleUxURSIsInNldENvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVSYW5rLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyx0cml2aWFsQ29tcGFyYXRvcixxLEZhaWwsYXNzZXJ0S2V5LGdldENvcHlCYWdFbnRyaWVzLGdldENvcHlNYXBFbnRyeUFycmF5LGdldENvcHlTZXRLZXlzLG1ha2VDb21wYXJlQ29sbGVjdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLCBbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiY29tcGFyZVJhbmtcIiwgWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXSxbXCJ0cml2aWFsQ29tcGFyYXRvclwiLCBbJGjNj19hID0+ICh0cml2aWFsQ29tcGFyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIiwgWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRozY9fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzXCIsIFtbXCJtYWtlQ29tcGFyZUNvbGxlY3Rpb25cIiwgWyRozY9fYSA9PiAobWFrZUNvbXBhcmVDb2xsZWN0aW9uID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHNldENvbXBhcmU9bWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbihzKT0+aGFyZGVuKGdldENvcHlTZXRLZXlzKHMpLm1hcCgoa2V5KT0+W2tleSwxXSkpLFxuXG4wLFxudHJpdmlhbENvbXBhcmF0b3IpOyRozY9fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuXG5oYXJkZW4oc2V0Q29tcGFyZSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBiYWdDb21wYXJlPW1ha2VDb21wYXJlQ29sbGVjdGlvbihcbmdldENvcHlCYWdFbnRyaWVzLFxuMG4sXG50cml2aWFsQ29tcGFyYXRvcik7JGjNj19vbmNlLmJhZ0NvbXBhcmUoYmFnQ29tcGFyZSk7XG5cbmhhcmRlbihiYWdDb21wYXJlKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8qXG5cblxuICovXG5jb25zdCBBQlNFTlQ9U3ltYm9sKCdhYnNlbnQnKTtcbi8qXG5cblxuXG5cblxuXG4gKi9cbi8vXG5jb25zdCBfbWFwQ29tcGFyZT1tYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG5nZXRDb3B5TWFwRW50cnlBcnJheSxcbkFCU0VOVCxcbihsZWZ0VmFsdWUscmlnaHRWYWx1ZSk9PntcbmlmKGxlZnRWYWx1ZT09PUFCU0VOVCYmcmlnaHRWYWx1ZT09PUFCU0VOVCl7XG50aHJvdyBGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBhYnNlbnQgZW50cnkgcGFpcmA7XG4gfWVsc2UgaWYobGVmdFZhbHVlPT09QUJTRU5UKXtcbnJldHVybi0xO1xuIH1lbHNlIGlmKHJpZ2h0VmFsdWU9PT1BQlNFTlQpe1xucmV0dXJuIDE7XG4gfWVsc2V7XG4vL1xucmV0dXJuIGNvbXBhcmVLZXlzKGxlZnRWYWx1ZSxyaWdodFZhbHVlKTtcbiB9XG4gfSk7XG5cbmhhcmRlbihfbWFwQ29tcGFyZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBjb21wYXJlS2V5cz0obGVmdCxyaWdodCk9PntcbmFzc2VydEtleShsZWZ0KTtcbmFzc2VydEtleShyaWdodCk7XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xuLy9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzp7XG4vL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5jb25zdCByYW5rQ29tcD1jb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbmlmKHJhbmtDb21wPT09MCl7XG5yZXR1cm4gMDtcbiB9XG5pZihOdW1iZXIuaXNOYU4obGVmdCl8fE51bWJlci5pc05hTihyaWdodCkpe1xuLy9cbmFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpfHwhTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gTmFOO1xuIH1cbi8vXG4vL1xucmV0dXJuIHJhbmtDb21wO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5pZihsZWZ0PT09cmlnaHQpe1xucmV0dXJuIDA7XG4gfVxuLy9cbi8vXG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG4vL1xuY29uc3QgcmVzdWx0PWNvbXBhcmVLZXlzKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vL1xuLy9cbi8vXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8vXG4vL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuLy9cbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG4vL1xuaWYoIWtleUVRKGxlZnROYW1lcyxyaWdodE5hbWVzKSl7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbnJldHVybiBOYU47XG4gfVxuLy9cbmNvbnN0IGxlZnRWYWx1ZXM9cmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKTtcbi8vXG5jb25zdCByaWdodFZhbHVlcz1yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcyk7XG4vL1xuLy9cbmxldCByZXN1bHQ9MDtcbmZvcihsZXQgaT0wO2k8bGVmdFZhbHVlcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBjb21wPWNvbXBhcmVLZXlzKGxlZnRWYWx1ZXNbaV0scmlnaHRWYWx1ZXNbaV0pO1xuaWYoTnVtYmVyLmlzTmFOKGNvbXApKXtcbnJldHVybiBOYU47XG4gfVxuaWYocmVzdWx0IT09Y29tcCYmY29tcCE9PTApe1xuaWYocmVzdWx0PT09MCl7XG5yZXN1bHQ9Y29tcDtcbiB9ZWxzZXtcbmFzc2VydChcbnJlc3VsdD09PS0xJiZjb21wPT09MXx8cmVzdWx0PT09MSYmY29tcD09PS0xKTtcblxucmV0dXJuIE5hTjtcbiB9XG4gfVxuIH1cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vL1xuY29uc3QgbGVmdFRhZz1nZXRUYWcobGVmdCk7XG4vL1xuY29uc3QgcmlnaHRUYWc9Z2V0VGFnKHJpZ2h0KTtcbmlmKGxlZnRUYWchPT1yaWdodFRhZyl7XG4vL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8vXG5yZXR1cm4gc2V0Q29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbi8vXG5yZXR1cm4gYmFnQ29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8vXG4vL1xudGhyb3cgRmFpbCBgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EobGVmdFN0eWxlKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9OyRozY9fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG5jb25zdCAgICAgICAga2V5TFQ9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTwwOyRozY9fb25jZS5rZXlMVChrZXlMVCk7XG5oYXJkZW4oa2V5TFQpO1xuXG5jb25zdCAgICAgICAga2V5TFRFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8PTA7JGjNj19vbmNlLmtleUxURShrZXlMVEUpO1xuaGFyZGVuKGtleUxURSk7XG5cbmNvbnN0ICAgICAgICBrZXlFUT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPT09MDskaM2PX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuY29uc3QgICAgICAgIGtleUdURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPj0wOyRozY9fb25jZS5rZXlHVEUoa2V5R1RFKTtcbmhhcmRlbihrZXlHVEUpO1xuXG5jb25zdCAgICAgICAga2V5R1Q9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT4wOyRozY9fb25jZS5rZXlHVChrZXlHVCk7XG5oYXJkZW4oa2V5R1QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0Q29tcGFyZSI6WyJzZXRDb21wYXJlIl0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyJdLCJrZXlMVCI6WyJrZXlMVCJdLCJrZXlMVEUiOlsia2V5TFRFIl0sImtleUVRIjpbImtleUVRIl0sImtleUdURSI6WyJrZXlHVEUiXSwia2V5R1QiOlsia2V5R1QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATJtmFscNAADHDQAAKQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuNy9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaM2PX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vL1xuLy9cbi8vXG4vL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbi8vXG4vL1xuLy9cbmJhZ0VudHJpZXM9c29ydEJ5UmFuayhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9YmFnRW50cmllc1tpLTFdWzBdO1xuY29uc3QgazE9YmFnRW50cmllc1tpXVswXTtcbmlmKGZ1bGxDb21wYXJlKGswLGsxKT09PTApe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzPShiYWdFbnRyaWVzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5hc3NlcnROb0R1cGxpY2F0ZUtleXMoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKTtcbmNvbnN0ICAgICAgICBjaGVja0JhZ0VudHJpZXM9KGJhZ0VudHJpZXMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihiYWdFbnRyaWVzKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmlmKCFpc1JhbmtTb3J0ZWQoYmFnRW50cmllcyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtiYWdFbnRyaWVzfWApO1xuXG4gfVxuZm9yKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpe1xuaWYoXG5wYXNzU3R5bGVPZihlbnRyeSkhPT0nY29weUFycmF5J3x8XG5lbnRyeS5sZW5ndGghPT0yfHxcbnR5cGVvZiBlbnRyeVsxXSE9PSdiaWdpbnQnKVxue1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGJlIHBhaXIgb2YgYSBrZXkgYW5kIGEgYmlnaW50IHJlcHJlc2VudGluZyBhIGNvdW50OiAke2VudHJ5fWApO1xuXG4gfVxuaWYoZW50cnlbMV08MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgaGF2ZSBhIHBvc2l0aXZlIGNvdW50OiAke2VudHJ5fWApO1xuXG4gfVxuIH1cbi8vXG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjNj19vbmNlLmNoZWNrQmFnRW50cmllcyhjaGVja0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNoZWNrQmFnRW50cmllcyk7XG5cbi8vXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydEJhZ0VudHJpZXM9KGJhZ0VudHJpZXMpPT57XG5jaGVja0JhZ0VudHJpZXMoYmFnRW50cmllcyxhc3NlcnRDaGVja2VyKTtcbiB9OyRozY9fb25jZS5hc3NlcnRCYWdFbnRyaWVzKGFzc2VydEJhZ0VudHJpZXMpO1xuaGFyZGVuKGFzc2VydEJhZ0VudHJpZXMpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNvZXJjZVRvQmFnRW50cmllcz0oYmFnRW50cmllc0xpc3QpPT57XG5jb25zdCBiYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllc0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEJhZ0VudHJpZXMoYmFnRW50cmllcyk7XG5yZXR1cm4gYmFnRW50cmllcztcbiB9OyRozY9fb25jZS5jb2VyY2VUb0JhZ0VudHJpZXMoY29lcmNlVG9CYWdFbnRyaWVzKTtcbmhhcmRlbihjb2VyY2VUb0JhZ0VudHJpZXMpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUJhZ09mRW50cmllcz0oYmFnRW50cnlJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5QmFnJyxjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjNj19vbmNlLm1ha2VCYWdPZkVudHJpZXMobWFrZUJhZ09mRW50cmllcyk7XG5oYXJkZW4obWFrZUJhZ09mRW50cmllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIl0sImNoZWNrQmFnRW50cmllcyI6WyJjaGVja0JhZ0VudHJpZXMiXSwiYXNzZXJ0QmFnRW50cmllcyI6WyJhc3NlcnRCYWdFbnRyaWVzIl0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiXSwibWFrZUJhZ09mRW50cmllcyI6WyJtYWtlQmFnT2ZFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACmeZ2zOCwAAzgsAACkAAABAZW5kby9wYXR0ZXJucy12MS40Ljcvc3JjL2tleXMvY29weVNldC5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlbWVudHMiLCJhc3NlcnROb0R1cGxpY2F0ZXMiLCJjaGVja0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyIsIm1ha2VTZXRPZkVsZW1lbnRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRozY9fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vL1xuLy9cbi8vXG4vL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9ZWxlbWVudHNbaS0xXTtcbmNvbnN0IGsxPWVsZW1lbnRzW2ldO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG5jb25zdCAgICAgICAgY2hlY2tFbGVtZW50cz0oZWxlbWVudHMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihlbGVtZW50cykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRozY9fb25jZS5jaGVja0VsZW1lbnRzKGNoZWNrRWxlbWVudHMpO1xuaGFyZGVuKGNoZWNrRWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0RWxlbWVudHM9KGVsZW1lbnRzKT0+e1xuY2hlY2tFbGVtZW50cyhlbGVtZW50cyxhc3NlcnRDaGVja2VyKTtcbiB9OyRozY9fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNvZXJjZVRvRWxlbWVudHM9KGVsZW1lbnRzTGlzdCk9PntcbmNvbnN0IGVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRFbGVtZW50cyhlbGVtZW50cyk7XG5yZXR1cm4gZWxlbWVudHM7XG4gfTskaM2PX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRPZkVsZW1lbnRzPShlbGVtZW50SXRlcik9PlxubWFrZVRhZ2dlZCgnY29weVNldCcsY29lcmNlVG9FbGVtZW50cyhlbGVtZW50SXRlcikpOyRozY9fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVzIjpbImFzc2VydE5vRHVwbGljYXRlcyJdLCJjaGVja0VsZW1lbnRzIjpbImNoZWNrRWxlbWVudHMiXSwiYXNzZXJ0RWxlbWVudHMiOlsiYXNzZXJ0RWxlbWVudHMiXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIl0sIm1ha2VTZXRPZkVsZW1lbnRzIjpbIm1ha2VTZXRPZkVsZW1lbnRzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE2RIifgEgAA4BIAADkAAABAZW5kby9wYXR0ZXJucy12MS40Ljcvc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzIiwiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanMiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyIsIm1ha2VDb21wYXJlQ29sbGVjdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLG1ha2VJdGVyYXRvcixtYWtlQXJyYXlJdGVyYXRvcixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUl0ZXJhdG9yXCIsIFskaM2PX2EgPT4gKG1ha2VJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlQXJyYXlJdGVyYXRvclwiLCBbJGjNj19hID0+IChtYWtlQXJyYXlJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXM9KGVudHJpZXMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG4vL1xuYXNzZXJ0UmFua1NvcnRlZChlbnRyaWVzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZW50cmllcztcbmxldCBpPTA7XG5sZXQgc2FtZVJhbmtJdGVyYXRvcjtcbnJldHVybiBtYWtlSXRlcmF0b3IoKCk9PntcbmlmKHNhbWVSYW5rSXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PXNhbWVSYW5rSXRlcmF0b3IubmV4dCgpO1xuaWYoIXJlc3VsdC5kb25lKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuc2FtZVJhbmtJdGVyYXRvcj11bmRlZmluZWQ7XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgZW50cnk9ZW50cmllc1tpXTtcbi8vXG5sZXQgaj1pKzE7XG53aGlsZShqPGxlbmd0aCYmcmFua0NvbXBhcmUoZW50cnlbMF0sZW50cmllc1tqXVswXSk9PT0wKXtcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG4vL1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTplbnRyeX0pO1xuIH1cbmNvbnN0IHRpZXM9ZW50cmllcy5zbGljZShpLGopO1xuaT1qO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBzb3J0ZWRUaWVzPXNvcnRCeVJhbmsodGllcyxmdWxsQ29tcGFyZSk7XG5mb3IobGV0IGs9MTtrPHNvcnRlZFRpZXMubGVuZ3RoO2srPTEpe1xuLy9cbmNvbnN0W2tleTBdPXNvcnRlZFRpZXNbay0xXTtcbmNvbnN0W2tleTFdPXNvcnRlZFRpZXNba107XG5NYXRoLnNpZ24oZnVsbENvbXBhcmUoa2V5MCxrZXkxKSl8fFxuRmFpbCBgRHVwbGljYXRlIGVudHJ5IGtleTogJHtrZXkwfWA7XG4gfVxuc2FtZVJhbmtJdGVyYXRvcj1tYWtlQXJyYXlJdGVyYXRvcihzb3J0ZWRUaWVzKTtcbnJldHVybiBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfSk7XG4gfTtcbmhhcmRlbihnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzPShcbmMxLFxuYzIsXG5nZXRFbnRyaWVzLFxuYWJzZW50VmFsdWUpPT5cbntcbmNvbnN0IGUxPWdldEVudHJpZXMoYzEpO1xuY29uc3QgZTI9Z2V0RW50cmllcyhjMik7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5jb25zdCB4PWdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMoZTEsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHk9Z2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMixjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuXG4vL1xuLy9cbmxldCB4RG9uZTtcbmxldCB4S2V5O1xubGV0IHhWYWx1ZTtcbmxldCB5RG9uZTtcbmxldCB5S2V5O1xubGV0IHlWYWx1ZTtcbmNvbnN0IG5vbkVudHJ5PVt1bmRlZmluZWQsdW5kZWZpbmVkXTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbmNvbnN0IHJlc3VsdD14VmFsdWU7XG4oe2RvbmU6eERvbmUsdmFsdWU6W3hLZXkseFZhbHVlXT1ub25FbnRyeX09eC5uZXh0KCkpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xubmV4dFgoKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbmNvbnN0IHJlc3VsdD15VmFsdWU7XG4oe2RvbmU6eURvbmUsdmFsdWU6W3lLZXkseVZhbHVlXT1ub25FbnRyeX09eS5uZXh0KCkpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xubmV4dFkoKTtcbnJldHVybiBtYWtlSXRlcmF0b3IoKCk9PntcbmxldCBkb25lPWZhbHNlO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xudmFsdWU9W3VuZGVmaW5lZCxhYnNlbnRWYWx1ZSxhYnNlbnRWYWx1ZV07XG4gfWVsc2UgaWYoeERvbmUpe1xudmFsdWU9W3lLZXksYWJzZW50VmFsdWUsbmV4dFkoKV07XG4gfWVsc2UgaWYoeURvbmUpe1xudmFsdWU9W3hLZXksbmV4dFgoKSxhYnNlbnRWYWx1ZV07XG4gfWVsc2V7XG4vL1xuLy9cbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeEtleSx5S2V5KTtcbmlmKGNvbXA9PT0wKXtcbnZhbHVlPVt4S2V5LG5leHRYKCksbmV4dFkoKV07XG4gfWVsc2UgaWYoY29tcDwwKXtcbnZhbHVlPVt4S2V5LG5leHRYKCksYWJzZW50VmFsdWVdO1xuIH1lbHNlIGlmKGNvbXA+MCl7XG52YWx1ZT1beUtleSxhYnNlbnRWYWx1ZSxuZXh0WSgpXTtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYFVuZXhwZWN0ZWQga2V5IGNvbXBhcmlzb24gJHtxKGNvbXApfSBmb3IgJHt4S2V5fSB2cyAke3lLZXl9YDtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH0pO1xuIH07JGjNj19vbmNlLmdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKTtcbmhhcmRlbihnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmVDb2xsZWN0aW9uPShnZXRFbnRyaWVzLGFic2VudFZhbHVlLGNvbXBhcmVWYWx1ZXMpPT5cbmhhcmRlbigobGVmdCxyaWdodCk9PntcbmNvbnN0IG1lcmdlZD1nZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbmxlZnQsXG5yaWdodCxcbmdldEVudHJpZXMsXG5hYnNlbnRWYWx1ZSk7XG5cbmxldCBsZWZ0SXNCaWdnZXI9ZmFsc2U7XG5sZXQgcmlnaHRJc0JpZ2dlcj1mYWxzZTtcbmZvcihjb25zdFtfa2V5LGxlZnRWYWx1ZSxyaWdodFZhbHVlXW9mIG1lcmdlZCl7XG5jb25zdCBjb21wPWNvbXBhcmVWYWx1ZXMobGVmdFZhbHVlLHJpZ2h0VmFsdWUpO1xuaWYoY29tcD09PTApe1xuLy9cbmNvbnRpbnVlO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vL1xucmlnaHRJc0JpZ2dlcj10cnVlO1xuIH1lbHNlIGlmKGNvbXA+MCl7XG4vL1xubGVmdElzQmlnZ2VyPXRydWU7XG4gfWVsc2V7XG5OdW1iZXIuaXNOYU4oY29tcCl8fFxuLy9cbkZhaWwgYFVuZXhwZWN0ZWQgdmFsdWUgY29tcGFyaXNvbiAke3EoY29tcCl9IGZvciAke2xlZnRWYWx1ZX0gdnMgJHtyaWdodFZhbHVlfWA7XG5yZXR1cm4gTmFOO1xuIH1cbmlmKGxlZnRJc0JpZ2dlciYmcmlnaHRJc0JpZ2dlcil7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG4vL1xucmV0dXJuIGxlZnRJc0JpZ2dlcj8xOnJpZ2h0SXNCaWdnZXI/LTE6MDtcbiB9KTskaM2PX29uY2UubWFrZUNvbXBhcmVDb2xsZWN0aW9uKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG5oYXJkZW4obWFrZUNvbXBhcmVDb2xsZWN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIjpbImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIl0sIm1ha2VDb21wYXJlQ29sbGVjdGlvbiI6WyJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWzrVy1IWAABSFgAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuNy9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzXCIsIFskaM2PX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlS2V5cyA9ICRozY9fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaM2PX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydD0oYmFnRW50cmllcyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoYmFnRW50cmllcyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLy9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IGVudHJ5PWJhZ0VudHJpZXNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShcbmo8bGVuZ3RoJiZcbnJhbmtDb21wYXJlKGVudHJ5WzBdLGJhZ0VudHJpZXNbal1bMF0pPT09MClcbntcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOmVudHJ5fSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1iYWdFbnRyaWVzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLy9cbi8vXG4vL1xuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8vXG4vL1xuLy9cbi8vXG4vL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6W251bGwsMG5dfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWVyZ2U9KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+e1xuLy9cbi8vXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz1iYWdXaW5kb3dSZXNvcnQoeGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPWJhZ1dpbmRvd1Jlc29ydCh5YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuLy9cbi8vXG4vL1xuLyogICAgICAgICAgICAqL1xubGV0IHg7XG5sZXQgeGM7XG5sZXQgeERvbmU7XG4vKiAgICAgICAgICAgICovXG5sZXQgeTtcbmxldCB5YztcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp4RG9uZSxcbnZhbHVlOlt4LHhjXX09XG54aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnlEb25lLFxudmFsdWU6W3kseWNdfT1cbnlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyogICAgICAgICAgICAgICAgICAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8vXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLy9cbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLy9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vL1xudmFsdWU9W3gseGMseWNdO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8vXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLy9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuLy9cbi8vXG4vKlxuXG5cblxuICovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZz0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vL1xuLy9cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc0Rpc2pvaW50PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8vXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJVbmlvbj0oeHlpKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xucmVzdWx0LnB1c2goW20seGMreWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb249KHh5aSk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjPD15Yz94Yzp5YztcbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGMteWM7XG5tYz49MG58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYobWM+PTFuKXtcbi8vXG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShiYWdJdGVyT3ApPT4oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT5cbmJhZ0l0ZXJPcChtZXJnZSh4YmFnRW50cmllcyx5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZz1tZXJnZWlmeShiYWdJdGVySXNTdXBlcmJhZyk7XG5jb25zdCBiYWdFbnRyaWVzSXNEaXNqb2ludD1tZXJnZWlmeShiYWdJdGVySXNEaXNqb2ludCk7XG5jb25zdCBiYWdFbnRyaWVzVW5pb249bWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoYmFnSXRlckludGVyc2VjdGlvbik7XG5jb25zdCBiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd0JhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxuYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpO1xuXG5jb25zdCBiYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbm1ha2VCYWdPZkVudHJpZXMoYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIGJhZ0lzU3VwZXJiYWc9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc1N1cGVyYmFnKTskaM2PX29uY2UuYmFnSXNTdXBlcmJhZyhiYWdJc1N1cGVyYmFnKTtcbmNvbnN0ICAgICAgICBiYWdJc0Rpc2pvaW50PXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNEaXNqb2ludCk7JGjNj19vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgYmFnVW5pb249YmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjNj19vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbmNvbnN0ICAgICAgICBiYWdJbnRlcnNlY3Rpb249YmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5iYWdJbnRlcnNlY3Rpb24oYmFnSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBiYWdEaXNqb2ludFN1YnRyYWN0PWJhZ2lmeShiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLmJhZ0Rpc2pvaW50U3VidHJhY3QoYmFnRGlzam9pbnRTdWJ0cmFjdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiYWdJc1N1cGVyYmFnIjpbImJhZ0lzU3VwZXJiYWciXSwiYmFnSXNEaXNqb2ludCI6WyJiYWdJc0Rpc2pvaW50Il0sImJhZ1VuaW9uIjpbImJhZ1VuaW9uIl0sImJhZ0ludGVyc2VjdGlvbiI6WyJiYWdJbnRlcnNlY3Rpb24iXSwiYmFnRGlzam9pbnRTdWJ0cmFjdCI6WyJiYWdEaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH1gizOLHAAAixwAADUAAABAZW5kby9wYXR0ZXJucy12MS40Ljcvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jb3B5U2V0LmpzIl0sImV4cG9ydHMiOlsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlcyxtYWtlU2V0T2ZFbGVtZW50czskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsIFskaM2PX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlcyA9ICRozY9fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjNj19hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCB3aW5kb3dSZXNvcnQ9KGVsZW1lbnRzLHJhbmtDb21wYXJlLGZ1bGxDb21wYXJlKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChlbGVtZW50cyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xubGV0IGk9MDtcbmxldCBvcHRJbm5lckl0ZXJhdG9yO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+XG5oYXJkZW4oe1xubmV4dDooKT0+e1xuaWYob3B0SW5uZXJJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9b3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG5pZihyZXN1bHQuZG9uZSl7XG5vcHRJbm5lckl0ZXJhdG9yPXVuZGVmaW5lZDtcbi8vXG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCB2YWx1ZT1lbGVtZW50c1tpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8bGVuZ3RoJiZyYW5rQ29tcGFyZSh2YWx1ZSxlbGVtZW50c1tqXSk9PT0wKXtcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1lbGVtZW50cy5zbGljZShpLGopO1xuaT1qO1xuY29uc3QgcmVzb3J0ZWQ9c29ydEJ5UmFuayhzaW1pbGFyUnVuLGZ1bGxDb21wYXJlKTtcbi8vXG4vL1xuLy9cbmFzc2VydE5vRHVwbGljYXRlcyhyZXNvcnRlZCxmdWxsQ29tcGFyZSk7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbm9wdElubmVySXRlcmF0b3I9cmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOm51bGx9KTtcbiB9XG4gfX0pfSk7XG5cblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtZXJnZT0oeGVsZW1lbnRzLHllbGVtZW50cyk9Pntcbi8vXG4vL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuY29uc3QgeHM9d2luZG93UmVzb3J0KHhlbGVtZW50cyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9d2luZG93UmVzb3J0KHllbGVtZW50cyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuLy9cbi8vXG4vL1xuLyogICAgICAgICAgICAqL1xubGV0IHg7XG5sZXQgeERvbmU7XG4vKiAgICAgICAgICAgICovXG5sZXQgeTtcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eERvbmUsdmFsdWU6eH09eGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eURvbmUsdmFsdWU6eX09eWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiAgICAgICAgICAgICAgICAgICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLy9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vL1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8vXG52YWx1ZT1beCwxbiwxbl07XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLy9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vL1xuY29tcD4wfHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5oYXJkZW4obWVyZ2UpO1xuXG5jb25zdCBpdGVySXNTdXBlcnNldD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLF95Y11vZiB4eWkpe1xuaWYoeGM9PT0wbil7XG4vL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8vXG5sb25lWT10cnVlO1xuIH1cbmlmKHljPT09MG4pe1xuLy9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGl0ZXJVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0wbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbnljPj0wbnx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuLy9cbi8vXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPT09MG58fHljPT09MG58fEZhaWwgYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gO1xuaWYoeGM+PTFuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTFufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLy9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM+PTFufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKHljPT09MG4pe1xuLy9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShpdGVyT3ApPT4oeGVsZW1lbnRzLHllbGVtZW50cyk9PlxuaXRlck9wKG1lcmdlKHhlbGVtZW50cyx5ZWxlbWVudHMpKTtcblxuY29uc3QgICAgICAgIGVsZW1lbnRzSXNTdXBlcnNldD1tZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjNj19vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSXNEaXNqb2ludD1tZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjNj19vbmNlLmVsZW1lbnRzSXNEaXNqb2ludChlbGVtZW50c0lzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzQ29tcGFyZT1tZXJnZWlmeShpdGVyQ29tcGFyZSk7JGjNj19vbmNlLmVsZW1lbnRzQ29tcGFyZShlbGVtZW50c0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzVW5pb249bWVyZ2VpZnkoaXRlclVuaW9uKTskaM2PX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50VW5pb249bWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRozY9fb25jZS5lbGVtZW50c0Rpc2pvaW50VW5pb24oZWxlbWVudHNEaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0ludGVyc2VjdGlvbj1tZXJnZWlmeShpdGVySW50ZXJzZWN0aW9uKTskaM2PX29uY2UuZWxlbWVudHNJbnRlcnNlY3Rpb24oZWxlbWVudHNJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5lbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIHNldElzU3VwZXJzZXQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjNj19vbmNlLnNldElzU3VwZXJzZXQoc2V0SXNTdXBlcnNldCk7XG5jb25zdCAgICAgICAgc2V0SXNEaXNqb2ludD1yYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaM2PX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBzZXRVbmlvbj1zZXRpZnkoZWxlbWVudHNVbmlvbik7JGjNj19vbmNlLnNldFVuaW9uKHNldFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFVuaW9uPXNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRozY9fb25jZS5zZXREaXNqb2ludFVuaW9uKHNldERpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIHNldEludGVyc2VjdGlvbj1zZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFN1YnRyYWN0PXNldGlmeShlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5zZXREaXNqb2ludFN1YnRyYWN0KHNldERpc2pvaW50U3VidHJhY3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCJdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50Il0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIl0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50Il0sInNldFVuaW9uIjpbInNldFVuaW9uIl0sInNldERpc2pvaW50VW5pb24iOlsic2V0RGlzam9pbnRVbmlvbiJdLCJzZXRJbnRlcnNlY3Rpb24iOlsic2V0SW50ZXJzZWN0aW9uIl0sInNldERpc2pvaW50U3VidHJhY3QiOlsic2V0RGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACkQyco7RgAAO0YAAA2AAAAQGVuZG8vcGF0dGVybnMtdjEuNC43L3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuLi9rZXlzL2NoZWNrS2V5LmpzIl0sImV4cG9ydHMiOlsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiLCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IG9iamVjdE1hcCxBcmdHdWFyZExpc3RTaGFwZSxBd2FpdEFyZ0d1YXJkU2hhcGUsSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsSW50ZXJmYWNlR3VhcmRTaGFwZSxNLE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLE1ldGhvZEd1YXJkU2hhcGUsUmF3R3VhcmRTaGFwZSxTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxTeW5jVmFsdWVHdWFyZFNoYXBlLGFzc2VydEF3YWl0QXJnR3VhcmQsbWF0Y2hlcyxtdXN0TWF0Y2gsZ2V0Q29weU1hcEtleXMsbWFrZUNvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsIFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJBcmdHdWFyZExpc3RTaGFwZVwiLCBbJGjNj19hID0+IChBcmdHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJBd2FpdEFyZ0d1YXJkU2hhcGVcIiwgWyRozY9fYSA9PiAoQXdhaXRBcmdHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlXCIsIFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkU2hhcGVcIiwgWyRozY9fYSA9PiAoSW50ZXJmYWNlR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGVcIiwgWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRTaGFwZVwiLCBbJGjNj19hID0+IChNZXRob2RHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIlJhd0d1YXJkU2hhcGVcIiwgWyRozY9fYSA9PiAoUmF3R3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZVwiLCBbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZFNoYXBlXCIsIFskaM2PX2EgPT4gKFN5bmNWYWx1ZUd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0QXdhaXRBcmdHdWFyZFwiLCBbJGjNj19hID0+IChhc3NlcnRBd2FpdEFyZ0d1YXJkID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIiwgWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiZ2V0Q29weU1hcEtleXNcIiwgWyRozY9fYSA9PiAoZ2V0Q29weU1hcEtleXMgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIiwgWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGU9aGFyZGVuKHtcbmtsYXNzOidhd2FpdEFyZycsXG5hcmdHdWFyZDpNLnBhdHRlcm4oKX0pO1xuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZD0oYXdhaXRBcmdHdWFyZCk9PntcbmlmKG1hdGNoZXMoYXdhaXRBcmdHdWFyZCxMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpKXtcbi8vXG5jb25zdHtrbGFzczpfLC4uLnBheWxvYWR9PWF3YWl0QXJnR3VhcmQ7XG4vL1xucmV0dXJuIHBheWxvYWQ7XG4gfVxuYXNzZXJ0QXdhaXRBcmdHdWFyZChhd2FpdEFyZ0d1YXJkKTtcbnJldHVybiBhd2FpdEFyZ0d1YXJkLnBheWxvYWQ7XG4gfTskaM2PX29uY2UuZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5U3luY01ldGhvZEd1YXJkU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbmtsYXNzOidtZXRob2RHdWFyZCcsXG5jYWxsS2luZDonc3luYycsXG5hcmdHdWFyZHM6U3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG5yZXR1cm5HdWFyZDpTeW5jVmFsdWVHdWFyZFNoYXBlfSxcblxue1xub3B0aW9uYWxBcmdHdWFyZHM6U3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG5yZXN0QXJnR3VhcmQ6U3luY1ZhbHVlR3VhcmRTaGFwZX0pO1xuXG5cblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5QXJnR3VhcmRTaGFwZT1NLm9yKFxuUmF3R3VhcmRTaGFwZSxcbkF3YWl0QXJnR3VhcmRTaGFwZSxcbkxlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSxcbk0ucGF0dGVybigpKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5QXJnR3VhcmRMaXN0U2hhcGU9TS5hcnJheU9mKExlZ2FjeUFyZ0d1YXJkU2hhcGUpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lBc3luY01ldGhvZEd1YXJkU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbmtsYXNzOidtZXRob2RHdWFyZCcsXG5jYWxsS2luZDonYXN5bmMnLFxuYXJnR3VhcmRzOkxlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlLFxucmV0dXJuR3VhcmQ6U3luY1ZhbHVlR3VhcmRTaGFwZX0sXG5cbntcbm9wdGlvbmFsQXJnR3VhcmRzOkFyZ0d1YXJkTGlzdFNoYXBlLFxucmVzdEFyZ0d1YXJkOlN5bmNWYWx1ZUd1YXJkU2hhcGV9KTtcblxuXG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeU1ldGhvZEd1YXJkU2hhcGU9TS5vcihcbkxlZ2FjeVN5bmNNZXRob2RHdWFyZFNoYXBlLFxuTGVnYWN5QXN5bmNNZXRob2RHdWFyZFNoYXBlKTtcblxuXG5jb25zdCBhZGFwdExlZ2FjeUFyZ0d1YXJkPShhcmdHdWFyZCk9PlxubWF0Y2hlcyhhcmdHdWFyZCxMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpP1xuTS5hd2FpdChnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChhcmdHdWFyZCkuYXJnR3VhcmQpOlxuYXJnR3VhcmQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kR3VhcmRQYXlsb2FkPShtZXRob2RHdWFyZCk9PntcbmlmKG1hdGNoZXMobWV0aG9kR3VhcmQsTWV0aG9kR3VhcmRTaGFwZSkpe1xucmV0dXJuIG1ldGhvZEd1YXJkLnBheWxvYWQ7XG4gfVxubXVzdE1hdGNoKG1ldGhvZEd1YXJkLExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUsJ2xlZ2FjeU1ldGhvZEd1YXJkJyk7XG5jb25zdHtcbi8vXG5rbGFzczpfLFxuLy9cbmNhbGxLaW5kLFxuLy9cbnJldHVybkd1YXJkLFxuLy9cbnJlc3RBcmdHdWFyZH09XG5tZXRob2RHdWFyZDtcbmxldHtcbi8vXG5hcmdHdWFyZHMsXG4vL1xub3B0aW9uYWxBcmdHdWFyZHN9PVxubWV0aG9kR3VhcmQ7XG5pZihjYWxsS2luZD09PSdhc3luYycpe1xuYXJnR3VhcmRzPWFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG5vcHRpb25hbEFyZ0d1YXJkcz1cbm9wdGlvbmFsQXJnR3VhcmRzJiZvcHRpb25hbEFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG4gfVxuY29uc3QgcGF5bG9hZD1oYXJkZW4oe1xuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCxcbnJldHVybkd1YXJkfSk7XG5cbi8vXG5tdXN0TWF0Y2gocGF5bG9hZCxNZXRob2RHdWFyZFBheWxvYWRTaGFwZSwnaW50ZXJuYWxNZXRob2RHdWFyZEFkYXB0b3InKTtcbnJldHVybiBwYXlsb2FkO1xuIH07JGjNj19vbmNlLmdldE1ldGhvZEd1YXJkUGF5bG9hZChnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldE1ldGhvZEd1YXJkUGF5bG9hZCk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbmtsYXNzOidJbnRlcmZhY2UnLFxuaW50ZXJmYWNlTmFtZTpNLnN0cmluZygpLFxubWV0aG9kR3VhcmRzOk0ucmVjb3JkT2YoXG5NLnN0cmluZygpLFxuTS5vcihNZXRob2RHdWFyZFNoYXBlLExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpKX0sXG5cblxue1xuZGVmYXVsdEd1YXJkczpNLm9yKE0udW5kZWZpbmVkKCksJ3Bhc3NhYmxlJywncmF3JyksXG5zbG9wcHk6TS5ib29sZWFuKCksXG4vL1xuLy9cbi8vXG5zeW1ib2xNZXRob2RHdWFyZHM6TS5tYXBPZihNLnN5bWJvbCgpLE1ldGhvZEd1YXJkU2hhcGUpfSk7XG5cblxuXG5jb25zdCBhZGFwdE1ldGhvZEd1YXJkPShtZXRob2RHdWFyZCk9PntcbmlmKG1hdGNoZXMobWV0aG9kR3VhcmQsTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSkpe1xuY29uc3R7XG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzPVtdLFxucmVzdEFyZ0d1YXJkPU0uYW55KCksXG5yZXR1cm5HdWFyZH09XG5nZXRNZXRob2RHdWFyZFBheWxvYWQobWV0aG9kR3VhcmQpO1xuY29uc3QgbUNhbGw9Y2FsbEtpbmQ9PT0nc3luYyc/TS5jYWxsOk0uY2FsbFdoZW47XG5yZXR1cm4gbUNhbGwoLi4uYXJnR3VhcmRzKS5cbm9wdGlvbmFsKC4uLm9wdGlvbmFsQXJnR3VhcmRzKS5cbnJlc3QocmVzdEFyZ0d1YXJkKS5cbnJldHVybnMocmV0dXJuR3VhcmQpO1xuIH1cbnJldHVybiBtZXRob2RHdWFyZDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkPShpbnRlcmZhY2VHdWFyZCk9PntcbmlmKG1hdGNoZXMoaW50ZXJmYWNlR3VhcmQsSW50ZXJmYWNlR3VhcmRTaGFwZSkpe1xucmV0dXJuIGludGVyZmFjZUd1YXJkLnBheWxvYWQ7XG4gfVxubXVzdE1hdGNoKGludGVyZmFjZUd1YXJkLExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUsJ2xlZ2FjeUludGVyZmFjZUd1YXJkJyk7XG4vL1xuLy9cbmxldHtrbGFzczpfLGludGVyZmFjZU5hbWUsbWV0aG9kR3VhcmRzLC4uLnJlc3R9PWludGVyZmFjZUd1YXJkO1xubWV0aG9kR3VhcmRzPW9iamVjdE1hcChtZXRob2RHdWFyZHMsYWRhcHRNZXRob2RHdWFyZCk7XG5jb25zdCBwYXlsb2FkPWhhcmRlbih7XG5pbnRlcmZhY2VOYW1lLFxubWV0aG9kR3VhcmRzLFxuLi4ucmVzdH0pO1xuXG5tdXN0TWF0Y2goXG5wYXlsb2FkLFxuSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsXG4naW50ZXJuYWxJbnRlcmZhY2VHdWFyZEFkYXB0b3InKTtcblxucmV0dXJuIHBheWxvYWQ7XG4gfTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCk7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKTtcblxuY29uc3QgZW1wdHlDb3B5TWFwPW1ha2VDb3B5TWFwKFtdKTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRJbnRlcmZhY2VNZXRob2RLZXlzPShpbnRlcmZhY2VHdWFyZCk9PntcbmNvbnN0e21ldGhvZEd1YXJkcyxzeW1ib2xNZXRob2RHdWFyZHM9ZW1wdHlDb3B5TWFwfT1cbmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChpbnRlcmZhY2VHdWFyZCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuLy9cbnJldHVybiBoYXJkZW4oW1xuLi4uUmVmbGVjdC5vd25LZXlzKG1ldGhvZEd1YXJkcyksXG4uLi5nZXRDb3B5TWFwS2V5cyhzeW1ib2xNZXRob2RHdWFyZHMpXSk7XG5cbiB9OyRozY9fb25jZS5nZXRJbnRlcmZhY2VNZXRob2RLZXlzKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xuaGFyZGVuKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiOlsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIjpbImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiOlsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sImdldEludGVyZmFjZU1ldGhvZEtleXMiOlsiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdOAyUyK0AAMitAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNC43L3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiQXJnR3VhcmRMaXN0U2hhcGUiLCJBd2FpdEFyZ0d1YXJkU2hhcGUiLCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSIsIkludGVyZmFjZUd1YXJkU2hhcGUiLCJNIiwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiLCJNZXRob2RHdWFyZFNoYXBlIiwiUmF3R3VhcmRTaGFwZSIsIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIiwiU3luY1ZhbHVlR3VhcmRTaGFwZSIsImFzc2VydEF3YWl0QXJnR3VhcmQiLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIiwiYXNzZXJ0UGF0dGVybiIsImFzc2VydFJhd0d1YXJkIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzQXdhaXRBcmdHdWFyZCIsImlzUGF0dGVybiIsImlzUmF3R3VhcmQiLCJraW5kT2YiLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGhhc093blByb3BlcnR5T2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLGNvbXBhcmVSYW5rLGdldFBhc3NTdHlsZUNvdmVyLGludGVyc2VjdFJhbmtDb3ZlcnMsdW5pb25SYW5rQ292ZXJzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxpZGVudENoZWNrZXIsYXBwbHlMYWJlbGluZ0Vycm9yLGZyb21VbmlxdWVFbnRyaWVzLGxpc3REaWZmZXJlbmNlLHEsYixYLEZhaWwsbWFrZUVycm9yLGFubm90YXRlRXJyb3Isa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZyxnZXRDb3B5TWFwRW50cnlBcnJheSxtYWtlQ29weU1hcCxnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLCBbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcImNvbXBhcmVSYW5rXCIsIFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dLFtcImdldFBhc3NTdHlsZUNvdmVyXCIsIFskaM2PX2EgPT4gKGdldFBhc3NTdHlsZUNvdmVyID0gJGjNj19hKV1dLFtcImludGVyc2VjdFJhbmtDb3ZlcnNcIiwgWyRozY9fYSA9PiAoaW50ZXJzZWN0UmFua0NvdmVycyA9ICRozY9fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIiwgWyRozY9fYSA9PiAodW5pb25SYW5rQ292ZXJzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qc1wiLCBbW1wiYXBwbHlMYWJlbGluZ0Vycm9yXCIsIFskaM2PX2EgPT4gKGFwcGx5TGFiZWxpbmdFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjNj19hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsIFskaM2PX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYlwiLCBbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcIlhcIiwgWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsIFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsIFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLCBbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJrZXlHVFwiLCBbJGjNj19hID0+IChrZXlHVCA9ICRozY9fYSldXSxbXCJrZXlHVEVcIiwgWyRozY9fYSA9PiAoa2V5R1RFID0gJGjNj19hKV1dLFtcImtleUxUXCIsIFskaM2PX2EgPT4gKGtleUxUID0gJGjNj19hKV1dLFtcImtleUxURVwiLCBbJGjNj19hID0+IChrZXlMVEUgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImNoZWNrS2V5XCIsIFskaM2PX2EgPT4gKGNoZWNrS2V5ID0gJGjNj19hKV1dLFtcImlzS2V5XCIsIFskaM2PX2EgPT4gKGlzS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrU2NhbGFyS2V5XCIsIFskaM2PX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjNj19hID0+IChjaGVja0NvcHlTZXQgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5TWFwXCIsIFskaM2PX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRozY9fYSldXSxbXCJjb3B5TWFwS2V5U2V0XCIsIFskaM2PX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaM2PX2EgPT4gKGNoZWNrQ29weUJhZyA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cnlBcnJheVwiLCBbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cnlBcnJheSA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNcIiwgW1tcImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzXCIsIFskaM2PX2EgPT4gKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG5jb25zdHtlbnRyaWVzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcGF0dGVybk1lbW89bmV3IFdlYWtTZXQoKTtcblxuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgTU07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZGVmYXVsdExpbWl0cz1oYXJkZW4oe1xuZGVjaW1hbERpZ2l0c0xpbWl0OjEwMCxcbnN0cmluZ0xlbmd0aExpbWl0OjEwMF8wMDAsXG5zeW1ib2xOYW1lTGVuZ3RoTGltaXQ6MTAwLFxubnVtUHJvcGVydGllc0xpbWl0OjgwLFxucHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6MTAwLFxuYXJyYXlMZW5ndGhMaW1pdDoxMF8wMDAsXG5udW1TZXRFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtTWFwRW50cmllc0xpbWl0OjUwMDB9KTtcblxuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdD0obGltaXRzPXt9KT0+XG4vKiAgICAgICAgICAgICAgICAgICAgKi9oYXJkZW4oe19fcHJvdG9fXzpkZWZhdWx0TGltaXRzLC4uLmxpbWl0c30pO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdD0oXG5wYXlsb2FkLFxubWFpblBheWxvYWRTaGFwZSxcbmNoZWNrLFxubGFiZWwpPT5cbntcbmFzc2VydChBcnJheS5pc0FycmF5KG1haW5QYXlsb2FkU2hhcGUpKTtcbmlmKCFBcnJheS5pc0FycmF5KHBheWxvYWQpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiB9XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5jb25zdCBtYWluTGVuZ3RoPW1haW5QYXlsb2FkU2hhcGUubGVuZ3RoO1xuaWYoIShwYXlsb2FkLmxlbmd0aD09PW1haW5MZW5ndGh8fHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aCsxKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCB1bmV4cGVjdGVkIHNpemU6ICR7cGF5bG9hZH1gKTtcbiB9XG5jb25zdCBsaW1pdHM9cGF5bG9hZFttYWluTGVuZ3RoXTtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxtYWluTGVuZ3RoKSk7XG4vL1xuaWYoIWNoZWNrTWF0Y2hlcyhwYXlsb2FkLG1haW5QYXlsb2FkU2hhcGUsY2hlY2ssbGFiZWwpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5pZihsaW1pdHM9PT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuKHBhc3NTdHlsZU9mKGxpbWl0cyk9PT0nY29weVJlY29yZCd8fFxuY2hlY2soZmFsc2UsWCBgTGltaXRzIG11c3QgYmUgYSByZWNvcmQ6ICR7cShsaW1pdHMpfWApKSYmXG5lbnRyaWVzKGxpbWl0cykuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbnBhc3NTdHlsZU9mKHZhbHVlKT09PSdudW1iZXInfHxcbmNoZWNrKGZhbHNlLFggYFZhbHVlIG9mIGxpbWl0ICR7cShrZXkpfSBidXQgYmUgYSBudW1iZXI6ICR7cSh2YWx1ZSl9YCkpKTtcblxuXG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQ9KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjayk9PntcbmlmKFxuTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkrMTw9XG5kZWNpbWFsRGlnaXRzTGltaXQpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCk7XG5cbiB9O1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1ha2VQYXR0ZXJuS2l0PSgpPT57XG4vKlxuXG5cblxuXG5cbiAgICovXG5jb25zdCBtYXliZU1hdGNoSGVscGVyPSh0YWcpPT5cbi8vXG5IZWxwZXJzQnlNYXRjaFRhZ1t0YWddO1xuXG4vKlxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IG1heWJlUGF5bG9hZFNoYXBlPSh0YWcpPT5cbi8vXG5HdWFyZFBheWxvYWRTaGFwZXNbdGFnXTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBzaW5nbGV0b25LaW5kcz1uZXcgTWFwKFtcblsnbnVsbCcsbnVsbF0sXG5bJ3VuZGVmaW5lZCcsdW5kZWZpbmVkXV0pO1xuXG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3QgdGFnTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgY2hlY2tUYWdnZWQ9KHRhZ2dlZCx0YWcsY2hlY2spPT57XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vL1xuLy9cbnJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCxjaGVjayk7XG4gfWVsc2V7XG5jb25zdCBwYXlsb2FkU2hhcGU9bWF5YmVQYXlsb2FkU2hhcGUodGFnKTtcbmlmKHBheWxvYWRTaGFwZSE9PXVuZGVmaW5lZCl7XG4vL1xucmV0dXJuIGNoZWNrTWF0Y2hlcyh0YWdnZWQucGF5bG9hZCxwYXlsb2FkU2hhcGUsY2hlY2ssdGFnKTtcbiB9XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3Qga2luZE9mPShzcGVjaW1lbixjaGVjaz1pZGVudENoZWNrZXIpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuaWYocGFzc1N0eWxlIT09J3RhZ2dlZCcpe1xucmV0dXJuIHBhc3NTdHlsZTtcbiB9XG4vL1xuLy9cbi8vXG5pZih0YWdNZW1vLmhhcyhzcGVjaW1lbikpe1xucmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiB9XG5jb25zdCB0YWc9Z2V0VGFnKHNwZWNpbWVuKTtcbmlmKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLHRhZyxjaGVjaykpe1xudGFnTWVtby5zZXQoc3BlY2ltZW4sdGFnKTtcbnJldHVybiB0YWc7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuY2hlY2soZmFsc2UsWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuaGFyZGVuKGtpbmRPZik7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBjaGVja0tpbmQ9KHNwZWNpbWVuLGtpbmQsY2hlY2spPT57XG4vL1xuaWYoc2luZ2xldG9uS2luZHMuaGFzKGtpbmQpKXtcbi8vXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sc2luZ2xldG9uS2luZHMuZ2V0KGtpbmQpLGNoZWNrKTtcbiB9XG5cbmNvbnN0IHJlYWxLaW5kPWtpbmRPZihzcGVjaW1lbixjaGVjayk7XG5pZihraW5kPT09cmVhbEtpbmQpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuLy9cbi8vXG5jaGVjayhmYWxzZSxYIGAke2IocmVhbEtpbmQpfSAke3NwZWNpbWVufSAtIE11c3QgYmUgYSAke2Ioa2luZCl9YCk7XG4gfVxucmV0dXJuIGZhbHNlO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgaXNLaW5kPShzcGVjaW1lbixraW5kKT0+Y2hlY2tLaW5kKHNwZWNpbWVuLGtpbmQsaWRlbnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuICAgKi9cbmNvbnN0IGNoZWNrQXNLZXlQYXR0PShzcGVjaW1lbixrZXlBc1BhdHRlcm4sY2hlY2spPT57XG5pZihpc0tleShzcGVjaW1lbikmJmtleUVRKHNwZWNpbWVuLGtleUFzUGF0dGVybikpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuLy9cbi8vXG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmU6ICR7a2V5QXNQYXR0ZXJufWApKTtcblxuIH07XG5cbi8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuPShwYXR0LGNoZWNrKT0+e1xuaWYoaXNLZXkocGF0dCkpe1xuLy9cbi8vXG4vL1xuLy9cbnJldHVybiB0cnVlO1xuIH1cbmlmKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vL1xuY29uc3QgcmVzdWx0PWNoZWNrUGF0dGVybkludGVybmFsKHBhdHQsY2hlY2spO1xuaWYocmVzdWx0KXtcbnBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qXG5cblxuXG5cbiAgICovXG5jb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbD0ocGF0dCxjaGVjayk9Pntcbi8vXG4vL1xuLy9cbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tQYXR0ZXJuKGNoaWxkLGNoZWNrKTtcblxuY29uc3Qga2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5zd2l0Y2goa2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vL1xuLy9cbnJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8vXG4vL1xucmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vL1xuLy9cbi8vXG5yZXR1cm4gY2hlY2tQYXR0ZXJuKHBhdHQudmFsdWVzLGNoZWNrKTtcbiB9XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKGtpbmQpfSBjYW5ub3QgYmUgYSBwYXR0ZXJuYCk7XG4gfVxuZGVmYXVsdDp7XG5pZihtYXliZU1hdGNoSGVscGVyKGtpbmQpIT09dW5kZWZpbmVkKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQSBwYXNzYWJsZSBvZiBraW5kICR7cShraW5kKX0gaXMgbm90IGEgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfX1cblxuIH07XG5cbi8qXG5cblxuICAgKi9cbmNvbnN0IGlzUGF0dGVybj0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGlkZW50Q2hlY2tlcik7XG5cbi8qXG5cbiAgICovXG5jb25zdCBhc3NlcnRQYXR0ZXJuPShwYXR0KT0+e1xuY2hlY2tQYXR0ZXJuKHBhdHQsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLy9cblxuLypcblxuXG5cblxuXG4gICAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLy9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKlxuXG5cblxuXG4gICAqL1xuY29uc3QgY2hlY2tNYXRjaGVzSW50ZXJuYWw9KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG4vL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7Ly9cbnN3aXRjaChwYXR0ZXJuS2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gRmFpbCBgcGF0dGVybiBleHBlY3RlZDogJHtwYXR0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRmFpbCBgcHJvbWlzZXMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gRmFpbCBgZXJyb3JzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ3N5bWJvbCc6XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5QmFnJzpcbmNhc2UncmVtb3RhYmxlJzp7XG4vL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vL1xuLy9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3EoXG5wYXR0KVxuIH1gKTtcblxuIH1cbmNvbnN0e2xlbmd0aH09cGF0dDtcbmlmKHNwZWNpbWVuLmxlbmd0aCE9PWxlbmd0aCl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEFycmF5ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhcyBsb25nIGFzIGNvcHlBcnJheSBwYXR0ZXJuOiAke3EoXG5wYXR0KVxuIH1gKTtcblxuIH1cbnJldHVybiBwYXR0LmV2ZXJ5KChwLGkpPT5jaGVja01hdGNoZXMoc3BlY2ltZW5baV0scCxjaGVjayxpKSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihpc0tleShwYXR0KSl7XG4vL1xuLy9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3EoXG5wYXR0KVxuIH1gKTtcblxuIH1cbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3Qgc3BlY2ltZW5OYW1lcz1yZWNvcmROYW1lcyhzcGVjaW1lbik7XG5jb25zdCBwYXR0TmFtZXM9cmVjb3JkTmFtZXMocGF0dCk7XG5jb25zdCBtaXNzaW5nPWxpc3REaWZmZXJlbmNlKHBhdHROYW1lcyxzcGVjaW1lbk5hbWVzKTtcbmlmKG1pc3NpbmcubGVuZ3RoPj0xKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGhhdmUgbWlzc2luZyBwcm9wZXJ0aWVzICR7cShtaXNzaW5nKX1gKTtcblxuIH1cbmNvbnN0IHVuZXhwZWN0ZWQ9bGlzdERpZmZlcmVuY2Uoc3BlY2ltZW5OYW1lcyxwYXR0TmFtZXMpO1xuaWYodW5leHBlY3RlZC5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3Qgbm90IGhhdmUgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3EoXG51bmV4cGVjdGVkKVxuIH1gKTtcblxuIH1cbmNvbnN0IHNwZWNpbWVuVmFsdWVzPXJlY29yZFZhbHVlcyhzcGVjaW1lbixzcGVjaW1lbk5hbWVzKTtcbmNvbnN0IHBhdHRWYWx1ZXM9cmVjb3JkVmFsdWVzKHBhdHQscGF0dE5hbWVzKTtcbnJldHVybiBwYXR0TmFtZXMuZXZlcnkoKGxhYmVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlc1tpXSxwYXR0VmFsdWVzW2ldLGNoZWNrLGxhYmVsKSk7XG5cbiB9XG5jYXNlJ2NvcHlNYXAnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8vXG4vL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5TWFwJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlNYXAgdG8gbWF0Y2ggYSBjb3B5TWFwIHBhdHRlcm46ICR7cShcbnBhdHQpXG4gfWApO1xuXG4gfVxuLy9cbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0KTtcbmNvbnN0IHNwZWNpbWVuS2V5U2V0PWNvcHlNYXBLZXlTZXQoc3BlY2ltZW4pO1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLy9cbi8vXG4vL1xuY29uc3QgcGF0dFZhbHVlcz1bXTtcbmNvbnN0IHNwZWNpbWVuVmFsdWVzPVtdO1xuY29uc3QgZW50cnlQYWlycz1nZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbnBhdHQsXG5zcGVjaW1lbixcbmdldENvcHlNYXBFbnRyeUFycmF5LFxudW5kZWZpbmVkKTtcblxuZm9yKGNvbnN0W19rZXkscGF0dFZhbHVlLHNwZWNpbWVuVmFsdWVdb2YgZW50cnlQYWlycyl7XG5wYXR0VmFsdWVzLnB1c2gocGF0dFZhbHVlKTtcbnNwZWNpbWVuVmFsdWVzLnB1c2goc3BlY2ltZW5WYWx1ZSk7XG4gfVxucmV0dXJuIGNoZWNrTWF0Y2hlcyhoYXJkZW4oc3BlY2ltZW5WYWx1ZXMpLGhhcmRlbihwYXR0VmFsdWVzKSxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHBhdHRlcm5LaW5kKTtcbmlmKG1hdGNoSGVscGVyKXtcbnJldHVybiBtYXRjaEhlbHBlci5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dC5wYXlsb2FkLGNoZWNrKTtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogc2hvdWxkIGhhdmUgcmVjb2duaXplZCAke3EocGF0dGVybktpbmQpfSBgO1xuIH19XG5cbiB9O1xuXG4vKlxuXG5cblxuICAgKi9cbmNvbnN0IG1hdGNoZXM9KHNwZWNpbWVuLHBhdHQpPT5cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcik7XG5cbi8qXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgbXVzdE1hdGNoPShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmxldCBpbm5lckVycm9yO1xudHJ5e1xuaWYoY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyLHVuZGVmaW5lZCkpe1xucmV0dXJuO1xuIH1cbiB9Y2F0Y2goZXIpe1xuaW5uZXJFcnJvcj1lcjtcbiB9XG4vL1xuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsYXNzZXJ0Q2hlY2tlcixsYWJlbCk7XG5jb25zdCBvdXRlckVycm9yPW1ha2VFcnJvcihcblggYGludGVybmFsOiAke2xhYmVsfTogaW5jb25zaXN0ZW50IHBhdHRlcm4gbWF0Y2g6ICR7cShwYXR0KX1gKTtcblxuaWYoaW5uZXJFcnJvciE9PXVuZGVmaW5lZCl7XG5hbm5vdGF0ZUVycm9yKG91dGVyRXJyb3IsWCBgY2F1c2VkIGJ5ICR7aW5uZXJFcnJvcn1gKTtcbiB9XG50aHJvdyBvdXRlckVycm9yO1xuIH07XG5cbi8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZ2V0UmFua0NvdmVyPShwYXR0LGVuY29kZVBhc3NhYmxlKT0+e1xuaWYoaXNLZXkocGF0dCkpe1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQYXNzYWJsZShwYXR0KTtcbmlmKGVuY29kZWQhPT11bmRlZmluZWQpe1xucmV0dXJuW2VuY29kZWQsIGAke2VuY29kZWR9fmBdO1xuIH1cbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGF0dCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weUFycmF5Jzp7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5icmVhaztcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmJyZWFrO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHBhdHQpO1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLy9cbi8vXG5yZXR1cm4gbWF0Y2hIZWxwZXIuZ2V0UmFua0NvdmVyKHBhdHQucGF5bG9hZCxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5icmVhaztcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5icmVhazsvL1xuIH19XG5cbmJyZWFrOy8vXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvL1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuIH07XG5cbi8qXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGFycmF5RXZlcnlNYXRjaFBhdHRlcm49KGFycmF5LHBhdHQsY2hlY2ssbGFiZWxQcmVmaXg9JycpPT57XG5pZihpc0tpbmQocGF0dCwnbWF0Y2g6YW55Jykpe1xuLy9cbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBhcnJheS5ldmVyeSgoZWwsaSk9PlxuY2hlY2tNYXRjaGVzKGVsLHBhdHQsY2hlY2ssIGAke2xhYmVsUHJlZml4fVske2l9XWApKTtcblxuIH07XG5cbi8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaEFueUhlbHBlcj1GYXIoJ21hdGNoOmFueSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooX3NwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlLFxuXG5jaGVja0lzV2VsbEZvcm1lZDoobWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbm1hdGNoZXJQYXlsb2FkPT09dW5kZWZpbmVkfHxcbmNoZWNrKGZhbHNlLFggYG1hdGNoOmFueSBwYXlsb2FkOiAke21hdGNoZXJQYXlsb2FkfSAtIE11c3QgYmUgdW5kZWZpbmVkYCksXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJycsJ3snXX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaEFuZEhlbHBlcj1GYXIoJ21hdGNoOmFuZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxjaGVjaykpO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUGF0dHMsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsY2hlY2spO1xucmV0dXJuKFxuKHBhc3NTdHlsZU9mKGFsbGVnZWRQYXR0cyk9PT0nY29weUFycmF5J3x8XG5jaGVjayhmYWxzZSxYIGBOZWVkcyBhcnJheSBvZiBzdWItcGF0dGVybnM6ICR7cShhbGxlZ2VkUGF0dHMpfWApKSYmXG5hbGxlZ2VkUGF0dHMuZXZlcnkoY2hlY2tJdCkpO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihwYXR0cyxlbmNvZGVQYXNzYWJsZSk9PlxuaW50ZXJzZWN0UmFua0NvdmVycyhcbmNvbXBhcmVSYW5rLFxucGF0dHMubWFwKChwKT0+Z2V0UmFua0NvdmVyKHAsZW5jb2RlUGFzc2FibGUpKSl9KTtcblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaE9ySGVscGVyPUZhcignbWF0Y2g6b3IgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xuY29uc3R7bGVuZ3RofT1wYXR0cztcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIG5vIHBhdHRlcm4gZGlzanVuY3RzIHRvIG1hdGNoOiAke3EocGF0dHMpfWApO1xuXG4gfVxuaWYoXG5wYXR0cy5sZW5ndGg9PT0yJiZcbiFtYXRjaGVzKHNwZWNpbWVuLHBhdHRzWzBdKSYmXG5pc0tpbmQocGF0dHNbMF0sJ21hdGNoOmtpbmQnKSYmXG5wYXR0c1swXS5wYXlsb2FkPT09J3VuZGVmaW5lZCcpXG57XG4vL1xuLy9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3EocGF0dHMpfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3EocGF0dCl9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXI9RmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hLZXlIZWxwZXI9RmFyKCdtYXRjaDprZXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyPUZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1BhdHRlcm4oc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hLaW5kSGVscGVyPUZhcignbWF0Y2g6a2luZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczpjaGVja0tpbmQsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkS2V5S2luZCxjaGVjayk9PlxudHlwZW9mIGFsbGVnZWRLZXlLaW5kPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2ApLFxuXG5cbmdldFJhbmtDb3Zlcjooa2luZCxfZW5jb2RlUGFzc2FibGUpPT57XG5sZXQgc3R5bGU7XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5TWFwJzp7XG5zdHlsZT0ndGFnZ2VkJztcbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuc3R5bGU9a2luZDtcbmJyZWFrO1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gfX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaFRhZ2dlZEhlbHBlcj1GYXIoJ21hdGNoOnRhZ2dlZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW3RhZ1BhdHQscGF5bG9hZFBhdHRdLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2Yoc3BlY2ltZW4pIT09J3RhZ2dlZCcpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCB0YWdnZWQgb2JqZWN0LCBub3QgJHtxKFxucGFzc1N0eWxlT2Yoc3BlY2ltZW4pKVxuIH06ICR7c3BlY2ltZW59YCk7XG5cbiB9XG5yZXR1cm4oXG5jaGVja01hdGNoZXMoZ2V0VGFnKHNwZWNpbWVuKSx0YWdQYXR0LGNoZWNrLCd0YWcnKSYmXG5jaGVja01hdGNoZXMoc3BlY2ltZW4ucGF5bG9hZCxwYXlsb2FkUGF0dCxjaGVjaywncGF5bG9hZCcpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja01hdGNoZXMoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDp0YWdnZWQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2tpbmQsX2VuY29kZVBhc3NhYmxlKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoQmlnaW50SGVscGVyPUZhcignbWF0Y2g6YmlnaW50IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2JpZ2ludCcsY2hlY2spJiZcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpiaWdpbnQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaE5hdEhlbHBlcj1GYXIoJ21hdGNoOm5hdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVjayhcbi8qICAgICAgICAgICAgICAgICAqL3NwZWNpbWVuPj0wbixcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBub24tbmVnYXRpdmVgKSYmXG5cbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpuYXQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbi8vXG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXI9RmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N0cmluZ0xlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuLy9cbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnc3RyaW5nJyxjaGVjaykmJihcbi8vXG4vKiAgICAgICAgICAgICAgICAgKi9zcGVjaW1lbi5sZW5ndGg8PXN0cmluZ0xlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBzdHJpbmcgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzdHJpbmdMZW5ndGhMaW1pdH1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOnN0cmluZyBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N0cmluZycpfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoU3ltYm9sSGVscGVyPUZhcignbWF0Y2g6c3ltYm9sIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdzeW1ib2wnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3Qgc3ltYm9sTmFtZT1uYW1lRm9yUGFzc2FibGVTeW1ib2woc3BlY2ltZW4pO1xuXG5pZih0eXBlb2Ygc3ltYm9sTmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludGVybmFsOiBQYXNzYWJsZSBzeW1ib2wgJHtzcGVjaW1lbn0gbXVzdCBoYXZlIGEgcGFzc2FibGUgbmFtZWA7XG4gfVxucmV0dXJuIGNoZWNrKFxuc3ltYm9sTmFtZS5sZW5ndGg8PXN5bWJvbE5hbWVMZW5ndGhMaW1pdCxcblggYFN5bWJvbCBuYW1lICR7cShcbnN5bWJvbE5hbWUpXG4gfSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N5bWJvbE5hbWVMZW5ndGhMaW1pdH1gKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6c3ltYm9sIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3ltYm9sJyl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXI9RmFyKCdtYXRjaDpyZW1vdGFibGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJlbW90YWJsZURlc2MsY2hlY2spPT57XG5pZihpc0tpbmQoc3BlY2ltZW4sJ3JlbW90YWJsZScpKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNoZWNrPT09aWRlbnRDaGVja2VyKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtsYWJlbH09cmVtb3RhYmxlRGVzYztcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5jb25zdCBraW5kRGV0YWlscz1cbnBhc3NTdHlsZSE9PSd0YWdnZWQnP1xuLy9cbmIocGFzc1N0eWxlKTpcbi8vXG4vL1xucShnZXRUYWcoc3BlY2ltZW4pKTtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuLy9cbi8vXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSByZW1vdGFibGUgJHtiKGxhYmVsKX0sIG5vdCAke2tpbmREZXRhaWxzfWApO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRSZW1vdGFibGVEZXNjLGNoZWNrKT0+XG5jaGVja01hdGNoZXMoXG5hbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbmhhcmRlbih7bGFiZWw6TU0uc3RyaW5nKCl9KSxcbmNoZWNrLFxuJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfcmVtb3RhYmxlRGVzYyxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdyZW1vdGFibGUnKX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaExURUhlbHBlcj1GYXIoJ21hdGNoOmx0ZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVEUoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPD0gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6KHJpZ2h0T3BlcmFuZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuLy9cbi8vXG4vL1xubGV0W2xlZnRCb3VuZCxyaWdodEJvdW5kXT1nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuY29uc3QgbmV3UmlnaHRCb3VuZD0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbmlmKG5ld1JpZ2h0Qm91bmQhPT11bmRlZmluZWQpe1xucmlnaHRCb3VuZD1uZXdSaWdodEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaExUSGVscGVyPUZhcignbWF0Y2g6bHQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5TFQoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPCAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjptYXRjaExURUhlbHBlci5nZXRSYW5rQ292ZXJ9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hHVEVIZWxwZXI9RmFyKCdtYXRjaDpndGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1RFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID49ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8vXG4vL1xuLy9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld0xlZnRCb3VuZD1lbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpO1xuaWYobmV3TGVmdEJvdW5kIT09dW5kZWZpbmVkKXtcbmxlZnRCb3VuZD1uZXdMZWZ0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9fSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoR1RIZWxwZXI9RmFyKCdtYXRjaDpndCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlHVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoR1RFSGVscGVyLmdldFJhbmtDb3Zlcn0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaFJlY29yZE9mSGVscGVyPUZhcignbWF0Y2g6cmVjb3JkT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtUHJvcGVydGllc0xpbWl0LHByb3BlcnR5TmFtZUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5UmVjb3JkJyxjaGVjaykmJlxuY2hlY2soXG5vd25LZXlzKHNwZWNpbWVuKS5sZW5ndGg8PW51bVByb3BlcnRpZXNMaW1pdCxcblggYE11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVByb3BlcnRpZXNMaW1pdClcbiB9IHByb3BlcnRpZXM6ICR7c3BlY2ltZW59YCkmJlxuXG5lbnRyaWVzKHNwZWNpbWVuKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2ssXG5bXG5rZXkubGVuZ3RoPD1wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcblggYFByb3BlcnR5IG5hbWUgbXVzdCBub3QgYmUgbG9uZ2VyIHRoYW4gJHtxKFxucHJvcGVydHlOYW1lTGVuZ3RoTGltaXQpXG4gfWBdLFxuXG5rZXkpJiZcblxuY2hlY2tNYXRjaGVzKFxuaGFyZGVuKFtrZXksdmFsdWVdKSxcbmhhcmRlbihba2V5UGF0dCx2YWx1ZVBhdHRdKSxcbmNoZWNrLFxua2V5KSkpO1xuXG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnJlY29yZE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9lbnRyeVBhdHQpPT5nZXRQYXNzU3R5bGVDb3ZlcignY29weVJlY29yZCcpfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoQXJyYXlPZkhlbHBlcj1GYXIoJ21hdGNoOmFycmF5T2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtzdWJQYXR0LGxpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7YXJyYXlMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbi8vXG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spJiYoXG4vKiAgICAgICAgICAgICAgICAqL3NwZWNpbWVuLmxlbmd0aDw9YXJyYXlMZW5ndGhMaW1pdHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgQXJyYXkgbGVuZ3RoICR7c3BlY2ltZW4ubGVuZ3RofSBtdXN0IGJlIDw9IGxpbWl0ICR7YXJyYXlMZW5ndGhMaW1pdH1gKSkmJlxuXG5hcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKHNwZWNpbWVuLHN1YlBhdHQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6YXJyYXlPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5Jyl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hTZXRPZkhlbHBlcj1GYXIoJ21hdGNoOnNldE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixba2V5UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e251bVNldEVsZW1lbnRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlTZXQnLGNoZWNrKSYmXG5jaGVjayhcbi8qICAgICAgICAgICAgICAgICovc3BlY2ltZW4ucGF5bG9hZC5sZW5ndGg8bnVtU2V0RWxlbWVudHNMaW1pdCxcblggYFNldCBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EobnVtU2V0RWxlbWVudHNMaW1pdCl9IGVsZW1lbnRzOiAke1xuc3BlY2ltZW4ucGF5bG9hZC5sZW5ndGhcbiB9YCkmJlxuXG5hcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKHNwZWNpbWVuLnBheWxvYWQsa2V5UGF0dCxjaGVjaywnc2V0IGVsZW1lbnRzJykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpzZXRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hCYWdPZkhlbHBlcj1GYXIoJ21hdGNoOmJhZ09mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsY291bnRQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QmFnJyxjaGVjaykmJlxuY2hlY2soXG4vKiAgICAgICAgICAgICAgICAqL3NwZWNpbWVuLnBheWxvYWQubGVuZ3RoPD1cbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG5YIGBCYWcgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxubnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdClcbiB9IHVuaXF1ZSBlbGVtZW50czogJHtzcGVjaW1lbn1gKSYmXG5cbnNwZWNpbWVuLnBheWxvYWQuZXZlcnkoXG4oW2tleSxjb3VudF0saSk9PlxuY2hlY2tNYXRjaGVzKGtleSxrZXlQYXR0LGNoZWNrLCBgYmFnIGtleXNbJHtpfV1gKSYmXG5hcHBseUxhYmVsaW5nRXJyb3IoXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdCxcbltjb3VudCxkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2tdLFxuIGBiYWcgY291bnRzWyR7aX1dYCkmJlxuXG5jaGVja01hdGNoZXMoY291bnQsY291bnRQYXR0LGNoZWNrLCBgYmFnIGNvdW50c1ske2l9XWApKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmJhZ09mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaE1hcE9mSGVscGVyPUZhcignbWF0Y2g6bWFwT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtTWFwRW50cmllc0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5TWFwJyxjaGVjaykmJlxuY2hlY2soXG4vKiAgICAgICAgICAgICAgICAqL3NwZWNpbWVuLnBheWxvYWQua2V5cy5sZW5ndGg8PVxubnVtTWFwRW50cmllc0xpbWl0LFxuWCBgQ29weU1hcCBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuICR7cShcbm51bU1hcEVudHJpZXNMaW1pdClcbiB9IGVudHJpZXM6ICR7c3BlY2ltZW59YCkmJlxuXG5hcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuc3BlY2ltZW4ucGF5bG9hZC5rZXlzLFxua2V5UGF0dCxcbmNoZWNrLFxuJ21hcCBrZXlzJykmJlxuXG5hcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuc3BlY2ltZW4ucGF5bG9hZC52YWx1ZXMsXG52YWx1ZVBhdHQsXG5jaGVjayxcbidtYXAgdmFsdWVzJykpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDptYXBPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3Qgc3BsaXRBcnJheVBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuY29uc3QgbnVtUmVxdWlyZWQ9cmVxdWlyZWRQYXR0Lmxlbmd0aDtcbmNvbnN0IG51bU9wdGlvbmFsPW9wdGlvbmFsUGF0dC5sZW5ndGg7XG5jb25zdCByZXF1aXJlZFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKDAsbnVtUmVxdWlyZWQpO1xuY29uc3Qgb3B0aW9uYWxTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShcbm51bVJlcXVpcmVkLFxubnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xuXG5jb25zdCByZXN0U3BlY2ltZW49c3BlY2ltZW4uc2xpY2UobnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xucmV0dXJuIGhhcmRlbih7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn0pO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBhZGFwdEFycmF5UGF0dGVybj0ob3B0aW9uYWxQYXR0LGxlbmd0aCk9PlxuaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLGxlbmd0aCkubWFwKChwYXR0KT0+TU0ub3B0KHBhdHQpKSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9W10scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0QXJyYXlQYXR0ZXJuKFxub3B0aW9uYWxQYXR0LFxub3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgpO1xuXG5sZXQgYXJnTnVtPTA7XG5yZXR1cm4oXG4ocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGg9PT1yZXF1aXJlZFBhdHQubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG5yZXF1aXJlZFBhdHQubGVuZ3RoKVxuIH0gYXJndW1lbnRzOiAke3NwZWNpbWVufWApKSYmXG5cbnJlcXVpcmVkUGF0dC5ldmVyeSgocCxpKT0+XG4vL1xuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfWApKSYmXG5cbnBhcnRpYWxQYXR0LmV2ZXJ5KChwLGkpPT5cbi8vXG5jaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApKSYmXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKlxuXG5cbiAgICAgKi9cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weUFycmF5JyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weUFycmF5JykmJihcbnJlc3RQYXR0PT09dW5kZWZpbmVkfHxpc1BhdHRlcm4ocmVzdFBhdHQpKSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgYXJyYXksIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCBhcnJheSwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xuX3JlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKX0pO1xuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IHNwbGl0UmVjb3JkUGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlcXVpcmVkRW50cmllcz1bXTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBvcHRpb25hbEVudHJpZXM9W107XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmVzdEVudHJpZXM9W107XG5mb3IoY29uc3RbbmFtZSx2YWx1ZV1vZiBlbnRyaWVzKHNwZWNpbWVuKSl7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHJlcXVpcmVkUGF0dCxuYW1lKSl7XG5yZXF1aXJlZEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1lbHNlIGlmKGhhc093blByb3BlcnR5T2Yob3B0aW9uYWxQYXR0LG5hbWUpKXtcbm9wdGlvbmFsRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2V7XG5yZXN0RW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe1xucmVxdWlyZWRTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhyZXF1aXJlZEVudHJpZXMpLFxub3B0aW9uYWxTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxucmVzdFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlc3RFbnRyaWVzKX0pO1xuXG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGFkYXB0UmVjb3JkUGF0dGVybj0ob3B0aW9uYWxQYXR0LG5hbWVzKT0+XG5mcm9tVW5pcXVlRW50cmllcyhuYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxNTS5vcHQob3B0aW9uYWxQYXR0W25hbWVdKV0pKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdFJlY29yZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXt9LHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5UmVjb3JkJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59PVxuc3BsaXRSZWNvcmRQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcblxuY29uc3QgcGFydGlhbE5hbWVzPS8qICAgICAgICAgICAgICAgICAgICovb3duS2V5cyhvcHRpb25hbFNwZWNpbWVuKTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0UmVjb3JkUGF0dGVybihvcHRpb25hbFBhdHQscGFydGlhbE5hbWVzKTtcbnJldHVybihcbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuLHJlcXVpcmVkUGF0dCxjaGVjaykmJlxucGFydGlhbE5hbWVzLmV2ZXJ5KChuYW1lKT0+XG5jaGVja01hdGNoZXMoXG5vcHRpb25hbFNwZWNpbWVuW25hbWVdLFxucGFydGlhbFBhdHRbbmFtZV0sXG5jaGVjayxcbiBgJHtuYW1lfT9gKSkmJlxuXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKlxuXG5cbiAgICAgKi9cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weVJlY29yZCcmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlSZWNvcmQnKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCByZWNvcmQsIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCByZWNvcmQsIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbnJlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBIZWxwZXJzQnlNYXRjaFRhZz1oYXJkZW4oe1xuJ21hdGNoOmFueSc6bWF0Y2hBbnlIZWxwZXIsXG4nbWF0Y2g6YW5kJzptYXRjaEFuZEhlbHBlcixcbidtYXRjaDpvcic6bWF0Y2hPckhlbHBlcixcbidtYXRjaDpub3QnOm1hdGNoTm90SGVscGVyLFxuXG4nbWF0Y2g6c2NhbGFyJzptYXRjaFNjYWxhckhlbHBlcixcbidtYXRjaDprZXknOm1hdGNoS2V5SGVscGVyLFxuJ21hdGNoOnBhdHRlcm4nOm1hdGNoUGF0dGVybkhlbHBlcixcbidtYXRjaDpraW5kJzptYXRjaEtpbmRIZWxwZXIsXG4nbWF0Y2g6dGFnZ2VkJzptYXRjaFRhZ2dlZEhlbHBlcixcbidtYXRjaDpiaWdpbnQnOm1hdGNoQmlnaW50SGVscGVyLFxuJ21hdGNoOm5hdCc6bWF0Y2hOYXRIZWxwZXIsXG4nbWF0Y2g6c3RyaW5nJzptYXRjaFN0cmluZ0hlbHBlcixcbidtYXRjaDpzeW1ib2wnOm1hdGNoU3ltYm9sSGVscGVyLFxuJ21hdGNoOnJlbW90YWJsZSc6bWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbidtYXRjaDpsdCc6bWF0Y2hMVEhlbHBlcixcbidtYXRjaDpsdGUnOm1hdGNoTFRFSGVscGVyLFxuJ21hdGNoOmd0ZSc6bWF0Y2hHVEVIZWxwZXIsXG4nbWF0Y2g6Z3QnOm1hdGNoR1RIZWxwZXIsXG5cbidtYXRjaDphcnJheU9mJzptYXRjaEFycmF5T2ZIZWxwZXIsXG4nbWF0Y2g6cmVjb3JkT2YnOm1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4nbWF0Y2g6c2V0T2YnOm1hdGNoU2V0T2ZIZWxwZXIsXG4nbWF0Y2g6YmFnT2YnOm1hdGNoQmFnT2ZIZWxwZXIsXG4nbWF0Y2g6bWFwT2YnOm1hdGNoTWFwT2ZIZWxwZXIsXG4nbWF0Y2g6c3BsaXRBcnJheSc6bWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuJ21hdGNoOnNwbGl0UmVjb3JkJzptYXRjaFNwbGl0UmVjb3JkSGVscGVyfSk7XG5cblxuY29uc3QgbWFrZU1hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuY29uc3QgbWF0Y2hlcj1tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbmFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG5yZXR1cm4gbWF0Y2hlcjtcbiB9O1xuXG5jb25zdCBtYWtlS2luZE1hdGNoZXI9KGtpbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsa2luZCk7XG5cbmNvbnN0IEFueVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDphbnknLHVuZGVmaW5lZCk7XG5jb25zdCBTY2FsYXJTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJyx1bmRlZmluZWQpO1xuY29uc3QgS2V5U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmtleScsdW5kZWZpbmVkKTtcbmNvbnN0IFBhdHRlcm5TaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsdW5kZWZpbmVkKTtcbmNvbnN0IEJvb2xlYW5TaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbmNvbnN0IE51bWJlclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG5jb25zdCBCaWdJbnRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLFtdKTtcbmNvbnN0IE5hdFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsW10pO1xuY29uc3QgU3RyaW5nU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJyxbXSk7XG5jb25zdCBTeW1ib2xTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLFtdKTtcbmNvbnN0IFJlY29yZFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IEFycmF5U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsW0FueVNoYXBlXSk7XG5jb25zdCBTZXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsW0FueVNoYXBlXSk7XG5jb25zdCBCYWdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBNYXBTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBSZW1vdGFibGVTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuY29uc3QgRXJyb3JTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG5jb25zdCBQcm9taXNlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG5jb25zdCBVbmRlZmluZWRTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4vKlxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IG1ha2VMaW1pdHNNYXRjaGVyPSh0YWcscGF5bG9hZCk9PntcbmlmKHBheWxvYWRbcGF5bG9hZC5sZW5ndGgtMV09PT11bmRlZmluZWQpe1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLHBheWxvYWQubGVuZ3RoLTEpKTtcbiB9XG5yZXR1cm4gbWFrZU1hdGNoZXIodGFnLHBheWxvYWQpO1xuIH07XG5cbmNvbnN0IG1ha2VSZW1vdGFibGVNYXRjaGVyPShsYWJlbD11bmRlZmluZWQpPT5cbmxhYmVsPT09dW5kZWZpbmVkP1xuUmVtb3RhYmxlU2hhcGU6XG5tYWtlTWF0Y2hlcignbWF0Y2g6cmVtb3RhYmxlJyxoYXJkZW4oe2xhYmVsfSkpO1xuXG4vKlxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IG1ha2VTcGxpdFBheWxvYWQ9KFxuZW1wdHksXG5iYXNlLFxub3B0aW9uYWw9dW5kZWZpbmVkLFxucmVzdD11bmRlZmluZWQpPT5cbntcbmlmKHJlc3Qpe1xucmV0dXJuW2Jhc2Usb3B0aW9uYWx8fGVtcHR5LHJlc3RdO1xuIH1cbmlmKG9wdGlvbmFsKXtcbnJldHVybltiYXNlLG9wdGlvbmFsXTtcbiB9XG5yZXR1cm5bYmFzZV07XG4gfTtcblxuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgTT1oYXJkZW4oe1xuYW55OigpPT5BbnlTaGFwZSxcbmFuZDooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6YW5kJyxwYXR0cyksXG5vcjooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6b3InLHBhdHRzKSxcbm5vdDooc3ViUGF0dCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpub3QnLHN1YlBhdHQpLFxuXG5zY2FsYXI6KCk9PlNjYWxhclNoYXBlLFxua2V5OigpPT5LZXlTaGFwZSxcbnBhdHRlcm46KCk9PlBhdHRlcm5TaGFwZSxcbmtpbmQ6bWFrZUtpbmRNYXRjaGVyLFxudGFnZ2VkOih0YWdQYXR0PU0uc3RyaW5nKCkscGF5bG9hZFBhdHQ9TS5hbnkoKSk9PlxubWFrZU1hdGNoZXIoJ21hdGNoOnRhZ2dlZCcsaGFyZGVuKFt0YWdQYXR0LHBheWxvYWRQYXR0XSkpLFxuYm9vbGVhbjooKT0+Qm9vbGVhblNoYXBlLFxubnVtYmVyOigpPT5OdW1iZXJTaGFwZSxcbmJpZ2ludDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiaWdpbnQnLFtsaW1pdHNdKTpCaWdJbnRTaGFwZSxcbm5hdDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpuYXQnLFtsaW1pdHNdKTpOYXRTaGFwZSxcbnN0cmluZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzdHJpbmcnLFtsaW1pdHNdKTpTdHJpbmdTaGFwZSxcbnN5bWJvbDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzeW1ib2wnLFtsaW1pdHNdKTpTeW1ib2xTaGFwZSxcbnJlY29yZDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00ucmVjb3JkT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6UmVjb3JkU2hhcGUsXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuYXJyYXk6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmFycmF5T2YoTS5hbnkoKSxsaW1pdHMpOkFycmF5U2hhcGUsXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5zZXQ6KGxpbWl0cz11bmRlZmluZWQpPT5saW1pdHM/TS5zZXRPZihNLmFueSgpLGxpbWl0cyk6U2V0U2hhcGUsXG5iYWc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmJhZ09mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOkJhZ1NoYXBlLFxubWFwOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5tYXBPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpNYXBTaGFwZSxcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5yZW1vdGFibGU6bWFrZVJlbW90YWJsZU1hdGNoZXIsXG5lcnJvcjooKT0+RXJyb3JTaGFwZSxcbnByb21pc2U6KCk9PlByb21pc2VTaGFwZSxcbnVuZGVmaW5lZDooKT0+VW5kZWZpbmVkU2hhcGUsXG5udWxsOigpPT5udWxsLFxuXG5sdDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmx0JyxyaWdodE9wZXJhbmQpLFxubHRlOihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHRlJyxyaWdodE9wZXJhbmQpLFxuZXE6KGtleSk9PntcbmFzc2VydEtleShrZXkpO1xucmV0dXJuIGtleT09PXVuZGVmaW5lZD9NLnVuZGVmaW5lZCgpOmtleTtcbiB9LFxubmVxOihrZXkpPT5NLm5vdChNLmVxKGtleSkpLFxuZ3RlOihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6Z3RlJyxyaWdodE9wZXJhbmQpLFxuZ3Q6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndCcscmlnaHRPcGVyYW5kKSxcblxucmVjb3JkT2Y6KGtleVBhdHQ9TS5hbnkoKSx2YWx1ZVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6cmVjb3JkT2YnLFtrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHNdKSxcbmFycmF5T2Y6KHN1YlBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YXJyYXlPZicsW3N1YlBhdHQsbGltaXRzXSksXG5zZXRPZjooa2V5UGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzZXRPZicsW2tleVBhdHQsbGltaXRzXSksXG5iYWdPZjooa2V5UGF0dD1NLmFueSgpLGNvdW50UGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiYWdPZicsW2tleVBhdHQsY291bnRQYXR0LGxpbWl0c10pLFxubWFwT2Y6KGtleVBhdHQ9TS5hbnkoKSx2YWx1ZVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLFtrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHNdKSxcbnNwbGl0QXJyYXk6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdEFycmF5Jyxcbm1ha2VTcGxpdFBheWxvYWQoW10sYmFzZSxvcHRpb25hbCxyZXN0KSksXG5cbnNwbGl0UmVjb3JkOihiYXNlLG9wdGlvbmFsPXVuZGVmaW5lZCxyZXN0PXVuZGVmaW5lZCk9PlxubWFrZU1hdGNoZXIoXG4nbWF0Y2g6c3BsaXRSZWNvcmQnLFxubWFrZVNwbGl0UGF5bG9hZCh7fSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXQ6KGJhc2UscmVzdD11bmRlZmluZWQpPT57XG5pZihwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpPT09J2NvcHlBcnJheScpe1xuLy9cbi8vXG5yZXR1cm4gTS5zcGxpdEFycmF5KGJhc2UscmVzdCYmW10scmVzdCk7XG4gfWVsc2V7XG5yZXR1cm4gTS5zcGxpdFJlY29yZChiYXNlLHJlc3QmJnt9LHJlc3QpO1xuIH1cbiB9LFxucGFydGlhbDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vL1xuLy9cbnJldHVybiBNLnNwbGl0QXJyYXkoW10sYmFzZSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKHt9LGJhc2UscmVzdCk7XG4gfVxuIH0sXG5cbmVyZWY6KHQpPT5NLm9yKHQsTS5wcm9taXNlKCkpLFxub3B0Oih0KT0+TS5vcihNLnVuZGVmaW5lZCgpLHQpLFxuXG5pbnRlcmZhY2U6KGludGVyZmFjZU5hbWUsbWV0aG9kR3VhcmRzLG9wdGlvbnMpPT5cbi8vXG5tYWtlSW50ZXJmYWNlR3VhcmQoaW50ZXJmYWNlTmFtZSxtZXRob2RHdWFyZHMsb3B0aW9ucyksXG5jYWxsOiguLi5hcmdQYXR0ZXJucyk9PlxuLy9cbm1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJyxhcmdQYXR0ZXJucyksXG5jYWxsV2hlbjooLi4uYXJnR3VhcmRzKT0+XG4vL1xubWFrZU1ldGhvZEd1YXJkTWFrZXIoJ2FzeW5jJyxhcmdHdWFyZHMpLFxuXG5hd2FpdDooYXJnUGF0dGVybik9PlxuLy9cbm1ha2VBd2FpdEFyZ0d1YXJkKGFyZ1BhdHRlcm4pLFxucmF3OigpPT5cbi8vXG5tYWtlUmF3R3VhcmQoKX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuY2hlY2tNYXRjaGVzLFxubWF0Y2hlcyxcbm11c3RNYXRjaCxcbmFzc2VydFBhdHRlcm4sXG5pc1BhdHRlcm4sXG5nZXRSYW5rQ292ZXIsXG5NLFxua2luZE9mfSk7XG5cbiB9O1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCAgICAgICB7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxubXVzdE1hdGNoLFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk0sXG5raW5kT2Z9PVxubWFrZVBhdHRlcm5LaXQoKTskaM2PX29uY2UuY2hlY2tNYXRjaGVzKGNoZWNrTWF0Y2hlcyk7JGjNj19vbmNlLm1hdGNoZXMobWF0Y2hlcyk7JGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpOyRozY9fb25jZS5hc3NlcnRQYXR0ZXJuKGFzc2VydFBhdHRlcm4pOyRozY9fb25jZS5pc1BhdHRlcm4oaXNQYXR0ZXJuKTskaM2PX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjNj19vbmNlLk0oTSk7JGjNj19vbmNlLmtpbmRPZihraW5kT2YpO1xuXG5NTT1NO1xuXG4vL1xuXG4vL1xuY29uc3QgQXdhaXRBcmdHdWFyZFBheWxvYWRTaGFwZT1oYXJkZW4oe1xuYXJnR3VhcmQ6TS5wYXR0ZXJuKCl9KTtcblxuXG5jb25zdCAgICAgICAgQXdhaXRBcmdHdWFyZFNoYXBlPU0ua2luZCgnZ3VhcmQ6YXdhaXRBcmdHdWFyZCcpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5Bd2FpdEFyZ0d1YXJkU2hhcGUoQXdhaXRBcmdHdWFyZFNoYXBlKTtcbmNvbnN0ICAgICAgICBpc0F3YWl0QXJnR3VhcmQ9KHNwZWNpbWVuKT0+XG5tYXRjaGVzKHNwZWNpbWVuLEF3YWl0QXJnR3VhcmRTaGFwZSk7JGjNj19vbmNlLmlzQXdhaXRBcmdHdWFyZChpc0F3YWl0QXJnR3VhcmQpO1xuaGFyZGVuKGlzQXdhaXRBcmdHdWFyZCk7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0QXdhaXRBcmdHdWFyZD0oc3BlY2ltZW4pPT57XG5tdXN0TWF0Y2goc3BlY2ltZW4sQXdhaXRBcmdHdWFyZFNoYXBlLCdhd2FpdEFyZ0d1YXJkJyk7XG4gfTskaM2PX29uY2UuYXNzZXJ0QXdhaXRBcmdHdWFyZChhc3NlcnRBd2FpdEFyZ0d1YXJkKTtcbmhhcmRlbihhc3NlcnRBd2FpdEFyZ0d1YXJkKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VBd2FpdEFyZ0d1YXJkPShhcmdQYXR0ZXJuKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmVzdWx0PW1ha2VUYWdnZWQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnLHtcbmFyZ0d1YXJkOmFyZ1BhdHRlcm59KTtcblxuYXNzZXJ0QXdhaXRBcmdHdWFyZChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vL1xuXG5jb25zdCBSYXdHdWFyZFBheWxvYWRTaGFwZT1NLnJlY29yZCgpO1xuXG5jb25zdCAgICAgICAgUmF3R3VhcmRTaGFwZT1NLmtpbmQoJ2d1YXJkOnJhd0d1YXJkJyk7JGjNj19vbmNlLlJhd0d1YXJkU2hhcGUoUmF3R3VhcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBpc1Jhd0d1YXJkPShzcGVjaW1lbik9Pm1hdGNoZXMoc3BlY2ltZW4sUmF3R3VhcmRTaGFwZSk7JGjNj19vbmNlLmlzUmF3R3VhcmQoaXNSYXdHdWFyZCk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRSYXdHdWFyZD0oc3BlY2ltZW4pPT5cbm11c3RNYXRjaChzcGVjaW1lbixSYXdHdWFyZFNoYXBlLCdyYXdHdWFyZCcpO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0UmF3R3VhcmQoYXNzZXJ0UmF3R3VhcmQpO1xuY29uc3QgbWFrZVJhd0d1YXJkPSgpPT5tYWtlVGFnZ2VkKCdndWFyZDpyYXdHdWFyZCcse30pO1xuXG4vL1xuLy9cblxuY29uc3QgICAgICAgIFN5bmNWYWx1ZUd1YXJkU2hhcGU9TS5vcihSYXdHdWFyZFNoYXBlLE0ucGF0dGVybigpKTskaM2PX29uY2UuU3luY1ZhbHVlR3VhcmRTaGFwZShTeW5jVmFsdWVHdWFyZFNoYXBlKTtcblxuY29uc3QgICAgICAgIFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlPU0uYXJyYXlPZihTeW5jVmFsdWVHdWFyZFNoYXBlKTskaM2PX29uY2UuU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUoU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUpO1xuXG5jb25zdCBBcmdHdWFyZFNoYXBlPU0ub3IoUmF3R3VhcmRTaGFwZSxBd2FpdEFyZ0d1YXJkU2hhcGUsTS5wYXR0ZXJuKCkpO1xuY29uc3QgICAgICAgIEFyZ0d1YXJkTGlzdFNoYXBlPU0uYXJyYXlPZihBcmdHdWFyZFNoYXBlKTskaM2PX29uY2UuQXJnR3VhcmRMaXN0U2hhcGUoQXJnR3VhcmRMaXN0U2hhcGUpO1xuXG5jb25zdCBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGU9aGFyZGVuKHtcbmNhbGxLaW5kOidzeW5jJyxcbmFyZ0d1YXJkczpTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbm9wdGlvbmFsQXJnR3VhcmRzOk0ub3B0KFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKSxcbnJlc3RBcmdHdWFyZDpNLm9wdChTeW5jVmFsdWVHdWFyZFNoYXBlKSxcbnJldHVybkd1YXJkOlN5bmNWYWx1ZUd1YXJkU2hhcGV9KTtcblxuXG5jb25zdCBBc3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlPWhhcmRlbih7XG5jYWxsS2luZDonYXN5bmMnLFxuYXJnR3VhcmRzOkFyZ0d1YXJkTGlzdFNoYXBlLFxub3B0aW9uYWxBcmdHdWFyZHM6TS5vcHQoQXJnR3VhcmRMaXN0U2hhcGUpLFxucmVzdEFyZ0d1YXJkOk0ub3B0KFN5bmNWYWx1ZUd1YXJkU2hhcGUpLFxucmV0dXJuR3VhcmQ6U3luY1ZhbHVlR3VhcmRTaGFwZX0pO1xuXG5cbmNvbnN0ICAgICAgICBNZXRob2RHdWFyZFBheWxvYWRTaGFwZT1NLm9yKFxuU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSk7JGjNj19vbmNlLk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgTWV0aG9kR3VhcmRTaGFwZT1NLmtpbmQoJ2d1YXJkOm1ldGhvZEd1YXJkJyk7XG5cbi8qXG5cblxuICovJGjNj19vbmNlLk1ldGhvZEd1YXJkU2hhcGUoTWV0aG9kR3VhcmRTaGFwZSk7XG5jb25zdCAgICAgICAgYXNzZXJ0TWV0aG9kR3VhcmQ9KHNwZWNpbWVuKT0+e1xubXVzdE1hdGNoKHNwZWNpbWVuLE1ldGhvZEd1YXJkU2hhcGUsJ21ldGhvZEd1YXJkJyk7XG4gfTskaM2PX29uY2UuYXNzZXJ0TWV0aG9kR3VhcmQoYXNzZXJ0TWV0aG9kR3VhcmQpO1xuaGFyZGVuKGFzc2VydE1ldGhvZEd1YXJkKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyPShcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHM9dW5kZWZpbmVkLFxucmVzdEFyZ0d1YXJkPXVuZGVmaW5lZCk9PlxuXG5oYXJkZW4oe1xub3B0aW9uYWw6KC4uLm9wdEFyZ0d1YXJkcyk9Pntcbm9wdGlvbmFsQXJnR3VhcmRzPT09dW5kZWZpbmVkfHxcbkZhaWwgYENhbiBvbmx5IGhhdmUgb25lIHNldCBvZiBvcHRpb25hbCBndWFyZHNgO1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxcbkZhaWwgYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsYXJnR3VhcmRzLG9wdEFyZ0d1YXJkcyk7XG4gfSxcbnJlc3Q6KHJBcmdHdWFyZCk9PntcbnJlc3RBcmdHdWFyZD09PXVuZGVmaW5lZHx8RmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgcmVzdCBhcmdgO1xucmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJBcmdHdWFyZCk7XG5cbiB9LFxucmV0dXJuczoocmV0dXJuR3VhcmQ9TS51bmRlZmluZWQoKSk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCByZXN1bHQ9bWFrZVRhZ2dlZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnLHtcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQsXG5yZXR1cm5HdWFyZH0pO1xuXG5hc3NlcnRNZXRob2RHdWFyZChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9fSk7XG5cblxuY29uc3QgICAgICAgIEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5pbnRlcmZhY2VOYW1lOk0uc3RyaW5nKCksXG5tZXRob2RHdWFyZHM6TS5yZWNvcmRPZihNLnN0cmluZygpLE1ldGhvZEd1YXJkU2hhcGUpfSxcblxue1xuZGVmYXVsdEd1YXJkczpNLm9yKE0udW5kZWZpbmVkKCksJ3Bhc3NhYmxlJywncmF3JyksXG5zbG9wcHk6TS5ib29sZWFuKCksXG5zeW1ib2xNZXRob2RHdWFyZHM6TS5tYXBPZihNLnN5bWJvbCgpLE1ldGhvZEd1YXJkU2hhcGUpfSk7JGjNj19vbmNlLkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlKEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJbnRlcmZhY2VHdWFyZFNoYXBlPU0ua2luZCgnZ3VhcmQ6aW50ZXJmYWNlR3VhcmQnKTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuSW50ZXJmYWNlR3VhcmRTaGFwZShJbnRlcmZhY2VHdWFyZFNoYXBlKTtcbmNvbnN0ICAgICAgICBhc3NlcnRJbnRlcmZhY2VHdWFyZD0oc3BlY2ltZW4pPT57XG5tdXN0TWF0Y2goc3BlY2ltZW4sSW50ZXJmYWNlR3VhcmRTaGFwZSwnaW50ZXJmYWNlR3VhcmQnKTtcbiB9OyRozY9fb25jZS5hc3NlcnRJbnRlcmZhY2VHdWFyZChhc3NlcnRJbnRlcmZhY2VHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0SW50ZXJmYWNlR3VhcmQpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUludGVyZmFjZUd1YXJkPShpbnRlcmZhY2VOYW1lLG1ldGhvZEd1YXJkcyxvcHRpb25zPXt9KT0+e1xuY29uc3R7c2xvcHB5PWZhbHNlLGRlZmF1bHRHdWFyZHM9c2xvcHB5PydwYXNzYWJsZSc6dW5kZWZpbmVkfT1cbm9wdGlvbnM7XG4vL1xuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN0cmluZ01ldGhvZEd1YXJkcz17fTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXM9W107XG5mb3IoY29uc3Qga2V5IG9mIG93bktleXMobWV0aG9kR3VhcmRzKSl7XG5jb25zdCB2YWx1ZT1tZXRob2RHdWFyZHNbLyogICAgICAgICAgICAgICAgICova2V5XTtcbmlmKHR5cGVvZiBrZXk9PT0nc3ltYm9sJyl7XG5zeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzLnB1c2goW2tleSx2YWx1ZV0pO1xuIH1lbHNle1xuc3RyaW5nTWV0aG9kR3VhcmRzW2tleV09dmFsdWU7XG4gfVxuIH1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCByZXN1bHQ9bWFrZVRhZ2dlZCgnZ3VhcmQ6aW50ZXJmYWNlR3VhcmQnLHtcbmludGVyZmFjZU5hbWUsXG5tZXRob2RHdWFyZHM6c3RyaW5nTWV0aG9kR3VhcmRzLFxuLi4uKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMubGVuZ3RoP1xue3N5bWJvbE1ldGhvZEd1YXJkczptYWtlQ29weU1hcChzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzKX06XG57fSksXG5kZWZhdWx0R3VhcmRzfSk7XG5cbmFzc2VydEludGVyZmFjZUd1YXJkKHJlc3VsdCk7XG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovcmVzdWx0KTtcbiB9O1xuXG5jb25zdCBHdWFyZFBheWxvYWRTaGFwZXM9aGFyZGVuKHtcbidndWFyZDphd2FpdEFyZ0d1YXJkJzpBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlLFxuJ2d1YXJkOnJhd0d1YXJkJzpSYXdHdWFyZFBheWxvYWRTaGFwZSxcbidndWFyZDptZXRob2RHdWFyZCc6TWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4nZ3VhcmQ6aW50ZXJmYWNlR3VhcmQnOkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlfSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdLCJraW5kT2YiOlsia2luZE9mIl0sIkF3YWl0QXJnR3VhcmRTaGFwZSI6WyJBd2FpdEFyZ0d1YXJkU2hhcGUiXSwiaXNBd2FpdEFyZ0d1YXJkIjpbImlzQXdhaXRBcmdHdWFyZCJdLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIjpbImFzc2VydEF3YWl0QXJnR3VhcmQiXSwiUmF3R3VhcmRTaGFwZSI6WyJSYXdHdWFyZFNoYXBlIl0sImlzUmF3R3VhcmQiOlsiaXNSYXdHdWFyZCJdLCJhc3NlcnRSYXdHdWFyZCI6WyJhc3NlcnRSYXdHdWFyZCJdLCJTeW5jVmFsdWVHdWFyZFNoYXBlIjpbIlN5bmNWYWx1ZUd1YXJkU2hhcGUiXSwiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiOlsiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiXSwiQXJnR3VhcmRMaXN0U2hhcGUiOlsiQXJnR3VhcmRMaXN0U2hhcGUiXSwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiOlsiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiXSwiTWV0aG9kR3VhcmRTaGFwZSI6WyJNZXRob2RHdWFyZFNoYXBlIl0sImFzc2VydE1ldGhvZEd1YXJkIjpbImFzc2VydE1ldGhvZEd1YXJkIl0sIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIjpbIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIl0sIkludGVyZmFjZUd1YXJkU2hhcGUiOlsiSW50ZXJmYWNlR3VhcmRTaGFwZSJdLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCI6WyJhc3NlcnRJbnRlcmZhY2VHdWFyZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEusOTSgEAAEoBAAAiAAAAQGVuZG8vcGF0dGVybnMtdjEuNC43L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0gGixEIGAABCBgAAIQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLCBbJGjNj19hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaM2PX2EgPT4gKG1lbW9SYWNlID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjNj19vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRozY9fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTsgICBcblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAs11bRlUCAABVAgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOC9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCAnbmFtZScsIHt2YWx1ZTogXCJpc1Byb21pc2VcIn0pOyRozY9fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsgICAvKlxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uICAgICAgICBpc1Byb21pc2UobWF5YmVQcm9taXNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKT09PW1heWJlUHJvbWlzZTtcbiB9XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+mbwkZwHAACcBwAAKQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOC9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiovXG5cbmNvbnN0IGlzT2JqZWN0PSh2YWx1ZSk9Pk9iamVjdCh2YWx1ZSk9PT12YWx1ZTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGtub3duUHJvbWlzZXM9bmV3IFdlYWtNYXAoKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkPShyZWNvcmQpPT57XG5pZighcmVjb3JkfHxyZWNvcmQuc2V0dGxlZCl7XG5yZXR1cm4gbmV3IFNldCgpO1xuIH1cblxuY29uc3R7ZGVmZXJyZWRzfT1yZWNvcmQ7XG5PYmplY3QuYXNzaWduKHJlY29yZCx7XG5kZWZlcnJlZHM6dW5kZWZpbmVkLFxuc2V0dGxlZDp0cnVlfSk7XG5cbk9iamVjdC5mcmVlemUocmVjb3JkKTtcbnJldHVybiBkZWZlcnJlZHM7XG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZD0odmFsdWUpPT57XG5pZighaXNPYmplY3QodmFsdWUpKXtcbi8vXG4vL1xuLy9cbi8vXG5yZXR1cm4gaGFyZGVuKHtzZXR0bGVkOnRydWV9KTtcbiB9XG5cbmxldCByZWNvcmQ9a25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG5pZighcmVjb3JkKXtcbnJlY29yZD17ZGVmZXJyZWRzOm5ldyBTZXQoKSxzZXR0bGVkOmZhbHNlfTtcbmtub3duUHJvbWlzZXMuc2V0KHZhbHVlLHJlY29yZCk7XG4vL1xuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuKHZhbCk9PntcbmZvcihjb25zdHtyZXNvbHZlfW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVzb2x2ZSh2YWwpO1xuIH1cbiB9LFxuKGVycik9PntcbmZvcihjb25zdHtyZWplY3R9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZWplY3QoZXJyKTtcbiB9XG4gfSk7XG5cbiB9XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0e3JhY2V9PXtcbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbnJhY2UodmFsdWVzKXtcbmxldCBkZWZlcnJlZDtcbi8qICAgICAgICAgICAgICAgICAqL1xuLy9cbmNvbnN0IGNhY2hlZFZhbHVlcz1bXTtcbmNvbnN0IEM9dGhpcztcbmNvbnN0IHJlc3VsdD1uZXcgQygocmVzb2x2ZSxyZWplY3QpPT57XG5kZWZlcnJlZD17cmVzb2x2ZSxyZWplY3R9O1xuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG5jYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG5jb25zdHtzZXR0bGVkLGRlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihzZXR0bGVkKXtcbi8vXG4vL1xuQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUscmVqZWN0KTtcbiB9ZWxzZXtcbmRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG5cbi8vXG4vL1xucmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpPT57XG5mb3IoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKXtcbmNvbnN0e2RlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihkZWZlcnJlZHMpe1xuZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcbiB9fTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnG3EsnwFAAB8BQAANAAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOC9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQ9KCk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjNj19vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAS6w5NKAQAASgEAACUAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjgvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADcaPdCkBEAAJARAAAcAAAAQGVuZG8vc3RyZWFtLXYxLjIuOC9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlUGlwZSIsIm1ha2VRdWV1ZSIsIm1ha2VTdHJlYW0iLCJtYXBSZWFkZXIiLCJtYXBXcml0ZXIiLCJwcmltZSIsInB1bXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRSxtYWtlUHJvbWlzZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vL1xuLy9cbi8vXG5jb25zdCBmcmVlemU9LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL09iamVjdC5mcmVlemU7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVF1ZXVlPSgpPT57XG5sZXR7cHJvbWlzZTp0YWlsUHJvbWlzZSxyZXNvbHZlOnRhaWxSZXNvbHZlfT1tYWtlUHJvbWlzZUtpdCgpO1xucmV0dXJue1xucHV0KHZhbHVlKXtcbmNvbnN0e3Jlc29sdmUscHJvbWlzZX09bWFrZVByb21pc2VLaXQoKTtcbnRhaWxSZXNvbHZlKGZyZWV6ZSh7dmFsdWUscHJvbWlzZX0pKTtcbnRhaWxSZXNvbHZlPXJlc29sdmU7XG4gfSxcbmdldCgpe1xuY29uc3QgcHJvbWlzZT10YWlsUHJvbWlzZS50aGVuKChuZXh0KT0+bmV4dC52YWx1ZSk7XG50YWlsUHJvbWlzZT10YWlsUHJvbWlzZS50aGVuKChuZXh0KT0+bmV4dC5wcm9taXNlKTtcbnJldHVybiBoYXJkZW4ocHJvbWlzZSk7XG4gfX07XG5cbiB9OyRozY9fb25jZS5tYWtlUXVldWUobWFrZVF1ZXVlKTtcbmhhcmRlbihtYWtlUXVldWUpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVN0cmVhbT0oYWNrcyxkYXRhKT0+e1xuY29uc3Qgc3RyZWFtPWhhcmRlbih7XG4vKlxuXG4gICAgICovXG5uZXh0KHZhbHVlKXtcbi8vXG4vL1xuZGF0YS5wdXQoZnJlZXplKHt2YWx1ZSxkb25lOmZhbHNlfSkpO1xucmV0dXJuIGFja3MuZ2V0KCk7XG4gfSxcbi8qXG5cbiAgICAgKi9cbnJldHVybih2YWx1ZSl7XG5kYXRhLnB1dChmcmVlemUoe3ZhbHVlLGRvbmU6dHJ1ZX0pKTtcbnJldHVybiBhY2tzLmdldCgpO1xuIH0sXG4vKlxuXG4gICAgICovXG50aHJvdyhlcnJvcil7XG5kYXRhLnB1dChoYXJkZW4oUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe1xucmV0dXJuIHN0cmVhbTtcbiB9fSk7XG5cbnJldHVybiBzdHJlYW07XG4gfTskaM2PX29uY2UubWFrZVN0cmVhbShtYWtlU3RyZWFtKTtcbmhhcmRlbihtYWtlU3RyZWFtKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgICAgICAgIG1ha2VQaXBlPSgpPT57XG5jb25zdCBkYXRhPW1ha2VRdWV1ZSgpO1xuY29uc3QgYWNrcz1tYWtlUXVldWUoKTtcbmNvbnN0IHJlYWRlcj1tYWtlU3RyZWFtKGFja3MsZGF0YSk7XG5jb25zdCB3cml0ZXI9bWFrZVN0cmVhbShkYXRhLGFja3MpO1xucmV0dXJuIGhhcmRlbihbd3JpdGVyLHJlYWRlcl0pO1xuIH07JGjNj19vbmNlLm1ha2VQaXBlKG1ha2VQaXBlKTtcbmhhcmRlbihtYWtlUGlwZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHB1bXA9YXN5bmMod3JpdGVyLHJlYWRlcixwcmltZXIpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB0aWNrPShwcm9taXNlKT0+XG5FLndoZW4oXG5wcm9taXNlLFxuKHJlc3VsdCk9PntcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiB3cml0ZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gfWVsc2V7XG4vL1xuLy9cbnJldHVybiB0b2NrKHdyaXRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuIH1cbiB9LFxuKC8qICAgICAgICAgICAgICAgICovZXJyb3IpPT57XG5yZXR1cm4gd3JpdGVyLnRocm93KGVycm9yKTtcbiB9KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB0b2NrPShwcm9taXNlKT0+XG5FLndoZW4oXG5wcm9taXNlLFxuKHJlc3VsdCk9PntcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiByZWFkZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gfWVsc2V7XG5yZXR1cm4gdGljayhyZWFkZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiB9XG4gfSxcbigvKiAgICAgICAgICAgICAgICAqL2Vycm9yKT0+e1xucmV0dXJuIHJlYWRlci50aHJvdyhlcnJvcik7XG4gfSk7XG5cbmF3YWl0IHRpY2socmVhZGVyLm5leHQocHJpbWVyKSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07JGjNj19vbmNlLnB1bXAocHVtcCk7XG5oYXJkZW4ocHVtcCk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgcHJpbWU9KGdlbmVyYXRvcixwcmltZXIpPT57XG4vL1xuY29uc3QgZmlyc3Q9Z2VuZXJhdG9yLm5leHQocHJpbWVyKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCByZXN1bHQ7XG5jb25zdCBwcmltZWQ9aGFyZGVuKHtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGFzeW5jIG5leHQodmFsdWUpe1xuaWYocmVzdWx0PT09dW5kZWZpbmVkKXtcbi8vXG5yZXN1bHQ9YXdhaXQgZmlyc3Q7XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLm5leHQodmFsdWUpO1xuIH0sXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgYXN5bmMgcmV0dXJuKHZhbHVlKXtcbmlmKHJlc3VsdD09PXVuZGVmaW5lZCl7XG4vL1xucmVzdWx0PWF3YWl0IGZpcnN0O1xuaWYocmVzdWx0LmRvbmUpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxucmV0dXJuIGdlbmVyYXRvci5yZXR1cm4odmFsdWUpO1xuIH0sXG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGFzeW5jIHRocm93KGVycm9yKXtcbmlmKHJlc3VsdD09PXVuZGVmaW5lZCl7XG4vL1xucmVzdWx0PWF3YWl0IGZpcnN0O1xuaWYocmVzdWx0LmRvbmUpe1xudGhyb3cgZXJyb3I7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IudGhyb3coZXJyb3IpO1xuIH19KTtcblxucmV0dXJuIHByaW1lZDtcbiB9OyRozY9fb25jZS5wcmltZShwcmltZSk7XG5oYXJkZW4ocHJpbWUpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1hcFJlYWRlcj0ocmVhZGVyLHRyYW5zZm9ybSk9PntcbmFzeW5jIGZ1bmN0aW9uKnRyYW5zZm9ybUdlbmVyYXRvcigpe1xuZm9yIGF3YWl0KGNvbnN0IHZhbHVlIG9mIHJlYWRlcil7XG55aWVsZCB0cmFuc2Zvcm0odmFsdWUpO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuaGFyZGVuKHRyYW5zZm9ybUdlbmVyYXRvcik7XG5yZXR1cm4gaGFyZGVuKHRyYW5zZm9ybUdlbmVyYXRvcigpKTtcbiB9OyRozY9fb25jZS5tYXBSZWFkZXIobWFwUmVhZGVyKTtcbmhhcmRlbihtYXBSZWFkZXIpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1hcFdyaXRlcj0od3JpdGVyLHRyYW5zZm9ybSk9PntcbmNvbnN0IHRyYW5zZm9ybWVkV3JpdGVyPWhhcmRlbih7XG4vKlxuXG4gICAgICovXG4gICAgICBhc3luYyBuZXh0KHZhbHVlKXtcbnJldHVybiB3cml0ZXIubmV4dCh0cmFuc2Zvcm0odmFsdWUpKTtcbiB9LFxuLypcblxuICAgICAqL1xuICAgICAgYXN5bmMgdGhyb3coZXJyb3Ipe1xucmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gfSxcbi8qXG5cbiAgICAgKi9cbiAgICAgIGFzeW5jIHJldHVybih2YWx1ZSl7XG5yZXR1cm4gd3JpdGVyLnJldHVybih2YWx1ZSk7XG4gfSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiB9fSk7XG5cbnJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiB9OyRozY9fb25jZS5tYXBXcml0ZXIobWFwV3JpdGVyKTtcbmhhcmRlbihtYXBXcml0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVF1ZXVlIjpbIm1ha2VRdWV1ZSJdLCJtYWtlU3RyZWFtIjpbIm1ha2VTdHJlYW0iXSwibWFrZVBpcGUiOlsibWFrZVBpcGUiXSwicHVtcCI6WyJwdW1wIl0sInByaW1lIjpbInByaW1lIl0sIm1hcFJlYWRlciI6WyJtYXBSZWFkZXIiXSwibWFwV3JpdGVyIjpbIm1hcFdyaXRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABmVxEJwwEAAMMBAAAcAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc3siaW1wb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJBhzwNzAQAAcwEAAB8AAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIkBlbmRvL2ZhciJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOD1uR9vAgAAbwIAACwAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNHZW5lcmF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFzeW5jR2VuZXJhdGU9KG5leHQpPT57XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbnJldHVybiBoYXJkZW4oe1xubmV4dDphc3luYygpPT5oYXJkZW4obmV4dCgpKX0pO1xuXG4gfX0pO1xuXG4gfTskaM2PX29uY2UuYXN5bmNHZW5lcmF0ZShhc3luY0dlbmVyYXRlKTtcbmhhcmRlbihhc3luY0dlbmVyYXRlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jR2VuZXJhdGUiOlsiYXN5bmNHZW5lcmF0ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/fh925gEAAOYBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFpbi5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL21ha2Vycy5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbXV0sW1wiLi9tYWtlcnMuanNcIiwgW11dLFtcIi4vYXN5bmMtZ2VuZXJhdGUuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANxfQTswHAADMBwAAJAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21ha2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZU1hcCIsIm1ha2VQcm9taXNlIiwibWFrZVNldCIsIm1ha2VXZWFrTWFwIiwibWFrZVdlYWtTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIC8vXG4vL1xuLy9cblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVByb21pc2U9KGV4ZWN1dG9yKT0+aGFyZGVuKG5ldyBQcm9taXNlKGV4ZWN1dG9yKSk7JGjNj19vbmNlLm1ha2VQcm9taXNlKG1ha2VQcm9taXNlKTtcbmhhcmRlbihtYWtlUHJvbWlzZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBtYWtlTWFwPShlbnRyaWVzT3JJdGVyYWJsZSk9PmhhcmRlbihuZXcgTWFwKGVudHJpZXNPckl0ZXJhYmxlKSk7JGjNj19vbmNlLm1ha2VNYXAobWFrZU1hcCk7XG5oYXJkZW4obWFrZU1hcCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCAgICAgICAgbWFrZVNldD0odmFsdWVzKT0+aGFyZGVuKG5ldyBTZXQodmFsdWVzKSk7JGjNj19vbmNlLm1ha2VTZXQobWFrZVNldCk7XG5oYXJkZW4obWFrZVNldCk7XG5cbi8qXG5cblxuXG4gKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha01hcD0oZW50cmllcyk9PmhhcmRlbihuZXcgV2Vha01hcChlbnRyaWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrTWFwKG1ha2VXZWFrTWFwKTtcbmhhcmRlbihtYWtlV2Vha01hcCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrU2V0PSh2YWx1ZXMpPT5oYXJkZW4obmV3IFdlYWtTZXQodmFsdWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrU2V0KG1ha2VXZWFrU2V0KTtcbmhhcmRlbihtYWtlV2Vha1NldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZSI6WyJtYWtlUHJvbWlzZSJdLCJtYWtlTWFwIjpbIm1ha2VNYXAiXSwibWFrZVNldCI6WyJtYWtlU2V0Il0sIm1ha2VXZWFrTWFwIjpbIm1ha2VXZWFrTWFwIl0sIm1ha2VXZWFrU2V0IjpbIm1ha2VXZWFrU2V0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIo2475JAwAASQMAACkAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9hc3luYy10b29scy5qc3siaW1wb3J0cyI6WyIuLi9yaW5nMC9tYWluLmpzIl0sImV4cG9ydHMiOlsiYXN5bmNEb1doaWxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IG1ha2VQcm9taXNlOyRozY9faW1wb3J0cyhbW1wiLi4vcmluZzAvbWFpbi5qc1wiLCBbW1wibWFrZVByb21pc2VcIiwgWyRozY9fYSA9PiAobWFrZVByb21pc2UgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3luY0RvV2hpbGU9KGJvZHkpPT57XG5yZXR1cm4gbWFrZVByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e1xuY29uc3QgbG9vcD1hc3luYygpPT57XG5jb25zdCBkb0NvbnRpbnVlPWF3YWl0IGJvZHkoKTtcbmlmKCFkb0NvbnRpbnVlKXtcbi8vXG5yZXNvbHZlKHVuZGVmaW5lZCk7XG5yZXR1cm47XG4gfVxuXG4vL1xuLy9cbmxvb3AoKS5jYXRjaChyZWplY3QpO1xuIH07XG5cbmxvb3AoKS5jYXRjaChyZWplY3QpO1xuIH0pO1xuIH07JGjNj19vbmNlLmFzeW5jRG9XaGlsZShhc3luY0RvV2hpbGUpO1xuaGFyZGVuKGFzeW5jRG9XaGlsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0RvV2hpbGUiOlsiYXN5bmNEb1doaWxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAZvJkKIAQAAiAEAACIAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9tYWluLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL2FzeW5jLXRvb2xzLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAo5afR0/5AABP+QAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAABQu9oH8BAAB/AQAAIAAAAAAAAAAAAAAApIGB+QAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL2hlYXAuanNQSwECHgMKAAAAAAAAAAAABLrDk0oBAABKAQAAJwAAAAAAAAAAAAAApIE++wAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAABLcf+RZCgAAWQoAACQAAAAAAAAAAAAAAKSBzfwAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAADuWrfPawIAAGsCAAAlAAAAAAAAAAAAAACkgWgHAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHXpQa5YAgAAWAIAACsAAAAAAAAAAAAAAKSBFgoBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaXMtcGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAHmlMGXUDAAB1AwAAJAAAAAAAAAAAAAAApIG3DAEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9rZXlzLmpzUEsBAh4DCgAAAAAAAAAAAB9ChiniBgAA4gYAACkAAAAAAAAAAAAAAKSBbhABAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvbWFrZS1vbmNlLmpzUEsBAh4DCgAAAAAAAAAAAO9qtJJfCQAAXwkAAC0AAAAAAAAAAAAAAKSBlxcBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAB19M2c+QQAAPkEAAAhAAAAAAAAAAAAAACkgUEhAQBAYWdvcmljL2NhY2hlLXYwLjMuMi9zcmMvY2FjaGUuanNQSwECHgMKAAAAAAAAAAAAvQC5yAMCAAADAgAAIAAAAAAAAAAAAAAApIF5JgEAQGFnb3JpYy9jYWNoZS12MC4zLjIvc3JjL21haW4uanNQSwECHgMKAAAAAAAAAAAAHtnW7AwEAAAMBAAAIQAAAAAAAAAAAAAApIG6KAEAQGFnb3JpYy9jYWNoZS12MC4zLjIvc3JjL3N0YXRlLmpzUEsBAh4DCgAAAAAAAAAAAO17wXuCFwAAghcAACEAAAAAAAAAAAAAAKSBBS0BAEBhZ29yaWMvY2FjaGUtdjAuMy4yL3NyYy9zdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAEusOTSgEAAEoBAAAhAAAAAAAAAAAAAACkgcZEAQBAYWdvcmljL2NhY2hlLXYwLjMuMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAXM2qhwAdAAAAHQAAJgAAAAAAAAAAAAAApIFPRgEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAAgUbFhdQDAADUAwAAJwAAAAAAAAAAAAAApIGTYwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAOih3RrHBQAAxwUAACcAAAAAAAAAAAAAAKSBrGcBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9kaXNwbGF5SW5mby5qc1BLAQIeAwoAAAAAAAAAAAAjjjJqPwIAAD8CAAAhAAAAAAAAAAAAAACkgbhtAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAaJTTyWoWAABqFgAAJQAAAAAAAAAAAAAApIE2cAEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2lzc3VlcktpdC5qc1BLAQIeAwoAAAAAAAAAAADkq2Pu4QUAAOEFAAA6AAAAAAAAAAAAAACkgeOGAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAEGFj3ifBQAAnwUAADoAAAAAAAAAAAAAAKSBHI0BAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAlStwyWcEAABnBAAANgAAAAAAAAAAAAAApIETkwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAEcKueNIBgAASAYAADYAAAAAAAAAAAAAAKSBzpcBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAA2P0rVfwMAAH8DAAAjAAAAAAAAAAAAAACkgWqeAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudC5qc1BLAQIeAwoAAAAAAAAAAABLLaf76x8AAOsfAAApAAAAAAAAAAAAAACkgSqiAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudExlZGdlci5qc1BLAQIeAwoAAAAAAAAAAAAdxNEKuhAAALoQAAAhAAAAAAAAAAAAAACkgVzCAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanNQSwECHgMKAAAAAAAAAAAAipljyNYFAADWBQAALQAAAAAAAAAAAAAApIFV0wEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAABIwcE7MGAAAzBgAACYAAAAAAAAAAAAAAKSBdtkBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAAS6w5NKAQAASgEAACcAAAAAAAAAAAAAAKSBhvIBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABW0VcR6RkAAOkZAAAnAAAAAAAAAAAAAACkgRX0AQBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanNQSwECHgMKAAAAAAAAAAAAMgP9Gc0FAADNBQAAJQAAAAAAAAAAAAAApIFDDgIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAACcqLSXSAQAAEgEAAAkAAAAAAAAAAAAAACkgVMUAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZGVidWcuanNQSwECHgMKAAAAAAAAAAAAAtXgwo4CAACOAgAAJQAAAAAAAAAAAAAApIHdGAIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2Vycm9ycy5qc1BLAQIeAwoAAAAAAAAAAAAf9quECwUAAAsFAAAkAAAAAAAAAAAAAACkga4bAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAzC+m1R8HAAAfBwAAJwAAAAAAAAAAAAAApIH7IAIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2pzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAACZtFKvTFQAA0xUAAC8AAAAAAAAAAAAAAKSBXygCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAAN9Z4U2eDgAAng4AACYAAAAAAAAAAAAAAKSBfz4CAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAALa9IV5rCAAAawgAACsAAAAAAAAAAAAAAKSBYU0CAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRob2QtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAmgUfr4YdAACGHQAAKAAAAAAAAAAAAAAApIEVVgIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Nlcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAAJewgWEB0AABAdAAAxAAAAAAAAAAAAAACkgeFzAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAEn5UEUhBgAAIQYAACwAAAAAAAAAAAAAAKSBQJECAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90ZXN0aW5nLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAIeqWiD9AgAA/QIAACgAAAAAAAAAAAAAAKSBq5cCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlQ2hlY2suanNQSwECHgMKAAAAAAAAAAAAopUBEE4DAABOAwAAKQAAAAAAAAAAAAAApIHumgIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAABLrDk0oBAABKAQAAKgAAAAAAAAAAAAAApIGDngIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJuHQWoSBwAAEgcAACoAAAAAAAAAAAAAAKSBFaACAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc1BLAQIeAwoAAAAAAAAAAACu+GMDBwgAAAcIAAAzAAAAAAAAAAAAAACkgW+nAgBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNQSwECHgMKAAAAAAAAAAAAtRbSkN0HAADdBwAAJAAAAAAAAAAAAAAApIHHrwIAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAANlbosJxEAAAcRAAACcAAAAAAAAAAAAAAKSB5rcCAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAB0ejOhLSsAAC0rAAAqAAAAAAAAAAAAAACkgZzIAgBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanNQSwECHgMKAAAAAAAAAAAAqJ0YXBEIAAARCAAALgAAAAAAAAAAAAAApIER9AIAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAACnEwIz7RUAAO0VAAAnAAAAAAAAAAAAAACkgW78AgBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAAFQde8yESAAAhEgAAKAAAAAAAAAAAAAAApIGgEgMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc1BLAQIeAwoAAAAAAAAAAACHaHtf0QcAANEHAAApAAAAAAAAAAAAAACkgQclAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc1BLAQIeAwoAAAAAAAAAAABHWhra7QMAAO0DAAAkAAAAAAAAAAAAAACkgR8tAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdG9waWMuanNQSwECHgMKAAAAAAAAAAAABLrDk0oBAABKAQAAKgAAAAAAAAAAAAAApIFOMQMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAPFFhTKCBgAAggYAAC0AAAAAAAAAAAAAAKSB4DIDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAABB7t+aix0AAIsdAAAzAAAAAAAAAAAAAACkga05AwBAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjMvc3JjL21hcnNoYWwtY29udGV4dHMuanNQSwECHgMKAAAAAAAAAAAAyEDQBpQNAACUDQAAIQAAAAAAAAAAAAAApIGJVwMAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAPAiq641BQAANQUAACwAAAAAAAAAAAAAAKSBXGUDAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzUEsBAh4DCgAAAAAAAAAAALrETe33BAAA9wQAADAAAAAAAAAAAAAAAKSB22oDAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1BLAQIeAwoAAAAAAAAAAAA7XjyCnBAAAJwQAAAxAAAAAAAAAAAAAACkgSBwAwBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJgs3yXNCwAAzQsAADEAAAAAAAAAAAAAAKSBC4EDAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNQSwECHgMKAAAAAAAAAAAA6Q453LANAACwDQAANQAAAAAAAAAAAAAApIEnjQMAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAAVH0nFXMKAABzCgAANQAAAAAAAAAAAAAApIEqmwMAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAedsLh6sOAACrDgAALgAAAAAAAAAAAAAApIHwpQMAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAAEusOTSgEAAEoBAAAhAAAAAAAAAAAAAACkgee0AwBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAABf/mwKAWAACgFgAAKAAAAAAAAAAAAAAApIFwtgMAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAC49RYwqAgAAKgIAAAkAAAAAAAAAAAAAACkgVbNAwBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAADBFy6awWAACsFgAAMAAAAAAAAAAAAAAApIFA1gMAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzUEsBAh4DCgAAAAAAAAAAADO2bfg2EQAANhEAAB8AAAAAAAAAAAAAAKSBOu0DAEBhZ29yaWMvdmF0cy12MC4xNS4xL3NyYy9jcmMuanNQSwECHgMKAAAAAAAAAAAA8o+UljQhAAA0IQAAJQAAAAAAAAAAAAAApIGt/gMAQGFnb3JpYy92YXRzLXYwLjE1LjEvc3JjL2xpYi1ib2FyZC5qc1BLAQIeAwoAAAAAAAAAAAC0UF1CtgsAALYLAAAtAAAAAAAAAAAAAACkgSQgBABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2FjdGlvbnMuanNQSwECHgMKAAAAAAAAAAAAjYUuNagCAACoAgAANQAAAAAAAAAAAAAApIElLAQAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9iaWdpbnRTdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAvTrXeFoJAABaCQAALgAAAAAAAAAAAAAApIEgLwQAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9kYXRlLW5vdy5qc1BLAQIeAwoAAAAAAAAAAABCws3O2hIAANoSAAA6AAAAAAAAAAAAAACkgcY4BABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2ZpbmRPck1ha2VJbnZpdGF0aW9uLmpzUEsBAh4DCgAAAAAAAAAAAHQtCCpLAgAASwIAADQAAAAAAAAAAAAAAKSB+EsEAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMy9zcmMvaW50ZXJuYWwtdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAyrv9w5wIAACcCAAAMQAAAAAAAAAAAAAApIGVTgQAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9pc3N1ZXJUYWJsZS5qc1BLAQIeAwoAAAAAAAAAAABIUOvaBR4AAAUeAAAzAAAAAAAAAAAAAACkgYBXBABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2xpYi1kZWh5ZHJhdGUuanNQSwECHgMKAAAAAAAAAAAA4bDjpi+lAAAvpQAAMAAAAAAAAAAAAAAApIHWdQQAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9saWItd2FsbGV0LmpzUEsBAh4DCgAAAAAAAAAAAAwx1aW5AgAAuQIAACwAAAAAAAAAAAAAAKSBUxsFAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMy9zcmMvcHVic3ViLmpzUEsBAh4DCgAAAAAAAAAAAO/sYcSRNQAAkTUAACwAAAAAAAAAAAAAAKSBVh4FAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMy9zcmMvd2FsbGV0LmpzUEsBAh4DCgAAAAAAAAAAAMlqLINRGAAAURgAADMAAAAAAAAAAAAAAKSBMVQFAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qc1BLAQIeAwoAAAAAAAAAAADbdTr/iAEAAIgBAAAeAAAAAAAAAAAAAACkgdNsBQBAYWdvcmljL3pvbmUtdjAuMi4yL2R1cmFibGUuanNQSwECHgMKAAAAAAAAAAAA97rZ1goRAAAKEQAAIgAAAAAAAAAAAAAApIGXbgUAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvZHVyYWJsZS5qc1BLAQIeAwoAAAAAAAAAAABU4lu4xwQAAMcEAAArAAAAAAAAAAAAAACkgeF/BQBAZW5kby9jb21tb24tdjEuMi44L2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzUEsBAh4DCgAAAAAAAAAAAJAGV4ZcBAAAXAQAACoAAAAAAAAAAAAAAKSB8YQFAEBlbmRvL2NvbW1vbi12MS4yLjgvZnJvbS11bmlxdWUtZW50cmllcy5qc1BLAQIeAwoAAAAAAAAAAABRcw2kNwIAADcCAAAkAAAAAAAAAAAAAACkgZWJBQBAZW5kby9jb21tb24tdjEuMi44L2lkZW50LWNoZWNrZXIuanNQSwECHgMKAAAAAAAAAAAAYVj+hngCAAB4AgAAJgAAAAAAAAAAAAAApIEOjAUAQGVuZG8vY29tbW9uLXYxLjIuOC9saXN0LWRpZmZlcmVuY2UuanNQSwECHgMKAAAAAAAAAAAAD5vAqF0DAABdAwAAKgAAAAAAAAAAAAAApIHKjgUAQGVuZG8vY29tbW9uLXYxLjIuOC9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAFaLCeM5AgAAOQIAACQAAAAAAAAAAAAAAKSBb5IFAEBlbmRvL2NvbW1vbi12MS4yLjgvbWFrZS1pdGVyYXRvci5qc1BLAQIeAwoAAAAAAAAAAACtVwZ+AgMAAAIDAAAhAAAAAAAAAAAAAACkgeqUBQBAZW5kby9jb21tb24tdjEuMi44L29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAAO59fjuEDAADhAwAAJgAAAAAAAAAAAAAApIErmAUAQGVuZG8vY29tbW9uLXYxLjIuOC9vYmplY3QtbWV0YS1tYXAuanNQSwECHgMKAAAAAAAAAAAAwgIay+EDAADhAwAAJAAAAAAAAAAAAAAApIFQnAUAQGVuZG8vY29tbW9uLXYxLjIuOC90aHJvdy1sYWJlbGVkLmpzUEsBAh4DCgAAAAAAAAAAAMUY5zqUAQAAlAEAACEAAAAAAAAAAAAAAKSBc6AFAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACSt0d+7A0AAOwNAAArAAAAAAAAAAAAAACkgUaiBQBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvc3JjL2Vudi1vcHRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAPxwaTHfBwAA3wcAABwAAAAAAAAAAAAAAKSBe7AFAEBlbmRvL2Vycm9ycy12MS4yLjgvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAfl1VK6UQAAClEAAAIwAAAAAAAAAAAAAApIGUuAUAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjgvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAABLrDk0oBAABKAQAAKQAAAAAAAAAAAAAApIF6yQUAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjgvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAECDjrKoMAACqDAAAJwAAAAAAAAAAAAAApIELywUAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjgvc3JjL2xvY2FsLmpzUEsBAh4DCgAAAAAAAAAAAAGOcEzpDAAA6QwAADUAAAAAAAAAAAAAAKSB+tcFAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi44L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzUEsBAh4DCgAAAAAAAAAAABlsu0UzAwAAMwMAACkAAAAAAAAAAAAAAKSBNuUFAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi44L3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAIaopsdfCQAAXwkAAC0AAAAAAAAAAAAAAKSBsOgFAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi44L3NyYy90cmFjay10dXJucy5qc1BLAQIeAwoAAAAAAAAAAAA/8Oc6VgIAAFYCAAAjAAAAAAAAAAAAAACkgVryBQBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuOC91dGlscy5qc1BLAQIeAwoAAAAAAAAAAACxWDaYUgIAAFICAAAZAAAAAAAAAAAAAACkgfH0BQBAZW5kby9leG8tdjEuNS43L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAD6B373XFAAA1xQAACIAAAAAAAAAAAAAAKSBevcFAEBlbmRvL2V4by12MS41Ljcvc3JjL2V4by1tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAzu5bBuYvAADmLwAAIQAAAAAAAAAAAAAApIGRDAYAQGVuZG8vZXhvLXYxLjUuNy9zcmMvZXhvLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAEaTPG42AgAANgIAACUAAAAAAAAAAAAAAKSBtjwGAEBlbmRvL2V4by12MS41Ljcvc3JjL2dldC1pbnRlcmZhY2UuanNQSwECHgMKAAAAAAAAAAAABLrDk0oBAABKAQAAHQAAAAAAAAAAAAAApIEvPwYAQGVuZG8vZXhvLXYxLjUuNy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAC0qYOFYCAABWAgAAHQAAAAAAAAAAAAAApIG0QAYAQGVuZG8vZmFyLXYxLjEuOS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAuIFp8HQHAAB0BwAAHQAAAAAAAAAAAAAApIFFQwYAQGVuZG8vbWFyc2hhbC12MS42LjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA12xbpVlDAABZQwAAKgAAAAAAAAAAAAAApIH0SgYAQGVuZG8vbWFyc2hhbC12MS42LjIvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAF+c8DJSIgAAUiIAACsAAAAAAAAAAAAAAKSBlY4GAEBlbmRvL21hcnNoYWwtdjEuNi4yL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAD0obqy4iAAAuIgAALQAAAAAAAAAAAAAApIEwsQYAQGVuZG8vbWFyc2hhbC12MS42LjIvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAEULMv0QIwAAECMAACoAAAAAAAAAAAAAAKSBqdMGAEBlbmRvL21hcnNoYWwtdjEuNi4yL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAABEEqbnXAYAAFwGAAAtAAAAAAAAAAAAAACkgQH3BgBAZW5kby9tYXJzaGFsLXYxLjYuMi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAKcNSTionAAAqJwAAIwAAAAAAAAAAAAAApIGo/QYAQGVuZG8vbWFyc2hhbC12MS42LjIvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAu+NNiZwnAACcJwAAJQAAAAAAAAAAAAAApIETJQcAQGVuZG8vbWFyc2hhbC12MS42LjIvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAAAEusOTSgEAAEoBAAAhAAAAAAAAAAAAAACkgfJMBwBAZW5kby9tYXJzaGFsLXYxLjYuMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAX+pOglkFAABZBQAAHgAAAAAAAAAAAAAApIF7TgcAQGVuZG8vbmF0LXY1LjAuMTMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKEpqrw/CgAAPwoAACAAAAAAAAAAAAAAAKSBEFQHAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJeovyVUBgAAVAYAACgAAAAAAAAAAAAAAKSBjV4HAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43L3NyYy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAAMs9KtSkIAAApCAAAKQAAAAAAAAAAAAAApIEnZQcAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAAcCLlelYKAABWCgAALgAAAAAAAAAAAAAApIGXbQcAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1BLAQIeAwoAAAAAAAAAAABDm4qoNBIAADQSAAAkAAAAAAAAAAAAAACkgTl4BwBAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAAQU/8T48FAACPBQAAKwAAAAAAAAAAAAAApIGvigcAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABkz+JvQREAAEERAAAnAAAAAAAAAAAAAACkgYeQBwBAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAAK9Ggv4AEAACABAAAKQAAAAAAAAAAAAAApIENogcAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAADSKSdxQVAAAUFQAAMAAAAAAAAAAAAAAApIHUpgcAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAABQMTX6wJAAAsCQAACoAAAAAAAAAAAAAAKSBNrwHAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43L3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAABShHt6phcAAKYXAAAoAAAAAAAAAAAAAACkgS7hBwBAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAMUYAMyGDAAAhgwAACsAAAAAAAAAAAAAAKSBGvkHAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43L3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAmJdfLLIHAACyBwAAJQAAAAAAAAAAAAAApIHpBQgAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL3N0cmluZy5qc1BLAQIeAwoAAAAAAAAAAABmP1mV/AkAAPwJAAAlAAAAAAAAAAAAAACkgd4NCABAZW5kby9wYXNzLXN0eWxlLXYxLjQuNy9zcmMvc3ltYm9sLmpzUEsBAh4DCgAAAAAAAAAAAGDVY54UBwAAFAcAACUAAAAAAAAAAAAAAKSBHRgIAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC43L3NyYy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAADr8JLf4IAAD+CAAAKQAAAAAAAAAAAAAApIF0HwgAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAABLrDk0oBAABKAQAAJAAAAAAAAAAAAAAApIG5KAgAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljcvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAMWHV+m3DgAAtw4AAB4AAAAAAAAAAAAAAKSBRSoIAEBlbmRvL3BhdHRlcm5zLXYxLjQuNy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABbpTkMOTIAADkyAAAqAAAAAAAAAAAAAACkgTg5CABAZW5kby9wYXR0ZXJucy12MS40Ljcvc3JjL2tleXMvY2hlY2tLZXkuanNQSwECHgMKAAAAAAAAAAAAhD+LBxMVAAATFQAALQAAAAAAAAAAAAAApIG5awgAQGVuZG8vcGF0dGVybnMtdjEuNC43L3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzUEsBAh4DCgAAAAAAAAAAAEybZhbHDQAAxw0AACkAAAAAAAAAAAAAAKSBF4EIAEBlbmRvL3BhdHRlcm5zLXYxLjQuNy9zcmMva2V5cy9jb3B5QmFnLmpzUEsBAh4DCgAAAAAAAAAAACmeZ2zOCwAAzgsAACkAAAAAAAAAAAAAAKSBJY8IAEBlbmRvL3BhdHRlcm5zLXYxLjQuNy9zcmMva2V5cy9jb3B5U2V0LmpzUEsBAh4DCgAAAAAAAAAAAE2RIifgEgAA4BIAADkAAAAAAAAAAAAAAKSBOpsIAEBlbmRvL3BhdHRlcm5zLXYxLjQuNy9zcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAABbOtXLUhYAAFIWAAA1AAAAAAAAAAAAAACkgXGuCABAZW5kby9wYXR0ZXJucy12MS40Ljcvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAAB9YIszixwAAIscAAA1AAAAAAAAAAAAAACkgRbFCABAZW5kby9wYXR0ZXJucy12MS40Ljcvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAACkQyco7RgAAO0YAAA2AAAAAAAAAAAAAACkgfThCABAZW5kby9wYXR0ZXJucy12MS40Ljcvc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanNQSwECHgMKAAAAAAAAAAAAHTgMlMitAADIrQAANQAAAAAAAAAAAAAApIE1+wgAQGVuZG8vcGF0dGVybnMtdjEuNC43L3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNQSwECHgMKAAAAAAAAAAAABLrDk0oBAABKAQAAIgAAAAAAAAAAAAAApIFQqQkAQGVuZG8vcGF0dGVybnMtdjEuNC43L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADSAaLEQgYAAEIGAAAhAAAAAAAAAAAAAACkgdqqCQBAZW5kby9wcm9taXNlLWtpdC12MS4xLjgvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAs11bRlUCAABVAgAAKgAAAAAAAAAAAAAApIFbsQkAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS44L3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAPpm8JGcBwAAnAcAACkAAAAAAAAAAAAAAKSB+LMJAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOC9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAJxtxLJ8BQAAfAUAADQAAAAAAAAAAAAAAKSB27sJAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOC9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAABLrDk0oBAABKAQAAJQAAAAAAAAAAAAAApIGpwQkAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS44L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADcaPdCkBEAAJARAAAcAAAAAAAAAAAAAACkgTbDCQBAZW5kby9zdHJlYW0tdjEuMi44L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGZXEQnDAQAAwwEAABwAAAAAAAAAAAAAAKSBANUJAGplc3NpZS5qcy12MC4zLjQvc3JjL21haW4uanNQSwECHgMKAAAAAAAAAAAAkGHPA3MBAABzAQAAHwAAAAAAAAAAAAAApIH91gkAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvRS5qc1BLAQIeAwoAAAAAAAAAAADg9bkfbwIAAG8CAAAsAAAAAAAAAAAAAACkga3YCQBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc1BLAQIeAwoAAAAAAAAAAAD/fh925gEAAOYBAAAiAAAAAAAAAAAAAACkgWbbCQBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWluLmpzUEsBAh4DCgAAAAAAAAAAADcX0E7MBwAAzAcAACQAAAAAAAAAAAAAAKSBjN0JAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAACKNuO+SQMAAEkDAAApAAAAAAAAAAAAAACkgZrlCQBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9hc3luYy10b29scy5qc1BLAQIeAwoAAAAAAAAAAAAGbyZCiAEAAIgBAAAiAAAAAAAAAAAAAACkgSrpCQBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9tYWluLmpzUEsFBgAAAACgAKAAATYAAPLqCQAAAA==","endoZipBase64Sha512":"cd43d64c84980477ff07a3dfb88ddf5dbb2b4045f105df72f66f1e3ea23b491780902e7b5b0cfbf3b8f1959b1e4f2fedf2ac55c8fbf4a40c2aa49ebbc1d7c325"};
|
|
1
|
+
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAADefA1oxAYBAMQGAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvd2FsbGV0LmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYmFzZS16b25lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaGVhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJoZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzJmYzk2YWUyZmUwODY2ZTY3ZDdhMjg2YjUyMzQzMTk1OGVkZGE2NmU2MDBiMmJjNGM0NWNmYzFkMmM2MjFmNjQ0MDNmYTAyYWI1NWFmNjc3MDg3ZjIyNjBkMmI0ZTZkNjVkMzY2Zjk4NzhhZGU1OTY3ZTllMDlhNWY2NjI4ZGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNWJlODJkYTk2ZDcxYzEwMzIxMTM4NmY4MjA0ZDQ3MjVhNTY2N2I1NDJhNWJmNDU4ZDJlYjA2NTYzZDU3NGEzNTIyZmEzMmFiYmQ5NjM0YWE0MjdjMWIyODBkM2VkYjZiOWQwNjkzNjdmYWI1ZTdiMzM5ZDE5ZTk5MGJhMDI4NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NWJhNzkxNTNkYjg4M2RlYTA4MDhhOTA2MzZkNzE2ZGYwMzRhNzA2YjdmODVkYWQzNzc3MzI4NTA5YWM2ZmRmOWU5NTRhY2Y5OTk5OTMwOTU3NGYxM2MzZjdhY2M5NjEwMzliOTQ0OWI4MzU4NDNkZDlkOTk0NTUzYWQ3NzAyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MWVhZjcxMjhjZTcxYzlkNTVmOTAxNDBhMTJkNjIxY2EzZTg1ZmM1NzUxZmNlMjRiZWZiYjQyNjkzMzZhM2RjM2MyNWUwOGYwYmM1NTljMGMzMjg4ZmE5ODYwODdhMzIxYzBhMTg0MmFhMDVhNzc1ZDIxMTBmNjg0NDdkNTdhYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzY0NTE3NDU0YmM0MWI5MDA3YzY0MmEyMDk5NWMwNmU2NzI3ZjkyMjk4YzMxZDhiNmVmNzQyM2I3NTUyOWNjZjI1NWJjZjM5YTgxZThhNDQ4ZTI0MzA0NTY0ZjM5OGQyOGI4ZmFjMDVhNzZhY2ZlY2Y1ZWNiNjBhNTA5MTg3OGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1vbmNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLW9uY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNmZlYTg3NDVmM2NkNjAzN2ZiNjE3NTVkMjE4M2EwYWY2ODk5Njc3NjQ0NjAxYTQ0YjdjNDNjMzY1NGEzZGQzNmY5NjRkYjUxYWY1MTJjNGI1Yzg1NjJmMTI4N2QzZjU5ZDRlYTZlYmZjMDM0ODIyMjZjYmU3YzczNjRjMThkNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93YXRjaC1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy93YXRjaC1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWM2NWJiNTVmZWQ4NGVlOWQ1NjgxMTA3Y2Q2MTcwYWUyYjdiYTI1YmNjMTVjYWY0YzViOTA5YjIxZmFmYzU4ZDI4ODRmNjFhZTI2ZDU5NzY2NjA4MDg5ZGU3ODM1MGZjN2UzMzRmNTYyYWIzY2Q0ZmE2YWE1MmVlZGRkZDdlNGQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvY2FjaGUtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2NhY2hlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvY2FjaGUtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvY2FjaGUtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NhY2hlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jYWNoZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY3YjlhZGE0ODhjOWQ5ZGQ1OTY1MDdjYTEwZTY4ODg4ZTEyNjNlNGMwNDFiZmM3ZDhhNDdhYTA5YTFhNWNhNGVkNWRlNTNlMDliMGJkOTdlYzEyNjY0YzMwMDA5Yzg1ZmExODEzZTQ0ZTRhYmIzZDMxZjc4MGU3ZWY0NzA0ZjY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNzI0ZGY3ZDFmZjY3Y2M5ZjE4OWNmMzIwNjYxM2I0ZTRkMmQ2ZTkwOThhOTYxOGNhZGEyOWU0ZTRiNDllNGYzYjY1MWZhMzMzODYwOGJkZjU3ZjRiYjM5OWZkMmQ0YWVhZThiZDk2NDJiZGQ0ZmE4YTg3MTg0OWRjNzg2MGZjZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdGF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZDJjODA4OTZkODk5NjFmMzA5MWZjYTIzOGNiMzNlNDcyZTU4ZjE0NTY0ZjI3MDk0ZGNiN2NjNDI3ZTE5NWVmZjE1NzJmMzllZjg1NTNjOGQ0YzA3N2JkYjZhNjJkZmE3ZGU1YWFjZGQ3OGNiMmNlZjQwZTAzZGE0NTg4ZTJmZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTI4YjZhNzlhYjVhMWMxZmJkZjI4ZmYzYzVhMDY2OTg5MTJhODllMTM2MGE4NWVlOGZjMjQ3YjkzOTBhZThjZWE2NzZkYTliYjBiOGE4NGJjYzMyNTJiZGQzOGU1MWViNjExMWNlODQ4NTIzNjQyNmFjMTVmMmM5MTEyMTQ4NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvZXJ0cCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kdXJhYmxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZGI0ZmI3YTI4MDBhYTc1YThjMWFiZjFjOWRiNmY5Y2JhODA4N2E2OTVhY2MxZTQxZDQ3ZWQ3NDdhZDIxYWIyNDgzOGJiNmIwYWExZTQ3MzUyNDJmZWQzOWYyMjUwOGRlNzdhNmEyMDI3NTkzZDgxZmEzNTViNGZlZGQ1ZTlmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZTBhYTgwOTEyZTQ1ZjQ5OGVhNzM2Y2ExNGJjZTg4NjJiMGQ0ZmJlMzBiODUzYWQ0ZDk3MzJjNmRiOWQ0ZjI4OTdmZTRmYjY2NDA1ZTM5ODA3MThlNmY0NWJhZThjMzU4MzBiZTZhNGY4MDg2ZjlmYmMxNzZkYzVlMWViOGZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZmFmN2I5MjEyOTU1ZTBjY2U1YThmNTE1YTc1YTViZWJkNjFiZjdmYTg1NTQ5NWVhMDRiYjIyNTUwMTgyNjU3YzA4MjBkMDcxZGUzZWQyOGE3NmZkZDBmNjk0OWRhMTlkNDBmOTJkZGQ4NGYwZGVjMmJmYWQzNTkwNDhkNzcwYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYWU0NjFlMDZhYTc5NDEwZWFhNzBlMTY1YzM1NDE2N2VkYWU3NTM0YmU5MjcwYWM0NTZmZDc5MjcwYmY3ZDhjYjIwNjE0MDEyYzUyODMzNTJjODI0MmRhMTdlYzVhYTc3ZmUwMmVkZDc3ZjlmOWIxNTkxOTUxOWRhY2ZkNDlhOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE1NWU1YTFmOTljMmQ0OGZiMjMzNzc3MGMzODg3MDk1ZjYzN2Q5ZGFjNjk5MWFkNGFmNzU3MDgxN2M2NjA0NzU3OTQ1YzhmODg1Mjg3ZmQ1ZmQzNjA0MDYwZWVlNjE4YjY5N2QxMjEyNDU3ZGE3MWQzMDllOGIyZmUzNDk5ZWY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWEzNmZjY2MzNWQ4NDE1ZmRlNjBjNTIyY2Q2YzJhMGM2ZmY5MDNmZTUwNGFmOGQ1YjRmMWI4MDM3ZDc3MmZhY2VlNjhhNzEwNzEzODAxMmE4YjAyYjA3OWQxMDgxYzY1NTI1NGNmMzAzNDM5NmFkN2JhMjI5YWU4MjdhMWIxYmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhOWMxNGVjZTJmOTk2MjQ5NWNmYTY4M2VlOWViZjQyODhlOGUwMTYyYjM1YmJkYjZlYzM3OTgzZjVlOTFmYThhYjBlMjIxZDI3NWZjOTFlYjdmMTI0Y2M3ZDA4MzdlN2NjODEzYjg3M2VjMWQxYzMwZTU2Yzk3ZTBmYWRmMjc2MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjNjNjNkMTM3NjJmMDQ5NGEwYzg3MzAxYmFjNmUxNDhhNmU3NzU2YTNhMjFjYzExYTdlZjhhNmI4YzhjMWEyZmEwODI4YjMzYjM3MWQzZjYwYzI5M2FkNzNkNTQ2Yjk5YzBjYTU4MWM1YTJiNTMxNDQxY2ZiZDg2ZDAzZTNmMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYzU3NDY5MTZiNGNkZmYxODM4ZTgxYzQ2YjNkMTk0Mzg5OGM5YjZmOGMyMzBiNmFhZGQ5MjllZWMyZTY0OTRkNWRiZTczOTllMWY1ZjZkMjFlY2VhMjI2YzY4MDI4NWQ0MmQ3OWVmMTBiODgxODYxZWE0YTk2ZWFhMzYzYjhjZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTc1NDM4MDM5MmQ2NjQ1YjdkMzY0ZWY1NTk1YmJhZTc5MmI2ODg0MzVhZTdkMzdmY2Y5MzkwZDg3Y2U4MTY1MGM3ZGZlYzYyNjhiNjI1OGQ2OWY0YzIwOGI4MTExOTc0ZTZjNWZiNzlmMWI5MzdmNmNjNGI5ZGNmNTgzNGVjZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU2ZTAyNjhhZTQ5YTZiNmQwYTIyYWFmMWNkYWIxYWY1NDYyMTU5Y2U5NmU5ZTNjZGIyNWUxMzNmMjM5YzU3ZjhjYjU0ODIyNDU0YjJmNGIxMWMxMTQzYjU2NzlkNTE4MzdlZjRiMjA0ZWExMzkzY2I4ODJkY2U2NzQwNTJjNzUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRmMGMyZmI3MTAwOGFkOGY1N2JlNWRiZGYwOWIyZTA4YzRhYjQ1MDM1NjFlNjAzOWVmYjdlYWRhNmVkNWZhZTc2NWI3YTUxYTUzNmQ3OTVkYzc4OTI5MGY0YzA0Y2Y1ODRkNDFmNWRlODQzNTcxYjM4NWY3YjI2NDYzZTI1MWI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgxOGU5YTQ1YjhmNWQ4NmQzNzlkZDBmMjlhMmJkZGIxNDQ3Y2UzMjg5ZTUxZWFhOTZmZjY1OWViMTQ4Y2U3OWM1MjE1YzY0OTgzM2MxOWRhMjkxZTNiMjcxYWE5ODBiYTY1MGY1ZTkwZWVhMzZiY2JmYmNiNjM1ZWE0N2ViNTRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYWU4NjgxY2VmNTg3YzY4ZmMwMGJlNjIyZjQ4ZjNjYWNlNzliZjA1ZjI1OTU1OTYwZGRjMjg4ZDBjZjcwMWI1MzlmMDMxZDRhNmI2ZTk5ZDVjODA5YjRjNzI5ZDY2NjY3Y2YyMjVjMjI3ZmM3M2NhMjI5NGU1NTE5N2U4MDdkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2hlYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NhbGxiYWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jYWxsYmFjay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVhY2Y4MTg5ZGFjMWQ4NjVlZmJjZTkzODZkMmRkOTk5ZTQxYjQyYzY4MzI4YjFhYzdiMDU2MDcxZGM0OTg3YjcwYmQwNzY0ZGQxMDUwOTEwOGFmYWNhNWQ1NDFiMTJiODliMDBjNjMzNGI4NGQxYzZjOTEwOGNhYjY4ZjVjODJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NsaS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2xpLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTJmMzY5NjMzODhiNzRiNThiYjlmZDdhODFlMDJiN2Y2OWRmZDNmYzA0MzNiYzk4OWQ0Y2RlYTE2ZDcxOGE2NGM4Y2ZkNzMxMDVlMTg1OTIyMjhiYzIxMmRmYmI1ZWIxMjBjYmZhOTI4ZTFkNWE5Mzc5MzMyMWMzZmI0ZDgzZDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uZmlnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25maWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYmFkOTg4YmQ2NzJjZGRkYjc3MDJmNWU0NjkyMjM5MGUzMTI5ZjYxYmI5NmJlMWUzM2ZkMDllMzc1YjkzMmZjNTA2MTY2Y2M1NzUzOWJhYWZiOGE0YjJiYjk1MTFhZmI5YWVhZDM0YWRiMjQ1NmRiMzU3MmJmYTE3Yzk5N2U2MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVidWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYzdmOWQ4MDcwYjNiYjNmODFlYjhlNTRiM2Y4ZTAyNjI3NTI5YzJjOWUxNDg5ZmEyNDdkYmViYjU0NWVhOTkyNmJhZWIwODIzMGM0MTg3YjQxZmQzOGY5NWMyZjQ2YzZmZTJhMDQ0ZGQzNmEyOGI3ZTQ2ZGRlZTRhOTA2YmUwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQyNThjNGQ3ZWJmZjMxMTgyZjg0MjVlMGVkNWU4OWEzYWZlNzQ1MDNhOWYzNjk1ODliMmEwNTYzYjdkZjc1MzNjYTg0MTg5OGE1Mjc2ODIyOWViMDU1MDdlMWYxOTU4NWU2MWZmNTk1YzVjMTAzMTIzNjU3MjEwZTU1ZWQ3ZjI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc2ZDhlMmYwZDgxY2EwOTcyMzZhOTU5YmNhNDM4NmUyZmFjYjYxZWIzM2UwYTRkYjRkMGE5ZTJmOGI5YzBkN2Y3ZGY4MTI5YzgyZTM0MzA4ZjFjMjEyNzIyMjYwMjg1NTQ5NjdjMmQ4ZDRjNzU1Y2FjMjQyMTI2MzYxN2U2OTNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2pzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ2ZmNlMWZjZTg5YzAwODZmMmJjZGY0NjFmMmI4YjM0MTAyMmEzN2E0NzhhZWJlNGQyOTVkNmM1Y2VkYjk0ZGExMDQ2NDMzMmIxNTQyMmViZjJjZGFmZjNlYzRhZTA5MGI0ZDdjZGY3OTNiYzE2OWJiZTg2ZmI5ZjgyZTE1OTM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNTE3NWFjODU5ZjcyNzkyZTViNGE4NTQ4MGMyYmE1OGI4Yzg5NDk4ZTE4MjVmYzc0YTkxNmVjOGEyYWI0ZmRjMTlkNmFlMWFjMTQ0Mzk1ZDgzOTk0NWM5YjMzNTVmYzM1NTU2MjBjMDFjMmNiNmZjY2Y2YmU4YzZlMTMyZGFjYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsL2JvYXJkLWNsaWVudC11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC9ib2FyZC1jbGllbnQtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZWM5ZWQ2ODE5MzQxMGNkNzFjNGQ3NDExZjNkY2Q0OGJkMzVkNjgwNDY4YjZhY2QyNzAxOGJjYmZkNjMzMmY2MTNiZTJkYzE5YTUxNDdkYmVjZjJlNzQ5OGY2ZTA1MWZlMGVlN2I5ZmUyZTJkZWUxYTE0YTdhY2Q2ZDk5NmYxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsL2NhcC1kYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsL2NhcC1kYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzk4MjU5NmM2N2VlNDMxZDE0NDU0Y2ZjMzZlYzQ3OTE5MDJkYmI5ODI3NDIyMWYyZDI4NDg0ZjE3MWRjNzc2N2M4ZDBkOGMzY2I3MWQ2ZmZiZGJmODM4MjJkOGI0YTlhNWQ0NGNkNGY0MDFkZGJkNjQ2ZjI5YmExNzliZGMwOTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC9pbmFjY2Vzc2libGUtdmFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOWQzZjA5MGJjMGMyNzkyOTM5NTg0MTM1NTM2MmIxNDk1NGMyMTZkZTMwYzk2NDU0OTIzNjYyMTY3ZTEzZDBmY2RjYjg2MmZiMzY1ZGUwYzIyMmViMGRjNTRmOWVhZDI1OWI5MDMzMjQ4YzAxYWE4MzBjYmRhZGJhM2ViYzQ1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsL3B1cmUtZGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC9wdXJlLWRhdGEuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MmQ4M2FmMzFlODAwNTg3NWMzYTdkZmVhNjcyMDUzNjM4ZDViMjkwNDkzYTdkZTUyODI2MzQ0YTllMGIwMGE2M2EzODI5YzRjNGE2ZWMxNjRiMTZkN2VhZGY3NzQyZTU0M2RkZjA5OGRlYzQ3MzUyMzM0YTc4YzJlODc4ZjllYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRob2QtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldGhvZC10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1NWE3OWZkMjQ2NjE0NWFlNjhlY2JjNzc2OTQzNzlkOGMwNTJmMmM3ZjQ0MmNhY2E5MDg3NDkyMTFkOTdlOTU2NGE4ZGRlYTZmNDJmODI1M2QzMjYwZGZiNzk3MDllYTI5N2JjODcxNGFhODYyZTY5ZTFhMzhmMjRjYmRiNWMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldHJpY3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldHJpY3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Y2RkNzZkZjIyZjY3ZWFjYjQzNzYzMTk3ODhhMjk3YjFmMTM3NDYwYjQwNDc0Yjk1ZTQyNzA4YmUwMmEwNzViOTQ2ZDBkNGVmNTg1OThjZjQ0NTFhYzA2MDJkZTcyOWIwMmZjZDM2OTY1ZGIwMzgzYzgxMDE3MjJmN2RmYjNiMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uYXR1cmFsLXNvcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25hdHVyYWwtc29ydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFhODgzY2E1MGE4ODEwMjdlZjgyNzZjMjAzNmI0NjA3YmU5YTdmMGRjN2JhMTEzNTE5MmJjZmM5Yzg3NmVjYWU1MzAzOGU1ZmY0MzRhZGI0MjBkMzQ3MzEyNzExODE3OTE0NmE5OGU0MzJhMjM4OTE5NWY5ZDMzMTFlYjE3MmJhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Nlcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2VzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzJlOWRkMWUyYWNlYzNiODZhNDhlYWM5NGVkMWU3ZTEzMjliMzdkMTRkNmI1MTUxMTQyZjA2Mzg2NmVlNDQ3NjkxMDFhY2VhOWU5NmUzY2RhNDM3ZTYxMDJjZmJhYTNhNmIxNTUyNGQ0NjU2ODczNDNhNGVhZWMyNGZhNGMxMTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yYWdlLXRlc3QtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZTEwNTVjNmYzMTA4ZDkzOGUwNzQxOWM0YWIzZDM4YTY2ZDYyZDI4ZWI5Y2U5ZjBhMjY0M2Q5NzhjNzRhOTYxMmIxZmY0ZWRhZTc0NmNiNjVhMjM4OTQzYzc3ZGQ3NWExOGEwNmEyODczNzAyMDIyNGY1NjAzZjZmMzkzNzc3MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90ZXN0aW5nLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTgzMWFmMjIyY2IwMjNkN2RkZmNiMmRiY2VlZThiOGY0N2Y3Zjc5ODhhZTIzNTFhZmVhNTdjZGU4MjI2NWRiZWI1MWI4M2JmM2I1MzY2ZmRhYzU3OGNhYmY0OGI0N2E5NmNhN2U4ZWQ1NmEyMzdhNTE1OGE3Nzk2ZGZlMTk0NTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG1wRGlyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90bXBEaXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NmFhYmFmMDAwNWQ4N2MzNDM2MzliMWJkY2U5ZjQ0YjYzOTM0Y2M1MWM5MGM1OGIxYTBkNTc3NzIzYjZlMmNjMWFlNmUyY2VkZWIxNDJjNzNlMWI3NzI1MWI2Nzk1Y2QzNjJmZTU0NzA1MjQ1ZWE0ZmRiNjJmOTQ4YzczOTczZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlQ2hlY2suanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVDaGVjay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmMDZhMzFjZmQ1ZWQ1YmZlN2E4YTA3ZjgwZmFhMWFiYzdlZWVmODZlZmI3OWY4Yjc2OTgzYTQ0YzRkYTc1YTliNjNkZWMzZTdlZWUzZDFjZDNlYjg1MjZkOTQ3NTg4YWNhOTkxMjI4NTRkMzMwOGI0N2QzNDQ2MjA4ODQ3YzkzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYzJmYWU4MGM4MDIxNWNhMTZjYzhlNzVmZDhmZjFhN2NiOWJhYWUxNjBkODNlOTMyMjQ0MGM5YjA5MGIzZjk4ZWZjZjhkODM4YzBiYzdmOTQ3NDFjODJhYzBiNGU2ODAxM2EyMmRkMGRjYWUwNTM1ODY4MWFkNzg5YTYzNGRlZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdXBncmFkZS1hcGkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkY2IwOTgxM2I1ZDEzNTQ0YTI0MTI1MTY5ZmE5OGMwMzZhNTNmMDNhYzEwZjRiMDIzZWYyNDkzODIzNDk4MTQwMWE4YzEyYWExYTgzNmI0MGZjYzdjOWFiOGUxMTBhNjIwZTliMWVlOWE0MDkyMWQ3ZTk3NDM5ODQ2YTk2MDZjNyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvbm90aWZpZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy90ZXN0aW5nLXV0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdXBncmFkZS1hcGkuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NzIwZGYzNTVlZWY1ZmFiZTJkMTJhZWQwODljMTA0NTkwMTkwMGJmYWEzYTA2YzExMWNhYzdlOGYzMTMzYjBmYjEwNTA1MmZmM2VkZTg1MTQ1M2Y3MTIwMmE1OWMxY2I5MTRlMWYxMjQ4NmFmNmM4YTViNWMzODk5ZDEzMmQ2ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MjdkZWRhNDFmNGVmZmQ0MWQyYzljZWJiN2VmOTE0NzE2ZTgwMzkyNTBhM2ZjNjRlMzJhZmRhNjVmY2QyZWIxNTNiYzJlZjg3NDY1Zjg5MGQzMWE5Zjk0MGMwZDQwMDdkZDg4NTY4NmQ1ZmMyNWJjMGNjZTcxZDFlMmY3MGVkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmM2FkOGQ4OWZlODI2YzRjMTc0OTM3OTg0MTNmNWUxZmY3YTE1ODQ4YjM2YjFkMDVkMTVjOTRkZTQyZWZkOTM5YjBkNDMyODI2NTc4OTA2M2RmZjg5NTJmODRlMDRkZmIyYjM4YWEyZGY0MmM2M2YwNzQ4NjQ5YjNjMmFmODUzYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdWJsaXNoLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVibGlzaC1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiM2VhNWQ1ZTI3MTNjNGE1MTNiZDA0YjUxYzdmN2RjNTQ4OTAzNDE4ZmExMzNjYTFkZDllNWU1Y2Q3ZjY2MzYwMTQ3MWFhNjE2NDhlZjk0NjA2ZjVkYzJiMjNlMmU4NTM5ZTVmOWIyZjk4ZWIxYTFlOGY5ZTFiYzRhYzA4OTRmYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZWQtbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3JlZC1ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc2YzA3MjNiYzMwZTM3YjQ3ZWZjOWY1ZDc5MmVlNDQ5ODZkNDNiMDE5ZDNkZDU1MGU5ZTZjYzc4NDBiN2Q2ODg3NWY4YTBlZjgwMzc0ZDQyYjQ5ZTZlZjE2MjZhMzI5ZWQ1YTY0MjJjOGMwOTczNjk2MDcyYzA5ODAyMTI0MzE2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlc3ViLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXN1Yi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE2MWI4NDM1ZTljODUzN2Q5M2RkYWFmM2FiYmIyMGQ3ZWMxOWE4NTk3MWQ0NTM5MTI3YmZmYzcyMjM4MmIxMzViN2NjZWY4YmE5NzE3OWY3NTkwZWM0NGM2NzgzYzQyNDliNWYzNGJmZGI5NWM1YjkwZjY0OTVkOTVkODQyZWNiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3Vic2NyaWJlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzEzMWY3OTg0ODZkMWEzYTZkM2ZmZGZkNTUzMDg2NzY4NDI3ZjllMzhiODU5MDg4YjkxYWQzNjIyYTk0ZjJlY2I1NzQ2MTk2MDY2NzZiMzdhNjYxYjc4MDUyNjE3OTk0Zjg0MWY4NzFlN2NkYmUxNjQxZTg1ZmU0YjFlN2M4YmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3Vic2NyaWJlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMTA3ODFmNTY4NTk4YzIyZjc5M2ViZThhMzQwYzBjY2I4OWM0ZWRiMjljYWJjNjMzMzUzOTJhZDgzZmYxYTY4Y2E3MGFiZjE5OGM5MTc3NDRlNzg3OGVhZmFhOWE5MmY4NGYyYjgxMmVhM2Y5OGI4NmI2ODM2Y2FlY2U4OTM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RvcGljLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90b3BpYy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNiMmIzNGUwNTNmMThjMDkzMzIxZWMzNGIxZjc0Y2JmMzM3MGVmOTQxOTkwNzg5MWM4ZThmYWVkMmQ0ZWRhYjUwMzJlZTI5ZGIzZWMwMzk1YWVjZDdjYzM2M2ZjNzJmM2U2Yzc5MzcwNjUwN2QxY2YzZDA0OTJmYWU1YzI4ZWRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRvb2xzL3Rlc3RTdXBwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIyZGY1MzE1YWU5YzJmZWQ0MmU3ZTA5NjE3ZjhmOTk0OTdmMGQxMmJkNDdhMGY1MjIwMjVhMGRjNzIxY2FhNzljNmU4MTEyNTkyOWE1YmViYWI5NTFlN2FkMDIxNDNkODEyYzliZGE1ZWZiYTQ4NDRkNDdjYTNjODMzZTYxMzRkIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjMiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc21hcnQtd2FsbGV0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cy9zcmMvbGliLWJvYXJkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0cy12MC4xNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbGliLWJvYXJkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1jb250ZXh0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1jb250ZXh0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYwY2ExYjI0ZGZjNzdlYmM0YzRlOThiOTk3MGUyMDRjMTdkMmY5MzliNTliNWY0Njc5YTZkMWQxOWMyYTZmMzJiMjYyNWU5YmYwNDM5ZDA4ODA4YjRhMDYwMjJhMjllNWI0ZDFlODIxY2IxN2JhNTZhYjVmMjU1YzY0Y2FiYTc3IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N0b3JlLXYwLjkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zdG9yZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYjkyMzk2NDg3NWNkZTk3YzI2YmNkMTgzZTgwM2JlMDFlYWQ3Mjg2NWI1YjI1ODE3MDM3YmFmZWZkYmNhZGQ2ZjBlNjRhNjA1NDVkZWJhZTJjNTM4ZDBiZWRjN2NjYWVkNjlkZTNlYTIyNTkzNDM4ZjA1ZTZiYTgwNDk5NzNiZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDBhY2E2ZWVkYTJiNmQzN2FmMzQ4ODY3NTU3NWYxZjJmZDU2NDk4ZmZiMzVkYjlkY2RkODQ5YTdhNzMwNGE1YzE3ZmE2MTI4NzJkZDg2NzRmMmM5YWVjODRiZGFhYTRmODE5NjBjYWNlMDE5YWNmMjM0NjJhMTFlMWUxZjRlNTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODQ5YjE2OGVmMDRmOGQ5YjgzNDJjMDMzYTdiNmU5ZDBkODUwNDU0YTgyYWVjNzE5YTU5NTRlYjgwN2Y2ZWYxYjgwMDQ0OWIwYmY3MzcxZjQ5Nzk5NGE5NzUzNTNlZTE4MzIwMGUxYjkyZTYxZTRkNDU0NmJmZjQzM2RjZTk4NmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMzk3NmM4NzQ2MzMwODA2M2JhNTk2NjAyMDgxNjZiYzM0YmM5YzZlNmNjYTQ4MmZlNDliYmJlZWVkODUwOGQyNGZiN2YxMzgzNGYyMWQ1MGExYTUwZDFhMGU3MjI5YjhiYjQ4MTBhZDJmMTZmZmQwNTc2MDE1ZWNmODVjZWM3OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFmZDE3NmM3OGVkMGE5ZmNlMDY4ZWU5Yjc3NjNjYWM3NzIyYjFkN2JmN2U5ZmQwZWEyM2QyNWRhZDJmMzE0ZDJlNjYwOGViZGI2NTU5NjZlNzlkMmI2YzgzMTRhZTJiODA0NTY2ZmE2MGI3ZjAwMzM1OWI0NmZjZTUyNTUwZmY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4M2FlZTE1M2NiZjFlNzY4NjhkNDM3Yjg4ZDVlNzBiNjhiM2I4ZTM4MDcxMTRjMDI1OTU4OWRhOTVmYTU0YjMyNzJlYjUxMmVhMjA2OWMwNTkyZTBhMjE1Y2Q4MjQ5M2ZjYmEyZDM5MmE5OTNjYTI5NjQxODkyM2Q3ZDlkYmYxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDhkYzBhZDk4MzY5ODhiYTAyNGQ5YjI1MDlkMTgyODM4MWM0ZTllYzVmYzY2MDAzYWFmYjMxNjY4OTEzYmYzMjVmMjIyYmVjZTU3YjIzZDYzNzcwZGYyZDYwYzVmNmI1YTdlOWJkMWI0NTkwYzA4YmVhOGRiNTAyMjQ1MTFkZGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZWQyMmE0NjgwZWVhYzZkZjc0YTI2Yzg5ZWI5NWU5ZTVjMzI1NWFlYzRhMWE2ZTIzZmY3ZmEzYjY0MTA0OWFkMDRmMTMyZDRlZmJhNDRmOTU2YWU4MDc5M2ZlMzc4NDQwMWVmY2FkNTFmYzkzMjc1OTg2MjVkODUxN2RlOTE0NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MDYyZThjMDQ4Yzg5YTRiMGMwNThmMmYwZTQ1ZDA5ZmQwNjRhOWQ0OTllYjI4ZTM4NTk0NTdlMGYwNmJmMTA3NDc4OTkwZDIxMjZiOGEyZTk4Y2IwNzIxODliNmRkYTc4MzUzNDVhM2I0M2RhYjI1Mzg4MjM5ZWMwYTBiOWE4ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNzJmZTNhNjgzODgzZTg1Y2M0ZGQzYjg2YThiNWZjMWYyYmExZjY3N2ViODAzMzE5OTBmZDU0NTA1NmY4ZjFhMzFiZDRlNjkzNThlYmExM2NlOTBkMWEyYzVjYzFjMzJmZjk1OTBkMjkwZjRjZDg3NDU5OGU4N2QwMjc5NzM5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOGZjNWU2YTdjNzUzOTRlMDE2NWIwZmYzMWQ1ZTUzNmM0MDUwMWMyMzZlNWRlMjM2MmVhZmIwMTQ2NjRiZDM0OGVmNTkwZWMyOGFjNDU0MzBjMTI4MjY1OTYxYjBmMGZmZDY1Mzk3YmEwMDlkMjA5NjI4NzIxYTYzMDhhYWZjNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXRzLXYwLjE1LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0cyIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdHMtdjAuMTUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdHMtdjAuMTUuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jcmMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NyYy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAyZTgyNTQyMzBmZDUxYWNjYTNhNmViYzMwZDY3NDgxODA3Mjc1MjM1ZjZjZTkzOWExZThkMzIyYzc2MDVmMjM3NzZlNjJlOGY0MmFiZjhmMTgxMWE4N2Q3NDA2ZTU1NjRmZDY4YTE2ZmM1NDM2NWNiYTA5ZjRmYjgzYjgzZWI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1ib2FyZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWJvYXJkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWJmNmU1NjhhMmU2ZDE1YTljZDk1NDY0NzM3NjNiOGI3MTViMTI3YjUyZDg0NzQ4OGJhMDgwMTFjNjkzMDdjM2Y1Y2M5MGRmNjc3NmNlOWQ0YzMxODVkNzBmMmY2ZDc0YTdkZDk5M2JkYjZlMWJkOTRiZGNiOTQyZTJjM2Y1MTAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy93YWxsZXQtYmFja2VuZCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvY2FjaGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9jYWNoZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9qcy11dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2pzLXV0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3N0b3JhZ2UtdGVzdC11dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3N0b3JhZ2UtdGVzdC11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zbWFydC13YWxsZXQvc3JjL21hcnNoYWwtY29udGV4dHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFyc2hhbC1jb250ZXh0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hY3Rpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hY3Rpb25zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWZhYzlhOWVjZWZjZWQ4ZWEyN2Q4ZDI2NmVkNDc4YWI4MjIzMjcwMWJhMWIzZjNhMTM3MjA4YTZkYTA2YmYzNTk4YzJhYjA2ODkyMmNkY2IwN2EyMDU0OWJjMjZhMzMwMzYxMTQ5ODE5NTU0MWIwOGUzM2JiYWM2OWE3NzIxZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYmlnaW50U3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9iaWdpbnRTdHJpbmdpZnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YTcyODA5OGM3NTdkOWRjZjFiOGJlOTAzNjY5YmFmZTM3MmVjOTYxZWZkMTQ5M2NiMzY1MzFiZmZjZTEwNzBjZDNiOGUzNDM4YjFmN2U5YjVmYzdhNjUyMWEwY2I5YjQ0ZTllMWE4MjFmYmY5Y2MxNDQ5YmYzY2RjZGM2ODU5OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kYXRlLW5vdy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGF0ZS1ub3cuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YjdjZDhkMjBkZGI0NjJiN2M3YmIwZWZlNWI0YmQ0NTg0YWJjYjRiZmI1NDc1ZWZiNDI4ODZlMGI0MDE0NWUxYTM5NGZlOTNiYzkxNDY5ZWZmYTk0NDcxNDU5ZjU0MmYyZTVjOGY0NzRhYTJkNGM3YzFkZDg4NTEyMzAwNWVhZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9maW5kT3JNYWtlSW52aXRhdGlvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZmluZE9yTWFrZUludml0YXRpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTBmNWY5YWVlOGRlMTE3ZmMyYTM2Y2M4M2ViODI1OGIzYTBkMGI3ODBlZjI1MGViOTFlNTU4YWVmMDQ3MzM0MzJmNWEyMGU3MGJjNmY0NjRhOTMwYTBkMTE5Y2EyYWVhNTY0ZTM3OWFlZGYyN2EyZDY3ZGQ5YzQzNTdkYzE3MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbnRlcm5hbC10eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW50ZXJuYWwtdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMmYwNDU2OTBmZTg4ZTgzMzg4MzZjNzIwZmIyMDk4YzI1MzRhODRlOTgzZjI3OWU4NzlmN2MzNWJiZGI3NzkxYzU3NjQ2YWFiYzY0YWVkMDNhMjQwZmEyYzE0MGQzMzZhN2I4OGY1OTlhMDFlZWM5NDljZjUyNzJhYzBmMjA0MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJUYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyVGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MzJjYjU1NWMwOTI5Yzg3MzZkMjkzOGZiZDAyY2ExZTg2ZTQ4MWM2OGVhMDJkM2ZhMTRmMTJhYjIyN2M1MzFkZmQ4NWM4NWM4MzNjYmE2NjU5NmM5Zjc4MTRiZTQxN2I2YWM4ZjQyMDUxYWUzMjdjNjIxYzBhMmQ1NmUxODk4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saWItZGVoeWRyYXRlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItZGVoeWRyYXRlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2RhZGFhODk5MWE1MWI4M2E1NTg3YjQ5NGZiZjdmNjViNTc3NWNkOWJkYjhjOTI3NTY4ZTg0OTFiMGE4MDg0ZTQ5ZmIxYjFkMWJlMjFhODI1ZDE4NmU4ZTYzNmE5MmNhOTM2YzU5ZTkzMjQ0ODZkOWI4M2EwM2Q4YzMyMGY4MjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLXdhbGxldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLXdhbGxldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU2NDI5ODY2MjBhOGM1OTM0NzYzZDhiMWY3NDU3ZTdhNjYwMWNjYWQ2Y2JiM2YzZGE0NjkyYTk0YTg4YWQwMmY3YTlhYjFjZWY0MDcyMzgxZjJjN2E1NjNlNTI3NjNjMmMwYTUxOWVlMGU0N2MxNzMzYmVjNDhkMTI5ZTA3MWI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1YnN1Yi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVic3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzkxZWM3MDY4MmZiOGRmMGNjNDc2ZTIxNWYzZWMzODg3MDQ1MTEzYjJlMTI3MTI5MmQwOTI3NGYxMTMyZjk2NWJhOTdlZTRlZDJjZjQwNjhmMjRlZTNiNjBjNmFiMWRkYWJjM2FmNDQ5YjM0ZGVhMjdmMmYxNDAwMGIwNDZlODAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd2FsbGV0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy93YWxsZXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNGIyMjg2MjBjZDQ4ZDlkZjg4NmRmNTZmZTNiNzg0MzdiZWExZGUzOTgwOTE4MjE3MjZkZmE3Yjk0NzczMGExNzI4ODBiYzM4YjE4OTQyMTliMGEyOTdkY2QxNWZhZmZjZGM4ODEyNDgxNzUyODY2ODczNDhiMDM5YjA4ZGFlOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b2UtdjAuMjYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYjc0MDg4NGIyOGI4ZGUxYThmODM2OTZhMjY4OWYyNzAxYjI3MDkzZGM4N2ZkOTJlMTEwNmYxOTJkYzU1OTFlZmFhMDQyN2ViYmQ5MDFiOTUxYTgxMjhhMjY4NjI4ZTYxZWYyMWMyNjY3YzJjZmVkMjM0ZGE4MzAxODk1NTRhMyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b25lLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b25lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIyMDhkZWY4ZGYxY2JlMTQxODY2OWRlZGY4MGJkZjU5NTM1OGY1MzY2ZDExODhhYzA0ZmU0YTJjYjljNTNjYTg4NGQ4NTIxNWM5MGYxYjg3Zjk0OWJiMDQ4YTc5NmVlNWI2ZmRhMTNkNTFhMjU5ZTI1NzQ0NjQ4MTlkNjIyY2QzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2R1cmFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTU1ZGFlOTI5MWU5NzVjOTZjYjllOWJlMTFlNjc1YjQ2N2IyYzQyMGU2Y2JiNzg4MWM1Njc3YTBiM2ZiYzBhOTJiZDc2NmI2MmNiYTE3NDQxNzAwNDIwNjE4YTBjOWFkN2EyYjVhMTI1ZTQ0ZWU0MzZhYzllYjAzNWY4MWFkZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tbW9uLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbW1vbiIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXBwbHktbGFiZWxpbmctZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNTMxMWQ0MjI3OWMzOTAzZDYyNWYxM2VhNmIzZmU3OTdiYjFlYTAyYjk1ZTA2MzczYTkzZWMzOGM4MzkyYTg2YmRhNTEyYzg0MWI4YjRiZTQwZWFiNWY1M2JhNTY2ZjE4MjAzNWUwZTgxZDM2M2RiNjY0YWEwN2VjYzJlNjU3YyIKICAgICAgICB9LAogICAgICAgICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZnJvbS11bmlxdWUtZW50cmllcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA4ZjQwMjY2MTg4ZWViOGE0ZmRhZDEwN2MwNjI0NTdlODE0YWRhZDlkY2YxYTZjNzcxZmM5ZDM0NDNlODgzZTQzMjg3ZTQyZDRkOTFmZWMxYzQ0MjdjM2JlNWRjMzU5NmRhMzMwYzJjMDJlNDQ0ZmNlYjg1MjM4MzBjODM0MDBkIgogICAgICAgIH0sCiAgICAgICAgIi4vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpZGVudC1jaGVja2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTk3ZjE4OTMwNWZmMGU0ODc2ZmU1ZjRhOGRjZjg0ZTM4MzU2YjhhMzk1ZTllYWNkNzNiODk1N2NiMTkxMjE0NWI4NTc3OGFjYjcwNWYxMDAwYTI4MjhjZmFiNzcwNWY5NWNmNGQxOGQ0OGI2MGVlODQxMTE3MDNiNmNhMzdhOWIiCiAgICAgICAgfSwKICAgICAgICAiLi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibGlzdC1kaWZmZXJlbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjY2NjZhNDY5M2YwY2NkNjM2ZGMzN2UyMjViMjQ5MmJiYzk4MDQzZGUyMGYwNTczYzRjMjAyZWZiYzMyOWI4MmQ4MTM3NmNjNzJkYTc4NjZkZjA5YmE4OTMxOTU1NmFhMGFjOWFlNDEzZGVmNjAzYTE0YzkwZDQ5Yzg2MWI1Y2IiCiAgICAgICAgfSwKICAgICAgICAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm1ha2UtYXJyYXktaXRlcmF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YzUzNDhhYmVkMDJjOWQ1ZGMxOTQyY2FiODg4Mzg5MjQwMjU3ZTQxYWQ3MWM4N2YzOTQ2YjUxY2Q1MjExY2Y4OTk5NDM0MTJiNjk3NDk1NzRhNDFkNWE1OGEwMDdhZjBhNDQ3ZTM1MTUzOTlkZWNhYTYzMjQxOTk2NTUyMzY5MiIKICAgICAgICB9LAogICAgICAgICIuL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibWFrZS1pdGVyYXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZiMmM0ODY1YmFmNjFkZGE4ODczZGRkZjMxNDRjYjQ1NTNmMWJmN2U1NzNlM2RlODYyYmFlZTRhYTA1ZDljODgzNjM5OTQ2M2QxNjZiZjdjZDhjZDgyNGY2YWZjNWJiZDhhYWY4ZDJhZjQ4YzQwM2NhYmQ5MmNmYjliODRjYWZiIgogICAgICAgIH0sCiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2IzZWYxYjBiOTRiNzBkNTUyYTQzYmJkYTFhYzQ2ZmJhYWQ1NjhlZTAyNDgxM2U4ZTVkODIwMjVjMTE2ZDRhMTc5MzM3MTNjYjM0MDI3NTg1OWZiM2JlM2Y1YTM5NzRhZTY1NmVmMWJlYjAxYWEwZWZhMDVlODBiZTVjMDhkMDYiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAib2JqZWN0LW1ldGEtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTk4MWM4YzYzMDU4YzI3YzBjYTEyNzA0YjRmNWVkYmMzODQ5NGM1OTU3OGZhZGJlN2IwZmNhMzBiZmQ2OTNlOTQwMGU4ZDM3YzgwYjFkMTNkY2Y0MWJkNTNmMjI0M2Y0ZDNkZmVhYzY2ZjZjNGRmOGQ2YmEwMWY1OThlOWNiOTIiCiAgICAgICAgfSwKICAgICAgICAiLi90aHJvdy1sYWJlbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRocm93LWxhYmVsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZTZhOGFkZGVmNWI3YjM1MTZiYTU5YzJlYmMzODBlYjBjMGRmYjRkMDc0NTM5MzllNWE0ZWMzYzc4YzVhOGU4ZTNhNjNjMjI4YWM0OWQxNGNiOTk1OTZhMTRlNThkMTdiZmJjYjlkMmZlNjY1YzhkMjg5Njc0ZDU4NTRlYzk1OCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZW52LW9wdGlvbnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMGZiNTNmMmVmZTcxM2M3MjU1MjIyMTlkMzA4MzcwZjcwNzVhMTBjYzlmYmVhZjE3OTI0M2U3MDNmNjExNGQ2YzE0YjNkZmMzNDE3YWRkODgyMzJiODBjMGVkNWE4YmJiNGI2OGZlNzUzZGUwZTQzNjhiMTVhZmI0YjNkNjBiNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhYzkyYmMwYjkyMDc3ZmNhMDU3ZDA2MmNkNGY1OWJiODliZWI5MzBlODM1OTg2MzQ2YjYxYmUwMTA4MjI4MGUyODRmNWIxNDU2YmE4OGQwOTZmMjg2YjEwMWRhZDhhMmJkM2IyOGQ3MTlkNzdiOWIyZmQ2Y2ZkZmU1ZmQ5NjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTRhN2EwNTgxOTg5N2EzYThkOTlkOWI3YjFiZjA2ZjE2YTczZDgyMDU5MzJlMmNlY2JkZjI0NzMwOTRjZjk5NjdhOGIxYjdmMDI5MmM3MjY5ZjM1NTU2MGI2MTYxZTI0YTg0YzJkYWFlMDdkYzhhYmM2NTZiMjllZmU3MTJhOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbG9jYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xvY2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjBlZmU5MjhlZTUwMzllN2Q0MDk1OTRjZTA5ODIxYmZmNWVkNTFhYmUwYzI0ZWE5NTgwZjk2NDg3NjU3NTRhM2Q0NmRkNTk1NzhiZTZkMzQzNmFlM2QxNWM4MzJhNjM1MjQzOGRlNzFhM2VjODE5ODNiNjM3YTQwZTM4MmMwMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZjI1Y2ZlYTFjNDM3YjMzYTEzNDI3MzJjYzg2YzE4ZjAzNjBhOWFkZjk2OWI1YmM0YzE4MmZiN2YzOTc0OWY5OTRjNTUxMzllOWU1NjU1YmViYTk3YjU0MmRjMzUzMzc1MWRhMDU4NjllMjFlYTFlMWQwN2E4MTAwNzFlYmE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYzNhZDcwMGQwNjU0ZTZhNGZmMjc3YWVjMjYxMTUxYzk3YjkzMDAzZmQ1MDIzYzhiM2EzNmU1MWQ4YjhjNTllY2UyZTk1ZTI0NTQwYTQ0NTkzYmI2NDRmNmIxM2ZhZDBmYTY0ZjRiNjJkNjA2YmM5OTAyMmQ0ZmMxMzI4OWIyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNGQyN2I2NTJiZGE5YjEwY2NmMjk4NjdiYThlN2U5MGE4NDI1OWY0OThmNzE3MzgyYjUzYmNjYTI5OTgwNjllYTFmMTRlZjJiM2YyODcyODRkMjU4OTBjNjAyODY5ZGY3Y2Y2NGQ4ZWQ4MWM3Y2QwYzczZmRlZmU1ZGVkY2IxNyIKICAgICAgICB9LAogICAgICAgICIuL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDYwNzEyMzhiMjVkMzA3NjZmNDQ3M2IzNjA3NWRiMDUwMDRhMzA5NWI3YmE2YWRkMDQ0ZDk4NjY1YzdlMGMzYzMwOWQwNGQ0MzU4YWFkOGIwNWRkOGZjZjAwZjdkZjI5NjE1NWM1ZjgyOWIyZjhiZjM4ZGRiZWZiMTBkNTgzNDkiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V4by12MS41LjEyIjogewogICAgICAibmFtZSI6ICJAZW5kby9leG8iLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzk0MTQ3M2MzMDViZTU3ZTc3ODMxYjg0NmI1ZGQ3MmYwNWIwM2U5NzcwNjk4NDE3NGFjZDFmM2ExM2ZmOGNjYTQ2YzJkNTEwMGYzNWZjYTdkOGYwNzE0YTVkYmQ5M2RkMDliN2U2ZGI2ZGI0YzYwODkzOTljMjQ0ZWM0NmNjYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEzZDA1NmViOTc1YmY1MDkzOGU3NTE1MmI2MmRiN2RmYmMyMjY1YzQ3YTI4YzcxNzJkYjY1YzA3OTFhNGFiMWIyMjdjZDNjMjI2MTA3YjI2ODYwNzM4NWJhNWJlOGFjOWY5MGY2MmRiNWQwZGFjMzkyZGJlNWRlNzIyNDQ4ZWY5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFjOTI1OTA2ZTUwMjJhM2I5YjdhMThjMTIyMDcxNThiYmJiNzllY2Y4ODBlMDc1YzA1NmNlYWQ5YzQzZGJjYzg3Mjk2MzU3ZDNhNWM3N2M2YjFiY2FmMzkyYjMyZGMxMjJiNTBmMGM4Y2JiN2NkODRiMTIxOWU0Y2VlNjM4NjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZ2V0LWludGVyZmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYwY2I4Mjg2MWMzZWJkYzVmNjg0NDNlODg4ZTgyMDA0ODAxNmMxM2RkMWRiMTlmNDVlNmY4OTkzNDkyNDZjMjk5NjhiZDVhM2ZmMThmYmUyZjVhYjg5M2M3MjFhMDBhZjM3OGJmZDA0ZTA3ODAxM2Q4NDYxOTA1MGUxZjI5ZTM3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9mYXItdjEuMS4xNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZmFyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YWJjZTViMDU4NDYwMWFiNTUwNjk5MDQyZDE2ZTY2ZDA3NGMyNTViMDQxOTM2ZDJiMDc4NzMyYTY0OTI3YzM1MTVhM2Q0Zjk1MGVlOTYwOTllYTA0ZWQxZGMxNmU0ZjRhODhhZWIwZDgxMWI0ZWViNGQ5N2E0OTJkZjUwNGQzYiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS44LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ODg0MzBmY2I3ODZiNTYxY2YwM2VjZjY1OWRhODgwZmM4YzRhNmJlMjFlYzZhMjU2ZmQ4ODQzYzkyYmM2NmMxZjEwZjk4MzcxY2M4NWMzNjcwZWE3Y2NmNzQ0MDBhYjExMmU0ZDEwYmNjMzliNjVjZTA1YjQ4NzUyYTI4ZDJjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjhmMzI1YTQ1NGNhZDIzMTkxZmM4ZDUxZjBiY2U5MjY5MGI3OGM5Mzg0ZWNlNWE2MjYzZGNmMWJkNDJhZjNkOWJiMTViYjc2YWQ0MTU2ZDAwOTA2MzUzZDVmY2RlZDZlY2E2OGFlYTM4NzJiNmRlY2U3MTRjMzA5ZGJiZWM5OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1NTZhZjI4ZWJhZjY4ZDRmZjBmZTI5NDUyNGM5MTIzMzg5MzJiOGUyOTFlMDY4YWQ2MDQwYzYzMTIwNzQ4YzU2N2RiMWQ1YTRiNjIzMTdlMzdjMzM0YTc3M2NiMGIyYmU5MzJiOGUzMjZhNzNkMTNlNWRhM2MzNTAwM2Q2MDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFkZGY4NmQ0YzQxYjU1NDU1ZTQxM2U0NmZmNDFlYTFkNmUyZDRiMTU2MTgxM2I4MGRiNzY4NjMwYWRmZjUwYjRhZjZiM2U1NzVjYWM0ZGE2ZjViNjI3YTRjMTkwZGRiYTFjYmIyNmIzNTFiMGVkZjhlMmQzMjBiY2VjMDFlZTEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIyNDUzYjE5ZjU3YmI5YzlmZTI0Y2Q5MjE2NzZmYmMwODUyZjQ3YWI5YTY2ZWNmYTc1MTM2YWZjNjUyODU1NTU0ZGQ4OTJjYjM5NGY4YmI3MjIzYTUxODJmNjFhMzMzYjA4M2Q2MmJiZGEwN2RkNjMxZWVhNWZjNTU2OWUzMmE2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkNGI1ZWNjYmI5YWZiYjZiYjJlNWZlNjEzMmM2OGQwMzQ0NGNiMDk0OTQ0ZGI3OTU3NTZlOGY0MjZmYjAyNDk1YWJhY2M5ZWYyMWQ2YTgxYTQ3NzAwZGNjZDAzNWI2MTQ0MTFmMDk1M2UzNmI1NzQ3NTkyYjUyNTUyZDIzNzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYzgzZWU2ZTdhNTY0YmVhN2Y3YTJmNzA3MmI1YjcxODVlYWY4MjVlNDM1MTFjYjVmZmY1ODQzY2FhNmM2YzFiYjJiZmU2NTQzODU1YWZmYWU3MDVkYjdmNDlhMjRmOTMzYzYwMTE5OTU1NDEwNWViNmViOGI4YTNmNjY0NmRhNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFjYzdjYzMwMjFkZTE4ZTExZjEyMTllMjFlMjhiOTgwNGY0MTM1MWYzMDRkMmYxZTZiNjhhM2I2NDU2NTY5ODI3ZmNhZjZlZWViMDM4NDZkMzYwMTkyMTY1OGFhNTgzYWI4Y2M2M2Y4YjYwYmFlNDU4NjRkN2JkOTIyYjU2ZDhjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMS4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3MzFjODI0YjFkOWI0MTc3ZmIzZmViNWExZWIwN2ExYzVkZjNjYTFlYTQ3NmExZTU1ODZlMTBjYjNmOTNjMTRkM2Q0MzZmOTE0ODk2MTkzMjkyMWVlZWYyM2ViZTMwZmI2YmIyMzMwNDRmYmVlYjc2YzZmOGUzMzU0YjllNmU1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaWRlbnQtY2hlY2tlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ZTI0NGQ5NDA4Y2VkYjVmMDhkMDJiMTFlYmMzZDkyMDUzNDUyMDZkYThhMmUwOGQ2ZTFiNmFmNTBlYzk4ZmEwNGQwMmE3YzA4NTFjOWVlMDUyYzFlN2YyZGMwODZmNDlkNThmODBjZmNjNGJkOTZhMjkzOGQ4MWQ0ZDkyYWMyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ieXRlQXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J5dGVBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk2ODgyMTUzMWQ5ZjFmY2ExMjg1NjA5NGQzMjVkN2M2NTZhMjc3OTY0ZDIzMGJkNjRjMjM1YmZkYzdkYTQxYWRkM2FkZDg2MGEyZTc3ZTdjYjY3MGUxYWI1ZTMxMTE0NGRjZjAyNWY0ZTkzNmEzYzljMmYwMGVjZjQwZWE5NGVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDM2YzIzOGMzMGE5ZmY4NjYzZmQyNmI1NzhiYjkzZWMyMGRkNjVhYWE3ZWNkYTRjYzI4MzU2Nzk0OTE0NjQ1ODkxZGY4Zjc5ZTFiMjMyMjZhODQ5YTA3ZDRhOWY1ZGRlMzUzOTk1MzQyNmE5ZWE0MWY2MzhiZTY4ZjIxNDdkYTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY1NjA5ZjdmMDk0MGRmMzliYmFhNTgwYTA1NmZmMDNkNTRlN2FlMjVlNTlhMDU0ZTc1NDI4N2MzYzdmODA4ZWNlMTI5YTFhMDRhYTA2YmIxOTU2MmVjYzI5MDJkZDcyOWY4MzAzMzkyN2MzOTczMTFhNmVmNTU1ZDhlZWZiNzM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTAzZjQ3ODc0NzdhYmY1YjliMjYyM2JjYzU5YzJhYWM3Yzc1YTIzNzk4ZDlmZTVjYWNjNjRmMmVhYWM1NzE4YTMyN2JmMzUwNmM4M2QwOTY5MzU5MzkzNTQzNzdlYzJjM2JiZjYxNTE3YzU1NThkMmY0MmI3OGFhYTVlMDkxODIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJhZTJmMWY0MjYwMGJiOTcyOGVjMWQxZTdhY2U3ZTUzYTRmNjlkMzZkZTVhOGZjZmJjODUwZmM0ZmRhOGJlYjQ2MzdiYTYwYTVlYTBjNmNmYTBlZjVjYjlhMWQ4MjE2MWE3NzNkZDQ3ZTRkNGU3NjZjY2E2NTU4ODg4M2U5MjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYWVmZDllMjM3MDlmZDFjZWM4ZDZkZDFlZDBhYzEyNTI1OWFlM2E4YmNhYTJiOTE4YmIzNzNhNjllN2VmNzlhMzljZDZkOWNmNjY3NDM2Njc2NzQ5NGUzOTM4MzMyZDI3MDM3MTA0MmY4MjMyNGM4MzQ2YmU1ODU3MThkN2JjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZTg3NTRjMjk4OTNiZGY4OGFlZDI5YzI2ZmFjMDczYjUwYTJmMDEyZWE5YzZjNDBhNTI0MTQwY2ZmY2VhZWE0YjllMmJlNGQ0NjRlMjczYmZhODRjY2QyN2RjMzQ5NzdkYzc2NzJhNDNlZmEzM2IyYTIyODg0NTFhMWEwMjE5NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWQ1ZjJjOWQ4YzQxZjFiOGJhOTg3ZWI4NzRjMjYzNTA5YjIyZDkwYWZhM2EzZjNiYjg4MWRiOWYwZTgwYmE2YTNiMzkzYTkzMGViYjI5MWU2ZjQ3M2VlNTYwNTMwZmNjZWVmM2YzMWZkMzYwZmUzMTI1OTEyNWFlZmE0ODc4ZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2RjNmU3YmI4Y2RjZWZlY2U5NjAwODZjY2Y5YjZkOTQzZjQwZjdkZGU4NjhlYjEyNTE0NzMzZWJkM2VlMzc1ZDk0ZTk4ZjU2MTI2YThjY2M0ODVhMzVmN2ZiYTcwNmE4OTgxN2FmNDc5OGY3ZGU4MjM4ZTgxYzIyNjBlZGEyYmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWEyNmUwNGRhNWM2MjkyM2UxZjQ0N2EwYjYyOGYxN2Q5NDllMzFlMDg4NTE2YWYwY2Q2ODg3ZTg1MGM5MTVlMGRkZWNkNDJhNGUwOGE1YjM4MWMwNzYzZjQzNWYxMmJmNGNkMzk0NmExNTUwNmU4NDQ1N2JlZWUwNTgyYTRlNjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNDc5YmZiYzFhYzY1ZmY0NDMzNzVlZjI4MjBlNWY1OGVmMWY1M2RkMGUwM2VhZDVjYWI4MTU0MzNhYjFkMDY1YTgxZDk0N2QwZmE2NjBmNTFiNjdjMGM2ODk0ZDFjYmM0ODU2MGZjZTlmZjJmMWU1MDdkNTMyZjAxNDdkZWY3ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJlMjc3MDdlYTg2OTFkNmYyMTcwZjJlMTI3YmI4M2I0NGQyNjg2ZjlmOTNlZWYzN2FmMGRiZmY3MGNjNDlmYWRjOWM1ODRhZGZmZGU5ZTJhNmQ5ZjYxYjE4NjVmY2FhMThkZGQ5NjgxZDU3NTU0NTMxZWM3MmQ1MTJiNDJmNjA5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU1MzE1YTY0YmZkMzE4YWY5YjM1MGU0M2FhZGRlZjYxOGI5ZTA1MjMyMjdkZGI0MWRmM2IzNmJhNzA4NzYwMDQ1YjRjNGUxMmY4YmIwYzdlNTRhYzI0YmFkZDIxM2UwY2Y5ZDVjMDQzNmZkZDM4ZGJhNzBiNDg3MTYyYTI5MjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NTlkYWQzMjIxMjMwMmRiOTkzZmM3NmZmNGIwMmMwZTA2MDY5OWVjNDQyZTIyNzQ3ZjQ0NGFhYmNhZjJlM2Y0ZjcxOTFlYjI2NzdhNTkzNGJmMjhmNzg5YTE3NjJhZDU3MDYwYmFjYjg3YjFkNTViOWEwMmJmM2Y5YmU0ODE1NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5MjdmMTFlYWVhNjE0YzE5MWY5OGM4ZDU3ZmM3MTQ5ZWY4ODM4MDMzN2JmZjQ5Y2FkOTM0YzdiM2ZmMWZhYjNhMDhiZTc0ZjY2ZmZlYTk1YWFhMmI5YzQ0M2IzZmUwNWNkN2Y5MDE3NWY4MzY3ZmViODc0NWJiYzI0MTg3MjczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZDVhNzNiNGM5MTY3MmM1NzU2OTM3Njc5MTkzN2Y5YjAzOTYyNzM4ZTdjMmE0NDhkYzBlNmY4YzVmYzkwZjEzYzU5N2MwZDQyZWI4MGE4NTkwNzJmZTk4YWI1NjJhZTM0MWU1Zjg1Mzg5NmU2NGJjYmQ4N2ViNDJlODg5ODE3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXR0ZXJucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjOWI3YWJhMzI1YjNhOTQwOGJiOTc3M2QyYjgyMzQ4ZTBlYzVjOGE4ZWZkZDQ3ZmNjY2U1MWQ0YzUyYWJmMmZkNTAyMGZkYWI5ZWFmMGQwZDA1MjhiNzkxNzBiZjAzZmMyOTA2YzMyNjJjY2QwMmIxMWVmYTMyZWUyMjM3YzczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMDA1ZmU5N2UzNDRhNzdhMDJmOTRlN2ZiYTVjNzE0Y2Q5MmU3MWMzNGZlNDE3ZDU1M2YyYjY0NTZiNTE4OGYwMWU0OTI3ZGE4ZTEwMWZkZWVjNDdjNWM1NmVlNzk5MmU0OGU3NWFlYzMyNTg4NTc5NDNjN2JjYTFlNGE5OTE5NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTAzMGJkOGMwNThlOGYxMmRmZTJkZjFlYTdlMGE1NDgyODVjNTJiNjhhZjc1NTk1NmJmOGVlZDk4YzZkNzBhYjgxNjU5NzM0MTJjZTVmNWViOTEwMGFjM2M3OTI3MzkwMmI4NDQwMDg0MzM3YTRiYTFmODQzN2YyOWNhYjZjOTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGFkMjBiNzRiZDM2YTQ3NDIyOTlkODMyOGE0YTY3M2IwMDc0NTk4ZTcyMGFhMDczYmVmZjc4NjdkN2VhZjM5YjBhMTkzMGI4OWNmMzhiZDA4N2M3NTI3YjRlYzA3NjhjZmNmYjI5YjkzZjNkOTNkMzVlMWU2YjQ2MjdlOWY0MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ0YzhiNzcyZGRlNmI0OTc0MzNmMDM5ZTZiMTBkMjExOWUwMmVmZGMwYTNhYmY1NmEwYjBjMDZlMzVkYjA0NjJjMTUxNzAxMWYzZThjODNhYmUzYWMxNmFkNTVkZWU4NDM4NGFjZGViYzdmY2FiYzJiOWJlMjlmMGMzOTZhMWUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTQyYWFmYWQ5NGM3ZjhkMjNkODczYjYwZmIwYjI3ZDAyMzE4OTk1MWE5ZWM1MTM4ZDVlNjkxZDE2MDgyNTg5NzFiOGExNTZlZDVmMWZmNTljYmFlODFkMjliNDY5OTc5MjEwMGZmMDNmNDczZjdhODkzZjBhNWU3YzU4YzNmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1NTU4N2JjYTI0NWQ0M2FkMzQ3YmExYjA5NmNmNmYzY2IwZWYwODUzNWUwODM3MzUyODVlNjY1OWMxNzVmNjU3YmRjZWZlMGZlNzVkY2MxMTY2ZjJhOWYwNGY1ODljN2EwZWQ3OGE5MDE2YWYwOGMxZmQzYmVlMmJkNjIxZTA1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2E4OTBmODNiNDcxNTFhZDc4YzhhZDVjNDQzMTQyY2YzOTllMDVhMjExYjEyN2U1MTU5NjYzZjA3NjY3N2YxMTBhOGExYWMyNWVmOGI4MjhjYjJiNDlmM2Y0NjY5ODU5NTRiOWNjYmMzNzczYTIwNTFiZmQ0ZDQ4Nzg3ZDE0M2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVhMDI2Y2MzZDllNjQzMzVmOTIzNjk3ZTI3YTBmZjNkZmYzZmNlNGI2YmJkOTE5YjU0MDlmYTVjN2JkZTE4MTU0MjQ1YjJlYTkyYjI4MDI5MjJhMmMzYTRhNzVlNTFmNmE0OTVjN2YzNjgzZWVjMzJiMTk4YjFlMTJhMDYwMmNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmY2MDcwM2JiYWUxZDI3NDhjYzM0M2JiNWU1MTZhZDk4ZGZmYzNkYTZlNTkzNWM3NGE0OTQ2MjQ3NThhMjJlZWQ3MGI5ZDVlZjcxNmEwNzQzNmU3ZmRjMTQwYjYxYzQ3OGEyMWFjMjYyODRmNWZkZGUwZTM5Y2EyZmUyNTdiNDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmY0NjUzMzA3ZjgwNmYxM2IyYWRiNTk2YmI2ZTI0Y2FmZThmMDgzNDQyZjhiNTBiMzJhMGVjYWIxYWY4ZGVlNTJiNmE5YjgzZTY0YmMyZDY2YmQ1ZGQ0MjNkZGYwNmExMjE0MWY5YWI4ZTY0Y2IyNjE0MDY0ZWU2NTJkMDQwMDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNkM2EyNTYzNmU1NDI3OGIzM2Y2YzM2MjE0Nzg4OWU2ZmYxMGJlZGE4MGMwN2U2YTE2ZDE5MDQ3YjdiM2M2YTM0ZDczMGU5YjNjZmM5Zjg1MTFiNmUyN2I2YTY5Nzc2NGY5NjgzZDcwZGY3MDg2ZTA4NWY5M2Q3Zjk1ZmM0ZmZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGZhNmQxMmQ0N2JiYTE4NmE1MmYxZjY4Njg2MDJlMDVhOTk4MmNiM2NjNzI4NjgyNjhjNWIwNzk4Y2ZjOTk5MzU1MDQyNDM5NTgxZjgyYTg1NTE0Y2IzMjJmNDFkYWRhZDY5YjkxMTk2ODI3NzBmYTQ1N2NlZmQ1MjdhYTU5OGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGM4NGQwNzZlMGE0MTlmYzg2MzdhYjM4ZjI0NDMzOGM0NzZjNTAxMzJjZmUwOTAwMmRkZGNiYmZjZDM2NWJmNmNmM2QzMmIwOWRhMzI1MjVmNzViNjBmNWZjNjYwZGRjMGUwOGYzNmE2MDdiYTA3N2Y1OTliYzU1ZjI5ZWNiMzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3N0cmVhbS12MS4yLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9zdHJlYW0iLAogICAgICAibGFiZWwiOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIwMDUyYzZlNmZhMjViMWQyODJiMDIwNjE5NGE5NTk5YzY3ZDMyYjVhMGNlOWU3ZTk5NTc3NGNmZDlmZjdhMGI5MmQ3NTAwOWEzMDkzMGFhNmNjMTM0ODEzYmIyN2RjNjJhOGVhZTkwNjQ2YjE5OGE2N2QwZGYzYWViMTg4YWMwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJqZXNzaWUuanMtdjAuMy40IjogewogICAgICAibmFtZSI6ICJqZXNzaWUuanMiLAogICAgICAibGFiZWwiOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYWYxMDk5NzI5MDFlZWMzZTdkOWMwMWRhZTI2YWVkNjc5ZmYxMGM2YjhjMmVhYjlmN2I4NTAyYTI3ZDkxNWY0ZmMwZDg4Y2ZmMjVmMTViNjk4NWY0ZTFjZTJiZDQ1M2I3ODMxMGJmNmMzYzZhMjU4MzNjNTFiMDcwNjViMDMyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDdkZTZjYmI1MWUxNmEyZGQ1MjBmN2U1NjYwYWRmYTNkMzZiOWQyMGVlYmE3Y2QzZDAzNmEwZDViZmQ2ZDE0YWQ4NWY1NjM5MDBmMTZjNmEwN2JjNTcyZmY4NDM2YzNmZDFhZmRjNzU2NzcyMzcwOTgzNzQzZTZkMjRkNzQ3YzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGFmZjdmN2QwYzRjOTdjYjU1ZWU0OGIzZTM0MjliN2FjODZlODJjMzk1ODI3ZGZjM2JmYTg4ZTNjYzYxYmI2OTRhODVlZjU4MDkzNGFhNmYyYTQxNGE1NTlhM2Y0ZmIxYjQ2ZWI3NzlkMDBiYjFlMGEzZGY1OTYwZDU3Y2Q2YzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmZDUyZWYzMDJjMWYxNGM2MjBmZGRkNDM3MjdkODIzMjQwM2I5YmQzNTYxZTFmMTIzZGNlOWQ0ZTlhMTNiNTVhMmQxZWU0YWQ4MDcwMmYyNTExMTllOWQ0OTJhOGM3YTM0NWZlNTcxYTQ3OWQzOTFlMmI3ODFmZmIxMzhjMDA2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU4ZjgwZjMzYWQ3NWQ3ZTAyMTJjOWVhZDdmOThmODI5YjdiZjJlNmQxOTJhYzcwOGVkZDc3M2M1Mjg0N2RiZGYzODMwNDc5ODgzYmM2YzQ0MDY1ZTA1NTQ3MGNkOTM4ZDA4NTEwNmZhMTJjN2RmY2VlMzk2OTM1YTRjZTE1NmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjcwZGM1ZWI0MTQ3N2U0ZGRlZmQwZTA4NjhiZjAzYTg3MWFkNTk5NmYyN2Y3MWM3MDBjNTk3ZjFjOTEzMTY4NmVjOWZiZDNhY2E3ZGQ3YzViNjQ1Yzg3NTFmZWYwMWY1ZjkxMWQyNTFmNTllZDkyOGE5MmJhNjhkOTkwMjJlNzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc0NmI2YWJiY2VhNzBiNTEyMGEwNTQyNjM5YTk4NWQ4OThhMjVmMjVhMjM5NDBlY2MwZmEyNmU2ZWZjOGQ2NTJhNWRiOWFlNWE3NWVjMjc4Zjc5YzQ0ZDg4MDBkOTdhN2JkZWViZmU2NTczM2IzYWI2NjRiYjIzNTNjNDY1NWVlIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAMYBI+I0BAACNAQAAIAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9oZWFwLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2hlYXAuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2hlYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACP79nO3goAAN4KAAAkAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9oZWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9leG8iLCJAYWdvcmljL3N0b3JlIiwiLi9tYWtlLW9uY2UuanMiLCIuL2tleXMuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiZXhwb3J0cyI6WyJtYWtlSGVhcFpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXIsaXNQYXNzYWJsZSxtYWtlRXhvLGRlZmluZUV4b0NsYXNzLGRlZmluZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyV2Vha1NldFN0b3JlLG1ha2VPbmNlS2l0LGtleXMsd2F0Y2hQcm9taXNlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXhvXCIsIFtbXCJtYWtlRXhvXCIsWyRozY9fYSA9PiAobWFrZUV4byA9ICRozY9fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAoZGVmaW5lRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gJGjNj19hKV1dXV0sW1wiLi9tYWtlLW9uY2UuanNcIiwgW1tcIm1ha2VPbmNlS2l0XCIsWyRozY9fYSA9PiAobWFrZU9uY2VLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2tleXMuanNcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXV1dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbW1wid2F0Y2hQcm9taXNlXCIsWyRozY9fYSA9PiAod2F0Y2hQcm9taXNlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cbiAqL1xuY29uc3QgZGV0YWNoZWRIZWFwU3RvcmVzID0gRmFyKCdoZWFwU3RvcmVzJywge1xuICBkZXRhY2hlZDogKCkgPT4gZGV0YWNoZWRIZWFwU3RvcmVzLFxuICBpc1N0b3JhYmxlOiBpc1Bhc3NhYmxlLFxuXG4gIHNldFN0b3JlOiBtYWtlU2NhbGFyU2V0U3RvcmUsXG4gIG1hcFN0b3JlOiBtYWtlU2NhbGFyTWFwU3RvcmUsXG4gIHdlYWtNYXBTdG9yZTogbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxcbiAgd2Vha1NldFN0b3JlOiBtYWtlU2NhbGFyV2Vha1NldFN0b3JlLFxufSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VIZWFwWm9uZSA9IChiYXNlTGFiZWwgPSAnaGVhcFpvbmUnKSA9PiB7XG4gIGNvbnN0IHsgbWFrZU9uY2UsIHdyYXBQcm92aWRlciB9ID0gbWFrZU9uY2VLaXQoYmFzZUxhYmVsLCBkZXRhY2hlZEhlYXBTdG9yZXMpO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgbWFrZVN1YlpvbmUgPSAobGFiZWwsIF9vcHRpb25zKSA9PlxuICAgIG1ha2VIZWFwWm9uZShgJHtiYXNlTGFiZWx9LiR7bGFiZWx9YCk7XG5cbiAgcmV0dXJuIEZhcignaGVhcFpvbmUnLCB7XG4gICAgZXhvOiB3cmFwUHJvdmlkZXIobWFrZUV4bywga2V5cy5leG8pLFxuICAgIGV4b0NsYXNzOiB3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3MsIGtleXMuZXhvQ2xhc3MpLFxuICAgIGV4b0NsYXNzS2l0OiB3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3NLaXQsIGtleXMuZXhvQ2xhc3NLaXQpLFxuICAgIHN1YlpvbmU6IHdyYXBQcm92aWRlcihtYWtlU3ViWm9uZSksXG5cbiAgICBtYWtlT25jZSxcbiAgICB3YXRjaFByb21pc2UsXG4gICAgZGV0YWNoZWQ6IGRldGFjaGVkSGVhcFN0b3Jlcy5kZXRhY2hlZCxcbiAgICBpc1N0b3JhYmxlOiBkZXRhY2hlZEhlYXBTdG9yZXMuaXNTdG9yYWJsZSxcblxuICAgIG1hcFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLm1hcFN0b3JlKSxcbiAgICBzZXRTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5zZXRTdG9yZSksXG4gICAgd2Vha01hcFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLndlYWtNYXBTdG9yZSksXG4gICAgd2Vha1NldFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLndlYWtTZXRTdG9yZSksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUhlYXBab25lKG1ha2VIZWFwWm9uZSk7XG5oYXJkZW4obWFrZUhlYXBab25lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VIZWFwWm9uZSI6WyJtYWtlSGVhcFpvbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFW6x+nkCAAB5AgAAJQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9leHBvcnRzLmpzIiwiLi9tYWtlLW9uY2UuanMiLCIuL2tleXMuanMiLCIuL2lzLXBhc3NhYmxlLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyIsIi4va2V5cy5qcyIsIi4vbWFrZS1vbmNlLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vZXhwb3J0cy5qc1wiLCBbXV0sW1wiLi9tYWtlLW9uY2UuanNcIiwgW11dLFtcIi4va2V5cy5qc1wiLCBbXV0sW1wiLi9pcy1wYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi93YXRjaC1wcm9taXNlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADl90gx0AgAAdAIAACsAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2lzLXBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJpc1Bhc3NhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcmVhbElzUGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAocmVhbElzUGFzc2FibGUgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGUgPSBzcGVjaW1lbiA9PiByZWFsSXNQYXNzYWJsZShzcGVjaW1lbik7JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfp1GnKUDAAClAwAAJAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMva2V5cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWdvcmljVmF0RGF0YUtleXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGtpbmQgPSBsYWJlbCA9PiBgJHtsYWJlbH1fa2luZEhhbmRsZWA7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHNpbmdsZXRvbiA9IGxhYmVsID0+IGAke2xhYmVsfV9zaW5nbGV0b25gO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgYWdvcmljVmF0RGF0YUtleXMgPSB7XG4gIGV4b0NsYXNzOiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpXSksXG4gIGV4b0NsYXNzS2l0OiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpXSksXG4gIGV4bzogbGFiZWwgPT4gaGFyZGVuKFtraW5kKGxhYmVsKSwgc2luZ2xldG9uKGxhYmVsKV0pLFxuICBzdG9yZTogbGFiZWwgPT4gaGFyZGVuKFtsYWJlbF0pLFxuICB6b25lOiBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSksXG59OyRozY9fb25jZS5hZ29yaWNWYXREYXRhS2V5cyhhZ29yaWNWYXREYXRhS2V5cyk7XG5oYXJkZW4oYWdvcmljVmF0RGF0YUtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYWdvcmljVmF0RGF0YUtleXMiOlsiYWdvcmljVmF0RGF0YUtleXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAzgfPoLQHAAC0BwAAKQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvbWFrZS1vbmNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VPbmNlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRMYWJlbFRvS2V5cyA9IGxhYmVsID0+IGhhcmRlbihbbGFiZWxdKTtcbmhhcmRlbihkZWZhdWx0TGFiZWxUb0tleXMpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU9uY2VLaXQgPSAoZGVidWdOYW1lLCBzdG9yZXMsIGJhY2tpbmdTdG9yZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCB1c2VkS2V5cyA9IHN0b3Jlcy5kZXRhY2hlZCgpLnNldFN0b3JlKGAke2RlYnVnTmFtZX0gdXNlZCBrZXlzYCk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXNzZXJ0T25seU9uY2UgPSBrZXkgPT4ge1xuICAgIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IEZhaWxga2V5ICR7a2V5fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAhdXNlZEtleXMuaGFzKGtleSkgfHxcbiAgICAgIEZhaWxga2V5ICR7a2V5fSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gdGhpcyB6b25lIGFuZCBpbmNhcm5hdGlvbmA7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgdXNlZEtleXMuYWRkKGtleSk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3Qgd3JhcFByb3ZpZGVyID0gKHByb3ZpZGVyLCBsYWJlbFRvS2V5cyA9IGRlZmF1bHRMYWJlbFRvS2V5cykgPT4ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3Qgd3JhcHBlciA9IChsYWJlbCwgLi4ucmVzdCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgbGFiZWxUb0tleXMobGFiZWwpKSB7XG4gICAgICAgIGFzc2VydE9ubHlPbmNlKGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvdmlkZXIobGFiZWwsIC4uLnJlc3QpO1xuICAgIH07XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgKi8gKHdyYXBwZXIpO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VPbmNlID0gKGtleSwgbWFrZXIpID0+IHtcbiAgICBhc3NlcnRPbmx5T25jZShrZXkpO1xuICAgIGlmIChiYWNraW5nU3RvcmUgJiYgYmFja2luZ1N0b3JlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gYmFja2luZ1N0b3JlLmdldChrZXkpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IG1ha2VyKGtleSk7XG4gICAgc3RvcmVzLmlzU3RvcmFibGUodmFsdWUpIHx8XG4gICAgICBGYWlsYG1ha2VyIHJldHVybiB2YWx1ZSAke3ZhbHVlfSBpcyBub3Qgc3RvcmFibGVgO1xuICAgIGJhY2tpbmdTdG9yZSAmJiBiYWNraW5nU3RvcmUuaW5pdChrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IG1ha2VPbmNlLCB3cmFwUHJvdmlkZXIgfSk7XG59OyRozY9fb25jZS5tYWtlT25jZUtpdChtYWtlT25jZUtpdCk7XG5oYXJkZW4obWFrZU9uY2VLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU9uY2VLaXQiOlsibWFrZU9uY2VLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlUtl/dsJAADbCQAALQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXR0ZXJucyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSIsIlByb21pc2VXYXRjaGVySGFuZGxlciIsIlByb21pc2VXYXRjaGVySSIsIlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxNLEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cbiAqL1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVySGFuZGxlciA9IE0uY2FsbChNLnJhdygpKS5yZXN0KE0ucmF3KCkpLnJldHVybnMoKTtcblxuLypcblxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySGFuZGxlcihQcm9taXNlV2F0Y2hlckhhbmRsZXIpO1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVySSA9IE0uaW50ZXJmYWNlKCdQcm9taXNlV2F0Y2hlcicsIHtcbiAgb25GdWxmaWxsZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbiAgb25SZWplY3RlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckkoUHJvbWlzZVdhdGNoZXJJKTtcbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWQnLCB7XG4gIG9uRnVsZmlsbGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG59KTtcblxuLypcblxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSShQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkpO1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVyUmVqZWN0ZWRJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyUmVqZWN0ZWQnLCB7XG4gIG9uUmVqZWN0ZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbn0pO1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlclJlamVjdGVkSShQcm9taXNlV2F0Y2hlclJlamVjdGVkSSk7XG5jb25zdCBjYWxsTWVNYXliZSA9ICh0aGF0LCBwcm9wLCBwb3N0QXJncykgPT4ge1xuICBjb25zdCBmbiA9IHRoYXRbcHJvcF07XG4gIGlmICghZm4pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGFzc2VydC50eXBlb2YoZm4sICdmdW5jdGlvbicpO1xuICAvKlxuXG4gICAqL1xuICBjb25zdCB3cmFwcGVkID0gYXJnID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgYXBwbHkoZm4sIHRoYXQsIFthcmcsIC4uLnBvc3RBcmdzXSk7XG4gIH07XG4gIHJldHVybiB3cmFwcGVkO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHdhdGNoUHJvbWlzZSA9IChwLCB3YXRjaGVyLCAuLi53YXRjaGVyQXJncykgPT4ge1xuICBQcm9taXNlLnJlc29sdmUocCkgPT09IHAgfHwgRmFpbGB3YXRjaFByb21pc2Ugb25seSB3YXRjaGVzIHByb21pc2VzYDtcbiAgY29uc3Qgb25GdWxmaWxsZWQgPSBjYWxsTWVNYXliZSh3YXRjaGVyLCAnb25GdWxmaWxsZWQnLCB3YXRjaGVyQXJncyk7XG4gIGNvbnN0IG9uUmVqZWN0ZWQgPSBjYWxsTWVNYXliZSh3YXRjaGVyLCAnb25SZWplY3RlZCcsIHdhdGNoZXJBcmdzKTtcbiAgb25GdWxmaWxsZWQgfHxcbiAgICBvblJlamVjdGVkIHx8XG4gICAgRmFpbGBwcm9taXNlIHdhdGNoZXIgbXVzdCBpbXBsZW1lbnQgYXQgbGVhc3Qgb25lIGhhbmRsZXIgbWV0aG9kYDtcbiAgdm9pZCBFLndoZW4ocCwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xufTskaM2PX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7XG5oYXJkZW4od2F0Y2hQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlByb21pc2VXYXRjaGVySGFuZGxlciI6WyJQcm9taXNlV2F0Y2hlckhhbmRsZXIiXSwiUHJvbWlzZVdhdGNoZXJJIjpbIlByb21pc2VXYXRjaGVySSJdLCJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiOlsiUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJIl0sIlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJIjpbIlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYluOjmsFAABrBQAAIQAAAEBhZ29yaWMvY2FjaGUtdjAuMy4yL3NyYy9jYWNoZS5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N0b3JlLmpzIl0sImV4cG9ydHMiOlsibWFrZUNhY2hlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsbWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDYWNoZSA9IChjb29yZGluYXRvciA9IG1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yKCkpID0+IHtcbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjYWNoZSA9IChrZXksIC4uLm9wdFVwZGF0ZUd1YXJkUGF0dGVybikgPT4ge1xuICAgIGlmIChvcHRVcGRhdGVHdWFyZFBhdHRlcm4ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gRShjb29yZGluYXRvcikuZ2V0UmVjZW50VmFsdWUoa2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBbdXBkYXRlLCBndWFyZFBhdHRlcm5dID0gb3B0VXBkYXRlR3VhcmRQYXR0ZXJuO1xuICAgIGlmICh0eXBlb2YgdXBkYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gRShjb29yZGluYXRvcikuc2V0Q2FjaGVWYWx1ZShrZXksIHVwZGF0ZSwgZ3VhcmRQYXR0ZXJuKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVyID0gRmFyKCdjYWNoZSB1cGRhdGVyJywge1xuICAgICAgdXBkYXRlOiBvbGRWYWx1ZSA9PiB7XG4gICAgICAgIHJldHVybiB1cGRhdGUob2xkVmFsdWUpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gRShjb29yZGluYXRvcikudXBkYXRlQ2FjaGVWYWx1ZShrZXksIHVwZGF0ZXIsIGd1YXJkUGF0dGVybik7XG4gIH07XG5cbiAgcmV0dXJuIGNhY2hlO1xufTskaM2PX29uY2UubWFrZUNhY2hlKG1ha2VDYWNoZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQ2FjaGUiOlsibWFrZUNhY2hlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKDGVQkRAgAAEQIAACAAAABAYWdvcmljL2NhY2hlLXYwLjMuMi9zcmMvbWFpbi5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLmpzIiwiLi9zdG9yZS5qcyIsIi4vY2FjaGUuanMiLCIuL3N0YXRlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9jYWNoZS5qcyIsIi4vc3RhdGUuanMiLCIuL3N0b3JlLmpzIiwiLi90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3N0b3JlLmpzXCIsIFtdXSxbXCIuL2NhY2hlLmpzXCIsIFtdXSxbXCIuL3N0YXRlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAlFBxpgBAAAYAQAACEAAABAYWdvcmljL2NhY2hlLXYwLjMuMi9zcmMvc3RhdGUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkdST1VORF9TVEFURSIsIm1ha2VTdGF0ZSIsIndpdGhHcm91bmRTdGF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBHUk9VTkRfU1RBVEUgPSBoYXJkZW4oeyBnZW5lcmF0aW9uOiAwbiwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2UuR1JPVU5EX1NUQVRFKEdST1VORF9TVEFURSk7XG4gICAgICAgY29uc3QgbWFrZVN0YXRlID0gKHZhbHVlLCBwcmlvclN0YXRlID0gR1JPVU5EX1NUQVRFKSA9PlxuICBoYXJkZW4oe1xuICAgIGdlbmVyYXRpb246IHByaW9yU3RhdGUuZ2VuZXJhdGlvbiArIDFuLFxuICAgIHZhbHVlLFxuICB9KTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5tYWtlU3RhdGUobWFrZVN0YXRlKTtcbiAgICAgICBjb25zdCB3aXRoR3JvdW5kU3RhdGUgPSBzdGF0ZVN0b3JlID0+ICh7XG4gIC4uLnN0YXRlU3RvcmUsXG4gIGdldDoga2V5ID0+IHtcbiAgICBpZiAoIXN0YXRlU3RvcmUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBHUk9VTkRfU1RBVEU7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZVN0b3JlLmdldChrZXkpO1xuICB9LFxufSk7JGjNj19vbmNlLndpdGhHcm91bmRTdGF0ZSh3aXRoR3JvdW5kU3RhdGUpO1xuaGFyZGVuKHdpdGhHcm91bmRTdGF0ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJHUk9VTkRfU1RBVEUiOlsiR1JPVU5EX1NUQVRFIl0sIm1ha2VTdGF0ZSI6WyJtYWtlU3RhdGUiXSwid2l0aEdyb3VuZFN0YXRlIjpbIndpdGhHcm91bmRTdGF0ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADkJ8kTgRoAAIEaAAAhAAAAQGFnb3JpYy9jYWNoZS12MC4zLjIvc3JjL3N0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvaW50ZXJuYWwiLCIuL3N0YXRlLmpzIl0sImV4cG9ydHMiOlsibWFrZUNoYWluU3RvcmFnZUNvb3JkaW5hdG9yIiwibWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixkZWVwbHlGdWxmaWxsZWQsbWFrZU1hcnNoYWwsbWF0Y2hlcyxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhckJpZ01hcFN0b3JlLHVudGlsVHJ1ZSx3aXRoR3JvdW5kU3RhdGUsbWFrZVN0YXRlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIixbJGjNj19hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaM2PX2EpXV0sW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcInVudGlsVHJ1ZVwiLFskaM2PX2EgPT4gKHVudGlsVHJ1ZSA9ICRozY9fYSldXV1dLFtcIi4vc3RhdGUuanNcIiwgW1tcIndpdGhHcm91bmRTdGF0ZVwiLFskaM2PX2EgPT4gKHdpdGhHcm91bmRTdGF0ZSA9ICRozY9fYSldXSxbXCJtYWtlU3RhdGVcIixbJGjNj19hID0+IChtYWtlU3RhdGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFrZUtleVRvU3RyaW5nID0gKHNhbml0aXplID0gb2JqID0+IG9iaikgPT4ge1xuICBsZXQgbGFzdE5vbmNlID0gMDtcbiAgY29uc3QgdmFsVG9Ob25jZSA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IHZhbFRvU2xvdCA9IHZhbCA9PiB7XG4gICAgbGV0IHNsb3QgPSB2YWxUb05vbmNlLmdldCh2YWwpO1xuICAgIGlmICghc2xvdCkge1xuICAgICAgbGFzdE5vbmNlICs9IDE7XG4gICAgICBzbG90ID0gbGFzdE5vbmNlO1xuICAgICAgdmFsVG9Ob25jZS5zZXQodmFsLCBzbG90KTtcbiAgICB9XG4gICAgcmV0dXJuIHNsb3Q7XG4gIH07XG5cbiAgY29uc3QgeyB0b0NhcERhdGE6IGtleVRvSnNvbmFibGUgfSA9IG1ha2VNYXJzaGFsKHZhbFRvU2xvdCwgdW5kZWZpbmVkLCB7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pO1xuICBjb25zdCBrZXlUb1N0cmluZyA9IGFzeW5jIGtleVAgPT4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHNhbml0aXplKGtleVApO1xuICAgIGNvbnN0IG9iaiA9IGtleVRvSnNvbmFibGUoa2V5KTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKTtcbiAgfTtcbiAgcmV0dXJuIGtleVRvU3RyaW5nO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGFwcGx5Q2FjaGVUcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAga2V5U3RyLFxuICB0eG4sXG4gIGd1YXJkUGF0dGVybixcbiAgc2FuaXRpemUsXG4gIHN0YXRlU3RvcmUsXG4pID0+IHtcbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgZ2V0VXBkYXRlZFN0YXRlID0gYXN5bmMgYmFzaXNTdGF0ZSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gYmFzaXNTdGF0ZTtcbiAgICBpZiAoIW1hdGNoZXModmFsdWUsIGd1YXJkUGF0dGVybikpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9IGF3YWl0IHNhbml0aXplKHR4bih2YWx1ZSkpO1xuICAgIHJldHVybiBtYWtlU3RhdGUobmV3VmFsdWUsIGJhc2lzU3RhdGUpO1xuICB9O1xuXG4gIGxldCBiYXNpc1N0YXRlID0gc3RhdGVTdG9yZS5nZXQoa2V5U3RyKTtcbiAgbGV0IHVwZGF0ZWRTdGF0ZSA9IGF3YWl0IGdldFVwZGF0ZWRTdGF0ZShiYXNpc1N0YXRlKTtcblxuICAvL1xuXG4gIC8vXG4gIGJhc2lzU3RhdGUgPSBzdGF0ZVN0b3JlLmdldChrZXlTdHIpO1xuICBjb25zdCB1bnRpbFVwZGF0ZVN5bmNlZCA9IHVudGlsVHJ1ZShcbiAgICAoKSA9PiAhdXBkYXRlZFN0YXRlIHx8IHVwZGF0ZWRTdGF0ZS5nZW5lcmF0aW9uID4gYmFzaXNTdGF0ZS5nZW5lcmF0aW9uLFxuICApO1xuICBmb3IgYXdhaXQgKGNvbnN0IF8gb2YgdW50aWxVcGRhdGVTeW5jZWQpIHtcbiAgICB1cGRhdGVkU3RhdGUgPSBhd2FpdCBnZXRVcGRhdGVkU3RhdGUoYmFzaXNTdGF0ZSk7XG4gICAgLy9cbiAgICBiYXNpc1N0YXRlID0gc3RhdGVTdG9yZS5nZXQoa2V5U3RyKTtcbiAgfVxuXG4gIGlmICghdXBkYXRlZFN0YXRlKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBiYXNpc1N0YXRlLnZhbHVlO1xuICB9XG5cbiAgLy9cbiAgLy9cbiAgaWYgKGJhc2lzU3RhdGUuZ2VuZXJhdGlvbiA8IDFuKSB7XG4gICAgLy9cbiAgICBzdGF0ZVN0b3JlLmluaXQoa2V5U3RyLCB1cGRhdGVkU3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlU3RvcmUuc2V0KGtleVN0ciwgdXBkYXRlZFN0YXRlKTtcbiAgfVxuXG4gIC8vXG4gIHJldHVybiB1cGRhdGVkU3RhdGUudmFsdWU7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBzdHJpbmdpZnlTdGF0ZVN0b3JlID0gYXN5bmMgKHN0YXRlU3RvcmUsIG1hcnNoYWxsZXIpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgb2JqID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHN0YXRlU3RvcmUuZW50cmllcygpKSB7XG4gICAgb2JqW2tleV0gPSBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGRlZXBseUZ1bGZpbGxlZChoYXJkZW4ob2JqKSkudGhlbihmdWxmaWxsZWRPYmogPT5cbiAgICBKU09OLnN0cmluZ2lmeShmdWxmaWxsZWRPYmopLFxuICApO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yID0gKFxuICBzdGF0ZVN0b3JlID0gbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gIHNhbml0aXplID0gZGVlcGx5RnVsZmlsbGVkLFxuKSA9PiB7XG4gIGNvbnN0IHNlcmlhbGl6ZVBhc3NhYmxlID0gbWFrZUtleVRvU3RyaW5nKHNhbml0aXplKTtcblxuICBjb25zdCBkZWZhdWx0U3RhdGVTdG9yZSA9IHdpdGhHcm91bmRTdGF0ZShzdGF0ZVN0b3JlKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb29yZCA9IEZhcignc3RvcmUgY2FjaGUgY29vcmRpbmF0b3InLCB7XG4gICAgZ2V0UmVjZW50VmFsdWU6IGFzeW5jIGtleSA9PiB7XG4gICAgICBjb25zdCBrZXlTdHIgPSBhd2FpdCBzZXJpYWxpemVQYXNzYWJsZShrZXkpO1xuICAgICAgcmV0dXJuIGRlZmF1bHRTdGF0ZVN0b3JlLmdldChrZXlTdHIpLnZhbHVlO1xuICAgIH0sXG4gICAgc2V0Q2FjaGVWYWx1ZTogYXN5bmMgKGtleSwgbmV3VmFsdWUsIGd1YXJkUGF0dGVybikgPT4ge1xuICAgICAgY29uc3Qga2V5U3RyID0gYXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbiAgICAgIHJldHVybiBhcHBseUNhY2hlVHJhbnNhY3Rpb24oXG4gICAgICAgIGtleVN0cixcbiAgICAgICAgKCkgPT4gbmV3VmFsdWUsXG4gICAgICAgIGd1YXJkUGF0dGVybixcbiAgICAgICAgc2FuaXRpemUsXG4gICAgICAgIGRlZmF1bHRTdGF0ZVN0b3JlLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHVwZGF0ZUNhY2hlVmFsdWU6IGFzeW5jIChrZXksIHVwZGF0ZXIsIGd1YXJkUGF0dGVybikgPT4ge1xuICAgICAgY29uc3Qga2V5U3RyID0gYXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbiAgICAgIHJldHVybiBhcHBseUNhY2hlVHJhbnNhY3Rpb24oXG4gICAgICAgIGtleVN0cixcbiAgICAgICAgb2xkVmFsdWUgPT4gRSh1cGRhdGVyKS51cGRhdGUob2xkVmFsdWUpLFxuICAgICAgICBndWFyZFBhdHRlcm4sXG4gICAgICAgIHNhbml0aXplLFxuICAgICAgICBkZWZhdWx0U3RhdGVTdG9yZSxcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBjb29yZDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IobWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IpO1xuY29uc3QgbWFrZUxhc3RXaW5zVXBkYXRlciA9IChzdGF0ZVN0b3JlLCBtYXJzaGFsbGVyLCBzdG9yYWdlTm9kZSkgPT4ge1xuICBsZXQgbGFzdFByZXBhcmVUaWNrZXQgPSAwbjtcbiAgbGV0IGxhc3RDb21taXRUaWNrZXQgPSAwbjtcblxuICByZXR1cm4gYXN5bmMgc3RvcmVkVmFsdWUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGxhc3RQcmVwYXJlVGlja2V0ICs9IDFuO1xuICAgIGNvbnN0IG1hcnNoYWxsVGlja2V0ID0gbGFzdFByZXBhcmVUaWNrZXQ7XG4gICAgY29uc3Qgc2VyaWFsaXplZFN0b3JlID0gYXdhaXQgc3RyaW5naWZ5U3RhdGVTdG9yZShzdGF0ZVN0b3JlLCBtYXJzaGFsbGVyKTtcbiAgICBpZiAobWFyc2hhbGxUaWNrZXQgPCBsYXN0Q29tbWl0VGlja2V0KSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHN0b3JlZFZhbHVlO1xuICAgIH1cbiAgICBhd2FpdCBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkU3RvcmUpO1xuICAgIGxhc3RDb21taXRUaWNrZXQgPSBtYXJzaGFsbFRpY2tldDtcbiAgICByZXR1cm4gc3RvcmVkVmFsdWU7XG4gIH07XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDaGFpblN0b3JhZ2VDb29yZGluYXRvciA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCBzdGF0ZVN0b3JlID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdzdGF0ZUtleScpO1xuXG4gIGNvbnN0IHNhbml0aXplID0gZGVlcGx5RnVsZmlsbGVkO1xuICBjb25zdCBzZXJpYWxpemVQYXNzYWJsZSA9IG1ha2VLZXlUb1N0cmluZyhzYW5pdGl6ZSk7XG5cbiAgY29uc3QgZGVmYXVsdFN0YXRlU3RvcmUgPSB3aXRoR3JvdW5kU3RhdGUoc3RhdGVTdG9yZSk7XG5cbiAgY29uc3QgdXBkYXRlU3RvcmFnZU5vZGUgPSBtYWtlTGFzdFdpbnNVcGRhdGVyKFxuICAgIGRlZmF1bHRTdGF0ZVN0b3JlLFxuICAgIG1hcnNoYWxsZXIsXG4gICAgc3RvcmFnZU5vZGUsXG4gICk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY29vcmQgPSBGYXIoJ3N0b3JlIGNhY2hlIGNvb3JkaW5hdG9yJywge1xuICAgIGdldFJlY2VudFZhbHVlOiBhc3luYyBrZXkgPT4ge1xuICAgICAgY29uc3Qga2V5U3RyID0gYXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbiAgICAgIHJldHVybiBkZWZhdWx0U3RhdGVTdG9yZS5nZXQoa2V5U3RyKS52YWx1ZTtcbiAgICB9LFxuICAgIHNldENhY2hlVmFsdWU6IGFzeW5jIChrZXksIG5ld1ZhbHVlLCBndWFyZFBhdHRlcm4pID0+IHtcbiAgICAgIGNvbnN0IGtleVN0ciA9IGF3YWl0IHNlcmlhbGl6ZVBhc3NhYmxlKGtleSk7XG4gICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IGF3YWl0IGFwcGx5Q2FjaGVUcmFuc2FjdGlvbihcbiAgICAgICAga2V5U3RyLFxuICAgICAgICAoKSA9PiBuZXdWYWx1ZSxcbiAgICAgICAgZ3VhcmRQYXR0ZXJuLFxuICAgICAgICBzYW5pdGl6ZSxcbiAgICAgICAgZGVmYXVsdFN0YXRlU3RvcmUsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN0b3JhZ2VOb2RlKHN0b3JlZFZhbHVlKTtcbiAgICB9LFxuICAgIHVwZGF0ZUNhY2hlVmFsdWU6IGFzeW5jIChrZXksIHVwZGF0ZXIsIGd1YXJkUGF0dGVybikgPT4ge1xuICAgICAgY29uc3Qga2V5U3RyID0gYXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbiAgICAgIGNvbnN0IHN0b3JlZFZhbHVlID0gYXdhaXQgYXBwbHlDYWNoZVRyYW5zYWN0aW9uKFxuICAgICAgICBrZXlTdHIsXG4gICAgICAgIG9sZFZhbHVlID0+IEUodXBkYXRlcikudXBkYXRlKG9sZFZhbHVlKSxcbiAgICAgICAgZ3VhcmRQYXR0ZXJuLFxuICAgICAgICBzYW5pdGl6ZSxcbiAgICAgICAgZGVmYXVsdFN0YXRlU3RvcmUsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN0b3JhZ2VOb2RlKHN0b3JlZFZhbHVlKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGNvb3JkO1xufTskaM2PX29uY2UubWFrZUNoYWluU3RvcmFnZUNvb3JkaW5hdG9yKG1ha2VDaGFpblN0b3JhZ2VDb29yZGluYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciI6WyJtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciJdLCJtYWtlQ2hhaW5TdG9yYWdlQ29vcmRpbmF0b3IiOlsibWFrZUNoYWluU3RvcmFnZUNvb3JkaW5hdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAYWdvcmljL2NhY2hlLXYwLjMuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQ3BZJaMfAACjHwAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVtb3RhYmxlID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChuYXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoY29weVNldE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKGNvcHlCYWdNYXRoSGVscGVycyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLy9cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBBc3NldEtpbmQgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICBOQVQ6ICduYXQnLFxuICBTRVQ6ICdzZXQnLFxuICBDT1BZX1NFVDogJ2NvcHlTZXQnLFxuICBDT1BZX0JBRzogJ2NvcHlCYWcnLFxufSk7JGjNj19vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuaGFyZGVuKEFzc2V0S2luZCk7XG5jb25zdCBhc3NldEtpbmROYW1lcyA9IGhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBhc3NlcnRBc3NldEtpbmQgPSBhbGxlZ2VkQUsgPT4ge1xuICBhc3NldEtpbmROYW1lcy5pbmNsdWRlcyhhbGxlZ2VkQUspIHx8XG4gICAgRmFpbGBUaGUgYXNzZXRLaW5kICR7YWxsZWdlZEFLfSBtdXN0IGJlIG9uZSBvZiAke3EoYXNzZXRLaW5kTmFtZXMpfWA7XG59OyRozY9fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgaGVscGVycyA9IHtcbiAgbmF0OiBuYXRNYXRoSGVscGVycyxcbiAgc2V0OiBzZXRNYXRoSGVscGVycyxcbiAgY29weVNldDogY29weVNldE1hdGhIZWxwZXJzLFxuICBjb3B5QmFnOiBjb3B5QmFnTWF0aEhlbHBlcnMsXG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQgPSB2YWx1ZSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbHVlKTtcbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gJ25hdCc7XG4gIH1cbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKG1hdGNoZXModmFsdWUsIE0uc2V0KCkpKSB7XG4gICAgcmV0dXJuICdjb3B5U2V0JztcbiAgfVxuICBpZiAobWF0Y2hlcyh2YWx1ZSwgTS5iYWcoKSkpIHtcbiAgICByZXR1cm4gJ2NvcHlCYWcnO1xuICB9XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIHRocm93IEZhaWxgdmFsdWUgJHt2YWx1ZX0gbXVzdCBiZSBhIGJpZ2ludCwgY29weVNldCwgY29weUJhZywgb3IgYW4gYXJyYXksIG5vdCAke3EoXG4gICAgcGFzc1N0eWxlLFxuICApfWA7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRWYWx1ZUdldEhlbHBlcnMgPSB2YWx1ZSA9PlxuICAvL1xuICBoZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qXG5cbiAqLyRozY9fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjayA9IChhbGxlZ2VkQnJhbmQsIGJyYW5kKSA9PiB7XG4gIGlmIChicmFuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBhbGxlZ2VkQnJhbmQgPT09IGJyYW5kIHx8XG4gICAgICBGYWlsYGFtb3VudCdzIGJyYW5kICR7cShhbGxlZ2VkQnJhbmQpfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGJyYW5kICR7cShcbiAgICAgICAgYnJhbmQsXG4gICAgICApfWA7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja0xSQW5kR2V0SGVscGVycyA9IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgYXNzZXJ0UmVjb3JkKGxlZnRBbW91bnQsICdsZWZ0QW1vdW50Jyk7XG4gIGFzc2VydFJlY29yZChyaWdodEFtb3VudCwgJ3JpZ2h0QW1vdW50Jyk7XG4gIGNvbnN0IHsgdmFsdWU6IGxlZnRWYWx1ZSwgYnJhbmQ6IGxlZnRCcmFuZCB9ID0gbGVmdEFtb3VudDtcbiAgY29uc3QgeyB2YWx1ZTogcmlnaHRWYWx1ZSwgYnJhbmQ6IHJpZ2h0QnJhbmQgfSA9IHJpZ2h0QW1vdW50O1xuICBhc3NlcnRSZW1vdGFibGUobGVmdEJyYW5kLCAnbGVmdEJyYW5kJyk7XG4gIGFzc2VydFJlbW90YWJsZShyaWdodEJyYW5kLCAncmlnaHRCcmFuZCcpO1xuICBvcHRpb25hbEJyYW5kQ2hlY2sobGVmdEJyYW5kLCBicmFuZCk7XG4gIG9wdGlvbmFsQnJhbmRDaGVjayhyaWdodEJyYW5kLCBicmFuZCk7XG4gIGxlZnRCcmFuZCA9PT0gcmlnaHRCcmFuZCB8fFxuICAgIEZhaWxgQnJhbmRzIGluIGxlZnQgJHtxKGxlZnRCcmFuZCl9IGFuZCByaWdodCAke3EoXG4gICAgICByaWdodEJyYW5kLFxuICAgICl9IHNob3VsZCBtYXRjaCBidXQgZG8gbm90YDtcbiAgY29uc3QgbGVmdEhlbHBlcnMgPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbiAgY29uc3QgcmlnaHRIZWxwZXJzID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xuICBsZWZ0SGVscGVycyA9PT0gcmlnaHRIZWxwZXJzIHx8XG4gICAgRmFpbGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYDtcbiAgcmV0dXJuIGxlZnRIZWxwZXJzO1xufTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGNvZXJjZUxSID0gKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSA9PiB7XG4gIC8vXG4gIHJldHVybiBbaC5kb0NvZXJjZShsZWZ0QW1vdW50LnZhbHVlKSwgaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzR1RFID0gKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgcmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IEFtb3VudE1hdGggPSB7XG4gIC8vXG4gIC8vXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIG1ha2U6IChicmFuZCwgYWxsZWdlZFZhbHVlKSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBjb25zdCBoID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb2VyY2U6IChicmFuZCwgYWxsZWdlZEFtb3VudCkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kOiBhbGxlZ2VkQnJhbmQsIHZhbHVlOiBhbGxlZ2VkVmFsdWUgfSA9IGFsbGVnZWRBbW91bnQ7XG4gICAgYnJhbmQgPT09IGFsbGVnZWRCcmFuZCB8fFxuICAgICAgRmFpbGBUaGUgYnJhbmQgaW4gdGhlIGFsbGVnZWRBbW91bnQgJHthbGxlZ2VkQW1vdW50fSBpbiAnY29lcmNlJyBkaWRuJ3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBicmFuZCAke2JyYW5kfS5gO1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLCBhbGxlZ2VkVmFsdWUpO1xuICB9LFxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgZ2V0VmFsdWU6IChicmFuZCwgYW1vdW50KSA9PiBBbW91bnRNYXRoLmNvZXJjZShicmFuZCwgYW1vdW50KS52YWx1ZSxcbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgbWFrZUVtcHR5OiAoYnJhbmQsIGFzc2V0S2luZCA9IC8qICAgICAgICAgICAgICAgICovICgnbmF0JykpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgbWFrZUVtcHR5RnJvbUFtb3VudDogYW1vdW50ID0+IHtcbiAgICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZCwgdmFsdWUgfSA9IGFtb3VudDtcbiAgICBjb25zdCBhc3NldEtpbmQgPSBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4gICAgLy9cbiAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG4gIH0sXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgaXNFbXB0eTogKGFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZDogYWxsZWdlZEJyYW5kLCB2YWx1ZSB9ID0gYW1vdW50O1xuICAgIGFzc2VydFJlbW90YWJsZShhbGxlZ2VkQnJhbmQsICdicmFuZCcpO1xuICAgIG9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsIGJyYW5kKTtcbiAgICBjb25zdCBoID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHZhbHVlKTtcbiAgICByZXR1cm4gaC5kb0lzRW1wdHkoaC5kb0NvZXJjZSh2YWx1ZSkpO1xuICB9LFxuICBpc0dURSxcbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBpc0VxdWFsOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgcmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gIH0sXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgYWRkOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQWRkKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kOiBsZWZ0QW1vdW50LmJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIHN1YnRyYWN0OiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvU3VidHJhY3QoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbiAgICAvL1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZDogbGVmdEFtb3VudC5icmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIG1pbjogKHgsIHksIGJyYW5kID0gdW5kZWZpbmVkKSA9PlxuICAgIC8vXG4gICAgaXNHVEUoeCwgeSwgYnJhbmQpXG4gICAgICA/IHlcbiAgICAgIDogaXNHVEUoeSwgeCwgYnJhbmQpXG4gICAgICAgID8geFxuICAgICAgICA6IEZhaWxgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgbWF4OiAoeCwgeSwgYnJhbmQgPSB1bmRlZmluZWQpID0+XG4gICAgLy9cbiAgICBpc0dURSh4LCB5LCBicmFuZClcbiAgICAgID8geFxuICAgICAgOiBpc0dURSh5LCB4KVxuICAgICAgICA/IHlcbiAgICAgICAgOiBGYWlsYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWAsXG59OyRozY9fb25jZS5BbW91bnRNYXRoKEFtb3VudE1hdGgpO1xuaGFyZGVuKEFtb3VudE1hdGgpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGdldEFzc2V0S2luZCA9IGFtb3VudCA9PiB7XG4gIGFzc2VydFJlY29yZChhbW91bnQsICdhbW91bnQnKTtcbiAgY29uc3QgeyB2YWx1ZSB9ID0gYW1vdW50O1xuICByZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xufTskaM2PX29uY2UuZ2V0QXNzZXRLaW5kKGdldEFzc2V0S2luZCk7XG5oYXJkZW4oZ2V0QXNzZXRLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl0sIkFtb3VudE1hdGgiOlsiQW1vdW50TWF0aCJdLCJnZXRBc3NldEtpbmQiOlsiZ2V0QXNzZXRLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABMaWlIxBAAAMQQAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50U3RvcmUuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIl0sImV4cG9ydHMiOlsibWFrZUFtb3VudFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50TWF0aDskaM2PX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXV0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBbW91bnRTdG9yZSA9IChzdGF0ZSwga2V5KSA9PiB7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGdldEFtb3VudDogKCkgPT4gc3RhdGVba2V5XSxcbiAgICBpbmNyZW1lbnQ6IGRlbHRhID0+IHtcbiAgICAgIHN0YXRlW2tleV0gPSBBbW91bnRNYXRoLmFkZChzdGF0ZVtrZXldLCBkZWx0YSk7XG4gICAgfSxcbiAgICBkZWNyZW1lbnQ6IGRlbHRhID0+IHtcbiAgICAgIGlmIChBbW91bnRNYXRoLmlzR1RFKHN0YXRlW2tleV0sIGRlbHRhKSkge1xuICAgICAgICBzdGF0ZVtrZXldID0gQW1vdW50TWF0aC5zdWJ0cmFjdChzdGF0ZVtrZXldLCBkZWx0YSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUFtb3VudFN0b3JlKG1ha2VBbW91bnRTdG9yZSk7XG5oYXJkZW4obWFrZUFtb3VudFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBbW91bnRTdG9yZSI6WyJtYWtlQW1vdW50U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuDuMpAcGAAAHBgAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9kaXNwbGF5SW5mby5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG11c3RNYXRjaCxEaXNwbGF5SW5mb1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLFskaM2PX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZURpc3BsYXlJbmZvID0gKGFsbGVnZWREaXNwbGF5SW5mbywgYXNzZXRLaW5kKSA9PiB7XG4gIG11c3RNYXRjaChhbGxlZ2VkRGlzcGxheUluZm8sIERpc3BsYXlJbmZvU2hhcGUsICdkaXNwbGF5SW5mbycpO1xuXG4gIGlmIChhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kID09PSBhc3NldEtpbmQgfHxcbiAgICAgIEZhaWxgZGlzcGxheUluZm8uYXNzZXRLaW5kIHdhcyBwcmVzZW50ICgke2FsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmR9KSBhbmQgZGlkIG5vdCBtYXRjaCB0aGUgYXNzZXRLaW5kIGFyZ3VtZW50ICgke2Fzc2V0S2luZH0pYDtcbiAgfVxuICBjb25zdCBkaXNwbGF5SW5mbyA9IGhhcmRlbih7IC4uLmFsbGVnZWREaXNwbGF5SW5mbywgYXNzZXRLaW5kIH0pO1xuXG4gIGlmIChkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBOdW1iZXIuaXNTYWZlSW50ZWdlcihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzKSB8fFxuICAgICAgRmFpbGBkZWNpbWFsUGxhY2VzICR7ZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlc30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYDtcbiAgfVxuXG4gIHJldHVybiBkaXNwbGF5SW5mbztcbn07JGjNj19vbmNlLmNvZXJjZURpc3BsYXlJbmZvKGNvZXJjZURpc3BsYXlJbmZvKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvZXJjZURpc3BsYXlJbmZvIjpbImNvZXJjZURpc3BsYXlJbmZvIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPNfTQNNAgAATQIAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbXV0sW1wiLi9pc3N1ZXJLaXQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACdZOlhHRgAAB0YAAAlAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2lzc3VlcktpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIiwiLi9hbW91bnRNYXRoLmpzIiwiLi9kaXNwbGF5SW5mby5qcyIsIi4vcGF5bWVudExlZGdlci5qcyJdLCJleHBvcnRzIjpbImhhc0lzc3VlciIsIm1ha2VEdXJhYmxlSXNzdWVyS2l0IiwibWFrZUlzc3VlcktpdCIsInByZXBhcmVJc3N1ZXJLaXQiLCJ1cGdyYWRlSXNzdWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0LEZhaWwsYXNzZXJ0UGF0dGVybixtYWtlU2NhbGFyQmlnTWFwU3RvcmUsbWFrZUR1cmFibGVab25lLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8scHJlcGFyZVBheW1lbnRMZWRnZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b25lL2R1cmFibGUuanNcIiwgW1tcIm1ha2VEdXJhYmxlWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VEdXJhYmxlWm9uZSA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoQXNzZXRLaW5kID0gJGjNj19hKV1dLFtcImFzc2VydEFzc2V0S2luZFwiLFskaM2PX2EgPT4gKGFzc2VydEFzc2V0S2luZCA9ICRozY9fYSldXV1dLFtcIi4vZGlzcGxheUluZm8uanNcIiwgW1tcImNvZXJjZURpc3BsYXlJbmZvXCIsWyRozY9fYSA9PiAoY29lcmNlRGlzcGxheUluZm8gPSAkaM2PX2EpXV1dXSxbXCIuL3BheW1lbnRMZWRnZXIuanNcIiwgW1tcInByZXBhcmVQYXltZW50TGVkZ2VyXCIsWyRozY9fYSA9PiAocHJlcGFyZVBheW1lbnRMZWRnZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2V0dXBJc3N1ZXJLaXQgPSAoXG4gIHsgbmFtZSwgYXNzZXRLaW5kLCBkaXNwbGF5SW5mbywgZWxlbWVudFNoYXBlIH0sXG4gIGlzc3VlclpvbmUsXG4gIHJlY292ZXJ5U2V0c1N0YXRlLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICBhc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcblxuICAvL1xuICBjb25zdCBjbGVhbkRpc3BsYXlJbmZvID0gY29lcmNlRGlzcGxheUluZm8oZGlzcGxheUluZm8sIGFzc2V0S2luZCk7XG4gIGlmIChvcHRTaHV0ZG93bldpdGhGYWlsdXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKG9wdFNodXRkb3duV2l0aEZhaWx1cmUsICdmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKGVsZW1lbnRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihlbGVtZW50U2hhcGUpO1xuICB9XG5cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvL1xuICBjb25zdCB7IGlzc3VlciwgbWludCwgYnJhbmQsIG1pbnRSZWNvdmVyeVB1cnNlIH0gPSBwcmVwYXJlUGF5bWVudExlZGdlcihcbiAgICBpc3N1ZXJab25lLFxuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGNsZWFuRGlzcGxheUluZm8sXG4gICAgZWxlbWVudFNoYXBlLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgYnJhbmQsXG4gICAgaXNzdWVyLFxuICAgIG1pbnQsXG4gICAgbWludFJlY292ZXJ5UHVyc2UsXG4gICAgZGlzcGxheUluZm86IGNsZWFuRGlzcGxheUluZm8sXG4gIH0pO1xufTtcbmhhcmRlbihzZXR1cElzc3VlcktpdCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IElOU1RBTkNFX0tFWSA9ICdpc3N1ZXInO1xuLypcblxuXG5cbiAqL1xuY29uc3QgUkVDT1ZFUllfU0VUU19TVEFURSA9ICdyZWNvdmVyeVNldHNTdGF0ZSc7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB1cGdyYWRlSXNzdWVyS2l0ID0gKFxuICBpc3N1ZXJCYWdnYWdlLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgaXNzdWVyUmVjb3JkID0gaXNzdWVyQmFnZ2FnZS5nZXQoSU5TVEFOQ0VfS0VZKTtcbiAgY29uc3QgaXNzdWVyWm9uZSA9IG1ha2VEdXJhYmxlWm9uZShpc3N1ZXJCYWdnYWdlKTtcbiAgY29uc3Qgb2xkUmVjb3ZlcnlTZXRzU3RhdGUgPSBpc3N1ZXJCYWdnYWdlLmhhcyhSRUNPVkVSWV9TRVRTX1NUQVRFKVxuICAgID8gaXNzdWVyQmFnZ2FnZS5nZXQoUkVDT1ZFUllfU0VUU19TVEFURSlcbiAgICA6ICdoYXNSZWNvdmVyeVNldHMnO1xuICBpZiAoXG4gICAgb2xkUmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cycgJiZcbiAgICByZWNvdmVyeVNldHNPcHRpb24gPT09ICdoYXNSZWNvdmVyeVNldHMnXG4gICkge1xuICAgIEZhaWxgQ2Fubm90ICh5ZXQ/KSB1cGdyYWRlIGZyb20gJ25vUmVjb3ZlcnlTZXRzJyB0byAnaGFzUmVjb3ZlcnlTZXRzJ2A7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgcmVjb3ZlcnlTZXRzU3RhdGUgPSByZWNvdmVyeVNldHNPcHRpb24gfHwgb2xkUmVjb3ZlcnlTZXRzU3RhdGU7XG4gIHJldHVybiBzZXR1cElzc3VlcktpdChcbiAgICBpc3N1ZXJSZWNvcmQsXG4gICAgaXNzdWVyWm9uZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICApO1xufTskaM2PX29uY2UudXBncmFkZUlzc3VlcktpdCh1cGdyYWRlSXNzdWVyS2l0KTtcbmhhcmRlbih1cGdyYWRlSXNzdWVyS2l0KTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGhhc0lzc3VlciA9IGJhZ2dhZ2UgPT4gYmFnZ2FnZS5oYXMoSU5TVEFOQ0VfS0VZKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmhhc0lzc3VlcihoYXNJc3N1ZXIpO1xuICAgICAgIGNvbnN0IG1ha2VEdXJhYmxlSXNzdWVyS2l0ID0gKFxuICBpc3N1ZXJCYWdnYWdlLFxuICBuYW1lLFxuICAvL1xuICBhc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuICBkaXNwbGF5SW5mbyA9IGhhcmRlbih7fSksXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIHsgZWxlbWVudFNoYXBlID0gdW5kZWZpbmVkLCByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGlzc3VlckRhdGEgPSBoYXJkZW4oe1xuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGRpc3BsYXlJbmZvLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgfSk7XG4gIGlzc3VlckJhZ2dhZ2UuaW5pdChJTlNUQU5DRV9LRVksIGlzc3VlckRhdGEpO1xuICBjb25zdCBpc3N1ZXJab25lID0gbWFrZUR1cmFibGVab25lKGlzc3VlckJhZ2dhZ2UpO1xuICBjb25zdCByZWNvdmVyeVNldHNTdGF0ZSA9IHJlY292ZXJ5U2V0c09wdGlvbiB8fCAnaGFzUmVjb3ZlcnlTZXRzJztcbiAgaXNzdWVyQmFnZ2FnZS5pbml0KFJFQ09WRVJZX1NFVFNfU1RBVEUsIHJlY292ZXJ5U2V0c1N0YXRlKTtcbiAgcmV0dXJuIHNldHVwSXNzdWVyS2l0KFxuICAgIGlzc3VlckRhdGEsXG4gICAgaXNzdWVyWm9uZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICApO1xufTskaM2PX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUlzc3VlcktpdCA9IChcbiAgaXNzdWVyQmFnZ2FnZSxcbiAgbmFtZSxcbiAgLy9cbiAgYXNzZXRLaW5kID0gQXNzZXRLaW5kLk5BVCxcbiAgZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICAvL1xuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgaWYgKGhhc0lzc3Vlcihpc3N1ZXJCYWdnYWdlKSkge1xuICAgIGNvbnN0IHsgZWxlbWVudFNoYXBlOiBfID0gdW5kZWZpbmVkLCByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQgfSA9XG4gICAgICBvcHRpb25zO1xuICAgIGNvbnN0IGlzc3VlcktpdCA9IHVwZ3JhZGVJc3N1ZXJLaXQoXG4gICAgICBpc3N1ZXJCYWdnYWdlLFxuICAgICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICAgIHJlY292ZXJ5U2V0c09wdGlvbixcbiAgICApO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuXG4gICAgLy9cbiAgICByZXR1cm4gaXNzdWVyS2l0O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGlzc3VlcktpdCA9IG1ha2VEdXJhYmxlSXNzdWVyS2l0KFxuICAgICAgaXNzdWVyQmFnZ2FnZSxcbiAgICAgIG5hbWUsXG4gICAgICBhc3NldEtpbmQsXG4gICAgICBkaXNwbGF5SW5mbyxcbiAgICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gICAgLy9cbiAgICByZXR1cm4gaXNzdWVyS2l0O1xuICB9XG59OyRozY9fb25jZS5wcmVwYXJlSXNzdWVyS2l0KHByZXBhcmVJc3N1ZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJc3N1ZXJLaXQgPSAoXG4gIG5hbWUsXG4gIC8vXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgLy9cbiAgeyBlbGVtZW50U2hhcGUgPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+XG4gIC8vXG4gIG1ha2VEdXJhYmxlSXNzdWVyS2l0KFxuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0JywgeyBkdXJhYmxlOiB0cnVlIH0pLFxuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGRpc3BsYXlJbmZvLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICAgeyBlbGVtZW50U2hhcGUsIHJlY292ZXJ5U2V0c09wdGlvbiB9LFxuICApOyRozY9fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidXBncmFkZUlzc3VlcktpdCI6WyJ1cGdyYWRlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAANWNIbvAUAALwFAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5RVEsbWFrZUNvcHlCYWcsbXVzdE1hdGNoLE0sZ2V0Q29weUJhZ0VudHJpZXMsYmFnSXNTdXBlcmJhZyxiYWdVbmlvbixiYWdEaXNqb2ludFN1YnRyYWN0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlQ29weUJhZ1wiLFskaM2PX2EgPT4gKG1ha2VDb3B5QmFnID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIixbJGjNj19hID0+IChiYWdJc1N1cGVyYmFnID0gJGjNj19hKV1dLFtcImJhZ1VuaW9uXCIsWyRozY9fYSA9PiAoYmFnVW5pb24gPSAkaM2PX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKGJhZ0Rpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weUJhZyhbXSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgY29weUJhZ01hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IGJhZyA9PiB7XG4gICAgbXVzdE1hdGNoKGJhZywgTS5iYWcoKSwgJ2JhZyBvZiBhbW91bnQnKTtcbiAgICByZXR1cm4gYmFnO1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogYmFnID0+IGdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBiYWdJc1N1cGVyYmFnLFxuICBkb0lzRXF1YWw6IGtleUVRLFxuICBkb0FkZDogYmFnVW5pb24sXG4gIGRvU3VidHJhY3Q6IGJhZ0Rpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2UuY29weUJhZ01hdGhIZWxwZXJzKGNvcHlCYWdNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKGY8YTQBQAA0AUAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBrZXlFUSxtYWtlQ29weVNldCxtdXN0TWF0Y2gsTSxnZXRDb3B5U2V0S2V5cyxzZXRJc1N1cGVyc2V0LHNldERpc2pvaW50VW5pb24sc2V0RGlzam9pbnRTdWJ0cmFjdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsWyRozY9fYSA9PiAoc2V0SXNTdXBlcnNldCA9ICRozY9fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsWyRozY9fYSA9PiAoc2V0RGlzam9pbnRVbmlvbiA9ICRozY9fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoc2V0RGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG5jb25zdCBlbXB0eSA9IG1ha2VDb3B5U2V0KFtdKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBjb3B5U2V0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogc2V0ID0+IHtcbiAgICBtdXN0TWF0Y2goc2V0LCBNLnNldCgpLCAnc2V0IG9mIGFtb3VudCcpO1xuICAgIHJldHVybiBzZXQ7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBzZXQgPT4gZ2V0Q29weVNldEtleXMoc2V0KS5sZW5ndGggPT09IDAsXG4gIGRvSXNHVEU6IHNldElzU3VwZXJzZXQsXG4gIGRvSXNFcXVhbDoga2V5RVEsXG4gIGRvQWRkOiBzZXREaXNqb2ludFVuaW9uLFxuICBkb1N1YnRyYWN0OiBzZXREaXNqb2ludFN1YnRyYWN0LFxufSk7JGjNj19vbmNlLmNvcHlTZXRNYXRoSGVscGVycyhjb3B5U2V0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weVNldE1hdGhIZWxwZXJzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADzavU6uwQAALsEAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxOYXQsaXNOYXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV0sW1wiaXNOYXRcIixbJGjNj19hID0+IChpc05hdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBlbXB0eSA9IDBuO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbmF0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogbmF0ID0+IHtcbiAgICAvL1xuICAgIGFzc2VydC50eXBlb2YobmF0LCAnYmlnaW50Jyk7XG4gICAgaXNOYXQobmF0KSB8fCBGYWlsYHZhbHVlICR7bmF0fSBtdXN0IGJlIGEgbmF0dXJhbCBudW1iZXJgO1xuICAgIHJldHVybiBOYXQobmF0KTtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IG5hdCA9PiBuYXQgPT09IGVtcHR5LFxuICBkb0lzR1RFOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgPj0gcmlnaHQsXG4gIGRvSXNFcXVhbDogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID09PSByaWdodCxcbiAgLy9cbiAgZG9BZGQ6IChsZWZ0LCByaWdodCkgPT4gbGVmdCArIHJpZ2h0LFxuICBkb1N1YnRyYWN0OiAobGVmdCwgcmlnaHQpID0+IE5hdChsZWZ0IC0gcmlnaHQpLFxufSk7JGjNj19vbmNlLm5hdE1hdGhIZWxwZXJzKG5hdE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIH6h8aYBgAAmAYAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJzZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGFzc2VydEtleSxlbGVtZW50c0lzU3VwZXJzZXQsZWxlbWVudHNEaXNqb2ludFVuaW9uLGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxjb2VyY2VUb0VsZW1lbnRzLGVsZW1lbnRzQ29tcGFyZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsWyRozY9fYSA9PiAoZWxlbWVudHNJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLFskaM2PX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9ICRozY9fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLFskaM2PX2EgPT4gKGNvZXJjZVRvRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsWyRozY9fYSA9PiAoZWxlbWVudHNDb21wYXJlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZW1wdHkgPSBoYXJkZW4oW10pO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHNldE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IGxpc3QgPT4ge1xuICAgIGxpc3QgPSBjb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgYXNzZXJ0S2V5KGxpc3QpO1xuICAgIHJldHVybiBsaXN0O1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogbGlzdCA9PiBwYXNzU3R5bGVPZihsaXN0KSA9PT0gJ2NvcHlBcnJheScgJiYgbGlzdC5sZW5ndGggPT09IDAsXG4gIGRvSXNHVEU6IGVsZW1lbnRzSXNTdXBlcnNldCxcbiAgZG9Jc0VxdWFsOiAoeCwgeSkgPT4gZWxlbWVudHNDb21wYXJlKHgsIHkpID09PSAwLFxuICBkb0FkZDogZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuICBkb1N1YnRyYWN0OiBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2Uuc2V0TWF0aEhlbHBlcnMoc2V0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoi6VfZoDAACaAwAAIwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbml0RW1wdHk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIixbJGjNj19hID0+IChpbml0RW1wdHkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQYXltZW50S2luZCA9IChpc3N1ZXJab25lLCBuYW1lLCBicmFuZCwgUGF5bWVudEkpID0+IHtcbiAgY29uc3QgbWFrZVBheW1lbnQgPSBpc3N1ZXJab25lLmV4b0NsYXNzKFxuICAgIGAke25hbWV9IHBheW1lbnRgLFxuICAgIFBheW1lbnRJLFxuICAgIGluaXRFbXB0eSxcbiAgICB7XG4gICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBicmFuZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgLy9cbiAgcmV0dXJuIG1ha2VQYXltZW50O1xufTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRLaW5kKHByZXBhcmVQYXltZW50S2luZCk7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50S2luZCI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAslt9GjAlAAAwJQAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGF0dGVybnMiLCIuL2Ftb3VudE1hdGguanMiLCIuL3BheW1lbnQuanMiLCIuL3B1cnNlLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsYW5ub3RhdGVFcnJvcixYLGlzUHJvbWlzZSxtdXN0TWF0Y2gsTSxrZXlFUSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsWyRozY9fYSA9PiAocHJlcGFyZVBheW1lbnRLaW5kID0gJGjNj19hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLFskaM2PX2EgPT4gKHByZXBhcmVQdXJzZUtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLFskaM2PX2EgPT4gKEJyYW5kSSA9ICRozY9fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLFskaM2PX2EgPT4gKG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUgPSAoYnJhbmQsIGFzc2V0S2luZCwgZWxlbWVudFNoYXBlKSA9PiB7XG4gIGxldCB2YWx1ZVNoYXBlO1xuICBzd2l0Y2ggKGFzc2V0S2luZCkge1xuICAgIGNhc2UgJ25hdCc6IHtcbiAgICAgIHZhbHVlU2hhcGUgPSBNLm5hdCgpO1xuICAgICAgZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3NldCc6IHtcbiAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5hcnJheU9mKE0ua2V5KCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmFuZChNLmtleSgpLCBlbGVtZW50U2hhcGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLnNldCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmJhZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBGYWlsYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFtb3VudFNoYXBlID0gaGFyZGVuKHtcbiAgICBicmFuZCwgLy9cbiAgICB2YWx1ZTogdmFsdWVTaGFwZSxcbiAgfSk7XG4gIHJldHVybiBhbW91bnRTaGFwZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUGF5bWVudExlZGdlciA9IChcbiAgaXNzdWVyWm9uZSxcbiAgbmFtZSxcbiAgYXNzZXRLaW5kLFxuICBkaXNwbGF5SW5mbyxcbiAgZWxlbWVudFNoYXBlLFxuICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICAvL1xuICBjb25zdCBicmFuZCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IGJyYW5kYCwgQnJhbmRJLCB7XG4gICAgaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGFsbGVnZWRJc3N1ZXIgPT09IGlzc3VlcjtcbiAgICB9LFxuICAgIGdldEFsbGVnZWROYW1lKCkge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSxcbiAgICAvL1xuICAgIGdldERpc3BsYXlJbmZvKCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlJbmZvO1xuICAgIH0sXG4gICAgZ2V0QW1vdW50U2hhcGUoKSB7XG4gICAgICByZXR1cm4gYW1vdW50U2hhcGU7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgYW1vdW50U2hhcGUgPSBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG4gICAgYnJhbmQsXG4gICAgYXNzZXRLaW5kLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgKTtcblxuICBjb25zdCB7IElzc3VlckksIE1pbnRJLCBQYXltZW50SSwgUHVyc2VJS2l0IH0gPSBtYWtlSXNzdWVySW50ZXJmYWNlcyhcbiAgICBicmFuZCxcbiAgICBhc3NldEtpbmQsXG4gICAgYW1vdW50U2hhcGUsXG4gICk7XG5cbiAgY29uc3QgbWFrZVBheW1lbnQgPSBwcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyWm9uZSwgbmFtZSwgYnJhbmQsIFBheW1lbnRJKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUgPSByZWFzb24gPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAob3B0U2h1dGRvd25XaXRoRmFpbHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlKHJlYXNvbik7XG4gICAgICB9IGNhdGNoIChlcnJJblNodXRkb3duKSB7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJySW5TaHV0ZG93biwgWGBDYXVzZWQgYnk6ICR7cmVhc29ufWApO1xuICAgICAgICB0aHJvdyBlcnJJblNodXRkb3duO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyByZWFzb247XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGF5bWVudExlZGdlciA9IGlzc3VlclpvbmUud2Vha01hcFN0b3JlKCdwYXltZW50TGVkZ2VyJywge1xuICAgIHZhbHVlU2hhcGU6IGFtb3VudFNoYXBlLFxuICB9KTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHMgPSBpc3N1ZXJab25lLndlYWtNYXBTdG9yZSgncGF5bWVudFJlY292ZXJ5U2V0cycpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBpbml0UGF5bWVudCA9IChwYXltZW50LCBhbW91bnQsIG9wdFJlY292ZXJ5U2V0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgd2hlbiByZWNvdmVyU2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnLCBvcHRSZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcbiAgICB9XG4gICAgaWYgKG9wdFJlY292ZXJ5U2V0ICE9PSB1bmRlZmluZWQgJiYgIUFtb3VudE1hdGguaXNFbXB0eShhbW91bnQpKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldC5hZGQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmluaXQocGF5bWVudCwgb3B0UmVjb3ZlcnlTZXQpO1xuICAgIH1cbiAgICBwYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCwgYW1vdW50KTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWxldGVQYXltZW50ID0gcGF5bWVudCA9PiB7XG4gICAgcGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG4gICAgaWYgKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKSB7XG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IHBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG4gICAgICByZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb2VyY2UgPSBhbGxlZ2VkQW1vdW50ID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbGxlZ2VkQW1vdW50KTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBhc3NlcnRBbW91bnRDb25zaXN0ZW50ID0gKHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSkgPT4ge1xuICAgIGlmIChvcHRBbW91bnRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2gocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlLCAnYW1vdW50Jyk7XG4gICAgfVxuICB9O1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgYXNzZXJ0TGl2ZVBheW1lbnQgPSBwYXltZW50ID0+IHtcbiAgICBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KSB8fFxuICAgICAgRmFpbGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbiAgICAgICAgYnJhbmQsXG4gICAgICApfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZGVwb3NpdEludGVybmFsID0gKFxuICAgIGJhbGFuY2VTdG9yZSxcbiAgICBzcmNQYXltZW50LFxuICAgIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICAhaXNQcm9taXNlKHNyY1BheW1lbnQpIHx8XG4gICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG4gICAgICAgIFR5cGVFcnJvcixcbiAgICAgICk7XG4gICAgYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG4gICAgY29uc3Qgc3JjUGF5bWVudEJhbGFuY2UgPSBwYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbiAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgdHJ5IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG4gICAgICBiYWxhbmNlU3RvcmUuaW5jcmVtZW50KHNyY1BheW1lbnRCYWxhbmNlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCB3aXRoZHJhd0ludGVybmFsID0gKGJhbGFuY2VTdG9yZSwgYW1vdW50LCByZWNvdmVyeVNldCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFtb3VudCA9IGNvZXJjZShhbW91bnQpO1xuICAgIGNvbnN0IHBheW1lbnQgPSBtYWtlUGF5bWVudCgpO1xuICAgIC8vXG4gICAgLy9cbiAgICBiYWxhbmNlU3RvcmUuZGVjcmVtZW50KGFtb3VudCkgfHxcbiAgICAgIEZhaWxgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7YmFsYW5jZVN0b3JlLmdldEFtb3VudCgpfWA7XG4gICAgdHJ5IHtcbiAgICAgIGluaXRQYXltZW50KHBheW1lbnQsIGFtb3VudCwgcmVjb3ZlcnlTZXQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bWVudDtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvL1xuICBjb25zdCBtYWtlRW1wdHlQdXJzZSA9IHByZXBhcmVQdXJzZUtpbmQoXG4gICAgaXNzdWVyWm9uZSxcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBicmFuZCxcbiAgICBQdXJzZUlLaXQsXG4gICAgaGFyZGVuKHtcbiAgICAgIGRlcG9zaXRJbnRlcm5hbCxcbiAgICAgIHdpdGhkcmF3SW50ZXJuYWwsXG4gICAgfSksXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgcGF5bWVudFJlY292ZXJ5U2V0cyxcbiAgKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgKi9cbiAgLy9cbiAgY29uc3QgaXNzdWVyID0gaXNzdWVyWm9uZS5leG8oYCR7bmFtZX0gaXNzdWVyYCwgSXNzdWVySSwge1xuICAgIGdldEJyYW5kKCkge1xuICAgICAgcmV0dXJuIGJyYW5kO1xuICAgIH0sXG4gICAgZ2V0QWxsZWdlZE5hbWUoKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIGdldEFzc2V0S2luZCgpIHtcbiAgICAgIHJldHVybiBhc3NldEtpbmQ7XG4gICAgfSxcbiAgICBnZXREaXNwbGF5SW5mbygpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5SW5mbztcbiAgICB9LFxuICAgIG1ha2VFbXB0eVB1cnNlKCkge1xuICAgICAgcmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBpc0xpdmUocGF5bWVudCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KTtcbiAgICB9LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGdldEFtb3VudE9mKHBheW1lbnQpIHtcbiAgICAgIC8vXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICB9LFxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGJ1cm4ocGF5bWVudCwgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQpIHtcbiAgICAgIC8vXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIGNvbnN0IHBheW1lbnRCYWxhbmNlID0gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gICAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvL1xuICAgICAgICBkZWxldGVQYXltZW50KHBheW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgbWludFJlY292ZXJ5UHVyc2UgPSAvKiAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgaXNzdWVyWm9uZS5tYWtlT25jZSgnbWludFJlY292ZXJ5UHVyc2UnLCAoKSA9PiBtYWtlRW1wdHlQdXJzZSgpKVxuICApO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWludCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IG1pbnRgLCBNaW50SSwge1xuICAgIGdldElzc3VlcigpIHtcbiAgICAgIHJldHVybiBpc3N1ZXI7XG4gICAgfSxcbiAgICBtaW50UGF5bWVudChuZXdBbW91bnQpIHtcbiAgICAgIG5ld0Ftb3VudCA9IGNvZXJjZShuZXdBbW91bnQpO1xuICAgICAgbXVzdE1hdGNoKG5ld0Ftb3VudCwgYW1vdW50U2hhcGUsICdtaW50ZWQgYW1vdW50Jyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHJhd1BheW1lbnQgPSBtYWtlUGF5bWVudCgpO1xuICAgICAgaW5pdFBheW1lbnQocmF3UGF5bWVudCwgbmV3QW1vdW50LCB1bmRlZmluZWQpO1xuXG4gICAgICBjb25zdCBtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSA9IG1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbiAgICAgIG1pbnRSZWNvdmVyeVB1cnNlLmRlcG9zaXQocmF3UGF5bWVudCwgbmV3QW1vdW50KTtcbiAgICAgIGNvbnN0IHBheW1lbnQgPSBtaW50UmVjb3ZlcnlQdXJzZS53aXRoZHJhdyhuZXdBbW91bnQpO1xuICAgICAgY29uc3QgbWludFJlY292ZXJ5UHVyc2VBZnRlciA9IG1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbiAgICAgIGFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSwgbWludFJlY292ZXJ5UHVyc2VBZnRlcikpO1xuICAgICAgcmV0dXJuIHBheW1lbnQ7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaXNzdWVyS2l0ID0gaGFyZGVuKHsgaXNzdWVyLCBtaW50LCBicmFuZCwgbWludFJlY292ZXJ5UHVyc2UgfSk7XG4gIHJldHVybiBpc3N1ZXJLaXQ7XG59OyRozY9fb25jZS5wcmVwYXJlUGF5bWVudExlZGdlcihwcmVwYXJlUGF5bWVudExlZGdlcik7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQAGa0MQUAADEFAAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyIsIi4vYW1vdW50U3RvcmUuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxNLG1ha2VDb3B5U2V0LEFtb3VudE1hdGgsbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0LG1ha2VBbW91bnRTdG9yZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLFskaM2PX2EgPT4gKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50U3RvcmUuanNcIiwgW1tcIm1ha2VBbW91bnRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VBbW91bnRTdG9yZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG5jb25zdCBFTVBUWV9DT1BZX1NFVCA9IG1ha2VDb3B5U2V0KFtdKTtcblxuLy9cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVB1cnNlS2luZCA9IChcbiAgaXNzdWVyWm9uZSxcbiAgbmFtZSxcbiAgYXNzZXRLaW5kLFxuICBicmFuZCxcbiAgUHVyc2VJS2l0LFxuICBwdXJzZU1ldGhvZHMsXG4gIHJlY292ZXJ5U2V0c1N0YXRlLFxuICBwYXltZW50UmVjb3ZlcnlTZXRzLFxuKSA9PiB7XG4gIGNvbnN0IGFtb3VudFNoYXBlID0gYnJhbmQuZ2V0QW1vdW50U2hhcGUoKTtcblxuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCB7IHByb3ZpZGVOb3RpZmllciwgdXBkYXRlOiB1cGRhdGVCYWxhbmNlIH0gPSBtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYXliZVJlY292ZXJ5U2V0ID0gc3RhdGUgPT4ge1xuICAgIGNvbnN0IHsgcmVjb3ZlcnlTZXQgfSA9IHN0YXRlO1xuICAgIGlmIChyZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ2hhc1JlY292ZXJ5U2V0cycpIHtcbiAgICAgIHJldHVybiByZWNvdmVyeVNldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cycgfHxcbiAgICAgICAgRmFpbGByZWNvdmVyU2V0c1N0YXRlIG11c3QgYmUgbm9SZWNvdmVyeVNldHMgaWYgaXQgaXNuJ3QgaGFzUmVjb3ZlclNldHNgO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgcGF5bWVudFJlY292ZXJ5U2V0cyBtdXN0IGFsd2F5cyBiZSBkZWZpbmVkYDtcbiAgICAgIHJlY292ZXJ5U2V0LmdldFNpemUoKSA9PT0gMCB8fFxuICAgICAgICBGYWlsYFdpdGggbm9SZWNvdmVyeVNldHMsIHJlY292ZXJ5U2V0IG11c3QgYmUgZW1wdHlgO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCB7IGRlcG9zaXRJbnRlcm5hbCwgd2l0aGRyYXdJbnRlcm5hbCB9ID0gcHVyc2VNZXRob2RzO1xuICBjb25zdCBtYWtlUHVyc2VLaXQgPSBpc3N1ZXJab25lLmV4b0NsYXNzS2l0KFxuICAgIGAke25hbWV9IFB1cnNlYCxcbiAgICBQdXJzZUlLaXQsXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEJhbGFuY2UgPSBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCwgYXNzZXRLaW5kKTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IHJlY292ZXJ5U2V0ID0gaXNzdWVyWm9uZS5kZXRhY2hlZCgpLnNldFN0b3JlKCdyZWNvdmVyeSBzZXQnKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudEJhbGFuY2UsXG4gICAgICAgIHJlY292ZXJ5U2V0LFxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIHB1cnNlOiB7XG4gICAgICAgIGRlcG9zaXQoc3JjUGF5bWVudCwgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHB1cnNlIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCBiYWxhbmNlU3RvcmUgPSBtYWtlQW1vdW50U3RvcmUoc3RhdGUsICdjdXJyZW50QmFsYW5jZScpO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3Qgc3JjUGF5bWVudEJhbGFuY2UgPSBkZXBvc2l0SW50ZXJuYWwoXG4gICAgICAgICAgICBiYWxhbmNlU3RvcmUsXG4gICAgICAgICAgICBzcmNQYXltZW50LFxuICAgICAgICAgICAgb3B0QW1vdW50U2hhcGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVCYWxhbmNlKHB1cnNlLCBiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCkpO1xuICAgICAgICAgIHJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgd2l0aGRyYXcoYW1vdW50KSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHB1cnNlIH0gPSB0aGlzLmZhY2V0cztcblxuICAgICAgICAgIGNvbnN0IG9wdFJlY292ZXJ5U2V0ID0gbWF5YmVSZWNvdmVyeVNldChzdGF0ZSk7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IHBheW1lbnQgPSB3aXRoZHJhd0ludGVybmFsKFxuICAgICAgICAgICAgYmFsYW5jZVN0b3JlLFxuICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgb3B0UmVjb3ZlcnlTZXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVCYWxhbmNlKHB1cnNlLCBiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCkpO1xuICAgICAgICAgIHJldHVybiBwYXltZW50O1xuICAgICAgICB9LFxuICAgICAgICBnZXRDdXJyZW50QW1vdW50KCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICByZXR1cm4gYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEFsbGVnZWRCcmFuZCgpIHtcbiAgICAgICAgICByZXR1cm4gYnJhbmQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0RGVwb3NpdEZhY2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5kZXBvc2l0RmFjZXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0UmVjb3ZlcnlTZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGlmIChvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfQ09QWV9TRVQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvcHRSZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuICAgICAgICB9LFxuICAgICAgICByZWNvdmVyQWxsKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBsZXQgYW1vdW50ID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBpZiAob3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudDsgLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBwYXltZW50IG9mIG9wdFJlY292ZXJ5U2V0LmtleXMoKSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGZhY2V0cy5wdXJzZS5kZXBvc2l0KHBheW1lbnQpO1xuICAgICAgICAgICAgYW1vdW50ID0gQW1vdW50TWF0aC5hZGQoYW1vdW50LCBkZWx0YSwgYnJhbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcHRSZWNvdmVyeVNldC5nZXRTaXplKCkgPT09IDAgfHxcbiAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gO1xuICAgICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVwb3NpdEZhY2V0OiB7XG4gICAgICAgIHJlY2VpdmUoLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5wdXJzZS5kZXBvc2l0KC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IHtcbiAgICAgICAgY3VycmVudEJhbGFuY2U6IGFtb3VudFNoYXBlLFxuICAgICAgICByZWNvdmVyeVNldDogTS5yZW1vdGFibGUoJ3JlY292ZXJ5U2V0JyksXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG4gIHJldHVybiAoKSA9PiBtYWtlUHVyc2VLaXQoKS5wdXJzZTtcbn07JGjNj19vbmNlLnByZXBhcmVQdXJzZUtpbmQocHJlcGFyZVB1cnNlS2luZCk7XG5oYXJkZW4ocHJlcGFyZVB1cnNlS2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATZTGQzIGAAAyBgAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvbm90aWZpZXIiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLHByb3ZpZGVMYXp5LG1ha2VOb3RpZmllcktpdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIixbJGjNj19hID0+IChwcm92aWRlTGF6eSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllcktpdFwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLy9cbi8vXG4gICAgICAgY29uc3QgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHRyYW5zaWVudE5vdGlmZXJLaXRzID0gbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbiAgICAndHJhbnNpZW50Tm90aWZlcktpdHMnLFxuICApO1xuXG4gIGNvbnN0IHByb3ZpZGVOb3RpZmllcktpdCA9IGtleSA9PlxuICAgIHByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLCBrZXksICgpID0+XG4gICAgICBtYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSksXG4gICAgKTtcblxuICBjb25zdCBwcm92aWRlTm90aWZpZXIgPSBrZXkgPT4gcHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG4gIGNvbnN0IHVwZGF0ZSA9IChrZXksIG5ld1ZhbHVlKSA9PiB7XG4gICAgaWYgKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCB7IHVwZGF0ZXIgfSA9IHRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xuICAgICAgdXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7IHByb3ZpZGVOb3RpZmllciwgdXBkYXRlIH07XG59OyRozY9fb25jZS5tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbmhhcmRlbihtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB3sZwJdhoAAHYaAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiLCJBbW91bnRTaGFwZSIsIkFzc2V0S2luZFNoYXBlIiwiQnJhbmRJIiwiQnJhbmRTaGFwZSIsIkRlcG9zaXRGYWNldFNoYXBlIiwiRGlzcGxheUluZm9TaGFwZSIsIklzc3VlcktpdFNoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJOb3RpZmllclNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsIlJhdGlvU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sbWF0Y2hlcyxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKlxuXG5cblxuXG4gKi9cblxuICAgICAgIGNvbnN0IEJyYW5kU2hhcGUgPSBNLnJlbW90YWJsZSgnQnJhbmQnKTskaM2PX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaM2PX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IFBheW1lbnRTaGFwZSA9IE0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjNj19vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFB1cnNlU2hhcGUgPSBNLnJlbW90YWJsZSgnUHVyc2UnKTskaM2PX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbiAgICAgICBjb25zdCBEZXBvc2l0RmFjZXRTaGFwZSA9IE0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaM2PX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuICAgICAgIGNvbnN0IE5vdGlmaWVyU2hhcGUgPSBNLnJlbW90YWJsZSgnTm90aWZpZXInKTskaM2PX29uY2UuTm90aWZpZXJTaGFwZShOb3RpZmllclNoYXBlKTtcbiAgICAgICBjb25zdCBNaW50U2hhcGUgPSBNLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlID0gTS5uYXQoKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlID0gTS5zZXQoKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGUgPSBNLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlID0gTS5iYWcoKTtcblxuY29uc3QgQW1vdW50VmFsdWVTaGFwZSA9IE0ub3IoXG4gIE5hdFZhbHVlU2hhcGUsXG4gIENvcHlTZXRWYWx1ZVNoYXBlLFxuICBTZXRWYWx1ZVNoYXBlLFxuICBDb3B5QmFnVmFsdWVTaGFwZSxcbik7XG5cbiAgICAgICBjb25zdCBBbW91bnRTaGFwZSA9IHsgYnJhbmQ6IEJyYW5kU2hhcGUsIHZhbHVlOiBBbW91bnRWYWx1ZVNoYXBlIH07JGjNj19vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcbmhhcmRlbihBbW91bnRTaGFwZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBBbW91bnRQYXR0ZXJuU2hhcGUgPSBNLnBhdHRlcm4oKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5BbW91bnRQYXR0ZXJuU2hhcGUoQW1vdW50UGF0dGVyblNoYXBlKTtcbiAgICAgICBjb25zdCBSYXRpb1NoYXBlID0geyBudW1lcmF0b3I6IEFtb3VudFNoYXBlLCBkZW5vbWluYXRvcjogQW1vdW50U2hhcGUgfTskaM2PX29uY2UuUmF0aW9TaGFwZShSYXRpb1NoYXBlKTtcbmhhcmRlbihSYXRpb1NoYXBlKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNOYXRWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIE5hdFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlTZXRWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIENvcHlTZXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNDb3B5U2V0VmFsdWUoaXNDb3B5U2V0VmFsdWUpO1xuaGFyZGVuKGlzQ29weVNldFZhbHVlKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNTZXRWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIFNldFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc1NldFZhbHVlKGlzU2V0VmFsdWUpO1xuaGFyZGVuKGlzU2V0VmFsdWUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlCYWdWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIENvcHlCYWdWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNDb3B5QmFnVmFsdWUoaXNDb3B5QmFnVmFsdWUpO1xuaGFyZGVuKGlzQ29weUJhZ1ZhbHVlKTtcblxuLy9cbiAgICAgICBjb25zdCBNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMgPSAxMDA7JGjNj19vbmNlLk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyhNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpO1xuXG4gICAgICAgY29uc3QgQXNzZXRLaW5kU2hhcGUgPSBNLm9yKCduYXQnLCAnc2V0JywgJ2NvcHlTZXQnLCAnY29weUJhZycpOyRozY9fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBEaXNwbGF5SW5mb1NoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge30sXG4gIHtcbiAgICBkZWNpbWFsUGxhY2VzOiBNLmFuZChcbiAgICAgIE0uZ3RlKC1NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuICAgICAgTS5sdGUoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbiAgICApLFxuICAgIGFzc2V0S2luZDogQXNzZXRLaW5kU2hhcGUsXG4gIH0sXG4gIHtcbiAgICAvL1xuICAgIC8vXG4gIH0sXG4pOyRozY9fb25jZS5EaXNwbGF5SW5mb1NoYXBlKERpc3BsYXlJbmZvU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSXNzdWVyS2l0U2hhcGUgPSB7XG4gIGJyYW5kOiBCcmFuZFNoYXBlLFxuICBtaW50OiBNaW50U2hhcGUsXG4gIG1pbnRSZWNvdmVyeVB1cnNlOiBQdXJzZVNoYXBlLFxuICBpc3N1ZXI6IElzc3VlclNoYXBlLFxuICBkaXNwbGF5SW5mbzogRGlzcGxheUluZm9TaGFwZSxcbn07JGjNj19vbmNlLklzc3VlcktpdFNoYXBlKElzc3VlcktpdFNoYXBlKTtcbmhhcmRlbihJc3N1ZXJLaXRTaGFwZSk7XG5cbi8vXG5cbiAgICAgICBjb25zdCBCcmFuZEkgPSBNLmludGVyZmFjZSgnQnJhbmQnLCB7XG4gIGlzTXlJc3N1ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0RGlzcGxheUluZm86IE0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG4gIGdldEFtb3VudFNoYXBlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKSxcbn0pO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLkJyYW5kSShCcmFuZEkpO1xuICAgICAgIGNvbnN0IG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gKFxuICBicmFuZFNoYXBlID0gQnJhbmRTaGFwZSxcbiAgYXNzZXRLaW5kU2hhcGUgPSBBc3NldEtpbmRTaGFwZSxcbiAgYW1vdW50U2hhcGUgPSBBbW91bnRTaGFwZSxcbikgPT4ge1xuICBjb25zdCBJc3N1ZXJJID0gTS5pbnRlcmZhY2UoJ0lzc3VlcicsIHtcbiAgICBnZXRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgICBnZXRBc3NldEtpbmQ6IE0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuICAgIGdldERpc3BsYXlJbmZvOiBNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuICAgIG1ha2VFbXB0eVB1cnNlOiBNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG4gICAgaXNMaXZlOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gICAgZ2V0QW1vdW50T2Y6IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBidXJuOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSlcbiAgICAgIC5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpXG4gICAgICAucmV0dXJucyhhbW91bnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IE1pbnRJID0gTS5pbnRlcmZhY2UoJ01pbnQnLCB7XG4gICAgZ2V0SXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICBtaW50UGF5bWVudDogTS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IFBheW1lbnRJID0gTS5pbnRlcmZhY2UoJ1BheW1lbnQnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBQdXJzZUkgPSBNLmludGVyZmFjZSgnUHVyc2UnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnROb3RpZmllcjogTS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGRlcG9zaXQ6IE0uY2FsbChQYXltZW50U2hhcGUpXG4gICAgICAub3B0aW9uYWwoQW1vdW50UGF0dGVyblNoYXBlKVxuICAgICAgLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGdldERlcG9zaXRGYWNldDogTS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG4gICAgd2l0aGRyYXc6IE0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpLFxuICAgIGdldFJlY292ZXJ5U2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0uc2V0T2YoUGF5bWVudFNoYXBlKSksXG4gICAgcmVjb3ZlckFsbDogTS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IERlcG9zaXRGYWNldEkgPSBNLmludGVyZmFjZSgnRGVwb3NpdEZhY2V0Jywge1xuICAgIHJlY2VpdmU6IGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChQdXJzZUkpLm1ldGhvZEd1YXJkcy5kZXBvc2l0LFxuICB9KTtcblxuICBjb25zdCBQdXJzZUlLaXQgPSB7XG4gICAgcHVyc2U6IFB1cnNlSSxcbiAgICBkZXBvc2l0RmFjZXQ6IERlcG9zaXRGYWNldEksXG4gIH07XG4gIGhhcmRlbihQdXJzZUlLaXQpO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIElzc3VlckksXG4gICAgTWludEksXG4gICAgUGF5bWVudEksXG4gICAgUHVyc2VJS2l0LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VJc3N1ZXJJbnRlcmZhY2VzKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbmhhcmRlbihtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmFuZFNoYXBlIjpbIkJyYW5kU2hhcGUiXSwiSXNzdWVyU2hhcGUiOlsiSXNzdWVyU2hhcGUiXSwiUGF5bWVudFNoYXBlIjpbIlBheW1lbnRTaGFwZSJdLCJQdXJzZVNoYXBlIjpbIlB1cnNlU2hhcGUiXSwiRGVwb3NpdEZhY2V0U2hhcGUiOlsiRGVwb3NpdEZhY2V0U2hhcGUiXSwiTm90aWZpZXJTaGFwZSI6WyJOb3RpZmllclNoYXBlIl0sIk1pbnRTaGFwZSI6WyJNaW50U2hhcGUiXSwiQW1vdW50U2hhcGUiOlsiQW1vdW50U2hhcGUiXSwiQW1vdW50UGF0dGVyblNoYXBlIjpbIkFtb3VudFBhdHRlcm5TaGFwZSJdLCJSYXRpb1NoYXBlIjpbIlJhdGlvU2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJJc3N1ZXJLaXRTaGFwZSI6WyJJc3N1ZXJLaXRTaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXI7IKJodAACaHQAAJwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jYWxsYmFjay5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJjYWxsRSIsImNhbGxTeW5jIiwiaXNDYWxsYmFjayIsIm1ha2VGdW5jdGlvbkNhbGxiYWNrIiwibWFrZU1ldGhvZENhbGxiYWNrIiwibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIiwibWFrZVN5bmNNZXRob2RDYWxsYmFjayIsInByZXBhcmVBdHRlbnVhdG9yIiwicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlRXJyb3IscSxFLGlzUHJpbWl0aXZlLGlzUGFzc2FibGVTeW1ib2wsZ2V0SW50ZXJmYWNlTWV0aG9kS2V5czskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiaXNQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGlzUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5c1wiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU1ldGhvZEtleXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IHsgb3duS2V5czogcmF3T3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IG93bktleXMgPVxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgcmF3T3duS2V5c1xuICApO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNQcm9wZXJ0eUtleSA9IGtleSA9PiB7XG4gIHN3aXRjaCAodHlwZW9mIGtleSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNhbGxTeW5jID0gKGNhbGxiYWNrLCAuLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9ID0gY2FsbGJhY2s7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGFyZ2V0KC4uLmJvdW5kLCAuLi5hcmdzKTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKC4uLmJvdW5kLCAuLi5hcmdzKTtcbn07JGjNj19vbmNlLmNhbGxTeW5jKGNhbGxTeW5jKTtcbmhhcmRlbihjYWxsU3luYyk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjYWxsRSA9IChjYWxsYmFjaywgLi4uYXJncykgPT4ge1xuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwgLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIEUodGFyZ2V0KVttZXRob2ROYW1lXSguLi5ib3VuZCwgLi4uYXJncyk7XG59OyRozY9fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayA9ICh0YXJnZXQsIC4uLmJvdW5kKSA9PiB7XG4gIHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicgfHxcbiAgICBGYWlsYHN5bmMgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbjogJHt0YXJnZXR9YDtcbiAgLyogICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgYm91bmQsIGlzU3luYzogdHJ1ZSB9KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRnVuY3Rpb25DYWxsYmFjayA9ICh0YXJnZXQsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHByZXNlbmNlOiAke3RhcmdldH1gO1xuICAvKiAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBib3VuZCB9KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICovIChjYik7XG59OyRozY9fb25jZS5tYWtlRnVuY3Rpb25DYWxsYmFjayhtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVN5bmNNZXRob2RDYWxsYmFjayA9ICh0YXJnZXQsIG1ldGhvZE5hbWUsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBzeW5jIG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG4gIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkgfHxcbiAgICBGYWlsYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbiAgLyogICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQsIGlzU3luYzogdHJ1ZSB9KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZVN5bmNNZXRob2RDYWxsYmFjayhtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXRob2RDYWxsYmFjayA9ICh0YXJnZXQsIG1ldGhvZE5hbWUsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xuICB0eXBlb2YgbWV0aG9kTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpIHx8XG4gICAgRmFpbGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4gIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0pO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VNZXRob2RDYWxsYmFjayhtYWtlTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VNZXRob2RDYWxsYmFjayk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgaXNDYWxsYmFjayA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKGlzUHJpbWl0aXZlKGNhbGxiYWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICByZXR1cm4gKFxuICAgICFpc1ByaW1pdGl2ZSh0YXJnZXQpICYmXG4gICAgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpKSAmJlxuICAgIEFycmF5LmlzQXJyYXkoYm91bmQpXG4gICk7XG59OyRozY9fb25jZS5pc0NhbGxiYWNrKGlzQ2FsbGJhY2spO1xuaGFyZGVuKGlzQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVBdHRlbnVhdG9yID0gKFxuICB6b25lLFxuICBtZXRob2ROYW1lcyxcbiAgeyBpbnRlcmZhY2VHdWFyZCwgdGFnID0gJ0F0dGVudWF0b3InIH0gPSB7fSxcbikgPT4ge1xuICAvKlxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ldGhvZHMgPSAvKiAgICAgICAgICAgICAgICAgICovIChcbiAgICBmcm9tRW50cmllcyhcbiAgICAgIG1ldGhvZE5hbWVzLm1hcChrZXkgPT4ge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoIWlzUHJvcGVydHlLZXkoa2V5KSkge1xuICAgICAgICAgIHRocm93IEZhaWxga2V5ICR7cShrZXkpfSBpcyBub3QgYSBQcm9wZXJ0eUtleWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtID0gLyogICAgICAgICAgICAgICAgICAqLyAoe1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBba2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgY29uc3QgY2IgPSB0aGlzLnN0YXRlLmNic1trZXldO1xuICAgICAgICAgICAgaWYgKCFjYikge1xuICAgICAgICAgICAgICBjb25zdCBlcnIgPSBtYWtlRXJyb3IoYHVuaW1wbGVtZW50ZWQgJHtxKHRhZyl9IG1ldGhvZCAke3Eoa2V5KX1gKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNTeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNiLmlzU3luYykge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbFN5bmMoY2IsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxFKGNiLCAuLi5hcmdzKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KVtrZXldO1xuICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgKi8gKFtrZXksIG1dKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gem9uZS5leG9DbGFzcyhcbiAgICB0YWcsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgLypcblxuXG5cblxuICAgICAqL1xuICAgICh7XG4gICAgICB0YXJnZXQgPSBudWxsLFxuICAgICAgaXNTeW5jID0gZmFsc2UsXG4gICAgICBvdmVycmlkZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgKi8gKHt9KSxcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCBjYnMgPSAvKiAgICAgICAgICAgICAgICAgICAgKi8gKHt9KTtcblxuICAgICAgY29uc3QgcmVtYWluaW5nID0gbmV3IFNldChtZXRob2ROYW1lcyk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBvd25LZXlzKG92ZXJyaWRlcykpIHtcbiAgICAgICAgcmVtYWluaW5nLmhhcyhrZXkpIHx8XG4gICAgICAgICAgRmFpbGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gbm90IGFsbG93ZWQgYnkgbWV0aG9kTmFtZXNgO1xuXG4gICAgICAgIHJlbWFpbmluZy5kZWxldGUoa2V5KTtcbiAgICAgICAgY29uc3QgY2IgPSBvdmVycmlkZXNba2V5XTtcbiAgICAgICAgY2IgPT0gbnVsbCB8fFxuICAgICAgICAgIGlzQ2FsbGJhY2soY2IpIHx8XG4gICAgICAgICAgRmFpbGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gaXMgbm90IGEgY2FsbGJhY2s7IGdvdCAke2NifWA7XG4gICAgICAgIGNic1trZXldID0gY2I7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiByZW1haW5pbmcpIHtcbiAgICAgICAgaWYgKGlzU3luYykge1xuICAgICAgICAgIGNic1trZXldID0gbWFrZVN5bmNNZXRob2RDYWxsYmFjayh0YXJnZXQsIGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2JzW2tleV0gPSBtYWtlTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFyZGVuKHsgY2JzLCBpc1N5bmMgfSk7XG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICovIChtZXRob2RzKSxcbiAgKTtcbiAgcmV0dXJuIG1ha2VBdHRlbnVhdG9yO1xufTskaM2PX29uY2UucHJlcGFyZUF0dGVudWF0b3IocHJlcGFyZUF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVBdHRlbnVhdG9yKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yID0gKHpvbmUsIGludGVyZmFjZUd1YXJkLCBvcHRzID0ge30pID0+IHtcbiAgY29uc3QgbWV0aG9kTmFtZXMgPSBnZXRJbnRlcmZhY2VNZXRob2RLZXlzKGludGVyZmFjZUd1YXJkKTtcbiAgY29uc3QgbWFrZUF0dGVudWF0b3IgPSBwcmVwYXJlQXR0ZW51YXRvcih6b25lLCBtZXRob2ROYW1lcywge1xuICAgIC4uLm9wdHMsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gIH0pO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAobWFrZUF0dGVudWF0b3IpO1xufTskaM2PX29uY2UucHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGxTeW5jIjpbImNhbGxTeW5jIl0sImNhbGxFIjpbImNhbGxFIl0sIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siXSwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siOlsibWFrZUZ1bmN0aW9uQ2FsbGJhY2siXSwibWFrZVN5bmNNZXRob2RDYWxsYmFjayI6WyJtYWtlU3luY01ldGhvZENhbGxiYWNrIl0sIm1ha2VNZXRob2RDYWxsYmFjayI6WyJtYWtlTWV0aG9kQ2FsbGJhY2siXSwiaXNDYWxsYmFjayI6WyJpc0NhbGxiYWNrIl0sInByZXBhcmVBdHRlbnVhdG9yIjpbInByZXBhcmVBdHRlbnVhdG9yIl0sInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciI6WyJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtz5BGDQDAAA0AwAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jbGktdXRpbHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRvQ0xJT3B0aW9ucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRvQ0xJT3B0aW9ucyA9IHJlY29yZCA9PlxuICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gW2AtLSR7a2V5fWBdO1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHJldHVybiBbYC0tbm8tJHtrZXl9YF07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAodiA9PiBbYC0tJHtrZXl9YCwgdl0pO1xuICAgIH1cbiAgICByZXR1cm4gW2AtLSR7a2V5fWAsIHZhbHVlXTtcbiAgfSk7JGjNj19vbmNlLnRvQ0xJT3B0aW9ucyh0b0NMSU9wdGlvbnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidG9DTElPcHRpb25zIjpbInRvQ0xJT3B0aW9ucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABovr/BpQYAAKUGAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnJpZGdlSWQiLCJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCIsIlZCYW5rQWNjb3VudCIsIldhbGxldE5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgQnJpZGdlSWQgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICBCQU5LOiAnYmFuaycsXG4gIENPUkU6ICdjb3JlJyxcbiAgRElCQzogJ2RpYmMnLFxuICBTVE9SQUdFOiAnc3RvcmFnZScsXG4gIFBST1ZJU0lPTjogJ3Byb3Zpc2lvbicsXG4gIFBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6ICdwcm92aXNpb25XYWxsZXQnLFxuICBWTE9DQUxDSEFJTjogJ3Zsb2NhbGNoYWluJyxcbiAgVlRSQU5TRkVSOiAndnRyYW5zZmVyJyxcbiAgV0FMTEVUOiAnd2FsbGV0Jyxcbn0pOyRozY9fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5oYXJkZW4oQnJpZGdlSWQpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IENvc21vc0luaXRLZXlUb0JyaWRnZUlkID0ge1xuICB2YmFua1BvcnQ6ICdiYW5rJyxcbiAgdmliY1BvcnQ6ICdkaWJjJyxcbn07JGjNj19vbmNlLkNvc21vc0luaXRLZXlUb0JyaWRnZUlkKENvc21vc0luaXRLZXlUb0JyaWRnZUlkKTtcbmhhcmRlbihDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCk7XG5cbiAgICAgICBjb25zdCBXYWxsZXROYW1lID0gLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgZGVwb3NpdEZhY2V0OiAnZGVwb3NpdEZhY2V0Jyxcbn0pOyRozY9fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuaGFyZGVuKFdhbGxldE5hbWUpO1xuXG4vL1xuICAgICAgIGNvbnN0IFZCYW5rQWNjb3VudCA9IC8qICAgICAgICAgICAgICAgICovICh7XG4gIHJlc2VydmU6IHtcbiAgICBtb2R1bGU6ICd2YmFuay9yZXNlcnZlJyxcbiAgICBhZGRyZXNzOiAnYWdvcmljMWFlMGxtdHpsZ3JjbmxhOXhqa3BhYXJxNWQ1ZGZlejYzaDNudWNsJyxcbiAgfSxcbiAgcHJvdmlzaW9uOiB7XG4gICAgbW9kdWxlOiAndmJhbmsvcHJvdmlzaW9uJyxcbiAgICBhZGRyZXNzOiAnYWdvcmljMW1lZ3p5dGc2NWN5cmd6czZmdnp4Z3JjcXZ3d2w3dWdwdDYyMzQ2JyxcbiAgfSxcbn0pOyRozY9fb25jZS5WQmFua0FjY291bnQoVkJhbmtBY2NvdW50KTtcbmhhcmRlbihWQmFua0FjY291bnQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiOlsiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl0sIlZCYW5rQWNjb3VudCI6WyJWQmFua0FjY291bnQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1Mb7oSoGAAAqBgAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9kZWJ1Zy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRyYWNlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG4vL1xuLy9cbmxldCBkZWJ1Z0luc3RhbmNlID0gMTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVHJhY2VyID0gKGxhYmVsLCBlbmFibGUgPSB0cnVlKSA9PiB7XG4gIGNvbnN0IHN1YiA9IChzdWJMYWJlbCwgc3ViRW5hYmxlID0gZW5hYmxlKSA9PlxuICAgIG1ha2VUcmFjZXIoYCR7bGFiZWx9LiR7c3ViTGFiZWx9YCwgc3ViRW5hYmxlKTtcbiAgY29uc3Qga2V5ID0gYC0tLS0tICR7bGFiZWx9LCR7ZGVidWdJbnN0YW5jZX0gYDtcbiAgZGVidWdJbnN0YW5jZSArPSAxO1xuICAvL1xuICBzd2l0Y2ggKGVuYWJsZSkge1xuICAgIGNhc2UgZmFsc2U6IHtcbiAgICAgIGNvbnN0IGxvZ0Rpc2FibGVkID0gKC4uLl9hcmdzKSA9PiB7fTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihsb2dEaXNhYmxlZCwgeyBzdWIgfSkpO1xuICAgIH1cbiAgICBjYXNlICd2ZXJib3NlJzoge1xuICAgICAgY29uc3QgaW5mb1RpY2sgPSAob3B0TG9nLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0TG9nPy5sb2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oa2V5LCAuLi5hcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oa2V5LCBvcHRMb2csIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGhhcmRlbihPYmplY3QuYXNzaWduKGluZm9UaWNrLCB7IHN1YiB9KSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IGRlYnVnVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRMb2c/LmxvZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9wdExvZy5sb2coa2V5LCAuLi5hcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oa2V5LCBvcHRMb2csIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGhhcmRlbihPYmplY3QuYXNzaWduKGRlYnVnVGljaywgeyBzdWIgfSkpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UubWFrZVRyYWNlcihtYWtlVHJhY2VyKTtcbmhhcmRlbihtYWtlVHJhY2VyKTtcblxuLypcblxuICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+tsENbECAACxAgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiTm9uTnVsbGlzaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgTm9uTnVsbGlzaCA9ICh2YWwsIG9wdERldGFpbHMgPSBgdW5leHBlY3RlZCAke3EodmFsKX1gKSA9PiB7XG4gIGlmICh2YWwgIT0gbnVsbCkge1xuICAgIC8vXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBhc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbn07JGjNj19vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArRnHecMEAADDBAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2NsaS11dGlscy5qcyIsIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vZXJyb3JzLmpzIiwiLi9qcy11dGlscy5qcyIsIi4vbWFyc2hhbC9wdXJlLWRhdGEuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vbWV0cmljcy5qcyIsIi4vbmF0dXJhbC1zb3J0LmpzIiwiLi9zZXMtdXRpbHMuanMiLCIuL3RtcERpci5qcyIsIi4vdHlwZUNoZWNrLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6WyIuL2NsaS11dGlscy5qcyIsIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vZXJyb3JzLmpzIiwiLi9qcy11dGlscy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi9tZXRyaWNzLmpzIiwiLi9uYXR1cmFsLXNvcnQuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdG1wRGlyLmpzIiwiLi90eXBlQ2hlY2suanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vY2xpLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi9lcnJvcnMuanNcIiwgW11dLFtcIi4vanMtdXRpbHMuanNcIiwgW11dLFtcIi4vbWFyc2hhbC9wdXJlLWRhdGEuanNcIiwgW11dLFtcIi4vbWV0aG9kLXRvb2xzLmpzXCIsIFtdXSxbXCIuL21ldHJpY3MuanNcIiwgW11dLFtcIi4vbmF0dXJhbC1zb3J0LmpzXCIsIFtdXSxbXCIuL3Nlcy11dGlscy5qc1wiLCBbXV0sW1wiLi90bXBEaXIuanNcIiwgW11dLFtcIi4vdHlwZUNoZWNrLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL21hcnNoYWwvcHVyZS1kYXRhLmpzIjpbWyJwdXJlRGF0YU1hcnNoYWxsZXIiLCJwdXJlRGF0YU1hcnNoYWxsZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPySEyGlFAAApRQAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvanMtdXRpbHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlRSVUUiLCJkZWVwQ29weUpzb25hYmxlIiwiZGVlcE1hcE9iamVjdCIsImRlZmluZU5hbWUiLCJmcm9tVHlwZWRFbnRyaWVzIiwibG9nTGV2ZWxzIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwTXV0YWJsZSIsInBhcnRpYWxNYXAiLCJwcm92aWRlTGF6eU1hcCIsInR5cGVkRW50cmllcyIsInR5cGVkTWFwIiwidW5wcmVmaXhlZFByb3BlcnRpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8vXG4vKlxuXG5cbiAqL1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnR5IH0gPSBPYmplY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBUUlVFID0gLyogICAgICAgICAgICAgICAgKi8gKHRydWUpO1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlRSVUUoVFJVRSk7XG4gICAgICAgY29uc3QgdHlwZWRFbnRyaWVzID0gLyogICAgICAgICAgICAgICAgICAgICAgICovIChPYmplY3QuZW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLnR5cGVkRW50cmllcyh0eXBlZEVudHJpZXMpO1xuICAgICAgIGNvbnN0IGZyb21UeXBlZEVudHJpZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgT2JqZWN0LmZyb21FbnRyaWVzXG4pO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZnJvbVR5cGVkRW50cmllcyhmcm9tVHlwZWRFbnRyaWVzKTtcbiAgICAgICBjb25zdCB0eXBlZE1hcCA9IC8qICAgICAgICAgICAgICAgICAgICovIChcbiAgRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUubWFwKVxuKTskaM2PX29uY2UudHlwZWRNYXAodHlwZWRNYXApO1xuXG4gICAgICAgY29uc3QgbG9nTGV2ZWxzID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ2RlYnVnJyxcbiAgJ2xvZycsXG4gICdpbmZvJyxcbiAgJ3dhcm4nLFxuICAnZXJyb3InLFxuXSk7JGjNj19vbmNlLmxvZ0xldmVscyhsb2dMZXZlbHMpO1xuT2JqZWN0LmZyZWV6ZShsb2dMZXZlbHMpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWVwQ29weUpzb25hYmxlID0gdmFsdWUgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWVwQ29weUpzb25hYmxlKGRlZXBDb3B5SnNvbmFibGUpO1xuY29uc3QgZGVlcE1hcE9iamVjdEludGVybmFsID0gKHZhbHVlLCBuYW1lLCBjb250YWluZXIsIG1hcHBlcikgPT4ge1xuICBpZiAoY29udGFpbmVyICYmIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG1hcHBlZCA9IG1hcHBlcih2YWx1ZSwgbmFtZSwgY29udGFpbmVyKTtcbiAgICBpZiAobWFwcGVkICE9PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCAhdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBsZXQgd2FzTWFwcGVkID0gZmFsc2U7XG4gIGNvbnN0IHZhbHVlT2JqID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbHVlKTtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IG1hcEVudHJ5ID0gKFtpbm5lck5hbWUsIGlubmVyVmFsdWVdKSA9PiB7XG4gICAgY29uc3QgbWFwcGVkSW5uZXJWYWx1ZSA9IGRlZXBNYXBPYmplY3RJbnRlcm5hbChcbiAgICAgIGlubmVyVmFsdWUsXG4gICAgICBpbm5lck5hbWUsXG4gICAgICB2YWx1ZU9iaixcbiAgICAgIG1hcHBlcixcbiAgICApO1xuICAgIHdhc01hcHBlZCB8fD0gbWFwcGVkSW5uZXJWYWx1ZSAhPT0gaW5uZXJWYWx1ZTtcbiAgICByZXR1cm4gW2lubmVyTmFtZSwgLyogICAgICAgICAgICAgICovIChtYXBwZWRJbm5lclZhbHVlKV07XG4gIH07XG4gIGNvbnN0IG1hcHBlZEVudHJpZXMgPSB0eXBlZEVudHJpZXModmFsdWVPYmopLm1hcChtYXBFbnRyeSk7XG5cbiAgaWYgKCF3YXNNYXBwZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBjb25zdCBtYXBwZWRPYmogPSBmcm9tVHlwZWRFbnRyaWVzKG1hcHBlZEVudHJpZXMpO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICovIChtYXBwZWRPYmopO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWVwTWFwT2JqZWN0ID0gKG9iaiwgbWFwcGVyKSA9PlxuICAvKiAgICAgICAgICAgICAgKi8gKGRlZXBNYXBPYmplY3RJbnRlcm5hbChvYmosIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBtYXBwZXIpKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWVwTWFwT2JqZWN0KGRlZXBNYXBPYmplY3QpO1xuICAgICAgIGNvbnN0IGRlZmluZU5hbWUgPSAobmFtZSwgZm4pID0+XG4gIGRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUgfSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZmluZU5hbWUoZGVmaW5lTmFtZSk7XG4gICAgICAgY29uc3Qgb2JqZWN0TWFwTXV0YWJsZSA9IChvYmosIG1hcHBlcikgPT4ge1xuICBjb25zdCBvbGRFbnRyaWVzID0gdHlwZWRFbnRyaWVzKG9iaik7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hcEVudHJ5ID0gKFtrLCB2XSkgPT4gW2ssIG1hcHBlcih2LCBrKV07XG4gIGNvbnN0IG5ld0VudHJpZXMgPSB0eXBlZE1hcChvbGRFbnRyaWVzLCBtYXBFbnRyeSk7XG4gIGNvbnN0IG5ld09iaiA9IGZyb21UeXBlZEVudHJpZXMobmV3RW50cmllcyk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgKi8gKG5ld09iaik7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5vYmplY3RNYXBNdXRhYmxlKG9iamVjdE1hcE11dGFibGUpO1xuICAgICAgIGNvbnN0IHBhcnRpYWxNYXAgPSAoYXJyLCBtYXBPckRyb3ApID0+XG4gIGFyci5yZWR1Y2UoKHJlc3VsdHMsIGVsLCBpLCBhcnJBcmcpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBtYXBPckRyb3AoZWwsIGksIGFyckFyZyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfSwgLyogICAgICAgICAgICAgICovIChbXSkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UucGFydGlhbE1hcChwYXJ0aWFsTWFwKTtcbiAgICAgICBjb25zdCBwcm92aWRlTGF6eU1hcCA9IChtYXAsIGtleSwgbWFrZVZhbHVlKSA9PiB7XG4gIGNvbnN0IGZvdW5kID0gbWFwLmdldChrZXkpO1xuICBpZiAoZm91bmQgIT09IHVuZGVmaW5lZCB8fCBtYXAuaGFzKGtleSkpIHtcbiAgICByZXR1cm4gLyogICAgICAgICAgICAqLyAoZm91bmQpO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gbWFrZVZhbHVlKGtleSk7XG4gIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLnByb3ZpZGVMYXp5TWFwKHByb3ZpZGVMYXp5TWFwKTtcbiAgICAgICBjb25zdCBtYWtlTWVhc3VyZVNlY29uZHMgPSBjdXJyZW50VGltZU1pbGxpc2VjID0+IHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IG1lYXN1cmVTZWNvbmRzID0gYXN5bmMgZm4gPT4ge1xuICAgIGNvbnN0IHQwID0gY3VycmVudFRpbWVNaWxsaXNlYygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKCk7XG4gICAgY29uc3QgZHVyYXRpb25NaWxsaXNlYyA9IGN1cnJlbnRUaW1lTWlsbGlzZWMoKSAtIHQwO1xuICAgIHJldHVybiB7IHJlc3VsdCwgZHVyYXRpb246IGR1cmF0aW9uTWlsbGlzZWMgLyAxMDAwIH07XG4gIH07XG4gIHJldHVybiBtZWFzdXJlU2Vjb25kcztcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU1lYXN1cmVTZWNvbmRzKG1ha2VNZWFzdXJlU2Vjb25kcyk7XG4gICAgICAgY29uc3QgdW5wcmVmaXhlZFByb3BlcnRpZXMgPSAob2JqLCBwcmVmaXgpID0+XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgZnJvbVR5cGVkRW50cmllcyhcbiAgICAgIHR5cGVkRW50cmllcyhvYmopXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCksIHZhbHVlXSksXG4gICAgKVxuICApOyRozY9fb25jZS51bnByZWZpeGVkUHJvcGVydGllcyh1bnByZWZpeGVkUHJvcGVydGllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUUlVFIjpbIlRSVUUiXSwidHlwZWRFbnRyaWVzIjpbInR5cGVkRW50cmllcyJdLCJmcm9tVHlwZWRFbnRyaWVzIjpbImZyb21UeXBlZEVudHJpZXMiXSwidHlwZWRNYXAiOlsidHlwZWRNYXAiXSwibG9nTGV2ZWxzIjpbImxvZ0xldmVscyJdLCJkZWVwQ29weUpzb25hYmxlIjpbImRlZXBDb3B5SnNvbmFibGUiXSwiZGVlcE1hcE9iamVjdCI6WyJkZWVwTWFwT2JqZWN0Il0sImRlZmluZU5hbWUiOlsiZGVmaW5lTmFtZSJdLCJvYmplY3RNYXBNdXRhYmxlIjpbIm9iamVjdE1hcE11dGFibGUiXSwicGFydGlhbE1hcCI6WyJwYXJ0aWFsTWFwIl0sInByb3ZpZGVMYXp5TWFwIjpbInByb3ZpZGVMYXp5TWFwIl0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwidW5wcmVmaXhlZFByb3BlcnRpZXMiOlsidW5wcmVmaXhlZFByb3BlcnRpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQMZc3cMXAADDFwAALwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyIsIi4vY2FsbGJhY2suanMiXSwiZXhwb3J0cyI6WyJTdHJlYW1DZWxsU2hhcGUiLCJhc3NlcnRQYXRoU2VnbWVudCIsImlzU3RyZWFtQ2VsbCIsIm1ha2VDaGFpblN0b3JhZ2VSb290IiwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSIsIm1ha2VTdG9yYWdlTm9kZUNoaWxkIiwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsRmFyLE0sbWFrZUhlYXBab25lLGNiOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qc1wiLCBbW1wibWFrZUhlYXBab25lXCIsWyRozY9fYSA9PiAobWFrZUhlYXBab25lID0gJGjNj19hKV1dXV0sW1wiLi9jYWxsYmFjay5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNiID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZUNoYWluU3RvcmFnZVJvb3QsJ25hbWUnLHt2YWx1ZTpcIm1ha2VDaGFpblN0b3JhZ2VSb290XCJ9KTskaM2PX29uY2UubWFrZUNoYWluU3RvcmFnZVJvb3QobWFrZUNoYWluU3RvcmFnZVJvb3QpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlU3RvcmFnZU5vZGVDaGlsZCwnbmFtZScse3ZhbHVlOlwibWFrZVN0b3JhZ2VOb2RlQ2hpbGRcIn0pOyRozY9fb25jZS5tYWtlU3RvcmFnZU5vZGVDaGlsZChtYWtlU3RvcmFnZU5vZGVDaGlsZCk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgU3RyZWFtQ2VsbFNoYXBlID0gaGFyZGVuKHtcbiAgYmxvY2tIZWlnaHQ6IE0uc3RyaW5nKCksXG4gIHZhbHVlczogTS5hcnJheSgpLFxufSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuU3RyZWFtQ2VsbFNoYXBlKFN0cmVhbUNlbGxTaGFwZSk7XG5cbmNvbnN0IENoYWluU3RvcmFnZU5vZGVJID0gTS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJywge1xuICBzZXRWYWx1ZTogTS5jYWxsV2hlbihNLnN0cmluZygpKS5yZXR1cm5zKCksXG4gIGdldFBhdGg6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldFN0b3JlS2V5OiBNLmNhbGxXaGVuKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbiAgbWFrZUNoaWxkTm9kZTogTS5jYWxsKE0uc3RyaW5nKCkpXG4gICAgLm9wdGlvbmFsKE0uc3BsaXRSZWNvcmQoe30sIHsgc2VxdWVuY2U6IE0uYm9vbGVhbigpIH0sIHt9KSlcbiAgICAucmV0dXJucyhNLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKSksXG59KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzU3RyZWFtQ2VsbCA9IGNlbGwgPT5cbiAgY2VsbCAmJlxuICB0eXBlb2YgY2VsbCA9PT0gJ29iamVjdCcgJiZcbiAgQXJyYXkuaXNBcnJheShjZWxsLnZhbHVlcykgJiZcbiAgdHlwZW9mIGNlbGwuYmxvY2tIZWlnaHQgPT09ICdzdHJpbmcnICYmXG4gIC9eMCR8XlsxLTldWzAtOV0qJC8udGVzdChjZWxsLmJsb2NrSGVpZ2h0KTskaM2PX29uY2UuaXNTdHJlYW1DZWxsKGlzU3RyZWFtQ2VsbCk7XG5oYXJkZW4oaXNTdHJlYW1DZWxsKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybiA9IC9eW2EtekEtWjAtOV8tXXsxLDEwMH0kLztcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGFzc2VydFBhdGhTZWdtZW50ID0gbmFtZSA9PiB7XG4gIHBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpIHx8XG4gICAgRmFpbGBQYXRoIHNlZ21lbnQgbmFtZXMgbXVzdCBjb25zaXN0IG9mIDEgdG8gMTAwIGNoYXJhY3RlcnMgbGltaXRlZCB0byBBU0NJSSBhbHBoYW51bWVyaWNzLCB1bmRlcnNjb3JlcywgYW5kL29yIGRhc2hlczogJHtuYW1lfWA7XG59OyRozY9fb25jZS5hc3NlcnRQYXRoU2VnbWVudChhc3NlcnRQYXRoU2VnbWVudCk7XG5oYXJkZW4oYXNzZXJ0UGF0aFNlZ21lbnQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSA9IHpvbmUgPT4ge1xuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgbWFrZUNoYWluU3RvcmFnZU5vZGUgPSB6b25lLmV4b0NsYXNzKFxuICAgICdDaGFpblN0b3JhZ2VOb2RlJyxcbiAgICBDaGFpblN0b3JhZ2VOb2RlSSxcbiAgICAvKlxuXG5cblxuXG4gICAgICovXG4gICAgKG1lc3NlbmdlciwgcGF0aCwgeyBzZXF1ZW5jZSA9IGZhbHNlIH0gPSB7fSkgPT4ge1xuICAgICAgYXNzZXJ0LnR5cGVvZihwYXRoLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQudHlwZW9mKHNlcXVlbmNlLCAnYm9vbGVhbicpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IHBhdGgsIG1lc3Nlbmdlciwgc2VxdWVuY2UgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBnZXRQYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5wYXRoO1xuICAgICAgfSxcbiAgICAgIC8qXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpIHtcbiAgICAgICAgY29uc3QgeyBwYXRoLCBtZXNzZW5nZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIHJldHVybiBjYi5jYWxsRShtZXNzZW5nZXIsIHtcbiAgICAgICAgICBtZXRob2Q6ICdnZXRTdG9yZUtleScsXG4gICAgICAgICAgYXJnczogW3BhdGhdLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvKlxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIG1ha2VDaGlsZE5vZGUobmFtZSwgY2hpbGROb2RlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc2VxdWVuY2UsIHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IHNlcXVlbmNlLCAuLi5jaGlsZE5vZGVPcHRpb25zIH07XG4gICAgICAgIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZShcbiAgICAgICAgICBtZXNzZW5nZXIsXG4gICAgICAgICAgYCR7cGF0aH0uJHtuYW1lfWAsXG4gICAgICAgICAgbWVyZ2VkT3B0aW9ucyxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgYXN5bmMgc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBzZXF1ZW5jZSwgcGF0aCwgbWVzc2VuZ2VyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBhc3NlcnQudHlwZW9mKHZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICBsZXQgZW50cnk7XG4gICAgICAgIGlmICghc2VxdWVuY2UgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aCwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNiLmNhbGxFKG1lc3Nlbmdlciwge1xuICAgICAgICAgIG1ldGhvZDogc2VxdWVuY2UgPyAnYXBwZW5kJyA6ICdzZXQnLFxuICAgICAgICAgIGFyZ3M6IFtlbnRyeV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICB9LFxuICApO1xuICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGU7XG59OyRozY9fb25jZS5wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSk7XG5cbmNvbnN0IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZSA9IHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKG1ha2VIZWFwWm9uZSgpKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgaGFuZGxlU3RvcmFnZU1lc3NhZ2UsXG4gIHJvb3RQYXRoLFxuICByb290T3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IG1lc3NlbmdlciA9IGNiLm1ha2VGdW5jdGlvbkNhbGxiYWNrKGhhbmRsZVN0b3JhZ2VNZXNzYWdlKTtcblxuICAvL1xuICBjb25zdCByb290Tm9kZSA9IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZShtZXNzZW5nZXIsIHJvb3RQYXRoLCByb290T3B0aW9ucyk7XG4gIHJldHVybiByb290Tm9kZTtcbn1cblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VOdWxsU3RvcmFnZU5vZGUgPSAoKSA9PiB7XG4gIC8vXG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgICBGYXIoJ051bGxNZXNzZW5nZXInLCAoKSA9PiBudWxsKSxcbiAgICAnbnVsbCcsXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBtYWtlU3RvcmFnZU5vZGVDaGlsZChzdG9yYWdlTm9kZVJlZiwgY2hpbGROYW1lKSB7XG4gIGNvbnN0IGV4aXN0aW5nU3RvcmFnZU5vZGUgPSBhd2FpdCBzdG9yYWdlTm9kZVJlZjtcbiAgY29uc3Qgc3RvcmFnZU5vZGUgPSBleGlzdGluZ1N0b3JhZ2VOb2RlIHx8IG1ha2VOdWxsU3RvcmFnZU5vZGUoKTtcbiAgcmV0dXJuIEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGROYW1lKTtcbn1cbmhhcmRlbihtYWtlU3RvcmFnZU5vZGVDaGlsZCk7XG5cbi8vXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICByZXR1cm4gYXN5bmMgdmFsdWUgPT4ge1xuICAgIGNvbnN0IG1hcnNoYWxsZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KG1hcnNoYWxsZWQpO1xuICAgIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdHJlYW1DZWxsU2hhcGUiOlsiU3RyZWFtQ2VsbFNoYXBlIl0sImlzU3RyZWFtQ2VsbCI6WyJpc1N0cmVhbUNlbGwiXSwiYXNzZXJ0UGF0aFNlZ21lbnQiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiXSwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiOlsicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwibWFrZUNoYWluU3RvcmFnZVJvb3QiOlsibWFrZUNoYWluU3RvcmFnZVJvb3QiXSwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiOlsibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiXSwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSI6WyJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOqC9qdaDwAAWg8AADkAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9ib2FyZC1jbGllbnQtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIi4uL2xpYi1jaGFpblN0b3JhZ2UuanMiLCIuL2NhcC1kYXRhLmpzIl0sImV4cG9ydHMiOlsiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiLCJtYWtlQm9hcmRSZW1vdGUiLCJtYWtlSGlzdG9yeVJldml2ZXIiLCJzbG90VG9Cb2FyZFJlbW90ZSIsInVubWFyc2hhbEZyb21Wc3RvcmFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRmFyLG1ha2VNYXJzaGFsLGlzU3RyZWFtQ2VsbCxhc3NlcnRDYXBEYXRhOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIi4uL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcImlzU3RyZWFtQ2VsbFwiLFskaM2PX2EgPT4gKGlzU3RyZWFtQ2VsbCA9ICRozY9fYSldXV1dLFtcIi4vY2FwLWRhdGEuanNcIiwgW1tcImFzc2VydENhcERhdGFcIixbJGjNj19hID0+IChhc3NlcnRDYXBEYXRhID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQm9hcmRSZW1vdGUgPSAoeyBib2FyZElkLCBpZmFjZSB9KSA9PiB7XG4gIGNvbnN0IG5vbmFsbGVnZWQgPSBpZmFjZSA/IGlmYWNlLnJlcGxhY2UoL15BbGxlZ2VkOiAvLCAnJykgOiAnJztcbiAgcmV0dXJuIEZhcihgQm9hcmRSZW1vdGUke25vbmFsbGVnZWR9YCwgeyBnZXRCb2FyZElkOiAoKSA9PiBib2FyZElkIH0pO1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5tYWtlQm9hcmRSZW1vdGUobWFrZUJvYXJkUmVtb3RlKTtcbiAgICAgICBjb25zdCBzbG90VG9Cb2FyZFJlbW90ZSA9IChib2FyZElkLCBpZmFjZSkgPT5cbiAgbWFrZUJvYXJkUmVtb3RlKHsgYm9hcmRJZCwgaWZhY2UgfSk7XG5cbi8qXG5cblxuICovJGjNj19vbmNlLnNsb3RUb0JvYXJkUmVtb3RlKHNsb3RUb0JvYXJkUmVtb3RlKTtcbmNvbnN0IGJvYXJkVmFsVG9TbG90ID0gdmFsID0+IHtcbiAgaWYgKCdnZXRCb2FyZElkJyBpbiB2YWwpIHtcbiAgICByZXR1cm4gdmFsLmdldEJvYXJkSWQoKTtcbiAgfVxuICB0aHJvdyBGYWlsYHVua25vd24gb2JqIGluIGJvYXJkU2xvdHRpbmdNYXJzaGFsbGVyLnZhbFRvU2xvdCAke3ZhbH1gO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYm9hcmRTbG90dGluZ01hcnNoYWxsZXIgPSAoc2xvdFRvVmFsID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiBtYWtlTWFyc2hhbChcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChib2FyZFZhbFRvU2xvdCksXG4gICAgc2xvdFRvVmFsLFxuICAgIHtcbiAgICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxuICAgIH0sXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5ib2FyZFNsb3R0aW5nTWFyc2hhbGxlcihib2FyZFNsb3R0aW5nTWFyc2hhbGxlcik7XG4gICAgICAgY29uc3QgdW5tYXJzaGFsRnJvbVZzdG9yYWdlID0gKGRhdGEsIGtleSwgZnJvbUNhcERhdGEsIGluZGV4KSA9PiB7XG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBkYXRhLmdldChrZXkpIHx8IEZhaWxgbm8gZGF0YSBmb3IgJHtrZXl9YDtcbiAgYXNzZXJ0LnR5cGVvZihzZXJpYWxpemVkLCAnc3RyaW5nJyk7XG4gIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcblxuICBjb25zdCBzdHJlYW1DZWxsID0gSlNPTi5wYXJzZShzZXJpYWxpemVkKTtcbiAgaWYgKCFpc1N0cmVhbUNlbGwoc3RyZWFtQ2VsbCkpIHtcbiAgICB0aHJvdyBGYWlsYG5vdCBhIFN0cmVhbUNlbGw6ICR7c3RyZWFtQ2VsbH1gO1xuICB9XG5cbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHN0cmVhbUNlbGw7XG4gIHZhbHVlcy5sZW5ndGggPiAwIHx8IEZhaWxgbm8gU3RyZWFtQ2VsbCB2YWx1ZXM6ICR7c3RyZWFtQ2VsbH1gO1xuXG4gIGNvbnN0IG1hcnNoYWxsZWQgPSB2YWx1ZXMuYXQoaW5kZXgpO1xuICBhc3NlcnQudHlwZW9mKG1hcnNoYWxsZWQsICdzdHJpbmcnKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY2FwRGF0YSA9IGhhcmRlbihKU09OLnBhcnNlKG1hcnNoYWxsZWQpKTtcbiAgYXNzZXJ0Q2FwRGF0YShjYXBEYXRhKTtcblxuICBjb25zdCB1bm1hcnNoYWxsZWQgPSBmcm9tQ2FwRGF0YShjYXBEYXRhKTtcbiAgcmV0dXJuIHVubWFyc2hhbGxlZDtcbn07JGjNj19vbmNlLnVubWFyc2hhbEZyb21Wc3RvcmFnZSh1bm1hcnNoYWxGcm9tVnN0b3JhZ2UpO1xuaGFyZGVuKHVubWFyc2hhbEZyb21Wc3RvcmFnZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VIaXN0b3J5UmV2aXZlciA9IChlbnRyaWVzLCBzbG90VG9WYWwgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgYm9hcmQgPSBib2FyZFNsb3R0aW5nTWFyc2hhbGxlcihzbG90VG9WYWwpO1xuICBjb25zdCB2c01hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBmcm9tQ2FwRGF0YSA9ICguLi5hcmdzKSA9PlxuICAgIFJlZmxlY3QuYXBwbHkoYm9hcmQuZnJvbUNhcERhdGEsIGJvYXJkLCBhcmdzKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBnZXRJdGVtID0ga2V5ID0+IHVubWFyc2hhbEZyb21Wc3RvcmFnZSh2c01hcCwga2V5LCBmcm9tQ2FwRGF0YSwgLTEpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNoaWxkcmVuID0gcHJlZml4ID0+IHtcbiAgICBwcmVmaXguZW5kc1dpdGgoJy4nKSB8fCBGYWlsYHByZWZpeCBtdXN0IGVuZCB3aXRoICcuJ2A7XG4gICAgcmV0dXJuIGhhcmRlbihbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICBlbnRyaWVzXG4gICAgICAgICAgLm1hcCgoW2ssIF9dKSA9PiBrKVxuICAgICAgICAgIC5maWx0ZXIoayA9PiBrLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgICAubWFwKGsgPT4gay5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdCgnLicpWzBdKSxcbiAgICAgICksXG4gICAgXSk7XG4gIH07XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGhhcyA9IGsgPT4gdnNNYXAuZ2V0KGspICE9PSB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGhhcmRlbih7IGdldEl0ZW0sIGNoaWxkcmVuLCBoYXMgfSk7XG59OyRozY9fb25jZS5tYWtlSGlzdG9yeVJldml2ZXIobWFrZUhpc3RvcnlSZXZpdmVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VCb2FyZFJlbW90ZSI6WyJtYWtlQm9hcmRSZW1vdGUiXSwic2xvdFRvQm9hcmRSZW1vdGUiOlsic2xvdFRvQm9hcmRSZW1vdGUiXSwiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiOlsiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiXSwidW5tYXJzaGFsRnJvbVZzdG9yYWdlIjpbInVubWFyc2hhbEZyb21Wc3RvcmFnZSJdLCJtYWtlSGlzdG9yeVJldml2ZXIiOlsibWFrZUhpc3RvcnlSZXZpdmVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABMNghI7AwAAOwMAAC8AAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9jYXAtZGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDYXBEYXRhID0gZGF0YSA9PiB7XG4gIGFzc2VydC50eXBlb2YoZGF0YSwgJ29iamVjdCcpO1xuICBhc3NlcnQoZGF0YSk7XG4gIHR5cGVvZiBkYXRhLmJvZHkgPT09ICdzdHJpbmcnIHx8IEZhaWxgZGF0YSBoYXMgbm9uLXN0cmluZyAuYm9keSAke2RhdGEuYm9keX1gO1xuICBBcnJheS5pc0FycmF5KGRhdGEuc2xvdHMpIHx8IEZhaWxgZGF0YSBoYXMgbm9uLUFycmF5IHNsb3RzICR7ZGF0YS5zbG90c31gO1xufTskaM2PX29uY2UuYXNzZXJ0Q2FwRGF0YShhc3NlcnRDYXBEYXRhKTtcbmhhcmRlbihhc3NlcnRDYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydENhcERhdGEiOlsiYXNzZXJ0Q2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADCZS/ncQMAAHEDAAA3AAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvaW5hY2Nlc3NpYmxlLXZhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlSW5hY2Nlc3NpYmxlVmFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbmNvbnN0IGlmYWNlQWxsZWdlZFByZWZpeCA9ICdBbGxlZ2VkOiAnO1xuY29uc3QgaWZhY2VJbmFjY2Vzc2libGVQcmVmaXggPSAnU0VWRVJFRDogJztcbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUluYWNjZXNzaWJsZVZhbCA9IGlmYWNlID0+IHtcbiAgaWYgKHR5cGVvZiBpZmFjZSA9PT0gJ3N0cmluZycgJiYgaWZhY2Uuc3RhcnRzV2l0aChpZmFjZUFsbGVnZWRQcmVmaXgpKSB7XG4gICAgaWZhY2UgPSBpZmFjZS5zbGljZShpZmFjZUFsbGVnZWRQcmVmaXgubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gRmFyKGAke2lmYWNlSW5hY2Nlc3NpYmxlUHJlZml4fSR7aWZhY2V9YCwge30pO1xufTskaM2PX29uY2UubWFrZUluYWNjZXNzaWJsZVZhbChtYWtlSW5hY2Nlc3NpYmxlVmFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VJbmFjY2Vzc2libGVWYWwiOlsibWFrZUluYWNjZXNzaWJsZVZhbCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACj7ON9hgMAAIYDAAAwAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJwdXJlRGF0YU1hcnNoYWxsZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLypcblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmVqZWN0T0NhcCA9IGNhcCA9PiBGYWlsYCR7Y2FwfSBpcyBub3QgcHVyZSBkYXRhYDtcbiAgICAgICBjb25zdCBwdXJlRGF0YU1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbChyZWplY3RPQ2FwLCByZWplY3RPQ2FwLCB7XG4gIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxufSk7JGjNj19vbmNlLnB1cmVEYXRhTWFyc2hhbGxlcihwdXJlRGF0YU1hcnNoYWxsZXIpO1xuaGFyZGVuKHB1cmVEYXRhTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwdXJlRGF0YU1hcnNoYWxsZXIiOlsicHVyZURhdGFNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG54O4xtBgAAbQYAACsAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJiaW5kQWxsTWV0aG9kcyIsImdldE1ldGhvZE5hbWVzIiwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCByZWFsR2V0TWV0aG9kTmFtZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKHJlYWxHZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dXSk7XG5cblxuLypcblxuXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kTmFtZXMgPSB2YWwgPT5cbiAgLyogICAgICAgICAgICAgICovIChyZWFsR2V0TWV0aG9kTmFtZXModmFsKSk7JGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0U3RyaW5nTWV0aG9kTmFtZXMgPSB2YWwgPT5cbiAgLyogICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIHJlYWxHZXRNZXRob2ROYW1lcyh2YWwpLmZpbHRlcihuYW1lID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJylcbiAgKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5nZXRTdHJpbmdNZXRob2ROYW1lcyhnZXRTdHJpbmdNZXRob2ROYW1lcyk7XG4gICAgICAgY29uc3QgYmluZEFsbE1ldGhvZHMgPSBvYmogPT5cbiAgaGFyZGVuKFxuICAgIGNyZWF0ZShcbiAgICAgIG9iaixcbiAgICAgIGZyb21FbnRyaWVzKFxuICAgICAgICByZWFsR2V0TWV0aG9kTmFtZXMob2JqKS5tYXAobmFtZSA9PiBbXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogKC8qICAgICAgICAgICAgICAgICAgICAqLyAuLi5hcmdzKSA9PlxuICAgICAgICAgICAgICBhcHBseShvYmpbbmFtZV0sIG9iaiwgYXJncyksXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApOyRozY9fb25jZS5iaW5kQWxsTWV0aG9kcyhiaW5kQWxsTWV0aG9kcyk7XG5oYXJkZW4oYmluZEFsbE1ldGhvZHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiOlsiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsn2q0Mk2AADJNgAAJgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRyaWNzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTIiwiSElTVE9HUkFNX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfTUVUUklDUyIsIktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyIsIktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyIsIlF1ZXVlTWV0cmljQXNwZWN0IiwibWFrZVF1ZXVlTWV0cmljcyIsIm1ha2VRdWV1ZU1ldHJpY3NNZXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxpc05hdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMgPSBbXG4gIDUsXG4gIDEwLFxuICAyNSxcbiAgNTAsXG4gIDEwMCxcbiAgMjUwLFxuICA1MDAsXG4gIDEwMDAsXG4gIDI1MDAsXG4gIDUwMDAsXG4gIDEwMDAwLFxuICBJbmZpbml0eSxcbl07XG5jb25zdCBISVNUT0dSQU1fU0VDT05EU19MQVRFTkNZX0JPVU5EQVJJRVMgPVxuICBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLm1hcChtcyA9PiBtcyAvIDEwMDApO1xuXG4vL1xuLy9cbiAgICAgICBjb25zdCBISVNUT0dSQU1fTUVUUklDUyA9IC8qICAgICAgICAgICAgICAgICovICh7XG4gIHN3aW5nc2V0X2NyYW5rX3Byb2Nlc3NpbmdfdGltZToge1xuICAgIGRlc2NyaXB0aW9uOiAnUHJvY2Vzc2luZyB0aW1lIHBlciBjcmFuayAobXMpJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEFycmF5Lm9mKDEsIDExLCAyMSwgMzEsIDQxLCA1MSwgNjEsIDcxLCA4MSwgOTEsIEluZmluaXR5KSxcbiAgfSxcbiAgc3dpbmdzZXRfYmxvY2tfcHJvY2Vzc2luZ19zZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQcm9jZXNzaW5nIHRpbWUgcGVyIGJsb2NrJyxcbiAgICB1bml0OiAncycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX1NFQ09ORFNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxuICBzd2luZ3NldF92YXRfc3RhcnR1cDoge1xuICAgIGRlc2NyaXB0aW9uOiAnVmF0IHN0YXJ0dXAgdGltZSAobXMpJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X3ZhdF9kZWxpdmVyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnVmF0IGRlbGl2ZXJ5IHRpbWUgKG1zKScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxuICBzd2luZ3NldF9tZXRlcl91c2FnZToge1xuICAgIGRlc2NyaXB0aW9uOiAnVmF0IG1ldGVyIHVzYWdlJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG59KTskaM2PX29uY2UuSElTVE9HUkFNX01FVFJJQ1MoSElTVE9HUkFNX01FVFJJQ1MpO1xuXG5jb25zdCBibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MgPSB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIHVuaXQ6ICdzJyxcbiAgYWR2aWNlOiB7XG4gICAgZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzOiBbXG4gICAgICAwLjEsIDAuMiwgMC4zLCAwLjQsIDAuNSwgMSwgMiwgMywgNCwgNSwgNiwgNywgMTAsIDE1LCAzMCxcbiAgICBdLFxuICB9LFxufTtcbiAgICAgICBjb25zdCBCTE9DS19ISVNUT0dSQU1fTUVUUklDUyA9IC8qICAgICAgICAgICAgICAgICovICh7XG4gIHN3aW5nc2V0UnVuU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgZXhlY3V0aW5nIFN3aW5nU2V0JyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIHN3aW5nc2V0Q2hhaW5TYXZlU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgcHJvcGFnYXRpbmcgU3dpbmdTZXQgc3RhdGUgaW50byBjb3Ntb3MnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgc3dpbmdzZXRDb21taXRTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBTd2luZ1NldCBzdGF0ZSB0byBob3N0IHN0b3JhZ2UnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgY29zbW9zQ29tbWl0U2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBjb3Ntb3Mgc3RhdGUnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgZnVsbENvbW1pdFNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQZXItYmxvY2sgdGltZSBzcGVudCBjb21taXR0aW5nIHN0YXRlLCBpbmNsdXNpdmUgb2YgQ09NTUlUX0JMT0NLIHByb2Nlc3NpbmcgcGx1cyB0aW1lIHNwZW50IFtvdXRzaWRlIG9mIGNvc21pYy1zd2luZ3NldF0gYmVmb3JlIGFuZCBhZnRlciBpdCcsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBpbnRlckJsb2NrU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZSBzcGVudCBpZGxlIGJldHdlZW4gYmxvY2tzJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGFmdGVyQ29tbWl0SGFuZ292ZXJTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgd2FpdGluZyBmb3IgcHJldmlvdXMtYmxvY2sgYWZ0ZXJDb21taXQgd29yaycsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBibG9ja0xhZ1NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBkZWxheSBvZiBlYWNoIGJsb2NrIGZyb20gaXRzIGV4cGVjdGVkIGJlZ2luIHRpbWUnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgICAvL1xuICAgIGFkdmljZToge1xuICAgICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLmFkdmljZSxcbiAgICAgIGV4cGxpY2l0QnVja2V0Qm91bmRhcmllczogLyogICAgICAgICAgICAgICAgICAgKi8gKFtcbiAgICAgICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLmFkdmljZS5leHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXMsXG4gICAgICAgIC4uLls2MCwgMTIwLCAxODAsIDI0MCwgMzAwLCA2MDAsIDM2MDBdLFxuICAgICAgXSksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTKEJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTKTtcbiAgICAgICBjb25zdCBRdWV1ZU1ldHJpY0FzcGVjdCA9IC8qICAgICAgICAgICAgICAgICovICh7XG4gIExlbmd0aDogJ2xlbmd0aCcsXG4gIEluY3JlbWVudENvdW50OiAnaW5jcmVtZW50cycsXG4gIERlY3JlbWVudENvdW50OiAnZGVjcmVtZW50cycsXG59KTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuUXVldWVNZXRyaWNBc3BlY3QoUXVldWVNZXRyaWNBc3BlY3QpO1xuICAgICAgIGNvbnN0IG1ha2VRdWV1ZU1ldHJpY3NNZXRhID0gKG5hbWVQcmVmaXgsIGRlc2NQcmVmaXgpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtZXRyaWNzTWV0YSA9IFtcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuTGVuZ3RoLCAnbGVuZ3RoJywgJ2xlbmd0aCddLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5JbmNyZW1lbnRDb3VudCwgJ2FkZCcsICdpbmNyZW1lbnRzJ10sXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkRlY3JlbWVudENvdW50LCAncmVtb3ZlJywgJ2RlY3JlbWVudHMnXSxcbiAgXTtcbiAgY29uc3QgZW50cmllcyA9IG1ldHJpY3NNZXRhLm1hcCgoW2FzcGVjdCwgbmFtZVN1ZmZpeCwgZGVzY1N1ZmZpeF0pID0+IHtcbiAgICBjb25zdCBuYW1lID0gYCR7bmFtZVByZWZpeH1fJHtuYW1lU3VmZml4fWA7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBgJHtkZXNjUHJlZml4fSAke2Rlc2NTdWZmaXh9YDtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIFthc3BlY3QsIHsgbmFtZSwgb3B0aW9uczogeyBkZXNjcmlwdGlvbiB9IH1dO1xuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VRdWV1ZU1ldHJpY3NNZXRhKG1ha2VRdWV1ZU1ldHJpY3NNZXRhKTtcbiAgICAgICBjb25zdCBtYWtlUXVldWVNZXRyaWNzID0gKHtcbiAgb3RlbE1ldGVyLFxuICBuYW1lUHJlZml4LFxuICBkZXNjUHJlZml4LFxuICBjb25zb2xlLFxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0Lkxlbmd0aF06IGxlbmd0aE1ldGEsXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkluY3JlbWVudENvdW50XTogdXBNZXRhLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5EZWNyZW1lbnRDb3VudF06IGRvd25NZXRhLFxuICB9ID0gbWFrZVF1ZXVlTWV0cmljc01ldGEobmFtZVByZWZpeCwgZGVzY1ByZWZpeCk7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGxlbmd0aENvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcihcbiAgICBsZW5ndGhNZXRhLm5hbWUsXG4gICAgbGVuZ3RoTWV0YS5vcHRpb25zLFxuICApO1xuICAvL1xuICAvL1xuICBjb25zdCB1cENvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlT2JzZXJ2YWJsZUNvdW50ZXIoXG4gICAgdXBNZXRhLm5hbWUsXG4gICAgdXBNZXRhLm9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRvd25Db3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZU9ic2VydmFibGVDb3VudGVyKFxuICAgIGRvd25NZXRhLm5hbWUsXG4gICAgZG93bk1ldGEub3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgaW5jcmVtZW50cyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAobmV3IE1hcCgpKTtcbiAgY29uc3QgZGVjcmVtZW50cyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAobmV3IE1hcCgpKTtcbiAgdXBDb3VudGVyLmFkZENhbGxiYWNrKG9ic2VydmVyID0+IHtcbiAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIHZhbHVlXSBvZiBpbmNyZW1lbnRzLmVudHJpZXMoKSkge1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh2YWx1ZSwgeyBxdWV1ZTogcXVldWVOYW1lIH0pO1xuICAgIH1cbiAgfSk7XG4gIGRvd25Db3VudGVyLmFkZENhbGxiYWNrKG9ic2VydmVyID0+IHtcbiAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIHZhbHVlXSBvZiBkZWNyZW1lbnRzLmVudHJpZXMoKSkge1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh2YWx1ZSwgeyBxdWV1ZTogcXVldWVOYW1lIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gIGNvbnN0IGxlbmd0aHMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKG5ldyBNYXAoKSk7XG4gIGNvbnN0IG51ZGdlID0gKHF1ZXVlTmFtZSwgZGVsdGEsIGluaXQgPSBmYWxzZSkgPT4ge1xuICAgIGlmICghbGVuZ3Rocy5oYXMocXVldWVOYW1lKSkge1xuICAgICAgaWYgKCFpbml0KSBjb25zb2xlPy53YXJuKCdVbmtub3duIHF1ZXVlJywgcXVldWVOYW1lKTtcbiAgICAgIGxlbmd0aHMuc2V0KHF1ZXVlTmFtZSwgMCk7XG4gICAgICBpbmNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIDApO1xuICAgICAgZGVjcmVtZW50cy5zZXQocXVldWVOYW1lLCAwKTtcbiAgICB9XG4gICAgY29uc3Qgb2xkTGVuZ3RoID0gbGVuZ3Rocy5nZXQocXVldWVOYW1lKTtcbiAgICBsZW5ndGhzLnNldChxdWV1ZU5hbWUsIG9sZExlbmd0aCArIGRlbHRhKTtcbiAgICBjb25zdCBkaW1lbnNpb25zID0geyBxdWV1ZTogcXVldWVOYW1lIH07XG4gICAgbGVuZ3RoQ291bnRlci5hZGQoZGVsdGEsIGRpbWVuc2lvbnMpO1xuICAgIGlmIChpbml0KSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChkZWx0YSA+IDApIHtcbiAgICAgIC8vXG4gICAgICBpbmNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIChpbmNyZW1lbnRzLmdldChxdWV1ZU5hbWUpIHx8IDApICsgZGVsdGEpO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEgPCAwKSB7XG4gICAgICAvL1xuICAgICAgZGVjcmVtZW50cy5zZXQocXVldWVOYW1lLCAoZGVjcmVtZW50cy5nZXQocXVldWVOYW1lKSB8fCAwKSAtIGRlbHRhKTtcbiAgICB9XG4gICAgcmVhZHkgPSB0cnVlO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGluaXRMZW5ndGhzOiBpbml0aWFsTGVuZ3RocyA9PiB7XG4gICAgICAhcmVhZHkgfHxcbiAgICAgICAgY29uc29sZT8ud2FybihcbiAgICAgICAgICBgVW5leHBlY3RlZCByZXBlYXQgcXVldWUgbGVuZ3RoIGluaXRpYWxpemF0aW9uIGZyb20gJHtxKGxlbmd0aHMpfSB0byAke3EoaW5pdGlhbExlbmd0aHMpfWBcbiAgICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgbmV3TGVuZ3RoXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsTGVuZ3RocykpIHtcbiAgICAgICAgaWYgKCFpc05hdChuZXdMZW5ndGgpKSB7XG4gICAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBsZW5ndGggZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBuZXdMZW5ndGgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgbmV3TGVuZ3RoLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZUxlbmd0aHM6IG5ld0xlbmd0aHMgPT4ge1xuICAgICAgcmVhZHkgfHwgY29uc29sZT8ud2FybignTWlzc2luZyBpbml0aWFsIHF1ZXVlIGxlbmd0aHMnKTtcbiAgICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgbmV3TGVuZ3RoXSBvZiBPYmplY3QuZW50cmllcyhuZXdMZW5ndGhzKSkge1xuICAgICAgICBpZiAoIWlzTmF0KG5ld0xlbmd0aCkpIHtcbiAgICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGxlbmd0aCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIG5ld0xlbmd0aCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbnVkZ2UocXVldWVOYW1lLCBuZXdMZW5ndGggLSAobGVuZ3Rocy5nZXQocXVldWVOYW1lKSB8fCAwKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBpbmNMZW5ndGg6IChxdWV1ZU5hbWUsIGRlbHRhID0gMSkgPT4ge1xuICAgICAgaWYgKCFpc05hdChkZWx0YSkpIHtcbiAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBpbmNyZW1lbnQgZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBkZWx0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgZGVsdGEpO1xuICAgIH0sXG4gICAgZGVjTGVuZ3RoOiAocXVldWVOYW1lLCBkZWx0YSA9IDEpID0+IHtcbiAgICAgIGlmICghaXNOYXQoZGVsdGEpKSB7XG4gICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgZGVjcmVtZW50IGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgZGVsdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBudWRnZShxdWV1ZU5hbWUsIC1kZWx0YSk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5tYWtlUXVldWVNZXRyaWNzKG1ha2VRdWV1ZU1ldHJpY3MpO1xuY29uc3QgTWV0cmljVHlwZSA9IC8qICAgICAgICAgICAgICAgICovICh7XG4gIENvdW50ZXI6ICdjb3VudGVyJyxcbiAgR2F1Z2U6ICdnYXVnZScsXG59KTtcbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MgPSBbXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxscycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2FsbF9zeXNjYWxsX3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFNlbmQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnc2VuZCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBtZXNzYWdlIHNlbmQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxDYWxsTm93JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ2NhbGxOb3cnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgc3luY2hyb25vdXMgZGV2aWNlIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsU3Vic2NyaWJlJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3N1YnNjcmliZScgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBwcm9taXNlIHN1YnNjcmlwdGlvbiBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFJlc29sdmUnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAncmVzb2x2ZScgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBwcm9taXNlIHJlc29sdXRpb24ga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxFeGl0JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ2V4aXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IGV4aXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZUdldCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZUdldCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBnZXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZVNldCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZVNldCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBzZXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZUdldE5leHRLZXknLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVHZXROZXh0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIGdldE5leHRLZXkga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZURlbGV0ZScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZURlbGV0ZScgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBkZWxldGUga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxEcm9wSW1wb3J0cycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdkcm9wSW1wb3J0cycgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBkcm9wIGltcG9ydHMga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2Rpc3BhdGNoZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9kaXNwYXRjaF90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2Rpc3BhdGNoRGVsaXZlcicsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Rpc3BhdGNoX2RlbGl2ZXJfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBtZXNzYWdlIGRlbGl2ZXJpZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hOb3RpZnknLFxuICAgIG5hbWU6ICdzd2luZ3NldF9kaXNwYXRjaF9ub3RpZnlfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBwcm9taXNlIG5vdGlmaWNhdGlvbnMnLFxuICB9LFxuXTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTKEtFUk5FTF9TVEFUU19TVU1fTUVUUklDUyk7XG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTID0gW1xuICB7XG4gICAga2V5OiAna2VybmVsT2JqZWN0cycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9vYmplY3RzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBrZXJuZWwgb2JqZWN0cycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrZXJuZWxEZXZpY2VzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfa2VybmVsX2RldmljZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGtlcm5lbCBkZXZpY2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2tlcm5lbFByb21pc2VzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna3BVbnJlc29sdmVkJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfdW5yZXNvbHZlZF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnVW5yZXNvbHZlZCBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna3BGdWxmaWxsZWQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9mdWxmaWxsZWRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Z1bGZpbGxlZCBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna3BSZWplY3RlZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3JlamVjdGVkX2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdSZWplY3RlZCBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAncnVuUXVldWVMZW5ndGgnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9ydW5fcXVldWVfbGVuZ3RoJyxcbiAgICBjb25zZW5zdXM6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdMZW5ndGggb2YgdGhlIGtlcm5lbCBydW4gcXVldWUnLFxuICB9LFxuICB7XG4gICAga2V5OiAnYWNjZXB0YW5jZVF1ZXVlTGVuZ3RoJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfYWNjZXB0YW5jZV9xdWV1ZV9sZW5ndGgnLFxuICAgIGNvbnNlbnN1czogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ0xlbmd0aCBvZiB0aGUga2VybmVsIGFjY2VwdGFuY2UgcXVldWUnLFxuICB9LFxuICB7XG4gICAga2V5OiAncHJvbWlzZVF1ZXVlc0xlbmd0aCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3Byb21pc2VfcXVldWVzX2xlbmd0aCcsXG4gICAgY29uc2Vuc3VzOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnQ29tYmluZWQgbGVuZ3RoIG9mIGFsbCBrZXJuZWwgcHJvbWlzZSBxdWV1ZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnY2xpc3RFbnRyaWVzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfY2xpc3RfZW50cmllcycsXG4gICAgZGVzY3JpcHRpb246ICdOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUga2VybmVsIGMtbGlzdCcsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICd2YXRzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfdmF0cycsXG4gICAgZGVzY3JpcHRpb246ICdOdW1iZXIgb2YgYWN0aXZlIHZhdHMnLFxuICB9LFxuXTskaM2PX29uY2UuS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTKEtFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyk7XG5cbmNvbnN0IHsgQ291bnRlciwgR2F1Z2UgfSA9IE1ldHJpY1R5cGU7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBLRVJORUxfU1RBVFNfTUVUUklDUyA9IGhhcmRlbihbXG4gIC4uLktFUk5FTF9TVEFUU19TVU1fTUVUUklDUy5tYXAobSA9PiAoeyAuLi5tLCBtZXRyaWNUeXBlOiBDb3VudGVyIH0pKSxcbiAgLi4uS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTLm1hcChtID0+ICh7IC4uLm0sIG1ldHJpY1R5cGU6IEdhdWdlIH0pKSxcbl0pO1xuXG4vL1xuJGjNj19vbmNlLktFUk5FTF9TVEFUU19NRVRSSUNTKEtFUk5FTF9TVEFUU19NRVRSSUNTKTtjb25zdCBrZXJuZWxTdGF0c0tleXM9bmV3IE1hcCgpO1xuZm9yIChjb25zdCB7IGtleSB9IG9mIEtFUk5FTF9TVEFUU19NRVRSSUNTKSB7XG4gIGtlcm5lbFN0YXRzS2V5cy5zZXQoa2V5LCAoa2VybmVsU3RhdHNLZXlzLmdldChrZXkpIHx8IDApICsgMSk7XG59XG5jb25zdCBkdXBsaWNhdGVLZXJuZWxTdGF0c0tleXMgPSBbLi4ua2VybmVsU3RhdHNLZXlzLmVudHJpZXMoKV0uZmxhdE1hcChcbiAgKFtrZXksIHZhbHVlXSkgPT4gKHZhbHVlID4gMSA/IFtrZXldIDogW10pLFxuKTtcbmlmIChkdXBsaWNhdGVLZXJuZWxTdGF0c0tleXMubGVuZ3RoID4gMCkge1xuICBjb25zdCBtc2cgPSBgRHVwbGljYXRlIGtlcm5lbCBzdGF0cyBrZXlzICR7SlNPTi5zdHJpbmdpZnkoZHVwbGljYXRlS2VybmVsU3RhdHNLZXlzKX1gO1xuICB0aHJvdyBFcnJvcihtc2cpO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSElTVE9HUkFNX01FVFJJQ1MiOlsiSElTVE9HUkFNX01FVFJJQ1MiXSwiQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MiOlsiQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MiXSwiUXVldWVNZXRyaWNBc3BlY3QiOlsiUXVldWVNZXRyaWNBc3BlY3QiXSwibWFrZVF1ZXVlTWV0cmljc01ldGEiOlsibWFrZVF1ZXVlTWV0cmljc01ldGEiXSwibWFrZVF1ZXVlTWV0cmljcyI6WyJtYWtlUXVldWVNZXRyaWNzIl0sIktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyI6WyJLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MiXSwiS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyJdLCJLRVJORUxfU1RBVFNfTUVUUklDUyI6WyJLRVJORUxfU1RBVFNfTUVUUklDUyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABSQgpungcAAJ4HAAArAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL25hdHVyYWwtc29ydC5qc3siaW1wb3J0cyI6WyIuL2pzLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibmF0dXJhbENvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwcm92aWRlTGF6eU1hcDskaM2PX2ltcG9ydHMoW1tcIi4vanMtdXRpbHMuanNcIiwgW1tcInByb3ZpZGVMYXp5TWFwXCIsWyRozY9fYSA9PiAocHJvdmlkZUxhenlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjb21wYXJlTmF0cyA9IChhLCBiKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGRpZmYgPSArYSAtICtiO1xuICBjb25zdCBmaW5pdGVEaWZmID1cbiAgICAoTnVtYmVyLmlzRmluaXRlKGRpZmYpICYmIGRpZmYpIHx8XG4gICAgKGEgPT09IGIgPyAwIDogTnVtYmVyKEJpZ0ludChhKSAtIEJpZ0ludChiKSkgfHwgYS5sZW5ndGggLSBiLmxlbmd0aCk7XG5cbiAgLy9cbiAgcmV0dXJuIE1hdGguc2lnbihmaW5pdGVEaWZmKTtcbn07XG5cbi8vXG4vL1xuLy9cbmNvbnN0IGNvbXBhcmVTdHJpbmdzID0gKGEsIGIpID0+IChhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMCk7XG5cbmNvbnN0IHJDYXB0dXJlRGlnaXRzID0gLyhbMC05XSspLztcblxuLypcblxuXG5cblxuICovXG5jb25zdCBwYXJ0c0NhY2hlID0gbmV3IE1hcCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBuYXR1cmFsQ29tcGFyZSA9IChhLCBiKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmICghcGFydHNDYWNoZS5zaXplKSB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gcGFydHNDYWNoZS5jbGVhcigpKTtcblxuICBjb25zdCBhUGFydHMgPSBwcm92aWRlTGF6eU1hcChwYXJ0c0NhY2hlLCBhLCAoKSA9PiBhLnNwbGl0KHJDYXB0dXJlRGlnaXRzKSk7XG4gIGNvbnN0IGJQYXJ0cyA9IHByb3ZpZGVMYXp5TWFwKHBhcnRzQ2FjaGUsIGIsICgpID0+IGIuc3BsaXQockNhcHR1cmVEaWdpdHMpKTtcblxuICAvL1xuICBsZXQgaSA9IDA7XG4gIGZvciAoOyBpICsgMSA8IGFQYXJ0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIGlmIChpICsgMSA8IGJQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgY29tcGFyZVN0cmluZ3MoYVBhcnRzW2ldLCBiUGFydHNbaV0pIHx8XG4gICAgICAgIGNvbXBhcmVOYXRzKGFQYXJ0c1tpICsgMV0sIGJQYXJ0c1tpICsgMV0pO1xuICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGAke2FQYXJ0c1tpXX0ke2FQYXJ0c1tpICsgMV19YCwgYlBhcnRzW2ldKTtcbiAgICB9XG4gIH1cbiAgaWYgKGJQYXJ0cy5sZW5ndGggPiBhUGFydHMubGVuZ3RoKSB7XG4gICAgLy9cbiAgICByZXR1cm4gY29tcGFyZVN0cmluZ3MoYVBhcnRzW2ldLCBgJHtiUGFydHNbaV19JHtiUGFydHNbaSArIDFdfWApO1xuICB9XG4gIC8vXG4gIHJldHVybiBjb21wYXJlU3RyaW5ncyhhUGFydHNbaV0sIGJQYXJ0c1tpXSk7XG59OyRozY9fb25jZS5uYXR1cmFsQ29tcGFyZShuYXR1cmFsQ29tcGFyZSk7XG5oYXJkZW4obmF0dXJhbENvbXBhcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0dXJhbENvbXBhcmUiOlsibmF0dXJhbENvbXBhcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVku15NYzAADWMwAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9zZXMtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9zdHJlYW0iLCJqZXNzaWUuanMiLCIuL2pzLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIiwiYWdncmVnYXRlVHJ5RmluYWxseSIsImFsbFZhbHVlcyIsImFzc2VydEFsbERlZmluZWQiLCJhdHRlbnVhdGUiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmb3JldmVyIiwiZnJvbVVuaXF1ZUVudHJpZXMiLCJtYWtlTGltaXRlZENvbnNvbGUiLCJvYmplY3RNYXAiLCJvYmplY3RNZXRhTWFwIiwic3RyaXBQcmVmaXgiLCJzeW5jaHJvbml6ZWRUZWUiLCJ0aHJvd0Vycm9yQ29kZSIsInRyeUpzb25QYXJzZSIsInRyeU5vdyIsInVudGlsVHJ1ZSIsIndoaWxlVHJ1ZSIsIndpdGhEZWZlcnJlZENsZWFudXAiLCJ6aXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsb2JqZWN0TWV0YU1hcCxmcm9tVW5pcXVlRW50cmllcyxxLGIsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixYLGRlZXBseUZ1bGZpbGxlZCxpc1ByaW1pdGl2ZSxtYWtlUHJvbWlzZUtpdCxtYWtlUXVldWUsYXN5bmNHZW5lcmF0ZSxsb2dMZXZlbHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJvYmplY3RNYXBcIl1dXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanNcIiwgW1tcIm9iamVjdE1ldGFNYXBcIixbJGjNj19hID0+IChvYmplY3RNZXRhTWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJvYmplY3RNZXRhTWFwXCJdXV1dXSxbXCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qc1wiLCBbW1wiZnJvbVVuaXF1ZUVudHJpZXNcIixbJGjNj19hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRozY9fYSksJGjNj19saXZlW1wiZnJvbVVuaXF1ZUVudHJpZXNcIl1dXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsWyRozY9fYSA9PiAobWFrZVF1ZXVlID0gJGjNj19hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsWyRozY9fYSA9PiAoYXN5bmNHZW5lcmF0ZSA9ICRozY9fYSldXV1dLFtcIi4vanMtdXRpbHMuanNcIiwgW1tcImxvZ0xldmVsc1wiLFskaM2PX2EgPT4gKGxvZ0xldmVscyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgZnJvbUVudHJpZXMsIGtleXMsIHZhbHVlcyB9ID0gT2JqZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG1ha2VMaW1pdGVkQ29uc29sZSA9IG1ha2VMb2dnZXIgPT4ge1xuICBjb25zdCBsaW1pdGVkQ29uc29sZSA9IC8qICAgICAgICAgICAgICAqLyAoXG4gICAgZnJvbUVudHJpZXMobG9nTGV2ZWxzLm1hcChsZXZlbCA9PiBbbGV2ZWwsIG1ha2VMb2dnZXIobGV2ZWwpXSkpXG4gICk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoaGFyZGVuKGxpbWl0ZWRDb25zb2xlKSk7XG59OyRozY9fb25jZS5tYWtlTGltaXRlZENvbnNvbGUobWFrZUxpbWl0ZWRDb25zb2xlKTtcbmhhcmRlbihtYWtlTGltaXRlZENvbnNvbGUpO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZE9iamVjdCA9IGFzeW5jIG9iaiA9PiB7XG4gICFpc1ByaW1pdGl2ZShvYmopIHx8IEZhaWxgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xuICByZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmRlZXBseUZ1bGZpbGxlZE9iamVjdChkZWVwbHlGdWxmaWxsZWRPYmplY3QpO1xuY29uc3QgbWFrZUFnZ3JlZ2F0ZUVycm9yID1cbiAgdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAnZnVuY3Rpb24nXG4gICAgPyAoZXJyb3JzLCBtZXNzYWdlLCBvcHRpb25zKSA9PiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgOiAoZXJyb3JzLCBtZXNzYWdlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBtYWtlRXJyb3IobWVzc2FnZSA/PyAnbXVsdGlwbGUgZXJyb3JzJywgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBlcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBzdHJpcFByZWZpeCA9IChwcmVmaXgsIHN0cikgPT4ge1xuICBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIHx8IEZhaWxgJHtzdHJ9IGlzIG1pc3NpbmcgcHJlZml4ICR7cShwcmVmaXgpfWA7XG4gIHJldHVybiBzdHIuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5zdHJpcFByZWZpeChzdHJpcFByZWZpeCk7XG4gICAgICAgY29uc3QgdGhyb3dFcnJvckNvZGUgPSAoZGV0YWlscywgY29kZSwgb3B0cykgPT4ge1xuICBjb25zdCBlcnIgPSBtYWtlRXJyb3IoZGV0YWlscywgb3B0cz8uY29uc3RydWN0b3IsIHtcbiAgICAuLi5vcHRzLFxuICAgIHNhbml0aXplOiBmYWxzZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsICdjb2RlJywgeyB2YWx1ZTogY29kZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgaGFyZGVuKGVycik7XG4gIHRocm93IGVycjtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLnRocm93RXJyb3JDb2RlKHRocm93RXJyb3JDb2RlKTtcbiAgICAgICBjb25zdCB0cnlOb3cgPSAoZm4sIHRyYW5zZm9ybUVycm9yLCAuLi5hcmdzKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybUVycm9yKGVycik7XG4gICAgfSBjYXRjaCAobmV3RXJyKSB7XG4gICAgICAvL1xuICAgICAgaWYgKCFuZXdFcnIuY2F1c2UpIHtcbiAgICAgICAgY29uc3QgZGVzYyA9IHtcbiAgICAgICAgICB2YWx1ZTogZXJyLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFSZWZsZWN0LmRlZmluZVByb3BlcnR5KG5ld0VyciwgJ2NhdXNlJywgZGVzYykpIHtcbiAgICAgICAgICBhc3NlcnQubm90ZShuZXdFcnIsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3RXJyO1xuICAgIH1cbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS50cnlOb3codHJ5Tm93KTtcbiAgICAgICBjb25zdCB0cnlKc29uUGFyc2UgPSAoanNvblRleHQsIG9uRXJyb3IpID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtRXJyb3IgPVxuICAgIHR5cGVvZiBvbkVycm9yID09PSAnZnVuY3Rpb24nXG4gICAgICA/IG9uRXJyb3JcbiAgICAgIDogZXJyID0+IEZhaWwoW2Ake29uRXJyb3J9OiAke2Vyci5tZXNzYWdlfSBmb3IgaW5wdXQgYCwgJyddLCBqc29uVGV4dCk7XG4gIHJldHVybiB0cnlOb3coKCkgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YganNvblRleHQ7XG4gICAgdHlwZSA9PT0gJ3N0cmluZycgfHwgRmFpbGBJbnB1dCBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJHtiKHR5cGUpfWA7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblRleHQpO1xuICB9LCB0cmFuc2Zvcm1FcnJvcik7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLnRyeUpzb25QYXJzZSh0cnlKc29uUGFyc2UpO1xuICAgICAgIGNvbnN0IFByb21pc2VBbGxPckVycm9ycyA9IGFzeW5jIGl0ZW1zID0+IHtcbiAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChpdGVtcykudGhlbihyZXN1bHRzID0+IHtcbiAgICBjb25zdCBlcnJvcnMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICByZXN1bHRzLmZpbHRlcigoeyBzdGF0dXMgfSkgPT4gc3RhdHVzID09PSAncmVqZWN0ZWQnKVxuICAgICkubWFwKHJlc3VsdCA9PiByZXN1bHQucmVhc29uKTtcbiAgICBpZiAoIWVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHJlc3VsdHMpLm1hcChcbiAgICAgICAgcmVzdWx0ID0+IHJlc3VsdC52YWx1ZSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuUHJvbWlzZUFsbE9yRXJyb3JzKFByb21pc2VBbGxPckVycm9ycyk7XG4gICAgICAgY29uc3QgYWdncmVnYXRlVHJ5RmluYWxseSA9IGFzeW5jICh0cmllciwgZmluYWxpemVyKSA9PlxuICB0cmllcigpLnRoZW4oXG4gICAgYXN5bmMgcmVzdWx0ID0+IGZpbmFsaXplcigpLnRoZW4oKCkgPT4gcmVzdWx0KSxcbiAgICBhc3luYyB0cnlFcnJvciA9PlxuICAgICAgZmluYWxpemVyKHRyeUVycm9yKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAoKSA9PiB0cnlFcnJvcixcbiAgICAgICAgICBmaW5hbGl6ZUVycm9yID0+IG1ha2VBZ2dyZWdhdGVFcnJvcihbdHJ5RXJyb3IsIGZpbmFsaXplRXJyb3JdKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbihlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpLFxuICApO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcbiAgICAgICBjb25zdCB3aXRoRGVmZXJyZWRDbGVhbnVwID0gYXN5bmMgZm4gPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY2xlYW51cHNMSUZPID0gW107XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRDbGVhbnVwID0gY2xlYW51cCA9PiB7XG4gICAgY2xlYW51cHNMSUZPLnVuc2hpZnQoY2xlYW51cCk7XG4gIH07XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGZpbmFsaXplciA9IGFzeW5jIGVyciA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBjbGVhbnVwUmVzdWx0cyA9IGNsZWFudXBzTElGTy5tYXAoYXN5bmMgY2xlYW51cCA9PiB7XG4gICAgICBhd2FpdCBudWxsO1xuICAgICAgcmV0dXJuIGNsZWFudXAoZXJyKTtcbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlQWxsT3JFcnJvcnMoY2xlYW51cFJlc3VsdHMpO1xuICB9O1xuICByZXR1cm4gYWdncmVnYXRlVHJ5RmluYWxseSgoKSA9PiBmbihhZGRDbGVhbnVwKSwgZmluYWxpemVyKTtcbn07XG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS53aXRoRGVmZXJyZWRDbGVhbnVwKHdpdGhEZWZlcnJlZENsZWFudXApO1xuICAgICAgIGNvbnN0IGFzc2VydEFsbERlZmluZWQgPSBvYmogPT4ge1xuICBjb25zdCBtaXNzaW5nID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaXNzaW5nLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgIEZhaWxgbWlzc2luZyAke3EobWlzc2luZyl9YDtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hc3NlcnRBbGxEZWZpbmVkKGFzc2VydEFsbERlZmluZWQpO1xuICAgICAgIGNvbnN0IGF0dGVudWF0ZSA9IChzcGVjaW1lbiwgcGVybWl0LCB0cmFuc2Zvcm0gPSB4ID0+IHgpID0+IHtcbiAgLy9cbiAgaWYgKHBlcm1pdCA9PT0gdHJ1ZSB8fCB0eXBlb2YgcGVybWl0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gIH1cblxuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwYXRoID0gW107XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBleHRyYWN0ID0gKHN1YlNwZWNpbWVuLCBzdWJQZXJtaXQpID0+IHtcbiAgICBpZiAoc3ViUGVybWl0ID09PSBudWxsIHx8IHR5cGVvZiBzdWJQZXJtaXQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBwYXRoLmxlbmd0aCA9PT0gMFxuICAgICAgICA/IEZhaWxgaW52YWxpZCBwZXJtaXQ6ICR7cShwZXJtaXQpfWBcbiAgICAgICAgOiBGYWlsYGludmFsaWQgcGVybWl0IGF0IHBhdGggJHtxKHBhdGgpfTogJHtxKHN1YlBlcm1pdCl9YDtcbiAgICB9IGVsc2UgaWYgKHN1YlNwZWNpbWVuID09PSBudWxsIHx8IHR5cGVvZiBzdWJTcGVjaW1lbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IHBhdGgubGVuZ3RoID09PSAwXG4gICAgICAgID8gRmFpbGBzcGVjaW1lbiBtdXN0IGJlIGFuIG9iamVjdCBmb3IgcGVybWl0ICR7cShwZXJtaXQpfWBcbiAgICAgICAgOiBGYWlsYHNwZWNpbWVuIGF0IHBhdGggJHtxKHBhdGgpfSBtdXN0IGJlIGFuIG9iamVjdCBmb3IgcGVybWl0ICR7cShzdWJQZXJtaXQpfWA7XG4gICAgfVxuICAgIGNvbnN0IHBpY2tzID0gT2JqZWN0LmVudHJpZXMoc3ViUGVybWl0KS5tYXAoKFtzdWJLZXksIGRlZXBQZXJtaXRdKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oc3ViU3BlY2ltZW4sIHN1YktleSkpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBzcGVjaW1lbiBpcyBtaXNzaW5nIHBhdGggJHtxKHBhdGguY29uY2F0KHN1YktleSkpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWVwU3BlY2ltZW4gPSBSZWZsZWN0LmdldChzdWJTcGVjaW1lbiwgc3ViS2V5KTtcbiAgICAgIGlmIChkZWVwUGVybWl0ID09PSB0cnVlIHx8IHR5cGVvZiBkZWVwUGVybWl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gW3N1YktleSwgZGVlcFNwZWNpbWVuXTtcbiAgICAgIH1cbiAgICAgIHBhdGgucHVzaChzdWJLZXkpO1xuICAgICAgY29uc3QgZXh0cmFjdGVkID0gZXh0cmFjdCgvKiAgICAgICAgICAgICAgKi8gKGRlZXBTcGVjaW1lbiksIGRlZXBQZXJtaXQpO1xuICAgICAgY29uc3QgZW50cnkgPSBbc3ViS2V5LCBleHRyYWN0ZWRdO1xuICAgICAgcGF0aC5wb3AoKTtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJhbnNmb3JtKE9iamVjdC5mcm9tRW50cmllcyhwaWNrcyksIHN1YlBlcm1pdCk7XG4gIH07XG5cbiAgLy9cbiAgcmV0dXJuIGV4dHJhY3Qoc3BlY2ltZW4sIHBlcm1pdCk7XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5hdHRlbnVhdGUoYXR0ZW51YXRlKTtcbmNvbnN0IG5vdERvbmUgPSBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBhbHdheXNEb25lID0gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcblxuICAgICAgIGNvbnN0IGZvcmV2ZXIgPSBhc3luY0dlbmVyYXRlKCgpID0+IG5vdERvbmUpO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5mb3JldmVyKGZvcmV2ZXIpO1xuICAgICAgIGNvbnN0IHdoaWxlVHJ1ZSA9IHByb2R1Y2UgPT5cbiAgYXN5bmNHZW5lcmF0ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwcm9kdWNlKCk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGFsd2F5c0RvbmU7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLndoaWxlVHJ1ZSh3aGlsZVRydWUpO1xuICAgICAgIGNvbnN0IHVudGlsVHJ1ZSA9IHByb2R1Y2UgPT5cbiAgYXN5bmNHZW5lcmF0ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwcm9kdWNlKCk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgZG9uZTogdHJ1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICB9KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnVudGlsVHJ1ZSh1bnRpbFRydWUpO1xuICAgICAgIGNvbnN0IHppcCA9ICh4cywgeXMpID0+IGhhcmRlbih4cy5tYXAoKHgsIGkpID0+IFt4LCB5c1sraV1dKSk7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuemlwKHppcCk7XG4gICAgICAgY29uc3QgYWxsVmFsdWVzID0gYXN5bmMgb2JqID0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBQcm9taXNlLmFsbCh2YWx1ZXMob2JqKSk7XG4gIC8vXG4gIHJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMoemlwKGtleXMob2JqKSwgcmVzb2x2ZWQpKSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG4gICAgICAgY29uc3Qgc3luY2hyb25pemVkVGVlID0gKHNvdXJjZVN0cmVhbSwgcmVhZGVyQ291bnQpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGRvbmVSZXN1bHQ7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHF1ZXVlcyA9IFtdO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcHVsbE5leHQgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocXVldWVzLm1hcChxdWV1ZSA9PiBxdWV1ZS5nZXQoKSkpO1xuICAgIGNvbnN0IHJlamVjdGlvbnMgPSBbXTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCByZXNvbHZlcnMgPSBbXTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3Qgc2V0dGxlZFJlc3VsdCBvZiByZXF1ZXN0cykge1xuICAgICAgaWYgKHNldHRsZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIHJlamVjdGlvbnMucHVzaChzZXR0bGVkUmVzdWx0LnJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lIHx8PSAhIXNldHRsZWRSZXN1bHQudmFsdWUuZG9uZTtcbiAgICAgICAgcmVzb2x2ZXJzLnB1c2goc2V0dGxlZFJlc3VsdC52YWx1ZS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoZG9uZVJlc3VsdCkge1xuICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKGRvbmVSZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAocmVqZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbWFrZUVycm9yKFhgVGVlZCBzdHJlYW0gdGhyZXdgKTtcbiAgICAgIGFubm90YXRlRXJyb3IoZXJyb3IsIFhgVGVlZCByZWplY3Rpb25zOiAke3JlamVjdGlvbnN9YCk7XG4gICAgICByZXN1bHQgPVxuICAgICAgICBzb3VyY2VTdHJlYW0udGhyb3c/LihlcnJvcikgfHxcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHNvdXJjZVN0cmVhbS5yZXR1cm4/LigpKS50aGVuKCgpID0+XG4gICAgICAgICAgUHJvbWlzZS5yZWplY3QoZXJyb3IpLFxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZiAoZG9uZSkge1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgc291cmNlU3RyZWFtLnJldHVybj8uKCkgfHxcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc291cmNlU3RyZWFtLm5leHQoKTtcbiAgICB9XG4gICAgcmVzdWx0LnRoZW4oXG4gICAgICByID0+IHtcbiAgICAgICAgaWYgKHIuZG9uZSkge1xuICAgICAgICAgIGRvbmVSZXN1bHQgPSByO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBkb25lUmVzdWx0ID0geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICB9LFxuICAgICk7XG4gICAgZm9yIChjb25zdCByZXNvbHZlIG9mIHJlc29sdmVycykge1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcHVsbE5leHQoKTtcbiAgfTtcblxuICBjb25zdCByZWFkZXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogcmVhZGVyQ291bnQgfSkubWFwKCgpID0+IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBxdWV1ZSA9IG1ha2VRdWV1ZSgpO1xuICAgIHF1ZXVlcy5wdXNoKHF1ZXVlKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmVhZGVyID0gaGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIC8qXG5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgICAgcXVldWUucHV0KHsgdmFsdWU6IHJlc29sdmUsIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBhc3luYyByZXR1cm4oKSB7XG4gICAgICAgIC8qXG5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgICAgcXVldWUucHV0KHsgdmFsdWU6IHJlc29sdmUsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHRocm93KHJlYXNvbikge1xuICAgICAgICBjb25zdCByZWplY3Rpb24gPSBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICAgICAgICBxdWV1ZS5wdXQocmVqZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlamVjdGlvbjtcbiAgICAgIH0sXG4gICAgICAvL1xuICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRlcjtcbiAgICAgIH0sXG4gICAgICAvL1xuICAgICAgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuICAgICAgICBhd2FpdCByZWFkZXIucmV0dXJuKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH0pO1xuXG4gIHZvaWQgcHVsbE5leHQoKTtcbiAgcmV0dXJuIHJlYWRlcnM7XG59OyRozY9fb25jZS5zeW5jaHJvbml6ZWRUZWUoc3luY2hyb25pemVkVGVlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiLGZhbHNlXSwib2JqZWN0TWV0YU1hcCI6WyJvYmplY3RNZXRhTWFwIixmYWxzZV0sImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxpbWl0ZWRDb25zb2xlIjpbIm1ha2VMaW1pdGVkQ29uc29sZSJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sInN0cmlwUHJlZml4IjpbInN0cmlwUHJlZml4Il0sInRocm93RXJyb3JDb2RlIjpbInRocm93RXJyb3JDb2RlIl0sInRyeU5vdyI6WyJ0cnlOb3ciXSwidHJ5SnNvblBhcnNlIjpbInRyeUpzb25QYXJzZSJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJ3aXRoRGVmZXJyZWRDbGVhbnVwIjpbIndpdGhEZWZlcnJlZENsZWFudXAiXSwiYXNzZXJ0QWxsRGVmaW5lZCI6WyJhc3NlcnRBbGxEZWZpbmVkIl0sImF0dGVudWF0ZSI6WyJhdHRlbnVhdGUiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABU+rEhhy4AAIcuAAAxAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3N0b3JhZ2UtdGVzdC11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiLi9kZWJ1Zy5qcyIsIi4vZXJyb3JzLmpzIiwiLi9saWItY2hhaW5TdG9yYWdlLmpzIiwiLi9tYXJzaGFsL2JvYXJkLWNsaWVudC11dGlscy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90ZXN0aW5nLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdE1hcnNoYWxsZXIiLCJkZWZhdWx0U2VyaWFsaXplciIsImRvY3VtZW50U3RvcmFnZVNjaGVtYSIsIm1ha2VBc3luY1F1ZXVlIiwibWFrZUZha2VTdG9yYWdlS2l0IiwibWFrZU1vY2tDaGFpblN0b3JhZ2VSb290Iiwic2xvdFN0cmluZ1Vuc2VyaWFsaXplIiwic2xvdFRvUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxGYXIsbWFrZU1hcnNoYWwsUmVtb3RhYmxlLG1ha2VUcmFjZXIsTm9uTnVsbGlzaCxpc1N0cmVhbUNlbGwsbWFrZUNoYWluU3RvcmFnZVJvb3QsdW5tYXJzaGFsRnJvbVZzdG9yYWdlLGJpbmRBbGxNZXRob2RzLGV2ZW50TG9vcEl0ZXJhdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV0sW1wiUmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlID0gJGjNj19hKV1dXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2Vycm9ycy5qc1wiLCBbW1wiTm9uTnVsbGlzaFwiLFskaM2PX2EgPT4gKE5vbk51bGxpc2ggPSAkaM2PX2EpXV1dXSxbXCIuL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcImlzU3RyZWFtQ2VsbFwiLFskaM2PX2EgPT4gKGlzU3RyZWFtQ2VsbCA9ICRozY9fYSldXSxbXCJtYWtlQ2hhaW5TdG9yYWdlUm9vdFwiLFskaM2PX2EgPT4gKG1ha2VDaGFpblN0b3JhZ2VSb290ID0gJGjNj19hKV1dXV0sW1wiLi9tYXJzaGFsL2JvYXJkLWNsaWVudC11dGlscy5qc1wiLCBbW1widW5tYXJzaGFsRnJvbVZzdG9yYWdlXCIsWyRozY9fYSA9PiAodW5tYXJzaGFsRnJvbVZzdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW1tcImJpbmRBbGxNZXRob2RzXCIsWyRozY9fYSA9PiAoYmluZEFsbE1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3Rlc3RpbmctdXRpbHMuanNcIiwgW1tcImV2ZW50TG9vcEl0ZXJhdGlvblwiLFskaM2PX2EgPT4gKGV2ZW50TG9vcEl0ZXJhdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdTdG9yVFUnLCBmYWxzZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgc2xvdFRvUmVtb3RhYmxlID0gKF9zbG90SWQsIGlmYWNlID0gJ1JlbW90YWJsZScpID0+XG4gIFJlbW90YWJsZShpZmFjZSk7XG5cbi8qXG5cblxuICovJGjNj19vbmNlLnNsb3RUb1JlbW90YWJsZShzbG90VG9SZW1vdGFibGUpO1xuICAgICAgIGNvbnN0IGRlZmF1bHRNYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwodW5kZWZpbmVkLCBzbG90VG9SZW1vdGFibGUsIHtcbiAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG59KTtcblxuLypcblxuICovJGjNj19vbmNlLmRlZmF1bHRNYXJzaGFsbGVyKGRlZmF1bHRNYXJzaGFsbGVyKTtcbiAgICAgICBjb25zdCBkZWZhdWx0U2VyaWFsaXplciA9IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBwYXJzZTogdHh0ID0+IGRlZmF1bHRNYXJzaGFsbGVyLmZyb21DYXBEYXRhKEpTT04ucGFyc2UodHh0KSksXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIHN0cmluZ2lmeTogb2JqID0+IEpTT04uc3RyaW5naWZ5KGRlZmF1bHRNYXJzaGFsbGVyLnRvQ2FwRGF0YShvYmopKSxcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZmF1bHRTZXJpYWxpemVyKGRlZmF1bHRTZXJpYWxpemVyKTtcbmNvbnN0IG1ha2VTbG90U3RyaW5nVW5zZXJpYWxpemUgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpZGVudGl0eVNsb3RUb1ZhbEZuID0gKHNsb3QsIF8pID0+IEZhcigndW5rJywgeyB0b0pTT046ICgpID0+IHNsb3QgfSk7XG4gIGNvbnN0IHsgZnJvbUNhcERhdGEgfSA9IG1ha2VNYXJzaGFsKHVuZGVmaW5lZCwgaWRlbnRpdHlTbG90VG9WYWxGbik7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZSA9IGNhcERhdGEgPT5cbiAgICBKU09OLnBhcnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoZnJvbUNhcERhdGEoY2FwRGF0YSksIChfLCB2YWwpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBgQGVuY3JvbXVsYXRlOiR7dmFsfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAoX2tleSwgdmFsKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwuc3RhcnRzV2l0aCgnQGVuY3JvbXVsYXRlJykpIHtcbiAgICAgICAgICByZXR1cm4gQmlnSW50KHZhbC5zcGxpdCgnOicpWzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIHJldHVybiBoYXJkZW4odW5zZXJpYWxpemUpO1xufTtcbiAgICAgICBjb25zdCBzbG90U3RyaW5nVW5zZXJpYWxpemUgPSBtYWtlU2xvdFN0cmluZ1Vuc2VyaWFsaXplKCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uuc2xvdFN0cmluZ1Vuc2VyaWFsaXplKHNsb3RTdHJpbmdVbnNlcmlhbGl6ZSk7XG4gICAgICAgY29uc3QgbWFrZUFzeW5jUXVldWUgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAqL1xuICBjb25zdCBxdWV1ZSA9IFtdO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCByZXNvbHZlID0gbnVsbDtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcblxuICAvKiAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGVucXVldWUgPSBkYXRhID0+IHtcbiAgICBxdWV1ZS5wdXNoKGRhdGEpO1xuICAgIGlmIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICByZXNvbHZlID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgbGV0IGFscmVhZHlJdGVyYXRpbmcgPSBmYWxzZTtcbiAgY29uc3QgaXRlcmFibGUgPSB7XG4gICAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICBhc3NlcnQoIWFscmVhZHlJdGVyYXRpbmcsIGBBc3luY1F1ZXVlIGlzIGFscmVhZHkgaXRlcmF0aW5nYCk7XG4gICAgICBhbHJlYWR5SXRlcmF0aW5nID0gdHJ1ZTtcbiAgICAgIGF3YWl0IG51bGw7XG4gICAgICB3aGlsZSAoIWRvbmUpIHtcbiAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gKHJlc29sdmUgPSByKSk7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHlpZWxkIHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGNhbmNlbCA9ICgpID0+IChkb25lID0gdHJ1ZSk7XG4gIHJldHVybiBoYXJkZW4oeyBlbnF1ZXVlLCBpdGVyYWJsZSwgY2FuY2VsIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VBc3luY1F1ZXVlKG1ha2VBc3luY1F1ZXVlKTtcbiAgICAgICBjb25zdCBtYWtlRmFrZVN0b3JhZ2VLaXQgPSAoXG4gIHJvb3RQYXRoLFxuICByb290T3B0aW9ucyxcbiAgeyBlYWNoTWVzc2FnZSB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zID0geyBzZXF1ZW5jZTogdHJ1ZSwgLi4ucm9vdE9wdGlvbnMgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGRhdGEgPSBuZXcgTWFwKCk7XG4gIGxldCBjdXJyZW50QmxvY2tIZWlnaHQgPSAwO1xuXG4gIGNvbnN0IHVwZGF0ZU5ld0NlbGxCbG9ja0hlaWdodCA9IChibG9ja0hlaWdodCA9IGN1cnJlbnRCbG9ja0hlaWdodCArIDEpID0+IHtcbiAgICBibG9ja0hlaWdodCA+IGN1cnJlbnRCbG9ja0hlaWdodCB8fFxuICAgICAgRmFpbGBibG9ja0hlaWdodCAke2Jsb2NrSGVpZ2h0fSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAke2N1cnJlbnRCbG9ja0hlaWdodH1gO1xuICAgIGN1cnJlbnRCbG9ja0hlaWdodCA9IGJsb2NrSGVpZ2h0O1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGdldENoaWxkRW50cmllcyA9IHByZWZpeCA9PiB7XG4gICAgYXNzZXJ0KHByZWZpeC5lbmRzV2l0aCgnLicpKTtcbiAgICBjb25zdCBjaGlsZEVudHJpZXMgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBbcGF0aCwgdmFsdWVdIG9mIGRhdGEuZW50cmllcygpKSB7XG4gICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgW3NlZ21lbnQsIC4uLnN1ZmZpeF0gPSBwYXRoLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJyk7XG4gICAgICBpZiAoc3VmZml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjaGlsZEVudHJpZXMuc2V0KHNlZ21lbnQsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNoaWxkRW50cmllcy5oYXMoc2VnbWVudCkpIHtcbiAgICAgICAgY2hpbGRFbnRyaWVzLnNldChzZWdtZW50LCBudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkRW50cmllcztcbiAgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtZXNzYWdlcyA9IFtdO1xuXG4gIGNvbnN0IHRvU3RvcmFnZSA9IEZhcihcbiAgICAnVG9TdG9yYWdlJyxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIG1lc3NhZ2UgPT4ge1xuICAgICAgbWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgIGVhY2hNZXNzYWdlPy4obWVzc2FnZSk7XG4gICAgICBzd2l0Y2ggKG1lc3NhZ2UubWV0aG9kKSB7XG4gICAgICAgIGNhc2UgJ2dldFN0b3JlS2V5Jzoge1xuICAgICAgICAgIGNvbnN0IFtrZXldID0gbWVzc2FnZS5hcmdzO1xuICAgICAgICAgIHJldHVybiB7IHN0b3JlTmFtZTogJ3N3aW5nc2V0Jywgc3RvcmVTdWJrZXk6IGBmYWtlOiR7a2V5fWAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZXQnOiB7XG4gICAgICAgICAgY29uc3QgW2tleV0gPSBtZXNzYWdlLmFyZ3M7XG4gICAgICAgICAgcmV0dXJuIGRhdGEuaGFzKGtleSkgPyBkYXRhLmdldChrZXkpIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGlsZHJlbic6IHtcbiAgICAgICAgICBjb25zdCBba2V5XSA9IG1lc3NhZ2UuYXJncztcbiAgICAgICAgICBjb25zdCBjaGlsZEVudHJpZXMgPSBnZXRDaGlsZEVudHJpZXMoYCR7a2V5fS5gKTtcbiAgICAgICAgICByZXR1cm4gWy4uLmNoaWxkRW50cmllcy5rZXlzKCldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2VudHJpZXMnOiB7XG4gICAgICAgICAgY29uc3QgW2tleV0gPSBtZXNzYWdlLmFyZ3M7XG4gICAgICAgICAgY29uc3QgY2hpbGRFbnRyaWVzID0gZ2V0Q2hpbGRFbnRyaWVzKGAke2tleX0uYCk7XG4gICAgICAgICAgcmV0dXJuIFsuLi5jaGlsZEVudHJpZXMuZW50cmllcygpXS5tYXAoZW50cnkgPT5cbiAgICAgICAgICAgIGVudHJ5WzFdICE9IG51bGwgPyBlbnRyeSA6IFtlbnRyeVswXV0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzZXQnOlxuICAgICAgICBjYXNlICdzZXRXaXRob3V0Tm90aWZ5Jzoge1xuICAgICAgICAgIHRyYWNlKCd0b1N0b3JhZ2Ugc2V0JywgbWVzc2FnZSk7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBuZXdFbnRyaWVzID0gbWVzc2FnZS5hcmdzO1xuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5ld0VudHJpZXMpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGF0YS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYXBwZW5kJzoge1xuICAgICAgICAgIHRyYWNlKCd0b1N0b3JhZ2UgYXBwZW5kJywgbWVzc2FnZSk7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBuZXdFbnRyaWVzID0gbWVzc2FnZS5hcmdzO1xuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5ld0VudHJpZXMpIHtcbiAgICAgICAgICAgIHZhbHVlICE9IG51bGwgfHwgRmFpbGBhdHRlbXB0IHRvIGFwcGVuZCB3aXRoIG5vIHZhbHVlYDtcblxuICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICBsZXQgb2xkVmFsID0gZGF0YS5nZXQoa2V5KTtcbiAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxldCBzdHJlYW1DZWxsO1xuICAgICAgICAgICAgaWYgKG9sZFZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtQ2VsbCA9IEpTT04ucGFyc2Uob2xkVmFsKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaXNTdHJlYW1DZWxsKHN0cmVhbUNlbGwpKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICAgIHN0cmVhbUNlbGwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmVhbUNlbGwgJiZcbiAgICAgICAgICAgICAgICBOdW1iZXIoc3RyZWFtQ2VsbC5ibG9ja0hlaWdodCkgIT09IGN1cnJlbnRCbG9ja0hlaWdodFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzdHJlYW1DZWxsID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIG9sZFZhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RyZWFtQ2VsbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHN0cmVhbUNlbGwgPSB7XG4gICAgICAgICAgICAgICAgYmxvY2tIZWlnaHQ6IFN0cmluZyhjdXJyZW50QmxvY2tIZWlnaHQpLFxuICAgICAgICAgICAgICAgIHZhbHVlczogb2xkVmFsICE9IG51bGwgPyBbb2xkVmFsXSA6IFtdLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyZWFtQ2VsbC52YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBkYXRhLnNldChrZXksIEpTT04uc3RyaW5naWZ5KHN0cmVhbUNlbGwpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2l6ZSc6XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBbLi4uZGF0YS5rZXlzKCldLmZpbHRlcihrID0+XG4gICAgICAgICAgICBrLnN0YXJ0c1dpdGgoYCR7bWVzc2FnZS5hcmdzWzBdfS5gKSxcbiAgICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBFcnJvcihgdW5zdXBwb3J0ZWQgbWV0aG9kOiAke21lc3NhZ2UubWV0aG9kfWApO1xuICAgICAgfVxuICAgIH0sXG4gICk7XG4gIGNvbnN0IHJvb3ROb2RlID0gbWFrZUNoYWluU3RvcmFnZVJvb3QodG9TdG9yYWdlLCByb290UGF0aCwgcmVzb2x2ZWRPcHRpb25zKTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBnZXRWYWx1ZXMgPSBwYXRoID0+IHtcbiAgICBhc3NlcnQocmVzb2x2ZWRPcHRpb25zLnNlcXVlbmNlKTtcbiAgICBjb25zdCBub2RlRGF0YSA9IGRhdGEuZ2V0KHBhdGgpO1xuICAgIGFzc2VydChub2RlRGF0YSwgYG5vIGRhdGEgYXQgcGF0aCAke3BhdGh9YCk7XG4gICAgY29uc3Qgd3JhcHBlciA9IEpTT04ucGFyc2Uobm9kZURhdGEpO1xuICAgIHJldHVybiB3cmFwcGVyLnZhbHVlcztcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHJvb3ROb2RlLFxuXG4gICAgZGF0YTogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoZGF0YSksXG4gICAgdXBkYXRlTmV3Q2VsbEJsb2NrSGVpZ2h0LFxuICAgIGdldFZhbHVlcyxcbiAgICBtZXNzYWdlcyxcbiAgICB0b1N0b3JhZ2UsXG4gIH07XG59OyRozY9fb25jZS5tYWtlRmFrZVN0b3JhZ2VLaXQobWFrZUZha2VTdG9yYWdlS2l0KTtcbmhhcmRlbihtYWtlRmFrZVN0b3JhZ2VLaXQpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBtYWtlTW9ja0NoYWluU3RvcmFnZVJvb3QgPSAoKSA9PiB7XG4gIGNvbnN0IHsgcm9vdE5vZGUsIGRhdGEgfSA9IG1ha2VGYWtlU3RvcmFnZUtpdCgnbW9ja0NoYWluU3RvcmFnZVJvb3QnKTtcbiAgcmV0dXJuIEZhcignbW9ja0NoYWluU3RvcmFnZScsIHtcbiAgICAuLi5iaW5kQWxsTWV0aG9kcyhyb290Tm9kZSksXG4gICAgLypcblxuXG5cblxuXG5cblxuXG5cbiAgICAgKi9cbiAgICBnZXRCb2R5OiAocGF0aCwgbWFyc2hhbGxlciA9IGRlZmF1bHRNYXJzaGFsbGVyLCBpbmRleCA9IC0xKSA9PiB7XG4gICAgICBkYXRhLnNpemUgfHwgRmFpbGBubyBkYXRhIGluIHN0b3JhZ2VgO1xuICAgICAgLypcblxuICAgICAgICovXG4gICAgICBjb25zdCBmcm9tQ2FwRGF0YSA9ICguLi5hcmdzKSA9PlxuICAgICAgICBSZWZsZWN0LmFwcGx5KG1hcnNoYWxsZXIuZnJvbUNhcERhdGEsIG1hcnNoYWxsZXIsIGFyZ3MpO1xuICAgICAgcmV0dXJuIHVubWFyc2hhbEZyb21Wc3RvcmFnZShkYXRhLCBwYXRoLCBmcm9tQ2FwRGF0YSwgaW5kZXgpO1xuICAgIH0sXG4gICAga2V5czogKCkgPT4gWy4uLmRhdGEua2V5cygpXSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VNb2NrQ2hhaW5TdG9yYWdlUm9vdChtYWtlTW9ja0NoYWluU3RvcmFnZVJvb3QpO1xuICAgICAgIGNvbnN0IGRvY3VtZW50U3RvcmFnZVNjaGVtYSA9IGFzeW5jICh0LCBzdG9yYWdlLCBvcHRzKSA9PiB7XG4gIC8vXG4gIGF3YWl0IGV2ZW50TG9vcEl0ZXJhdGlvbigpO1xuXG4gIGNvbnN0IGdldExhc3QgPSAoLyogICAgICAgICAgICAgICAgICovIGNlbGwpID0+XG4gICAgSlNPTi5wYXJzZShjZWxsKS52YWx1ZXMuYXQoLTEpIHx8IGFzc2VydC5mYWlsKCk7XG4gIGNvbnN0IHsgc2hvd1ZhbHVlID0gcyA9PiBzIH0gPSBvcHRzO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGdldEJvZHlEZWZhdWx0ID0gKGQsIGspID0+IHNob3dWYWx1ZShnZXRMYXN0KE5vbk51bGxpc2goZC5nZXQoaykpKSk7XG5cbiAgY29uc3QgW2tleXMsIGdldEJvZHldID1cbiAgICAna2V5cycgaW4gc3RvcmFnZVxuICAgICAgPyBbc3RvcmFnZS5rZXlzKCksICgvKiAgICAgICAgICAgICAgICAgKi8gaykgPT4gc3RvcmFnZS5nZXRCb2R5KGspXVxuICAgICAgOiBbXG4gICAgICAgICAgc3RvcmFnZS5kYXRhLmtleXMoKSxcbiAgICAgICAgICAoLyogICAgICAgICAgICAgICAgICovIGspID0+IGdldEJvZHlEZWZhdWx0KHN0b3JhZ2UuZGF0YSwgayksXG4gICAgICAgIF07XG5cbiAgY29uc3QgeyBwYXR0ZXJuLCByZXBsYWNlbWVudCB9ID1cbiAgICAncGF0dGVybicgaW4gb3B0c1xuICAgICAgPyBvcHRzXG4gICAgICA6IHsgcGF0dGVybjogJ21vY2tDaGFpblN0b3JhZ2VSb290LicsIHJlcGxhY2VtZW50OiAncHVibGlzaGVkLicgfTtcblxuICBjb25zdCBwcnVuZWQgPSBbLi4ua2V5c11cbiAgICAuc29ydCgpXG4gICAgLmZpbHRlcihcbiAgICAgICdub2RlJyBpbiBvcHRzXG4gICAgICAgID8ga2V5ID0+XG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgLnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpXG4gICAgICAgICAgICAgIC5zdGFydHNXaXRoKGBwdWJsaXNoZWQuJHtvcHRzLm5vZGV9YClcbiAgICAgICAgOiBfZW50cnkgPT4gdHJ1ZSxcbiAgICApO1xuXG4gIGNvbnN0IGlsbHVzdHJhdGlvbiA9IHBydW5lZC5tYXAoXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBrZXkgPT4gW2tleS5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KSwgZ2V0Qm9keShrZXkpXSxcbiAgKTtcblxuICBjb25zdCBub3RlID1cbiAgICAnbm90ZScgaW4gb3B0c1xuICAgICAgPyBvcHRzLm5vdGVcbiAgICAgIDogYFVuZGVyIFwicHVibGlzaGVkXCIsIHRoZSBcIiR7b3B0cy5ub2RlfVwiIG5vZGUgaXMgZGVsZWdhdGVkIHRvICR7b3B0cy5vd25lcn0uYDtcbiAgY29uc3QgYm9pbGVycGxhdGUgPSBgXG5UaGUgZXhhbXBsZSBiZWxvdyBpbGx1c3RyYXRlcyB0aGUgc2NoZW1hIG9mIHRoZSBkYXRhIHB1Ymxpc2hlZCB0aGVyZS5cblxuU2VlIGFsc28gYm9hcmQgbWFyc2hhbGxpbmcgY29udmVudGlvbnMgKF90byBhcHBlYXJfKS5gO1xuICB0LnNuYXBzaG90KGlsbHVzdHJhdGlvbiwgbm90ZSArIGJvaWxlcnBsYXRlKTtcbn07JGjNj19vbmNlLmRvY3VtZW50U3RvcmFnZVNjaGVtYShkb2N1bWVudFN0b3JhZ2VTY2hlbWEpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2xvdFRvUmVtb3RhYmxlIjpbInNsb3RUb1JlbW90YWJsZSJdLCJkZWZhdWx0TWFyc2hhbGxlciI6WyJkZWZhdWx0TWFyc2hhbGxlciJdLCJkZWZhdWx0U2VyaWFsaXplciI6WyJkZWZhdWx0U2VyaWFsaXplciJdLCJzbG90U3RyaW5nVW5zZXJpYWxpemUiOlsic2xvdFN0cmluZ1Vuc2VyaWFsaXplIl0sIm1ha2VBc3luY1F1ZXVlIjpbIm1ha2VBc3luY1F1ZXVlIl0sIm1ha2VGYWtlU3RvcmFnZUtpdCI6WyJtYWtlRmFrZVN0b3JhZ2VLaXQiXSwibWFrZU1vY2tDaGFpblN0b3JhZ2VSb290IjpbIm1ha2VNb2NrQ2hhaW5TdG9yYWdlUm9vdCJdLCJkb2N1bWVudFN0b3JhZ2VTY2hlbWEiOlsiZG9jdW1lbnRTdG9yYWdlU2NoZW1hIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKMaFLHCBgAAwgYAACwAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdGVzdGluZy11dGlscy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZXZlbnRMb29wSXRlcmF0aW9uIiwiaW5zcGVjdE1hcFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKlxuXG5cbiAqL1xuLyogICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBldmVudExvb3BJdGVyYXRpb24gPSBhc3luYyAoKSA9PlxuICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7JGjNj19vbmNlLmV2ZW50TG9vcEl0ZXJhdGlvbihldmVudExvb3BJdGVyYXRpb24pO1xuaGFyZGVuKGV2ZW50TG9vcEl0ZXJhdGlvbik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN0cmluZ09yVGFnID0gdmFsdWUgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufTtcbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgaW5zcGVjdE1hcFN0b3JlID0gc3RvcmUgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBvYmogPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygc3RvcmUua2V5cygpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICBjb25zdCBoYXNLZXlzID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAna2V5cycgaW4gdmFsdWU7XG4gICAgY29uc3QgaW5kZXggPSBzdHJpbmdPclRhZyhrZXkpO1xuICAgIGlmIChoYXNLZXlzICYmICdnZXQnIGluIHZhbHVlKSB7XG4gICAgICBvYmpbaW5kZXhdID0gaW5zcGVjdE1hcFN0b3JlKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0tleXMpIHtcbiAgICAgIG9ialtpbmRleF0gPSBBcnJheS5mcm9tKHZhbHVlLmtleXMoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtpbmRleF0gPVxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWVcbiAgICAgICAgICA/IHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ11cbiAgICAgICAgICA6IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufTskaM2PX29uY2UuaW5zcGVjdE1hcFN0b3JlKGluc3BlY3RNYXBTdG9yZSk7XG5oYXJkZW4oaW5zcGVjdE1hcFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV2ZW50TG9vcEl0ZXJhdGlvbiI6WyJldmVudExvb3BJdGVyYXRpb24iXSwiaW5zcGVjdE1hcFN0b3JlIjpbImluc3BlY3RNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAgI8qkFwMAABcDAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3RtcERpci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRlbXBEaXJGYWN0b3J5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VUZW1wRGlyRmFjdG9yeSA9IHRtcCA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHRtcERpciA9IHByZWZpeCA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCByZW1vdmVDYWxsYmFjayB9ID0gdG1wLmRpclN5bmMoe1xuICAgICAgcHJlZml4LFxuICAgICAgdW5zYWZlQ2xlYW51cDogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gW25hbWUsIHJlbW92ZUNhbGxiYWNrXTtcbiAgfTtcbiAgcmV0dXJuIHRtcERpcjtcbn07JGjNj19vbmNlLm1ha2VUZW1wRGlyRmFjdG9yeShtYWtlVGVtcERpckZhY3RvcnkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRlbXBEaXJGYWN0b3J5IjpbIm1ha2VUZW1wRGlyRmFjdG9yeSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACysov1GwMAABsDAAAoAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVDaGVjay5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImNhc3QiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0eXBlbGVzc011c3RNYXRjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+ICh0eXBlbGVzc011c3RNYXRjaCA9ICRozY9fYSldXV1dXSk7XG5cblxuLypcblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG11c3RNYXRjaCA9IHR5cGVsZXNzTXVzdE1hdGNoO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG4gICAgICAgY29uc3QgY2FzdCA9IChzcGVjaW1lbiwgcGF0dCkgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIHBhdHQpO1xuICByZXR1cm4gc3BlY2ltZW47XG59OyRozY9fb25jZS5jYXN0KGNhc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJjYXN0IjpbImNhc3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwGohHEcEAABHBAAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQnJpZGdlQmlnSW50U2hhcGUiLCJTdG9yYWdlTm9kZVNoYXBlIiwiVW5ndWFyZGVkSGVscGVySSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKlxuXG4gKi9cblxuICAgICAgIGNvbnN0IFN0b3JhZ2VOb2RlU2hhcGUgPSBNLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLlN0b3JhZ2VOb2RlU2hhcGUoU3RvcmFnZU5vZGVTaGFwZSk7XG4gICAgICAgY29uc3QgVW5ndWFyZGVkSGVscGVySSA9IE0uaW50ZXJmYWNlKFxuICAnaGVscGVyJyxcbiAge30sXG4gIC8vXG4gIHsgc2xvcHB5OiB0cnVlIH0sXG4pO1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cbiAqLyRozY9fb25jZS5Vbmd1YXJkZWRIZWxwZXJJKFVuZ3VhcmRlZEhlbHBlckkpO1xuICAgICAgIGNvbnN0IEJyaWRnZUJpZ0ludFNoYXBlID0gTS5vcihNLm51bWJlcigpLCBNLnN0cmluZygpKTskaM2PX29uY2UuQnJpZGdlQmlnSW50U2hhcGUoQnJpZGdlQmlnSW50U2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RvcmFnZU5vZGVTaGFwZSI6WyJTdG9yYWdlTm9kZVNoYXBlIl0sIlVuZ3VhcmRlZEhlbHBlckkiOlsiVW5ndWFyZGVkSGVscGVySSJdLCJCcmlkZ2VCaWdJbnRTaGFwZSI6WyJCcmlkZ2VCaWdJbnRTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJJ2vftpBwAAaQcAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlIiwiaXNBYmFuZG9uZWRFcnJvciIsImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLG1hdGNoZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGlzRnJvemVuIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5cbiAgICAgICBjb25zdCBVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlID0gaGFyZGVuKHtcbiAgbmFtZTogJ3ZhdFVwZ3JhZGVkJyxcbiAgdXBncmFkZU1lc3NhZ2U6IE0uc3RyaW5nKCksXG4gIGluY2FybmF0aW9uTnVtYmVyOiBNLm51bWJlcigpLFxufSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZShVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAodXBncmFkZU1lc3NhZ2UsIHRvSW5jYXJuYXRpb25OdW1iZXIpID0+XG4gIGhhcmRlbih7XG4gICAgbmFtZTogJ3ZhdFVwZ3JhZGVkJyxcbiAgICB1cGdyYWRlTWVzc2FnZSxcbiAgICBpbmNhcm5hdGlvbk51bWJlcjogdG9JbmNhcm5hdGlvbk51bWJlcixcbiAgfSk7JGjNj19vbmNlLm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbihtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuaGFyZGVuKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSByZWFzb24gPT5cbiAgcmVhc29uICE9IG51bGwgJiYgLy9cbiAgaXNGcm96ZW4ocmVhc29uKSAmJlxuICBtYXRjaGVzKHJlYXNvbiwgVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSk7JGjNj19vbmNlLmlzVXBncmFkZURpc2Nvbm5lY3Rpb24oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNBYmFuZG9uZWRFcnJvciA9IHJlYXNvbiA9PlxuICByZWFzb24gIT0gbnVsbCAmJiAvL1xuICBpc0Zyb3plbihyZWFzb24pICYmXG4gIG1hdGNoZXMocmVhc29uLCBNLmVycm9yKCkpICYmXG4gIC8vXG4gIC8vXG4gIHJlYXNvbi5tZXNzYWdlID09PSAndmF0IHRlcm1pbmF0ZWQnOyRozY9fb25jZS5pc0FiYW5kb25lZEVycm9yKGlzQWJhbmRvbmVkRXJyb3IpO1xuaGFyZGVuKGlzQWJhbmRvbmVkRXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSI6WyJVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlIl0sIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiI6WyJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiI6WyJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIl0sImlzQWJhbmRvbmVkRXJyb3IiOlsiaXNBYmFuZG9uZWRFcnJvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADQlkot7wgAAO8IAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxzdWJzY3JpYmVMYXRlc3Q7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIgPSBzdWJzY3JpYmVMYXRlc3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuICAgICAgIGNvbnN0IG9ic2VydmVJdGVyYXRvciA9IChhc3luY0l0ZXJhdG9yUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChhY2ssIG9ic2VydmVyRXJyb3IpID0+IHtcbiAgICBjb25zdCByZWN1ciA9ICgpID0+IHtcbiAgICAgIEUud2hlbihcbiAgICAgICAgRShhc3luY0l0ZXJhdG9yUCkubmV4dCgpLFxuICAgICAgICAoeyB2YWx1ZSwgZG9uZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCAmJiBpdGVyYXRpb25PYnNlcnZlci5maW5pc2godmFsdWUpO1xuICAgICAgICAgICAgYWNrKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlICYmXG4gICAgICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbiAgICAgICAgICAgIHJlY3VyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWFzb24gPT4ge1xuICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLmZhaWwgJiYgaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbChyZWFzb24pO1xuICAgICAgICAgIGFjayh1bmRlZmluZWQpO1xuICAgICAgICB9LFxuICAgICAgKS5jYXRjaChvYnNlcnZlckVycm9yKTtcbiAgICB9O1xuICAgIHJlY3VyKCk7XG4gIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5vYnNlcnZlSXRlcmF0b3Iob2JzZXJ2ZUl0ZXJhdG9yKTtcbiAgICAgICBjb25zdCBvYnNlcnZlSXRlcmF0aW9uID0gKGFzeW5jSXRlcmFibGVQLCBpdGVyYXRpb25PYnNlcnZlcikgPT4ge1xuICBjb25zdCBpdGVyYXRvclAgPSBFKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgcmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsIGl0ZXJhdGlvbk9ic2VydmVyKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbiAgICAgICBjb25zdCBvYnNlcnZlTm90aWZpZXIgPSAobm90aWZpZXJQLCBpdGVyYXRpb25PYnNlcnZlcikgPT5cbiAgb2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpYmVMYXRlc3Qobm90aWZpZXJQKSwgaXRlcmF0aW9uT2JzZXJ2ZXIpOyRozY9fb25jZS5vYnNlcnZlTm90aWZpZXIob2JzZXJ2ZU5vdGlmaWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwj7tuOsHAADrBwAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi90b3BpYy5qcyIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbXV0sW1wiLi9ub3RpZmllci5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtdXSxbXCIuL3RvcGljLmpzXCIsIFtdXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtdXSxbXCIuL3N0b3Jlc3ViLmpzXCIsIFtdXSxbXCIuL3N0b3JlZC1ub3RpZmllci5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcHVibGlzaC1raXQuanMiOltbIm1ha2VQdWJsaXNoS2l0IiwibWFrZVB1Ymxpc2hLaXQiXSxbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLFsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSxbIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlRWFjaFRvcGljSSJdLFsiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLFsiU3Vic2NyaWJlclNoYXBlIiwiU3Vic2NyaWJlclNoYXBlIl1dLCIuL3N1YnNjcmliZS5qcyI6W1sic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUVhY2giXSxbInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCJdXSwiLi9ub3RpZmllci5qcyI6W1sibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyIl0sWyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiXSxbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXSxbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXV0sIi4vc3Vic2NyaWJlci5qcyI6W1sibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb24iXSxbIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il1dLCIuL3RvcGljLmpzIjpbWyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIiwibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdXSwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyI6W1sib2JzZXJ2ZU5vdGlmaWVyIiwib2JzZXJ2ZU5vdGlmaWVyIl0sWyJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiXSxbIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0aW9uIl0sWyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAhvssEJhMAACYTAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRSxGYXIsbWFrZVB1Ymxpc2hLaXQsc3Vic2NyaWJlTGF0ZXN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllciA9IHNoYXJhYmxlSW50ZXJuYWxzUCA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG5vdGlmaWVyID0gRmFyKCdub3RpZmllcicsIHtcbiAgICAuLi5zdWJzY3JpYmVMYXRlc3Qoc2hhcmFibGVJbnRlcm5hbHNQKSxcbiAgICBnZXRVcGRhdGVTaW5jZTogYXN5bmMgdXBkYXRlQ291bnQgPT5cbiAgICAgIEUoc2hhcmFibGVJbnRlcm5hbHNQKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5cbiAgICAvKlxuXG5cblxuXG4gICAgICovXG4gICAgZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczogYXN5bmMgKCkgPT4gc2hhcmFibGVJbnRlcm5hbHNQLFxuICAgIC8qXG5cblxuXG4gICAgICovXG4gICAgZ2V0U3RvcmVLZXk6ICgpID0+IGhhcmRlbih7IG5vdGlmaWVyIH0pLFxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5tYWtlTm90aWZpZXIobWFrZU5vdGlmaWVyKTtcbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciA9IHN1YnNjcmliZXIgPT4ge1xuICAvKlxuXG4gICAqL1xuICBjb25zdCBiYXNlTm90aWZpZXIgPSBoYXJkZW4oe1xuICAgIGdldFVwZGF0ZVNpbmNlOiAodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpID0+XG4gICAgICBFKHN1YnNjcmliZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuICAgIC4uLmJhc2VOb3RpZmllcixcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJLaXQgPSAoLi4uaW5pdGlhbFN0YXRlQXJyKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG5cbiAgY29uc3Qgbm90aWZpZXIgPSBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyKTtcblxuICBjb25zdCB1cGRhdGVyID0gRmFyKCd1cGRhdGVyJywge1xuICAgIHVwZGF0ZVN0YXRlOiBzdGF0ZSA9PiBwdWJsaXNoZXIucHVibGlzaChzdGF0ZSksXG4gICAgZmluaXNoOiBjb21wbGV0aW9uID0+IHB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG4gICAgZmFpbDogcmVhc29uID0+IHB1Ymxpc2hlci5mYWlsKHJlYXNvbiksXG4gIH0pO1xuXG4gIGFzc2VydChpbml0aWFsU3RhdGVBcnIubGVuZ3RoIDw9IDEsICd0b28gbWFueSBhcmd1bWVudHMnKTtcbiAgaWYgKGluaXRpYWxTdGF0ZUFyci5sZW5ndGggPT09IDEpIHtcbiAgICB1cGRhdGVyLnVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZUFyclswXSk7XG4gIH1cblxuICAvL1xuICAvL1xuICByZXR1cm4gaGFyZGVuKHsgbm90aWZpZXIsIHVwZGF0ZXIgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU5vdGlmaWVyS2l0KG1ha2VOb3RpZmllcktpdCk7XG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUgPSBhc3luY0l0ZXJhYmxlUCA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yUCA9IEUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IG9wdE5leHRQcm9taXNlO1xuICBsZXQgY3VycmVudFVwZGF0ZUNvdW50ID0gMG47XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGN1cnJlbnRSZXNwb25zZTtcbiAgbGV0IGZpbmFsID0gZmFsc2U7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYmFzZU5vdGlmaWVyID0gRmFyKCdiYXNlTm90aWZpZXInLCB7XG4gICAgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQgPSAtMW4pIHtcbiAgICAgIGlmICh1cGRhdGVDb3VudCA8IGN1cnJlbnRVcGRhdGVDb3VudCkge1xuICAgICAgICBpZiAoY3VycmVudFJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHVwZGF0ZUNvdW50ICE9PSBjdXJyZW50VXBkYXRlQ291bnQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgaWYgKGZpbmFsKSB7XG4gICAgICAgIGFzc2VydChjdXJyZW50UmVzcG9uc2UgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmICghb3B0TmV4dFByb21pc2UpIHtcbiAgICAgICAgY29uc3QgbmV4dEl0ZXJSZXN1bHRQID0gRShpdGVyYXRvclApLm5leHQoKTtcbiAgICAgICAgb3B0TmV4dFByb21pc2UgPSBFLndoZW4oXG4gICAgICAgICAgbmV4dEl0ZXJSZXN1bHRQLFxuICAgICAgICAgICh7IGRvbmUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICAgIGFzc2VydCghZmluYWwpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgZmluYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudFVwZGF0ZUNvdW50ICs9IDFuO1xuICAgICAgICAgICAgY3VycmVudFJlc3BvbnNlID0gaGFyZGVuKHtcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHVwZGF0ZUNvdW50OiBkb25lID8gdW5kZWZpbmVkIDogY3VycmVudFVwZGF0ZUNvdW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcHROZXh0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBfcmVhc29uID0+IHtcbiAgICAgICAgICAgIGZpbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIGN1cnJlbnRSZXNwb25zZSA9XG4gICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAobmV4dEl0ZXJSZXN1bHRQKTtcbiAgICAgICAgICAgIG9wdE5leHRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdE5leHRQcm9taXNlO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG5vdGlmaWVyID0gRmFyKCdub3RpZmllcicsIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4gICAgLi4uYmFzZU5vdGlmaWVyLFxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUobWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCJdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB10cSo4DIAAOAyAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3B1Ymxpc2gta2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGF0dGVybnMiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiUHVibGlzaGVySSIsIlN1YnNjcmliZXJJIiwiU3Vic2NyaWJlclNoYXBlIiwiVXBkYXRlQ291bnRTaGFwZSIsIm1ha2VQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHVibGlzaEtpdElLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRSxGYXIsbWFrZVByb21pc2VLaXQsTSxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQsY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLFskaM2PX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbmNvbnN0IHNpbmsgPSAoKSA9PiB7fTtcbmNvbnN0IG1ha2VRdWlldFJlamVjdGlvbiA9IHJlYXNvbiA9PiB7XG4gIGNvbnN0IHJlamVjdGlvbiA9IGhhcmRlbihQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbiAgdm9pZCBFLndoZW4ocmVqZWN0aW9uLCBzaW5rLCBzaW5rKTtcbiAgcmV0dXJuIHJlamVjdGlvbjtcbn07XG5jb25zdCB0b29GYXJSZWplY3Rpb24gPSBtYWtlUXVpZXRSZWplY3Rpb24oXG4gIGhhcmRlbihFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKSxcbik7XG5cbiAgICAgICBjb25zdCBQdWJsaXNoZXJJID0gTS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicsIHtcbiAgcHVibGlzaDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmluaXNoOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxufSk7XG5cbi8vXG4kaM2PX29uY2UuUHVibGlzaGVySShQdWJsaXNoZXJJKTtjb25zdCBVcGRhdGVDb3VudFNoYXBlPU0ub3IoTS5iaWdpbnQoKSxNLm51bWJlcigpKTskaM2PX29uY2UuVXBkYXRlQ291bnRTaGFwZShVcGRhdGVDb3VudFNoYXBlKTtcbiAgICAgICBjb25zdCBTdWJzY3JpYmVySSA9IE0uaW50ZXJmYWNlKCdTdWJzY3JpYmVyJywge1xuICBzdWJzY3JpYmVBZnRlcjogTS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldFVwZGF0ZVNpbmNlOiBNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG4gICAgICAgY29uc3QgcHVibGlzaEtpdElLaXQgPSBoYXJkZW4oe1xuICBwdWJsaXNoZXI6IFB1Ymxpc2hlckksXG4gIHN1YnNjcmliZXI6IFN1YnNjcmliZXJJLFxufSk7JGjNj19vbmNlLnB1Ymxpc2hLaXRJS2l0KHB1Ymxpc2hLaXRJS2l0KTtcblxuICAgICAgIGNvbnN0IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUgPSBNLmludGVyZmFjZShcbiAgJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyxcbiAge1xuICAgIGZvcms6IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSwgLy9cbiAgICBuZXh0OiBNLmNhbGxXaGVuKCkucmV0dXJucyhNLmFueSgpKSxcbiAgfSxcbik7JGjNj19vbmNlLkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUoRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJdGVyYWJsZUVhY2hUb3BpY0kgPSBNLmludGVyZmFjZSgnSXRlcmFibGVFYWNoVG9waWMnLCB7XG4gIHN1YnNjcmliZUFmdGVyOlxuICAgIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLnN1YnNjcmliZUFmdGVyLFxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpLFxuICApLFxufSk7JGjNj19vbmNlLkl0ZXJhYmxlRWFjaFRvcGljSShJdGVyYWJsZUVhY2hUb3BpY0kpO1xuXG4gICAgICAgY29uc3QgSXRlcmFibGVMYXRlc3RUb3BpY0kgPSBNLmludGVyZmFjZSgnSXRlcmFibGVMYXRlc3RUb3BpYycsIHtcbiAgZ2V0VXBkYXRlU2luY2U6XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFN1YnNjcmliZXJJKS5tZXRob2RHdWFyZHMuZ2V0VXBkYXRlU2luY2UsXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IE0uY2FsbCgpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyksXG4gICksXG59KTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLkl0ZXJhYmxlTGF0ZXN0VG9waWNJKEl0ZXJhYmxlTGF0ZXN0VG9waWNJKTtcbmNvbnN0IHdlYWtNZW1vaXplVW5hcnkgPSBmbiA9PiB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbiAgcmV0dXJuIGFyZyA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgY29uc3Qgb2FyZyA9IGFyZztcbiAgICBpZiAoY2FjaGUuaGFzKG9hcmcpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KG9hcmcpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmbihhcmcpO1xuICAgIGNhY2hlLnNldChvYXJnLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkID0gcmVjb3JkID0+IHtcbiAgY29uc3Qge1xuICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICBwdWJsaXNoQ291bnQsXG4gIH0gPSByZWNvcmQ7XG4gIGlmIChkb25lKSB7XG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIHVwZGF0ZUNvdW50OiB1bmRlZmluZWQgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCB1cGRhdGVDb3VudDogcHVibGlzaENvdW50IH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQdWJsaXNoS2l0ID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdGFpbFA7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdGFpbFI7XG4gICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG5cbiAgbGV0IGN1cnJlbnRQdWJsaXNoQ291bnQgPSAwbjtcbiAgbGV0IGN1cnJlbnRQID0gdGFpbFA7XG4gIGNvbnN0IGFkdmFuY2VDdXJyZW50ID0gKGRvbmUsIHZhbHVlLCByZWplY3Rpb24pID0+IHtcbiAgICBpZiAodGFpbFIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gICAgfVxuXG4gICAgY3VycmVudFB1Ymxpc2hDb3VudCArPSAxbjtcbiAgICBjdXJyZW50UCA9IHRhaWxQO1xuICAgIGNvbnN0IHJlc29sdmVDdXJyZW50ID0gdGFpbFI7XG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gICAgICB0YWlsUiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB9XG5cbiAgICBpZiAocmVqZWN0aW9uKSB7XG4gICAgICByZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlQ3VycmVudChcbiAgICAgICAgaGFyZGVuKHtcbiAgICAgICAgICBoZWFkOiB7IHZhbHVlLCBkb25lIH0sXG4gICAgICAgICAgcHVibGlzaENvdW50OiBjdXJyZW50UHVibGlzaENvdW50LFxuICAgICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCA9IHdlYWtNZW1vaXplVW5hcnkoXG4gICAgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZCxcbiAgKTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IHN1YnNjcmliZXIgPSBGYXIoJ1N1YnNjcmliZXInLCB7XG4gICAgc3Vic2NyaWJlQWZ0ZXI6IChwdWJsaXNoQ291bnQgPSAtMW4pID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCAnYmlnaW50Jyk7XG4gICAgICBpZiAocHVibGlzaENvdW50ID09PSBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgIHJldHVybiB0YWlsUDtcbiAgICAgIH0gZWxzZSBpZiAocHVibGlzaENvdW50IDwgY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudFA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0VXBkYXRlU2luY2U6IHVwZGF0ZUNvdW50ID0+IHtcbiAgICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuICAgICAgfVxuICAgICAgdXBkYXRlQ291bnQgPSBCaWdJbnQodXBkYXRlQ291bnQpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc3Vic2NyaWJlclxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLnRoZW4oKCkgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcHVibGlzaGVyID0gRmFyKCdQdWJsaXNoZXInLCB7XG4gICAgcHVibGlzaDogdmFsdWUgPT4ge1xuICAgICAgYWR2YW5jZUN1cnJlbnQoZmFsc2UsIHZhbHVlKTtcbiAgICB9LFxuICAgIGZpbmlzaDogZmluYWxWYWx1ZSA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudCh0cnVlLCBmaW5hbFZhbHVlKTtcbiAgICB9LFxuICAgIGZhaWw6IHJlYXNvbiA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudCh0cnVlLCB1bmRlZmluZWQsIG1ha2VRdWlldFJlamVjdGlvbihyZWFzb24pKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGhhcmRlbih7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9KTtcbn07JGjNj19vbmNlLm1ha2VQdWJsaXNoS2l0KG1ha2VQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlUHVibGlzaEtpdCk7XG5cbmNvbnN0IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZSA9IGhhcmRlbih7XG4gIHZhbHVlRHVyYWJpbGl0eTogTS5hbnkoKSxcbiAgcHVibGlzaENvdW50OiBNLmFueSgpLFxuICBzdGF0dXM6IE0uYW55KCksXG4gIGhhc1ZhbHVlOiBNLmFueSgpLFxuICB2YWx1ZTogTS5hbnkoKSxcbn0pO1xuXG4vL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSA9IChvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgeyB2YWx1ZUR1cmFiaWxpdHkgPSAnbWFuZGF0b3J5JyB9ID0gb3B0aW9ucztcbiAgYXNzZXJ0LmVxdWFsKHZhbHVlRHVyYWJpbGl0eSwgJ21hbmRhdG9yeScpO1xuICByZXR1cm4ge1xuICAgIC8vXG4gICAgdmFsdWVEdXJhYmlsaXR5LFxuXG4gICAgLy9cbiAgICBwdWJsaXNoQ291bnQ6IDBuLFxuICAgIHN0YXR1czogJ2xpdmUnLCAvL1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaGFzVmFsdWU6IGZhbHNlLFxuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gIH07XG59O1xuXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLypcblxuXG4gKi9cbmNvbnN0IGdldEVwaGVtZXJhbEtleSA9IGZhY2V0cyA9PiBmYWNldHMucHVibGlzaGVyO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFAgPSAoc3RhdGUsIGZhY2V0cywgdGFpbCkgPT4ge1xuICBjb25zdCBlcGhlbWVyYWxLZXkgPSBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbiAgY29uc3QgZm91bmREYXRhID0gZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuICBjb25zdCBjdXJyZW50UCA9IGZvdW5kRGF0YSAmJiBmb3VuZERhdGEuY3VycmVudFA7XG4gIGlmIChjdXJyZW50UCkge1xuICAgIHJldHVybiBjdXJyZW50UDtcbiAgfVxuXG4gIGNvbnN0IHsgcHVibGlzaENvdW50LCBzdGF0dXMsIGhhc1ZhbHVlLCB2YWx1ZSB9ID0gc3RhdGU7XG4gIGlmICghaGFzVmFsdWUpIHtcbiAgICBhc3NlcnQoc3RhdHVzID09PSAnbGl2ZScpO1xuICAgIHJldHVybiB0YWlsO1xuICB9XG4gIGlmIChzdGF0dXMgPT09ICdsaXZlJyB8fCBzdGF0dXMgPT09ICdmaW5pc2hlZCcpIHtcbiAgICBjb25zdCBjZWxsID0gaGFyZGVuKHtcbiAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmU6IHN0YXR1cyAhPT0gJ2xpdmUnIH0sXG4gICAgICBwdWJsaXNoQ291bnQsXG4gICAgICB0YWlsLFxuICAgIH0pO1xuICAgIHJldHVybiBFLnJlc29sdmUoY2VsbCk7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEZhaWxgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEgPSAoc3RhdGUsIGZhY2V0cykgPT4ge1xuICBjb25zdCBlcGhlbWVyYWxLZXkgPSBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbiAgY29uc3QgZm91bmREYXRhID0gZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuICBpZiAoZm91bmREYXRhKSB7XG4gICAgcmV0dXJuIGZvdW5kRGF0YTtcbiAgfVxuXG4gIGNvbnN0IHsgc3RhdHVzIH0gPSBzdGF0ZTtcbiAgbGV0IHRhaWxQO1xuICBsZXQgdGFpbFI7XG4gIGlmIChzdGF0dXMgPT09ICdsaXZlJykge1xuICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgdm9pZCBFLndoZW4odGFpbFAsIHNpbmssIHNpbmspO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2ZpbmlzaGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuICB9XG4gIC8vXG4gIGNvbnN0IG9iaiA9IGhhcmRlbih7IGN1cnJlbnRQOiB1bmRlZmluZWQsIHRhaWxQLCB0YWlsUiB9KTtcbiAgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChlcGhlbWVyYWxLZXksIG9iaik7XG4gIHJldHVybiBvYmo7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0ID0gKGNvbnRleHQsIHZhbHVlLCB0YXJnZXRTdGF0dXMgPSAnbGl2ZScpID0+IHtcbiAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSBjb250ZXh0O1xuICBjb25zdCB7IHZhbHVlRHVyYWJpbGl0eSwgc3RhdHVzIH0gPSBzdGF0ZTtcbiAgaWYgKHN0YXR1cyAhPT0gJ2xpdmUnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gIH1cbiAgY29uc3QgZG9uZSA9IHRhcmdldFN0YXR1cyAhPT0gJ2xpdmUnO1xuICBpZiAoZG9uZSB8fCB2YWx1ZUR1cmFiaWxpdHkgPT09ICdtYW5kYXRvcnknKSB7XG4gICAgY2FuQmVEdXJhYmxlKHZhbHVlKSB8fCBGYWlsYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiAgfVxuICBjb25zdCB7IHRhaWxQOiBvbGRUYWlsUCwgdGFpbFI6IHJlc29sdmVPbGRUYWlsIH0gPVxuICAgIHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoc3RhdGUsIGZhY2V0cyk7XG4gIGFzc2VydC50eXBlb2YocmVzb2x2ZU9sZFRhaWwsICdmdW5jdGlvbicpO1xuXG4gIGNvbnN0IHB1Ymxpc2hDb3VudCA9IHN0YXRlLnB1Ymxpc2hDb3VudCArIDFuO1xuICBzdGF0ZS5wdWJsaXNoQ291bnQgPSBwdWJsaXNoQ291bnQ7XG5cbiAgbGV0IHRhaWxQO1xuICBsZXQgdGFpbFI7XG4gIGlmIChkb25lKSB7XG4gICAgc3RhdGUuc3RhdHVzID0gdGFyZ2V0U3RhdHVzO1xuICAgIHRhaWxQID0gdG9vRmFyUmVqZWN0aW9uO1xuICAgIHRhaWxSID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgdm9pZCBFLndoZW4odGFpbFAsIHNpbmssIHNpbmspO1xuICB9XG5cbiAgbGV0IGN1cnJlbnRQO1xuICBpZiAodGFyZ2V0U3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHN0YXRlLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IHJlamVjdGlvbiA9IG1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG4gICAgcmVzb2x2ZU9sZFRhaWwocmVqZWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKGRvbmUgfHwgKHZhbHVlRHVyYWJpbGl0eSAhPT0gJ2lnbm9yZWQnICYmIGNhbkJlRHVyYWJsZSh2YWx1ZSkpKSB7XG4gICAgICBzdGF0ZS5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5oYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgc3RhdGUudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAvL1xuICAgICAgY3VycmVudFAgPSBvbGRUYWlsUDtcbiAgICB9XG5cbiAgICByZXNvbHZlT2xkVGFpbChcbiAgICAgIGhhcmRlbih7XG4gICAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICAgICAgcHVibGlzaENvdW50LFxuICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KFxuICAgIGdldEVwaGVtZXJhbEtleShmYWNldHMpLFxuICAgIGhhcmRlbih7IGN1cnJlbnRQLCB0YWlsUCwgdGFpbFIgfSksXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gKGJhZ2dhZ2UsIGtpbmROYW1lKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCA9IG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ7XG5cbiAgcmV0dXJuIHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIHB1Ymxpc2hLaXRJS2l0LFxuICAgIGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxuICAgIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcHVibGlzaGVyOiB7XG4gICAgICAgIHB1Ymxpc2godmFsdWUpIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBmaW5pc2goZmluYWxWYWx1ZSkge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCBmaW5hbFZhbHVlLCAnZmluaXNoZWQnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZmFpbChyZWFzb24pIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgcmVhc29uLCAnZmFpbGVkJyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHN1YnNjcmliZXI6IHtcbiAgICAgICAgc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50ID0gLTFuKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVibGlzaENvdW50OiBjdXJyZW50UHVibGlzaENvdW50IH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IGN1cnJlbnRQLCB0YWlsUCB9ID0gcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgZmFjZXRzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHB1Ymxpc2hDb3VudCA9PT0gY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhaWxQO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHVibGlzaENvdW50IDwgY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQIHx8IHByb3ZpZGVDdXJyZW50UChzdGF0ZSwgZmFjZXRzLCB0YWlsUCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAnc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZmFjZXRzOiB7IHN1YnNjcmliZXIgfSxcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZUNvdW50ID0gQmlnSW50KHVwZGF0ZUNvdW50KTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgc3Vic2NyaWJlclxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZSxcbiAgICB9LFxuICApO1xufTskaM2PX29uY2UucHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5oYXJkZW4ocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcblxuICAgICAgIGNvbnN0IFN1YnNjcmliZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdTdWJzY3JpYmVyJyk7JGjNj19vbmNlLlN1YnNjcmliZXJTaGFwZShTdWJzY3JpYmVyU2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHVibGlzaGVySSI6WyJQdWJsaXNoZXJJIl0sIlVwZGF0ZUNvdW50U2hhcGUiOlsiVXBkYXRlQ291bnRTaGFwZSJdLCJTdWJzY3JpYmVySSI6WyJTdWJzY3JpYmVySSJdLCJwdWJsaXNoS2l0SUtpdCI6WyJwdWJsaXNoS2l0SUtpdCJdLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSwiSXRlcmFibGVFYWNoVG9waWNJIjpbIkl0ZXJhYmxlRWFjaFRvcGljSSJdLCJJdGVyYWJsZUxhdGVzdFRvcGljSSI6WyJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiOlsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sIlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAD1YOAZkIAACZCAAALgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZWQtbm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCJAZW5kby9mYXIiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIl0sImV4cG9ydHMiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLEUsRmFyLG9ic2VydmVOb3RpZmllcjskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIixbJGjNj19hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLFskaM2PX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLFskaM2PX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWROb3RpZmllciA9IChub3RpZmllciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgYXNzZXJ0QWxsRGVmaW5lZCh7IG5vdGlmaWVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciB9KTtcblxuICBjb25zdCBtYXJzaGFsbFRvU3RvcmFnZSA9IG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpO1xuXG4gIG9ic2VydmVOb3RpZmllcihub3RpZmllciwge1xuICAgIHVwZGF0ZVN0YXRlKHZhbHVlKSB7XG4gICAgICBtYXJzaGFsbFRvU3RvcmFnZSh2YWx1ZSkuY2F0Y2gocmVhc29uID0+XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byB1cGRhdGVTdGF0ZScsIHJlYXNvbiksXG4gICAgICApO1xuICAgIH0sXG4gICAgZmFpbChyZWFzb24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byBpdGVyYXRlJywgcmVhc29uKTtcbiAgICB9LFxuICB9KS5jYXRjaChyZWFzb24gPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGhhbHRlZCBpdGVyYXRpb24nLCByZWFzb24pO1xuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdG9yZWROb3RpZmllciA9IEZhcignU3RvcmVkTm90aWZpZXInLCB7XG4gICAgZ2V0VXBkYXRlU2luY2U6IHVwZGF0ZUNvdW50ID0+IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgICBnZXRQYXRoOiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG4gICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiB1bnNlcmlhbGl6ZXIsXG4gIH0pO1xuICByZXR1cm4gc3RvcmVkTm90aWZpZXI7XG59OyRozY9fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdG9yZWROb3RpZmllciI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVCMi/9EXAADRFwAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIiwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsbWFrZU1hcnNoYWwsYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLG9ic2VydmVJdGVyYXRpb24sbWFrZVB1Ymxpc2hLaXQsbWFrZVN1YnNjcmlwdGlvbktpdCxzdWJzY3JpYmVFYWNoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsWyRozY9fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIixbJGjNj19hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLFskaM2PX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGZvckVhY2hQdWJsaWNhdGlvblJlY29yZCA9IGFzeW5jIChzdWJzY3JpYmVyLCBjb25zdW1lVmFsdWUpID0+IHtcbiAgLy9cbiAgLy9cbiAgY29uc3QgaXRlcmF0b3IgPSBzdWJzY3JpYmVFYWNoKHN1YnNjcmliZXIpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICBhd2FpdCBudWxsO1xuICB3aGlsZSAoIWZpbmlzaGVkKSB7XG4gICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgIGF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG4gICAgZmluaXNoZWQgPSAhIWRvbmU7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVkU3Vic2NyaWJlciA9IChzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBhc3NlcnRBbGxEZWZpbmVkKHsgc3Vic2NyaWJlciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIgfSk7XG5cbiAgY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2UgPSBtYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKTtcblxuICAvL1xuICBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlciwgbWFyc2hhbGxUb1N0b3JhZ2UpLmNhdGNoKGVyciA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLCBlcnIpO1xuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0b3Jlc3ViID0gRmFyKCdTdG9yZWRTdWJzY3JpYmVyJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiBwdWJsaXNoQ291bnQgPT4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuICAgIGdldFVwZGF0ZVNpbmNlOiB1cGRhdGVDb3VudCA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgICBnZXRQYXRoOiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG4gICAgZ2V0U3RvcmVLZXk6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG4gICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiB1bnNlcmlhbGl6ZXIsXG4gIH0pO1xuICByZXR1cm4gc3RvcmVzdWI7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFN1YnNjcmlwdGlvbiA9IChcbiAgc3Vic2NyaXB0aW9uLFxuICBzdG9yYWdlTm9kZSxcbiAgbWFyc2hhbGxlciA9IG1ha2VNYXJzaGFsKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG4gICAgbWFyc2hhbFNhdmVFcnJvcjogKCkgPT4ge30sXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pLFxuKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8vXG4gIGxldCBwdWJsaXNoRmFpbGVkID0gZmFsc2U7XG4gIGxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG4gIGNvbnN0IGZhaWwgPSBlcnIgPT4ge1xuICAgIHB1Ymxpc2hGYWlsZWQgPSB0cnVlO1xuICAgIHB1Ymxpc2hFeGNlcHRpb24gPSBlcnI7XG4gIH07XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgcHVibGlzaFZhbHVlID0gb2JqID0+IHtcbiAgICBhc3NlcnQoc3RvcmFnZU5vZGUpO1xuICAgIGlmIChwdWJsaXNoRmFpbGVkKSB7XG4gICAgICAvL1xuICAgICAgdGhyb3cgcHVibGlzaEV4Y2VwdGlvbjtcbiAgICB9XG5cbiAgICAvL1xuICAgIEUobWFyc2hhbGxlcilcbiAgICAgIC50b0NhcERhdGEob2JqKVxuICAgICAgLnRoZW4oc2VyaWFsaXplZCA9PiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKTtcbiAgICAgICAgcmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChmYWlsKTtcbiAgfTtcblxuICBpZiAoc3RvcmFnZU5vZGUpIHtcbiAgICAvL1xuICAgIG9ic2VydmVJdGVyYXRpb24oc3Vic2NyaXB0aW9uLCB7XG4gICAgICB1cGRhdGVTdGF0ZTogcHVibGlzaFZhbHVlLFxuICAgICAgZmluaXNoOiBwdWJsaXNoVmFsdWUsXG4gICAgfSkuY2F0Y2goZmFpbCk7XG4gIH1cblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RvcmVzdWIgPSBGYXIoJ1N0b3JlZFN1YnNjcmlwdGlvbicsIHtcbiAgICAvL1xuICAgIGdldFN0b3JlS2V5OiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXN0b3JhZ2VOb2RlKSB7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBzdWJzY3JpcHRpb24gfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdG9yZUtleSA9IGF3YWl0IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgLi4uc3RvcmVLZXksIHN1YnNjcmlwdGlvbiB9KTtcbiAgICB9LFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyLFxuICAgIGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOiAoKSA9PlxuICAgICAgc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc3Vic2NyaXB0aW9uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpLFxuICAgIHN1YnNjcmliZUFmdGVyOiBwdWJsaXNoQ291bnQgPT4gc3Vic2NyaXB0aW9uLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG4gIH0pO1xuICByZXR1cm4gc3RvcmVzdWI7XG59OyRozY9fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3RvcmVkUHVibGlzaGVyS2l0ID0gKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyLCBjaGlsZFBhdGgpID0+IHtcbiAgY29uc3QgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH0gPSBtYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbiAgaWYgKHN0b3JhZ2VOb2RlICYmIGNoaWxkUGF0aCkge1xuICAgIHN0b3JhZ2VOb2RlID0gRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuICB9XG5cbiAgLy9cbiAgY29uc3Qgc3Vic2NyaWJlciA9IG1ha2VTdG9yZWRTdWJzY3JpcHRpb24oXG4gICAgc3Vic2NyaXB0aW9uLFxuICAgIHN0b3JhZ2VOb2RlLFxuICAgIG1hcnNoYWxsZXIsXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBwdWJsaXNoZXI6IHB1YmxpY2F0aW9uLFxuICAgIHN1YnNjcmliZXIsXG4gIH07XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCk7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFB1Ymxpc2hLaXQgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwdWJsaXNoZXIsXG4gICAgLy9cbiAgICBzdWJzY3JpYmVyOiBtYWtlU3RvcmVkU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciksXG4gIH07XG59OyRozY9fb25jZS5tYWtlU3RvcmVkUHVibGlzaEtpdChtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADlofdhSFgAAUhYAACgAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyJdLCJleHBvcnRzIjpbInN1YnNjcmliZSIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLEZhaWwsYW5ub3RhdGVFcnJvcixFLEZhcixpc1ByaW1pdGl2ZSxpc1VwZ3JhZGVEaXNjb25uZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsWyRozY9fYSA9PiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHNpbmsgPSAoKSA9PiB7fTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCByZWNvbm5lY3RBc05lZWRlZCA9IGFzeW5jIChnZXR0ZXIsIHNlZWQgPSBbXSkgPT4ge1xuICBsZXQgZGlzY29ubmVjdGlvbjtcbiAgbGV0IGxhc3RWZXJzaW9uID0gLUluZmluaXR5O1xuICAvL1xuICBhd2FpdCBudWxsO1xuICBmb3IgKGxldCBpID0gMDsgOyBpICs9IDEpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0UCA9IGkgPCBzZWVkLmxlbmd0aCA/IHNlZWRbaV0gOiBnZXR0ZXIoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24oZXJyKSkge1xuICAgICAgICBpZiAoIWRpc2Nvbm5lY3Rpb24pIHtcbiAgICAgICAgICBkaXNjb25uZWN0aW9uID0gZXJyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaW5jYXJuYXRpb25OdW1iZXI6IHZlcnNpb24gfSA9IGVycjtcbiAgICAgICAgaWYgKHZlcnNpb24gPiBsYXN0VmVyc2lvbikge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGxhc3RWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKCFpc1ByaW1pdGl2ZShlcnIpICYmIGRpc2Nvbm5lY3Rpb24gJiYgZGlzY29ubmVjdGlvbiAhPT0gZXJyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYW5ub3RhdGVFcnJvcihcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgQXR0ZW1wdGluZyB0byByZWNvdmVyIGZyb20gZGlzY29ubmVjdGlvbjogJHtkaXNjb25uZWN0aW9ufWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICAgIC8vXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHN1YnNjcmliZSA9IGl0UCA9PlxuICBGYXIoJ0FzeW5jSXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgaXQgPSBFKGl0UClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBzZWxmID0gRmFyKCdBc3luY0l0ZXJhYmxlSXRlcmF0b3InLCB7XG4gICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgICAgIG5leHQ6IGFzeW5jICgpID0+IEUoaXQpLm5leHQoKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uuc3Vic2NyaWJlKHN1YnNjcmliZSk7XG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yID0gKHRvcGljLCBuZXh0Q2VsbFApID0+IHtcbiAgLy9cbiAgLy9cbiAgY29uc3Qgc2VsZiA9IEZhcignRWFjaEl0ZXJhdG9yJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgbmV4dDogKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBoZWFkOiByZXN1bHRQLFxuICAgICAgICBwdWJsaXNoQ291bnQ6IHB1Ymxpc2hDb3VudFAsXG4gICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgfSA9IEUuZ2V0KG5leHRDZWxsUCk7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgZ2V0U3VjY2Vzc29yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwdWJsaXNoQ291bnQgPSBhd2FpdCBwdWJsaXNoQ291bnRQO1xuICAgICAgICBhc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwgJ2JpZ2ludCcpO1xuICAgICAgICBjb25zdCBzdWNjZXNzb3IgPSBhd2FpdCBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuICAgICAgICBjb25zdCBuZXdQdWJsaXNoQ291bnQgPSBzdWNjZXNzb3IucHVibGlzaENvdW50O1xuICAgICAgICBpZiAobmV3UHVibGlzaENvdW50ICE9PSBwdWJsaXNoQ291bnQgKyAxbikge1xuICAgICAgICAgIEZhaWxgZWFjaEl0ZXJhdG9yIGJyb2tlbiBieSBnYXAgZnJvbSBwdWJsaXNoQ291bnQgJHtwdWJsaXNoQ291bnR9IHRvICR7bmV3UHVibGlzaENvdW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvcjtcbiAgICAgIH07XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgbmV4dENlbGxQID0gcmVjb25uZWN0QXNOZWVkZWQoZ2V0U3VjY2Vzc29yLCBbdGFpbFBdKTtcblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHZvaWQgRS53aGVuKHB1Ymxpc2hDb3VudFAsIHNpbmssIHNpbmspO1xuICAgICAgdm9pZCBFLndoZW4obmV4dENlbGxQLCBzaW5rLCBzaW5rKTtcbiAgICAgIHJldHVybiByZXN1bHRQO1xuICAgIH0sXG4gICAgZm9yazogKCkgPT4gbWFrZUVhY2hJdGVyYXRvcih0b3BpYywgbmV4dENlbGxQKSxcbiAgfSk7XG4gIHJldHVybiBzZWxmO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBzdWJzY3JpYmVFYWNoID0gdG9waWMgPT4ge1xuICBjb25zdCBpdGVyYWJsZSA9IEZhcignRWFjaEl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2VsbFAgPSByZWNvbm5lY3RBc05lZWRlZCgoKSA9PiBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcigpKTtcbiAgICAgIHJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLCBmaXJzdENlbGxQKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2Uuc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVFYWNoKTtcbmhhcmRlbihzdWJzY3JpYmVFYWNoKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGNsb25lTGF0ZXN0SXRlcmF0b3IgPSAodG9waWMsIGxvY2FsVXBkYXRlQ291bnQsIHRlcm1pbmFsUmVzdWx0KSA9PiB7XG4gIGxldCBtdXRleCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1heWJlUmVxdWVzdE5leHRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRlcm1pbmFsUmVzdWx0KSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgeyB2YWx1ZSwgdXBkYXRlQ291bnQgfSA9IGF3YWl0IHJlY29ubmVjdEFzTmVlZGVkKCgpID0+XG4gICAgICBFKHRvcGljKS5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KSxcbiAgICApO1xuICAgIC8vXG4gICAgbG9jYWxVcGRhdGVDb3VudCA9IHVwZGF0ZUNvdW50O1xuXG4gICAgLy9cbiAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGVybWluYWxSZXN1bHQgPSBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZSB9KTtcbiAgICAgIHJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KTtcbiAgfTtcblxuICBjb25zdCBzZWxmID0gRmFyKCdMYXRlc3RJdGVyYXRvcicsIHtcbiAgICBmb3JrOiAoKSA9PiBjbG9uZUxhdGVzdEl0ZXJhdG9yKHRvcGljLCBsb2NhbFVwZGF0ZUNvdW50LCB0ZXJtaW5hbFJlc3VsdCksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc2VsZixcbiAgICBuZXh0OiBhc3luYyAoKSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG5cbiAgICAgIGlmICh0ZXJtaW5hbFJlc3VsdCkge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBuZXh0UmVzdWx0ID0gbXV0ZXgudGhlbihtYXliZVJlcXVlc3ROZXh0UmVzdWx0KTtcbiAgICAgIG11dGV4ID0gbmV4dFJlc3VsdC50aGVuKHNpbmssIHNpbmspO1xuICAgICAgLy9cblxuICAgICAgcmV0dXJuIG5leHRSZXN1bHQ7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzZWxmO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZUxhdGVzdEl0ZXJhdG9yID0gdG9waWMgPT4gY2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlTGF0ZXN0ID0gdG9waWMgPT4ge1xuICBjb25zdCBpdGVyYWJsZSA9IEZhcignTGF0ZXN0SXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gbWFrZUxhdGVzdEl0ZXJhdG9yKHRvcGljKSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdWJzY3JpYmUiOlsic3Vic2NyaWJlIl0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACOZfrg5CAAAOQgAACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3RvcGljLmpzIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixzdWJzY3JpYmVFYWNoLG1ha2VQdWJsaXNoS2l0LG1ha2VQaW5uZWRIaXN0b3J5VG9waWM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3RvcGljLmpzXCIsIFtbXCJtYWtlUGlubmVkSGlzdG9yeVRvcGljXCIsWyRozY9fYSA9PiAobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbiA9IHRvcGljID0+IHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gRmFyKCdTdWJzY3JpcHRpb24nLCB7XG4gICAgLi4uc3Vic2NyaWJlRWFjaCh0b3BpYyksXG4gICAgc3Vic2NyaWJlQWZ0ZXI6IGFzeW5jIHB1Ymxpc2hDb3VudCA9PiBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuXG4gICAgLypcblxuXG5cblxuICAgICAqL1xuICAgIGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOiBhc3luYyAoKSA9PiB0b3BpYyxcblxuICAgIGdldFN0b3JlS2V5OiAoKSA9PiBoYXJkZW4oeyBzdWJzY3JpcHRpb24gfSksXG4gIH0pO1xuICByZXR1cm4gc3Vic2NyaXB0aW9uO1xufTskaM2PX29uY2UubWFrZVN1YnNjcmlwdGlvbihtYWtlU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uKTtcblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25LaXQgPSAoKSA9PiB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIC8vXG4gIC8vXG5cbiAgY29uc3QgcGlubmVkSGlzdG9yeVRvcGljID0gbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbWFrZVN1YnNjcmlwdGlvbihwaW5uZWRIaXN0b3J5VG9waWMpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHB1YmxpY2F0aW9uID0gRmFyKCdwdWJsaWNhdGlvbicsIHtcbiAgICB1cGRhdGVTdGF0ZTogbm9uRmluYWxWYWx1ZSA9PiBwdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbiAgICBmaW5pc2g6IGNvbXBsZXRpb24gPT4gcHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbiAgICBmYWlsOiByZWFzb24gPT4gcHVibGlzaGVyLmZhaWwocmVhc29uKSxcbiAgfSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfSk7XG59OyRozY9fb25jZS5tYWtlU3Vic2NyaXB0aW9uS2l0KG1ha2VTdWJzY3JpcHRpb25LaXQpO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb25LaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABbOwXiTAQAAEwEAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9IHRvcGljID0+IHtcbiAgLy9cblxuICAvL1xuICBjb25zdCBwaW5uZWRQdWJMaXN0ID0gdG9waWMuc3Vic2NyaWJlQWZ0ZXIoKTtcblxuICByZXR1cm4gRmFyKCdQaW5uZWRIaXN0b3J5VG9waWMnLCB7XG4gICAgc3Vic2NyaWJlQWZ0ZXI6IGFzeW5jIChwdWJsaXNoQ291bnQgPSAtMW4pID0+IHtcbiAgICAgIGlmIChwdWJsaXNoQ291bnQgPT09IC0xbikge1xuICAgICAgICByZXR1cm4gcGlubmVkUHViTGlzdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b3BpYy5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuICAgIH0sXG4gICAgZ2V0VXBkYXRlU2luY2U6IGFzeW5jICh1cGRhdGVDb3VudCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgLy9cbiAgICAgIHJldHVybiB0b3BpYy5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlUGlubmVkSGlzdG9yeVRvcGljKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xuaGFyZGVuKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAo5ImDRQHAAAUBwAALQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VGYWtlTWFyc2hhbGxlciIsIm1ha2VGYWtlU3RvcmFnZSIsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzXCIsIFtdXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUZha2VTdG9yYWdlID0gKHBhdGgsIHB1YmxpY2F0aW9uKSA9PiB7XG4gIGxldCBzZXRWYWx1ZUNhbGxzID0gMDtcbiAgY29uc3QgZnVsbFBhdGggPSBgcHVibGlzaC4ke3BhdGh9YDtcbiAgY29uc3Qgc3RvcmVLZXkgPSBoYXJkZW4oe1xuICAgIHN0b3JlTmFtZTogJ3N3aW5nc2V0JyxcbiAgICBzdG9yZVN1YmtleTogYHN3aW5nc2V0L2RhdGE6JHtmdWxsUGF0aH1gLFxuICAgIGRhdGFQcmVmaXhCeXRlczogJycsXG4gIH0pO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0b3JhZ2UgPSBGYXIoJ1N0b3JhZ2VOb2RlJywge1xuICAgIGdldFBhdGg6ICgpID0+IHBhdGgsXG4gICAgZ2V0U3RvcmVLZXk6IGFzeW5jICgpID0+IHN0b3JlS2V5LFxuICAgIHNldFZhbHVlOiBhc3luYyB2YWx1ZSA9PiB7XG4gICAgICBzZXRWYWx1ZUNhbGxzICs9IDE7XG4gICAgICBhc3NlcnQudHlwZW9mKHZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICBpZiAocHVibGljYXRpb24pIHtcbiAgICAgICAgcHVibGljYXRpb24udXBkYXRlU3RhdGUodmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbWFrZUNoaWxkTm9kZTogKCkgPT4gc3RvcmFnZSxcbiAgICBjb3VudFNldFZhbHVlQ2FsbHM6ICgpID0+IHNldFZhbHVlQ2FsbHMsXG4gIH0pO1xuICByZXR1cm4gc3RvcmFnZTtcbn07JGjNj19vbmNlLm1ha2VGYWtlU3RvcmFnZShtYWtlRmFrZVN0b3JhZ2UpO1xuaGFyZGVuKG1ha2VGYWtlU3RvcmFnZSk7XG5cbiAgICAgICBjb25zdCBtYWtlRmFrZU1hcnNoYWxsZXIgPSAoKSA9PlxuICBtYWtlTWFyc2hhbCh1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuICAgIG1hcnNoYWxTYXZlRXJyb3I6ICgpID0+IHt9LFxuICB9KTskaM2PX29uY2UubWFrZUZha2VNYXJzaGFsbGVyKG1ha2VGYWtlTWFyc2hhbGxlcik7XG5oYXJkZW4obWFrZUZha2VNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiOltbImV2ZW50TG9vcEl0ZXJhdGlvbiIsImV2ZW50TG9vcEl0ZXJhdGlvbiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRmFrZVN0b3JhZ2UiOlsibWFrZUZha2VTdG9yYWdlIl0sIm1ha2VGYWtlTWFyc2hhbGxlciI6WyJtYWtlRmFrZU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFlm/P9shAADbIQAAMwAAAEBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuMy9zcmMvbWFyc2hhbC1jb250ZXh0cy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3ZhdHMvc3JjL2xpYi1ib2FyZC5qcyJdLCJleHBvcnRzIjpbIm1ha2VFeHBvcnRDb250ZXh0IiwibWFrZUltcG9ydENvbnRleHQiLCJtYWtlTG9nZ2luZ1ByZXNlbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEhhbmRsZWRQcm9taXNlLG1ha2VTY2FsYXJNYXBTdG9yZSxGYXIsbWFrZU1hcnNoYWwsUmVtb3RhYmxlLERFRkFVTFRfUFJFRklYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkhhbmRsZWRQcm9taXNlXCIsWyRozY9fYSA9PiAoSGFuZGxlZFByb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXSxbXCJSZW1vdGFibGVcIixbJGjNj19hID0+IChSZW1vdGFibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdHMvc3JjL2xpYi1ib2FyZC5qc1wiLCBbW1wiREVGQVVMVF9QUkVGSVhcIixbJGjNj19hID0+IChERUZBVUxUX1BSRUZJWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGlzRGVmYXVsdEJvYXJkSWQgPSBzcGVjaW1lbiA9PiB7XG4gIHJldHVybiB0eXBlb2Ygc3BlY2ltZW4gPT09ICdzdHJpbmcnICYmIHNwZWNpbWVuLnN0YXJ0c1dpdGgoREVGQVVMVF9QUkVGSVgpO1xufTtcblxuLypcblxuXG5cblxuICovXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZVdhbGxldFNsb3QgPSAoX3RhYmxlcywga2luZCwgaWQpID0+IHtcbiAgY29uc3QgZGlnaXRzID0gLyogICAgICAgICAgICAgICAgICovIChgJHtpZH1gKTtcbiAgcmV0dXJuIGAke2tpbmR9OiR7ZGlnaXRzfWA7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZpbmRLZXkgPSAocmVjb3JkLCBwcmVkaWNhdGUpID0+IHtcbiAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMocmVjb3JkKS5maW5kKHByZWRpY2F0ZSk7XG4gIHJldHVybiBrZXk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IHBhcnNlV2FsbGV0U2xvdCA9ICh0YWJsZXMsIHNsb3QpID0+IHtcbiAgY29uc3Qga2luZCA9IGZpbmRLZXkodGFibGVzLCBrID0+IHNsb3Quc3RhcnRzV2l0aChgJHtrfTpgKSk7XG4gIGNvbnN0IGlkID0ga2luZCA/IE51bWJlcihzbG90LnNsaWNlKGtpbmQubGVuZ3RoICsgMSkpIDogTmFOO1xuICByZXR1cm4geyBraW5kLCBpZCB9O1xufTtcblxuLypcblxuXG5cblxuXG4gKi9cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGluaXRTbG90VmFsID0gKHRhYmxlLCBzbG90LCB2YWwpID0+IHtcbiAgdGFibGUuYnlTbG90LmluaXQoc2xvdCwgdmFsKTtcbiAgdGFibGUuYnlWYWwuaW5pdCh2YWwsIHNsb3QpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRXhwb3J0Q29udGV4dCA9ICgpID0+IHtcbiAgY29uc3Qgd2FsbGV0T2JqZWN0cyA9IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgcHVyc2U6IHtcbiAgICAgIGJ5U2xvdDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gICAgICBieVZhbDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBwYXltZW50OiB7XG4gICAgICBieVNsb3Q6IG1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuICAgICAgYnlWYWw6IG1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuICAgIH0sXG4gICAgLy9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgdW5rbm93bjoge1xuICAgICAgYnlTbG90OiBtYWtlU2NhbGFyTWFwU3RvcmUoKSxcbiAgICAgIGJ5VmFsOiBtYWtlU2NhbGFyTWFwU3RvcmUoKSxcbiAgICB9LFxuICB9O1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBib2FyZE9iamVjdHMgPSB7XG4gICAgYnlTbG90OiBtYWtlU2NhbGFyTWFwU3RvcmUoKSxcbiAgICBieVZhbDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3Qgc2xvdFRvVmFsID0gKHNsb3QsIF9pZmFjZSkgPT4ge1xuICAgIGlmIChpc0RlZmF1bHRCb2FyZElkKHNsb3QpICYmIGJvYXJkT2JqZWN0cy5ieVNsb3QuaGFzKHNsb3QpKSB7XG4gICAgICByZXR1cm4gYm9hcmRPYmplY3RzLmJ5U2xvdC5nZXQoc2xvdCk7XG4gICAgfVxuICAgIGNvbnN0IHsga2luZCwgaWQgfSA9IHBhcnNlV2FsbGV0U2xvdCh3YWxsZXRPYmplY3RzLCBzbG90KTtcbiAgICBraW5kIHx8IEZhaWxgYmFkIHNsb3Qga2luZDogJHtzbG90fWA7XG4gICAgY29uc3QgdmFsID0gd2FsbGV0T2JqZWN0c1traW5kXS5ieVNsb3QuZ2V0KGlkKTsgLy9cbiAgICByZXR1cm4gdmFsO1xuICB9O1xuXG4gIGxldCB1bmtub3duTm9uY2UgPSAwO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgdmFsVG9TbG90ID0gdmFsID0+IHtcbiAgICBpZiAoYm9hcmRPYmplY3RzLmJ5VmFsLmhhcyh2YWwpKSB7XG4gICAgICByZXR1cm4gYm9hcmRPYmplY3RzLmJ5VmFsLmdldCh2YWwpO1xuICAgIH1cbiAgICBjb25zdCBraW5kID0gZmluZEtleSh3YWxsZXRPYmplY3RzLCBrID0+IHdhbGxldE9iamVjdHNba10uYnlWYWwuaGFzKHZhbCkpO1xuICAgIGlmIChraW5kKSB7XG4gICAgICAvL1xuICAgICAgY29uc3QgaWQgPSB3YWxsZXRPYmplY3RzW2tpbmRdLmJ5VmFsLmdldCh2YWwpO1xuICAgICAgcmV0dXJuIG1ha2VXYWxsZXRTbG90KHdhbGxldE9iamVjdHMsIGtpbmQsIGlkKTtcbiAgICB9XG4gICAgdW5rbm93bk5vbmNlICs9IDE7XG4gICAgY29uc3Qgc2xvdCA9IG1ha2VXYWxsZXRTbG90KHdhbGxldE9iamVjdHMsICd1bmtub3duJywgdW5rbm93bk5vbmNlKTtcbiAgICBpbml0U2xvdFZhbCh3YWxsZXRPYmplY3RzLnVua25vd24sIHVua25vd25Ob25jZSwgdmFsKTtcbiAgICByZXR1cm4gc2xvdDtcbiAgfTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgbWFrZVNhdmVyID0gKGtpbmQsIHRhYmxlKSA9PiB7XG4gICAgbGV0IG5vbmNlID0gMDtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBzYXZlciA9IHZhbCA9PiB7XG4gICAgICBub25jZSArPSAxO1xuICAgICAgaW5pdFNsb3RWYWwodGFibGUsIG5vbmNlLCB2YWwpO1xuICAgIH07XG4gICAgcmV0dXJuIHNhdmVyO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHNhdmVQdXJzZUFjdGlvbnM6IG1ha2VTYXZlcigncHVyc2UnLCB3YWxsZXRPYmplY3RzLnB1cnNlKSxcbiAgICBzYXZlUGF5bWVudEFjdGlvbnM6IG1ha2VTYXZlcigncGF5bWVudCcsIHdhbGxldE9iamVjdHMucGF5bWVudCksXG4gICAgLypcblxuXG4gICAgICovXG4gICAgaW5pdFB1cnNlSWQ6IChpZCwgcHVyc2UpID0+IHtcbiAgICAgIGluaXRTbG90VmFsKHdhbGxldE9iamVjdHMucHVyc2UsIGlkLCBwdXJzZSk7XG4gICAgfSxcbiAgICBwdXJzZUVudHJpZXM6IHdhbGxldE9iamVjdHMucHVyc2UuYnlTbG90LmVudHJpZXMsXG4gICAgLypcblxuXG4gICAgICovXG4gICAgaW5pdEJvYXJkSWQ6IChpZCwgdmFsKSA9PiB7XG4gICAgICBpbml0U2xvdFZhbChib2FyZE9iamVjdHMsIGlkLCB2YWwpO1xuICAgIH0sXG4gICAgLypcblxuXG4gICAgICovXG4gICAgZW5zdXJlQm9hcmRJZDogKGlkLCB2YWwpID0+IHtcbiAgICAgIGlmIChib2FyZE9iamVjdHMuYnlWYWwuaGFzKHZhbCkpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGJvYXJkT2JqZWN0cy5ieVZhbC5nZXQodmFsKSwgaWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpbml0U2xvdFZhbChib2FyZE9iamVjdHMsIGlkLCB2YWwpO1xuICAgIH0sXG4gICAgLi4ubWFrZU1hcnNoYWwodmFsVG9TbG90LCBzbG90VG9WYWwsIHsgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycgfSksXG4gIH0pO1xufTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLm1ha2VFeHBvcnRDb250ZXh0KG1ha2VFeHBvcnRDb250ZXh0KTtcblxuY29uc3QgZGVmYXVsdE1ha2VQcmVzZW5jZSA9IGlmYWNlID0+IHtcbiAgY29uc3Qgc2V2ZXJlZCA9IGBTRVZFUkVEOiAke2lmYWNlLnJlcGxhY2UoL15BbGxlZ2VkOiAvLCAnJyl9YDtcbiAgcmV0dXJuIEZhcihzZXZlcmVkLCB7fSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlSW1wb3J0Q29udGV4dCA9IChtYWtlUHJlc2VuY2UgPSBkZWZhdWx0TWFrZVByZXNlbmNlKSA9PiB7XG4gIGNvbnN0IHdhbGxldE9iamVjdHMgPSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHB1cnNlOiB7XG4gICAgICBieVNsb3Q6IG1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuICAgICAgYnlWYWw6IG1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuICAgIH0sXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHBheW1lbnQ6IHtcbiAgICAgIGJ5U2xvdDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gICAgICBieVZhbDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgdW5rbm93bjoge1xuICAgICAgYnlTbG90OiBtYWtlU2NhbGFyTWFwU3RvcmUoKSxcbiAgICAgIGJ5VmFsOiBtYWtlU2NhbGFyTWFwU3RvcmUoKSxcbiAgICB9LFxuICB9O1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBib2FyZE9iamVjdHMgPSB7XG4gICAgYnlTbG90OiBtYWtlU2NhbGFyTWFwU3RvcmUoKSxcbiAgICBieVZhbDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gIH07XG5cbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcm92aWRlVmFsID0gKHRhYmxlLCBzbG90LCBpZmFjZSkgPT4ge1xuICAgIGlmICh0YWJsZS5ieVNsb3QuaGFzKHNsb3QpKSB7XG4gICAgICByZXR1cm4gdGFibGUuYnlTbG90LmdldChzbG90KTtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gbWFrZVByZXNlbmNlKGlmYWNlKTtcbiAgICBpbml0U2xvdFZhbCh0YWJsZSwgc2xvdCwgdmFsKTtcbiAgICByZXR1cm4gdmFsO1xuICB9O1xuXG4gIGNvbnN0IHNsb3RUb1ZhbCA9IHtcbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBmcm9tQm9hcmQ6IChzbG90LCBpZmFjZSkgPT4ge1xuICAgICAgaXNEZWZhdWx0Qm9hcmRJZChzbG90KSB8fCBGYWlsYGJhZCBib2FyZCBzbG90ICR7cShzbG90KX1gO1xuICAgICAgcmV0dXJuIHByb3ZpZGVWYWwoYm9hcmRPYmplY3RzLCBzbG90LCBpZmFjZSk7XG4gICAgfSxcblxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGZyb21NeVdhbGxldDogKHNsb3QsIGlmYWNlKSA9PiB7XG4gICAgICBpZiAoIXNsb3QpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIG1ha2VQcmVzZW5jZShgJHtzbG90fWApO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBraW5kLCBpZCB9ID0gcGFyc2VXYWxsZXRTbG90KHdhbGxldE9iamVjdHMsIHNsb3QpO1xuICAgICAgcmV0dXJuIGtpbmRcbiAgICAgICAgPyBwcm92aWRlVmFsKHdhbGxldE9iamVjdHNba2luZF0sIGlkLCBpZmFjZSlcbiAgICAgICAgOiBzbG90VG9WYWwuZnJvbUJvYXJkKHNsb3QsIGlmYWNlKTtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IHZhbFRvU2xvdCA9IHtcbiAgICBmcm9tQm9hcmQ6IHZhbCA9PiBib2FyZE9iamVjdHMuYnlWYWwuZ2V0KHZhbCksXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGZyb21NeVdhbGxldDogdmFsID0+IHtcbiAgICAgIGNvbnN0IGtpbmQgPSBmaW5kS2V5KHdhbGxldE9iamVjdHMsIGsgPT4gd2FsbGV0T2JqZWN0c1trXS5ieVZhbC5oYXModmFsKSk7XG4gICAgICBpZiAoa2luZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IEZhaWxgY2Fubm90IHNlcmlhbGl6ZSB1bnJlZ2lzdGVyZWQgJHt2YWx9YDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaWQgPSB3YWxsZXRPYmplY3RzW2tpbmRdLmJ5VmFsLmdldCh2YWwpO1xuICAgICAgcmV0dXJuIG1ha2VXYWxsZXRTbG90KHdhbGxldE9iamVjdHMsIGtpbmQsIGlkKTtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IG1hcnNoYWwgPSB7XG4gICAgZnJvbUJvYXJkOiBtYWtlTWFyc2hhbCh2YWxUb1Nsb3QuZnJvbUJvYXJkLCBzbG90VG9WYWwuZnJvbUJvYXJkLCB7XG4gICAgICBtYXJzaGFsTmFtZTogJ2Zyb21Cb2FyZCcsXG4gICAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnc21hbGxjYXBzJyxcbiAgICB9KSxcbiAgICBmcm9tTXlXYWxsZXQ6IG1ha2VNYXJzaGFsKHZhbFRvU2xvdC5mcm9tTXlXYWxsZXQsIHNsb3RUb1ZhbC5mcm9tTXlXYWxsZXQsIHtcbiAgICAgIG1hcnNoYWxOYW1lOiAnZnJvbU15V2FsbGV0JyxcbiAgICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxuICAgIH0pLFxuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGluaXRCb2FyZElkOiAoaWQsIHZhbCkgPT4ge1xuICAgICAgaW5pdFNsb3RWYWwoYm9hcmRPYmplY3RzLCBpZCwgdmFsKTtcbiAgICB9LFxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGVuc3VyZUJvYXJkSWQ6IChpZCwgdmFsKSA9PiB7XG4gICAgICBpZiAoYm9hcmRPYmplY3RzLmJ5VmFsLmhhcyh2YWwpKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChib2FyZE9iamVjdHMuYnlWYWwuZ2V0KHZhbCksIGlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW5pdFNsb3RWYWwoYm9hcmRPYmplY3RzLCBpZCwgdmFsKTtcbiAgICB9LFxuICAgIGZyb21NeVdhbGxldDogRmFyKCd3YWxsZXQgbWFyc2hhbGxlcicsIHsgLi4ubWFyc2hhbC5mcm9tTXlXYWxsZXQgfSksXG4gICAgZnJvbUJvYXJkOiBGYXIoJ2JvYXJkIG1hcnNoYWxsZXInLCB7IC4uLm1hcnNoYWwuZnJvbUJvYXJkIH0pLFxuICB9KTtcbn07XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VJbXBvcnRDb250ZXh0KG1ha2VJbXBvcnRDb250ZXh0KTtcbmNvbnN0IG1ha2VQcmVzZW5jZSA9IChpZmFjZSwgaGFuZGxlcikgPT4ge1xuICBsZXQgb2JqO1xuXG4gIHZvaWQgbmV3IEhhbmRsZWRQcm9taXNlKChyZXNvbHZlLCByZWplY3QsIHJlc29sdmVXaXRoUHJlc2VuY2UpID0+IHtcbiAgICBvYmogPSByZXNvbHZlV2l0aFByZXNlbmNlKGhhbmRsZXIpO1xuICB9KTtcbiAgYXNzZXJ0KG9iaik7XG4gIHJldHVybiBSZW1vdGFibGUoaWZhY2UsIHVuZGVmaW5lZCwgb2JqKTtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUxvZ2dpbmdQcmVzZW5jZSA9IChpZmFjZSwgbG9nKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAqLyAvL1xuICBjb25zdCBpdCA9IG1ha2VQcmVzZW5jZShpZmFjZSwge1xuICAgIGFwcGx5TWV0aG9kOiAodGFyZ2V0LCBtZXRob2QsIGFyZ3MpID0+IHtcbiAgICAgIGxvZyhoYXJkZW4oWydhcHBseU1ldGhvZCcsIHRhcmdldCwgbWV0aG9kLCBhcmdzXSkpO1xuICAgIH0sXG4gICAgYXBwbHlGdW5jdGlvbjogKHRhcmdldCwgYXJncykgPT4ge1xuICAgICAgbG9nKGhhcmRlbihbJ2FwcGx5RnVuY3Rpb24nLCB0YXJnZXQsIGFyZ3NdKSk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpdDtcbn07JGjNj19vbmNlLm1ha2VMb2dnaW5nUHJlc2VuY2UobWFrZUxvZ2dpbmdQcmVzZW5jZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRXhwb3J0Q29udGV4dCI6WyJtYWtlRXhwb3J0Q29udGV4dCJdLCJtYWtlSW1wb3J0Q29udGV4dCI6WyJtYWtlSW1wb3J0Q29udGV4dCJdLCJtYWtlTG9nZ2luZ1ByZXNlbmNlIjpbIm1ha2VMb2dnaW5nUHJlc2VuY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbDSmG+YNAADmDQAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIkBlbmRvL2V4byIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyIsIm11c3RNYXRjaCIsInByb3ZpZGVMYXp5IiwicHJvdmlkZUxhenkiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0eXBlbGVzc011c3RNYXRjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+ICh0eXBlbGVzc011c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtdXSxbXCJAZW5kby9leG9cIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbXV0sW1wiLi90eXBlcy5qc1wiLCBbXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBtdXN0TWF0Y2ggPSB0eXBlbGVzc011c3RNYXRjaDskaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6W1sibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUF0b21pY1Byb3ZpZGVyIl0sWyJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5Il1dLCJAZW5kby9wYXR0ZXJucyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXSxbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl0sWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl0sWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il0sWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXSxbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdXSwiQGVuZG8vZXhvIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwzOG9PoFAAD6BQAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUxlZ2FjeU1hcCA9ICh0YWcgPSAna2V5JykgPT4ge1xuICBjb25zdCBtID0gbmV3IE1hcCgpO1xuICBjb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3QgPSBrZXkgPT5cbiAgICAhbS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIG0uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gbS5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIG0uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICByZXR1cm4gbS5nZXQoa2V5KTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgbS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uZGVsZXRlKGtleSk7XG4gICAgfSxcbiAgICBrZXlzOiAoKSA9PiBtLmtleXMoKSxcbiAgICB2YWx1ZXM6ICgpID0+IG0udmFsdWVzKCksXG4gICAgZW50cmllczogKCkgPT4gbS5lbnRyaWVzKCksXG4gICAgZ2V0U2l6ZTogKCkgPT4gbS5zaXplLFxuICAgIGNsZWFyOiAoKSA9PiBtLmNsZWFyKCksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUxlZ2FjeU1hcChtYWtlTGVnYWN5TWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAADF7MbogUAAKIFAAAwAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTGVnYWN5V2Vha01hcCA9ICh0YWcgPSAna2V5JykgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0ID0ga2V5ID0+XG4gICAgIXdtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAgd20uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gd20uaGFzKGtleSk7XG4gICAgfSxcbiAgICBpbml0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG4gICAgICB3bS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBnZXQ6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gLyogICAgICAgICAgICAqLyAod20uZ2V0KGtleSkpO1xuICAgIH0sXG4gICAgc2V0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICB3bS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIHdtLmRlbGV0ZShrZXkpO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUxlZ2FjeVdlYWtNYXAobWFrZUxlZ2FjeVdlYWtNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lXZWFrTWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIamjGIBEwAAARMAADEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiLCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsWyRozY9fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIixbJGjNj19hID0+IChtYXBJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFwU3RvcmVNZXRob2RzID0gKFxuICBqc21hcCxcbiAgYXNzZXJ0S1ZPa1RvQWRkLFxuICBhc3NlcnRLVk9rVG9TZXQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG4gIHRhZyA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IHsgYXNzZXJ0VXBkYXRlT25BZGQsIGFzc2VydFVwZGF0ZU9uRGVsZXRlLCBpdGVyYWJsZUtleXMgfSA9XG4gICAgbWFrZUN1cnJlbnRLZXlzS2l0KFxuICAgICAgKCkgPT4ganNtYXAua2V5cygpLFxuICAgICAgayA9PiBqc21hcC5oYXMoayksXG4gICAgICBjb21wYXJlUmFuayxcbiAgICAgIGFzc2VydEtWT2tUb0FkZCxcbiAgICAgIGFzc2VydEtleU9rVG9EZWxldGUsXG4gICAgICB0YWcsXG4gICAgKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3Qga2V5cyA9IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoa2V5UGF0dCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlUGF0dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVLZXlzO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXIgPSBrID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ICE9PSB1bmRlZmluZWQgJiYgIW1hdGNoZXMoaywga2V5UGF0dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGlmICh2YWx1ZVBhdHQgIT09IHVuZGVmaW5lZCAmJiAhbWF0Y2hlcyhqc21hcC5nZXQoayksIHZhbHVlUGF0dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLCBmaWx0ZXIpO1xuICB9O1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCB2YWx1ZXMgPSAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgIG1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSwgayA9PiAvKiAgICAgICAgICAgICovIChqc21hcC5nZXQoaykpKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgZW50cmllcyA9IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgbWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpLCBrID0+IFtcbiAgICAgIGssXG4gICAgICAvKiAgICAgICAgICAgICovIChqc21hcC5nZXQoaykpLFxuICAgIF0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIC4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuICAgICAganNtYXAsXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoYXNzZXJ0VXBkYXRlT25BZGQpLFxuICAgICAgYXNzZXJ0S1ZPa1RvU2V0LFxuICAgICAgYXNzZXJ0VXBkYXRlT25EZWxldGUsXG4gICAgICB0YWcsXG4gICAgKSxcbiAgICBrZXlzLFxuICAgIHZhbHVlcyxcbiAgICBlbnRyaWVzLFxuXG4gICAgc25hcHNob3Q6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlQ29weU1hcChlbnRyaWVzKGtleVBhdHQsIHZhbHVlUGF0dCkpLFxuXG4gICAgZ2V0U2l6ZTogKGtleVBhdHQgPSB1bmRlZmluZWQsIHZhbHVlUGF0dCA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGtleVBhdHQgPT09IHVuZGVmaW5lZCAmJiB2YWx1ZVBhdHQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGpzbWFwLnNpemVcbiAgICAgICAgOiBbLi4ua2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpXS5sZW5ndGgsXG5cbiAgICBjbGVhcjogKGtleVBhdHQgPSB1bmRlZmluZWQsIHZhbHVlUGF0dCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgPT09IHVuZGVmaW5lZCAmJiB2YWx1ZVBhdHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBqc21hcC5jbGVhcigpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpKSB7XG4gICAgICAgIGpzbWFwLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlTWFwU3RvcmVNZXRob2RzKG1ha2VNYXBTdG9yZU1ldGhvZHMpO1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJNYXBTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsga2V5U2hhcGUgPSB1bmRlZmluZWQsIHZhbHVlU2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzbWFwID0gbmV3IE1hcCgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG4gIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvU2V0ID0gKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbih2YWx1ZSk7XG5cbiAgICBhc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHZhbHVlLCB2YWx1ZVNoYXBlLCAnbWFwU3RvcmUgdmFsdWUnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvQWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgaGFyZGVuKGtleSk7XG5cbiAgICBhc3NlcnRTY2FsYXJLZXkoa2V5KTtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICdtYXBTdG9yZSBrZXknKTtcbiAgICB9XG4gICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBNYXBTdG9yZSBvZiAke3EodGFnKX1gLCB7XG4gICAgLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgICAgYXNzZXJ0S1ZPa1RvU2V0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFnLFxuICAgICksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhck1hcFN0b3JlKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhck1hcFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXBTdG9yZU1ldGhvZHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALpAOpwNDQAADQ0AADEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiLCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYXIsZmlsdGVySXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5U2V0LG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLFskaM2PX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiY29tcGFyZVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlUmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIixbJGjNj19hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHNcIixbJGjNj19hID0+IChtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLFskaM2PX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVNldFN0b3JlTWV0aG9kcyA9IChcbiAganNzZXQsXG4gIGFzc2VydEtleU9rVG9BZGQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCB7IGFzc2VydFVwZGF0ZU9uQWRkLCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSwgaXRlcmFibGVLZXlzIH0gPVxuICAgIG1ha2VDdXJyZW50S2V5c0tpdChcbiAgICAgICgpID0+IGpzc2V0LmtleXMoKSxcbiAgICAgIGsgPT4ganNzZXQuaGFzKGspLFxuICAgICAgY29tcGFyZVJhbmssXG4gICAgICBhc3NlcnRLZXlPa1RvQWRkLFxuICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgICAgIGtleU5hbWUsXG4gICAgKTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IGtleXMgPSAoa2V5UGF0dCA9IHVuZGVmaW5lZCkgPT5cbiAgICBrZXlQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgID8gaXRlcmFibGVLZXlzXG4gICAgICA6IGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cywgayA9PiBtYXRjaGVzKGssIGtleVBhdHQpKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzc2V0LFxuICAgICAgYXNzZXJ0VXBkYXRlT25BZGQsXG4gICAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICAgIGtleU5hbWUsXG4gICAgKSxcblxuICAgIGtleXMsXG5cbiAgICB2YWx1ZXM6IGtleXMsXG5cbiAgICBzbmFwc2hvdDogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+IG1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG4gICAgZ2V0U2l6ZTogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgPyBqc3NldC5zaXplIDogWy4uLmtleXMoa2V5UGF0dCldLmxlbmd0aCxcblxuICAgIGNsZWFyOiAoa2V5UGF0dCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBqc3NldC5jbGVhcigpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0KSkge1xuICAgICAgICBqc3NldC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VTZXRTdG9yZU1ldGhvZHMobWFrZVNldFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhclNldFN0b3JlID0gKFxuICB0YWcgPSAna2V5JyxcbiAgeyBrZXlTaGFwZSA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QganNzZXQgPSBuZXcgU2V0KCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLZXlPa1RvQWRkID0ga2V5ID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgaGFyZGVuKGtleSk7XG5cbiAgICBhc3NlcnRTY2FsYXJLZXkoa2V5KTtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICdzZXRTdG9yZSBrZXknKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEZhcihgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhclNldFN0b3JlKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhclNldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFm5YLrEDwAAxA8AADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weU1hcDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJpZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dLFtcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gKFxuICBqc21hcCxcbiAgYXNzZXJ0S1ZPa1RvQWRkLFxuICBhc3NlcnRLVk9rVG9TZXQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3QgPSBrZXkgPT5cbiAgICAhanNtYXAuaGFzKGtleSkgfHwgRmFpbGAke3Eoa2V5TmFtZSl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcblxuICBjb25zdCBhc3NlcnRLZXlFeGlzdHMgPSBrZXkgPT5cbiAgICBqc21hcC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczoga2V5ID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBqc21hcC5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiAvKiAgICAgICAgICAgICovIChqc21hcC5nZXQoa2V5KSk7XG4gICAgfSxcblxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIGFzc2VydEtWT2tUb0FkZChrZXksIHZhbHVlKTtcbiAgICAgIGpzbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBpZiAoYXNzZXJ0S2V5T2tUb0RlbGV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGpzbWFwLmRlbGV0ZShrZXkpO1xuICAgIH0sXG5cbiAgICBhZGRBbGw6IGVudHJpZXMgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBlbnRyaWVzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihlbnRyaWVzKSAmJiBpc0NvcHlNYXAoZW50cmllcykpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIGVudHJpZXMgPSBnZXRDb3B5TWFwRW50cmllcyhlbnRyaWVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBGYWlsYHByb3ZpZGVkIGRhdGEgc291cmNlIGlzIG5vdCBpdGVyYWJsZTogJHtlbnRyaWVzfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGVudHJpZXMpKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGFzc2VydEtWT2tUb0FkZChrZXksIHZhbHVlKTtcbiAgICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gKFxuICB0YWcgPSAna2V5JyxcbiAgeyBsb25nTGl2ZWQgPSB0cnVlLCBrZXlTaGFwZSA9IHVuZGVmaW5lZCwgdmFsdWVTaGFwZSA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QganNtYXAgPSBuZXcgKGxvbmdMaXZlZCA/IFdlYWtNYXAgOiBNYXApKCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cbiAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLVk9rVG9TZXQgPSAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgaGFyZGVuKHZhbHVlKTtcblxuICAgIGFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbiAgICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUsICd3ZWFrTWFwU3RvcmUgdmFsdWUnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvQWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgaGFyZGVuKGtleSk7XG4gICAgcGFzc1N0eWxlT2Yoa2V5KSA9PT0gJ3JlbW90YWJsZScgfHxcbiAgICAgIEZhaWxgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuICAgIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2goa2V5LCBrZXlTaGFwZSwgJ3dlYWtNYXBTdG9yZSBrZXknKTtcbiAgICB9XG4gICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuICAgICAganNtYXAsXG4gICAgICBhc3NlcnRLVk9rVG9BZGQsXG4gICAgICBhc3NlcnRLVk9rVG9TZXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0YWcsXG4gICAgKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEDsUNbLCwAAywsAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLHBhc3NTdHlsZU9mLGdldENvcHlTZXRLZXlzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weVNldDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlTZXRcIixbJGjNj19hID0+IChpc0NvcHlTZXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9IChcbiAganNzZXQsXG4gIGFzc2VydEtleU9rVG9BZGQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCBhc3NlcnRLZXlFeGlzdHMgPSBrZXkgPT5cbiAgICBqc3NldC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczoga2V5ID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBqc3NldC5oYXMoa2V5KTtcbiAgICB9LFxuXG4gICAgYWRkOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuICAgICAganNzZXQuYWRkKGtleSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGlmIChhc3NlcnRLZXlPa1RvRGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAganNzZXQuZGVsZXRlKGtleSk7XG4gICAgfSxcblxuICAgIGFkZEFsbDoga2V5cyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGtleXMpICYmIGlzQ29weVNldChrZXlzKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAga2V5cyA9IGdldENvcHlTZXRLZXlzKGtleXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEZhaWxgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2tleXN9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgLyogICAgICAgICAgICAgICAgICAgICAgKi8gKGtleXMpKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9BZGQoa2V5KTtcbiAgICAgICAganNzZXQuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gKFxuICB0YWcgPSAna2V5JyxcbiAgeyBsb25nTGl2ZWQgPSB0cnVlLCBrZXlTaGFwZSA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QganNzZXQgPSBuZXcgKGxvbmdMaXZlZCA/IFdlYWtTZXQgOiBTZXQpKCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLZXlPa1RvQWRkID0ga2V5ID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgaGFyZGVuKGtleSk7XG4gICAgcGFzc1N0eWxlT2Yoa2V5KSA9PT0gJ3JlbW90YWJsZScgfHxcbiAgICAgIEZhaWxgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrU3RvcmVzOiAke2tleX1gO1xuICAgIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2goa2V5LCBrZXlTaGFwZSwgJ3dlYWtTZXRTdG9yZSBrZXknKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEZhcihgc2NhbGFyIFdlYWtTZXRTdG9yZSBvZiAke3EodGFnKX1gLCB7XG4gICAgLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoanNzZXQsIGFzc2VydEtleU9rVG9BZGQsIHVuZGVmaW5lZCwgdGFnKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU2NhbGFyV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXGRT2iEAAAohAAAC4AAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJtYWtlQXRvbWljUHJvdmlkZXIiLCJtYWtlQ3VycmVudEtleXNLaXQiLCJwcm92aWRlTGF6eSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxGYXIsaXNDb3B5TWFwLGlzQ29weVNldDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiaXNDb3B5TWFwXCIsWyRozY9fYSA9PiAoaXNDb3B5TWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJpc0NvcHlNYXBcIl1dXSxbXCJpc0NvcHlTZXRcIixbJGjNj19hID0+IChpc0NvcHlTZXQgPSAkaM2PX2EpLCRozY9fbGl2ZVtcImlzQ29weVNldFwiXV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDdXJyZW50S2V5c0tpdCA9IChcbiAgZ2V0UmF3S2V5cyxcbiAgY2hlY2tIYXMsXG4gIGNvbXBhcmUsXG4gIGFzc2VydE9rVG9BZGQsXG4gIGFzc2VydE9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBsZXQgdXBkYXRlQ291bnQgPSAwO1xuICBsZXQgc29ydGVkS2V5c01lbW87XG5cbiAgY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQgPSAoaywgdiA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFzc2VydE9rVG9BZGQoaywgdik7XG4gICAgdXBkYXRlQ291bnQgKz0gMTtcbiAgICBzb3J0ZWRLZXlzTWVtbyA9IHVuZGVmaW5lZDtcbiAgfTtcblxuICBjb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSA9IGsgPT4gYXNzZXJ0T2tUb0RlbGV0ZSAmJiBhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG4gIGNvbnN0IGdldFNvcnRlZEtleXMgPSAoKSA9PiB7XG4gICAgaWYgKHNvcnRlZEtleXNNZW1vID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNvcnRlZEtleXNNZW1vID0gaGFyZGVuKFsuLi5nZXRSYXdLZXlzKCldLnNvcnQoY29tcGFyZSkpO1xuICAgIH1cbiAgICByZXR1cm4gc29ydGVkS2V5c01lbW87XG4gIH07XG5cbiAgY29uc3QgaXRlcmFibGVLZXlzID0gRmFyKCdJdGVyYWJsZSBvZiBrZXlzJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBnZW5lcmF0aW9uID0gdXBkYXRlQ291bnQ7XG4gICAgICBnZXRTb3J0ZWRLZXlzKCk7XG4gICAgICBjb25zdCBsZW4gPSBzb3J0ZWRLZXlzTWVtby5sZW5ndGg7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICByZXR1cm4gRmFyKCdJdGVyYXRvciBvZiBrZXlzJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgZ2VuZXJhdGlvbiA9PT0gdXBkYXRlQ291bnQgfHwgRmFpbGBTdG9yZSAke3Eoa2V5TmFtZSl9IGN1cnNvciBzdGFsZWA7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc29ydGVkS2V5c01lbW9baV07XG4gICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrSGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGFzc2VydFVwZGF0ZU9uQWRkLFxuICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgIGl0ZXJhYmxlS2V5cyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQ3VycmVudEtleXNLaXQobWFrZUN1cnJlbnRLZXlzS2l0KTtcbmhhcmRlbihtYWtlQ3VycmVudEtleXNLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcm92aWRlTGF6eSA9IChtYXBTdG9yZSwga2V5LCBtYWtlVmFsdWUpID0+IHtcbiAgaWYgKCFtYXBTdG9yZS5oYXMoa2V5KSkge1xuICAgIG1hcFN0b3JlLmluaXQoa2V5LCBtYWtlVmFsdWUoa2V5KSk7XG4gIH1cbiAgcmV0dXJuIG1hcFN0b3JlLmdldChrZXkpO1xufTskaM2PX29uY2UucHJvdmlkZUxhenkocHJvdmlkZUxhenkpO1xuaGFyZGVuKHByb3ZpZGVMYXp5KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUF0b21pY1Byb3ZpZGVyID0gc3RvcmUgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGVuZGluZyA9IG5ldyBNYXAoKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHByb3ZpZGVBc3luYyA9IChrZXksIG1ha2VWYWx1ZSwgZmluaXNoVmFsdWUpID0+IHtcbiAgICBpZiAoc3RvcmUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RvcmUuZ2V0KGtleSkpO1xuICAgIH1cbiAgICBpZiAoIXBlbmRpbmcuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IHZhbFAgPSBtYWtlVmFsdWUoa2V5KVxuICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICBzdG9yZS5pbml0KGtleSwgdik7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICAgIGlmIChmaW5pc2hWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmlzaFZhbHVlKGtleSwgdikudGhlbigoKSA9PiB2KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBwZW5kaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgICB9KTtcbiAgICAgIHBlbmRpbmcuc2V0KGtleSwgdmFsUCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbFAgPSBwZW5kaW5nLmdldChrZXkpO1xuICAgIGFzc2VydCh2YWxQKTtcbiAgICByZXR1cm4gdmFsUDtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvdmlkZUFzeW5jIH0pO1xufTskaM2PX29uY2UubWFrZUF0b21pY1Byb3ZpZGVyKG1ha2VBdG9taWNQcm92aWRlcik7XG5oYXJkZW4obWFrZUF0b21pY1Byb3ZpZGVyKTtcbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhcHBlbmRUb1N0b3JlZEFycmF5ID0gKG1hcFN0b3JlLCBrZXksIGl0ZW0pID0+IHtcbiAgaWYgKG1hcFN0b3JlLmhhcyhrZXkpKSB7XG4gICAgY29uc3QgZXh0YW50ID0gbWFwU3RvcmUuZ2V0KGtleSk7XG4gICAgbWFwU3RvcmUuc2V0KGtleSwgaGFyZGVuKFsuLi5leHRhbnQsIGl0ZW1dKSk7XG4gIH0gZWxzZSB7XG4gICAgbWFwU3RvcmUuaW5pdChrZXksIGhhcmRlbihbaXRlbV0pKTtcbiAgfVxufTskaM2PX29uY2UuYXBwZW5kVG9TdG9yZWRBcnJheShhcHBlbmRUb1N0b3JlZEFycmF5KTtcbmhhcmRlbihhcHBlbmRUb1N0b3JlZEFycmF5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiLGZhbHNlXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCIsZmFsc2VdfSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDdXJyZW50S2V5c0tpdCI6WyJtYWtlQ3VycmVudEtleXNLaXQiXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiXSwibWFrZUF0b21pY1Byb3ZpZGVyIjpbIm1ha2VBdG9taWNQcm92aWRlciJdLCJhcHBlbmRUb1N0b3JlZEFycmF5IjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABnrlJ1phkAAKYZAAAoAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImlnbm9yZUNvbnRleHQiLCJtYWtlRXhvVXRpbHMiLCJwcmVwYXJlRXhvIiwicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZVNpbmdsZXRvbiIsInByb3ZpZGVLaW5kSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW5pdEVtcHR5LHByb3ZpZGUsZ2xvYmFsVmF0RGF0YTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLFskaM2PX2EgPT4gKGluaXRFbXB0eSA9ICRozY9fYSldXV1dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW1tcInByb3ZpZGVcIixbJGjNj19hID0+IChwcm92aWRlID0gJGjNj19hKV1dLFtcIlZhdERhdGFcIixbJGjNj19hID0+IChnbG9iYWxWYXREYXRhID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8vXG4vKlxuXG4gKi9cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpZ25vcmVDb250ZXh0ID1cbiAgZm4gPT5cbiAgKF9jb250ZXh0LCAuLi5hcmdzKSA9PlxuICAgIGZuKC4uLmFyZ3MpOyRozY9fb25jZS5pZ25vcmVDb250ZXh0KGlnbm9yZUNvbnRleHQpO1xuaGFyZGVuKGlnbm9yZUNvbnRleHQpO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG1ha2VFeG9VdGlscyA9IFZhdERhdGEgPT4ge1xuICBjb25zdCB7XG4gICAgZGVmaW5lS2luZCxcbiAgICBkZWZpbmVLaW5kTXVsdGksXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQsXG4gICAgZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxcbiAgICBtYWtlS2luZEhhbmRsZSxcbiAgfSA9IFZhdERhdGE7XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJvdmlkZUtpbmRIYW5kbGUgPSAoYmFnZ2FnZSwga2luZE5hbWUpID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fa2luZEhhbmRsZWAsICgpID0+IG1ha2VLaW5kSGFuZGxlKGtpbmROYW1lKSk7XG4gIGhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlS2luZCA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGluaXQsXG4gICAgYmVoYXZpb3IsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PlxuICAgIGRlZmluZUR1cmFibGVLaW5kKFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW5pdCxcbiAgICAgIGJlaGF2aW9yLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUtpbmQpO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZUtpbmRNdWx0aSA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGluaXQsXG4gICAgYmVoYXZpb3IsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PlxuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGkoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbml0LFxuICAgICAgYmVoYXZpb3IsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIGhhcmRlbihwcmVwYXJlS2luZE11bHRpKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzID0gKHRhZywgaW50ZXJmYWNlR3VhcmQsIGluaXQsIG1ldGhvZHMsIG9wdGlvbnMpID0+XG4gICAgLy9cbiAgICBkZWZpbmVLaW5kKHRhZywgaW5pdCwgbWV0aG9kcywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQgPSAoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvL1xuICAgIGRlZmluZUtpbmRNdWx0aSh0YWcsIGluaXQsIGZhY2V0cywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MgPSAoXG4gICAga2luZEhhbmRsZSxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICBpbml0LFxuICAgIG1ldGhvZHMsXG4gICAgb3B0aW9ucyxcbiAgKSA9PlxuICAgIC8vXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQoa2luZEhhbmRsZSwgaW5pdCwgbWV0aG9kcywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQgPSAoXG4gICAga2luZEhhbmRsZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zLFxuICApID0+XG4gICAgLy9cbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpKGtpbmRIYW5kbGUsIGluaXQsIGZhY2V0cywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHByZXBhcmVFeG9DbGFzcyA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXQsXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzKFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgICBpbml0LFxuICAgICAgbWV0aG9kcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgaGFyZGVuKHByZXBhcmVFeG9DbGFzcyk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZUV4b0NsYXNzS2l0ID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgaW5pdCxcbiAgICBmYWNldHMsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PlxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChcbiAgICAgIHByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2UsIGtpbmROYW1lKSxcbiAgICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgICAgaW5pdCxcbiAgICAgIGZhY2V0cyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgaGFyZGVuKHByZXBhcmVFeG9DbGFzc0tpdCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZUV4byA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIG1ldGhvZHMsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgY29uc3QgbWFrZVNpbmdsZXRvbiA9IHByZXBhcmVFeG9DbGFzcyhcbiAgICAgIGJhZ2dhZ2UsXG4gICAgICBraW5kTmFtZSxcbiAgICAgIGludGVyZmFjZUd1YXJkLFxuICAgICAgaW5pdEVtcHR5LFxuICAgICAgbWV0aG9kcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcblxuICAgIHJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9zaW5nbGV0b25gLCAoKSA9PiBtYWtlU2luZ2xldG9uKCkpO1xuICB9O1xuICBoYXJkZW4ocHJlcGFyZUV4byk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZVNpbmdsZXRvbiA9IChiYWdnYWdlLCBraW5kTmFtZSwgbWV0aG9kcywgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT5cbiAgICBwcmVwYXJlRXhvKGJhZ2dhZ2UsIGtpbmROYW1lLCB1bmRlZmluZWQsIG1ldGhvZHMsIG9wdGlvbnMpO1xuICBoYXJkZW4ocHJlcGFyZVNpbmdsZXRvbik7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuICAgIGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxuICAgIHByZXBhcmVFeG9DbGFzcyxcbiAgICBwcmVwYXJlRXhvQ2xhc3NLaXQsXG4gICAgcHJlcGFyZUV4byxcblxuICAgIHByZXBhcmVTaW5nbGV0b24sXG4gICAgcHJvdmlkZUtpbmRIYW5kbGUsXG4gICAgcHJlcGFyZUtpbmQsXG4gICAgcHJlcGFyZUtpbmRNdWx0aSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRXhvVXRpbHMobWFrZUV4b1V0aWxzKTtcblxuY29uc3QgZ2xvYmFsRXhvVXRpbHMgPSBtYWtlRXhvVXRpbHMoZ2xvYmFsVmF0RGF0YSk7XG5cbiAgICAgICBjb25zdCB7XG4gIGRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbiAgZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG4gIGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbiAgcHJlcGFyZUV4b0NsYXNzLFxuICBwcmVwYXJlRXhvQ2xhc3NLaXQsXG4gIHByZXBhcmVFeG8sXG4gIHByZXBhcmVTaW5nbGV0b24sXG59ID0gZ2xvYmFsRXhvVXRpbHM7XG5cbi8qXG5cbiAqLyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MoZGVmaW5lVmlydHVhbEV4b0NsYXNzKTskaM2PX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzcyhkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzKHByZXBhcmVFeG9DbGFzcyk7JGjNj19vbmNlLnByZXBhcmVFeG9DbGFzc0tpdChwcmVwYXJlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvKHByZXBhcmVFeG8pOyRozY9fb25jZS5wcmVwYXJlU2luZ2xldG9uKHByZXBhcmVTaW5nbGV0b24pO1xuICAgICAgIGNvbnN0IHsgcHJvdmlkZUtpbmRIYW5kbGUsIHByZXBhcmVLaW5kLCBwcmVwYXJlS2luZE11bHRpIH0gPVxuICBnbG9iYWxFeG9VdGlsczskaM2PX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpOyRozY9fb25jZS5wcmVwYXJlS2luZChwcmVwYXJlS2luZCk7JGjNj19vbmNlLnByZXBhcmVLaW5kTXVsdGkocHJlcGFyZUtpbmRNdWx0aSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwibWFrZUV4b1V0aWxzIjpbIm1ha2VFeG9VdGlscyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIl0sInByb3ZpZGVLaW5kSGFuZGxlIjpbInByb3ZpZGVLaW5kSGFuZGxlIl0sInByZXBhcmVLaW5kIjpbInByZXBhcmVLaW5kIl0sInByZXBhcmVLaW5kTXVsdGkiOlsicHJlcGFyZUtpbmRNdWx0aSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADPnOvptggAALYIAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiLi9leG8tdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbXV0sW1wiLi9leG8tdXRpbHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL3N0b3JlIjpbWyJNIiwiTSJdLFsibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyI6W1sibWFrZUtpbmRIYW5kbGUiLCJtYWtlS2luZEhhbmRsZSJdLFsicHJvdmlkZVByb21pc2VXYXRjaGVyIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sWyJ3YXRjaFByb21pc2UiLCJ3YXRjaFByb21pc2UiXSxbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSxbImNhbkJlRHVyYWJsZSIsImNhbkJlRHVyYWJsZSJdLFsicGlja0ZhY2V0IiwicGlja0ZhY2V0Il0sWyJwYXJ0aWFsQXNzaWduIiwicGFydGlhbEFzc2lnbiJdLFsicHJvdmlkZSIsInByb3ZpZGUiXSxbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdLFsiZGVmaW5lS2luZCIsImRlZmluZUtpbmQiXSxbImRlZmluZUtpbmRNdWx0aSIsImRlZmluZUtpbmRNdWx0aSJdLFsiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZCJdLFsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXV0sIi4vZXhvLXV0aWxzLmpzIjpbWyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSxbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLFsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzcyJdLFsicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUV4b0NsYXNzS2l0Il0sWyJwcmVwYXJlRXhvIiwicHJlcGFyZUV4byJdLFsicHJlcGFyZVNpbmdsZXRvbiIsInByZXBhcmVTaW5nbGV0b24iXSxbImlnbm9yZUNvbnRleHQiLCJpZ25vcmVDb250ZXh0Il0sWyJwcm92aWRlS2luZEhhbmRsZSIsInByb3ZpZGVLaW5kSGFuZGxlIl0sWyJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kIl0sWyJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZUtpbmRNdWx0aSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAL2Egli4YAAAuGAAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiVmF0RGF0YSIsImNhbkJlRHVyYWJsZSIsImRlZmluZUR1cmFibGVLaW5kIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUtpbmQiLCJkZWZpbmVLaW5kTXVsdGkiLCJtYWtlS2luZEhhbmRsZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVN0b3JlVXRpbHMiLCJwYXJ0aWFsQXNzaWduIiwicGlja0ZhY2V0IiwicHJvdmlkZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscHJvdmlkZUxhenk7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIixbJGjNj19hID0+IChwcm92aWRlTGF6eSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG5sZXQgVmF0RGF0YUdsb2JhbDtcbmlmICgnVmF0RGF0YScgaW4gZ2xvYmFsVGhpcykge1xuICBnbG9iYWxUaGlzLlZhdERhdGEgfHwgRmFpbGBWYXREYXRhIGRlZmluZWQgaW4gZ2xvYmFsIGFzIG51bGwgb3IgdW5kZWZpbmVkYDtcbiAgLy9cbiAgVmF0RGF0YUdsb2JhbCA9IC8qICAgICAgICAgICAgICAqLyAoZ2xvYmFsVGhpcy5WYXREYXRhKTtcbn0gZWxzZSB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHVuYXZhaWxhYmxlID0gKCkgPT4gRmFpbGBWYXREYXRhIHVuYXZhaWxhYmxlYDtcbiAgVmF0RGF0YUdsb2JhbCA9IHtcbiAgICBkZWZpbmVLaW5kOiB1bmF2YWlsYWJsZSxcbiAgICBkZWZpbmVLaW5kTXVsdGk6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUR1cmFibGVLaW5kOiB1bmF2YWlsYWJsZSxcbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlS2luZEhhbmRsZTogdW5hdmFpbGFibGUsXG4gICAgcHJvdmlkZVByb21pc2VXYXRjaGVyOiB1bmF2YWlsYWJsZSxcbiAgICB3YXRjaFByb21pc2U6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBjYW5CZUR1cmFibGU6IHVuYXZhaWxhYmxlLFxuICB9O1xufVxuXG5jb25zdCBWYXREYXRhRXhwb3J0ID0gVmF0RGF0YUdsb2JhbDskaM2PX29uY2UuVmF0RGF0YUV4cG9ydChWYXREYXRhRXhwb3J0KTtcblxuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCB7XG4gIGRlZmluZUtpbmQsXG4gIGRlZmluZUtpbmRNdWx0aSxcbiAgZGVmaW5lRHVyYWJsZUtpbmQsXG4gIGRlZmluZUR1cmFibGVLaW5kTXVsdGksXG59ID0gVmF0RGF0YUdsb2JhbDskaM2PX29uY2UuZGVmaW5lS2luZChkZWZpbmVLaW5kKTskaM2PX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVLaW5kKGRlZmluZUR1cmFibGVLaW5kKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShkZWZpbmVEdXJhYmxlS2luZE11bHRpKTtcblxuICAgICAgIGNvbnN0IHtcbiAgbWFrZUtpbmRIYW5kbGUsXG4gIHByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbiAgd2F0Y2hQcm9taXNlLFxuICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbiAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbiAgY2FuQmVEdXJhYmxlLFxufSA9IFZhdERhdGFHbG9iYWw7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRozY9fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbiAgICAgICBjb25zdCBwaWNrRmFjZXQgPVxuICAobWFrZXIsIGZhY2V0TmFtZSkgPT5cbiAgKC4uLmFyZ3MpID0+XG4gICAgbWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaM2PX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhcnRpYWxBc3NpZ24gPSAodGFyZ2V0LCBzb3VyY2UpID0+IHtcbiAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSk7XG59OyRozY9fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuICAgICAgIGNvbnN0IHByb3ZpZGUgPVxuICAvL1xuICAvKlxuXG5cblxuXG5cbiAgICovIChwcm92aWRlTGF6eSk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnByb3ZpZGUocHJvdmlkZSk7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlVXRpbHMgPSBWYXREYXRhID0+IHtcbiAgY29uc3Qge1xuICAgIC8vXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlLFxuICAgIC8vXG4gICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbiAgICAvL1xuICAgIG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbiAgICAvL1xuICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUsXG4gIH0gPSBWYXREYXRhO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAoYmFnZ2FnZSwgbmFtZSwgb3B0aW9ucyA9IHt9KSA9PlxuICAgIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT5cbiAgICAgIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUgPSAoYmFnZ2FnZSwgbmFtZSwgb3B0aW9ucyA9IHt9KSA9PlxuICAgIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT5cbiAgICAgIG1ha2VTY2FsYXJCaWdTZXRTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG4gICAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVN0b3JlVXRpbHMobWFrZVN0b3JlVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxTdG9yZVV0aWxzID0gbWFrZVN0b3JlVXRpbHMoVmF0RGF0YUdsb2JhbCk7XG4gICAgICAgY29uc3Qge1xuICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG59ID0gZ2xvYmFsU3RvcmVVdGlsczskaM2PX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJWYXREYXRhIjpbIlZhdERhdGFFeHBvcnQiXSwiZGVmaW5lS2luZCI6WyJkZWZpbmVLaW5kIl0sImRlZmluZUtpbmRNdWx0aSI6WyJkZWZpbmVLaW5kTXVsdGkiXSwiZGVmaW5lRHVyYWJsZUtpbmQiOlsiZGVmaW5lRHVyYWJsZUtpbmQiXSwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSI6WyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIl0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIl0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIl0sInByb3ZpZGUiOlsicHJvdmlkZSJdLCJtYWtlU3RvcmVVdGlscyI6WyJtYWtlU3RvcmVVdGlscyJdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACRSaOMDFQAAAxUAAB8AAABAYWdvcmljL3ZhdHMtdjAuMTUuMS9zcmMvY3JjLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJDUkMiLCJjcmMxIiwiY3JjMTAiLCJjcmMxNiIsImNyYzI0IiwiY3JjMzIiLCJjcmMzMmMiLCJjcmM2IiwiY3JjOCIsIm1vZGVscyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cblxuICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuZnVuY3Rpb24gY29udmVydChkYXRhKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcbiAgICBjb25zdCBieXRlcyA9IFtdO1xuICAgIC8vXG4gICAgLy9cbiAgICB3aGlsZSAoZGF0YSA+IDAgfHwgYnl0ZXMubGVuZ3RoIDwgNCkge1xuICAgICAgYnl0ZXMudW5zaGlmdChkYXRhICUgMjU2KTtcbiAgICAgIGRhdGEgPSBNYXRoLmZsb29yKGRhdGEgLyAyNTYpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlbmNvZGVyLmVuY29kZShkYXRhKTtcbiAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSkpIHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH1cbiAgdGhyb3cgVHlwZUVycm9yKFxuICAgIGBjcmMgcmVxdWlyZXMgMzIgYml0IG51bWJlciwgYSBzdHJpbmcgb3IgVHlwZWRBcnJheSBmb3IgaW5wdXRgLFxuICApO1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gbWlycm9yKGRhdGEsIHdpZHRoKSB7XG4gIGxldCByZXMgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpICs9IDEpIHtcbiAgICByZXMgPSAocmVzIDw8IDEpIHwgKGRhdGEgJiAxKTtcbiAgICBkYXRhID4+PSAxO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbiAgICAgICBjbGFzcyBDUkMge1xuICAvKlxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHdpZHRoLCBwb2x5LCB4b3JJbiwgeG9yT3V0LCByZWZsZWN0KSB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMucG9seSA9IHBvbHk7XG4gICAgdGhpcy54b3JJbiA9IHhvckluO1xuICAgIHRoaXMucmVmbGVjdGVkWG9ySW4gPSBtaXJyb3IoeG9ySW4sIHdpZHRoKTtcbiAgICB0aGlzLnhvck91dCA9IHhvck91dDtcbiAgICB0aGlzLnJlZmxlY3QgPSByZWZsZWN0O1xuICAgIHRoaXMubXNiTWFzayA9IDEgPDwgKHRoaXMud2lkdGggLSAxKTtcbiAgICB0aGlzLm1hc2sgPSAoKHRoaXMubXNiTWFzayAtIDEpIDw8IDEpIHwgMTtcbiAgICB0aGlzLmNyY1NoaWZ0ID0gdGhpcy53aWR0aCA8IDggPyA4IC0gdGhpcy53aWR0aCA6IDA7XG4gICAgdGhpcy5zaGlmdGVkWG9ySW4gPSB0aGlzLnhvckluIDw8IHRoaXMuY3JjU2hpZnQ7XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZ2VuVGFibGUoKTtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG5cbiAgICBpZiAodGhpcy53aWR0aCA9PT0gOCAmJiAhdGhpcy54b3JJbiAmJiAhdGhpcy54b3JPdXQgJiYgIXRoaXMucmVmbGVjdCkge1xuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgdGhpcy5jYWxjdWxhdGUgPSBmdW5jdGlvbiBjYWxjdWxhdGUoZGF0YSkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBjb252ZXJ0KGRhdGEpO1xuICAgICAgICBsZXQgY3JjID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjcmMgPSB0YWJsZVtjcmMgXiBidWZmZXJbaV1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmM7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY2FsY3VsYXRlKGRhdGEpIHtcbiAgICBjb25zdCBidWZmZXIgPSBjb252ZXJ0KGRhdGEpO1xuICAgIGxldCBjcmM7XG4gICAgY29uc3QgeyB0YWJsZSwgd2lkdGgsIGNyY1NoaWZ0LCBtYXNrIH0gPSB0aGlzO1xuICAgIGlmICh0aGlzLnJlZmxlY3QpIHtcbiAgICAgIGNyYyA9IHRoaXMucmVmbGVjdGVkWG9ySW47XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBieXRlID0gYnVmZmVyW2ldO1xuICAgICAgICBjcmMgPSAodGFibGVbKGNyYyBeIGJ5dGUpICYgMHhmZl0gXiAoY3JjID4+PiA4KSkgJiBtYXNrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjcmMgPSB0aGlzLnNoaWZ0ZWRYb3JJbjtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNyYyA9XG4gICAgICAgICAgKHRhYmxlWygoY3JjID4+ICh3aWR0aCAtIDggKyBjcmNTaGlmdCkpIF4gYnVmZmVyW2ldKSAmIDB4ZmZdIDw8XG4gICAgICAgICAgICBjcmNTaGlmdCkgXlxuICAgICAgICAgICgoY3JjIDw8ICg4IC0gY3JjU2hpZnQpKSAmIChtYXNrIDw8IGNyY1NoaWZ0KSk7XG4gICAgICB9XG4gICAgICBjcmMgPj49IGNyY1NoaWZ0O1xuICAgIH1cbiAgICBjcmMgXj0gdGhpcy54b3JPdXQ7XG4gICAgcmV0dXJuIGNyYyA+Pj4gMDtcbiAgfVxuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY2FsY3VsYXRlTm9UYWJsZShkYXRhKSB7XG4gICAgY29uc3QgYnVmZmVyID0gY29udmVydChkYXRhKTtcbiAgICBsZXQgY3JjID0gdGhpcy54b3JJbjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgbGV0IG9jdGV0ID0gYnVmZmVyW2ldO1xuICAgICAgaWYgKHRoaXMucmVmbGVjdCkgb2N0ZXQgPSBtaXJyb3Iob2N0ZXQsIDgpO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA4OyBqICs9IDEpIHtcbiAgICAgICAgbGV0IHRvcGJpdCA9IGNyYyAmIHRoaXMubXNiTWFzaztcbiAgICAgICAgaWYgKG9jdGV0ICYgKDB4ODAgPj4gaikpIHRvcGJpdCBePSB0aGlzLm1zYk1hc2s7XG4gICAgICAgIGNyYyA8PD0gMTtcbiAgICAgICAgaWYgKHRvcGJpdCkgY3JjIF49IHRoaXMucG9seTtcbiAgICAgIH1cbiAgICAgIGNyYyAmPSB0aGlzLm1hc2s7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlZmxlY3QpIGNyYyA9IG1pcnJvcihjcmMsIHRoaXMud2lkdGgpO1xuICAgIGNyYyBePSB0aGlzLnhvck91dDtcbiAgICByZXR1cm4gY3JjID4+PiAwO1xuICB9XG5cbiAgZ2VuVGFibGUoKSB7XG4gICAgY29uc3QgdGFibGVMZW5ndGggPSAyNTY7XG4gICAgY29uc3QgdGFibGUgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlTGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGxldCByZWcgPSBpO1xuICAgICAgaWYgKHRoaXMucmVmbGVjdCkgcmVnID0gbWlycm9yKHJlZywgOCk7XG4gICAgICByZWcgPDw9IHRoaXMud2lkdGggLSA4ICsgdGhpcy5jcmNTaGlmdDtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgODsgaiArPSAxKSB7XG4gICAgICAgIGlmICgocmVnICYgKHRoaXMubXNiTWFzayA8PCB0aGlzLmNyY1NoaWZ0KSkgIT09IDApIHtcbiAgICAgICAgICByZWcgPDw9IDE7XG4gICAgICAgICAgcmVnIF49IHRoaXMucG9seSA8PCB0aGlzLmNyY1NoaWZ0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZyA8PD0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVmbGVjdClcbiAgICAgICAgcmVnID0gbWlycm9yKHJlZyA+PiB0aGlzLmNyY1NoaWZ0LCB0aGlzLndpZHRoKSA8PCB0aGlzLmNyY1NoaWZ0O1xuICAgICAgcmVnID0gKHJlZyA+PiB0aGlzLmNyY1NoaWZ0KSAmIHRoaXMubWFzaztcbiAgICAgIHRhYmxlW2ldID0gcmVnID4+PiAwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEludDMyQXJyYXkodGFibGUpO1xuICB9XG59JGjNj19vbmNlLiAgIENSQyhDUkMpO1xuXG4gICAgICAgY29uc3QgY3JjMSA9IG5ldyBDUkMoMSwgMHgwMSwgMHgwMCwgMHgwMCwgZmFsc2UpOyRozY9fb25jZS5jcmMxKGNyYzEpO1xuICAgICAgIGNvbnN0IGNyYzYgPSBuZXcgQ1JDKDYsIDB4MmYsIDB4MDAsIDB4MDAsIGZhbHNlKTskaM2PX29uY2UuY3JjNihjcmM2KTtcbiAgICAgICBjb25zdCBjcmM4ID0gbmV3IENSQyg4LCAweDA3LCAweDAwLCAweDAwLCBmYWxzZSk7JGjNj19vbmNlLmNyYzgoY3JjOCk7XG4gICAgICAgY29uc3QgY3JjMTAgPSBuZXcgQ1JDKDEwLCAweDIzMywgMHgwMDAwLCAweDAwMDAsIGZhbHNlKTskaM2PX29uY2UuY3JjMTAoY3JjMTApO1xuICAgICAgIGNvbnN0IGNyYzE2ID0gbmV3IENSQygxNiwgMHg4MDA1LCAweDAwMDAsIDB4MDAwMCwgdHJ1ZSk7JGjNj19vbmNlLmNyYzE2KGNyYzE2KTtcbiAgICAgICBjb25zdCBjcmMyNCA9IG5ldyBDUkMoMjQsIDB4ODY0Y2ZiLCAweGI3MDRjZSwgMHgwMDAwMDAsIGZhbHNlKTskaM2PX29uY2UuY3JjMjQoY3JjMjQpO1xuICAgICAgIGNvbnN0IGNyYzMyID0gbmV3IENSQygzMiwgMHgwNGMxMWRiNywgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgdHJ1ZSk7JGjNj19vbmNlLmNyYzMyKGNyYzMyKTtcbiAgICAgICBjb25zdCBjcmMzMmMgPSBuZXcgQ1JDKDMyLCAweDFlZGM2ZjQxLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKTskaM2PX29uY2UuY3JjMzJjKGNyYzMyYyk7XG5cbiAgICAgICBjb25zdCBtb2RlbHMgPSB7IGNyYzEsIGNyYzYsIGNyYzgsIGNyYzEwLCBjcmMxNiwgY3JjMjQsIGNyYzMyLCBjcmMzMmMgfTskaM2PX29uY2UubW9kZWxzKG1vZGVscyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDUkMiOlsiQ1JDIl0sImNyYzEiOlsiY3JjMSJdLCJjcmM2IjpbImNyYzYiXSwiY3JjOCI6WyJjcmM4Il0sImNyYzEwIjpbImNyYzEwIl0sImNyYzE2IjpbImNyYzE2Il0sImNyYzI0IjpbImNyYzI0Il0sImNyYzMyIjpbImNyYzMyIl0sImNyYzMyYyI6WyJjcmMzMmMiXSwibW9kZWxzIjpbIm1vZGVscyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAN2UsH+SUAAPklAAAlAAAAQGFnb3JpYy92YXRzLXYwLjE1LjEvc3JjL2xpYi1ib2FyZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC9pbmFjY2Vzc2libGUtdmFsLmpzIiwiLi9jcmMuanMiXSwiZXhwb3J0cyI6WyJERUZBVUxUX0NSQ19ESUdJVFMiLCJERUZBVUxUX1BSRUZJWCIsInByZXBhcmVCb2FyZEtpdCIsInByZXBhcmVSZWNvcmRlckZhY3RvcnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRmFpbCxxLHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCxNLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcmVwYXJlRXhvQ2xhc3NLaXQsZGVmaW5lUmVjb3JkZXJLaXQscHJlcGFyZVJlY29yZGVyLEUsaXNSZW1vdGFibGUsbWFrZU1hcnNoYWwsbWFrZUluYWNjZXNzaWJsZVZhbCxjcmM2OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qc1wiLCBbW1wiZGVmaW5lUmVjb3JkZXJLaXRcIixbJGjNj19hID0+IChkZWZpbmVSZWNvcmRlcktpdCA9ICRozY9fYSldXSxbXCJwcmVwYXJlUmVjb3JkZXJcIixbJGjNj19hID0+IChwcmVwYXJlUmVjb3JkZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNSZW1vdGFibGVcIixbJGjNj19hID0+IChpc1JlbW90YWJsZSA9ICRozY9fYSldXSxbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC9pbmFjY2Vzc2libGUtdmFsLmpzXCIsIFtbXCJtYWtlSW5hY2Nlc3NpYmxlVmFsXCIsWyRozY9fYSA9PiAobWFrZUluYWNjZXNzaWJsZVZhbCA9ICRozY9fYSldXV1dLFtcIi4vY3JjLmpzXCIsIFtbXCJjcmM2XCIsWyRozY9fYSA9PiAoY3JjNiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbiAgICAgICBjb25zdCBERUZBVUxUX0NSQ19ESUdJVFMgPSAyOyRozY9fb25jZS5ERUZBVUxUX0NSQ19ESUdJVFMoREVGQVVMVF9DUkNfRElHSVRTKTtcbiAgICAgICBjb25zdCBERUZBVUxUX1BSRUZJWCA9ICdib2FyZDAnO1xuXG4vL1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuREVGQVVMVF9QUkVGSVgoREVGQVVMVF9QUkVGSVgpO1xuY29uc3QgQ2FwRGF0YVNoYXBlID0geyBib2R5OiBNLnN0cmluZygpLCBzbG90czogTS5hcnJheSgpIH07XG5cbmNvbnN0IE1hcnNoYWxJID0gTS5pbnRlcmZhY2UoJ01hcnNoYWxsZXInLCB7XG4gIHRvQ2FwRGF0YTogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoQ2FwRGF0YVNoYXBlKSxcbiAgc2VyaWFsaXplOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhDYXBEYXRhU2hhcGUpLFxuICBmcm9tQ2FwRGF0YTogTS5jYWxsKENhcERhdGFTaGFwZSkucmV0dXJucyhNLmFueSgpKSxcbiAgdW5zZXJpYWxpemU6IE0uY2FsbChDYXBEYXRhU2hhcGUpLnJldHVybnMoTS5hbnkoKSksXG59KTtcblxuY29uc3QgSWRTaGFwZSA9IE0uc3RyaW5nKCk7XG5jb25zdCBWYWxTaGFwZSA9IE0uc2NhbGFyKCk7XG5jb25zdCBCb2FyZEtpdElLaXQgPSB7XG4gIGJvYXJkOiBNLmludGVyZmFjZSgnQm9hcmQnLCB7XG4gICAgaGFzOiBNLmNhbGwoVmFsU2hhcGUpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICAgIGdldFZhbHVlOiBNLmNhbGwoSWRTaGFwZSkucmV0dXJucyhWYWxTaGFwZSksXG4gICAgbG9va3VwOiBNLmNhbGwoKS5yZXN0KE0uYXJyYXlPZihJZFNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgZ2V0SWQ6IE0uY2FsbChWYWxTaGFwZSkucmV0dXJucyhJZFNoYXBlKSxcbiAgICBpZHM6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKElkU2hhcGUpKSxcbiAgICBnZXRQdWJsaXNoaW5nTWFyc2hhbGxlcjogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgpKSxcbiAgICBnZXRSZWFkb25seU1hcnNoYWxsZXI6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoKSksXG4gIH0pLFxuICBwdWJsaXNoaW5nTWFyc2hhbGxlcjogTWFyc2hhbEksXG4gIHJlYWRvbmx5TWFyc2hhbGxlcjogTWFyc2hhbEksXG59O1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGNhbGNDcmMgPSAoZGF0YSwgY3JjRGlnaXRzKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IGNyYyA9IGNyYzYuY2FsY3VsYXRlKGRhdGEpICsgMTtcbiAgY29uc3QgY3JjU3RyID0gY3JjLnRvU3RyaW5nKCkucGFkU3RhcnQoY3JjRGlnaXRzLCAnMCcpO1xuICBhc3NlcnQoY3JjU3RyLmxlbmd0aCA8PSBjcmNEaWdpdHMsIGBDUkMgdG9vIGJpZyBmb3IgaXRzIGJyaXRjaGVzICR7Y3JjU3RyfWApO1xuICByZXR1cm4gY3JjU3RyO1xufTtcblxuLypcblxuXG4gKi9cblxuLy9cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgaW5pdER1cmFibGVCb2FyZFN0YXRlID0gKFxuICBpbml0U2VxdWVuY2UgPSAwLFxuICB7IHByZWZpeCA9IERFRkFVTFRfUFJFRklYLCBjcmNEaWdpdHMgPSBERUZBVUxUX0NSQ19ESUdJVFMgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGltbXV0YWJsZSA9IHsgcHJlZml4LCBjcmNEaWdpdHMgfTtcblxuICBjb25zdCBsYXN0U2VxdWVuY2UgPSBCaWdJbnQoaW5pdFNlcXVlbmNlKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpZFRvVmFsID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdpZFRvVmFsJywge1xuICAgIGR1cmFibGU6IHRydWUsXG4gICAga2V5U2hhcGU6IElkU2hhcGUsXG4gICAgdmFsdWVTaGFwZTogVmFsU2hhcGUsXG4gIH0pO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHZhbFRvSWQgPSBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ3ZhbFRvSWQnLCB7XG4gICAgZHVyYWJsZTogdHJ1ZSxcbiAgICBrZXlTaGFwZTogVmFsU2hhcGUsXG4gICAgdmFsdWVTaGFwZTogSWRTaGFwZSxcbiAgfSk7XG5cbiAgY29uc3QgbXV0YWJsZSA9IHsgbGFzdFNlcXVlbmNlLCBpZFRvVmFsLCB2YWxUb0lkIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5pbW11dGFibGUsXG4gICAgLi4ubXV0YWJsZSxcbiAgfTtcbn07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgZ2V0SWQgPSAodmFsdWUsIHN0YXRlKSA9PiB7XG4gIGNvbnN0IHsgaWRUb1ZhbCwgdmFsVG9JZCwgcHJlZml4LCBjcmNEaWdpdHMgfSA9IHN0YXRlO1xuICBpZiAoIWlzUmVtb3RhYmxlKHZhbHVlKSkge1xuICAgIEZhaWxgQm9hcmQgY2Fubm90IGNyZWF0ZSBpZCBmb3Igbm9uLXJlbW90YWJsZWA7XG4gIH1cblxuICBpZiAodmFsVG9JZC5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbFRvSWQuZ2V0KHZhbHVlKTtcbiAgfVxuXG4gIHN0YXRlLmxhc3RTZXF1ZW5jZSArPSAxbjtcbiAgY29uc3Qgc2VxID0gc3RhdGUubGFzdFNlcXVlbmNlO1xuXG4gIGNvbnN0IGNyY0lucHV0ID0gYCR7cHJlZml4fSR7c2VxfWA7XG4gIGNvbnN0IGNyYyA9IGNhbGNDcmMoY3JjSW5wdXQsIGNyY0RpZ2l0cyk7XG5cbiAgY29uc3QgaWQgPSBgJHtwcmVmaXh9JHtjcmN9JHtzZXF9YDtcblxuICB2YWxUb0lkLmluaXQodmFsdWUsIGlkKTtcbiAgaWRUb1ZhbC5pbml0KGlkLCB2YWx1ZSk7XG4gIHJldHVybiBpZDtcbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBnZXRWYWx1ZSA9IChpZCwgeyBwcmVmaXgsIGNyY0RpZ2l0cywgaWRUb1ZhbCB9KSA9PiB7XG4gIGlkLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBGYWlsYGlkIG11c3Qgc3RhcnQgd2l0aCAke3EocHJlZml4KX06ICR7aWR9YDtcbiAgY29uc3QgZGlnaXRzID0gaWQuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gIC8vXG4gIGNvbnN0IERJR0lUU19SRUdFWFAgPSBuZXcgUmVnRXhwKGBeWzAtOV17JHtjcmNEaWdpdHMgKyAxfSx9JGApO1xuICBESUdJVFNfUkVHRVhQLnRlc3QoZGlnaXRzKSB8fFxuICAgIEZhaWxgaWQgbXVzdCBlbmQgaW4gYXQgbGVhc3QgJHtxKGNyY0RpZ2l0cyArIDEpfSBkaWdpdHM6ICR7aWR9YDtcblxuICBpZiAoaWRUb1ZhbC5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIGlkVG9WYWwuZ2V0KGlkKTtcbiAgfVxuXG4gIGNvbnN0IGFsbGVnZWRDcmMgPSBkaWdpdHMuc2xpY2UoMCwgY3JjRGlnaXRzKTtcblxuICBjb25zdCBzZXEgPSBkaWdpdHMuc2xpY2UoY3JjRGlnaXRzKTtcbiAgY29uc3QgY3JjSW5wdXQgPSBgJHtwcmVmaXh9JHtzZXF9YDtcbiAgY29uc3QgY3JjID0gY2FsY0NyYyhjcmNJbnB1dCwgY3JjRGlnaXRzKTtcblxuICBhbGxlZ2VkQ3JjID09PSBjcmMgfHwgRmFpbGBpZCBpcyBwcm9iYWJseSBhIHR5cG8sIGNhbm5vdCB2ZXJpZnkgQ1JDOiAke2lkfWA7XG4gIC8vXG4gIHRocm93IEZhaWxgYm9hcmQgZG9lcyBub3QgaGF2ZSBpZDogJHtpZH1gO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1ha2VTbG90VG9WYWwgPSBzdGF0ZSA9PiB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBzbG90VG9WYWwgPSAoc2xvdCwgaWZhY2UpID0+IHtcbiAgICBpZiAoc2xvdCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGdldFZhbHVlKHNsb3QsIHN0YXRlKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIHJldHVybiBtYWtlSW5hY2Nlc3NpYmxlVmFsKGlmYWNlKTtcbiAgfTtcbiAgcmV0dXJuIHNsb3RUb1ZhbDtcbn07XG5cbi8vXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFrZVJlYWRvbmx5TWFyc2hhbGxlciA9IHN0YXRlID0+IHtcbiAgY29uc3QgeyB2YWxUb0lkIH0gPSBzdGF0ZTtcbiAgY29uc3Qgc2xvdFRvVmFsID0gbWFrZVNsb3RUb1ZhbChzdGF0ZSk7XG4gIGNvbnN0IHZhbFRvU2xvdCA9IHZhbCA9PiB7XG4gICAgaWYgKCF2YWxUb0lkLmhhcyh2YWwpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy9cbiAgICByZXR1cm4gdmFsVG9JZC5nZXQodmFsKTtcbiAgfTtcbiAgcmV0dXJuIG1ha2VNYXJzaGFsKHZhbFRvU2xvdCwgc2xvdFRvVmFsLCB7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pO1xufTtcblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VQdWJsaXNoaW5nTWFyc2hhbGxlciA9IHN0YXRlID0+IHtcbiAgY29uc3Qgc2xvdFRvVmFsID0gbWFrZVNsb3RUb1ZhbChzdGF0ZSk7XG4gIC8vXG4gIGNvbnN0IHZhbFRvU2xvdCA9IHZhbCA9PiBnZXRJZCh2YWwsIHN0YXRlKTtcbiAgcmV0dXJuIG1ha2VNYXJzaGFsKHZhbFRvU2xvdCwgc2xvdFRvVmFsLCB7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pO1xufTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQm9hcmRLaXQgPSBiYWdnYWdlID0+IHtcbiAgcmV0dXJuIHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgICdCb2FyZCcsXG4gICAgQm9hcmRLaXRJS2l0LFxuICAgIGluaXREdXJhYmxlQm9hcmRTdGF0ZSxcbiAgICB7XG4gICAgICBib2FyZDoge1xuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIGdldElkKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGdldElkKHZhbHVlLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgfSxcbiAgICAgICAgLypcblxuXG4gICAgICAgICAqL1xuICAgICAgICBnZXRWYWx1ZShpZCkge1xuICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShpZCwgdGhpcy5zdGF0ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbG9va3VwKC4uLnBhdGgpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmYWNldHM6IHsgYm9hcmQgfSxcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBib2FyZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IGJvYXJkLmdldFZhbHVlKC8qICAgICAgICAgICAgICAgICAgKi8gKGZpcnN0KSk7XG4gICAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIEUoZmlyc3RWYWx1ZSkubG9va3VwKC4uLnJlc3QpO1xuICAgICAgICB9LFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICBoYXModmFsKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gc3RhdGUudmFsVG9JZC5oYXModmFsKTtcbiAgICAgICAgfSxcbiAgICAgICAgaWRzKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbihbLi4uc3RhdGUuaWRUb1ZhbC5rZXlzKCldKTtcbiAgICAgICAgfSxcbiAgICAgICAgLypcblxuXG4gICAgICAgICAqL1xuICAgICAgICBnZXRQdWJsaXNoaW5nTWFyc2hhbGxlcigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMucHVibGlzaGluZ01hcnNoYWxsZXI7XG4gICAgICAgIH0sXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICBnZXRSZWFkb25seU1hcnNoYWxsZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLnJlYWRvbmx5TWFyc2hhbGxlcjtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWFkb25seU1hcnNoYWxsZXI6IHtcbiAgICAgICAgdG9DYXBEYXRhKHZhbCkge1xuICAgICAgICAgIGNvbnN0IHJlYWRvbmx5ID0gbWFrZVJlYWRvbmx5TWFyc2hhbGxlcih0aGlzLnN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gcmVhZG9ubHkudG9DYXBEYXRhKHZhbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGZyb21DYXBEYXRhKGRhdGEpIHtcbiAgICAgICAgICBjb25zdCByZWFkb25seSA9IG1ha2VSZWFkb25seU1hcnNoYWxsZXIodGhpcy5zdGF0ZSk7XG4gICAgICAgICAgcmV0dXJuIHJlYWRvbmx5LmZyb21DYXBEYXRhKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBzZXJpYWxpemUoZGF0YSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5yZWFkb25seU1hcnNoYWxsZXIudG9DYXBEYXRhKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICB1bnNlcmlhbGl6ZShkYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLnJlYWRvbmx5TWFyc2hhbGxlci5mcm9tQ2FwRGF0YShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwdWJsaXNoaW5nTWFyc2hhbGxlcjoge1xuICAgICAgICB0b0NhcERhdGEodmFsKSB7XG4gICAgICAgICAgY29uc3QgcHVibGlzaGluZyA9IG1ha2VQdWJsaXNoaW5nTWFyc2hhbGxlcih0aGlzLnN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gcHVibGlzaGluZy50b0NhcERhdGEodmFsKTtcbiAgICAgICAgfSxcbiAgICAgICAgZnJvbUNhcERhdGEoZGF0YSkge1xuICAgICAgICAgIGNvbnN0IHB1Ymxpc2hpbmcgPSBtYWtlUHVibGlzaGluZ01hcnNoYWxsZXIodGhpcy5zdGF0ZSk7XG4gICAgICAgICAgcmV0dXJuIHB1Ymxpc2hpbmcuZnJvbUNhcERhdGEoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNlcmlhbGl6ZShkYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLnB1Ymxpc2hpbmdNYXJzaGFsbGVyLnRvQ2FwRGF0YShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgdW5zZXJpYWxpemUoZGF0YSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5wdWJsaXNoaW5nTWFyc2hhbGxlci5mcm9tQ2FwRGF0YShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucHJlcGFyZUJvYXJkS2l0KHByZXBhcmVCb2FyZEtpdCk7XG4gICAgICAgY29uc3QgcHJlcGFyZVJlY29yZGVyRmFjdG9yeSA9IHpvbmUgPT4ge1xuICBjb25zdCBiYWdnYWdlID0gem9uZS5tYXBTdG9yZShgUmVjb3JkZXIgQmFnZ2FnZWApO1xuICBjb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgPSBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnRHVyYWJsZVB1Ymxpc2hLaXQnLFxuICApO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZVJlY29yZGVyS2l0ID0gKGxhYmVsLCBtYXJzaGFsbGVyKSA9PiB7XG4gICAgY29uc3QgbXlab25lID0gem9uZS5zdWJab25lKGxhYmVsKTtcbiAgICBjb25zdCBtYWtlUmVjb3JkZXIgPSBwcmVwYXJlUmVjb3JkZXIoXG4gICAgICBteVpvbmUubWFwU3RvcmUoYFJlY29yZGVyIEJhZ2dhZ2U6ICR7bGFiZWx9YCksXG4gICAgICBtYXJzaGFsbGVyLFxuICAgICk7XG4gICAgcmV0dXJuIGRlZmluZVJlY29yZGVyS2l0KHsgbWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHByZXBhcmVSZWNvcmRlcktpdDtcbn07JGjNj19vbmNlLnByZXBhcmVSZWNvcmRlckZhY3RvcnkocHJlcGFyZVJlY29yZGVyRmFjdG9yeSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJERUZBVUxUX0NSQ19ESUdJVFMiOlsiREVGQVVMVF9DUkNfRElHSVRTIl0sIkRFRkFVTFRfUFJFRklYIjpbIkRFRkFVTFRfUFJFRklYIl0sInByZXBhcmVCb2FyZEtpdCI6WyJwcmVwYXJlQm9hcmRLaXQiXSwicHJlcGFyZVJlY29yZGVyRmFjdG9yeSI6WyJwcmVwYXJlUmVjb3JkZXJGYWN0b3J5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAK55F1L9DwAA/Q8AAC0AAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2FjdGlvbnMuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIm1ha2VQYXltZW50QWN0aW9ucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VQcm9taXNlS2l0LEZhcixFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuICAgICAgIGNvbnN0IG1ha2VQYXltZW50QWN0aW9ucyA9ICh7XG4gIGdldEJyYW5kUmVjb3JkLFxuICBnZXRQdXJzZUJ5UGV0bmFtZSxcbiAgZ2V0UmVjb3JkLFxuICB1cGRhdGVSZWNvcmQsXG4gIGdldEF1dG9EZXBvc2l0UHVyc2UsXG4gIGdldElzc3VlckJvYXJkSWQsXG59KSA9PiB7XG4gIGNvbnN0IGRlcG9zaXRlZFBLID0gbWFrZVByb21pc2VLaXQoKTtcblxuICByZXR1cm4gRmFyKCdwYXltZW50IGFjdGlvbnMnLCB7XG4gICAgZGVwb3NpdDogYXN5bmMgKHB1cnNlT3JQZXRuYW1lID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBjb25zdCBvbGRQYXltZW50UmVjb3JkID0gZ2V0UmVjb3JkKCk7XG4gICAgICBjb25zdCB7IGJyYW5kLCBwYXltZW50IH0gPSBvbGRQYXltZW50UmVjb3JkO1xuICAgICAgYXNzZXJ0KHBheW1lbnQpO1xuXG4gICAgICAvKiAgICAgICAgICAgICAgICAqL1xuICAgICAgbGV0IHB1cnNlO1xuICAgICAgaWYgKHB1cnNlT3JQZXRuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgYXV0b0RlcG9zaXRQdXJzZSA9IGdldEF1dG9EZXBvc2l0UHVyc2UoYnJhbmQpO1xuICAgICAgICBpZiAoIWF1dG9EZXBvc2l0UHVyc2UpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBkZXBvc2l0ZWRQSy5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHB1cnNlID0gZ2V0QXV0b0RlcG9zaXRQdXJzZShicmFuZCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBBcnJheS5pc0FycmF5KHB1cnNlT3JQZXRuYW1lKSB8fFxuICAgICAgICB0eXBlb2YgcHVyc2VPclBldG5hbWUgPT09ICdzdHJpbmcnXG4gICAgICApIHtcbiAgICAgICAgcHVyc2UgPSBnZXRQdXJzZUJ5UGV0bmFtZShwdXJzZU9yUGV0bmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXJzZSA9IHB1cnNlT3JQZXRuYW1lO1xuICAgICAgfVxuICAgICAgY29uc3QgYnJhbmRSZWNvcmQgPSBnZXRCcmFuZFJlY29yZChicmFuZCk7XG4gICAgICB1cGRhdGVSZWNvcmQoeyAuLi5vbGRQYXltZW50UmVjb3JkLCBzdGF0dXM6ICdwZW5kaW5nJyB9LCBicmFuZFJlY29yZCk7XG4gICAgICAvL1xuICAgICAgRShwdXJzZSlcbiAgICAgICAgLmRlcG9zaXQocGF5bWVudClcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgZGVwb3NpdGVkQW1vdW50ID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZVJlY29yZChcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLmdldFJlY29yZCgpLFxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgcGF5bWVudDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2RlcG9zaXRlZCcsXG4gICAgICAgICAgICAgICAgZGVwb3NpdGVkQW1vdW50LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBicmFuZFJlY29yZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZXBvc2l0ZWRQSy5yZXNvbHZlKGRlcG9zaXRlZEFtb3VudCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdFcnJvciBkZXBvc2l0aW5nIHBheW1lbnQgaW4nLFxuICAgICAgICAgICAgICBwdXJzZU9yUGV0bmFtZSB8fCAnZGVmYXVsdCBwdXJzZScsXG4gICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHB1cnNlT3JQZXRuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgdXBkYXRlUmVjb3JkKHtcbiAgICAgICAgICAgICAgICAuLi5nZXRSZWNvcmQoKSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGRlcG9zaXRlZFBLLnJlamVjdChlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGRlcG9zaXRlZFBLLnJlc29sdmUoZ2V0UmVjb3JkKCkuYWN0aW9ucy5kZXBvc2l0KHVuZGVmaW5lZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gZGVwb3NpdGVkUEsucHJvbWlzZTtcbiAgICB9LFxuICAgIHJlZnJlc2g6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9sZFBheW1lbnRSZWNvcmQgPSBnZXRSZWNvcmQoKTtcbiAgICAgIGNvbnN0IHsgYnJhbmQsIGlzc3VlciwgcGF5bWVudCB9ID0gb2xkUGF5bWVudFJlY29yZDtcbiAgICAgIGNvbnN0IGJyYW5kUmVjb3JkID0gZ2V0QnJhbmRSZWNvcmQoYnJhbmQpO1xuICAgICAgaWYgKCFicmFuZFJlY29yZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNzdWVyKSB7XG4gICAgICAgIHVwZGF0ZVJlY29yZChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5vbGRQYXltZW50UmVjb3JkLFxuICAgICAgICAgICAgaXNzdWVyQm9hcmRJZDogZ2V0SXNzdWVyQm9hcmRJZChicmFuZFJlY29yZC5pc3N1ZXIpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYnJhbmRSZWNvcmQsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXBheW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0xpdmUgPSBhd2FpdCBFKGlzc3VlcikuaXNMaXZlKHBheW1lbnQpO1xuICAgICAgaWYgKGlzTGl2ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVJlY29yZCh7XG4gICAgICAgIC4uLm9sZFBheW1lbnRSZWNvcmQsXG4gICAgICAgIC8vXG4gICAgICAgIHBheW1lbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiAnZXhwaXJlZCcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgZ2V0QW1vdW50T2Y6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9sZFBheW1lbnRSZWNvcmQgPSBnZXRSZWNvcmQoKTtcbiAgICAgIGNvbnN0IHsgaXNzdWVyLCBwYXltZW50IH0gPSBvbGRQYXltZW50UmVjb3JkO1xuICAgICAgYXNzZXJ0KGlzc3Vlcik7XG4gICAgICBhc3NlcnQocGF5bWVudCk7XG5cbiAgICAgIC8vXG4gICAgICBjb25zdCBsYXN0QW1vdW50ID0gYXdhaXQgRShpc3N1ZXIpLmdldEFtb3VudE9mKHBheW1lbnQpO1xuXG4gICAgICB1cGRhdGVSZWNvcmQoe1xuICAgICAgICAuLi5vbGRQYXltZW50UmVjb3JkLFxuICAgICAgICBsYXN0QW1vdW50LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VQYXltZW50QWN0aW9ucyhtYWtlUGF5bWVudEFjdGlvbnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBheW1lbnRBY3Rpb25zIjpbIm1ha2VQYXltZW50QWN0aW9ucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC/H/vS+AIAAPgCAAA1AAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9iaWdpbnRTdHJpbmdpZnkuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImJpZ2ludFN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLy9cbi8vXG4vL1xuICAgICAgIGNvbnN0IGJpZ2ludFN0cmluZ2lmeSA9IHggPT5cbiAgSlNPTi5zdHJpbmdpZnkoeCwgKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2JpZ2ludCcpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA8PSBCaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgfSk7JGjNj19vbmNlLmJpZ2ludFN0cmluZ2lmeShiaWdpbnRTdHJpbmdpZnkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmlnaW50U3RyaW5naWZ5IjpbImJpZ2ludFN0cmluZ2lmeSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACMcOqV/gkAAP4JAAAuAAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9kYXRlLW5vdy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9ub3RpZmllciIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiREVGQVVMVF9USU1FUl9ERVZJQ0VfU0NBTEUiLCJERUZBVUxUX1RJTUVSX1NFUlZJQ0VfUE9MTF9JTlRFUlZBTCIsIm1ha2VUaW1lckRldmljZURhdGVOb3ciLCJtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsb2JzZXJ2ZU5vdGlmaWVyLG1ha2VQcm9taXNlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIixbJGjNj19hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4gICAgICAgY29uc3QgREVGQVVMVF9USU1FUl9TRVJWSUNFX1BPTExfSU5URVJWQUwgPSA2MF8wMDBuOyRozY9fb25jZS5ERUZBVUxUX1RJTUVSX1NFUlZJQ0VfUE9MTF9JTlRFUlZBTChERUZBVUxUX1RJTUVSX1NFUlZJQ0VfUE9MTF9JTlRFUlZBTCk7XG4gICAgICAgY29uc3QgREVGQVVMVF9USU1FUl9ERVZJQ0VfU0NBTEUgPSAxO1xuXG4vL1xuLy9cbiRozY9fb25jZS5ERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRShERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRSk7Y29uc3QgbWFrZVRpbWVyRGV2aWNlRGF0ZU5vdz1cbiAgKEQsIHRpbWVyRGV2aWNlLCB0aW1lckRldmljZVNjYWxlID0gREVGQVVMVF9USU1FUl9ERVZJQ0VfU0NBTEUpID0+XG4gICgpID0+IHtcbiAgICBjb25zdCBzdGFtcCA9IEQodGltZXJEZXZpY2UpLmdldExhc3RQb2xsZWQoKTtcbiAgICBjb25zdCBsYXN0UG9sbGVkU3RhbXAgPSBwYXJzZUludChgJHtzdGFtcH1gLCAxMCkgKiB0aW1lckRldmljZVNjYWxlO1xuICAgIHJldHVybiBsYXN0UG9sbGVkU3RhbXA7XG4gIH07XG5cbi8vXG4vL1xuJGjNj19vbmNlLm1ha2VUaW1lckRldmljZURhdGVOb3cobWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyk7Y29uc3QgbWFrZVRpbWVyU2VydmljZURhdGVOb3c9KFxuICB0aW1lclNlcnZpY2UsXG4gIHRpbWVyUG9sbEludGVydmFsID0gREVGQVVMVF9USU1FUl9TRVJWSUNFX1BPTExfSU5URVJWQUwsXG4pID0+IHtcbiAgbGV0IGxhc3RQb2xsZWRTdGFtcCA9IE5hTjtcbiAgY29uc3QgZGF0ZU5vdyA9ICgpID0+IGxhc3RQb2xsZWRTdGFtcDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBkYXRlTm93UEsgPSBtYWtlUHJvbWlzZUtpdCgpO1xuXG4gIC8vXG4gIGNvbnN0IG9ic2VydmVUaW1lciA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvYnNlcnZlciA9IHtcbiAgICAgIHVwZGF0ZVN0YXRlKHN0YW1wKSB7XG4gICAgICAgIGxhc3RQb2xsZWRTdGFtcCA9IHBhcnNlSW50KGAke3N0YW1wfWAsIDEwKTtcbiAgICAgICAgZGF0ZU5vd1BLLnJlc29sdmUoZGF0ZU5vdyk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvL1xuICAgIGNvbnN0IHN0YW1wID0gYXdhaXQgRSh0aW1lclNlcnZpY2UpLmdldEN1cnJlbnRUaW1lc3RhbXAoKTtcbiAgICBvYnNlcnZlci51cGRhdGVTdGF0ZShzdGFtcCk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgdGltZXJOb3RpZmllciA9IEUodGltZXJTZXJ2aWNlKS5tYWtlTm90aWZpZXIoMG4sIHRpbWVyUG9sbEludGVydmFsKTtcblxuICAgIC8vXG4gICAgYXdhaXQgb2JzZXJ2ZU5vdGlmaWVyKHRpbWVyTm90aWZpZXIsIG9ic2VydmVyKTtcbiAgfTtcblxuICBvYnNlcnZlVGltZXIoKS5jYXRjaChlID0+IGRhdGVOb3dQSy5yZWplY3QoZSkpO1xuXG4gIC8vXG4gIHJldHVybiBkYXRlTm93UEsucHJvbWlzZTtcbn07JGjNj19vbmNlLm1ha2VUaW1lclNlcnZpY2VEYXRlTm93KG1ha2VUaW1lclNlcnZpY2VEYXRlTm93KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkRFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMIjpbIkRFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMIl0sIkRFRkFVTFRfVElNRVJfREVWSUNFX1NDQUxFIjpbIkRFRkFVTFRfVElNRVJfREVWSUNFX1NDQUxFIl0sIm1ha2VUaW1lckRldmljZURhdGVOb3ciOlsibWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyJdLCJtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyI6WyJtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdvEu1wBQAAMAUAAA6AAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9maW5kT3JNYWtlSW52aXRhdGlvbi5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvZXJ0cCJdLCJleHBvcnRzIjpbImZpbmRPck1ha2VJbnZpdGF0aW9uIiwibWFrZUlkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0LEZhaWwscSxFLHBhc3NTdHlsZU9mLEFtb3VudE1hdGg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4gICAgICAgY29uc3QgbWFrZUlkID0gKGRhcHBPcmlnaW4sIHJhd0lkKSA9PiBgJHtkYXBwT3JpZ2lufSMke3Jhd0lkfWA7JGjNj19vbmNlLm1ha2VJZChtYWtlSWQpO1xuXG5jb25zdCBhc3NlcnRGaXJzdENhcEFTQ0lJID0gc3RyID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihzdHIsICdzdHJpbmcnKTtcbiAgY29uc3QgZmlyc3RDYXBBU0NJSSA9IC9eW0EtWl1bYS16QS1aMC05XyRdKiQvO1xuICBmaXJzdENhcEFTQ0lJLnRlc3Qoc3RyKSB8fFxuICAgIEZhaWxgVGhlIHN0cmluZyAke3EoXG4gICAgICBzdHIsXG4gICAgKX0gbXVzdCBiZSBhbiBhc2NpaSBpZGVudGlmaWVyIHN0YXJ0aW5nIHdpdGggdXBwZXIgY2FzZS5gO1xuICAoc3RyICE9PSAnTmFOJyAmJiBzdHIgIT09ICdJbmZpbml0eScpIHx8XG4gICAgRmFpbGBrZXl3b3JkICR7cShzdHIpfSBtdXN0IG5vdCBiZSBhIG51bWJlcidzIG5hbWVgO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZmluZEJ5Qm9hcmRJZCA9IGFzeW5jIChpbnZpdGF0aW9uUHVyc2VCYWxhbmNlLCB7IGJvYXJkLCBib2FyZElkIH0pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihib2FyZElkLCAnc3RyaW5nJyk7XG4gIGNvbnN0IGludml0YXRpb25IYW5kbGUgPSBhd2FpdCBFKGJvYXJkKS5nZXRWYWx1ZShib2FyZElkKTtcbiAgY29uc3QgbWF0Y2ggPSBlbGVtZW50ID0+IGVsZW1lbnQuaGFuZGxlID09PSBpbnZpdGF0aW9uSGFuZGxlO1xuICBjb25zdCBtYXRjaGluZ1ZhbHVlID0gaW52aXRhdGlvblB1cnNlQmFsYW5jZS52YWx1ZS5maW5kKG1hdGNoKTtcbiAgbWF0Y2hpbmdWYWx1ZSB8fCBGYWlsYENhbm5vdCBmaW5kIGludml0YXRpb24gY29ycmVzcG9uZGluZyB0byAke3EoYm9hcmRJZCl9YDtcblxuICByZXR1cm4gaGFyZGVuKFttYXRjaGluZ1ZhbHVlXSk7XG59O1xuXG4vL1xuLy9cbi8qXG5cblxuICovXG5jb25zdCBmaW5kQnlLZXlWYWx1ZVBhaXJzID0gYXN5bmMgKGludml0YXRpb25QdXJzZUJhbGFuY2UsIGt2cykgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBtYXRjaGVzID0gaW52aXRhdGlvbkRldGFpbCA9PlxuICAgIE9iamVjdC5lbnRyaWVzKGt2cykuZXZlcnkoXG4gICAgICAoW2tleSwgdmFsdWVdKSA9PiBpbnZpdGF0aW9uRGV0YWlsW2tleV0gPT09IHZhbHVlLFxuICAgICk7XG5cbiAgY29uc3QgbWF0Y2hpbmdWYWx1ZSA9IGludml0YXRpb25QdXJzZUJhbGFuY2UudmFsdWUuZmluZChtYXRjaGVzKTtcbiAgbWF0Y2hpbmdWYWx1ZSB8fCBGYWlsYENhbm5vdCBmaW5kIGludml0YXRpb24gY29ycmVzcG9uZGluZyB0byAke3Eoa3ZzKX1gO1xuICByZXR1cm4gaGFyZGVuKFttYXRjaGluZ1ZhbHVlXSk7XG59O1xuXG5jb25zdCBtYWtlRmluZEludml0YXRpb24gPSAoaW52aXRhdGlvblB1cnNlLCBpbnZpdGF0aW9uQnJhbmQpID0+IHtcbiAgY29uc3QgZmluZEludml0YXRpb24gPSBhc3luYyAocXVlcnlGbiwgcXVlcnlQYXJhbXMpID0+IHtcbiAgICBjb25zdCBwdXJzZUJhbGFuY2UgPSBhd2FpdCBFKGludml0YXRpb25QdXJzZSkuZ2V0Q3VycmVudEFtb3VudCgpO1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcXVlcnlGbihwdXJzZUJhbGFuY2UsIHF1ZXJ5UGFyYW1zKTtcbiAgICBjb25zdCBpbnZpdGF0aW9uQW1vdW50ID0gQW1vdW50TWF0aC5tYWtlKGludml0YXRpb25CcmFuZCwgdmFsdWUpO1xuICAgIGNvbnN0IGludml0YXRpb25QID0gRShpbnZpdGF0aW9uUHVyc2UpLndpdGhkcmF3KGludml0YXRpb25BbW91bnQpO1xuICAgIHJldHVybiBpbnZpdGF0aW9uUDtcbiAgfTtcbiAgcmV0dXJuIGZpbmRJbnZpdGF0aW9uO1xufTtcblxuY29uc3QgbWFrZUNvbnRpbnVpbmdJbnZpdGF0aW9uID0gYXN5bmMgKFxuICBpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LFxuICBkYXBwT3JpZ2luLFxuICB7IHByaW9yT2ZmZXJJZDogcmF3UHJpb3JPZmZlcklkLCBkZXNjcmlwdGlvbiB9LFxuKSA9PiB7XG4gIGFzc2VydEZpcnN0Q2FwQVNDSUkoZGVzY3JpcHRpb24pO1xuXG4gIGNvbnN0IHByaW9yT2ZmZXJJZCA9IG1ha2VJZChkYXBwT3JpZ2luLCByYXdQcmlvck9mZmVySWQpO1xuICBjb25zdCBvZmZlclJlc3VsdCA9IGF3YWl0IGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuZ2V0KHByaW9yT2ZmZXJJZCkucHJvbWlzZTtcbiAgYXNzZXJ0KFxuICAgIHBhc3NTdHlsZU9mKG9mZmVyUmVzdWx0KSA9PT0gJ2NvcHlSZWNvcmQnLFxuICAgIGBvZmZlclJlc3VsdCBtdXN0IGJlIGEgcmVjb3JkIHRvIGhhdmUgYW4gaW52aXRhdGlvbk1ha2VycyBwcm9wZXJ0eWAsXG4gICk7XG4gIGFzc2VydChcbiAgICBvZmZlclJlc3VsdC5pbnZpdGF0aW9uTWFrZXJzLFxuICAgIGBvZmZlclJlc3VsdCBkb2VzIG5vdCBoYXZlIGFuIGludml0YXRpb25NYWtlcnMgcHJvcGVydHlgLFxuICApO1xuXG4gIGNvbnN0IGludml0YXRpb25QID0gRShvZmZlclJlc3VsdC5pbnZpdGF0aW9uTWFrZXJzKVtkZXNjcmlwdGlvbl0oKTtcbiAgcmV0dXJuIGludml0YXRpb25QO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUludml0YXRpb24gPSBhc3luYyAoXG4gIGludml0YXRpb25NYWtlcixcbiAgaW5zdGFuY2VIYW5kbGVCb2FyZElkLFxuICBib2FyZCxcbiAgem9lLFxuKSA9PiB7XG4gIGNvbnN0IGluc3RhbmNlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIEUoYm9hcmQpLmdldFZhbHVlKGluc3RhbmNlSGFuZGxlQm9hcmRJZClcbiAgKTtcbiAgY29uc3QgcHVibGljRmFjZXQgPSBFKHpvZSkuZ2V0UHVibGljRmFjZXQoaW5zdGFuY2UpO1xuICBjb25zdCB7IG1ldGhvZCwgYXJncyA9IFtdIH0gPSBpbnZpdGF0aW9uTWFrZXI7XG5cbiAgcmV0dXJuIEUocHVibGljRmFjZXQpW21ldGhvZF0oLi4uYXJncyk7XG59O1xuXG4gICAgICAgY29uc3QgZmluZE9yTWFrZUludml0YXRpb24gPSBhc3luYyAoXG4gIGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQsXG4gIGJvYXJkLFxuICB6b2UsXG4gIGludml0YXRpb25QdXJzZSxcbiAgaW52aXRhdGlvbkJyYW5kLFxuICBvZmZlcixcbikgPT4ge1xuICBpZiAob2ZmZXIuaW52aXRhdGlvbikge1xuICAgIC8vXG4gICAgcmV0dXJuIG9mZmVyLmludml0YXRpb247XG4gIH1cblxuICBjb25zdCBmaW5kSW52aXRhdGlvbiA9IG1ha2VGaW5kSW52aXRhdGlvbihpbnZpdGF0aW9uUHVyc2UsIGludml0YXRpb25CcmFuZCk7XG5cbiAgLy9cbiAgaWYgKG9mZmVyLmludml0ZUhhbmRsZUJvYXJkSWQpIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgIGJvYXJkLFxuICAgICAgYm9hcmRJZDogb2ZmZXIuaW52aXRlSGFuZGxlQm9hcmRJZCxcbiAgICB9O1xuICAgIHJldHVybiBmaW5kSW52aXRhdGlvbihmaW5kQnlCb2FyZElkLCBxdWVyeVBhcmFtcyk7XG4gIH1cblxuICAvL1xuICBpZiAob2ZmZXIuaW52aXRhdGlvbkhhbmRsZUJvYXJkSWQpIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgIGJvYXJkLFxuICAgICAgYm9hcmRJZDogb2ZmZXIuaW52aXRhdGlvbkhhbmRsZUJvYXJkSWQsXG4gICAgfTtcbiAgICByZXR1cm4gZmluZEludml0YXRpb24oZmluZEJ5Qm9hcmRJZCwgcXVlcnlQYXJhbXMpO1xuICB9XG5cbiAgaWYgKG9mZmVyLmludml0YXRpb25NYWtlcikge1xuICAgIHJldHVybiBtYWtlSW52aXRhdGlvbihcbiAgICAgIG9mZmVyLmludml0YXRpb25NYWtlcixcbiAgICAgIG9mZmVyLmluc3RhbmNlSGFuZGxlQm9hcmRJZCxcbiAgICAgIGJvYXJkLFxuICAgICAgem9lLFxuICAgICk7XG4gIH1cblxuICBpZiAob2ZmZXIuaW52aXRhdGlvblF1ZXJ5KSB7XG4gICAgcmV0dXJuIGZpbmRJbnZpdGF0aW9uKGZpbmRCeUtleVZhbHVlUGFpcnMsIG9mZmVyLmludml0YXRpb25RdWVyeSk7XG4gIH1cblxuICBpZiAob2ZmZXIuY29udGludWluZ0ludml0YXRpb24pIHtcbiAgICBjb25zdCBkYXBwT3JpZ2luID1cbiAgICAgIG9mZmVyLnJlcXVlc3RDb250ZXh0ICYmIG9mZmVyLnJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW5cbiAgICAgICAgPyBvZmZlci5yZXF1ZXN0Q29udGV4dC5kYXBwT3JpZ2luXG4gICAgICAgIDogYHVua25vd25gO1xuICAgIHJldHVybiBtYWtlQ29udGludWluZ0ludml0YXRpb24oXG4gICAgICBpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LFxuICAgICAgZGFwcE9yaWdpbixcbiAgICAgIG9mZmVyLmNvbnRpbnVpbmdJbnZpdGF0aW9uLFxuICAgICk7XG4gIH1cblxuICB0aHJvdyBGYWlsYG5vIGludml0YXRpb24gd2FzIGZvdW5kIG9yIG1hZGUgZm9yIHRoaXMgb2ZmZXIgJHtvZmZlci5pZH1gO1xufTskaM2PX29uY2UuZmluZE9yTWFrZUludml0YXRpb24oZmluZE9yTWFrZUludml0YXRpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUlkIjpbIm1ha2VJZCJdLCJmaW5kT3JNYWtlSW52aXRhdGlvbiI6WyJmaW5kT3JNYWtlSW52aXRhdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABl8RcPWQIAAFkCAAA0AAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9pbnRlcm5hbC10eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM6QEOHqCQAA6gkAADEAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2lzc3VlclRhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL3N0b3JlIiwiLi9pbnRlcm5hbC10eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VJc3N1ZXJUYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydCxFLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlzc3VlclRhYmxlID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYnJhbmRUb0lzc3VlclJlY29yZCA9IG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUoJ2JyYW5kJyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaXNzdWVyVG9Jc3N1ZXJSZWNvcmQgPSBtYWtlU2NhbGFyV2Vha01hcFN0b3JlKCdpc3N1ZXInKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpc3N1ZXJUYWJsZSA9IHtcbiAgICBoYXNCeUJyYW5kOiBicmFuZFRvSXNzdWVyUmVjb3JkLmhhcyxcbiAgICBnZXRCeUJyYW5kOiBicmFuZFRvSXNzdWVyUmVjb3JkLmdldCxcbiAgICBoYXNCeUlzc3VlcjogaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuaGFzLFxuICAgIGdldEJ5SXNzdWVyOiBpc3N1ZXJUb0lzc3VlclJlY29yZC5nZXQsXG4gICAgLy9cbiAgICAvL1xuICAgIGluaXRJc3N1ZXI6IGFzeW5jIChpc3N1ZXJQLCBhZGRNZXRhID0geCA9PiB4KSA9PiB7XG4gICAgICBjb25zdCBicmFuZFAgPSBFKGlzc3VlclApLmdldEJyYW5kKCk7XG4gICAgICBjb25zdCBicmFuZElzc3Vlck1hdGNoUCA9IEUoYnJhbmRQKS5pc015SXNzdWVyKGlzc3VlclApO1xuICAgICAgY29uc3QgZGlzcGxheUluZm9QID0gRShicmFuZFApLmdldERpc3BsYXlJbmZvKCk7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCBbaXNzdWVyLCBicmFuZCwgYnJhbmRJc3N1ZXJNYXRjaCwgZGlzcGxheUluZm9dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBpc3N1ZXJQLFxuICAgICAgICBicmFuZFAsXG4gICAgICAgIGJyYW5kSXNzdWVyTWF0Y2hQLFxuICAgICAgICBkaXNwbGF5SW5mb1AsXG4gICAgICBdKTtcbiAgICAgIC8vXG5cbiAgICAgIGlmIChpc3N1ZXJUb0lzc3VlclJlY29yZC5oYXMoaXNzdWVyKSkge1xuICAgICAgICByZXR1cm4gaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuZ2V0KGlzc3Vlcik7XG4gICAgICB9XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGJyYW5kSXNzdWVyTWF0Y2gsXG4gICAgICAgIGBpc3N1ZXIgd2FzIHVzaW5nIGEgYnJhbmQgd2hpY2ggd2FzIG5vdCBpdHMgb3duYCxcbiAgICAgICk7XG4gICAgICBpc3N1ZXJUYWJsZS5pbml0SXNzdWVyQnlSZWNvcmQoXG4gICAgICAgIGFkZE1ldGEoe1xuICAgICAgICAgIGJyYW5kLFxuICAgICAgICAgIGlzc3VlcixcbiAgICAgICAgICBhc3NldEtpbmQ6IGRpc3BsYXlJbmZvLmFzc2V0S2luZCxcbiAgICAgICAgICBkaXNwbGF5SW5mbyxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgcmV0dXJuIGlzc3VlclRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xuICAgIH0sXG4gICAgaW5pdElzc3VlckJ5UmVjb3JkOiBpc3N1ZXJSZWNvcmQgPT4ge1xuICAgICAgY29uc3QgeyBicmFuZCwgaXNzdWVyIH0gPSBpc3N1ZXJSZWNvcmQ7XG4gICAgICBicmFuZFRvSXNzdWVyUmVjb3JkLmluaXQoYnJhbmQsIGlzc3VlclJlY29yZCk7XG4gICAgICBpc3N1ZXJUb0lzc3VlclJlY29yZC5pbml0KGlzc3VlciwgaXNzdWVyUmVjb3JkKTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBpc3N1ZXJUYWJsZTtcbn07JGjNj19vbmNlLm1ha2VJc3N1ZXJUYWJsZShtYWtlSXNzdWVyVGFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUlzc3VlclRhYmxlIjpbIm1ha2VJc3N1ZXJUYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAn3s6pGCUAABglAAAzAAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9saWItZGVoeWRyYXRlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiaXNQYXRoIiwibWFrZURlaHlkcmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRmFpbCxxLG1ha2VNYXJzaGFsLG1hcEl0ZXJhYmxlLG1ha2VMZWdhY3lNYXAsbWFrZVNjYWxhck1hcFN0b3JlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsWyRozY9fYSA9PiAobWFwSXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlTGVnYWN5TWFwXCIsWyRozY9fYSA9PiAobWFrZUxlZ2FjeU1hcCA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGF0aCA9IHggPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgeC5sZW5ndGggPiAwIHx8IEZhaWxgUGF0aCAke3EoeCl9IG11c3Qgbm90IGJlIGVtcHR5YDtcbiAgZm9yIChjb25zdCBuYW1lIG9mIHgpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuaXNQYXRoKGlzUGF0aCk7XG5cbmNvbnN0IElNUExPREVfUFJFRklYID0gJ0lFOic7XG5cbi8vXG4vL1xuLy9cbiAgICAgICBjb25zdCBtYWtlRGVoeWRyYXRvciA9IChpbml0aWFsVW5uYW1lZENvdW50ID0gMCkgPT4ge1xuICBsZXQgdW5uYW1lZENvdW50ID0gaW5pdGlhbFVubmFtZWRDb3VudDtcblxuICAvL1xuICBjb25zdCBwZXRuYW1lS2luZFRvTWFwcGluZyA9IG1ha2VMZWdhY3lNYXAoJ3BldG5hbWVLaW5kJyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc2VhcmNoT3JkZXIgPSBbXTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdmFsVG9QYXRocyA9IG1ha2VTY2FsYXJNYXBTdG9yZSgndmFsdWUnKTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IGV4cGxvZGUgPSBkYXRhID0+IHtcbiAgICBkYXRhLnN0YXJ0c1dpdGgoSU1QTE9ERV9QUkVGSVgpIHx8XG4gICAgICBGYWlsYGV4cGxvZGVkIHN0cmluZyAke2RhdGF9IG11c3Qgc3RhcnQgd2l0aCAke3EoSU1QTE9ERV9QUkVGSVgpfWA7XG4gICAgY29uc3Qgc3Ryb25nbmFtZSA9IEpTT04ucGFyc2UoZGF0YS5zbGljZShJTVBMT0RFX1BSRUZJWC5sZW5ndGgpKTtcbiAgICBpZiAoIWlzUGF0aChzdHJvbmduYW1lKSkge1xuICAgICAgcmV0dXJuIHN0cm9uZ25hbWU7XG4gICAgfVxuICAgIGNvbnN0IHsgdmFsVG9QZXRuYW1lOiByb290VG9QZXRuYW1lIH0gPSBlZGdlTWFwcGluZztcbiAgICBjb25zdCBwZXRuYW1lID0gcm9vdFRvUGV0bmFtZS5nZXQoc3Ryb25nbmFtZVswXSk7XG4gICAgYXNzZXJ0KCFpc1BhdGgocGV0bmFtZSkpO1xuICAgIHN0cm9uZ25hbWVbMF0gPSBwZXRuYW1lO1xuICAgIHJldHVybiBoYXJkZW4oc3Ryb25nbmFtZSk7XG4gIH07XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBpbXBsb2RlID0gc3Ryb25nbmFtZSA9PiB7XG4gICAgaWYgKCFpc1BhdGgoc3Ryb25nbmFtZSkpIHtcbiAgICAgIHJldHVybiBgJHtJTVBMT0RFX1BSRUZJWH0ke0pTT04uc3RyaW5naWZ5KHN0cm9uZ25hbWUpfWA7XG4gICAgfVxuXG4gICAgLy9cbiAgICBjb25zdCBwYXRoID0gWy4uLnN0cm9uZ25hbWVdO1xuICAgIGNvbnN0IHsgcGV0bmFtZVRvVmFsOiBwZXRuYW1lVG9Sb290IH0gPSBlZGdlTWFwcGluZztcbiAgICBpZiAoIXBldG5hbWVUb1Jvb3QuaGFzKHBhdGhbMF0pKSB7XG4gICAgICAvL1xuICAgICAgRmFpbGBFZGdlbmFtZSBmb3IgJHtxKHBhdGhbMF0pfSBwZXRuYW1lIG5vdCBmb3VuZGA7XG4gICAgfVxuICAgIGNvbnN0IHJvb3QgPSBwZXRuYW1lVG9Sb290LmdldChwYXRoWzBdKTtcbiAgICBwYXRoWzBdID0gcm9vdDtcblxuICAgIHJldHVybiBgJHtJTVBMT0RFX1BSRUZJWH0ke0pTT04uc3RyaW5naWZ5KHBhdGgpfWA7XG4gIH07XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VNYXBwaW5nID0gKGtpbmQsIHsgdXNlTGVnYWN5TWFwID0gZmFsc2UgfSA9IHt9KSA9PiB7XG4gICAgdHlwZW9mIGtpbmQgPT09ICdzdHJpbmcnIHx8IGBraW5kICR7a2luZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgY29uc3QgbWFrZU1hcCA9IHVzZUxlZ2FjeU1hcCA/IG1ha2VMZWdhY3lNYXAgOiBtYWtlU2NhbGFyTWFwU3RvcmU7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHJhd1ZhbFRvUGV0bmFtZSA9IG1ha2VNYXAoJ3ZhbHVlJyk7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCB2YWxUb1BldG5hbWUgPSB7XG4gICAgICAuLi5yYXdWYWxUb1BldG5hbWUsXG4gICAgICBzZXQoa2V5LCB2YWwpIHtcbiAgICAgICAgcmF3VmFsVG9QZXRuYW1lLnNldChrZXksIGltcGxvZGUodmFsKSk7XG4gICAgICB9LFxuICAgICAgaW5pdChrZXksIHZhbCkge1xuICAgICAgICByYXdWYWxUb1BldG5hbWUuaW5pdChrZXksIGltcGxvZGUodmFsKSk7XG4gICAgICB9LFxuICAgICAgZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gZXhwbG9kZShyYXdWYWxUb1BldG5hbWUuZ2V0KGtleSkpO1xuICAgICAgfSxcbiAgICAgIGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiBtYXBJdGVyYWJsZShyYXdWYWxUb1BldG5hbWUuZW50cmllcygpLCAoW2tleSwgdmFsXSkgPT4gW1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBleHBsb2RlKHZhbCksXG4gICAgICAgIF0pO1xuICAgICAgfSxcbiAgICAgIHZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIG1hcEl0ZXJhYmxlKHJhd1ZhbFRvUGV0bmFtZS52YWx1ZXMoKSwgdmFsID0+IGV4cGxvZGUodmFsKSk7XG4gICAgICB9LFxuICAgIH07XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmF3UGV0bmFtZVRvVmFsID0gbWFrZVNjYWxhck1hcFN0b3JlKCdwZXRuYW1lJyk7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHBldG5hbWVUb1ZhbCA9IHtcbiAgICAgIC4uLnJhd1BldG5hbWVUb1ZhbCxcbiAgICAgIGluaXQoa2V5LCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIHJhd1BldG5hbWVUb1ZhbC5pbml0KGltcGxvZGUoa2V5KSwgdmFsKTtcbiAgICAgIH0sXG4gICAgICBzZXQoa2V5LCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIHJhd1BldG5hbWVUb1ZhbC5zZXQoaW1wbG9kZShrZXkpLCB2YWwpO1xuICAgICAgfSxcbiAgICAgIGhhcyhrZXkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gcmF3UGV0bmFtZVRvVmFsLmhhcyhpbXBsb2RlKGtleSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiByYXdQZXRuYW1lVG9WYWwuZ2V0KGltcGxvZGUoa2V5KSk7XG4gICAgICB9LFxuICAgICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gcmF3UGV0bmFtZVRvVmFsLmRlbGV0ZShpbXBsb2RlKGtleSkpO1xuICAgICAgfSxcbiAgICAgIGtleXMoKSB7XG4gICAgICAgIHJldHVybiBtYXBJdGVyYWJsZShyYXdQZXRuYW1lVG9WYWwua2V5cygpLCBrZXkgPT4gZXhwbG9kZShrZXkpKTtcbiAgICAgIH0sXG4gICAgICBlbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gbWFwSXRlcmFibGUocmF3UGV0bmFtZVRvVmFsLmVudHJpZXMoKSwgKFtrZXksIHZhbF0pID0+IFtcbiAgICAgICAgICBleHBsb2RlKGtleSksXG4gICAgICAgICAgdmFsLFxuICAgICAgICBdKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGFkZFBhdGggPSAocGF0aCwgdmFsKSA9PiB7XG4gICAgICBpc1BhdGgocGF0aCkgfHwgRmFpbGBwYXRoICR7cShwYXRoKX0gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYDtcblxuICAgICAgaWYgKCF2YWxUb1BldG5hbWUuaGFzKHZhbCkgJiYgZWRnZU1hcHBpbmcudmFsVG9QZXRuYW1lLmhhcyhwYXRoWzBdKSkge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICB2YWxUb1BldG5hbWUuaW5pdCh2YWwsIHBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgaWYgKCF2YWxUb1BhdGhzLmhhcyh2YWwpKSB7XG4gICAgICAgIHZhbFRvUGF0aHMuaW5pdCh2YWwsIGhhcmRlbihbcGF0aF0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aHMgPSB2YWxUb1BhdGhzLmdldCh2YWwpO1xuXG4gICAgICAvL1xuICAgICAgY29uc3QgZm91bmQgPSBwYXRocy5maW5kKGVuYW1lID0+IHtcbiAgICAgICAgaWYgKGVuYW1lLmxlbmd0aCAhPT0gcGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbmFtZS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGlmIChlbmFtZVtpXSAhPT0gcGF0aFtpXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvL1xuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICB2YWxUb1BhdGhzLnNldCh2YWwsIGhhcmRlbihbLi4ucGF0aHMsIHBhdGhdKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGFkZFBldG5hbWUgPSAocGV0bmFtZSwgdmFsKSA9PiB7XG4gICAgICBpZiAocGV0bmFtZVRvVmFsLmhhcyhwZXRuYW1lKSAmJiBwZXRuYW1lVG9WYWwuZ2V0KHBldG5hbWUpID09PSB2YWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgIXBldG5hbWVUb1ZhbC5oYXMocGV0bmFtZSkgfHwgRmFpbGBwZXRuYW1lICR7cGV0bmFtZX0gaXMgYWxyZWFkeSBpbiB1c2VgO1xuICAgICAgIXZhbFRvUGV0bmFtZS5oYXModmFsKSB8fCBGYWlsYHZhbCAke3ZhbH0gYWxyZWFkeSBoYXMgYSBwZXRuYW1lYDtcbiAgICAgIHBldG5hbWVUb1ZhbC5pbml0KHBldG5hbWUsIHZhbCk7XG4gICAgICB2YWxUb1BldG5hbWUuaW5pdCh2YWwsIHBldG5hbWUpO1xuXG4gICAgICBpZiAoaXNQYXRoKHBldG5hbWUpKSB7XG4gICAgICAgIGFkZFBhdGgocGV0bmFtZSwgdmFsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcmVuYW1lUGV0bmFtZSA9IChwZXRuYW1lLCB2YWwpID0+IHtcbiAgICAgIHZhbFRvUGV0bmFtZS5oYXModmFsKSB8fFxuICAgICAgICBGYWlsYHZhbCAke3ZhbH0gaGFzIG5vdCBiZWVuIHByZXZpb3VzbHkgbmFtZWQsIHdvdWxkIHlvdSBsaWtlIHRvIGFkZCBpdCBpbnN0ZWFkP2A7XG4gICAgICAhcGV0bmFtZVRvVmFsLmhhcyhwZXRuYW1lKSB8fCBGYWlsYHBldG5hbWUgJHtwZXRuYW1lfSBpcyBhbHJlYWR5IGluIHVzZWA7XG4gICAgICAvL1xuICAgICAgY29uc3Qgb2xkUGV0bmFtZSA9IHZhbFRvUGV0bmFtZS5nZXQodmFsKTtcbiAgICAgIHBldG5hbWVUb1ZhbC5kZWxldGUob2xkUGV0bmFtZSk7XG4gICAgICB2YWxUb1BldG5hbWUuZGVsZXRlKHZhbCk7XG5cbiAgICAgIC8vXG4gICAgICBwZXRuYW1lVG9WYWwuaW5pdChwZXRuYW1lLCB2YWwpO1xuICAgICAgdmFsVG9QZXRuYW1lLmluaXQodmFsLCBwZXRuYW1lKTtcbiAgICB9O1xuXG4gICAgLypcblxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBzdWdnZXN0UGV0bmFtZSA9IChwZXRuYW1lLCB2YWwpID0+IHtcbiAgICAgIGlmICh2YWxUb1BldG5hbWUuaGFzKHZhbCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHZhbFRvUGV0bmFtZS5nZXQodmFsKTtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIGxldCB1bmlxdWVQYXRoID0gcGV0bmFtZTtcbiAgICAgIGxldCBub25jZSA9IDI7XG4gICAgICB3aGlsZSAocGV0bmFtZVRvVmFsLmhhcyh1bmlxdWVQYXRoKSkge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoaXNQYXRoKHBldG5hbWUpKSB7XG4gICAgICAgICAgdW5pcXVlUGF0aCA9IFsuLi5wZXRuYW1lLCBgJHtub25jZX1gXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bmlxdWVQYXRoID0gYCR7cGV0bmFtZX0ke25vbmNlfWA7XG4gICAgICAgIH1cbiAgICAgICAgbm9uY2UgKz0gMTtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgYWRkUGV0bmFtZSh1bmlxdWVQYXRoLCB2YWwpO1xuICAgICAgcmV0dXJuIHVuaXF1ZVBhdGg7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlbGV0ZVBldG5hbWUgPSBwZXRuYW1lID0+IHtcbiAgICAgIHBldG5hbWVUb1ZhbC5oYXMocGV0bmFtZSkgfHxcbiAgICAgICAgRmFpbGBwZXRuYW1lICR7cShcbiAgICAgICAgICBwZXRuYW1lLFxuICAgICAgICApfSBoYXMgbm90IGJlZW4gcHJldmlvdXNseSBuYW1lZCwgd291bGQgeW91IGxpa2UgdG8gYWRkIGl0IGluc3RlYWQ/YDtcblxuICAgICAgLy9cbiAgICAgIGNvbnN0IHZhbCA9IHBldG5hbWVUb1ZhbC5nZXQocGV0bmFtZSk7XG4gICAgICBwZXRuYW1lVG9WYWwuZGVsZXRlKHBldG5hbWUpO1xuICAgICAgdmFsVG9QZXRuYW1lLmRlbGV0ZSh2YWwpO1xuICAgIH07XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgbWFwcGluZyA9IGhhcmRlbih7XG4gICAgICBpbXBsb2RlLFxuICAgICAgZXhwbG9kZSxcbiAgICAgIHZhbFRvUGV0bmFtZSxcbiAgICAgIHZhbFRvUGF0aHMsXG4gICAgICBwZXRuYW1lVG9WYWwsXG4gICAgICBhZGRQZXRuYW1lLFxuICAgICAgYWRkUGF0aCxcbiAgICAgIHJlbmFtZVBldG5hbWUsXG4gICAgICBkZWxldGVQZXRuYW1lLFxuICAgICAgc3VnZ2VzdFBldG5hbWUsXG4gICAgICBraW5kLFxuICAgIH0pO1xuICAgIHBldG5hbWVLaW5kVG9NYXBwaW5nLmluaXQoa2luZCwgbWFwcGluZyk7XG4gICAgcmV0dXJuIG1hcHBpbmc7XG4gIH07XG5cbiAgY29uc3QgZWRnZU1hcHBpbmcgPSBtYWtlTWFwcGluZygnZWRnZScpO1xuICBjb25zdCB1bm5hbWVkTWFwcGluZyA9IG1ha2VNYXBwaW5nKCd1bm5hbWVkJyk7XG5cbiAgY29uc3QgYWRkVG9Vbm5hbWVkID0gdmFsID0+IHtcbiAgICB1bm5hbWVkQ291bnQgKz0gMTtcbiAgICBjb25zdCBwbGFjZWhvbGRlciA9IGB1bm5hbWVkLSR7dW5uYW1lZENvdW50fWA7XG4gICAgdW5uYW1lZE1hcHBpbmcuYWRkUGV0bmFtZShwbGFjZWhvbGRlciwgdmFsKTtcbiAgICBjb25zdCBwbGFjZWhvbGRlck5hbWUgPSBoYXJkZW4oe1xuICAgICAga2luZDogJ3VubmFtZWQnLFxuICAgICAgcGV0bmFtZTogcGxhY2Vob2xkZXIsXG4gICAgfSk7XG4gICAgcmV0dXJuIHBsYWNlaG9sZGVyTmFtZTtcbiAgfTtcblxuICAvL1xuICAvL1xuICBjb25zdCBjb252ZXJ0VmFsVG9OYW1lID0gdmFsID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaE9yZGVyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBraW5kID0gc2VhcmNoT3JkZXJbaV07XG4gICAgICBjb25zdCB7IHZhbFRvUGV0bmFtZSB9ID0gcGV0bmFtZUtpbmRUb01hcHBpbmcuZ2V0KGtpbmQpO1xuICAgICAgaWYgKHZhbFRvUGV0bmFtZS5oYXModmFsKSkge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgICBraW5kLFxuICAgICAgICAgIHBldG5hbWU6IHZhbFRvUGV0bmFtZS5nZXQodmFsKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICBpZiAodW5uYW1lZE1hcHBpbmcudmFsVG9QZXRuYW1lLmhhcyh2YWwpKSB7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAga2luZDogJ3VubmFtZWQnLFxuICAgICAgICBwZXRuYW1lOiB1bm5hbWVkTWFwcGluZy52YWxUb1BldG5hbWUuZ2V0KHZhbCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy9cbiAgICBjb25zdCBwbGFjZWhvbGRlck5hbWUgPSBhZGRUb1VubmFtZWQodmFsKTtcbiAgICByZXR1cm4gcGxhY2Vob2xkZXJOYW1lO1xuICB9O1xuXG4gIGNvbnN0IGNvbnZlcnROYW1lVG9WYWwgPSAoeyBraW5kLCBwZXRuYW1lIH0sIF9pZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IHsgcGV0bmFtZVRvVmFsIH0gPSBwZXRuYW1lS2luZFRvTWFwcGluZy5nZXQoa2luZCk7XG4gICAgcmV0dXJuIHBldG5hbWVUb1ZhbC5nZXQocGV0bmFtZSk7XG4gIH07XG5cbiAgY29uc3QgeyB0b0NhcERhdGE6IGRlaHlkcmF0ZSwgZnJvbUNhcERhdGE6IGh5ZHJhdGUgfSA9IG1ha2VNYXJzaGFsKFxuICAgIGNvbnZlcnRWYWxUb05hbWUsXG4gICAgY29udmVydE5hbWVUb1ZhbCxcbiAgICB7XG4gICAgICBtYXJzaGFsTmFtZTogJ2h5ZHJhdGlvbicsXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGVycm9ySWROdW06IDMwXzAwMCxcbiAgICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxuICAgIH0sXG4gICk7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGh5ZHJhdGUsXG4gICAgZGVoeWRyYXRlLFxuICAgIGVkZ2VNYXBwaW5nLFxuICAgIC8qXG5cblxuXG5cbiAgICAgKi9cbiAgICBtYWtlTWFwcGluZzogKGtpbmQsIGxlZ2FjeU9wdGlvbnMgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGNvbnN0IG1hcHBpbmcgPSBtYWtlTWFwcGluZyhraW5kLCBsZWdhY3lPcHRpb25zKTtcbiAgICAgIHNlYXJjaE9yZGVyLnB1c2goa2luZCk7XG4gICAgICByZXR1cm4gbWFwcGluZztcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VEZWh5ZHJhdG9yKG1ha2VEZWh5ZHJhdG9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGF0aCI6WyJpc1BhdGgiXSwibWFrZURlaHlkcmF0b3IiOlsibWFrZURlaHlkcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUA+bwLzLAAC8ywAAMAAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMy9zcmMvbGliLXdhbGxldC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL2NhY2hlIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3N0b3JhZ2UtdGVzdC11dGlscy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9lcnRwIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9uYXQiLCJAYWdvcmljL25vdGlmaWVyIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAYWdvcmljL3NtYXJ0LXdhbGxldC9zcmMvbWFyc2hhbC1jb250ZXh0cy5qcyIsIi4vaXNzdWVyVGFibGUuanMiLCIuL2xpYi1kZWh5ZHJhdGUuanMiLCIuL2ZpbmRPck1ha2VJbnZpdGF0aW9uLmpzIiwiLi9iaWdpbnRTdHJpbmdpZnkuanMiLCIuL2FjdGlvbnMuanMiLCIuL2ludGVybmFsLXR5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVdhbGxldFJvb3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQscSxGYWlsLG1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yLG9iamVjdE1hcCxXYWxsZXROYW1lLHNsb3RTdHJpbmdVbnNlcmlhbGl6ZSxtYWtlTGVnYWN5TWFwLG1ha2VTY2FsYXJNYXBTdG9yZSxtYWtlU2NhbGFyV2Vha01hcFN0b3JlLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxBbW91bnRNYXRoLEUscGFzc1N0eWxlT2YsRmFyLG1hcEl0ZXJhYmxlLE5hdCxtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcixtYWtlTm90aWZpZXJLaXQsb2JzZXJ2ZUl0ZXJhdGlvbixvYnNlcnZlTm90aWZpZXIsc3Vic2NyaWJlRWFjaCxtYWtlUHJvbWlzZUtpdCxtYWtlRXhwb3J0Q29udGV4dCxtYWtlSXNzdWVyVGFibGUsbWFrZURlaHlkcmF0b3IsbWFrZUlkLGZpbmRPck1ha2VJbnZpdGF0aW9uLGJpZ2ludFN0cmluZ2lmeSxtYWtlUGF5bWVudEFjdGlvbnM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvY2FjaGVcIiwgW1tcIm1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV0sW1wiV2FsbGV0TmFtZVwiLFskaM2PX2EgPT4gKFdhbGxldE5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9zdG9yYWdlLXRlc3QtdXRpbHMuanNcIiwgW1tcInNsb3RTdHJpbmdVbnNlcmlhbGl6ZVwiLFskaM2PX2EgPT4gKHNsb3RTdHJpbmdVbnNlcmlhbGl6ZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VMZWdhY3lNYXBcIixbJGjNj19hID0+IChtYWtlTGVnYWN5TWFwID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsWyRozY9fYSA9PiAobWFwSXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyXCIsWyRozY9fYSA9PiAobWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIgPSAkaM2PX2EpXV0sW1wibWFrZU5vdGlmaWVyS2l0XCIsWyRozY9fYSA9PiAobWFrZU5vdGlmaWVyS2l0ID0gJGjNj19hKV1dLFtcIm9ic2VydmVJdGVyYXRpb25cIixbJGjNj19hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjNj19hKV1dLFtcIm9ic2VydmVOb3RpZmllclwiLFskaM2PX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRozY9fYSldXSxbXCJzdWJzY3JpYmVFYWNoXCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zbWFydC13YWxsZXQvc3JjL21hcnNoYWwtY29udGV4dHMuanNcIiwgW1tcIm1ha2VFeHBvcnRDb250ZXh0XCIsWyRozY9fYSA9PiAobWFrZUV4cG9ydENvbnRleHQgPSAkaM2PX2EpXV1dXSxbXCIuL2lzc3VlclRhYmxlLmpzXCIsIFtbXCJtYWtlSXNzdWVyVGFibGVcIixbJGjNj19hID0+IChtYWtlSXNzdWVyVGFibGUgPSAkaM2PX2EpXV1dXSxbXCIuL2xpYi1kZWh5ZHJhdGUuanNcIiwgW1tcIm1ha2VEZWh5ZHJhdG9yXCIsWyRozY9fYSA9PiAobWFrZURlaHlkcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCIuL2ZpbmRPck1ha2VJbnZpdGF0aW9uLmpzXCIsIFtbXCJtYWtlSWRcIixbJGjNj19hID0+IChtYWtlSWQgPSAkaM2PX2EpXV0sW1wiZmluZE9yTWFrZUludml0YXRpb25cIixbJGjNj19hID0+IChmaW5kT3JNYWtlSW52aXRhdGlvbiA9ICRozY9fYSldXV1dLFtcIi4vYmlnaW50U3RyaW5naWZ5LmpzXCIsIFtbXCJiaWdpbnRTdHJpbmdpZnlcIixbJGjNj19hID0+IChiaWdpbnRTdHJpbmdpZnkgPSAkaM2PX2EpXV1dXSxbXCIuL2FjdGlvbnMuanNcIiwgW1tcIm1ha2VQYXltZW50QWN0aW9uc1wiLFskaM2PX2EgPT4gKG1ha2VQYXltZW50QWN0aW9ucyA9ICRozY9fYSldXV1dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VXYWxsZXRSb290LCduYW1lJyx7dmFsdWU6XCJtYWtlV2FsbGV0Um9vdFwifSk7JGjNj19vbmNlLm1ha2VXYWxsZXRSb290KG1ha2VXYWxsZXRSb290KTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBub0FjdGlvblN0YXRlQ2hhbmdlSGFuZGxlciA9IF9uZXdTdGF0ZSA9PiB7fTtcblxuY29uc3QgY21wID0gKGEsIGIpID0+IHtcbiAgaWYgKGEgPiBiKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gLTE7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZVdhbGxldFJvb3Qoe1xuICB6b2UsXG4gIGJvYXJkLFxuICBhZ29yaWNOYW1lcyxcbiAgbmFtZXNCeUFkZHJlc3MsXG4gIG15QWRkcmVzc05hbWVBZG1pbixcbiAgcHVyc2VzU3RhdGVDaGFuZ2VIYW5kbGVyID0gbm9BY3Rpb25TdGF0ZUNoYW5nZUhhbmRsZXIsXG4gIGluYm94U3RhdGVDaGFuZ2VIYW5kbGVyID0gbm9BY3Rpb25TdGF0ZUNoYW5nZUhhbmRsZXIsXG4gIGRhdGVOb3cgPSB1bmRlZmluZWQsXG59KSB7XG4gIGFzc2VydChteUFkZHJlc3NOYW1lQWRtaW4sICdtaXNzaW5nIG15QWRkcmVzc05hbWVBZG1pbicpO1xuXG4gIGxldCBsYXN0SWQgPSAwO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGFkZE1ldGEgPSByZWNvcmQgPT4ge1xuICAgIGNvbnN0IHsgbWV0YTogb2xkTWV0YSA9IHt9IH0gPSByZWNvcmQ7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IG1ldGEgPSB7IC4uLm9sZE1ldGEgfTtcbiAgICBpZiAoIW1ldGEuaWQpIHtcbiAgICAgIC8vXG4gICAgICBsYXN0SWQgKz0gMTtcbiAgICAgIG1ldGEuaWQgPSBsYXN0SWQ7XG4gICAgfVxuICAgIGlmIChkYXRlTm93KSB7XG4gICAgICBjb25zdCBub3dTdGFtcCA9IGRhdGVOb3coKTtcbiAgICAgIGlmICghbWV0YS5jcmVhdGlvblN0YW1wKSB7XG4gICAgICAgIC8vXG4gICAgICAgIG1ldGEuY3JlYXRpb25TdGFtcCA9IG5vd1N0YW1wO1xuICAgICAgfVxuICAgICAgbWV0YS51cGRhdGVkU3RhbXAgPSBub3dTdGFtcDtcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4ucmVjb3JkLCBtZXRhIH07XG4gIH07XG5cbiAgY29uc3QgY29udGV4dCA9IG1ha2VFeHBvcnRDb250ZXh0KCk7XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgeyBtYWtlTWFwcGluZywgZGVoeWRyYXRlLCBlZGdlTWFwcGluZyB9ID0gbWFrZURlaHlkcmF0b3IoKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcHVyc2VNYXBwaW5nID0gbWFrZU1hcHBpbmcoJ3B1cnNlJyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGJyYW5kTWFwcGluZyA9IG1ha2VNYXBwaW5nKCdicmFuZCcpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNvbnRhY3RNYXBwaW5nID0gbWFrZU1hcHBpbmcoXG4gICAgJ2NvbnRhY3QnLFxuICAgIHsgdXNlTGVnYWN5TWFwOiB0cnVlIH0gIC8vXG4gICk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGluc3RhbmNlTWFwcGluZyA9IG1ha2VNYXBwaW5nKCdpbnN0YW5jZScpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaW5zdGFsbGF0aW9uTWFwcGluZyA9IG1ha2VNYXBwaW5nKCdpbnN0YWxsYXRpb24nKTtcblxuICBjb25zdCBicmFuZFRhYmxlID0gbWFrZUlzc3VlclRhYmxlKCk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaXNzdWVyVG9Cb2FyZElkID0gbWFrZVNjYWxhcldlYWtNYXBTdG9yZSgnaXNzdWVyJyk7XG5cbiAgLy9cbiAgY29uc3QgaW5pdElzc3VlclRvQm9hcmRJZCA9IGFzeW5jIChpc3N1ZXIsIGJyYW5kKSA9PiB7XG4gICAgaWYgKGlzc3VlclRvQm9hcmRJZC5oYXMoaXNzdWVyKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBpc3N1ZXJUb0JvYXJkSWQuZ2V0KGlzc3Vlcik7XG4gICAgfVxuXG4gICAgLy9cbiAgICBjb25zdCBbaXNzdWVyQm9hcmRJZCwgYnJhbmRCb2FyZElkXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIEUoYm9hcmQpLmdldElkKGlzc3VlciksXG4gICAgICBFKGJvYXJkKS5nZXRJZChicmFuZCksXG4gICAgXSk7XG4gICAgaWYgKGlzc3VlclRvQm9hcmRJZC5oYXMoaXNzdWVyKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBpc3N1ZXJUb0JvYXJkSWQuZ2V0KGlzc3Vlcik7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnRleHQuZW5zdXJlQm9hcmRJZChpc3N1ZXJCb2FyZElkLCBpc3N1ZXIpO1xuICAgIGNvbnRleHQuaW5pdEJvYXJkSWQoYnJhbmRCb2FyZElkLCBicmFuZCk7XG5cbiAgICAvL1xuICAgIGlzc3VlclRvQm9hcmRJZC5pbml0KGlzc3VlciwgaXNzdWVyQm9hcmRJZCk7XG4gICAgcmV0dXJuIGlzc3VlckJvYXJkSWQ7XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcHVyc2VUb0JyYW5kID0gbWFrZVNjYWxhcldlYWtNYXBTdG9yZSgncHVyc2UnKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYnJhbmRUb0RlcG9zaXRGYWNldElkID0gbWFrZVNjYWxhck1hcFN0b3JlKCdicmFuZCcpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlID0gbWFrZVNjYWxhck1hcFN0b3JlKCdicmFuZCcpO1xuXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpZFRvT2ZmZXIgPSBtYWtlU2NhbGFyTWFwU3RvcmUoJ29mZmVySWQnKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvL1xuICBjb25zdCBpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0ID0gbWFrZUxlZ2FjeU1hcCgnaWQnKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaW52aXRhdGlvbkhhbmRsZVRvT2ZmZXJSZXN1bHQgPVxuICAgIG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUoJ2ludml0YXRpb25IYW5kbGUnKTtcblxuICAvL1xuICBjb25zdCBpZFRvQ29tcGlsZWRPZmZlclAgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGlkVG9Db21wbGV0ZSA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaWRUb1NlYXQgPSBuZXcgTWFwKCk7XG5cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwdXJzZXNTdGF0ZSA9IG5ldyBNYXAoKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcHVyc2VzRnVsbFN0YXRlID0gbmV3IE1hcCgpO1xuICBjb25zdCBpbmJveFN0YXRlID0gbmV3IE1hcCgpO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBsZXQgem9lSW52aXRlUHVyc2U7XG5cbiAgY29uc3QgWk9FX0lOVklURV9CUkFORF9QRVROQU1FID0gJ3pvZSBpbnZpdGUnO1xuXG4gIGZ1bmN0aW9uIGdldFNvcnRlZFZhbHVlcyhtYXApIHtcbiAgICBjb25zdCBlbnRyaWVzID0gWy4uLm1hcC5lbnRyaWVzKCldO1xuICAgIC8vXG4gICAgY29uc3QgdmFsdWVzID0gZW50cmllc1xuICAgICAgLnNvcnQoKFtpZDFdLCBbaWQyXSkgPT4gY21wKGlkMSwgaWQyKSlcbiAgICAgIC5tYXAoKFtfaWQsIHZhbHVlXSkgPT4gdmFsdWUpO1xuXG4gICAgcmV0dXJuIGJpZ2ludFN0cmluZ2lmeShoYXJkZW4odmFsdWVzKSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRQdXJzZXNTdGF0ZSgpIHtcbiAgICByZXR1cm4gZ2V0U29ydGVkVmFsdWVzKHB1cnNlc1N0YXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEluYm94U3RhdGUoKSB7XG4gICAgcmV0dXJuIGdldFNvcnRlZFZhbHVlcyhpbmJveFN0YXRlKTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGZpbGxJblNsb3RzID0gc2xvdFN0cmluZ1Vuc2VyaWFsaXplO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgeyBub3RpZmllcjogb2ZmZXJzTm90aWZpZXIsIHVwZGF0ZXI6IG9mZmVyc1VwZGF0ZXIgfSA9IG1ha2VOb3RpZmllcktpdChcbiAgICBbXSxcbiAgKTtcblxuICBjb25zdCB7IHB1cnNlc05vdGlmaWVyLCBhdHRlbnVhdGVkUHVyc2VzTm90aWZpZXIsIHB1cnNlc1VwZGF0ZXIgfSA9ICgoKSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgeyBub3RpZmllcjogaXBuLCB1cGRhdGVyOiBpcHUgfSA9IG1ha2VOb3RpZmllcktpdChbXSk7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgeyBub3RpZmllcjogYXBuLCB1cGRhdGVyOiBhcHUgfSA9IG1ha2VOb3RpZmllcktpdChbXSk7XG4gICAgLy9cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBpbm5lckZpbHRlciA9ICh7XG4gICAgICBicmFuZCxcbiAgICAgIGJyYW5kQm9hcmRJZCxcbiAgICAgIGRlcG9zaXRCb2FyZElkLFxuICAgICAgYnJhbmRQZXRuYW1lLFxuICAgICAgcHVyc2VQZXRuYW1lLFxuICAgICAgZGlzcGxheUluZm8sXG4gICAgICB2YWx1ZSxcbiAgICAgIGN1cnJlbnRBbW91bnRTbG90cyxcbiAgICAgIGN1cnJlbnRBbW91bnQsXG4gICAgfSkgPT5cbiAgICAgIGhhcmRlbih7XG4gICAgICAgIGJyYW5kLFxuICAgICAgICBicmFuZEJvYXJkSWQsXG4gICAgICAgIC4uLihkZXBvc2l0Qm9hcmRJZCAmJiB7IGRlcG9zaXRCb2FyZElkIH0pLFxuICAgICAgICBicmFuZFBldG5hbWUsXG4gICAgICAgIHB1cnNlUGV0bmFtZSxcbiAgICAgICAgLi4uKGRpc3BsYXlJbmZvICYmIHsgZGlzcGxheUluZm8gfSksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBjdXJyZW50QW1vdW50U2xvdHMsXG4gICAgICAgIGN1cnJlbnRBbW91bnQsXG4gICAgICB9KTtcbiAgICBjb25zdCBmaWx0ZXIgPSBzdGF0ZSA9PiBzdGF0ZS5tYXAoaW5uZXJGaWx0ZXIpO1xuICAgIGNvbnN0IHB1ID0gRmFyKCdwdXJzZXNVcGRhdGVyJywge1xuICAgICAgdXBkYXRlU3RhdGU6IG5ld1N0YXRlID0+IHtcbiAgICAgICAgaXB1LnVwZGF0ZVN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgYXB1LnVwZGF0ZVN0YXRlKGZpbHRlcihuZXdTdGF0ZSkpO1xuICAgICAgfSxcbiAgICAgIGZpbmlzaDogZmluYWxTdGF0ZSA9PiB7XG4gICAgICAgIGlwdS5maW5pc2goZmluYWxTdGF0ZSk7XG4gICAgICAgIGFwdS5maW5pc2goZmlsdGVyKGZpbmFsU3RhdGUpKTtcbiAgICAgIH0sXG4gICAgICBmYWlsOiByZWFzb24gPT4ge1xuICAgICAgICBpcHUuZmFpbChyZWFzb24pO1xuICAgICAgICBhcHUuZmFpbChyZWFzb24pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHB1cnNlc05vdGlmaWVyOiBpcG4sXG4gICAgICBhdHRlbnVhdGVkUHVyc2VzTm90aWZpZXI6IGFwbixcbiAgICAgIHB1cnNlc1VwZGF0ZXI6IHB1LFxuICAgIH0pO1xuICB9KSgpO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHVyc2VzU3RhdGUocHVyc2VQZXRuYW1lLCBwdXJzZSkge1xuICAgIGNvbnN0IHB1cnNlS2V5ID0gcHVyc2VNYXBwaW5nLmltcGxvZGUocHVyc2VQZXRuYW1lKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwdXJzZXNTdGF0ZS5rZXlzKCkpIHtcbiAgICAgIGlmICghcHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5oYXMocHVyc2VNYXBwaW5nLmV4cGxvZGUoa2V5KSkpIHtcbiAgICAgICAgcHVyc2VzU3RhdGUuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRBbW91bnQgPSBhd2FpdCBFKHB1cnNlKS5nZXRDdXJyZW50QW1vdW50KCk7XG4gICAgY29uc3QgeyB2YWx1ZSwgYnJhbmQgfSA9IGN1cnJlbnRBbW91bnQ7XG4gICAgY29uc3QgYnJhbmRQZXRuYW1lID0gYnJhbmRNYXBwaW5nLnZhbFRvUGV0bmFtZS5nZXQoYnJhbmQpO1xuICAgIGNvbnN0IGRlaHlkcmF0ZWRDdXJyZW50QW1vdW50ID0gZGVoeWRyYXRlKGN1cnJlbnRBbW91bnQpO1xuICAgIGNvbnN0IGJyYW5kQm9hcmRJZCA9IGF3YWl0IEUoYm9hcmQpLmdldElkKGJyYW5kKTtcblxuICAgIGxldCBkZXBvc2l0Qm9hcmRJZDtcbiAgICBpZiAoXG4gICAgICBicmFuZFRvQXV0b0RlcG9zaXRQdXJzZS5oYXMoYnJhbmQpICYmXG4gICAgICBicmFuZFRvQXV0b0RlcG9zaXRQdXJzZS5nZXQoYnJhbmQpID09PSBwdXJzZSAmJlxuICAgICAgYnJhbmRUb0RlcG9zaXRGYWNldElkLmhhcyhicmFuZClcbiAgICApIHtcbiAgICAgIC8vXG4gICAgICBkZXBvc2l0Qm9hcmRJZCA9IGJyYW5kVG9EZXBvc2l0RmFjZXRJZC5nZXQoYnJhbmQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzc3VlclJlY29yZCA9XG4gICAgICBicmFuZFRhYmxlLmhhc0J5QnJhbmQoYnJhbmQpICYmIGJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG4gICAgLypcblxuICAgICAqL1xuICAgIGNvbnN0IGpzdGF0ZSA9IGFkZE1ldGEoe1xuICAgICAgLi4ucHVyc2VzU3RhdGUuZ2V0KHB1cnNlS2V5KSxcbiAgICAgIGJyYW5kLFxuICAgICAgYnJhbmRCb2FyZElkLFxuICAgICAgLi4uKGRlcG9zaXRCb2FyZElkICYmIHsgZGVwb3NpdEJvYXJkSWQgfSksXG4gICAgICBicmFuZFBldG5hbWUsXG4gICAgICBwdXJzZVBldG5hbWUsXG4gICAgICBkaXNwbGF5SW5mbzogaXNzdWVyUmVjb3JkICYmIGlzc3VlclJlY29yZC5kaXNwbGF5SW5mbyxcbiAgICAgIHZhbHVlLFxuICAgICAgY3VycmVudEFtb3VudFNsb3RzOiBkZWh5ZHJhdGVkQ3VycmVudEFtb3VudCxcbiAgICAgIGN1cnJlbnRBbW91bnQ6IGZpbGxJblNsb3RzKGRlaHlkcmF0ZWRDdXJyZW50QW1vdW50KSxcbiAgICB9KTtcbiAgICBwdXJzZXNTdGF0ZS5zZXQocHVyc2VLZXksIGpzdGF0ZSk7XG5cbiAgICBwdXJzZXNGdWxsU3RhdGUuc2V0KFxuICAgICAgcHVyc2UsXG4gICAgICBoYXJkZW4oe1xuICAgICAgICAuLi5qc3RhdGUsXG4gICAgICAgIHB1cnNlLFxuICAgICAgICBicmFuZCxcbiAgICAgICAgYWN0aW9uczogRmFyKCdwdXJzZS5hY3Rpb25zJywge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgYXN5bmMgc2VuZChyZWNlaXZlclAsIHNlbmRWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgYW1vdW50ID0gQW1vdW50TWF0aC5tYWtlKGJyYW5kLCBzZW5kVmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgcGF5bWVudCA9IGF3YWl0IEUocHVyc2UpLndpdGhkcmF3KGFtb3VudCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBFKHJlY2VpdmVyUCkucmVjZWl2ZShwYXltZW50KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgYXdhaXQgRShwdXJzZSkuZGVwb3NpdChwYXltZW50KTtcbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGFzeW5jIHJlY2VpdmUocGF5bWVudFApIHtcbiAgICAgICAgICAgIGNvbnN0IHBheW1lbnQgPSBhd2FpdCBwYXltZW50UDtcbiAgICAgICAgICAgIHJldHVybiBFKHB1cnNlKS5kZXBvc2l0KHBheW1lbnQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVwb3NpdChwYXltZW50LCBhbW91bnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBFKHB1cnNlKS5kZXBvc2l0KHBheW1lbnQsIGFtb3VudCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICApO1xuICAgIHB1cnNlc1VwZGF0ZXIudXBkYXRlU3RhdGUoWy4uLnB1cnNlc0Z1bGxTdGF0ZS52YWx1ZXMoKV0pO1xuICAgIHB1cnNlc1N0YXRlQ2hhbmdlSGFuZGxlcihnZXRQdXJzZXNTdGF0ZSgpKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbFB1cnNlU3RhdGUoKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgbWFwSXRlcmFibGUocHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5lbnRyaWVzKCksIChbcGV0bmFtZSwgcHVyc2VdKSA9PlxuICAgICAgICB1cGRhdGVQdXJzZXNTdGF0ZShwZXRuYW1lLCBwdXJzZSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBkaXNwbGF5ID0gdmFsdWUgPT4gZmlsbEluU2xvdHMoZGVoeWRyYXRlKGhhcmRlbih2YWx1ZSkpKTtcblxuICBjb25zdCBleHBhbmRJbnZpdGF0aW9uQnJhbmRzID0gYXN5bmMgaW52aXRhdGlvbkRldGFpbHMgPT4ge1xuICAgIC8vXG4gICAgY29uc3QgeyBmZWUgfSA9IGludml0YXRpb25EZXRhaWxzO1xuICAgIGlmICghZmVlKSB7XG4gICAgICByZXR1cm4gaW52aXRhdGlvbkRldGFpbHM7XG4gICAgfVxuXG4gICAgLy9cbiAgICBjb25zdCBkaXNwbGF5SW5mbyA9IGF3YWl0IEUoRSh6b2UpLmdldEZlZUlzc3VlcigpKS5nZXREaXNwbGF5SW5mbygpO1xuICAgIGNvbnN0IGF1Z21lbnRlZERldGFpbHMgPSB7XG4gICAgICAuLi5pbnZpdGF0aW9uRGV0YWlscyxcbiAgICAgIGZlZTogeyAuLi5mZWUsIGRpc3BsYXlJbmZvIH0sXG4gICAgfTtcbiAgICByZXR1cm4gZGlzcGxheShhdWdtZW50ZWREZXRhaWxzKTtcbiAgfTtcblxuICBjb25zdCBkaXNwbGF5UHJvcG9zYWwgPSBwcm9wb3NhbFRlbXBsYXRlID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB3YW50LFxuICAgICAgZ2l2ZSxcbiAgICAgIGV4aXQgPSB7IG9uRGVtYW5kOiBudWxsIH0sXG4gICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgfSA9IHByb3Bvc2FsVGVtcGxhdGU7XG4gICAgY29uc3QgZGlzcGxheVJlY29yZCA9IHB1cnNlUGV0bmFtZVZhbHVlS2V5d29yZFJlY29yZCA9PiB7XG4gICAgICBpZiAocHVyc2VQZXRuYW1lVmFsdWVLZXl3b3JkUmVjb3JkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHB1cnNlUGV0bmFtZVZhbHVlS2V5d29yZFJlY29yZCkubWFwKFxuICAgICAgICAgIChba2V5d29yZCwgeyBwdXJzZVBldG5hbWUsIHZhbHVlLCBhbW91bnQsIHB1cnNlIH1dKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWFtb3VudCkge1xuICAgICAgICAgICAgICBwdXJzZSA9IGdldFB1cnNlKHB1cnNlUGV0bmFtZSk7XG4gICAgICAgICAgICAgIGFtb3VudCA9IHsgdmFsdWUgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHB1cnNlUGV0bmFtZSA9IHB1cnNlTWFwcGluZy52YWxUb1BldG5hbWUuZ2V0KHB1cnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYnJhbmQgPSBwdXJzZVRvQnJhbmQuZ2V0KHB1cnNlKTtcbiAgICAgICAgICAgIGNvbnN0IGlzc3VlclJlY29yZCA9XG4gICAgICAgICAgICAgIGJyYW5kVGFibGUuaGFzQnlCcmFuZChicmFuZCkgJiYgYnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKTtcbiAgICAgICAgICAgIGFtb3VudCA9IGhhcmRlbih7XG4gICAgICAgICAgICAgIC4uLmFtb3VudCxcbiAgICAgICAgICAgICAgYnJhbmQsXG4gICAgICAgICAgICAgIGRpc3BsYXlJbmZvOiBpc3N1ZXJSZWNvcmQgJiYgaXNzdWVyUmVjb3JkLmRpc3BsYXlJbmZvLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5QW1vdW50ID0gZGlzcGxheShhbW91bnQpO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAga2V5d29yZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHB1cnNlUGV0bmFtZSxcbiAgICAgICAgICAgICAgICBwdXJzZSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IGRpc3BsYXlBbW91bnQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH07XG4gICAgY29uc3QgcHJvcG9zYWxGb3JEaXNwbGF5ID0ge1xuICAgICAgd2FudDogZGlzcGxheVJlY29yZCh3YW50KSxcbiAgICAgIGdpdmU6IGRpc3BsYXlSZWNvcmQoZ2l2ZSksXG4gICAgICBleGl0LFxuICAgIH07XG4gICAgaWYgKGFyZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcG9zYWxGb3JEaXNwbGF5LmFyZ3VtZW50cyA9IGRpc3BsYXkoYXJncyk7XG4gICAgfVxuICAgIHJldHVybiBwcm9wb3NhbEZvckRpc3BsYXk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcnVuZU9mZmVyV2hlbkluYWN0aXZlID0gaWQgPT4ge1xuICAgIGFzc2VydChpbmJveFN0YXRlLmhhcyhpZCkpO1xuICAgIGNvbnN0IG9mZmVyID0gaW5ib3hTdGF0ZS5nZXQoaWQpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBvZmZlcjtcblxuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlICdkZWNsaW5lJzpcbiAgICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgICBjYXNlICdyZWplY3RlZCc6XG4gICAgICAgIGluYm94U3RhdGUuZGVsZXRlKGlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnYWNjZXB0JzpcbiAgICAgICAgYXNzZXJ0KGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuaGFzKGlkKSk7XG4gICAgICAgIHZvaWQgRS53aGVuKGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuZ2V0KGlkKS5wcm9taXNlLCByZXN1bHQgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0eWxlID0gcGFzc1N0eWxlT2YocmVzdWx0KTtcbiAgICAgICAgICBjb25zdCBhY3RpdmUgPVxuICAgICAgICAgICAgc3R5bGUgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICAgICAgICAoc3R5bGUgPT09ICdjb3B5UmVjb3JkJyAmJiAnaW52aXRhdGlvbk1ha2VycycgaW4gcmVzdWx0KTtcbiAgICAgICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICAgICAgaW5ib3hTdGF0ZS5kZWxldGUoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVJbmJveFN0YXRlKGlkLCBvZmZlciwgZG9QdXNoID0gdHJ1ZSkge1xuICAgIC8vXG4gICAgY29uc3QgeyBwcm9wb3NhbFRlbXBsYXRlIH0gPSBvZmZlcjtcbiAgICBjb25zdCB7IGluc3RhbmNlLCBpbnN0YWxsYXRpb24sIGludml0YXRpb25EZXRhaWxzIH0gPSBpZFRvT2ZmZXIuZ2V0KGlkKTtcbiAgICBpZiAoIWluc3RhbmNlIHx8ICFpbnN0YWxsYXRpb24pIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZURpc3BsYXkgPSBkaXNwbGF5KGluc3RhbmNlKTtcbiAgICBjb25zdCBpbnN0YWxsYXRpb25EaXNwbGF5ID0gZGlzcGxheShpbnN0YWxsYXRpb24pO1xuICAgIGNvbnN0IGFscmVhZHlEaXNwbGF5ZWQgPVxuICAgICAgaW5ib3hTdGF0ZS5oYXMoaWQpICYmIGluYm94U3RhdGUuZ2V0KGlkKS5wcm9wb3NhbEZvckRpc3BsYXk7XG5cbiAgICBjb25zdCBhdWdtZW50ZWRJbnZpdGF0aW9uRGV0YWlscyA9XG4gICAgICBhd2FpdCBleHBhbmRJbnZpdGF0aW9uQnJhbmRzKGludml0YXRpb25EZXRhaWxzKTtcblxuICAgIGNvbnN0IG9mZmVyRm9yRGlzcGxheSA9IHtcbiAgICAgIC4uLm9mZmVyLFxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgYWN0aW9uczogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFsbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICBpbnN0YW5jZTogdW5kZWZpbmVkLFxuICAgICAgcHJvcG9zYWxUZW1wbGF0ZSxcbiAgICAgIGludml0YXRpb25EZXRhaWxzOiBkaXNwbGF5KGF1Z21lbnRlZEludml0YXRpb25EZXRhaWxzKSxcbiAgICAgIGluc3RhbmNlUGV0bmFtZTogaW5zdGFuY2VEaXNwbGF5LnBldG5hbWUsXG4gICAgICBpbnN0YWxsYXRpb25QZXRuYW1lOiBpbnN0YWxsYXRpb25EaXNwbGF5LnBldG5hbWUsXG4gICAgICBwcm9wb3NhbEZvckRpc3BsYXk6IGRpc3BsYXlQcm9wb3NhbChhbHJlYWR5RGlzcGxheWVkIHx8IHByb3Bvc2FsVGVtcGxhdGUpLFxuICAgIH07XG5cbiAgICBpbmJveFN0YXRlLnNldChpZCwgb2ZmZXJGb3JEaXNwbGF5KTtcbiAgICBpZiAoZG9QdXNoKSB7XG4gICAgICAvL1xuICAgICAgb2ZmZXJzVXBkYXRlci51cGRhdGVTdGF0ZShbb2ZmZXJGb3JEaXNwbGF5XSk7XG4gICAgICBpbmJveFN0YXRlQ2hhbmdlSGFuZGxlcihnZXRJbmJveFN0YXRlKCkpO1xuICAgIH1cbiAgICBwcnVuZU9mZmVyV2hlbkluYWN0aXZlKGlkKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbEluYm94U3RhdGUoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKGluYm94U3RhdGUuZW50cmllcygpKS5tYXAoKFtpZCwgb2ZmZXJdKSA9PlxuICAgICAgICAvL1xuICAgICAgICB1cGRhdGVJbmJveFN0YXRlKGlkLCBvZmZlciwgZmFsc2UpLFxuICAgICAgKSxcbiAgICApO1xuICAgIC8vXG4gICAgb2ZmZXJzVXBkYXRlci51cGRhdGVTdGF0ZShbLi4uaW5ib3hTdGF0ZS52YWx1ZXMoKV0pO1xuICAgIGluYm94U3RhdGVDaGFuZ2VIYW5kbGVyKGdldEluYm94U3RhdGUoKSk7XG4gIH1cblxuICBjb25zdCB7IHVwZGF0ZXI6IGlzc3VlcnNVcGRhdGVyLCBub3RpZmllcjogaXNzdWVyc05vdGlmaWVyIH0gPVxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICBtYWtlTm90aWZpZXJLaXQoW10pXG4gICAgKTtcblxuICBmdW5jdGlvbiB1cGRhdGVBbGxJc3N1ZXJzU3RhdGUoKSB7XG4gICAgaXNzdWVyc1VwZGF0ZXIudXBkYXRlU3RhdGUoXG4gICAgICBbLi4uYnJhbmRNYXBwaW5nLnBldG5hbWVUb1ZhbC5lbnRyaWVzKCldLm1hcCgoW3BldG5hbWUsIGJyYW5kXSkgPT4ge1xuICAgICAgICBjb25zdCBpc3N1ZXJSZWNvcmQgPSBicmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHBldG5hbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uaXNzdWVyUmVjb3JkLFxuICAgICAgICAgICAgaXNzdWVyQm9hcmRJZDogaXNzdWVyVG9Cb2FyZElkLmdldChpc3N1ZXJSZWNvcmQuaXNzdWVyKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbFN0YXRlKCkge1xuICAgIHVwZGF0ZUFsbElzc3VlcnNTdGF0ZSgpO1xuICAgIGF3YWl0IHVwZGF0ZUFsbFB1cnNlU3RhdGUoKTtcbiAgICBhd2FpdCB1cGRhdGVBbGxJbmJveFN0YXRlKCk7XG4gIH1cblxuICAvL1xuICAvL1xuICBmdW5jdGlvbiB1cGRhdGVPclJlc3Vic2NyaWJlKGlkLCBzZWF0LCB1cGRhdGUpIHtcbiAgICBjb25zdCB7IHVwZGF0ZUNvdW50IH0gPSB1cGRhdGU7XG4gICAgYXNzZXJ0KHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpO1xuICAgIGlkVG9TZWF0LmRlbGV0ZShpZCk7XG5cbiAgICBjb25zdCBvZmZlciA9IGlkVG9PZmZlci5nZXQoaWQpO1xuICAgIGNvbnN0IGNvbXBsZXRlZE9mZmVyID0gYWRkTWV0YSh7XG4gICAgICAuLi5vZmZlcixcbiAgICAgIHN0YXR1czogJ2NvbXBsZXRlJyxcbiAgICB9KTtcbiAgICBpZFRvT2ZmZXIuc2V0KGlkLCBjb21wbGV0ZWRPZmZlcik7XG4gICAgdm9pZCB1cGRhdGVJbmJveFN0YXRlKGlkLCBjb21wbGV0ZWRPZmZlcik7XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmVUb1VwZGF0ZXMoaWQsIHNlYXQpIHtcbiAgICByZXR1cm4gRShFKHNlYXQpLmdldEV4aXRTdWJzY3JpYmVyKCkpXG4gICAgICAuc3Vic2NyaWJlQWZ0ZXIoKVxuICAgICAgLnRoZW4odXBkYXRlID0+IHVwZGF0ZU9yUmVzdWJzY3JpYmUoaWQsIHNlYXQsIHVwZGF0ZSkpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZU9mZmVyKGNvbXBpbGVkT2ZmZXJQKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3Qge1xuICAgICAgaW52aXRlUCxcbiAgICAgIHB1cnNlS2V5d29yZFJlY29yZCxcbiAgICAgIHByb3Bvc2FsLFxuICAgICAgYXJndW1lbnRzOiBhcmdzLFxuICAgIH0gPSBhd2FpdCBjb21waWxlZE9mZmVyUDtcblxuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHBheW1lbnRUb1B1cnNlID0gbmV3IE1hcCgpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGtleXdvcmRQYXltZW50UHMgPSBPYmplY3QuZW50cmllcyhwcm9wb3NhbC5naXZlIHx8IGhhcmRlbih7fSkpLm1hcChcbiAgICAgIGFzeW5jIChba2V5d29yZCwgYW1vdW50XSkgPT4ge1xuICAgICAgICBjb25zdCBwdXJzZSA9IHB1cnNlS2V5d29yZFJlY29yZFtrZXl3b3JkXTtcbiAgICAgICAgcHVyc2UgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIEZhaWxgcHVyc2Ugd2FzIG5vdCBmb3VuZCBmb3Iga2V5d29yZCAke3Eoa2V5d29yZCl9YDtcblxuICAgICAgICBjb25zdCBwYXltZW50ID0gYXdhaXQgRShwdXJzZSkud2l0aGRyYXcoYW1vdW50KTtcbiAgICAgICAgcGF5bWVudFRvUHVyc2Uuc2V0KHBheW1lbnQsIHB1cnNlKTtcbiAgICAgICAgcmV0dXJuIFtrZXl3b3JkLCBwYXltZW50XTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB0cnlSZWNsYWltaW5nV2l0aGRyYXduUGF5bWVudHMgPSAoKSA9PlxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgIGtleXdvcmRQYXltZW50UHMubWFwKGFzeW5jIGtleXdvcmRQYXltZW50UCA9PiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IFtfa2V5d29yZCwgcGF5bWVudF0gPSBhd2FpdCBrZXl3b3JkUGF5bWVudFA7XG5cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IHB1cnNlID0gcGF5bWVudFRvUHVyc2UuZ2V0KHBheW1lbnQpO1xuICAgICAgICAgIGlmIChwdXJzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvL1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkUGF5bWVudChwYXltZW50LCBwdXJzZSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBwYXltZW50VG9QdXJzZS5kZWxldGUocGF5bWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3Qgd2l0aGRyYXdBbGxQYXltZW50cyA9IFByb21pc2UuYWxsKGtleXdvcmRQYXltZW50UHMpO1xuICAgIHdpdGhkcmF3QWxsUGF5bWVudHMuY2F0Y2godHJ5UmVjbGFpbWluZ1dpdGhkcmF3blBheW1lbnRzKTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcGF5bWVudEtleXdvcmRzID0gYXdhaXQgd2l0aGRyYXdBbGxQYXltZW50cztcblxuICAgIGNvbnN0IHBheW1lbnRLZXl3b3JkUmVjb3JkID0gaGFyZGVuKE9iamVjdC5mcm9tRW50cmllcyhwYXltZW50S2V5d29yZHMpKTtcblxuICAgIGNvbnN0IHNlYXQgPSBFKHpvZSkub2ZmZXIoXG4gICAgICBpbnZpdGVQLFxuICAgICAgaGFyZGVuKHByb3Bvc2FsKSxcbiAgICAgIHBheW1lbnRLZXl3b3JkUmVjb3JkLFxuICAgICAgYXJncyxcbiAgICApO1xuICAgIC8vXG4gICAgLy9cbiAgICB2b2lkIHNlYXQuZmluYWxseSh0cnlSZWNsYWltaW5nV2l0aGRyYXduUGF5bWVudHMpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGRlcG9zaXRlZFAgPSBFKHNlYXQpXG4gICAgICAuZ2V0UGF5b3V0cygpXG4gICAgICAudGhlbihwYXlvdXRPYmogPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMocGF5b3V0T2JqKS5tYXAoKFtrZXl3b3JkLCBwYXlvdXRQXSkgPT4ge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBjb25zdCBwdXJzZU9yVW5kZWZpbmVkID0gcHVyc2VLZXl3b3JkUmVjb3JkW2tleXdvcmRdO1xuXG4gICAgICAgICAgICByZXR1cm4gYWRkUGF5bWVudChwYXlvdXRQLCBwdXJzZU9yVW5kZWZpbmVkKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgdm9pZCBkZXBvc2l0ZWRQLmZpbmFsbHkodHJ5UmVjbGFpbWluZ1dpdGhkcmF3blBheW1lbnRzKTtcblxuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4geyBkZXBvc2l0ZWRQLCBzZWF0IH07XG4gIH1cblxuICAvL1xuXG4gIGNvbnN0IGFkZElzc3VlciA9IGFzeW5jIChwZXRuYW1lRm9yQnJhbmQsIGlzc3VlclAsIG1ha2VQdXJzZSA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgaXNzdWVyID0gYXdhaXQgaXNzdWVyUDtcbiAgICBjb25zdCByZWNQID0gYnJhbmRUYWJsZS5oYXNCeUlzc3Vlcihpc3N1ZXIpXG4gICAgICA/IGJyYW5kVGFibGUuZ2V0QnlJc3N1ZXIoaXNzdWVyKVxuICAgICAgOiBicmFuZFRhYmxlLmluaXRJc3N1ZXIoaXNzdWVyLCBhZGRNZXRhKTtcbiAgICBjb25zdCB7IGJyYW5kIH0gPSBhd2FpdCByZWNQO1xuICAgIGF3YWl0IGluaXRJc3N1ZXJUb0JvYXJkSWQoaXNzdWVyLCBicmFuZCk7XG4gICAgY29uc3QgYWRkQnJhbmRQZXRuYW1lID0gKCkgPT4ge1xuICAgICAgbGV0IHA7XG4gICAgICBjb25zdCBhbHJlYWR5ID0gYnJhbmRNYXBwaW5nLnZhbFRvUGV0bmFtZS5oYXMoYnJhbmQpO1xuICAgICAgcGV0bmFtZUZvckJyYW5kID0gYnJhbmRNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKHBldG5hbWVGb3JCcmFuZCwgYnJhbmQpO1xuICAgICAgaWYgKCFhbHJlYWR5ICYmIG1ha2VQdXJzZSkge1xuICAgICAgICBwID0gbWFrZUVtcHR5UHVyc2UocGV0bmFtZUZvckJyYW5kLCBwZXRuYW1lRm9yQnJhbmQsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcCA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEUud2hlbihwLCBfID0+IHBldG5hbWVGb3JCcmFuZCk7XG4gICAgfTtcbiAgICByZXR1cm4gYWRkQnJhbmRQZXRuYW1lKCkudGhlbihhc3luYyBicmFuZE5hbWUgPT4ge1xuICAgICAgYXdhaXQgdXBkYXRlQWxsSXNzdWVyc1N0YXRlKCk7XG4gICAgICByZXR1cm4gYnJhbmROYW1lO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHB1Ymxpc2hJc3N1ZXIgPSBhc3luYyBicmFuZCA9PiB7XG4gICAgY29uc3QgeyBpc3N1ZXIgfSA9IGJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG4gICAgY29uc3QgaXNzdWVyQm9hcmRJZCA9IGF3YWl0IGluaXRJc3N1ZXJUb0JvYXJkSWQoaXNzdWVyLCBicmFuZCk7XG4gICAgdXBkYXRlQWxsSXNzdWVyc1N0YXRlKCk7XG4gICAgcmV0dXJuIGlzc3VlckJvYXJkSWQ7XG4gIH07XG5cbiAgY29uc3QgeyB1cGRhdGVyOiBjb250YWN0c1VwZGF0ZXIsIG5vdGlmaWVyOiBjb250YWN0c05vdGlmaWVyIH0gPVxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgIG1ha2VOb3RpZmllcktpdChbXSlcbiAgICApO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBhZGRDb250YWN0ID0gYXN5bmMgKHBldG5hbWUsIGFjdGlvbnMsIGFkZHJlc3MgPSB1bmRlZmluZWQpID0+IHtcbiAgICAvL1xuICAgIGNvbnN0IGFscmVhZHkgPSBhd2FpdCBFKGJvYXJkKS5oYXMoYWN0aW9ucyk7XG4gICAgLyogICAgICAgICAgICAgICovXG4gICAgbGV0IGRlcG9zaXRGYWNldDtcbiAgICBpZiAoYWxyZWFkeSkge1xuICAgICAgZGVwb3NpdEZhY2V0ID0gYWN0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVwb3NpdEZhY2V0ID0gRmFyKFdhbGxldE5hbWUuZGVwb3NpdEZhY2V0LCB7XG4gICAgICAgIHJlY2VpdmUocGF5bWVudFApIHtcbiAgICAgICAgICByZXR1cm4gRShhY3Rpb25zKS5yZWNlaXZlKHBheW1lbnRQKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkZXBvc2l0Qm9hcmRJZCA9IGF3YWl0IEUoYm9hcmQpLmdldElkKGRlcG9zaXRGYWNldCk7XG4gICAgY29uc3QgZm91bmQgPSBbLi4uY29udGFjdE1hcHBpbmcucGV0bmFtZVRvVmFsLmVudHJpZXMoKV0uZmluZChcbiAgICAgIChbX3BuLCB7IGRlcG9zaXRCb2FyZElkOiBkYmlkIH1dKSA9PiBkZXBvc2l0Qm9hcmRJZCA9PT0gZGJpZCxcbiAgICApO1xuICAgICFmb3VuZCB8fFxuICAgICAgRmFpbGAke3EoZm91bmQgJiYgZm91bmRbMF0pfSBpcyBhbHJlYWR5IHRoZSBwZXRuYW1lIGZvciBib2FyZCBJRCAke3EoXG4gICAgICAgIGRlcG9zaXRCb2FyZElkLFxuICAgICAgKX1gO1xuXG4gICAgY29uc3QgY29udGFjdCA9IGhhcmRlbihcbiAgICAgIGFkZE1ldGEoe1xuICAgICAgICBhY3Rpb25zLFxuICAgICAgICBhZGRyZXNzLFxuICAgICAgICBkZXBvc2l0Qm9hcmRJZCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb250YWN0TWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lLCBjb250YWN0KTtcbiAgICBjb250YWN0c1VwZGF0ZXIudXBkYXRlU3RhdGUoWy4uLmNvbnRhY3RNYXBwaW5nLnBldG5hbWVUb1ZhbC5lbnRyaWVzKCldKTtcbiAgICByZXR1cm4gY29udGFjdDtcbiAgfTtcblxuICBjb25zdCBhZGRJbnN0YW5jZSA9IChwZXRuYW1lLCBpbnN0YW5jZUhhbmRsZSkgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHBldG5hbWUgPSBpbnN0YW5jZU1hcHBpbmcuc3VnZ2VzdFBldG5hbWUocGV0bmFtZSwgaW5zdGFuY2VIYW5kbGUpO1xuICAgIC8vXG4gICAgdm9pZCB1cGRhdGVBbGxTdGF0ZSgpO1xuICAgIHJldHVybiBgaW5zdGFuY2UgJHtxKHBldG5hbWUpfSBzdWNjZXNzZnVsbHkgYWRkZWQgdG8gd2FsbGV0YDtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBpbnRlcm5hbFVuc2FmZUltcG9ydFB1cnNlID0gYXN5bmMgKFxuICAgIGJyYW5kUGV0bmFtZSxcbiAgICBwZXRuYW1lRm9yUHVyc2UsXG4gICAgZGVmYXVsdEF1dG9EZXBvc2l0LFxuICAgIHB1cnNlVG9JbXBvcnQsXG4gICkgPT4ge1xuICAgIGNvbnN0IGJyYW5kID0gYnJhbmRNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQoYnJhbmRQZXRuYW1lKTtcbiAgICBjb25zdCB7IGlzc3VlciB9ID0gYnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcHVyc2UgPSBhd2FpdCAocHVyc2VUb0ltcG9ydCB8fCBFKGlzc3VlcikubWFrZUVtcHR5UHVyc2UoKSk7XG5cbiAgICBwdXJzZVRvQnJhbmQuaW5pdChwdXJzZSwgYnJhbmQpO1xuICAgIHBldG5hbWVGb3JQdXJzZSA9IHB1cnNlTWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lRm9yUHVyc2UsIHB1cnNlKTtcblxuICAgIGlmIChkZWZhdWx0QXV0b0RlcG9zaXQgJiYgIWJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmhhcyhicmFuZCkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgYXdhaXQgZG9FbmFibGVBdXRvRGVwb3NpdChwZXRuYW1lRm9yUHVyc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBhd2FpdCB1cGRhdGVQdXJzZXNTdGF0ZShwZXRuYW1lRm9yUHVyc2UsIHB1cnNlKTtcblxuICAgIC8vXG4gICAgdm9pZCBvYnNlcnZlTm90aWZpZXIoRShwdXJzZSkuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCksIHtcbiAgICAgIHVwZGF0ZVN0YXRlKF9iYWxhbmNlKSB7XG4gICAgICAgIHVwZGF0ZVB1cnNlc1N0YXRlKHB1cnNlTWFwcGluZy52YWxUb1BldG5hbWUuZ2V0KHB1cnNlKSwgcHVyc2UpLmNhdGNoKFxuICAgICAgICAgIGUgPT4gY29uc29sZS5lcnJvcignY2Fubm90IHVwZGF0ZVN0YXRlJywgZSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZmFpbChyZWFzb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgZmFpbGVkIHVwZGF0ZVN0YXRlIG9ic2VydmVyYCwgcmVhc29uKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGV0bmFtZUZvclB1cnNlO1xuICB9O1xuXG4gIC8vXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlRW1wdHlQdXJzZSA9IChcbiAgICBicmFuZFBldG5hbWUsXG4gICAgcGV0bmFtZUZvclB1cnNlLFxuICAgIGRlZmF1bHRBdXRvRGVwb3NpdCA9IHRydWUsXG4gICkgPT5cbiAgICBpbnRlcm5hbFVuc2FmZUltcG9ydFB1cnNlKFxuICAgICAgYnJhbmRQZXRuYW1lLFxuICAgICAgcGV0bmFtZUZvclB1cnNlLFxuICAgICAgZGVmYXVsdEF1dG9EZXBvc2l0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICk7XG5cbiAgLypcblxuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBkZXBvc2l0KHB1cnNlUGV0bmFtZSwgcGF5bWVudCkge1xuICAgIGNvbnN0IHB1cnNlID0gcHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQocHVyc2VQZXRuYW1lKTtcbiAgICByZXR1cm4gRShwdXJzZSkuZGVwb3NpdChwYXltZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFB1cnNlcygpIHtcbiAgICByZXR1cm4gWy4uLnB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZW50cmllcygpXTtcbiAgfVxuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBmdW5jdGlvbiBnZXRQdXJzZShwdXJzZVBldG5hbWUpIHtcbiAgICByZXR1cm4gcHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQocHVyc2VQZXRuYW1lKTtcbiAgfVxuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBmdW5jdGlvbiBnZXRQdXJzZUlzc3VlcihwdXJzZVBldG5hbWUpIHtcbiAgICBjb25zdCBwdXJzZSA9IHB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHB1cnNlUGV0bmFtZSk7XG4gICAgY29uc3QgYnJhbmQgPSBwdXJzZVRvQnJhbmQuZ2V0KHB1cnNlKTtcbiAgICBjb25zdCB7IGlzc3VlciB9ID0gYnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKTtcbiAgICByZXR1cm4gaXNzdWVyO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgZnVuY3Rpb24gZ2V0T2ZmZXJzKHsgb3JpZ2luID0gbnVsbCB9ID0ge30pIHtcbiAgICAvL1xuICAgIHJldHVybiBbLi4uaWRUb09mZmVyLmVudHJpZXMoKV1cbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbX2lkLCBvZmZlcl0pID0+XG4gICAgICAgICAgb3JpZ2luID09PSBudWxsIHx8XG4gICAgICAgICAgKG9mZmVyLnJlcXVlc3RDb250ZXh0ICYmIG9mZmVyLnJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW4gPT09IG9yaWdpbiksXG4gICAgICApXG4gICAgICAuc29ydCgoW2lkMV0sIFtpZDJdKSA9PiBjbXAoaWQxLCBpZDIpKVxuICAgICAgLm1hcCgoW19pZCwgb2ZmZXJdKSA9PiBoYXJkZW4ob2ZmZXIpKTtcbiAgfVxuXG4gIGNvbnN0IGNvbXBpbGVQcm9wb3NhbCA9IHByb3Bvc2FsVGVtcGxhdGUgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHdhbnQgPSBoYXJkZW4oe30pLFxuICAgICAgZ2l2ZSA9IGhhcmRlbih7fSksXG4gICAgICBleGl0ID0geyBvbkRlbWFuZDogbnVsbCB9LFxuICAgICAgYXJndW1lbnRzOiBhcmdzLFxuICAgIH0gPSBwcm9wb3NhbFRlbXBsYXRlO1xuXG4gICAgY29uc3QgcHVyc2VLZXl3b3JkUmVjb3JkID0ge307XG5cbiAgICBjb25zdCBjb21waWxlID0gYW1vdW50S2V5d29yZFJlY29yZCA9PiB7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhhbW91bnRLZXl3b3JkUmVjb3JkKS5tYXAoXG4gICAgICAgICAgKFtrZXl3b3JkLCB7IHB1cnNlUGV0bmFtZSwgdmFsdWUgfV0pID0+IHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IE5hdCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwdXJzZSA9IGdldFB1cnNlKHB1cnNlUGV0bmFtZSk7XG4gICAgICAgICAgICBwdXJzZUtleXdvcmRSZWNvcmRba2V5d29yZF0gPSBwdXJzZTtcbiAgICAgICAgICAgIGNvbnN0IGJyYW5kID0gcHVyc2VUb0JyYW5kLmdldChwdXJzZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBba2V5d29yZCwgeyBicmFuZCwgdmFsdWUgfV07XG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IHByb3Bvc2FsID0ge1xuICAgICAgd2FudDogY29tcGlsZSh3YW50KSxcbiAgICAgIGdpdmU6IGNvbXBpbGUoZ2l2ZSksXG4gICAgICBleGl0LFxuICAgIH07XG5cbiAgICByZXR1cm4geyBwcm9wb3NhbCwgYXJndW1lbnRzOiBhcmdzLCBwdXJzZUtleXdvcmRSZWNvcmQgfTtcbiAgfTtcblxuICBjb25zdCBjb21waWxlT2ZmZXIgPSBhc3luYyBvZmZlciA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcHJvcG9zYWwsXG4gICAgICBwdXJzZUtleXdvcmRSZWNvcmQsXG4gICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgfSA9IGNvbXBpbGVQcm9wb3NhbChvZmZlci5wcm9wb3NhbFRlbXBsYXRlKTtcblxuICAgIGNvbnN0IHpvZUlzc3VlciA9IGlzc3Vlck1hbmFnZXIuZ2V0KFpPRV9JTlZJVEVfQlJBTkRfUEVUTkFNRSk7XG4gICAgY29uc3QgeyBicmFuZDogaW52aXRhdGlvbkJyYW5kIH0gPSBicmFuZFRhYmxlLmdldEJ5SXNzdWVyKHpvZUlzc3Vlcik7XG4gICAgY29uc3QgaW52aXRhdGlvblAgPSBmaW5kT3JNYWtlSW52aXRhdGlvbihcbiAgICAgIGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQsXG4gICAgICBib2FyZCxcbiAgICAgIHpvZSxcbiAgICAgIHpvZUludml0ZVB1cnNlLFxuICAgICAgaW52aXRhdGlvbkJyYW5kLFxuICAgICAgb2ZmZXIsXG4gICAgKTtcblxuICAgIGNvbnN0IGludml0YXRpb25EZXRhaWxzID0gYXdhaXQgRSh6b2UpLmdldEludml0YXRpb25EZXRhaWxzKGludml0YXRpb25QKTtcbiAgICBjb25zdCB7IGluc3RhbGxhdGlvbiwgaW5zdGFuY2UgfSA9IGludml0YXRpb25EZXRhaWxzO1xuXG4gICAgY29uc3QgY29tcGlsZWQgPSB7XG4gICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgICBwcm9wb3NhbCxcbiAgICAgIGludml0ZVA6IGludml0YXRpb25QLFxuICAgICAgcHVyc2VLZXl3b3JkUmVjb3JkLFxuICAgICAgaW52aXRhdGlvbkRldGFpbHMsXG4gICAgICBpbnN0YWxsYXRpb24sXG4gICAgICBpbnN0YW5jZSxcbiAgICB9O1xuICAgIHJldHVybiBjb21waWxlZDtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGRhcHBPcmlnaW5zID0gbWFrZVNjYWxhck1hcFN0b3JlKCdkYXBwT3JpZ2luJyk7XG4gIGNvbnN0IHsgbm90aWZpZXI6IGRhcHBzTm90aWZpZXIsIHVwZGF0ZXI6IGRhcHBzVXBkYXRlciB9ID1cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChtYWtlTm90aWZpZXJLaXQoW10pKTtcblxuICBjb25zdCB1cGRhdGVEYXBwID0gZGFwcFJlY29yZCA9PiB7XG4gICAgaGFyZGVuKGFkZE1ldGEoZGFwcFJlY29yZCkpO1xuICAgIGRhcHBPcmlnaW5zLnNldChkYXBwUmVjb3JkLm9yaWdpbiwgZGFwcFJlY29yZCk7XG4gICAgZGFwcHNVcGRhdGVyLnVwZGF0ZVN0YXRlKFsuLi5kYXBwT3JpZ2lucy52YWx1ZXMoKV0pO1xuICB9O1xuXG4gIGNvbnN0IGRlbGV0ZURhcHAgPSAoeyBvcmlnaW4gfSkgPT4ge1xuICAgIGRhcHBPcmlnaW5zLmRlbGV0ZShvcmlnaW4pO1xuICAgIGRhcHBzVXBkYXRlci51cGRhdGVTdGF0ZShbLi4uZGFwcE9yaWdpbnMudmFsdWVzKCldKTtcbiAgfTtcblxuICBjb25zdCBzaGFyZWRDYWNoZUNvb3JkaW5hdG9yID0gbWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IoXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKGBzaGFyZWQgY2FjaGVgKSxcbiAgKTtcblxuICBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yRGFwcEFwcHJvdmFsKFxuICAgIHN1Z2dlc3RlZFBldG5hbWUsXG4gICAgb3JpZ2luLFxuICAgIG5vdFlldEVuYWJsZWQgPSAoKSA9PiB7fSxcbiAgKSB7XG4gICAgbGV0IGRhcHBSZWNvcmQ7XG4gICAgaWYgKGRhcHBPcmlnaW5zLmhhcyhvcmlnaW4pKSB7XG4gICAgICBkYXBwUmVjb3JkID0gZGFwcE9yaWdpbnMuZ2V0KG9yaWdpbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCByZXNvbHZlO1xuICAgICAgbGV0IHJlamVjdDtcbiAgICAgIGxldCBhcHByb3ZhbFA7XG5cbiAgICAgIGNvbnN0IGNhY2hlQ29vcmRpbmF0b3IgPSBtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvcihcbiAgICAgICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKGBvcmlnaW4gJHtvcmlnaW59IGNhY2hlYCksXG4gICAgICApO1xuICAgICAgZGFwcFJlY29yZCA9IGFkZE1ldGEoe1xuICAgICAgICBzdWdnZXN0ZWRQZXRuYW1lLFxuICAgICAgICBwZXRuYW1lOiBzdWdnZXN0ZWRQZXRuYW1lLFxuICAgICAgICBvcmlnaW4sXG4gICAgICAgIGNhY2hlQ29vcmRpbmF0b3IsXG4gICAgICAgIGFwcHJvdmFsUCxcbiAgICAgICAgZW5hYmxlOiBmYWxzZSxcbiAgICAgICAgYWN0aW9uczogRmFyKCdkYXBwLmFjdGlvbnMnLCB7XG4gICAgICAgICAgc2V0UGV0bmFtZShwZXRuYW1lKSB7XG4gICAgICAgICAgICBpZiAoZGFwcFJlY29yZC5wZXRuYW1lID09PSBwZXRuYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkYXBwUmVjb3JkLmFjdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWRnZU1hcHBpbmcudmFsVG9QZXRuYW1lLmhhcyhvcmlnaW4pKSB7XG4gICAgICAgICAgICAgIGVkZ2VNYXBwaW5nLnJlbmFtZVBldG5hbWUocGV0bmFtZSwgb3JpZ2luKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBldG5hbWUgPSBlZGdlTWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lLCBvcmlnaW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGFwcFJlY29yZCA9IGFkZE1ldGEoe1xuICAgICAgICAgICAgICAuLi5kYXBwUmVjb3JkLFxuICAgICAgICAgICAgICBwZXRuYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1cGRhdGVEYXBwKGRhcHBSZWNvcmQpO1xuICAgICAgICAgICAgdm9pZCB1cGRhdGVBbGxTdGF0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGRhcHBSZWNvcmQuYWN0aW9ucztcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVuYWJsZSgpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBkYXBwUmVjb3JkID0gYWRkTWV0YSh7XG4gICAgICAgICAgICAgIC4uLmRhcHBSZWNvcmQsXG4gICAgICAgICAgICAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWRnZU1hcHBpbmcuc3VnZ2VzdFBldG5hbWUoZGFwcFJlY29yZC5wZXRuYW1lLCBvcmlnaW4pO1xuICAgICAgICAgICAgdXBkYXRlRGFwcChkYXBwUmVjb3JkKTtcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybiBkYXBwUmVjb3JkLmFjdGlvbnM7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkaXNhYmxlKHJlYXNvbiA9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGlmIChyZWplY3QpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgKHsgcmVzb2x2ZSwgcmVqZWN0LCBwcm9taXNlOiBhcHByb3ZhbFAgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuICAgICAgICAgICAgZGFwcFJlY29yZCA9IGFkZE1ldGEoe1xuICAgICAgICAgICAgICAuLi5kYXBwUmVjb3JkLFxuICAgICAgICAgICAgICBlbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBhcHByb3ZhbFAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZURhcHAoZGFwcFJlY29yZCk7XG4gICAgICAgICAgICByZXR1cm4gZGFwcFJlY29yZC5hY3Rpb25zO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVsZXRlKCkge1xuICAgICAgICAgICAgaWYgKHJlamVjdCkge1xuICAgICAgICAgICAgICByZWplY3QoJ0RhcHAgZGVsZXRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlRGFwcChkYXBwUmVjb3JkKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICAvL1xuICAgICAgZGFwcE9yaWdpbnMuaW5pdChvcmlnaW4sIGRhcHBSZWNvcmQpO1xuXG4gICAgICAvL1xuICAgICAgZGFwcFJlY29yZC5hY3Rpb25zLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhcHBSZWNvcmQuZW5hYmxlKSB7XG4gICAgICBub3RZZXRFbmFibGVkKCk7XG4gICAgfVxuICAgIGF3YWl0IGRhcHBSZWNvcmQuYXBwcm92YWxQO1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gZGFwcE9yaWdpbnMuZ2V0KG9yaWdpbik7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBhZGRPZmZlcihyYXdPZmZlciwgcmVxdWVzdENvbnRleHQgPSB7fSkge1xuICAgIGNvbnN0IGRhcHBPcmlnaW4gPVxuICAgICAgcmVxdWVzdENvbnRleHQuZGFwcE9yaWdpbiB8fCByZXF1ZXN0Q29udGV4dC5vcmlnaW4gfHwgJ3Vua25vd24nO1xuICAgIGNvbnN0IHsgaWQ6IHJhd0lkIH0gPSByYXdPZmZlcjtcbiAgICBjb25zdCBpZCA9IG1ha2VJZChkYXBwT3JpZ2luLCByYXdJZCk7XG4gICAgY29uc3Qgb2ZmZXIgPSBoYXJkZW4oXG4gICAgICBhZGRNZXRhKHtcbiAgICAgICAgLi4ucmF3T2ZmZXIsXG4gICAgICAgIHJhd0lkLFxuICAgICAgICBpZCxcbiAgICAgICAgcmVxdWVzdENvbnRleHQ6IHsgLi4ucmVxdWVzdENvbnRleHQsIGRhcHBPcmlnaW4gfSxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9KSxcbiAgICApO1xuICAgIGlkVG9PZmZlci5pbml0KGlkLCBvZmZlcik7XG4gICAgaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdC5pbml0KGlkLCBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICBhd2FpdCB1cGRhdGVJbmJveFN0YXRlKGlkLCBvZmZlcik7XG5cbiAgICAvL1xuICAgIGNvbnN0IGNvbXBpbGVkT2ZmZXJQID0gY29tcGlsZU9mZmVyKG9mZmVyKTtcbiAgICBpZFRvQ29tcGlsZWRPZmZlclAuc2V0KGlkLCBjb21waWxlZE9mZmVyUCk7XG5cbiAgICAvL1xuICAgIGF3YWl0IHVwZGF0ZUluYm94U3RhdGUoaWQsIGlkVG9PZmZlci5nZXQoaWQpKTtcbiAgICBjb25zdCB7IGluc3RhbGxhdGlvbiwgaW5zdGFuY2UsIGludml0YXRpb25EZXRhaWxzIH0gPSBhd2FpdCBjb21waWxlZE9mZmVyUDtcblxuICAgIGlmICghaWRUb09mZmVyLmhhcyhpZCkpIHtcbiAgICAgIHJldHVybiByYXdJZDtcbiAgICB9XG4gICAgaWRUb09mZmVyLnNldChcbiAgICAgIGlkLFxuICAgICAgaGFyZGVuKFxuICAgICAgICBhZGRNZXRhKHtcbiAgICAgICAgICAuLi5pZFRvT2ZmZXIuZ2V0KGlkKSxcbiAgICAgICAgICBpbnN0YWxsYXRpb24sXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgaW52aXRhdGlvbkRldGFpbHMsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuICAgIGF3YWl0IHVwZGF0ZUluYm94U3RhdGUoaWQsIGlkVG9PZmZlci5nZXQoaWQpKTtcbiAgICByZXR1cm4gcmF3SWQ7XG4gIH1cblxuICBmdW5jdGlvbiBjb25zdW1tYXRlZChvZmZlcikge1xuICAgIGlmIChvZmZlci5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChvZmZlci5hY3Rpb25zKSB7XG4gICAgICBFKG9mZmVyLmFjdGlvbnMpLmhhbmRsZWQob2ZmZXIpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkZWNsaW5lT2ZmZXIoaWQpIHtcbiAgICBjb25zdCBvZmZlciA9IGlkVG9PZmZlci5nZXQoaWQpO1xuICAgIGlmIChjb25zdW1tYXRlZChvZmZlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvL1xuICAgIGNvbnN0IGRlY2xpbmVkT2ZmZXIgPSBhZGRNZXRhKHtcbiAgICAgIC4uLm9mZmVyLFxuICAgICAgc3RhdHVzOiAnZGVjbGluZScsXG4gICAgfSk7XG4gICAgaWRUb09mZmVyLnNldChpZCwgZGVjbGluZWRPZmZlcik7XG4gICAgdm9pZCB1cGRhdGVJbmJveFN0YXRlKGlkLCBkZWNsaW5lZE9mZmVyKTtcblxuICAgIC8vXG4gICAgY29uc3QgY29tcGlsZWRPZmZlclAgPSBpZFRvQ29tcGlsZWRPZmZlclAuZ2V0KGlkKTtcbiAgICBpZiAoIWNvbXBpbGVkT2ZmZXJQKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgYWRkUGF5bWVudChFLmdldChjb21waWxlZE9mZmVyUCkuaW52aXRlUCkuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjYW5jZWxPZmZlcihpZCkge1xuICAgIGNvbnN0IGNvbXBsZXRlRm4gPSBpZFRvQ29tcGxldGUuZ2V0KGlkKTtcbiAgICBpZiAoIWNvbXBsZXRlRm4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb21wbGV0ZUZuKClcbiAgICAgIC50aGVuKF8gPT4ge1xuICAgICAgICBpZFRvQ29tcGxldGUuZGVsZXRlKGlkKTtcbiAgICAgICAgY29uc3Qgb2ZmZXIgPSBpZFRvT2ZmZXIuZ2V0KGlkKTtcbiAgICAgICAgY29uc3QgY2FuY2VsbGVkT2ZmZXIgPSBhZGRNZXRhKHtcbiAgICAgICAgICAuLi5vZmZlcixcbiAgICAgICAgICBzdGF0dXM6ICdjYW5jZWwnLFxuICAgICAgICB9KTtcbiAgICAgICAgaWRUb09mZmVyLnNldChpZCwgY2FuY2VsbGVkT2ZmZXIpO1xuICAgICAgICByZXR1cm4gdXBkYXRlSW5ib3hTdGF0ZShpZCwgY2FuY2VsbGVkT2ZmZXIpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjYW5jZWwgb2ZmZXIgJHtpZH06YCwgZSkpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBhY2NlcHRPZmZlcihpZCkge1xuICAgIGNvbnN0IG9mZmVyID0gaWRUb09mZmVyLmdldChpZCk7XG4gICAgaWYgKGNvbnN1bW1hdGVkKG9mZmVyKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCByZXQgPSB7fTtcbiAgICBsZXQgYWxyZWFkeVJlc29sdmVkID0gZmFsc2U7XG4gICAgY29uc3QgcmVqZWN0ZWQgPSBlID0+IHtcbiAgICAgIGlmIChhbHJlYWR5UmVzb2x2ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVqZWN0T2ZmZXIgPSBhZGRNZXRhKHtcbiAgICAgICAgLi4ub2ZmZXIsXG4gICAgICAgIHN0YXR1czogJ3JlamVjdGVkJyxcbiAgICAgICAgZXJyb3I6IGAke2V9YCxcbiAgICAgIH0pO1xuICAgICAgaWRUb09mZmVyLnNldChpZCwgcmVqZWN0T2ZmZXIpO1xuICAgICAgdm9pZCB1cGRhdGVJbmJveFN0YXRlKGlkLCByZWplY3RPZmZlcik7XG4gICAgfTtcblxuICAgIGF3YWl0IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlbmRpbmdPZmZlciA9IGFkZE1ldGEoe1xuICAgICAgICAuLi5vZmZlcixcbiAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICB9KTtcbiAgICAgIGlkVG9PZmZlci5zZXQoaWQsIHBlbmRpbmdPZmZlcik7XG4gICAgICB2b2lkIHVwZGF0ZUluYm94U3RhdGUoaWQsIHBlbmRpbmdPZmZlcik7XG4gICAgICBjb25zdCBjb21waWxlZE9mZmVyID0gYXdhaXQgaWRUb0NvbXBpbGVkT2ZmZXJQLmdldChpZCk7XG5cbiAgICAgIGNvbnN0IHsgZGVwb3NpdGVkUCwgc2VhdCB9ID0gYXdhaXQgZXhlY3V0ZU9mZmVyKGNvbXBpbGVkT2ZmZXIpO1xuXG4gICAgICBpZFRvQ29tcGxldGUuc2V0KGlkLCAoKSA9PiB7XG4gICAgICAgIGFscmVhZHlSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBFKHNlYXQpLnRyeUV4aXQoKTtcbiAgICAgIH0pO1xuICAgICAgaWRUb1NlYXQuc2V0KGlkLCBzZWF0KTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgdm9pZCBFKHNlYXQpXG4gICAgICAgIC5oYXNFeGl0ZWQoKVxuICAgICAgICAudGhlbihleGl0ZWQgPT4ge1xuICAgICAgICAgIGlmICghZXhpdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlVG9VcGRhdGVzKGlkLCBzZWF0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvZmZlclJlc3VsdFAgPSBFKHNlYXQpLmdldE9mZmVyUmVzdWx0KCk7XG4gICAgICBpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LmdldChpZCkucmVzb2x2ZShvZmZlclJlc3VsdFApO1xuXG4gICAgICByZXQgPSB7XG4gICAgICAgIGRlcG9zaXRlZFAsXG4gICAgICAgIGRhcHBDb250ZXh0OiBvZmZlci5kYXBwQ29udGV4dCxcbiAgICAgIH07XG5cbiAgICAgIC8vXG4gICAgICBkZXBvc2l0ZWRQXG4gICAgICAgIC50aGVuKF8gPT4ge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgaWYgKCFhbHJlYWR5UmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIGFscmVhZHlSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBhY2NlcHRlZE9mZmVyID0gYWRkTWV0YSh7XG4gICAgICAgICAgICAgIC4uLnBlbmRpbmdPZmZlcixcbiAgICAgICAgICAgICAgc3RhdHVzOiAnYWNjZXB0JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWRUb09mZmVyLnNldChpZCwgYWNjZXB0ZWRPZmZlcik7XG4gICAgICAgICAgICB2b2lkIHVwZGF0ZUluYm94U3RhdGUoaWQsIGFjY2VwdGVkT2ZmZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKHJlamVjdGVkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAob2ZmZXIuYWN0aW9ucykge1xuICAgICAgICBFKG9mZmVyLmFjdGlvbnMpLmVycm9yKG9mZmVyLCBlKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdGVkKGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaWRUb1BheW1lbnRSZWNvcmQgPSBtYWtlU2NhbGFyTWFwU3RvcmUoJ3BheW1lbnRJZCcpO1xuICBjb25zdCB7IHVwZGF0ZXI6IHBheW1lbnRzVXBkYXRlciwgbm90aWZpZXI6IHBheW1lbnRzTm90aWZpZXIgfSA9XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAobWFrZU5vdGlmaWVyS2l0KFtdKSk7XG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IHVwZGF0ZVBheW1lbnRSZWNvcmQgPSAoeyBhY3Rpb25zLCAuLi5wcmVEaXNwbGF5IH0pID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgZGVsZXRlIHByZURpc3BsYXkuZGlzcGxheVBheW1lbnQ7XG4gICAgY29uc3QgZGlzcGxheVBheW1lbnQgPSBmaWxsSW5TbG90cyhkZWh5ZHJhdGUoaGFyZGVuKHByZURpc3BsYXkpKSk7XG4gICAgY29uc3QgcGF5bWVudFJlY29yZCA9IGFkZE1ldGEoe1xuICAgICAgLi4ucHJlRGlzcGxheSxcbiAgICAgIGFjdGlvbnMsXG4gICAgICBkaXNwbGF5UGF5bWVudCxcbiAgICB9KTtcbiAgICBjb25zdCB7IGlkIH0gPSBwYXltZW50UmVjb3JkLm1ldGE7XG4gICAgaWRUb1BheW1lbnRSZWNvcmQuc2V0KGlkLCBoYXJkZW4ocGF5bWVudFJlY29yZCkpO1xuICAgIHBheW1lbnRzVXBkYXRlci51cGRhdGVTdGF0ZShbcGF5bWVudFJlY29yZF0pO1xuICB9O1xuXG4gIGNvbnN0IG1ha2VQYXltZW50QWN0aW9uc0ZvcklkID0gaWQgPT5cbiAgICBtYWtlUGF5bWVudEFjdGlvbnMoe1xuICAgICAgZ2V0UmVjb3JkOiAoKSA9PiBpZFRvUGF5bWVudFJlY29yZC5nZXQoaWQpLFxuICAgICAgdXBkYXRlUmVjb3JkOiAocmVjb3JkLCB3aXRob3V0TWV0YSA9IHt9KSA9PiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHVwZGF0ZVBheW1lbnRSZWNvcmQoeyAuLi53aXRob3V0TWV0YSwgLi4uYWRkTWV0YShyZWNvcmQpIH0pO1xuICAgICAgfSxcbiAgICAgIGdldEJyYW5kUmVjb3JkOiBicmFuZCA9PlxuICAgICAgICBicmFuZFRhYmxlLmhhc0J5QnJhbmQoYnJhbmQpICYmIGJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCksXG4gICAgICBnZXRQdXJzZUJ5UGV0bmFtZTogcGV0bmFtZSA9PiBwdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKSxcbiAgICAgIGdldEF1dG9EZXBvc2l0UHVyc2U6IGIgPT5cbiAgICAgICAgYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuaGFzKGIpXG4gICAgICAgICAgPyBicmFuZFRvQXV0b0RlcG9zaXRQdXJzZS5nZXQoYilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGdldElzc3VlckJvYXJkSWQ6IGlzc3VlclRvQm9hcmRJZC5nZXQsXG4gICAgfSk7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBhZGRQYXltZW50ID0gYXN5bmMgKHBheW1lbnRQLCBkZXBvc2l0VG8gPSB1bmRlZmluZWQpID0+IHtcbiAgICAvL1xuICAgIGNvbnN0IFtwYXltZW50LCBicmFuZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBwYXltZW50UCxcbiAgICAgIEUocGF5bWVudFApLmdldEFsbGVnZWRCcmFuZCgpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgYmFzZVBheW1lbnRSZWNvcmQgPSBhZGRNZXRhKHtcbiAgICAgIHBheW1lbnQsXG4gICAgICBicmFuZCxcbiAgICB9KTtcbiAgICBjb25zdCB7IGlkIH0gPSBiYXNlUGF5bWVudFJlY29yZC5tZXRhO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHBheW1lbnRSZWNvcmQgPSB7XG4gICAgICAuLi5iYXNlUGF5bWVudFJlY29yZCxcbiAgICAgIGFjdGlvbnM6IG1ha2VQYXltZW50QWN0aW9uc0ZvcklkKGlkKSxcbiAgICB9O1xuICAgIGlkVG9QYXltZW50UmVjb3JkLmluaXQoaWQsIGhhcmRlbihwYXltZW50UmVjb3JkKSk7XG5cbiAgICBjb25zdCByZWZyZXNoZWQgPSBhd2FpdCBwYXltZW50UmVjb3JkLmFjdGlvbnMucmVmcmVzaCgpO1xuICAgIGlmICghcmVmcmVzaGVkKSB7XG4gICAgICAvL1xuICAgICAgdXBkYXRlUGF5bWVudFJlY29yZChwYXltZW50UmVjb3JkKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIGF3YWl0IHBheW1lbnRSZWNvcmQuYWN0aW9ucy5kZXBvc2l0KGRlcG9zaXRUbyk7XG4gIH07XG5cbiAgbGV0IHNlbGZDb250YWN0UDtcbiAgYXN5bmMgZnVuY3Rpb24gZ2V0RGVwb3NpdEZhY2V0SWQoX2JyYW5kQm9hcmRJZCkge1xuICAgIC8vXG4gICAgcmV0dXJuIEUuZ2V0KHNlbGZDb250YWN0UCkuZGVwb3NpdEJvYXJkSWQ7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkaXNhYmxlQXV0b0RlcG9zaXQocHVyc2VQZXRuYW1lKSB7XG4gICAgY29uc3QgcHVyc2UgPSBwdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwdXJzZVBldG5hbWUpO1xuICAgIGNvbnN0IGJyYW5kID0gcHVyc2VUb0JyYW5kLmdldChwdXJzZSk7XG4gICAgaWYgKFxuICAgICAgIWJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmhhcyhicmFuZCkgfHxcbiAgICAgIGJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmdldChicmFuZCkgIT09IHB1cnNlXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuZGVsZXRlKGJyYW5kKTtcbiAgICBhd2FpdCB1cGRhdGVBbGxQdXJzZVN0YXRlKCk7XG4gIH1cblxuICBjb25zdCBwZW5kaW5nRW5hYmxlQXV0b0RlcG9zaXRzID0gbWFrZVNjYWxhck1hcFN0b3JlKCdicmFuZCcpO1xuICBhc3luYyBmdW5jdGlvbiBkb0VuYWJsZUF1dG9EZXBvc2l0KHB1cnNlUGV0bmFtZSwgdXBkYXRlU3RhdGUpIHtcbiAgICBjb25zdCBwdXJzZSA9IHB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHB1cnNlUGV0bmFtZSk7XG4gICAgY29uc3QgYnJhbmQgPSBwdXJzZVRvQnJhbmQuZ2V0KHB1cnNlKTtcbiAgICBpZiAoYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuaGFzKGJyYW5kKSkge1xuICAgICAgYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2Uuc2V0KGJyYW5kLCBwdXJzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmluaXQoYnJhbmQsIHB1cnNlKTtcbiAgICB9XG5cbiAgICBhd2FpdCBudWxsO1xuICAgIGlmICh1cGRhdGVTdGF0ZSkge1xuICAgICAgYXdhaXQgdXBkYXRlQWxsUHVyc2VTdGF0ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQID1cbiAgICAgIHBlbmRpbmdFbmFibGVBdXRvRGVwb3NpdHMuaGFzKGJyYW5kKSAmJlxuICAgICAgcGVuZGluZ0VuYWJsZUF1dG9EZXBvc2l0cy5nZXQoYnJhbmQpO1xuICAgIGlmIChwZW5kaW5nUCkge1xuICAgICAgcmV0dXJuIHBlbmRpbmdQO1xuICAgIH1cblxuICAgIGNvbnN0IGJvYXJkSWRQID0gRS5nZXQoc2VsZkNvbnRhY3RQKS5kZXBvc2l0Qm9hcmRJZDtcbiAgICBwZW5kaW5nRW5hYmxlQXV0b0RlcG9zaXRzLmluaXQoYnJhbmQsIGJvYXJkSWRQKTtcbiAgICBjb25zdCBib2FyZElkID0gYXdhaXQgYm9hcmRJZFA7XG4gICAgYnJhbmRUb0RlcG9zaXRGYWNldElkLmluaXQoYnJhbmQsIGJvYXJkSWQpO1xuXG4gICAgaWYgKHVwZGF0ZVN0YXRlKSB7XG4gICAgICBhd2FpdCB1cGRhdGVBbGxQdXJzZVN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiBib2FyZElkUDtcbiAgfVxuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGZ1bmN0aW9uIGFjY2VwdFBldG5hbWUoXG4gICAgYWNjZXB0Rm4sXG4gICAgc3VnZ2VzdGVkUGV0bmFtZSxcbiAgICBib2FyZElkLFxuICAgIGRhcHBPcmlnaW4gPSB1bmRlZmluZWQsXG4gICkge1xuICAgIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgcGV0bmFtZTtcbiAgICBpZiAoZGFwcE9yaWdpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwZXRuYW1lID0gc3VnZ2VzdGVkUGV0bmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZWRnZW5hbWUgPSBlZGdlTWFwcGluZy52YWxUb1BldG5hbWUuZ2V0KGRhcHBPcmlnaW4pO1xuICAgICAgLy9cbiAgICAgIHBldG5hbWUgPSBbZWRnZW5hbWUsIHN1Z2dlc3RlZFBldG5hbWVdO1xuICAgIH1cblxuICAgIHJldHVybiBFKGJvYXJkKVxuICAgICAgLmdldFZhbHVlKGJvYXJkSWQpXG4gICAgICAudGhlbih2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnRleHQuZW5zdXJlQm9hcmRJZChib2FyZElkLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBhY2NlcHRGbihwZXRuYW1lLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qXG5cblxuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBzdWdnZXN0SXNzdWVyKFxuICAgIHN1Z2dlc3RlZFBldG5hbWUsXG4gICAgaXNzdWVyQm9hcmRJZCxcbiAgICBkYXBwT3JpZ2luID0gdW5kZWZpbmVkLFxuICApIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gYWNjZXB0UGV0bmFtZShcbiAgICAgIC8vXG4gICAgICAocGV0bmFtZSwgdmFsdWUpID0+IGFkZElzc3VlcihwZXRuYW1lLCB2YWx1ZSwgdHJ1ZSksXG4gICAgICBzdWdnZXN0ZWRQZXRuYW1lLFxuICAgICAgaXNzdWVyQm9hcmRJZCxcbiAgICAgIGRhcHBPcmlnaW4sXG4gICAgKTtcbiAgfVxuXG4gIC8qXG5cblxuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBzdWdnZXN0SW5zdGFuY2UoXG4gICAgc3VnZ2VzdGVkUGV0bmFtZSxcbiAgICBpbnN0YW5jZUhhbmRsZUJvYXJkSWQsXG4gICAgZGFwcE9yaWdpbiA9IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG5cbiAgICByZXR1cm4gYWNjZXB0UGV0bmFtZShcbiAgICAgIGFkZEluc3RhbmNlLFxuICAgICAgc3VnZ2VzdGVkUGV0bmFtZSxcbiAgICAgIGluc3RhbmNlSGFuZGxlQm9hcmRJZCxcbiAgICAgIGRhcHBPcmlnaW4sXG4gICAgKTtcbiAgfVxuXG4gIC8qXG5cblxuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBzdWdnZXN0SW5zdGFsbGF0aW9uKFxuICAgIHN1Z2dlc3RlZFBldG5hbWUsXG4gICAgaW5zdGFsbGF0aW9uSGFuZGxlQm9hcmRJZCxcbiAgICBkYXBwT3JpZ2luID0gdW5kZWZpbmVkLFxuICApIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gYWNjZXB0UGV0bmFtZShcbiAgICAgIGluc3RhbGxhdGlvbk1hbmFnZXIuYWRkLFxuICAgICAgc3VnZ2VzdGVkUGV0bmFtZSxcbiAgICAgIGluc3RhbGxhdGlvbkhhbmRsZUJvYXJkSWQsXG4gICAgICBkYXBwT3JpZ2luLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCcmFuZChwZXRuYW1lKSB7XG4gICAgY29uc3QgYnJhbmQgPSBicmFuZE1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKTtcbiAgICByZXR1cm4gYnJhbmQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCcmFuZFBldG5hbWVzKGJyYW5kcykge1xuICAgIHJldHVybiBicmFuZHMubWFwKGJyYW5kTWFwcGluZy52YWxUb1BldG5hbWUuZ2V0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlbGZDb250YWN0KCkge1xuICAgIHJldHVybiBzZWxmQ29udGFjdFA7XG4gIH1cblxuICBjb25zdCBtYWtlTWFuYWdlciA9IChwZXRuYW1lTWFwcGluZywgbWFuYWdlclR5cGUpID0+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gRmFyKG1hbmFnZXJUeXBlLCB7XG4gICAgICByZW5hbWU6IGFzeW5jIChwZXRuYW1lLCB0aGluZykgPT4ge1xuICAgICAgICBwZXRuYW1lTWFwcGluZy5yZW5hbWVQZXRuYW1lKHBldG5hbWUsIHRoaW5nKTtcbiAgICAgICAgYXdhaXQgdXBkYXRlQWxsU3RhdGUoKTtcbiAgICAgIH0sXG4gICAgICBnZXQ6IHBldG5hbWVNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQsXG4gICAgICBnZXRBbGw6IHBldG5hbWVNYXBwaW5nLnBldG5hbWVUb1ZhbC5lbnRyaWVzLFxuICAgICAgYWRkOiBhc3luYyAocGV0bmFtZSwgdGhpbmcpID0+IHtcbiAgICAgICAgcGV0bmFtZU1hcHBpbmcuc3VnZ2VzdFBldG5hbWUocGV0bmFtZSwgdGhpbmcpO1xuICAgICAgICBhd2FpdCB1cGRhdGVBbGxTdGF0ZSgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gbWFuYWdlcjtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGluc3RhbGxhdGlvbk1hbmFnZXIgPSBtYWtlTWFuYWdlcihcbiAgICBpbnN0YWxsYXRpb25NYXBwaW5nLFxuICAgICdJbnN0YWxsYXRpb25NYW5hZ2VyJyxcbiAgKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaW5zdGFuY2VNYW5hZ2VyID0gbWFrZU1hbmFnZXIoaW5zdGFuY2VNYXBwaW5nLCAnSW5zdGFuY2VNYW5hZ2VyJyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpc3N1ZXJNYW5hZ2VyID0gRmFyKCdJc3N1ZXJNYW5hZ2VyJywge1xuICAgIHJlbmFtZTogYXN5bmMgKHBldG5hbWUsIGlzc3VlcikgPT4ge1xuICAgICAgYnJhbmRUYWJsZS5oYXNCeUlzc3Vlcihpc3N1ZXIpIHx8XG4gICAgICAgIEZhaWxgaXNzdWVyIGhhcyBub3QgYmVlbiBwcmV2aW91c2x5IGFkZGVkYDtcbiAgICAgIGNvbnN0IGJyYW5kUmVjb3JkID0gYnJhbmRUYWJsZS5nZXRCeUlzc3Vlcihpc3N1ZXIpO1xuICAgICAgYnJhbmRNYXBwaW5nLnJlbmFtZVBldG5hbWUocGV0bmFtZSwgYnJhbmRSZWNvcmQuYnJhbmQpO1xuICAgICAgYXdhaXQgdXBkYXRlQWxsU3RhdGUoKTtcbiAgICB9LFxuICAgIGdldDogcGV0bmFtZSA9PiB7XG4gICAgICBjb25zdCBicmFuZCA9IGJyYW5kTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHBldG5hbWUpO1xuICAgICAgcmV0dXJuIGJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCkuaXNzdWVyO1xuICAgIH0sXG4gICAgZ2V0QWxsOiAoKSA9PiB7XG4gICAgICByZXR1cm4gWy4uLmJyYW5kTWFwcGluZy5wZXRuYW1lVG9WYWwuZW50cmllcygpXS5tYXAoXG4gICAgICAgIChbcGV0bmFtZSwgYnJhbmRdKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBpc3N1ZXIgfSA9IGJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG4gICAgICAgICAgcmV0dXJuIFtwZXRuYW1lLCBpc3N1ZXJdO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFkZDogYXN5bmMgKHBldG5hbWUsIGlzc3VlclApID0+IHtcbiAgICAgIGNvbnN0IHsgYnJhbmQsIGlzc3VlciB9ID0gYXdhaXQgYnJhbmRUYWJsZS5pbml0SXNzdWVyKGlzc3VlclAsIGFkZE1ldGEpO1xuICAgICAgYXdhaXQgaW5pdElzc3VlclRvQm9hcmRJZChpc3N1ZXIsIGJyYW5kKTtcbiAgICAgIGJyYW5kTWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lLCBicmFuZCk7XG4gICAgICBhd2FpdCB1cGRhdGVBbGxJc3N1ZXJzU3RhdGUoKTtcbiAgICB9LFxuICB9KTtcblxuICBmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCkge1xuICAgIHJldHVybiBpbnN0YWxsYXRpb25NYW5hZ2VyO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5zdGFuY2VNYW5hZ2VyKCkge1xuICAgIHJldHVybiBpbnN0YW5jZU1hbmFnZXI7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJc3N1ZXJNYW5hZ2VyKCkge1xuICAgIHJldHVybiBpc3N1ZXJNYW5hZ2VyO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2F2ZU9mZmVyUmVzdWx0KGludml0YXRpb25IYW5kbGUsIG9mZmVyUmVzdWx0KSB7XG4gICAgaW52aXRhdGlvbkhhbmRsZVRvT2ZmZXJSZXN1bHQuaW5pdChpbnZpdGF0aW9uSGFuZGxlLCBvZmZlclJlc3VsdCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRPZmZlclJlc3VsdChpbnZpdGF0aW9uSGFuZGxlKSB7XG4gICAgcmV0dXJuIGludml0YXRpb25IYW5kbGVUb09mZmVyUmVzdWx0LmdldChpbnZpdGF0aW9uSGFuZGxlKTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0VUlOb3RpZmllcihyYXdJZCwgZGFwcE9yaWdpbiA9ICd1bmtub3duJykge1xuICAgIGNvbnN0IGlkID0gbWFrZUlkKGRhcHBPcmlnaW4sIHJhd0lkKTtcbiAgICBjb25zdCBvZmZlclJlc3VsdCA9IGF3YWl0IGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuZ2V0KGlkKS5wcm9taXNlO1xuICAgIGFzc2VydChcbiAgICAgIHBhc3NTdHlsZU9mKG9mZmVyUmVzdWx0KSA9PT0gJ2NvcHlSZWNvcmQnLFxuICAgICAgYG9mZmVyUmVzdWx0IG11c3QgYmUgYSByZWNvcmQgdG8gaGF2ZSBhIHVpTm90aWZpZXJgLFxuICAgICk7XG4gICAgb2ZmZXJSZXN1bHQudWlOb3RpZmllciB8fCBGYWlsYG9mZmVyUmVzdWx0IGRvZXMgbm90IGhhdmUgYSB1aU5vdGlmaWVyYDtcbiAgICByZXR1cm4gb2ZmZXJSZXN1bHQudWlOb3RpZmllcjtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNTdWJzY3JpYmVycyhyYXdJZCwgZGFwcE9yaWdpbiA9ICd1bmtub3duJykge1xuICAgIGNvbnN0IGlkID0gbWFrZUlkKGRhcHBPcmlnaW4sIHJhd0lkKTtcblxuICAgIGNvbnN0IG9mZmVyUmVzdWx0ID0gYXdhaXQgaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdC5nZXQoaWQpLnByb21pc2U7XG4gICAgYXNzZXJ0KFxuICAgICAgcGFzc1N0eWxlT2Yob2ZmZXJSZXN1bHQpID09PSAnY29weVJlY29yZCcsXG4gICAgICBgb2ZmZXJSZXN1bHQgJHtvZmZlclJlc3VsdH0gbXVzdCBiZSBhIHJlY29yZCB0byBoYXZlIHB1YmxpY1N1YnNjcmliZXJzYCxcbiAgICApO1xuXG4gICAgY29uc3QgeyBwdWJsaWNTdWJzY3JpYmVycyB9ID0gb2ZmZXJSZXN1bHQ7XG4gICAgcHVibGljU3Vic2NyaWJlcnMgfHxcbiAgICAgIEZhaWxgb2ZmZXJSZXN1bHQgJHtvZmZlclJlc3VsdH0gZG9lcyBub3QgaGF2ZSBwdWJsaWNTdWJzY3JpYmVyc2A7XG4gICAgcGFzc1N0eWxlT2YocHVibGljU3Vic2NyaWJlcnMpID09PSAnY29weVJlY29yZCcgfHxcbiAgICAgIEZhaWxgcHVibGljU3Vic2NyaWJlcnMgJHtwdWJsaWNTdWJzY3JpYmVyc30gbXVzdCBiZSBhIHJlY29yZGA7XG5cbiAgICByZXR1cm4gcHVibGljU3Vic2NyaWJlcnM7XG4gIH1cblxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljTm90aWZpZXJzKHJhd0lkLCBkYXBwT3JpZ2luID0gJ3Vua25vd24nKSB7XG4gICAgY29uc3QgcHVibGljU3Vic2NyaWJlcnMgPSBhd2FpdCBnZXRQdWJsaWNTdWJzY3JpYmVycyhyYXdJZCwgZGFwcE9yaWdpbik7XG4gICAgcmV0dXJuIG9iamVjdE1hcChwdWJsaWNTdWJzY3JpYmVycywgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuICB9XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgY3JlYXRlUm9vdExvb2t1cHMgPSAoKSA9PiB7XG4gICAgY29uc3Qgcm9vdFBhdGhUb0xvb2t1cCA9IG1ha2VMZWdhY3lNYXAoJ2xvb2t1cHMnKTtcblxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGNvbnN0IG1ha2VMb29rdXAgPSAoa2luZCwgbG9va3VwKSA9PiB7XG4gICAgICByb290UGF0aFRvTG9va3VwLmluaXQoXG4gICAgICAgIGtpbmQsXG4gICAgICAgIEZhcihgJHtraW5kfUxvb2t1cGAsIHtcbiAgICAgICAgICBsb29rdXAsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBldG5hbWVPclBhdGggPVxuICAgICAgbG9va3VwID0+XG4gICAgICAoLi4ucGF0aCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHJldHVybiBsb29rdXAocGF0aFswXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9va3VwKHBhdGgpO1xuICAgICAgfTtcblxuICAgIG1ha2VMb29rdXAoJ2JyYW5kJywgcGV0bmFtZU9yUGF0aChicmFuZE1hcHBpbmcucGV0bmFtZVRvVmFsLmdldCkpO1xuICAgIG1ha2VMb29rdXAoJ2NvbnRhY3QnLCBwZXRuYW1lT3JQYXRoKGNvbnRhY3RNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQpKTtcbiAgICBtYWtlTG9va3VwKCdpc3N1ZXInLCBwZXRuYW1lT3JQYXRoKGlzc3Vlck1hbmFnZXIuZ2V0KSk7XG4gICAgbWFrZUxvb2t1cCgnaW5zdGFuY2UnLCBwZXRuYW1lT3JQYXRoKGluc3RhbmNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KSk7XG4gICAgbWFrZUxvb2t1cChcbiAgICAgICdpbnN0YWxsYXRpb24nLFxuICAgICAgcGV0bmFtZU9yUGF0aChpbnN0YWxsYXRpb25NYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQpLFxuICAgICk7XG4gICAgbWFrZUxvb2t1cCgncHVyc2UnLCBwZXRuYW1lT3JQYXRoKHB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KSk7XG5cbiAgICAvL1xuICAgIGNvbnN0IGlkT25seSA9XG4gICAgICAoa2luZCwgbG9va3VwKSA9PlxuICAgICAgKC4uLnBhdGgpID0+IHtcbiAgICAgICAgcGF0aC5sZW5ndGggPT09IDEgfHxcbiAgICAgICAgICBGYWlsYCR7cShcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgKX0gbG9va3VwIG11c3QgYmUgY2FsbGVkIHdpdGggYSBzaW5nbGUgb2ZmZXIgSUQsIG5vdCAke3BhdGh9YDtcbiAgICAgICAgcmV0dXJuIGxvb2t1cChwYXRoWzBdKTtcbiAgICAgIH07XG4gICAgbWFrZUxvb2t1cCgnb2ZmZXInLCBpZE9ubHkoJ29mZmVyJywgaWRUb09mZmVyLmdldCkpO1xuICAgIG1ha2VMb29rdXAoXG4gICAgICAnb2ZmZXJSZXN1bHQnLFxuICAgICAgaWRPbmx5KCdvZmZlclJlc3VsdCcsIGlkID0+IGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuZ2V0KGlkKS5wcm9taXNlKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJvb3RQYXRoVG9Mb29rdXA7XG4gIH07XG5cbiAgY29uc3QgZmlyc3RQYXRoVG9Mb29rdXAgPSBjcmVhdGVSb290TG9va3VwcygpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXJzaGFsbGVyID0gaGFyZGVuKHtcbiAgICBmcm9tQ2FwRGF0YTogY29udGV4dC5mcm9tQ2FwRGF0YSxcbiAgICB0b0NhcERhdGE6IGNvbnRleHQudG9DYXBEYXRhLFxuICAgIHVuc2VyaWFsaXplOiBjb250ZXh0LmZyb21DYXBEYXRhLFxuICAgIHNlcmlhbGl6ZTogY29udGV4dC50b0NhcERhdGEsXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUFjY2VwdE9mZmVyQWN0aW9uID0gYXN5bmMgb2ZmZXIgPT4ge1xuICAgIGNvbnN0IHsgcmVxdWVzdENvbnRleHQgfSA9IG9mZmVyO1xuICAgIGNvbnN0IHJhd0lkID0gYXdhaXQgYWRkT2ZmZXIob2ZmZXIsIHJlcXVlc3RDb250ZXh0KTtcbiAgICBjb25zdCBkYXBwT3JpZ2luID1cbiAgICAgIHJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW4gfHwgcmVxdWVzdENvbnRleHQub3JpZ2luIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gYWNjZXB0T2ZmZXIoYCR7ZGFwcE9yaWdpbn0jJHtyYXdJZH1gKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWdnZXN0SXNzdWVyQWN0aW9uID0gKHsgcGV0bmFtZSwgYm9hcmRJZCB9KSA9PlxuICAgIHN1Z2dlc3RJc3N1ZXIocGV0bmFtZSwgYm9hcmRJZCk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IHBlcmZvcm1BY3Rpb24gPSBvYmogPT4ge1xuICAgIGNvbnN0IHsgdHlwZSwgZGF0YSB9ID0gSlNPTi5wYXJzZShvYmouc3BlbmRBY3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYWNjZXB0T2ZmZXInOlxuICAgICAgICByZXR1cm4gaGFuZGxlQWNjZXB0T2ZmZXJBY3Rpb24oZGF0YSk7XG4gICAgICBjYXNlICdzdWdnZXN0SXNzdWVyJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZVN1Z2dlc3RJc3N1ZXJBY3Rpb24oZGF0YSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biB3YWxsZXQgYWN0aW9uICR7dHlwZX1gKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgd2FsbGV0ID0gRmFyKCd3YWxsZXQnLCB7XG4gICAgbG9va3VwOiAoLi4ucGF0aCkgPT4ge1xuICAgICAgLy9cbiAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gd2FsbGV0O1xuICAgICAgfVxuICAgICAgY29uc3QgW2ZpcnN0LCAuLi5yZW1haW5pbmddID0gcGF0aDtcbiAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBmaXJzdFBhdGhUb0xvb2t1cC5nZXQoZmlyc3QpO1xuICAgICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gRShmaXJzdFZhbHVlKS5sb29rdXAoLi4ucmVtYWluaW5nKTtcbiAgICB9LFxuICAgIGdldE1hcnNoYWxsZXI6ICgpID0+IG1hcnNoYWxsZXIsXG4gICAgZ2V0RGFwcENhY2hlQ29vcmRpbmF0b3I6IGRhcHBPcmlnaW4gPT5cbiAgICAgIGRhcHBPcmlnaW5zLmdldChkYXBwT3JpZ2luKS5jYWNoZUNvb3JkaW5hdG9yLFxuICAgIGdldENhY2hlQ29vcmRpbmF0b3I6ICgpID0+IHNoYXJlZENhY2hlQ29vcmRpbmF0b3IsXG4gICAgc2F2ZU9mZmVyUmVzdWx0LFxuICAgIGdldE9mZmVyUmVzdWx0LFxuICAgIHdhaXRGb3JEYXBwQXBwcm92YWwsXG4gICAgZ2V0RGFwcHNOb3RpZmllcigpIHtcbiAgICAgIHJldHVybiBkYXBwc05vdGlmaWVyO1xuICAgIH0sXG4gICAgZ2V0UHVyc2VzTm90aWZpZXIoKSB7XG4gICAgICByZXR1cm4gcHVyc2VzTm90aWZpZXI7XG4gICAgfSxcbiAgICBnZXRBdHRlbnVhdGVkUHVyc2VzTm90aWZpZXIoKSB7XG4gICAgICByZXR1cm4gYXR0ZW51YXRlZFB1cnNlc05vdGlmaWVyO1xuICAgIH0sXG4gICAgZ2V0SXNzdWVyc05vdGlmaWVyKCkge1xuICAgICAgcmV0dXJuIGlzc3VlcnNOb3RpZmllcjtcbiAgICB9LFxuICAgIGdldE9mZmVyc05vdGlmaWVyKCkge1xuICAgICAgcmV0dXJuIG9mZmVyc05vdGlmaWVyO1xuICAgIH0sXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgYWRkSXNzdWVyOiBpc3N1ZXJNYW5hZ2VyLmFkZCxcbiAgICBnZXRCcmFuZCxcbiAgICBnZXRCcmFuZFBldG5hbWVzLFxuICAgIHB1Ymxpc2hJc3N1ZXIsXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBhZGRJbnN0YW5jZTogaW5zdGFuY2VNYW5hZ2VyLmFkZCxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBhZGRJbnN0YWxsYXRpb246IGluc3RhbGxhdGlvbk1hbmFnZXIuYWRkLFxuICAgIGdldEluc3RhbGxhdGlvbk1hbmFnZXIsXG4gICAgZ2V0SW5zdGFuY2VNYW5hZ2VyLFxuICAgIGdldElzc3Vlck1hbmFnZXIsXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgcmVuYW1lSXNzdWVyOiBpc3N1ZXJNYW5hZ2VyLnJlbmFtZSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHJlbmFtZUluc3RhbmNlOiBpbnN0YW5jZU1hbmFnZXIucmVuYW1lLFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHJlbmFtZUluc3RhbGxhdGlvbjogaW5zdGFsbGF0aW9uTWFuYWdlci5yZW5hbWUsXG4gICAgZ2V0U2VsZkNvbnRhY3QsXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBnZXRJbnN0YW5jZTogaW5zdGFuY2VNYW5hZ2VyLmdldCxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBnZXRJbnN0YWxsYXRpb246IGluc3RhbGxhdGlvbk1hbmFnZXIuZ2V0LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGdldEluc3RhbGxhdGlvbnM6IGluc3RhbGxhdGlvbk1hbmFnZXIuZ2V0QWxsLFxuICAgIG1ha2VFbXB0eVB1cnNlLFxuICAgIGRlcG9zaXQsXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgZ2V0SXNzdWVyOiBpc3N1ZXJNYW5hZ2VyLmdldCxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBnZXRJc3N1ZXJzOiBpc3N1ZXJNYW5hZ2VyLmdldEFsbCxcbiAgICBnZXRQdXJzZXMsXG4gICAgZ2V0UHVyc2UsXG4gICAgZ2V0UHVyc2VJc3N1ZXIsXG4gICAgYWRkT2ZmZXIsXG4gICAgZGVjbGluZU9mZmVyLFxuICAgIGNhbmNlbE9mZmVyLFxuICAgIGFjY2VwdE9mZmVyLFxuICAgIGdldE9mZmVycyxcbiAgICBnZXRTZWF0OiBpZCA9PiBpZFRvU2VhdC5nZXQoaWQpLFxuICAgIGdldFNlYXRzOiBpZHMgPT4gaWRzLm1hcCh3YWxsZXQuZ2V0U2VhdCksXG4gICAgZW5hYmxlQXV0b0RlcG9zaXQocHVyc2VQZXRuYW1lKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGRvRW5hYmxlQXV0b0RlcG9zaXQocHVyc2VQZXRuYW1lLCB0cnVlKTtcbiAgICB9LFxuICAgIGRpc2FibGVBdXRvRGVwb3NpdCxcbiAgICBwZXJmb3JtQWN0aW9uLFxuICAgIGdldERlcG9zaXRGYWNldElkLFxuICAgIHN1Z2dlc3RJc3N1ZXIsXG4gICAgc3VnZ2VzdEluc3RhbmNlLFxuICAgIHN1Z2dlc3RJbnN0YWxsYXRpb24sXG4gICAgYWRkQ29udGFjdCxcbiAgICBnZXRDb250YWN0c05vdGlmaWVyKCkge1xuICAgICAgcmV0dXJuIGNvbnRhY3RzTm90aWZpZXI7XG4gICAgfSxcbiAgICBhZGRQYXltZW50LFxuICAgIGdldFBheW1lbnRzTm90aWZpZXIoKSB7XG4gICAgICByZXR1cm4gcGF5bWVudHNOb3RpZmllcjtcbiAgICB9LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGdldFVJTm90aWZpZXIsXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgZ2V0UHVibGljTm90aWZpZXJzLFxuICAgIGdldFB1YmxpY1N1YnNjcmliZXJzLFxuICAgIGdldFpvZSgpIHtcbiAgICAgIHJldHVybiB6b2U7XG4gICAgfSxcbiAgICBnZXRCb2FyZCgpIHtcbiAgICAgIHJldHVybiBib2FyZDtcbiAgICB9LFxuICAgIGdldEFnb3JpY05hbWVzKC4uLnBhdGgpIHtcbiAgICAgIGlmICghYWdvcmljTmFtZXMpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBhZ29yaWNOYW1lcyB3YXMgbm90IHN1cHBsaWVkIHRvIHRoZSB3YWxsZXQgbWFrZXJgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEUoYWdvcmljTmFtZXMpLmxvb2t1cCguLi5wYXRoKTtcbiAgICB9LFxuICAgIGdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpIHtcbiAgICAgIGlmIChuYW1lc0J5QWRkcmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHRocm93IEZhaWxgbmFtZXNCeUFkZHJlc3Mgd2FzIG5vdCBzdXBwbGllZCB0byB0aGUgd2FsbGV0IG1ha2VyYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBFKG5hbWVzQnlBZGRyZXNzKS5sb29rdXAoLi4ucGF0aCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaW5pdGlhbGl6ZSA9IGFzeW5jICgpID0+IHtcbiAgICAvL1xuICAgIGNvbnN0IHNlbGZEZXBvc2l0RmFjZXQgPSBGYXIoJ2NvbnRhY3QnLCB7XG4gICAgICByZWNlaXZlKHBheW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGFkZFBheW1lbnQocGF5bWVudCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgYWRkcmVzcyA9IGF3YWl0IEUobXlBZGRyZXNzTmFtZUFkbWluKS5nZXRNeUFkZHJlc3MoKTtcbiAgICAvL1xuICAgIHNlbGZDb250YWN0UCA9IGFkZENvbnRhY3QoJ1NlbGYnLCBzZWxmRGVwb3NpdEZhY2V0LCBhZGRyZXNzKTtcblxuICAgIC8vXG4gICAgY29uc3QgWk9FX0lOVklURV9QVVJTRV9QRVROQU1FID0gJ0RlZmF1bHQgWm9lIGludml0ZSBwdXJzZSc7XG4gICAgY29uc3QgaW52aXRlSXNzdWVyUCA9IEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCk7XG4gICAgY29uc3QgYWRkWm9lSXNzdWVyID0gaXNzdWVyUCA9PlxuICAgICAgaXNzdWVyTWFuYWdlci5hZGQoWk9FX0lOVklURV9CUkFORF9QRVROQU1FLCBpc3N1ZXJQKTtcbiAgICBjb25zdCBtYWtlSW52aXRlUHVyc2UgPSAoKSA9PlxuICAgICAgd2FsbGV0Lm1ha2VFbXB0eVB1cnNlKFpPRV9JTlZJVEVfQlJBTkRfUEVUTkFNRSwgWk9FX0lOVklURV9QVVJTRV9QRVROQU1FKTtcbiAgICBjb25zdCBhZGRJbnZpdGVEZXBvc2l0RmFjZXQgPSAoKSA9PlxuICAgICAgRSh3YWxsZXQpLmVuYWJsZUF1dG9EZXBvc2l0KFpPRV9JTlZJVEVfUFVSU0VfUEVUTkFNRSk7XG5cbiAgICBhd2FpdCBhZGRab2VJc3N1ZXIoaW52aXRlSXNzdWVyUClcbiAgICAgIC50aGVuKG1ha2VJbnZpdGVQdXJzZSlcbiAgICAgIC50aGVuKGFkZEludml0ZURlcG9zaXRGYWNldCk7XG4gICAgem9lSW52aXRlUHVyc2UgPSB3YWxsZXQuZ2V0UHVyc2UoWk9FX0lOVklURV9QVVJTRV9QRVROQU1FKTtcblxuICAgIGF3YWl0IEUobXlBZGRyZXNzTmFtZUFkbWluKS51cGRhdGUoXG4gICAgICBXYWxsZXROYW1lLmRlcG9zaXRGYWNldCxcbiAgICAgIHNlbGZEZXBvc2l0RmFjZXQsXG4gICAgKTtcbiAgfTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBpbXBvcnRCYW5rQXNzZXRzID0gYXN5bmMgYmFuayA9PiB7XG4gICAgdm9pZCBvYnNlcnZlSXRlcmF0aW9uKFxuICAgICAgc3Vic2NyaWJlRWFjaChFKGJhbmspLmdldEFzc2V0U3Vic2NyaXB0aW9uKCkpLFxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgYXN5bmMgdXBkYXRlU3RhdGUoeyBwcm9wb3NlZE5hbWUsIGlzc3Vlck5hbWUsIGlzc3VlciwgYnJhbmQgfSkge1xuICAgICAgICAgIGF3YWl0IG51bGw7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlzc3Vlck5hbWUgPSBhd2FpdCBhZGRJc3N1ZXIoaXNzdWVyTmFtZSwgaXNzdWVyKTtcbiAgICAgICAgICAgIGNvbnN0IHB1cnNlID0gYXdhaXQgRShiYW5rKS5nZXRQdXJzZShicmFuZCk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgYXdhaXQgaW50ZXJuYWxVbnNhZmVJbXBvcnRQdXJzZShcbiAgICAgICAgICAgICAgaXNzdWVyTmFtZSxcbiAgICAgICAgICAgICAgcHJvcG9zZWROYW1lLFxuICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICBwdXJzZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignLy8vIGNvdWxkIG5vdCBhZGQgYmFuayBhc3NldCBwdXJzZScsIGUsIHtcbiAgICAgICAgICAgICAgaXNzdWVyTmFtZSxcbiAgICAgICAgICAgICAgcHJvcG9zZWROYW1lLFxuICAgICAgICAgICAgICBpc3N1ZXIsXG4gICAgICAgICAgICAgIGJyYW5kLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKS5maW5hbGx5KCgpID0+IGNvbnNvbGUuZXJyb3IoJy8vLyBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIGJhbmsgYXNzZXRzJykpO1xuICB9O1xuICByZXR1cm4ge1xuICAgIGFkbWluOiB3YWxsZXQsXG4gICAgaW5pdGlhbGl6ZWQ6IGluaXRpYWxpemUoKSxcbiAgICBpbXBvcnRCYW5rQXNzZXRzLFxuICB9O1xufVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXYWxsZXRSb290IjpbIm1ha2VXYWxsZXRSb290Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD05KccdAwAAHQMAACwAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL3B1YnN1Yi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsgICAgICAgICAgICAgICBmdW5jdGlvbiBtYWtlUHVic3ViKEUpIHtcbiAgbGV0IGxhc3RQdWJsaXNoZWQ7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gW107XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgc3Vic2NyaWJlKHMpIHtcbiAgICAgIHN1YnNjcmliZXJzLnB1c2gocyk7XG4gICAgICBpZiAobGFzdFB1Ymxpc2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIEUocykubm90aWZ5KGxhc3RQdWJsaXNoZWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcHVibGlzaChtKSB7XG4gICAgICBsYXN0UHVibGlzaGVkID0gbTtcbiAgICAgIGZvciAoY29uc3QgcyBvZiBzdWJzY3JpYmVycykge1xuICAgICAgICBFKHMpLm5vdGlmeShtKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn0kaM2PX29uY2UuZGVmYXVsdCggICAgICBtYWtlUHVic3ViKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABVpJe/vEkAALxJAAAsAAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy93YWxsZXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9qcy11dGlscy5qcyIsIkBhZ29yaWMvbm90aWZpZXIiLCIuL2xpYi13YWxsZXQuanMiLCIuL3B1YnN1Yi5qcyIsIi4vYmlnaW50U3RyaW5naWZ5LmpzIiwiLi9kYXRlLW5vdy5qcyIsIi4vaW50ZXJuYWwtdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJidWlsZFJvb3RPYmplY3QiLCJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsZGVlcENvcHlKc29uYWJsZSxtYWtlTm90aWZpZXJLaXQsb2JzZXJ2ZUl0ZXJhdGlvbixtYWtlV2FsbGV0Um9vdCxwdWJzdWIsYmlnaW50U3RyaW5naWZ5LG1ha2VUaW1lckRldmljZURhdGVOb3csbWFrZVRpbWVyU2VydmljZURhdGVOb3c7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2pzLXV0aWxzLmpzXCIsIFtbXCJkZWVwQ29weUpzb25hYmxlXCIsWyRozY9fYSA9PiAoZGVlcENvcHlKc29uYWJsZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllcktpdFwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRozY9fYSldXSxbXCJvYnNlcnZlSXRlcmF0aW9uXCIsWyRozY9fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRozY9fYSldXV1dLFtcIi4vbGliLXdhbGxldC5qc1wiLCBbW1wibWFrZVdhbGxldFJvb3RcIixbJGjNj19hID0+IChtYWtlV2FsbGV0Um9vdCA9ICRozY9fYSldXV1dLFtcIi4vcHVic3ViLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocHVic3ViID0gJGjNj19hKV1dXV0sW1wiLi9iaWdpbnRTdHJpbmdpZnkuanNcIiwgW1tcImJpZ2ludFN0cmluZ2lmeVwiLFskaM2PX2EgPT4gKGJpZ2ludFN0cmluZ2lmeSA9ICRozY9fYSldXV1dLFtcIi4vZGF0ZS1ub3cuanNcIiwgW1tcIm1ha2VUaW1lckRldmljZURhdGVOb3dcIixbJGjNj19hID0+IChtYWtlVGltZXJEZXZpY2VEYXRlTm93ID0gJGjNj19hKV1dLFtcIm1ha2VUaW1lclNlcnZpY2VEYXRlTm93XCIsWyRozY9fYSA9PiAobWFrZVRpbWVyU2VydmljZURhdGVOb3cgPSAkaM2PX2EpXV1dXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShidWlsZFJvb3RPYmplY3QsJ25hbWUnLHt2YWx1ZTpcImJ1aWxkUm9vdE9iamVjdFwifSk7JGjNj19vbmNlLmJ1aWxkUm9vdE9iamVjdChidWlsZFJvb3RPYmplY3QpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuICAgICAgIGZ1bmN0aW9uIGJ1aWxkUm9vdE9iamVjdCh2YXRQb3dlcnMpIHtcbiAgLy9cbiAgY29uc3QgeyBEIH0gPSB2YXRQb3dlcnMgfHwge307XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCB3YWxsZXRSb290O1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCB3YWxsZXRBZG1pbjtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcHVyc2VzU3RhdGUgPSBbXTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGluYm94U3RhdGUgPSBbXTtcbiAgbGV0IGh0dHA7XG5cbiAgY29uc3QgYnJpZGdlSGFuZGxlcyA9IG5ldyBTZXQoKTtcbiAgY29uc3Qgb2ZmZXJTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0IGh0dHBTZW5kID0gKG9iaiwgY2hhbm5lbEhhbmRsZXMpID0+XG4gICAgRShodHRwKS5zZW5kKGRlZXBDb3B5SnNvbmFibGUob2JqKSwgY2hhbm5lbEhhbmRsZXMpO1xuXG4gIGNvbnN0IHB1c2hPZmZlclN1YnNjcmlwdGlvbnMgPSAoY2hhbm5lbEhhbmRsZSwgb2ZmZXJzKSA9PiB7XG4gICAgY29uc3Qgc3VicyA9IG9mZmVyU3Vic2NyaXB0aW9ucy5nZXQoY2hhbm5lbEhhbmRsZSk7XG4gICAgZm9yIChjb25zdCB7IG9yaWdpbiwgc3RhdHVzIH0gb2Ygc3VicyB8fCBbXSkge1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhcmRlbihcbiAgICAgICAgb2ZmZXJzLmZpbHRlcihcbiAgICAgICAgICBvZmZlciA9PlxuICAgICAgICAgICAgKHN0YXR1cyA9PT0gbnVsbCB8fCBvZmZlci5zdGF0dXMgPT09IHN0YXR1cykgJiZcbiAgICAgICAgICAgIG9mZmVyLnJlcXVlc3RDb250ZXh0ICYmXG4gICAgICAgICAgICBvZmZlci5yZXF1ZXN0Q29udGV4dC5vcmlnaW4gPT09IG9yaWdpbixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBodHRwU2VuZChcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd3YWxsZXRPZmZlckRlc2NyaXB0aW9ucycsXG4gICAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgICB9LFxuICAgICAgICBbY2hhbm5lbEhhbmRsZV0sXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzdWJzY3JpYmVUb09mZmVycyA9IChjaGFubmVsSGFuZGxlLCB7IG9yaWdpbiwgc3RhdHVzID0gbnVsbCB9KSA9PiB7XG4gICAgbGV0IHN1YnMgPSBvZmZlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWxIYW5kbGUpO1xuICAgIGlmICghc3Vicykge1xuICAgICAgc3VicyA9IFtdO1xuICAgICAgb2ZmZXJTdWJzY3JpcHRpb25zLnNldChjaGFubmVsSGFuZGxlLCBzdWJzKTtcbiAgICB9XG4gICAgc3Vicy5wdXNoKHsgb3JpZ2luLCBzdGF0dXMgfSk7XG4gICAgcHVzaE9mZmVyU3Vic2NyaXB0aW9ucyhjaGFubmVsSGFuZGxlLCBpbmJveFN0YXRlKTtcbiAgfTtcblxuICBjb25zdCB7IHB1Ymxpc2g6IHB1cnNlc1B1Ymxpc2gsIHN1YnNjcmliZTogcHVyc2VzU3Vic2NyaWJlIH0gPSBwdWJzdWIoRSk7XG4gIGNvbnN0IHsgdXBkYXRlcjogaW5ib3hVcGRhdGVyLCBub3RpZmllcjogb2ZmZXJOb3RpZmllciB9ID1cbiAgICBtYWtlTm90aWZpZXJLaXQoaW5ib3hTdGF0ZSk7XG4gIGNvbnN0IHsgcHVibGlzaDogaW5ib3hQdWJsaXNoLCBzdWJzY3JpYmU6IGluYm94U3Vic2NyaWJlIH0gPSBwdWJzdWIoRSk7XG5cbiAgY29uc3Qgbm90aWZpZXJzID0gaGFyZGVuKHtcbiAgICBnZXRJbmJveE5vdGlmaWVyKCkge1xuICAgICAgcmV0dXJuIG9mZmVyTm90aWZpZXI7XG4gICAgfSxcbiAgfSk7XG5cbiAgLypcblxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gc3RhcnR1cCh7XG4gICAgem9lLFxuICAgIGJvYXJkLFxuICAgIGFnb3JpY05hbWVzLFxuICAgIG5hbWVzQnlBZGRyZXNzLFxuICAgIG15QWRkcmVzc05hbWVBZG1pbixcbiAgICB0aW1lckRldmljZSxcbiAgICB0aW1lckRldmljZVNjYWxlLFxuICAgIGxvY2FsVGltZXJTZXJ2aWNlLFxuICAgIGxvY2FsVGltZXJQb2xsSW50ZXJ2YWwsXG4gIH0pIHtcbiAgICBhc3NlcnQobXlBZGRyZXNzTmFtZUFkbWluLCAnbWlzc2luZyBteUFkZHJlc3NOYW1lQWRtaW4nKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBkYXRlTm93UDtcbiAgICBpZiAodGltZXJEZXZpY2UpIHtcbiAgICAgIGRhdGVOb3dQID0gbWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyhELCB0aW1lckRldmljZSwgdGltZXJEZXZpY2VTY2FsZSk7XG4gICAgfVxuICAgIGlmIChsb2NhbFRpbWVyU2VydmljZSkge1xuICAgICAgZGF0ZU5vd1AgPSBtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyhcbiAgICAgICAgbG9jYWxUaW1lclNlcnZpY2UsXG4gICAgICAgIGxvY2FsVGltZXJQb2xsSW50ZXJ2YWwsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGVOb3cgPSBhd2FpdCBkYXRlTm93UDtcbiAgICBjb25zdCB3ID0gbWFrZVdhbGxldFJvb3Qoe1xuICAgICAgYWdvcmljTmFtZXMsXG4gICAgICBuYW1lc0J5QWRkcmVzcyxcbiAgICAgIG15QWRkcmVzc05hbWVBZG1pbixcbiAgICAgIHpvZSxcbiAgICAgIGJvYXJkLFxuICAgICAgcHVyc2VzU3RhdGVDaGFuZ2VIYW5kbGVyOiBwdXJzZXNQdWJsaXNoLFxuICAgICAgaW5ib3hTdGF0ZUNoYW5nZUhhbmRsZXI6IGluYm94UHVibGlzaCxcbiAgICAgIGRhdGVOb3csXG4gICAgfSk7XG4gICAgY29uc29sZS5kZWJ1Zygnd2FpdGluZyBmb3Igd2FsbGV0IHRvIGluaXRpYWxpemUnKTtcbiAgICBhd2FpdCB3LmluaXRpYWxpemVkO1xuICAgIGNvbnNvbGUuZGVidWcoJ3dhbGxldCBpbml0aWFsaXplZCcpO1xuICAgIHdhbGxldEFkbWluID0gdy5hZG1pbjtcbiAgICB3YWxsZXRSb290ID0gdztcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlQnJpZGdlID0gKGFwcHJvdmUsIGRhcHBPcmlnaW4sIG1ldGEgPSB7fSkgPT4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uKiBtYWtlQXBwcm92ZWROb3RpZmllcihzb3VyY2VOb3RpZmllcikge1xuICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBzdGF0ZSBvZiBzb3VyY2VOb3RpZmllcikge1xuICAgICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICAgIHlpZWxkIHN0YXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBoYXJkZW4obWFrZUFwcHJvdmVkTm90aWZpZXIpO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgYnJpZGdlID0gRmFyKCdicmlkZ2UnLCB7XG4gICAgICBhc3luYyBnZXRQdXJzZXNOb3RpZmllcigpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICBjb25zdCBwdXJzZXNOb3RpZmllciA9IHdhbGxldEFkbWluLmdldEF0dGVudWF0ZWRQdXJzZXNOb3RpZmllcigpO1xuICAgICAgICBjb25zdCB7IG5vdGlmaWVyLCB1cGRhdGVyIH0gPSBtYWtlTm90aWZpZXJLaXQoKTtcbiAgICAgICAgdm9pZCBvYnNlcnZlSXRlcmF0aW9uKG1ha2VBcHByb3ZlZE5vdGlmaWVyKHB1cnNlc05vdGlmaWVyKSwgdXBkYXRlcik7XG4gICAgICAgIHJldHVybiBub3RpZmllcjtcbiAgICAgIH0sXG4gICAgICBhc3luYyBnZXRDYWNoZUNvb3JkaW5hdG9yKCkge1xuICAgICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXREYXBwQ2FjaGVDb29yZGluYXRvcihkYXBwT3JpZ2luKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBnZXRJc3N1ZXJzTm90aWZpZXIoKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldElzc3VlcnNOb3RpZmllcigpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGFkZE9mZmVyKG9mZmVyKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmFkZE9mZmVyKG9mZmVyLCB7IC4uLm1ldGEsIGRhcHBPcmlnaW4gfSk7XG4gICAgICB9LFxuICAgICAgYXN5bmMgZ2V0T2ZmZXJzTm90aWZpZXIoc3RhdHVzID0gbnVsbCkge1xuICAgICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICAgIGNvbnN0IHsgbm90aWZpZXIsIHVwZGF0ZXIgfSA9IG1ha2VOb3RpZmllcktpdChpbmJveFN0YXRlKTtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gb2ZmZXIgPT5cbiAgICAgICAgICAoc3RhdHVzID09PSBudWxsIHx8IG9mZmVyLnN0YXR1cyA9PT0gc3RhdHVzKSAmJlxuICAgICAgICAgIG9mZmVyLnJlcXVlc3RDb250ZXh0ICYmXG4gICAgICAgICAgb2ZmZXIucmVxdWVzdENvbnRleHQuZGFwcE9yaWdpbiA9PT0gZGFwcE9yaWdpbjtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRPZmZlcnMgPSBvZmZlcnMgPT4ge1xuICAgICAgICAgIHJldHVybiBvZmZlcnMuZmlsdGVyKGZpbHRlcikubWFwKCh7IHJhd0lkLCAuLi52IH0pID0+ICh7XG4gICAgICAgICAgICAuLi52LFxuICAgICAgICAgICAgaWQ6IHJhd0lkLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2b2lkIG9ic2VydmVJdGVyYXRpb24obWFrZUFwcHJvdmVkTm90aWZpZXIob2ZmZXJOb3RpZmllciksIHtcbiAgICAgICAgICB1cGRhdGVTdGF0ZShvZmZlcnMpIHtcbiAgICAgICAgICAgIHVwZGF0ZXIudXBkYXRlU3RhdGUoZmlsdGVyZWRPZmZlcnMob2ZmZXJzKSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaW5pc2gob2ZmZXJzKSB7XG4gICAgICAgICAgICB1cGRhdGVyLmZpbmlzaChmaWx0ZXJlZE9mZmVycyhvZmZlcnMpKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZhaWwoZSkge1xuICAgICAgICAgICAgdXBkYXRlci5mYWlsKGUpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbm90aWZpZXI7XG4gICAgICB9LFxuICAgICAgYXN5bmMgZ2V0RGVwb3NpdEZhY2V0SWQoYnJhbmRCb2FyZElkKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldERlcG9zaXRGYWNldElkKGJyYW5kQm9hcmRJZCk7XG4gICAgICB9LFxuICAgICAgYXN5bmMgc3VnZ2VzdElzc3VlcihwZXRuYW1lLCBib2FyZElkKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgcmV0dXJuIHdhbGxldEFkbWluLnN1Z2dlc3RJc3N1ZXIocGV0bmFtZSwgYm9hcmRJZCwgZGFwcE9yaWdpbik7XG4gICAgICB9LFxuICAgICAgYXN5bmMgc3VnZ2VzdEluc3RhbGxhdGlvbihwZXRuYW1lLCBib2FyZElkKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgcmV0dXJuIHdhbGxldEFkbWluLnN1Z2dlc3RJbnN0YWxsYXRpb24ocGV0bmFtZSwgYm9hcmRJZCwgZGFwcE9yaWdpbik7XG4gICAgICB9LFxuICAgICAgYXN5bmMgc3VnZ2VzdEluc3RhbmNlKHBldG5hbWUsIGJvYXJkSWQpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uc3VnZ2VzdEluc3RhbmNlKHBldG5hbWUsIGJvYXJkSWQsIGRhcHBPcmlnaW4pO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGdldFVJTm90aWZpZXIocmF3SWQpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0VUlOb3RpZmllcihyYXdJZCwgZGFwcE9yaWdpbik7XG4gICAgICB9LFxuICAgICAgYXN5bmMgZ2V0UHVibGljTm90aWZpZXJzKHJhd0lkKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldFB1YmxpY05vdGlmaWVycyhyYXdJZCwgZGFwcE9yaWdpbik7XG4gICAgICB9LFxuICAgICAgYXN5bmMgZ2V0Wm9lKCkge1xuICAgICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRab2UoKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBnZXRCb2FyZCgpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Qm9hcmQoKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBnZXRBZ29yaWNOYW1lcyguLi5wYXRoKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldEFnb3JpY05hbWVzKC4uLnBhdGgpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0TmFtZXNCeUFkZHJlc3MoLi4ucGF0aCk7XG4gICAgICB9LFxuICAgICAgYXN5bmMgZ2V0QnJhbmRQZXRuYW1lcyhicmFuZHMpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QnJhbmRQZXRuYW1lcyhicmFuZHMpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gYnJpZGdlO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlYXBwcm92ZWRCcmlkZ2UgPSBGYXIoJ3ByZWFwcHJvdmVkQnJpZGdlJywge1xuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGFkZE9mZmVyKG9mZmVyLCBtZXRhKSB7XG4gICAgICByZXR1cm4gd2FsbGV0QWRtaW4uYWRkT2ZmZXIob2ZmZXIsIG1ldGEpO1xuICAgIH0sXG4gICAgZ2V0RGVwb3NpdEZhY2V0SWQoYnJhbmRCb2FyZElkKSB7XG4gICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0RGVwb3NpdEZhY2V0SWQoYnJhbmRCb2FyZElkKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldE9mZmVyc05vdGlmaWVyKCkge1xuICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldE9mZmVyc05vdGlmaWVyKCk7XG4gICAgfSxcbiAgICBhc3luYyBnZXRQdXJzZXNOb3RpZmllcigpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRBdHRlbnVhdGVkUHVyc2VzTm90aWZpZXIoKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldElzc3VlcnNOb3RpZmllcigpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRJc3N1ZXJzTm90aWZpZXIoKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldENhY2hlQ29vcmRpbmF0b3IoKSB7XG4gICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Q2FjaGVDb29yZGluYXRvcigpO1xuICAgIH0sXG4gICAgc3VnZ2VzdEluc3RhbGxhdGlvbihwZXRuYW1lLCBpbnN0YWxsYXRpb25Cb2FyZElkKSB7XG4gICAgICByZXR1cm4gd2FsbGV0QWRtaW4uc3VnZ2VzdEluc3RhbGxhdGlvbihwZXRuYW1lLCBpbnN0YWxsYXRpb25Cb2FyZElkKTtcbiAgICB9LFxuICAgIHN1Z2dlc3RJbnN0YW5jZShwZXRuYW1lLCBpbnN0YW5jZUJvYXJkSWQpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5zdWdnZXN0SW5zdGFuY2UocGV0bmFtZSwgaW5zdGFuY2VCb2FyZElkKTtcbiAgICB9LFxuICAgIHN1Z2dlc3RJc3N1ZXIocGV0bmFtZSwgaXNzdWVyQm9hcmRJZCkge1xuICAgICAgcmV0dXJuIHdhbGxldEFkbWluLnN1Z2dlc3RJc3N1ZXIocGV0bmFtZSwgaXNzdWVyQm9hcmRJZCk7XG4gICAgfSxcbiAgICBnZXRVSU5vdGlmaWVyKHJhd0lkKSB7XG4gICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0VUlOb3RpZmllcihyYXdJZCk7XG4gICAgfSxcbiAgICBnZXRQdWJsaWNOb3RpZmllcnMocmF3SWQpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRQdWJsaWNOb3RpZmllcnMocmF3SWQpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0Wm9lKCkge1xuICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldFpvZSgpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0Qm9hcmQoKSB7XG4gICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Qm9hcmQoKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldEFnb3JpY05hbWVzKC4uLnBhdGgpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRBZ29yaWNOYW1lcyguLi5wYXRoKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXROYW1lc0J5QWRkcmVzcyguLi5wYXRoKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldEJyYW5kUGV0bmFtZXMoYnJhbmRzKSB7XG4gICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QnJhbmRQZXRuYW1lcyhicmFuZHMpO1xuICAgIH0sXG4gIH0pO1xuICBoYXJkZW4ocHJlYXBwcm92ZWRCcmlkZ2UpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFdhbGxldChiYW5rKSB7XG4gICAgYXdhaXQgd2FsbGV0Um9vdC5pbXBvcnRCYW5rQXNzZXRzKGJhbmspO1xuXG4gICAgLypcblxuICAgICAqL1xuICAgIGNvbnN0IHdhbGxldCA9IEZhcignd2FsbGV0Jywge1xuICAgICAgYWRkUGF5bWVudDogd2FsbGV0QWRtaW4uYWRkUGF5bWVudCxcbiAgICAgIGFzeW5jIGdldFNjb3BlZEJyaWRnZShzdWdnZXN0ZWREYXBwUGV0bmFtZSwgZGFwcE9yaWdpbikge1xuICAgICAgICBjb25zdCBhcHByb3ZlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHdhbGxldEFkbWluLndhaXRGb3JEYXBwQXBwcm92YWwoXG4gICAgICAgICAgICBzdWdnZXN0ZWREYXBwUGV0bmFtZSxcbiAgICAgICAgICAgIGRhcHBPcmlnaW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbWFrZUJyaWRnZShhcHByb3ZlLCBkYXBwT3JpZ2luKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBnZXRCcmlkZ2UoKSB7XG4gICAgICAgIHJldHVybiBwcmVhcHByb3ZlZEJyaWRnZTtcbiAgICAgIH0sXG4gICAgICBnZXREZXBvc2l0RmFjZXRJZDogd2FsbGV0QWRtaW4uZ2V0RGVwb3NpdEZhY2V0SWQsXG4gICAgICBnZXRBZG1pbkZhY2V0KCkge1xuICAgICAgICByZXR1cm4gRmFyKCdhZG1pbkZhY2V0Jywge1xuICAgICAgICAgIC4uLndhbGxldEFkbWluLFxuICAgICAgICAgIC4uLm5vdGlmaWVycyxcbiAgICAgICAgICBnZXRTY29wZWRCcmlkZ2U6IHdhbGxldC5nZXRTY29wZWRCcmlkZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGdldElzc3Vlcjogd2FsbGV0QWRtaW4uZ2V0SXNzdWVyLFxuICAgICAgZ2V0SXNzdWVyczogd2FsbGV0QWRtaW4uZ2V0SXNzdWVycyxcbiAgICAgIGdldFB1cnNlOiB3YWxsZXRBZG1pbi5nZXRQdXJzZSxcbiAgICAgIGdldFB1cnNlczogd2FsbGV0QWRtaW4uZ2V0UHVyc2VzLFxuXG4gICAgICBnZXRNYXJzaGFsbGVyOiB3YWxsZXRBZG1pbi5nZXRNYXJzaGFsbGVyLFxuXG4gICAgICBsb29rdXA6IHdhbGxldEFkbWluLmxvb2t1cCxcbiAgICB9KTtcbiAgICByZXR1cm4gaGFyZGVuKHdhbGxldCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRIVFRQT2JqZWN0KG8pIHtcbiAgICBodHRwID0gbztcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0U3Vic2NyaXB0aW9ucygpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgcHVyc2VzU3Vic2NyaWJlKFxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbm90aWZ5KG0pIHtcbiAgICAgICAgICBwdXJzZXNTdGF0ZSA9IEpTT04ucGFyc2UobSk7XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGluYm94U3Vic2NyaWJlKFxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbm90aWZ5KG0pIHtcbiAgICAgICAgICBpbmJveFN0YXRlID0gSlNPTi5wYXJzZShtKTtcbiAgICAgICAgICBpbmJveFVwZGF0ZXIudXBkYXRlU3RhdGUoaW5ib3hTdGF0ZSk7XG4gICAgICAgICAgaWYgKGh0dHApIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWxIYW5kbGUgb2Ygb2ZmZXJTdWJzY3JpcHRpb25zLmtleXMoKSkge1xuICAgICAgICAgICAgICBwdXNoT2ZmZXJTdWJzY3JpcHRpb25zKGNoYW5uZWxIYW5kbGUsIGluYm94U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCcmlkZ2VVUkxIYW5kbGVyKCkge1xuICAgIHJldHVybiBGYXIoJ2JyaWRnZVVSTEhhbmRsZXInLCB7XG4gICAgICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICAgICAqL1xuXG4gICAgICAvKlxuXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgZ2V0Qm9vdHN0cmFwKG90aGVyU2lkZSwgbWV0YSwgb2JqKSB7XG4gICAgICAgIGNvbnN0IHsgZGFwcE9yaWdpbiA9IG1ldGEub3JpZ2luIH0gPSBvYmo7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZERhcHBQZXRuYW1lID0gU3RyaW5nKFxuICAgICAgICAgIChtZXRhLnF1ZXJ5ICYmIG1ldGEucXVlcnkuc3VnZ2VzdGVkRGFwcFBldG5hbWUpIHx8XG4gICAgICAgICAgICBtZXRhLmRhcHBPcmlnaW4gfHxcbiAgICAgICAgICAgIGRhcHBPcmlnaW4sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYXBwcm92ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBsZXQgbm90WWV0RW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIGF3YWl0IHdhbGxldEFkbWluLndhaXRGb3JEYXBwQXBwcm92YWwoXG4gICAgICAgICAgICBzdWdnZXN0ZWREYXBwUGV0bmFtZSxcbiAgICAgICAgICAgIGRhcHBPcmlnaW4sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIG5vdFlldEVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBFKG90aGVyU2lkZSlcbiAgICAgICAgICAgICAgICAubmVlZERhcHBBcHByb3ZhbChkYXBwT3JpZ2luLCBzdWdnZXN0ZWREYXBwUGV0bmFtZSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goXyA9PiB7fSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG5vdFlldEVuYWJsZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IEUob3RoZXJTaWRlKS5kYXBwQXBwcm92ZWQoZGFwcE9yaWdpbik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBtYWtlQnJpZGdlKGFwcHJvdmUsIGRhcHBPcmlnaW4sIG1ldGEpO1xuICAgICAgfSxcblxuICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGdldENvbW1hbmRIYW5kbGVyKCkge1xuICAgICAgICByZXR1cm4gRmFyKCdjb21tYW5kSGFuZGxlcicsIHtcbiAgICAgICAgICBvbk9wZW4oX29iaiwgbWV0YSkge1xuICAgICAgICAgICAgYnJpZGdlSGFuZGxlcy5hZGQobWV0YS5jaGFubmVsSGFuZGxlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ2xvc2UoX29iaiwgbWV0YSkge1xuICAgICAgICAgICAgYnJpZGdlSGFuZGxlcy5kZWxldGUobWV0YS5jaGFubmVsSGFuZGxlKTtcbiAgICAgICAgICAgIG9mZmVyU3Vic2NyaXB0aW9ucy5kZWxldGUobWV0YS5jaGFubmVsSGFuZGxlKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXN5bmMgb25NZXNzYWdlKG9iaiwgbWV0YSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICBkYXBwT3JpZ2luID0gbWV0YS5vcmlnaW4sXG4gICAgICAgICAgICAgIHN1Z2dlc3RlZERhcHBQZXRuYW1lID0gKG1ldGEucXVlcnkgJiZcbiAgICAgICAgICAgICAgICBtZXRhLnF1ZXJ5LnN1Z2dlc3RlZERhcHBQZXRuYW1lKSB8fFxuICAgICAgICAgICAgICAgIG9iai5kYXBwT3JpZ2luIHx8XG4gICAgICAgICAgICAgICAgbWV0YS5vcmlnaW4sXG4gICAgICAgICAgICB9ID0gb2JqO1xuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgbGV0IG5lZWRBcHByb3ZhbCA9IGZhbHNlO1xuICAgICAgICAgICAgYXdhaXQgd2FsbGV0QWRtaW4ud2FpdEZvckRhcHBBcHByb3ZhbChcbiAgICAgICAgICAgICAgc3VnZ2VzdGVkRGFwcFBldG5hbWUsXG4gICAgICAgICAgICAgIGRhcHBPcmlnaW4sXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBuZWVkQXBwcm92YWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGh0dHBTZW5kKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FsbGV0TmVlZERhcHBBcHByb3ZhbCcsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBkYXBwT3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZERhcHBQZXRuYW1lLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFttZXRhLmNoYW5uZWxIYW5kbGVdLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG5lZWRBcHByb3ZhbCkge1xuICAgICAgICAgICAgICBodHRwU2VuZChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnd2FsbGV0SGF2ZURhcHBBcHByb3ZhbCcsXG4gICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGRhcHBPcmlnaW4sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW21ldGEuY2hhbm5lbEhhbmRsZV0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICd3YWxsZXRHZXRQdXJzZXMnOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YWxsZXRVcGRhdGVQdXJzZXMnLFxuICAgICAgICAgICAgICAgICAgZGF0YTogYmlnaW50U3RyaW5naWZ5KHB1cnNlc1N0YXRlKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ3dhbGxldEFkZE9mZmVyJzoge1xuICAgICAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IEZhcignYWN0aW9ucycsIHtcbiAgICAgICAgICAgICAgICAgIGhhbmRsZWQob2ZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBTZW5kKFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YWxsZXRPZmZlckhhbmRsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogb2ZmZXIuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBbbWV0YS5jaGFubmVsSGFuZGxlXSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YWxsZXRPZmZlckFkZGVkJyxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHdhbGxldEFkbWluLmFkZE9mZmVyKFxuICAgICAgICAgICAgICAgICAgICB7IC4uLm9iai5kYXRhLCBhY3Rpb25zIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgLi4ubWV0YSwgZGFwcE9yaWdpbiB9LFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2FzZSAnd2FsbGV0U3Vic2NyaWJlT2ZmZXJzJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3RhdHVzID0gbnVsbCB9ID0gb2JqO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY2hhbm5lbEhhbmRsZSB9ID0gbWV0YTtcblxuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbEhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhbGxldFN1YnNjcmliZWRPZmZlcnMnLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVUb09mZmVycyhjaGFubmVsSGFuZGxlLCB7XG4gICAgICAgICAgICAgICAgICBvcmlnaW46IGRhcHBPcmlnaW4sXG4gICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YWxsZXRTdWJzY3JpYmVkT2ZmZXJzJyxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgJ3dhbGxldEdldE9mZmVycyc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHN0YXR1cyA9IG51bGwgfSA9IG9iajtcblxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHdhbGxldEFkbWluLmdldE9mZmVycyh7XG4gICAgICAgICAgICAgICAgICBvcmlnaW46IGRhcHBPcmlnaW4sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGhhcmRlbihcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZpbHRlcihvZmZlciA9PiBvZmZlci5zdGF0dXMgPT09IHN0YXR1cyksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnd2FsbGV0T2ZmZXJEZXNjcmlwdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjYXNlICd3YWxsZXRHZXREZXBvc2l0RmFjZXRJZCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGJyYW5kQm9hcmRJZCB9ID0gb2JqO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgICAgICAgICAgICBhd2FpdCB3YWxsZXRBZG1pbi5nZXREZXBvc2l0RmFjZXRJZChicmFuZEJvYXJkSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnd2FsbGV0RGVwb3NpdEZhY2V0SWRSZXNwb25zZScsXG4gICAgICAgICAgICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgJ3dhbGxldFN1Z2dlc3RJc3N1ZXInOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwZXRuYW1lLCBib2FyZElkIH0gPSBvYmo7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0QWRtaW4uc3VnZ2VzdElzc3VlcihcbiAgICAgICAgICAgICAgICAgIHBldG5hbWUsXG4gICAgICAgICAgICAgICAgICBib2FyZElkLFxuICAgICAgICAgICAgICAgICAgZGFwcE9yaWdpbixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnd2FsbGV0U3VnZ2VzdElzc3VlclJlc3BvbnNlJyxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2FzZSAnd2FsbGV0U3VnZ2VzdEluc3RhbmNlJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgcGV0bmFtZSwgYm9hcmRJZCB9ID0gb2JqO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldEFkbWluLnN1Z2dlc3RJbnN0YW5jZShcbiAgICAgICAgICAgICAgICAgIHBldG5hbWUsXG4gICAgICAgICAgICAgICAgICBib2FyZElkLFxuICAgICAgICAgICAgICAgICAgZGFwcE9yaWdpbixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnd2FsbGV0U3VnZ2VzdEluc3RhbmNlUmVzcG9uc2UnLFxuICAgICAgICAgICAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjYXNlICd3YWxsZXRTdWdnZXN0SW5zdGFsbGF0aW9uJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgcGV0bmFtZSwgYm9hcmRJZCB9ID0gb2JqO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldEFkbWluLnN1Z2dlc3RJbnN0YWxsYXRpb24oXG4gICAgICAgICAgICAgICAgICBwZXRuYW1lLFxuICAgICAgICAgICAgICAgICAgYm9hcmRJZCxcbiAgICAgICAgICAgICAgICAgIGRhcHBPcmlnaW4sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhbGxldFN1Z2dlc3RJbnN0YWxsYXRpb25SZXNwb25zZScsXG4gICAgICAgICAgICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgc3RhcnRTdWJzY3JpcHRpb25zKCk7XG5cbiAgZnVuY3Rpb24gZ2V0Q29tbWFuZEhhbmRsZXIoLi4ucGFyYW1zKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICdnZXRDb21tYW5kSGFuZGxlciBjYWxsZWQgaW4gd2FsbGV0LCBidXQgZG9lcyBub3QgZXhpc3QnLFxuICAgICAgcGFyYW1zLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRmFyKCdyb290Jywge1xuICAgIHN0YXJ0dXAsXG4gICAgZ2V0V2FsbGV0LFxuICAgIHNldEhUVFBPYmplY3QsXG4gICAgZ2V0QnJpZGdlVVJMSGFuZGxlcixcbiAgICBnZXRDb21tYW5kSGFuZGxlcixcbiAgfSk7XG59XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgICAgICAgICBmdW5jdGlvbiBzcGF3bih0ZXJtcywgX2ludml0ZU1ha2VyKSB7XG4gIGNvbnN0IHdhbGxldFZhdCA9IGJ1aWxkUm9vdE9iamVjdCgpO1xuICByZXR1cm4gd2FsbGV0VmF0LnN0YXJ0dXAodGVybXMpLnRoZW4oXyA9PiB3YWxsZXRWYXQpO1xufSRozY9fb25jZS5kZWZhdWx0KCAgICAgIHNwYXduKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdLCJidWlsZFJvb3RPYmplY3QiOlsiYnVpbGRSb290T2JqZWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACKuJnF9GwAAfRsAADMAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIlJlY29yZGVyS2l0U2hhcGUiLCJkZWZpbmVFUmVjb3JkZXJLaXQiLCJkZWZpbmVSZWNvcmRlcktpdCIsInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiLCJwcmVwYXJlUmVjb3JkZXIiLCJwcmVwYXJlUmVjb3JkZXJLaXQiLCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFN0b3JhZ2VOb2RlU2hhcGUscHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0LG1ha2VGYWtlTWFyc2hhbGxlcixtYWtlRmFrZVN0b3JhZ2UsbXVzdE1hdGNoLE0sbWFrZVNjYWxhckJpZ01hcFN0b3JlLHByZXBhcmVFeG9DbGFzcyxFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIlN0b3JhZ2VOb2RlU2hhcGVcIixbJGjNj19hID0+IChTdG9yYWdlTm9kZVNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanNcIiwgW1tcIm1ha2VGYWtlTWFyc2hhbGxlclwiLFskaM2PX2EgPT4gKG1ha2VGYWtlTWFyc2hhbGxlciA9ICRozY9fYSldXSxbXCJtYWtlRmFrZVN0b3JhZ2VcIixbJGjNj19hID0+IChtYWtlRmFrZVN0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVJlY29yZGVyID0gKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgbWFrZVJlY29yZGVyID0gcHJlcGFyZUV4b0NsYXNzKFxuICAgIGJhZ2dhZ2UsXG4gICAgJ1JlY29yZGVyJyxcbiAgICBNLmludGVyZmFjZSgnUmVjb3JkZXInLCB7XG4gICAgICBnZXRTdG9yYWdlTm9kZTogTS5jYWxsKCkucmV0dXJucyhTdG9yYWdlTm9kZVNoYXBlKSxcbiAgICAgIGdldFN0b3JhZ2VQYXRoOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgvKiAgICAgICAgKi8pKSxcbiAgICAgIHdyaXRlOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB3cml0ZUZpbmFsOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgfSksXG4gICAgLypcblxuXG5cblxuICAgICAqL1xuICAgIChcbiAgICAgIHB1Ymxpc2hlcixcbiAgICAgIHN0b3JhZ2VOb2RlLFxuICAgICAgdmFsdWVTaGFwZSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChNLmFueSgpKSxcbiAgICApID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICAgIHB1Ymxpc2hlcixcbiAgICAgICAgc3RvcmFnZU5vZGUsXG4gICAgICAgIHN0b3JhZ2VQYXRoOiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHVuZGVmaW5lZCksXG4gICAgICAgIHZhbHVlU2hhcGUsXG4gICAgICB9O1xuICAgIH0sXG4gICAge1xuICAgICAgZ2V0U3RvcmFnZU5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnN0b3JhZ2VOb2RlO1xuICAgICAgfSxcbiAgICAgIC8qXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIGdldFN0b3JhZ2VQYXRoKCkge1xuICAgICAgICBjb25zdCB7IHN0b3JhZ2VQYXRoOiBoZWxkUGF0aCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgLy9cbiAgICAgICAgYXdhaXQgbnVsbDtcbiAgICAgICAgaWYgKGhlbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGVsZFBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IEUodGhpcy5zdGF0ZS5zdG9yYWdlTm9kZSkuZ2V0UGF0aCgpO1xuICAgICAgICB0aGlzLnN0YXRlLnN0b3JhZ2VQYXRoID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9LFxuICAgICAgLypcblxuXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyB3cml0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IGNsb3NlZCwgcHVibGlzaGVyLCBzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgIWNsb3NlZCB8fCBGYWlsYGNhbm5vdCB3cml0ZSB0byBjbG9zZWQgcmVjb3JkZXJgO1xuICAgICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUpO1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gYXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICAgIGF3YWl0IEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBwdWJsaXNoZXIucHVibGlzaCh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgLypcblxuXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyB3cml0ZUZpbmFsKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgY2xvc2VkLCBwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAhY2xvc2VkIHx8IEZhaWxgY2Fubm90IHdyaXRlIHRvIGNsb3NlZCByZWNvcmRlcmA7XG4gICAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSk7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgICAgYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5zdGF0ZS5jbG9zZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcHVibGlzaGVyLmZpbmlzaCh2YWx1ZSk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIG1ha2VSZWNvcmRlcjtcbn07JGjNj19vbmNlLnByZXBhcmVSZWNvcmRlcihwcmVwYXJlUmVjb3JkZXIpO1xuaGFyZGVuKHByZXBhcmVSZWNvcmRlcik7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZmluZVJlY29yZGVyS2l0ID0gKHsgbWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgfSkgPT4ge1xuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlUmVjb3JkZXJLaXQgPSAoc3RvcmFnZU5vZGUsIHZhbHVlU2hhcGUpID0+IHtcbiAgICBjb25zdCB7IHN1YnNjcmliZXIsIHB1Ymxpc2hlciB9ID0gbWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG4gICAgY29uc3QgcmVjb3JkZXIgPSBtYWtlUmVjb3JkZXIocHVibGlzaGVyLCBzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSk7XG4gICAgcmV0dXJuIGhhcmRlbih7IHN1YnNjcmliZXIsIHJlY29yZGVyIH0pO1xuICB9O1xuICByZXR1cm4gbWFrZVJlY29yZGVyS2l0O1xufTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmaW5lUmVjb3JkZXJLaXQoZGVmaW5lUmVjb3JkZXJLaXQpO1xuICAgICAgIGNvbnN0IGRlZmluZUVSZWNvcmRlcktpdCA9ICh7IG1ha2VSZWNvcmRlciwgbWFrZUR1cmFibGVQdWJsaXNoS2l0IH0pID0+IHtcbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgbWFrZUVSZWNvcmRlcktpdCA9IChzdG9yYWdlTm9kZVAsIHZhbHVlU2hhcGUpID0+IHtcbiAgICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG4gICAgY29uc3QgcmVjb3JkZXJQID0gRS53aGVuKHN0b3JhZ2VOb2RlUCwgc3RvcmFnZU5vZGUgPT5cbiAgICAgIG1ha2VSZWNvcmRlcihwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlKSxcbiAgICApO1xuICAgIHJldHVybiB7IHN1YnNjcmliZXIsIHJlY29yZGVyUCB9O1xuICB9O1xuICByZXR1cm4gbWFrZUVSZWNvcmRlcktpdDtcbn07JGjNj19vbmNlLmRlZmluZUVSZWNvcmRlcktpdChkZWZpbmVFUmVjb3JkZXJLaXQpO1xuaGFyZGVuKGRlZmluZUVSZWNvcmRlcktpdCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVJlY29yZGVyS2l0ID0gKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0ID0gcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ0R1cmFibGUgUHVibGlzaCBLaXQnLFxuICApO1xuICBjb25zdCBtYWtlUmVjb3JkZXIgPSBwcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSwgbWFyc2hhbGxlcik7XG4gIHJldHVybiBkZWZpbmVSZWNvcmRlcktpdCh7IG1ha2VEdXJhYmxlUHVibGlzaEtpdCwgbWFrZVJlY29yZGVyIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXJLaXQocHJlcGFyZVJlY29yZGVyS2l0KTtcbiAgICAgICBjb25zdCBwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMgPSAoYmFnZ2FnZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgPSBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnRHVyYWJsZSBQdWJsaXNoIEtpdCcsXG4gICk7XG4gIGNvbnN0IG1ha2VSZWNvcmRlciA9IHByZXBhcmVSZWNvcmRlcihiYWdnYWdlLCBtYXJzaGFsbGVyKTtcblxuICBjb25zdCBtYWtlUmVjb3JkZXJLaXQgPSBkZWZpbmVSZWNvcmRlcktpdCh7XG4gICAgbWFrZVJlY29yZGVyLFxuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdCxcbiAgfSk7XG4gIGNvbnN0IG1ha2VFUmVjb3JkZXJLaXQgPSBkZWZpbmVFUmVjb3JkZXJLaXQoe1xuICAgIG1ha2VSZWNvcmRlcixcbiAgICBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbWFrZUR1cmFibGVQdWJsaXNoS2l0LFxuICAgIG1ha2VSZWNvcmRlcixcbiAgICBtYWtlUmVjb3JkZXJLaXQsXG4gICAgbWFrZUVSZWNvcmRlcktpdCxcbiAgfTtcbn07XG5cbi8qXG5cbiAqLyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKTtcbiAgICAgICBjb25zdCBwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzID0gKCkgPT4ge1xuICBjb25zdCBiYWdnYWdlID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdtb2NrIHJlY29yZGVyIGJhZ2dhZ2UnKTtcbiAgY29uc3QgbWFyc2hhbGxlciA9IG1ha2VGYWtlTWFyc2hhbGxlcigpO1xuICByZXR1cm4ge1xuICAgIC4uLnByZXBhcmVSZWNvcmRlcktpdE1ha2VycyhiYWdnYWdlLCBtYXJzaGFsbGVyKSxcbiAgICBzdG9yYWdlTm9kZTogbWFrZUZha2VTdG9yYWdlKCdtb2NrIHJlY29yZGVyIHN0b3JhZ2UnKSxcbiAgfTtcbn07JGjNj19vbmNlLnByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2Vycyk7XG5cbiAgICAgICBjb25zdCBSZWNvcmRlcktpdFNoYXBlID0ge1xuICByZWNvcmRlcjogTS5yZW1vdGFibGUoKSxcbiAgc3Vic2NyaWJlcjogTS5yZW1vdGFibGUoKSxcbn07JGjNj19vbmNlLlJlY29yZGVyS2l0U2hhcGUoUmVjb3JkZXJLaXRTaGFwZSk7XG5oYXJkZW4oUmVjb3JkZXJLaXRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUmVjb3JkZXIiOlsicHJlcGFyZVJlY29yZGVyIl0sImRlZmluZVJlY29yZGVyS2l0IjpbImRlZmluZVJlY29yZGVyS2l0Il0sImRlZmluZUVSZWNvcmRlcktpdCI6WyJkZWZpbmVFUmVjb3JkZXJLaXQiXSwicHJlcGFyZVJlY29yZGVyS2l0IjpbInByZXBhcmVSZWNvcmRlcktpdCJdLCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyJdLCJSZWNvcmRlcktpdFNoYXBlIjpbIlJlY29yZGVyS2l0U2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2fSTtJYBAACWAQAAHgAAAEBhZ29yaWMvem9uZS12MC4yLjIvZHVyYWJsZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kdXJhYmxlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZHVyYWJsZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kdXJhYmxlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJdbip2cEQAAnBEAACIAAABAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9iYXNlLXpvbmUiXSwiZXhwb3J0cyI6WyJtYWtlRHVyYWJsZVpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEZhcixpc1Bhc3NhYmxlLGNhbkJlRHVyYWJsZSxtYWtlU2NhbGFyTWFwU3RvcmUscHJlcGFyZUV4byxwcmVwYXJlRXhvQ2xhc3MscHJlcGFyZUV4b0NsYXNzS2l0LHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUscHJvdmlkZUR1cmFibGVTZXRTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSx3YXRjaFByb21pc2Usa2V5cyxtYWtlT25jZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGlzUGFzc2FibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIixbJGjNj19hID0+IChjYW5CZUR1cmFibGUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9cIixbJGjNj19hID0+IChwcmVwYXJlRXhvID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVTZXRTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlID0gJGjNj19hKV1dLFtcIndhdGNoUHJvbWlzZVwiLFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lXCIsIFtbXCJhZ29yaWNWYXREYXRhS2V5c1wiLFskaM2PX2EgPT4gKGtleXMgPSAkaM2PX2EpXV0sW1wibWFrZU9uY2VLaXRcIixbJGjNj19hID0+IChtYWtlT25jZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGlzU3RvcmFibGUgPSBzcGVjaW1lbiA9PiBpc1Bhc3NhYmxlKHNwZWNpbWVuKSAmJiBjYW5CZUR1cmFibGUoc3BlY2ltZW4pO1xuaGFyZGVuKGlzU3RvcmFibGUpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGF0dGFjaER1cmFibGVTdG9yZXMgPSBnZXRCYWdnYWdlID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXBTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGJhZ2dhZ2UgPSBnZXRCYWdnYWdlKCk7XG4gICAgY29uc3QgcmV0ID0gcHJvdmlkZUR1cmFibGVNYXBTdG9yZShiYWdnYWdlLCBsYWJlbCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzZXRTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgICBwcm92aWRlRHVyYWJsZVNldFN0b3JlKGdldEJhZ2dhZ2UoKSwgbGFiZWwsIG9wdGlvbnMpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB3ZWFrU2V0U3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHdlYWtNYXBTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShnZXRCYWdnYWdlKCksIGxhYmVsLCBvcHRpb25zKTtcblxuICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgcmV0dXJuIEZhcignZHVyYWJsZVN0b3JlcycsIHtcbiAgICBkZXRhY2hlZDogKCkgPT4gZGV0YWNoZWREdXJhYmxlU3RvcmVzLFxuICAgIGlzU3RvcmFibGUsXG4gICAgbWFwU3RvcmUsXG4gICAgc2V0U3RvcmUsXG4gICAgd2Vha01hcFN0b3JlLFxuICAgIHdlYWtTZXRTdG9yZSxcbiAgfSk7XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRldGFjaGVkRHVyYWJsZVN0b3JlcyA9IGF0dGFjaER1cmFibGVTdG9yZXMoKCkgPT5cbiAgbWFrZVNjYWxhck1hcFN0b3JlKCdkZXRhY2hlZCcpLFxuKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRHVyYWJsZVpvbmUgPSAoYmFnZ2FnZSwgYmFzZUxhYmVsID0gJ2R1cmFibGVab25lJykgPT4ge1xuICBiYWdnYWdlIHx8IEZhaWxgYmFnZ2FnZSByZXF1aXJlZGA7XG5cbiAgY29uc3QgYXR0YWNoZWRTdG9yZXMgPSBhdHRhY2hEdXJhYmxlU3RvcmVzKCgpID0+IGJhZ2dhZ2UpO1xuXG4gIGNvbnN0IHsgbWFrZU9uY2UsIHdyYXBQcm92aWRlciB9ID0gbWFrZU9uY2VLaXQoXG4gICAgYmFzZUxhYmVsLFxuICAgIGF0dGFjaGVkU3RvcmVzLFxuICAgIGJhZ2dhZ2UsXG4gICk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBleG9DbGFzcyA9ICguLi5hcmdzKSA9PiBwcmVwYXJlRXhvQ2xhc3MoYmFnZ2FnZSwgLi4uYXJncyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgLy9cbiAgLy9cbiAgY29uc3QgZXhvQ2xhc3NLaXQgPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4b0NsYXNzS2l0KGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBleG8gPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4byhiYWdnYWdlLCAuLi5hcmdzKTtcblxuICBjb25zdCBzdWJab25lU3RvcmUgPSB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMubWFwU3RvcmUsIGtleXMuem9uZSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN1YlpvbmUgPSAobGFiZWwsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBzdWJCYWdnYWdlID0gc3ViWm9uZVN0b3JlKGxhYmVsLCBvcHRpb25zKTtcbiAgICByZXR1cm4gbWFrZUR1cmFibGVab25lKHN1YkJhZ2dhZ2UsIGAke2Jhc2VMYWJlbH0uJHtsYWJlbH1gKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKCdkdXJhYmxlWm9uZScsIHtcbiAgICBleG86IHdyYXBQcm92aWRlcihleG8sIGtleXMuZXhvKSxcbiAgICBleG9DbGFzczogd3JhcFByb3ZpZGVyKGV4b0NsYXNzLCBrZXlzLmV4b0NsYXNzKSxcbiAgICBleG9DbGFzc0tpdDogd3JhcFByb3ZpZGVyKGV4b0NsYXNzS2l0LCBrZXlzLmV4b0NsYXNzS2l0KSxcbiAgICBzdWJab25lLFxuXG4gICAgbWFrZU9uY2UsXG4gICAgd2F0Y2hQcm9taXNlLFxuICAgIGRldGFjaGVkOiBhdHRhY2hlZFN0b3Jlcy5kZXRhY2hlZCxcbiAgICBpc1N0b3JhYmxlOiBhdHRhY2hlZFN0b3Jlcy5pc1N0b3JhYmxlLFxuXG4gICAgbWFwU3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5tYXBTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgc2V0U3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5zZXRTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgd2Vha01hcFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMud2Vha01hcFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICB3ZWFrU2V0U3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy53ZWFrU2V0U3RvcmUsIGtleXMuc3RvcmUpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VEdXJhYmxlWm9uZShtYWtlRHVyYWJsZVpvbmUpO1xuaGFyZGVuKG1ha2VEdXJhYmxlWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRHVyYWJsZVpvbmUiOlsibWFrZUR1cmFibGVab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOjHgXswBQAAMAUAACwAAABAZW5kby9jb21tb24tdjEuMi4xMy9hcHBseS1sYWJlbGluZy1lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Rocm93LWxhYmVsZWQuanMiXSwiZXhwb3J0cyI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLGlzUHJvbWlzZSx0aHJvd0xhYmVsZWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Rocm93LWxhYmVsZWQuanNcIiwgW1tcInRocm93TGFiZWxlZFwiLFskaM2PX2EgPT4gKHRocm93TGFiZWxlZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhcHBseUxhYmVsaW5nRXJyb3IgPSAoZnVuYywgYXJncywgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgaWYgKGxhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZnVuYyguLi5hcmdzKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICB0cnkge1xuICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93TGFiZWxlZChlcnIsIGxhYmVsKTtcbiAgfVxuICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gRS53aGVuKHJlc3VsdCwgdW5kZWZpbmVkLCByZWFzb24gPT4gdGhyb3dMYWJlbGVkKHJlYXNvbiwgbGFiZWwpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59OyRozY9fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABZyIR/pQQAAKUEAAArAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvZnJvbS11bmlxdWUtZW50cmllcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGZyb21VbmlxdWVFbnRyaWVzID0gYWxsRW50cmllcyA9PiB7XG4gIGNvbnN0IGVudHJpZXNBcnJheSA9IFsuLi5hbGxFbnRyaWVzXTtcbiAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuICBpZiAob3duS2V5cyhyZXN1bHQpLmxlbmd0aCA9PT0gZW50cmllc0FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgW25hbWUsIF9dIG9mIGVudHJpZXNBcnJheSkge1xuICAgIGlmIChuYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgIEZhaWxgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiAgICB9XG4gICAgbmFtZXMuYWRkKG5hbWUpO1xuICB9XG4gIHRocm93IEZhaWxgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xufTskaM2PX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANRN/zdKAgAASgIAACUAAABAZW5kby9jb21tb24tdjEuMi4xMy9pZGVudC1jaGVja2VyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpZGVudENoZWNrZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8vXG4vL1xuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlkZW50Q2hlY2tlciA9IChjb25kLCBfZGV0YWlscykgPT4gY29uZDskaM2PX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiteXQ5ACAACQAgAAJwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2xpc3QtZGlmZmVyZW5jZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibGlzdERpZmZlcmVuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGxpc3REaWZmZXJlbmNlID0gKGxlZnRMaXN0LCByaWdodExpc3QpID0+IHtcbiAgY29uc3QgcmlnaHRTZXQgPSBuZXcgU2V0KHJpZ2h0TGlzdCk7XG4gIHJldHVybiBsZWZ0TGlzdC5maWx0ZXIoZWxlbWVudCA9PiAhcmlnaHRTZXQuaGFzKGVsZW1lbnQpKTtcbn07JGjNj19vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAulJoOtAMAALQDAAArAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvbWFrZS1hcnJheS1pdGVyYXRvci5qc3siaW1wb3J0cyI6WyIuL21ha2UtaXRlcmF0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXJyYXlJdGVyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VJdGVyYXRvcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFrZS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUl0ZXJhdG9yXCIsWyRozY9fYSA9PiAobWFrZUl0ZXJhdG9yID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXJyYXlJdGVyYXRvciA9IGFyciA9PiB7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBhcnI7XG4gIGxldCBpID0gMDtcbiAgcmV0dXJuIG1ha2VJdGVyYXRvcigoKSA9PiB7XG4gICAgLyogICAgICAgICAgICAqL1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgdmFsdWUgPSBhcnJbaV07XG4gICAgICBpICs9IDE7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICAgIH1cbiAgICAvL1xuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZSB9KTtcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQXJyYXlJdGVyYXRvcihtYWtlQXJyYXlJdGVyYXRvcik7XG5oYXJkZW4obWFrZUFycmF5SXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFycmF5SXRlcmF0b3IiOlsibWFrZUFycmF5SXRlcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABavNqFwCAABcAgAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtaXRlcmF0b3IuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VJdGVyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJdGVyYXRvciA9IG5leHQgPT4ge1xuICBjb25zdCBpdGVyID0gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gaXRlcixcbiAgICBuZXh0LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXI7XG59OyRozY9fb25jZS5tYWtlSXRlcmF0b3IobWFrZUl0ZXJhdG9yKTtcbmhhcmRlbihtYWtlSXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUl0ZXJhdG9yIjpbIm1ha2VJdGVyYXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB/VRSzNAMAADQDAAAiAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO2NvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgb2JqZWN0TWFwID0gKG9yaWdpbmFsLCBtYXBGbikgPT4ge1xuICBjb25zdCBlbnRzID0gZW50cmllcyhvcmlnaW5hbCk7XG4gIGNvbnN0IG1hcEVudHMgPSBlbnRzLm1hcChcbiAgICAoW2ssIHZdKSA9PiAvKiAgICAgICAgICAgICAgICAgICAgICAgKi8gKFtrLCBtYXBGbih2LCBrKV0pLFxuICApO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpKTtcbn07JGjNj19vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH9WL1IyBAAAMgQAACcAAABAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWV0YS1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1ldGFNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Y29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBjcmVhdGUsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgb2JqZWN0TWV0YU1hcCA9IChcbiAgb3JpZ2luYWwsXG4gIG1ldGFNYXBGbixcbiAgcHJvdG8gPSBPYmplY3QucHJvdG90eXBlLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnaW5hbCk7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKG9yaWdpbmFsKTtcblxuICBjb25zdCBkZXNjRW50cmllcyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIGtleXNcbiAgICAgIC5tYXAoa2V5ID0+IFtrZXksIG1ldGFNYXBGbihkZXNjc1trZXldLCBrZXkpXSlcbiAgICAgIC5maWx0ZXIoKFtfa2V5LCBvcHREZXNjXSkgPT4gb3B0RGVzYyAhPT0gdW5kZWZpbmVkKVxuICApO1xuICByZXR1cm4gaGFyZGVuKGNyZWF0ZShwcm90bywgZnJvbUVudHJpZXMoZGVzY0VudHJpZXMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNZXRhTWFwKG9iamVjdE1ldGFNYXApO1xuaGFyZGVuKG9iamVjdE1ldGFNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWV0YU1hcCI6WyJvYmplY3RNZXRhTWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPKqY7MeBAAAHgQAACUAAABAZW5kby9jb21tb24tdjEuMi4xMy90aHJvdy1sYWJlbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbInRocm93TGFiZWxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsbWFrZUVycm9yLGFubm90YXRlRXJyb3I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0aHJvd0xhYmVsZWQgPSAoXG4gIGlubmVyRXJyLFxuICBsYWJlbCxcbiAgZXJyQ29uc3RydWN0b3IgPSB1bmRlZmluZWQsXG4gIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicpIHtcbiAgICBsYWJlbCA9IGBbJHtsYWJlbH1dYDtcbiAgfVxuICBjb25zdCBvdXRlckVyciA9IG1ha2VFcnJvcihcbiAgICBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuICAgIGVyckNvbnN0cnVjdG9yLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIGFubm90YXRlRXJyb3Iob3V0ZXJFcnIsIFhgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG4gIHRocm93IG91dGVyRXJyO1xufTskaM2PX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANKKhqaIBAACiAQAAIgAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXGNzxVBAAAFQQAAAsAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiLCJnZXRFbnZpcm9ubWVudE9wdGlvbiIsImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiLCJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG5cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5cbi8vXG5jb25zdCBsb2NhbFRoaXMgPSBnbG9iYWxUaGlzO1xuXG5jb25zdCB7IE9iamVjdCwgUmVmbGVjdCwgQXJyYXksIFN0cmluZywgSlNPTiwgRXJyb3IgfSA9IGxvY2FsVGhpcztcbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vL1xuLy9cbmNvbnN0IHVuY3VycnlUaGlzID1cbiAgZm4gPT5cbiAgKHJlY2VpdmVyLCAuLi5hcmdzKSA9PlxuICAgIGFwcGx5KGZuLCByZWNlaXZlciwgYXJncyk7XG5jb25zdCBhcnJheVB1c2ggPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5jb25zdCBhcnJheUluY2x1ZGVzID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcbmNvbnN0IHN0cmluZ1NwbGl0ID0gdW5jdXJyeVRoaXMoU3RyaW5nLnByb3RvdHlwZS5zcGxpdCk7XG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuY29uc3QgRmFpbCA9IChsaXRlcmFscywgLi4uYXJncykgPT4ge1xuICBsZXQgbXNnID0gbGl0ZXJhbHNbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIG1zZyA9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpICsgMV19YDtcbiAgfVxuICB0aHJvdyBFcnJvcihtc2cpO1xufTtcblxuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbnZpcm9ubWVudENhcHRvciA9IChhR2xvYmFsLCBkcm9wTmFtZXMgPSBmYWxzZSkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSBbXTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uID0gKFxuICAgIG9wdGlvbk5hbWUsXG4gICAgZGVmYXVsdFNldHRpbmcsXG4gICAgb3B0T3RoZXJWYWx1ZXMgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIHR5cGVvZiBvcHRpb25OYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYDtcbiAgICB0eXBlb2YgZGVmYXVsdFNldHRpbmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuICAgICAgICBkZWZhdWx0U2V0dGluZyxcbiAgICAgICl9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBzZXR0aW5nID0gZGVmYXVsdFNldHRpbmc7XG4gICAgY29uc3QgZ2xvYmFsUHJvY2VzcyA9IGFHbG9iYWwucHJvY2VzcyB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ2xvYmFsRW52ID1cbiAgICAgICh0eXBlb2YgZ2xvYmFsUHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgZ2xvYmFsUHJvY2Vzcy5lbnYpIHx8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGdsb2JhbEVudiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChvcHRpb25OYW1lIGluIGdsb2JhbEVudikge1xuICAgICAgICBpZiAoIWRyb3BOYW1lcykge1xuICAgICAgICAgIGFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsIG9wdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZ2xvYmFsRW52W29wdGlvbk5hbWVdO1xuICAgICAgICAvL1xuICAgICAgICB0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxuICAgICAgICAgICAgb3B0aW9uTmFtZSxcbiAgICAgICAgICApfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG4gICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICApfWA7XG4gICAgICAgIHNldHRpbmcgPSBvcHRpb25WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3B0T3RoZXJWYWx1ZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2V0dGluZyA9PT0gZGVmYXVsdFNldHRpbmcgfHxcbiAgICAgIGFycmF5SW5jbHVkZXMob3B0T3RoZXJWYWx1ZXMsIHNldHRpbmcpIHx8XG4gICAgICBGYWlsYFVucmVjb2duaXplZCAke3Eob3B0aW9uTmFtZSl9IHZhbHVlICR7cShcbiAgICAgICAgc2V0dGluZyxcbiAgICAgICl9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywgLi4ub3B0T3RoZXJWYWx1ZXNdKX1gO1xuICAgIHJldHVybiBzZXR0aW5nO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGxvY2FsVGhpcywgdHJ1ZSk7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uKGdldEVudmlyb25tZW50T3B0aW9uKTskaM2PX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTskaM2PX29uY2UuZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyhlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbnZpcm9ubWVudENhcHRvciI6WyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwiZ2V0RW52aXJvbm1lbnRPcHRpb24iOlsiZ2V0RW52aXJvbm1lbnRPcHRpb24iXSwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0Il0sImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABJNfbpVAgAAFQIAAAdAAAAQGVuZG8vZXJyb3JzLXYxLjIuMTMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuXG5jb25zdCBnbG9iYWxBc3NlcnQgPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuaWYgKGdsb2JhbEFzc2VydCA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BlbmRvL2Vycm9ycydgLFxuICApO1xufVxuXG5jb25zdCBtaXNzaW5nID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ3R5cGVvZicsXG4gICdlcnJvcicsXG4gICdmYWlsJyxcbiAgJ2VxdWFsJyxcbiAgJ3N0cmluZycsXG4gICdub3RlJyxcbiAgJ2RldGFpbHMnLFxuICAnRmFpbCcsXG4gICdxdW90ZScsXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gICdtYWtlQXNzZXJ0Jyxcbl0pLmZpbHRlcihuYW1lID0+IGdsb2JhbEFzc2VydFtuYW1lXSA9PT0gdW5kZWZpbmVkKTtcbmlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuICAgICAgJywgJyxcbiAgICApfWAsXG4gICk7XG59XG5cbi8vXG4vL1xuLy9cbmNvbnN0IHtcbiAgYmFyZSxcbiAgZGV0YWlsczogcmVkYWN0ZWQsXG4gIGVycm9yOiBtYWtlRXJyb3IsXG4gIEZhaWw6IHRocm93UmVkYWN0ZWQsXG4gIG1ha2VBc3NlcnQ6IF9vbWl0dGVkTWFrZUFzc2VydCxcbiAgbm90ZSxcbiAgcXVvdGUsXG4gIC4uLmFzc2VydGlvbnNcbn0gPSBnbG9iYWxBc3NlcnQ7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG4kaM2PX29uY2UucmVkYWN0ZWQocmVkYWN0ZWQpOyRozY9fb25jZS5tYWtlRXJyb3IobWFrZUVycm9yKTskaM2PX29uY2UudGhyb3dSZWRhY3RlZCh0aHJvd1JlZGFjdGVkKTskaM2PX29uY2Uubm90ZShub3RlKTskaM2PX29uY2UucXVvdGUocXVvdGUpO2NvbnN0IGFzc2VydD0odmFsdWUsb3B0RGV0YWlscyxlcnJDb250cnVjdG9yLG9wdGlvbnMpPT5cbiAgZ2xvYmFsQXNzZXJ0KHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKTskaM2PX29uY2UuYXNzZXJ0KGFzc2VydCk7XG5PYmplY3QuYXNzaWduKGFzc2VydCwgYXNzZXJ0aW9ucyk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IGJhcmVPclF1b3RlID0gYmFyZSB8fCBxdW90ZTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5iYXJlT3JRdW90ZShiYXJlT3JRdW90ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWRhY3RlZCI6WyJyZWRhY3RlZCJdLCJYIjpbInJlZGFjdGVkIl0sIm1ha2VFcnJvciI6WyJtYWtlRXJyb3IiXSwidGhyb3dSZWRhY3RlZCI6WyJ0aHJvd1JlZGFjdGVkIl0sIkZhaWwiOlsidGhyb3dSZWRhY3RlZCJdLCJub3RlIjpbIm5vdGUiXSwiYW5ub3RhdGVFcnJvciI6WyJub3RlIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwiYXNzZXJ0IjpbImFzc2VydCJdLCJiYXJlIjpbImJhcmVPclF1b3RlIl0sImIiOlsiYmFyZU9yUXVvdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmDBKcIoWAACKFgAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiLCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHJhY2tUdXJucyxtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsWyRozY9fYSA9PiAodHJhY2tUdXJucyA9ICRozY9fYSldXV1dLFtcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsLCBlcnJvcjogbWFrZUVycm9yIH0gPSBhc3NlcnQ7XG5jb25zdCB7IGFzc2lnbiwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qXG5cbiAqL1xuXG5jb25zdCBvblNlbmQgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fU0VORF9CUkVBS1BPSU5UUycpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlciA9IHtcbiAgc2V0KF90YXJnZXQsIF9wcm9wLCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzRXh0ZW5zaWJsZShfdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZihfdGFyZ2V0LCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIF9wcm9wKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxufTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzICE9PSByZWNlaXZlcikge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG1ha2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIFhgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocHJvcGVydHlLZXkpfVwiIG1ldGhvZCBvZiBFKCR7cShcbiAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICAgICAgKX0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHJlY2lwaWVudCwgcHJvcGVydHlLZXksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvL1xuICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgIH1cbiAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJnQXJyYXkpO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMgPT09IHJlY2VpdmVyIHx8XG4gICAgICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EoXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAgICl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHJlY2lwaWVudCl9KWA7XG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seShyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgIH1bcHJvcGVydHlLZXldLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ3NBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvL1xuICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgIH1cbiAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seShyZWNpcGllbnQsIGFyZ3NBcnJheSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVHZXRQcm94eUhhbmRsZXIgPSAoeCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBoYXM6IChfdGFyZ2V0LCBfcHJvcCkgPT4gdHJ1ZSxcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiBIYW5kbGVkUHJvbWlzZS5nZXQoeCwgcHJvcCksXG4gIH0pO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZ1bmNUYXJnZXQgPSBmcmVlemUoKCkgPT4ge30pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3Qgb2JqVGFyZ2V0ID0gZnJlZXplKHsgX19wcm90b19fOiBudWxsIH0pO1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1ha2VFID0gSGFuZGxlZFByb21pc2UgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGFzc2lnbihcbiAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIC8vXG4gICAgICB4ID0+IG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuICAgICAge1xuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgLy9cbiAgICAgICAgZ2V0OiB4ID0+IG5ldyBQcm94eShvYmpUYXJnZXQsIG1ha2VFR2V0UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgcmVzb2x2ZTogSGFuZGxlZFByb21pc2UucmVzb2x2ZSxcblxuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICBzZW5kT25seTogeCA9PlxuICAgICAgICAgIC8vXG4gICAgICAgICAgbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICB3aGVuOiAoeCwgb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpID0+XG4gICAgICAgICAgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKFxuICAgICAgICAgICAgLi4udHJhY2tUdXJucyhbb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWRdKSxcbiAgICAgICAgICApLFxuICAgICAgfSxcbiAgICApLFxuICApO1xufTtcblxuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0Om1ha2VFfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vL1xuLy9cbi8vXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGRANevSDgAA0g4AACcAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbG9jYWwuanN7ImltcG9ydHMiOlsiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TWV0aG9kTmFtZXMiLCJsb2NhbEFwcGx5RnVuY3Rpb24iLCJsb2NhbEFwcGx5TWV0aG9kIiwibG9jYWxHZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBnZXRQcm90b3R5cGVPZiwgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5LCBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG5jb25zdCBudHlwZW9mID0gc3BlY2ltZW4gPT4gKHNwZWNpbWVuID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHNwZWNpbWVuKTtcblxuY29uc3Qgb25EZWxpdmVyeSA9IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19ERUxJVkVSWV9CUkVBS1BPSU5UUycpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQgPSAoYSwgYikgPT4ge1xuICBpZiAodHlwZW9mIGEgPT09IHR5cGVvZiBiKSB7XG4gICAgY29uc3QgbGVmdCA9IFN0cmluZyhhKTtcbiAgICBjb25zdCByaWdodCA9IFN0cmluZyhiKTtcbiAgICAvL1xuICAgIHJldHVybiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwO1xuICB9XG4gIGlmICh0eXBlb2YgYSA9PT0gJ3N5bWJvbCcpIHtcbiAgICBhc3NlcnQodHlwZW9mIGIgPT09ICdzdHJpbmcnKTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgYXNzZXJ0KHR5cGVvZiBhID09PSAnc3RyaW5nJyk7XG4gIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N5bWJvbCcpO1xuICByZXR1cm4gMTtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kTmFtZXMgPSB2YWwgPT4ge1xuICBsZXQgbGF5ZXIgPSB2YWw7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpOyAvL1xuICB3aGlsZSAobGF5ZXIgIT09IG51bGwgJiYgbGF5ZXIgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAvL1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoZGVzY3MpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmICh0eXBlb2YgdmFsW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsYXllciA9IGdldFByb3RvdHlwZU9mKGxheWVyKTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbn07XG4vL1xuLy9cbiRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7ZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlGdW5jdGlvbiA9IChyZWNpcGllbnQsIGFyZ3MpID0+IHtcbiAgdHlwZW9mIHJlY2lwaWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAvL1xuICAgIGRlYnVnZ2VyOyAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXBwbHkocmVjaXBpZW50LCB1bmRlZmluZWQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseUZ1bmN0aW9uKGxvY2FsQXBwbHlGdW5jdGlvbik7XG5cbiAgICAgICBjb25zdCBsb2NhbEFwcGx5TWV0aG9kID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSwgYXJncykgPT4ge1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAvL1xuICAgIHJldHVybiBsb2NhbEFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdzKTtcbiAgfVxuICBpZiAocmVjaXBpZW50ID09PSB1bmRlZmluZWQgfHwgcmVjaXBpZW50ID09PSBudWxsKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBkZWxpdmVyICR7cShtZXRob2ROYW1lKX0gdG8gdGFyZ2V0OyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZm4gPSByZWNpcGllbnRbbWV0aG9kTmFtZV07XG4gIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYHRhcmdldCBoYXMgbm8gbWV0aG9kICR7cShtZXRob2ROYW1lKX0sIGhhcyAke3EoXG4gICAgICAgIGdldE1ldGhvZE5hbWVzKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmdHlwZSA9IG50eXBlb2YoZm4pO1xuICB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHxcbiAgICBGYWlsYGludm9rZWQgbWV0aG9kICR7cShtZXRob2ROYW1lKX0gaXMgbm90IGEgZnVuY3Rpb247IGl0IGlzIGEgJHtxKFxuICAgICAgZnR5cGUsXG4gICAgKX1gO1xuICBpZiAob25EZWxpdmVyeSAmJiBvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBtZXRob2ROYW1lKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShmbiwgcmVjaXBpZW50LCBhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmxvY2FsQXBwbHlNZXRob2QobG9jYWxBcHBseU1ldGhvZCk7XG5cbiAgICAgICBjb25zdCBsb2NhbEdldCA9ICh0LCBrZXkpID0+IHRba2V5XTskaM2PX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBoYXNPd24sIGZyZWV6ZSwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cbiAqL1xuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5jb25zdCBpc0pTT05SZWNvcmQgPSB2YWwgPT5cbiAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNpbXBsaWZ5VGFnID0gdGFnID0+IHtcbiAgZm9yIChjb25zdCBwcmVmaXggb2YgWydBbGxlZ2VkOiAnLCAnRGVidWdOYW1lOiAnXSkge1xuICAgIGlmICh0YWcuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICByZXR1cm4gdGFnLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFnO1xufTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSBvcHRpb25OYW1lID0+IHtcbiAgbGV0IGJyZWFrcG9pbnRzID0gSlNPTi5wYXJzZShnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnbnVsbCcpKTtcblxuICBpZiAoYnJlYWtwb2ludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBicmVha3BvaW50c1RhYmxlO1xuXG4gIGNvbnN0IGdldEJyZWFrcG9pbnRzID0gKCkgPT4gYnJlYWtwb2ludHM7XG4gIGZyZWV6ZShnZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2V0QnJlYWtwb2ludHMgPSAobmV3QnJlYWtwb2ludHMgPSBicmVha3BvaW50cykgPT4ge1xuICAgIGlzSlNPTlJlY29yZChuZXdCcmVha3BvaW50cykgfHxcbiAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24gdG8gYmUgYSBKU09OIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IG5ld0JyZWFrcG9pbnRzVGFibGUgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuXG4gICAgZm9yIChjb25zdCBbdGFnLCBtZXRob2RCUHNdIG9mIGVudHJpZXMobmV3QnJlYWtwb2ludHMpKSB7XG4gICAgICB0YWcgPT09IHNpbXBsaWZ5VGFnKHRhZykgfHxcbiAgICAgICAgRmFpbGBKdXN0IHVzZSBzaW1wbGUgdGFnICR7cShzaW1wbGlmeVRhZyh0YWcpKX0gcmF0aGVyIHRoYW4gJHtxKHRhZyl9YDtcbiAgICAgIGlzSlNPTlJlY29yZChtZXRob2RCUHMpIHx8XG4gICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EoXG4gICAgICAgICAgdGFnLFxuICAgICAgICApfSB0byBiZSBhIEpTT04gbWV0aG9kcyBicmVha3BvaW50cyByZWNvcmRgO1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgY291bnRdIG9mIGVudHJpZXMobWV0aG9kQlBzKSkge1xuICAgICAgICBjb3VudCA9PT0gJyonIHx8XG4gICAgICAgICAgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50KSAmJlxuICAgICAgICAgICAgY291bnQgPj0gMCkgfHxcbiAgICAgICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKHRhZyl9LiR7cShcbiAgICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKX0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbiAgICAgICAgY29uc3QgY2xhc3NCUHMgPSBoYXNPd24obmV3QnJlYWtwb2ludHNUYWJsZSwgbWV0aG9kTmFtZSlcbiAgICAgICAgICA/IG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV1cbiAgICAgICAgICA6IChuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdID0ge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cbiAgICBicmVha3BvaW50cyA9IG5ld0JyZWFrcG9pbnRzO1xuICAgIGJyZWFrcG9pbnRzVGFibGUgPSBuZXdCcmVha3BvaW50c1RhYmxlO1xuICB9O1xuICBmcmVlemUoc2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNob3VsZEJyZWFrcG9pbnQgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lKSA9PiB7XG4gICAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc0JQcyA9IGJyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gfHwgYnJlYWtwb2ludHNUYWJsZVsnKiddO1xuICAgIGlmIChjbGFzc0JQcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCB0YWcgPSBzaW1wbGlmeVRhZyhyZWNpcGllbnRbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG4gICAgbGV0IGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFnID0gJyonO1xuICAgICAgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291bnQgPT09ICcqJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzc2VydCh0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmIGNvdW50ID49IDEpO1xuICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudCAtIDE7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBmcmVlemUoc2hvdWxkQnJlYWtwb2ludCk7XG5cbiAgY29uc3QgYnJlYWtwb2ludFRlc3RlciA9IGZyZWV6ZSh7XG4gICAgZ2V0QnJlYWtwb2ludHMsXG4gICAgc2V0QnJlYWtwb2ludHMsXG4gICAgc2hvdWxkQnJlYWtwb2ludCxcbiAgfSk7XG4gIGJyZWFrcG9pbnRUZXN0ZXIuc2V0QnJlYWtwb2ludHMoKTtcbiAgcmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG59OyRozY9fb25jZS5tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbmZyZWV6ZShtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4dpSdXwMAAF8DAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRTskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKG1ha2VFID0gJGjNj19hKV1dXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgaHAgPSBIYW5kbGVkUHJvbWlzZTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaHAoaHApO1xuICAgICAgIGNvbnN0IEUgPSBtYWtlRShocCk7JGjNj19vbmNlLkUoRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAyOwHRckKAADJCgAALQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV0sW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuID0gMDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuXG4vL1xuY29uc3QgVkVSQk9TRSA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ3RyYWNrLXR1cm5zJyk7XG5cbi8vXG4vL1xuY29uc3QgRU5BQkxFRCA9XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgKGdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsICdkaXNhYmxlZCcsIFsnZW5hYmxlZCddKSkgPT09ICdlbmFibGVkJztcblxuLy9cbi8vXG4vL1xuLy9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZSA9IGRldGFpbHNOb3RlID0+IHJlYXNvbiA9PiB7XG4gIGlmIChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUocmVhc29uLCBkZXRhaWxzTm90ZSk7XG4gIH1cbiAgaWYgKFZFUkJPU0UpIHtcbiAgICBjb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLCByZWFzb24pO1xuICB9XG59O1xuXG5jb25zdCB3cmFwRnVuY3Rpb24gPVxuICAoZnVuYywgc2VuZGluZ0Vycm9yLCBYKSA9PlxuICAoLi4uYXJncykgPT4ge1xuICAgIGhpZGRlblByaW9yRXJyb3IgPSBzZW5kaW5nRXJyb3I7XG4gICAgaGlkZGVuQ3VycmVudFR1cm4gKz0gMTtcbiAgICBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgWGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFZFUkJPU0UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgY29uc3QgZGV0YWlsc05vdGUgPSBYYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG4gICAgICBQcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBoaWRkZW5QcmlvckVycm9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHJhY2tUdXJucyA9IGZ1bmNzID0+IHtcbiAgaWYgKCFFTkFCTEVEIHx8IHR5cGVvZiBnbG9iYWxUaGlzID09PSAndW5kZWZpbmVkJyB8fCAhZ2xvYmFsVGhpcy5hc3NlcnQpIHtcbiAgICByZXR1cm4gZnVuY3M7XG4gIH1cbiAgY29uc3QgeyBkZXRhaWxzOiBYLCBub3RlOiBhbm5vdGF0ZUVycm9yIH0gPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuICBoaWRkZW5DdXJyZW50RXZlbnQgKz0gMTtcbiAgY29uc3Qgc2VuZGluZ0Vycm9yID0gRXJyb3IoXG4gICAgYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICApO1xuICBpZiAoaGlkZGVuUHJpb3JFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYW5ub3RhdGVFcnJvcihzZW5kaW5nRXJyb3IsIFhgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gIH1cblxuICByZXR1cm4gLyogICAgICAgICAgICAqLyAoXG4gICAgZnVuY3MubWFwKGZ1bmMgPT4gZnVuYyAmJiB3cmFwRnVuY3Rpb24oZnVuYywgc2VuZGluZ0Vycm9yLCBYKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC91dGlscy5qc3siaW1wb3J0cyI6WyIuL3NyYy9sb2NhbC5qcyIsIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2xvY2FsLmpzXCIsIFtdXSxbXCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvbG9jYWwuanMiOltbImdldE1ldGhvZE5hbWVzIiwiZ2V0TWV0aG9kTmFtZXMiXV0sIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOltbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciIsIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3EXZo2ACAABgAgAAGgAAAEBlbmRvL2V4by12MS41LjEyL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiLCIuL3NyYy90eXBlcy5qcyIsIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2V4by1tYWtlcnMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6W1siR0VUX0lOVEVSRkFDRV9HVUFSRCIsIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOAg28LPFwAAzxcAACMAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIiwiLi9leG8tdG9vbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUV4byJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLEZhaWwscSxkZWZlbmRQcm90b3R5cGUsZGVmZW5kUHJvdG90eXBlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL2V4by10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsWyRozY9fYSA9PiAoZGVmZW5kUHJvdG90eXBlID0gJGjNj19hKV1dLFtcImRlZmVuZFByb3RvdHlwZUtpdFwiLFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBzZWFsLCBmcmVlemUsIGRlZmluZVByb3BlcnR5LCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLy9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUyA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ2xhYmVsLWluc3RhbmNlcycpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VTZWxmID0gKHByb3RvLCBpbnN0YW5jZUNvdW50KSA9PiB7XG4gIGNvbnN0IHNlbGYgPSBjcmVhdGUocHJvdG8pO1xuICBpZiAoTEFCRUxfSU5TVEFOQ0VTKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoc2VsZiwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICB2YWx1ZTogYCR7cHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXX0jJHtpbnN0YW5jZUNvdW50fWAsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihzZWxmKTtcbn07XG5cbmNvbnN0IGVtcHR5UmVjb3JkID0gaGFyZGVuKHt9KTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaW5pdEVtcHR5ID0gKCkgPT4gZW1wdHlSZWNvcmQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmluaXRFbXB0eShpbml0RW1wdHkpO1xuICAgICAgIGNvbnN0IGRlZmluZUV4b0NsYXNzID0gKFxuICB0YWcsXG4gIGludGVyZmFjZUd1YXJkLFxuICBpbml0LFxuICBtZXRob2RzLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgaGFyZGVuKG1ldGhvZHMpO1xuICBjb25zdCB7XG4gICAgZmluaXNoID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVBbXBsaWZpZXIgPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyID0gdW5kZWZpbmVkLFxuICB9ID0gb3B0aW9ucztcbiAgcmVjZWl2ZUFtcGxpZmllciA9PT0gdW5kZWZpbmVkIHx8XG4gICAgRmFpbGBPbmx5IGZhY2V0cyBvZiBhbiBleG8gY2xhc3Mga2l0IGNhbiBiZSBhbXBsaWZpZWQgJHtxKHRhZyl9YDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY29udGV4dE1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IHByb3RvID0gZGVmZW5kUHJvdG90eXBlKFxuICAgIHRhZyxcbiAgICBzZWxmID0+IC8qICAgICAgICAgICAgICAqLyAoY29udGV4dE1hcC5nZXQoc2VsZikpLFxuICAgIG1ldGhvZHMsXG4gICAgdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgKTtcbiAgbGV0IGluc3RhbmNlQ291bnQgPSAwO1xuICAvKlxuXG4gICAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2UgPSAoLi4uYXJncykgPT4ge1xuICAgIC8vXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIGluc3RhbmNlQ291bnQgKz0gMTtcbiAgICBjb25zdCBzZWxmID0gbWFrZVNlbGYocHJvdG8sIGluc3RhbmNlQ291bnQpO1xuXG4gICAgLy9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSBmcmVlemUoeyBzdGF0ZSwgc2VsZiB9KTtcbiAgICBjb250ZXh0TWFwLnNldChzZWxmLCBjb250ZXh0KTtcbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBmaW5pc2goY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIGlmIChyZWNlaXZlSW5zdGFuY2VUZXN0ZXIpIHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaXNJbnN0YW5jZSA9IChleG8sIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgZmFjZXROYW1lID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBmYWNldE5hbWUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGFuIGV4byBjbGFzcyBraXQ6ICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IGhhcyBubyBmYWNldCAke3EoZmFjZXROYW1lKX1gO1xuICAgICAgcmV0dXJuIGNvbnRleHRNYXAuaGFzKGV4byk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3MoZGVmaW5lRXhvQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWZpbmVFeG9DbGFzc0tpdCA9IChcbiAgdGFnLFxuICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgaW5pdCxcbiAgbWV0aG9kc0tpdCxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGhhcmRlbihtZXRob2RzS2l0KTtcbiAgY29uc3Qge1xuICAgIGZpbmlzaCA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlQW1wbGlmaWVyID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3RlciA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNvbnRleHRNYXBLaXQgPSBvYmplY3RNYXAobWV0aG9kc0tpdCwgKCkgPT4gbmV3IFdlYWtNYXAoKSk7XG4gIGNvbnN0IGdldENvbnRleHRLaXQgPSBvYmplY3RNYXAoXG4gICAgY29udGV4dE1hcEtpdCxcbiAgICBjb250ZXh0TWFwID0+IGZhY2V0ID0+IGNvbnRleHRNYXAuZ2V0KGZhY2V0KSxcbiAgKTtcbiAgY29uc3QgcHJvdG90eXBlS2l0ID0gZGVmZW5kUHJvdG90eXBlS2l0KFxuICAgIHRhZyxcbiAgICBnZXRDb250ZXh0S2l0LFxuICAgIG1ldGhvZHNLaXQsXG4gICAgdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgKTtcbiAgbGV0IGluc3RhbmNlQ291bnQgPSAwO1xuICAvKlxuXG4gICAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2VLaXQgPSAoLi4uYXJncykgPT4ge1xuICAgIC8vXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IHN0YXRlLCBmYWNldHM6IG51bGwgfTtcbiAgICBpbnN0YW5jZUNvdW50ICs9IDE7XG4gICAgY29uc3QgZmFjZXRzID0gb2JqZWN0TWFwKHByb3RvdHlwZUtpdCwgKHByb3RvLCBmYWNldE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBtYWtlU2VsZihwcm90bywgaW5zdGFuY2VDb3VudCk7XG4gICAgICBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0uc2V0KHNlbGYsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSk7XG4gICAgY29udGV4dC5mYWNldHMgPSBmYWNldHM7XG4gICAgLy9cbiAgICBmcmVlemUoY29udGV4dCk7XG4gICAgaWYgKGZpbmlzaCkge1xuICAgICAgZmluaXNoKGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAqLyAoY29udGV4dC5mYWNldHMpO1xuICB9O1xuXG4gIGlmIChyZWNlaXZlQW1wbGlmaWVyKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGFtcGxpZnkgPSBleG9GYWNldCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbnRleHRNYXAgb2YgdmFsdWVzKGNvbnRleHRNYXBLaXQpKSB7XG4gICAgICAgIGlmIChjb250ZXh0TWFwLmhhcyhleG9GYWNldCkpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gY29udGV4dE1hcC5nZXQoZXhvRmFjZXQpO1xuICAgICAgICAgIHJldHVybiBmYWNldHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IEZhaWxgTXVzdCBiZSBhIGZhY2V0IG9mICR7cSh0YWcpfTogJHtleG9GYWNldH1gO1xuICAgIH07XG4gICAgaGFyZGVuKGFtcGxpZnkpO1xuICAgIHJlY2VpdmVBbXBsaWZpZXIoYW1wbGlmeSk7XG4gIH1cblxuICBpZiAocmVjZWl2ZUluc3RhbmNlVGVzdGVyKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGlzSW5zdGFuY2UgPSAoZXhvRmFjZXQsIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGZhY2V0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMoY29udGV4dE1hcEtpdCkuc29tZShjb250ZXh0TWFwID0+XG4gICAgICAgICAgY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0LnR5cGVvZihmYWNldE5hbWUsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IGNvbnRleHRNYXAgPSBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV07XG4gICAgICBjb250ZXh0TWFwICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBleG8gY2xhc3Mga2l0ICR7cSh0YWcpfSBoYXMgbm8gZmFjZXQgbmFtZWQgJHtxKGZhY2V0TmFtZSl9YDtcbiAgICAgIHJldHVybiBjb250ZXh0TWFwLmhhcyhleG9GYWNldCk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2VLaXQpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRXhvID0gKHRhZywgaW50ZXJmYWNlR3VhcmQsIG1ldGhvZHMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgbWFrZUluc3RhbmNlID0gZGVmaW5lRXhvQ2xhc3MoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXRFbXB0eSxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIHJldHVybiBtYWtlSW5zdGFuY2UoKTtcbn07JGjNj19vbmNlLm1ha2VFeG8obWFrZUV4byk7XG5oYXJkZW4obWFrZUV4byk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbml0RW1wdHkiOlsiaW5pdEVtcHR5Il0sImRlZmluZUV4b0NsYXNzIjpbImRlZmluZUV4b0NsYXNzIl0sImRlZmluZUV4b0NsYXNzS2l0IjpbImRlZmluZUV4b0NsYXNzS2l0Il0sIm1ha2VFeG8iOlsibWFrZUV4byJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABCjUHrWjcAAFo3AAAiAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9nZXQtaW50ZXJmYWNlLmpzIl0sImV4cG9ydHMiOlsiZGVmZW5kUHJvdG90eXBlIiwiZGVmZW5kUHJvdG90eXBlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxnZXRSZW1vdGFibGVNZXRob2ROYW1lcyx0b1Rocm93YWJsZSxGYXIsbXVzdE1hdGNoLE0saXNBd2FpdEFyZ0d1YXJkLGlzUmF3R3VhcmQsZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQsZ2V0TWV0aG9kR3VhcmRQYXlsb2FkLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCxnZXRDb3B5TWFwRW50cmllcyxsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAscSxGYWlsLEdFVF9JTlRFUkZBQ0VfR1VBUkQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFJlbW90YWJsZU1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMgPSAkaM2PX2EpXV0sW1widG9UaHJvd2FibGVcIixbJGjNj19hID0+ICh0b1Rocm93YWJsZSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImlzQXdhaXRBcmdHdWFyZFwiLFskaM2PX2EgPT4gKGlzQXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJpc1Jhd0d1YXJkXCIsWyRozY9fYSA9PiAoaXNSYXdHdWFyZCA9ICRozY9fYSldXSxbXCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldE1ldGhvZEd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsWyRozY9fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vZ2V0LWludGVyZmFjZS5qc1wiLCBbW1wiR0VUX0lOVEVSRkFDRV9HVUFSRFwiLFskaM2PX2EgPT4gKEdFVF9JTlRFUkZBQ0VfR1VBUkQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZGVmaW5lUHJvcGVydGllcywgZnJvbUVudHJpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgUmF3TWV0aG9kR3VhcmQgPSBNLmNhbGwoKS5yZXN0KE0ucmF3KCkpLnJldHVybnMoTS5yYXcoKSk7XG5cbmNvbnN0IFJFREFDVEVEX1JBV19BUkcgPSAnPHJlZGFjdGVkIHJhdyBhcmc+JztcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IFBhc3NhYmxlTWV0aG9kR3VhcmQgPSBNLmNhbGwoKS5yZXN0KE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVmZW5kU3luY0FyZ3MgPSAoc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjbGFyZWRMZW4sXG4gICAgaGFzUmVzdEFyZ0d1YXJkLFxuICAgIHJlc3RBcmdHdWFyZElzUmF3LFxuICAgIHBhcmFtc1BhdHRlcm4sXG4gICAgcmVkYWN0ZWRJbmRpY2VzLFxuICB9ID0gbWF0Y2hDb25maWc7XG5cbiAgLy9cbiAgLy9cbiAgbGV0IG1hdGNoYWJsZUFyZ3MgPSBzeW5jQXJncztcbiAgaWYgKHJlc3RBcmdHdWFyZElzUmF3ICYmIHN5bmNBcmdzLmxlbmd0aCA+IGRlY2xhcmVkTGVuKSB7XG4gICAgY29uc3QgcmVzdExlbiA9IHN5bmNBcmdzLmxlbmd0aCAtIGRlY2xhcmVkTGVuO1xuICAgIGNvbnN0IHJlZGFjdGVkUmVzdCA9IEFycmF5KHJlc3RMZW4pLmZpbGwoUkVEQUNURURfUkFXX0FSRyk7XG4gICAgbWF0Y2hhYmxlQXJncyA9IFsuLi5zeW5jQXJncy5zbGljZSgwLCBkZWNsYXJlZExlbiksIC4uLnJlZGFjdGVkUmVzdF07XG4gIH0gZWxzZSBpZiAoXG4gICAgcmVkYWN0ZWRJbmRpY2VzLmxlbmd0aCA+IDAgJiZcbiAgICByZWRhY3RlZEluZGljZXNbMF0gPCBzeW5jQXJncy5sZW5ndGhcbiAgKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIG1hdGNoYWJsZUFyZ3MgPSBbLi4uc3luY0FyZ3NdO1xuICB9XG5cbiAgZm9yIChjb25zdCBpIG9mIHJlZGFjdGVkSW5kaWNlcykge1xuICAgIGlmIChpID49IG1hdGNoYWJsZUFyZ3MubGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbWF0Y2hhYmxlQXJnc1tpXSA9IFJFREFDVEVEX1JBV19BUkc7XG4gIH1cblxuICBtdXN0TWF0Y2goaGFyZGVuKG1hdGNoYWJsZUFyZ3MpLCBwYXJhbXNQYXR0ZXJuLCBsYWJlbCk7XG5cbiAgaWYgKGhhc1Jlc3RBcmdHdWFyZCkge1xuICAgIHJldHVybiBzeW5jQXJncztcbiAgfVxuICBzeW5jQXJncy5sZW5ndGggPD0gZGVjbGFyZWRMZW4gfHxcbiAgICBGYWlsYCR7cShsYWJlbCl9IGFjY2VwdHMgYXQgbW9zdCAke3EoZGVjbGFyZWRMZW4pfSBhcmd1bWVudHMsIG5vdCAke3EoXG4gICAgICBzeW5jQXJncy5sZW5ndGgsXG4gICAgKX06ICR7c3luY0FyZ3N9YDtcbiAgcmV0dXJuIHN5bmNBcmdzO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBidWlsZE1hdGNoQ29uZmlnID0gbWV0aG9kR3VhcmRQYXlsb2FkID0+IHtcbiAgY29uc3Qge1xuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcblxuICBjb25zdCBtYXRjaGFibGVBcmdHdWFyZHMgPSBbLi4uYXJnR3VhcmRzLCAuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbiAgY29uc3QgcmVkYWN0ZWRJbmRpY2VzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hhYmxlQXJnR3VhcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGlzUmF3R3VhcmQobWF0Y2hhYmxlQXJnR3VhcmRzW2ldKSkge1xuICAgICAgbWF0Y2hhYmxlQXJnR3VhcmRzW2ldID0gUkVEQUNURURfUkFXX0FSRztcbiAgICAgIHJlZGFjdGVkSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIGxldCBtYXRjaGFibGVSZXN0QXJnR3VhcmQgPSByZXN0QXJnR3VhcmQ7XG4gIGlmIChpc1Jhd0d1YXJkKG1hdGNoYWJsZVJlc3RBcmdHdWFyZCkpIHtcbiAgICBtYXRjaGFibGVSZXN0QXJnR3VhcmQgPSBNLmFycmF5T2YoUkVEQUNURURfUkFXX0FSRyk7XG4gIH1cbiAgY29uc3QgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkID0gaGFyZGVuKHtcbiAgICAuLi5tZXRob2RHdWFyZFBheWxvYWQsXG4gICAgYXJnR3VhcmRzOiBtYXRjaGFibGVBcmdHdWFyZHMuc2xpY2UoMCwgYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IG1hdGNoYWJsZUFyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICByZXN0QXJnR3VhcmQ6IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCxcbiAgfSk7XG5cbiAgY29uc3QgcGFyYW1zUGF0dGVybiA9IE0uc3BsaXRBcnJheShcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQuYXJnR3VhcmRzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5vcHRpb25hbEFyZ0d1YXJkcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQucmVzdEFyZ0d1YXJkLFxuICApO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGRlY2xhcmVkTGVuOiBtYXRjaGFibGVBcmdHdWFyZHMubGVuZ3RoLFxuICAgIGhhc1Jlc3RBcmdHdWFyZDogcmVzdEFyZ0d1YXJkICE9PSB1bmRlZmluZWQsXG4gICAgcmVzdEFyZ0d1YXJkSXNSYXc6IHJlc3RBcmdHdWFyZCAhPT0gbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkLFxuICAgIHBhcmFtc1BhdHRlcm4sXG4gICAgcmVkYWN0ZWRJbmRpY2VzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgZGVmZW5kU3luY01ldGhvZCA9IChcbiAgZ2V0Q29udGV4dCxcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgbGFiZWwsXG4pID0+IHtcbiAgY29uc3QgeyByZXR1cm5HdWFyZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBjb25zdCBpc1Jhd1JldHVybiA9IGlzUmF3R3VhcmQocmV0dXJuR3VhcmQpO1xuICBjb25zdCBtYXRjaENvbmZpZyA9IGJ1aWxkTWF0Y2hDb25maWcobWV0aG9kR3VhcmRQYXlsb2FkKTtcbiAgY29uc3QgeyBzeW5jTWV0aG9kIH0gPSB7XG4gICAgLy9cbiAgICBzeW5jTWV0aG9kKC4uLnN5bmNBcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzKTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgcmVhbEFyZ3MgPSBkZWZlbmRTeW5jQXJncyhzeW5jQXJncywgbWF0Y2hDb25maWcsIGxhYmVsKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHkoYmVoYXZpb3JNZXRob2QsIGNvbnRleHQsIHJlYWxBcmdzKTtcbiAgICAgICAgaWYgKCFpc1Jhd1JldHVybikge1xuICAgICAgICAgIG11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSwgcmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKHRocm93blRoaW5nKSB7XG4gICAgICAgIHRocm93IHRvVGhyb3dhYmxlKHRocm93blRoaW5nKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICByZXR1cm4gc3luY01ldGhvZDtcbn07XG5cbi8qXG5cbiAqL1xuY29uc3QgZGVzeW5jID0gbWV0aG9kR3VhcmRQYXlsb2FkID0+IHtcbiAgY29uc3Qge1xuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgIWlzQXdhaXRBcmdHdWFyZChyZXN0QXJnR3VhcmQpIHx8XG4gICAgRmFpbGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuICBjb25zdCByYXdBcmdHdWFyZHMgPSBbLi4uYXJnR3VhcmRzLCAuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbiAgY29uc3QgYXdhaXRJbmRleGVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3QXJnR3VhcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgYXJnR3VhcmQgPSByYXdBcmdHdWFyZHNbaV07XG4gICAgaWYgKGlzQXdhaXRBcmdHdWFyZChhcmdHdWFyZCkpIHtcbiAgICAgIHJhd0FyZ0d1YXJkc1tpXSA9IGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGFyZ0d1YXJkKS5hcmdHdWFyZDtcbiAgICAgIGF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGF3YWl0SW5kZXhlcyxcbiAgICByYXdNZXRob2RHdWFyZFBheWxvYWQ6IHtcbiAgICAgIC4uLm1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGFyZ0d1YXJkczogcmF3QXJnR3VhcmRzLnNsaWNlKDAsIGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHM6IHJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICB9LFxuICB9O1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZCA9IChcbiAgZ2V0Q29udGV4dCxcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgbGFiZWwsXG4pID0+IHtcbiAgY29uc3QgeyByZXR1cm5HdWFyZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBjb25zdCBpc1Jhd1JldHVybiA9IGlzUmF3R3VhcmQocmV0dXJuR3VhcmQpO1xuXG4gIGNvbnN0IHsgYXdhaXRJbmRleGVzLCByYXdNZXRob2RHdWFyZFBheWxvYWQgfSA9IGRlc3luYyhtZXRob2RHdWFyZFBheWxvYWQpO1xuICBjb25zdCBtYXRjaENvbmZpZyA9IGJ1aWxkTWF0Y2hDb25maWcocmF3TWV0aG9kR3VhcmRQYXlsb2FkKTtcblxuICBjb25zdCB7IGFzeW5jTWV0aG9kIH0gPSB7XG4gICAgLy9cbiAgICBhc3luY01ldGhvZCguLi5hcmdzKSB7XG4gICAgICBjb25zdCBhd2FpdExpc3QgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBhd2FpdEluZGV4ZXMpIHtcbiAgICAgICAgaWYgKGkgPj0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBhd2FpdExpc3QucHVzaChhcmdzW2ldKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHAgPSBQcm9taXNlLmFsbChhd2FpdExpc3QpO1xuICAgICAgY29uc3Qgc3luY0FyZ3MgPSBbLi4uYXJnc107XG4gICAgICBjb25zdCByZXN1bHRQID0gRS53aGVuKFxuICAgICAgICBwLFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gYXdhaXRlZEFyZ3MgPT4ge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXdhaXRlZEFyZ3MubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgIHN5bmNBcmdzW2F3YWl0SW5kZXhlc1tqXV0gPSBhd2FpdGVkQXJnc1tqXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KHRoaXMpO1xuICAgICAgICAgIGNvbnN0IHJlYWxBcmdzID0gZGVmZW5kU3luY0FyZ3Moc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCk7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLCBjb250ZXh0LCByZWFsQXJncyk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIEUud2hlbihyZXN1bHRQLCBmdWxmaWxsbWVudCA9PiB7XG4gICAgICAgIGlmICghaXNSYXdSZXR1cm4pIHtcbiAgICAgICAgICBtdXN0TWF0Y2goaGFyZGVuKGZ1bGZpbGxtZW50KSwgcmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bGZpbGxtZW50O1xuICAgICAgfSkuY2F0Y2gocmVhc29uID0+XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIFByb21pc2UucmVqZWN0KHRvVGhyb3dhYmxlKHJlYXNvbikpLFxuICAgICAgKTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gYXN5bmNNZXRob2Q7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kID0gKGdldENvbnRleHQsIGJlaGF2aW9yTWV0aG9kLCBtZXRob2RHdWFyZCwgbGFiZWwpID0+IHtcbiAgY29uc3QgbWV0aG9kR3VhcmRQYXlsb2FkID0gZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKG1ldGhvZEd1YXJkKTtcbiAgY29uc3QgeyBjYWxsS2luZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBpZiAoY2FsbEtpbmQgPT09ICdzeW5jJykge1xuICAgIHJldHVybiBkZWZlbmRTeW5jTWV0aG9kKFxuICAgICAgZ2V0Q29udGV4dCxcbiAgICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgICAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgbGFiZWwsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoY2FsbEtpbmQgPT09ICdhc3luYycpO1xuICAgIHJldHVybiBkZWZlbmRBc3luY01ldGhvZChcbiAgICAgIGdldENvbnRleHQsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGxhYmVsLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgYmluZE1ldGhvZCA9IChcbiAgbWV0aG9kVGFnLFxuICBjb250ZXh0UHJvdmlkZXIsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZCxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKGJlaGF2aW9yTWV0aG9kLCAnZnVuY3Rpb24nKTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IGdldENvbnRleHQgPSByZXByZXNlbnRhdGl2ZSA9PiB7XG4gICAgcmVwcmVzZW50YXRpdmUgfHxcbiAgICAgIC8vXG4gICAgICBGYWlsYE1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG4gICAgY29uc3QgY29udGV4dCA9IGNvbnRleHRQcm92aWRlcihyZXByZXNlbnRhdGl2ZSk7XG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRmFpbGAke3EoXG4gICAgICAgIG1ldGhvZFRhZyxcbiAgICAgICl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtyZXByZXNlbnRhdGl2ZX1gO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfTtcblxuICBjb25zdCBtZXRob2QgPSBkZWZlbmRNZXRob2QoXG4gICAgZ2V0Q29udGV4dCxcbiAgICBiZWhhdmlvck1ldGhvZCxcbiAgICBtZXRob2RHdWFyZCxcbiAgICBtZXRob2RUYWcsXG4gICk7XG5cbiAgZGVmaW5lUHJvcGVydGllcyhtZXRob2QsIHtcbiAgICBuYW1lOiB7IHZhbHVlOiBtZXRob2RUYWcgfSxcbiAgICBsZW5ndGg6IHsgdmFsdWU6IGJlaGF2aW9yTWV0aG9kLmxlbmd0aCB9LFxuICB9KTtcbiAgcmV0dXJuIG1ldGhvZDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWZlbmRQcm90b3R5cGUgPSAoXG4gIHRhZyxcbiAgY29udGV4dFByb3ZpZGVyLFxuICBiZWhhdmlvck1ldGhvZHMsXG4gIHRoaXNmdWxNZXRob2RzID0gZmFsc2UsXG4gIGludGVyZmFjZUd1YXJkID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGNvbnN0IHByb3RvdHlwZSA9IHt9O1xuICBjb25zdCBtZXRob2ROYW1lcyA9IGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKGJlaGF2aW9yTWV0aG9kcykuZmlsdGVyKFxuICAgIC8vXG4gICAgLy9cbiAgICBrZXkgPT4ge1xuICAgICAgaWYgKGtleSAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gYmVoYXZpb3JNZXRob2RzLmNvbnN0cnVjdG9yO1xuICAgICAgcmV0dXJuICEoXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSAmJlxuICAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPT09IGNvbnN0cnVjdG9yXG4gICAgICApO1xuICAgIH0sXG4gICk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IG1ldGhvZEd1YXJkcztcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZGVmYXVsdEd1YXJkcztcbiAgaWYgKGludGVyZmFjZUd1YXJkKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJmYWNlTmFtZSxcbiAgICAgIG1ldGhvZEd1YXJkczogbWcsXG4gICAgICBzeW1ib2xNZXRob2RHdWFyZHMsXG4gICAgICBzbG9wcHksXG4gICAgICBkZWZhdWx0R3VhcmRzOiBkZyA9IHNsb3BweSA/ICdwYXNzYWJsZScgOiBkZWZhdWx0R3VhcmRzLFxuICAgIH0gPSBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoaW50ZXJmYWNlR3VhcmQpO1xuICAgIG1ldGhvZEd1YXJkcyA9IGhhcmRlbih7XG4gICAgICAuLi5tZyxcbiAgICAgIC4uLihzeW1ib2xNZXRob2RHdWFyZHMgJiZcbiAgICAgICAgZnJvbUVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMoc3ltYm9sTWV0aG9kR3VhcmRzKSkpLFxuICAgIH0pO1xuICAgIGRlZmF1bHRHdWFyZHMgPSBkZztcbiAgICB7XG4gICAgICBjb25zdCBtZXRob2RHdWFyZE5hbWVzID0gb3duS2V5cyhtZXRob2RHdWFyZHMpO1xuICAgICAgY29uc3QgdW5pbXBsZW1lbnRlZCA9IGxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsIG1ldGhvZE5hbWVzKTtcbiAgICAgIHVuaW1wbGVtZW50ZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgbWV0aG9kcyAke3EodW5pbXBsZW1lbnRlZCl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuICAgICAgaWYgKGRlZmF1bHRHdWFyZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB1bmd1YXJkZWQgPSBsaXN0RGlmZmVyZW5jZShtZXRob2ROYW1lcywgbWV0aG9kR3VhcmROYW1lcyk7XG4gICAgICAgIHVuZ3VhcmRlZC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICBGYWlsYG1ldGhvZHMgJHtxKHVuZ3VhcmRlZCl9IG5vdCBndWFyZGVkIGJ5ICR7cShpbnRlcmZhY2VOYW1lKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcykge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gYmVoYXZpb3JNZXRob2RzW3Byb3BdO1xuICAgIGNvbnN0IHsgc2hpZnRlZE1ldGhvZCB9ID0ge1xuICAgICAgc2hpZnRlZE1ldGhvZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBiZWhhdmlvck1ldGhvZCA9IHRoaXNmdWxNZXRob2RzID8gb3JpZ2luYWxNZXRob2QgOiBzaGlmdGVkTWV0aG9kO1xuICAgIC8vXG4gICAgLy9cbiAgICBsZXQgbWV0aG9kR3VhcmQgPSBtZXRob2RHdWFyZHMgJiYgbWV0aG9kR3VhcmRzW3Byb3BdO1xuICAgIGlmICghbWV0aG9kR3VhcmQpIHtcbiAgICAgIHN3aXRjaCAoZGVmYXVsdEd1YXJkcykge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICAgIGlmICh0aGlzZnVsTWV0aG9kcykge1xuICAgICAgICAgICAgbWV0aG9kR3VhcmQgPSBQYXNzYWJsZU1ldGhvZEd1YXJkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXRob2RHdWFyZCA9IFJhd01ldGhvZEd1YXJkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXNzYWJsZSc6IHtcbiAgICAgICAgICBtZXRob2RHdWFyZCA9IFBhc3NhYmxlTWV0aG9kR3VhcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncmF3Jzoge1xuICAgICAgICAgIG1ldGhvZEd1YXJkID0gUmF3TWV0aG9kR3VhcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIGRlZmF1bHRHdWFyZHMgJHtxKGRlZmF1bHRHdWFyZHMpfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJvdG90eXBlW3Byb3BdID0gYmluZE1ldGhvZChcbiAgICAgIGBJbiAke3EocHJvcCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXIsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkLFxuICAgICk7XG4gIH1cblxuICBpZiAoIWhhc093bihwcm90b3R5cGUsIEdFVF9JTlRFUkZBQ0VfR1VBUkQpKSB7XG4gICAgY29uc3QgZ2V0SW50ZXJmYWNlR3VhcmRNZXRob2QgPSB7XG4gICAgICBbR0VUX0lOVEVSRkFDRV9HVUFSRF0oKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBpbnRlcmZhY2VHdWFyZDtcbiAgICAgIH0sXG4gICAgfVtHRVRfSU5URVJGQUNFX0dVQVJEXTtcbiAgICBwcm90b3R5cGVbR0VUX0lOVEVSRkFDRV9HVUFSRF0gPSBiaW5kTWV0aG9kKFxuICAgICAgYEluICR7cShHRVRfSU5URVJGQUNFX0dVQVJEKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbiAgICAgIGNvbnRleHRQcm92aWRlcixcbiAgICAgIGdldEludGVyZmFjZUd1YXJkTWV0aG9kLFxuICAgICAgUGFzc2FibGVNZXRob2RHdWFyZCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIEZhcih0YWcsIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocHJvdG90eXBlKSk7XG59OyRozY9fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVmZW5kUHJvdG90eXBlS2l0ID0gKFxuICB0YWcsXG4gIGNvbnRleHRQcm92aWRlcktpdCxcbiAgYmVoYXZpb3JNZXRob2RzS2l0LFxuICB0aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuICBpbnRlcmZhY2VHdWFyZEtpdCA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBmYWNldE5hbWVzID0gb3duS2V5cyhiZWhhdmlvck1ldGhvZHNLaXQpLnNvcnQoKTtcbiAgZmFjZXROYW1lcy5sZW5ndGggPiAxIHx8IEZhaWxgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG4gIGlmIChpbnRlcmZhY2VHdWFyZEtpdCkge1xuICAgIGNvbnN0IGludGVyZmFjZU5hbWVzID0gb3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG4gICAgY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGludGVyZmFjZU5hbWVzKTtcbiAgICBleHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgY29uc3QgZXh0cmFGYWNldE5hbWVzID0gbGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsIGZhY2V0TmFtZXMpO1xuICAgIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gIH1cbiAgY29uc3QgY29udGV4dE1hcE5hbWVzID0gb3duS2V5cyhjb250ZXh0UHJvdmlkZXJLaXQpO1xuICBjb25zdCBleHRyYUNvbnRleHROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGNvbnRleHRNYXBOYW1lcyk7XG4gIGV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gIGNvbnN0IGV4dHJhRmFjZXROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGNvbnRleHRNYXBOYW1lcywgZmFjZXROYW1lcyk7XG4gIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG1pc3NpbmcgY29udGV4dHNgO1xuICBjb25zdCBwcm90b0tpdCA9IG9iamVjdE1hcChiZWhhdmlvck1ldGhvZHNLaXQsIChiZWhhdmlvck1ldGhvZHMsIGZhY2V0TmFtZSkgPT5cbiAgICBkZWZlbmRQcm90b3R5cGUoXG4gICAgICBgJHt0YWd9ICR7U3RyaW5nKGZhY2V0TmFtZSl9YCxcbiAgICAgIGNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuICAgICAgYmVoYXZpb3JNZXRob2RzLFxuICAgICAgdGhpc2Z1bE1ldGhvZHMsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCAmJiBpbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdLFxuICAgICksXG4gICk7XG4gIHJldHVybiBwcm90b0tpdDtcbn07JGjNj19vbmNlLmRlZmVuZFByb3RvdHlwZUtpdChkZWZlbmRQcm90b3R5cGVLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADYtGZpPAgAATwIAACYAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZ2V0LWludGVyZmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IEdFVF9JTlRFUkZBQ0VfR1VBUkQgPSAnX19nZXRJbnRlcmZhY2VHdWFyZF9fJztcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLkdFVF9JTlRFUkZBQ0VfR1VBUkQoR0VUX0lOVEVSRkFDRV9HVUFSRCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJHRVRfSU5URVJGQUNFX0dVQVJEIjpbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAHgAAAEBlbmRvL2V4by12MS41LjEyL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAgAAAAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqSbWUJgCAACYAgAAHgAAAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZXhwb3J0cy5qcyJdLCJleHBvcnRzIjpbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dLFtcIi4vZXhwb3J0cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL2V2ZW50dWFsLXNlbmQiOltbIkUiLCJFIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJGYXIiLCJGYXIiXSxbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIiwicGFzc2FibGVBc0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXSxbInBhc3NhYmxlQXNKdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIl0sWyJxcCIsInFwIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZVBhc3NhYmxlS2l0IiwibWFrZVBhc3NhYmxlS2l0Il0sWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbImNvbXBhcmVOdW1lcmljcyIsImNvbXBhcmVOdW1lcmljcyJdLFsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiXSxbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/V3tcLZQAAC2UAAAKgAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZVBhc3NhYmxlS2l0IiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixhc3NlcnRSZWNvcmQsaXNFcnJvckxpa2UsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxiLHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcImJcIixbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgZnJvbUVudHJpZXMsIGlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8vXG5jb25zdCByQzAgPSAvW1xceDAwLVxceDFGXS87XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZ2V0U3VmZml4ID0gKHN0ciwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IHN0ciA6IHN0ci5zdWJzdHJpbmcoaW5kZXgpKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcmVjb3JkTmFtZXMgPSByZWNvcmQgPT5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaGFyZGVuKC8qICAgICAgICAgICAgICAgICAgICovIChvd25LZXlzKHJlY29yZCkpLnNvcnQoKS5yZXZlcnNlKCkpOyRozY9fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCByZWNvcmRWYWx1ZXMgPSAocmVjb3JkLCBuYW1lcykgPT5cbiAgaGFyZGVuKG5hbWVzLm1hcChuYW1lID0+IHJlY29yZFtuYW1lXSkpOyRozY9fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG5jb25zdCB6ZXJvZXMgPSBBcnJheSgxNilcbiAgLmZpbGwodW5kZWZpbmVkKVxuICAubWFwKChfLCBpKSA9PiAnMCcucmVwZWF0KGkpKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHplcm9QYWQgPSAobiwgc2l6ZSkgPT4ge1xuICBjb25zdCBuU3RyID0gYCR7bn1gO1xuICBjb25zdCBmaWxsTGVuID0gc2l6ZSAtIG5TdHIubGVuZ3RoO1xuICBpZiAoZmlsbExlbiA9PT0gMCkgcmV0dXJuIG5TdHI7XG4gIGFzc2VydChmaWxsTGVuID4gMCAmJiBmaWxsTGVuIDwgemVyb2VzLmxlbmd0aCk7XG4gIHJldHVybiBgJHt6ZXJvZXNbZmlsbExlbl19JHtuU3RyfWA7XG59OyRozY9fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGFzTnVtYmVyID0gbmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cyA9IG5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzID0gJ2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQgPSBuID0+IHtcbiAgLy9cbiAgaWYgKGlzKG4sIC0wKSkge1xuICAgIG4gPSAwO1xuICB9IGVsc2UgaWYgKGlzKG4sIE5hTikpIHtcbiAgICByZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiAgfVxuICBhc051bWJlclswXSA9IG47XG4gIGxldCBiaXRzID0gYXNCaXRzWzBdO1xuICBpZiAobiA8IDApIHtcbiAgICBiaXRzIF49IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gIH0gZWxzZSB7XG4gICAgYml0cyBePSAweDgwMDAwMDAwMDAwMDAwMDBuO1xuICB9XG4gIHJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwgMTYpfWA7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBkZWNvZGVCaW5hcnk2NCA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICBlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJ2YnIHx8IEZhaWxgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgYml0cyA9IEJpZ0ludChgMHgke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSl9YCk7XG4gIGlmIChlbmNvZGVkLmNoYXJBdChza2lwICsgMSkgPCAnOCcpIHtcbiAgICBiaXRzIF49IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gIH0gZWxzZSB7XG4gICAgYml0cyBePSAweDgwMDAwMDAwMDAwMDAwMDBuO1xuICB9XG4gIGFzQml0c1swXSA9IGJpdHM7XG4gIGNvbnN0IHJlc3VsdCA9IGFzTnVtYmVyWzBdO1xuICAhaXMocmVzdWx0LCAtMCkgfHxcbiAgICBGYWlsYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludCA9IG4gPT4ge1xuICBjb25zdCBhYnMgPSBuIDwgMG4gPyAtbiA6IG47XG4gIGNvbnN0IG5EaWdpdHMgPSBhYnMudG9TdHJpbmcoKS5sZW5ndGg7XG4gIGNvbnN0IGxEaWdpdHMgPSBuRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBpZiAobiA8IDBuKSB7XG4gICAgcmV0dXJuIGBuJHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgJyMnLnJlcGVhdChsRGlnaXRzIC0gMSlcbiAgICB9JHtcbiAgICAgIC8vXG4gICAgICAoMTAgKiogbERpZ2l0cyAtIG5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywgJzAnKVxuICAgIH06JHtcbiAgICAgIC8vXG4gICAgICAoMTBuICoqIEJpZ0ludChuRGlnaXRzKSArIG4pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywgJzAnKVxuICAgIH1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgcCR7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgICd+Jy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvL1xuICAgICAgbkRpZ2l0c1xuICAgIH06JHtcbiAgICAgIC8vXG4gICAgICBuXG4gICAgfWA7XG4gIH1cbn07XG5cbmNvbnN0IHJCaWdJbnRQYXlsb2FkID0gLyhbMC05XSspKDooWzAtOV0rJHwpfCkvcztcblxuLypcblxuXG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludCA9IGVuY29kZWQgPT4ge1xuICBjb25zdCB0eXBlUHJlZml4ID0gZW5jb2RlZC5jaGFyQXQoMCk7IC8vXG4gIHR5cGVQcmVmaXggPT09ICdwJyB8fFxuICAgIHR5cGVQcmVmaXggPT09ICduJyB8fFxuICAgIEZhaWxgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIGNvbnN0IHtcbiAgICBpbmRleDogbERpZ2l0cyxcbiAgICAxOiBzbkRpZ2l0cyxcbiAgICAyOiB0YWlsLFxuICAgIDM6IGRpZ2l0cyxcbiAgfSA9IGVuY29kZWQubWF0Y2gockJpZ0ludFBheWxvYWQpIHx8IEZhaWxgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIHNuRGlnaXRzLmxlbmd0aCA9PT0gbERpZ2l0cyB8fFxuICAgIEZhaWxgVW5hcnktcHJlZml4ZWQgZGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuRGlnaXRzID0gcGFyc2VJbnQoc25EaWdpdHMsIDEwKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8vXG4gICAgLy9cbiAgICBuRGlnaXRzID0gMTAgKiogLyogICAgICAgICAgICAgICAgICovIChsRGlnaXRzKSAtIG5EaWdpdHM7XG4gIH1cblxuICB0YWlsLmNoYXJBdCgwKSA9PT0gJzonIHx8IEZhaWxgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgZGlnaXRzLmxlbmd0aCA9PT0gbkRpZ2l0cyB8fFxuICAgIEZhaWxgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IG4gPSBCaWdJbnQoZGlnaXRzKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8vXG4gICAgLy9cbiAgICBuID0gLSgxMG4gKiogQmlnSW50KG5EaWdpdHMpIC0gbik7XG4gIH1cblxuICByZXR1cm4gbjtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc3RyaW5nRXNjYXBlcyA9IEFycmF5KDB4MjIpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgY3ApID0+IHtcbiAgICBzd2l0Y2ggKFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApKSB7XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgcmV0dXJuICchXyc7XG4gICAgICBjYXNlICchJzpcbiAgICAgICAgcmV0dXJuICchfCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCEke1N0cmluZy5mcm9tQ2hhckNvZGUoY3AgKyAweDIxKX1gO1xuICAgIH1cbiAgfSk7XG5zdHJpbmdFc2NhcGVzWydeJy5jaGFyQ29kZUF0KDApXSA9ICdfQCc7XG5zdHJpbmdFc2NhcGVzWydfJy5jaGFyQ29kZUF0KDApXSA9ICdfXyc7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBzdHIgPT5cbiAgc3RyLnJlcGxhY2UoL1tcXDAtIV5fXS9nLCBjaCA9PiBzdHJpbmdFc2NhcGVzW2NoLmNoYXJDb2RlQXQoMCldKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4ge1xuICByZXR1cm4gZW5jb2RlZC5yZXBsYWNlKC8oW1xcMC0hX10pKC58XFxuKT8vZywgKGVzYywgcHJlZml4LCBzdWZmaXgpID0+IHtcbiAgICBzd2l0Y2ggKGVzYykge1xuICAgICAgY2FzZSAnIV8nOlxuICAgICAgICByZXR1cm4gJyAnO1xuICAgICAgY2FzZSAnIXwnOlxuICAgICAgICByZXR1cm4gJyEnO1xuICAgICAgY2FzZSAnX0AnOlxuICAgICAgICByZXR1cm4gJ14nO1xuICAgICAgY2FzZSAnX18nOlxuICAgICAgICByZXR1cm4gJ18nO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBjaCA9IC8qICAgICAgICAgICAgICAgICAqLyAoc3VmZml4KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgKHByZWZpeCA9PT0gJyEnICYmIHN1ZmZpeCAhPT0gdW5kZWZpbmVkICYmIGNoID49ICchJyAmJiBjaCA8PSAnQCcpIHx8XG4gICAgICAgICAgRmFpbGBpbnZhbGlkIHN0cmluZyBlc2NhcGU6ICR7cShlc2MpfWA7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgLSAweDIxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4ID0gc3RyID0+IHN0cjtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4ID0gZW5jb2RlZCA9PiBlbmNvZGVkO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ14nXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgY2hhcnMucHVzaChlbmMsICcgJyk7XG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGxldCBkZXB0aCA9IDA7XG4gIC8vXG4gIC8vXG4gIGxldCBuZXh0SW5kZXggPSBza2lwICsgMTtcbiAgbGV0IGN1cnJlbnRFbGVtZW50U3RhcnQgPSBza2lwICsgMTtcbiAgZm9yIChjb25zdCB7IDA6IGNoLCBpbmRleDogaSB9IG9mIGVuY29kZWQubWF0Y2hBbGwoL1tcXF4gXS9nKSkge1xuICAgIGNvbnN0IGluZGV4ID0gLyogICAgICAgICAgICAgICAgICovIChpKTtcbiAgICBpZiAoaW5kZXggPD0gc2tpcCkge1xuICAgICAgaWYgKGluZGV4ID09PSBza2lwKSB7XG4gICAgICAgIGNoID09PSAnXicgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2ggPT09ICdeJykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBkZXB0aCArPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgaWYgKGluZGV4ID09PSBuZXh0SW5kZXgpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVwdGggLT0gMTtcbiAgICAgICAgZGVwdGggPj0gMCB8fFxuICAgICAgICAgIC8vXG4gICAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcjogJHtlbmNvZGVkLnNsaWNlKHNraXAsIGluZGV4ICsgMil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAvL1xuICAgICAgICBlbGVtZW50cy5wdXNoKFxuICAgICAgICAgIGRlY29kZVBhc3NhYmxlKGVuY29kZWQuc2xpY2UoY3VycmVudEVsZW1lbnRTdGFydCwgaW5kZXgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgY3VycmVudEVsZW1lbnRTdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9cbiAgICBuZXh0SW5kZXggPSBpbmRleCArIDE7XG4gIH1cbiAgZGVwdGggPT09IDAgfHwgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIG5leHRJbmRleCA9PT0gZW5jb2RlZC5sZW5ndGggfHxcbiAgICBGYWlsYHVudGVybWluYXRlZCBhcnJheSBlbGVtZW50OiAke2dldFN1ZmZpeChcbiAgICAgIGVuY29kZWQsXG4gICAgICBjdXJyZW50RWxlbWVudFN0YXJ0LFxuICAgICl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ1snXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgZm9yIChjb25zdCBjIG9mIGVuYykge1xuICAgICAgaWYgKGMgPT09ICdcXHUwMDAwJyB8fCBjID09PSAnXFx1MDAwMScpIHtcbiAgICAgICAgY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuICAgICAgfVxuICAgICAgY2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGNvbnN0IGVsZW1DaGFycyA9IFtdO1xuICAvL1xuICAvL1xuICBsZXQgc3RpbGxUb1NraXAgPSBza2lwICsgMTtcbiAgbGV0IGluRXNjYXBlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgYyBvZiBlbmNvZGVkKSB7XG4gICAgaWYgKHN0aWxsVG9Ta2lwID4gMCkge1xuICAgICAgc3RpbGxUb1NraXAgLT0gMTtcbiAgICAgIGlmIChzdGlsbFRvU2tpcCA9PT0gMCkge1xuICAgICAgICBjID09PSAnWycgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5Fc2NhcGUpIHtcbiAgICAgIGMgPT09ICdcXHUwMDAwJyB8fFxuICAgICAgICBjID09PSAnXFx1MDAwMScgfHxcbiAgICAgICAgRmFpbGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7Y31gO1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRFbGVtZW50ID0gZWxlbUNoYXJzLmpvaW4oJycpO1xuICAgICAgZWxlbUNoYXJzLmxlbmd0aCA9IDA7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHUwMDAxJykge1xuICAgICAgaW5Fc2NhcGUgPSB0cnVlO1xuICAgICAgLy9cbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtQ2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgaW5Fc2NhcGUgPSBmYWxzZTtcbiAgfVxuICAhaW5Fc2NhcGUgfHwgRmFpbGB1bmV4cGVjdGVkIGVuZCBvZiBlbmNvZGluZyAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBlbGVtQ2hhcnMubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUJ5dGVBcnJheSA9IChieXRlQXJyYXksIF9lbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAvL1xuICBGYWlsYGVuY29kZVBhc3NhYmxlKGJ5dGVBcnJheSkgbm90IHlldCBpbXBsZW1lbnRlZDogJHtieXRlQXJyYXl9YDtcbiAgcmV0dXJuICcnOyAvL1xufTtcblxuY29uc3QgZW5jb2RlUmVjb3JkID0gKHJlY29yZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IG5hbWVzID0gcmVjb3JkTmFtZXMocmVjb3JkKTtcbiAgY29uc3QgdmFsdWVzID0gcmVjb3JkVmFsdWVzKHJlY29yZCwgbmFtZXMpO1xuICByZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsIHZhbHVlc10pLCBlbmNvZGVQYXNzYWJsZSl9YDtcbn07XG5cbmNvbnN0IGRlY29kZVJlY29yZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJygnKTtcbiAgLy9cbiAgLy9cbiAgY29uc3QgdW56aXBwZWRFbnRyaWVzID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdW56aXBwZWRFbnRyaWVzLmxlbmd0aCA9PT0gMiB8fFxuICAgIEZhaWxgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgW2tleXMsIHZhbHNdID0gdW56aXBwZWRFbnRyaWVzO1xuXG4gIChwYXNzU3R5bGVPZihrZXlzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBwYXNzU3R5bGVPZih2YWxzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBrZXlzLmxlbmd0aCA9PT0gdmFscy5sZW5ndGggJiZcbiAgICBrZXlzLmV2ZXJ5KGtleSA9PiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykpIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IG1hcEVudHJpZXMgPSBrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWxzW2ldXSk7XG4gIGNvbnN0IHJlY29yZCA9IGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG4gIGFzc2VydFJlY29yZChyZWNvcmQsICdkZWNvZGVkIHJlY29yZCcpO1xuICByZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkID0gKHRhZ2dlZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PlxuICBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSwgdGFnZ2VkLnBheWxvYWRdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJzonKTtcbiAgLy9cbiAgLy9cbiAgY29uc3QgdGFnZ2VkUGF5bG9hZCA9IGRlY29kZUFycmF5KGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwICsgMSk7XG4gIHRhZ2dlZFBheWxvYWQubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBbdGFnLCBwYXlsb2FkXSA9IHRhZ2dlZFBheWxvYWQ7XG4gIHBhc3NTdHlsZU9mKHRhZykgPT09ICdzdHJpbmcnIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCk7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUmVtb3RhYmxlID0gKHVuc2FmZUVuY29kZVJlbW90YWJsZSwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gKHIsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVSZW1vdGFibGUociwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJ3InKSB8fFxuICAgICAgRmFpbGBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdSZW1vdGFibGUnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVSZW1vdGFibGU7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUHJvbWlzZSA9ICh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gKHAsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVQcm9taXNlKHAsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICc/JykgfHxcbiAgICAgIEZhaWxgUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1Byb21pc2UnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVQcm9taXNlO1xufTtcblxuY29uc3QgbWFrZUVuY29kZUVycm9yID0gKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVFcnJvciA9IChlcnIsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVFcnJvcihlcnIsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICchJykgfHxcbiAgICAgIEZhaWxgRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdFcnJvcicpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZUVycm9yO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlSW5uZXJFbmNvZGUgPSAoZW5jb2RlU3RyaW5nU3VmZml4LCBlbmNvZGVBcnJheSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlOiB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgZW5jb2RlUHJvbWlzZTogdW5zYWZlRW5jb2RlUHJvbWlzZSxcbiAgICBlbmNvZGVFcnJvcjogdW5zYWZlRW5jb2RlRXJyb3IsXG4gICAgdmVyaWZ5RW5jb2RpbmcgPSAoKSA9PiB7fSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGVuY29kZVJlbW90YWJsZSA9IG1ha2VFbmNvZGVSZW1vdGFibGUoXG4gICAgdW5zYWZlRW5jb2RlUmVtb3RhYmxlLFxuICAgIHZlcmlmeUVuY29kaW5nLFxuICApO1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gbWFrZUVuY29kZVByb21pc2UodW5zYWZlRW5jb2RlUHJvbWlzZSwgdmVyaWZ5RW5jb2RpbmcpO1xuICBjb25zdCBlbmNvZGVFcnJvciA9IG1ha2VFbmNvZGVFcnJvcih1bnNhZmVFbmNvZGVFcnJvciwgdmVyaWZ5RW5jb2RpbmcpO1xuXG4gIGNvbnN0IGlubmVyRW5jb2RlID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzoge1xuICAgICAgICByZXR1cm4gJ3YnO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJ3onO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICByZXR1cm4gYHMke2VuY29kZVN0cmluZ1N1ZmZpeChwYXNzYWJsZSl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiB7XG4gICAgICAgIHJldHVybiBgYiR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZW1vdGFibGUocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVQcm9taXNlKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgcmV0dXJuIGB5JHtlbmNvZGVTdHJpbmdTdWZmaXgobmFtZSl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCeXRlQXJyYXkocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckVuY29kZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gIC8qICAgICAgICAgICAgICAgICAgKi8gKHtcbiAgICBkZWNvZGVSZW1vdGFibGU6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZVByb21pc2U6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZUVycm9yOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgfSlcbik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlID0gKGRlY29kZVN0cmluZ1N1ZmZpeCwgZGVjb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbm5lckRlY29kZSA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICAgIHN3aXRjaCAoZW5jb2RlZC5jaGFyQXQoc2tpcCkpIHtcbiAgICAgIGNhc2UgJ3YnOiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY2FzZSAneic6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2YnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3MnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdiJzoge1xuICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpO1xuICAgICAgICBpZiAoc3Vic3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJpbmcgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gICAgICB9XG4gICAgICBjYXNlICduJzpcbiAgICAgIGNhc2UgJ3AnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3InOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZW1vdGFibGUoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICc/Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3knOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ14nOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICcoJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICc6Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJEZWNvZGU7XG59O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVBhc3NhYmxlS2l0ID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlID0gKHIsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuICAgIGVuY29kZVByb21pc2UgPSAocCwgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cH1gLFxuICAgIGVuY29kZUVycm9yID0gKGVyciwgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gLFxuICAgIGZvcm1hdCA9ICdsZWdhY3lPcmRlcmVkJyxcblxuICAgIGRlY29kZVJlbW90YWJsZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZVByb21pc2UgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlRXJyb3IgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICB9ID0gb3B0aW9ucztcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZW5jb2RlUGFzc2FibGU7XG4gIGNvbnN0IGVuY29kZU9wdGlvbnMgPSB7IGVuY29kZVJlbW90YWJsZSwgZW5jb2RlUHJvbWlzZSwgZW5jb2RlRXJyb3IsIGZvcm1hdCB9O1xuICBpZiAoZm9ybWF0ID09PSAnY29tcGFjdE9yZGVyZWQnKSB7XG4gICAgY29uc3QgbGliZXJhbERlY29kZSA9IG1ha2VJbm5lckRlY29kZShcbiAgICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgICBsaWJlcmFsRGVjb2RlcnMsXG4gICAgKTtcbiAgICAvKlxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IHZlcmlmeUVuY29kaW5nID0gKGVuY29kaW5nLCBsYWJlbCkgPT4ge1xuICAgICAgIWVuY29kaW5nLm1hdGNoKHJDMCkgfHxcbiAgICAgICAgRmFpbGAke2IoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICl9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUNvbXBhY3RBcnJheShgXnYgJHtlbmNvZGluZ30gdiBgLCBsaWJlcmFsRGVjb2RlKTtcbiAgICAgIChpc0FycmF5KGRlY29kZWQpICYmXG4gICAgICAgIGRlY29kZWQubGVuZ3RoID09PSAzICYmXG4gICAgICAgIGRlY29kZWRbMF0gPT09IG51bGwgJiZcbiAgICAgICAgZGVjb2RlZFsyXSA9PT0gbnVsbCkgfHxcbiAgICAgICAgRmFpbGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiAgICB9O1xuICAgIGNvbnN0IGVuY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlQ29tcGFjdEFycmF5LFxuICAgICAgeyAuLi5lbmNvZGVPcHRpb25zLCB2ZXJpZnlFbmNvZGluZyB9LFxuICAgICk7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBwYXNzYWJsZSA9PiBgfiR7ZW5jb2RlQ29tcGFjdChwYXNzYWJsZSl9YDtcbiAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdsZWdhY3lPcmRlcmVkJykge1xuICAgIGVuY29kZVBhc3NhYmxlID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlTGVnYWN5QXJyYXksXG4gICAgICBlbmNvZGVPcHRpb25zLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuICB9XG5cbiAgY29uc3QgZGVjb2RlT3B0aW9ucyA9IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9O1xuICBjb25zdCBkZWNvZGVDb21wYWN0ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZUxlZ2FjeSA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlTGVnYWN5QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlUGFzc2FibGUgPSBlbmNvZGVkID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZW5jb2RlZC5jaGFyQXQoMCkgPT09ICd+Jykge1xuICAgICAgcmV0dXJuIGRlY29kZUNvbXBhY3QoZW5jb2RlZCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IGVuY29kZVBhc3NhYmxlLCBkZWNvZGVQYXNzYWJsZSB9KTtcbn07JGjNj19vbmNlLm1ha2VQYXNzYWJsZUtpdChtYWtlUGFzc2FibGVLaXQpO1xuaGFyZGVuKG1ha2VQYXNzYWJsZUtpdCk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVBhc3NhYmxlID0gZW5jb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZW5jb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGVuY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlUGFzc2FibGUgPSBkZWNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBkZWNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGRlY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZGVjb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG4gICAgICAgY29uc3QgaXNFbmNvZGVkUmVtb3RhYmxlID0gZW5jb2RlZCA9PiBlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ3InOyRozY9fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc1N0eWxlUHJlZml4ZXMgPSB7XG4gIGVycm9yOiAnIScsXG4gIGNvcHlSZWNvcmQ6ICcoJyxcbiAgdGFnZ2VkOiAnOicsXG4gIHByb21pc2U6ICc/JyxcbiAgY29weUFycmF5OiAnW14nLFxuICBieXRlQXJyYXk6ICdhJyxcbiAgYm9vbGVhbjogJ2InLFxuICBudW1iZXI6ICdmJyxcbiAgYmlnaW50OiAnbnAnLFxuICByZW1vdGFibGU6ICdyJyxcbiAgc3RyaW5nOiAncycsXG4gIG51bGw6ICd2JyxcbiAgc3ltYm9sOiAneScsXG4gIC8vXG4gIC8vXG4gIC8vXG4gIHVuZGVmaW5lZDogJ3onLFxufTskaM2PX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuT2JqZWN0LnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVByZWZpeGVzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlUGFzc2FibGVLaXQiOlsibWFrZVBhc3NhYmxlS2l0Il0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADSIMmUFLAAABSwAACsAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc1ByaW1pdGl2ZSxnZXRUYWcsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxYLEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGRlZmluZVByb3BlcnRpZXMsXG4gIGlzLFxuICBlbnRyaWVzLFxuICBmcm9tRW50cmllcyxcbiAgZnJlZXplLFxuICBoYXNPd24sXG59ID0gT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgUUNMQVNTID0gJ0BxY2xhc3MnOyRozY9fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKlxuXG5cbiAqL1xuY29uc3QgaGFzUUNsYXNzID0gZW5jb2RlZCA9PiBoYXNPd24oZW5jb2RlZCwgUUNMQVNTKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcyA9IChlbmNvZGVkLCBxY2xhc3MpID0+XG4gICFpc1ByaW1pdGl2ZShlbmNvZGVkKSAmJlxuICAhaXNBcnJheShlbmNvZGVkKSAmJlxuICBoYXNRQ2xhc3MoZW5jb2RlZCkgJiZcbiAgZW5jb2RlZFtRQ0xBU1NdID09PSBxY2xhc3M7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gcmVtID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YSA9IGVyciA9PiBGYWlsYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVUb0NhcERhdGEgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEgPSBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YSxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ3VuZGVmaW5lZCcgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihwYXNzYWJsZSkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ05hTicgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ0luZmluaXR5JyB9O1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJy1JbmZpbml0eScgfTtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gaXMocGFzc2FibGUsIC0wKSA/IDAgOiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ2JpZ2ludCcsXG4gICAgICAgICAgZGlnaXRzOiBTdHJpbmcocGFzc2FibGUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAvKiAgICAgICAgICAgICAgICAgKi8gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAnc3ltYm9sJyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGhhc093bihwYXNzYWJsZSwgUUNMQVNTKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgeyBbUUNMQVNTXTogcWNsYXNzVmFsdWUsIC4uLnJlc3QgfSA9IHBhc3NhYmxlO1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgW1FDTEFTU106ICdoaWxiZXJ0JyxcbiAgICAgICAgICAgIG9yaWdpbmFsOiBlbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAob3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmVzdWx0LnJlc3QgPSBlbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoXG4gICAgICAgICAgbmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBtYXJzYWwgb2YgYnl0ZUFycmF5IG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3RhZ2dlZCcsXG4gICAgICAgICAgdGFnOiBnZXRUYWcocGFzc2FibGUpLFxuICAgICAgICAgIHBheWxvYWQ6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvQ2FwRGF0YVJlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgKX0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnc2xvdCcsXG4gICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ2Vycm9yJykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEgPSBzbG90RW5jb2RpbmcgPT5cbiAgRmFpbGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGEgPSBlcnJvckVuY29kaW5nID0+XG4gIEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21DYXBEYXRhID0gKGRlY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhID0gZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPT09IGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSB8fFxuICAgIEZhaWxgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhLFxuICAgICl9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGVGcm9tQ2FwRGF0YSA9IGpzb25FbmNvZGVkID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUoanNvbkVuY29kZWQpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShqc29uRW5jb2RlZCkpIHtcbiAgICAgIHJldHVybiBqc29uRW5jb2RlZC5tYXAoZW5jb2RlZFZhbCA9PiBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gICAgfSBlbHNlIGlmIChoYXNRQ2xhc3MoanNvbkVuY29kZWQpKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSBqc29uRW5jb2RlZFtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBzd2l0Y2ggKHFjbGFzcykge1xuICAgICAgICAvL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdOYU4nOiB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdJbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlT2YoZGVjb2RlZCkgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICBoYXNPd24oanNvbkVuY29kZWQsICdvcmlnaW5hbCcpIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IFtRQ0xBU1NdOiBkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCkgfTtcbiAgICAgICAgICBpZiAoaGFzT3duKGpzb25FbmNvZGVkLCAncmVzdCcpKSB7XG4gICAgICAgICAgICBjb25zdCBpc05vbkVtcHR5T2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIHJlc3QgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgIHJlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMTtcbiAgICAgICAgICAgIGlmICghaXNOb25FbXB0eU9iamVjdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdE9iaiA9IGRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgIWhhc093bihyZXN0T2JqLCBRQ0xBU1MpIHx8XG4gICAgICAgICAgICAgIEZhaWxgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ2liaWQnOiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbiAgICAgICAgICAgIHFjbGFzcyxcbiAgICAgICAgICApfWA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkID09PSAnb2JqZWN0JyAmJiBqc29uRW5jb2RlZCAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbbmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfh767losAABaLAAALQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBpcywgZW50cmllcywgZnJvbUVudHJpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuXG5jb25zdCBCQU5HID0gJyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIID0gJy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWwgPSBlbmNvZGVkU3RyID0+IHtcbiAgaWYgKGVuY29kZWRTdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vXG4gIGNvbnN0IGNvZGUgPSBlbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4gIC8vXG4gIHJldHVybiBCQU5HIDw9IGNvZGUgJiYgY29kZSA8PSBEQVNIO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IHJlbSA9PlxuICBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZXJyID0+XG4gIEZhaWxgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVRvU21hbGxjYXBzID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIGNvbnN0IGFzc2VydEVuY29kZWRFcnJvciA9IGVuY29kaW5nID0+IHtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnb2JqZWN0JyAmJiBoYXNPd24oZW5jb2RpbmcsICcjZXJyb3InKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG4gICAgICAgIGVuY29kaW5nLFxuICAgICAgKX1gO1xuICAgIC8vXG4gICAgY29uc3QgbWVzc2FnZSA9IGVuY29kaW5nWycjZXJyb3InXTtcbiAgICAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAoIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSkgfHwgbWVzc2FnZS5jaGFyQXQoMCkgPT09ICchJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmIChzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJyN1bmRlZmluZWQnO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiAnI05hTic7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjSW5maW5pdHknO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyMtSW5maW5pdHknO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcocGFzc2FibGUpO1xuICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICovIChwYXNzYWJsZSkgPCAwbiA/IHN0ciA6IGArJHtzdHJ9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIGAlJHtuYW1lfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBtYXJzYWwgb2YgYnl0ZUFycmF5IG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnI3RhZyc6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyYnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSxcbiAgICAgICk7XG4gICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGMgPSBlbmNvZGluZy5jaGFyQXQoMCk7XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICclJzoge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyMnOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICAgIGNhc2UgJyN1bmRlZmluZWQnOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjTmFOJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI0luZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjLUluZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAgICAgWGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG4gICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICBjYXNlICctJzoge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyQnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdyZW1vdGFibGUnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJic6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3Byb21pc2UnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYFNwZWNpYWwgY2hhciAke3EoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICApfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RpbmcubWFwKHZhbCA9PiBkZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093bihlbmNvZGluZywgJyN0YWcnKSkge1xuICAgICAgICAgIGNvbnN0IHsgJyN0YWcnOiB0YWcsIHBheWxvYWQsIC4uLnJlc3QgfSA9IGVuY29kaW5nO1xuICAgICAgICAgIHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIEZhaWxgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgICAgICByZXR1cm4gbWFrZVRhZ2dlZChcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd24oZW5jb2RpbmcsICcjZXJyb3InKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhc3NTdHlsZU9mKHJlc3VsdCkgPT09ICdlcnJvcicgfHxcbiAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlY29kZUVudHJ5ID0gKFtlbmNvZGVkTmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgICB0eXBlb2YgZW5jb2RlZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFByb3BlcnR5IG5hbWUgJHtxKFxuICAgICAgICAgICAgICBlbmNvZGVkTmFtZSxcbiAgICAgICAgICAgICl9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIGVuY29kZWROYW1lLmNoYXJBdCgwKSAhPT0gJyMnIHx8XG4gICAgICAgICAgICBGYWlsYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbiAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG4gICAgICAgICAgICB0eXBlb2YgZW5jb2RpbmcsXG4gICAgICAgICAgKX06ICR7ZW5jb2Rpbmd9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xufTskaM2PX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACyNkcF+jIAAPoyAAAqAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIiwicGFzc2FibGVBc0p1c3RpbiIsInFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxYLEZhaWwsTmF0LGdldEVycm9yQ29uc3RydWN0b3IsaXNQcmltaXRpdmUsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxRQ0xBU1MsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgc3RyaW5naWZ5OiBxdW90ZSB9ID0gSlNPTjtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXIgPSAoKSA9PiB7XG4gIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgbGV0IGxldmVsID0gMDtcbiAgbGV0IG5lZWRTcGFjZSA9IGZhbHNlO1xuICBjb25zdCBsaW5lID0gKCkgPT4ge1xuICAgIG5lZWRTcGFjZSA9IGZhbHNlO1xuICAgIHJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsICcgICcucmVwZWF0KGxldmVsKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHtcbiAgICAgIGxldmVsICs9IDE7XG4gICAgICBpZiAobmVlZFNwYWNlKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgfVxuICAgICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiAgICB9LFxuICAgIGxpbmUsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKG5lZWRTcGFjZSAmJiB0b2tlbiAhPT0gJywnICYmIHRva2VuICE9PSAnKScpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGFzc2VydChsZXZlbCA+PSAxKTtcbiAgICAgIGxldmVsIC09IDE7XG4gICAgICBsaW5lKCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwobGV2ZWwsIDApO1xuICAgICAgcmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm4gPSAvXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG4gICAgbGluZTogKCkgPT4gc3RyaW5ncy5sZW5ndGgsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxhc3QubGVuZ3RoID49IDEgJiYgdG9rZW4ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBjb25zdCBwYWlyID0gYCR7bGFzdFtsYXN0Lmxlbmd0aCAtIDFdfSR7dG9rZW5bMF19YDtcbiAgICAgICAgICBpZiAoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSkge1xuICAgICAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEgJiYgc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHN0cmluZ3Muam9pbignJyksXG4gIH0pO1xufTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuID0gL15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVUb0p1c3RpbiA9IChlbmNvZGluZywgc2hvdWxkSW5kZW50ID0gZmFsc2UsIHNsb3RzID0gW10pID0+IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZSA9IHJhd1RyZWUgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShyYXdUcmVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvL1xuICAgIGFzc2VydC50eXBlb2YocmF3VHJlZSwgJ29iamVjdCcpO1xuICAgIGFzc2VydChyYXdUcmVlICE9PSBudWxsKTtcbiAgICBpZiAoUUNMQVNTIGluIHJhd1RyZWUpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IHJhd1RyZWVbUUNMQVNTXTtcbiAgICAgIHR5cGVvZiBxY2xhc3MgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIEZhaWxgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHRhZywgJ3N0cmluZycpO1xuICAgICAgICAgIHByZXBhcmUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgY29uc3QgeyBpbmRleCwgaWZhY2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICAgIE5hdChpbmRleCk7XG4gICAgICAgICAgaWYgKGlmYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YoaWZhY2UsICdzdHJpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICAnb3JpZ2luYWwnIGluIHJhd1RyZWUgfHxcbiAgICAgICAgICAgIEZhaWxgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xuICAgICAgICAgIHByZXBhcmUob3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FycmF5KHJlc3QpKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChRQ0xBU1MgaW4gcmVzdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgcHJlcGFyZShyZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGFzc2VydC5mYWlsKFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgcHJlcGFyZShyYXdUcmVlW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJhd1RyZWUpO1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICB9XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VJbmRlbnRlciA9IHNob3VsZEluZGVudCA/IG1ha2VZZXNJbmRlbnRlciA6IG1ha2VOb0luZGVudGVyO1xuICBsZXQgb3V0ID0gbWFrZUluZGVudGVyKCk7XG5cbiAgLypcblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlY29kZSA9IHJhd1RyZWUgPT4ge1xuICAgIC8vXG4gICAgcmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuICB9O1xuXG4gIGNvbnN0IGRlY29kZVByb3BlcnR5ID0gKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgb3V0LmxpbmUoKTtcbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBvdXQubmV4dChgW1wiX19wcm90b19fXCJdOmApO1xuICAgIH0gZWxzZSBpZiAoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIG91dC5uZXh0KGAke25hbWV9OmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubmV4dChgJHtxdW90ZShuYW1lKX06YCk7XG4gICAgfVxuICAgIGRlY29kZSh2YWx1ZSk7XG4gICAgb3V0Lm5leHQoJywnKTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCByZWN1ciA9IHJhd1RyZWUgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShyYXdUcmVlKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8vXG4gICAgYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0KHJhd1RyZWUgIT09IG51bGwpO1xuICAgIGlmIChRQ0xBU1MgaW4gcmF3VHJlZSkge1xuICAgICAgY29uc3QgcWNsYXNzID0gcmF3VHJlZVtRQ0xBU1NdO1xuICAgICAgYXNzZXJ0LnR5cGVvZihxY2xhc3MsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICAvL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKGRpZ2l0cywgJ3N0cmluZycpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2woc3ltKTtcbiAgICAgICAgICBpZiAocmVnaXN0ZXJlZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgYXNzZXJ0KFN5bWJvbFtzdWZmaXhdID09PSBzeW0pO1xuICAgICAgICAgICAgYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgcGFzc2FibGVTeW1ib2xGb3JOYW1lKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgb3V0Lm5leHQoYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfWApO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgICAgZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBjb25zdCB7IGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG4gICAgICAgICAgY29uc3QgbmVzdGVkUmVuZGVyID0gYXJnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZE91dCA9IG91dDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIG91dCA9IG1ha2VOb0luZGVudGVyKCk7XG4gICAgICAgICAgICAgIGRlY29kZShhcmcpO1xuICAgICAgICAgICAgICByZXR1cm4gb3V0LmRvbmUoKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIG91dCA9IG9sZE91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpbmRleCA8IHNsb3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRTbG90ID0gbmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG4gICAgICAgICAgICByZXR1cm4gaWZhY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG91dC5uZXh0KGBzbG90VG9WYWwoJHtyZW5kZXJlZFNsb3R9KWApXG4gICAgICAgICAgICAgIDogb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3JlbmRlcmVkU2xvdH0sJHtuZXN0ZWRSZW5kZXIoaWZhY2UpfSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlmYWNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0pYClcbiAgICAgICAgICAgIDogb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0sJHtuZXN0ZWRSZW5kZXIoaWZhY2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KFFDTEFTUywgb3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihyZXN0LCAnb2JqZWN0Jyk7XG4gICAgICAgICAgICBhc3NlcnQocmVzdCAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICl9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgICAgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgY2F1c2UgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBlcnJvciBjYXVzZSBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICBuYW1lICE9PSBgQWdncmVnYXRlRXJyb3JgIHx8XG4gICAgICAgICAgICBGYWlsYEFnZ3JlZ2F0ZUVycm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIGVycm9ycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGVycm9ycyBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdbXScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ1snKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIG91dC5saW5lKCk7XG4gICAgICAgICAgZGVjb2RlKHJhd1RyZWVbaV0pO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnXScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IG5hbWVzID0gLyogICAgICAgICAgICAgICAgICAgKi8gKG93bktleXMocmF3VHJlZSkpO1xuICAgICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByYXdUcmVlW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBwcmVwYXJlKGVuY29kaW5nKTtcbiAgZGVjb2RlKGVuY29kaW5nKTtcbiAgcmV0dXJuIG91dC5kb25lKCk7XG59OyRozY9fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xuXG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXNzYWJsZUFzSnVzdGluID0gKHBhc3NhYmxlLCBzaG91bGRJbmRlbnQgPSB0cnVlKSA9PiB7XG4gIGxldCBzbG90Q291bnQgPSAwO1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBjb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+IGBzJHtzbG90Q291bnQrK31gO1xuICBjb25zdCB7IHRvQ2FwRGF0YSB9ID0gbWFrZU1hcnNoYWwoY29udmVydFZhbFRvU2xvdCk7XG4gIGNvbnN0IHsgYm9keSwgc2xvdHMgfSA9IHRvQ2FwRGF0YShwYXNzYWJsZSk7XG4gIGNvbnN0IGVuY29kZWQgPSBKU09OLnBhcnNlKGJvZHkpO1xuICByZXR1cm4gZGVjb2RlVG9KdXN0aW4oZW5jb2RlZCwgc2hvdWxkSW5kZW50LCBzbG90cyk7XG59OyRozY9fb25jZS5wYXNzYWJsZUFzSnVzdGluKHBhc3NhYmxlQXNKdXN0aW4pO1xuaGFyZGVuKHBhc3NhYmxlQXNKdXN0aW4pO1xuXG4vL1xuLy9cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHFwID0gcGF5bG9hZCA9PiBgXFxgJHtwYXNzYWJsZUFzSnVzdGluKGhhcmRlbihwYXlsb2FkKSwgdHJ1ZSl9XFxgYDskaM2PX29uY2UucXAocXApO1xuaGFyZGVuKHFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl0sInBhc3NhYmxlQXNKdXN0aW4iOlsicGFzc2FibGVBc0p1c3RpbiJdLCJxcCI6WyJxcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+IqcbSgcAAEoHAAAtAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+XG4gIEZhaWxgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWwgPSAoc2xvdCwgX2lmYWNlKSA9PlxuICBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXIgPSBoYXJkZW4oe1xuICBnZXQ6IChfdGFyZ2V0LCBuYW1lLCBfcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAobmFtZSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvL1xuICAgIHRocm93IEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gIH0sXG59KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBhcnJheVRhcmdldCA9IGZyZWV6ZSgvKiAgICAgICAgICAgICAgICAqLyAoW10pKTtcbmNvbnN0IGJhZEFycmF5ID0gbmV3IFByb3h5KGFycmF5VGFyZ2V0LCBiYWRBcnJheUhhbmRsZXIpO1xuXG5jb25zdCB7IHNlcmlhbGl6ZSwgdW5zZXJpYWxpemUgfSA9IG1ha2VNYXJzaGFsKFxuICBkb05vdENvbnZlcnRWYWxUb1Nsb3QsXG4gIGRvTm90Q29udmVydFNsb3RUb1ZhbCxcbiAge1xuICAgIGVycm9yVGFnZ2luZzogJ29mZicsXG4gICAgLy9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnY2FwZGF0YScsXG4gIH0sXG4pO1xuXG4vKlxuXG5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gdmFsID0+IHNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjNj19vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qXG5cblxuICovXG5jb25zdCBwYXJzZSA9IHN0ciA9PlxuICB1bnNlcmlhbGl6ZShcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmcmVlemUoe1xuICAgICAgYm9keTogc3RyLFxuICAgICAgc2xvdHM6IGJhZEFycmF5LFxuICAgIH0pLFxuICApOyRozY9fb25jZS5wYXJzZShwYXJzZSk7XG5oYXJkZW4ocGFyc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAKW6nyDS8AAA0vAAAjAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3Rvcix0b1Bhc3NhYmxlRXJyb3IsWCxGYWlsLHEsbWFrZUVycm9yLGFubm90YXRlRXJyb3Isb2JqZWN0TWFwLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRozY9fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIixbJGjNj19hID0+ICh0b1Bhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb0NhcERhdGFcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjNj19hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvU21hbGxjYXBzXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnRpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm4gPSB4ID0+IHg7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbiA9ICh4LCBfKSA9PiB4O1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFyc2hhbCA9IChcbiAgY29udmVydFZhbFRvU2xvdCA9IGRlZmF1bHRWYWxUb1Nsb3RGbixcbiAgY29udmVydFNsb3RUb1ZhbCA9IGRlZmF1bHRTbG90VG9WYWxGbixcbiAge1xuICAgIGVycm9yVGFnZ2luZyA9ICdvbicsXG4gICAgbWFyc2hhbE5hbWUgPSAnYW5vbi1tYXJzaGFsJyxcbiAgICAvL1xuICAgIC8vXG4gICAgZXJyb3JJZE51bSA9IDEwMDAwLFxuICAgIC8vXG4gICAgLy9cbiAgICBtYXJzaGFsU2F2ZUVycm9yID0gZXJyID0+XG4gICAgICBjb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsIGVyciksXG4gICAgLy9cbiAgICAvL1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQgPSAnY2FwZGF0YScsXG4gIH0gPSB7fSxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCAnc3RyaW5nJyk7XG4gIGVycm9yVGFnZ2luZyA9PT0gJ29uJyB8fFxuICAgIGVycm9yVGFnZ2luZyA9PT0gJ29mZicgfHxcbiAgICBGYWlsYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG4gIGNvbnN0IG5leHRFcnJvcklkID0gKCkgPT4ge1xuICAgIGVycm9ySWROdW0gKz0gMTtcbiAgICByZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IHRvQ2FwRGF0YSA9IHJvb3QgPT4ge1xuICAgIGNvbnN0IHNsb3RzID0gW107XG4gICAgLy9cbiAgICBjb25zdCBzbG90TWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLypcblxuXG4gICAgICovXG4gICAgY29uc3QgZW5jb2RlU2xvdENvbW1vbiA9IHBhc3NhYmxlID0+IHtcbiAgICAgIGxldCBpbmRleCA9IHNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGluZGV4LCByZXBlYXQ6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ID0gc2xvdHMubGVuZ3RoO1xuICAgICAgY29uc3Qgc2xvdCA9IGNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuICAgICAgc2xvdHMucHVzaChzbG90KTtcbiAgICAgIHNsb3RNYXAuc2V0KHBhc3NhYmxlLCBpbmRleCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIC8qXG5cblxuXG5cblxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGVuY29kZUVycm9yQ29tbW9uID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmNvZGVSZWN1cihgJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGFzc2VydC50eXBlb2YobWVzc2FnZSwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgbmFtZSA9IGVuY29kZVJlY3VyKGAke2Vyci5uYW1lfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoZXJyb3JUYWdnaW5nID09PSAnb24nKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGVycm9ySWQgPSBlbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihlcnJvcklkLCAnc3RyaW5nJyk7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJyLCBYYFNlbnQgYXMgJHtlcnJvcklkfWApO1xuICAgICAgICBtYXJzaGFsU2F2ZUVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBlcnJvcklkLCBtZXNzYWdlLCBuYW1lIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzZXJpYWxpemVCb2R5Rm9ybWF0ID09PSAnY2FwZGF0YScpIHtcbiAgICAgIC8qXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb0NhcERhdGEgPSAocGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGluZGV4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ3Nsb3QnLCBpZmFjZSwgaW5kZXggfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gKHZhbCwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHZhbCwgZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGEgPSAocHJvbWlzZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4gICAgICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ2Vycm9yJywgLi4uZXJyRGF0YSB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvQ2FwRGF0YSA9IG1ha2VFbmNvZGVUb0NhcERhdGEoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZUVycm9yVG9DYXBEYXRhLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb0NhcERhdGEocm9vdCk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdzbWFsbGNhcHMnKSB7XG4gICAgICAvKlxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2FwcyA9IChwcmVmaXgsIHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSAocmVtb3RhYmxlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcsIHJlbW90YWJsZSwgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicsIHByb21pc2UpO1xuXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyRGF0YSA9IGVuY29kZUVycm9yQ29tbW9uKGVyciwgZW5jb2RlUmVjdXIpO1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLnJlc3QgfSA9IGVyckRhdGE7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdCB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzID0gbWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbiAgICAgICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlRnVsbFJldml2ZSA9IHNsb3RzID0+IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHZhbE1hcCA9IG5ldyBNYXAoKTtcblxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGRlY29kZVNsb3RDb21tb24gPSBzbG90RGF0YSA9PiB7XG4gICAgICBjb25zdCB7IGlmYWNlID0gdW5kZWZpbmVkLCBpbmRleCwgLi4ucmVzdCB9ID0gc2xvdERhdGE7XG4gICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICBjb25zdCBleHRhbnQgPSB2YWxNYXAuZ2V0KGluZGV4KTtcbiAgICAgIGlmIChleHRhbnQpIHtcbiAgICAgICAgcmV0dXJuIGV4dGFudDtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG4gICAgICBjb25zdCB2YWwgPSBjb252ZXJ0U2xvdFRvVmFsKHNsb3QsIGlmYWNlKTtcbiAgICAgIHZhbE1hcC5zZXQoaW5kZXgsIHZhbCk7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH07XG5cbiAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGRlY29kZUVycm9yQ29tbW9uID0gKGVyckRhdGEsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGVycm9ySWQgPSB1bmRlZmluZWQsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNhdXNlID0gdW5kZWZpbmVkLFxuICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0gPSBlcnJEYXRhO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGROYW1lID0gZGVjb2RlUmVjdXIobmFtZSk7XG4gICAgICBjb25zdCBkTWVzc2FnZSA9IGRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGRFcnJvcklkID0gLyogICAgICAgICAgICAgICAgICovIChlcnJvcklkICYmIGRlY29kZVJlY3VyKGVycm9ySWQpKTtcbiAgICAgIGlmICh0eXBlb2YgZE5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkTWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpIHx8IEVycm9yO1xuICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgZEVycm9ySWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgOiBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfSgke2RFcnJvcklkfSlgO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICBzYW5pdGl6ZTogZmFsc2UsXG4gICAgICB9O1xuICAgICAgaWYgKGNhdXNlKSB7XG4gICAgICAgIG9wdGlvbnMuY2F1c2UgPSBkZWNvZGVSZWN1cihjYXVzZSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIG9wdGlvbnMuZXJyb3JzID0gZGVjb2RlUmVjdXIoZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd0Vycm9yID0gbWFrZUVycm9yKGRNZXNzYWdlLCBlcnJDb25zdHJ1Y3Rvciwgb3B0aW9ucyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgZGVzY3MgPSBvYmplY3RNYXAocmVzdCwgZGF0YSA9PiAoe1xuICAgICAgICB2YWx1ZTogZGVjb2RlUmVjdXIoZGF0YSksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB9KSk7XG4gICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJhd0Vycm9yLCBkZXNjcyk7XG4gICAgICBoYXJkZW4ocmF3RXJyb3IpO1xuICAgICAgcmV0dXJuIHRvUGFzc2FibGVFcnJvcihyYXdFcnJvcik7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IChyYXdUcmVlLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLnNsb3REYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuICAgIH07XG5cbiAgICBjb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhID0gKHJhd1RyZWUsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7IFtRQ0xBU1NdOiBfLCAuLi5lcnJEYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbUNhcERhdGEgPSBtYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOiBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMgPSBwcmVmaXggPT4ge1xuICAgICAgLypcblxuXG5cbiAgICAgICAqL1xuICAgICAgcmV0dXJuIChzdHJpbmdFbmNvZGluZywgX2RlY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGFzc2VydChzdHJpbmdFbmNvZGluZy5jaGFyQXQoMCkgPT09IHByZWZpeCk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGkgPSBzdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsIGkgPCAwID8gdW5kZWZpbmVkIDogaSkpO1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBpZmFjZSA9IGkgPCAwID8gdW5kZWZpbmVkIDogc3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSArIDEpO1xuICAgICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7IGlmYWNlLCBpbmRleCB9KTtcbiAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG4gICAgY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IChlbmNvZGluZywgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgJyNlcnJvcic6IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0gPSBlbmNvZGluZztcbiAgICAgICFoYXNPd24ocmVzdEVyckRhdGEsICdtZXNzYWdlJykgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0sIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbiAgICAgIC8vXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgICAgLy9cbiAgICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0pO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gZGF0YTtcbiAgICB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuICAgIGlzQXJyYXkoZGF0YS5zbG90cykgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbiAgICBjb25zdCB7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0gPSBtYWtlRnVsbFJldml2ZShzbG90cyk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICAvL1xuICAgIGlmIChib2R5LmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gYm9keS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IGVuY29kaW5nID0gaGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VHJlZSA9IGhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICovIChyZXN1bHQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM7YpjP6OgAA+joAACUAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlUGFzc2FibGUuanMiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVCeUNvZGVQb2ludHMiLCJjb21wYXJlTnVtZXJpY3MiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0ZW52LEZhaWwscSxnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldGVudiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLFskaM2PX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCB7IGlzTmFOOiBOdW1iZXJJc05hTiB9ID0gTnVtYmVyO1xuY29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcywgc2V0UHJvdG90eXBlT2YsIGlzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEVORE9fUkFOS19TVFJJTkdTID0gZ2V0ZW52KCdFTkRPX1JBTktfU1RSSU5HUycsICd1dGYxNi1jb2RlLXVuaXQtb3JkZXInLCBbXG4gICd1bmljb2RlLWNvZGUtcG9pbnQtb3JkZXInLFxuICAnZXJyb3ItaWYtb3JkZXItY2hvaWNlLW1hdHRlcnMnLFxuXSk7XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm8gPSAoeCwgeSkgPT4geCA9PT0geSB8fCBpcyh4LCB5KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgdHJpdmlhbENvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+XG4gIC8vXG4gIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA9PT0gcmlnaHQgPyAwIDogMTtcbmhhcmRlbih0cml2aWFsQ29tcGFyYXRvcik7XG5cbi8vXG4vL1xuLy9cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjb21wYXJlQnlDb2RlUG9pbnRzID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGNvbnN0IGxlZnRJdGVyID0gbGVmdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIGNvbnN0IHJpZ2h0SXRlciA9IHJpZ2h0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHsgdmFsdWU6IGxlZnRDaGFyIH0gPSBsZWZ0SXRlci5uZXh0KCk7XG4gICAgY29uc3QgeyB2YWx1ZTogcmlnaHRDaGFyIH0gPSByaWdodEl0ZXIubmV4dCgpO1xuICAgIGlmIChsZWZ0Q2hhciA9PT0gdW5kZWZpbmVkICYmIHJpZ2h0Q2hhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGxlZnRDaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChyaWdodENoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0Q29kZXBvaW50ID0gLyogICAgICAgICAgICAgICAgICovIChsZWZ0Q2hhci5jb2RlUG9pbnRBdCgwKSk7XG4gICAgY29uc3QgcmlnaHRDb2RlcG9pbnQgPSAvKiAgICAgICAgICAgICAgICAgKi8gKHJpZ2h0Q2hhci5jb2RlUG9pbnRBdCgwKSk7XG4gICAgaWYgKGxlZnRDb2RlcG9pbnQgPCByaWdodENvZGVwb2ludCkgcmV0dXJuIC0xO1xuICAgIGlmIChsZWZ0Q29kZXBvaW50ID4gcmlnaHRDb2RlcG9pbnQpIHJldHVybiAxO1xuICB9XG59OyRozY9fb25jZS5jb21wYXJlQnlDb2RlUG9pbnRzKGNvbXBhcmVCeUNvZGVQb2ludHMpO1xuaGFyZGVuKGNvbXBhcmVCeUNvZGVQb2ludHMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNvbXBhcmVOdW1lcmljcyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICAvL1xuICBpZiAobGVmdCA8IHJpZ2h0KSByZXR1cm4gLTE7XG4gIC8vXG4gIGlmIChsZWZ0ID4gcmlnaHQpIHJldHVybiAxO1xuICBpZiAoTnVtYmVySXNOYU4obGVmdCkgPT09IE51bWJlcklzTmFOKHJpZ2h0KSkgcmV0dXJuIDA7XG4gIGlmIChOdW1iZXJJc05hTihyaWdodCkpIHJldHVybiAtMTtcbiAgYXNzZXJ0KE51bWJlcklzTmFOKGxlZnQpKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuY29tcGFyZU51bWVyaWNzKGNvbXBhcmVOdW1lcmljcyk7XG5cbmNvbnN0IHBhc3NTdHlsZVJhbmtzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICBmcm9tRW50cmllcyhcbiAgICBlbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAuc29ydCgoW19sZWZ0U3R5bGUsIGxlZnRQcmVmaXhlc10sIFtfcmlnaHRTdHlsZSwgcmlnaHRQcmVmaXhlc10pID0+IHtcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcywgcmlnaHRQcmVmaXhlcyk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW3Bhc3NTdHlsZSwgcHJlZml4ZXNdLCBpbmRleCkgPT4ge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBwcmVmaXhlcyA9PT0gcHJlZml4ZXMuc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSB8fFxuICAgICAgICAgIEZhaWxgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbiAgICAgICAgY29uc3QgY292ZXIgPSBbXG4gICAgICAgICAgcHJlZml4ZXMuY2hhckF0KDApLFxuICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGggLSAxKSArIDEpLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gW3Bhc3NTdHlsZSwgeyBpbmRleCwgY292ZXIgfV07XG4gICAgICB9KSxcbiAgKVxuKTtcbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRQYXNzU3R5bGVDb3ZlciA9IHBhc3NTdHlsZSA9PiBwYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRozY9fb25jZS5nZXRQYXNzU3R5bGVDb3ZlcihnZXRQYXNzU3R5bGVDb3Zlcik7XG5oYXJkZW4oZ2V0UGFzc1N0eWxlQ292ZXIpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb21wYXJhdG9yS2l0ID0gKGNvbXBhcmVSZW1vdGFibGVzID0gKF94LCBfeSkgPT4gTmFOKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgICBpZiAoc2FtZVZhbHVlWmVybyhsZWZ0LCByaWdodCkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0U3R5bGUgPSBwYXNzU3R5bGVPZihsZWZ0KTtcbiAgICBjb25zdCByaWdodFN0eWxlID0gcGFzc1N0eWxlT2YocmlnaHQpO1xuICAgIGlmIChsZWZ0U3R5bGUgIT09IHJpZ2h0U3R5bGUpIHtcbiAgICAgIHJldHVybiBjb21wYXJlTnVtZXJpY3MoXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4LFxuICAgICAgKTtcbiAgICB9XG4gICAgLypcblxuICAgICAqL1xuICAgIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBzd2l0Y2ggKEVORE9fUkFOS19TVFJJTkdTKSB7XG4gICAgICAgICAgY2FzZSAndXRmMTYtY29kZS11bml0LW9yZGVyJzoge1xuICAgICAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAndW5pY29kZS1jb2RlLXBvaW50LW9yZGVyJzoge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCeUNvZGVQb2ludHMobGVmdCwgcmlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdlcnJvci1pZi1vcmRlci1jaG9pY2UtbWF0dGVycyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDEgPSB0cml2aWFsQ29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQyID0gY29tcGFyZUJ5Q29kZVBvaW50cyhsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICByZXN1bHQxID09PSByZXN1bHQyIHx8XG4gICAgICAgICAgICAgIEZhaWxgQ29tcGFyaXNvbnMgZGlmZmVyZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH0sICR7cShyZXN1bHQxKX0gdnMgJHtxKHJlc3VsdDIpfWA7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0MTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBVbmV4cGVjdGVkIEVORE9fUkFOS19TVFJJTkdTICR7cShFTkRPX1JBTktfU1RSSU5HUyl9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IoXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxuICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTnVtZXJpY3MobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cblxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBsZWZ0TmFtZXMgPSByZWNvcmROYW1lcyhsZWZ0KTtcbiAgICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnROYW1lcywgcmlnaHROYW1lcyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgICAgY29uc3QgcmlnaHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocmlnaHQsIHJpZ2h0TmFtZXMpO1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0VmFsdWVzLCByaWdodFZhbHVlcyk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0W2ldLCByaWdodFtpXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aDogbGVmdExlbiB9ID0gbGVmdDtcbiAgICAgICAgY29uc3QgeyBieXRlTGVuZ3RoOiByaWdodExlbiB9ID0gcmlnaHQ7XG4gICAgICAgIGlmIChsZWZ0TGVuIDwgcmlnaHRMZW4pIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlZnRMZW4gPiByaWdodExlbikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGVmdEFycmF5ID1cbiAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YobGVmdCkgPT09IEFycmF5QnVmZmVyLnByb3RvdHlwZVxuICAgICAgICAgICAgPyBuZXcgVWludDhBcnJheShsZWZ0KVxuICAgICAgICAgICAgOiBuZXcgVWludDhBcnJheShsZWZ0LnNsaWNlKDApKTtcbiAgICAgICAgY29uc3QgcmlnaHRBcnJheSA9XG4gICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHJpZ2h0KSA9PT0gQXJyYXlCdWZmZXIucHJvdG90eXBlXG4gICAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KHJpZ2h0KVxuICAgICAgICAgICAgOiBuZXcgVWludDhBcnJheShyaWdodC5zbGljZSgwKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVmdExlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgbGVmdEJ5dGUgPSBsZWZ0QXJyYXlbaV07XG4gICAgICAgICAgY29uc3QgcmlnaHRCeXRlID0gcmlnaHRBcnJheVtpXTtcbiAgICAgICAgICBpZiAobGVmdEJ5dGUgPCByaWdodEJ5dGUpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxlZnRCeXRlID4gcmlnaHRCeXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxhYmVsQ29tcCA9IGNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLCBnZXRUYWcocmlnaHQpKTtcbiAgICAgICAgaWYgKGxhYmVsQ29tcCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiBsYWJlbENvbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLCByaWdodC5wYXlsb2FkKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiAgICAgICAgICAgICAgICovXG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgb3V0ZXJDb21wYXJhdG9yID0gKHgsIHkpID0+XG4gICAgLy9cbiAgICAvL1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGNvbXBhcmF0b3IoeCwgeSkgfHwgMCk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYW50aUNvbXBhcmF0b3IgPSAoeCwgeSkgPT4gb3V0ZXJDb21wYXJhdG9yKHksIHgpO1xuXG4gIG1lbW9PZlNvcnRlZC5zZXQob3V0ZXJDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgbWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvciwgbmV3IFdlYWtTZXQoKSk7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KG91dGVyQ29tcGFyYXRvciwgYW50aUNvbXBhcmF0b3IpO1xuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvciwgb3V0ZXJDb21wYXJhdG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgY29tcGFyYXRvcjogb3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvciB9KTtcbn07XG4vKlxuXG5cbiAqLyRozY9fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG4gICAgICAgY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlID0gY29tcGFyYXRvciA9PlxuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbiAgICAgICBjb25zdCBpc1JhbmtTb3J0ZWQgPSAocGFzc2FibGVzLCBjb21wYXJlKSA9PiB7XG4gIGNvbnN0IHN1Yk1lbW9PZlNvcnRlZCA9IG1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG4gIGFzc2VydChzdWJNZW1vT2ZTb3J0ZWQgIT09IHVuZGVmaW5lZCk7XG4gIGlmIChzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBhc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKSA9PT0gJ2NvcHlBcnJheScpO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHBhc3NhYmxlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjb21wYXJlKHBhc3NhYmxlc1tpIC0gMV0sIHBhc3NhYmxlc1tpXSkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRSYW5rU29ydGVkID0gKHNvcnRlZCwgY29tcGFyZSkgPT5cbiAgaXNSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSkgfHxcbiAgLy9cbiAgLy9cbiAgRmFpbGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCwgY29tcGFyZSl9YDskaM2PX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgc29ydEJ5UmFuayA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCB1bnNvcnRlZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSkge1xuICAgIGhhcmRlbihwYXNzYWJsZXMpO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChpc1JhbmtTb3J0ZWQocGFzc2FibGVzLCBjb21wYXJlKSkge1xuICAgICAgcmV0dXJuIHBhc3NhYmxlcztcbiAgICB9XG4gICAgdW5zb3J0ZWQgPSBbLi4ucGFzc2FibGVzXTtcbiAgfSBlbHNlIHtcbiAgICB1bnNvcnRlZCA9IEFycmF5LmZyb20ocGFzc2FibGVzLCBoYXJkZW4pO1xuICB9XG4gIGNvbnN0IHNvcnRlZCA9IHVuc29ydGVkLnNvcnQoY29tcGFyZSk7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wYXJlKHRydWUsIHVuZGVmaW5lZCkgPiAwKSB7XG4gICAgbGV0IGkgPSBzb3J0ZWQubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIHNvcnRlZFtpXSA9PT0gdW5kZWZpbmVkKSBpIC09IDE7XG4gICAgY29uc3QgbiA9IHNvcnRlZC5sZW5ndGggLSBpIC0gMTtcbiAgICBpZiAobiA+IDAgJiYgbiA8IHNvcnRlZC5sZW5ndGgpIHtcbiAgICAgIHNvcnRlZC5jb3B5V2l0aGluKG4sIDApO1xuICAgICAgc29ydGVkLmZpbGwoLyogICAgICAgICAgICAqLyAodW5kZWZpbmVkKSwgMCwgbik7XG4gICAgfVxuICB9XG4gIGhhcmRlbihzb3J0ZWQpO1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG4gIHJldHVybiBzb3J0ZWQ7XG59OyRozY9fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmFua1NlYXJjaCA9IChzb3J0ZWQsIGNvbXBhcmUsIGtleSwgYmlhcyA9ICdsZWZ0TW9zdCcpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBsZXQgbGVmdCA9IDA7XG4gIGxldCByaWdodCA9IHNvcnRlZC5sZW5ndGg7XG4gIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlKHNvcnRlZFttXSwga2V5KTtcbiAgICBpZiAoY29tcCA8PSAtMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAncmlnaHRNb3N0JykpIHtcbiAgICAgIGxlZnQgPSBtICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGNvbXAgPj0gMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAnbGVmdE1vc3QnKSk7XG4gICAgICByaWdodCA9IG07XG4gICAgfVxuICB9XG4gIHJldHVybiBiaWFzID09PSAnbGVmdE1vc3QnID8gbGVmdCA6IHJpZ2h0IC0gMTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEluZGV4Q292ZXIgPSAoc29ydGVkLCBjb21wYXJlLCBbbGVmdEtleSwgcmlnaHRLZXldKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgY29uc3QgbGVmdEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIGxlZnRLZXksICdsZWZ0TW9zdCcpO1xuICBjb25zdCByaWdodEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIHJpZ2h0S2V5LCAncmlnaHRNb3N0Jyk7XG4gIHJldHVybiBbbGVmdEluZGV4LCByaWdodEluZGV4XTtcbn07JGjNj19vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IEZ1bGxSYW5rQ292ZXIgPSBoYXJkZW4oWycnLCAneyddKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuICAgICAgIGNvbnN0IGNvdmVyZWRFbnRyaWVzID0gKHNvcnRlZCwgW2xlZnRJbmRleCwgcmlnaHRJbmRleF0pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpdGVyYWJsZSA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gbGVmdEluZGV4O1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaSA8PSByaWdodEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc29ydGVkW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiBbaSwgZWxlbWVudF0sIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1heFJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPj0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1pblJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPD0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHVuaW9uUmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHVuaW9uUmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1pblJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtYXhSYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLCBbJ3snLCAnJ10pO1xufTskaM2PX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWF4UmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1pblJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLCBbJycsICd7J10pO1xufTskaM2PX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuICAgICAgIGNvbnN0IHsgY29tcGFyYXRvcjogY29tcGFyZVJhbmssIGFudGlDb21wYXJhdG9yOiBjb21wYXJlQW50aVJhbmsgfSA9XG4gIG1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRozY9fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbiAgICAgICBjb25zdCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9IChsb25nTGl2ZWQgPSBmYWxzZSkgPT4ge1xuICBsZXQgbnVtU2VlbiA9IDA7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE1hcENvbnN0cnVjdG9yID0gbG9uZ0xpdmVkID8gV2Vha01hcCA6IE1hcDtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuICBjb25zdCB0YWcgPSByID0+IHtcbiAgICBpZiAoc2Vlbi5oYXMocikpIHtcbiAgICAgIHJldHVybiBzZWVuLmdldChyKTtcbiAgICB9XG4gICAgbnVtU2VlbiArPSAxO1xuICAgIHNlZW4uc2V0KHIsIG51bVNlZW4pO1xuICAgIHJldHVybiBudW1TZWVuO1xuICB9O1xuICBjb25zdCBjb21wYXJlUmVtb3RhYmxlcyA9ICh4LCB5KSA9PiBjb21wYXJlUmFuayh0YWcoeCksIHRhZyh5KSk7XG4gIHJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG59OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUJ5Q29kZVBvaW50cyI6WyJjb21wYXJlQnlDb2RlUG9pbnRzIl0sImNvbXBhcmVOdW1lcmljcyI6WyJjb21wYXJlTnVtZXJpY3MiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXpyzyswFAADMBQAAHQAAAEBlbmRvL25hdC12NS4xLjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsJ25hbWUnLHt2YWx1ZTpcImlzTmF0XCJ9KTskaM2PX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsJ25hbWUnLHt2YWx1ZTpcIk5hdFwifSk7JGjNj19vbmNlLk5hdChOYXQpOy8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gYWxsZWdlZE51bSA+PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkgJiYgYWxsZWdlZE51bSA+PSAwO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIGlmIChhbGxlZ2VkTnVtIDwgMG4pIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbGVnZWROdW07XG4gIH1cblxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcbiAgICB9XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gIH1cblxuICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmAsXG4gICk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG5u3nM2CwAANgsAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvc3RyaW5nLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIiwiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIixudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvc3RyaW5nLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiaXNQcmltaXRpdmUiLCJpc1ByaW1pdGl2ZSJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl0sWyJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLFsidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvc3RyaW5nLmpzIjpbWyJpc1dlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFBhc3NhYmxlU3RyaW5nIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsidG9UaHJvd2FibGUiLCJ0b1Rocm93YWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXSxbIkdFVF9NRVRIT0RfTkFNRVMiLCJHRVRfTUVUSE9EX05BTUVTIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il0sWyJpc0F0b20iLCJpc0F0b20iXSxbImFzc2VydEF0b20iLCJhc3NlcnRBdG9tIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABCkKsYxggAAMYIAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2J5dGVBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJCeXRlQXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzLCBhcHBseSB9ID0gUmVmbGVjdDtcblxuLy9cbi8vXG4vL1xuY29uc3QgYWRhcHRJbW11dGFibGVBcnJheUJ1ZmZlciA9ICgpID0+IHtcbiAgY29uc3QgYW5BcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBpZiAoYW5BcnJheUJ1ZmZlci5zbGljZVRvSW1tdXRhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGU6IG51bGwsXG4gICAgICBpbW11dGFibGVHZXR0ZXI6ICgpID0+IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvL1xuICAvL1xuICBjb25zdCBhbkltbXV0YWJsZUFycmF5QnVmZmVyID0gYW5BcnJheUJ1ZmZlci5zbGljZVRvSW1tdXRhYmxlKCk7XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbkltbXV0YWJsZUFycmF5QnVmZmVyKTtcblxuICBjb25zdCBpbW11dGFibGVHZXR0ZXIgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIC8vXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlLCAnaW1tdXRhYmxlJykuZ2V0XG4gICk7XG5cbiAgcmV0dXJuIHsgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUsIGltbXV0YWJsZUdldHRlciB9O1xufTtcblxuY29uc3QgeyBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSwgaW1tdXRhYmxlR2V0dGVyIH0gPVxuICBhZGFwdEltbXV0YWJsZUFycmF5QnVmZmVyKCk7XG5cbi8qXG5cbiAqL1xuICAgICAgIGNvbnN0IEJ5dGVBcnJheUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2J5dGVBcnJheScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyICYmXG4gICAgICAvL1xuICAgICAgY2FuZGlkYXRlLmltbXV0YWJsZSkgfHxcbiAgICAoISFjaGVjayAmJiBjaGVjayhmYWxzZSwgWGBJbW11dGFibGUgQXJyYXlCdWZmZXIgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIF9wYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgTWFsZm9ybWVkIEJ5dGVBcnJheSAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICAgIGFwcGx5KGltbXV0YWJsZUdldHRlciwgY2FuZGlkYXRlLCBbXSkgfHxcbiAgICAgIEZhaWxgTXVzdCBiZSBhbiBpbW11dGFibGUgQXJyYXlCdWZmZXI6ICR7Y2FuZGlkYXRlfWA7XG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIFhgQnl0ZUFycmF5cyBtdXN0IG5vdCBoYXZlIG93biBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gLFxuICAgICAgICBUeXBlRXJyb3IsXG4gICAgICApO1xuICB9LFxufSk7JGjNj19vbmNlLkJ5dGVBcnJheUhlbHBlcihCeXRlQXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnl0ZUFycmF5SGVscGVyIjpbIkJ5dGVBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADD7/ZFvAYAALwGAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxhc3NlcnRDaGVja2VyLGdldE93bkRhdGFEZXNjcmlwdG9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXksIHByb3RvdHlwZTogYXJyYXlQcm90b3R5cGUgfSA9IEFycmF5O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IENvcHlBcnJheUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlBcnJheScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgKCEhY2hlY2sgJiYgY2hlY2soZmFsc2UsIFhgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBhcnJheVByb3RvdHlwZSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGxlbiA9IC8qICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsICdsZW5ndGgnLCBmYWxzZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWVcbiAgICApO1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsIGksIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy9cbiAgICBvd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoID09PSBsZW4gKyAxIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICB9LFxufSk7JGjNj19vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADWqGmfHwkAAB8JAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsZ2V0T3duRGF0YURlc2NyaXB0b3IsQ1gsY2FuQmVNZXRob2Q7JGjNj19pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiY2FuQmVNZXRob2RcIixbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBjaGVja09iamVjdFByb3RvdHlwZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkID0gKGNhbmRpZGF0ZSwga2V5LCB2YWx1ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKCFjYW5CZU1ldGhvZCh2YWx1ZSkgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIC8vXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpXG4gICk7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IENvcHlSZWNvcmRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5UmVjb3JkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGVja09iamVjdFByb3RvdHlwZShjYW5kaWRhdGUsIGNoZWNrKSAmJlxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBvd25LZXlzKGNhbmRpZGF0ZSkuZXZlcnkoa2V5ID0+XG4gICAgICAgIGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkKGNhbmRpZGF0ZSwga2V5LCBjYW5kaWRhdGVba2V5XSwgY2hlY2spLFxuICAgICAgKVxuICAgICk7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSkge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZ2V0T3duRGF0YURlc2NyaXB0b3IoXG4gICAgICAgIGNhbmRpZGF0ZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgYXNzZXJ0Q2hlY2tlcixcbiAgICAgICk7XG4gICAgICBwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKTtcbiAgICB9XG4gIH0sXG59KTskaM2PX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABzRUlVjQwAAI0MAAAuAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscSxFLGlzUHJvbWlzZSxnZXRUYWcscGFzc1N0eWxlT2YsbWFrZVRhZ2dlZCxpc0F0b207JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcImlzQXRvbVwiLFskaM2PX2EgPT4gKGlzQXRvbSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZCA9IGFzeW5jIHZhbCA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgLy9cbiAgLy9cbiAgaWYgKGlzQXRvbSh2YWwpKSB7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaWYgKGlzUHJvbWlzZSh2YWwpKSB7XG4gICAgcmV0dXJuIEUud2hlbih2YWwsIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgfVxuICAvL1xuICAvL1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICBjb25zdCByZWMgPSAvKiAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyZWMpKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gbmFtZXMubWFwKG5hbWUgPT4gZGVlcGx5RnVsZmlsbGVkKHJlY1tuYW1lXSkpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCB2YWxzID0+XG4gICAgICAgIGhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYywgaSkgPT4gW25hbWVzW2ldLCBjXSkpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIGNvbnN0IGFyciA9IC8qICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gYXJyLm1hcChwID0+IGRlZXBseUZ1bGZpbGxlZChwKSk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT4gaGFyZGVuKHZhbHMpKTtcbiAgICB9XG4gICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgY29uc3QgYnl0ZUFycmF5ID0gLyogICAgICAgICAgICAgICAgICAgICovICgvKiAgICAgICAgICAgICAgICAgICovICh2YWwpKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gYnl0ZUFycmF5O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0Z2QgPSAvKiAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHRnZCk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodGdkLnBheWxvYWQpLCBwYXlsb2FkID0+XG4gICAgICAgIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIGNvbnN0IHJlbSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gcmVtO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgIGNvbnN0IGVyciA9IC8qICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICBjb25zdCBwcm9tID0gLyogICAgICAgICAgICAgICAgICAqLyAoLyogICAgICAgICAgICAgICAgICAqLyAodmFsKSk7XG4gICAgICByZXR1cm4gRS53aGVuKHByb20sIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLCBUeXBlRXJyb3IpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGhhc093biwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vL1xuLy9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzID0gbmV3IE1hcChcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIChbXG4gICAgWydFcnJvcicsIEVycm9yXSxcbiAgICBbJ0V2YWxFcnJvcicsIEV2YWxFcnJvcl0sXG4gICAgWydSYW5nZUVycm9yJywgUmFuZ2VFcnJvcl0sXG4gICAgWydSZWZlcmVuY2VFcnJvcicsIFJlZmVyZW5jZUVycm9yXSxcbiAgICBbJ1N5bnRheEVycm9yJywgU3ludGF4RXJyb3JdLFxuICAgIFsnVHlwZUVycm9yJywgVHlwZUVycm9yXSxcbiAgICBbJ1VSSUVycm9yJywgVVJJRXJyb3JdXG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICBdKSxcbik7XG5cbmlmICh0eXBlb2YgQWdncmVnYXRlRXJyb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vXG4gIGVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcik7XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0RXJyb3JDb25zdHJ1Y3RvciA9IG5hbWUgPT4gZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRozY9fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8vXG4gIHJldHVybiAoXG4gICAgY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzRXJyb3JMaWtlID0gY2FuZGlkYXRlID0+IGNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjNj19vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAoXG4gIHByb3BOYW1lLFxuICBkZXNjLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBpZiAoIWhhc093bihkZXNjLCAndmFsdWUnKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGRlc2M7XG4gIHN3aXRjaCAocHJvcE5hbWUpIHtcbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICBjYXNlICdzdGFjayc6IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dmFsdWV9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NhdXNlJzoge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcnMnOiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLmV2ZXJ5KGVyciA9PlxuICAgICAgICAvL1xuICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgICEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnR5ICR7cShwcm9wTmFtZSl9YFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKCFjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvdG87XG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbiAgaWYgKGVyckNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgfHwgZXJyQ29uc3RydWN0b3IucHJvdG90eXBlICE9PSBwcm90bykge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICBpZiAoISgnbWVzc2FnZScgaW4gZGVzY3MpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBoYXZlIGFuIG93biBcIm1lc3NhZ2VcIiBzdHJpbmcgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsIGRlc2NdKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBkZXNjLFxuICAgICAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgICAgIGNoZWNrLFxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBFcnJvckhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2Vycm9yJyxcblxuICBjYW5CZVZhbGlkOiBjaGVja0Vycm9yTGlrZSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyLCBhc3NlcnRDaGVja2VyKSxcbn0pOyRozY9fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA06KQfKQGAACkBgAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFwSXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBmdW5jKSA9PlxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBGYXIoJ21hcHBlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IGJhc2VWYWx1ZSwgZG9uZSB9ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRvbmUgPyBiYXNlVmFsdWUgOiBmdW5jKGJhc2VWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCBkb25lIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBmaWx0ZXJJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIHByZWQpID0+XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIEZhcignZmlsdGVyZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZG9uZSB8fCBwcmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRNZXRob2ROYW1lcyxxLEZhaWwsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIixbJGjNj19hID0+IChhc3NlcnRJZmFjZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGNyZWF0ZSxcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG8gPSAocmVtb3RhYmxlLCBpZmFjZSkgPT4ge1xuICBsZXQgb2xkUHJvdG8gPSBnZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuICBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAob2xkUHJvdG8gPT09IG51bGwpIHtcbiAgICAgIG9sZFByb3RvID0gb2JqZWN0UHJvdG90eXBlO1xuICAgIH1cbiAgICBvbGRQcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvbGRQcm90byAhPT0gbnVsbCB8fFxuICAgICAgRmFpbGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbiAgICBvbGRQcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIGdldFByb3RvdHlwZU9mKG9sZFByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvbGRQcm90bywge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgfSksXG4gICk7XG59O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZSA9IGNhbmRpZGF0ZSA9PlxuICBSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlID0gKFxuICAvL1xuICBpZmFjZSA9ICdSZW1vdGFibGUnLFxuICBwcm9wcyA9IHVuZGVmaW5lZCxcbiAgcmVtb3RhYmxlID0gLyogICAgICAgICAgICAqLyAoe30pLFxuKSA9PiB7XG4gIGFzc2VydElmYWNlKGlmYWNlKTtcbiAgYXNzZXJ0KGlmYWNlKTtcbiAgLy9cbiAgLy9cbiAgcHJvcHMgPT09IHVuZGVmaW5lZCB8fCBGYWlsYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuICAvL1xuICBhc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4gIC8vXG4gICEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxuICAgICAgcmVtb3RhYmxlW1BBU1NfU1RZTEVdLFxuICAgICl9YDtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaGFyZGVuLmlzRmFrZSB8fFxuICAgIC8vXG4gICAgIWlzRnJvemVuKHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuICBjb25zdCByZW1vdGFibGVQcm90byA9IG1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsIGlmYWNlKTtcblxuICAvL1xuICAvL1xuICBjb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjayA9IHRhcmdldCA9PiB7XG4gICAgLy9cbiAgICBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHJlbW90YWJsZVByb3RvKTtcbiAgICBoYXJkZW4odGFyZ2V0KTtcbiAgICBhc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8vXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuICAvL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4gIC8vXG4gIC8vXG4gIGFzc2VydChpZmFjZSAhPT0gdW5kZWZpbmVkKTsgLy9cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAqLyAocmVtb3RhYmxlKTtcbn07JGjNj19vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfTUVUSE9EX05BTUVTID0gJ19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2QgPSBoYXJkZW4oe1xuICBbR0VUX01FVEhPRF9OQU1FU10oKSB7XG4gICAgcmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuICB9LFxufSlbR0VUX01FVEhPRF9OQU1FU107XG5cbmNvbnN0IGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvciA9IGhhcmRlbih7XG4gIHZhbHVlOiBnZXRNZXRob2ROYW1lc01ldGhvZCxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgRmFyID0gKGZhck5hbWUsIHJlbW90YWJsZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCByID0gcmVtb3RhYmxlID09PSB1bmRlZmluZWQgPyAvKiAgICAgICAgICAgICovICh7fSkgOiByZW1vdGFibGU7XG4gIGlmICh0eXBlb2YgciA9PT0gJ29iamVjdCcgJiYgIShHRVRfTUVUSE9EX05BTUVTIGluIHIpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgR0VUX01FVEhPRF9OQU1FUywgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiAgfVxuICByZXR1cm4gUmVtb3RhYmxlKGBBbGxlZ2VkOiAke2Zhck5hbWV9YCwgdW5kZWZpbmVkLCByKTtcbn07JGjNj19vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBUb0ZhckZ1bmN0aW9uID0gKGZhck5hbWUsIGZ1bmMpID0+IHtcbiAgaWYgKGdldEludGVyZmFjZU9mKGZ1bmMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAvL1xuICAgIHJldHVybiBmdW5jO1xuICB9XG4gIC8vXG4gIHJldHVybiBGYXIoZmFyTmFtZSwgKC4uLmFyZ3MpID0+IGZ1bmMoLi4uYXJncykpO1xufTskaM2PX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVRhZ2dlZCA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG4gIGFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9iamVjdFByb3RvdHlwZSwge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAndGFnZ2VkJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IHRhZyB9LFxuICAgICAgcGF5bG9hZDogeyB2YWx1ZTogcGF5bG9hZCwgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIH0pLFxuICApO1xufTskaM2PX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABq8B9AkxcAAJMXAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkNYIiwiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldE93bkRhdGFEZXNjcmlwdG9yIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNQcmltaXRpdmUiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlIH0gPSBGdW5jdGlvbjtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRQcm90b3R5cGVPZixcbiAgaGFzT3duLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG59ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgdG9TdHJpbmdUYWc6IHRvU3RyaW5nVGFnU3ltYm9sIH0gPSBTeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICB0eXBlZEFycmF5UHJvdG90eXBlLFxuICB0b1N0cmluZ1RhZ1N5bWJvbCxcbik7XG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPSB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnID09PSAnZnVuY3Rpb24nKTtcblxuLypcblxuICovXG4gICAgICAgY29uc3QgaGFzT3duUHJvcGVydHlPZiA9IGhhc093bjtcblxuLypcblxuICovJGjNj19vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG4gICAgICAgY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7JGjNj19vbmNlLmlzUHJpbWl0aXZlKGlzUHJpbWl0aXZlKTtcbmhhcmRlbihpc1ByaW1pdGl2ZSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgaXNPYmplY3QgPSB2YWwgPT5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgISF2YWwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpOyRozY9fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNUeXBlZEFycmF5ID0gb2JqZWN0ID0+IHtcbiAgLy9cbiAgY29uc3QgdGFnID0gYXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLCBvYmplY3QsIFtdKTtcbiAgcmV0dXJuIHRhZyAhPT0gdW5kZWZpbmVkO1xufTskaM2PX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuICAgICAgIGNvbnN0IFBBU1NfU1RZTEUgPSBTeW1ib2wuZm9yKCdwYXNzU3R5bGUnKTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuICAgICAgIGNvbnN0IGFzc2VydENoZWNrZXIgPSAoY29uZCwgZGV0YWlscykgPT4ge1xuICBhc3NlcnQoY29uZCwgZGV0YWlscyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgQ1ggPSBjaGVjayA9PiB7XG4gIGNvbnN0IHJlamVjdCA9IChULCAuLi5zdWJzKSA9PiBjaGVjayhmYWxzZSwgWChULCAuLi5zdWJzKSk7XG4gIHJldHVybiByZWplY3Q7XG59OyRozY9fb25jZS5DWChDWCk7XG5oYXJkZW4oQ1gpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE93bkRhdGFEZXNjcmlwdG9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHByb3BOYW1lLFxuICBzaG91bGRCZUVudW1lcmFibGUsXG4gIGNoZWNrLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2MgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUsIHByb3BOYW1lKVxuICApO1xuICByZXR1cm4gKGRlc2MgIT09IHVuZGVmaW5lZCB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWAke3EocHJvcE5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKGhhc093bihkZXNjLCAndmFsdWUnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgIChzaG91bGRCZUVudW1lcmFibGVcbiAgICAgID8gZGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YClcbiAgICAgIDogIWRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSlcbiAgICA/IGRlc2NcbiAgICA6IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoLyogICAgICAgICAgICAgICAgICAqLyAodW5kZWZpbmVkKSk7XG59OyRozY9fb25jZS5nZXRPd25EYXRhRGVzY3JpcHRvcihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5oYXJkZW4oZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0VGFnID0gdGFnUmVjb3JkID0+IHRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRozY9fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG4gICAgICAgY29uc3QgY2hlY2tQYXNzU3R5bGUgPSAob2JqLCBwYXNzU3R5bGUsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIHBhc3NTdHlsZSA9PT0gZXhwZWN0ZWRQYXNzU3R5bGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKHBhc3NTdHlsZSl9OiAke29ian1gKVxuICApO1xufTskaM2PX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkID0gY2hlY2tQcm90byA9PiB7XG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGNoZWNrVGFnUmVjb3JkID0gKHRhZ1JlY29yZCwgZXhwZWN0ZWRQYXNzU3R5bGUsIGNoZWNrKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICghaXNQcmltaXRpdmUodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIChpc0Zyb3plbih0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoIWlzQXJyYXkodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUGFzc1N0eWxlKFxuICAgICAgICB0YWdSZWNvcmQsXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgUEFTU19TVFlMRSwgZmFsc2UsIGNoZWNrKS52YWx1ZSxcbiAgICAgICAgZXhwZWN0ZWRQYXNzU3R5bGUsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKSAmJlxuICAgICAgKHR5cGVvZiBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFN5bWJvbC50b1N0cmluZ1RhZywgZmFsc2UsIGNoZWNrKVxuICAgICAgICAudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Byb3RvKHRhZ1JlY29yZCwgZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSwgY2hlY2spXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG59O1xuXG4gICAgICAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKSxcbik7JGjNj19vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbiAgICAgICBjb25zdCBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgKHByb3RvICE9PSBudWxsICYmIGdldFByb3RvdHlwZU9mKHByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWAsXG4gICAgICApKSxcbik7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNQcmltaXRpdmUiOlsiaXNQcmltaXRpdmUiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIdLSJIoLAAAKCwAACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2J5dGVBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vdGFnZ2VkLmpzIiwiLi9lcnJvci5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyIsIi4vc3RyaW5nLmpzIl0sImV4cG9ydHMiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJwYXNzU3R5bGVPZiIsInRvUGFzc2FibGVFcnJvciIsInRvVGhyb3dhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaXNQcm9taXNlLFgsRmFpbCxxLGFubm90YXRlRXJyb3IsbWFrZUVycm9yLGlzUHJpbWl0aXZlLGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLGFzc2VydENoZWNrZXIsQ29weUFycmF5SGVscGVyLEJ5dGVBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsWyRozY9fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vYnl0ZUFycmF5LmpzXCIsIFtbXCJCeXRlQXJyYXlIZWxwZXJcIixbJGjNj19hID0+IChCeXRlQXJyYXlIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIixbJGjNj19hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLFskaM2PX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsWyRozY9fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2NcIixbJGjNj19hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIixbJGjNj19hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vc3RyaW5nLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN0cmluZ1wiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3RyaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzRnJvemVuLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZUhlbHBlclRhYmxlID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIGNvbnN0IEhlbHBlclRhYmxlID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBjb3B5QXJyYXk6IHVuZGVmaW5lZCxcbiAgICBieXRlQXJyYXk6IHVuZGVmaW5lZCxcbiAgICBjb3B5UmVjb3JkOiB1bmRlZmluZWQsXG4gICAgdGFnZ2VkOiB1bmRlZmluZWQsXG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICByZW1vdGFibGU6IHVuZGVmaW5lZCxcbiAgfTtcbiAgZm9yIChjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycykge1xuICAgIGNvbnN0IHsgc3R5bGVOYW1lIH0gPSBoZWxwZXI7XG4gICAgc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlIHx8IEZhaWxgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID0gaGVscGVyO1xuICB9XG4gIGZvciAoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKSB7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuICB9XG5cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIC8qICAgICAgICAgICAgICAgICAgKi8gKGhhcmRlbihIZWxwZXJUYWJsZSkpXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0VmFsaWQgPSAoaGVscGVyLCBjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgaGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKTtcbiAgaGVscGVyLmFzc2VydFJlc3RWYWxpZChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZiA9IHBhc3NTdHlsZUhlbHBlcnMgPT4ge1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IG1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbiAgY29uc3QgcmVtb3RhYmxlSGVscGVyID0gSGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcGFzc1N0eWxlTWVtbyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLypcblxuICAgKi9cbiAgLy9cbiAgY29uc3QgcGFzc1N0eWxlT2YgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgaW5Qcm9ncmVzcyA9IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IHBhc3NTdHlsZU9mUmVjdXIgPSBpbm5lciA9PiB7XG4gICAgICBjb25zdCBpbm5lcklzT2JqZWN0ID0gIWlzUHJpbWl0aXZlKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGlubmVyU3R5bGUgPSBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gICAgICAgIGlmIChpbm5lclN0eWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGlubmVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgIWluUHJvZ3Jlc3MuaGFzKGlubmVyKSB8fFxuICAgICAgICAgIEZhaWxgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG4gICAgICAgIGluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIHBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLCBwYXNzU3R5bGUpO1xuICAgICAgICBpblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZkludGVybmFsID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgdHlwZXN0ciA9IHR5cGVvZiBpbm5lcjtcbiAgICAgIHN3aXRjaCAodHlwZXN0cikge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIHJldHVybiB0eXBlc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgICBpZiAoaW5uZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNGcm96ZW4oaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgaXNUeXBlZEFycmF5KGlubmVyKVxuICAgICAgICAgICAgICAgID8gWGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmBcbiAgICAgICAgICAgICAgICA6IFhgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcm9taXNlKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xuICAgICAgICAgICAgcmV0dXJuICdwcm9taXNlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBjb25zdCBwYXNzU3R5bGVUYWcgPSBpbm5lcltQQVNTX1NUWUxFXTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBoZWxwZXIgPSBIZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuICAgICAgICAgICAgaGVscGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWQoaGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVUYWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKSB7XG4gICAgICAgICAgICAgIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgICByZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoge1xuICAgICAgICAgIGlzRnJvemVuKGlubmVyKSB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG59O1xuXG4gICAgICAgY29uc3QgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgPSBTeW1ib2wuZm9yKCdAZW5kbyBwYXNzU3R5bGVPZicpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZU9mID1cbiAgKGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF0pIHx8XG4gIG1ha2VQYXNzU3R5bGVPZihbXG4gICAgQ29weUFycmF5SGVscGVyLFxuICAgIEJ5dGVBcnJheUhlbHBlcixcbiAgICBDb3B5UmVjb3JkSGVscGVyLFxuICAgIFRhZ2dlZEhlbHBlcixcbiAgICBFcnJvckhlbHBlcixcbiAgICBSZW1vdGFibGVIZWxwZXIsXG4gIF0pOyRozY9fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZSA9IHZhbCA9PiB7XG4gIHBhc3NTdHlsZU9mKHZhbCk7IC8vXG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGUgPSBzcGVjaW1lbiA9PiB7XG4gIHRyeSB7XG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBwYXNzU3R5bGVPZihzcGVjaW1lbikgIT09IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTskaM2PX29uY2UuaXNQYXNzYWJsZShpc1Bhc3NhYmxlKTtcbmhhcmRlbihpc1Bhc3NhYmxlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gKG5hbWUsIGRlc2MpID0+XG4gIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKG5hbWUsIGRlc2MsIHBhc3NTdHlsZU9mKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0b1Bhc3NhYmxlRXJyb3IgPSBlcnIgPT4ge1xuICBoYXJkZW4oZXJyKTtcbiAgaWYgKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVyciwgcGFzc1N0eWxlT2YpKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IGVycjtcbiAgY29uc3QgeyBjYXVzZTogY2F1c2VEZXNjLCBlcnJvcnM6IGVycm9yc0Rlc2MgfSA9XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlcnIpO1xuICBsZXQgY2F1c2U7XG4gIGxldCBlcnJvcnM7XG4gIGlmIChjYXVzZURlc2MgJiYgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdjYXVzZScsIGNhdXNlRGVzYykpIHtcbiAgICBjYXVzZSA9IGNhdXNlRGVzYy52YWx1ZTtcbiAgfVxuICBpZiAoZXJyb3JzRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2Vycm9ycycsIGVycm9yc0Rlc2MpKSB7XG4gICAgZXJyb3JzID0gZXJyb3JzRGVzYy52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihgJHtuYW1lfWApIHx8IEVycm9yO1xuICBjb25zdCBuZXdFcnJvciA9IG1ha2VFcnJvcihgJHttZXNzYWdlfWAsIGVyckNvbnN0cnVjdG9yLCB7XG4gICAgLy9cbiAgICBjYXVzZSxcbiAgICBlcnJvcnMsXG4gIH0pO1xuICAvL1xuICBoYXJkZW4obmV3RXJyb3IpO1xuICAvL1xuICAvL1xuICAvL1xuICBhbm5vdGF0ZUVycm9yKG5ld0Vycm9yLCBYYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xuICBwYXNzU3R5bGVPZihuZXdFcnJvcikgPT09ICdlcnJvcicgfHxcbiAgICBGYWlsYEV4cGVjdGVkICR7bmV3RXJyb3J9IHRvIGJlIGEgcGFzc2FibGUgZXJyb3JgO1xuICByZXR1cm4gbmV3RXJyb3I7XG59OyRozY9fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdG9UaHJvd2FibGUgPSBzcGVjaW1lbiA9PiB7XG4gIGhhcmRlbihzcGVjaW1lbik7XG4gIGlmIChpc0Vycm9yTGlrZShzcGVjaW1lbikpIHtcbiAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKC8qICAgICAgICAgICAgICAgICovIChzcGVjaW1lbikpO1xuICB9XG4gIGlmICghaXNQcmltaXRpdmUoc3BlY2ltZW4pKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcGFzc1N0eWxlID0gLyogICAgICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVPZihzcGVjaW1lbikpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gLyogICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgIGVsZW1lbnQgPT09IHRvVGhyb3dhYmxlKGVsZW1lbnQpIHx8XG4gICAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VsZW1lbnR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGNvbnN0IHJlYyA9IC8qICAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKHJlYykpIHtcbiAgICAgICAgICB2YWwgPT09IHRvVGhyb3dhYmxlKHZhbCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7dmFsfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIGNvbnN0IHRnID0gLyogICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBjb25zdCB7IHBheWxvYWQgfSA9IHRnO1xuICAgICAgICBwYXlsb2FkID09PSB0b1Rocm93YWJsZShwYXlsb2FkKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7cGF5bG9hZH1gO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCBlciA9IC8qICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGVyID09PSB0b1Rocm93YWJsZShlcikgfHxcbiAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VyfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYEEgJHtxKHBhc3NTdHlsZSl9IGlzIG5vdCB0aHJvd2FibGU6ICR7c3BlY2ltZW59YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xufTskaM2PX29uY2UudG9UaHJvd2FibGUodG9UaHJvd2FibGUpO1xuaGFyZGVuKHRvVGhyb3dhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIl0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl0sImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl0sInRvVGhyb3dhYmxlIjpbInRvVGhyb3dhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHOHXHB0HwAAdB8AACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJjYW5CZU1ldGhvZCIsImdldEludGVyZmFjZU9mIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsZ2V0TWV0aG9kTmFtZXMsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNQcmltaXRpdmUsZ2V0VGFnLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjYW5CZU1ldGhvZCA9IGZ1bmMgPT5cbiAgdHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicgJiYgIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRozY9fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vL1xuLy9cblxuLypcblxuXG4gKi9cbmNvbnN0IGNhbkJlTWV0aG9kTmFtZSA9IGtleSA9PlxuICAvL1xuICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnc3ltYm9sJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJztcbmhhcmRlbihjYW5CZU1ldGhvZE5hbWUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMgPSBiZWhhdmlvck1ldGhvZHMgPT5cbiAgZ2V0TWV0aG9kTmFtZXMoYmVoYXZpb3JNZXRob2RzKTskaM2PX29uY2UuZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMoZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHtcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgaGFzT3duLFxufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2UgPSAoaWZhY2UsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgLy9cbiAgICAodHlwZW9mIGlmYWNlID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkgJiZcbiAgICAoaWZhY2UgPT09ICdSZW1vdGFibGUnIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goY2hlY2spYEZvciBub3csIGlmYWNlICR7cShcbiAgICAgICAgICBpZmFjZSxcbiAgICAgICAgKX0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0SWZhY2UgPSBpZmFjZSA9PiBjaGVja0lmYWNlKGlmYWNlLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mID0gKG9yaWdpbmFsLCBjaGVjaykgPT4ge1xuICAhaXNQcmltaXRpdmUob3JpZ2luYWwpIHx8XG4gICAgRmFpbGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbiAgaWYgKFxuICAgIHByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICBwcm90byA9PT0gbnVsbCB8fFxuICAgIHByb3RvID09PSBGdW5jdGlvbi5wcm90b3R5cGVcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gXG4gICAgKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3JpZ2luYWwgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgcHJvdG9Qcm90byA9IGdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICBpZiAocHJvdG9Qcm90byAhPT0gb2JqZWN0UHJvdG90eXBlICYmIHByb3RvUHJvdG8gIT09IG51bGwpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sIGNoZWNrKTtcbiAgICB9XG4gICAgaWYgKCFjaGVja1RhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb3JpZ2luYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sICdyZW1vdGFibGUnLCBjaGVjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvL1xuICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChQQVNTX1NUWUxFKTtcbiAgY29uc3QgdGFnS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgY29uc3Qge1xuICAgIC8vXG4gICAgWy8qICAgICAgICAgICAgICAgICAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgIFsvKiAgICAgICAgICAgICAgICAgKi8gKHRhZ0tleSldOiB7IHZhbHVlOiBpZmFjZSB9LFxuICAgIC4uLnJlc3REZXNjc1xuICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbiAgcmV0dXJuIChcbiAgICAob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkgJiZcbiAgICBjaGVja0lmYWNlKGlmYWNlLCBjaGVjaylcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzRnJvemVuKHZhbCkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJiBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gXG4gICAgKTtcbiAgfVxuICAvL1xuICBpZiAoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCwgY2hlY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZU9mID0gdmFsID0+IHtcbiAgaWYgKFxuICAgIGlzUHJpbWl0aXZlKHZhbCkgfHxcbiAgICB2YWxbUEFTU19TVFlMRV0gIT09ICdyZW1vdGFibGUnIHx8XG4gICAgIWNoZWNrUmVtb3RhYmxlKHZhbClcbiAgKSB7XG4gICAgLy9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vXG4gIHJldHVybiBnZXRUYWcodmFsKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAncmVtb3RhYmxlJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkVHlwZSA9XG4gICAgICAoIWlzUHJpbWl0aXZlKGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAoIWlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuICAgIGlmICghdmFsaWRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeShrZXkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8vXG4gICAgICAgICAgKGhhc093bihkZXNjc1svKiAgICAgICAgICAgICAgICAgKi8gKGtleSldLCAndmFsdWUnKSB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgKChrZXkgPT09IFN5bWJvbC50b1N0cmluZ1RhZyAmJiBjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLCBjaGVjaykpIHx8XG4gICAgICAgICAgICAoKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKSB8fFxuICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgICAoa2V5ICE9PSBQQVNTX1NUWUxFIHx8XG4gICAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICAgIENYKGNoZWNrKWBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lOiBuYW1lRGVzYyxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGhEZXNjLFxuICAgICAgICAvL1xuICAgICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogdG9TdHJpbmdUYWdEZXNjLFxuICAgICAgICAuLi5yZXN0RGVzY3NcbiAgICAgIH0gPSBkZXNjcztcbiAgICAgIGNvbnN0IHJlc3RLZXlzID0gb3duS2V5cyhyZXN0RGVzY3MpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKChuYW1lRGVzYyAmJiB0eXBlb2YgbmFtZURlc2MudmFsdWUgPT09ICdzdHJpbmcnKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChjaGVjaylgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICgobGVuZ3RoRGVzYyAmJiB0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZSA9PT0gJ251bWJlcicpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKHRvU3RyaW5nVGFnRGVzYyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKCh0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICBjaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSwgY2hlY2spKSkgJiZcbiAgICAgICAgKHJlc3RLZXlzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhIWNoZWNrICYmIENYKGNoZWNrKWB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiBjYW5kaWRhdGUgPT4gY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKSxcblxuICBldmVyeTogKF9wYXNzYWJsZSwgX2ZuKSA9PiB0cnVlLFxufSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiOlsiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXSwiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD0QYgRHg4AAB4OAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UscSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBpc0Zyb3plbiwgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciwgaGFzT3duIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnIH0gPSBTeW1ib2w7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXMgPSAocHIsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKHByKTtcblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHVua25vd25LZXlzID0ga2V5cy5maWx0ZXIoXG4gICAga2V5ID0+IHR5cGVvZiBrZXkgIT09ICdzeW1ib2wnIHx8ICFoYXNPd24oUHJvbWlzZS5wcm90b3R5cGUsIGtleSksXG4gICk7XG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCAhPT0gMCkge1xuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrLFxuICAgIClgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gO1xuICB9XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tTYWZlT3duS2V5ID0ga2V5ID0+IHtcbiAgICBpZiAoa2V5ID09PSB0b1N0cmluZ1RhZykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCB0YWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByLCB0b1N0cmluZ1RhZyk7XG4gICAgICBhc3NlcnQodGFnRGVzYyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChoYXNPd24odGFnRGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHksIG5vdCBhbiBhY2Nlc3NvcjogJHtxKHRhZ0Rlc2MpfWApICYmXG4gICAgICAgICh0eXBlb2YgdGFnRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgdmFsdWUgbXVzdCBiZSBhIHN0cmluZzogJHtxKHRhZ0Rlc2MudmFsdWUpfWApICYmXG4gICAgICAgICghdGFnRGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICAgQ1goY2hlY2spYE93biBAQHRvU3RyaW5nVGFnIG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7cSh0YWdEZXNjKX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gcHJba2V5XTtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgdmFsICE9PSBudWxsICYmXG4gICAgICBpc0Zyb3plbih2YWwpICYmXG4gICAgICBnZXRQcm90b3R5cGVPZih2YWwpID09PSBPYmplY3QucHJvdG90eXBlXG4gICAgKSB7XG4gICAgICBjb25zdCBzdWJLZXlzID0gb3duS2V5cyh2YWwpO1xuICAgICAgaWYgKHN1YktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHN1YktleXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHN1YktleXNbMF0gPT09ICdkZXN0cm95ZWQnICYmXG4gICAgICAgIHZhbC5kZXN0cm95ZWQgPT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrLFxuICAgIClgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG4gICAgICBTdHJpbmcoa2V5KSxcbiAgICApfSBpcyAke3ZhbH1gO1xuICB9O1xuXG4gIHJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZU93bktleSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZSA9IChwciwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICAoaXNGcm96ZW4ocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkgJiZcbiAgICAoaXNQcm9taXNlKHByKSB8fCBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApICYmXG4gICAgKGdldFByb3RvdHlwZU9mKHByKSA9PT0gUHJvbWlzZS5wcm90b3R5cGUgfHxcbiAgICAgIENYKGNoZWNrKWAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG4gICAgICAgIGdldFByb3RvdHlwZU9mKHByKSxcbiAgICAgICl9YCkgJiZcbiAgICBjaGVja1Byb21pc2VPd25LZXlzKC8qICAgICAgICAgICAgICAgICAgKi8gKHByKSwgY2hlY2spXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1NhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgeCA9PiB4KTskaM2PX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFNhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC6Ps2heQgAAHkIAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N0cmluZy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8vXG5jb25zdCBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kID0gISFTdHJpbmcucHJvdG90eXBlLmlzV2VsbEZvcm1lZDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1dlbGxGb3JtZWRTdHJpbmcgPSBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kXG4gID8gc3RyID0+IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIHN0ci5pc1dlbGxGb3JtZWQoKVxuICA6IHN0ciA9PiB7XG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaCBvZiBzdHIpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgY3AgPSAvKiAgICAgICAgICAgICAgICAgKi8gKGNoLmNvZGVQb2ludEF0KDApKTtcbiAgICAgICAgaWYgKGNwID49IDB4ZDgwMCAmJiBjcCA8PSAweGRmZmYpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07JGjNj19vbmNlLmlzV2VsbEZvcm1lZFN0cmluZyhpc1dlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyA9IHN0ciA9PiB7XG4gIGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpIHx8IEZhaWxgRXhwZWN0ZWQgd2VsbC1mb3JtZWQgdW5pY29kZSBzdHJpbmc6ICR7c3RyfWA7XG59OyRozY9fb25jZS5hc3NlcnRXZWxsRm9ybWVkU3RyaW5nKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuXG5jb25zdCBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUgPVxuICBnZXRFbnZpcm9ubWVudE9wdGlvbignT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFJywgJ2Rpc2FibGVkJywgW1xuICAgICdlbmFibGVkJyxcbiAgXSkgPT09ICdlbmFibGVkJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3RyaW5nID0gc3RyID0+IHtcbiAgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgRmFpbGBFeHBlY3RlZCBzdHJpbmcgJHtzdHJ9YDtcbiAgIU9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSB8fCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKHN0cik7XG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN0cmluZyhhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNXZWxsRm9ybWVkU3RyaW5nIjpbImlzV2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIjpbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0UGFzc2FibGVTdHJpbmciOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAswoQLNwLAADcCwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKlxuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzID0gbmV3IE1hcChcbiAgb3duS2V5cyhTeW1ib2wpXG4gICAgLmZpbHRlcihcbiAgICAgIG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBTeW1ib2xbbmFtZV0gPT09ICdzeW1ib2wnLFxuICAgIClcbiAgICAuZmlsdGVyKG5hbWUgPT4ge1xuICAgICAgLy9cbiAgICAgICFuYW1lLnN0YXJ0c1dpdGgoJ0BAJykgfHxcbiAgICAgICAgRmFpbGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgKX1gO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAvL1xuICAgIC5tYXAobmFtZSA9PiBbU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pLFxuKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgdHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcgJiZcbiAgKHR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSkgPT09ICdzdHJpbmcnIHx8IHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaM2PX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIGlzUGFzc2FibGVTeW1ib2woc3ltKSB8fFxuICBGYWlsYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBTeW1ib2wua2V5Rm9yKHN5bSk7XG4gIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gIH1cbiAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgIHJldHVybiBgQEAke25hbWV9YDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn07JGjNj19vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiB7XG4gIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgJHtxKG5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICBjb25zdCBtYXRjaCA9IEF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgIGlmIChzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgICAgcmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3ltID0gU3ltYm9sW3N1ZmZpeF07XG4gICAgICBpZiAodHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIHN5bTtcbiAgICAgIH1cbiAgICAgIEZhaWxgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xufTskaM2PX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCB1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9IG5hbWUgPT4gU3ltYm9sKG5hbWUpOyRozY9fb25jZS51bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSh1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPLl8lDJBwAAyQcAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxnZXRPd25EYXRhRGVzY3JpcHRvcixjaGVja1Bhc3NTdHlsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIixbJGjNj19hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBUYWdnZWRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICd0YWdnZWQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwgY2FuZGlkYXRlW1BBU1NfU1RZTEVdLCAndGFnZ2VkJywgY2hlY2spLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwgJ3RhZ2dlZCcsIGFzc2VydENoZWNrZXIpO1xuXG4gICAgLy9cbiAgICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChQQVNTX1NUWUxFKTtcbiAgICBjb25zdCB0YWdLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICAgIGNvbnN0IHtcbiAgICAgIC8vXG4gICAgICBbLyogICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgICBbLyogICAgICAgICAgICAgICAgICovICh0YWdLZXkpXTogX2xhYmVsRGVzYyxcbiAgICAgIHBheWxvYWQ6IF9wYXlsb2FkRGVzYywgLy9cbiAgICAgIC4uLnJlc3REZXNjc1xuICAgIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gICAgb3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHBhc3NTdHlsZU9mUmVjdXIoXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsICdwYXlsb2FkJywgdHJ1ZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWUsXG4gICAgKTtcbiAgfSxcbn0pOyRozY9fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUcLOra4QAACuEAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRBdG9tIiwiYXNzZXJ0Qnl0ZUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNBdG9tIiwiaXNCeXRlQXJyYXkiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsWCxpZGVudENoZWNrZXIscGFzc1N0eWxlT2YsYXNzZXJ0Q2hlY2tlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsWyRozY9fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNDb3B5QXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2NvcHlBcnJheSc7JGjNj19vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNCeXRlQXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2J5dGVBcnJheSc7JGjNj19vbmNlLmlzQnl0ZUFycmF5KGlzQnl0ZUFycmF5KTtcbmhhcmRlbihpc0J5dGVBcnJheSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNSZWNvcmQgPSByZWNvcmQgPT4gcGFzc1N0eWxlT2YocmVjb3JkKSA9PT0gJ2NvcHlSZWNvcmQnOyRozY9fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1JlbW90YWJsZSA9IHJlbW90YWJsZSA9PiBwYXNzU3R5bGVPZihyZW1vdGFibGUpID09PSAncmVtb3RhYmxlJzskaM2PX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlBcnJheSA9IChhcnIsIG9wdE5hbWVPZkFycmF5ID0gJ0FsbGVnZWQgYXJyYXknKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKGFycik7XG4gIHBhc3NTdHlsZSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRCeXRlQXJyYXkgPSAoYXJyLCBvcHROYW1lT2ZBcnJheSA9ICdBbGxlZ2VkIGJ5dGVBcnJheScpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YoYXJyKTtcbiAgcGFzc1N0eWxlID09PSAnYnl0ZUFycmF5JyB8fFxuICAgIEZhaWxgJHtxKFxuICAgICAgb3B0TmFtZU9mQXJyYXksXG4gICAgKX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYmluYXJ5IGRhdGEsIG5vdCAke3EocGFzc1N0eWxlKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0Qnl0ZUFycmF5KGFzc2VydEJ5dGVBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Qnl0ZUFycmF5KTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmVjb3JkID0gKHJlY29yZCwgb3B0TmFtZU9mUmVjb3JkID0gJ0FsbGVnZWQgcmVjb3JkJykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZWNvcmQpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmVtb3RhYmxlID0gKFxuICByZW1vdGFibGUsXG4gIG9wdE5hbWVPZlJlbW90YWJsZSA9ICdBbGxlZ2VkIHJlbW90YWJsZScsXG4pID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbiAgcGFzc1N0eWxlID09PSAncmVtb3RhYmxlJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrQXRvbSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGxldCBwYXNzU3R5bGU7XG4gIHRyeSB7XG4gICAgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYE5vdCBldmVuIFBhc3NhYmxlOiAke3EoZXJyKX06ICR7dmFsfWApXG4gICAgKTtcbiAgfVxuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdiaWdpbnQnOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnYnl0ZUFycmF5JzpcbiAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAgIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhbiBhdG9tOiAke3ZhbH1gKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgaXNBdG9tID0gdmFsID0+IGNoZWNrQXRvbSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQXRvbShpc0F0b20pO1xuaGFyZGVuKGlzQXRvbSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QXRvbSA9IHZhbCA9PiB7XG4gIGNoZWNrQXRvbSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0QXRvbShhc3NlcnRBdG9tKTtcbmhhcmRlbihhc3NlcnRBdG9tKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzQnl0ZUFycmF5IjpbImlzQnl0ZUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0Qnl0ZUFycmF5IjpbImFzc2VydEJ5dGVBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXSwiaXNBdG9tIjpbImlzQXRvbSJdLCJhc3NlcnRBdG9tIjpbImFzc2VydEF0b20iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1TZLc7w4AAO8OAAAeAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiYmFnVW5pb24iLCJiYWdVbmlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciIsInNldENvbXBhcmUiLCJzZXRDb21wYXJlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2tleXMvY2hlY2tLZXkuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weVNldC5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5QmFnLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0Q29weVNldCJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsiaXNDb3B5QmFnIiwiaXNDb3B5QmFnIl0sWyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weUJhZyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIl0sWyJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weU1hcCJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjpbWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdXSwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjpbWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXV0sIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOltbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsiY29tcGFyZUtleXMiLCJjb21wYXJlS2V5cyJdLFsia2V5TFQiLCJrZXlMVCJdLFsia2V5TFRFIiwia2V5TFRFIl0sWyJrZXlFUSIsImtleUVRIl0sWyJrZXlHVEUiLCJrZXlHVEUiXSxbImtleUdUIiwia2V5R1QiXV0sIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6W1siZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOltbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOltbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXSxbImlzQXdhaXRBcmdHdWFyZCIsImlzQXdhaXRBcmdHdWFyZCJdLFsiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEF3YWl0QXJnR3VhcmQiXSxbImlzUmF3R3VhcmQiLCJpc1Jhd0d1YXJkIl0sWyJhc3NlcnRSYXdHdWFyZCIsImFzc2VydFJhd0d1YXJkIl0sWyJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIl0sWyJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIl0sWyJraW5kT2YiLCJraW5kT2YiXSxbImNvbnRhaW5lckhhc1NwbGl0IiwiY29udGFpbmVySGFzU3BsaXQiXV0sIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOltbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSxbImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLFsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdXSwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6W1sibGlzdERpZmZlcmVuY2UiLCJsaXN0RGlmZmVyZW5jZSJdXSwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOltbIm9iamVjdE1hcCIsIm9iamVjdE1hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAujIwgSQ0AAAkNAAAKgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiLi9jb3B5U2V0LmpzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0S2V5IiwiYXNzZXJ0U2NhbGFyS2V5IiwiY2hlY2tDb3B5QmFnIiwiY2hlY2tDb3B5TWFwIiwiY2hlY2tDb3B5U2V0IiwiY2hlY2tLZXkiLCJjaGVja1NjYWxhcktleSIsImNvcHlNYXBLZXlTZXQiLCJldmVyeUNvcHlCYWdFbnRyeSIsImV2ZXJ5Q29weU1hcEtleSIsImV2ZXJ5Q29weU1hcFZhbHVlIiwiZXZlcnlDb3B5U2V0S2V5IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyeUFycmF5IiwiZ2V0Q29weU1hcEtleXMiLCJnZXRDb3B5TWFwVmFsdWVzIiwiZ2V0Q29weVNldEtleXMiLCJpc0NvcHlCYWciLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJpc0tleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHEsRmFpbCxpZGVudENoZWNrZXIsYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaXNBdG9tLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0F0b21cIixbJGjNj19hID0+IChpc0F0b20gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiY2hlY2tFbGVtZW50c1wiLFskaM2PX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIixbJGjNj19hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiY2hlY2tCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIixbJGjNj19hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuICovXG5cbi8vXG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjaGVja1NjYWxhcktleSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChpc0F0b20odmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIGlmIChwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHNjYWxhciBrZXk6ICR7dmFsfWApO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuY2hlY2tTY2FsYXJLZXkoY2hlY2tTY2FsYXJLZXkpO1xuICAgICAgIGNvbnN0IGlzU2NhbGFyS2V5ID0gdmFsID0+IGNoZWNrU2NhbGFyS2V5KHZhbCwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRTY2FsYXJLZXkgPSB2YWwgPT4ge1xuICBjaGVja1NjYWxhcktleSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLy9cblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbmNvbnN0IGtleU1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tLZXkgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoaXNBdG9tKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvL1xuICBpZiAoa2V5TWVtby5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vXG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrS2V5SW50ZXJuYWwodmFsLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBrZXlNZW1vLmFkZCh2YWwpO1xuICB9XG4gIC8vXG4gIC8vXG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0tleShjaGVja0tleSk7XG5oYXJkZW4oY2hlY2tLZXkpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0tleSA9IHZhbCA9PiBjaGVja0tleSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0S2V5ID0gdmFsID0+IHtcbiAgY2hlY2tLZXkodmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8vXG5cbi8vXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb3B5U2V0TWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjaGVja0NvcHlTZXQgPSAocywgY2hlY2spID0+IHtcbiAgaWYgKGNvcHlTZXRNZW1vLmhhcyhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgKChwYXNzU3R5bGVPZihzKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKHMpID09PSAnY29weVNldCcpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpICYmXG4gICAgY2hlY2tFbGVtZW50cyhzLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KHMucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weVNldE1lbW8uYWRkKHMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weVNldCA9IHMgPT4gY2hlY2tDb3B5U2V0KHMsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlTZXQgPSBzID0+IHtcbiAgY2hlY2tDb3B5U2V0KHMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlTZXRLZXlzID0gcyA9PiB7XG4gIGFzc2VydENvcHlTZXQocyk7XG4gIHJldHVybiBzLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlTZXRLZXkgPSAocywgZm4pID0+XG4gIGdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBmbihrZXksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weVNldCA9IGVsZW1lbnRJdGVyID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuICBhc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vL1xuXG4vL1xuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29weUJhZ01lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tDb3B5QmFnID0gKGIsIGNoZWNrKSA9PiB7XG4gIGlmIChjb3B5QmFnTWVtby5oYXMoYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPVxuICAgICgocGFzc1N0eWxlT2YoYikgPT09ICd0YWdnZWQnICYmIGdldFRhZyhiKSA9PT0gJ2NvcHlCYWcnKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTm90IGEgY29weUJhZzogJHtifWApKSAmJlxuICAgIGNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KGIucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weUJhZ01lbW8uYWRkKGIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUJhZyA9IGIgPT4gY2hlY2tDb3B5QmFnKGIsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlCYWcgPSBiID0+IHtcbiAgY2hlY2tDb3B5QmFnKGIsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUJhZyhhc3NlcnRDb3B5QmFnKTtcbmhhcmRlbihhc3NlcnRDb3B5QmFnKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlCYWdFbnRyaWVzID0gYiA9PiB7XG4gIGFzc2VydENvcHlCYWcoYik7XG4gIHJldHVybiBiLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlCYWdFbnRyeSA9IChiLCBmbikgPT5cbiAgZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LCBpbmRleCkgPT4gZm4oZW50cnksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weUJhZyA9IGJhZ0VudHJ5SXRlciA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbiAgYXNzZXJ0Q29weUJhZyhyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlCYWcobWFrZUNvcHlCYWcpO1xuaGFyZGVuKG1ha2VDb3B5QmFnKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG4gIGNvbnN0IHNvcnRlZCA9IHNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsIGZ1bGxDb21wYXJlKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyApIHtcbiAgICBjb25zdCBrID0gc29ydGVkW2ldO1xuICAgIGxldCBqID0gaSArIDE7XG4gICAgd2hpbGUgKGogPCBzb3J0ZWQubGVuZ3RoICYmIGZ1bGxDb21wYXJlKGssIHNvcnRlZFtqXSkgPT09IDApIHtcbiAgICAgIGogKz0gMTtcbiAgICB9XG4gICAgZW50cmllcy5wdXNoKFtrLCBCaWdJbnQoaiAtIGkpXSk7XG4gICAgaSA9IGo7XG4gIH1cbiAgcmV0dXJuIG1ha2VDb3B5QmFnKGVudHJpZXMpO1xufTskaM2PX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLy9cblxuLy9cbi8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvcHlNYXBNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrQ29weU1hcCA9IChtLCBjaGVjaykgPT4ge1xuICBpZiAoY29weU1hcE1lbW8uaGFzKG0pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCEocGFzc1N0eWxlT2YobSkgPT09ICd0YWdnZWQnICYmIGdldFRhZyhtKSA9PT0gJ2NvcHlNYXAnKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5TWFwOiAke219YCk7XG4gIH1cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBtO1xuICBpZiAocGFzc1N0eWxlT2YocGF5bG9hZCkgIT09ICdjb3B5UmVjb3JkJykge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3QgYmUgYSByZWNvcmQ6ICR7bX1gKTtcbiAgfVxuICBjb25zdCB7IGtleXMsIHZhbHVlcywgLi4ucmVzdCB9ID0gcGF5bG9hZDtcbiAgY29uc3QgcmVzdWx0ID1cbiAgICAob3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCxcbiAgICAgICkpICYmXG4gICAgY2hlY2tFbGVtZW50cyhrZXlzLCBjaGVjaykgJiZcbiAgICBjaGVja0tleShrZXlzLCBjaGVjaykgJiZcbiAgICAocGFzc1N0eWxlT2YodmFsdWVzKSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSAmJlxuICAgIChrZXlzLmxlbmd0aCA9PT0gdmFsdWVzLmxlbmd0aCB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWAsXG4gICAgICApKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlNYXBNZW1vLmFkZChtKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlNYXAgPSBtID0+IGNoZWNrQ29weU1hcChtLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlNYXAgPSBtID0+IHtcbiAgY2hlY2tDb3B5TWFwKG0sIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEtleXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgcmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcFZhbHVlcyA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICByZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbn07JGjNj19vbmNlLmdldENvcHlNYXBWYWx1ZXMoZ2V0Q29weU1hcFZhbHVlcyk7XG5oYXJkZW4oZ2V0Q29weU1hcFZhbHVlcyk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwRW50cnlBcnJheSA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICBjb25zdCB7XG4gICAgcGF5bG9hZDogeyBrZXlzLCB2YWx1ZXMgfSxcbiAgfSA9IG07XG4gIHJldHVybiBoYXJkZW4oa2V5cy5tYXAoKGtleSwgaSkgPT4gW2tleSwgdmFsdWVzW2ldXSkpO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEVudHJ5QXJyYXkoZ2V0Q29weU1hcEVudHJ5QXJyYXkpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyeUFycmF5KTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEVudHJpZXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgY29uc3Qge1xuICAgIHBheWxvYWQ6IHsga2V5cywgdmFsdWVzIH0sXG4gIH0gPSBtO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gLyogICAgICAgICAgICAgICAgKi8gKGtleXMpO1xuICByZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBba2V5c1tpXSwgdmFsdWVzW2ldXSB9KTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLmdldENvcHlNYXBFbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5TWFwS2V5ID0gKG0sIGZuKSA9PlxuICBnZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LCBpbmRleCkgPT4gZm4oa2V5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weU1hcFZhbHVlID0gKG0sIGZuKSA9PlxuICBnZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IGZuKHZhbHVlLCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjb3B5TWFwS2V5U2V0ID0gbSA9PlxuICAvL1xuICBtYWtlVGFnZ2VkKCdjb3B5U2V0JywgbS5wYXlsb2FkLmtleXMpOyRozY9fb25jZS5jb3B5TWFwS2V5U2V0KGNvcHlNYXBLZXlTZXQpO1xuaGFyZGVuKGNvcHlNYXBLZXlTZXQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weU1hcCA9IGVudHJpZXMgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gc29ydEJ5UmFuayhlbnRyaWVzLCBjb21wYXJlQW50aVJhbmspO1xuICBjb25zdCBrZXlzID0gc29ydGVkRW50cmllcy5tYXAoKFtrLCBfdl0pID0+IGspO1xuICBjb25zdCB2YWx1ZXMgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW19rLCB2XSkgPT4gdik7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCB7IGtleXMsIHZhbHVlcyB9KTtcbiAgYXNzZXJ0Q29weU1hcChyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlNYXAobWFrZUNvcHlNYXApO1xuaGFyZGVuKG1ha2VDb3B5TWFwKTtcblxuLy9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrS2V5SW50ZXJuYWwgPSAodmFsLCBjaGVjaykgPT4ge1xuICBjb25zdCBjaGVja0l0ID0gY2hpbGQgPT4gY2hlY2tLZXkoY2hpbGQsIGNoZWNrKTtcblxuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHZhbC5ldmVyeShjaGVja0l0KTtcbiAgICB9XG4gICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHZhbCk7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgIHJldHVybiBjaGVja0NvcHlTZXQodmFsLCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNoZWNrQ29weU1hcCh2YWwsIGNoZWNrKSAmJlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWUodmFsLCBjaGVja0l0KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAgICAgICBjaGVjayhmYWxzZSwgWGBBIHBhc3NhYmxlIHRhZ2dlZCAke3EodGFnKX0gaXMgbm90IGEga2V5OiAke3ZhbH1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAnZXJyb3InOlxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7dmFsfWA7XG4gICAgfVxuICB9XG59O1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyeUFycmF5IjpbImdldENvcHlNYXBFbnRyeUFycmF5Il0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADVF0ku/GQAAvxkAAC0AAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY2hlY2tLZXkuanMiLCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiYmFnQ29tcGFyZSIsImNvbXBhcmVLZXlzIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIiwic2V0Q29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGdldFRhZyxjb21wYXJlTnVtZXJpY3MsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLHEsRmFpbCxhc3NlcnRLZXksZ2V0Q29weUJhZ0VudHJpZXMsZ2V0Q29weU1hcEVudHJ5QXJyYXksZ2V0Q29weVNldEtleXMsbWFrZUNvbXBhcmVDb2xsZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiY29tcGFyZU51bWVyaWNzXCIsWyRozY9fYSA9PiAoY29tcGFyZU51bWVyaWNzID0gJGjNj19hKV1dLFtcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cnlBcnJheSA9ICRozY9fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dXV0sW1wiLi9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1wiLCBbW1wibWFrZUNvbXBhcmVDb2xsZWN0aW9uXCIsWyRozY9fYSA9PiAobWFrZUNvbXBhcmVDb2xsZWN0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHNldENvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBzID0+IGhhcmRlbihnZXRDb3B5U2V0S2V5cyhzKS5tYXAoa2V5ID0+IFtrZXksIDFdKSlcbiAgKSxcbiAgMCxcbiAgY29tcGFyZU51bWVyaWNzLFxuKTskaM2PX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmhhcmRlbihzZXRDb21wYXJlKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGJhZ0NvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIGdldENvcHlCYWdFbnRyaWVzLFxuICAwbixcbiAgY29tcGFyZU51bWVyaWNzLFxuKTskaM2PX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmhhcmRlbihiYWdDb21wYXJlKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgQUJTRU5UID0gU3ltYm9sKCdhYnNlbnQnKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuLy9cbmNvbnN0IF9tYXBDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICBnZXRDb3B5TWFwRW50cnlBcnJheSxcbiAgQUJTRU5ULFxuICAobGVmdFZhbHVlLCByaWdodFZhbHVlKSA9PiB7XG4gICAgaWYgKGxlZnRWYWx1ZSA9PT0gQUJTRU5UICYmIHJpZ2h0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgdGhyb3cgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBhYnNlbnQgZW50cnkgcGFpcmA7XG4gICAgfSBlbHNlIGlmIChsZWZ0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAocmlnaHRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjb21wYXJlS2V5cyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpO1xuICAgIH1cbiAgfSxcbik7XG5oYXJkZW4oX21hcENvbXBhcmUpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgY29tcGFyZUtleXMgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0S2V5KGxlZnQpO1xuICBhc3NlcnRLZXkocmlnaHQpO1xuICBjb25zdCBsZWZ0U3R5bGUgPSBwYXNzU3R5bGVPZihsZWZ0KTtcbiAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgaWYgKGxlZnRTdHlsZSAhPT0gcmlnaHRTdHlsZSkge1xuICAgIC8vXG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuICBzd2l0Y2ggKGxlZnRTdHlsZSkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnYmlnaW50JzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ2J5dGVBcnJheSc6XG4gICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0LCByaWdodCk7XG4gICAgfVxuICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgIGNvbnN0IHJhbmtDb21wID0gY29tcGFyZVJhbmsobGVmdCwgcmlnaHQpO1xuICAgICAgaWYgKHJhbmtDb21wID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKE51bWJlci5pc05hTihsZWZ0KSB8fCBOdW1iZXIuaXNOYU4ocmlnaHQpKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpIHx8ICFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIHJhbmtDb21wO1xuICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmVLZXlzKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICB9XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbGVmdE5hbWVzID0gcmVjb3JkTmFtZXMobGVmdCk7XG4gICAgICAvL1xuICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgLy9cbiAgICAgIGlmICgha2V5RVEobGVmdE5hbWVzLCByaWdodE5hbWVzKSkge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgIC8vXG4gICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWZ0VmFsdWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLCByaWdodFZhbHVlc1tpXSk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4oY29tcCkpIHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgIT09IGNvbXAgJiYgY29tcCAhPT0gMCkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbXA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgKHJlc3VsdCA9PT0gLTEgJiYgY29tcCA9PT0gMSkgfHwgKHJlc3VsdCA9PT0gMSAmJiBjb21wID09PSAtMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAvL1xuICAgICAgY29uc3QgbGVmdFRhZyA9IGdldFRhZyhsZWZ0KTtcbiAgICAgIC8vXG4gICAgICBjb25zdCByaWdodFRhZyA9IGdldFRhZyhyaWdodCk7XG4gICAgICBpZiAobGVmdFRhZyAhPT0gcmlnaHRUYWcpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAobGVmdFRhZykge1xuICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIHNldENvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gYmFnQ29tcGFyZShsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgdGhyb3cgRmFpbGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG4gICAgICAgY29uc3Qga2V5TFQgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8IDA7JGjNj19vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbiAgICAgICBjb25zdCBrZXlMVEUgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8PSAwOyRozY9fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG4gICAgICAgY29uc3Qga2V5RVEgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA9PT0gMDskaM2PX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuICAgICAgIGNvbnN0IGtleUdURSA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID49IDA7JGjNj19vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbiAgICAgICBjb25zdCBrZXlHVCA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID4gMDskaM2PX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldENvbXBhcmUiOlsic2V0Q29tcGFyZSJdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiXSwiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFzRtojrDgAA6w4AACkAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weUJhZy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0QmFnRW50cmllcyIsImFzc2VydE5vRHVwbGljYXRlS2V5cyIsImNoZWNrQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyIsIm1ha2VCYWdPZkVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVLZXlzID0gKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlLCBjaGVjaykgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBmdWxsQ29tcGFyZSA9IGZ1bGxDb21wYXJlIHx8IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgYmFnRW50cmllcyA9IHNvcnRCeVJhbmsoYmFnRW50cmllcywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gYmFnRW50cmllcztcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGswID0gYmFnRW50cmllc1tpIC0gMV1bMF07XG4gICAgY29uc3QgazEgPSBiYWdFbnRyaWVzW2ldWzBdO1xuICAgIGlmIChmdWxsQ29tcGFyZShrMCwgazEpID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydE5vRHVwbGljYXRlS2V5cyA9IChiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSwgYXNzZXJ0Q2hlY2tlcik7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuICAgICAgIGNvbnN0IGNoZWNrQmFnRW50cmllcyA9IChiYWdFbnRyaWVzLCBjaGVjaykgPT4ge1xuICBpZiAocGFzc1N0eWxlT2YoYmFnRW50cmllcykgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCxcbiAgICApO1xuICB9XG4gIGlmICghaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaykpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtiYWdFbnRyaWVzfWAsXG4gICAgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpIHtcbiAgICBpZiAoXG4gICAgICBwYXNzU3R5bGVPZihlbnRyeSkgIT09ICdjb3B5QXJyYXknIHx8XG4gICAgICBlbnRyeS5sZW5ndGggIT09IDIgfHxcbiAgICAgIHR5cGVvZiBlbnRyeVsxXSAhPT0gJ2JpZ2ludCdcbiAgICApIHtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGVudHJ5WzFdIDwgMSkge1xuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLy9cbiAgcmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLy9cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QmFnRW50cmllcyA9IGJhZ0VudHJpZXMgPT4ge1xuICBjaGVja0JhZ0VudHJpZXMoYmFnRW50cmllcywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRCYWdFbnRyaWVzKGFzc2VydEJhZ0VudHJpZXMpO1xuaGFyZGVuKGFzc2VydEJhZ0VudHJpZXMpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZVRvQmFnRW50cmllcyA9IGJhZ0VudHJpZXNMaXN0ID0+IHtcbiAgY29uc3QgYmFnRW50cmllcyA9IHNvcnRCeVJhbmsoYmFnRW50cmllc0xpc3QsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGFzc2VydEJhZ0VudHJpZXMoYmFnRW50cmllcyk7XG4gIHJldHVybiBiYWdFbnRyaWVzO1xufTskaM2PX29uY2UuY29lcmNlVG9CYWdFbnRyaWVzKGNvZXJjZVRvQmFnRW50cmllcyk7XG5oYXJkZW4oY29lcmNlVG9CYWdFbnRyaWVzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VCYWdPZkVudHJpZXMgPSBiYWdFbnRyeUl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weUJhZycsIGNvZXJjZVRvQmFnRW50cmllcyhiYWdFbnRyeUl0ZXIpKTskaM2PX29uY2UubWFrZUJhZ09mRW50cmllcyhtYWtlQmFnT2ZFbnRyaWVzKTtcbmhhcmRlbihtYWtlQmFnT2ZFbnRyaWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABxyd+3sMAAB7DAAAKQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVzID0gKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSwgY2hlY2spID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgZnVsbENvbXBhcmUgPSBmdWxsQ29tcGFyZSB8fCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGVsZW1lbnRzID0gc29ydEJ5UmFuayhlbGVtZW50cywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZWxlbWVudHM7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBrMCA9IGVsZW1lbnRzW2kgLSAxXTtcbiAgICBjb25zdCBrMSA9IGVsZW1lbnRzW2ldO1xuICAgIGlmIChmdWxsQ29tcGFyZShrMCwgazEpID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydE5vRHVwbGljYXRlcyA9IChlbGVtZW50cywgZnVsbENvbXBhcmUgPSB1bmRlZmluZWQpID0+IHtcbiAgY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIGZ1bGxDb21wYXJlLCBhc3NlcnRDaGVja2VyKTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG4gICAgICAgY29uc3QgY2hlY2tFbGVtZW50cyA9IChlbGVtZW50cywgY2hlY2spID0+IHtcbiAgaWYgKHBhc3NTdHlsZU9mKGVsZW1lbnRzKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtlbGVtZW50c31gLFxuICAgICk7XG4gIH1cbiAgaWYgKCFpc1JhbmtTb3J0ZWQoZWxlbWVudHMsIGNvbXBhcmVBbnRpUmFuaykpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuICAgICAgIGNvbnN0IGFzc2VydEVsZW1lbnRzID0gZWxlbWVudHMgPT4ge1xuICBjaGVja0VsZW1lbnRzKGVsZW1lbnRzLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgY29lcmNlVG9FbGVtZW50cyA9IGVsZW1lbnRzTGlzdCA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gc29ydEJ5UmFuayhlbGVtZW50c0xpc3QsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIGVsZW1lbnRzO1xufTskaM2PX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXRPZkVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weVNldCcsIGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaM2PX29uY2UubWFrZVNldE9mRWxlbWVudHMobWFrZVNldE9mRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VTZXRPZkVsZW1lbnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAPyB9jdhYAAHYWAAA5AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyIsIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLG1ha2VJdGVyYXRvcixtYWtlQXJyYXlJdGVyYXRvcixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlSXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUFycmF5SXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlQXJyYXlJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzID0gKGVudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICAvL1xuICBhc3NlcnRSYW5rU29ydGVkKGVudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IHNhbWVSYW5rSXRlcmF0b3I7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIGlmIChzYW1lUmFua0l0ZXJhdG9yKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV07XG4gICAgICAvL1xuICAgICAgbGV0IGogPSBpICsgMTtcbiAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICYmIHJhbmtDb21wYXJlKGVudHJ5WzBdLCBlbnRyaWVzW2pdWzBdKSA9PT0gMCkge1xuICAgICAgICBqICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgLy9cbiAgICAgICAgaSA9IGo7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IGVudHJ5IH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdGllcyA9IGVudHJpZXMuc2xpY2UoaSwgaik7XG4gICAgICBpID0gajtcblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qgc29ydGVkVGllcyA9IHNvcnRCeVJhbmsodGllcywgZnVsbENvbXBhcmUpO1xuICAgICAgZm9yIChsZXQgayA9IDE7IGsgPCBzb3J0ZWRUaWVzLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IFtrZXkwXSA9IHNvcnRlZFRpZXNbayAtIDFdO1xuICAgICAgICBjb25zdCBba2V5MV0gPSBzb3J0ZWRUaWVzW2tdO1xuICAgICAgICBNYXRoLnNpZ24oZnVsbENvbXBhcmUoa2V5MCwga2V5MSkpIHx8XG4gICAgICAgICAgRmFpbGBEdXBsaWNhdGUgZW50cnkga2V5OiAke2tleTB9YDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSBtYWtlQXJyYXlJdGVyYXRvcihzb3J0ZWRUaWVzKTtcbiAgICAgIHJldHVybiBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gIH0pO1xufTtcbmhhcmRlbihnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gKFxuICBjMSxcbiAgYzIsXG4gIGdldEVudHJpZXMsXG4gIGFic2VudFZhbHVlLFxuKSA9PiB7XG4gIGNvbnN0IGUxID0gZ2V0RW50cmllcyhjMSk7XG4gIGNvbnN0IGUyID0gZ2V0RW50cmllcyhjMik7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuICBjb25zdCB4ID0gZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMSwgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHkgPSBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKGUyLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcblxuICAvL1xuICAvL1xuICBsZXQgeERvbmU7XG4gIGxldCB4S2V5O1xuICBsZXQgeFZhbHVlO1xuICBsZXQgeURvbmU7XG4gIGxldCB5S2V5O1xuICBsZXQgeVZhbHVlO1xuICBjb25zdCBub25FbnRyeSA9IFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICBjb25zdCByZXN1bHQgPSB4VmFsdWU7XG4gICAgKHsgZG9uZTogeERvbmUsIHZhbHVlOiBbeEtleSwgeFZhbHVlXSA9IG5vbkVudHJ5IH0gPSB4Lm5leHQoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbmV4dFgoKTtcbiAgY29uc3QgbmV4dFkgPSAoKSA9PiB7XG4gICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIG11c3Qgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgIGNvbnN0IHJlc3VsdCA9IHlWYWx1ZTtcbiAgICAoeyBkb25lOiB5RG9uZSwgdmFsdWU6IFt5S2V5LCB5VmFsdWVdID0gbm9uRW50cnkgfSA9IHkubmV4dCgpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBuZXh0WSgpO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgdmFsdWUgPSBbdW5kZWZpbmVkLCBhYnNlbnRWYWx1ZSwgYWJzZW50VmFsdWVdO1xuICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgIHZhbHVlID0gW3lLZXksIGFic2VudFZhbHVlLCBuZXh0WSgpXTtcbiAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBhYnNlbnRWYWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHhLZXksIHlLZXkpO1xuICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgbmV4dFkoKV07XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIGFic2VudFZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA+IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeUtleSwgYWJzZW50VmFsdWUsIG5leHRZKCldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRmFpbGBVbmV4cGVjdGVkIGtleSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7eEtleX0gdnMgJHt5S2V5fWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgfSk7XG59OyRozY9fb25jZS5nZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyk7XG5oYXJkZW4oZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb21wYXJlQ29sbGVjdGlvbiA9IChnZXRFbnRyaWVzLCBhYnNlbnRWYWx1ZSwgY29tcGFyZVZhbHVlcykgPT5cbiAgaGFyZGVuKChsZWZ0LCByaWdodCkgPT4ge1xuICAgIGNvbnN0IG1lcmdlZCA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgICAgbGVmdCxcbiAgICAgIHJpZ2h0LFxuICAgICAgZ2V0RW50cmllcyxcbiAgICAgIGFic2VudFZhbHVlLFxuICAgICk7XG4gICAgbGV0IGxlZnRJc0JpZ2dlciA9IGZhbHNlO1xuICAgIGxldCByaWdodElzQmlnZ2VyID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBbX2tleSwgbGVmdFZhbHVlLCByaWdodFZhbHVlXSBvZiBtZXJnZWQpIHtcbiAgICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlVmFsdWVzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7XG4gICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAvL1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmlnaHRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPiAwKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGxlZnRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOdW1iZXIuaXNOYU4oY29tcCkgfHxcbiAgICAgICAgICAvL1xuICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCB2YWx1ZSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7bGVmdFZhbHVlfSB2cyAke3JpZ2h0VmFsdWV9YDtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIGlmIChsZWZ0SXNCaWdnZXIgJiYgcmlnaHRJc0JpZ2dlcikge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgIH1cbiAgICAvL1xuICAgIHJldHVybiBsZWZ0SXNCaWdnZXIgPyAxIDogcmlnaHRJc0JpZ2dlciA/IC0xIDogMDtcbiAgfSk7JGjNj19vbmNlLm1ha2VDb21wYXJlQ29sbGVjdGlvbihtYWtlQ29tcGFyZUNvbGxlY3Rpb24pO1xuaGFyZGVuKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyI6WyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyJdLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iOlsibWFrZUNvbXBhcmVDb2xsZWN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANICYgGRHAAAkRwAADUAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzXCIsWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIixbJGjNj19hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0ID0gKGJhZ0VudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGJhZ0VudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IG9wdElubmVySXRlcmF0b3I7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChvcHRJbm5lckl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYmFnRW50cmllc1tpXTtcbiAgICAgICAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgIGogPCBsZW5ndGggJiZcbiAgICAgICAgICAgICAgcmFua0NvbXBhcmUoZW50cnlbMF0sIGJhZ0VudHJpZXNbal1bMF0pID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaiArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnRyeSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJSdW4gPSBiYWdFbnRyaWVzLnNsaWNlKGksIGopO1xuICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICBjb25zdCByZXNvcnRlZCA9IHNvcnRCeVJhbmsoc2ltaWxhclJ1biwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSByZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgICAgICByZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogW251bGwsIDBuXSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWVyZ2UgPSAoeGJhZ0VudHJpZXMsIHliYWdFbnRyaWVzKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBjb25zdCB4cyA9IGJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHlzID0gYmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhjO1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyogICAgICAgICAgICAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeWM7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoe1xuICAgICAgICAgIGRvbmU6IHhEb25lLFxuICAgICAgICAgIHZhbHVlOiBbeCwgeGNdLFxuICAgICAgICB9ID0geGkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WCgpO1xuXG4gICAgICBjb25zdCB5aSA9IHlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICAgICAheURvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHtcbiAgICAgICAgICBkb25lOiB5RG9uZSxcbiAgICAgICAgICB2YWx1ZTogW3ksIHljXSxcbiAgICAgICAgfSA9IHlpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFkoKTtcblxuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHZhbHVlID0gW251bGwsIDBuLCAwbl07XG4gICAgICAgICAgfSBlbHNlIGlmICh4RG9uZSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCB5Y107XG4gICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB2YWx1ZSA9IFt4LCB4YywgMG5dO1xuICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHgsIHkpO1xuICAgICAgICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIHljXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIDBuXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGNvbXAgPiAwIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbiAgICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIHljXTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59O1xuaGFyZGVuKG1lcmdlKTtcblxuLy9cbi8vXG4vKlxuXG5cblxuICovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZyA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA8IHljKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vXG4vL1xuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlclVuaW9uID0geHlpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHJlc3VsdC5wdXNoKFttLCB4YyArIHljXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb24gPSB4eWkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgY29uc3QgbWMgPSB4YyA8PSB5YyA/IHhjIDogeWM7XG4gICAgcmVzdWx0LnB1c2goW20sIG1jXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0ID0geHlpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGNvbnN0IG1jID0geGMgLSB5YztcbiAgICBtYyA+PSAwbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmIChtYyA+PSAxbikge1xuICAgICAgLy9cbiAgICAgIHJlc3VsdC5wdXNoKFttLCBtY10pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgbWVyZ2VpZnkgPSBiYWdJdGVyT3AgPT4gKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykgPT5cbiAgYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZyA9IG1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50ID0gbWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uID0gbWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24gPSBtZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0ID0gbWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnkgPSBiYWdFbnRyaWVzT3AgPT4gKHhiYWcsIHliYWcpID0+XG4gIGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQsIHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeSA9IGJhZ0VudHJpZXNPcCA9PiAoeGJhZywgeWJhZykgPT5cbiAgbWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLCB5YmFnLnBheWxvYWQpKTtcblxuICAgICAgIGNvbnN0IGJhZ0lzU3VwZXJiYWcgPSByYXdCYWdpZnkoYmFnRW50cmllc0lzU3VwZXJiYWcpOyRozY9fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuICAgICAgIGNvbnN0IGJhZ0lzRGlzam9pbnQgPSByYXdCYWdpZnkoYmFnRW50cmllc0lzRGlzam9pbnQpOyRozY9fb25jZS5iYWdJc0Rpc2pvaW50KGJhZ0lzRGlzam9pbnQpO1xuICAgICAgIGNvbnN0IGJhZ1VuaW9uID0gYmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjNj19vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbiAgICAgICBjb25zdCBiYWdJbnRlcnNlY3Rpb24gPSBiYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjNj19vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IGJhZ0Rpc2pvaW50U3VidHJhY3QgPSBiYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5iYWdEaXNqb2ludFN1YnRyYWN0KGJhZ0Rpc2pvaW50U3VidHJhY3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIl0sImJhZ0lzRGlzam9pbnQiOlsiYmFnSXNEaXNqb2ludCJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD5UY4TSSMAAEkjAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY29weVNldC5qcyJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlcyxtYWtlU2V0T2ZFbGVtZW50czskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjNj19hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0ID0gKGVsZW1lbnRzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChlbGVtZW50cywgcmFua0NvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZWxlbWVudHM7XG4gIGxldCBpID0gMDtcbiAgbGV0IG9wdElubmVySXRlcmF0b3I7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChvcHRJbm5lckl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudHNbaV07XG4gICAgICAgICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggJiYgcmFua0NvbXBhcmUodmFsdWUsIGVsZW1lbnRzW2pdKSA9PT0gMCkge1xuICAgICAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaW1pbGFyUnVuID0gZWxlbWVudHMuc2xpY2UoaSwgaik7XG4gICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgIGNvbnN0IHJlc29ydGVkID0gc29ydEJ5UmFuayhzaW1pbGFyUnVuLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgICAgIHJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtZXJnZSA9ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgY29uc3QgeHMgPSB3aW5kb3dSZXNvcnQoeGVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeXMgPSB3aW5kb3dSZXNvcnQoeWVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyogICAgICAgICAgICAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoeyBkb25lOiB4RG9uZSwgdmFsdWU6IHggfSA9IHhpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFgoKTtcblxuICAgICAgY29uc3QgeWkgPSB5c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAgICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7IGRvbmU6IHlEb25lLCB2YWx1ZTogeSB9ID0geWkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WSgpO1xuXG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdmFsdWUgPSBbbnVsbCwgMG4sIDBuXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIDFuXTtcbiAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAwbl07XG4gICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wID0gZnVsbENvbXBhcmUoeCwgeSk7XG4gICAgICAgICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMG5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgY29tcCA+IDAgfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZSwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5oYXJkZW4obWVyZ2UpO1xuXG5jb25zdCBpdGVySXNTdXBlcnNldCA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgX3ljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGl0ZXJJc0Rpc2pvaW50ID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGl0ZXJDb21wYXJlID0geHlpID0+IHtcbiAgbGV0IGxvbmVZID0gZmFsc2U7XG4gIGxldCBsb25lWCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgbG9uZVkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoeWMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgbG9uZVggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobG9uZVggJiYgbG9uZVkpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICB9XG4gIGlmIChsb25lWCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKGxvbmVZKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgICghbG9uZVggJiYgIWxvbmVZKSB8fFxuICAgICAgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCwgbG9uZVldKX1gO1xuICAgIHJldHVybiAwO1xuICB9XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyVW5pb24gPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMG4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAwbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHhjID09PSAwbiB8fCB5YyA9PT0gMG4gfHwgRmFpbGBTZXRzIG11c3Qgbm90IGhhdmUgY29tbW9uIGVsZW1lbnRzOiAke219YDtcbiAgICBpZiAoeGMgPj0gMW4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAxbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlckludGVyc2VjdGlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLy9cbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3QgPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICB4YyA+PSAxbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmICh5YyA9PT0gMG4pIHtcbiAgICAgIC8vXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IG1lcmdlaWZ5ID0gaXRlck9wID0+ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT5cbiAgaXRlck9wKG1lcmdlKHhlbGVtZW50cywgeWVsZW1lbnRzKSk7XG5cbiAgICAgICBjb25zdCBlbGVtZW50c0lzU3VwZXJzZXQgPSBtZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjNj19vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzSXNEaXNqb2ludCA9IG1lcmdlaWZ5KGl0ZXJJc0Rpc2pvaW50KTskaM2PX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG4gICAgICAgY29uc3QgZWxlbWVudHNDb21wYXJlID0gbWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRozY9fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbiAgICAgICBjb25zdCBlbGVtZW50c1VuaW9uID0gbWVyZ2VpZnkoaXRlclVuaW9uKTskaM2PX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0Rpc2pvaW50VW5pb24gPSBtZXJnZWlmeShpdGVyRGlzam9pbnRVbmlvbik7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzSW50ZXJzZWN0aW9uID0gbWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjNj19vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSBtZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnkgPSBlbGVtZW50c09wID0+ICh4c2V0LCB5c2V0KSA9PlxuICBlbGVtZW50c09wKHhzZXQucGF5bG9hZCwgeXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5ID0gZWxlbWVudHNPcCA9PiAoeHNldCwgeXNldCkgPT5cbiAgbWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQsIHlzZXQucGF5bG9hZCkpO1xuXG4gICAgICAgY29uc3Qgc2V0SXNTdXBlcnNldCA9IHJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRozY9fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuICAgICAgIGNvbnN0IHNldElzRGlzam9pbnQgPSByYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaM2PX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBzZXRVbmlvbiA9IHNldGlmeShlbGVtZW50c1VuaW9uKTskaM2PX29uY2Uuc2V0VW5pb24oc2V0VW5pb24pO1xuICAgICAgIGNvbnN0IHNldERpc2pvaW50VW5pb24gPSBzZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaM2PX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbiAgICAgICBjb25zdCBzZXRJbnRlcnNlY3Rpb24gPSBzZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBzZXREaXNqb2ludFN1YnRyYWN0ID0gc2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLnNldERpc2pvaW50U3VidHJhY3Qoc2V0RGlzam9pbnRTdWJ0cmFjdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMKOGL8uGwAALhsAADYAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCIuL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiXSwiZXhwb3J0cyI6WyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZU1ldGhvZEtleXMiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsQXJnR3VhcmRMaXN0U2hhcGUsQXdhaXRBcmdHdWFyZFNoYXBlLEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLEludGVyZmFjZUd1YXJkU2hhcGUsTSxNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxNZXRob2RHdWFyZFNoYXBlLFJhd0d1YXJkU2hhcGUsU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsU3luY1ZhbHVlR3VhcmRTaGFwZSxhc3NlcnRBd2FpdEFyZ0d1YXJkLG1hdGNoZXMsbXVzdE1hdGNoLGdldENvcHlNYXBLZXlzLG1ha2VDb3B5TWFwOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJBcmdHdWFyZExpc3RTaGFwZVwiLFskaM2PX2EgPT4gKEFyZ0d1YXJkTGlzdFNoYXBlID0gJGjNj19hKV1dLFtcIkF3YWl0QXJnR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKEF3YWl0QXJnR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZVwiLFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkU2hhcGVcIixbJGjNj19hID0+IChJbnRlcmZhY2VHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlXCIsWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKE1ldGhvZEd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiUmF3R3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJhd0d1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGVcIixbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoU3luY1ZhbHVlR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJhc3NlcnRBd2FpdEFyZ0d1YXJkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJnZXRDb3B5TWFwS2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSA9IGhhcmRlbih7XG4gIGtsYXNzOiAnYXdhaXRBcmcnLFxuICBhcmdHdWFyZDogTS5wYXR0ZXJuKCksXG59KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gYXdhaXRBcmdHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKGF3YWl0QXJnR3VhcmQsIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSkpIHtcbiAgICAvL1xuICAgIGNvbnN0IHsga2xhc3M6IF8sIC4uLnBheWxvYWQgfSA9IGF3YWl0QXJnR3VhcmQ7XG4gICAgLy9cbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuICBhc3NlcnRBd2FpdEFyZ0d1YXJkKGF3YWl0QXJnR3VhcmQpO1xuICByZXR1cm4gYXdhaXRBcmdHdWFyZC5wYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5U3luY01ldGhvZEd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdtZXRob2RHdWFyZCcsXG4gICAgY2FsbEtpbmQ6ICdzeW5jJyxcbiAgICBhcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICAgIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuICB7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICAgIHJlc3RBcmdHdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbik7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUFyZ0d1YXJkU2hhcGUgPSBNLm9yKFxuICBSYXdHdWFyZFNoYXBlLFxuICBBd2FpdEFyZ0d1YXJkU2hhcGUsXG4gIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSxcbiAgTS5wYXR0ZXJuKCksXG4pO1xuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5QXJnR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoTGVnYWN5QXJnR3VhcmRTaGFwZSk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUFzeW5jTWV0aG9kR3VhcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBrbGFzczogJ21ldGhvZEd1YXJkJyxcbiAgICBjYWxsS2luZDogJ2FzeW5jJyxcbiAgICBhcmdHdWFyZHM6IExlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlLFxuICAgIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuICB7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICAgIHJlc3RBcmdHdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbik7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUgPSBNLm9yKFxuICBMZWdhY3lTeW5jTWV0aG9kR3VhcmRTaGFwZSxcbiAgTGVnYWN5QXN5bmNNZXRob2RHdWFyZFNoYXBlLFxuKTtcblxuY29uc3QgYWRhcHRMZWdhY3lBcmdHdWFyZCA9IGFyZ0d1YXJkID0+XG4gIG1hdGNoZXMoYXJnR3VhcmQsIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSlcbiAgICA/IE0uYXdhaXQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkKVxuICAgIDogYXJnR3VhcmQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kR3VhcmRQYXlsb2FkID0gbWV0aG9kR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhtZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRTaGFwZSkpIHtcbiAgICByZXR1cm4gbWV0aG9kR3VhcmQucGF5bG9hZDtcbiAgfVxuICBtdXN0TWF0Y2gobWV0aG9kR3VhcmQsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUsICdsZWdhY3lNZXRob2RHdWFyZCcpO1xuICBjb25zdCB7XG4gICAgLy9cbiAgICBrbGFzczogXyxcbiAgICAvL1xuICAgIGNhbGxLaW5kLFxuICAgIC8vXG4gICAgcmV0dXJuR3VhcmQsXG4gICAgLy9cbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZDtcbiAgbGV0IHtcbiAgICAvL1xuICAgIGFyZ0d1YXJkcyxcbiAgICAvL1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICB9ID0gbWV0aG9kR3VhcmQ7XG4gIGlmIChjYWxsS2luZCA9PT0gJ2FzeW5jJykge1xuICAgIGFyZ0d1YXJkcyA9IGFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPVxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMgJiYgb3B0aW9uYWxBcmdHdWFyZHMubWFwKGFkYXB0TGVnYWN5QXJnR3VhcmQpO1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBoYXJkZW4oe1xuICAgIGNhbGxLaW5kLFxuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgICByZXN0QXJnR3VhcmQsXG4gICAgcmV0dXJuR3VhcmQsXG4gIH0pO1xuICAvL1xuICBtdXN0TWF0Y2gocGF5bG9hZCwgTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsICdpbnRlcm5hbE1ldGhvZEd1YXJkQWRhcHRvcicpO1xuICByZXR1cm4gcGF5bG9hZDtcbn07JGjNj19vbmNlLmdldE1ldGhvZEd1YXJkUGF5bG9hZChnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldE1ldGhvZEd1YXJkUGF5bG9hZCk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdJbnRlcmZhY2UnLFxuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKFxuICAgICAgTS5zdHJpbmcoKSxcbiAgICAgIE0ub3IoTWV0aG9kR3VhcmRTaGFwZSwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSksXG4gICAgKSxcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRHdWFyZHM6IE0ub3IoTS51bmRlZmluZWQoKSwgJ3Bhc3NhYmxlJywgJ3JhdycpLFxuICAgIHNsb3BweTogTS5ib29sZWFuKCksXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc3ltYm9sTWV0aG9kR3VhcmRzOiBNLm1hcE9mKE0uc3ltYm9sKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuKTtcblxuY29uc3QgYWRhcHRNZXRob2RHdWFyZCA9IG1ldGhvZEd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMobWV0aG9kR3VhcmQsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbEtpbmQsXG4gICAgICBhcmdHdWFyZHMsXG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgICAgcmVzdEFyZ0d1YXJkID0gTS5hbnkoKSxcbiAgICAgIHJldHVybkd1YXJkLFxuICAgIH0gPSBnZXRNZXRob2RHdWFyZFBheWxvYWQobWV0aG9kR3VhcmQpO1xuICAgIGNvbnN0IG1DYWxsID0gY2FsbEtpbmQgPT09ICdzeW5jJyA/IE0uY2FsbCA6IE0uY2FsbFdoZW47XG4gICAgcmV0dXJuIG1DYWxsKC4uLmFyZ0d1YXJkcylcbiAgICAgIC5vcHRpb25hbCguLi5vcHRpb25hbEFyZ0d1YXJkcylcbiAgICAgIC5yZXN0KHJlc3RBcmdHdWFyZClcbiAgICAgIC5yZXR1cm5zKHJldHVybkd1YXJkKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kR3VhcmQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gaW50ZXJmYWNlR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhpbnRlcmZhY2VHdWFyZCwgSW50ZXJmYWNlR3VhcmRTaGFwZSkpIHtcbiAgICByZXR1cm4gaW50ZXJmYWNlR3VhcmQucGF5bG9hZDtcbiAgfVxuICBtdXN0TWF0Y2goaW50ZXJmYWNlR3VhcmQsIExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUsICdsZWdhY3lJbnRlcmZhY2VHdWFyZCcpO1xuICAvL1xuICAvL1xuICBsZXQgeyBrbGFzczogXywgaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCAuLi5yZXN0IH0gPSBpbnRlcmZhY2VHdWFyZDtcbiAgbWV0aG9kR3VhcmRzID0gb2JqZWN0TWFwKG1ldGhvZEd1YXJkcywgYWRhcHRNZXRob2RHdWFyZCk7XG4gIGNvbnN0IHBheWxvYWQgPSBoYXJkZW4oe1xuICAgIGludGVyZmFjZU5hbWUsXG4gICAgbWV0aG9kR3VhcmRzLFxuICAgIC4uLnJlc3QsXG4gIH0pO1xuICBtdXN0TWF0Y2goXG4gICAgcGF5bG9hZCxcbiAgICBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSxcbiAgICAnaW50ZXJuYWxJbnRlcmZhY2VHdWFyZEFkYXB0b3InLFxuICApO1xuICByZXR1cm4gcGF5bG9hZDtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCk7XG5cbmNvbnN0IGVtcHR5Q29weU1hcCA9IG1ha2VDb3B5TWFwKFtdKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnRlcmZhY2VNZXRob2RLZXlzID0gaW50ZXJmYWNlR3VhcmQgPT4ge1xuICBjb25zdCB7IG1ldGhvZEd1YXJkcywgc3ltYm9sTWV0aG9kR3VhcmRzID0gZW1wdHlDb3B5TWFwIH0gPVxuICAgIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChpbnRlcmZhY2VHdWFyZCk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgLy9cbiAgLy9cbiAgcmV0dXJuIGhhcmRlbihbXG4gICAgLi4uUmVmbGVjdC5vd25LZXlzKG1ldGhvZEd1YXJkcyksXG4gICAgLi4uZ2V0Q29weU1hcEtleXMoc3ltYm9sTWV0aG9kR3VhcmRzKSxcbiAgXSk7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VNZXRob2RLZXlzKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xuaGFyZGVuKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiOlsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIjpbImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiOlsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sImdldEludGVyZmFjZU1ldGhvZEtleXMiOlsiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAlnn3NYPEAAGDxAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiLCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyIsIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4va2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyJdLCJleHBvcnRzIjpbIkFyZ0d1YXJkTGlzdFNoYXBlIiwiQXdhaXRBcmdHdWFyZFNoYXBlIiwiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiLCJJbnRlcmZhY2VHdWFyZFNoYXBlIiwiTSIsIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlIiwiTWV0aG9kR3VhcmRTaGFwZSIsIlJhd0d1YXJkU2hhcGUiLCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSIsIlN5bmNWYWx1ZUd1YXJkU2hhcGUiLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIiwiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiLCJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydFBhdHRlcm4iLCJhc3NlcnRSYXdHdWFyZCIsImNoZWNrTWF0Y2hlcyIsImNvbnRhaW5lckhhc1NwbGl0IiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzQXdhaXRBcmdHdWFyZCIsImlzUGF0dGVybiIsImlzUmF3R3VhcmQiLCJraW5kT2YiLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxiLFgsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixpZGVudENoZWNrZXIsYXBwbHlMYWJlbGluZ0Vycm9yLGZyb21VbmlxdWVFbnRyaWVzLGxpc3REaWZmZXJlbmNlLGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMscXAsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZyxnZXRDb3B5TWFwRW50cnlBcnJheSxtYWtlQ29weU1hcCxtYWtlQ29weVNldCxtYWtlQ29weUJhZyxnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qc1wiLCBbW1wiYXBwbHlMYWJlbGluZ0Vycm9yXCIsWyRozY9fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLFskaM2PX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIixbJGjNj19hID0+IChnZXRQYXNzU3R5bGVDb3ZlciA9ICRozY9fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsWyRozY9fYSA9PiAoaW50ZXJzZWN0UmFua0NvdmVycyA9ICRozY9fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIixbJGjNj19hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV0sW1wicXBcIixbJGjNj19hID0+IChxcCA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY29tcGFyZUtleXMuanNcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wia2V5R1RcIixbJGjNj19hID0+IChrZXlHVCA9ICRozY9fYSldXSxbXCJrZXlHVEVcIixbJGjNj19hID0+IChrZXlHVEUgPSAkaM2PX2EpXV0sW1wia2V5TFRcIixbJGjNj19hID0+IChrZXlMVCA9ICRozY9fYSldXSxbXCJrZXlMVEVcIixbJGjNj19hID0+IChrZXlMVEUgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tLZXlcIixbJGjNj19hID0+IChjaGVja0tleSA9ICRozY9fYSldXSxbXCJpc0tleVwiLFskaM2PX2EgPT4gKGlzS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrU2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoY2hlY2tTY2FsYXJLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5U2V0XCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weU1hcFwiLFskaM2PX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRozY9fYSldXSxbXCJjb3B5TWFwS2V5U2V0XCIsWyRozY9fYSA9PiAoY29weU1hcEtleVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlCYWdcIixbJGjNj19hID0+IChjaGVja0NvcHlCYWcgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cnlBcnJheSA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlCYWdcIixbJGjNj19hID0+IChtYWtlQ29weUJhZyA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNcIiwgW1tcImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgeyBlbnRyaWVzLCB2YWx1ZXMsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwYXR0ZXJuTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IE1NO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZmF1bHRMaW1pdHMgPSBoYXJkZW4oe1xuICBkZWNpbWFsRGlnaXRzTGltaXQ6IDEwMCxcbiAgc3RyaW5nTGVuZ3RoTGltaXQ6IDEwMF8wMDAsXG4gIHN5bWJvbE5hbWVMZW5ndGhMaW1pdDogMTAwLFxuICBudW1Qcm9wZXJ0aWVzTGltaXQ6IDgwLFxuICBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdDogMTAwLFxuICBhcnJheUxlbmd0aExpbWl0OiAxMF8wMDAsXG4gIGJ5dGVMZW5ndGhMaW1pdDogMTAwXzAwMCxcbiAgbnVtU2V0RWxlbWVudHNMaW1pdDogMTBfMDAwLFxuICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OiAxMF8wMDAsXG4gIG51bU1hcEVudHJpZXNMaW1pdDogNTAwMCxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdCA9IChsaW1pdHMgPSB7fSkgPT5cbiAgLyogICAgICAgICAgICAgICAgICAgICovIChoYXJkZW4oeyBfX3Byb3RvX186IGRlZmF1bHRMaW1pdHMsIC4uLmxpbWl0cyB9KSk7XG5cbmNvbnN0IGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0ID0gKFxuICBwYXlsb2FkLFxuICBtYWluUGF5bG9hZFNoYXBlLFxuICBjaGVjayxcbiAgbGFiZWwsXG4pID0+IHtcbiAgYXNzZXJ0KEFycmF5LmlzQXJyYXkobWFpblBheWxvYWRTaGFwZSkpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gIH1cblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIGNvbnN0IG1haW5MZW5ndGggPSBtYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbiAgaWYgKCEocGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggfHwgcGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggKyAxKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuICB9XG4gIGNvbnN0IGxpbWl0cyA9IHBheWxvYWRbbWFpbkxlbmd0aF07XG4gIHBheWxvYWQgPSBoYXJkZW4ocGF5bG9hZC5zbGljZSgwLCBtYWluTGVuZ3RoKSk7XG4gIC8vXG4gIGlmICghY2hlY2tNYXRjaGVzKHBheWxvYWQsIG1haW5QYXlsb2FkU2hhcGUsIGNoZWNrLCBsYWJlbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxpbWl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIChcbiAgICAocGFzc1N0eWxlT2YobGltaXRzKSA9PT0gJ2NvcHlSZWNvcmQnIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpICYmXG4gICAgZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgcGFzc1N0eWxlT2YodmFsdWUpID09PSAnbnVtYmVyJyB8fFxuICAgICAgICBjaGVjayhmYWxzZSwgWGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApLFxuICAgIClcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0ID0gKHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKSA9PiB7XG4gIGlmIChcbiAgICBNYXRoLmZsb29yKE1hdGgubG9nMTAoTWF0aC5hYnMoTnVtYmVyKHNwZWNpbWVuKSkpKSArIDEgPD1cbiAgICBkZWNpbWFsRGlnaXRzTGltaXRcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKFxuICAgIGZhbHNlLFxuICAgIFhgYmlnaW50ICR7c3BlY2ltZW59IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7ZGVjaW1hbERpZ2l0c0xpbWl0fSBkaWdpdHNgLFxuICApO1xufTtcblxuLypcblxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdCA9ICgpID0+IHtcbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYXliZU1hdGNoSGVscGVyID0gdGFnID0+XG4gICAgLy9cbiAgICBIZWxwZXJzQnlNYXRjaFRhZ1t0YWddO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYXliZVBheWxvYWRTaGFwZSA9IHRhZyA9PlxuICAgIC8vXG4gICAgR3VhcmRQYXlsb2FkU2hhcGVzW3RhZ107XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHNpbmdsZXRvbktpbmRzID0gbmV3IE1hcChbXG4gICAgWydudWxsJywgbnVsbF0sXG4gICAgWyd1bmRlZmluZWQnLCB1bmRlZmluZWRdLFxuICBdKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgdGFnTWVtbyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tUYWdnZWQgPSAodGFnZ2VkLCB0YWcsIGNoZWNrKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hIZWxwZXIgPSBtYXliZU1hdGNoSGVscGVyKHRhZyk7XG4gICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCwgY2hlY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXlsb2FkU2hhcGUgPSBtYXliZVBheWxvYWRTaGFwZSh0YWcpO1xuICAgICAgaWYgKHBheWxvYWRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBjaGVja01hdGNoZXModGFnZ2VkLnBheWxvYWQsIHBheWxvYWRTaGFwZSwgY2hlY2ssIHRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICByZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29weUJhZyh0YWdnZWQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIHJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3Qga2luZE9mID0gKHNwZWNpbWVuLCBjaGVjayA9IGlkZW50Q2hlY2tlcikgPT4ge1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbiAgICBpZiAocGFzc1N0eWxlICE9PSAndGFnZ2VkJykge1xuICAgICAgcmV0dXJuIHBhc3NTdHlsZTtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSkge1xuICAgICAgcmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiAgICB9XG4gICAgY29uc3QgdGFnID0gZ2V0VGFnKHNwZWNpbWVuKTtcbiAgICBpZiAoY2hlY2tUYWdnZWQoc3BlY2ltZW4sIHRhZywgY2hlY2spKSB7XG4gICAgICB0YWdNZW1vLnNldChzcGVjaW1lbiwgdGFnKTtcbiAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIGlmIChjaGVjayAhPT0gaWRlbnRDaGVja2VyKSB7XG4gICAgICBjaGVjayhmYWxzZSwgWGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbiAgaGFyZGVuKGtpbmRPZik7XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tLaW5kID0gKHNwZWNpbWVuLCBraW5kLCBjaGVjaykgPT4ge1xuICAgIC8vXG4gICAgaWYgKHNpbmdsZXRvbktpbmRzLmhhcyhraW5kKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgc2luZ2xldG9uS2luZHMuZ2V0KGtpbmQpLCBjaGVjayk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhbEtpbmQgPSBraW5kT2Yoc3BlY2ltZW4sIGNoZWNrKTtcbiAgICBpZiAoa2luZCA9PT0gcmVhbEtpbmQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2hlY2sgIT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjaGVjayhmYWxzZSwgWGAke2IocmVhbEtpbmQpfSAke3NwZWNpbWVufSAtIE11c3QgYmUgYSAke2Ioa2luZCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgaXNLaW5kID0gKHNwZWNpbWVuLCBraW5kKSA9PiBjaGVja0tpbmQoc3BlY2ltZW4sIGtpbmQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgaXNVbmRlZmluZWRQYXR0ID0gcGF0dCA9PlxuICAgIHBhdHQgPT09IHVuZGVmaW5lZCB8fFxuICAgIChpc0tpbmQocGF0dCwgJ21hdGNoOmtpbmQnKSAmJiBwYXR0LnBheWxvYWQgPT09ICd1bmRlZmluZWQnKTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja0FzS2V5UGF0dCA9IChzcGVjaW1lbiwga2V5QXNQYXR0ZXJuLCBjaGVjaykgPT4ge1xuICAgIGlmIChpc0tleShzcGVjaW1lbikgJiYga2V5RVEoc3BlY2ltZW4sIGtleUFzUGF0dGVybikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmU6ICR7a2V5QXNQYXR0ZXJufWApXG4gICAgKTtcbiAgfTtcblxuICAvL1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjaGVja1BhdHRlcm4gPSAocGF0dCwgY2hlY2spID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vXG4gICAgY29uc3QgcmVzdWx0ID0gY2hlY2tQYXR0ZXJuSW50ZXJuYWwocGF0dCwgY2hlY2spO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbCA9IChwYXR0LCBjaGVjaykgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGNoZWNrSXQgPSBjaGlsZCA9PiBjaGVja1BhdHRlcm4oY2hpbGQsIGNoZWNrKTtcblxuICAgIGNvbnN0IGtpbmQgPSBraW5kT2YocGF0dCwgY2hlY2spO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHZhbHVlcyhwYXR0KS5ldmVyeShjaGVja0l0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gY2hlY2tQYXR0ZXJuKHBhdHQudmFsdWVzLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IGlzUGF0dGVybiA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXNzZXJ0UGF0dGVybiA9IHBhdHQgPT4ge1xuICAgIGNoZWNrUGF0dGVybihwYXR0LCBhc3NlcnRDaGVja2VyKTtcbiAgfTtcblxuICAvL1xuXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tNYXRjaGVzID0gKHNwZWNpbWVuLCBwYXR0ZXJuLCBjaGVjaywgbGFiZWwgPSB1bmRlZmluZWQpID0+XG4gICAgLy9cbiAgICBhcHBseUxhYmVsaW5nRXJyb3IoY2hlY2tNYXRjaGVzSW50ZXJuYWwsIFtzcGVjaW1lbiwgcGF0dGVybiwgY2hlY2tdLCBsYWJlbCk7XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tNYXRjaGVzSW50ZXJuYWwgPSAoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBwYXR0ZXJuS2luZCA9IGtpbmRPZihwYXR0LCBjaGVjayk7XG4gICAgY29uc3Qgc3BlY2ltZW5LaW5kID0ga2luZE9mKHNwZWNpbWVuKTsgLy9cbiAgICBzd2l0Y2ggKHBhdHRlcm5LaW5kKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICByZXR1cm4gRmFpbGBwYXR0ZXJuIGV4cGVjdGVkOiAke3BhdHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBGYWlsYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgcmV0dXJuIEZhaWxgZXJyb3JzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICBjYXNlICdieXRlQXJyYXknOlxuICAgICAgY2FzZSAnY29weVNldCc6XG4gICAgICBjYXNlICdjb3B5QmFnJzpcbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5QXJyYXkgdG8gbWF0Y2ggYSBjb3B5QXJyYXkgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBwYXR0O1xuICAgICAgICBpZiAoc3BlY2ltZW4ubGVuZ3RoICE9PSBsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0dC5ldmVyeSgocCwgaSkgPT4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuW2ldLCBwLCBjaGVjaywgaSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5UmVjb3JkJykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3Qgc3BlY2ltZW5OYW1lcyA9IHJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbiAgICAgICAgY29uc3QgcGF0dE5hbWVzID0gcmVjb3JkTmFtZXMocGF0dCk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBsaXN0RGlmZmVyZW5jZShwYXR0TmFtZXMsIHNwZWNpbWVuTmFtZXMpO1xuICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bmV4cGVjdGVkID0gbGlzdERpZmZlcmVuY2Uoc3BlY2ltZW5OYW1lcywgcGF0dE5hbWVzKTtcbiAgICAgICAgaWYgKHVuZXhwZWN0ZWQubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IG5vdCBoYXZlIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKFxuICAgICAgICAgICAgICB1bmV4cGVjdGVkLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlY2ltZW5WYWx1ZXMgPSByZWNvcmRWYWx1ZXMoc3BlY2ltZW4sIHNwZWNpbWVuTmFtZXMpO1xuICAgICAgICBjb25zdCBwYXR0VmFsdWVzID0gcmVjb3JkVmFsdWVzKHBhdHQsIHBhdHROYW1lcyk7XG4gICAgICAgIHJldHVybiBwYXR0TmFtZXMuZXZlcnkoKGxhYmVsLCBpKSA9PlxuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlc1tpXSwgcGF0dFZhbHVlc1tpXSwgY2hlY2ssIGxhYmVsKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weU1hcCcpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHBhdHRLZXlTZXQgPSBjb3B5TWFwS2V5U2V0KHBhdHQpO1xuICAgICAgICBjb25zdCBzcGVjaW1lbktleVNldCA9IGNvcHlNYXBLZXlTZXQoc3BlY2ltZW4pO1xuICAgICAgICBpZiAoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCwgcGF0dEtleVNldCwgY2hlY2spKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHBhdHRWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc3BlY2ltZW5WYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZW50cnlQYWlycyA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgICAgZ2V0Q29weU1hcEVudHJ5QXJyYXksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCBwYXR0VmFsdWUsIHNwZWNpbWVuVmFsdWVdIG9mIGVudHJ5UGFpcnMpIHtcbiAgICAgICAgICBwYXR0VmFsdWVzLnB1c2gocGF0dFZhbHVlKTtcbiAgICAgICAgICBzcGVjaW1lblZhbHVlcy5wdXNoKHNwZWNpbWVuVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVja01hdGNoZXMoaGFyZGVuKHNwZWNpbWVuVmFsdWVzKSwgaGFyZGVuKHBhdHRWYWx1ZXMpLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG4gICAgICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQucGF5bG9hZCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IG1hdGNoZXMgPSAoc3BlY2ltZW4sIHBhdHQpID0+XG4gICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBpZGVudENoZWNrZXIpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtdXN0TWF0Y2ggPSAoc3BlY2ltZW4sIHBhdHQsIGxhYmVsID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgbGV0IGlubmVyRXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGlkZW50Q2hlY2tlciwgdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIGlubmVyRXJyb3IgPSBlcjtcbiAgICB9XG4gICAgLy9cbiAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGFzc2VydENoZWNrZXIsIGxhYmVsKTtcbiAgICBjb25zdCBvdXRlckVycm9yID0gbWFrZUVycm9yKFxuICAgICAgWGBpbnRlcm5hbDogJHtsYWJlbH06IGluY29uc2lzdGVudCBwYXR0ZXJuIG1hdGNoOiAke3FwKHBhdHQpfWAsXG4gICAgKTtcbiAgICBpZiAoaW5uZXJFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbm5vdGF0ZUVycm9yKG91dGVyRXJyb3IsIFhgY2F1c2VkIGJ5ICR7aW5uZXJFcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgb3V0ZXJFcnJvcjtcbiAgfTtcblxuICAvL1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBnZXRSYW5rQ292ZXIgPSAocGF0dCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQYXNzYWJsZShwYXR0KTtcbiAgICAgIGlmIChlbmNvZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtlbmNvZGVkLCBgJHtlbmNvZGVkfX5gXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGF0dCk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHBhdHQpO1xuICAgICAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbiAgICAgICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLCBlbmNvZGVQYXNzYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYnJlYWs7IC8vXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAvL1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVhazsgLy9cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuID0gKGFycmF5LCBwYXR0LCBjaGVjaywgbGFiZWxQcmVmaXggPSAnJykgPT4ge1xuICAgIGlmIChpc0tpbmQocGF0dCwgJ21hdGNoOmFueScpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhcnJheS5ldmVyeSgoZWwsIGkpID0+XG4gICAgICBjaGVja01hdGNoZXMoZWwsIHBhdHQsIGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSxcbiAgICApO1xuICB9O1xuXG4gIC8vXG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hBbnlIZWxwZXIgPSBGYXIoJ21hdGNoOmFueSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoX3NwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIF9jaGVjaykgPT4gdHJ1ZSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAobWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgbWF0Y2hlclBheWxvYWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWycnLCAneyddLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaEFuZEhlbHBlciA9IEZhcignbWF0Y2g6YW5kIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICByZXR1cm4gcGF0dHMuZXZlcnkocGF0dCA9PiBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgY2hlY2tJdCA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGNoZWNrKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpID09PSAnY29weUFycmF5JyB8fFxuICAgICAgICAgIGNoZWNrKGZhbHNlLCBYYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHtxcChhbGxlZ2VkUGF0dHMpfWApKSAmJlxuICAgICAgICBhbGxlZ2VkUGF0dHMuZXZlcnkoY2hlY2tJdClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFJhbmtDb3ZlcjogKHBhdHRzLCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnMoXG4gICAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgICBwYXR0cy5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKSxcbiAgICAgICksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoT3JIZWxwZXIgPSBGYXIoJ21hdGNoOm9yIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcGF0dHM7XG4gICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cXAocGF0dHMpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGJpbmFyeVVuZGVmUGF0dElkeCA9XG4gICAgICAgIHBhdHRzLmxlbmd0aCA9PT0gMlxuICAgICAgICAgID8gcGF0dHMuZmluZEluZGV4KHBhdHQgPT4gaXNVbmRlZmluZWRQYXR0KHBhdHQpKVxuICAgICAgICAgIDogLTE7XG4gICAgICBpZiAoYmluYXJ5VW5kZWZQYXR0SWR4ICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNwZWNpbWVuID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHRzWzEgLSBiaW5hcnlVbmRlZlBhdHRJZHhdLCBjaGVjaylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXR0cy5zb21lKHBhdHQgPT4gbWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBtYXRjaCBvbmUgb2YgJHtxcChwYXR0cyl9YCk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFuZEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKHBhdHRzLCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIHVuaW9uUmFua0NvdmVycyhcbiAgICAgICAgY29tcGFyZVJhbmssXG4gICAgICAgIHBhdHRzLm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpLFxuICAgICAgKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hOb3RIZWxwZXIgPSBGYXIoJ21hdGNoOm5vdCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgICBpZiAobWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCkpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3FwKHBhdHQpfWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrUGF0dGVybixcblxuICAgIGdldFJhbmtDb3ZlcjogKF9wYXR0LCBfZW5jb2RlUGFzc2FibGUpID0+IFsnJywgJ3snXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXIgPSBGYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja1NjYWxhcktleShzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hLZXlIZWxwZXIgPSBGYXIoJ21hdGNoOmtleSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0tleShzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyID0gRmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrUGF0dGVybihzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hLaW5kSGVscGVyID0gRmFyKCdtYXRjaDpraW5kIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IGNoZWNrS2luZCxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZEtleUtpbmQsIGNoZWNrKSA9PlxuICAgICAgdHlwZW9mIGFsbGVnZWRLZXlLaW5kID09PSAnc3RyaW5nJyB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2AsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoa2luZCwgX2VuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBsZXQgc3R5bGU7XG4gICAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSAnY29weVNldCc6XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgc3R5bGUgPSAndGFnZ2VkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgc3R5bGUgPSBraW5kO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIoc3R5bGUpO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoVGFnZ2VkSGVscGVyID0gRmFyKCdtYXRjaDp0YWdnZWQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbdGFnUGF0dCwgcGF5bG9hZFBhdHRdLCBjaGVjaykgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gJ3RhZ2dlZCcpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgRXhwZWN0ZWQgdGFnZ2VkIG9iamVjdCwgbm90ICR7cShcbiAgICAgICAgICAgIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSxcbiAgICAgICAgICApfTogJHtzcGVjaW1lbn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tNYXRjaGVzKGdldFRhZyhzcGVjaW1lbiksIHRhZ1BhdHQsIGNoZWNrLCAndGFnJykgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLnBheWxvYWQsIHBheWxvYWRQYXR0LCBjaGVjaywgJ3BheWxvYWQnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnRhZ2dlZCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfa2luZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoQmlnaW50SGVscGVyID0gRmFyKCdtYXRjaDpiaWdpbnQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYmlnaW50JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoTmF0SGVscGVyID0gRmFyKCdtYXRjaDpuYXQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYmlnaW50JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pID49IDBuLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6bmF0IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIC8vXG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3RyaW5nSGVscGVyID0gRmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3RyaW5nTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnc3RyaW5nJywgY2hlY2spICYmXG4gICAgICAgICAgLy9cbiAgICAgICAgICAoLyogICAgICAgICAgICAgICAgICovIChzcGVjaW1lbikubGVuZ3RoIDw9IHN0cmluZ0xlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnN0cmluZyBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3ltYm9sSGVscGVyID0gRmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3ltYm9sTmFtZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgaWYgKCFjaGVja0tpbmQoc3BlY2ltZW4sICdzeW1ib2wnLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3ltYm9sTmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3ltYm9sTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBzeW1ib2xOYW1lLmxlbmd0aCA8PSBzeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG4gICAgICAgIFhgU3ltYm9sIG5hbWUgJHtxKFxuICAgICAgICAgIHN5bWJvbE5hbWUsXG4gICAgICAgICl9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c3ltYm9sIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdzeW1ib2wnKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXIgPSBGYXIoJ21hdGNoOnJlbW90YWJsZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJlbW90YWJsZURlc2MsIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoaXNLaW5kKHNwZWNpbWVuLCAncmVtb3RhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2sgPT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGxhYmVsIH0gPSByZW1vdGFibGVEZXNjO1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICAgICAgY29uc3Qga2luZERldGFpbHMgPVxuICAgICAgICBwYXNzU3R5bGUgIT09ICd0YWdnZWQnXG4gICAgICAgICAgPyAvL1xuICAgICAgICAgICAgYihwYXNzU3R5bGUpXG4gICAgICAgICAgOiAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHEoZ2V0VGFnKHNwZWNpbWVuKSk7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIHJlbW90YWJsZSAke2IobGFiZWwpfSwgbm90ICR7a2luZERldGFpbHN9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFJlbW90YWJsZURlc2MsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICBhbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbiAgICAgICAgaGFyZGVuKHsgbGFiZWw6IE1NLnN0cmluZygpIH0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfcmVtb3RhYmxlRGVzYywgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3JlbW90YWJsZScpLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaExURUhlbHBlciA9IEZhcignbWF0Y2g6bHRlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUxURShzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocmlnaHRPcGVyYW5kLCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxldCBbbGVmdEJvdW5kLCByaWdodEJvdW5kXSA9IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gICAgICBjb25zdCBuZXdSaWdodEJvdW5kID0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbiAgICAgIGlmIChuZXdSaWdodEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmlnaHRCb3VuZCA9IG5ld1JpZ2h0Qm91bmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF07XG4gICAgfSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hMVEhlbHBlciA9IEZhcignbWF0Y2g6bHQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5TFQoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiBtYXRjaExURUhlbHBlci5nZXRSYW5rQ292ZXIsXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoR1RFSGVscGVyID0gRmFyKCdtYXRjaDpndGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5R1RFKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPj0gJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChyaWdodE9wZXJhbmQsIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgbGV0IFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdID0gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiAgICAgIGNvbnN0IG5ld0xlZnRCb3VuZCA9IGVuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCk7XG4gICAgICBpZiAobmV3TGVmdEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGVmdEJvdW5kID0gbmV3TGVmdEJvdW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoR1RIZWxwZXIgPSBGYXIoJ21hdGNoOmd0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUdUKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogbWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaFJlY29yZE9mSGVscGVyID0gRmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtUHJvcGVydGllc0xpbWl0LCBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlSZWNvcmQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgb3duS2V5cyhzcGVjaW1lbikubGVuZ3RoIDw9IG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgICBYYE11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgICApfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4gICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBrZXkubGVuZ3RoIDw9IHByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuICAgICAgICAgICAgICAgIFhgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgICAgICAgICApfWAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgICAgICAgaGFyZGVuKFtrZXksIHZhbHVlXSksXG4gICAgICAgICAgICAgIGhhcmRlbihba2V5UGF0dCwgdmFsdWVQYXR0XSksXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IF9lbnRyeVBhdHQgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyID0gRmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW3N1YlBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGFycmF5TGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUFycmF5JywgY2hlY2spICYmXG4gICAgICAgICgvKiAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pLmxlbmd0aCA8PSBhcnJheUxlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgQXJyYXkgbGVuZ3RoICR7c3BlY2ltZW4ubGVuZ3RofSBtdXN0IGJlIDw9IGxpbWl0ICR7YXJyYXlMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sIHN1YlBhdHQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoQnl0ZUFycmF5SGVscGVyID0gRmFyKCdtYXRjaDpieXRlQXJyYXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2J5dGVBcnJheScsIGNoZWNrKSAmJlxuICAgICAgICAoLyogICAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKS5ieXRlTGVuZ3RoIDw9IGJ5dGVMZW5ndGhMaW1pdCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYGJ5dGVBcnJheSAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke2J5dGVMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6Ynl0ZUFycmF5IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdieXRlQXJyYXknKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hTZXRPZkhlbHBlciA9IEZhcignbWF0Y2g6c2V0T2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBba2V5UGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtU2V0RWxlbWVudHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlTZXQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuLnBheWxvYWQpLmxlbmd0aCA8IG51bVNldEVsZW1lbnRzTGltaXQsXG4gICAgICAgICAgWGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gICAgICAgICAgfWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLCBrZXlQYXR0LCBjaGVjaywgJ3NldCBlbGVtZW50cycpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c2V0T2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoQmFnT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOmJhZ09mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2tleVBhdHQsIGNvdW50UGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LCBkZWNpbWFsRGlnaXRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5QmFnJywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICovIChzcGVjaW1lbi5wYXlsb2FkKS5sZW5ndGggPD1cbiAgICAgICAgICAgIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG4gICAgICAgICAgWGBCYWcgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcbiAgICAgICAgICApfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuICAgICAgICAgIChba2V5LCBjb3VudF0sIGkpID0+XG4gICAgICAgICAgICBjaGVja01hdGNoZXMoa2V5LCBrZXlQYXR0LCBjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkgJiZcbiAgICAgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG4gICAgICAgICAgICAgIFtjb3VudCwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVja10sXG4gICAgICAgICAgICAgIGBiYWcgY291bnRzWyR7aX1dYCxcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhjb3VudCwgY291bnRQYXR0LCBjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6YmFnT2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVsZW1lbnRzSGFzU3BsaXQgPSAoXG4gICAgZWxlbWVudHMsXG4gICAgZWxlbWVudFBhdHQsXG4gICAgYm91bmQsXG4gICAgaW5SZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIG91dFJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgY2hlY2sgPSBpZGVudENoZWNrZXIsXG4gICkgPT4ge1xuICAgIGxldCBjb3VudCA9IDBuO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChsZXQgaSA9IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoY291bnQgPCBib3VuZCkge1xuICAgICAgICBpZiAobWF0Y2hlcyhlbGVtZW50LCBlbGVtZW50UGF0dCkpIHtcbiAgICAgICAgICBjb3VudCArPSAxbjtcbiAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzKSB7XG4gICAgICAgICAgb3V0UmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgY291bnQgPj0gYm91bmQsXG4gICAgICBYYEhhcyBvbmx5ICR7cShjb3VudCl9IG1hdGNoZXMsIGJ1dCBuZWVkcyAke3EoYm91bmQpfWAsXG4gICAgKTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwYWlyc0hhc1NwbGl0ID0gKFxuICAgIHBhaXJzLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIGluUmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBvdXRSZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBsZXQgY291bnQgPSAwbjtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAobGV0IGkgPSBwYWlycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3QgW2VsZW1lbnQsIG51bV0gPSBwYWlyc1tpXTtcbiAgICAgIGNvbnN0IG51bVJlc3QgPSBib3VuZCAtIGNvdW50O1xuICAgICAgaWYgKG51bVJlc3QgPj0gMW4pIHtcbiAgICAgICAgaWYgKG1hdGNoZXMoZWxlbWVudCwgZWxlbWVudFBhdHQpKSB7XG4gICAgICAgICAgaWYgKG51bSA8PSBudW1SZXN0KSB7XG4gICAgICAgICAgICBjb3VudCArPSBudW07XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG51bUluID0gbnVtUmVzdDtcbiAgICAgICAgICAgIGNvdW50ICs9IG51bUluO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0cykgaW5SZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bVJlc3RdKTtcbiAgICAgICAgICAgIGlmIChvdXRSZXN1bHRzKSBvdXRSZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bSAtIG51bVJlc3RdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cykge1xuICAgICAgICAgIG91dFJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0UmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1dKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgY291bnQgPj0gYm91bmQsXG4gICAgICBYYEhhcyBvbmx5ICR7cShjb3VudCl9IG1hdGNoZXMsIGJ1dCBuZWVkcyAke3EoYm91bmQpfWAsXG4gICAgKTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGNvbnRhaW5lckhhc1NwbGl0ID0gKFxuICAgIHNwZWNpbWVuLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIG5lZWRJblJlc3VsdHMgPSBmYWxzZSxcbiAgICBuZWVkT3V0UmVzdWx0cyA9IGZhbHNlLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBjb25zdCBpblJlc3VsdHMgPSBuZWVkSW5SZXN1bHRzID8gW10gOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3V0UmVzdWx0cyA9IG5lZWRPdXRSZXN1bHRzID8gW10gOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qga2luZCA9IGtpbmRPZihzcGVjaW1lbik7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZWxlbWVudHNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLFxuICAgICAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGluUmVzdWx0cyxcbiAgICAgICAgICAgIG91dFJlc3VsdHMsXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbaW5SZXN1bHRzLCBvdXRSZXN1bHRzXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZWxlbWVudHNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQsXG4gICAgICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgaW5SZXN1bHRzLFxuICAgICAgICAgICAgb3V0UmVzdWx0cyxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgaW5SZXN1bHRzICYmIG1ha2VDb3B5U2V0KGluUmVzdWx0cyksXG4gICAgICAgICAgb3V0UmVzdWx0cyAmJiBtYWtlQ29weVNldChvdXRSZXN1bHRzKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhcGFpcnNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQsXG4gICAgICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgaW5SZXN1bHRzLFxuICAgICAgICAgICAgb3V0UmVzdWx0cyxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgaW5SZXN1bHRzICYmIG1ha2VDb3B5QmFnKGluUmVzdWx0cyksXG4gICAgICAgICAgb3V0UmVzdWx0cyAmJiBtYWtlQ29weUJhZyhvdXRSZXN1bHRzKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHVuZXhwZWN0ZWQgJHtxKGtpbmQpfWApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaENvbnRhaW5lckhhc0hlbHBlciA9IEZhcignTS5jb250YWluZXJIYXMgaGVscGVyJywge1xuICAgIC8qXG5cblxuXG4gICAgICovXG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtlbGVtZW50UGF0dCwgYm91bmQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGtpbmQgPSBraW5kT2Yoc3BlY2ltZW4sIGNoZWNrKTtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgaWYgKFxuICAgICAgICAhYXBwbHlMYWJlbGluZ0Vycm9yKFxuICAgICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuICAgICAgICAgIFtib3VuZCwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVja10sXG4gICAgICAgICAgYCR7a2luZH0gbWF0Y2hlc2AsXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gISFjb250YWluZXJIYXNTcGxpdChcbiAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICBib3VuZCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjaGVjayxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLmd0ZSgxbildKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdNLmNvbnRhaW5lckhhcyBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hNYXBPZkhlbHBlciA9IEZhcignbWF0Y2g6bWFwT2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IG51bU1hcEVudHJpZXNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlNYXAnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuLnBheWxvYWQua2V5cykubGVuZ3RoIDw9XG4gICAgICAgICAgICBudW1NYXBFbnRyaWVzTGltaXQsXG4gICAgICAgICAgWGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtTWFwRW50cmllc0xpbWl0LFxuICAgICAgICAgICl9IGVudHJpZXM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQua2V5cyxcbiAgICAgICAgICBrZXlQYXR0LFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICdtYXAga2V5cycsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbiAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbiAgICAgICAgICB2YWx1ZVBhdHQsXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgJ21hcCB2YWx1ZXMnLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDptYXBPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IF9lbnRyeVBhdHQgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHNwbGl0QXJyYXlQYXJ0cyA9IChzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpID0+IHtcbiAgICBjb25zdCBudW1SZXF1aXJlZCA9IHJlcXVpcmVkUGF0dC5sZW5ndGg7XG4gICAgY29uc3QgbnVtT3B0aW9uYWwgPSBvcHRpb25hbFBhdHQubGVuZ3RoO1xuICAgIGNvbnN0IHJlcXVpcmVkU3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZSgwLCBudW1SZXF1aXJlZCk7XG4gICAgY29uc3Qgb3B0aW9uYWxTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKFxuICAgICAgbnVtUmVxdWlyZWQsXG4gICAgICBudW1SZXF1aXJlZCArIG51bU9wdGlvbmFsLFxuICAgICk7XG4gICAgY29uc3QgcmVzdFNwZWNpbWVuID0gc3BlY2ltZW4uc2xpY2UobnVtUmVxdWlyZWQgKyBudW1PcHRpb25hbCk7XG4gICAgcmV0dXJuIGhhcmRlbih7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9KTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBhZGFwdEFycmF5UGF0dGVybiA9IChvcHRpb25hbFBhdHQsIGxlbmd0aCkgPT5cbiAgICBoYXJkZW4ob3B0aW9uYWxQYXR0LnNsaWNlKDAsIGxlbmd0aCkubWFwKHBhdHQgPT4gTU0ub3B0KHBhdHQpKSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hTcGxpdEFycmF5SGVscGVyID0gRmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0gW10sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlBcnJheScsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9ID1cbiAgICAgICAgc3BsaXRBcnJheVBhcnRzKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCk7XG4gICAgICBjb25zdCBwYXJ0aWFsUGF0dCA9IGFkYXB0QXJyYXlQYXR0ZXJuKFxuICAgICAgICBvcHRpb25hbFBhdHQsXG4gICAgICAgIG9wdGlvbmFsU3BlY2ltZW4ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIGxldCBhcmdOdW0gPSAwO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHJlcXVpcmVkU3BlY2ltZW4ubGVuZ3RoID09PSByZXF1aXJlZFBhdHQubGVuZ3RoIHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgRXhwZWN0ZWQgYXQgbGVhc3QgJHtxKFxuICAgICAgICAgICAgICByZXF1aXJlZFBhdHQubGVuZ3RoLFxuICAgICAgICAgICAgKX0gYXJndW1lbnRzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICAgKSkgJiZcbiAgICAgICAgcmVxdWlyZWRQYXR0LmV2ZXJ5KChwLCBpKSA9PlxuICAgICAgICAgIC8vXG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0sIHAsIGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9YCksXG4gICAgICAgICkgJiZcbiAgICAgICAgcGFydGlhbFBhdHQuZXZlcnkoKHAsIGkpID0+XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSwgcCwgY2hlY2ssIGBhcmcgJHthcmdOdW0rK30/YCksXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHNwbGl0QXJyYXksIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAoc3BsaXRBcnJheS5sZW5ndGggPj0gMSB8fCBzcGxpdEFycmF5Lmxlbmd0aCA8PSAzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgICBzcGxpdEFycmF5O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkgJiZcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAgIChvcHRpb25hbFBhdHQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKGlzUGF0dGVybihvcHRpb25hbFBhdHQpICYmXG4gICAgICAgICAgICAgIHBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCkgPT09ICdjb3B5QXJyYXknKSkgJiZcbiAgICAgICAgICAocmVzdFBhdHQgPT09IHVuZGVmaW5lZCB8fCBpc1BhdHRlcm4ocmVzdFBhdHQpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IGFycmF5LCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgYXJyYXksIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuICAgICAgICAgIHNwbGl0QXJyYXksXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFJhbmtDb3ZlcjogKFtcbiAgICAgIF9yZXF1aXJlZFBhdHQsXG4gICAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgICAgX3Jlc3RQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF0pID0+IGdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKSxcbiAgfSk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBzcGxpdFJlY29yZFBhcnRzID0gKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCkgPT4ge1xuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCByZXF1aXJlZEVudHJpZXMgPSBbXTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IG9wdGlvbmFsRW50cmllcyA9IFtdO1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmVzdEVudHJpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZW50cmllcyhzcGVjaW1lbikpIHtcbiAgICAgIGlmIChoYXNPd24ocmVxdWlyZWRQYXR0LCBuYW1lKSkge1xuICAgICAgICByZXF1aXJlZEVudHJpZXMucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzT3duKG9wdGlvbmFsUGF0dCwgbmFtZSkpIHtcbiAgICAgICAgb3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0RW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHJlcXVpcmVkU3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG4gICAgICBvcHRpb25hbFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxuICAgICAgcmVzdFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyksXG4gICAgfSk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgYWRhcHRSZWNvcmRQYXR0ZXJuID0gKG9wdGlvbmFsUGF0dCwgbmFtZXMpID0+XG4gICAgZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIE1NLm9wdChvcHRpb25hbFBhdHRbbmFtZV0pXSkpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXIgPSBGYXIoJ21hdGNoOnNwbGl0UmVjb3JkIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0ge30sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlSZWNvcmQnLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSA9XG4gICAgICAgIHNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KTtcblxuICAgICAgY29uc3QgcGFydGlhbE5hbWVzID0gLyogICAgICAgICAgICAgICAgICAgKi8gKG93bktleXMob3B0aW9uYWxTcGVjaW1lbikpO1xuICAgICAgY29uc3QgcGFydGlhbFBhdHQgPSBhZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LCBwYXJ0aWFsTmFtZXMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgY2hlY2spICYmXG4gICAgICAgIHBhcnRpYWxOYW1lcy5ldmVyeShuYW1lID0+XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICAgICAgb3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbiAgICAgICAgICAgIHBhcnRpYWxQYXR0W25hbWVdLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICBgJHtuYW1lfT9gLFxuICAgICAgICAgICksXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHNwbGl0QXJyYXksIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAoc3BsaXRBcnJheS5sZW5ndGggPj0gMSB8fCBzcGxpdEFycmF5Lmxlbmd0aCA8PSAzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgICBzcGxpdEFycmF5O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkgJiZcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weVJlY29yZCcgJiZcbiAgICAgICAgICAob3B0aW9uYWxQYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSAmJlxuICAgICAgICAgICAgICBwYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpID09PSAnY29weVJlY29yZCcpKSAmJlxuICAgICAgICAgIChyZXN0UGF0dCA9PT0gdW5kZWZpbmVkIHx8IGlzUGF0dGVybihyZXN0UGF0dCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgcmVjb3JkLCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgcmVjb3JkLCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbiAgICAgICAgICBzcGxpdEFycmF5LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChbXG4gICAgICByZXF1aXJlZFBhdHQsXG4gICAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgICAgX3Jlc3RQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF0pID0+IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgSGVscGVyc0J5TWF0Y2hUYWcgPSBoYXJkZW4oe1xuICAgICdtYXRjaDphbnknOiBtYXRjaEFueUhlbHBlcixcbiAgICAnbWF0Y2g6YW5kJzogbWF0Y2hBbmRIZWxwZXIsXG4gICAgJ21hdGNoOm9yJzogbWF0Y2hPckhlbHBlcixcbiAgICAnbWF0Y2g6bm90JzogbWF0Y2hOb3RIZWxwZXIsXG5cbiAgICAnbWF0Y2g6c2NhbGFyJzogbWF0Y2hTY2FsYXJIZWxwZXIsXG4gICAgJ21hdGNoOmtleSc6IG1hdGNoS2V5SGVscGVyLFxuICAgICdtYXRjaDpwYXR0ZXJuJzogbWF0Y2hQYXR0ZXJuSGVscGVyLFxuICAgICdtYXRjaDpraW5kJzogbWF0Y2hLaW5kSGVscGVyLFxuICAgICdtYXRjaDp0YWdnZWQnOiBtYXRjaFRhZ2dlZEhlbHBlcixcbiAgICAnbWF0Y2g6YmlnaW50JzogbWF0Y2hCaWdpbnRIZWxwZXIsXG4gICAgJ21hdGNoOm5hdCc6IG1hdGNoTmF0SGVscGVyLFxuICAgICdtYXRjaDpzdHJpbmcnOiBtYXRjaFN0cmluZ0hlbHBlcixcbiAgICAnbWF0Y2g6c3ltYm9sJzogbWF0Y2hTeW1ib2xIZWxwZXIsXG4gICAgJ21hdGNoOnJlbW90YWJsZSc6IG1hdGNoUmVtb3RhYmxlSGVscGVyLFxuXG4gICAgJ21hdGNoOmx0JzogbWF0Y2hMVEhlbHBlcixcbiAgICAnbWF0Y2g6bHRlJzogbWF0Y2hMVEVIZWxwZXIsXG4gICAgJ21hdGNoOmd0ZSc6IG1hdGNoR1RFSGVscGVyLFxuICAgICdtYXRjaDpndCc6IG1hdGNoR1RIZWxwZXIsXG5cbiAgICAnbWF0Y2g6YXJyYXlPZic6IG1hdGNoQXJyYXlPZkhlbHBlcixcbiAgICAnbWF0Y2g6Ynl0ZUFycmF5JzogbWF0Y2hCeXRlQXJyYXlIZWxwZXIsXG4gICAgJ21hdGNoOnJlY29yZE9mJzogbWF0Y2hSZWNvcmRPZkhlbHBlcixcbiAgICAnbWF0Y2g6c2V0T2YnOiBtYXRjaFNldE9mSGVscGVyLFxuICAgICdtYXRjaDpiYWdPZic6IG1hdGNoQmFnT2ZIZWxwZXIsXG4gICAgJ21hdGNoOmNvbnRhaW5lckhhcyc6IG1hdGNoQ29udGFpbmVySGFzSGVscGVyLFxuICAgICdtYXRjaDptYXBPZic6IG1hdGNoTWFwT2ZIZWxwZXIsXG4gICAgJ21hdGNoOnNwbGl0QXJyYXknOiBtYXRjaFNwbGl0QXJyYXlIZWxwZXIsXG4gICAgJ21hdGNoOnNwbGl0UmVjb3JkJzogbWF0Y2hTcGxpdFJlY29yZEhlbHBlcixcbiAgfSk7XG5cbiAgY29uc3QgbWFrZU1hdGNoZXIgPSAodGFnLCBwYXlsb2FkKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlciA9IG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbiAgICBhc3NlcnRQYXR0ZXJuKG1hdGNoZXIpO1xuICAgIHJldHVybiBtYXRjaGVyO1xuICB9O1xuXG4gIGNvbnN0IG1ha2VLaW5kTWF0Y2hlciA9IGtpbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmtpbmQnLCBraW5kKTtcblxuICBjb25zdCBBbnlTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDphbnknLCB1bmRlZmluZWQpO1xuICBjb25zdCBTY2FsYXJTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDpzY2FsYXInLCB1bmRlZmluZWQpO1xuICBjb25zdCBLZXlTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDprZXknLCB1bmRlZmluZWQpO1xuICBjb25zdCBQYXR0ZXJuU2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IEJvb2xlYW5TaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignYm9vbGVhbicpO1xuICBjb25zdCBOdW1iZXJTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG4gIGNvbnN0IEJpZ0ludFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YmlnaW50JywgW10pO1xuICBjb25zdCBOYXRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsIFtdKTtcbiAgY29uc3QgU3RyaW5nU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzdHJpbmcnLCBbXSk7XG4gIGNvbnN0IFN5bWJvbFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c3ltYm9sJywgW10pO1xuICBjb25zdCBSZWNvcmRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBBcnJheVNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsIFtBbnlTaGFwZV0pO1xuICBjb25zdCBCeXRlQXJyYXlTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJ5dGVBcnJheScsIFtdKTtcbiAgY29uc3QgU2V0U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsIFtBbnlTaGFwZV0pO1xuICBjb25zdCBCYWdTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJhZ09mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBNYXBTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOm1hcE9mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBSZW1vdGFibGVTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigncmVtb3RhYmxlJyk7XG4gIGNvbnN0IEVycm9yU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG4gIGNvbnN0IFByb21pc2VTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigncHJvbWlzZScpO1xuICBjb25zdCBVbmRlZmluZWRTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigndW5kZWZpbmVkJyk7XG5cbiAgLypcblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VMaW1pdHNNYXRjaGVyID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICAgIGlmIChwYXlsb2FkW3BheWxvYWQubGVuZ3RoIC0gMV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGF5bG9hZCA9IGhhcmRlbihwYXlsb2FkLnNsaWNlKDAsIHBheWxvYWQubGVuZ3RoIC0gMSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZU1hdGNoZXIodGFnLCBwYXlsb2FkKTtcbiAgfTtcblxuICBjb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlciA9IChsYWJlbCA9IHVuZGVmaW5lZCkgPT5cbiAgICBsYWJlbCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IFJlbW90YWJsZVNoYXBlXG4gICAgICA6IG1ha2VNYXRjaGVyKCdtYXRjaDpyZW1vdGFibGUnLCBoYXJkZW4oeyBsYWJlbCB9KSk7XG5cbiAgLypcblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VTcGxpdFBheWxvYWQgPSAoXG4gICAgZW1wdHksXG4gICAgYmFzZSxcbiAgICBvcHRpb25hbCA9IHVuZGVmaW5lZCxcbiAgICByZXN0ID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICBpZiAocmVzdCkge1xuICAgICAgcmV0dXJuIFtiYXNlLCBvcHRpb25hbCB8fCBlbXB0eSwgcmVzdF07XG4gICAgfVxuICAgIGlmIChvcHRpb25hbCkge1xuICAgICAgcmV0dXJuIFtiYXNlLCBvcHRpb25hbF07XG4gICAgfVxuICAgIHJldHVybiBbYmFzZV07XG4gIH07XG5cbiAgLy9cblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IE0gPSBoYXJkZW4oe1xuICAgIGFueTogKCkgPT4gQW55U2hhcGUsXG4gICAgYW5kOiAoLi4ucGF0dHMpID0+IG1ha2VNYXRjaGVyKCdtYXRjaDphbmQnLCBwYXR0cyksXG4gICAgb3I6ICguLi5wYXR0cykgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOm9yJywgcGF0dHMpLFxuICAgIG5vdDogc3ViUGF0dCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bm90Jywgc3ViUGF0dCksXG5cbiAgICBzY2FsYXI6ICgpID0+IFNjYWxhclNoYXBlLFxuICAgIGtleTogKCkgPT4gS2V5U2hhcGUsXG4gICAgcGF0dGVybjogKCkgPT4gUGF0dGVyblNoYXBlLFxuICAgIGtpbmQ6IG1ha2VLaW5kTWF0Y2hlcixcbiAgICB0YWdnZWQ6ICh0YWdQYXR0ID0gTS5zdHJpbmcoKSwgcGF5bG9hZFBhdHQgPSBNLmFueSgpKSA9PlxuICAgICAgbWFrZU1hdGNoZXIoJ21hdGNoOnRhZ2dlZCcsIGhhcmRlbihbdGFnUGF0dCwgcGF5bG9hZFBhdHRdKSksXG4gICAgYm9vbGVhbjogKCkgPT4gQm9vbGVhblNoYXBlLFxuICAgIG51bWJlcjogKCkgPT4gTnVtYmVyU2hhcGUsXG4gICAgYmlnaW50OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJpZ2ludCcsIFtsaW1pdHNdKSA6IEJpZ0ludFNoYXBlLFxuICAgIG5hdDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpuYXQnLCBbbGltaXRzXSkgOiBOYXRTaGFwZSxcbiAgICBzdHJpbmc6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3RyaW5nJywgW2xpbWl0c10pIDogU3RyaW5nU2hhcGUsXG4gICAgc3ltYm9sOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN5bWJvbCcsIFtsaW1pdHNdKSA6IFN5bWJvbFNoYXBlLFxuICAgIHJlY29yZDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0ucmVjb3JkT2YoTS5hbnkoKSwgTS5hbnkoKSwgbGltaXRzKSA6IFJlY29yZFNoYXBlLFxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgYXJyYXk6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLmFycmF5T2YoTS5hbnkoKSwgbGltaXRzKSA6IEFycmF5U2hhcGUsXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgYnl0ZUFycmF5OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJ5dGVBcnJheScsIFtsaW1pdHNdKSA6IEJ5dGVBcnJheVNoYXBlLFxuICAgIHNldDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT4gKGxpbWl0cyA/IE0uc2V0T2YoTS5hbnkoKSwgbGltaXRzKSA6IFNldFNoYXBlKSxcbiAgICBiYWc6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLmJhZ09mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBCYWdTaGFwZSxcbiAgICBtYXA6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLm1hcE9mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBNYXBTaGFwZSxcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHJlbW90YWJsZTogbWFrZVJlbW90YWJsZU1hdGNoZXIsXG4gICAgZXJyb3I6ICgpID0+IEVycm9yU2hhcGUsXG4gICAgcHJvbWlzZTogKCkgPT4gUHJvbWlzZVNoYXBlLFxuICAgIHVuZGVmaW5lZDogKCkgPT4gVW5kZWZpbmVkU2hhcGUsXG4gICAgbnVsbDogKCkgPT4gbnVsbCxcblxuICAgIGx0OiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmx0JywgcmlnaHRPcGVyYW5kKSxcbiAgICBsdGU6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bHRlJywgcmlnaHRPcGVyYW5kKSxcbiAgICBlcToga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleShrZXkpO1xuICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gTS51bmRlZmluZWQoKSA6IGtleTtcbiAgICB9LFxuICAgIG5lcToga2V5ID0+IE0ubm90KE0uZXEoa2V5KSksXG4gICAgZ3RlOiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmd0ZScsIHJpZ2h0T3BlcmFuZCksXG4gICAgZ3Q6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLCByaWdodE9wZXJhbmQpLFxuXG4gICAgcmVjb3JkT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgdmFsdWVQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnJlY29yZE9mJywgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzXSksXG4gICAgYXJyYXlPZjogKHN1YlBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YXJyYXlPZicsIFtzdWJQYXR0LCBsaW1pdHNdKSxcbiAgICBzZXRPZjogKGtleVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLCBba2V5UGF0dCwgbGltaXRzXSksXG4gICAgYmFnT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgY291bnRQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJywgW2tleVBhdHQsIGNvdW50UGF0dCwgbGltaXRzXSksXG4gICAgY29udGFpbmVySGFzOiAoZWxlbWVudFBhdHQgPSBNLmFueSgpLCBjb3VudFBhdHQgPSAxbiwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmNvbnRhaW5lckhhcycsIFtlbGVtZW50UGF0dCwgY291bnRQYXR0LCBsaW1pdHNdKSxcbiAgICBtYXBPZjogKGtleVBhdHQgPSBNLmFueSgpLCB2YWx1ZVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLCBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHNdKSxcbiAgICBzcGxpdEFycmF5OiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTWF0Y2hlcihcbiAgICAgICAgJ21hdGNoOnNwbGl0QXJyYXknLFxuICAgICAgICBtYWtlU3BsaXRQYXlsb2FkKFtdLCBiYXNlLCBvcHRpb25hbCwgcmVzdCksXG4gICAgICApLFxuICAgIHNwbGl0UmVjb3JkOiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTWF0Y2hlcihcbiAgICAgICAgJ21hdGNoOnNwbGl0UmVjb3JkJyxcbiAgICAgICAgbWFrZVNwbGl0UGF5bG9hZCh7fSwgYmFzZSwgb3B0aW9uYWwsIHJlc3QpLFxuICAgICAgKSxcbiAgICBzcGxpdDogKGJhc2UsIHJlc3QgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpID09PSAnY29weUFycmF5Jykge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gTS5zcGxpdEFycmF5KGJhc2UsIHJlc3QgJiYgW10sIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSwgcmVzdCAmJiB7fSwgcmVzdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYXJ0aWFsOiAoYmFzZSwgcmVzdCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSkgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBNLnNwbGl0QXJyYXkoW10sIGJhc2UsIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sIGJhc2UsIHJlc3QpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlcmVmOiB0ID0+IE0ub3IodCwgTS5wcm9taXNlKCkpLFxuICAgIG9wdDogdCA9PiBNLm9yKE0udW5kZWZpbmVkKCksIHQpLFxuXG4gICAgaW50ZXJmYWNlOiAoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zKSA9PlxuICAgICAgLy9cbiAgICAgIG1ha2VJbnRlcmZhY2VHdWFyZChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMpLFxuICAgIGNhbGw6ICguLi5hcmdQYXR0ZXJucykgPT5cbiAgICAgIC8vXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignc3luYycsIGFyZ1BhdHRlcm5zKSxcbiAgICBjYWxsV2hlbjogKC4uLmFyZ0d1YXJkcykgPT5cbiAgICAgIC8vXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLCBhcmdHdWFyZHMpLFxuXG4gICAgYXdhaXQ6IGFyZ1BhdHRlcm4gPT5cbiAgICAgIC8vXG4gICAgICBtYWtlQXdhaXRBcmdHdWFyZChhcmdQYXR0ZXJuKSxcbiAgICByYXc6ICgpID0+XG4gICAgICAvL1xuICAgICAgbWFrZVJhd0d1YXJkKCksXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNoZWNrTWF0Y2hlcyxcbiAgICBtYXRjaGVzLFxuICAgIG11c3RNYXRjaCxcbiAgICBhc3NlcnRQYXR0ZXJuLFxuICAgIGlzUGF0dGVybixcbiAgICBnZXRSYW5rQ292ZXIsXG4gICAgTSxcbiAgICBraW5kT2YsXG4gICAgY29udGFpbmVySGFzU3BsaXQsXG4gIH0pO1xufTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuICAgICAgIGNvbnN0IHtcbiAgY2hlY2tNYXRjaGVzLFxuICBtYXRjaGVzLFxuICBtdXN0TWF0Y2gsXG4gIGFzc2VydFBhdHRlcm4sXG4gIGlzUGF0dGVybixcbiAgZ2V0UmFua0NvdmVyLFxuICBNLFxuICBraW5kT2YsXG4gIGNvbnRhaW5lckhhc1NwbGl0LFxufSA9IG1ha2VQYXR0ZXJuS2l0KCk7JGjNj19vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRozY9fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTskaM2PX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaM2PX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjNj19vbmNlLmdldFJhbmtDb3ZlcihnZXRSYW5rQ292ZXIpOyRozY9fb25jZS5NKE0pOyRozY9fb25jZS5raW5kT2Yoa2luZE9mKTskaM2PX29uY2UuY29udGFpbmVySGFzU3BsaXQoY29udGFpbmVySGFzU3BsaXQpO1xuXG5NTSA9IE07XG5cbi8vXG5cbi8vXG5jb25zdCBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpLFxufSk7XG5cbiAgICAgICBjb25zdCBBd2FpdEFyZ0d1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnKTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuQXdhaXRBcmdHdWFyZFNoYXBlKEF3YWl0QXJnR3VhcmRTaGFwZSk7XG4gICAgICAgY29uc3QgaXNBd2FpdEFyZ0d1YXJkID0gc3BlY2ltZW4gPT5cbiAgbWF0Y2hlcyhzcGVjaW1lbiwgQXdhaXRBcmdHdWFyZFNoYXBlKTskaM2PX29uY2UuaXNBd2FpdEFyZ0d1YXJkKGlzQXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oaXNBd2FpdEFyZ0d1YXJkKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRBd2FpdEFyZ0d1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEF3YWl0QXJnR3VhcmRTaGFwZSwgJ2F3YWl0QXJnR3VhcmQnKTtcbn07JGjNj19vbmNlLmFzc2VydEF3YWl0QXJnR3VhcmQoYXNzZXJ0QXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0QXdhaXRBcmdHdWFyZCk7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZCA9IGFyZ1BhdHRlcm4gPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnLCB7XG4gICAgYXJnR3VhcmQ6IGFyZ1BhdHRlcm4sXG4gIH0pO1xuICBhc3NlcnRBd2FpdEFyZ0d1YXJkKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vL1xuXG5jb25zdCBSYXdHdWFyZFBheWxvYWRTaGFwZSA9IE0ucmVjb3JkKCk7XG5cbiAgICAgICBjb25zdCBSYXdHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDpyYXdHdWFyZCcpOyRozY9fb25jZS5SYXdHdWFyZFNoYXBlKFJhd0d1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgaXNSYXdHdWFyZCA9IHNwZWNpbWVuID0+IG1hdGNoZXMoc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUpOyRozY9fb25jZS5pc1Jhd0d1YXJkKGlzUmF3R3VhcmQpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UmF3R3VhcmQgPSBzcGVjaW1lbiA9PlxuICBtdXN0TWF0Y2goc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUsICdyYXdHdWFyZCcpO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0UmF3R3VhcmQoYXNzZXJ0UmF3R3VhcmQpO1xuY29uc3QgbWFrZVJhd0d1YXJkID0gKCkgPT4gbWFrZVRhZ2dlZCgnZ3VhcmQ6cmF3R3VhcmQnLCB7fSk7XG5cbi8vXG4vL1xuXG4gICAgICAgY29uc3QgU3luY1ZhbHVlR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgTS5wYXR0ZXJuKCkpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZFNoYXBlKFN5bmNWYWx1ZUd1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoU3luY1ZhbHVlR3VhcmRTaGFwZSk7JGjNj19vbmNlLlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKTtcblxuY29uc3QgQXJnR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgQXdhaXRBcmdHdWFyZFNoYXBlLCBNLnBhdHRlcm4oKSk7XG4gICAgICAgY29uc3QgQXJnR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoQXJnR3VhcmRTaGFwZSk7JGjNj19vbmNlLkFyZ0d1YXJkTGlzdFNoYXBlKEFyZ0d1YXJkTGlzdFNoYXBlKTtcblxuY29uc3QgU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgY2FsbEtpbmQ6ICdzeW5jJyxcbiAgYXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgb3B0aW9uYWxBcmdHdWFyZHM6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKSxcbiAgcmVzdEFyZ0d1YXJkOiBNLm9wdChTeW5jVmFsdWVHdWFyZFNoYXBlKSxcbiAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG59KTtcblxuY29uc3QgQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGNhbGxLaW5kOiAnYXN5bmMnLFxuICBhcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICBvcHRpb25hbEFyZ0d1YXJkczogTS5vcHQoQXJnR3VhcmRMaXN0U2hhcGUpLFxuICByZXN0QXJnR3VhcmQ6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkU2hhcGUpLFxuICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbn0pO1xuXG4gICAgICAgY29uc3QgTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSBNLm9yKFxuICBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gIEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4pOyRozY9fb25jZS5NZXRob2RHdWFyZFBheWxvYWRTaGFwZShNZXRob2RHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBNZXRob2RHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDptZXRob2RHdWFyZCcpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5NZXRob2RHdWFyZFNoYXBlKE1ldGhvZEd1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydE1ldGhvZEd1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIE1ldGhvZEd1YXJkU2hhcGUsICdtZXRob2RHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0TWV0aG9kR3VhcmQoYXNzZXJ0TWV0aG9kR3VhcmQpO1xuaGFyZGVuKGFzc2VydE1ldGhvZEd1YXJkKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyID0gKFxuICBjYWxsS2luZCxcbiAgYXJnR3VhcmRzLFxuICBvcHRpb25hbEFyZ0d1YXJkcyA9IHVuZGVmaW5lZCxcbiAgcmVzdEFyZ0d1YXJkID0gdW5kZWZpbmVkLFxuKSA9PlxuICBoYXJkZW4oe1xuICAgIG9wdGlvbmFsOiAoLi4ub3B0QXJnR3VhcmRzKSA9PiB7XG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG4gICAgICByZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsIGFyZ0d1YXJkcywgb3B0QXJnR3VhcmRzKTtcbiAgICB9LFxuICAgIHJlc3Q6IHJBcmdHdWFyZCA9PiB7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fCBGYWlsYENhbiBvbmx5IGhhdmUgb25lIHJlc3QgYXJnYDtcbiAgICAgIHJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbiAgICAgICAgY2FsbEtpbmQsXG4gICAgICAgIGFyZ0d1YXJkcyxcbiAgICAgICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgICAgIHJBcmdHdWFyZCxcbiAgICAgICk7XG4gICAgfSxcbiAgICByZXR1cm5zOiAocmV0dXJuR3VhcmQgPSBNLnVuZGVmaW5lZCgpKSA9PiB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnLCB7XG4gICAgICAgIGNhbGxLaW5kLFxuICAgICAgICBhcmdHdWFyZHMsXG4gICAgICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgICAgICByZXN0QXJnR3VhcmQsXG4gICAgICAgIHJldHVybkd1YXJkLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnRNZXRob2RHdWFyZChyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9KTtcblxuICAgICAgIGNvbnN0IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdEd1YXJkczogTS5vcihNLnVuZGVmaW5lZCgpLCAncGFzc2FibGUnLCAncmF3JyksXG4gICAgc2xvcHB5OiBNLmJvb2xlYW4oKSxcbiAgICBzeW1ib2xNZXRob2RHdWFyZHM6IE0ubWFwT2YoTS5zeW1ib2woKSwgTWV0aG9kR3VhcmRTaGFwZSksXG4gIH0sXG4pOyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZShJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDppbnRlcmZhY2VHdWFyZCcpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFNoYXBlKEludGVyZmFjZUd1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydEludGVyZmFjZUd1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEludGVyZmFjZUd1YXJkU2hhcGUsICdpbnRlcmZhY2VHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0SW50ZXJmYWNlR3VhcmQoYXNzZXJ0SW50ZXJmYWNlR3VhcmQpO1xuaGFyZGVuKGFzc2VydEludGVyZmFjZUd1YXJkKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbnRlcmZhY2VHdWFyZCA9IChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IHNsb3BweSA9IGZhbHNlLCBkZWZhdWx0R3VhcmRzID0gc2xvcHB5ID8gJ3Bhc3NhYmxlJyA6IHVuZGVmaW5lZCB9ID1cbiAgICBvcHRpb25zO1xuICAvL1xuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RyaW5nTWV0aG9kR3VhcmRzID0ge307XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcyA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBvd25LZXlzKG1ldGhvZEd1YXJkcykpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGhvZEd1YXJkc1svKiAgICAgICAgICAgICAgICAgKi8gKGtleSldO1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmluZ01ldGhvZEd1YXJkc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmludGVyZmFjZUd1YXJkJywge1xuICAgIGludGVyZmFjZU5hbWUsXG4gICAgbWV0aG9kR3VhcmRzOiBzdHJpbmdNZXRob2RHdWFyZHMsXG4gICAgLi4uKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMubGVuZ3RoXG4gICAgICA/IHsgc3ltYm9sTWV0aG9kR3VhcmRzOiBtYWtlQ29weU1hcChzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzKSB9XG4gICAgICA6IHt9KSxcbiAgICBkZWZhdWx0R3VhcmRzLFxuICB9KTtcbiAgYXNzZXJ0SW50ZXJmYWNlR3VhcmQocmVzdWx0KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChyZXN1bHQpO1xufTtcblxuY29uc3QgR3VhcmRQYXlsb2FkU2hhcGVzID0gaGFyZGVuKHtcbiAgJ2d1YXJkOmF3YWl0QXJnR3VhcmQnOiBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6cmF3R3VhcmQnOiBSYXdHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOm1ldGhvZEd1YXJkJzogTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDppbnRlcmZhY2VHdWFyZCc6IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLFxufSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdLCJraW5kT2YiOlsia2luZE9mIl0sImNvbnRhaW5lckhhc1NwbGl0IjpbImNvbnRhaW5lckhhc1NwbGl0Il0sIkF3YWl0QXJnR3VhcmRTaGFwZSI6WyJBd2FpdEFyZ0d1YXJkU2hhcGUiXSwiaXNBd2FpdEFyZ0d1YXJkIjpbImlzQXdhaXRBcmdHdWFyZCJdLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIjpbImFzc2VydEF3YWl0QXJnR3VhcmQiXSwiUmF3R3VhcmRTaGFwZSI6WyJSYXdHdWFyZFNoYXBlIl0sImlzUmF3R3VhcmQiOlsiaXNSYXdHdWFyZCJdLCJhc3NlcnRSYXdHdWFyZCI6WyJhc3NlcnRSYXdHdWFyZCJdLCJTeW5jVmFsdWVHdWFyZFNoYXBlIjpbIlN5bmNWYWx1ZUd1YXJkU2hhcGUiXSwiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiOlsiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiXSwiQXJnR3VhcmRMaXN0U2hhcGUiOlsiQXJnR3VhcmRMaXN0U2hhcGUiXSwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiOlsiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiXSwiTWV0aG9kR3VhcmRTaGFwZSI6WyJNZXRob2RHdWFyZFNoYXBlIl0sImFzc2VydE1ldGhvZEd1YXJkIjpbImFzc2VydE1ldGhvZEd1YXJkIl0sIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIjpbIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIl0sIkludGVyZmFjZUd1YXJkU2hhcGUiOlsiSW50ZXJmYWNlR3VhcmRTaGFwZSJdLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCI6WyJhc3NlcnRJbnRlcmZhY2VHdWFyZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLFskaM2PX2EgPT4gKG1lbW9SYWNlID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCduYW1lJyx7dmFsdWU6XCJtYWtlUHJvbWlzZUtpdFwifSk7JGjNj19vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCduYW1lJyx7dmFsdWU6XCJyYWNlUHJvbWlzZXNcIn0pOyRozY9fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTtcblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2UgPSBnbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlIHx8IFByb21pc2U7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlUHJvbWlzZUtpdCgpIHtcbiAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0gPSBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuICBjb25zdCBwcm9taXNlID0gbmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSk7XG59XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByYWNlUHJvbWlzZXModmFsdWVzKSB7XG4gIHJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLCB2YWx1ZXMpKTtcbn1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1iEF+ZAIAAGQCAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsJ25hbWUnLHt2YWx1ZTpcImlzUHJvbWlzZVwifSk7JGjNj19vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOy8qXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIGlzUHJvbWlzZShtYXliZVByb21pc2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpID09PSBtYXliZVByb21pc2U7XG59XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2pkZOaUJAAClCQAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpc1ByaW1pdGl2ZSA9IHZhbCA9PlxuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGtub3duUHJvbWlzZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFya1NldHRsZWQgPSByZWNvcmQgPT4ge1xuICBpZiAoIXJlY29yZCB8fCByZWNvcmQuc2V0dGxlZCkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICBjb25zdCB7IGRlZmVycmVkcyB9ID0gcmVjb3JkO1xuICBPYmplY3QuYXNzaWduKHJlY29yZCwge1xuICAgIGRlZmVycmVkczogdW5kZWZpbmVkLFxuICAgIHNldHRsZWQ6IHRydWUsXG4gIH0pO1xuICBPYmplY3QuZnJlZXplKHJlY29yZCk7XG4gIHJldHVybiBkZWZlcnJlZHM7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkID0gdmFsdWUgPT4ge1xuICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8vXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlc29sdmUgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlamVjdCB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IEMgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRlZmVycmVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgeyBzZXR0bGVkLCBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiByZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcykge1xuICAgICAgICBjb25zdCB7IGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWZlcnJlZHMpIHtcbiAgICAgICAgICBkZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjBsiNR8GAAAfBgAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgaW50ZXJuYWxSZXNvbHZlO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbnRlcm5hbFJlamVjdDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlc29sdmUpIHtcbiAgICAgIGludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEnYVh64FAAAuBQAAB0AAABAZW5kby9zdHJlYW0tdjEuMi4xMy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlUGlwZSIsIm1ha2VRdWV1ZSIsIm1ha2VTdHJlYW0iLCJtYXBSZWFkZXIiLCJtYXBXcml0ZXIiLCJwcmltZSIsInB1bXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLG1ha2VQcm9taXNlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vL1xuLy9cbi8vXG5jb25zdCBmcmVlemUgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChPYmplY3QuZnJlZXplKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUXVldWUgPSAoKSA9PiB7XG4gIGxldCB7IHByb21pc2U6IHRhaWxQcm9taXNlLCByZXNvbHZlOiB0YWlsUmVzb2x2ZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgcmV0dXJuIHtcbiAgICBwdXQodmFsdWUpIHtcbiAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcHJvbWlzZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgIHRhaWxSZXNvbHZlKGZyZWV6ZSh7IHZhbHVlLCBwcm9taXNlIH0pKTtcbiAgICAgIHRhaWxSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9LFxuICAgIGdldCgpIHtcbiAgICAgIGNvbnN0IHByb21pc2UgPSB0YWlsUHJvbWlzZS50aGVuKG5leHQgPT4gbmV4dC52YWx1ZSk7XG4gICAgICB0YWlsUHJvbWlzZSA9IHRhaWxQcm9taXNlLnRoZW4obmV4dCA9PiBuZXh0LnByb21pc2UpO1xuICAgICAgcmV0dXJuIGhhcmRlbihwcm9taXNlKTtcbiAgICB9LFxuICB9O1xufTskaM2PX29uY2UubWFrZVF1ZXVlKG1ha2VRdWV1ZSk7XG5oYXJkZW4obWFrZVF1ZXVlKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdHJlYW0gPSAoYWNrcywgZGF0YSkgPT4ge1xuICBjb25zdCBzdHJlYW0gPSBoYXJkZW4oe1xuICAgIC8qXG5cbiAgICAgKi9cbiAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiBmYWxzZSB9KSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIC8qXG5cbiAgICAgKi9cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgLypcblxuICAgICAqL1xuICAgIHRocm93KGVycm9yKSB7XG4gICAgICBkYXRhLnB1dChoYXJkZW4oUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufTskaM2PX29uY2UubWFrZVN0cmVhbShtYWtlU3RyZWFtKTtcbmhhcmRlbihtYWtlU3RyZWFtKTtcblxuLy9cbi8vXG4vL1xuICAgICAgIGNvbnN0IG1ha2VQaXBlID0gKCkgPT4ge1xuICBjb25zdCBkYXRhID0gbWFrZVF1ZXVlKCk7XG4gIGNvbnN0IGFja3MgPSBtYWtlUXVldWUoKTtcbiAgY29uc3QgcmVhZGVyID0gbWFrZVN0cmVhbShhY2tzLCBkYXRhKTtcbiAgY29uc3Qgd3JpdGVyID0gbWFrZVN0cmVhbShkYXRhLCBhY2tzKTtcbiAgcmV0dXJuIGhhcmRlbihbd3JpdGVyLCByZWFkZXJdKTtcbn07JGjNj19vbmNlLm1ha2VQaXBlKG1ha2VQaXBlKTtcbmhhcmRlbihtYWtlUGlwZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHB1bXAgPSBhc3luYyAod3JpdGVyLCByZWFkZXIsIHByaW1lcikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHRpY2sgPSBwcm9taXNlID0+XG4gICAgRS53aGVuKFxuICAgICAgcHJvbWlzZSxcbiAgICAgIHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiB3cml0ZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiB0b2NrKHdyaXRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKC8qICAgICAgICAgICAgICAgICovIGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdG9jayA9IHByb21pc2UgPT5cbiAgICBFLndoZW4oXG4gICAgICBwcm9taXNlLFxuICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGljayhyZWFkZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgvKiAgICAgICAgICAgICAgICAqLyBlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gcmVhZGVyLnRocm93KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgYXdhaXQgdGljayhyZWFkZXIubmV4dChwcmltZXIpKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07JGjNj19vbmNlLnB1bXAocHVtcCk7XG5oYXJkZW4ocHVtcCk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJpbWUgPSAoZ2VuZXJhdG9yLCBwcmltZXIpID0+IHtcbiAgLy9cbiAgY29uc3QgZmlyc3QgPSBnZW5lcmF0b3IubmV4dChwcmltZXIpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCByZXN1bHQ7XG4gIGNvbnN0IHByaW1lZCA9IGhhcmRlbih7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGFzeW5jIG5leHQodmFsdWUpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvL1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdDtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdlbmVyYXRvci5uZXh0KHZhbHVlKTtcbiAgICB9LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgYXN5bmMgcmV0dXJuKHZhbHVlKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZW5lcmF0b3IucmV0dXJuKHZhbHVlKTtcbiAgICB9LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGFzeW5jIHRocm93KGVycm9yKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLnRocm93KGVycm9yKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHByaW1lZDtcbn07JGjNj19vbmNlLnByaW1lKHByaW1lKTtcbmhhcmRlbihwcmltZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFwUmVhZGVyID0gKHJlYWRlciwgdHJhbnNmb3JtKSA9PiB7XG4gIGFzeW5jIGZ1bmN0aW9uKiB0cmFuc2Zvcm1HZW5lcmF0b3IoKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiByZWFkZXIpIHtcbiAgICAgIHlpZWxkIHRyYW5zZm9ybSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaGFyZGVuKHRyYW5zZm9ybUdlbmVyYXRvcik7XG4gIHJldHVybiBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKCkpO1xufTskaM2PX29uY2UubWFwUmVhZGVyKG1hcFJlYWRlcik7XG5oYXJkZW4obWFwUmVhZGVyKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYXBXcml0ZXIgPSAod3JpdGVyLCB0cmFuc2Zvcm0pID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtZWRXcml0ZXIgPSBoYXJkZW4oe1xuICAgIC8qXG5cbiAgICAgKi9cbiAgICBhc3luYyBuZXh0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLm5leHQodHJhbnNmb3JtKHZhbHVlKSk7XG4gICAgfSxcbiAgICAvKlxuXG4gICAgICovXG4gICAgYXN5bmMgdGhyb3coZXJyb3IpIHtcbiAgICAgIHJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuICAgIH0sXG4gICAgLypcblxuICAgICAqL1xuICAgIGFzeW5jIHJldHVybih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHdyaXRlci5yZXR1cm4odmFsdWUpO1xuICAgIH0sXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xufTskaM2PX29uY2UubWFwV3JpdGVyKG1hcFdyaXRlcik7XG5oYXJkZW4obWFwV3JpdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VRdWV1ZSI6WyJtYWtlUXVldWUiXSwibWFrZVN0cmVhbSI6WyJtYWtlU3RyZWFtIl0sIm1ha2VQaXBlIjpbIm1ha2VQaXBlIl0sInB1bXAiOlsicHVtcCJdLCJwcmltZSI6WyJwcmltZSJdLCJtYXBSZWFkZXIiOlsibWFwUmVhZGVyIl0sIm1hcFdyaXRlciI6WyJtYXBXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL21haW4uanN7ImltcG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPZgJeSBAQAAgQEAAB8AAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIkBlbmRvL2ZhciJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAT1r1vaYCAACmAgAALAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3luY0dlbmVyYXRlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3luY0dlbmVyYXRlID0gbmV4dCA9PiB7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiBoYXJkZW4obmV4dCgpKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UuYXN5bmNHZW5lcmF0ZShhc3luY0dlbmVyYXRlKTtcbmhhcmRlbihhc3luY0dlbmVyYXRlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jR2VuZXJhdGUiOlsiYXN5bmNHZW5lcmF0ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD+evn99AEAAPQBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFpbi5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL21ha2Vycy5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtdXSxbXCIuL21ha2Vycy5qc1wiLCBbXV0sW1wiLi9hc3luYy1nZW5lcmF0ZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABJaCFQ5AcAAOQHAAAkAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFrZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlTWFwIiwibWFrZVByb21pc2UiLCJtYWtlU2V0IiwibWFrZVdlYWtNYXAiLCJtYWtlV2Vha1NldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQcm9taXNlID0gZXhlY3V0b3IgPT4gaGFyZGVuKG5ldyBQcm9taXNlKGV4ZWN1dG9yKSk7JGjNj19vbmNlLm1ha2VQcm9taXNlKG1ha2VQcm9taXNlKTtcbmhhcmRlbihtYWtlUHJvbWlzZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBtYWtlTWFwID0gZW50cmllc09ySXRlcmFibGUgPT4gaGFyZGVuKG5ldyBNYXAoZW50cmllc09ySXRlcmFibGUpKTskaM2PX29uY2UubWFrZU1hcChtYWtlTWFwKTtcbmhhcmRlbihtYWtlTWFwKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBtYWtlU2V0ID0gdmFsdWVzID0+IGhhcmRlbihuZXcgU2V0KHZhbHVlcykpOyRozY9fb25jZS5tYWtlU2V0KG1ha2VTZXQpO1xuaGFyZGVuKG1ha2VTZXQpO1xuXG4vKlxuXG5cblxuICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtNYXAgPSBlbnRyaWVzID0+IGhhcmRlbihuZXcgV2Vha01hcChlbnRyaWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrTWFwKG1ha2VXZWFrTWFwKTtcbmhhcmRlbihtYWtlV2Vha01hcCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrU2V0ID0gdmFsdWVzID0+IGhhcmRlbihuZXcgV2Vha1NldCh2YWx1ZXMpKTskaM2PX29uY2UubWFrZVdlYWtTZXQobWFrZVdlYWtTZXQpO1xuaGFyZGVuKG1ha2VXZWFrU2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlIjpbIm1ha2VQcm9taXNlIl0sIm1ha2VNYXAiOlsibWFrZU1hcCJdLCJtYWtlU2V0IjpbIm1ha2VTZXQiXSwibWFrZVdlYWtNYXAiOlsibWFrZVdlYWtNYXAiXSwibWFrZVdlYWtTZXQiOlsibWFrZVdlYWtTZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAafVS/6wDAACsAwAAKQAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4uL3JpbmcwL21haW4uanMiXSwiZXhwb3J0cyI6WyJhc3luY0RvV2hpbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIi4uL3JpbmcwL21haW4uanNcIiwgW1tcIm1ha2VQcm9taXNlXCIsWyRozY9fYSA9PiAobWFrZVByb21pc2UgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3luY0RvV2hpbGUgPSBib2R5ID0+IHtcbiAgcmV0dXJuIG1ha2VQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBsb29wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZG9Db250aW51ZSA9IGF3YWl0IGJvZHkoKTtcbiAgICAgIGlmICghZG9Db250aW51ZSkge1xuICAgICAgICAvL1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBsb29wKCkuY2F0Y2gocmVqZWN0KTtcbiAgICB9O1xuXG4gICAgbG9vcCgpLmNhdGNoKHJlamVjdCk7XG4gIH0pO1xufTskaM2PX29uY2UuYXN5bmNEb1doaWxlKGFzeW5jRG9XaGlsZSk7XG5oYXJkZW4oYXN5bmNEb1doaWxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jRG9XaGlsZSI6WyJhc3luY0RvV2hpbGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAG2g3A5YBAACWAQAAIgAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL21haW4uanN7ImltcG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9hc3luYy10b29scy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAN58DWjEBgEAxAYBABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAADGASPiNAQAAjQEAACAAAAAAAAAAAAAAAKSB9gYBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9oZWFwLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSBwQgBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAACP79nO3goAAN4KAAAkAAAAAAAAAAAAAACkgV4KAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2hlYXAuanNQSwECHgMKAAAAAAAAAAAAFW6x+nkCAAB5AgAAJQAAAAAAAAAAAAAApIF+FQEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAA5fdIMdAIAAHQCAAArAAAAAAAAAAAAAACkgToYAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2lzLXBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAH6dRpylAwAApQMAACQAAAAAAAAAAAAAAKSB9xoBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMva2V5cy5qc1BLAQIeAwoAAAAAAAAAAADOB8+gtAcAALQHAAApAAAAAAAAAAAAAACkgd4eAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL21ha2Utb25jZS5qc1BLAQIeAwoAAAAAAAAAAACVS2X92wkAANsJAAAtAAAAAAAAAAAAAACkgdkmAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3dhdGNoLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAYluOjmsFAABrBQAAIQAAAAAAAAAAAAAApIH/MAEAQGFnb3JpYy9jYWNoZS12MC4zLjIvc3JjL2NhY2hlLmpzUEsBAh4DCgAAAAAAAAAAAKDGVQkRAgAAEQIAACAAAAAAAAAAAAAAAKSBqTYBAEBhZ29yaWMvY2FjaGUtdjAuMy4yL3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAAlFBxpgBAAAYAQAACEAAAAAAAAAAAAAAKSB+DgBAEBhZ29yaWMvY2FjaGUtdjAuMy4yL3NyYy9zdGF0ZS5qc1BLAQIeAwoAAAAAAAAAAADkJ8kTgRoAAIEaAAAhAAAAAAAAAAAAAACkgZc9AQBAYWdvcmljL2NhY2hlLXYwLjMuMi9zcmMvc3RvcmUuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAAAAAAAAAAAApIFXWAEAQGFnb3JpYy9jYWNoZS12MC4zLjIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAENwWSWjHwAAox8AACYAAAAAAAAAAAAAAKSB7lkBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzUEsBAh4DCgAAAAAAAAAAABMaWlIxBAAAMQQAACcAAAAAAAAAAAAAAKSB1XkBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAC4O4ykBwYAAAcGAAAnAAAAAAAAAAAAAACkgUt+AQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAA819NA00CAABNAgAAIQAAAAAAAAAAAAAApIGXhAEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJ1k6WEdGAAAHRgAACUAAAAAAAAAAAAAAKSBI4cBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAADVjSG7wFAAC8BQAAOgAAAAAAAAAAAAAApIGDnwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAChmPGE0AUAANAFAAA6AAAAAAAAAAAAAACkgZelAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAPNq9Tq7BAAAuwQAADYAAAAAAAAAAAAAAKSBv6sBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACB+ofGmAYAAJgGAAA2AAAAAAAAAAAAAACkgc6wAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAoi6VfZoDAACaAwAAIwAAAAAAAAAAAAAApIG6twEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAAslt9GjAlAAAwJQAAKQAAAAAAAAAAAAAApIGVuwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAQAGa0MQUAADEFAAAIQAAAAAAAAAAAAAApIEM4QEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAE2UxkMyBgAAMgYAAC0AAAAAAAAAAAAAAKSBD/YBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAB3sZwJdhoAAHYaAAAmAAAAAAAAAAAAAACkgYz8AQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAAAAAAAAAAACkgUYXAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAAXI7IKJodAACaHQAAJwAAAAAAAAAAAAAApIHjGAIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzUEsBAh4DCgAAAAAAAAAAALc+QRg0AwAANAMAACgAAAAAAAAAAAAAAKSBwjYCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jbGktdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAaL6/waUGAAClBgAAJQAAAAAAAAAAAAAApIE8OgIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAADUxvuhKgYAACoGAAAkAAAAAAAAAAAAAACkgSRBAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZGVidWcuanNQSwECHgMKAAAAAAAAAAAA+tsENbECAACxAgAAJQAAAAAAAAAAAAAApIGQRwIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2Vycm9ycy5qc1BLAQIeAwoAAAAAAAAAAACtGcd5wwQAAMMEAAAkAAAAAAAAAAAAAACkgYRKAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA/JITIaUUAAClFAAAJwAAAAAAAAAAAAAApIGJTwIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2pzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAEDGXN3DFwAAwxcAAC8AAAAAAAAAAAAAAKSBc2QCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAAOqC9qdaDwAAWg8AADkAAAAAAAAAAAAAAKSBg3wCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL2JvYXJkLWNsaWVudC11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAATDYISOwMAADsDAAAvAAAAAAAAAAAAAACkgTSMAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9jYXAtZGF0YS5qc1BLAQIeAwoAAAAAAAAAAADCZS/ncQMAAHEDAAA3AAAAAAAAAAAAAACkgbyPAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9pbmFjY2Vzc2libGUtdmFsLmpzUEsBAh4DCgAAAAAAAAAAAKPs432GAwAAhgMAADAAAAAAAAAAAAAAAKSBgpMCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL3B1cmUtZGF0YS5qc1BLAQIeAwoAAAAAAAAAAABueDuMbQYAAG0GAAArAAAAAAAAAAAAAACkgVaXAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAALJ9qtDJNgAAyTYAACYAAAAAAAAAAAAAAKSBDJ4CAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRyaWNzLmpzUEsBAh4DCgAAAAAAAAAAAFJCCm6eBwAAngcAACsAAAAAAAAAAAAAAKSBGdUCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9uYXR1cmFsLXNvcnQuanNQSwECHgMKAAAAAAAAAAAAVku15NYzAADWMwAAKAAAAAAAAAAAAAAApIEA3QIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Nlcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAABU+rEhhy4AAIcuAAAxAAAAAAAAAAAAAACkgRwRAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAKMaFLHCBgAAwgYAACwAAAAAAAAAAAAAAKSB8j8DAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90ZXN0aW5nLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAACAjyqQXAwAAFwMAACUAAAAAAAAAAAAAAKSB/kYDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90bXBEaXIuanNQSwECHgMKAAAAAAAAAAAAsrKL9RsDAAAbAwAAKAAAAAAAAAAAAAAApIFYSgMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVDaGVjay5qc1BLAQIeAwoAAAAAAAAAAADAaiEcRwQAAEcEAAApAAAAAAAAAAAAAACkgblNAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAAAAAAAAAAACkgUdSAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAAkna9+2kHAABpBwAAKgAAAAAAAAAAAAAApIHnUwMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzUEsBAh4DCgAAAAAAAAAAANCWSi3vCAAA7wgAADMAAAAAAAAAAAAAAKSBmFsDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAADCPu246wcAAOsHAAAkAAAAAAAAAAAAAACkgdhkAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAIb7LBCYTAAAmEwAAJwAAAAAAAAAAAAAApIEFbQMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAHXRxKjgMgAA4DIAACoAAAAAAAAAAAAAAKSBcIADAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAAPVg4BmQgAAJkIAAAuAAAAAAAAAAAAAACkgZizAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAFQjIv/RFwAA0RcAACcAAAAAAAAAAAAAAKSBfbwDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc1BLAQIeAwoAAAAAAAAAAAA5aH3YUhYAAFIWAAAoAAAAAAAAAAAAAACkgZPUAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzUEsBAh4DCgAAAAAAAAAAACOZfrg5CAAAOQgAACkAAAAAAAAAAAAAAKSBK+sDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzUEsBAh4DCgAAAAAAAAAAAFs7BeJMBAAATAQAACQAAAAAAAAAAAAAAKSBq/MDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAAAAAAAAAAACkgTn4AwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAAo5ImDRQHAAAUBwAALQAAAAAAAAAAAAAApIHZ+QMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAABZZvz/bIQAA2yEAADMAAAAAAAAAAAAAAKSBOAEEAEBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuMy9zcmMvbWFyc2hhbC1jb250ZXh0cy5qc1BLAQIeAwoAAAAAAAAAAABsNKYb5g0AAOYNAAAhAAAAAAAAAAAAAACkgWQjBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAwzOG9PoFAAD6BQAALAAAAAAAAAAAAAAApIGJMQQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanNQSwECHgMKAAAAAAAAAAAAAxezG6IFAACiBQAAMAAAAAAAAAAAAAAApIHNNwQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzUEsBAh4DCgAAAAAAAAAAAIamjGIBEwAAARMAADEAAAAAAAAAAAAAAKSBvT0EAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAAukA6nA0NAAANDQAAMQAAAAAAAAAAAAAApIENUQQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABZuWC6xA8AAMQPAAA1AAAAAAAAAAAAAACkgWleBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABA7FDWywsAAMsLAAA1AAAAAAAAAAAAAACkgYBuBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABFxkU9ohAAAKIQAAAuAAAAAAAAAAAAAACkgZ56BABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAAAAAAAAAAAAAKSBjIsEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABnrlJ1phkAAKYZAAAoAAAAAAAAAAAAAACkgSONBABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAAAAAAAAAAAAAKSBD6cEAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAvYSCWLhgAAC4YAAAwAAAAAAAAAAAAAACkgQewBABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAAJFJo4wMVAAADFQAAHwAAAAAAAAAAAAAApIGDyAQAQGFnb3JpYy92YXRzLXYwLjE1LjEvc3JjL2NyYy5qc1BLAQIeAwoAAAAAAAAAAAAN2UsH+SUAAPklAAAlAAAAAAAAAAAAAACkgcPdBABAYWdvcmljL3ZhdHMtdjAuMTUuMS9zcmMvbGliLWJvYXJkLmpzUEsBAh4DCgAAAAAAAAAAAK55F1L9DwAA/Q8AAC0AAAAAAAAAAAAAAKSB/wMFAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMy9zcmMvYWN0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAAC/H/vS+AIAAPgCAAA1AAAAAAAAAAAAAACkgUcUBQBAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2JpZ2ludFN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAACMcOqV/gkAAP4JAAAuAAAAAAAAAAAAAACkgZIXBQBAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2RhdGUtbm93LmpzUEsBAh4DCgAAAAAAAAAAAB28S7XAFAAAwBQAADoAAAAAAAAAAAAAAKSB3CEFAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMy9zcmMvZmluZE9yTWFrZUludml0YXRpb24uanNQSwECHgMKAAAAAAAAAAAAZfEXD1kCAABZAgAANAAAAAAAAAAAAAAApIH0NgUAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9pbnRlcm5hbC10eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADOkBDh6gkAAOoJAAAxAAAAAAAAAAAAAACkgZ85BQBAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2lzc3VlclRhYmxlLmpzUEsBAh4DCgAAAAAAAAAAACfezqkYJQAAGCUAADMAAAAAAAAAAAAAAKSB2EMFAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTQuMy9zcmMvbGliLWRlaHlkcmF0ZS5qc1BLAQIeAwoAAAAAAAAAAABQD5vAvMsAALzLAAAwAAAAAAAAAAAAAACkgUFpBQBAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE0LjMvc3JjL2xpYi13YWxsZXQuanNQSwECHgMKAAAAAAAAAAAAPTkpxx0DAAAdAwAALAAAAAAAAAAAAAAApIFLNQYAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy9wdWJzdWIuanNQSwECHgMKAAAAAAAAAAAAVaSXv7xJAAC8SQAALAAAAAAAAAAAAAAApIGyOAYAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNC4zL3NyYy93YWxsZXQuanNQSwECHgMKAAAAAAAAAAAAIq4mcX0bAAB9GwAAMwAAAAAAAAAAAAAApIG4ggYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzUEsBAh4DCgAAAAAAAAAAANn0k7SWAQAAlgEAAB4AAAAAAAAAAAAAAKSBhp4GAEBhZ29yaWMvem9uZS12MC4yLjIvZHVyYWJsZS5qc1BLAQIeAwoAAAAAAAAAAACXW4qdnBEAAJwRAAAiAAAAAAAAAAAAAACkgVigBgBAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9kdXJhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAOjHgXswBQAAMAUAACwAAAAAAAAAAAAAAKSBNLIGAEBlbmRvL2NvbW1vbi12MS4yLjEzL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzUEsBAh4DCgAAAAAAAAAAAFnIhH+lBAAApQQAACsAAAAAAAAAAAAAAKSBrrcGAEBlbmRvL2NvbW1vbi12MS4yLjEzL2Zyb20tdW5pcXVlLWVudHJpZXMuanNQSwECHgMKAAAAAAAAAAAA1E3/N0oCAABKAgAAJQAAAAAAAAAAAAAApIGcvAYAQGVuZG8vY29tbW9uLXYxLjIuMTMvaWRlbnQtY2hlY2tlci5qc1BLAQIeAwoAAAAAAAAAAACK15dDkAIAAJACAAAnAAAAAAAAAAAAAACkgSm/BgBAZW5kby9jb21tb24tdjEuMi4xMy9saXN0LWRpZmZlcmVuY2UuanNQSwECHgMKAAAAAAAAAAAALpSaDrQDAAC0AwAAKwAAAAAAAAAAAAAApIH+wQYAQGVuZG8vY29tbW9uLXYxLjIuMTMvbWFrZS1hcnJheS1pdGVyYXRvci5qc1BLAQIeAwoAAAAAAAAAAAAFq82oXAIAAFwCAAAlAAAAAAAAAAAAAACkgfvFBgBAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAH9VFLM0AwAANAMAACIAAAAAAAAAAAAAAKSBmsgGAEBlbmRvL2NvbW1vbi12MS4yLjEzL29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAAf1YvUjIEAAAyBAAAJwAAAAAAAAAAAAAApIEOzAYAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1ldGEtbWFwLmpzUEsBAh4DCgAAAAAAAAAAAPKqY7MeBAAAHgQAACUAAAAAAAAAAAAAAKSBhdAGAEBlbmRvL2NvbW1vbi12MS4yLjEzL3Rocm93LWxhYmVsZWQuanNQSwECHgMKAAAAAAAAAAAANKKhqaIBAACiAQAAIgAAAAAAAAAAAAAApIHm1AYAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAXGNzxVBAAAFQQAAAsAAAAAAAAAAAAAACkgcjWBgBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAABJNfbpVAgAAFQIAAAdAAAAAAAAAAAAAACkgWbnBgBAZW5kby9lcnJvcnMtdjEuMi4xMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACYMEpwihYAAIoWAAAjAAAAAAAAAAAAAACkgfXvBgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAAAAAAAAAAACkgcAGBwBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAABkQDXr0g4AANIOAAAnAAAAAAAAAAAAAACkgV8IBwBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbG9jYWwuanNQSwECHgMKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAAAAAAAAAAAApIF2FwcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNQSwECHgMKAAAAAAAAAAAAuHaUnV8DAABfAwAAKQAAAAAAAAAAAAAApIEFJwcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAAyOwHRckKAADJCgAALQAAAAAAAAAAAAAApIGrKgcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAAAAAAAAAAAAAKSBvzUHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANxF2aNgAgAAYAIAABoAAAAAAAAAAAAAAKSBZDgHAEBlbmRvL2V4by12MS41LjEyL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAOAg28LPFwAAzxcAACMAAAAAAAAAAAAAAKSB/DoHAEBlbmRvL2V4by12MS41LjEyL3NyYy9leG8tbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAAEKNQetaNwAAWjcAACIAAAAAAAAAAAAAAKSBDFMHAEBlbmRvL2V4by12MS41LjEyL3NyYy9leG8tdG9vbHMuanNQSwECHgMKAAAAAAAAAAAANi0Zmk8CAABPAgAAJgAAAAAAAAAAAAAApIGmigcAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2dldC1pbnRlcmZhY2UuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAHgAAAAAAAAAAAAAApIE5jQcAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACAAAAAAAAAAAAAAAKSBzY4HAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAKkm1lCYAgAAmAIAAB4AAAAAAAAAAAAAAKSBY5AHAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAB1Rn/ZBwgAAAcIAAAdAAAAAAAAAAAAAACkgTeTBwBAZW5kby9tYXJzaGFsLXYxLjguMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAD9Xe1wtlAAALZQAAAqAAAAAAAAAAAAAACkgXmbBwBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAANIgyZQUsAAAFLAAAKwAAAAAAAAAAAAAApIF37AcAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAAB+HvruWiwAAFosAAAtAAAAAAAAAAAAAACkgcUYCABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAAsjZHBfoyAAD6MgAAKgAAAAAAAAAAAAAApIFqRQgAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAAL4ipxtKBwAASgcAAC0AAAAAAAAAAAAAAKSBrHgIAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAAAKW6nyDS8AAA0vAAAjAAAAAAAAAAAAAACkgUGACABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAADO2KYz+joAAPo6AAAlAAAAAAAAAAAAAACkgY+vCABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAAAAAAAAAAAAAKSBzOoIAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABenLPKzAUAAMwFAAAdAAAAAAAAAAAAAACkgWPsCABAZW5kby9uYXQtdjUuMS4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABubt5zNgsAADYLAAAgAAAAAAAAAAAAAACkgWryCABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABCkKsYxggAAMYIAAAoAAAAAAAAAAAAAACkgd79CABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvYnl0ZUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAAMPv9kW8BgAAvAYAACgAAAAAAAAAAAAAAKSB6gYJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAA1qhpnx8JAAAfCQAAKQAAAAAAAAAAAAAApIHsDQkAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAAc0VJVY0MAACNDAAALgAAAAAAAAAAAAAApIFSFwkAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1BLAQIeAwoAAAAAAAAAAAAXVwIi0xQAANMUAAAkAAAAAAAAAAAAAACkgSskCQBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAA06KQfKQGAACkBgAAKwAAAAAAAAAAAAAApIFAOQkAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABieHiJ2RIAANkSAAAnAAAAAAAAAAAAAACkgS1ACQBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAATcGI09wEAADcBAAAKQAAAAAAAAAAAAAApIFLUwkAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAAavAfQJMXAACTFwAAMAAAAAAAAAAAAAAApIFuWAkAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAIdLSJIoLAAAKCwAACoAAAAAAAAAAAAAAKSBT3AJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAABzh1xwdB8AAHQfAAAoAAAAAAAAAAAAAACkgb+cCQBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAPRBiBEeDgAAHg4AACsAAAAAAAAAAAAAAKSBebwJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAuj7NoXkIAAB5CAAAJQAAAAAAAAAAAAAApIHgygkAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N0cmluZy5qc1BLAQIeAwoAAAAAAAAAAACzChAs3AsAANwLAAAlAAAAAAAAAAAAAACkgZzTCQBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3ltYm9sLmpzUEsBAh4DCgAAAAAAAAAAAPLl8lDJBwAAyQcAACUAAAAAAAAAAAAAAKSBu98JAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAUcLOra4QAACuEAAAKQAAAAAAAAAAAAAApIHH5wkAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJAAAAAAAAAAAAAAApIG8+AkAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAHVNktzvDgAA7w4AAB4AAAAAAAAAAAAAAKSBVvoJAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAC6MjCBJDQAACQ0AAAqAAAAAAAAAAAAAACkgYEJCgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY2hlY2tLZXkuanNQSwECHgMKAAAAAAAAAAAANUXSS78ZAAC/GQAALQAAAAAAAAAAAAAApIHtPQoAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzUEsBAh4DCgAAAAAAAAAAAFzRtojrDgAA6w4AACkAAAAAAAAAAAAAAKSB91cKAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb3B5QmFnLmpzUEsBAh4DCgAAAAAAAAAAAAccnft7DAAAewwAACkAAAAAAAAAAAAAAKSBKWcKAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb3B5U2V0LmpzUEsBAh4DCgAAAAAAAAAAAA/IH2N2FgAAdhYAADkAAAAAAAAAAAAAAKSB63MKAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAADSAmIBkRwAAJEcAAA1AAAAAAAAAAAAAACkgbiKCgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAAD5UY4TSSMAAEkjAAA1AAAAAAAAAAAAAACkgZynCgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAADCjhi/LhsAAC4bAAA2AAAAAAAAAAAAAACkgTjLCgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanNQSwECHgMKAAAAAAAAAAAAJZ59zWDxAABg8QAANQAAAAAAAAAAAAAApIG65goAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIgAAAAAAAAAAAAAApIFt2AsAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAAAAAAAAAAACkgQXaCwBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHWIQX5kAgAAZAIAACsAAAAAAAAAAAAAAKSBp+ALAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAA2pkZOaUJAAClCQAAKgAAAAAAAAAAAAAApIFU4wsAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAIwbIjUfBgAAHwYAADUAAAAAAAAAAAAAAKSBQe0LAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAAAAAAAAAAAAAKSBs/MLAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAEnYVh64FAAAuBQAAB0AAAAAAAAAAAAAAKSBT/ULAEBlbmRvL3N0cmVhbS12MS4yLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAO5b9r/RAQAA0QEAABwAAAAAAAAAAAAAAKSBQgoMAGplc3NpZS5qcy12MC4zLjQvc3JjL21haW4uanNQSwECHgMKAAAAAAAAAAAA9mAl5IEBAACBAQAAHwAAAAAAAAAAAAAApIFNDAwAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvRS5qc1BLAQIeAwoAAAAAAAAAAABPWvW9pgIAAKYCAAAsAAAAAAAAAAAAAACkgQsODABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc1BLAQIeAwoAAAAAAAAAAAD+evn99AEAAPQBAAAiAAAAAAAAAAAAAACkgfsQDABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAEloIVDkBwAA5AcAACQAAAAAAAAAAAAAAKSBLxMMAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAABp9VL/rAMAAKwDAAApAAAAAAAAAAAAAACkgVUbDABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9hc3luYy10b29scy5qc1BLAQIeAwoAAAAAAAAAAAAbaDcDlgEAAJYBAAAiAAAAAAAAAAAAAACkgUgfDABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9tYWluLmpzUEsFBgAAAACpAKkARTkAAB4hDAAAAA==","endoZipBase64Sha512":"31df8dbc849e7f8c8e3059a87ef9a6232826f85341bb45cec928fcb85d50f9a5f5da6e1bf2b0444534107e8358fb3c7f933d18fc4a94bdbdc0908fb3fd46cb65"};
|