@agoric/builders 0.3.0-u23.0 → 0.3.0-u23.1
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/CHANGELOG.md +4 -0
- package/package.json +17 -17
- package/scripts/bundles/bundle-binaryVoteCounter-js-meta.json +0 -790
- package/scripts/bundles/bundle-binaryVoteCounter.js +0 -1
- package/scripts/bundles/bundle-committee-js-meta.json +0 -810
- package/scripts/bundles/bundle-committee.js +0 -1
- package/scripts/bundles/bundle-contractGovernor-js-meta.json +0 -805
- package/scripts/bundles/bundle-contractGovernor.js +0 -1
- package/scripts/bundles/bundle-econCommitteeCharter-js-meta.json +0 -765
- package/scripts/bundles/bundle-econCommitteeCharter.js +0 -1
- package/scripts/bundles/bundle-feeDistributor-js-meta.json +0 -770
- package/scripts/bundles/bundle-feeDistributor.js +0 -1
- package/scripts/bundles/bundle-fluxAggregatorKit-js-meta.json +0 -960
- package/scripts/bundles/bundle-fluxAggregatorKit.js +0 -1
- package/scripts/bundles/bundle-mintHolder-js-meta.json +0 -740
- package/scripts/bundles/bundle-mintHolder.js +0 -1
- package/scripts/bundles/bundle-priceAggregator-js-meta.json +0 -990
- package/scripts/bundles/bundle-priceAggregator.js +0 -1
- package/scripts/bundles/bundle-provisionPool-js-meta.json +0 -915
- package/scripts/bundles/bundle-provisionPool.js +0 -1
- package/scripts/bundles/bundle-psm-js-meta.json +0 -980
- package/scripts/bundles/bundle-psm.js +0 -1
- package/scripts/bundles/bundle-reserve-js-meta.json +0 -975
- package/scripts/bundles/bundle-reserve.js +0 -1
- package/scripts/bundles/bundle-scaledPriceAuthority-js-meta.json +0 -880
- package/scripts/bundles/bundle-scaledPriceAuthority.js +0 -1
- package/scripts/bundles/bundle-vaultFactory-js-meta.json +0 -1045
- package/scripts/bundles/bundle-vaultFactory.js +0 -1
- package/scripts/bundles/bundle-walletFactory-js-meta.json +0 -990
- package/scripts/bundles/bundle-walletFactory.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAABCl+KrBuwAAAbsAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgIm1vZHVsZSI6ICIuL3NyYy9iaW5hcnlWb3RlQ291bnRlci5qcyIKICB9LAogICJjb21wYXJ0bWVudHMiOiB7CiAgICAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2Jhc2Utem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMyZmM5NmFlMmZlMDg2NmU2N2Q3YTI4NmI1MjM0MzE5NThlZGRhNjZlNjAwYjJiYzRjNDVjZmMxZDJjNjIxZjY0NDAzZmEwMmFiNTVhZjY3NzA4N2YyMjYwZDJiNGU2ZDY1ZDM2NmY5ODc4YWRlNTk2N2U5ZTA5YTVmNjYyOGRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTJmNmE4Njg2NGNiNTE3ZjllZTVlMGU5NzM1ZTNkYjE4YzcyYWI1MTI1ODQ4ZmI4ZmI1ZmJiMjc0NmQyYWEyNDUyM2FkZGEyOTI0Y2FjZTE1ZTc2ZWIzMTI5ZjIwNzU2MWVhYTRiOGY4MWIwOGE4Mjk5MWY1YzkzMWMwOTQyOTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDViYTc5MTUzZGI4ODNkZWEwODA4YTkwNjM2ZDcxNmRmMDM0YTcwNmI3Zjg1ZGFkMzc3NzMyODUwOWFjNmZkZjllOTU0YWNmOTk5OTkzMDk1NzRmMTNjM2Y3YWNjOTYxMDM5Yjk0NDliODM1ODQzZGQ5ZDk5NDU1M2FkNzcwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODc4MTgzN2U0YWE1ZTEyZjJiZmU5MmFjMjJmY2Q3ZmNiY2JjYmE0OTRjMmMzMGM1MjU1NjI5Yzc4MzYwNDMwMWZkY2Y3YWFhN2UyYWU5YTY1YWE5ODEyZjljYzRlZGQyNDQ5NGIzYmY0MmYwNTU2N2JjZmM3MzljYmUxZTZhMzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0MWNkNjFlNDM5YTRhNzM3MWRlM2UzZTFmYzNmMWEyYmY0MzhhZDkwMWFjMmNiZDRjMWNlMGJiZTJmMWI0MmUyZWQ0N2ViMGYxYjU4ZDI1ZTMyNjFmZTVkYTY5YTY2MjY2MDkwYzA5MThmN2M0MTljMGYwNDY4ZjI1ZGQwNGMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2Utb25jZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1vbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2ZlMjE0MzJiYWJmOWEzODUyM2JmY2MyNzNkOWE0YWE3NTM1MjQzMmQ5MGYzN2U4YjJhNjRhYmUzZTBiZjA4YmI4M2RkYzI5NGQ2Yzk1NjcwMzE4ZDU1NDA1M2VhNDhlNjQ3ZTk2OWVhOGMzMDFlNjQyNDM3N2RkMjM0OTM1N2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd2F0Y2gtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd2F0Y2gtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE0ZDg5OGU4NTdlZTlkOGY2NzBlNzJkYzkwYzg2ZGFhNmE0ZDk1YjAwMWMyMTA3OWY3ZTA0NjkwNjA0Y2I5YmY2OWU2YjI3YzE0ZGY3YzZkNDgyOGU3YTE4NDhiZDkzYzIwNWM2MjY4YmM1ZDdkM2I3MjZjZDhmMmQ4MzgwNmQ4IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50TWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50TWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyMWY4Y2E1YTJkYmQ0YWU1NmVhMDk3MTNiMzdkOWE1MTUzNjcyZjg4ZDFiMWFiOTkxNGNhMmI5OTI4YTQ0N2NhZDZhMmNkZTQ5MjUxMmFiNWU4YjAxY2Y4NGE5MDk3Zjc1N2E2ZjVmYmNiNTViNTM2ODBkNTk1ZmEwZmM5NmU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVmNTk5NTE5MzNjNTYyZGVkZGIzOTU0ODllNTc5OTI2M2U2MDA1NGI0YTc2YTViODY5YzY0NTIxODhhMDQ5ZmExMzg4N2JmYTgzNjgyNjY5YzM0MmM0YWJmNzIxYjZjOGQ0ZjdmYzBmZjE1Y2Y3MTg3OGE5NmNkMmQ5NzQ0ZThiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Rpc3BsYXlJbmZvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kaXNwbGF5SW5mby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4YzU2MWUyOTQ2YTI3MmE2OWEzYWYwNjNmMjU5NTMyODA4MDJjN2I0MTQwZGI2YzNmMTlmOGYyZWUzM2E5YzI1ZGMwODFiYTAzZTkyMDNhMTgwOWQ3NmFlYjczNjMxM2Q3YzNmYTE4YmRjODFkMGEyZWUwZDVjZmRkYjI5NGNlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZhZTQ2MWUwNmFhNzk0MTBlYWE3MGUxNjVjMzU0MTY3ZWRhZTc1MzRiZTkyNzBhYzQ1NmZkNzkyNzBiZjdkOGNiMjA2MTQwMTJjNTI4MzM1MmM4MjQyZGExN2VjNWFhNzdmZTAyZWRkNzdmOWY5YjE1OTE5NTE5ZGFjZmQ0OWE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWQ2ODllMWZlZjRiOTUzMGYzMmI5YjkxMWMxNWVmYzE2NTZmNDRhYTBkNDViMTJhMWQyNGQ4MDllNzAzYTNjZTQxYTAyNWI2M2I4OWYzYjdmNGU5Y2FmNzVkMzhhN2VjNjNmZDU5ODUzMGJkZTUxYzZmNjRjNTZjNWJjNTcxMDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYjVkZDU2NTFmOTQyZWZmYTBhNmZjOTZiNGQ3NDM3Mzg1OGMwMGMzM2RjMTZjZTUzMzM0ZDMyMDZkM2U5OTE1ZTM1MmMwZjZkN2E0OGU5YTc2NDdjYThlMDc4MDczYTVkN2RmYzVmMzY1OTgyOGIxYjQwMTVjMmVlMzg2YjViYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNkZWVmOWIwMDU3OWYxYWE2YmM2YmI5MGE2YTNlNjI5ZWY3OWE3ZGI4MDVjYzUxMmFkOWQ1YWViMDU2MDc4YmNlMGU0NWNlZGVhMjFhYjBiZTc4YjBlNjBjMDFiZjUxMDNkNGY5YjExMTA2Yjc1ZWRmZDE4MWUzMjI4ZWFjMTc0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MjQ3NjQzM2E1NDdiN2Q2OWMxOWFiMGQwMTIwODU4MWQ4OGZkYjVkYTI2MTk5MDFlNjEzYjE1N2JiMjQwNWY5ZmVlOWRlYWY5MWI3YWNkYjE4NmQ0MjY4MTc0MzU3MzQ2MGUwZWM2NGJjMTQ5ZjcyNGNkNzNlNDZlOGUwY2I3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY2ODdmZDM5MWYzNTc4NTE3YThhYWEzMjJiYzU4NDRiNjBlNWFkOWNlMTMxMTFiZjA2OWJhZWExNjAxZjg4ODY5Y2Y3OTJkOGI3MGUzZmUxNjVlZGUxMWE3OWVlNWU0NDZkYTZiOWRjMWIxYzRhMjA1NThjNGU3ZWE1NGU1NDM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjMxMjA5ZGUzODZlYmUzM2Y0ZTA2YThjOGIxYjlmMjNmMGU0ZWY4NTA4ZjRkYWUyNGYwOWZiMTkxMTYwNjM4NDU2Yzg1YjRhNTllZTcyM2FmODcyMmM3OWVmOWRjNjJmOTU4ZDdlODUzYjA1OGM2YjY0NDQxY2JmZmFmMjY0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50TGVkZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50TGVkZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmE1YjEyNDFjYTA1NDU2MDBiZTc0YTAyMDFmOTg3MzIyNjY1ZjM1ZTA2ZjdiYWRkYzIyMGNkY2E0Nzk0M2M2YzBmY2VjMWE2MjlhZDE2OWM2MjU0YTE4MWNhNzI2YzMwMGE4OWEwNWU0Yzg2MDcwZmZmMGVkZTdkNzYzYmE2NzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVyc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1cnNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2VmNTc4Nzk0MTVkNzhiODgzMzYwZmU5MWJkYjc0NTExYTI3MzQxYjQ4YzM5ZmZiZjk2MWIxZTc4Njc5NDJlNDVjYTU4OTE5NDQ1YjU4YjA3MGNmNGVhN2VjMzNlYTAzNDVjYTBlZTkxNTE0MmMyODhjOTA2MWM0M2Y0MjE1NjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjBmNjRhZDNkZDY4YjNhZDRhYWY3MWJlYjkwNWFhNzE5NjM2MGM3NDU5NWI2ZGY0YjY0ZTk3ZjFhODkxODc5M2JkYjYyOGVmMzc2YWVlZGEyOTFlYjEyODA4ODhiODI3OGI0MDFjNmFlMTg2YmMwZWQ2NTc5MmYyNmNiNDM2NTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0MDQ3ZjU4MzI0NzAxYTliMjIyYzc5ODhiODc0NzAwNGIxN2U4YzI2NWE2N2ZlYzU0MGFhZjU1OGYxMDUzMTQ0OTFhMzMzMzQzOTg3ZjU5NDYwMzM1ODBiNTIwMWUyZGNhMDY3NWJmNTc5YjA3MDM4YmZmZmI3MmFmZjY3MDJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9tYWtlSGFuZGxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWtlSGFuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy90eXBlR3VhcmRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYmluYXJ5Vm90ZUNvdW50ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2JpbmFyeVZvdGVDb3VudGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzExMjQxZWU2MzUyYTEwMGZhODQ1ZDI3MjdlYzk4ODhmNzk4NDVmZDYxMDJjMmIwZTAxNDEyNGFlMjg4YjJjZmNjNjhhZWQ5ODYzNjg1ODRmZWJkMDdiMDc3ZTVlODNlZWE0ZWIxZDY4MzdmN2YzMjBiMGYzYmRmNjQ2MjYzZWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2xvc2luZ1J1bGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Nsb3NpbmdSdWxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDNjNzU1MDVlY2JjZjhiM2EyMWEyMGJlNGNlZDE3MmMxOTQ5NmY5NjAwNzZmMTJhOTFjZWQyNzk4NjI1YTEwZGJhYTYwYTQyMGY4MTkwZjBkZDBlMDk3MGNlZjY2MzcyZjdlNjA2ZTJlZmEyZGEwZTRiNTNjMTgzNWY0ODUwYTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcXVlc3Rpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3F1ZXN0aW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmRkMGExOGM4MGNmNjUxNjc2ODdhOWQzZjU1ZDU4YTlmZGU2MDNlZDIyMDIzMTY1MDMzYTkxMzY3NmMxMTJhMGEyN2M5NzU4ODEyY2Y0ZmIwMWNkMzNkMzNjYzc5MmZiNTA2Mjc4YmQwNWY3NTgwMDhmYTZjYzhjYmRkMmU1YjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcXVvcnVtQ291bnRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcXVvcnVtQ291bnRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkYzc4ZjBkNzBkMzgxMTgyMTQ4MzAxYjI4MTQ1MzYyZWQ3YzU2OTUyNTQ0ODQ2MGEwNGZmYjRlYTk3MWUzMWFhNmRlMDk3ZDk1YThiZmZkZmRlYTA1ZjJmZGRjMmVlNjRkOTc5ZTliMGYzMmZjMzY0NDQzYzM3ZTQzYjFjOTU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYTNjODhiNjUxNzE1N2ExNGE3YTQ3YzJmYWYwM2U3YmUxZTJlZGE4M2EwZWNmMjI0OTM1ZWIzNjFmNDc2NWU0MTVkYmQ4Njg1NTg2NmNlZGNkMzZmYTA0NjI5MzA5MmM2MTBjZDg0ZDgzMDc1OTk4NDYzOWM4ZTI2ZTc3ZThjYiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2hlYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NhbGxiYWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jYWxsYmFjay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIwZWQyNmQzODZjNGU2NmNiNmUzYjkwNzE1Yzk3YWU2ZDBkYTZlYzMzMmYzNjg0ODllNjM1MGI2OTM3N2MwYmRhNjBlMDEwYzY0MWMxZGY3OGJiZjFmYWU4ZGJjMWUzOTJkYTczMmZiYTNjM2E3YjM2ZjhiNWQ2MTI2M2NlNzEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NsaS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2xpLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjMyMjgxZGZiMmM4NDE0ZjUxNjg4YTNkZmQ5NjFjNjI3ZTg5N2M5ZDdlZjA0NWNjNmQzY2U0NTcxMGJkMDcxY2I4ZTU2ZWQ1Y2Q5YzAzY2I4MDc3NjQ5ZTk1Mzc0OTllYmM4OWRkZjU2N2YxNjQ0NTRlYzZlZjRlMWZmMDMwNWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uZmlnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25maWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMGIxMGI3YTVhZjI0MWFhMGFlMmQ2Y2M5MWIwY2EwZmQxZDJiZTVmM2ViNmY0YmNjYTQ2OTZmYjk0OWVhMDBlMDM5Y2MzMDAwMTNhNjQ1NWRjZDU4NTJhMTE3MGY1MmYzODIwNzYxN2RiYjEzMmY3NDM4ODQwZjk3ZjhmNWUxZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVidWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MmRmMzQ4MTliZWI4ZmY3MjJjNzhhZjFiNzkxZWY4MDkxZTU4MzA4OWFhYjc0NmFmNDlmZWRhODA0ZDhkYzZlMmVlMjBkNThjMjZhZjI2MjY3MTRjZGMyZWM1MzEwYTY0MTA4N2M2Mjg1MjkwOWI1M2FlNDliMTBjZDE0ZjU1OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0MjI0YjU5ZjhkNjVlN2FkMjMzNTMwMzY4NGIxYTgxZjUzMGFkNzUzOGI1MTNkM2IwNGExNWY4ZGRmZGQzNjFhOTc3YTU3ZGU4YjI3MTY5ZTJlNzI0OTk1Nzk2ODdjMjgyZDUzYTMxZTdhM2U4NTUzYTM2ZDFkZDUwZDJhNGM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQyYWQ0N2M2NjMyNWE2YzUwMDI5ODAxMTI4OWYyMzIxNzI1YzZmNjZjNGZlZmU3OWM2ODZmODVmN2NiNjU2MzJjMjUyNDQ1YTQyMWRjNTljYWY1MjcyNGFkMmIxNzQ5NTFjY2QxZWVjYzc3MGUzZTZiYWM2OWZmMTlmNDJlMTUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2pzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVjYTI1NDAwY2U3MmNhODEwOTA0OWMzOGNkOTc0YTgyODI0MDAxODc5MDc3ODI2ZGFkZDJkZGM2ZWEzNGU2YTA1ZDY3ODc4ZWZlYWI0ZmRjYjQ3NjYyODc1NmY0YjI5OGRlZDgwYjhhNDk4M2Q1NjUyMDhhYzg0MDU2NTVmNDkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleU1pcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5TWlycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzcyY2RlZjgyMzA0Y2E0ZWE2NDA2ZmYzNGJhMWU3M2ZhNzQ3MjcwMDlmYmIwZDA3ZjAzMGQxZDZlYzdkYzM3MjY4NTcwYjE1NzdiYmU1Y2NkYjhiOGQ3ODBjNzY2YzJhNWIwZWJkNjc4OTM4ZjA1MmYzMzU2ZDZhMTdkMTdlYTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFmMjIwYTFjOWQ4YmI5MDI5NDZkMjk0ZDNiYzc4ZjFjYWZlYTZlNzdmNzljYzA2NzAzNzkzODFlMTg5NmI0ZDE2MDcwOWM1ZGMwZTI4YzY5ZWI3ZmJkY2NlODZkMjBkODdmNDIzYTc0Mjc4OGM3ZjRhNWIxMDI3NzRjMzAzNTc2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsL3B1cmUtZGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE0MGEzOWZlZTJmZGZkNmJlMjU5NzMzOTlhYmM2NjlmNmMxOTBlNzY3ZGIxN2I2NDMxZmJjY2Q3MzdjZGFjOTJlZmFmOWJlMDQ2NDYzNzY2MzQxM2UxNjMzYWJhYjRhMjUzZTk2Y2ZhNTg4MjBiY2E3ZTg1ZDUxY2RlZmVjOGViIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldGhvZC10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0aG9kLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQyZmM2MjRkODk4MDU2ZmQ2YTQ1NmZiYTYwZjA0M2FhZGRlOTRhMGZjOTM2ZWQ3ZmFjNzZjYTdhYWJlMDZjNjY4MGQ5ODBjNzU0MTZlYjlkNzQwOGQzYTIwYWE0YzczZDE3ZjQwMjZiOGE2YzI3YWQ5OWQ0NzU5NGI1NzIyZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWV0cmljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0cmljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmM2FhYWVhNzM1MmY0YjIzZTI2ZDEyMDk4Y2Y1M2Y3YmUwNWU5NzMxYTkzOTY0Mzg2YzU5NmUyMmMwMmFiYzU5OGVkMWQ0MmU0NDFjNjRiYjFkMTA3ZjlkNDA1OTY5YWI1YTViYjZjOGRmMDU0ODIwNmIxNDRkNTIyMjViIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25hdHVyYWwtc29ydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbmF0dXJhbC1zb3J0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2IxNGUxMzBiN2E0NzE1YjgxOTI3NmJiZDVlMzg2OTNiYTMwNzYwODU4ZTY4YzBmMzU4ZmNlOTAyNTljZjY2MTNlZWY5YTg3ODgyNDc4YWM0YTQyYTgzYWQ3NjY0NzVkMWY1NzYwMjQ4MGZjOGVhY2VkMjUzZGU1YjMwNGJiMGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2VzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zZXMtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGM3OWVkYjJkZDE4N2EzNTFhMjk5M2VmOGE5YTU5ZmZkNTM1YTJkMzZiOTYzZTdmM2ZlZGRiZDBmYmMwOGY5OWRlNzkyMTJhMTdjYjVkYWZhMWIzNmU2YzIyZDBmMmU2NDkwNDJjMTRiNzJhZTc5MGY2ZmE0NWYwZjJkYmNiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90bXBEaXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RtcERpci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmNTVjMTVmN2ZhZmQ2ZmFlYzkyZDAzZjM3Y2YyNDYzNzM3Y2U0MWRjOWEwNzNlNjRhODVjMGU5OTk1ZTZmMGIwNGYwZDJkYjIyNzY1NDRkYTE0MGNjM2M2MzU5ODA5OTY0NDdmODgyNDUzNzUzZTFkODBhNmExNjBmYWFmYzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVDaGVjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUNoZWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWYzYmM3ZDI0MDgwMjMzYzUxNzk2YzVkMDk0NzZjMjljZTcyMWM3ZmIyMTYxNWViZTkzMjNiN2JhZDk1YzEwOTMyNDRkYWMyNjA1YjhmMWJkOGJlN2ZlMTAyNTdlZjRiYmZjNzI3ZDM0NDAwYjYyNjVjN2IyNDNkMGJkMDYyMmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiYjRmMjZkNjQzNTFiYTY2YWEzMjc4ZDUwNjA5MDFhYzliYzA2YWJkOWI1MDJhNTZjMmJjZTgzMTU4N2FhYWY5ODlhYmM5MDdkYWMwMzk2ZjU1MDA1Njg1MGI1ZDUwMTMzMjEwNDRjM2U5MTMyMmFhYzRkZTBmYTRkNTNhYzBlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91cGdyYWRlLWFwaS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE1MjhlZjA0NTVjZTM3NzNiNjUwNzk3NGQ2NGU0MzM0Zjk2MTQ4YzlmMTEzNzQ5M2FjMjk0ZTFmMGM4NGM0OTk0ODYyM2ZhMDczZjY3Y2QyOTI4Njk4YjU3MmM4MzQ1YmQwNDgxZTQzYjZmYTJkZmMwYjRiYzhlMDFhNWE5MmI2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy91cGdyYWRlLWFwaS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMWMwZWRhMGU2YmM0MzIxMDllZTY1MDEyYTY1OGVmOWYxMzU4MmY5MTZmODliM2ZjZWEzNzM2MzMyMGJiNWU5NmFkNDI0ZjgxMmZlNjYwZDQwNWZhYmYwN2EzN2IxM2I2NDEwODBhOWZmMzM0NjliZjA5MDJjNTc4ZDY0MDAxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyN2RlZGE0MWY0ZWZmZDQxZDJjOWNlYmI3ZWY5MTQ3MTZlODAzOTI1MGEzZmM2NGUzMmFmZGE2NWZjZDJlYjE1M2JjMmVmODc0NjVmODkwZDMxYTlmOTQwYzBkNDAwN2RkODg1Njg2ZDVmYzI1YmMwY2NlNzFkMWUyZjcwZWQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhYWNlYjE3YzdiNGJmMDAxMzAyODJlOWFjNDc5NGFiYjVkNTE5NTIyNjczM2I3ODZiNmZkZjYwNTA1NTBkZGExYWVkMjNkNmUxNjMwZTMwMGYzZDg1NzhhYWQ5M2ZhM2Q4NjdmNDkwMDgwYTdlZmViMjQ3ZjI2YThjMzMzMDU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkzMDE4MDRkZmM0YzM1MDY4NjZmODA5MzNmZjNmZmE2ZDc0M2UzY2UwNTJkYmNjMzc5NDdmNjRkYzY3OTRlYzdmNTgzNzJhYTc5NzliNjA5ZDc2NjFiY2FmMjljZDk5YzE2M2NkOWQ1ODNiNDA0ZTI0N2Y1NjViMGUxOGRiMTQ0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzVkYjBkMTU5MzcwNDE4OGJjNjc5ZWQ0ZDUyMTZlZmEyMzg4Yjg3M2FkYWFiZTNlNjM1NGFiMzU1Y2M4NDdmNjQ0NWQ5OGE1ZTA4YTc1NmYzZTk4YzJkMjE0NzM4OTY4M2VkNTExMjQzYmMwMWY4OWE1NWJmNGMwNWJhMWNkZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGIyNzhlNDUxNjkxNDU1Y2NhMWJiYzlhODNiM2QzNzg1YTg0MmJmY2FjYzA1MDM5NzlhMDQ0ZTNkNWM2MWM2ZGMwOWQzYTAxODdmZjk1MTkyYjQwYTQ4NzJmOThjMWE4MWM3NzQ5MzVhZDEyZDM3NGVhZDJmYzk4YWQ5MGFmMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTRhZjE3ZGUwYzAxYmNkZjEzNmFlYjYwNjEyMmY1OGM5ZDYzNGZlZjEzNTdkNmRmOGNkZGNkMDUyN2Y3N2U5NTEwZTdkYjJlN2IxNDhjMjcyYTlhMjE5NmRhZDYwZmJmYjEzOWMzMmUxYmM5MDdkYmJiMjdhN2QzODEzYTA5ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjI3OTI2MmI0Yzc5YzcwYzQ4MjhmMTliMDlmNDVmY2FhZGFjNTgxZDZhMWQ1NDA1MGRlZTExMjYyNGI2MDViOTRhNzJmZTY1YjhkMTQ2MWZiMGE1YjdkNzQ1MjhhNTQ5ZjAwN2Q4NDI2YmYzNTkzNzU4ZWMzZjJkYmE0YzE5MmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU4N2QyZTEyNDY5NTRlNWM0MTQ0ZTU4ZGM3NjZlNTYwMDE5YjdjNzEwNGFhMzcyMTQ4MjRhMmQ4Y2FmMDgwN2IwYmVhNDc1OGQ1OGFlYjU3NWZjN2ZmY2FhYjYxODIxYzhlZTYwNTgxMGY2NGU2ZTliYTM2MTExOGE2MjVlZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1OGM3OTZhNjdkNzk0Mjg3OWZkNzJjYmZkODA5YjhlNjAxMjYxZjVlODQyNmQwZDAzMzNjYmQwMzQ5NWFjZmQyZDgxZjk0NmMwOWNkMjcwYjZjNmFhZjlkZWRmOTc5YzRlYjhmMmNiNTQzZDcyNDdkYjliZGIyM2I0MTEyNmIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYzAzZDVhODBmNzM5ZDRlYWY2ZjI2ODQ1MDE2YTI0MjBkNjJkMjRkYTc3MjliODA5ZDcwMjRmYjY4ZDE0ODQ0OWU1YjE1ZTc4MDJlODQ2YmU1OTVlNjBjZDk1MTQ3ODMzNjg2NGRhYzZkYjNkMjIyZDcxMzI3MGNiYWE3MGVjMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYzdlM2IyOTcxOTRhMDA1MTEzYTFhNjNmNTg2YzYzMTdhZTI0NGIwNmQ0OTliNzVkYmYxMzkxYmE4NTYxN2NkZTIyM2U4NzVhYTQ1MTJkZmE0YzJjNGRjNDQxM2UyNWE5Njg3YzBkZDU1MTcxNjdkYTM4NDg0M2ZlMjE0YTU3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzMTRjNGVhNDI0ODBiNTBhNDk4MWRjOGM2YjQ4OTIzZDA4OTk1NDg1NWM3M2Y2YTM4YzhhNGQ2M2I1ZGQ1MjlhMjY4ZGQ4MzdkZDBhZTE3NTk5Y2NlYzEwODNmMjAyOWUwODcyMzJiZDMyZDc2ZjcyNzIyOWMyMmI4MTM4M2U0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2VlOTlmZGFkMTVkYWE5NGJkMzE4NTEzMjY5Yjc5MmVhZmFlY2E3MGU2NDQ4NTc5YTI0NmYzYzM1NWQwYmUwMDI1ZmYyOTBkNzZjZDhkZGZkM2MzMWEyNGJmYzM3ZjdlZTVhM2M4OGQ1N2RiYWE1MmYxZjY3NTYwYTMzNDMxMDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyNGY0OWYyZjQwNDM0MzRiODM3OTk2ZDQ1NjhhMmE2MDY1M2U2ZTNiMTUxNTVjMGFmODJiMTNkNDIwYjIwNTc5ZTkxY2UwMmUyMmYxNDBhNGQ1MjU5ODQ3YzE5ZTcyOGIzZmYyNGU4YTBkYmQ3N2FjN2M3YmQ0NDE3NjNlYmE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMzBkZThjZTkzOWNlMjAwZDBjMTA2MTQ2ZGJmMTllM2ZjZDhhZWFhMWFlZGQzYjEzZWQwMzk3ODJlOTlmNjdmZTBhYmQyNmZjNDFhYzIzODExMjkxNzI2MzRkOTBhNGY2NTRmZDE4MDU4ZTMzYTdiMjA1N2VkMjAzZTY1YzNkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI3Y2ZlZGMyMmNlOTQ4MjhjNGU4ZDkwN2FiN2Q0MGUxODIyYmVlZjg1NTllMzE2YmMwODgzZTA2YmQ4M2FiZTBlMWUyY2Q3NWEyN2EyODA1ODdhMTIxMGUxZDFiMjZiZWQ3NTQ5YTVkMmY1N2QwYTZjYWQ1ZWU5YWQwZDViNmRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3RpbWUtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3RpbWUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDBiYzRiMjFhMjhjM2E1Yjc2ZjQ3ZmFkYTRlYzE3NjFlMTE1OWM0MWUxZmViYmYwOTVlYWVkNjExOGUxNzM2ZTU5NDYwM2MxOGVmMDI0YWM1NmY2YTVhYjNmM2NmMDg2YzVmNWI1NDRlZGUxMDAzMDFmYjM1ODI5YzUxYWIyN2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGltZU1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RpbWVNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDcwNWE0OGE5MzI3NmNiMjMxNmUzYzZiODBmYzFiZDQzOWY2ZmVjNTc2YjUyYTg0NWRjOTg4YjZlMmJlOTRhMWVkZTkyMjZjNmEyMmM2ZmI4ODA4N2FmZDFhMjM1YWM4MGFjYmMyYTE5ZDI5YWU5OTE4MmZkMWQ4Y2ViMDY4Y2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM2MWIwNjAyNGMyZGQzMmY3Y2UxYzg0YzNmZWMzY2ZiNTdhZjhkMjkyZjIxZTdiOGYyNDAxNTM3MWMxN2YyMzFjMWFlMmQ0ZDE3YTBkMzQ4NjZhMWM2ZjgwNzMyOGNlZmFmMjg5YWFlOWNhYjViYjFhYzBiZTYyNDJiOTNiOTE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92YXQtZGF0YSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2OWJiMTU3MjgyNDk5NmU4Y2M2OTdjZWJhYjU0YTIwYWNjMTljYmVhZDBmYmVhMDUzOGU2NDYxNjMyYmYyOTE3ZGNhNGU3NDM5YWRhNGMyZDhiNjNmMDFlNzkyYmE3NDA1OTc1OTdkYzM3ZTdjMzZhNDJiYTdlNzY0ZTk1NWM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3MmZlM2E2ODM4ODNlODVjYzRkZDNiODZhOGI1ZmMxZjJiYTFmNjc3ZWI4MDMzMTk5MGZkNTQ1MDU2ZjhmMWEzMWJkNGU2OTM1OGViYTEzY2U5MGQxYTJjNWNjMWMzMmZmOTU5MGQyOTBmNGNkODc0NTk4ZTg3ZDAyNzk3MzkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgzNDRmMWRhZDhmMmE2NTA1M2Q3YWVlYTBiOTZjZWMwZmZkMDJiOTlhNjFhYzcyMTc1MGJmYmNmY2FjYzRjYmNjZDBjY2RhZWNkODM0ODQzNWMzYWY3MWNlMzg2YzY4MGEzMGMzNDI4Zjc0YmExNWYzMTA5Nzc3NjI2NjQ4YzUzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZUhhbmRsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3YzVkNWZmZDY0NmIwMDEwZGI4Mzk1YTAxZDlhM2RhMjg5M2ZmMDY3ZWFiYWFkZWI0MzZhOWRkZjc1NmE0ODdjM2U3YjFhMDYzODlkOTU3MWQ2ZGIyNWIwZmQwZGYyMzViYWE0MmUxOWZmZWIyZGEwZDhhYzY3YjI4YzNjZjFmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTA2MDljN2Y4YzU3ODY2ODM4YWUwYzQyMDVlMzc3ZTczNjEyNzkzYzE1ODJmMmY4NzA0MjFiY2Y3M2EwZWFkMTk3MDY2NGMzZTM0ODFkNmI0MDQ0NjE1ZDc2MDEzODllYjViMzZlNzE5MTYyYzg2MjYxMjA4NjM3MGNlNjJmNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b25lLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b25lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIyMDhkZWY4ZGYxY2JlMTQxODY2OWRlZGY4MGJkZjU5NTM1OGY1MzY2ZDExODhhYzA0ZmU0YTJjYjljNTNjYTg4NGQ4NTIxNWM5MGYxYjg3Zjk0OWJiMDQ4YTc5NmVlNWI2ZmRhMTNkNTFhMjU5ZTI1NzQ0NjQ4MTlkNjIyY2QzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2R1cmFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTMwMTUyZWY0MWUwMzUwMDU0ZDUwNjlhNWY0MzdlMWYyYTE0M2ZiNmY4ZGU2YWNiNDdmMDk0ZDE3OTNiMWQzYzNkYjA3MTAwODg4ZGY3NTU5YjRkYjdjMzdlNzYzZmI5ODhiOTM0ZWUxOGJmMDQyYjZjY2EwMjkzZDI5N2QzNyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tbW9uLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbW1vbiIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXBwbHktbGFiZWxpbmctZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTc0OWNkMzc4NTg4N2NkZWU2ZmM2ZGI4MGZlYjlmY2VmNzFmNTJkZjM1YjMyNzRhOWM3NGJiMjhlZTM2YzgzMGU1ZTc5MjRhMTJlOTczZjNmYTRiNmIyNjBiNWFkOWQ1MTQzZGU4ZjgzZWVmYjE5YTBhMjhlMzEzYjdkNDBiNyIKICAgICAgICB9LAogICAgICAgICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZnJvbS11bmlxdWUtZW50cmllcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1ZjJlNTU2NWNhNDFjOGIyZjFhMGIyMWY3MzM1NzJiYjBlNmY5NzU1MDNmN2MyNmQ3YzE4MTc1Y2E1OTZiMTliYmJlMjgxMzM0MDdiYjc2M2Y4MGY0NDg1YzA2M2EwMjRlZTVjZmQ5ZTA4MTY5ZDc1NjBkYzQ4OTljNjdhYjVlIgogICAgICAgIH0sCiAgICAgICAgIi4vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpZGVudC1jaGVja2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzk5MDQwMjhmMWM1NjExNmE0NjczNWM3NTRlNTZiZjM5MWY1OGEyZmEyZDMwYjUxNTdhOGQ5YzlkNTg1MTcyM2Q2NzFmYmY1MjI3ZGMyY2JmM2MxYmI1NzY0NDdhY2YwZDRkOTA5YWVlYjFmODFhYzI0OTI3OGE1NjYwZmJmMmIiCiAgICAgICAgfSwKICAgICAgICAiLi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibGlzdC1kaWZmZXJlbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzc3YzBlZmE5OWYyOGFjNzdmNGMwOTQ5Yzg0NDgzOWIxNmVhYjIzNmNiOTE5ZThlYTQ4YjY0OWM0OGQ3OTE4YmVkZGNkMGMyY2Q4YWE0MDE3ODI1NGM0YzYwMWRiZmVhMTY3OWFmODFlMjY2MmE3OWI2YzEzMDk4NDY5NjQyYmIiCiAgICAgICAgfSwKICAgICAgICAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm1ha2UtYXJyYXktaXRlcmF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTllZTNhZTk5MmFhYTg4OGJiZTQxYjMzMDJiMjA0ZDFmZGYzNjAwZmNkZTdkODZlNDRmOTRiZmE1MzQxNDIzNDk4OGIyOTI0OWYyN2E2NDY4OTliM2VmYTljMWFiYTFjYWI5NDAzMzg5YTZiOWY0NTg5ODk0YWYyODA0OWU5OCIKICAgICAgICB9LAogICAgICAgICIuL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibWFrZS1pdGVyYXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUwOTJkZDgxOGU4ZTBjYmM2ZWExYjZhZjBjMjFkZjVhMmU4NmVkMTg5NmUxZTdiNzEyYTc5YmRiMTA4NGJlMDY5ODlkYjFiYmI5ODRlYTk0NDM1NWI5MWZiNjY0ZTQxYTE2N2QzM2FiNTBjYTFlYTAyODE4ZmQ5MjRmNzE1ZTMzIgogICAgICAgIH0sCiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2RmNTkyY2FjNzFjODVjMzFlYjk3NWM5MjE3NjZmMGZjMWFjMDI1MTExMjhjOWFmMzVmMjE1NTgzZjY5NDhhODU4Yjc5YjhmZmVjMzFkNGU5ODgwYTM1ZWY5YmFiN2IyYzJlMDZiMTM4YTA2MzJiMTE4ZjU4OGYxMTg3MjNjM2MiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAib2JqZWN0LW1ldGEtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTc4MDNlOTA4NWYxNmNhMDFiY2FmNTUwNmI0ZTU1YjllYjE0Zjc3ZmQ5YTMwNzU5YTI5ODgyMmNiYzQ4ZjEyNTU5OTNiYTYxZmRmMjExM2JhMTk5YzEwYzBmNTM0ODMxODFjN2I3YWEzZWNmOGUxN2IxZjNmODBhYTUzMDdkNWUiCiAgICAgICAgfSwKICAgICAgICAiLi90aHJvdy1sYWJlbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRocm93LWxhYmVsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkN2ExMDU1OGM2NTZhOThiNWY5ZDAzODRjNzlmOTRkZjk4MjExODBkMDBlOWMyNjk3N2IwMWY5YWJiNjhjNTE5NmJkZTUxYzMwZjEyNjE1ZmRjOTU3YTUwODA1NzU5MzNkMDkzYjI3ZmUzOTVkMjAwMTIwZTM0YWIzZDg5YmQwMiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZW52LW9wdGlvbnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYzgzMTM5MTY3ZmI1MjQ2NjgwY2YzYjYwODlhZTZmZTIyY2UyYWQ4MTY4NWM2M2ZkYzYzZWI2OWM2NTIyOTgxNGE3ZjhiZDViYWJhMTYwYzI2NWJkYjQ1OTUyYTMxNTM5MWRjNTM3YmUzMDM5NTY1ZWE3ZjAxYzg4OTZkZGJjZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzBkN2ZmMTdiM2QyMmI1ZTNjZDkyOWNhYjJiZmExYTUxYzc3MTIzNzAyMDU2ZmRjNjY0ZTc3ZmQ2MDgxNTMzMzYzMDYwNzA5ODA3ZDk5MTRhYTBlZDhjYThlYTgyNDlmMDFjNTgxNDVhNDJkMjdiZGFmN2MzZDcxMWQ4ZDMxODIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTI0OWFhNzJhYmUwNWExMjAxMmQ5M2ZlNTI1ZTBkZmZlNDM5ZTc3NmViY2ZlYjE5YzIyMWFkZDY3OWJhMmQ4Y2ZlMGMxNTE3ZmUyN2Y4MzBlMWFkYTk2OTA1YWE2YmE4NjE0MGM1ZDkwYjI5YzllNTZiNGEzNGQ2MmQ0ODlmYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbG9jYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xvY2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjhmODMyNzVmYzc1ZjE4MTA4ZmFlNDg2MDdkYTBiZDM5ZjI1YTgwZDFjMjU5MjNkMzY2MmU2MmRiNGZmZWEyMDBlOGI1YWQ4NTk3MzZhYTFmNGExYmZjZjEwZjU2MTY3NTgzMjUxZjlmMThmMGQ5YmVkMTlkMjc1MmUwMzZiZTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEwMmVjM2RjZGM2MTczNDlhZjlmMmUyNWNhZGUwOWM4ZGUyOGEyYTEwYmIzNmE5ZjMzZTFhNzg0ZThkMWJkNzRhZGU4YTAyMjhjNzJiMGU1NTEwZWJkZThhYWZmZTg3NjZmN2RlMjk3MThkMWQ3NThlNTNlZTE2MDFlZTZkZjIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1OGIzMTU5MDU5NGQ5ZTc1NjRjOWQ2MTU1NGU1NjcwZTM1MDA1ZTJhZGYyMGMxNDA1MzUzNDI0ZTAwOWRlMTc0NjIyN2UxMmNmZWIwNzU5YzgxODM5MTBjZDJhYzEwZjgyMDFhZTBiYjdlMGIzODQ4ZmU2NzI3NjBiNjNhZGE0ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZDgyMzEwOTlkYzM1NTMwMTg1YjNlNjM2Mjk2M2NjOWUyMjg1YzQ0NDg3NWM5OTdkNTA3YWExMzEzYTg2OWY3ZTU1Yzk2Y2U3ZDYxZjE4MTg2MWIxNjhiMjY3MTVkY2FkODcwODYxMTcxZTI2M2I5OGQzZmU1MzY3NzM4NTQxMSIKICAgICAgICB9LAogICAgICAgICIuL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDYwNzEyMzhiMjVkMzA3NjZmNDQ3M2IzNjA3NWRiMDUwMDRhMzA5NWI3YmE2YWRkMDQ0ZDk4NjY1YzdlMGMzYzMwOWQwNGQ0MzU4YWFkOGIwNWRkOGZjZjAwZjdkZjI5NjE1NWM1ZjgyOWIyZjhiZjM4ZGRiZWZiMTBkNTgzNDkiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V4by12MS41LjEyIjogewogICAgICAibmFtZSI6ICJAZW5kby9leG8iLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzk0MTQ3M2MzMDViZTU3ZTc3ODMxYjg0NmI1ZGQ3MmYwNWIwM2U5NzcwNjk4NDE3NGFjZDFmM2ExM2ZmOGNjYTQ2YzJkNTEwMGYzNWZjYTdkOGYwNzE0YTVkYmQ5M2RkMDliN2U2ZGI2ZGI0YzYwODkzOTljMjQ0ZWM0NmNjYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ0NDc0ZjcxZjY3Yzc3ODNjNzdiYWUyNjM5ZGE5NjQwMWNhYjdmYmRmNmU1MDYwNzI2MTI1OTA2NzE2NjA5ZTdmODcwZjkyMWMyMmZhOGMzNDliZGJkYjRiODQzM2QxODhlMmVhZjk3ZjllZjIwNDI5MDU0MjJiNTA3YWFkN2RmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjllZTliYWMyZmE2M2U4M2Q1ZWU3Yjk2ZDFjZjkwNmQ5Y2EyZjJmNWE4MmJjYTg0ZmZjNjM2Y2JjMDk4NTJmMDJiMmJiOWU4YzVkOTJlNTg1MjI3MjEzNTZhN2ZkY2VkNWRjZGUwNDgxNWQ0ZjM4MjVmMmFjM2NiNTgzMjQ4OTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZ2V0LWludGVyZmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM2YmFjY2ViYjNiNmNmNGU1NjRjMjA2YTI1ZDlmMzg3MWM2NWRlNmY3Mjc0NjhmNGU3ZDBiNGUxMDEyZGFhMzc2Y2E4ZTkzNjA1MGM1YTJiYjlkNDhhYTI4YWMxMWFmMWMyMGY3NmZjZWFiNDAxNWUwZWZlZjI4MjgxNzUzNmUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9mYXItdjEuMS4xNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZmFyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YWJjZTViMDU4NDYwMWFiNTUwNjk5MDQyZDE2ZTY2ZDA3NGMyNTViMDQxOTM2ZDJiMDc4NzMyYTY0OTI3YzM1MTVhM2Q0Zjk1MGVlOTYwOTllYTA0ZWQxZGMxNmU0ZjRhODhhZWIwZDgxMWI0ZWViNGQ5N2E0OTJkZjUwNGQzYiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS44LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ODg0MzBmY2I3ODZiNTYxY2YwM2VjZjY1OWRhODgwZmM4YzRhNmJlMjFlYzZhMjU2ZmQ4ODQzYzkyYmM2NmMxZjEwZjk4MzcxY2M4NWMzNjcwZWE3Y2NmNzQ0MDBhYjExMmU0ZDEwYmNjMzliNjVjZTA1YjQ4NzUyYTI4ZDJjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OGQ0MDAxMzJlMWUzNWMxYTlmMjYzMDFkMDg4MThiMmRkMjBiZTZhODllODc0OTM3YjNiYzkxZDc2YjkwODZhMTAzYzNiN2JiYWIyYjUzMjU3NjVhMDEyODViYWQyY2Q2MjM5Y2IzMDk5ZDM5ODM3ZjM3NDZjZmI3YTU0OTJhMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZjOGI0MjY5N2RiZWUwMjMyOTk0MjQ5ZWJiMDlkMmE3ZDI5ZDNjODc5YTFhMzljMDYyOGMwNzIwZGQyYWU1YjU4YTE1N2Y0NjIxMWY5NTM5ZjE2ZGMyYzYxMjU5YmJiYWM1ZjMwNDIwMjYyMmQ3ZmFkNzU3MDhkYjAwNDlhZjc3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0NGEyOTY1M2RkMTI1MjRiYjc4MWVjNmU3OTRlZDBmNTU0ZTIxYjgxYzNlOTdiMzliNmVjNWIzOTk3ZGRhYWMwNWFlNWM3Njc3Y2IzYmYzMDM0Yzg3NmU5MWIwOGVmMjE2MTlkNTU1YmUxZWJkZWUwMzA2Y2FkNzRkYTU3NGQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ4NmFlOWYzZmZmOWVjMDhlMDRjMTMyNjBiOGE3MzY3MGQ4ZmNmNTdlNmJlZTk3NDRjNjI3MmQxYTA2MDcwN2NlMzRmZTRkNWQ0OTkwNzY0ZWY0ZmYxNGM5OTIzMzc2NWI1Nzc1NjQ0MTM4YmNlMTMyNTYwNzhlY2ZhZmMxNzMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyMjg5MWU0YzA2NDMxYjU3ODQxMGQzNzZjMjllZTE3NTYzODlkOWU2NzI1MTU5MDJjZmFhMDdmY2FlOGRiMjQ2ZjRmNDQwZGRmMDU5Yjc5ZjRlYjYyZjFjNzU3NzdmZGQ1YmZhOGZjY2Q1YWFmNDE4MTY3NDJlZGE3NjNjYjcwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ODBjYjVmMDY3Y2UyMmE3MTMzNDAyZDI3MjBiNzNmNDE4M2E1NzgxZjIyOGRhYzIwYTZhNDM1NDg4NzJlZWQ1YjNjMjRlMGZiNTM4ZTNhYTJkMzgzOTFmZWI4Y2VkODQ2MDQwYzg3NmE4MmZjYzY4YTc0ZDNhNzQ1OTZiNTc1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI3MDUyOWViNDFlZTQ4ODQwMTI3YmMyZGQ3YWI3ZjhhMjI0NGRlM2YxZmEzMzRlNGY1OGVlYTQyMWNjMzA1ZjU0MmYyZTdhM2ExNzc4NmM4N2ZjOTA0MzAxN2U3ZDdjNjM3NWRhNGU1MTRjMTY2MGJiODMwMzAwZWU2ZDM4YTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMS4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4NzBiMTFlMGQ5NTg0NjkxNTZlYjA3MTFjZjFhMGE4YThkZjQwNzk3YjIyMjVmMTRiNmI0YWU3NmM5OTg1YzI3NDIyNDA2YjA3OTYxMDk0MjM0NjAzMzk2YjBiNWNhYThhYmE3NmE5MmNkZTZiZTQyZDg1YjE4NmY4NDdjMDBmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaWRlbnQtY2hlY2tlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ZTI0NGQ5NDA4Y2VkYjVmMDhkMDJiMTFlYmMzZDkyMDUzNDUyMDZkYThhMmUwOGQ2ZTFiNmFmNTBlYzk4ZmEwNGQwMmE3YzA4NTFjOWVlMDUyYzFlN2YyZGMwODZmNDlkNThmODBjZmNjNGJkOTZhMjkzOGQ4MWQ0ZDkyYWMyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ieXRlQXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J5dGVBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVmN2FkZjk0ZGQxYjE2OWIwMzcwYjk0YWFjNGNiOWM4NmE0MDhhY2ZhMjA0YTY5ZWY2NGYxNGM0NmVkMDQyZjg0ODAzYzM5YjRkODE1NTc5MTBjMWQ2ZTkzZDMwNGEyMjE0OTZiZDcwZWY4YWI4OGIzZTdiZDFjOWU5NGE0YmU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmM0ZjFjNjZjY2RjZjEwMjVkNTVlMjQxZDU1OTlkM2E4YTk4YjAwMjZhYjEyZmFjYTU0YTAxNWM0MTgxZmQzNmUxZjJkZWE2NDg4OWJiNmQ5NzFiZmZiMmM1MDZiNzkwMjgyZjViNzRkZWU2ZjZjNDI1MDc2Y2RhYTUzZmVjMmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE2YjQ2MDEyY2I4MGY1MWRmNmQ2ZDYyMDAzMmUzNTk3MWJkYTNiOTUxMDUyYjgwMmQ3YTU1MzczYmMwYTY1ZWRmODFjN2IyZGRjMzc5OTI3ZjEyZWViYWYxZGM0YzkwYmQ3NGU0MTQ5NmM0OWZiZTNlMzhmNDQ5YjMwMTMwZTIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDcyOTcyNGUxMDNkMzE3YTE2NmI2Mzg0ZWFiZmUwYTQxZGY3MjJlZTg4ZTA4ZmNiMDJlYTE3M2ZkMTY3NmNjN2VjNDU3NzM1ZTdiZjAyYzk1MjQwYTY1ZGM5NWI5MTIxZDU0YTIwNzFkNDhhYWVhYmJmNGQ0NDNhZWE1MWY1OGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGQyMmNiZGY5OWQ0NTIxZDJlMTdiYjlkNWMxY2ZlMGQ1OWU3NTRiMTVkMWE4NTlhOGFiOWJlMTJlMWNmYzIzMzAwNDgzOGNkMzY5OWVhNDA3NmY3MmU5ZjI4NGNkOWFiY2Q5NjZiN2FkODJmMDg3ZDNjYWMyOGQ2YjEzMmZhMWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YTVkZjA2NmQ4MDI2NjVjYmNmYzgxMDcwZmNkYWJmZDEzYzczMDlhYTU0OTRlNThlNWFjOWQyMDNjNjAxYzdkZTVmMTAyYTRjYzY3YTJjMzQwZjcwMGI2ZDRjY2RhZjAxOWE0YTJjY2M5Y2ZhMWZkODc0ZDI1MmM4YjQ3YTFlOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMjIwMGFjNTkwYzZkZmIxYzEzMmFiODQ1Y2RkNDNhMzYwMjBmMDgyZDdiMWM5Yjc0YzFjYjNmNWFiNDVhYzVhMTQ1NWMwNmU5ODQ5YTNmZDRlNjIyMDE0YTI5OTQxM2M1NzU3YWMwNjIwYTdiYjM4ZDM3OWFjNzg3MjIxZDMxOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2NkNTJiMDg0YzIyYWExOTcxZWUwNGZiZWFkMjg1ZDdhYjQzYzgwNmZhNTNkZTliMmJkYzg4OGU3NTc2ODg1NDc0NWU1YTcwMTdkYzQ0NDNmM2FhMzg0NzhjZDNmYjNjMWFkYjMxOWRkMzgxN2YyMTNiOWJlNzI3MmNhMDI3N2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2U1ZWUyMmY5NTE3MDk1Yzk4NmI0NGRlOTdlMzc3YWVkZTUxZjZiNjI1ZDk5MGNjODQxZjEyOTBlNTc5MTJmOGMxYTE0YmU0YzBjNmFkYmIzZDk2NjIwZmZmZmUxYTJhODc3MjhhZjZkZDgwNzhlNGIzOTg5ODAyZTg1OTg0YjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWE4MjQzZGFkNzU5NGYzMzEzYWNkMzI4MzQwZjY3NmMzY2JiODU4ZmZiNWI2ZmQ0OTQ0ZWI3YzQ2MjkyZmY2MjU0NjY5ZmJlNTc3NTEzNjEzMjc3MzYxYmY1Njg4OWYwMTQ1MGQ1OGFlMjUyMDdkMzc2M2E5ODhhODZjYTBlMmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOThhODIwMmY5MWM0N2ZmYThhZmE4MzAxMTZiODAxYTRjMGIzMmFiYzk4NjE0MjZmNDNiOWQyYWY5ODM0MjAzODAyODFmN2ZhYWE0ZGZmM2RjMTcwYjljZjA0OTkxMTUzODE4YjRhZDhhYjBjZDkwZDdmYTRmMjNlOGNiOGE1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhNzBmMjEzZGMyMjUxMWZmMzVlYTQ0OGU0MGQyYTFmMjgxMzE4NjgwNTBjMzFlZDM0MmY3NjUyYzE5MjE0YWI3Njg0YWZkYWI3YTAwZGFmNDcxMDk4ZTEyOTNkNjY1MWJlODg1NjJhMGQxYjk0MWU3ODk4ZDk1Mzc1OGY3MmZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2FiOTI2MDhlNTE0YWUwNzI0N2I0NTdhMjg2YjU1OTFjYmFiNDJhYTdiNGEzMDk2NmJjYjU4Nzc4Mjk2MGU3MzU4MTg0NWY0Njk4NDRkZWU0NmRjNzFiZTk5MzFhZDliZjU3Mzk3MTcwNjVhYzMyNjdiOTViZjdkMzJiYWI2ZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZDJmMWY4YzQ4NjcxZDY5NGEzOTM3Y2I3MDU4NzA2ZmM5M2JkNjYxNmZhOTY2Y2NjYzQ1MmFhYzM5NGU5Y2UwMjJmY2M0ODAzNGIzNzQ2NTk5NzQyNDI5MTk3MDIxZjVmYThhYmI1M2U5YzBmOTdkYWYyNmY4Zjg5MGM3ZDhhZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE1ODNkZWQxODA4MTUzOWY0MWE4MTE5NzE1N2NjMDVhZThkYzFiYWU5NWMyYTY3ODc2OGE4MmFjZTExODk1NDI3MjMxYTM2ZTliMmFhYTc5YWRiZTVlZDU4YzNlYzU4MDI2YjJlN2ZmNTg1NjY2MDYxNzhmYjg5MWJlYjU3NWE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjE4ZTNiYmQxZjZhMGQyMzBiMDQyMGVlMTI2NmY2N2YxY2I1M2ExYTI2YmMxZjE0OTY0ZDZhZWQ0MTk5OTZhMmFjYmU0NDVlMDgyZmFhNzM0YWZkODc2MjE5MWU5MjVlMmQxZDU4MTUyNDFjODI5MGU1YmQxOWI3YzllN2MyOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXR0ZXJucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjOWI3YWJhMzI1YjNhOTQwOGJiOTc3M2QyYjgyMzQ4ZTBlYzVjOGE4ZWZkZDQ3ZmNjY2U1MWQ0YzUyYWJmMmZkNTAyMGZkYWI5ZWFmMGQwZDA1MjhiNzkxNzBiZjAzZmMyOTA2YzMyNjJjY2QwMmIxMWVmYTMyZWUyMjM3YzczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YmJhM2FkMzUyYmM1ZDQzOWYwN2YyOThhNGI5YTkyNmYxZDBiYzUzMzdhYWI4OGU4NjA5ZDVjNDY1MTYyNTE2NWUxNDdiNDc5N2IxMTc1NGI5YWUxMDQyYjZiZTA4OTdjMTc4YTlkNmZiM2RmYTEzN2E4OTZiOWIzYjgyMzVjMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDc5OGEwNzA0OWRlOWU4NzE2MmJhNTMyYjIzMDA3YWFhMTc4MmNlMjlhODc5NzQ5MmE0MzgwMzg0MjQ3YjhhYzQ5Y2YxZGVhMmFkMzA1NDY1NDIwNjk3ZjIzZWVhNDVmNjQ3YTlkMjJlZDQyYTJmYTAwOTkwODI4NWM1NjkyMmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYmM0Y2Y4YzQxMzVlMWQyZTE4NzYyZGU4YjY3YWFjMzFjOTZlM2FhMzFjYzRhYjRkNjExOTg3ZTM3ZGY4NjhjMmJkOTJkMGNjNzNiYjQ3NzRiZGIzMWNiNmJhYjExYmFhYTg4MjZjYzIxZThjYTcxY2ZjN2Y5NDU3NjExMDI1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxN2Y4M2Y1M2Y5MTJhYTkzZThkZWQ4ZTk3NjZjZGMzYTI2NzE3M2VlZDM1ZDUxZjA1NDgyYWM1ZDc2MTAyYzZjZDQwMzVmZTk5OWNiOGY1MDNiY2FkMjg4NTJiYzdiNDA4MTQ4YTM5N2ZmNzRmOTI1YjI5YzM4NTk1Y2E4MGQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZDFjZWQ1ZjEzNzU0Y2NmZjQ5ZGMwZjgxMGM4ZTZkNTI3MjdiZjJjNGVjNzdhOGRkOWE1ZmY1Nzc0OTVjNGFmY2Y0ZGEyYjhhZjQzNmM4NDMzNmFmOTlhNzFjMWNjYjc0OTBmNmJhMjk3ZWMxOTVmM2YzN2NjNzgwMWVhZGY2YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlMDk1ZjdjNDU4NTcyYjUxMGZhMzM2MDNjMjA3M2QzMTI5MTUyZGYzZjc0ZDNlNjI3YjM5MzE5MTlmNjY5NGE1NmZlYjg0OTc5ZjhhZTk1NDBkZDQ2MmMwNjg0YjZlNWJiODliYmQwYTg3ZGVmMjJlYTkzNzUzZGVmNzkzNGEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjM0MWQ4ZjU2NWRkNmFhMDMwODJhMzZlMTI1YWM5OGM1MGNkZWE5YzMyM2E2MzNkYThjYzQyZTZiY2U5MGY0ZDAwNjA3ZDQ1MTY0OTQxMTBlMWJmZWRhNGNmM2IyMjFlMDNiM2VlY2Y0Njk2ZWNhOWRiYTZkNmU5OGEyMjRkOGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUzNWE2ZDBiMzBhYzc4ZWVjMzgyN2FhMGY5MTllOTZlOTJmNTNkMTZhNzUzOWZiYTY4MmY3MzllMTZkZjFjZjNiNzIwODZmZDY3NTQyZjc5MDAyYmI3NzZiNmEwZjQ4OTg3ZjRjMDk0NWU1YzZkMzllYzA5Y2E2MTk3ODMzZWU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTgzOWY5MzM2NmY2OGYwOGQzZTU5NjFiOTQ1MTg1YzA5NDEwMWI3YjczMDdiNWRmZjdmMzQ1ODg4ODY5NDQ4ZDE3MjA2ZDYxODg5NzQ1ODBhMTc4OWQ3NGE3Yzg0OWRmZTc2NWU0M2U0NDU1MzM2YWVkMTM3YjhiMGNmOWQ0NGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmRiMzI0MDAzNGM5MWFmMWMwYjRkNTljZTVjMDljZDhmYjIyM2ZjNTFiMTU3MDEyZWVmZTJkMzMyYmRmN2E0MzkyMDU0NmZlNTcxMzJmMGM1MTM2MzJhOTA5NTNmZjM3MTAwNDI5NDk2YjdiMWMwYzA5YzU3NzQ1ZTMzZjdhZmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc3ZTM1MmZkYzVmY2EzNzdiNDAxYWMxNGEwMzQ2OGUxNDZlMzU3MmEwMDkxNGFmMjAyOTMxZTU4ZmZiOWUxYTQzMjQ2MDZmYmJkMWYyMTRkM2Y1NzY4MTk1ZGNkY2M5NGI3MjFlMTBmZWFmZGEzMGEzNzg1OGUyZjM0MTQ3N2MxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmJhYzQ3NjAxNTY5MzIxOTNiMTBlMWU1MWJkNWE4MTVhM2E3MTEwODEwN2I1ZWNlMzJkNThkZjJkMTQ4MjZmMGJmODVhZTc4ODE5YzYzNzQ3OTc2NzQwNDg4YmZhYzg0ODVjYjBmMmE0ZDk3NzVlNmEyNWJmM2ZlYjMxYzQxNjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzExNzg2YTBhNWNhODA5Y2NhYzFmMTk4MDdhM2I2MTBjNDExMzAxODE3OTZhZWQyZTM3ZGNiZTFjZDhlNDU3OGJkMjA1NTEyYTVmYzlmYjMxMGY0ZmNkNTk0NWQ5NjJlZjI0OTNjMzEyMzQxNTdhOTM0YzVkNWFjMzQ1YmU3YTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3N0cmVhbS12MS4yLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9zdHJlYW0iLAogICAgICAibGFiZWwiOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMDFkZjE2MDk4Yjc4YTZhMzFjYzM2YWQwNzZmOTNmZTI1ZDk0NjE2MWQ3NjM1Yjg5ODU0NmU2YzBmZjlkOTg4ZmM5NzE4ZTlkNDhlYmY3YjNlZGQ4OWU0ZjI3MzRiODhjMDk0ZDgxNzg4ZjA1NDdjOTNmYThhYTM3Yzk3MWI0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJqZXNzaWUuanMtdjAuMy40IjogewogICAgICAibmFtZSI6ICJqZXNzaWUuanMiLAogICAgICAibGFiZWwiOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYWYxMDk5NzI5MDFlZWMzZTdkOWMwMWRhZTI2YWVkNjc5ZmYxMGM2YjhjMmVhYjlmN2I4NTAyYTI3ZDkxNWY0ZmMwZDg4Y2ZmMjVmMTViNjk4NWY0ZTFjZTJiZDQ1M2I3ODMxMGJmNmMzYzZhMjU4MzNjNTFiMDcwNjViMDMyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDdkZTZjYmI1MWUxNmEyZGQ1MjBmN2U1NjYwYWRmYTNkMzZiOWQyMGVlYmE3Y2QzZDAzNmEwZDViZmQ2ZDE0YWQ4NWY1NjM5MDBmMTZjNmEwN2JjNTcyZmY4NDM2YzNmZDFhZmRjNzU2NzcyMzcwOTgzNzQzZTZkMjRkNzQ3YzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjU3ZThjYTlmNTA0MDNlMGQ0Njk2MmZjODQ1Mzk1OGVmZGM1MzAzNWFkODliYjBmNDZjZjEyNjM2N2Q3NjkyOWU5YjNiZTEzZWY5NWM0NTI3NmZjYjg0NjA3OWE2NDE1ZDczYmQzNTM5MWZhNjYwZGYxNjIwNzliYTcxOWIyZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmZDUyZWYzMDJjMWYxNGM2MjBmZGRkNDM3MjdkODIzMjQwM2I5YmQzNTYxZTFmMTIzZGNlOWQ0ZTlhMTNiNTVhMmQxZWU0YWQ4MDcwMmYyNTExMTllOWQ0OTJhOGM3YTM0NWZlNTcxYTQ3OWQzOTFlMmI3ODFmZmIxMzhjMDA2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYThkM2M1ZGM3ZDQyYmE3MmZmYzZmZWIyZDk5MTMxYTc5M2MzNDE5MmM1OTE3ODMzMDllMGRhOTFkMTAyOTIxZDhlZDUwNmQ5Nzk1Y2YzYmVmYzZhNzkzZmM2YWIxODAzMWZmMmJiYWRkYmRiNDc2NGM2ZjQ5ZmY4ZTkwM2JiZTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjIyY2QyMzBkYzIxZjZhOTE3NDI3NDVjNThkZjU5MjgwNmFkZThmMTNiODdmMjkwZjA4Njg5YmNjY2M0ZTYxNDc0NGNkZjQzZjhkOWYzZWU2YTFjNTZkOTEwODMxZTM5N2I2NjZiY2I4MDk4YTExMjYyMDAyNTM4NDBmZTY1MDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc0NmI2YWJiY2VhNzBiNTEyMGEwNTQyNjM5YTk4NWQ4OThhMjVmMjVhMjM5NDBlY2MwZmEyNmU2ZWZjOGQ2NTJhNWRiOWFlNWE3NWVjMjc4Zjc5YzQ0ZDg4MDBkOTdhN2JkZWViZmU2NTczM2IzYWI2NjRiYjIzNTNjNDY1NWVlIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAMYBI+I0BAACNAQAAIAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9oZWFwLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2hlYXAuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2hlYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAATMwWR8wsAAPMLAAAkAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9oZWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9leG8iLCJAYWdvcmljL3N0b3JlIiwiLi9tYWtlLW9uY2UuanMiLCIuL2tleXMuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiZXhwb3J0cyI6WyJtYWtlSGVhcFpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXIsaXNQYXNzYWJsZSxtYWtlRXhvLGRlZmluZUV4b0NsYXNzLGRlZmluZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyV2Vha1NldFN0b3JlLG1ha2VPbmNlS2l0LGtleXMsd2F0Y2hQcm9taXNlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXhvXCIsIFtbXCJtYWtlRXhvXCIsWyRozY9fYSA9PiAobWFrZUV4byA9ICRozY9fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAoZGVmaW5lRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gJGjNj19hKV1dXV0sW1wiLi9tYWtlLW9uY2UuanNcIiwgW1tcIm1ha2VPbmNlS2l0XCIsWyRozY9fYSA9PiAobWFrZU9uY2VLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2tleXMuanNcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXV1dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbW1wid2F0Y2hQcm9taXNlXCIsWyRozY9fYSA9PiAod2F0Y2hQcm9taXNlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7U3RvcmVzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQHR5cGUge1N0b3Jlc31cbiAqL1xuY29uc3QgZGV0YWNoZWRIZWFwU3RvcmVzID0gRmFyKCdoZWFwU3RvcmVzJywge1xuICBkZXRhY2hlZDogKCkgPT4gZGV0YWNoZWRIZWFwU3RvcmVzLFxuICBpc1N0b3JhYmxlOiBpc1Bhc3NhYmxlLFxuXG4gIHNldFN0b3JlOiBtYWtlU2NhbGFyU2V0U3RvcmUsXG4gIG1hcFN0b3JlOiBtYWtlU2NhbGFyTWFwU3RvcmUsXG4gIHdlYWtNYXBTdG9yZTogbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxcbiAgd2Vha1NldFN0b3JlOiBtYWtlU2NhbGFyV2Vha1NldFN0b3JlLFxufSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgaGVhcCAoaW4tbWVtb3J5KSB6b25lIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBleG8gYW5kIHN0b3JlIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VMYWJlbF1cbiAqIEByZXR1cm5zIHtab25lfVxuICovXG4gICAgICAgY29uc3QgbWFrZUhlYXBab25lID0gKGJhc2VMYWJlbCA9ICdoZWFwWm9uZScpID0+IHtcbiAgY29uc3QgeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0gPSBtYWtlT25jZUtpdChiYXNlTGFiZWwsIGRldGFjaGVkSGVhcFN0b3Jlcyk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEBwYXJhbSB7YW55fSBfb3B0aW9uc1xuICovXG4gIGNvbnN0IG1ha2VTdWJab25lID0gKGxhYmVsLCBfb3B0aW9ucykgPT5cbiAgICBtYWtlSGVhcFpvbmUoYCR7YmFzZUxhYmVsfS4ke2xhYmVsfWApO1xuXG4gIHJldHVybiBGYXIoJ2hlYXBab25lJywge1xuICAgIGV4bzogd3JhcFByb3ZpZGVyKG1ha2VFeG8sIGtleXMuZXhvKSxcbiAgICBleG9DbGFzczogd3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzLCBrZXlzLmV4b0NsYXNzKSxcbiAgICBleG9DbGFzc0tpdDogd3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzS2l0LCBrZXlzLmV4b0NsYXNzS2l0KSxcbiAgICBzdWJab25lOiB3cmFwUHJvdmlkZXIobWFrZVN1YlpvbmUpLFxuXG4gICAgbWFrZU9uY2UsXG4gICAgd2F0Y2hQcm9taXNlLFxuICAgIGRldGFjaGVkOiBkZXRhY2hlZEhlYXBTdG9yZXMuZGV0YWNoZWQsXG4gICAgaXNTdG9yYWJsZTogZGV0YWNoZWRIZWFwU3RvcmVzLmlzU3RvcmFibGUsXG5cbiAgICBtYXBTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5tYXBTdG9yZSksXG4gICAgc2V0U3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMuc2V0U3RvcmUpLFxuICAgIHdlYWtNYXBTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrTWFwU3RvcmUpLFxuICAgIHdlYWtTZXRTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrU2V0U3RvcmUpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VIZWFwWm9uZShtYWtlSGVhcFpvbmUpO1xuaGFyZGVuKG1ha2VIZWFwWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSGVhcFpvbmUiOlsibWFrZUhlYXBab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABVusfp5AgAAeQIAACUAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZXhwb3J0cy5qcyIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyIsIi4vaXMtcGFzc2FibGUuanMiLCIuL2tleXMuanMiLCIuL21ha2Utb25jZS5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2V4cG9ydHMuanNcIiwgW11dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtdXSxbXCIuL2tleXMuanNcIiwgW11dLFtcIi4vaXMtcGFzc2FibGUuanNcIiwgW11dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAtTNWRIQMAACEDAAArAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pcy1wYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiaXNQYXNzYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHJlYWxJc1Bhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKHJlYWxJc1Bhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBJbXBvcnQgYGlzUGFzc2FibGVgIGRpcmVjdGx5IGZyb20gYEBlbmRvL3Bhc3Mtc3R5bGVgXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtzcGVjaW1lbiBpcyBQYXNzYWJsZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGUgPSBzcGVjaW1lbiA9PiByZWFsSXNQYXNzYWJsZShzcGVjaW1lbik7JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbBWnPyIEAAAiBAAAJAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMva2V5cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWdvcmljVmF0RGF0YUtleXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXlNYWtlcnN9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgKi9cbmNvbnN0IGtpbmQgPSBsYWJlbCA9PiBgJHtsYWJlbH1fa2luZEhhbmRsZWA7XG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgKi9cbmNvbnN0IHNpbmdsZXRvbiA9IGxhYmVsID0+IGAke2xhYmVsfV9zaW5nbGV0b25gO1xuXG4vKipcbiAqIEtleU1ha2VycyBjb21wYXRpYmxlIHdpdGggYEBhZ29yaWMvdmF0LWRhdGFgLlxuICpcbiAqIEB0eXBlIHtLZXlNYWtlcnN9XG4gKi9cbiAgICAgICBjb25zdCBhZ29yaWNWYXREYXRhS2V5cyA9IHtcbiAgZXhvQ2xhc3M6IGxhYmVsID0+IGhhcmRlbihba2luZChsYWJlbCldKSxcbiAgZXhvQ2xhc3NLaXQ6IGxhYmVsID0+IGhhcmRlbihba2luZChsYWJlbCldKSxcbiAgZXhvOiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpLCBzaW5nbGV0b24obGFiZWwpXSksXG4gIHN0b3JlOiBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSksXG4gIHpvbmU6IGxhYmVsID0+IGhhcmRlbihbbGFiZWxdKSxcbn07JGjNj19vbmNlLmFnb3JpY1ZhdERhdGFLZXlzKGFnb3JpY1ZhdERhdGFLZXlzKTtcbmhhcmRlbihhZ29yaWNWYXREYXRhS2V5cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhZ29yaWNWYXREYXRhS2V5cyI6WyJhZ29yaWNWYXREYXRhS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpG42q+g4AAPoOAAApAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9tYWtlLW9uY2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZU9uY2VLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtTdG9yZXN9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqL1xuXG4vKiogQHBhcmFtIHtzdHJpbmd9IGxhYmVsICovXG5jb25zdCBkZWZhdWx0TGFiZWxUb0tleXMgPSBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSk7XG5oYXJkZW4oZGVmYXVsdExhYmVsVG9LZXlzKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVidWdOYW1lIE9ubHkgdXNlZCBpbnRlcm5hbGx5IGZvciBkaWFnbm9zdGljcywgbm90IGF2YWlsYWJsZSB0byB1c2VyIGNvZGVcbiAqIEBwYXJhbSB7U3RvcmVzfSBzdG9yZXNcbiAqIEBwYXJhbSB7TWFwU3RvcmU8c3RyaW5nLCBhbnk+fSBbYmFja2luZ1N0b3JlXVxuICovXG4gICAgICAgY29uc3QgbWFrZU9uY2VLaXQgPSAoZGVidWdOYW1lLCBzdG9yZXMsIGJhY2tpbmdTdG9yZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAvKiBXZSBuZWVkIGEgZGV0YWNoZWQgc2V0U3RvcmUgc28gdGhhdCBpdCBpc24ndCBwZXJzaXN0ZWQgYXMgcGFydCBvZiB0aGUgem9uZS4qL1xuICAvKiBUaGF0IHdheSwgb3VyIHVzZWRLZXlzIGFyZSBvbmx5IHRyYWNrZWQgZm9yIHRoZSBjdXJyZW50IGluY2FybmF0aW9uLCB3aGljaCovXG4gIC8qIGlzIHdoYXQgd2Ugd2FudC4gIFVzaW5nIGBkZWJ1Z05hbWVgIGluIHRoZSBsYWJlbCBpcyBnb29kIGZvciBkaWFnbm9zdGljcywqL1xuICAvKiBhbmQgc2luY2UgaXQgaXMgb25seSBmb3IgYSBkZXRhY2hlZCBzdG9yZSwgaXQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIHRvIHRoZSovXG4gIC8qIGJhY2tpbmcgc3RvcmUuKi9cbiAgY29uc3QgdXNlZEtleXMgPSBzdG9yZXMuZGV0YWNoZWQoKS5zZXRTdG9yZShgJHtkZWJ1Z05hbWV9IHVzZWQga2V5c2ApO1xuXG4gIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG4gIGNvbnN0IGFzc2VydE9ubHlPbmNlID0ga2V5ID0+IHtcbiAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCBGYWlsYGtleSAke2tleX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgIXVzZWRLZXlzLmhhcyhrZXkpIHx8XG4gICAgICBGYWlsYGtleSAke2tleX0gaGFzIGFscmVhZHkgYmVlbiB1c2VkIGluIHRoaXMgem9uZSBhbmQgaW5jYXJuYXRpb25gO1xuXG4gICAgLyogTWFyayB0aGlzIGtleSBhcyB1c2VkLiAgV2UgbWFrZSBubyBhdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBpbnZhbGlkIG1ha2VycyovXG4gICAgLyogb3IgYmFja2luZ1N0b3Jlcy4qL1xuICAgIHVzZWRLZXlzLmFkZChrZXkpO1xuICB9O1xuXG4gIC8qKlxuICogRW5zdXJlIHRoZSB3cmFwcGVkIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIGluY2FybmF0aW9uLiAgSXQgaXNcbiAqIGV4cGVjdGVkIHRvIHVwZGF0ZSB0aGUgYmFja2luZyBzdG9yZSBkaXJlY3RseS5cbiAqXG4gKiBAdGVtcGxhdGUgeyhrZXk6IHN0cmluZywgLi4ucmVzdDogYW55W10pID0+IGFueX0gVFxuICogQHBhcmFtIHtUfSBwcm92aWRlclxuICogQHBhcmFtIHsobGFiZWw6IHN0cmluZykgPT4gc3RyaW5nW119IFtsYWJlbFRvS2V5c11cbiAqIEByZXR1cm5zIHtUfVxuICovXG4gIGNvbnN0IHdyYXBQcm92aWRlciA9IChwcm92aWRlciwgbGFiZWxUb0tleXMgPSBkZWZhdWx0TGFiZWxUb0tleXMpID0+IHtcbiAgICAvKiogQHR5cGUgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBSZXR1cm5UeXBlPFQ+fSAqL1xuICAgIGNvbnN0IHdyYXBwZXIgPSAobGFiZWwsIC4uLnJlc3QpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGxhYmVsVG9LZXlzKGxhYmVsKSkge1xuICAgICAgICBhc3NlcnRPbmx5T25jZShrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3ZpZGVyKGxhYmVsLCAuLi5yZXN0KTtcbiAgICB9O1xuICAgIHJldHVybiAvKiogQHR5cGUge1R9ICovICh3cmFwcGVyKTtcbiAgfTtcblxuICAvKipcbiAqIFRoZSBiZXN0IHdheSB0byB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIGBtYWtlT25jZWAgaXMgdG8gZmlyc3QgdW5kZXJzdGFuZFxuICogd2hhdCBgbWFrZU9uY2VgIGRvZXMgb24gYSBkdXJhYmxlIHpvbmUuIFVzZWQgY29ycmVjdGx5LCBgbWFrZU9uY2VgIHNob3VsZCBvbmx5XG4gKiBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIG9uIGFueSB6b25lLGtleSBwYWlyIGR1cmluZyBhbnkgdmF0IGluY2FybmF0aW9uLlxuICogR2l2ZW4gdGhhdCBjb25zdHJhaW50LCBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgdmFsdWUgYm91bmQgdG8gdGhhdFxuICogem9uZSxrZXkgcGFpciwgaXQgbXVzdCBoYXZlIGJlZW4gbGVmdCB0aGVyZSBieSBhIHByZXZpb3VzIGluY2FybmF0aW9uIGFuZFxuICogYG1ha2VPbmNlYCB3aWxsIHNpbXBseSByZXR1cm4gaXQuIElmIG5vdCwgdGhlbiBgbWFrZXIoa2V5KWAgaXMgY2FsbGVkIHRvXG4gKiBkZXRlcm1pbmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhhdCBzbG90LCB3aGljaCB3aWxsIG5vcm1hbGx5IGJlIHByZXNlcnZlZFxuICogYnkgc2ltaWxhciBjYWxscyB0byBgbWFrZU9uY2VgIGluIGZ1dHVyZSBpbmNhcm5hdGlvbnMgLS0tIHRob3VnaCB0aGF0IHdpbGwgYmVcbiAqIHVwIHRvIHRoZW0uXG4gKlxuICogQWxzbyBlbnN1cmVzIHRoZSBtYWtlciByZXR1cm5zIGEgc3RvcmFibGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHN0cmluZyBuYW1lIG9mIHRoZSBab25lIHNsb3QgdG8gcHJvdmlkZS5cbiAqIEBwYXJhbSB7KGtleTogc3RyaW5nKSA9PiBWfSBtYWtlciBDYWxsZWQgdG8gY3JlYXRlIGEgZnJlc2ggdmFsdWUgdG8gZmlsbCBhbiBlbXB0eSBzbG90LlxuICogQHJldHVybnMge1Z9IFRoZSB2YWx1ZSBvZiB0aGUga2V5J3Mgc2xvdC5cbiAqL1xuICBjb25zdCBtYWtlT25jZSA9IChrZXksIG1ha2VyKSA9PiB7XG4gICAgYXNzZXJ0T25seU9uY2Uoa2V5KTtcbiAgICBpZiAoYmFja2luZ1N0b3JlICYmIGJhY2tpbmdTdG9yZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGJhY2tpbmdTdG9yZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBtYWtlcihrZXkpO1xuICAgIHN0b3Jlcy5pc1N0b3JhYmxlKHZhbHVlKSB8fFxuICAgICAgRmFpbGBtYWtlciByZXR1cm4gdmFsdWUgJHt2YWx1ZX0gaXMgbm90IHN0b3JhYmxlYDtcbiAgICBiYWNraW5nU3RvcmUgJiYgYmFja2luZ1N0b3JlLmluaXQoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0pO1xufTskaM2PX29uY2UubWFrZU9uY2VLaXQobWFrZU9uY2VLaXQpO1xuaGFyZGVuKG1ha2VPbmNlS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPbmNlS2l0IjpbIm1ha2VPbmNlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGC/2hirDQAAqw0AAC0AAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3dhdGNoLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiLCJQcm9taXNlV2F0Y2hlckhhbmRsZXIiLCJQcm9taXNlV2F0Y2hlckkiLCJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTSxFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIEEgUHJvbWlzZVdhdGNoZXIgbWV0aG9kIGd1YXJkIGNhbGxhYmxlIHdpdGggb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybmluZyB2b2lkLlxuICovXG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJIYW5kbGVyID0gTS5jYWxsKE0ucmF3KCkpLnJlc3QoTS5yYXcoKSkucmV0dXJucygpO1xuXG4vKipcbiAqIEEgUHJvbWlzZVdhdGNoZXIgaW50ZXJmYWNlIHRoYXQgaGFzIGJvdGggb25GdWxmaWxsZWQgYW5kIG9uUmVqZWN0ZWQgaGFuZGxlcnMuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJIYW5kbGVyKFByb21pc2VXYXRjaGVySGFuZGxlcik7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyJywge1xuICBvbkZ1bGZpbGxlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxuICBvblJlamVjdGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG59KTtcblxuLyoqXG4gKiBBIFByb21pc2VXYXRjaGVyIGludGVyZmFjZSB0aGF0IGhhcyBvbmx5IGFuIG9uRnVsZmlsbGVkIGhhbmRsZXIuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJJKFByb21pc2VXYXRjaGVySSk7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyRnVsZmlsbGVkJywge1xuICBvbkZ1bGZpbGxlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qKlxuICogQSBQcm9taXNlV2F0Y2hlciBpbnRlcmZhY2UgdGhhdCBoYXMgb25seSBhbiBvblJlamVjdGVkIGhhbmRsZXIuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJKFByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSk7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJSZWplY3RlZCcsIHtcbiAgb25SZWplY3RlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJvbWlzZVdhdGNoZXJcbiAqIEBwcm9wZXJ0eSB7KGZ1bGZpbG1lbnQ6IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZH0gW29uRnVsZmlsbGVkXVxuICogQHByb3BlcnR5IHsocmVhc29uOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWR9IFtvblJlamVjdGVkXVxuICovXG5cbi8qKlxuICogQWRhcHQgYSBwcm9taXNlIHdhdGNoZXIgbWV0aG9kIHRvIEUud2hlbi5cbiAqIEBwYXJhbSB7UmVjb3JkPFByb3BlcnR5S2V5LCAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duPn0gdGhhdFxuICogQHBhcmFtIHtQcm9wZXJ0eUtleX0gcHJvcFxuICogQHBhcmFtIHt1bmtub3duW119IHBvc3RBcmdzXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkoUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkpO1xuY29uc3QgY2FsbE1lTWF5YmUgPSAodGhhdCwgcHJvcCwgcG9zdEFyZ3MpID0+IHtcbiAgY29uc3QgZm4gPSB0aGF0W3Byb3BdO1xuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBhc3NlcnQudHlwZW9mKGZuLCAnZnVuY3Rpb24nKTtcbiAgLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZyB2YWx1ZSBvciByZWFzb25cbiAqL1xuICBjb25zdCB3cmFwcGVkID0gYXJnID0+IHtcbiAgICAvKiBEb24ndCByZXR1cm4gYSB2YWx1ZSwgdG8gcHJldmVudCBFLndoZW4gZnJvbSBzdWJzY3JpYmluZyB0byBhIHJlc3VsdGluZyovXG4gICAgLyogcHJvbWlzZS4qL1xuICAgIGFwcGx5KGZuLCB0aGF0LCBbYXJnLCAuLi5wb3N0QXJnc10pO1xuICB9O1xuICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbi8qKlxuICogU2hpbSB0aGUgcHJvbWlzZSB3YXRjaGVyIGJlaGF2aW91ciB3aGVuIFZhdERhdGEud2F0Y2hQcm9taXNlIGlzIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtQcm9taXNlPGFueT59IHBcbiAqIEBwYXJhbSB7UHJvbWlzZVdhdGNoZXJ9IHdhdGNoZXJcbiAqIEBwYXJhbSB7Li4udW5rbm93bn0gd2F0Y2hlckFyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgICAgY29uc3Qgd2F0Y2hQcm9taXNlID0gKHAsIHdhdGNoZXIsIC4uLndhdGNoZXJBcmdzKSA9PiB7XG4gIFByb21pc2UucmVzb2x2ZShwKSA9PT0gcCB8fCBGYWlsYHdhdGNoUHJvbWlzZSBvbmx5IHdhdGNoZXMgcHJvbWlzZXNgO1xuICBjb25zdCBvbkZ1bGZpbGxlZCA9IGNhbGxNZU1heWJlKHdhdGNoZXIsICdvbkZ1bGZpbGxlZCcsIHdhdGNoZXJBcmdzKTtcbiAgY29uc3Qgb25SZWplY3RlZCA9IGNhbGxNZU1heWJlKHdhdGNoZXIsICdvblJlamVjdGVkJywgd2F0Y2hlckFyZ3MpO1xuICBvbkZ1bGZpbGxlZCB8fFxuICAgIG9uUmVqZWN0ZWQgfHxcbiAgICBGYWlsYHByb21pc2Ugd2F0Y2hlciBtdXN0IGltcGxlbWVudCBhdCBsZWFzdCBvbmUgaGFuZGxlciBtZXRob2RgO1xuICB2b2lkIEUud2hlbihwLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG59OyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTtcbmhhcmRlbih3YXRjaFByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIjpbIlByb21pc2VXYXRjaGVySGFuZGxlciJdLCJQcm9taXNlV2F0Y2hlckkiOlsiUHJvbWlzZVdhdGNoZXJJIl0sIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiXSwiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiOlsiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADhg52A5zwAAOc8AAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLHBhc3NTdHlsZU9mLGFzc2VydFJlbW90YWJsZSxhc3NlcnRSZWNvcmQsTSxtYXRjaGVzLG5hdE1hdGhIZWxwZXJzLHNldE1hdGhIZWxwZXJzLGNvcHlTZXRNYXRoSGVscGVycyxjb3B5QmFnTWF0aEhlbHBlcnM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZW1vdGFibGVcIixbJGjNj19hID0+IChhc3NlcnRSZW1vdGFibGUgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJuYXRNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChzZXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5U2V0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChjb3B5U2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weUJhZ01hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvcHlCYWcsIENvcHlTZXR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge0Ftb3VudCwgQW1vdW50VmFsdWUsIEFzc2V0VmFsdWVGb3JLaW5kLCBCcmFuZCwgQ29weUJhZ0Ftb3VudCwgQ29weVNldEFtb3VudCwgTWF0aEhlbHBlcnMsIE5hdEFtb3VudCwgTmF0VmFsdWUsIFNldEFtb3VudCwgU2V0VmFsdWV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qIE5COiBBc3NldEtpbmQgaXMgYm90aCBhIGNvbnN0YW50IGZvciBlbnVtZXJhdGVkIHZhbHVlcyBhbmQgYSB0eXBlIGZvciB0aG9zZSB2YWx1ZXMuKi9cbi8qKlxuICogQ29uc3RhbnRzIGZvciB0aGUga2luZHMgb2YgYXNzZXRzIHdlIHN1cHBvcnQuXG4gKlxuICogQGVudW0geyh0eXBlb2YgQXNzZXRLaW5kKVtrZXlvZiB0eXBlb2YgQXNzZXRLaW5kXX1cbiAqL1xuICAgICAgIGNvbnN0IEFzc2V0S2luZCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIE5BVDogJ25hdCcsXG4gIFNFVDogJ3NldCcsXG4gIENPUFlfU0VUOiAnY29weVNldCcsXG4gIENPUFlfQkFHOiAnY29weUJhZycsXG59KTskaM2PX29uY2UuQXNzZXRLaW5kKEFzc2V0S2luZCk7XG5oYXJkZW4oQXNzZXRLaW5kKTtcbmNvbnN0IGFzc2V0S2luZE5hbWVzID0gaGFyZGVuKE9iamVjdC52YWx1ZXMoQXNzZXRLaW5kKS5zb3J0KCkpO1xuXG4vKiogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBSyAqL1xuICAgICAgIGNvbnN0IGFzc2VydEFzc2V0S2luZCA9IGFsbGVnZWRBSyA9PiB7XG4gIGFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSykgfHxcbiAgICBGYWlsYFRoZSBhc3NldEtpbmQgJHthbGxlZ2VkQUt9IG11c3QgYmUgb25lIG9mICR7cShhc3NldEtpbmROYW1lcyl9YDtcbn07JGjNj19vbmNlLmFzc2VydEFzc2V0S2luZChhc3NlcnRBc3NldEtpbmQpO1xuaGFyZGVuKGFzc2VydEFzc2V0S2luZCk7XG5cbi8qKlxuICogQW1vdW50cyBkZXNjcmliZSBkaWdpdGFsIGFzc2V0cy4gRnJvbSBhbiBhbW91bnQsIHlvdSBjYW4gbGVhcm4gdGhlIGJyYW5kIG9mXG4gKiBkaWdpdGFsIGFzc2V0IGFzIHdlbGwgYXMgXCJob3cgbXVjaFwiIG9yIFwiaG93IG1hbnlcIi4gQW1vdW50cyBoYXZlIHR3byBwYXJ0czogYVxuICogYnJhbmQgKGxvb3NlbHkgc3BlYWtpbmcsIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQpIGFuZCB0aGUgdmFsdWUgKHRoZSBhbnN3ZXJcbiAqIHRvIFwiaG93IG11Y2hcIikuIEZvciBleGFtcGxlLCBpbiB0aGUgcGhyYXNlIFwiNSBidWNrc1wiLCBcImJ1Y2tzXCIgdGFrZXMgdGhlIHJvbGVcbiAqIG9mIHRoZSBicmFuZCBhbmQgdGhlIHZhbHVlIGlzIDUuIEFtb3VudHMgY2FuIGRlc2NyaWJlIGZ1bmdpYmxlIGFuZFxuICogbm9uLWZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzLiBBbW91bnRzIGFyZSBwYXNzLWJ5LWNvcHkgYW5kIGNhbiBiZSBtYWRlIGJ5IGFuZFxuICogc2VudCB0byBhbnlvbmUuXG4gKlxuICogVGhlIGlzc3VlciBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzb3VyY2Ugb2YgdGhlIGFtb3VudCBpbiBwYXltZW50cyBhbmQgcHVyc2VzLlxuICogVGhlIGlzc3VlciBtdXN0IGJlIGFibGUgdG8gZG8gdGhpbmdzIHN1Y2ggYXMgYWRkIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2VcbiAqIGFuZCB3aXRoZHJhdyBkaWdpdGFsIGFzc2V0cyBmcm9tIGEgcHVyc2UuIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZFxuICogYW5kIHN1YnRyYWN0IGRpZ2l0YWwgYXNzZXRzLiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sXG4gKiB3ZSBjaG9zZSB0byBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpY1xuICogZnVuY3Rpb25zLCB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mIGFzc2V0IHdlXG4gKiBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZSBgYnJhbmRgLCB0aGUgdW5pcXVlXG4gKiBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZiB0aGUgd3JvbmcgYnJhbmQgaXMgdXNlZCBpblxuICogQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGUgb3BlcmF0aW9uIGRvZXMgbm90IHN1Y2NlZWQuXG4gKlxuICogQW1vdW50TWF0aCB1c2VzIG1hdGhIZWxwZXJzIHRvIGRvIG1vc3Qgb2YgdGhlIHdvcmssIGJ1dCB0aGVuIGFkZHMgdGhlIGJyYW5kXG4gKiB0byB0aGUgcmVzdWx0LiBUaGUgZnVuY3Rpb24gYHZhbHVlYCBnZXRzIHRoZSB2YWx1ZSBmcm9tIHRoZSBhbW91bnQgYnlcbiAqIHJlbW92aW5nIHRoZSBicmFuZCAoYW1vdW50IC0+IHZhbHVlKSwgYW5kIHRoZSBmdW5jdGlvbiBgbWFrZWAgYWRkcyB0aGUgYnJhbmRcbiAqIHRvIHByb2R1Y2UgYW4gYW1vdW50ICh2YWx1ZSAtPiBhbW91bnQpLiBUaGUgZnVuY3Rpb24gYGNvZXJjZWAgdGFrZXMgYW4gYW1vdW50XG4gKiBhbmQgY2hlY2tzIGl0LCByZXR1cm5pbmcgYW4gYW1vdW50IChhbW91bnQgLT4gYW1vdW50KS5cbiAqXG4gKiBFYWNoIGlzc3VlciBvZiBkaWdpdGFsIGFzc2V0cyBoYXMgYW4gYXNzb2NpYXRlZCBicmFuZCBpbiBhIG9uZS10by1vbmVcbiAqIG1hcHBpbmcuIEluIHVudHJ1c3RlZCBjb250ZXh0cywgc3VjaCBhcyBpbiBhbmFseXppbmcgcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlXG4gKiBjYW4gZ2V0IHRoZSBicmFuZCBhbmQgZmluZCB0aGUgaXNzdWVyIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZFxuICogdGhlIGJyYW5kIG11dHVhbGx5IHZhbGlkYXRlIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycyA9IHtcbiAgbmF0OiBuYXRNYXRoSGVscGVycyxcbiAgc2V0OiBzZXRNYXRoSGVscGVycyxcbiAgY29weVNldDogY29weVNldE1hdGhIZWxwZXJzLFxuICBjb3B5QmFnOiBjb3B5QmFnTWF0aEhlbHBlcnMsXG59O1xuXG4vKiogQHR5cGUgeyh2YWx1ZTogdW5rbm93bikgPT4gJ25hdCcgfCAnc2V0JyB8ICdjb3B5U2V0JyB8ICdjb3B5QmFnJ30gfSAqL1xuY29uc3QgYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQgPSB2YWx1ZSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbHVlKTtcbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gJ25hdCc7XG4gIH1cbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKG1hdGNoZXModmFsdWUsIE0uc2V0KCkpKSB7XG4gICAgcmV0dXJuICdjb3B5U2V0JztcbiAgfVxuICBpZiAobWF0Y2hlcyh2YWx1ZSwgTS5iYWcoKSkpIHtcbiAgICByZXR1cm4gJ2NvcHlCYWcnO1xuICB9XG4gIC8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4gIC8qIGlzICd0YWdnZWQnLiBXZSB3b3VsZCBuZWVkIHRvIGRpc3Rpbmd1aXNoIHdoYXQga2luZCBvZiB0YWdnZWQqL1xuICAvKiBvYmplY3QgaXQgaXMuKi9cbiAgLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbiAgLyogKFRPRE8pIHdpbGwgZW5jb3VudGVyIHdoZW4gd2UgZXh0ZW5kIHRoZSBtYXRoIGhlbHBlcnMgZnVydGhlci4qL1xuICB0aHJvdyBGYWlsYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxuICAgIHBhc3NTdHlsZSxcbiAgKX1gO1xufTtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdmFsdWUgaXMgYSB2YWxpZCBBbW91bnRNYXRoIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBoZWxwZXJzLlxuICpcbiAqIE1hZGUgYXZhaWxhYmxlIG9ubHkgZm9yIHRlc3RpbmcsIGJ1dCBpdCBpcyBoYXJtbGVzcyBmb3Igb3RoZXIgdXNlcy5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAcGFyYW0ge1Z9IHZhbHVlXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Vj59XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRWYWx1ZUdldEhlbHBlcnMgPSB2YWx1ZSA9PlxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICBoZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qKlxuICogQHR5cGUgeyhhbGxlZ2VkQnJhbmQ6IEJyYW5kPGFueT4sIGJyYW5kPzogQnJhbmQ8YW55PikgPT4gdm9pZH1cbiAqLyRozY9fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjayA9IChhbGxlZ2VkQnJhbmQsIGJyYW5kKSA9PiB7XG4gIGlmIChicmFuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBhbGxlZ2VkQnJhbmQgPT09IGJyYW5kIHx8XG4gICAgICBGYWlsYGFtb3VudCdzIGJyYW5kICR7cShhbGxlZ2VkQnJhbmQpfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGJyYW5kICR7cShcbiAgICAgICAgYnJhbmQsXG4gICAgICApfWA7XG4gIH1cbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz4gfCB1bmRlZmluZWR9IGJyYW5kXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8YW55Pn1cbiAqL1xuY29uc3QgY2hlY2tMUkFuZEdldEhlbHBlcnMgPSAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gIGFzc2VydFJlY29yZChsZWZ0QW1vdW50LCAnbGVmdEFtb3VudCcpO1xuICBhc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsICdyaWdodEFtb3VudCcpO1xuICBjb25zdCB7IHZhbHVlOiBsZWZ0VmFsdWUsIGJyYW5kOiBsZWZ0QnJhbmQgfSA9IGxlZnRBbW91bnQ7XG4gIGNvbnN0IHsgdmFsdWU6IHJpZ2h0VmFsdWUsIGJyYW5kOiByaWdodEJyYW5kIH0gPSByaWdodEFtb3VudDtcbiAgYXNzZXJ0UmVtb3RhYmxlKGxlZnRCcmFuZCwgJ2xlZnRCcmFuZCcpO1xuICBhc3NlcnRSZW1vdGFibGUocmlnaHRCcmFuZCwgJ3JpZ2h0QnJhbmQnKTtcbiAgb3B0aW9uYWxCcmFuZENoZWNrKGxlZnRCcmFuZCwgYnJhbmQpO1xuICBvcHRpb25hbEJyYW5kQ2hlY2socmlnaHRCcmFuZCwgYnJhbmQpO1xuICBsZWZ0QnJhbmQgPT09IHJpZ2h0QnJhbmQgfHxcbiAgICBGYWlsYEJyYW5kcyBpbiBsZWZ0ICR7cShsZWZ0QnJhbmQpfSBhbmQgcmlnaHQgJHtxKFxuICAgICAgcmlnaHRCcmFuZCxcbiAgICApfSBzaG91bGQgbWF0Y2ggYnV0IGRvIG5vdGA7XG4gIGNvbnN0IGxlZnRIZWxwZXJzID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGxlZnRWYWx1ZSk7XG4gIGNvbnN0IHJpZ2h0SGVscGVycyA9IGFzc2VydFZhbHVlR2V0SGVscGVycyhyaWdodFZhbHVlKTtcbiAgbGVmdEhlbHBlcnMgPT09IHJpZ2h0SGVscGVycyB8fFxuICAgIEZhaWxgVGhlIGxlZnQgJHtsZWZ0QW1vdW50fSBhbmQgcmlnaHQgYW1vdW50ICR7cmlnaHRBbW91bnR9IGhhZCBkaWZmZXJlbnQgYXNzZXRLaW5kc2A7XG4gIHJldHVybiBsZWZ0SGVscGVycztcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7TWF0aEhlbHBlcnM8QXNzZXRWYWx1ZUZvcktpbmQ8Sz4+fSBoXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcmV0dXJucyB7W0Fzc2V0VmFsdWVGb3JLaW5kPEs+LCBBc3NldFZhbHVlRm9yS2luZDxLPl19XG4gKi9cbmNvbnN0IGNvZXJjZUxSID0gKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSA9PiB7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgYXJiaXRyYXJ5IHN1YnR5cGUqL1xuICByZXR1cm4gW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksIGguZG9Db2VyY2UocmlnaHRBbW91bnQudmFsdWUpXTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmlnaHRBbW91bnQuXG4gKiBUaGUgbm90aW9uIG9mIFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXCIgZGVwZW5kcyBvbiB0aGUga2luZCBvZiBhbW91bnQsIGFzXG4gKiBkZWZpbmVkIGJ5IHRoZSBNYXRoSGVscGVycy4gRm9yIGV4YW1wbGUsIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaXMgZ3JlYXRlciB0aGFuXG4gKiByZWN0YW5nbGUgQiBkZXBlbmRzIG9uIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaW5jbHVkZXMgcmVjdGFuZ2xlIEIgYXMgZGVmaW5lZCBieVxuICogdGhlIGxvZ2ljIGluIE1hdGhIZWxwZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNHVEUgPSAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICByZXR1cm4gaC5kb0lzR1RFKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG59O1xuXG4vKipcbiAqIExvZ2ljIGZvciBtYW5pcHVsYXRpbmcgYW1vdW50cy5cbiAqXG4gKiBBbW91bnRzIGFyZSB0aGUgY2Fub25pY2FsIGRlc2NyaXB0aW9uIG9mIHRyYWRhYmxlIGdvb2RzLiBUaGV5IGFyZSBtYW5pcHVsYXRlZFxuICogYnkgaXNzdWVycyBhbmQgbWludHMsIGFuZCByZXByZXNlbnQgdGhlIGdvb2RzIGFuZCBjdXJyZW5jeSBjYXJyaWVkIGJ5IHB1cnNlc1xuICogYW5kIHBheW1lbnRzLiBUaGV5IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGluZ3MgbGlrZSBjdXJyZW5jeSwgc3RvY2ssIGFuZFxuICogdGhlIGFic3RyYWN0IHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBleGNoYW5nZS5cbiAqL1xuICAgICAgIGNvbnN0IEFtb3VudE1hdGggPSB7XG4gIC8qIFRPRE8gdXNlIG92ZXJsb2FkaW5nIHRvIGhhbmRsZSB3aGVuIEJyYW5kIGhhcyBhbiBBc3NldEtpbmQgYW5kIHdoZW4gaXQgZG9lc24ndC4qL1xuICAvKiBhIEFtb3VudEZvclZhbHVlIHV0aWxpdHkgY291bGQgaGVscCBEUlkgdGhvc2UgY2FzZXMuKi9cbiAgLyoqXG4gKiBNYWtlIGFuIGFtb3VudCBmcm9tIGEgdmFsdWUgYnkgYWRkaW5nIHRoZSBicmFuZC5cbiAqXG4gKiBEb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGUgQnJhbmQncyBBc3NldEtpbmQgbWF0Y2hlcyB0aGUgdmFsdWUncy5cbiAqXG4gKiBAdGVtcGxhdGUge0JyYW5kPGFueT59IEJcbiAqIEB0ZW1wbGF0ZSB7TmF0VmFsdWUgfCBDb3B5U2V0IHwgQ29weUJhZyB8IFNldFZhbHVlfSBWXG4gKiBAcGFyYW0ge0J9IGJyYW5kXG4gKiBAcGFyYW0ge1Z9IGFsbGVnZWRWYWx1ZVxuICogQHJldHVybnMge0IgZXh0ZW5kcyBCcmFuZDwnbmF0Jz5cbiAqICAgICA/IE5hdEFtb3VudFxuICogICAgIDogViBleHRlbmRzIE5hdFZhbHVlXG4gKiAgICAgICA/IE5hdEFtb3VudFxuICogICAgICAgOiBWIGV4dGVuZHMgQ29weVNldFxuICogICAgICAgICA/IENvcHlTZXRBbW91bnQ8VlsncGF5bG9hZCddWzBdPlxuICogICAgICAgICA6IFYgZXh0ZW5kcyBDb3B5QmFnXG4gKiAgICAgICAgICAgPyBDb3B5QmFnQW1vdW50PFZbJ3BheWxvYWQnXVswXVswXT5cbiAqICAgICAgICAgICA6IFYgZXh0ZW5kcyBTZXRWYWx1ZVxuICogICAgICAgICAgICAgPyBTZXRBbW91bnQ8VlswXT5cbiAqICAgICAgICAgICAgIDogbmV2ZXJ9XG4gKi9cbiAgbWFrZTogKGJyYW5kLCBhbGxlZ2VkVmFsdWUpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGNvbnN0IGggPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMoYWxsZWdlZFZhbHVlKTtcbiAgICBjb25zdCB2YWx1ZSA9IGguZG9Db2VyY2UoYWxsZWdlZFZhbHVlKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qKlxuICogTWFrZSBzdXJlIHRoaXMgYW1vdW50IGlzIHZhbGlkIGVub3VnaCwgYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgdmFsaWRcbiAqIGFtb3VudCBpZiBzby5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7QX0gYWxsZWdlZEFtb3VudFxuICogQHJldHVybnMge0F9XG4gKi9cbiAgY29lcmNlOiAoYnJhbmQsIGFsbGVnZWRBbW91bnQpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFzc2VydFJlY29yZChhbGxlZ2VkQW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZDogYWxsZWdlZEJyYW5kLCB2YWx1ZTogYWxsZWdlZFZhbHVlIH0gPSBhbGxlZ2VkQW1vdW50O1xuICAgIGJyYW5kID09PSBhbGxlZ2VkQnJhbmQgfHxcbiAgICAgIEZhaWxgVGhlIGJyYW5kIGluIHRoZSBhbGxlZ2VkQW1vdW50ICR7YWxsZWdlZEFtb3VudH0gaW4gJ2NvZXJjZScgZGlkbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgYnJhbmQgJHticmFuZH0uYDtcbiAgICAvKiBXaWxsIHRocm93IG9uIGluYXBwcm9wcmlhdGUgdmFsdWUqL1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gICAgcmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCwgYWxsZWdlZFZhbHVlKTtcbiAgfSxcbiAgLyoqXG4gKiBFeHRyYWN0IGFuZCByZXR1cm4gdGhlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHtBfSBhbW91bnRcbiAqIEByZXR1cm5zIHtBWyd2YWx1ZSddfVxuICovXG4gIGdldFZhbHVlOiAoYnJhbmQsIGFtb3VudCkgPT4gQW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsIGFtb3VudCkudmFsdWUsXG4gIC8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudC4gVGhpcyBpcyB0aGUgaWRlbnRpdHlcbiAqIGVsZW1lbnQgZm9yIE1hdGhIZWxwZXJzLmFkZCBhbmQgTWF0SGVscGVycy5zdWJ0cmFjdC5cbiAqXG4gKiBAdHlwZSB7e1xuICogICAoYnJhbmQ6IEJyYW5kKTogQW1vdW50PCduYXQnPjtcbiAqICAgPEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZDxLPiwgYXNzZXRLaW5kOiBLKTogQW1vdW50PEs+O1xuICogfX1cbiAqL1xuICBtYWtlRW1wdHk6IChicmFuZCwgYXNzZXRLaW5kID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKCduYXQnKSkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoZWxwZXJzW2Fzc2V0S2luZF0uZG9NYWtlRW1wdHkoKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBuYXJyb3dpbmcgZnJvbSBmdW5jdGlvbiBvdmVybG9hZCovXG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LCB1c2luZyBhbm90aGVyIGFtb3VudCBhcyB0aGVcbiAqIHRlbXBsYXRlIGZvciB0aGUgYnJhbmQgYW5kIGFzc2V0S2luZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtBfSBhbW91bnRcbiAqIEByZXR1cm5zIHtBfVxuICovXG4gIG1ha2VFbXB0eUZyb21BbW91bnQ6IGFtb3VudCA9PiB7XG4gICAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICAgIGNvbnN0IHsgYnJhbmQsIHZhbHVlIH0gPSBhbW91bnQ7XG4gICAgY29uc3QgYXNzZXRLaW5kID0gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgZGlmZmVyZW50IHN1YnR5cGUqL1xuICAgIHJldHVybiBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCwgYXNzZXRLaW5kKTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgQW1vdW50IGlzIGVtcHR5LiBPdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgaXNFbXB0eTogKGFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZDogYWxsZWdlZEJyYW5kLCB2YWx1ZSB9ID0gYW1vdW50O1xuICAgIGFzc2VydFJlbW90YWJsZShhbGxlZ2VkQnJhbmQsICdicmFuZCcpO1xuICAgIG9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsIGJyYW5kKTtcbiAgICBjb25zdCBoID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHZhbHVlKTtcbiAgICByZXR1cm4gaC5kb0lzRW1wdHkoaC5kb0NvZXJjZSh2YWx1ZSkpO1xuICB9LFxuICBpc0dURSxcbiAgLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgZXF1YWxzIHRoZSByaWdodEFtb3VudC4gV2UgYXNzdW1lIHRoYXQgaWZcbiAqIGlzR1RFIGlzIHRydWUgaW4gYm90aCBkaXJlY3Rpb25zLCBpc0VxdWFsIGlzIGFsc28gdHJ1ZVxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0F9IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QX0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGlzRXF1YWw6IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgICByZXR1cm4gaC5kb0lzRXF1YWwoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSB1bmlvbiBvZiBib3RoIGxlZnRBbW91bnQgYW5kIHJpZ2h0QW1vdW50LlxuICpcbiAqIEZvciBmdW5naWJsZSBhbW91bnQgdGhpcyBtZWFucyBhZGRpbmcgdGhlIHZhbHVlcy4gRm9yIG90aGVyIGtpbmRzIG9mXG4gKiBhbW91bnQsIGl0IHVzdWFsbHkgbWVhbnMgaW5jbHVkaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSBib3RoIGxlZnQgYW5kXG4gKiByaWdodC5cbiAqXG4gKiBAdHlwZSB7e1xuICogICA8QSBleHRlbmRzIENvcHlCYWcsIEIgZXh0ZW5kcyBDb3B5QmFnPihcbiAqICAgICBsZWZ0QW1vdW50OiBDb3B5QmFnQW1vdW50PEE+LFxuICogICAgIHJpZ2h0QW1vdW50OiBDb3B5QmFnQW1vdW50PEI+LFxuICogICAgIGJyYW5kPzogQnJhbmQsXG4gKiAgICk6IENvcHlCYWdBbW91bnQ8QSB8IEI+O1xuICogICA8QSBleHRlbmRzIEFtb3VudD4obGVmdEFtb3VudDogQSwgcmlnaHRBbW91bnQ6IEEsIGJyYW5kPzogQnJhbmQpOiBBO1xuICogfX1cbiAqL1xuICBhZGQ6IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgICBjb25zdCB2YWx1ZSA9IGguZG9BZGQoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQ6IGxlZnRBbW91bnQuYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIGxlZnRBbW91bnQgbWludXMgdGhlIHJpZ2h0QW1vdW50IChpLmUuXG4gKiBldmVyeXRoaW5nIGluIHRoZSBsZWZ0QW1vdW50IHRoYXQgaXMgbm90IGluIHRoZSByaWdodEFtb3VudCkuIElmIGxlZnRBbW91bnRcbiAqIGRvZXNuJ3QgaW5jbHVkZSByaWdodEFtb3VudCAoc3VidHJhY3Rpb24gcmVzdWx0cyBpbiBhIG5lZ2F0aXZlKSwgdGhyb3cgYW5cbiAqIGVycm9yLiBCZWNhdXNlIHRoZSBsZWZ0IGFtb3VudCBtdXN0IGluY2x1ZGUgdGhlIHJpZ2h0IGFtb3VudCwgdGhpcyBpcyBOT1RcbiAqIGVxdWl2YWxlbnQgdG8gc2V0IHN1YnRyYWN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBMXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gUlxuICogQHBhcmFtIHtMfSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge1J9IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7TCBleHRlbmRzIFIgPyBMIDogbmV2ZXJ9XG4gKi9cbiAgc3VidHJhY3Q6IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgICBjb25zdCB2YWx1ZSA9IGguZG9TdWJ0cmFjdCguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgZGlmZmVyZW50IHN1YnR5cGUqL1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZDogbGVmdEFtb3VudC5icmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJucyB0aGUgbWluIHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0F9IHhcbiAqIEBwYXJhbSB7QX0geVxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0F9XG4gKi9cbiAgbWluOiAoeCwgeSwgYnJhbmQgPSB1bmRlZmluZWQpID0+XG4gICAgaXNHVEUoeCwgeSwgYnJhbmQpXG4gICAgICA/IHlcbiAgICAgIDogaXNHVEUoeSwgeCwgYnJhbmQpXG4gICAgICAgID8geFxuICAgICAgICA6IEZhaWxgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbiAgLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QX0geFxuICogQHBhcmFtIHtBfSB5XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QX1cbiAqL1xuICBtYXg6ICh4LCB5LCBicmFuZCA9IHVuZGVmaW5lZCkgPT5cbiAgICBpc0dURSh4LCB5LCBicmFuZClcbiAgICAgID8geFxuICAgICAgOiBpc0dURSh5LCB4KVxuICAgICAgICA/IHlcbiAgICAgICAgOiBGYWlsYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWAsXG59OyRozY9fb25jZS5BbW91bnRNYXRoKEFtb3VudE1hdGgpO1xuaGFyZGVuKEFtb3VudE1hdGgpO1xuXG4vKiogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAqL1xuICAgICAgIGNvbnN0IGdldEFzc2V0S2luZCA9IGFtb3VudCA9PiB7XG4gIGFzc2VydFJlY29yZChhbW91bnQsICdhbW91bnQnKTtcbiAgY29uc3QgeyB2YWx1ZSB9ID0gYW1vdW50O1xuICByZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xufTskaM2PX29uY2UuZ2V0QXNzZXRLaW5kKGdldEFzc2V0S2luZCk7XG5oYXJkZW4oZ2V0QXNzZXRLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl0sIkFtb3VudE1hdGgiOlsiQW1vdW50TWF0aCJdLCJnZXRBc3NldEtpbmQiOlsiZ2V0QXNzZXRLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF/pvV56BQAAegUAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50U3RvcmUuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIl0sImV4cG9ydHMiOlsibWFrZUFtb3VudFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50TWF0aDskaM2PX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXV0pO1xuXG4vKiogQGltcG9ydCB7QW1vdW50LCBBc3NldEtpbmR9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFtb3VudFN0b3JlXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gZ2V0QW1vdW50XG4gKiBAcHJvcGVydHkgeyhkZWx0YTogQW1vdW50PEs+KSA9PiB2b2lkfSBpbmNyZW1lbnRcbiAqIEBwcm9wZXJ0eSB7KGRlbHRhOiBBbW91bnQ8Sz4pID0+IGJvb2xlYW59IGRlY3JlbWVudFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybnMge0Ftb3VudFN0b3JlPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUFtb3VudFN0b3JlID0gKHN0YXRlLCBrZXkpID0+IHtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgZ2V0QW1vdW50OiAoKSA9PiBzdGF0ZVtrZXldLFxuICAgIGluY3JlbWVudDogZGVsdGEgPT4ge1xuICAgICAgc3RhdGVba2V5XSA9IEFtb3VudE1hdGguYWRkKHN0YXRlW2tleV0sIGRlbHRhKTtcbiAgICB9LFxuICAgIGRlY3JlbWVudDogZGVsdGEgPT4ge1xuICAgICAgaWYgKEFtb3VudE1hdGguaXNHVEUoc3RhdGVba2V5XSwgZGVsdGEpKSB7XG4gICAgICAgIHN0YXRlW2tleV0gPSBBbW91bnRNYXRoLnN1YnRyYWN0KHN0YXRlW2tleV0sIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQW1vdW50U3RvcmUobWFrZUFtb3VudFN0b3JlKTtcbmhhcmRlbihtYWtlQW1vdW50U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFtb3VudFN0b3JlIjpbIm1ha2VBbW91bnRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABDvXvZdAYAAHQGAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbXVzdE1hdGNoLERpc3BsYXlJbmZvU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsWyRozY9fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7QWRkaXRpb25hbERpc3BsYXlJbmZvLCBBc3NldEtpbmQsIERpc3BsYXlJbmZvfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG4vKipcbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBhbGxlZ2VkRGlzcGxheUluZm9cbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEByZXR1cm5zIHtEaXNwbGF5SW5mb31cbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZURpc3BsYXlJbmZvID0gKGFsbGVnZWREaXNwbGF5SW5mbywgYXNzZXRLaW5kKSA9PiB7XG4gIG11c3RNYXRjaChhbGxlZ2VkRGlzcGxheUluZm8sIERpc3BsYXlJbmZvU2hhcGUsICdkaXNwbGF5SW5mbycpO1xuXG4gIGlmIChhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kID09PSBhc3NldEtpbmQgfHxcbiAgICAgIEZhaWxgZGlzcGxheUluZm8uYXNzZXRLaW5kIHdhcyBwcmVzZW50ICgke2FsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmR9KSBhbmQgZGlkIG5vdCBtYXRjaCB0aGUgYXNzZXRLaW5kIGFyZ3VtZW50ICgke2Fzc2V0S2luZH0pYDtcbiAgfVxuICBjb25zdCBkaXNwbGF5SW5mbyA9IGhhcmRlbih7IC4uLmFsbGVnZWREaXNwbGF5SW5mbywgYXNzZXRLaW5kIH0pO1xuXG4gIGlmIChkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBOdW1iZXIuaXNTYWZlSW50ZWdlcihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzKSB8fFxuICAgICAgRmFpbGBkZWNpbWFsUGxhY2VzICR7ZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlc30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYDtcbiAgfVxuXG4gIHJldHVybiBkaXNwbGF5SW5mbztcbn07JGjNj19vbmNlLmNvZXJjZURpc3BsYXlJbmZvKGNvZXJjZURpc3BsYXlJbmZvKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvZXJjZURpc3BsYXlJbmZvIjpbImNvZXJjZURpc3BsYXlJbmZvIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPNfTQNNAgAATQIAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbXV0sW1wiLi9pc3N1ZXJLaXQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABoPpBzxzwAAMc8AAAlAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2lzc3VlcktpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIiwiLi9hbW91bnRNYXRoLmpzIiwiLi9kaXNwbGF5SW5mby5qcyIsIi4vcGF5bWVudExlZGdlci5qcyJdLCJleHBvcnRzIjpbImhhc0lzc3VlciIsIm1ha2VEdXJhYmxlSXNzdWVyS2l0IiwibWFrZUlzc3VlcktpdCIsInByZXBhcmVJc3N1ZXJLaXQiLCJ1cGdyYWRlSXNzdWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0LEZhaWwsYXNzZXJ0UGF0dGVybixtYWtlU2NhbGFyQmlnTWFwU3RvcmUsbWFrZUR1cmFibGVab25lLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8scHJlcGFyZVBheW1lbnRMZWRnZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b25lL2R1cmFibGUuanNcIiwgW1tcIm1ha2VEdXJhYmxlWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VEdXJhYmxlWm9uZSA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoQXNzZXRLaW5kID0gJGjNj19hKV1dLFtcImFzc2VydEFzc2V0S2luZFwiLFskaM2PX2EgPT4gKGFzc2VydEFzc2V0S2luZCA9ICRozY9fYSldXV1dLFtcIi4vZGlzcGxheUluZm8uanNcIiwgW1tcImNvZXJjZURpc3BsYXlJbmZvXCIsWyRozY9fYSA9PiAoY29lcmNlRGlzcGxheUluZm8gPSAkaM2PX2EpXV1dXSxbXCIuL3BheW1lbnRMZWRnZXIuanNcIiwgW1tcInByZXBhcmVQYXltZW50TGVkZ2VyXCIsWyRozY9fYSA9PiAocHJlcGFyZVBheW1lbnRMZWRnZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0tleSwgUGF0dGVybn0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7U2h1dGRvd25XaXRoRmFpbHVyZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC12YXQnO1xuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7QWRkaXRpb25hbERpc3BsYXlJbmZvLCBSZWNvdmVyeVNldHNPcHRpb24sIElzc3VlcktpdCwgUGF5bWVudExlZGdlcn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBkaXNwbGF5SW5mb1xuICogQHByb3BlcnR5IHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqL1xuXG4vKipcbiAqIFVzZWQgX29ubHlfIGludGVybmFsbHksIHRvIG1ha2UgYSBuZXcgaXNzdWVyS2l0IG9yIHRvIHJldml2ZSBhbiBvbGQgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZDxLPn0gaXNzdWVyUmVjb3JkXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSByZWNvdmVyeVNldHNTdGF0ZSBPbWl0dGVkIGZyb20gaXNzdWVyUmVjb3JkXG4gKiAgIGJlY2F1c2UgaXQgd2FzIGFkZGVkIGluIGFuIHVwZ3JhZGUuXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3Qgc2V0dXBJc3N1ZXJLaXQgPSAoXG4gIHsgbmFtZSwgYXNzZXRLaW5kLCBkaXNwbGF5SW5mbywgZWxlbWVudFNoYXBlIH0sXG4gIGlzc3VlclpvbmUsXG4gIHJlY292ZXJ5U2V0c1N0YXRlLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICBhc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcblxuICAvKiBBZGQgYXNzZXRLaW5kIHRvIGRpc3BsYXlJbmZvLCBvciBvdmVycmlkZSBpZiBwcmVzZW50Ki9cbiAgY29uc3QgY2xlYW5EaXNwbGF5SW5mbyA9IGNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLCBhc3NldEtpbmQpO1xuICBpZiAob3B0U2h1dGRvd25XaXRoRmFpbHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlLCAnZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmIChlbGVtZW50U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oZWxlbWVudFNoYXBlKTtcbiAgfVxuXG4gIC8qIEF0dGVudWF0ZSB0aGUgcG93ZXJmdWwgYXV0aG9yaXR5IHRvIG1pbnQgYW5kIGNoYW5nZSBiYWxhbmNlcyovXG4gIC8qKiBAdHlwZSB7UGF5bWVudExlZGdlcjxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgY29uc3QgeyBpc3N1ZXIsIG1pbnQsIGJyYW5kLCBtaW50UmVjb3ZlcnlQdXJzZSB9ID0gcHJlcGFyZVBheW1lbnRMZWRnZXIoXG4gICAgaXNzdWVyWm9uZSxcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBjbGVhbkRpc3BsYXlJbmZvLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICApO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGJyYW5kLFxuICAgIGlzc3VlcixcbiAgICBtaW50LFxuICAgIG1pbnRSZWNvdmVyeVB1cnNlLFxuICAgIGRpc3BsYXlJbmZvOiBjbGVhbkRpc3BsYXlJbmZvLFxuICB9KTtcbn07XG5oYXJkZW4oc2V0dXBJc3N1ZXJLaXQpO1xuXG4vKiogVGhlIGtleSBhdCB3aGljaCB0aGUgaXNzdWVyIHJlY29yZCBpcyBzdG9yZWQuICovXG5jb25zdCBJTlNUQU5DRV9LRVkgPSAnaXNzdWVyJztcbi8qKlxuICogVGhlIGtleSBhdCB3aGljaCB0aGUgaXNzdWVyS2l0J3MgYFJlY292ZXJ5U2V0c09wdGlvbmAgc3RhdGUgaXMgc3RvcmVkLlxuICogSW50cm9kdWNlZCBieSBhbiB1cGdyYWRlLCBzbyBtYXkgYmUgYWJzZW50IG9uIGEgcHJlZGVjZXNzb3IgaW5jYXJuYXRpb24uIFNlZVxuICogYFJlY292ZXJ5U2V0c09wdGlvbmAgZm9yIGRlZmF1bHRpbmcgYmVoYXZpb3IuXG4gKi9cbmNvbnN0IFJFQ09WRVJZX1NFVFNfU1RBVEUgPSAncmVjb3ZlcnlTZXRzU3RhdGUnO1xuXG4vKipcbiAqIFVzZWQgX29ubHlfIHRvIHVwZ3JhZGUgYSBwcmVkZWNlc3NvciBpc3N1ZXJLaXQuIFVzZSBgbWFrZUR1cmFibGVJc3N1ZXJLaXRgIHRvXG4gKiBtYWtlIGEgbmV3IG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtSZWNvdmVyeVNldHNPcHRpb259IFtyZWNvdmVyeVNldHNPcHRpb25dIEFkZGVkIGluIHVwZ3JhZGUsIHNvIGxhc3RcbiAqICAgYW5kIG9wdGlvbmFsLiBTZWUgYFJlY292ZXJ5U2V0c09wdGlvbmAgZm9yIGRlZmF1bHRpbmcgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG4gICAgICAgY29uc3QgdXBncmFkZUlzc3VlcktpdCA9IChcbiAgaXNzdWVyQmFnZ2FnZSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGNvbnN0IGlzc3VlclJlY29yZCA9IGlzc3VlckJhZ2dhZ2UuZ2V0KElOU1RBTkNFX0tFWSk7XG4gIGNvbnN0IGlzc3VlclpvbmUgPSBtYWtlRHVyYWJsZVpvbmUoaXNzdWVyQmFnZ2FnZSk7XG4gIGNvbnN0IG9sZFJlY292ZXJ5U2V0c1N0YXRlID0gaXNzdWVyQmFnZ2FnZS5oYXMoUkVDT1ZFUllfU0VUU19TVEFURSlcbiAgICA/IGlzc3VlckJhZ2dhZ2UuZ2V0KFJFQ09WRVJZX1NFVFNfU1RBVEUpXG4gICAgOiAnaGFzUmVjb3ZlcnlTZXRzJztcbiAgaWYgKFxuICAgIG9sZFJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnICYmXG4gICAgcmVjb3ZlcnlTZXRzT3B0aW9uID09PSAnaGFzUmVjb3ZlcnlTZXRzJ1xuICApIHtcbiAgICBGYWlsYENhbm5vdCAoeWV0PykgdXBncmFkZSBmcm9tICdub1JlY292ZXJ5U2V0cycgdG8gJ2hhc1JlY292ZXJ5U2V0cydgO1xuICB9XG4gIC8qIEV4dGFudCBzZXRzIGFyZSBub3QgY3VycmVudGx5IGRlbGV0ZWQuIElmIHRoZSBuZXcgb3B0aW9uIGlzKi9cbiAgLyogJ25vUmVjb3ZlcnlTZXRzJywgdGhleSB3b24ndCBiZSB1c2VkIGJ1dCBleHRhbnQgb25lcyB3aWxsIHJlbWFpbi4gRnV0dXJlKi9cbiAgLyogdXBncmFkZXMgbWF5IG1ha2UgaXQgcG9zc2libGUgdG8gZGVsZXRlIGVsZW1lbnRzIGZyb20gdGhlbS4qL1xuICBjb25zdCByZWNvdmVyeVNldHNTdGF0ZSA9IHJlY292ZXJ5U2V0c09wdGlvbiB8fCBvbGRSZWNvdmVyeVNldHNTdGF0ZTtcbiAgcmV0dXJuIHNldHVwSXNzdWVyS2l0KFxuICAgIGlzc3VlclJlY29yZCxcbiAgICBpc3N1ZXJab25lLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG59OyRozY9fb25jZS51cGdyYWRlSXNzdWVyS2l0KHVwZ3JhZGVJc3N1ZXJLaXQpO1xuaGFyZGVuKHVwZ3JhZGVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIERvZXMgYmFnZ2FnZSBhbHJlYWR5IGhhdmUgYW4gaXNzdWVyS2l0P1xuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICovXG4gICAgICAgY29uc3QgaGFzSXNzdWVyID0gYmFnZ2FnZSA9PiBiYWdnYWdlLmhhcyhJTlNUQU5DRV9LRVkpO1xuXG4vKipcbiAqIGBlbGVtZW50U2hhcGVgLCBtYXkgb25seSBiZSBwcmVzZW50IGZvciBjb2xsZWN0aW9uLXN0eWxlIGFtb3VudHMuIElmIHByZXNlbnQsXG4gKiBpdCBpcyBhIGBQYXR0ZXJuYCB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgdGhpcyBpc3N1ZXJLaXRzJ3MgYW1vdW50cyBtdXN0XG4gKiBzYXRpc2Z5LiBGb3IgZXhhbXBsZSwgdGhlIFpvZSBJbnZpdGF0aW9uIGlzc3VlcktpdCB1c2VzIGFuIGVsZW1lbnRTaGFwZVxuICogZGVzY3JpYmluZyB0aGUgaW52aXRhdGlvbiBkZXRhaWxzIGZvciBhbiBpbmRpdmlkdWFsIGludml0YXRpb24uIEFuIGludml0YXRpb25cbiAqIHB1cnNlIG9yIHBheW1lbnQgaGFzIGFuIGFtb3VudCB0aGF0IGNhbiBvbmx5IGJlIGEgc2V0IG9mIHRoZXNlLiAoVGhvdWdoXG4gKiB0eXBpY2FsbHksIHRoZSBhbW91bnQgb2YgYW4gaW52aXRhdGlvbiBwYXltZW50IGlzIGEgc2luZ2xldG9uIHNldC4gU3VjaCBhXG4gKiBwYXltZW50IGlzIG9mdGVuIHJlZmVycmVkIHRvIGluIHRoZSBzaW5ndWxhciBhcyBcImFuIGludml0YXRpb25cIi4pXG4gKlxuICogYHJlY292ZXJ5U2V0c09wdGlvbmAgYWRkZWQgaW4gdXBncmFkZS4gTm90ZSB0aGF0IGBJc3N1ZXJPcHRpb25zUmVjb3JkYCBpc1xuICogbmV2ZXIgc3RvcmVkLCBzbyB3ZSBuZXZlciBuZWVkIHRvIHdvcnJ5IGFib3V0IGluaGVyaXRpbmcgb25lIGZyb20gYVxuICogcHJlZGVjZXNzb3IgcHJlZGF0aW5nIHRoZSBpbnRyb2R1Y3Rpb24gb2YgcmVjb3Zlcnkgc2V0cy4gU2VlXG4gKiBgUmVjb3ZlcnlTZXRzT3B0aW9uYCBmb3IgZGVmYXVsdGluZyBiZWhhdmlvci5cbiAqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDx7XG4gKiAgIGVsZW1lbnRTaGFwZTogUGF0dGVybjtcbiAqICAgcmVjb3ZlcnlTZXRzT3B0aW9uOiBSZWNvdmVyeVNldHNPcHRpb247XG4gKiB9Pn0gSXNzdWVyT3B0aW9uc1JlY29yZFxuICovXG5cbi8qKlxuICogVXNlZCBfb25seV8gdG8gbWFrZSBhIF9uZXdfIGR1cmFibGUgaXNzdWVyLCBpLmUuLCB0aGUgaW5pdGlhbCBpbmNhcm5hdGlvbiBvZlxuICogdGhhdCBpc3N1ZXIuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEsgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldFxuICogICBkZXNjcmlwdGlvbnMuIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqICAgYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuIEZvclxuICogICBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXQgaXQgaXNcbiAqICAgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZyB0byB0aGF0IGlzc3VlclxuICogICBhbmQgYnJhbmQuXG4gKlxuICogICBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVycyBmcm9tIHRoZVxuICogICBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZSBkZWZhdWx0LCBpcyB1c2VkIGZvclxuICogICBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mb11cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqLyRozY9fb25jZS5oYXNJc3N1ZXIoaGFzSXNzdWVyKTtcbiAgICAgICBjb25zdCBtYWtlRHVyYWJsZUlzc3VlcktpdCA9IChcbiAgaXNzdWVyQmFnZ2FnZSxcbiAgbmFtZSxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbiAgYXNzZXRLaW5kID0gQXNzZXRLaW5kLk5BVCxcbiAgZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICB7IGVsZW1lbnRTaGFwZSA9IHVuZGVmaW5lZCwgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBpc3N1ZXJEYXRhID0gaGFyZGVuKHtcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBkaXNwbGF5SW5mbyxcbiAgICBlbGVtZW50U2hhcGUsXG4gIH0pO1xuICBpc3N1ZXJCYWdnYWdlLmluaXQoSU5TVEFOQ0VfS0VZLCBpc3N1ZXJEYXRhKTtcbiAgY29uc3QgaXNzdWVyWm9uZSA9IG1ha2VEdXJhYmxlWm9uZShpc3N1ZXJCYWdnYWdlKTtcbiAgY29uc3QgcmVjb3ZlcnlTZXRzU3RhdGUgPSByZWNvdmVyeVNldHNPcHRpb24gfHwgJ2hhc1JlY292ZXJ5U2V0cyc7XG4gIGlzc3VlckJhZ2dhZ2UuaW5pdChSRUNPVkVSWV9TRVRTX1NUQVRFLCByZWNvdmVyeVNldHNTdGF0ZSk7XG4gIHJldHVybiBzZXR1cElzc3VlcktpdChcbiAgICBpc3N1ZXJEYXRhLFxuICAgIGlzc3VlclpvbmUsXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgKTtcbn07JGjNj19vbmNlLm1ha2VEdXJhYmxlSXNzdWVyS2l0KG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5cbi8qKlxuICogVXNlZCB0byBlaXRoZXIgcmV2aXZlIGEgcHJlZGVjZXNzb3IgaXNzdWVyS2l0LCBvciB0byBtYWtlIGEgbmV3IGR1cmFibGUgb25lXG4gKiBpZiBpdCBpcyBhYnNlbnQsIGFuZCB0byBwbGFjZSBpdCBpbiBiYWdnYWdlIGZvciB0aGUgbmV4dCBzdWNjZXNzb3IuXG4gKlxuICogQHRlbXBsYXRlIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBPXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gSyBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0XG4gKiAgIGRlc2NyaXB0aW9ucy4gVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogICBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS4gRm9yXG4gKiAgIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dCBpdCBpc1xuICogICBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nIHRvIHRoYXQgaXNzdWVyXG4gKiAgIGFuZCBicmFuZC5cbiAqXG4gKiAgIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzIGZyb20gdGhlXG4gKiAgIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlIGRlZmF1bHQsIGlzIHVzZWQgZm9yXG4gKiAgIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7T30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7T1snZWxlbWVudFNoYXBlJ10gZXh0ZW5kcyBUeXBlZFBhdHRlcm48aW5mZXIgVCBleHRlbmRzIEtleT5cbiAqICAgICA/IElzc3VlcktpdDxLLCBUPlxuICogICAgIDogSXNzdWVyS2l0PEs+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUlzc3VlcktpdCA9IChcbiAgaXNzdWVyQmFnZ2FnZSxcbiAgbmFtZSxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbiAgYXNzZXRLaW5kID0gQXNzZXRLaW5kLk5BVCxcbiAgZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGhhdmUgYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBJc3N1ZXJPcHRpb25zUmVjb3JkKi9cbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGlmIChoYXNJc3N1ZXIoaXNzdWVyQmFnZ2FnZSkpIHtcbiAgICBjb25zdCB7IGVsZW1lbnRTaGFwZTogXyA9IHVuZGVmaW5lZCwgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkIH0gPVxuICAgICAgb3B0aW9ucztcbiAgICBjb25zdCBpc3N1ZXJLaXQgPSB1cGdyYWRlSXNzdWVyS2l0KFxuICAgICAgaXNzdWVyQmFnZ2FnZSxcbiAgICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICAgICByZWNvdmVyeVNldHNPcHRpb24sXG4gICAgKTtcblxuICAgIC8qIFRPRE8gY2hlY2sgY29uc2lzdGVuY3kgd2l0aCBuYW1lLCBhc3NldEtpbmQsIGRpc3BsYXlJbmZvLCBlbGVtZW50U2hhcGUuKi9cbiAgICAvKiBDb25zaXN0ZW5jeSBlaXRoZXIgbWVhbnMgdGhhdCB0aGVzZSBhcmUgdGhlIHNhbWUsIG9yIHRoYXQgdGhleSBkaWZmZXIqL1xuICAgIC8qIGluIGEgZGlyZWN0aW9uIHdlIGFyZSBwcmVwYXJlZCB0byB1cGdyYWRlLiBOb3RlIHRoYXQgaXQgaXMgdGhlKi9cbiAgICAvKiByZXNwb25zaWJpbGl0eSBvZiBgdXBncmFkZUlzc3VlcktpdGAgdG8gY2hlY2sgY29uc2lzdGVuY3kgb2YqL1xuICAgIC8qIGByZWNvdmVyeVNldHNPcHRpb25gLCBzbyBjb250aW51ZSB0byBub3QgZG8gdGhhdCBoZXJlLiovXG5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFR5cGUgcGFyYW1ldGVyIGNvbmZ1c2lvbi4qL1xuICAgIHJldHVybiBpc3N1ZXJLaXQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXNzdWVyS2l0ID0gbWFrZUR1cmFibGVJc3N1ZXJLaXQoXG4gICAgICBpc3N1ZXJCYWdnYWdlLFxuICAgICAgbmFtZSxcbiAgICAgIGFzc2V0S2luZCxcbiAgICAgIGRpc3BsYXlJbmZvLFxuICAgICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgdG8gdGhlIHR5cGUgcGFyYW1ldGVyKi9cbiAgICByZXR1cm4gaXNzdWVyS2l0O1xuICB9XG59OyRozY9fb25jZS5wcmVwYXJlSXNzdWVyS2l0KHByZXBhcmVJc3N1ZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIFVzZWQgX29ubHlfIHRvIG1ha2UgYSBuZXcgaXNzdWVyS2l0IHRoYXQgaXMgZWZmZWN0aXZlbHkgbm9uLWR1cmFibGUuIFRoaXMgaXNcbiAqIGN1cnJlbnRseSBkb25lIGJ5IG1ha2luZyBhIGR1cmFibGUgb25lIGluIGEgYmFnZ2FnZSBub3QgcmVhY2hhYmxlIGZyb21cbiAqIGFueXdoZXJlLiBUT0RPIE9uY2UgcmVidWlsdCBvbiB6b25lcywgdGhpcyBzaG91bGQgaW5zdGVhZCBqdXN0IGJ1aWxkIG9uIHRoZVxuICogdmlydHVhbCB6b25lLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNzExNlxuICpcbiAqIEN1cnJlbnRseSB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuIFNob3VsZCBwcm9iYWJseSBjb250aW51ZSB0byBiZSB1c2VkIGZvclxuICogdGVzdGluZyBvbmx5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz0nbmF0J11cbiAqIEB0ZW1wbGF0ZSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW089e31dXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0XG4gKiAgIGRlc2NyaXB0aW9ucy4gVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogICBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS4gRm9yXG4gKiAgIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dCBpdCBpc1xuICogICBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nIHRvIHRoYXQgaXNzdWVyXG4gKiAgIGFuZCBicmFuZC5cbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZF0gVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWNcbiAqICAgbWF0aEhlbHBlcnMgZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqICAgZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mb10gYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvblxuICogICB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge099IFtvcHRpb25zXVxuICogQHJldHVybnMge09bJ2VsZW1lbnRTaGFwZSddIGV4dGVuZHMgVHlwZWRQYXR0ZXJuPGluZmVyIFQgZXh0ZW5kcyBLZXk+XG4gKiAgICAgPyBJc3N1ZXJLaXQ8SywgVD5cbiAqICAgICA6IElzc3VlcktpdDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJc3N1ZXJLaXQgPSAoXG4gIG5hbWUsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBPIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUqL1xuICB7IGVsZW1lbnRTaGFwZSA9IHVuZGVmaW5lZCwgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkIH0gPSB7fSxcbikgPT5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgbWFrZUR1cmFibGVJc3N1ZXJLaXQoXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLCB7IGR1cmFibGU6IHRydWUgfSksXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgZGlzcGxheUluZm8sXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICB7IGVsZW1lbnRTaGFwZSwgcmVjb3ZlcnlTZXRzT3B0aW9uIH0sXG4gICk7JGjNj19vbmNlLm1ha2VJc3N1ZXJLaXQobWFrZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ1cGdyYWRlSXNzdWVyS2l0IjpbInVwZ3JhZGVJc3N1ZXJLaXQiXSwiaGFzSXNzdWVyIjpbImhhc0lzc3VlciJdLCJtYWtlRHVyYWJsZUlzc3VlcktpdCI6WyJtYWtlRHVyYWJsZUlzc3VlcktpdCJdLCJwcmVwYXJlSXNzdWVyS2l0IjpbInByZXBhcmVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFTn3CUTBgAAEwYAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBrZXlFUSxtYWtlQ29weUJhZyxtdXN0TWF0Y2gsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5QmFnXCIsWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLFskaM2PX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaM2PX2EpXV0sW1wiYmFnVW5pb25cIixbJGjNj19hID0+IChiYWdVbmlvbiA9ICRozY9fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01hdGhIZWxwZXJzfSBmcm9tICcuLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0NvcHlCYWd9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqL1xuXG4vKiogQHR5cGUge0NvcHlCYWd9ICovXG5jb25zdCBlbXB0eSA9IG1ha2VDb3B5QmFnKFtdKTtcblxuLyoqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5QmFnPn0gKi9cbiAgICAgICBjb25zdCBjb3B5QmFnTWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogYmFnID0+IHtcbiAgICBtdXN0TWF0Y2goYmFnLCBNLmJhZygpLCAnYmFnIG9mIGFtb3VudCcpO1xuICAgIHJldHVybiBiYWc7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBiYWcgPT4gZ2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGggPT09IDAsXG4gIGRvSXNHVEU6IGJhZ0lzU3VwZXJiYWcsXG4gIGRvSXNFcXVhbDoga2V5RVEsXG4gIGRvQWRkOiBiYWdVbmlvbixcbiAgZG9TdWJ0cmFjdDogYmFnRGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWh3vSSYGAAAmBgAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGtleUVRLG1ha2VDb3B5U2V0LG11c3RNYXRjaCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcInNldElzU3VwZXJzZXRcIixbJGjNj19hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcInNldERpc2pvaW50VW5pb25cIixbJGjNj19hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjNj19hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWF0aEhlbHBlcnN9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7Q29weVNldH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnXG4gKi9cblxuLyoqIEB0eXBlIHtDb3B5U2V0fSAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weVNldChbXSk7XG5cbi8qKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weVNldD59ICovXG4gICAgICAgY29uc3QgY29weVNldE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IHNldCA9PiB7XG4gICAgbXVzdE1hdGNoKHNldCwgTS5zZXQoKSwgJ3NldCBvZiBhbW91bnQnKTtcbiAgICByZXR1cm4gc2V0O1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogc2V0ID0+IGdldENvcHlTZXRLZXlzKHNldCkubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBzZXRJc1N1cGVyc2V0LFxuICBkb0lzRXF1YWw6IGtleUVRLFxuICBkb0FkZDogc2V0RGlzam9pbnRVbmlvbixcbiAgZG9TdWJ0cmFjdDogc2V0RGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlTZXRNYXRoSGVscGVycyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGfMtfs8GAADPBgAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTmF0LGlzTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dLFtcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiogQGltcG9ydCB7TWF0aEhlbHBlcnMsIE5hdFZhbHVlfSBmcm9tICcuLi90eXBlcy5qcycgKi9cblxuY29uc3QgZW1wdHkgPSAwbjtcblxuLyoqXG4gKiBGdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB1c2UgdGhlIG5hdE1hdGhIZWxwZXJzIHRvIG1hbmFnZSBiYWxhbmNlcyAtIHRoZVxuICogb3BlcmF0aW9ucyBhcmUgbWVyZWx5IGFyaXRobWV0aWMgb24gbmF0dXJhbCwgbm9uLW5lZ2F0aXZlIG51bWJlcnMuXG4gKlxuICogTmF0dXJhbCBudW1iZXJzIGFyZSB1c2VkIGZvciBmdW5naWJsZSBlcmlnaHRzIHN1Y2ggYXMgbW9uZXkgYmVjYXVzZSByb3VuZGluZ1xuICogaXNzdWVzIG1ha2UgZmxvYXRzIHByb2JsZW1hdGljLiBBbGwgb3BlcmF0aW9ucyBzaG91bGQgYmUgZG9uZSB3aXRoIHRoZVxuICogc21hbGxlc3Qgd2hvbGUgdW5pdCBzdWNoIHRoYXQgdGhlIGBuYXRNYXRoSGVscGVyc2AgbmV2ZXIgZGVhbHMgd2l0aFxuICogZnJhY3Rpb25hbCBwYXJ0cy5cbiAqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fVxuICovXG4gICAgICAgY29uc3QgbmF0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogbmF0ID0+IHtcbiAgICAvKiBUT0RPOiB0aWdodGVuIHRoZSBkZWZpbml0aW9uIG9mIE5hdCBpbiBAYWdvcmljL25hdCB0byB0aHJvdyBvbiBgbnVtYmVyYCovXG4gICAgYXNzZXJ0LnR5cGVvZihuYXQsICdiaWdpbnQnKTtcbiAgICBpc05hdChuYXQpIHx8IEZhaWxgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG4gICAgcmV0dXJuIE5hdChuYXQpO1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogbmF0ID0+IG5hdCA9PT0gZW1wdHksXG4gIGRvSXNHVEU6IChsZWZ0LCByaWdodCkgPT4gbGVmdCA+PSByaWdodCxcbiAgZG9Jc0VxdWFsOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgPT09IHJpZ2h0LFxuICAvKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuICBkb0FkZDogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ICsgcmlnaHQsXG4gIGRvU3VidHJhY3Q6IChsZWZ0LCByaWdodCkgPT4gTmF0KGxlZnQgLSByaWdodCksXG59KTskaM2PX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0TWF0aEhlbHBlcnMiOlsibmF0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPdw1//0HAAD9BwAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbInNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydEtleVwiLFskaM2PX2EgPT4gKGFzc2VydEtleSA9ICRozY9fYSldXSxbXCJlbGVtZW50c0lzU3VwZXJzZXRcIixbJGjNj19hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsWyRozY9fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjNj19hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXSxbXCJjb2VyY2VUb0VsZW1lbnRzXCIsWyRozY9fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRozY9fYSldXSxbXCJlbGVtZW50c0NvbXBhcmVcIixbJGjNj19hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtNYXRoSGVscGVycywgU2V0VmFsdWV9IGZyb20gJy4uL3R5cGVzLmpzJyAqL1xuXG4vKiBPcGVyYXRpb25zIGZvciBhcnJheXMgd2l0aCB1bmlxdWUgb2JqZWN0cyBpZGVudGlmeWluZyBhbmQgcHJvdmlkaW5nKi9cbi8qIGluZm9ybWF0aW9uIGFib3V0IGRpZ2l0YWwgYXNzZXRzLiBVc2VkIGZvciBab2UgaW52aXRlcy4qL1xuLyoqIEB0eXBlIHtTZXRWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5ID0gaGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fVxuICovXG4gICAgICAgY29uc3Qgc2V0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogbGlzdCA9PiB7XG4gICAgbGlzdCA9IGNvZXJjZVRvRWxlbWVudHMobGlzdCk7XG4gICAgLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbiAgICAvKiAqIHBhc3MtYnktY29weSBwcmltaXRpdmVzLCovXG4gICAgLyogKiBwYXNzLWJ5LWNvcHkgY29udGFpbmVycyBjb250YWluaW5nIGtleXMsKi9cbiAgICAvKiAqIHJlbW90YWJsZXMuKi9cbiAgICBhc3NlcnRLZXkobGlzdCk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBsaXN0ID0+IHBhc3NTdHlsZU9mKGxpc3QpID09PSAnY29weUFycmF5JyAmJiBsaXN0Lmxlbmd0aCA9PT0gMCxcbiAgZG9Jc0dURTogZWxlbWVudHNJc1N1cGVyc2V0LFxuICBkb0lzRXF1YWw6ICh4LCB5KSA9PiBlbGVtZW50c0NvbXBhcmUoeCwgeSkgPT09IDAsXG4gIGRvQWRkOiBlbGVtZW50c0Rpc2pvaW50VW5pb24sXG4gIGRvU3VidHJhY3Q6IGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5zZXRNYXRoSGVscGVycyhzZXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAycsRKWAUAAFgFAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbInByZXBhcmVQYXltZW50S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGluaXRFbXB0eTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLFskaM2PX2EgPT4gKGluaXRFbXB0eSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Fzc2V0S2luZCwgQnJhbmQsIFBheW1lbnR9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL3pvbmUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqL1xuXG4vKiBUT0RPIFR5cGUgSW50ZXJmYWNlR3VhcmQgYmV0dGVyIHRoYW4gSW50ZXJmYWNlR3VhcmQ8YW55PiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZDxhbnk+fSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8SywgYW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQYXltZW50S2luZCA9IChpc3N1ZXJab25lLCBuYW1lLCBicmFuZCwgUGF5bWVudEkpID0+IHtcbiAgY29uc3QgbWFrZVBheW1lbnQgPSBpc3N1ZXJab25lLmV4b0NsYXNzKFxuICAgIGAke25hbWV9IHBheW1lbnRgLFxuICAgIFBheW1lbnRJLFxuICAgIGluaXRFbXB0eSxcbiAgICB7XG4gICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBicmFuZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBbdGFnXSBmb3IgdGFnZ2VkIHR5cGUgbm90IGRlZmluZWQgaW4gcnVudGltZSovXG4gIHJldHVybiBtYWtlUGF5bWVudDtcbn07JGjNj19vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUGF5bWVudEtpbmQiOlsicHJlcGFyZVBheW1lbnRLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANgnSHa+NgAAvjYAACkAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudExlZGdlci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9hbW91bnRNYXRoLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLGFubm90YXRlRXJyb3IsWCxpc1Byb21pc2UsbXVzdE1hdGNoLE0sa2V5RVEsQW1vdW50TWF0aCxwcmVwYXJlUGF5bWVudEtpbmQscHJlcGFyZVB1cnNlS2luZCxCcmFuZEksbWFrZUlzc3VlckludGVyZmFjZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCIuL3BheW1lbnQuanNcIiwgW1tcInByZXBhcmVQYXltZW50S2luZFwiLFskaM2PX2EgPT4gKHByZXBhcmVQYXltZW50S2luZCA9ICRozY9fYSldXV1dLFtcIi4vcHVyc2UuanNcIiwgW1tcInByZXBhcmVQdXJzZUtpbmRcIixbJGjNj19hID0+IChwcmVwYXJlUHVyc2VLaW5kID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJCcmFuZElcIixbJGjNj19hID0+IChCcmFuZEkgPSAkaM2PX2EpXV0sW1wibWFrZUlzc3VlckludGVyZmFjZXNcIixbJGjNj19hID0+IChtYWtlSXNzdWVySW50ZXJmYWNlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0tleSwgUGF0dGVybn0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge1NodXRkb3duV2l0aEZhaWx1cmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JztcbiAqIEBpbXBvcnQge0Ftb3VudFN0b3JlfSBmcm9tICcuL2Ftb3VudFN0b3JlLmpzJztcbiAqIEBpbXBvcnQge0Ftb3VudCwgQXNzZXRLaW5kLCBEaXNwbGF5SW5mbywgUGF5bWVudExlZGdlciwgUGF5bWVudCwgQnJhbmQsIFJlY292ZXJ5U2V0c09wdGlvbiwgUHVyc2UsIElzc3VlciwgTWludH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7U2V0U3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEByZXR1cm5zIHtUeXBlZFBhdHRlcm48QW1vdW50PEs+Pn1cbiAqL1xuY29uc3QgYW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlID0gKGJyYW5kLCBhc3NldEtpbmQsIGVsZW1lbnRTaGFwZSkgPT4ge1xuICBsZXQgdmFsdWVTaGFwZTtcbiAgc3dpdGNoIChhc3NldEtpbmQpIHtcbiAgICBjYXNlICduYXQnOiB7XG4gICAgICB2YWx1ZVNoYXBlID0gTS5uYXQoKTtcbiAgICAgIGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgRnVuZ2libGUgYXNzZXRzIGNhbm5vdCBoYXZlIGFuIGVsZW1lbnRTaGFwZTogJHtxKGVsZW1lbnRTaGFwZSl9YDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdzZXQnOiB7XG4gICAgICBpZiAoZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmtleSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmFycmF5T2YoTS5hbmQoTS5rZXkoKSwgZWxlbWVudFNoYXBlKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5zZXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLnNldE9mKGVsZW1lbnRTaGFwZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5iYWcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmJhZ09mKGVsZW1lbnRTaGFwZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgRmFpbGB1bmV4cGVjdGVkIGFzc2V0IGtpbmQgJHtxKGFzc2V0S2luZCl9YDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhbW91bnRTaGFwZSA9IGhhcmRlbih7XG4gICAgYnJhbmQsIC8qIG1hdGNoZXMgb25seSB0aGlzIGV4YWN0IGJyYW5kKi9cbiAgICB2YWx1ZTogdmFsdWVTaGFwZSxcbiAgfSk7XG4gIHJldHVybiBhbW91bnRTaGFwZTtcbn07XG5cbi8qKlxuICogTWFrZSB0aGUgcGF5bWVudExlZGdlciwgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGJhbGFuY2VzIG9mIHBheW1lbnRzLiBBbGxcbiAqIG1pbnRpbmcgYW5kIHRyYW5zZmVyIGF1dGhvcml0eSBvcmlnaW5hdGVzIGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7Wm9uZX0gaXNzdWVyWm9uZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0Rpc3BsYXlJbmZvPEs+fSBkaXNwbGF5SW5mb1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSByZWNvdmVyeVNldHNTdGF0ZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV1cbiAqIEByZXR1cm5zIHtQYXltZW50TGVkZ2VyPEs+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVBheW1lbnRMZWRnZXIgPSAoXG4gIGlzc3VlclpvbmUsXG4gIG5hbWUsXG4gIGFzc2V0S2luZCxcbiAgZGlzcGxheUluZm8sXG4gIGVsZW1lbnRTaGFwZSxcbiAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggY2FsbFdoZW4qL1xuICBjb25zdCBicmFuZCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IGJyYW5kYCwgQnJhbmRJLCB7XG4gICAgaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKSB7XG4gICAgICAvKiBCcmFuZEkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYGFsbGVnZWRJc3N1ZXJgIGlzIGEgUmVtb3RhYmxlKi9cbiAgICAgIHJldHVybiBhbGxlZ2VkSXNzdWVyID09PSBpc3N1ZXI7XG4gICAgfSxcbiAgICBnZXRBbGxlZ2VkTmFtZSgpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH0sXG4gICAgLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG4gICAgZ2V0RGlzcGxheUluZm8oKSB7XG4gICAgICByZXR1cm4gZGlzcGxheUluZm87XG4gICAgfSxcbiAgICBnZXRBbW91bnRTaGFwZSgpIHtcbiAgICAgIHJldHVybiBhbW91bnRTaGFwZTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBhbW91bnRTaGFwZSA9IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZShcbiAgICBicmFuZCxcbiAgICBhc3NldEtpbmQsXG4gICAgZWxlbWVudFNoYXBlLFxuICApO1xuXG4gIGNvbnN0IHsgSXNzdWVySSwgTWludEksIFBheW1lbnRJLCBQdXJzZUlLaXQgfSA9IG1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuICAgIGJyYW5kLFxuICAgIGFzc2V0S2luZCxcbiAgICBhbW91bnRTaGFwZSxcbiAgKTtcblxuICBjb25zdCBtYWtlUGF5bWVudCA9IHByZXBhcmVQYXltZW50S2luZChpc3N1ZXJab25lLCBuYW1lLCBicmFuZCwgUGF5bWVudEkpO1xuXG4gIC8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbiAgY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZSA9IHJlYXNvbiA9PiB7XG4gICAgLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG4gICAgaWYgKG9wdFNodXRkb3duV2l0aEZhaWx1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuICAgICAgfSBjYXRjaCAoZXJySW5TaHV0ZG93bikge1xuICAgICAgICBhbm5vdGF0ZUVycm9yKGVyckluU2h1dGRvd24sIFhgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbiAgICAgICAgdGhyb3cgZXJySW5TaHV0ZG93bjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgcmVhc29uO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPFBheW1lbnQsIEFtb3VudD59ICovXG4gIGNvbnN0IHBheW1lbnRMZWRnZXIgPSBpc3N1ZXJab25lLndlYWtNYXBTdG9yZSgncGF5bWVudExlZGdlcicsIHtcbiAgICB2YWx1ZVNoYXBlOiBhbW91bnRTaGFwZSxcbiAgfSk7XG5cbiAgLyoqXG4gKiBBIChub24tZW1wdHkpIHdpdGhkcmF3biBsaXZlIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNvdmVyeSBzZXQgb2ZcbiAqIHRoZSBwdXJzZSBpdCB3YXMgd2l0aGRyYXduIGZyb20uIExldCdzIGNhbGwgdGhlc2UgXCJyZWNvdmVyYWJsZVwiIHBheW1lbnRzLlxuICogQWxsIHJlY292ZXJhYmxlIHBheW1lbnRzIGFyZSBsaXZlLCBidXQgbm90IGFsbCBsaXZlIHBheW1lbnRzIGFyZVxuICogcmVjb3ZlcmFibGUuIFdlIGRvIHRoZSBib29ra2VlcGluZyBmb3IgcGF5bWVudCByZWNvdmVyeSB3aXRoIHRoaXMgd2Vha21hcFxuICogZnJvbSByZWNvdmVyYWJsZSBwYXltZW50cyB0byB0aGUgcmVjb3Zlcnkgc2V0IHRoZXkgYXJlIGluLiBBIGJ1bmNoIG9mXG4gKiBpbnRlcmVzdGluZyBpbnZhcmlhbnRzIGhlcmU6XG4gKlxuICogLSBFdmVyeSBwYXltZW50IHRoYXQgaXMgYSBrZXkgaW4gdGhlIG91dGVyIGBwYXltZW50UmVjb3ZlcnlTZXRzYCB3ZWFrTWFwIGlzXG4gKiAgIGFsc28gaW4gdGhlIHJlY292ZXJ5IHNldCBpbmRleGVkIGJ5IHRoYXQgcGF5bWVudC5cbiAqIC0gSW1wbGllZCBieSB0aGUgYWJvdmUgYnV0IHdvcnRoIHN0YXRpbmc6IHRoZSBwYXltZW50IGlzIG9ubHkgaW4gYXQgbW9zdCBvbmVcbiAqICAgcmVjb3Zlcnkgc2V0LlxuICogLSBBIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHN1Y2ggcGF5bWVudHMuXG4gKiAtIEV2ZXJ5IHB1cnNlIGlzIGFzc29jaWF0ZWQgd2l0aCBleGFjdGx5IG9uZSByZWNvdmVyeSBzZXQgdW5pcXVlIHRvIGl0LlxuICogLSBBIHB1cnNlJ3MgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgcGF5bWVudHMgd2l0aGRyYXduIGZyb20gdGhhdCBwdXJzZSBhbmRcbiAqICAgbm90IHlldCBjb25zdW1lZC5cbiAqXG4gKiBJZiBgcmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cydgLCB0aGVuIG5vdGhpbmcgc2hvdWxkIGV2ZXIgYmVcbiAqIGFkZGVkIHRvIHRoaXMgV2Vha1N0b3JlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG4gIGNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHMgPSBpc3N1ZXJab25lLndlYWtNYXBTdG9yZSgncGF5bWVudFJlY292ZXJ5U2V0cycpO1xuXG4gIC8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBpbml0UGF5bWVudGAgc2hvdWxkIGNvbnRhaW4gdGhlIG9ubHkgY2FsbCB0byBgcGF5bWVudExlZGdlci5pbml0YC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtvcHRSZWNvdmVyeVNldF1cbiAqL1xuICBjb25zdCBpbml0UGF5bWVudCA9IChwYXltZW50LCBhbW91bnQsIG9wdFJlY292ZXJ5U2V0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgd2hlbiByZWNvdmVyU2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnLCBvcHRSZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcbiAgICB9XG4gICAgaWYgKG9wdFJlY292ZXJ5U2V0ICE9PSB1bmRlZmluZWQgJiYgIUFtb3VudE1hdGguaXNFbXB0eShhbW91bnQpKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldC5hZGQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmluaXQocGF5bWVudCwgb3B0UmVjb3ZlcnlTZXQpO1xuICAgIH1cbiAgICBwYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCwgYW1vdW50KTtcbiAgfTtcblxuICAvKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgZGVsZXRlUGF5bWVudGAgc2hvdWxkIGNvbnRhaW4gdGhlIG9ubHkgY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG4gIGNvbnN0IGRlbGV0ZVBheW1lbnQgPSBwYXltZW50ID0+IHtcbiAgICBwYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbiAgICBpZiAocGF5bWVudFJlY292ZXJ5U2V0cy5oYXMocGF5bWVudCkpIHtcbiAgICAgIGNvbnN0IHJlY292ZXJ5U2V0ID0gcGF5bWVudFJlY292ZXJ5U2V0cy5nZXQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmRlbGV0ZShwYXltZW50KTtcbiAgICAgIHJlY292ZXJ5U2V0LmRlbGV0ZShwYXltZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG4gIGNvbnN0IGNvZXJjZSA9IGFsbGVnZWRBbW91bnQgPT4gQW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsIGFsbGVnZWRBbW91bnQpO1xuICAvKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IGJvb2xlYW59ICovXG5cbiAgLyoqXG4gKiBNZXRob2RzIGxpa2UgZGVwb3NpdCgpIGhhdmUgYW4gb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlciBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlIHBheW1lbnQuIFRoaXNcbiAqIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudCA9IChwYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUpID0+IHtcbiAgICBpZiAob3B0QW1vdW50U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSwgJ2Ftb3VudCcpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgY29uc3QgYXNzZXJ0TGl2ZVBheW1lbnQgPSBwYXltZW50ID0+IHtcbiAgICBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KSB8fFxuICAgICAgRmFpbGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbiAgICAgICAgYnJhbmQsXG4gICAgICApfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiAgfTtcblxuICAvKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLmRlcG9zaXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFN0b3JlfSBiYWxhbmNlU3RvcmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gc3JjUGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG4gIGNvbnN0IGRlcG9zaXRJbnRlcm5hbCA9IChcbiAgICBiYWxhbmNlU3RvcmUsXG4gICAgc3JjUGF5bWVudCxcbiAgICBvcHRBbW91bnRTaGFwZSA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgIWlzUHJvbWlzZShzcmNQYXltZW50KSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIGBkZXBvc2l0IGRvZXMgbm90IGFjY2VwdCBwcm9taXNlcyBhcyBmaXJzdCBhcmd1bWVudC4gSW5zdGVhZCBvZiBwYXNzaW5nIHRoZSBwcm9taXNlIChkZXBvc2l0KHBheW1lbnRQcm9taXNlKSksIGNvbnNpZGVyIHVud3JhcHBpbmcgdGhlIHByb21pc2UgZmlyc3Q6IEUud2hlbihwYXltZW50UHJvbWlzZSwgKGFjdHVhbFBheW1lbnQgPT4gZGVwb3NpdChhY3R1YWxQYXltZW50KSlgLFxuICAgICAgICBUeXBlRXJyb3IsXG4gICAgICApO1xuICAgIGFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuICAgIGNvbnN0IHNyY1BheW1lbnRCYWxhbmNlID0gcGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG4gICAgYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUpO1xuICAgIHRyeSB7XG4gICAgICAvKiBDT01NSVQgUE9JTlQqL1xuICAgICAgLyogTW92ZSB0aGUgYXNzZXRzIGluIGBzcmNQYXltZW50YCBpbnRvIHRoaXMgcHVyc2UsIHVzaW5nIHVwIHRoZSovXG4gICAgICAvKiBzb3VyY2UgcGF5bWVudCwgc3VjaCB0aGF0IHRvdGFsIGFzc2V0cyBhcmUgY29uc2VydmVkLiovXG4gICAgICBkZWxldGVQYXltZW50KHNyY1BheW1lbnQpO1xuICAgICAgYmFsYW5jZVN0b3JlLmluY3JlbWVudChzcmNQYXltZW50QmFsYW5jZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiAgfTtcblxuICAvKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLndpdGhkcmF3XG4gKlxuICogQHBhcmFtIHtBbW91bnRTdG9yZX0gYmFsYW5jZVN0b3JlXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBiZSB3aXRoZHJhd25cbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtyZWNvdmVyeVNldF1cbiAqIEByZXR1cm5zIHtQYXltZW50fVxuICovXG4gIGNvbnN0IHdpdGhkcmF3SW50ZXJuYWwgPSAoYmFsYW5jZVN0b3JlLCBhbW91bnQsIHJlY292ZXJ5U2V0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgYW1vdW50ID0gY29lcmNlKGFtb3VudCk7XG4gICAgY29uc3QgcGF5bWVudCA9IG1ha2VQYXltZW50KCk7XG4gICAgLyogQ09NTUlUIFBPSU5UIE1vdmUgdGhlIHdpdGhkcmF3biBhc3NldHMgZnJvbSB0aGlzIHB1cnNlIGludG8qL1xuICAgIC8qIHBheW1lbnQuIFRvdGFsIGFzc2V0cyBtdXN0IHJlbWFpbiBjb25zZXJ2ZWQuKi9cbiAgICBiYWxhbmNlU3RvcmUuZGVjcmVtZW50KGFtb3VudCkgfHxcbiAgICAgIEZhaWxgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7YmFsYW5jZVN0b3JlLmdldEFtb3VudCgpfWA7XG4gICAgdHJ5IHtcbiAgICAgIGluaXRQYXltZW50KHBheW1lbnQsIGFtb3VudCwgcmVjb3ZlcnlTZXQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bWVudDtcbiAgfTtcblxuICAvKiogQHR5cGUgeygpID0+IFB1cnNlPEs+fSAqL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBhbW91bnQga2luZHMqL1xuICBjb25zdCBtYWtlRW1wdHlQdXJzZSA9IHByZXBhcmVQdXJzZUtpbmQoXG4gICAgaXNzdWVyWm9uZSxcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBicmFuZCxcbiAgICBQdXJzZUlLaXQsXG4gICAgaGFyZGVuKHtcbiAgICAgIGRlcG9zaXRJbnRlcm5hbCxcbiAgICAgIHdpdGhkcmF3SW50ZXJuYWwsXG4gICAgfSksXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgcGF5bWVudFJlY292ZXJ5U2V0cyxcbiAgKTtcblxuICAvKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggY2FsbFdoZW4qL1xuICBjb25zdCBpc3N1ZXIgPSBpc3N1ZXJab25lLmV4byhgJHtuYW1lfSBpc3N1ZXJgLCBJc3N1ZXJJLCB7XG4gICAgZ2V0QnJhbmQoKSB7XG4gICAgICByZXR1cm4gYnJhbmQ7XG4gICAgfSxcbiAgICBnZXRBbGxlZ2VkTmFtZSgpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH0sXG4gICAgZ2V0QXNzZXRLaW5kKCkge1xuICAgICAgcmV0dXJuIGFzc2V0S2luZDtcbiAgICB9LFxuICAgIGdldERpc3BsYXlJbmZvKCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlJbmZvO1xuICAgIH0sXG4gICAgbWFrZUVtcHR5UHVyc2UoKSB7XG4gICAgICByZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiAgICB9LFxuICAgIC8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuICAgIGlzTGl2ZShwYXltZW50KSB7XG4gICAgICAvKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG4gICAgICByZXR1cm4gcGF5bWVudExlZGdlci5oYXMocGF5bWVudCk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbiAgICBnZXRBbW91bnRPZihwYXltZW50KSB7XG4gICAgICAvKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gb3B0QW1vdW50U2hhcGVcbiAqL1xuICAgIGJ1cm4ocGF5bWVudCwgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbiAgICAgIGFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuICAgICAgY29uc3QgcGF5bWVudEJhbGFuY2UgPSBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICAgIGFzc2VydEFtb3VudENvbnNpc3RlbnQocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8qIENPTU1JVCBQT0lOVC4qL1xuICAgICAgICBkZWxldGVQYXltZW50KHBheW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKlxuICogUHJvdmlkZXMgZm9yIHRoZSByZWNvdmVyeSBvZiBuZXdseSBtaW50ZWQgYnV0IG5vdC15ZXQtZGVwb3NpdGVkIHBheW1lbnRzLlxuICpcbiAqIEJlY2F1c2UgdGhlIGBtaW50UmVjb3ZlcnlQdXJzZWAgaXMgcGxhY2VkIGluIGJhZ2dhZ2UsIGV2ZW4gaWYgdGhlIGNhbGxlciBvZlxuICogYG1ha2VJc3N1ZXJLaXRgIGRyb3BzIGl0IG9uIHRoZSBmbG9vciwgaXQgY2FuIHN0aWxsIGJlIHJlY292ZXJlZCBpbiBhblxuICogZW1lcmdlbmN5IHVwZ3JhZGUuXG4gKi9cbiAgY29uc3QgbWludFJlY292ZXJ5UHVyc2UgPSAvKiogQHR5cGUge1B1cnNlPEs+fSAqLyAoXG4gICAgaXNzdWVyWm9uZS5tYWtlT25jZSgnbWludFJlY292ZXJ5UHVyc2UnLCAoKSA9PiBtYWtlRW1wdHlQdXJzZSgpKVxuICApO1xuXG4gIC8qKiBAdHlwZSB7TWludDxLPn0gKi9cbiAgY29uc3QgbWludCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IG1pbnRgLCBNaW50SSwge1xuICAgIGdldElzc3VlcigpIHtcbiAgICAgIHJldHVybiBpc3N1ZXI7XG4gICAgfSxcbiAgICBtaW50UGF5bWVudChuZXdBbW91bnQpIHtcbiAgICAgIG5ld0Ftb3VudCA9IGNvZXJjZShuZXdBbW91bnQpO1xuICAgICAgbXVzdE1hdGNoKG5ld0Ftb3VudCwgYW1vdW50U2hhcGUsICdtaW50ZWQgYW1vdW50Jyk7XG4gICAgICAvKiBgcmF3UGF5bWVudGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgcmVjb3Zlcnkgc2V0LCBhbmQqL1xuICAgICAgLyogc28gbXVzdCBub3QgZXNjYXBlLiovXG4gICAgICBjb25zdCByYXdQYXltZW50ID0gbWFrZVBheW1lbnQoKTtcbiAgICAgIGluaXRQYXltZW50KHJhd1BheW1lbnQsIG5ld0Ftb3VudCwgdW5kZWZpbmVkKTtcblxuICAgICAgY29uc3QgbWludFJlY292ZXJ5UHVyc2VCZWZvcmUgPSBtaW50UmVjb3ZlcnlQdXJzZS5nZXRDdXJyZW50QW1vdW50KCk7XG4gICAgICBtaW50UmVjb3ZlcnlQdXJzZS5kZXBvc2l0KHJhd1BheW1lbnQsIG5ld0Ftb3VudCk7XG4gICAgICBjb25zdCBwYXltZW50ID0gbWludFJlY292ZXJ5UHVyc2Uud2l0aGRyYXcobmV3QW1vdW50KTtcbiAgICAgIGNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQWZ0ZXIgPSBtaW50UmVjb3ZlcnlQdXJzZS5nZXRDdXJyZW50QW1vdW50KCk7XG4gICAgICBhc3NlcnQoa2V5RVEobWludFJlY292ZXJ5UHVyc2VCZWZvcmUsIG1pbnRSZWNvdmVyeVB1cnNlQWZ0ZXIpKTtcbiAgICAgIHJldHVybiBwYXltZW50O1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGlzc3VlcktpdCA9IGhhcmRlbih7IGlzc3VlciwgbWludCwgYnJhbmQsIG1pbnRSZWNvdmVyeVB1cnNlIH0pO1xuICByZXR1cm4gaXNzdWVyS2l0O1xufTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRMZWRnZXIocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50TGVkZ2VyIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD4gnomXHAAAlxwAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vYW1vdW50TWF0aC5qcyIsIi4vdHJhbnNpZW50Tm90aWZpZXIuanMiLCIuL2Ftb3VudFN0b3JlLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVB1cnNlS2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTSxtYWtlQ29weVNldCxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdCxtYWtlQW1vdW50U3RvcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzXCIsIFtbXCJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXRcIixbJGjNj19hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudFN0b3JlLmpzXCIsIFtbXCJtYWtlQW1vdW50U3RvcmVcIixbJGjNj19hID0+IChtYWtlQW1vdW50U3RvcmUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QXNzZXRLaW5kLCBSZWNvdmVyeVNldHNPcHRpb24sIEJyYW5kLCBQYXltZW50fSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy96b25lJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7U2V0U3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbmNvbnN0IEVNUFRZX0NPUFlfU0VUID0gbWFrZUNvcHlTZXQoW10pO1xuXG4vKiBUT0RPIFR5cGUgSW50ZXJmYWNlR3VhcmQgYmV0dGVyIHRoYW4gSW50ZXJmYWNlR3VhcmQ8YW55PiovXG4vKipcbiAqIEBwYXJhbSB7Wm9uZX0gaXNzdWVyWm9uZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge3tcbiAqICAgcHVyc2U6IEludGVyZmFjZUd1YXJkPGFueT47XG4gKiAgIGRlcG9zaXRGYWNldDogSW50ZXJmYWNlR3VhcmQ8YW55PjtcbiAqIH19IFB1cnNlSUtpdFxuICogQHBhcmFtIHt7XG4gKiAgIGRlcG9zaXRJbnRlcm5hbDogYW55O1xuICogICB3aXRoZHJhd0ludGVybmFsOiBhbnk7XG4gKiB9fSBwdXJzZU1ldGhvZHNcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSByZWNvdmVyeVNldHNTdGF0ZVxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fSBwYXltZW50UmVjb3ZlcnlTZXRzXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUHVyc2VLaW5kID0gKFxuICBpc3N1ZXJab25lLFxuICBuYW1lLFxuICBhc3NldEtpbmQsXG4gIGJyYW5kLFxuICBQdXJzZUlLaXQsXG4gIHB1cnNlTWV0aG9kcyxcbiAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gIHBheW1lbnRSZWNvdmVyeVNldHMsXG4pID0+IHtcbiAgY29uc3QgYW1vdW50U2hhcGUgPSBicmFuZC5nZXRBbW91bnRTaGFwZSgpO1xuXG4gIC8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuICAvKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbiAgLyogVE9ETyBwcm9wYWdhdGUgem9uaWZ5aW5nIHRvIG5vdGlmaWVycywgbWF5YmU/Ki9cbiAgY29uc3QgeyBwcm92aWRlTm90aWZpZXIsIHVwZGF0ZTogdXBkYXRlQmFsYW5jZSB9ID0gbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbiAgLyoqXG4gKiBJZiBgcmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdoYXNSZWNvdmVyeVNldHMnYCAodGhlIG5vcm1hbCBzdGF0ZSksIHRoZW4ganVzdFxuICogcmV0dXJuIGBzdGF0ZS5yZWNvdmVyeVNldGAuXG4gKlxuICogSWYgYHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnYCwgcmV0dXJuIGB1bmRlZmluZWRgLiBDYWxsZXJzXG4gKiBtdXN0IGJlIGF3YXJlIHRoYXQgdGhlIGB1bmRlZmluZWRgIHJldHVybiBoYXBwZW5zIGlmZiBgcmVjb3ZlcnlTZXRzU3RhdGVcbiAqID09PSAnbm9SZWNvdmVyeVNldHMnYCwgYW5kIHRvIGF2b2lkIHN0b3Jpbmcgb3IgcmV0cmlldmluZyBhbnl0aGluZyBmcm9tIHRoZVxuICogYWN0dWFsIHJlY292ZXJ5IHNldC5cbiAqXG4gKiBAcGFyYW0ge3sgcmVjb3ZlcnlTZXQ6IFNldFN0b3JlPFBheW1lbnQ+IH19IHN0YXRlXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8UGF5bWVudD4gfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3QgbWF5YmVSZWNvdmVyeVNldCA9IHN0YXRlID0+IHtcbiAgICBjb25zdCB7IHJlY292ZXJ5U2V0IH0gPSBzdGF0ZTtcbiAgICBpZiAocmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdoYXNSZWNvdmVyeVNldHMnKSB7XG4gICAgICByZXR1cm4gcmVjb3ZlcnlTZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnIHx8XG4gICAgICAgIEZhaWxgcmVjb3ZlclNldHNTdGF0ZSBtdXN0IGJlIG5vUmVjb3ZlcnlTZXRzIGlmIGl0IGlzbid0IGhhc1JlY292ZXJTZXRzYDtcbiAgICAgIHBheW1lbnRSZWNvdmVyeVNldHMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYHBheW1lbnRSZWNvdmVyeVNldHMgbXVzdCBhbHdheXMgYmUgZGVmaW5lZGA7XG4gICAgICByZWNvdmVyeVNldC5nZXRTaXplKCkgPT09IDAgfHxcbiAgICAgICAgRmFpbGBXaXRoIG5vUmVjb3ZlcnlTZXRzLCByZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbiAgLyogY29ycmVzcG9uZGVuY2UuKi9cbiAgLyogLSBUaGV5IGFyZSB2aXJ0dWFsaXplZCB0b2dldGhlciB0byBzaGFyZSBhIHNpbmdsZSBzdGF0ZSByZWNvcmQuKi9cbiAgLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbiAgLyogdGhhdCBjcmVhdGVkIGRlcG9zaXRGYWNldCBhcyBuZWVkZWQuIEJ1dCB0aGlzIGFwcHJvYWNoIGVuc3VyZXMgYSBjb25zdGFudCovXG4gIC8qIGlkZW50aXR5IGZvciB0aGUgZmFjZXQgYW5kIGV4ZXJjaXNlcyB0aGUgbXVsdGktZmFjZXRlZCBvYmplY3Qgc3R5bGUuKi9cbiAgY29uc3QgeyBkZXBvc2l0SW50ZXJuYWwsIHdpdGhkcmF3SW50ZXJuYWwgfSA9IHB1cnNlTWV0aG9kcztcbiAgY29uc3QgbWFrZVB1cnNlS2l0ID0gaXNzdWVyWm9uZS5leG9DbGFzc0tpdChcbiAgICBgJHtuYW1lfSBQdXJzZWAsXG4gICAgUHVyc2VJS2l0LFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCYWxhbmNlID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7U2V0U3RvcmU8UGF5bWVudD59ICovXG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IGlzc3VlclpvbmUuZGV0YWNoZWQoKS5zZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlLFxuICAgICAgICByZWNvdmVyeVNldCxcbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBwdXJzZToge1xuICAgICAgICBkZXBvc2l0KHNyY1BheW1lbnQsIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbiAgICAgICAgICAvKiBTZWUgdGhlIGNvbW1lbnRzIG9uIFB1cnNlSS5kZXBvc2l0IGluIHR5cGVHdWFyZHMuanMqL1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdXJzZSB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICAvKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gZGVwb3NpdC4qL1xuICAgICAgICAgIGNvbnN0IHNyY1BheW1lbnRCYWxhbmNlID0gZGVwb3NpdEludGVybmFsKFxuICAgICAgICAgICAgYmFsYW5jZVN0b3JlLFxuICAgICAgICAgICAgc3JjUGF5bWVudCxcbiAgICAgICAgICAgIG9wdEFtb3VudFNoYXBlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQmFsYW5jZShwdXJzZSwgYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbiAgICAgICAgICByZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhkcmF3KGFtb3VudCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdXJzZSB9ID0gdGhpcy5mYWNldHM7XG5cbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG4gICAgICAgICAgY29uc3QgcGF5bWVudCA9IHdpdGhkcmF3SW50ZXJuYWwoXG4gICAgICAgICAgICBiYWxhbmNlU3RvcmUsXG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICBvcHRSZWNvdmVyeVNldCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZUJhbGFuY2UocHVyc2UsIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKSk7XG4gICAgICAgICAgcmV0dXJuIHBheW1lbnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEN1cnJlbnRBbW91bnQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBiYWxhbmNlU3RvcmUgPSBtYWtlQW1vdW50U3RvcmUoc3RhdGUsICdjdXJyZW50QmFsYW5jZScpO1xuICAgICAgICAgIHJldHVybiBiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEN1cnJlbnRBbW91bnROb3RpZmllcigpIHtcbiAgICAgICAgICByZXR1cm4gcHJvdmlkZU5vdGlmaWVyKHRoaXMuZmFjZXRzLnB1cnNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0QWxsZWdlZEJyYW5kKCkge1xuICAgICAgICAgIHJldHVybiBicmFuZDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXREZXBvc2l0RmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLmRlcG9zaXRGYWNldDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRSZWNvdmVyeVNldCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IG9wdFJlY292ZXJ5U2V0ID0gbWF5YmVSZWNvdmVyeVNldChzdGF0ZSk7XG4gICAgICAgICAgaWYgKG9wdFJlY292ZXJ5U2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9DT1BZX1NFVDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9wdFJlY292ZXJ5U2V0LnNuYXBzaG90KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlY292ZXJBbGwoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGxldCBhbW91bnQgPSBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCwgYXNzZXRLaW5kKTtcbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGlmIChvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50OyAvKiBlbXB0eSBhdCB0aGlzIHRpbWUqL1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHBheW1lbnQgb2Ygb3B0UmVjb3ZlcnlTZXQua2V5cygpKSB7XG4gICAgICAgICAgICAvKiBUaGlzIGRvZXMgY2F1c2UgZGVsZXRpb25zIGZyb20gdGhlIHNldCB3aGlsZSBpdGVyYXRpbmcsKi9cbiAgICAgICAgICAgIC8qIGJ1dCB0aGlzIHNwZWNpYWwgY2FzZSBpcyBhbGxvd2VkLiovXG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGZhY2V0cy5wdXJzZS5kZXBvc2l0KHBheW1lbnQpO1xuICAgICAgICAgICAgYW1vdW50ID0gQW1vdW50TWF0aC5hZGQoYW1vdW50LCBkZWx0YSwgYnJhbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcHRSZWNvdmVyeVNldC5nZXRTaXplKCkgPT09IDAgfHxcbiAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gO1xuICAgICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVwb3NpdEZhY2V0OiB7XG4gICAgICAgIHJlY2VpdmUoLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5wdXJzZS5kZXBvc2l0KC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IHtcbiAgICAgICAgY3VycmVudEJhbGFuY2U6IGFtb3VudFNoYXBlLFxuICAgICAgICByZWNvdmVyeVNldDogTS5yZW1vdGFibGUoJ3JlY292ZXJ5U2V0JyksXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG4gIHJldHVybiAoKSA9PiBtYWtlUHVyc2VLaXQoKS5wdXJzZTtcbn07JGjNj19vbmNlLnByZXBhcmVQdXJzZUtpbmQocHJlcGFyZVB1cnNlS2luZCk7XG5oYXJkZW4ocHJlcGFyZVB1cnNlS2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYOSsWxkHAAAZBwAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvbm90aWZpZXIiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLHByb3ZpZGVMYXp5LG1ha2VOb3RpZmllcktpdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIixbJGjNj19hID0+IChwcm92aWRlTGF6eSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllcktpdFwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQdXJzZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtOb3RpZmllclJlY29yZH0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG4gICAgICAgY29uc3QgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gKCkgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG4gIGNvbnN0IHRyYW5zaWVudE5vdGlmZXJLaXRzID0gbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbiAgICAndHJhbnNpZW50Tm90aWZlcktpdHMnLFxuICApO1xuXG4gIGNvbnN0IHByb3ZpZGVOb3RpZmllcktpdCA9IGtleSA9PlxuICAgIHByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLCBrZXksICgpID0+XG4gICAgICBtYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSksXG4gICAgKTtcblxuICBjb25zdCBwcm92aWRlTm90aWZpZXIgPSBrZXkgPT4gcHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG4gIGNvbnN0IHVwZGF0ZSA9IChrZXksIG5ld1ZhbHVlKSA9PiB7XG4gICAgaWYgKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCB7IHVwZGF0ZXIgfSA9IHRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xuICAgICAgdXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7IHByb3ZpZGVOb3RpZmllciwgdXBkYXRlIH07XG59OyRozY9fb25jZS5tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbmhhcmRlbihtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADl+t+rQC0AAEAtAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiLCJBbW91bnRTaGFwZSIsIkFzc2V0S2luZFNoYXBlIiwiQnJhbmRJIiwiQnJhbmRTaGFwZSIsIkRlcG9zaXRGYWNldFNoYXBlIiwiRGlzcGxheUluZm9TaGFwZSIsIklzc3VlcktpdFNoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJOb3RpZmllclNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsIlJhdGlvU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sbWF0Y2hlcyxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudFZhbHVlLCBSYXRpb30gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCdcbiAqIEBpbXBvcnQge0NvcHlCYWcsIENvcHlTZXQsIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge05hdFZhbHVlLCBTZXRWYWx1ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuICAgICAgIGNvbnN0IEJyYW5kU2hhcGUgPSBNLnJlbW90YWJsZSgnQnJhbmQnKTskaM2PX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaM2PX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IFBheW1lbnRTaGFwZSA9IE0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjNj19vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFB1cnNlU2hhcGUgPSBNLnJlbW90YWJsZSgnUHVyc2UnKTskaM2PX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbiAgICAgICBjb25zdCBEZXBvc2l0RmFjZXRTaGFwZSA9IE0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaM2PX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuICAgICAgIGNvbnN0IE5vdGlmaWVyU2hhcGUgPSBNLnJlbW90YWJsZSgnTm90aWZpZXInKTskaM2PX29uY2UuTm90aWZpZXJTaGFwZShOb3RpZmllclNoYXBlKTtcbiAgICAgICBjb25zdCBNaW50U2hhcGUgPSBNLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzIGFcbiAqIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlIGZ1bmdpYmxlIGFzc2V0XG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50IHNob3VsZCBpbmRlZWQgcmVwcmVzZW50XG4gKiBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZSBzZXQgb2YgZnVuZ2libGUgdW5pdHMuXG4gKi8kaM2PX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlID0gTS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2Uga2V5cywgd2hlcmUgZWFjaCBrZXlcbiAqIHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZSBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlXG4gKiBub24tZnVuZ2libGUgYXNzZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIGFtb3VudFxuICogaXRzZWxmIHJlcHJlc2VudHMgdGhlIHNldCBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyXG4gKiBpdGVtcyBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmUgdGhhdCB3ZVxuICogY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXQgdGhlIGNvZGUgdGhhdCBob2xkc1xuICogdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGJyYW5kLCBvbmx5XG4gKiBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieVxuICogaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXIgYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXlcbiAqIFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdCB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmVcbiAqIHNhdGlzZmllZC4gXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlID0gTS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpcyBhXG4gKiBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogICBDb3B5U2V0VmFsdWVzLlxuICovXG5jb25zdCBTZXRWYWx1ZVNoYXBlID0gTS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlIGtleXMsIHdoZXJlIGVhY2hcbiAqIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCxcbiAqIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlXG4gKiBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXkgYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHNcbiAqIG9mIHRoYXQga2V5LiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzIHRoZSBiYWcgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWRcbiAqIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXMgZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlIHRoYXQgd2VcbiAqIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0IHRoZSBjb2RlIHRoYXQgaG9sZHNcbiAqIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBicmFuZCwgb25seVxuICogbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0cyBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnlcbiAqIGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5XG4gKiBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXQgd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQuIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZSA9IE0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGUgPSBNLm9yKFxuICBOYXRWYWx1ZVNoYXBlLFxuICBDb3B5U2V0VmFsdWVTaGFwZSxcbiAgU2V0VmFsdWVTaGFwZSxcbiAgQ29weUJhZ1ZhbHVlU2hhcGUsXG4pO1xuXG4gICAgICAgY29uc3QgQW1vdW50U2hhcGUgPSB7IGJyYW5kOiBCcmFuZFNoYXBlLCB2YWx1ZTogQW1vdW50VmFsdWVTaGFwZSB9OyRozY9fb25jZS5BbW91bnRTaGFwZShBbW91bnRTaGFwZSk7XG5oYXJkZW4oQW1vdW50U2hhcGUpO1xuXG4vKipcbiAqIFRvIGJlIHVzZWQgdG8gZ3VhcmQgYW4gYW1vdW50IHBhdHRlcm4gYXJndW1lbnQsIGkuZS4sIGFuIGFyZ3VtZW50IHdoaWNoIGlzIGFcbiAqIHBhdHRlcm4gdGhhdCBjYW4gYmUgdXNlZCB0byB0ZXN0IGFtb3VudHMuIFNpbmNlIGFtb3VudHMgYXJlIGtleXMsIGFueXdoZXJlIGFuXG4gKiBhbW91bnQgcGF0dGVybiBpcyBleHBlY3RlZCwgYW4gYW1vdW50IGNhbiBiZSBwcm92aWRlZCBhbmQgd2lsbCBtYXRjaCBvbmx5XG4gKiB0aGF0IGNvbmNyZXRlIGFtb3VudCwgaS5lLiwgYW1vdW50cyB0aGF0IGFyZSBga2V5RVFgIHRvIHRoYXQgYW1vdW50LlxuICpcbiAqIFRoZSBgQW1vdW50U2hhcGVgIGd1YXJkIGFib3ZlIGlzIGFuIGFtb3VudCBwYXR0ZXJuLiBCdXQgbm90IGFsbCBhbW91bnRcbiAqIHBhdHRlcm5zIGFyZSBsaWtlIGBBbW91bnRTaGFwZWAuIEZvciBleGFtcGxlLCBgTS5hbnkoKWAgaXMgYSB2YWxpZCBhbW91bnRcbiAqIHBhdHRlcm4gdGhhdCB3aWxsIGFkbWl0IGFueSBhbW91bnQsIGJ1dCBpcyBkb2VzIG5vdCByZXNlbWJsZSB0aGVcbiAqIGBBbW91bnRTaGFwZWAgcGF0dGVybiBhYm92ZS5cbiAqL1xuICAgICAgIGNvbnN0IEFtb3VudFBhdHRlcm5TaGFwZSA9IE0ucGF0dGVybigpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxSYXRpbz59ICovJGjNj19vbmNlLkFtb3VudFBhdHRlcm5TaGFwZShBbW91bnRQYXR0ZXJuU2hhcGUpO1xuICAgICAgIGNvbnN0IFJhdGlvU2hhcGUgPSB7IG51bWVyYXRvcjogQW1vdW50U2hhcGUsIGRlbm9taW5hdG9yOiBBbW91bnRTaGFwZSB9OyRozY9fb25jZS5SYXRpb1NoYXBlKFJhdGlvU2hhcGUpO1xuaGFyZGVuKFJhdGlvU2hhcGUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBOYXRWYWx1ZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzTmF0VmFsdWUgPSB2YWx1ZSA9PiBtYXRjaGVzKHZhbHVlLCBOYXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5U2V0VmFsdWUgPSB2YWx1ZSA9PiBtYXRjaGVzKHZhbHVlLCBDb3B5U2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3QgY2hlY2sgZm9yXG4gKiBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqICAgQ29weVNldFZhbHVlcy5cbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgU2V0VmFsdWV9XG4gKi9cbiAgICAgICBjb25zdCBpc1NldFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgU2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzU2V0VmFsdWUoaXNTZXRWYWx1ZSk7XG5oYXJkZW4oaXNTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weUJhZ1xuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weUJhZ31cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUJhZ1ZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgQ29weUJhZ1ZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuICAgICAgIGNvbnN0IE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyA9IDEwMDskaM2PX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbiAgICAgICBjb25zdCBBc3NldEtpbmRTaGFwZSA9IE0ub3IoJ25hdCcsICdzZXQnLCAnY29weVNldCcsICdjb3B5QmFnJyk7JGjNj19vbmNlLkFzc2V0S2luZFNoYXBlKEFzc2V0S2luZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IERpc3BsYXlJbmZvU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7fSxcbiAge1xuICAgIGRlY2ltYWxQbGFjZXM6IE0uYW5kKFxuICAgICAgTS5ndGUoLU1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG4gICAgICBNLmx0ZShNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuICAgICksXG4gICAgYXNzZXRLaW5kOiBBc3NldEtpbmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIC8qIEluY2x1ZGluZyB0aGlzIGVtcHR5IGByZXN0YCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyKi9cbiAgICAvKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL1xuICB9LFxuKTskaM2PX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuICAgICAgIGNvbnN0IElzc3VlcktpdFNoYXBlID0ge1xuICBicmFuZDogQnJhbmRTaGFwZSxcbiAgbWludDogTWludFNoYXBlLFxuICBtaW50UmVjb3ZlcnlQdXJzZTogUHVyc2VTaGFwZSxcbiAgaXNzdWVyOiBJc3N1ZXJTaGFwZSxcbiAgZGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUsXG59OyRozY9fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5oYXJkZW4oSXNzdWVyS2l0U2hhcGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgICAgICBjb25zdCBCcmFuZEkgPSBNLmludGVyZmFjZSgnQnJhbmQnLCB7XG4gIGlzTXlJc3N1ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0RGlzcGxheUluZm86IE0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG4gIGdldEFtb3VudFNoYXBlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKSxcbn0pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2JyYW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthc3NldEtpbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Ftb3VudFNoYXBlXVxuICovJGjNj19vbmNlLkJyYW5kSShCcmFuZEkpO1xuICAgICAgIGNvbnN0IG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gKFxuICBicmFuZFNoYXBlID0gQnJhbmRTaGFwZSxcbiAgYXNzZXRLaW5kU2hhcGUgPSBBc3NldEtpbmRTaGFwZSxcbiAgYW1vdW50U2hhcGUgPSBBbW91bnRTaGFwZSxcbikgPT4ge1xuICBjb25zdCBJc3N1ZXJJID0gTS5pbnRlcmZhY2UoJ0lzc3VlcicsIHtcbiAgICBnZXRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgICBnZXRBc3NldEtpbmQ6IE0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuICAgIGdldERpc3BsYXlJbmZvOiBNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuICAgIG1ha2VFbXB0eVB1cnNlOiBNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG4gICAgaXNMaXZlOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gICAgZ2V0QW1vdW50T2Y6IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBidXJuOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSlcbiAgICAgIC5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpXG4gICAgICAucmV0dXJucyhhbW91bnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IE1pbnRJID0gTS5pbnRlcmZhY2UoJ01pbnQnLCB7XG4gICAgZ2V0SXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICBtaW50UGF5bWVudDogTS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IFBheW1lbnRJID0gTS5pbnRlcmZhY2UoJ1BheW1lbnQnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBQdXJzZUkgPSBNLmludGVyZmFjZSgnUHVyc2UnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnROb3RpZmllcjogTS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbiAgICAvKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuICAgIC8qIFJhdGhlciwgdGhlIHNlbWFudGljcyBvZiBgZGVwb3NpdGAgcmVxdWlyZSBpdCB0byBwcm92aWRlIGl0cyovXG4gICAgLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuICAgIC8qIHByb2Nlc3NlZCB3aXRob3V0IGZ1cnRoZXIgZGVsYXkgaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLiovXG4gICAgLyogUHVyc2VJIHRoZXJlZm9yZSByZXF1aXJlcyB0aGF0IHRoZSBgc3JjUGF5bWVudGAgYXJndW1lbnQgYWxyZWFkeSovXG4gICAgLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbiAgICAvKiBQdXJzZUkgb25seSBjYWxscyB0aGlzIHJhdyBtZXRob2QgYWZ0ZXIgdmFsaWRhdGluZyB0aGF0Ki9cbiAgICAvKiBgc3JjUGF5bWVudGAgaXMgYSByZW1vdGFibGUsIGxlYXZpbmcgaXQqL1xuICAgIC8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbiAgICAvKiBhIGxpdmUgcGF5bWVudCBvZiB0aGUgY29ycmVjdCBicmFuZCB3aXRoIHN1ZmZpY2llbnQgZnVuZHMuKi9cbiAgICBkZXBvc2l0OiBNLmNhbGwoUGF5bWVudFNoYXBlKVxuICAgICAgLm9wdGlvbmFsKEFtb3VudFBhdHRlcm5TaGFwZSlcbiAgICAgIC5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBnZXREZXBvc2l0RmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoRGVwb3NpdEZhY2V0U2hhcGUpLFxuICAgIHdpdGhkcmF3OiBNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbiAgICBnZXRSZWNvdmVyeVNldDogTS5jYWxsKCkucmV0dXJucyhNLnNldE9mKFBheW1lbnRTaGFwZSkpLFxuICAgIHJlY292ZXJBbGw6IE0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBEZXBvc2l0RmFjZXRJID0gTS5pbnRlcmZhY2UoJ0RlcG9zaXRGYWNldCcsIHtcbiAgICByZWNlaXZlOiBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoUHVyc2VJKS5tZXRob2RHdWFyZHMuZGVwb3NpdCxcbiAgfSk7XG5cbiAgY29uc3QgUHVyc2VJS2l0ID0ge1xuICAgIHB1cnNlOiBQdXJzZUksXG4gICAgZGVwb3NpdEZhY2V0OiBEZXBvc2l0RmFjZXRJLFxuICB9O1xuICBoYXJkZW4oUHVyc2VJS2l0KTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBJc3N1ZXJJLFxuICAgIE1pbnRJLFxuICAgIFBheW1lbnRJLFxuICAgIFB1cnNlSUtpdCxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJhbmRTaGFwZSI6WyJCcmFuZFNoYXBlIl0sIklzc3VlclNoYXBlIjpbIklzc3VlclNoYXBlIl0sIlBheW1lbnRTaGFwZSI6WyJQYXltZW50U2hhcGUiXSwiUHVyc2VTaGFwZSI6WyJQdXJzZVNoYXBlIl0sIkRlcG9zaXRGYWNldFNoYXBlIjpbIkRlcG9zaXRGYWNldFNoYXBlIl0sIk5vdGlmaWVyU2hhcGUiOlsiTm90aWZpZXJTaGFwZSJdLCJNaW50U2hhcGUiOlsiTWludFNoYXBlIl0sIkFtb3VudFNoYXBlIjpbIkFtb3VudFNoYXBlIl0sIkFtb3VudFBhdHRlcm5TaGFwZSI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiXSwiUmF0aW9TaGFwZSI6WyJSYXRpb1NoYXBlIl0sImlzTmF0VmFsdWUiOlsiaXNOYXRWYWx1ZSJdLCJpc0NvcHlTZXRWYWx1ZSI6WyJpc0NvcHlTZXRWYWx1ZSJdLCJpc1NldFZhbHVlIjpbImlzU2V0VmFsdWUiXSwiaXNDb3B5QmFnVmFsdWUiOlsiaXNDb3B5QmFnVmFsdWUiXSwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIjpbIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyJdLCJBc3NldEtpbmRTaGFwZSI6WyJBc3NldEtpbmRTaGFwZSJdLCJEaXNwbGF5SW5mb1NoYXBlIjpbIkRpc3BsYXlJbmZvU2hhcGUiXSwiSXNzdWVyS2l0U2hhcGUiOlsiSXNzdWVyS2l0U2hhcGUiXSwiQnJhbmRJIjpbIkJyYW5kSSJdLCJtYWtlSXNzdWVySW50ZXJmYWNlcyI6WyJtYWtlSXNzdWVySW50ZXJmYWNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGxhNlyHJAAAhyQAADMAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvYmluYXJ5Vm90ZUNvdW50ZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9zdG9yZSIsIi4vcXVlc3Rpb24uanMiLCIuL2Nsb3NpbmdSdWxlLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi9xdW9ydW1Db3VudGVyLmpzIl0sImV4cG9ydHMiOlsibWFrZUJpbmFyeVZvdGVDb3VudGVyIiwic3RhcnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VQcm9taXNlS2l0LEUsbWFrZUV4byxrZXlFUSxtYWtlU2NhbGFyTWFwU3RvcmUsYnVpbGRRdWVzdGlvbixDaG9pY2VNZXRob2QsY29lcmNlUXVlc3Rpb25TcGVjLHBvc2l0aW9uSW5jbHVkZWQsc2NoZWR1bGVDbG9zZSxCaW5hcnlWb3RlQ291bnRlckFkbWluSSxCaW5hcnlWb3RlQ291bnRlckNsb3NlSSxCaW5hcnlWb3RlQ291bnRlclB1YmxpY0ksbWFrZVF1b3J1bUNvdW50ZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VFeG9cIixbJGjNj19hID0+IChtYWtlRXhvID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiLi9xdWVzdGlvbi5qc1wiLCBbW1wiYnVpbGRRdWVzdGlvblwiLFskaM2PX2EgPT4gKGJ1aWxkUXVlc3Rpb24gPSAkaM2PX2EpXV0sW1wiQ2hvaWNlTWV0aG9kXCIsWyRozY9fYSA9PiAoQ2hvaWNlTWV0aG9kID0gJGjNj19hKV1dLFtcImNvZXJjZVF1ZXN0aW9uU3BlY1wiLFskaM2PX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRozY9fYSldXSxbXCJwb3NpdGlvbkluY2x1ZGVkXCIsWyRozY9fYSA9PiAocG9zaXRpb25JbmNsdWRlZCA9ICRozY9fYSldXV1dLFtcIi4vY2xvc2luZ1J1bGUuanNcIiwgW1tcInNjaGVkdWxlQ2xvc2VcIixbJGjNj19hID0+IChzY2hlZHVsZUNsb3NlID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJCaW5hcnlWb3RlQ291bnRlckFkbWluSVwiLFskaM2PX2EgPT4gKEJpbmFyeVZvdGVDb3VudGVyQWRtaW5JID0gJGjNj19hKV1dLFtcIkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJXCIsWyRozY9fYSA9PiAoQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkgPSAkaM2PX2EpXV0sW1wiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJXCIsWyRozY9fYSA9PiAoQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJID0gJGjNj19hKV1dXV0sW1wiLi9xdW9ydW1Db3VudGVyLmpzXCIsIFtbXCJtYWtlUXVvcnVtQ291bnRlclwiLFskaM2PX2EgPT4gKG1ha2VRdW9ydW1Db3VudGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7SGFuZGxlfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7UHVibGlzaGVyfSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge1pDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7QnVpbGRWb3RlQ291bnRlciwgT3V0Y29tZVJlY29yZCwgUG9zaXRpb24sIFF1ZXN0aW9uU3BlYywgVm90ZVN0YXRpc3RpY3N9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7UHJvbWlzZVJlY29yZH0gZnJvbSAnQGVuZG8vcHJvbWlzZS1raXQnO1xuICovXG5cbmNvbnN0IHZhbGlkYXRlQmluYXJ5UXVlc3Rpb25TcGVjID0gcXVlc3Rpb25TcGVjID0+IHtcbiAgY29lcmNlUXVlc3Rpb25TcGVjKHF1ZXN0aW9uU3BlYyk7XG5cbiAgY29uc3QgcG9zaXRpb25zID0gcXVlc3Rpb25TcGVjLnBvc2l0aW9ucztcbiAgcG9zaXRpb25zLmxlbmd0aCA9PT0gMiB8fFxuICAgIEZhaWxgQmluYXJ5IHF1ZXN0aW9ucyBtdXN0IGhhdmUgZXhhY3RseSB0d28gcG9zaXRpb25zLiBoYWQgJHtwb3NpdGlvbnMubGVuZ3RofTogJHtwb3NpdGlvbnN9YDtcbiAgcXVlc3Rpb25TcGVjLm1heENob2ljZXMgPT09IDEgfHxcbiAgICBGYWlsYENhbiBvbmx5IGNob29zZSAxIGl0ZW0gb24gYSBiaW5hcnkgcXVlc3Rpb25gO1xuICBxdWVzdGlvblNwZWMubWV0aG9kID09PSBDaG9pY2VNZXRob2QuVU5SQU5LRUQgfHxcbiAgICBGYWlsYCR7cXVlc3Rpb25TcGVjLm1ldGhvZH0gbXVzdCBiZSBVTlJBTktFRGA7XG4gIC8qIFdlIGRvbid0IGNoZWNrIHRoZSBxdW9ydW1SdWxlIG9yIHF1b3J1bVRocmVzaG9sZCBoZXJlLiBUaGUgcXVvcnVtVGhyZXNob2xkKi9cbiAgLyogaXMgcHJvdmlkZWQgYnkgdGhlIEVsZWN0b3JhdGUgdGhhdCBjcmVhdGVzIHRoaXMgdm90ZUNvdW50ZXIsIHNpbmNlIG9ubHkgaXQqL1xuICAvKiBjYW4gdHJhbnNsYXRlIHRoZSBxdW9ydW1SdWxlIHRvIGEgcmVxdWlyZWQgbnVtYmVyIG9mIHZvdGVzLiovXG59O1xuXG4vKiBOb3RpY2UgdGhhdCBCaW5hcnlWb3RlQ291bnRlciBpcyBkZXNpZ25lZCB0byBydW4gYXMgYSBab2UgY29udHJhY3QuIFRoZSovXG4vKiBidXNpbmVzcyBwYXJ0IG9mIHRoZSBjb250cmFjdCBpcyBleHRyYWN0ZWQgaGVyZSBzbyBpdCBjYW4gYmUgdGVzdGVkKi9cbi8qIGluZGVwZW5kZW50bHkuIFRoZSBzdGFuZGFyZCBab2Ugc3RhcnQgZnVuY3Rpb24gaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUuKi9cblxuLyoqIEB0eXBlIHtCdWlsZFZvdGVDb3VudGVyfSAqL1xuY29uc3QgbWFrZUJpbmFyeVZvdGVDb3VudGVyID0gKFxuICBxdWVzdGlvblNwZWMsXG4gIHRocmVzaG9sZCxcbiAgaW5zdGFuY2UsXG4gIHB1Ymxpc2hlcixcbikgPT4ge1xuICB2YWxpZGF0ZUJpbmFyeVF1ZXN0aW9uU3BlYyhxdWVzdGlvblNwZWMpO1xuXG4gIGNvbnN0IHF1ZXN0aW9uID0gYnVpbGRRdWVzdGlvbihxdWVzdGlvblNwZWMsIGluc3RhbmNlKTtcbiAgY29uc3QgZGV0YWlscyA9IHF1ZXN0aW9uLmdldERldGFpbHMoKTtcblxuICBsZXQgaXNPcGVuID0gdHJ1ZTtcbiAgY29uc3QgcG9zaXRpb25zID0gcXVlc3Rpb25TcGVjLnBvc2l0aW9ucztcbiAgLyoqIEB0eXBlIHsgUHJvbWlzZVJlY29yZDxQb3NpdGlvbj4gfSAqL1xuICBjb25zdCBvdXRjb21lUHJvbWlzZSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gIC8qKiBAdHlwZSB7IFByb21pc2VSZWNvcmQ8Vm90ZVN0YXRpc3RpY3M+IH0gKi9cbiAgY29uc3QgdGFsbHlQcm9taXNlID0gbWFrZVByb21pc2VLaXQoKTtcbiAgLyogVGhlIEVsZWN0b3JhdGUgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgdW5pcXVlIHNlYXQgZm9yIGVhY2ggdm90ZXIuKi9cbiAgLyogVGhpcyB2b3RlQ291bnRlciBhbGxvd3Mgdm90ZXJzIHRvIHJlLXZvdGUsIGFuZCByZXBsYWNlcyB0aGVpciBwcmV2aW91cyovXG4gIC8qIGNob2ljZSB3aXRoIHRoZSBuZXcgc2VsZWN0aW9uLiovXG5cbiAgLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZWNvcmRlZEJhbGxvdFxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gY2hvc2VuXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gc2hhcmVzXG4gKi9cbiAgLyoqIEB0eXBlIHtNYXBTdG9yZTxIYW5kbGU8J1ZvdGVyJz4sUmVjb3JkZWRCYWxsb3Q+IH0gKi9cbiAgY29uc3QgYWxsQmFsbG90cyA9IG1ha2VTY2FsYXJNYXBTdG9yZSgndm90ZXJIYW5kbGUnKTtcblxuICBjb25zdCBjb3VudFZvdGVzID0gKCkgPT4ge1xuICAgICFpc09wZW4gfHwgRmFpbGBjYW4ndCBjb3VudCB2b3RlcyB3aGlsZSB0aGUgZWxlY3Rpb24gaXMgb3BlbmA7XG5cbiAgICAvKiBxdWVzdGlvbiBoYXMgcG9zaXRpb24gY2hvaWNlczsgRWFjaCBiYWxsb3QgaW4gYWxsQmFsbG90cyBzaG91bGQqL1xuICAgIC8qIG1hdGNoLiBjb3VudCB0aGUgdmFsaWQgYmFsbG90cyBhbmQgcmVwb3J0IHJlc3VsdHMuKi9cbiAgICBsZXQgc3BvaWxlZCA9IDBuO1xuICAgIGNvbnN0IHRhbGx5ID0gWzBuLCAwbl07XG5cbiAgICBmb3IgKGNvbnN0IHsgY2hvc2VuLCBzaGFyZXMgfSBvZiBhbGxCYWxsb3RzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBjaG9pY2UgPSBwb3NpdGlvbnMuZmluZEluZGV4KHAgPT4ga2V5RVEocCwgY2hvc2VuKSk7XG4gICAgICBpZiAoY2hvaWNlIDwgMCkge1xuICAgICAgICBzcG9pbGVkICs9IHNoYXJlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhbGx5W2Nob2ljZV0gKz0gc2hhcmVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7IFZvdGVTdGF0aXN0aWNzIH0gKi9cbiAgICBjb25zdCBzdGF0cyA9IHtcbiAgICAgIHNwb2lsZWQsXG4gICAgICB2b3RlczogYWxsQmFsbG90cy5nZXRTaXplKCksXG4gICAgICByZXN1bHRzOiBbXG4gICAgICAgIHsgcG9zaXRpb246IHBvc2l0aW9uc1swXSwgdG90YWw6IHRhbGx5WzBdIH0sXG4gICAgICAgIHsgcG9zaXRpb246IHBvc2l0aW9uc1sxXSwgdG90YWw6IHRhbGx5WzFdIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICAvKiBDUlVDSUFMOiBjb3VudFZvdGVzIG9ubHkgZ2V0cyBjYWxsZWQgb25jZSBmb3IgZWFjaCBxdWVzdGlvbi4gV2Ugd2FudCB0byovXG4gICAgLyogZW5zdXJlIHRoYXQgdGFsbHlQcm9taXNlIGFuZCBvdXRjb21lUHJvbWlzZSBhbHdheXMgZ2V0IHJlc29sdmVkLiBUaGUqL1xuICAgIC8qIHRhbGx5IGdldHMgdGhlIHJlc3VsdHMgcmVnYXJkbGVzcyBvZiB0aGUgb3V0Y29tZS4gb3V0Y29tZVByb21pc2UgZ2V0cyBhKi9cbiAgICAvKiBkaWZmZXJlbnQgcmVzb2x1dGlvbiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGVyZSB3YXMgbm8gcXVvcnVtIHRvIG1ha2UgYSovXG4gICAgLyogZGVjaXNpb24sIG9yIHRoZSBvdXRjb21lIGlzIGJhc2VkIG9uIGEgbWFqb3JpdHkgZWl0aGVyIHdheSwgb3IgYSB0aWUuKi9cbiAgICB0YWxseVByb21pc2UucmVzb2x2ZShzdGF0cyk7XG5cbiAgICBpZiAoIW1ha2VRdW9ydW1Db3VudGVyKHRocmVzaG9sZCkuY2hlY2soc3RhdHMpKSB7XG4gICAgICBvdXRjb21lUHJvbWlzZS5yZWplY3QoJ05vIHF1b3J1bScpO1xuICAgICAgLyoqIEB0eXBlIHtPdXRjb21lUmVjb3JkfSAqL1xuICAgICAgY29uc3Qgdm90ZU91dGNvbWUgPSB7XG4gICAgICAgIHF1ZXN0aW9uOiBkZXRhaWxzLnF1ZXN0aW9uSGFuZGxlLFxuICAgICAgICBvdXRjb21lOiAnZmFpbCcsXG4gICAgICAgIHJlYXNvbjogJ05vIHF1b3J1bScsXG4gICAgICB9O1xuICAgICAgdm9pZCBFKHB1Ymxpc2hlcikucHVibGlzaCh2b3RlT3V0Y29tZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRhbGx5WzBdID4gdGFsbHlbMV0pIHtcbiAgICAgIG91dGNvbWVQcm9taXNlLnJlc29sdmUocG9zaXRpb25zWzBdKTtcbiAgICB9IGVsc2UgaWYgKHRhbGx5WzFdID4gdGFsbHlbMF0pIHtcbiAgICAgIG91dGNvbWVQcm9taXNlLnJlc29sdmUocG9zaXRpb25zWzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Y29tZVByb21pc2UucmVzb2x2ZShxdWVzdGlvblNwZWMudGllT3V0Y29tZSk7XG4gICAgfVxuXG4gICAgLyogWFhYIGlmIHdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aWVzLCBwdWJsaXNoIHNob3VsZCBiZSBjYWxsZWQgaW4gaWYgYWJvdmUqL1xuICAgIHZvaWQgRS53aGVuKG91dGNvbWVQcm9taXNlLnByb21pc2UsIHBvc2l0aW9uID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7T3V0Y29tZVJlY29yZH0gKi9cbiAgICAgIGNvbnN0IHZvdGVPdXRjb21lID0ge1xuICAgICAgICBxdWVzdGlvbjogZGV0YWlscy5xdWVzdGlvbkhhbmRsZSxcbiAgICAgICAgcG9zaXRpb24sXG4gICAgICAgIG91dGNvbWU6ICd3aW4nLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBFKHB1Ymxpc2hlcikucHVibGlzaCh2b3RlT3V0Y29tZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY2xvc2VGYWNldCA9IG1ha2VFeG8oXG4gICAgJ0JpbmFyeVZvdGVDb3VudGVyIGNsb3NlJyxcbiAgICBCaW5hcnlWb3RlQ291bnRlckNsb3NlSSxcbiAgICB7XG4gICAgICBjbG9zZVZvdGluZygpIHtcbiAgICAgICAgaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIGNvdW50Vm90ZXMoKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBjcmVhdG9yRmFjZXQgPSBtYWtlRXhvKFxuICAgICdCaW5hcnlWb3RlQ291bnRlciBjcmVhdG9yJyxcbiAgICBCaW5hcnlWb3RlQ291bnRlckFkbWluSSxcbiAgICB7XG4gICAgICBzdWJtaXRWb3RlKHZvdGVySGFuZGxlLCBjaG9zZW5Qb3NpdGlvbnMsIHNoYXJlcyA9IDFuKSB7XG4gICAgICAgIGFzc2VydChjaG9zZW5Qb3NpdGlvbnMubGVuZ3RoID09PSAxLCAnb25seSAxIHBvc2l0aW9uIGFsbG93ZWQnKTtcbiAgICAgICAgY29uc3QgW3Bvc2l0aW9uXSA9IGNob3NlblBvc2l0aW9ucztcbiAgICAgICAgcG9zaXRpb25JbmNsdWRlZChwb3NpdGlvbnMsIHBvc2l0aW9uKSB8fFxuICAgICAgICAgIEZhaWxgVGhlIHNwZWNpZmllZCBjaG9pY2UgaXMgbm90IGEgbGVnYWwgcG9zaXRpb246ICR7cG9zaXRpb259LmA7XG5cbiAgICAgICAgLyogQ1JVQ0lBTDogSWYgdGhlIHZvdGVyIGNhc3QgYSB2YWxpZCBiYWxsb3QsIHdlJ2xsIHJlY29yZCBpdCwgYnV0IHdlIG5lZWQqL1xuICAgICAgICAvKiB0byBtYWtlIHN1cmUgdGhhdCBlYWNoIHZvdGVyJ3Mgdm90ZSBpcyByZWNvcmRlZCBvbmx5IG9uY2UuKi9cbiAgICAgICAgY29uc3QgY29tcGxldGVkQmFsbG90ID0gaGFyZGVuKHsgY2hvc2VuOiBwb3NpdGlvbiwgc2hhcmVzIH0pO1xuICAgICAgICBhbGxCYWxsb3RzLmhhcyh2b3RlckhhbmRsZSlcbiAgICAgICAgICA/IGFsbEJhbGxvdHMuc2V0KHZvdGVySGFuZGxlLCBjb21wbGV0ZWRCYWxsb3QpXG4gICAgICAgICAgOiBhbGxCYWxsb3RzLmluaXQodm90ZXJIYW5kbGUsIGNvbXBsZXRlZEJhbGxvdCk7XG4gICAgICAgIHJldHVybiBjb21wbGV0ZWRCYWxsb3Q7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgcHVibGljRmFjZXQgPSBtYWtlRXhvKFxuICAgICdCaW5hcnlWb3RlQ291bnRlciBwdWJsaWMnLFxuICAgIEJpbmFyeVZvdGVDb3VudGVyUHVibGljSSxcbiAgICB7XG4gICAgICBnZXRRdWVzdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uO1xuICAgICAgfSxcbiAgICAgIGlzT3BlbigpIHtcbiAgICAgICAgcmV0dXJuIGlzT3BlbjtcbiAgICAgIH0sXG4gICAgICBnZXRPdXRjb21lKCkge1xuICAgICAgICByZXR1cm4gb3V0Y29tZVByb21pc2UucHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBnZXRTdGF0cygpIHtcbiAgICAgICAgcmV0dXJuIHRhbGx5UHJvbWlzZS5wcm9taXNlO1xuICAgICAgfSxcbiAgICAgIGdldERldGFpbHMoKSB7XG4gICAgICAgIHJldHVybiBkZXRhaWxzO1xuICAgICAgfSxcbiAgICAgIGdldEluc3RhbmNlKCkge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgY3JlYXRvckZhY2V0LFxuICAgIHB1YmxpY0ZhY2V0LFxuICAgIGNsb3NlRmFjZXQsXG4gIH0pO1xufTtcblxuLyogVGhlIGNvbnRyYWN0IHdyYXBwZXIgZXh0cmFjdHMgdGhlIHRlcm1zIGFuZCBydW5zIG1ha2VCaW5hcnlWb3RlQ291bnRlcigpLiovXG4vKiBJdCBzY2hlZHVsZXMgdGhlIGNsb3Npbmcgb2YgdGhlIHZvdGUsIGZpbmFsbHkgaW5zZXJ0aW5nIHRoZSBjb250cmFjdCovXG4vKiBpbnN0YW5jZSBpbiB0aGUgcHVibGljRmFjZXQgYmVmb3JlIHJldHVybmluZyBwdWJsaWMgYW5kIGNyZWF0b3IgZmFjZXRzLiovXG5cbi8qKlxuICogQHBhcmFtIHtaQ0Y8e3F1ZXN0aW9uU3BlYzogUXVlc3Rpb25TcGVjLCBxdW9ydW1UaHJlc2hvbGQ6IGJpZ2ludH0+fSB6Y2ZcbiAqIEBwYXJhbSB7e291dGNvbWVQdWJsaXNoZXI6IFB1Ymxpc2hlcjxPdXRjb21lUmVjb3JkPn19IG91dGNvbWVQdWJsaXNoZXJcbiAqLyRozY9fb25jZS5tYWtlQmluYXJ5Vm90ZUNvdW50ZXIobWFrZUJpbmFyeVZvdGVDb3VudGVyKTtcbmNvbnN0IHN0YXJ0ID0gKHpjZiwgeyBvdXRjb21lUHVibGlzaGVyIH0pID0+IHtcbiAgLyogVGhlcmUgYXJlIGEgdmFyaWV0eSBvZiB3YXlzIG9mIGNvdW50aW5nIHF1b3J1bXMuIFRoZSBwYXJhbWV0ZXJzIG11c3QgYmUqL1xuICAvKiB2aXNpYmxlIGluIHRoZSB0ZXJtcy4gV2UncmUgZG9pbmcgYSBzaW1wbGUgdGhyZXNob2xkIGhlcmUuIElmIHdlIHdhbnRlZCB0byovXG4gIC8qIGRpc2NvdW50IGFic3RlbnRpb25zLCB3ZSBjb3VsZCByZWZhY3RvciB0byBwcm92aWRlIHRoZSBxdW9ydW1Db3VudGVyIGFzIGEqL1xuICAvKiBjb21wb25lbnQuKi9cbiAgLyogVE9ETyhoaWJiZXJ0KSBjaGVja2luZyB0aGUgcXVvcnVtIHNob3VsZCBiZSBwbHVnZ2FibGUgYW5kIGxlZ2libGUuKi9cbiAgY29uc3QgeyBxdWVzdGlvblNwZWMsIHF1b3J1bVRocmVzaG9sZCB9ID0gemNmLmdldFRlcm1zKCk7XG4gIC8qIFRoZSBjbG9zZUZhY2V0IGlzIGV4cG9zZWQgZm9yIHRlc3RpbmcsIGJ1dCBkb2Vzbid0IGVzY2FwZSBmcm9tIGEgY29udHJhY3QqL1xuICBjb25zdCB7IHB1YmxpY0ZhY2V0LCBjcmVhdG9yRmFjZXQsIGNsb3NlRmFjZXQgfSA9IG1ha2VCaW5hcnlWb3RlQ291bnRlcihcbiAgICBxdWVzdGlvblNwZWMsXG4gICAgcXVvcnVtVGhyZXNob2xkLFxuICAgIHpjZi5nZXRJbnN0YW5jZSgpLFxuICAgIG91dGNvbWVQdWJsaXNoZXIsXG4gICk7XG5cbiAgc2NoZWR1bGVDbG9zZShxdWVzdGlvblNwZWMuY2xvc2luZ1J1bGUsICgpID0+IGNsb3NlRmFjZXQuY2xvc2VWb3RpbmcoKSk7XG5cbiAgcmV0dXJuIHsgcHVibGljRmFjZXQsIGNyZWF0b3JGYWNldCB9O1xufTskaM2PX29uY2Uuc3RhcnQoc3RhcnQpO1xuXG5oYXJkZW4oc3RhcnQpO1xuaGFyZGVuKG1ha2VCaW5hcnlWb3RlQ291bnRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQmluYXJ5Vm90ZUNvdW50ZXIiOlsibWFrZUJpbmFyeVZvdGVDb3VudGVyIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP4MGv2VAwAAlQMAAC0AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY2xvc2luZ1J1bGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJzY2hlZHVsZUNsb3NlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Nsb3NlVm90aW5nfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiogQHR5cGUge0Nsb3NlVm90aW5nfSAqL1xuICAgICAgIGNvbnN0IHNjaGVkdWxlQ2xvc2UgPSAoY2xvc2luZ1J1bGUsIGNsb3NlVm90aW5nKSA9PiB7XG4gIGNvbnN0IHsgdGltZXIsIGRlYWRsaW5lIH0gPSBjbG9zaW5nUnVsZTtcbiAgdm9pZCBFKHRpbWVyKS5zZXRXYWtldXAoXG4gICAgZGVhZGxpbmUsXG4gICAgRmFyKCdjbG9zZSB2b3RpbmcnLCB7XG4gICAgICB3YWtlOiBjbG9zZVZvdGluZyxcbiAgICB9KSxcbiAgKTtcbn07JGjNj19vbmNlLnNjaGVkdWxlQ2xvc2Uoc2NoZWR1bGVDbG9zZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzY2hlZHVsZUNsb3NlIjpbInNjaGVkdWxlQ2xvc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAt5hiXQMRAAADEQAAKgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9xdWVzdGlvbi5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy96b2Uvc3JjL21ha2VIYW5kbGUuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJDaG9pY2VNZXRob2QiLCJFbGVjdGlvblR5cGUiLCJRdW9ydW1SdWxlIiwiYnVpbGRRdWVzdGlvbiIsImNvZXJjZVF1ZXN0aW9uU3BlYyIsInBvc2l0aW9uSW5jbHVkZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRXhvLG11c3RNYXRjaCxrZXlFUSxNLG1ha2VIYW5kbGUsUXVlc3Rpb25JLFF1ZXN0aW9uU3BlY1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qc1wiLCBbW1wibWFrZUhhbmRsZVwiLFskaM2PX2EgPT4gKG1ha2VIYW5kbGUgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlF1ZXN0aW9uSVwiLFskaM2PX2EgPT4gKFF1ZXN0aW9uSSA9ICRozY9fYSldXSxbXCJRdWVzdGlvblNwZWNTaGFwZVwiLFskaM2PX2EgPT4gKFF1ZXN0aW9uU3BlY1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtCdWlsZFF1ZXN0aW9uLCBQb3NpdGlvbkluY2x1ZGVkLCBRdWVzdGlvbiwgUXVlc3Rpb25TcGVjfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiBUb3BpY3MgYmVpbmcgdm90ZWQgb24gYXJlICdRdWVzdGlvbnMnLiBCZWZvcmUgYSBRdWVzdGlvbiBpcyBrbm93biB0byBhKi9cbi8qIGVsZWN0b3JhdGUsIHRoZSBwYXJhbWV0ZXJzIGNhbiBiZSBkZXNjcmliZWQgd2l0aCBhIFF1ZXN0aW9uU3BlYy4gT25jZSB0aGUqL1xuLyogcXVlc3Rpb24gaGFzIGJlZW4gcHJlc2VudGVkIHRvIGFuIEVsZWN0b3JhdGUsIHRoZXJlIGlzIGEgUXVlc3Rpb25EZXRhaWxzKi9cbi8qIHJlY29yZCB0aGF0IGFsc28gaW5jbHVkZXMgdGhlIFZvdGVDb3VudGVyIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIHRoZSBvdXRjb21lKi9cbi8qIGFuZCB0aGUgcXVlc3Rpb25IYW5kbGUgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGl0LiovXG5cbi8qKlxuICogXCJ1bnJhbmtlZFwiIGlzIG1vcmUgZm9ybWFsbHkga25vd24gYXMgXCJhcHByb3ZhbFwiIHZvdGluZywgYnV0IHRoaXMgaXMgaGFyZCBmb3JcbiAqIHBlb3BsZSB0byBpbnR1aXQgd2hlbiB0aGVyZSBhcmUgb25seSB0d28gYWx0ZXJuYXRpdmVzLlxuICovXG5jb25zdCBDaG9pY2VNZXRob2QgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBVTlJBTktFRDogJ3VucmFua2VkJyxcbiAgT1JERVI6ICdvcmRlcicsXG4gIFBMVVJBTElUWTogJ3BsdXJhbGl0eScsXG59KTskaM2PX29uY2UuQ2hvaWNlTWV0aG9kKENob2ljZU1ldGhvZCk7XG5cbmNvbnN0IEVsZWN0aW9uVHlwZSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIC8qIEEgcGFyYW1ldGVyIGlzIG5hbWVkLCBhbmQgYSBuZXcgdmFsdWUgcHJvcG9zZWQqL1xuICBQQVJBTV9DSEFOR0U6ICdwYXJhbV9jaGFuZ2UnLFxuICAvKiBjaG9vc2Ugb25lIG9yIG11bHRpcGxlIHdpbm5lcnMsIGRlcGVuZGluZyBvbiBDaG9pY2VNZXRob2QqL1xuICBFTEVDVElPTjogJ2VsZWN0aW9uJyxcbiAgU1VSVkVZOiAnc3VydmV5JyxcbiAgLyogd2hldGhlciBvciBub3QgdG8gaW52b2tlIGFuIEFQSSBtZXRob2QqL1xuICBBUElfSU5WT0NBVElPTjogJ2FwaV9pbnZvY2F0aW9uJyxcbiAgT0ZGRVJfRklMVEVSOiAnb2ZmZXJfZmlsdGVyJyxcbn0pOyRozY9fb25jZS5FbGVjdGlvblR5cGUoRWxlY3Rpb25UeXBlKTtcblxuY29uc3QgUXVvcnVtUnVsZSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIE1BSk9SSVRZOiAnbWFqb3JpdHknLFxuICBOT19RVU9SVU06ICdub19xdW9ydW0nLFxuICAvKiBUaGUgZWxlY3Rpb24gaXNuJ3QgdmFsaWQgdW5sZXNzIGFsbCB2b3RlcnMgdm90ZSovXG4gIEFMTDogJ2FsbCcsXG59KTtcblxuLyoqIEB0eXBlIHtQb3NpdGlvbkluY2x1ZGVkfSAqLyRozY9fb25jZS5RdW9ydW1SdWxlKFF1b3J1bVJ1bGUpO1xuY29uc3QgcG9zaXRpb25JbmNsdWRlZCA9IChwb3NpdGlvbnMsIHApID0+IHBvc2l0aW9ucy5zb21lKGUgPT4ga2V5RVEoZSwgcCkpO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IGFsbGVnZWRRdWVzdGlvblNwZWNcbiAqIEByZXR1cm5zIHtRdWVzdGlvblNwZWN9XG4gKi8kaM2PX29uY2UucG9zaXRpb25JbmNsdWRlZChwb3NpdGlvbkluY2x1ZGVkKTtcbmNvbnN0IGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICh7XG4gIG1ldGhvZCxcbiAgaXNzdWUsXG4gIHBvc2l0aW9ucyxcbiAgZWxlY3Rpb25UeXBlLFxuICBtYXhDaG9pY2VzLFxuICBtYXhXaW5uZXJzLFxuICBjbG9zaW5nUnVsZSxcbiAgcXVvcnVtUnVsZSxcbiAgdGllT3V0Y29tZSxcbn0pID0+IHtcbiAgY29uc3QgcXVlc3Rpb24gPSBoYXJkZW4oe1xuICAgIG1ldGhvZCxcbiAgICBpc3N1ZSxcbiAgICBwb3NpdGlvbnMsXG4gICAgbWF4Q2hvaWNlczogTnVtYmVyKG1heENob2ljZXMpLFxuICAgIG1heFdpbm5lcnM6IE51bWJlcihtYXhXaW5uZXJzKSxcbiAgICBlbGVjdGlvblR5cGUsXG4gICAgY2xvc2luZ1J1bGUsXG4gICAgcXVvcnVtUnVsZSxcbiAgICB0aWVPdXRjb21lLFxuICB9KTtcblxuICBtdXN0TWF0Y2gocXVlc3Rpb24sIFF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAvKiBYWFggSXQgd291bGQgYmUgbmljZSB0byBlbmZvcmNlIHRoaXMgdXNpbmcgcGFyYW1ldGVyaXplZCB0eXBlcywgYnV0IHRoYXQqL1xuICAvKiBzZWVtcyB0byBvbmx5IGVuZm9yY2UgdHlwZSBjb25zdHJhaW50cywgKGkuZS4gdGhlIHRpZU91dGNvbWUgd2lsbCBiZSB0aGUqL1xuICAvKiBzYW1lIHR5cGUgYXMgYW55IG9mIHRoZSBwb3NpdGlvbnMpIHVubGVzcyB5b3UgY2FuIHByb3ZpZGUgdGhlIGNvbmNyZXRlKi9cbiAgLyogdmFsdWUgYXQgcGF0dGVybiBjcmVhdGlvbiB0aW1lLiovXG4gIG11c3RNYXRjaChxdWVzdGlvbi50aWVPdXRjb21lLCBNLm9yKC4uLnF1ZXN0aW9uLnBvc2l0aW9ucykpO1xuXG4gIHJldHVybiBxdWVzdGlvbjtcbn07XG5cbi8qKiBAdHlwZSB7QnVpbGRRdWVzdGlvbn0gKi8kaM2PX29uY2UuY29lcmNlUXVlc3Rpb25TcGVjKGNvZXJjZVF1ZXN0aW9uU3BlYyk7XG5jb25zdCBidWlsZFF1ZXN0aW9uID0gKHF1ZXN0aW9uU3BlYywgY291bnRlckluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IHF1ZXN0aW9uSGFuZGxlID0gbWFrZUhhbmRsZSgnUXVlc3Rpb24nKTtcblxuICAvKiogQHR5cGUge1F1ZXN0aW9ufSAqL1xuICByZXR1cm4gbWFrZUV4bygncXVlc3Rpb24gZGV0YWlscycsIFF1ZXN0aW9uSSwge1xuICAgIGdldFZvdGVDb3VudGVyKCkge1xuICAgICAgcmV0dXJuIGNvdW50ZXJJbnN0YW5jZTtcbiAgICB9LFxuICAgIGdldERldGFpbHMoKSB7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgLi4ucXVlc3Rpb25TcGVjLFxuICAgICAgICBxdWVzdGlvbkhhbmRsZSxcbiAgICAgICAgY291bnRlckluc3RhbmNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5idWlsZFF1ZXN0aW9uKGJ1aWxkUXVlc3Rpb24pO1xuXG5oYXJkZW4oYnVpbGRRdWVzdGlvbik7XG5oYXJkZW4oQ2hvaWNlTWV0aG9kKTtcbmhhcmRlbihFbGVjdGlvblR5cGUpO1xuaGFyZGVuKGNvZXJjZVF1ZXN0aW9uU3BlYyk7XG5oYXJkZW4ocG9zaXRpb25JbmNsdWRlZCk7XG5oYXJkZW4oUXVvcnVtUnVsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDaG9pY2VNZXRob2QiOlsiQ2hvaWNlTWV0aG9kIl0sIkVsZWN0aW9uVHlwZSI6WyJFbGVjdGlvblR5cGUiXSwiUXVvcnVtUnVsZSI6WyJRdW9ydW1SdWxlIl0sInBvc2l0aW9uSW5jbHVkZWQiOlsicG9zaXRpb25JbmNsdWRlZCJdLCJjb2VyY2VRdWVzdGlvblNwZWMiOlsiY29lcmNlUXVlc3Rpb25TcGVjIl0sImJ1aWxkUXVlc3Rpb24iOlsiYnVpbGRRdWVzdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA75aH4lAMAAJQDAAAvAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3F1b3J1bUNvdW50ZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VRdW9ydW1Db3VudGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQGltcG9ydCB7UXVvcnVtQ291bnRlcn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuICAgICAgIGNvbnN0IG1ha2VRdW9ydW1Db3VudGVyID0gcXVvcnVtVGhyZXNob2xkID0+IHtcbiAgY29uc3QgY2hlY2sgPSBzdGF0cyA9PiB7XG4gICAgY29uc3Qgdm90ZXMgPSBzdGF0cy5yZXN1bHRzLnJlZHVjZShcbiAgICAgIChydW5uaW5nVG90YWwsIHsgdG90YWwgfSkgPT4gcnVubmluZ1RvdGFsICsgdG90YWwsXG4gICAgICAwbixcbiAgICApO1xuICAgIHJldHVybiB2b3RlcyA+PSBxdW9ydW1UaHJlc2hvbGQ7XG4gIH07XG4gIC8qKiBAdHlwZSB7UXVvcnVtQ291bnRlcn0gKi9cbiAgcmV0dXJuIEZhcignY2hlY2tlcicsIHsgY2hlY2sgfSk7XG59OyRozY9fb25jZS5tYWtlUXVvcnVtQ291bnRlcihtYWtlUXVvcnVtQ291bnRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUXVvcnVtQ291bnRlciI6WyJtYWtlUXVvcnVtQ291bnRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACbQMhtLEAAACxAAAAsAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSIsIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9ub3RpZmllciJdLCJleHBvcnRzIjpbIkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSIsIkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSIsIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSIsIkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JIiwiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiLCJCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kiLCJDaG9pY2VNZXRob2RTaGFwZSIsIkNsb3NpbmdSdWxlU2hhcGUiLCJFbGVjdGlvblR5cGVTaGFwZSIsIkVsZWN0b3JhdGVDcmVhdG9ySSIsIkVsZWN0b3JhdGVQdWJsaWNJIiwiR292ZXJub3JGYWNldFNoYXBlIiwiSW52aXRhdGlvblNoYXBlIiwiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSIsIk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIiwiTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIiwiTm9TaW1wbGVQb3NpdGlvblNoYXBlIiwiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIiwiT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSIsIk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlIiwiUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSIsIlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlIiwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSIsIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSIsIlBhcmFtUGF0aFNoYXBlIiwiUG9zaXRpb25TaGFwZSIsIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiUXVlc3Rpb25IYW5kbGVTaGFwZSIsIlF1ZXN0aW9uSSIsIlF1ZXN0aW9uU3BlY1NoYXBlIiwiUXVlc3Rpb25TdGF0c1NoYXBlIiwiUXVvcnVtUnVsZVNoYXBlIiwiU2ltcGxlSXNzdWVTaGFwZSIsIlNpbXBsZVBvc2l0aW9uc1NoYXBlIiwiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSIsIlZvdGVDb3VudGVyQWRtaW5JIiwiVm90ZUNvdW50ZXJDbG9zZUkiLCJWb3RlQ291bnRlclB1YmxpY0kiLCJWb3RlckhhbmRsZSIsIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIiwiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIiwiWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSIsIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLFRpbWVzdGFtcFNoYXBlLEluc3RhbmNlSGFuZGxlU2hhcGUsVGltZXJTaGFwZSxtYWtlSGFuZGxlU2hhcGUsU3Vic2NyaWJlclNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiSW5zdGFuY2VIYW5kbGVTaGFwZVwiLFskaM2PX2EgPT4gKEluc3RhbmNlSGFuZGxlU2hhcGUgPSAkaM2PX2EpXV0sW1wiVGltZXJTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVyU2hhcGUgPSAkaM2PX2EpXV0sW1wibWFrZUhhbmRsZVNoYXBlXCIsWyRozY9fYSA9PiAobWFrZUhhbmRsZVNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsWyRozY9fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4gICAgICAgY29uc3QgQ2hvaWNlTWV0aG9kU2hhcGUgPSBNLm9yKCd1bnJhbmtlZCcsICdvcmRlcicsICdwbHVyYWxpdHknKTskaM2PX29uY2UuQ2hvaWNlTWV0aG9kU2hhcGUoQ2hvaWNlTWV0aG9kU2hhcGUpO1xuICAgICAgIGNvbnN0IFF1b3J1bVJ1bGVTaGFwZSA9IE0ub3IoJ21ham9yaXR5JywgJ25vX3F1b3J1bScsICdhbGwnKTskaM2PX29uY2UuUXVvcnVtUnVsZVNoYXBlKFF1b3J1bVJ1bGVTaGFwZSk7XG4gICAgICAgY29uc3QgRWxlY3Rpb25UeXBlU2hhcGUgPSBNLm9yKFxuICAncGFyYW1fY2hhbmdlJyxcbiAgJ2VsZWN0aW9uJyxcbiAgJ3N1cnZleScsXG4gICdhcGlfaW52b2NhdGlvbicsXG4gICdvZmZlcl9maWx0ZXInLFxuKTskaM2PX29uY2UuRWxlY3Rpb25UeXBlU2hhcGUoRWxlY3Rpb25UeXBlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgQ2xvc2luZ1J1bGVTaGFwZSA9IHtcbiAgdGltZXI6IE0uZXJlZihUaW1lclNoYXBlKSxcbiAgZGVhZGxpbmU6IFRpbWVzdGFtcFNoYXBlLFxufTskaM2PX29uY2UuQ2xvc2luZ1J1bGVTaGFwZShDbG9zaW5nUnVsZVNoYXBlKTtcbmhhcmRlbihDbG9zaW5nUnVsZVNoYXBlKTtcblxuLyogYWxsIHRoZSBzdHJpbmdzIHRoYXQgd2lsbCBiZSBpbiB0aGUgZmlsdGVyIGFmdGVyIHBhc3NpbmcqL1xuICAgICAgIGNvbnN0IFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSA9IHtcbiAgc3RyaW5nczogTS5hcnJheU9mKE0uc3RyaW5nKCkpLFxufTskaM2PX29uY2UuWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlID0geyBkb250VXBkYXRlOiBNLmFycmF5T2YoTS5zdHJpbmcoKSkgfTskaM2PX29uY2UuTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUoTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUgPSBbXG4gIFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbiAgTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG5dOyRozY9fb25jZS5PZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlKE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUpO1xuaGFyZGVuKE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlID0geyBzdHJpbmdzOiBNLmFycmF5T2YoTS5zdHJpbmcoKSkgfTskaM2PX29uY2UuT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlKE9mZmVyRmlsdGVySXNzdWVTaGFwZSk7XG5oYXJkZW4oT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUgPSB7XG4gIG1ldGhvZDogQ2hvaWNlTWV0aG9kU2hhcGUsXG4gIGlzc3VlOiBPZmZlckZpbHRlcklzc3VlU2hhcGUsXG4gIHBvc2l0aW9uczogT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSxcbiAgZWxlY3Rpb25UeXBlOiAnb2ZmZXJfZmlsdGVyJyxcbiAgbWF4Q2hvaWNlczogMSxcbiAgbWF4V2lubmVyczogMSxcbiAgY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlU2hhcGUsXG4gIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGVTaGFwZSxcbiAgdGllT3V0Y29tZTogTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG59OyRozY9fb25jZS5PZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlKE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUpO1xuaGFyZGVuKE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSA9IHtcbiAgLi4uT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSxcbiAgcXVlc3Rpb25IYW5kbGU6IG1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbiAgY291bnRlckluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxufTskaM2PX29uY2UuT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZShPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcbmhhcmRlbihPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuLyoga2V5cyBhcmUgcGFyYW1ldGVyIG5hbWVzLCB2YWx1ZXMgYXJlIHByb3Bvc2VkIHZhbHVlcyovXG4gICAgICAgY29uc3QgUGFyYW1DaGFuZ2VzU3BlY1NoYXBlID0gTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLmFueSgpKTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzU3BlY1NoYXBlKFBhcmFtQ2hhbmdlc1NwZWNTaGFwZSk7XG4gICAgICAgY29uc3QgWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSA9IFBhcmFtQ2hhbmdlc1NwZWNTaGFwZTskaM2PX29uY2UuWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZShZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUgPSB7IG5vQ2hhbmdlOiBNLmFycmF5T2YoTS5zdHJpbmcoKSkgfTskaM2PX29uY2UuTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IFBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlID0gW1xuICBZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuICBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG5dOyRozY9fb25jZS5QYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZShQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSk7XG5oYXJkZW4oUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUGFyYW1QYXRoU2hhcGUgPSB7IGtleTogTS5hbnkoKSB9OyRozY9fb25jZS5QYXJhbVBhdGhTaGFwZShQYXJhbVBhdGhTaGFwZSk7XG5oYXJkZW4oUGFyYW1QYXRoU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSA9IHtcbiAgc3BlYzoge1xuICAgIHBhcmFtUGF0aDogUGFyYW1QYXRoU2hhcGUsXG4gICAgY2hhbmdlczogUGFyYW1DaGFuZ2VzU3BlY1NoYXBlLFxuICB9LFxuICBjb250cmFjdDogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbn07JGjNj19vbmNlLlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUoUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSk7XG5oYXJkZW4oUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiAndW5yYW5rZWQnLFxuICBpc3N1ZTogUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSxcbiAgcG9zaXRpb25zOiBQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSxcbiAgZWxlY3Rpb25UeXBlOiAncGFyYW1fY2hhbmdlJyxcbiAgbWF4Q2hvaWNlczogMSxcbiAgbWF4V2lubmVyczogMSxcbiAgY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlU2hhcGUsXG4gIHF1b3J1bVJ1bGU6ICdtYWpvcml0eScsXG4gIHRpZU91dGNvbWU6IE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbn07JGjNj19vbmNlLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKTtcbmhhcmRlbihQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSA9IHtcbiAgLi4uUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUsXG4gIHF1ZXN0aW9uSGFuZGxlOiBtYWtlSGFuZGxlU2hhcGUoJ1F1ZXN0aW9uJyksXG4gIGNvdW50ZXJJbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbn07JGjNj19vbmNlLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcbmhhcmRlbihQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbmNvbnN0IEFwaUludm9jYXRpb25TcGVjU2hhcGUgPSB7XG4gIGFwaU1ldGhvZE5hbWU6IE0uc3RyaW5nKCksXG4gIG1ldGhvZEFyZ3M6IE0uYXJyYXlPZihNLmFueSgpKSxcbn07XG5oYXJkZW4oQXBpSW52b2NhdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSA9IEFwaUludm9jYXRpb25TcGVjU2hhcGU7JGjNj19vbmNlLlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlID0geyBkb250SW52b2tlOiBNLnN0cmluZygpIH07JGjNj19vbmNlLk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUoTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUgPSBbXG4gIFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuICBOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuXTskaM2PX29uY2UuQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlKEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSk7XG5oYXJkZW4oQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiAndW5yYW5rZWQnLFxuICBpc3N1ZTogQXBpSW52b2NhdGlvblNwZWNTaGFwZSxcbiAgcG9zaXRpb25zOiBBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUsXG4gIGVsZWN0aW9uVHlwZTogJ2FwaV9pbnZvY2F0aW9uJyxcbiAgbWF4Q2hvaWNlczogMSxcbiAgbWF4V2lubmVyczogMSxcbiAgY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlU2hhcGUsXG4gIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGVTaGFwZSxcbiAgdGllT3V0Y29tZTogTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbn07JGjNj19vbmNlLkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZShBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUpO1xuaGFyZGVuKEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSB7XG4gIC4uLkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSxcbiAgcXVlc3Rpb25IYW5kbGU6IG1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbiAgY291bnRlckluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxufTskaM2PX29uY2UuQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKEFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuY29uc3QgU2ltcGxlU3BlY1NoYXBlID0geyB0ZXh0OiBNLnN0cmluZygpIH07XG5oYXJkZW4oU2ltcGxlU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFllc1NpbXBsZVBvc2l0aW9uU2hhcGUgPSB7IHRleHQ6IE0uc3RyaW5nKCkgfTskaM2PX29uY2UuWWVzU2ltcGxlUG9zaXRpb25TaGFwZShZZXNTaW1wbGVQb3NpdGlvblNoYXBlKTtcbmhhcmRlbihZZXNTaW1wbGVQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IE5vU2ltcGxlUG9zaXRpb25TaGFwZSA9IHsgdGV4dDogTS5zdHJpbmcoKSB9OyRozY9fb25jZS5Ob1NpbXBsZVBvc2l0aW9uU2hhcGUoTm9TaW1wbGVQb3NpdGlvblNoYXBlKTtcbmhhcmRlbihOb1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU2ltcGxlUG9zaXRpb25zU2hhcGUgPSBbXG4gIFllc1NpbXBsZVBvc2l0aW9uU2hhcGUsXG4gIE5vU2ltcGxlUG9zaXRpb25TaGFwZSxcbl07JGjNj19vbmNlLlNpbXBsZVBvc2l0aW9uc1NoYXBlKFNpbXBsZVBvc2l0aW9uc1NoYXBlKTtcbmhhcmRlbihTaW1wbGVQb3NpdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBTaW1wbGVJc3N1ZVNoYXBlID0gU2ltcGxlU3BlY1NoYXBlOyRozY9fb25jZS5TaW1wbGVJc3N1ZVNoYXBlKFNpbXBsZUlzc3VlU2hhcGUpO1xuaGFyZGVuKFNpbXBsZUlzc3VlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUgPSB7XG4gIG1ldGhvZDogQ2hvaWNlTWV0aG9kU2hhcGUsXG4gIGlzc3VlOiBTaW1wbGVJc3N1ZVNoYXBlLFxuICBwb3NpdGlvbnM6IE0uYXJyYXlPZih7IHRleHQ6IE0uc3RyaW5nKCkgfSksXG4gIGVsZWN0aW9uVHlwZTogTS5vcignZWxlY3Rpb24nLCAnc3VydmV5JyksXG4gIG1heENob2ljZXM6IE0uZ3RlKDEpLFxuICBtYXhXaW5uZXJzOiBNLmd0ZSgxKSxcbiAgY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlU2hhcGUsXG4gIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGVTaGFwZSxcbiAgdGllT3V0Y29tZTogTm9TaW1wbGVQb3NpdGlvblNoYXBlLFxufTskaM2PX29uY2UuU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUoU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUpO1xuaGFyZGVuKFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5TaW1wbGVRdWVzdGlvblNwZWNTaGFwZSxcbiAgcXVlc3Rpb25IYW5kbGU6IG1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbiAgY291bnRlckluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxufTskaM2PX29uY2UuU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUoU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuaGFyZGVuKFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFF1ZXN0aW9uU3BlY1NoYXBlID0gTS5vcihcbiAgQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlLFxuICBPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlLFxuICBQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSxcbiAgU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUsXG4pOyRozY9fb25jZS5RdWVzdGlvblNwZWNTaGFwZShRdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBQb3NpdGlvblNoYXBlID0gTS5vcihcbiAgWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG4gIE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG4gIFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbiAgTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG4gIFllc1NpbXBsZVBvc2l0aW9uU2hhcGUsXG4gIE5vU2ltcGxlUG9zaXRpb25TaGFwZSxcbiAgWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbiAgTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuKTskaM2PX29uY2UuUG9zaXRpb25TaGFwZShQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IFF1ZXN0aW9uSGFuZGxlU2hhcGUgPSBtYWtlSGFuZGxlU2hhcGUoJ3F1ZXN0aW9uJyk7XG5cbi8qIFRPRE8oaGliYmVydCk6IGFkZCBkZXRhaWxzOyBtb3ZlIHRvIGEgbW9yZSBhcHByb3ByaWF0ZSBsb2NhdGlvbiovJGjNj19vbmNlLlF1ZXN0aW9uSGFuZGxlU2hhcGUoUXVlc3Rpb25IYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgSW52aXRhdGlvblNoYXBlID0gTS5yZW1vdGFibGUoJ0ludml0YXRpb24nKTtcblxuLyogWFhYIEkgd2FudCB0byBhZGQgcXVlc3Rpb25IYW5kbGUgYW5kIGNvdW50ZXJJbnN0YW5jZSB0byovXG4vKiBQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZS4gSSBkb24ndCBzZWUgYW55IGFsdGVybmF0aXZlIHRvIGFkZGluZyB0aGUqL1xuLyogbWV0aG9kcyB0byBlYWNoIG1lbWJlciBzZXBhcmF0ZWx5Ki8kaM2PX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSBNLm9yKFxuICBQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSxcbiAgQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuICBPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuICBTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSxcbik7JGjNj19vbmNlLlF1ZXN0aW9uRGV0YWlsc1NoYXBlKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEVsZWN0b3JhdGVQdWJsaWNJID0gTS5pbnRlcmZhY2UoJ0NvbW1pdHRlZSBQdWJsaWNGYWNldCcsIHtcbiAgZ2V0UXVlc3Rpb25TdWJzY3JpYmVyOiBNLmNhbGwoKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG4gIGdldE9wZW5RdWVzdGlvbnM6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXROYW1lOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbiAgZ2V0UXVlc3Rpb246IE0uY2FsbChRdWVzdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5FbGVjdG9yYXRlUHVibGljSShFbGVjdG9yYXRlUHVibGljSSk7XG5jb25zdCBFbGVjdG9yYXRlUHVibGljU2hhcGUgPSBNLnJlbW90YWJsZSgnRWxlY3RvcmF0ZVB1YmxpYycpO1xuXG4gICAgICAgY29uc3QgRWxlY3RvcmF0ZUNyZWF0b3JJID0gTS5pbnRlcmZhY2UoJ0NvbW1pdHRlZSBBZG1pbkZhY2V0Jywge1xuICBnZXRQb3Nlckludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBhZGRRdWVzdGlvbjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUsIFF1ZXN0aW9uU3BlY1NoYXBlKS5yZXR1cm5zKFxuICAgIE0ucHJvbWlzZSgpLFxuICApLFxuICBnZXRWb3Rlckludml0YXRpb25zOiBNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihNLnByb21pc2UoKSkpLFxuICBnZXRRdWVzdGlvblN1YnNjcmliZXI6IE0uY2FsbCgpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbiAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoRWxlY3RvcmF0ZVB1YmxpY1NoYXBlKSxcbn0pOyRozY9fb25jZS5FbGVjdG9yYXRlQ3JlYXRvckkoRWxlY3RvcmF0ZUNyZWF0b3JJKTtcblxuICAgICAgIGNvbnN0IFF1ZXN0aW9uU3RhdHNTaGFwZSA9IHtcbiAgc3BvaWxlZDogTS5uYXQoKSxcbiAgdm90ZXM6IE0ubmF0KCksXG4gIHJlc3VsdHM6IE0uYXJyYXlPZih7IHBvc2l0aW9uOiBQb3NpdGlvblNoYXBlLCB0b3RhbDogTS5uYXQoKSB9KSxcbn07JGjNj19vbmNlLlF1ZXN0aW9uU3RhdHNTaGFwZShRdWVzdGlvblN0YXRzU2hhcGUpO1xuaGFyZGVuKFF1ZXN0aW9uU3RhdHNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBRdWVzdGlvbkkgPSBNLmludGVyZmFjZSgnUXVlc3Rpb24nLCB7XG4gIGdldFZvdGVDb3VudGVyOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICBnZXREZXRhaWxzOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKSxcbn0pOyRozY9fb25jZS5RdWVzdGlvbkkoUXVlc3Rpb25JKTtcbmNvbnN0IFF1ZXN0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnUXVlc3Rpb24nKTtcblxuICAgICAgIGNvbnN0IEJpbmFyeVZvdGVDb3VudGVyUHVibGljSSA9IE0uaW50ZXJmYWNlKFxuICAnQmluYXJ5Vm90ZUNvdW50ZXIgUHVibGljRmFjZXQnLFxuICB7XG4gICAgZ2V0UXVlc3Rpb246IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25TaGFwZSksXG4gICAgaXNPcGVuOiBNLmNhbGwoKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgICBnZXRPdXRjb21lOiBNLmNhbGwoKS5yZXR1cm5zKE0uZXJlZihNLnByb21pc2UoKSkpLFxuICAgIGdldFN0YXRzOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBnZXREZXRhaWxzOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKSxcbiAgICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbiAgfSxcbik7JGjNj19vbmNlLkJpbmFyeVZvdGVDb3VudGVyUHVibGljSShCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kpO1xuXG4gICAgICAgY29uc3QgVm90ZXJIYW5kbGUgPSBNLnJlbW90YWJsZSgpOyRozY9fb25jZS5Wb3RlckhhbmRsZShWb3RlckhhbmRsZSk7XG4gICAgICAgY29uc3QgQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkgPSBNLmludGVyZmFjZShcbiAgJ0JpbmFyeVZvdGVDb3VudGVyIEFkbWluRmFjZXQnLFxuICB7XG4gICAgc3VibWl0Vm90ZTogTS5jYWxsKFZvdGVySGFuZGxlLCBNLmFycmF5T2YoUG9zaXRpb25TaGFwZSkpXG4gICAgICAub3B0aW9uYWwoTS5uYXQoKSlcbiAgICAgIC5yZXR1cm5zKHsgY2hvc2VuOiBQb3NpdGlvblNoYXBlLCBzaGFyZXM6IE0ubmF0KCkgfSksXG4gIH0sXG4pOyRozY9fb25jZS5CaW5hcnlWb3RlQ291bnRlckFkbWluSShCaW5hcnlWb3RlQ291bnRlckFkbWluSSk7XG5cbiAgICAgICBjb25zdCBCaW5hcnlWb3RlQ291bnRlckNsb3NlSSA9IE0uaW50ZXJmYWNlKFxuICAnQmluYXJ5Vm90ZUNvdW50ZXIgQ2xvc2VGYWNldCcsXG4gIHtcbiAgICBjbG9zZVZvdGluZzogTS5jYWxsKCkucmV0dXJucygpLFxuICB9LFxuKTskaM2PX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkoQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkpO1xuXG4gICAgICAgY29uc3QgVm90ZUNvdW50ZXJQdWJsaWNJID0gTS5pbnRlcmZhY2UoJ1ZvdGVDb3VudGVyIFB1YmxpY0ZhY2V0Jywge1xuICBnZXRRdWVzdGlvbjogTS5jYWxsKCkucmV0dXJucyhRdWVzdGlvblNoYXBlKSxcbiAgaXNPcGVuOiBNLmNhbGwoKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgZ2V0T3V0Y29tZTogTS5jYWxsKCkucmV0dXJucyhNLmVyZWYoTS5wcm9taXNlKCkpKSxcbiAgZ2V0U3RhdHM6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXREZXRhaWxzOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG59KTskaM2PX29uY2UuVm90ZUNvdW50ZXJQdWJsaWNJKFZvdGVDb3VudGVyUHVibGljSSk7XG5cbiAgICAgICBjb25zdCBWb3RlQ291bnRlckFkbWluSSA9IE0uaW50ZXJmYWNlKCdWb3RlQ291bnRlciBBZG1pbkZhY2V0Jywge1xuICBzdWJtaXRWb3RlOiBNLmNhbGwoVm90ZXJIYW5kbGUsIE0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSlcbiAgICAub3B0aW9uYWwoTS5uYXQoKSlcbiAgICAucmV0dXJucyh7IGNob3NlbjogTS5hcnJheU9mKFBvc2l0aW9uU2hhcGUpLCBzaGFyZXM6IE0ubmF0KCkgfSksXG59KTskaM2PX29uY2UuVm90ZUNvdW50ZXJBZG1pbkkoVm90ZUNvdW50ZXJBZG1pbkkpO1xuXG4gICAgICAgY29uc3QgVm90ZUNvdW50ZXJDbG9zZUkgPSBNLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgQ2xvc2VGYWNldCcsIHtcbiAgY2xvc2VWb3Rpbmc6IE0uY2FsbCgpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5Wb3RlQ291bnRlckNsb3NlSShWb3RlQ291bnRlckNsb3NlSSk7XG5cbiAgICAgICBjb25zdCBHb3Zlcm5vckZhY2V0U2hhcGUgPSB7XG4gIGdldFBhcmFtTWdyUmV0cmlldmVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdwYXJhbVJldHJpZXZlcicpKSxcbiAgZ2V0SW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuICBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCkpLFxuICBnZXRHb3Zlcm5lZEFwaXM6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2dvdmVybmVkQVBJcycpKSxcbiAgZ2V0R292ZXJuZWRBcGlOYW1lczogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuICBzZXRPZmZlckZpbHRlcjogTS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucyhNLnByb21pc2UoKSksXG59OyRozY9fb25jZS5Hb3Zlcm5vckZhY2V0U2hhcGUoR292ZXJub3JGYWNldFNoYXBlKTtcbmhhcmRlbihHb3Zlcm5vckZhY2V0U2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ2hvaWNlTWV0aG9kU2hhcGUiOlsiQ2hvaWNlTWV0aG9kU2hhcGUiXSwiUXVvcnVtUnVsZVNoYXBlIjpbIlF1b3J1bVJ1bGVTaGFwZSJdLCJFbGVjdGlvblR5cGVTaGFwZSI6WyJFbGVjdGlvblR5cGVTaGFwZSJdLCJDbG9zaW5nUnVsZVNoYXBlIjpbIkNsb3NpbmdSdWxlU2hhcGUiXSwiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIjpbIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSJdLCJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSI6WyJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSJdLCJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIjpbIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiXSwiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIjpbIk9mZmVyRmlsdGVySXNzdWVTaGFwZSJdLCJPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlIjpbIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiXSwiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSI6WyJQYXJhbUNoYW5nZXNTcGVjU2hhcGUiXSwiWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSI6WyJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIl0sIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSI6WyJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiXSwiUGFyYW1QYXRoU2hhcGUiOlsiUGFyYW1QYXRoU2hhcGUiXSwiUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSI6WyJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIl0sIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIl0sIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIjpbIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIl0sIk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiOlsiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSJdLCJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiOlsiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIl0sIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSI6WyJBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUiXSwiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIjpbIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiXSwiTm9TaW1wbGVQb3NpdGlvblNoYXBlIjpbIk5vU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJTaW1wbGVQb3NpdGlvbnNTaGFwZSI6WyJTaW1wbGVQb3NpdGlvbnNTaGFwZSJdLCJTaW1wbGVJc3N1ZVNoYXBlIjpbIlNpbXBsZUlzc3VlU2hhcGUiXSwiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiOlsiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiXSwiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiUXVlc3Rpb25TcGVjU2hhcGUiOlsiUXVlc3Rpb25TcGVjU2hhcGUiXSwiUG9zaXRpb25TaGFwZSI6WyJQb3NpdGlvblNoYXBlIl0sIlF1ZXN0aW9uSGFuZGxlU2hhcGUiOlsiUXVlc3Rpb25IYW5kbGVTaGFwZSJdLCJJbnZpdGF0aW9uU2hhcGUiOlsiSW52aXRhdGlvblNoYXBlIl0sIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIkVsZWN0b3JhdGVQdWJsaWNJIjpbIkVsZWN0b3JhdGVQdWJsaWNJIl0sIkVsZWN0b3JhdGVDcmVhdG9ySSI6WyJFbGVjdG9yYXRlQ3JlYXRvckkiXSwiUXVlc3Rpb25TdGF0c1NoYXBlIjpbIlF1ZXN0aW9uU3RhdHNTaGFwZSJdLCJRdWVzdGlvbkkiOlsiUXVlc3Rpb25JIl0sIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSI6WyJCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kiXSwiVm90ZXJIYW5kbGUiOlsiVm90ZXJIYW5kbGUiXSwiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiOlsiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiXSwiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiOlsiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiXSwiVm90ZUNvdW50ZXJQdWJsaWNJIjpbIlZvdGVDb3VudGVyUHVibGljSSJdLCJWb3RlQ291bnRlckFkbWluSSI6WyJWb3RlQ291bnRlckFkbWluSSJdLCJWb3RlQ291bnRlckNsb3NlSSI6WyJWb3RlQ291bnRlckNsb3NlSSJdLCJHb3Zlcm5vckZhY2V0U2hhcGUiOlsiR292ZXJub3JGYWNldFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAUYC9zZLAAA2SwAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FsbEUiLCJjYWxsU3luYyIsImlzQ2FsbGJhY2siLCJtYWtlRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VNZXRob2RDYWxsYmFjayIsIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siLCJwcmVwYXJlQXR0ZW51YXRvciIsInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZUVycm9yLHEsRSxpc1ByaW1pdGl2ZSxpc1Bhc3NhYmxlU3ltYm9sLGdldEludGVyZmFjZU1ldGhvZEtleXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldEludGVyZmFjZU1ldGhvZEtleXNcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VNZXRob2RLZXlzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2ZhcidcbiAqIEBpbXBvcnQge01ldGhvZHN9IGZyb20gJ0BlbmRvL2V4byc7XG4gKiBAaW1wb3J0IHtGYXJhYmxlfSBmcm9tICdAZW5kby9leG8nO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge01ldGhvZEd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKi9cbi8qKiBAaW1wb3J0IHtDYWxsYmFjaywgU3luY0NhbGxiYWNrfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IHsgb3duS2V5czogcmF3T3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IG93bktleXMgPVxuICAvKiogQHR5cGUgezxUIGV4dGVuZHMgUHJvcGVydHlLZXk+KG9iajogeyBbSyBpbiBUXT86IHVua25vd24gfSkgPT4gVFtdfSAqLyAoXG4gICAgcmF3T3duS2V5c1xuICApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gVFxuICogQHR5cGVkZWYgeyhcbiAqICAgLi4uYXJnczogUGFyYW1ldGVyczxSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlQXR0ZW51YXRvcj4+XG4gKiApID0+IEZhcmFibGU8VD59IE1ha2VBdHRlbnVhdG9yXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGtleVxuICogQHJldHVybnMge2tleSBpcyBQcm9wZXJ0eUtleX0gRklYTUU6IHNob3VsZCBiZSBqdXN0IGBQcm9wZXJ0eUtleWAgYnV0IFRTXG4gKiAgIGNvbXBsYWlucyBpdCBjYW4ndCBiZSB1c2VkIGFzIGFuIGluZGV4IHR5cGUuXG4gKi9cbmNvbnN0IGlzUHJvcGVydHlLZXkgPSBrZXkgPT4ge1xuICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogU3luY2hyb25vdXNseSBjYWxsIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHBhcmFtIHtTeW5jQ2FsbGJhY2s8ST59IGNhbGxiYWNrXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPEk+fVxuICovXG4gICAgICAgY29uc3QgY2FsbFN5bmMgPSAoY2FsbGJhY2ssIC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0gPSBjYWxsYmFjaztcbiAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0YXJnZXQoLi4uYm91bmQsIC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oLi4uYm91bmQsIC4uLmFyZ3MpO1xufTskaM2PX29uY2UuY2FsbFN5bmMoY2FsbFN5bmMpO1xuaGFyZGVuKGNhbGxTeW5jKTtcblxuLyoqXG4gKiBFdmVudHVhbCBzZW5kIHRvIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHBhcmFtIHtDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPEk+Pj59XG4gKi9cbiAgICAgICBjb25zdCBjYWxsRSA9IChjYWxsYmFjaywgLi4uYXJncykgPT4ge1xuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwgLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIEUodGFyZ2V0KVttZXRob2ROYW1lXSguLi5ib3VuZCwgLi4uYXJncyk7XG59OyRozY9fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPn0gW1Q9SV1cbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sgPSAodGFyZ2V0LCAuLi5ib3VuZCkgPT4ge1xuICB0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgRmFpbGBzeW5jIGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb246ICR7dGFyZ2V0fWA7XG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIGJvdW5kLCBpc1N5bmM6IHRydWUgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge1N5bmNDYWxsYmFjazxJPn0gKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayhtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIHBvdGVudGlhbGx5IGZhciBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge0VSZWY8KC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPj59IFtUPUVSZWY8ST5dXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRnVuY3Rpb25DYWxsYmFjayA9ICh0YXJnZXQsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHByZXNlbmNlOiAke3RhcmdldH1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBib3VuZCB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7Q2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlRnVuY3Rpb25DYWxsYmFjayhtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIG1ldGhvZC5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge3tcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST47XG4gKiB9fSBbVD17IFt4IGluIFBdOiBJIH1dXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3luY01ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYHN5bmMgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbiAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSB8fFxuICAgIEZhaWxgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCwgaXNTeW5jOiB0cnVlIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IFBcbiAqIEB0ZW1wbGF0ZSB7RVJlZjx7XG4gKiAgIFt4IGluIFBdOiAoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+O1xuICogfT59IFtUPUVSZWY8eyBbeCBpbiBQXTogSSB9Pl1cbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UH0gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge0NhbGxiYWNrPEk+fVxuICovXG4gICAgICAgY29uc3QgbWFrZU1ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG4gIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkgfHxcbiAgICBGYWlsYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge0NhbGxiYWNrPEk+fSAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZU1ldGhvZENhbGxiYWNrKG1ha2VNZXRob2RDYWxsYmFjayk7XG5oYXJkZW4obWFrZU1ldGhvZENhbGxiYWNrKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtjYWxsYmFjayBpcyBDYWxsYmFjazxhbnk+fVxuICovXG4gICAgICAgY29uc3QgaXNDYWxsYmFjayA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKGlzUHJpbWl0aXZlKGNhbGxiYWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICByZXR1cm4gKFxuICAgICFpc1ByaW1pdGl2ZSh0YXJnZXQpICYmXG4gICAgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpKSAmJlxuICAgIEFycmF5LmlzQXJyYXkoYm91bmQpXG4gICk7XG59OyRozY9fb25jZS5pc0NhbGxiYWNrKGlzQ2FsbGJhY2spO1xuaGFyZGVuKGlzQ2FsbGJhY2spO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciBjbGFzcyB3aG9zZSBtZXRob2RzIGNhbiBiZSByZWRpcmVjdGVkIHZpYSBjYWxsYmFja3MuXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gTVxuICogQHBhcmFtIHtab25lfSB6b25lIFRoZSB6b25lIGluIHdoaWNoIHRvIGFsbG9jYXRlIGF0dGVudWF0b3JzLlxuICogQHBhcmFtIHtNW119IG1ldGhvZE5hbWVzIE1ldGhvZHMgdG8gZm9yd2FyZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPHtcbiAqICAgW0sgaW4gTV06IE1ldGhvZEd1YXJkO1xuICogfT59IFtvcHRzLmludGVyZmFjZUd1YXJkXVxuICogICBBbiBpbnRlcmZhY2UgZ3VhcmQgZm9yIHRoZSBuZXcgYXR0ZW51YXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy50YWddIEEgdGFnIGZvciB0aGUgbmV3IGF0dGVudWF0b3IgZXhvQ2xhc3MuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQXR0ZW51YXRvciA9IChcbiAgem9uZSxcbiAgbWV0aG9kTmFtZXMsXG4gIHsgaW50ZXJmYWNlR3VhcmQsIHRhZyA9ICdBdHRlbnVhdG9yJyB9ID0ge30sXG4pID0+IHtcbiAgLyoqXG4gKiBAdHlwZWRlZiB7KHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueX0gTWV0aG9kXG4gKlxuICogQHR5cGVkZWYge3sgW0sgaW4gTV0/OiBDYWxsYmFjazxhbnk+IHwgbnVsbCB9fSBPdmVycmlkZXNcbiAqXG4gKiBAdHlwZWRlZiB7eyBbSyBpbiBNXTogKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueSB9fSBNZXRob2RzXG4gKi9cbiAgY29uc3QgbWV0aG9kcyA9IC8qKiBAdHlwZSB7TWV0aG9kc30gKi8gKFxuICAgIGZyb21FbnRyaWVzKFxuICAgICAgbWV0aG9kTmFtZXMubWFwKGtleSA9PiB7XG4gICAgICAgIC8qIE9ubHkgYWxsb3cgdGhlIGBQcm9wZXJ0eUtleWAgdHlwZSBmb3IgdGhlIHRhcmdldCBtZXRob2Qga2V5LiovXG4gICAgICAgIGlmICghaXNQcm9wZXJ0eUtleShrZXkpKSB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBrZXkgJHtxKGtleSl9IGlzIG5vdCBhIFByb3BlcnR5S2V5YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG0gPSAvKiogQHR5cGUge01ldGhvZHN9ICovICh7XG4gICAgICAgICAgLyogRXhwbGljaXRseSB1c2UgY29uY2lzZSBtZXRob2Qgc3ludGF4IHRvIHByZXNlcnZlIGB0aGlzYCBidXQgcHJldmVudCovXG4gICAgICAgICAgLyogY29uc3RydWN0b3IgYmVoYXZpb3IuKi9cbiAgICAgICAgICAvKiogQHR5cGUge01ldGhvZH0gKi9cbiAgICAgICAgICBba2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvKiBTdXBwb3J0IGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jIGNhbGxiYWNrcy4qL1xuICAgICAgICAgICAgY29uc3QgY2IgPSB0aGlzLnN0YXRlLmNic1trZXldO1xuICAgICAgICAgICAgaWYgKCFjYikge1xuICAgICAgICAgICAgICBjb25zdCBlcnIgPSBtYWtlRXJyb3IoYHVuaW1wbGVtZW50ZWQgJHtxKHRhZyl9IG1ldGhvZCAke3Eoa2V5KX1gKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNTeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNiLmlzU3luYykge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbFN5bmMoY2IsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxFKGNiLCAuLi5hcmdzKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KVtrZXldO1xuICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtrZXksIG1dKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKTtcblxuICAvKipcbiAqIENyZWF0ZSBhbiBleG8gb2JqZWN0IHdob3NlIGJlaGF2aW9yIGlzIGNvbXBvc2VkIGZyb20gYSBkZWZhdWx0IHRhcmdldFxuICogYW5kL29yIGluZGl2aWR1YWwgbWV0aG9kIG92ZXJyaWRlIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHt1bmtub3dufSBbb3B0cy50YXJnZXRdIFRoZSB0YXJnZXQgZm9yIGFueSBtZXRob2RzIHRoYXQgd2VyZW4ndFxuICogICBzcGVjaWZpZWQgaW4gYG9wdHMub3ZlcnJpZGVzYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNTeW5jPWZhbHNlXSBXaGV0aGVyIHRoZSB0YXJnZXQgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqICAgYXMgc3luY2hyb25vdXNseSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXSBTZXQgaW5kaXZpZHVhbCBjYWxsYmFja3MgZm9yIG1ldGhvZHNcbiAqICAgKHdob3NlIG5hbWVzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgYHByZXBhcmVBdHRlbnVhdG9yYCBvclxuICogICBgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yYCBjYWxsKS4gTnVsbGlzaCBvdmVycmlkZXMgbWVhbiB0byB0aHJvdy5cbiAqL1xuICBjb25zdCBtYWtlQXR0ZW51YXRvciA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIC8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7YW55fSBbb3B0cy50YXJnZXRdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmlzU3luY11cbiAqIEBwYXJhbSB7T3ZlcnJpZGVzfSBbb3B0cy5vdmVycmlkZXNdXG4gKi9cbiAgICAoe1xuICAgICAgdGFyZ2V0ID0gbnVsbCxcbiAgICAgIGlzU3luYyA9IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVzID0gLyoqIEB0eXBlIHtPdmVycmlkZXN9ICovICh7fSksXG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgY2JzID0gLyoqIEB0eXBlIHtPdmVycmlkZXN9ICovICh7fSk7XG5cbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQobWV0aG9kTmFtZXMpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Ygb3duS2V5cyhvdmVycmlkZXMpKSB7XG4gICAgICAgIHJlbWFpbmluZy5oYXMoa2V5KSB8fFxuICAgICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIG5vdCBhbGxvd2VkIGJ5IG1ldGhvZE5hbWVzYDtcblxuICAgICAgICByZW1haW5pbmcuZGVsZXRlKGtleSk7XG4gICAgICAgIGNvbnN0IGNiID0gb3ZlcnJpZGVzW2tleV07XG4gICAgICAgIGNiID09IG51bGwgfHxcbiAgICAgICAgICBpc0NhbGxiYWNrKGNiKSB8fFxuICAgICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIGlzIG5vdCBhIGNhbGxiYWNrOyBnb3QgJHtjYn1gO1xuICAgICAgICBjYnNba2V5XSA9IGNiO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVtYWluaW5nKSB7XG4gICAgICAgIGlmIChpc1N5bmMpIHtcbiAgICAgICAgICBjYnNba2V5XSA9IG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LCBrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNic1trZXldID0gbWFrZU1ldGhvZENhbGxiYWNrKHRhcmdldCwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcmRlbih7IGNicywgaXNTeW5jIH0pO1xuICAgIH0sXG4gICAgLyoqIEB0eXBlIHtNZXRob2RzfSAqLyAobWV0aG9kcyksXG4gICk7XG4gIHJldHVybiBtYWtlQXR0ZW51YXRvcjtcbn07JGjNj19vbmNlLnByZXBhcmVBdHRlbnVhdG9yKHByZXBhcmVBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlQXR0ZW51YXRvcik7XG5cbi8qKlxuICogUHJlcGFyZSBhbiBhdHRlbnVhdG9yIHdob3NlIG1ldGhvZE5hbWVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGludGVyZmFjZUd1YXJkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7SW50ZXJmYWNlR3VhcmR9IEdcbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtHfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRhZ11cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciA9ICh6b25lLCBpbnRlcmZhY2VHdWFyZCwgb3B0cyA9IHt9KSA9PiB7XG4gIGNvbnN0IG1ldGhvZE5hbWVzID0gZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhpbnRlcmZhY2VHdWFyZCk7XG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gcHJlcGFyZUF0dGVudWF0b3Ioem9uZSwgbWV0aG9kTmFtZXMsIHtcbiAgICAuLi5vcHRzLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7TWFrZUF0dGVudWF0b3I8YW55Pn0gKi8gKG1ha2VBdHRlbnVhdG9yKTtcbn07JGjNj19vbmNlLnByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxsU3luYyI6WyJjYWxsU3luYyJdLCJjYWxsRSI6WyJjYWxsRSJdLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siOlsibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siOlsibWFrZVN5bmNNZXRob2RDYWxsYmFjayJdLCJtYWtlTWV0aG9kQ2FsbGJhY2siOlsibWFrZU1ldGhvZENhbGxiYWNrIl0sImlzQ2FsbGJhY2siOlsiaXNDYWxsYmFjayJdLCJwcmVwYXJlQXR0ZW51YXRvciI6WyJwcmVwYXJlQXR0ZW51YXRvciJdLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiOlsicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKM2T6b1BAAA9QQAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2xpLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ0b0NMSU9wdGlvbnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nLWtleWVkIG9iamVjdCBpbnRvIGFuIGFycmF5IG9mIENMSSBvcHRpb25zLCB1c2luZyBlYWNoIGtleSBhc1xuICogdGhlIG5hbWUgb2YgYSBHTlUtc3R5bGUgbG9uZyBvcHRpb24gYC0tJHtrZXl9YCwgaWdub3JpbmcgZWFjaCBrZXkgd2l0aCBhblxuICogdW5kZWZpbmVkIHZhbHVlIGFuZCBjb252ZXJ0aW5nIGJvb2xlYW4gdmFsdWVzIGludG8gbm8tYXJndW1lbnQgYC0tJHtrZXl9YCBvclxuICogYC0tbm8tJHtrZXl9YCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IHN0cmluZyB8IHN0cmluZ1tdPn0gcmVjb3JkIC1cbiAqICAgZS5nLiB7IGNvbG9yOiAnYmx1ZScgfVxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIGUuZy4gWyctLWNvbG9yJywgJ2JsdWUnXVxuICovXG4gICAgICAgY29uc3QgdG9DTElPcHRpb25zID0gcmVjb3JkID0+XG4gIE9iamVjdC5lbnRyaWVzKHJlY29yZCkuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiBbYC0tJHtrZXl9YF07XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuIFtgLS1uby0ke2tleX1gXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8qIFJlcHJlc2VudCBhcyBhIHJlcGVhdGVkIG9wdGlvbi4qL1xuICAgICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAodiA9PiBbYC0tJHtrZXl9YCwgdl0pO1xuICAgIH1cbiAgICByZXR1cm4gW2AtLSR7a2V5fWAsIHZhbHVlXTtcbiAgfSk7JGjNj19vbmNlLnRvQ0xJT3B0aW9ucyh0b0NMSU9wdGlvbnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidG9DTElPcHRpb25zIjpbInRvQ0xJT3B0aW9ucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABtDXgVygwAAMoMAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc3siaW1wb3J0cyI6WyIuL2tleU1pcnJvci5qcyJdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiLCJWQmFua0FjY291bnQiLCJXYWxsZXROYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5TWlycm9yOyRozY9faW1wb3J0cyhbW1wiLi9rZXlNaXJyb3IuanNcIiwgW1tcImtleU1pcnJvclwiLFskaM2PX2EgPT4gKGtleU1pcnJvciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGZpbGVcbiAqXG4gKiAgIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiAgIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAgYW5kIG91ciBsYXggcGFja2FnZVxuICogICBkZXBlbmRlbmN5IGdyYXBoLCBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb25cbiAqICAgZXJyb3JzLlxuICpcbiAqICAgU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZVxuICogICBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIENsdXN0ZXJOYW1lIHNwZWNpZmllcyBhIGNvbGxlY3Rpb24gb2YgbmV0d29ya3MuIFRoZSBzcGVjaWZpYyBuZXR3b3Jrc1xuICogYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBuYW1lIG1heSB2YXJ5IGZyb20gY29udGV4dCB0byBjb250ZXh0LCBhbmQgbWF5XG4gKiBhbHNvIG92ZXJsYXAgKGUuZy4gYSBcImxvY2FsXCIgY2x1c3RlciBtYXkgY29ubmVjdCB0byB0aGUgc2FtZSByZW1vdGUgbmV0d29ya3NcbiAqIGFzIGEgXCJ0ZXN0bmV0XCIgY2x1c3RlciksIGJ1dCB0aGlzIHR5cGUgbmV2ZXJ0aGVsZXNzIHN1cHBvcnRzIGNyb3NzLXBhY2thZ2VcbiAqIGNvb3JkaW5hdGlvbiB3aGVyZSB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBzdGF0aWMgbGFiZWxzIGFyZSBzdWJqZWN0IHRvXG4gKiBjaG9pY2Ugb2YgY2x1c3Rlci4gU29tZSBleGFtcGxlczpcbiAqXG4gKiAtIHRoZSBjaGFpbiBJRCBmb3IgYSBzdGF0aWMgbGFiZWwgbGlrZSBcIkFnb3JpY1wiIG9yIFwiRXRoZXJldW1cIlxuICogLSB0aGUgY3J5cHRvZ3JhcGhpYyBoYXNoIGZvciBhIHN0YXRpYyBsYWJlbCBsaWtlIFwiQkxEXCIgb3IgXCJVU0RDXCJcbiAqIC0gdGhlIFVSTCBmb3IgYSBzZXJ2aWNlIGxpa2UgXCJBZ29yaWMgUlBDXCIgb3IgXCJBeGVsYXJcIiBvciBcIlNwZWN0cnVtXCJcbiAqXG4gKiBcIm1haW5uZXRcIiBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIEFnb3JpYyBuZXR3b3JrIGRlc2NyaWJlZCBieVxuICogaHR0cHM6Ly9tYWluLmFnb3JpYy5uZXQvbmV0d29yay1jb25maWcgcmF0aGVyIHRoYW4gc29tZSBvdGhlciBhbHRlcm5hdGl2ZS5cbiAqXG4gKiBYWFggVGhpcyBhY3R1YWxseSBiZWxvbmdzIHNvbWV3aGVyZSBlbHNlLCBwb3NzaWJseSB3aXRoIHJlZmFjdG9yaW5nLlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMTIxODUjZGlzY3Vzc2lvbl9yMjUwMDEyMzIyNlxuICpcbiAqIEB0eXBlZGVmIHsnbG9jYWwnIHwgJ3Rlc3RuZXQnIHwgJ21haW5uZXQnfSBDbHVzdGVyTmFtZVxuICovXG5cbi8qKlxuICogRXZlbnQgc291cmNlIGlkcyB1c2VkIGJ5IHRoZSBicmlkZ2UgZGV2aWNlLlxuICpcbiAqIEBlbnVtIHsodHlwZW9mIEJyaWRnZUlkKVtrZXlvZiB0eXBlb2YgQnJpZGdlSWRdfVxuICovXG4gICAgICAgY29uc3QgQnJpZGdlSWQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBCQU5LOiAnYmFuaycsXG4gIENPUkU6ICdjb3JlJyxcbiAgRElCQzogJ2RpYmMnLFxuICBTVE9SQUdFOiAnc3RvcmFnZScsXG4gIFBST1ZJU0lPTjogJ3Byb3Zpc2lvbicsXG4gIFBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6ICdwcm92aXNpb25XYWxsZXQnLFxuICBWTE9DQUxDSEFJTjogJ3Zsb2NhbGNoYWluJyxcbiAgVlRSQU5TRkVSOiAndnRyYW5zZmVyJyxcbiAgV0FMTEVUOiAnd2FsbGV0Jyxcbn0pOyRozY9fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5oYXJkZW4oQnJpZGdlSWQpO1xuXG4vKiogQHNhdGlzZmllcyB7UmVjb3JkPHN0cmluZywgQnJpZGdlSWQ+fSAqL1xuICAgICAgIGNvbnN0IENvc21vc0luaXRLZXlUb0JyaWRnZUlkID0ge1xuICB2YmFua1BvcnQ6ICdiYW5rJyxcbiAgdmliY1BvcnQ6ICdkaWJjJyxcbn07JGjNj19vbmNlLkNvc21vc0luaXRLZXlUb0JyaWRnZUlkKENvc21vc0luaXRLZXlUb0JyaWRnZUlkKTtcbmhhcmRlbihDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCk7XG5cbiAgICAgICBjb25zdCBXYWxsZXROYW1lID0ga2V5TWlycm9yKHtcbiAgZGVwb3NpdEZhY2V0OiBudWxsLFxufSk7JGjNj19vbmNlLldhbGxldE5hbWUoV2FsbGV0TmFtZSk7XG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8qIGRlZmluZWQgaW4gZ29sYW5nL2Nvc21vcy94L3ZiYW5rKi9cbiAgICAgICBjb25zdCBWQmFua0FjY291bnQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICByZXNlcnZlOiB7XG4gICAgbW9kdWxlOiAndmJhbmsvcmVzZXJ2ZScsXG4gICAgYWRkcmVzczogJ2Fnb3JpYzFhZTBsbXR6bGdyY25sYTl4amtwYWFycTVkNWRmZXo2M2gzbnVjbCcsXG4gIH0sXG4gIHByb3Zpc2lvbjoge1xuICAgIG1vZHVsZTogJ3ZiYW5rL3Byb3Zpc2lvbicsXG4gICAgYWRkcmVzczogJ2Fnb3JpYzFtZWd6eXRnNjVjeXJnenM2ZnZ6eGdyY3F2d3dsN3VncHQ2MjM0NicsXG4gIH0sXG59KTskaM2PX29uY2UuVkJhbmtBY2NvdW50KFZCYW5rQWNjb3VudCk7XG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyaWRnZUlkIjpbIkJyaWRnZUlkIl0sIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIjpbIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIl0sIldhbGxldE5hbWUiOlsiV2FsbGV0TmFtZSJdLCJWQmFua0FjY291bnQiOlsiVkJhbmtBY2NvdW50Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI29pgGuCAAArggAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZGVidWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VUcmFjZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQGplc3NpZS1jaGVjayovXG5cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ0Ki9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ1Ki9cbmxldCBkZWJ1Z0luc3RhbmNlID0gMTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8ICd2ZXJib3NlJ30gZW5hYmxlXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVHJhY2VyID0gKGxhYmVsLCBlbmFibGUgPSB0cnVlKSA9PiB7XG4gIGNvbnN0IHN1YiA9IChzdWJMYWJlbCwgc3ViRW5hYmxlID0gZW5hYmxlKSA9PlxuICAgIG1ha2VUcmFjZXIoYCR7bGFiZWx9LiR7c3ViTGFiZWx9YCwgc3ViRW5hYmxlKTtcbiAgY29uc3Qga2V5ID0gYC0tLS0tICR7bGFiZWx9LCR7ZGVidWdJbnN0YW5jZX0gYDtcbiAgZGVidWdJbnN0YW5jZSArPSAxO1xuICAvKiB0aGUgY2FzZXMgYmVsb3cgZGVmaW5lIGEgbmFtZWQgdmFyaWFibGUgdG8gcHJvdmlkZSBiZXR0ZXIgZGVidWcgaW5mbyovXG4gIHN3aXRjaCAoZW5hYmxlKSB7XG4gICAgY2FzZSBmYWxzZToge1xuICAgICAgY29uc3QgbG9nRGlzYWJsZWQgPSAoLi4uX2FyZ3MpID0+IHt9O1xuICAgICAgcmV0dXJuIGhhcmRlbihPYmplY3QuYXNzaWduKGxvZ0Rpc2FibGVkLCB7IHN1YiB9KSk7XG4gICAgfVxuICAgIGNhc2UgJ3ZlcmJvc2UnOiB7XG4gICAgICBjb25zdCBpbmZvVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgLyogWFhYIFNuaWZmIHRlc3RzIHN1Y2ggYXMgdGhpcyBhcmUgaW5oZXJlbnRseSB1bnJlbGlhYmxlIGFuZCBzbWVsbCBiYWQuKi9cbiAgICAgICAgLyogRXZlbiBhc2lkZSBmcm9tIHRoZSBzZWN1cml0eSBoYXphcmQgb2YqL1xuICAgICAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ1Ki9cbiAgICAgICAgLyogYW4gb2JqZWN0IGludGVuZGVkIGFzIGEgbm9ybWFsIGxvZ2dpbmcgYXJndW1lbnQgbWF5IGFjY2lkZW50YWxseSovXG4gICAgICAgIC8qIHBhc3MgdGhpcyBzbmlmZiB0ZXN0LCBjYXVzaW5nIGNvbmZ1c2lvbi4qL1xuICAgICAgICBpZiAodHlwZW9mIG9wdExvZz8ubG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgLi4uYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgb3B0TG9nLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihpbmZvVGljaywgeyBzdWIgfSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBkZWJ1Z1RpY2sgPSAob3B0TG9nLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIC8qIEFub3RoZXIgdW5yZWxpYWJsZSBzbmlmZiB0ZXN0IGxpa2UgdGhlIG9uZSBhYm92ZSovXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0TG9nPy5sb2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRMb2cubG9nKGtleSwgLi4uYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgb3B0TG9nLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihkZWJ1Z1RpY2ssIHsgc3ViIH0pKTtcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLm1ha2VUcmFjZXIobWFrZVRyYWNlcik7XG5oYXJkZW4obWFrZVRyYWNlcik7XG5cbi8qKlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VUcmFjZXI+fSBUcmFjZUxvZ2dlclxuICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsZPVjl4DAABeAwAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiTm9uTnVsbGlzaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IE5vbk51bGxpc2ggPSAodmFsLCBvcHREZXRhaWxzID0gYHVuZXhwZWN0ZWQgJHtxKHZhbCl9YCkgPT4ge1xuICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAvKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGFzc2VydC5mYWlsKG9wdERldGFpbHMpO1xufTskaM2PX29uY2UuTm9uTnVsbGlzaChOb25OdWxsaXNoKTtcbmhhcmRlbihOb25OdWxsaXNoKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Ik5vbk51bGxpc2giOlsiTm9uTnVsbGlzaCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABoHOwa/gQAAP4EAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY2xpLXV0aWxzLmpzIiwiLi9jb25maWcuanMiLCIuL2RlYnVnLmpzIiwiLi9lcnJvcnMuanMiLCIuL2pzLXV0aWxzLmpzIiwiLi9rZXlNaXJyb3IuanMiLCIuL21hcnNoYWwvcHVyZS1kYXRhLmpzIiwiLi9tZXRob2QtdG9vbHMuanMiLCIuL21ldHJpY3MuanMiLCIuL25hdHVyYWwtc29ydC5qcyIsIi4vc2VzLXV0aWxzLmpzIiwiLi90bXBEaXIuanMiLCIuL3R5cGVDaGVjay5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOlsiLi9jbGktdXRpbHMuanMiLCIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL2Vycm9ycy5qcyIsIi4vanMtdXRpbHMuanMiLCIuL2tleU1pcnJvci5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi9tZXRyaWNzLmpzIiwiLi9uYXR1cmFsLXNvcnQuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdG1wRGlyLmpzIiwiLi90eXBlQ2hlY2suanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vY2xpLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi9lcnJvcnMuanNcIiwgW11dLFtcIi4vanMtdXRpbHMuanNcIiwgW11dLFtcIi4va2V5TWlycm9yLmpzXCIsIFtdXSxbXCIuL21hcnNoYWwvcHVyZS1kYXRhLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi9tZXRyaWNzLmpzXCIsIFtdXSxbXCIuL25hdHVyYWwtc29ydC5qc1wiLCBbXV0sW1wiLi9zZXMtdXRpbHMuanNcIiwgW11dLFtcIi4vdG1wRGlyLmpzXCIsIFtdXSxbXCIuL3R5cGVDaGVjay5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9tYXJzaGFsL3B1cmUtZGF0YS5qcyI6W1sicHVyZURhdGFNYXJzaGFsbGVyIiwicHVyZURhdGFNYXJzaGFsbGVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACq1a+NpiUAAKYlAAAnAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2pzLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJUUlVFIiwiZGVlcENvcHlKc29uYWJsZSIsImRlZXBNYXBPYmplY3QiLCJkZWZpbmVOYW1lIiwiZnJvbVR5cGVkRW50cmllcyIsImxvZ0xldmVscyIsIm1ha2VNZWFzdXJlU2Vjb25kcyIsIm9iamVjdE1hcE11dGFibGUiLCJwYXJ0aWFsTWFwIiwicHJvdmlkZUxhenlNYXAiLCJ0eXBlZEVudHJpZXMiLCJ0eXBlZE1hcCIsInVucHJlZml4ZWRQcm9wZXJ0aWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG4vKiBAamVzc2llLWNoZWNrKi9cbi8qKlxuICogQGZpbGUgUHVyZSBKYXZhU2NyaXB0IHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBidXQgbm90XG4gKiAgIGRlcGVuZGVudCB1cG9uIGEgaGFyZGVuZWQgZW52aXJvbm1lbnQuXG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0eSB9ID0gT2JqZWN0O1xuXG4vKiogRm9yIG92ZXJyaWRpbmcgVHlwZVNjcmlwdCBpbmZlcnJpbmcgdGhlIHR5cGUgb2YgYHRydWVgIGFzIGJvb2xlYW4uICovXG4gICAgICAgY29uc3QgVFJVRSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh0cnVlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PE8gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gKiAgIG9iajogTyxcbiAqICkgPT4gRXhjbHVkZTxcbiAqICAgeyBbSyBpbiBrZXlvZiBPXTogSyBleHRlbmRzIHN0cmluZyA/IFtLLCBPW0tdXSA6IG5ldmVyIH1ba2V5b2YgT10sXG4gKiAgIHVuZGVmaW5lZFxuICogPltdfSBUeXBlZEVudHJpZXNcbiAqLyRozY9fb25jZS5UUlVFKFRSVUUpO1xuICAgICAgIGNvbnN0IHR5cGVkRW50cmllcyA9IC8qKiBAdHlwZSB7VHlwZWRFbnRyaWVzfSAqLyAoT2JqZWN0LmVudHJpZXMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8XG4gKiAgIGNvbnN0IEVudHJpZXMgZXh0ZW5kcyBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtQcm9wZXJ0eUtleSwgdW5rbm93bl0+LFxuICogPihcbiAqICAgZW50cmllczogRW50cmllcyxcbiAqICkgPT4geyBbRW50cnkgaW4gRW50cmllc1tudW1iZXJdIGFzIEVudHJ5WzBdXTogRW50cnlbMV0gfX0gRnJvbVR5cGVkRW50cmllc1xuICovJGjNj19vbmNlLnR5cGVkRW50cmllcyh0eXBlZEVudHJpZXMpO1xuICAgICAgIGNvbnN0IGZyb21UeXBlZEVudHJpZXMgPSAvKiogQHR5cGUge0Zyb21UeXBlZEVudHJpZXN9ICovIChcbiAgT2JqZWN0LmZyb21FbnRyaWVzXG4pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8QSBleHRlbmRzIHVua25vd25bXSwgVj4oXG4gKiAgIGFycjogQSxcbiAqICAgbWFwcGVyOiA8SyBleHRlbmRzIG51bWJlcj4oZWw6IEFbS10sIGlkeDogSywgYXJyOiBBKSA9PiBWLFxuICogKSA9PiBWW119IFR5cGVkTWFwXG4gKi8kaM2PX29uY2UuZnJvbVR5cGVkRW50cmllcyhmcm9tVHlwZWRFbnRyaWVzKTtcbiAgICAgICBjb25zdCB0eXBlZE1hcCA9IC8qKiBAdHlwZSB7VHlwZWRNYXB9ICovIChcbiAgRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUubWFwKVxuKTskaM2PX29uY2UudHlwZWRNYXAodHlwZWRNYXApO1xuXG4gICAgICAgY29uc3QgbG9nTGV2ZWxzID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtcbiAgJ2RlYnVnJyxcbiAgJ2xvZycsXG4gICdpbmZvJyxcbiAgJ3dhcm4nLFxuICAnZXJyb3InLFxuXSk7JGjNj19vbmNlLmxvZ0xldmVscyhsb2dMZXZlbHMpO1xuT2JqZWN0LmZyZWV6ZShsb2dMZXZlbHMpO1xuXG4vKiogQHR5cGVkZWYgeyh0eXBlb2YgbG9nTGV2ZWxzKVtrZXlvZiBsb2dMZXZlbHMgJiBudW1iZXJdfSBMb2dMZXZlbCAqL1xuXG4vKiogQHR5cGVkZWYge1BpY2s8Q29uc29sZSwgTG9nTGV2ZWw+fSBMaW1pdGVkQ29uc29sZSAqL1xuXG4vKipcbiAqIERlZXAtY29weSBhIHZhbHVlIGJ5IHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2ggSlNPTiAod2hpY2ggZHJvcHNcbiAqIGZ1bmN0aW9uL3N5bWJvbC91bmRlZmluZWQgdmFsdWVzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vbi1lbnVtZXJhYmxlXG4gKiBhbmQvb3Igc3ltYm9sLWtleWVkLCBhbmQgcmVqZWN0cyBiaWdpbnQgdmFsdWVzKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZVxuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCBkZWVwQ29weUpzb25hYmxlID0gdmFsdWUgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPn0gT1xuICogQHRlbXBsYXRlIHtzdHJpbmcgJiBrZXlvZiBPfSBLXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPW0tdfSB2YWx1ZVxuICogQHBhcmFtIHtLIHwgdW5kZWZpbmVkfSBuYW1lXG4gKiBAcGFyYW0ge08gfCB1bmRlZmluZWR9IGNvbnRhaW5lclxuICogQHBhcmFtIHsodmFsdWU6IE9bS10sIG5hbWU6IHN0cmluZywgcmVjb3JkOiBPKSA9PiBPW0tdIHwgTX0gbWFwcGVyXG4gKiBAcmV0dXJucyB7T1tLXSB8IE0gfCB7IFtLMiBpbiBrZXlvZiBPW0tdXTogT1tLXVtLMl0gfCBNIH19XG4gKi8kaM2PX29uY2UuZGVlcENvcHlKc29uYWJsZShkZWVwQ29weUpzb25hYmxlKTtcbmNvbnN0IGRlZXBNYXBPYmplY3RJbnRlcm5hbCA9ICh2YWx1ZSwgbmFtZSwgY29udGFpbmVyLCBtYXBwZXIpID0+IHtcbiAgaWYgKGNvbnRhaW5lciAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBtYXBwZWQgPSBtYXBwZXIodmFsdWUsIG5hbWUsIGNvbnRhaW5lcik7XG4gICAgaWYgKG1hcHBlZCAhPT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgbGV0IHdhc01hcHBlZCA9IGZhbHNlO1xuICBjb25zdCB2YWx1ZU9iaiA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSk7XG4gIC8qKlxuICogQHR5cGUgezxUIGV4dGVuZHMgdHlwZW9mIHZhbHVlLCBLMiBleHRlbmRzIHN0cmluZyAmIGtleW9mIFQ+KFxuICogICBlbnRyeTogW0syLCBUW0syXV0sXG4gKiApID0+IFtLMiwgVFtLMl0gfCBNXX1cbiAqL1xuICBjb25zdCBtYXBFbnRyeSA9IChbaW5uZXJOYW1lLCBpbm5lclZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IG1hcHBlZElubmVyVmFsdWUgPSBkZWVwTWFwT2JqZWN0SW50ZXJuYWwoXG4gICAgICBpbm5lclZhbHVlLFxuICAgICAgaW5uZXJOYW1lLFxuICAgICAgdmFsdWVPYmosXG4gICAgICBtYXBwZXIsXG4gICAgKTtcbiAgICB3YXNNYXBwZWQgfHw9IG1hcHBlZElubmVyVmFsdWUgIT09IGlubmVyVmFsdWU7XG4gICAgcmV0dXJuIFtpbm5lck5hbWUsIC8qKiBAdHlwZSB7YW55fSAqLyAobWFwcGVkSW5uZXJWYWx1ZSldO1xuICB9O1xuICBjb25zdCBtYXBwZWRFbnRyaWVzID0gdHlwZWRFbnRyaWVzKHZhbHVlT2JqKS5tYXAobWFwRW50cnkpO1xuXG4gIGlmICghd2FzTWFwcGVkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgbWFwcGVkT2JqID0gZnJvbVR5cGVkRW50cmllcyhtYXBwZWRFbnRyaWVzKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAobWFwcGVkT2JqKTtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgdHJhdmVyc2VzIGEgcmVjb3JkIG9iamVjdCBzdHJ1Y3R1cmUsIGNhbGxpbmcgYSBtYXBwZXIgZnVuY3Rpb25cbiAqIGZvciBlYWNoIGVudW1lcmFibGUgc3RyaW5nLWtleWVkIHByb3BlcnR5IGFuZCByZXR1cm5pbmcgYSByZWNvcmQgY29tcG9zZWQgb2ZcbiAqIHRoZSByZXN1bHRzLiBJZiBub25lIG9mIHRoZSB2YWx1ZXMgYXJlIGNoYW5nZWQsIHRoZSBvcmlnaW5hbCBvYmplY3QgaXNcbiAqIHJldHVybmVkLCBtYWludGFpbmluZyBpdHMgaWRlbnRpdHkuXG4gKlxuICogV2hlbiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgYW4gb2JqZWN0LCBpdCBpcyBzZW50IHRvIHRoZSBtYXBwZXIgbGlrZSBhbnkgb3RoZXJcbiAqIHZhbHVlLCBhbmQgdGhlbiByZWN1cnNpdmVseSB0cmF2ZXJzZWQgdW5sZXNzIHJlcGxhY2VkIHdpdGggYSBkaXN0aW5jdCB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBPXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPfSBvYmpcbiAqIEBwYXJhbSB7PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIHN0cmluZyAmIGtleW9mIFQ+KFxuICogICB2YWx1ZTogVFtLXSxcbiAqICAgbmFtZTogSyxcbiAqICAgcmVjb3JkOiBULFxuICogKSA9PiBUW0tdIHwgTX0gbWFwcGVyXG4gKiBAcmV0dXJucyB7TyB8IHsgW0sgaW4ga2V5b2YgT106IEsgZXh0ZW5kcyBzdHJpbmcgPyBPW0tdIHwgTSA6IG5ldmVyIH19XG4gKi9cbiAgICAgICBjb25zdCBkZWVwTWFwT2JqZWN0ID0gKG9iaiwgbWFwcGVyKSA9PlxuICAvKiogQHR5cGUge2FueX0gKi8gKGRlZXBNYXBPYmplY3RJbnRlcm5hbChvYmosIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBtYXBwZXIpKTtcblxuLyoqXG4gKiBFeHBsaWNpdGx5IHNldCBhIGZ1bmN0aW9uJ3MgbmFtZSwgc3VwcG9ydGluZyB1c2Ugb2YgYXJyb3cgZnVuY3Rpb25zIGZvciB3aGljaFxuICogc291cmNlIHRleHQgZG9lc24ndCBpbmNsdWRlIGEgbmFtZSBhbmQgbm8gaW5pdGlhbCBuYW1lIGlzIHNldCBieVxuICogTmFtZWRFdmFsdWF0aW9uXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi9tdWx0aXBhZ2Uvc3ludGF4LWRpcmVjdGVkLW9wZXJhdGlvbnMuaHRtbCNzZWMtcnVudGltZS1zZW1hbnRpY3MtbmFtZWRldmFsdWF0aW9uXG4gKlxuICogYG5hbWVgIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgZm9yIGJldHRlciByZWFkYWJpbGl0eSBhdCBjYWxsIHNpdGVzIChlLmcuLFxuICogYHJldHVybiBkZWZpbmVOYW1lKCdmb28nLCAoKSA9PiB7IC4uLiB9KWApLlxuICpcbiAqIEB0ZW1wbGF0ZSB7RnVuY3Rpb259IEZcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Z9IGZuXG4gKiBAcmV0dXJucyB7Rn1cbiAqLyRozY9fb25jZS5kZWVwTWFwT2JqZWN0KGRlZXBNYXBPYmplY3QpO1xuICAgICAgIGNvbnN0IGRlZmluZU5hbWUgPSAobmFtZSwgZm4pID0+XG4gIGRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUgfSk7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5XG4gKiB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSwgYG9iamVjdE1hcE11dGFibGVgXG4gKiB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgZW51bWVyYWJsZSBzdHJpbmcta2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVW5saWtlIGVuZG8ncyBgb2JqZWN0TWFwYCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uLWhhcmRlbmVkIG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBPXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPfSBvYmpcbiAqIEBwYXJhbSB7PEsgZXh0ZW5kcyBrZXlvZiBPPih2YWx1ZTogT1tLXSwga2V5OiBLKSA9PiBNfSBtYXBwZXJcbiAqIEByZXR1cm5zIHt7IFtLIGluIGtleW9mIE9dOiBLIGV4dGVuZHMgc3RyaW5nID8gTSA6IG5ldmVyIH19XG4gKi8kaM2PX29uY2UuZGVmaW5lTmFtZShkZWZpbmVOYW1lKTtcbiAgICAgICBjb25zdCBvYmplY3RNYXBNdXRhYmxlID0gKG9iaiwgbWFwcGVyKSA9PiB7XG4gIGNvbnN0IG9sZEVudHJpZXMgPSB0eXBlZEVudHJpZXMob2JqKTtcbiAgLyoqIEB0eXBlIHs8SyBleHRlbmRzIGtleW9mIE8+KGVudHJ5OiBbSywgT1tLXV0pID0+IFtLLCBNXX0gKi9cbiAgY29uc3QgbWFwRW50cnkgPSAoW2ssIHZdKSA9PiBbaywgbWFwcGVyKHYsIGspXTtcbiAgY29uc3QgbmV3RW50cmllcyA9IHR5cGVkTWFwKG9sZEVudHJpZXMsIG1hcEVudHJ5KTtcbiAgY29uc3QgbmV3T2JqID0gZnJvbVR5cGVkRW50cmllcyhuZXdFbnRyaWVzKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAobmV3T2JqKTtcbn07XG5cbi8qKlxuICogTWFwIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheSB0byBuZXcgdmFsdWVzLCBza2lwcGluZyBlbGVtZW50cyBmb3Igd2hpY2ggdGhlXG4gKiBtYXBwaW5nIHJlc3VsdHMgaW4gZWl0aGVyIGB1bmRlZmluZWRgIG9yIGBmYWxzZWAuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAcGFyYW0ge1RbXX0gYXJyXG4gKiBAcGFyYW0geyh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyOiBUW10pID0+IFUgfCB1bmRlZmluZWQgfCBmYWxzZX0gbWFwT3JEcm9wXG4gKiBAcmV0dXJucyB7VVtdfVxuICovJGjNj19vbmNlLm9iamVjdE1hcE11dGFibGUob2JqZWN0TWFwTXV0YWJsZSk7XG4gICAgICAgY29uc3QgcGFydGlhbE1hcCA9IChhcnIsIG1hcE9yRHJvcCkgPT5cbiAgYXJyLnJlZHVjZSgocmVzdWx0cywgZWwsIGksIGFyckFyZykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IG1hcE9yRHJvcChlbCwgaSwgYXJyQXJnKTtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9LCAvKiogQHR5cGUge1VbXX0gKi8gKFtdKSk7XG5cbi8qKlxuICogUmV0dXJuIHRoZSB2YWx1ZSBmcm9tIGBtYXBgIGFzc29jaWF0ZWQgd2l0aCBga2V5YC4gSWYgdGhlcmUgaXMgbm90IHlldCBzdWNoIGFcbiAqIHZhbHVlLCBnZXQgb25lIGZyb20gYG1ha2VWYWx1ZShrZXkpYCBhbmQgdXBkYXRlIGBtYXBgIGJlZm9yZSByZXR1cm5pbmcgdGhlXG4gKiBuZXcgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1tLXSBleHRlbmRzIFtXZWFrS2V5XSA/IFdlYWtNYXA8SywgVj4gOiBNYXA8SywgVj59IG1hcFxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqLyRozY9fb25jZS5wYXJ0aWFsTWFwKHBhcnRpYWxNYXApO1xuICAgICAgIGNvbnN0IHByb3ZpZGVMYXp5TWFwID0gKG1hcCwga2V5LCBtYWtlVmFsdWUpID0+IHtcbiAgY29uc3QgZm91bmQgPSBtYXAuZ2V0KGtleSk7XG4gIGlmIChmb3VuZCAhPT0gdW5kZWZpbmVkIHx8IG1hcC5oYXMoa2V5KSkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1Z9ICovIChmb3VuZCk7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBtYWtlVmFsdWUoa2V5KTtcbiAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgY3VycmVudC10aW1lIGNhcGFiaWxpdHlcbiAqIChzdWNoIGFzIGBwZXJmb3JtYW5jZS5ub3dgKSB0byBtZWFzdXJlIGV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBhbiBhc3luY1xuICogZnVuY3Rpb24gYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0geygpID0+IG51bWJlcn0gY3VycmVudFRpbWVNaWxsaXNlY1xuICovJGjNj19vbmNlLnByb3ZpZGVMYXp5TWFwKHByb3ZpZGVMYXp5TWFwKTtcbiAgICAgICBjb25zdCBtYWtlTWVhc3VyZVNlY29uZHMgPSBjdXJyZW50VGltZU1pbGxpc2VjID0+IHtcbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHJldHVybnMge1Byb21pc2U8eyByZXN1bHQ6IFQ7IGR1cmF0aW9uOiBudW1iZXIgfT59XG4gKi9cbiAgY29uc3QgbWVhc3VyZVNlY29uZHMgPSBhc3luYyBmbiA9PiB7XG4gICAgY29uc3QgdDAgPSBjdXJyZW50VGltZU1pbGxpc2VjKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oKTtcbiAgICBjb25zdCBkdXJhdGlvbk1pbGxpc2VjID0gY3VycmVudFRpbWVNaWxsaXNlYygpIC0gdDA7XG4gICAgcmV0dXJuIHsgcmVzdWx0LCBkdXJhdGlvbjogZHVyYXRpb25NaWxsaXNlYyAvIDEwMDAgfTtcbiAgfTtcbiAgcmV0dXJuIG1lYXN1cmVTZWNvbmRzO1xufTtcblxuLyoqXG4gKiBGaW5kIGFsbCBvZiBhbiBvYmplY3QncyBwcm9wZXJ0aWVzIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBwcmVmaXgsIGFuZFxuICogcmV0dXJuIGEgbmV3IG9iamVjdCBjb25zaXN0aW5nIG9mIHRob3NlIHByb3BlcnRpZXMgd2l0aG91dCB0aGF0IHByZWZpeC5cbiAqIFVzZWZ1bCBmb3IgZmlsdGVyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxldmFudCB0byBhIHBhcnRpY3VsYXIgcHVycG9zZS5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gUFxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1JlY29yZDxgJHtQfSR7S31gLCBWPn0gb2JqXG4gKiBAcGFyYW0ge1B9IHByZWZpeFxuICovJGjNj19vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuICAgICAgIGNvbnN0IHVucHJlZml4ZWRQcm9wZXJ0aWVzID0gKG9iaiwgcHJlZml4KSA9PlxuICAvKiogQHR5cGUge1JlY29yZDxLLCBWPn0gKi8gKFxuICAgIGZyb21UeXBlZEVudHJpZXMoXG4gICAgICB0eXBlZEVudHJpZXMob2JqKVxuICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4ga2V5LnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpLCB2YWx1ZV0pLFxuICAgIClcbiAgKTskaM2PX29uY2UudW5wcmVmaXhlZFByb3BlcnRpZXModW5wcmVmaXhlZFByb3BlcnRpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVFJVRSI6WyJUUlVFIl0sInR5cGVkRW50cmllcyI6WyJ0eXBlZEVudHJpZXMiXSwiZnJvbVR5cGVkRW50cmllcyI6WyJmcm9tVHlwZWRFbnRyaWVzIl0sInR5cGVkTWFwIjpbInR5cGVkTWFwIl0sImxvZ0xldmVscyI6WyJsb2dMZXZlbHMiXSwiZGVlcENvcHlKc29uYWJsZSI6WyJkZWVwQ29weUpzb25hYmxlIl0sImRlZXBNYXBPYmplY3QiOlsiZGVlcE1hcE9iamVjdCJdLCJkZWZpbmVOYW1lIjpbImRlZmluZU5hbWUiXSwib2JqZWN0TWFwTXV0YWJsZSI6WyJvYmplY3RNYXBNdXRhYmxlIl0sInBhcnRpYWxNYXAiOlsicGFydGlhbE1hcCJdLCJwcm92aWRlTGF6eU1hcCI6WyJwcm92aWRlTGF6eU1hcCJdLCJtYWtlTWVhc3VyZVNlY29uZHMiOlsibWFrZU1lYXN1cmVTZWNvbmRzIl0sInVucHJlZml4ZWRQcm9wZXJ0aWVzIjpbInVucHJlZml4ZWRQcm9wZXJ0aWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACL1UtWsBwAArAcAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMva2V5TWlycm9yLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJrZXlNaXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuY29uc3QgeyBmcmVlemUsIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ICYgUmVjb3JkPEV4Y2x1ZGU8UHJvcGVydHlLZXksIHN0cmluZz4sIG5ldmVyPn0gSW5pdFxuICogQHR5cGVkZWYge3sgcmVhZG9ubHkgW0sgaW4ga2V5b2YgSW5pdF06IEsgfX0gS2V5TWlycm9yUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBNaXJyb3IgdGhlIGtleXMgb2YgYW4gb2JqZWN0IHRvIHN0cmluZyB2YWx1ZXMgdGhhdCBtYXRjaCB0aGUga2V5IG5hbWVzLiBUaGlzXG4gKiB3b3JrcyB3ZWxsIHRvIGRlZmluZSBhIFR5cGVTY3JpcHQgZW51bSB0eXBlIGNvbXBhdGlibGUgd2l0aCBlcmFzYWJsZSBzeW50YXg6XG4gKlxuICogICAgYEBlbnVtIHsodHlwZW9mIE15RW51bSlba2V5b2YgdHlwZW9mIE15RW51bV19YFxuICpcbiAqIFRoZSBwcm92aWRlZCByZWNvcmQgbXVzdCBvbmx5IG1hcCBwcm9wZXJ0eSBuYW1lcyB0byBlaXRoZXIgYG51bGxgIG9yIHRoZVxuICogcHJvcGVydHkgbmFtZSBpdHNlbGYuIFRoZSByZXR1cm5lZCBvYmplY3QgaGFzIGlkZW50aWNhbCBrZXlzIHdob3NlIHZhbHVlcyBhcmVcbiAqIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUga2V5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gJiBSZWNvcmQ8RXhjbHVkZTxQcm9wZXJ0eUtleSwgc3RyaW5nPiwgbmV2ZXI+fSBJbml0XG4gKiBAcGFyYW0ge0luaXQgJiB7IHJlYWRvbmx5IFtLIGluIGtleW9mIEluaXRdOiBJbml0W0tdIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBLIH19IHJlY29yZFxuICogQHJldHVybnMge0tleU1pcnJvclJlc3VsdDxJbml0Pn1cbiAqL1xuICAgICAgIGNvbnN0IGtleU1pcnJvciA9IHJlY29yZCA9PiB7XG4gIGlmIChyZWNvcmQgPT09IG51bGwgfHwgdHlwZW9mIHJlY29yZCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2tleU1pcnJvciBleHBlY3RzIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzLicpO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBtaXJyb3JlZCA9IHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFJlY29yZCBjb25mdXNlZCBieSBudWxsIHByb3RvdHlwZSovXG4gICAgX19wcm90b19fOiBudWxsLFxuICB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKHJlY29yZCkpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IGtleSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFxuICAgICAgICBgVmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiIG11c3QgYmUgbnVsbCBvciB0aGUga2V5IHN0cmluZzsgZ290ICR7U3RyaW5nKHZhbHVlKX0uYCxcbiAgICAgICk7XG4gICAgfVxuICAgIG1pcnJvcmVkW2tleV0gPSBrZXk7XG4gIH1cbiAgcmV0dXJuIC8qKiBAdHlwZSB7S2V5TWlycm9yUmVzdWx0PEluaXQ+fSAqLyAoZnJlZXplKG1pcnJvcmVkKSk7XG59OyRozY9fb25jZS5rZXlNaXJyb3Ioa2V5TWlycm9yKTtcblxuZnJlZXplKGtleU1pcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJrZXlNaXJyb3IiOlsia2V5TWlycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKVsHvRVLQAAVS0AAC8AAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbGliLWNoYWluU3RvcmFnZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyIsIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanMiLCIuL2NhbGxiYWNrLmpzIl0sImV4cG9ydHMiOlsiU3RyZWFtQ2VsbFNoYXBlIiwiYXNzZXJ0UGF0aFNlZ21lbnQiLCJpc1N0cmVhbUNlbGwiLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCIsIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCIsInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxFLEZhcixNLG1ha2VIZWFwWm9uZSxjYjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanNcIiwgW1tcIm1ha2VIZWFwWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VIZWFwWm9uZSA9ICRozY9fYSldXV1dLFtcIi4vY2FsbGJhY2suanNcIiwgW1tcIipcIixbJGjNj19hID0+IChjYiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VDaGFpblN0b3JhZ2VSb290LCduYW1lJyx7dmFsdWU6XCJtYWtlQ2hhaW5TdG9yYWdlUm9vdFwifSk7JGjNj19vbmNlLm1ha2VDaGFpblN0b3JhZ2VSb290KG1ha2VDaGFpblN0b3JhZ2VSb290KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVN0b3JhZ2VOb2RlQ2hpbGQsJ25hbWUnLHt2YWx1ZTpcIm1ha2VTdG9yYWdlTm9kZUNoaWxkXCJ9KTskaM2PX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtNYXJzaGFsLCBQYXNzYWJsZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKiBAaW1wb3J0IHtSZW1vdGUsIEVSZW1vdGUsIFR5cGVkUGF0dGVybn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnLi9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKiBAaW1wb3J0IHtDYWxsYmFja30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqIEB0eXBlZGVmIHtNYXJzaGFsPHVua25vd24+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIFN0cmVhbUNlbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBibG9ja0hlaWdodCBjb3JyZXNwb25kaW5nIHdpdGggdGhlIHdyaXRlIG9mIGB2YWx1ZXNgXG4gKiAgIChkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbmF0dXJhbCBudW1iZXIpXG4gKiBAcHJvcGVydHkge1RbXX0gdmFsdWVzXG4gKi9cblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48U3RyZWFtQ2VsbD59ICovXG4gICAgICAgY29uc3QgU3RyZWFtQ2VsbFNoYXBlID0gaGFyZGVuKHtcbiAgYmxvY2tIZWlnaHQ6IE0uc3RyaW5nKCksXG4gIHZhbHVlczogTS5hcnJheSgpLFxufSk7XG5cbi8qKlxuICogVGhpcyByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBJQVZMIHRyZWUuXG4gKlxuICogVGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB4L3ZzdG9yYWdlLCBhbiBBZ29yaWMgZXh0ZW5zaW9uIG9mIHRoZSBDb3Ntb3NcbiAqIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhc1xuICogICBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoXG4gKiAgIHN1YlBhdGg6IHN0cmluZyxcbiAqICAgb3B0aW9ucz86IHsgc2VxdWVuY2U/OiBib29sZWFuIH0sXG4gKiApID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi8kaM2PX29uY2UuU3RyZWFtQ2VsbFNoYXBlKFN0cmVhbUNlbGxTaGFwZSk7XG5cbmNvbnN0IENoYWluU3RvcmFnZU5vZGVJID0gTS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJywge1xuICBzZXRWYWx1ZTogTS5jYWxsV2hlbihNLnN0cmluZygpKS5yZXR1cm5zKCksXG4gIGdldFBhdGg6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldFN0b3JlS2V5OiBNLmNhbGxXaGVuKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbiAgbWFrZUNoaWxkTm9kZTogTS5jYWxsKE0uc3RyaW5nKCkpXG4gICAgLm9wdGlvbmFsKE0uc3BsaXRSZWNvcmQoe30sIHsgc2VxdWVuY2U6IE0uYm9vbGVhbigpIH0sIHt9KSlcbiAgICAucmV0dXJucyhNLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKSksXG59KTtcblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGVyZmVjdCBoZXVyaXN0aWMgdG8gbmF2aWdhdGUgdGhlIG1pZ3JhdGlvbiBmcm9tIHZhbHVlIGNlbGxzIHRvXG4gKiBzdHJlYW0gY2VsbHMuIEF0IHRpbWUgb2Ygd3JpdGluZywgbm8gbGVnYWN5IGNlbGxzIGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgYVxuICogc3RyZWFtIGNlbGwsIGFuZCB3ZSBkbyBub3QgaW50ZW5kIHRvIGNyZWF0ZSBhbnkgbW9yZSBsZWdhY3kgdmFsdWUgY2VsbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IGNlbGxcbiAqIEByZXR1cm5zIHtjZWxsIGlzIFN0cmVhbUNlbGx9XG4gKi9cbiAgICAgICBjb25zdCBpc1N0cmVhbUNlbGwgPSBjZWxsID0+XG4gIGNlbGwgJiZcbiAgdHlwZW9mIGNlbGwgPT09ICdvYmplY3QnICYmXG4gIEFycmF5LmlzQXJyYXkoY2VsbC52YWx1ZXMpICYmXG4gIHR5cGVvZiBjZWxsLmJsb2NrSGVpZ2h0ID09PSAnc3RyaW5nJyAmJlxuICAvXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjNj19vbmNlLmlzU3RyZWFtQ2VsbChpc1N0cmVhbUNlbGwpO1xuaGFyZGVuKGlzU3RyZWFtQ2VsbCk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlXG4gKiAgIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGVcbiAqICAgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbi8qIFNob3VsZCByZW1haW4gY29uc2lzdGVudCB3aXRoIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS90eXBlcy9wYXRoX2tleXMuZ28qL1xuY29uc3QgcGF0aFNlZ21lbnRQYXR0ZXJuID0gL15bYS16QS1aMC05Xy1dezEsMTAwfSQvO1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcpID0+IHZvaWR9ICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGF0aFNlZ21lbnQgPSBuYW1lID0+IHtcbiAgcGF0aFNlZ21lbnRQYXR0ZXJuLnRlc3QobmFtZSkgfHxcbiAgICBGYWlsYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbn07JGjNj19vbmNlLmFzc2VydFBhdGhTZWdtZW50KGFzc2VydFBhdGhTZWdtZW50KTtcbmhhcmRlbihhc3NlcnRQYXRoU2VnbWVudCk7XG5cbi8qKlxuICogTXVzdCBtYXRjaCB0aGUgc3dpdGNoIGluIHZzdG9yYWdlLmdvIHVzaW5nIGB2c3RvcmFnZU1lc3NhZ2VgIHR5cGVcbiAqXG4gKiBAdHlwZWRlZiB7J2dldCdcbiAqICAgfCAnZ2V0U3RvcmVLZXknXG4gKiAgIHwgJ2hhcydcbiAqICAgfCAnY2hpbGRyZW4nXG4gKiAgIHwgJ2VudHJpZXMnXG4gKiAgIHwgJ3ZhbHVlcydcbiAqICAgfCAnc2l6ZSd9IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKlxuICpcbiAqIEB0eXBlZGVmIHsnc2V0JyB8ICdzZXRXaXRob3V0Tm90aWZ5JyB8ICdhcHBlbmQnfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2RcbiAqXG4gKlxuICogQHR5cGVkZWYge1N0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKiAgIHwgU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kfSBTdG9yYWdlTWVzc2FnZU1ldGhvZFxuICpcbiAqXG4gKiBAdHlwZWRlZiB7W3BhdGg6IHN0cmluZ119IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJnc1xuICpcbiAqIEB0eXBlZGVmIHtbcGF0aDogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyB8IG51bGxdfSBTdG9yYWdlRW50cnlcbiAqXG4gKiBAdHlwZWRlZiB7U3RvcmFnZUVudHJ5W119IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3NcbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICAgICAgbWV0aG9kOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZDtcbiAqICAgICAgIGFyZ3M6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJncztcbiAqICAgICB9XG4gKiAgIHwge1xuICogICAgICAgbWV0aG9kOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2Q7XG4gKiAgICAgICBhcmdzOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzO1xuICogICAgIH19IFN0b3JhZ2VNZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmVcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlID0gem9uZSA9PiB7XG4gIC8qKlxuICogQ3JlYXRlIGEgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgc3RvcmFnZSBpbnRlcmZhY2UgYW5kIHBhdGguXG4gKlxuICogQHBhcmFtIHtDYWxsYmFjazwobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueT59IG1lc3NlbmdlciBhIGNhbGxiYWNrXG4gKiAgIGZvciBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uIChjZi5cbiAqICAgZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdIHNldCB2YWx1ZXMgd2l0aCBgYXBwZW5kYCBtZXNzYWdlc1xuICogICByYXRoZXIgdGhhbiBgc2V0YCBtZXNzYWdlcyBzbyB0aGUgYmFja2luZyBpbXBsZW1lbnRhdGlvbiBlbXBsb3lzIGFcbiAqICAgd3JhcHBpbmcgc3RydWN0dXJlIHRoYXQgcHJlc2VydmVzIGVhY2ggdmFsdWUgc2V0IHdpdGhpbiBhIHNpbmdsZSBibG9jay5cbiAqICAgQ2hpbGQgbm9kZXMgZGVmYXVsdCB0byBpbmhlcml0aW5nIHRoaXMgb3B0aW9uIGZyb20gdGhlaXIgcGFyZW50LlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfVxuICovXG4gIGNvbnN0IG1ha2VDaGFpblN0b3JhZ2VOb2RlID0gem9uZS5leG9DbGFzcyhcbiAgICAnQ2hhaW5TdG9yYWdlTm9kZScsXG4gICAgQ2hhaW5TdG9yYWdlTm9kZUksXG4gICAgLyoqXG4gKiBAcGFyYW0ge0NhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqL1xuICAgIChtZXNzZW5nZXIsIHBhdGgsIHsgc2VxdWVuY2UgPSBmYWxzZSB9ID0ge30pID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YocGF0aCwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwgJ2Jvb2xlYW4nKTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBwYXRoLCBtZXNzZW5nZXIsIHNlcXVlbmNlIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIEBkZXByZWNhdGVkIHVzZSBnZXRQYXRoXG4gKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59XG4gKi9cbiAgICAgIGFzeW5jIGdldFN0b3JlS2V5KCkge1xuICAgICAgICBjb25zdCB7IHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIGNiLmNhbGxFKG1lc3Nlbmdlciwge1xuICAgICAgICAgIG1ldGhvZDogJ2dldFN0b3JlS2V5JyxcbiAgICAgICAgICBhcmdzOiBbcGF0aF0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICogQHR5cGUgeyhcbiAqICAgbmFtZTogc3RyaW5nLFxuICogICBjaGlsZE5vZGVPcHRpb25zPzogeyBzZXF1ZW5jZT86IGJvb2xlYW4gfSxcbiAqICkgPT4gU3RvcmFnZU5vZGV9XG4gKi9cbiAgICAgIG1ha2VDaGlsZE5vZGUobmFtZSwgY2hpbGROb2RlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc2VxdWVuY2UsIHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IHNlcXVlbmNlLCAuLi5jaGlsZE5vZGVPcHRpb25zIH07XG4gICAgICAgIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZShcbiAgICAgICAgICBtZXNzZW5nZXIsXG4gICAgICAgICAgYCR7cGF0aH0uJHtuYW1lfWAsXG4gICAgICAgICAgbWVyZ2VkT3B0aW9ucyxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICAvKiogQHR5cGUgeyh2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICAgICAgYXN5bmMgc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBzZXF1ZW5jZSwgcGF0aCwgbWVzc2VuZ2VyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBhc3NlcnQudHlwZW9mKHZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICAgIC8qKiBAdHlwZSB7U3RvcmFnZUVudHJ5fSAqL1xuICAgICAgICBsZXQgZW50cnk7XG4gICAgICAgIGlmICghc2VxdWVuY2UgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aCwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNiLmNhbGxFKG1lc3Nlbmdlciwge1xuICAgICAgICAgIG1ldGhvZDogc2VxdWVuY2UgPyAnYXBwZW5kJyA6ICdzZXQnLFxuICAgICAgICAgIGFyZ3M6IFtlbnRyeV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLyogUG9zc2libGUgZXh0ZW5zaW9uczoqL1xuICAgICAgLyogKiBnZXRWYWx1ZSgpKi9cbiAgICAgIC8qICogZ2V0Q2hpbGROYW1lcygpIGFuZC9vciBtYWtlQ2hpbGROb2RlcygpKi9cbiAgICAgIC8qICogZ2V0TmFtZSgpKi9cbiAgICAgIC8qICogcmVjdXJzaXZlIGRlbGV0ZSovXG4gICAgICAvKiAqIGJhdGNoIG9wZXJhdGlvbnMqL1xuICAgICAgLyogKiBsb2NhbCBidWZmZXJpbmcgKHdpdGggZW5kLW9mLWJsb2NrIGNvbW1pdCkqL1xuICAgIH0sXG4gICk7XG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZTtcbn07JGjNj19vbmNlLnByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKTtcblxuY29uc3QgbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlID0gcHJlcGFyZUNoYWluU3RvcmFnZU5vZGUobWFrZUhlYXBab25lKCkpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGhlYXAtYmFzZWQgcm9vdCBzdG9yYWdlIG5vZGUgZm9yIGEgZ2l2ZW4gYmFja2luZyBmdW5jdGlvbiBhbmQgcm9vdFxuICogcGF0aC5cbiAqXG4gKiBAcGFyYW0geyhtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55fSBoYW5kbGVTdG9yYWdlTWVzc2FnZSBhIGZ1bmN0aW9uIGZvclxuICogICBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uIChjZi5cbiAqICAgZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW3Jvb3RPcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbcm9vdE9wdGlvbnMuc2VxdWVuY2VdIGVtcGxveSBhIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0XG4gKiAgIHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2ssIGFuZCBkZWZhdWx0IGNoaWxkIG5vZGVzIHRvXG4gKiAgIGRvIHRoZSBzYW1lXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgaGFuZGxlU3RvcmFnZU1lc3NhZ2UsXG4gIHJvb3RQYXRoLFxuICByb290T3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IG1lc3NlbmdlciA9IGNiLm1ha2VGdW5jdGlvbkNhbGxiYWNrKGhhbmRsZVN0b3JhZ2VNZXNzYWdlKTtcblxuICAvKiBVc2UgdGhlIGhlYXBab25lIGRpcmVjdGx5LiovXG4gIGNvbnN0IHJvb3ROb2RlID0gbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlKG1lc3Nlbmdlciwgcm9vdFBhdGgsIHJvb3RPcHRpb25zKTtcbiAgcmV0dXJuIHJvb3ROb2RlO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX0gYW4gb2JqZWN0IHRoYXQgY29uZmlybXMgdG8gU3RvcmFnZU5vZGUgQVBJIGJ1dCBkb2VzXG4gKiAgIG5vdCBzdG9yZSBhbnl3aGVyZS5cbiAqL1xuY29uc3QgbWFrZU51bGxTdG9yYWdlTm9kZSA9ICgpID0+IHtcbiAgLyogWFhYIHJlLXVzZSBcIkNoYWluU3RvcmFnZVwiIG1ldGhvZHMgYWJvdmUgd2hpY2ggZG9uJ3QgYWN0dWFsbHkgZGVwZW5kIG9uIGNoYWlucyovXG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgICBGYXIoJ051bGxNZXNzZW5nZXInLCAoKSA9PiBudWxsKSxcbiAgICAnbnVsbCcsXG4gICk7XG59O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciByZXR1cm5pbmcgYSBzdG9yYWdlIG5vZGUgYXQgb3IgdW5kZXIgaXRzIGlucHV0LFxuICogZmFsbGluZyBiYWNrIHRvIGFuIGluZXJ0IG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGludGVyZmFjZSAoYnV0IGluY29tcGxldGVcbiAqIGJlaGF2aW9yKSB3aGVuIHRoYXQgaXMgdW5hdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtFUmVmPFJlbW90ZTxTdG9yYWdlTm9kZT4gfCBudWxsPn0gc3RvcmFnZU5vZGVSZWZcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGlsZE5hbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlbW90ZTxTdG9yYWdlTm9kZT4+fVxuICovXG4gICAgICAgYXN5bmMgZnVuY3Rpb24gbWFrZVN0b3JhZ2VOb2RlQ2hpbGQoc3RvcmFnZU5vZGVSZWYsIGNoaWxkTmFtZSkge1xuICBjb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlID0gYXdhaXQgc3RvcmFnZU5vZGVSZWY7XG4gIGNvbnN0IHN0b3JhZ2VOb2RlID0gZXhpc3RpbmdTdG9yYWdlTm9kZSB8fCBtYWtlTnVsbFN0b3JhZ2VOb2RlKCk7XG4gIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkTmFtZSk7XG59XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vKiBUT0RPIGZpbmQgYSBiZXR0ZXIgbW9kdWxlIGZvciB0aGlzKi9cbi8qKlxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHsodmFsdWU6IFBhc3NhYmxlKSA9PiBQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICByZXR1cm4gYXN5bmMgdmFsdWUgPT4ge1xuICAgIGNvbnN0IG1hcnNoYWxsZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KG1hcnNoYWxsZWQpO1xuICAgIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdHJlYW1DZWxsU2hhcGUiOlsiU3RyZWFtQ2VsbFNoYXBlIl0sImlzU3RyZWFtQ2VsbCI6WyJpc1N0cmVhbUNlbGwiXSwiYXNzZXJ0UGF0aFNlZ21lbnQiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiXSwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiOlsicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwibWFrZUNoYWluU3RvcmFnZVJvb3QiOlsibWFrZUNoYWluU3RvcmFnZVJvb3QiXSwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiOlsibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiXSwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSI6WyJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKSDz56xAwAAsQMAADAAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9wdXJlLWRhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInB1cmVEYXRhTWFyc2hhbGxlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NhcERhdGF9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICovXG5cbi8qKiBAcGFyYW0ge0NhcERhdGE8dW5rbm93bj59IGNhcCAqL1xuY29uc3QgcmVqZWN0T0NhcCA9IGNhcCA9PiBGYWlsYCR7Y2FwfSBpcyBub3QgcHVyZSBkYXRhYDtcbiAgICAgICBjb25zdCBwdXJlRGF0YU1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbChyZWplY3RPQ2FwLCByZWplY3RPQ2FwLCB7XG4gIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxufSk7JGjNj19vbmNlLnB1cmVEYXRhTWFyc2hhbGxlcihwdXJlRGF0YU1hcnNoYWxsZXIpO1xuaGFyZGVuKHB1cmVEYXRhTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwdXJlRGF0YU1hcnNoYWxsZXIiOlsicHVyZURhdGFNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACvtEEXxDQAA8Q0AACsAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJiaW5kQWxsTWV0aG9kcyIsImdldE1ldGhvZE5hbWVzIiwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCByZWFsR2V0TWV0aG9kTmFtZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKHJlYWxHZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAZmlsZSBtZXRob2QtdG9vbHMgdXNlIGR5bmFtaWMgcHJvcGVydHkgbG9va3VwLCB3aGljaCBpcyBub3RcbiAqICAgSmVzc2llLWNvbXBhdGlibGVcbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIHRoZSBgZ2V0TWV0aG9kTmFtZXNgIGluIGBAZW5kby9ldmVudHVhbC1zZW5kYFxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBgZ2V0TWV0aG9kTmFtZXNgIGZyb20gYEBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNgIGluc3RlYWQuXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBLXG4gKiBAcGFyYW0ge1JlY29yZDxLLCBhbnk+fSB2YWxcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2ROYW1lcyA9IHZhbCA9PlxuICAvKiogQHR5cGUge0tbXX0gKi8gKHJlYWxHZXRNZXRob2ROYW1lcyh2YWwpKTskaM2PX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldE1ldGhvZE5hbWVzKTtcblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGBnZXRNZXRob2ROYW1lc2AgY29udGFpbmluZyBvbmx5IHN0cmluZyBuYW1lcywgd2l0aG91dCBzeW1ib2xzXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gS1xuICogQHBhcmFtIHtSZWNvcmQ8SywgYW55Pn0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRTdHJpbmdNZXRob2ROYW1lcyA9IHZhbCA9PlxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoXG4gICAgcmVhbEdldE1ldGhvZE5hbWVzKHZhbCkuZmlsdGVyKG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKVxuICApO1xuXG4vKipcbiAqIFRPRE8gVGhpcyBmdW5jdGlvbiBleGlzdHMgb25seSB0byBlYXNlIHRoZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTk3MCB0cmFuc2l0aW9uLCBmcm9tIGFsbCBtZXRob2RzXG4gKiBiZWluZyBvd24gcHJvcGVydGllcyB0byBtZXRob2RzIGJlaW5nIGluaGVyaXRlZCBmcm9tIGEgY29tbW9uIHByb3RvdHlwZS4gVGhpc1xuICogdHJhbnNpdGlvbiBicmVha3MgdHdvIHBhdHRlcm5zIHVzZWQgaW4gcHJpb3IgY29kZTogYXV0b2JpbmRpbmcsIGFuZFxuICogZW51bWVyYXRpbmcgbWV0aG9kcyBieSBlbnVtZXJhdGluZyBvd24gcHJvcGVydGllcy4gRm9yIGJvdGgsIHRoZSBwcmVmZXJyZWRcbiAqIHJlcGFpcnMgYXJlXG4gKlxuICogLSBhdXRvYmluZGluZzogUmVwbGFjZSwgZm9yIGV4YW1wbGUsIGBmb28ob2JqLm1ldGhvZClgIHdpdGggYGZvbyhhcmcgPT5cbiAqICAgYG9iai5tZXRob2QoYXJnKSlgLiBJT1csIHN0b3AgcmVseWluZyBvbiBleHByZXNzaW9ucyBsaWtlIGBvYmoubWV0aG9kYHRvXG4gKiAgIGV4dHJhY3QgYSBtZXRob2Qgc3RpbGwgYm91bmQgdG8gdGhlIHN0YXRlIG9mYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kXG4gKiAgIGR1cmFibGUgb2JqZWN0cywgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqIC0gbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZSBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGhcbiAqICAgYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuIEZvclxuICogdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHJldHVybnMge1R9XG4gKi8kaM2PX29uY2UuZ2V0U3RyaW5nTWV0aG9kTmFtZXMoZ2V0U3RyaW5nTWV0aG9kTmFtZXMpO1xuICAgICAgIGNvbnN0IGJpbmRBbGxNZXRob2RzID0gb2JqID0+XG4gIGhhcmRlbihcbiAgICBjcmVhdGUoXG4gICAgICBvYmosXG4gICAgICBmcm9tRW50cmllcyhcbiAgICAgICAgcmVhbEdldE1ldGhvZE5hbWVzKG9iaikubWFwKG5hbWUgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICgvKiogQHR5cGUge3Vua25vd25bXX0gKi8gLi4uYXJncykgPT5cbiAgICAgICAgICAgICAgYXBwbHkob2JqW25hbWVdLCBvYmosIGFyZ3MpLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTskaM2PX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuaGFyZGVuKGJpbmRBbGxNZXRob2RzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImdldFN0cmluZ01ldGhvZE5hbWVzIjpbImdldFN0cmluZ01ldGhvZE5hbWVzIl0sImJpbmRBbGxNZXRob2RzIjpbImJpbmRBbGxNZXRob2RzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJD9IHigQgAAoEIAACYAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0cmljcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyIsIkhJU1RPR1JBTV9NRVRSSUNTIiwiS0VSTkVMX1NUQVRTX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiLCJRdWV1ZU1ldHJpY0FzcGVjdCIsIm1ha2VRdWV1ZU1ldHJpY3MiLCJtYWtlUXVldWVNZXRyaWNzTWV0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsaXNOYXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJpc05hdFwiLFskaM2PX2EgPT4gKGlzTmF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01ldGVyIGFzIE9UZWxNZXRlciwgTWV0cmljQXR0cmlidXRlc30gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbiAqIEBpbXBvcnQge1RvdGFsTWFwfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqL1xuXG5jb25zdCBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTID0gW1xuICA1LFxuICAxMCxcbiAgMjUsXG4gIDUwLFxuICAxMDAsXG4gIDI1MCxcbiAgNTAwLFxuICAxMDAwLFxuICAyNTAwLFxuICA1MDAwLFxuICAxMDAwMCxcbiAgSW5maW5pdHksXG5dO1xuY29uc3QgSElTVE9HUkFNX1NFQ09ORFNfTEFURU5DWV9CT1VOREFSSUVTID1cbiAgSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUy5tYXAobXMgPT4gbXMgLyAxMDAwKTtcblxuLyogVE9ETzogVmFsaWRhdGUgdGhlc2UgYm91bmRhcmllcy4gV2UncmUgbm90IGdvaW5nIHRvIGhhdmUgNW1zIGJsb2NrcywgYnV0Ki9cbi8qIHdlIHByb2JhYmx5IGNhcmUgYWJvdXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxMCB2cy4gMzAgc2Vjb25kcy4qL1xuICAgICAgIGNvbnN0IEhJU1RPR1JBTV9NRVRSSUNTID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgc3dpbmdzZXRfY3JhbmtfcHJvY2Vzc2luZ190aW1lOiB7XG4gICAgZGVzY3JpcHRpb246ICdQcm9jZXNzaW5nIHRpbWUgcGVyIGNyYW5rIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogQXJyYXkub2YoMSwgMTEsIDIxLCAzMSwgNDEsIDUxLCA2MSwgNzEsIDgxLCA5MSwgSW5maW5pdHkpLFxuICB9LFxuICBzd2luZ3NldF9ibG9ja19wcm9jZXNzaW5nX3NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Byb2Nlc3NpbmcgdGltZSBwZXIgYmxvY2snLFxuICAgIHVuaXQ6ICdzJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fU0VDT05EU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X3ZhdF9zdGFydHVwOiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgc3RhcnR1cCB0aW1lIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbiAgc3dpbmdzZXRfdmF0X2RlbGl2ZXJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgZGVsaXZlcnkgdGltZSAobXMpJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X21ldGVyX3VzYWdlOiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgbWV0ZXIgdXNhZ2UnLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbn0pOyRozY9fb25jZS5ISVNUT0dSQU1fTUVUUklDUyhISVNUT0dSQU1fTUVUUklDUyk7XG5cbmNvbnN0IGJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyA9IHtcbiAgLyogRGlzYWJsZWQgYmVjYXVzZSBpbXBvcnRpbmcgZnJvbSBAb3BlbnRlbGVtZXRyeS9hcGkgYnJlYWtzIGtlcm5lbCBidW5kbGluZy4qL1xuICAvKiBUaGFua2Z1bGx5LCBpdCdzIHRoZSBkZWZhdWx0IGFueXdheToqL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vb3Blbi10ZWxlbWV0cnkvb3BlbnRlbGVtZXRyeS1qcy9ibG9iL2Y0ZGQyYTEwNjJmOTgwY2QzNDRjZmIxNzJhNTE1ZDAwMTE1ZGY1NzAvYXBpL3NyYy9tZXRyaWNzL01ldHJpYy50cyNMNTMtTDU3Ki9cbiAgLyogdmFsdWVUeXBlOiBWYWx1ZVR5cGUuRE9VQkxFLCovXG4gIHVuaXQ6ICdzJyxcbiAgYWR2aWNlOiB7XG4gICAgZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzOiBbXG4gICAgICAwLjEsIDAuMiwgMC4zLCAwLjQsIDAuNSwgMSwgMiwgMywgNCwgNSwgNiwgNywgMTAsIDE1LCAzMCxcbiAgICBdLFxuICB9LFxufTtcbiAgICAgICBjb25zdCBCTE9DS19ISVNUT0dSQU1fTUVUUklDUyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIHN3aW5nc2V0UnVuU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgZXhlY3V0aW5nIFN3aW5nU2V0JyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIHN3aW5nc2V0Q2hhaW5TYXZlU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgcHJvcGFnYXRpbmcgU3dpbmdTZXQgc3RhdGUgaW50byBjb3Ntb3MnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgc3dpbmdzZXRDb21taXRTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBTd2luZ1NldCBzdGF0ZSB0byBob3N0IHN0b3JhZ2UnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgY29zbW9zQ29tbWl0U2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBjb3Ntb3Mgc3RhdGUnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgZnVsbENvbW1pdFNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQZXItYmxvY2sgdGltZSBzcGVudCBjb21taXR0aW5nIHN0YXRlLCBpbmNsdXNpdmUgb2YgQ09NTUlUX0JMT0NLIHByb2Nlc3NpbmcgcGx1cyB0aW1lIHNwZW50IFtvdXRzaWRlIG9mIGNvc21pYy1zd2luZ3NldF0gYmVmb3JlIGFuZCBhZnRlciBpdCcsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBpbnRlckJsb2NrU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZSBzcGVudCBpZGxlIGJldHdlZW4gYmxvY2tzJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGFmdGVyQ29tbWl0SGFuZ292ZXJTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgd2FpdGluZyBmb3IgcHJldmlvdXMtYmxvY2sgYWZ0ZXJDb21taXQgd29yaycsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBibG9ja0xhZ1NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBkZWxheSBvZiBlYWNoIGJsb2NrIGZyb20gaXRzIGV4cGVjdGVkIGJlZ2luIHRpbWUnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgICAvKiBBZGQgYnVja2V0cyBmb3IgZXhjZXNzaXZlbHkgbG9uZyBkZWxheXMuKi9cbiAgICBhZHZpY2U6IHtcbiAgICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYy5hZHZpY2UsXG4gICAgICBleHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXM6IC8qKiBAdHlwZSB7bnVtYmVyW119ICovIChbXG4gICAgICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYy5hZHZpY2UuZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzLFxuICAgICAgICAuLi5bNjAsIDEyMCwgMTgwLCAyNDAsIDMwMCwgNjAwLCAzNjAwXSxcbiAgICAgIF0pLFxuICAgIH0sXG4gIH0sXG59KTtcblxuLyoqIEBlbnVtIHsodHlwZW9mIFF1ZXVlTWV0cmljQXNwZWN0KVtrZXlvZiB0eXBlb2YgUXVldWVNZXRyaWNBc3BlY3RdfSAqLyRozY9fb25jZS5CTE9DS19ISVNUT0dSQU1fTUVUUklDUyhCTE9DS19ISVNUT0dSQU1fTUVUUklDUyk7XG4gICAgICAgY29uc3QgUXVldWVNZXRyaWNBc3BlY3QgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBMZW5ndGg6ICdsZW5ndGgnLFxuICBJbmNyZW1lbnRDb3VudDogJ2luY3JlbWVudHMnLFxuICBEZWNyZW1lbnRDb3VudDogJ2RlY3JlbWVudHMnLFxufSk7XG5cbi8qKlxuICogUXVldWUgbWV0cmljcyBjb21lIGluIHtsZW5ndGgsYWRkLHJlbW92ZX0gdHJpcGxlcyBzaGFyaW5nIGEgY29tbW9uIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVByZWZpeFxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NQcmVmaXhcbiAqIEByZXR1cm5zIHtSZWNvcmQ8XG4gKiAgIFF1ZXVlTWV0cmljQXNwZWN0LFxuICogICB7IG5hbWU6IHN0cmluZzsgb3B0aW9uczogTWV0cmljQXR0cmlidXRlcyB9XG4gKiA+fVxuICovJGjNj19vbmNlLlF1ZXVlTWV0cmljQXNwZWN0KFF1ZXVlTWV0cmljQXNwZWN0KTtcbiAgICAgICBjb25zdCBtYWtlUXVldWVNZXRyaWNzTWV0YSA9IChuYW1lUHJlZml4LCBkZXNjUHJlZml4KSA9PiB7XG4gIC8qKiBAdHlwZSB7W1F1ZXVlTWV0cmljQXNwZWN0LCBzdHJpbmcsIHN0cmluZ11bXX0gKi9cbiAgY29uc3QgbWV0cmljc01ldGEgPSBbXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0Lkxlbmd0aCwgJ2xlbmd0aCcsICdsZW5ndGgnXSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuSW5jcmVtZW50Q291bnQsICdhZGQnLCAnaW5jcmVtZW50cyddLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5EZWNyZW1lbnRDb3VudCwgJ3JlbW92ZScsICdkZWNyZW1lbnRzJ10sXG4gIF07XG4gIGNvbnN0IGVudHJpZXMgPSBtZXRyaWNzTWV0YS5tYXAoKFthc3BlY3QsIG5hbWVTdWZmaXgsIGRlc2NTdWZmaXhdKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGAke25hbWVQcmVmaXh9XyR7bmFtZVN1ZmZpeH1gO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYCR7ZGVzY1ByZWZpeH0gJHtkZXNjU3VmZml4fWA7XG4gICAgLyogRnV0dXJlIE9wZW5UZWxlbWV0cnkgU0RLcyBzaG91bGQgYWxzbyBzdXBwb3J0IGNyZWF0aW5nIEluc3RydW1lbnRzIHdpdGgqL1xuICAgIC8qIGF0dHJpYnV0ZSBrZXlzIChzdWNoIGFzIHRoZSBcInF1ZXVlXCIgYXR0cmlidXRlIGZvciovXG4gICAgLyogXCJjb3NtaWNfc3dpbmdzZXRfaW5ib3VuZF9xdWV1ZV97bGVuZ3RoLGFkZCxyZW1vdmV9XCIgbWVhc3VyZW1lbnRzKToqL1xuICAgIC8qIGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL290ZWwvbWV0cmljcy9hcGkvI2luc3RydW1lbnQtYWR2aXNvcnktcGFyYW1ldGVyLWF0dHJpYnV0ZXMqL1xuICAgIC8qIEF0IHRoYXQgdGltZSwgYSBuZXcgZmllbGQgd2lsbCBiZSBhZGRlZCB0byB0aGlzIHJlY29yZC4qL1xuICAgIHJldHVybiBbYXNwZWN0LCB7IG5hbWUsIG9wdGlvbnM6IHsgZGVzY3JpcHRpb24gfSB9XTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBRdWV1ZU5hbWVcbiAqIEB0eXBlZGVmIFF1ZXVlTWV0cmljc1xuICogQHByb3BlcnR5IHsobGVuZ3RoczogUmVjb3JkPFF1ZXVlTmFtZSwgbnVtYmVyPikgPT4gdm9pZH0gaW5pdExlbmd0aHMgbXVzdCBiZVxuICogICBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBmdW5jdGlvblxuICogQHByb3BlcnR5IHsobGVuZ3RoczogUmVjb3JkPFF1ZXVlTmFtZSwgbnVtYmVyPikgPT4gdm9pZH0gdXBkYXRlTGVuZ3Roc1xuICogQHByb3BlcnR5IHsocXVldWU6IFF1ZXVlTmFtZSwgZGVsdGE/OiBudW1iZXIpID0+IHZvaWR9IGluY0xlbmd0aCBmb3IgYVxuICogICBub24tbmVnYXRpdmUgZGVsdGFcbiAqIEBwcm9wZXJ0eSB7KHF1ZXVlOiBRdWV1ZU5hbWUsIGRlbHRhPzogbnVtYmVyKSA9PiB2b2lkfSBkZWNMZW5ndGggZm9yIGFcbiAqICAgbm9uLW5lZ2F0aXZlIGRlbHRhXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUge2xlbmd0aCxhZGQscmVtb3ZlfSBJbnN0cnVtZW50cyBmb3IgYSBxdWV1ZSBhbmQgcmV0dXJuIGZ1bmN0aW9ucyBmb3JcbiAqIGNvbnNpc3RlbnRseSBpbml0aWFsaXppbmcgYW5kIHVwZGF0aW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFF1ZXVlTmFtZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICogQHBhcmFtIHtPVGVsTWV0ZXJ9IGNvbmZpZy5vdGVsTWV0ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWcubmFtZVByZWZpeFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZy5kZXNjUHJlZml4XG4gKiBAcGFyYW0ge1BpY2s8Q29uc29sZSwgJ3dhcm4nPn0gW2NvbmZpZy5jb25zb2xlXVxuICogQHJldHVybnMge1F1ZXVlTWV0cmljczxRdWV1ZU5hbWU+fVxuICovJGjNj19vbmNlLm1ha2VRdWV1ZU1ldHJpY3NNZXRhKG1ha2VRdWV1ZU1ldHJpY3NNZXRhKTtcbiAgICAgICBjb25zdCBtYWtlUXVldWVNZXRyaWNzID0gKHtcbiAgb3RlbE1ldGVyLFxuICBuYW1lUHJlZml4LFxuICBkZXNjUHJlZml4LFxuICBjb25zb2xlLFxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0Lkxlbmd0aF06IGxlbmd0aE1ldGEsXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkluY3JlbWVudENvdW50XTogdXBNZXRhLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5EZWNyZW1lbnRDb3VudF06IGRvd25NZXRhLFxuICB9ID0gbWFrZVF1ZXVlTWV0cmljc01ldGEobmFtZVByZWZpeCwgZGVzY1ByZWZpeCk7XG4gIC8qIFRPRE86IFdoZW4gaXQncyBkZWVtZWQgc2FmZSB0byBjaGFuZ2UgcmVwb3J0ZWQgbWV0cmljcywgbWFrZSB1cENvdW50ZXIgYW5kKi9cbiAgLyogZG93bkNvdW50ZXIgc3luY2hyb25vdXMgKGFuZCBkcm9wIGBpbmNyZW1lbnRzYCBhbmQgYGRlY3JlbWVudHNgIG1hcHMpLiovXG4gIC8qIFdlIGNhbid0IGRvIHNvIHVudGlsIHRoZW4gYmVjYXVzZSBpdCB3aWxsIGFkZCBhIFwiX3RvdGFsXCIgc3VmZml4IHRvIHRoZSovXG4gIC8qIFByb21ldGhldXMgZXhwb3J0IG1ldHJpYyBuYW1lLCBkaXZlcmdpbmcgZnJvbSBgbWFrZUluYm91bmRRdWV1ZU1ldHJpY3NgIGluKi9cbiAgLyogcGFja2FnZXMvY29zbWljLXN3aW5nc2V0L3NyYy9rZXJuZWwtc3RhdHMuanMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktanMvYmxvYi9tYWluL2RvYy91cGdyYWRlLXRvLTIueC5tZCMtb3RoZXItY2hhbmdlcyovXG4gIGNvbnN0IGxlbmd0aENvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcihcbiAgICBsZW5ndGhNZXRhLm5hbWUsXG4gICAgbGVuZ3RoTWV0YS5vcHRpb25zLFxuICApO1xuICAvKiBjb25zdCB1cENvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlQ291bnRlcih1cE1ldGEubmFtZSwgdXBNZXRhLm9wdGlvbnMpOyovXG4gIC8qIGNvbnN0IGRvd25Db3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZUNvdW50ZXIoZG93bk1ldGEubmFtZSwgZG93bk1ldGEub3B0aW9ucyk7Ki9cbiAgY29uc3QgdXBDb3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZU9ic2VydmFibGVDb3VudGVyKFxuICAgIHVwTWV0YS5uYW1lLFxuICAgIHVwTWV0YS5vcHRpb25zLFxuICApO1xuICBjb25zdCBkb3duQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVPYnNlcnZhYmxlQ291bnRlcihcbiAgICBkb3duTWV0YS5uYW1lLFxuICAgIGRvd25NZXRhLm9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGluY3JlbWVudHMgPSAvKiogQHR5cGUge1RvdGFsTWFwPHN0cmluZywgbnVtYmVyPn0gKi8gKG5ldyBNYXAoKSk7XG4gIGNvbnN0IGRlY3JlbWVudHMgPSAvKiogQHR5cGUge1RvdGFsTWFwPHN0cmluZywgbnVtYmVyPn0gKi8gKG5ldyBNYXAoKSk7XG4gIHVwQ291bnRlci5hZGRDYWxsYmFjayhvYnNlcnZlciA9PiB7XG4gICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCB2YWx1ZV0gb2YgaW5jcmVtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodmFsdWUsIHsgcXVldWU6IHF1ZXVlTmFtZSB9KTtcbiAgICB9XG4gIH0pO1xuICBkb3duQ291bnRlci5hZGRDYWxsYmFjayhvYnNlcnZlciA9PiB7XG4gICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCB2YWx1ZV0gb2YgZGVjcmVtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodmFsdWUsIHsgcXVldWU6IHF1ZXVlTmFtZSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCByZWFkeSA9IGZhbHNlO1xuICBjb25zdCBsZW5ndGhzID0gLyoqIEB0eXBlIHtUb3RhbE1hcDxzdHJpbmcsIG51bWJlcj59ICovIChuZXcgTWFwKCkpO1xuICBjb25zdCBudWRnZSA9IChxdWV1ZU5hbWUsIGRlbHRhLCBpbml0ID0gZmFsc2UpID0+IHtcbiAgICBpZiAoIWxlbmd0aHMuaGFzKHF1ZXVlTmFtZSkpIHtcbiAgICAgIGlmICghaW5pdCkgY29uc29sZT8ud2FybignVW5rbm93biBxdWV1ZScsIHF1ZXVlTmFtZSk7XG4gICAgICBsZW5ndGhzLnNldChxdWV1ZU5hbWUsIDApO1xuICAgICAgaW5jcmVtZW50cy5zZXQocXVldWVOYW1lLCAwKTtcbiAgICAgIGRlY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgMCk7XG4gICAgfVxuICAgIGNvbnN0IG9sZExlbmd0aCA9IGxlbmd0aHMuZ2V0KHF1ZXVlTmFtZSk7XG4gICAgbGVuZ3Rocy5zZXQocXVldWVOYW1lLCBvbGRMZW5ndGggKyBkZWx0YSk7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IHsgcXVldWU6IHF1ZXVlTmFtZSB9O1xuICAgIGxlbmd0aENvdW50ZXIuYWRkKGRlbHRhLCBkaW1lbnNpb25zKTtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEgPiAwKSB7XG4gICAgICAvKiBUT0RPIHBlciBhYm92ZTogdXBDb3VudGVyLmFkZChkZWx0YSwgZGltZW5zaW9ucyk7Ki9cbiAgICAgIGluY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgKGluY3JlbWVudHMuZ2V0KHF1ZXVlTmFtZSkgfHwgMCkgKyBkZWx0YSk7XG4gICAgfSBlbHNlIGlmIChkZWx0YSA8IDApIHtcbiAgICAgIC8qIFRPRE8gcGVyIGFib3ZlOiBkb3duQ291bnRlci5hZGQoLWRlbHRhLCBkaW1lbnNpb25zKTsqL1xuICAgICAgZGVjcmVtZW50cy5zZXQocXVldWVOYW1lLCAoZGVjcmVtZW50cy5nZXQocXVldWVOYW1lKSB8fCAwKSAtIGRlbHRhKTtcbiAgICB9XG4gICAgcmVhZHkgPSB0cnVlO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGluaXRMZW5ndGhzOiBpbml0aWFsTGVuZ3RocyA9PiB7XG4gICAgICAhcmVhZHkgfHxcbiAgICAgICAgY29uc29sZT8ud2FybihcbiAgICAgICAgICBgVW5leHBlY3RlZCByZXBlYXQgcXVldWUgbGVuZ3RoIGluaXRpYWxpemF0aW9uIGZyb20gJHtxKGxlbmd0aHMpfSB0byAke3EoaW5pdGlhbExlbmd0aHMpfWBcbiAgICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgbmV3TGVuZ3RoXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsTGVuZ3RocykpIHtcbiAgICAgICAgaWYgKCFpc05hdChuZXdMZW5ndGgpKSB7XG4gICAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBsZW5ndGggZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBuZXdMZW5ndGgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgbmV3TGVuZ3RoLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZUxlbmd0aHM6IG5ld0xlbmd0aHMgPT4ge1xuICAgICAgcmVhZHkgfHwgY29uc29sZT8ud2FybignTWlzc2luZyBpbml0aWFsIHF1ZXVlIGxlbmd0aHMnKTtcbiAgICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgbmV3TGVuZ3RoXSBvZiBPYmplY3QuZW50cmllcyhuZXdMZW5ndGhzKSkge1xuICAgICAgICBpZiAoIWlzTmF0KG5ld0xlbmd0aCkpIHtcbiAgICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGxlbmd0aCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIG5ld0xlbmd0aCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbnVkZ2UocXVldWVOYW1lLCBuZXdMZW5ndGggLSAobGVuZ3Rocy5nZXQocXVldWVOYW1lKSB8fCAwKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBpbmNMZW5ndGg6IChxdWV1ZU5hbWUsIGRlbHRhID0gMSkgPT4ge1xuICAgICAgaWYgKCFpc05hdChkZWx0YSkpIHtcbiAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBpbmNyZW1lbnQgZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBkZWx0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgZGVsdGEpO1xuICAgIH0sXG4gICAgZGVjTGVuZ3RoOiAocXVldWVOYW1lLCBkZWx0YSA9IDEpID0+IHtcbiAgICAgIGlmICghaXNOYXQoZGVsdGEpKSB7XG4gICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgZGVjcmVtZW50IGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgZGVsdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBudWRnZShxdWV1ZU5hbWUsIC1kZWx0YSk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKiBBbGwgdGhlIGtlcm5lbCBtZXRyaWNzIHdlIGFyZSBwcmVwYXJlZCBmb3IuKi9cbi8qKiBAZW51bSB7KHR5cGVvZiBNZXRyaWNUeXBlKVtrZXlvZiB0eXBlb2YgTWV0cmljVHlwZV19IE1ldHJpY1R5cGUgKi8kaM2PX29uY2UubWFrZVF1ZXVlTWV0cmljcyhtYWtlUXVldWVNZXRyaWNzKTtcbmNvbnN0IE1ldHJpY1R5cGUgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBDb3VudGVyOiAnY291bnRlcicsXG4gIEdhdWdlOiAnZ2F1Z2UnLFxufSk7XG4vKipcbiAqIEB0eXBlZGVmIEtlcm5lbE1ldHJpY01ldGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge3sgZGltZW5zaW9uOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfX0gW3N1Yl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc2Vuc3VzXVxuICogQHByb3BlcnR5IHtNZXRyaWNUeXBlfSBtZXRyaWNUeXBlXG4gKi9cbi8qKiBAdHlwZSB7T21pdDxLZXJuZWxNZXRyaWNNZXRhLCAnbWV0cmljVHlwZSc+W119ICovXG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTID0gW1xuICB7XG4gICAga2V5OiAnc3lzY2FsbHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9hbGxfc3lzY2FsbF90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxTZW5kJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3NlbmQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgbWVzc2FnZSBzZW5kIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsQ2FsbE5vdycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdjYWxsTm93JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHN5bmNocm9ub3VzIGRldmljZSBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFN1YnNjcmliZScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdzdWJzY3JpYmUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgcHJvbWlzZSBzdWJzY3JpcHRpb24ga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxSZXNvbHZlJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3Jlc29sdmUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgcHJvbWlzZSByZXNvbHV0aW9uIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsRXhpdCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdleGl0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBleGl0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVHZXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVHZXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZ2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVTZXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVTZXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgc2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVHZXROZXh0S2V5JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlR2V0TmV4dCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBnZXROZXh0S2V5IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVEZWxldGUnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVEZWxldGUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZGVsZXRlIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsRHJvcEltcG9ydHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnZHJvcEltcG9ydHMnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgZHJvcCBpbXBvcnRzIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaGVzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaERlbGl2ZXInLFxuICAgIG5hbWU6ICdzd2luZ3NldF9kaXNwYXRjaF9kZWxpdmVyX3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgbWVzc2FnZSBkZWxpdmVyaWVzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2Rpc3BhdGNoTm90aWZ5JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfbm90aWZ5X3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgcHJvbWlzZSBub3RpZmljYXRpb25zJyxcbiAgfSxcbl07XG5cbi8qKiBAdHlwZSB7T21pdDxLZXJuZWxNZXRyaWNNZXRhLCAnbWV0cmljVHlwZSc+W119ICovJGjNj19vbmNlLktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyhLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MpO1xuICAgICAgIGNvbnN0IEtFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyA9IFtcbiAge1xuICAgIGtleTogJ2tlcm5lbE9iamVjdHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9rZXJuZWxfb2JqZWN0cycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIG9iamVjdHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna2VybmVsRGV2aWNlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9kZXZpY2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBrZXJuZWwgZGV2aWNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrZXJuZWxQcm9taXNlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twVW5yZXNvbHZlZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3VucmVzb2x2ZWRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1VucmVzb2x2ZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twRnVsZmlsbGVkJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZnVsZmlsbGVkX2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdGdWxmaWxsZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twUmVqZWN0ZWQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9yZWplY3RlZF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnUmVqZWN0ZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3J1blF1ZXVlTGVuZ3RoJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfcnVuX3F1ZXVlX2xlbmd0aCcsXG4gICAgY29uc2Vuc3VzOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnTGVuZ3RoIG9mIHRoZSBrZXJuZWwgcnVuIHF1ZXVlJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2FjY2VwdGFuY2VRdWV1ZUxlbmd0aCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2FjY2VwdGFuY2VfcXVldWVfbGVuZ3RoJyxcbiAgICBjb25zZW5zdXM6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdMZW5ndGggb2YgdGhlIGtlcm5lbCBhY2NlcHRhbmNlIHF1ZXVlJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3Byb21pc2VRdWV1ZXNMZW5ndGgnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9wcm9taXNlX3F1ZXVlc19sZW5ndGgnLFxuICAgIGNvbnNlbnN1czogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbWJpbmVkIGxlbmd0aCBvZiBhbGwga2VybmVsIHByb21pc2UgcXVldWVzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NsaXN0RW50cmllcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2NsaXN0X2VudHJpZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGtlcm5lbCBjLWxpc3QnLFxuICB9LFxuICB7XG4gICAga2V5OiAndmF0cycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3ZhdHMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGFjdGl2ZSB2YXRzJyxcbiAgfSxcbl07JGjNj19vbmNlLktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyhLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MpO1xuXG5jb25zdCB7IENvdW50ZXIsIEdhdWdlIH0gPSBNZXRyaWNUeXBlO1xuLyoqIEB0eXBlIHtLZXJuZWxNZXRyaWNNZXRhW119ICovXG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX01FVFJJQ1MgPSBoYXJkZW4oW1xuICAuLi5LRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MubWFwKG0gPT4gKHsgLi4ubSwgbWV0cmljVHlwZTogQ291bnRlciB9KSksXG4gIC4uLktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUy5tYXAobSA9PiAoeyAuLi5tLCBtZXRyaWNUeXBlOiBHYXVnZSB9KSksXG5dKTtcblxuLyogRW5zdXJlIGtlcm5lbCBzdGF0cyBrZXkgdW5pcXVlbmVzcy4qLyRozY9fb25jZS5LRVJORUxfU1RBVFNfTUVUUklDUyhLRVJORUxfU1RBVFNfTUVUUklDUyk7XG5jb25zdCBrZXJuZWxTdGF0c0tleXMgPSBuZXcgTWFwKCk7XG5mb3IgKGNvbnN0IHsga2V5IH0gb2YgS0VSTkVMX1NUQVRTX01FVFJJQ1MpIHtcbiAga2VybmVsU3RhdHNLZXlzLnNldChrZXksIChrZXJuZWxTdGF0c0tleXMuZ2V0KGtleSkgfHwgMCkgKyAxKTtcbn1cbmNvbnN0IGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cyA9IFsuLi5rZXJuZWxTdGF0c0tleXMuZW50cmllcygpXS5mbGF0TWFwKFxuICAoW2tleSwgdmFsdWVdKSA9PiAodmFsdWUgPiAxID8gW2tleV0gOiBbXSksXG4pO1xuaWYgKGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cy5sZW5ndGggPiAwKSB7XG4gIGNvbnN0IG1zZyA9IGBEdXBsaWNhdGUga2VybmVsIHN0YXRzIGtleXMgJHtKU09OLnN0cmluZ2lmeShkdXBsaWNhdGVLZXJuZWxTdGF0c0tleXMpfWA7XG4gIHRocm93IEVycm9yKG1zZyk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJISVNUT0dSQU1fTUVUUklDUyI6WyJISVNUT0dSQU1fTUVUUklDUyJdLCJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyI6WyJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyJdLCJRdWV1ZU1ldHJpY0FzcGVjdCI6WyJRdWV1ZU1ldHJpY0FzcGVjdCJdLCJtYWtlUXVldWVNZXRyaWNzTWV0YSI6WyJtYWtlUXVldWVNZXRyaWNzTWV0YSJdLCJtYWtlUXVldWVNZXRyaWNzIjpbIm1ha2VRdWV1ZU1ldHJpY3MiXSwiS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyJdLCJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiOlsiS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTIl0sIktFUk5FTF9TVEFUU19NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19NRVRSSUNTIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIq5WvK2DgAAtg4AACsAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbmF0dXJhbC1zb3J0LmpzeyJpbXBvcnRzIjpbIi4vanMtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJuYXR1cmFsQ29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHByb3ZpZGVMYXp5TWFwOyRozY9faW1wb3J0cyhbW1wiLi9qcy11dGlscy5qc1wiLCBbW1wicHJvdmlkZUxhenlNYXBcIixbJGjNj19hID0+IChwcm92aWRlTGF6eU1hcCA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZU5hdHMgPSAoYSwgYikgPT4ge1xuICAvKiBEZWZhdWx0IHRvIElFRUUgNzU0IG51bWJlciBhcml0aG1ldGljIGZvciBzcGVlZCwgYnV0IGZhbGwgYmFjayBvbiBiaWdpbnQqL1xuICAvKiBhcml0aG1ldGljIHRvIHJlc29sdmUgdGllcyBiZWNhdXNlIGJpZyBudW1iZXJzIGNhbiBsb3NlIHJlc29sdXRpb24qL1xuICAvKiAoc29tZXRpbWVzIGV2ZW4gYmVjb21pbmcgaW5maW5pdGUpIGFuZCB0aGVuIHVsdGltYXRlbHkgb24gbGVuZ3RoIHRvIHJlc29sdmUqL1xuICAvKiB0aWVzIGJ5IGFzY2VuZGluZyBjb3VudCBvZiBsZWFkaW5nIHplcm9zLiovXG4gIGNvbnN0IGRpZmYgPSArYSAtICtiO1xuICBjb25zdCBmaW5pdGVEaWZmID1cbiAgICAoTnVtYmVyLmlzRmluaXRlKGRpZmYpICYmIGRpZmYpIHx8XG4gICAgKGEgPT09IGIgPyAwIDogTnVtYmVyKEJpZ0ludChhKSAtIEJpZ0ludChiKSkgfHwgYS5sZW5ndGggLSBiLmxlbmd0aCk7XG5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciB0aGlzIGNhbGwgcmVhbGx5IGRvZXMgcmV0dXJuIC0xIHwgMCB8IDEqL1xuICByZXR1cm4gTWF0aC5zaWduKGZpbml0ZURpZmYpO1xufTtcblxuLyogVE9ETzogY29tcGFyZUJ5Q29kZVBvaW50cyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDA4Ki9cblxuY29uc3QgY29tcGFyZVN0cmluZ3MgPSAoYSwgYikgPT4gKGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwKTtcblxuY29uc3QgckNhcHR1cmVEaWdpdHMgPSAvKFswLTldKykvO1xuXG4vKipcbiAqIFNwbGl0dGluZyBieSByZWd1bGFyIGV4cHJlc3Npb24gY2FuIGJlIGV4cGVuc2l2ZTsgd2UgZG9uJ3Qgd2FudCB0byByZXBlYXRcbiAqIHRoYXQgZm9yIGV2ZXJ5IGNvbXBhcmlzb24gYWdhaW5zdCB0aGUgc2FtZSBzdHJpbmcuXG4gKlxuICogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZ1tdPn1cbiAqL1xuY29uc3QgcGFydHNDYWNoZSA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBQZXJmb3JtIGEgbXVsdGktbGV2ZWwgbmF0dXJhbC1zb3J0IGNvbXBhcmlzb24sIGZpbmRpbmcgdGhlIGRlY2ltYWwgZGlnaXRcbiAqIHNlcXVlbmNlcyBpbiBlYWNoIG9wZXJhbmQgYW5kIGNvbXBhcmluZyBmaXJzdCBieSBlYWNoIChbcG9zc2libHkgZW1wdHldXG4gKiBzdHJpbmcgcHJlZml4LCBpbnRlZ2VyKSBwYWlyIGluIHR1cm4sIHdpdGggYSBmaW5hbCBjb21wYXJpc2lvbiBieSBzdHJpbmdcbiAqIHN1ZmZpeCBhcyBuZWNlc3NhcnkgKGUuZy4sIHNvcnRpbmcgJ2tvNDInIGJlZm9yZSAna28xMDAnIGFzIFsna28nLCA0Ml0gdnMuXG4gKiBbJ2tvJywgMTAwXSBhbmQgJ3BhcmVudDEuY2hpbGQ4JyBiZWZvcmUgJ3BhcmVudDEuY2hpbGQxMCcgYXMgWydwYXJlbnQnLCAxLFxuICogJ2NoaWxkJywgOF0gdnMuIFsncGFyZW50JywgMSwgJ2NoaWxkJywgMTBdKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYVxuICogQHBhcmFtIHtzdHJpbmd9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG4gICAgICAgY29uc3QgbmF0dXJhbENvbXBhcmUgPSAoYSwgYikgPT4ge1xuICAvKiBXZSB3YW50IHRvIG1haW50YWluIGEgY2FjaGUgb25seSBmb3IgdGhlIGR1cmF0aW9uIG9mIGVhY2ggY2FsbCB0byovXG4gIC8qIGFycmF5LnNvcnQsIGFuZCBsZXZlcmFnZSB0aGUgc3luY2hyb25vdXMgbmF0dXJlIG9mIHRoYXQgbWV0aG9kIGluIHRoZSBmaXJzdCovXG4gIC8qIGludm9jYXRpb24gb2YgZWFjaCB0dXJuIChpbmRpY2F0ZWQgYnkgYW4gZW1wdHkgY2FjaGUpIHRvIHNjaGVkdWxlIGNhY2hlKi9cbiAgLyogY2xlYXJpbmcgaW4gdGhlICpuZXh0KiB0dXJuLiovXG4gIGlmICghcGFydHNDYWNoZS5zaXplKSB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gcGFydHNDYWNoZS5jbGVhcigpKTtcblxuICBjb25zdCBhUGFydHMgPSBwcm92aWRlTGF6eU1hcChwYXJ0c0NhY2hlLCBhLCAoKSA9PiBhLnNwbGl0KHJDYXB0dXJlRGlnaXRzKSk7XG4gIGNvbnN0IGJQYXJ0cyA9IHByb3ZpZGVMYXp5TWFwKHBhcnRzQ2FjaGUsIGIsICgpID0+IGIuc3BsaXQockNhcHR1cmVEaWdpdHMpKTtcblxuICAvKiBBbiBldmVuIGluZGV4IGNvcnJlc3BvbmRzIHdpdGggYSBzdHJpbmcgcGFydDsgYW4gb2RkIG9uZSB3aXRoIGEgZGlnaXQgcGFydC4qL1xuICBsZXQgaSA9IDA7XG4gIGZvciAoOyBpICsgMSA8IGFQYXJ0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIGlmIChpICsgMSA8IGJQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIC8qIEJvdGggYGFgIGFuZCBgYmAgaGF2ZSBhIGRpZ2l0IHBhcnQgaGVyZSwgYnV0IHdlIGNvbXBhcmUgdGhlIHByZWNlZGluZyovXG4gICAgICAvKiBzdHJpbmcgcGFydCBmaXJzdCBpbiBjYXNlIHRob3NlIGFyZSB1bmVxdWFsLiovXG4gICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICBjb21wYXJlU3RyaW5ncyhhUGFydHNbaV0sIGJQYXJ0c1tpXSkgfHxcbiAgICAgICAgY29tcGFyZU5hdHMoYVBhcnRzW2kgKyAxXSwgYlBhcnRzW2kgKyAxXSk7XG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBBZnRlciBhIChwb3NzaWJseSBlbXB0eSkgY29tbW9uIHByZWZpeCwgYGFgIGhhcyBkaWdpdHMgd2hlcmUgYGJgIGRvZXMqL1xuICAgICAgLyogbm90LCBzbyB3ZSB1c2Ugc3RyaW5nIGNvbXBhcmlzb24gb2YgYCR7YVN0cmluZ30ke2FEaWdpdHN9YCB2cy4qL1xuICAgICAgLyogYCR7YlN0cmluZ31gLiovXG4gICAgICByZXR1cm4gY29tcGFyZVN0cmluZ3MoYCR7YVBhcnRzW2ldfSR7YVBhcnRzW2kgKyAxXX1gLCBiUGFydHNbaV0pO1xuICAgIH1cbiAgfVxuICBpZiAoYlBhcnRzLmxlbmd0aCA+IGFQYXJ0cy5sZW5ndGgpIHtcbiAgICAvKiBgYmAgaGFzIGRpZ2l0cyB3aGVyZSBgYWAgZG9lcyBub3QuKi9cbiAgICByZXR1cm4gY29tcGFyZVN0cmluZ3MoYVBhcnRzW2ldLCBgJHtiUGFydHNbaV19JHtiUGFydHNbaSArIDFdfWApO1xuICB9XG4gIC8qIElmIGBhYCBhbmQgYGJgIGRpZmZlciwgaXQncyBvbmx5IGluIHRoZSBmaW5hbCBzdHJpbmcgc3VmZml4LiovXG4gIHJldHVybiBjb21wYXJlU3RyaW5ncyhhUGFydHNbaV0sIGJQYXJ0c1tpXSk7XG59OyRozY9fb25jZS5uYXR1cmFsQ29tcGFyZShuYXR1cmFsQ29tcGFyZSk7XG5oYXJkZW4obmF0dXJhbENvbXBhcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0dXJhbENvbXBhcmUiOlsibmF0dXJhbENvbXBhcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAT8Qll2pIAABqSAAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9zZXMtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9zdHJlYW0iLCJqZXNzaWUuanMiLCIuL2pzLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIiwiYWdncmVnYXRlVHJ5RmluYWxseSIsImFsbFZhbHVlcyIsImFzc2VydEFsbERlZmluZWQiLCJhdHRlbnVhdGUiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmb3JldmVyIiwiZnJvbVVuaXF1ZUVudHJpZXMiLCJtYWtlTGltaXRlZENvbnNvbGUiLCJvYmplY3RNYXAiLCJvYmplY3RNZXRhTWFwIiwic3RyaXBQcmVmaXgiLCJzeW5jaHJvbml6ZWRUZWUiLCJ0aHJvd0Vycm9yQ29kZSIsInRyeUpzb25QYXJzZSIsInRyeU5vdyIsInVudGlsVHJ1ZSIsIndoaWxlVHJ1ZSIsIndpdGhEZWZlcnJlZENsZWFudXAiLCJ6aXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsb2JqZWN0TWV0YU1hcCxmcm9tVW5pcXVlRW50cmllcyxxLGIsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixYLGRlZXBseUZ1bGZpbGxlZCxpc1ByaW1pdGl2ZSxtYWtlUHJvbWlzZUtpdCxtYWtlUXVldWUsYXN5bmNHZW5lcmF0ZSxsb2dMZXZlbHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJvYmplY3RNYXBcIl1dXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanNcIiwgW1tcIm9iamVjdE1ldGFNYXBcIixbJGjNj19hID0+IChvYmplY3RNZXRhTWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJvYmplY3RNZXRhTWFwXCJdXV1dXSxbXCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qc1wiLCBbW1wiZnJvbVVuaXF1ZUVudHJpZXNcIixbJGjNj19hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRozY9fYSksJGjNj19saXZlW1wiZnJvbVVuaXF1ZUVudHJpZXNcIl1dXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsWyRozY9fYSA9PiAobWFrZVF1ZXVlID0gJGjNj19hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsWyRozY9fYSA9PiAoYXN5bmNHZW5lcmF0ZSA9ICRozY9fYSldXV1dLFtcIi4vanMtdXRpbHMuanNcIiwgW1tcImxvZ0xldmVsc1wiLFskaM2PX2EgPT4gKGxvZ0xldmVscyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgZnJvbUVudHJpZXMsIGtleXMsIHZhbHVlcyB9ID0gT2JqZWN0O1xuXG4vKiogQHBhcmFtIHsobGV2ZWw6IHN0cmluZykgPT4gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZH0gbWFrZUxvZ2dlciAqL1xuICAgICAgIGNvbnN0IG1ha2VMaW1pdGVkQ29uc29sZSA9IG1ha2VMb2dnZXIgPT4ge1xuICBjb25zdCBsaW1pdGVkQ29uc29sZSA9IC8qKiBAdHlwZSB7YW55fSAqLyAoXG4gICAgZnJvbUVudHJpZXMobG9nTGV2ZWxzLm1hcChsZXZlbCA9PiBbbGV2ZWwsIG1ha2VMb2dnZXIobGV2ZWwpXSkpXG4gICk7XG4gIHJldHVybiAvKiogQHR5cGUge0xpbWl0ZWRDb25zb2xlfSAqLyAoaGFyZGVuKGxpbWl0ZWRDb25zb2xlKSk7XG59OyRozY9fb25jZS5tYWtlTGltaXRlZENvbnNvbGUobWFrZUxpbWl0ZWRDb25zb2xlKTtcbmhhcmRlbihtYWtlTGltaXRlZENvbnNvbGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7eyBbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXSB9ICYge319IFNpbXBsaWZ5IGZsYXR0ZW4gdGhlXG4gKiAgIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2Uvc2ltcGxpZnkuZC50c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3tcbiAqICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZSA/IFRbS10gOiBEZWVwbHlBd2FpdGVkPFRbS10+O1xuICogfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2U8YW55PlxuICogICAgID8gQXdhaXRlZDxUPlxuICogICAgIDogVCBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGFueSwgYW55PiB8IFJlbW90YWJsZU9iamVjdFxuICogICAgICAgPyBUXG4gKiAgICAgICA6IFQgZXh0ZW5kcyB7fVxuICogICAgICAgICA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+XG4gKiAgICAgICAgIDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTcgVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0XG4gKiBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWQgaW4gb3JkZXIgdG8gYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyB7fT4odW5mdWxmaWxsZWRUZXJtczogVCkgPT4gUHJvbWlzZTxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZE9iamVjdCA9IGFzeW5jIG9iaiA9PiB7XG4gICFpc1ByaW1pdGl2ZShvYmopIHx8IEZhaWxgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xuICByZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG59O1xuXG4vKipcbiAqIFRvbGVyYXRlIGFic2VuY2Ugb2YgQWdncmVnYXRlRXJyb3IgaW4gZS5nLiB4c25hcC5cbiAqXG4gKiBAdHlwZSB7KGVycm9yczogRXJyb3JbXSwgbWVzc2FnZT86IHN0cmluZywgb3B0aW9ucz86IG9iamVjdCkgPT4gRXJyb3J9XG4gKi8kaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCBtYWtlQWdncmVnYXRlRXJyb3IgPVxuICB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICA/IChlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSwgb3B0aW9ucylcbiAgICA6IChlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIG1ha2VFcnJvcihtZXNzYWdlID8/ICdtdWx0aXBsZSBlcnJvcnMnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IGEgc3RyaW5nIGhhcyBhIHByZWZpeCwgYW5kIHJldHVybiB0aGUgcGFydCB0aGF0IGZvbGxvd3MgaXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IHN0cmlwUHJlZml4ID0gKHByZWZpeCwgc3RyKSA9PiB7XG4gIHN0ci5zdGFydHNXaXRoKHByZWZpeCkgfHwgRmFpbGAke3N0cn0gaXMgbWlzc2luZyBwcmVmaXggJHtxKHByZWZpeCl9YDtcbiAgcmV0dXJuIHN0ci5zbGljZShwcmVmaXgubGVuZ3RoKTtcbn07XG5cbi8qKlxuICogVGhyb3cgYW4gZXJyb3Igd2l0aCBhbiBvd24gXCJjb2RlXCIgZGF0YSBwcm9wZXJ0eSwgc3VwcG9ydGluZyBpZGVudGlmaWNhdGlvblxuICogd2l0aG91dCBwYXJzaW5nIGBtZXNzYWdlYC4gTm90ZSB0aGF0IHN1Y2ggZXJyb3JzIGFyZSBub3QgUGFzc2FibGUgYW5kIHRodXNcbiAqIGNhbm5vdCBhcHBlYXIgaW5zaWRlIGEgUGFzc2FibGUgc3RydWN0dXJlLCBhbmQgZXZlbiBhdCB0b3AgbGV2ZWwgdGhlIFwiY29kZVwiXG4gKiBwcm9wZXJ0eSB3aWxsIGJlIHNpbGVudGx5IGRyb3BwZWQgYnkgbWFyc2hhbGxpbmcuXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IENvZGVcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczx0eXBlb2YgbWFrZUVycm9yPlswXX0gZGV0YWlsc1xuICogQHBhcmFtIHtDb2RlfSBjb2RlXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIG1ha2VFcnJvcj5bMl0gJiB7XG4gKiAgIGNvbnN0cnVjdG9yPzogUGFyYW1ldGVyczx0eXBlb2YgbWFrZUVycm9yPlsxXTtcbiAqIH19IFtvcHRzXVxuICovJGjNj19vbmNlLnN0cmlwUHJlZml4KHN0cmlwUHJlZml4KTtcbiAgICAgICBjb25zdCB0aHJvd0Vycm9yQ29kZSA9IChkZXRhaWxzLCBjb2RlLCBvcHRzKSA9PiB7XG4gIGNvbnN0IGVyciA9IG1ha2VFcnJvcihkZXRhaWxzLCBvcHRzPy5jb25zdHJ1Y3Rvciwge1xuICAgIC4uLm9wdHMsXG4gICAgc2FuaXRpemU6IGZhbHNlLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ2NvZGUnLCB7IHZhbHVlOiBjb2RlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICBoYXJkZW4oZXJyKTtcbiAgdGhyb3cgZXJyO1xufTtcblxuLyoqXG4gKiBTeW5jaHJvbnVzbHkgaW52b2tlIGEgZnVuY3Rpb24gd2l0aCB0aGUgb3Bwb3J0dW5pdHkgdG8gaGFuZGxlIGFueSBlcnJvclxuICogc2ltaWxhcmx5IHRvIGEgUHJvbWlzZSBgY2F0Y2hgIGNhbGxiYWNrIChlLmcuLCBzdWJzdGl0dXRpbmcgYSBub24tZXJyb3JcbiAqIHJldHVybmVkIHZhbHVlIG9yIHRocm93aW5nIGEgcG9zc2libHktbmV3IGVycm9yKS4gVGhpcyBpcyB1c2VmdWwgZm9yIChhbW9uZ1xuICogb3RoZXIgdGhpbmdzKSByZXBsYWNpbmcgZ2VuZXJpYyBlcnJvciBtZXNzYWdlcyB3aXRoIHNwZWNpZmljIG9uZXMgKGFzIGluXG4gKiB7QHNlZSB0cnlKc29uUGFyc2V9KS5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBGXG4gKiBAdGVtcGxhdGUgW1U9UmV0dXJuVHlwZTxGPl1cbiAqIEBwYXJhbSB7Rn0gZm4gdG8gaW52b2tlXG4gKiBAcGFyYW0geyhlcnI6IEVycm9yKSA9PiBVfSB0cmFuc2Zvcm1FcnJvciBjYWxsYmFjayB0byByZWNlaXZlIGFueSBlcnJvciBmcm9tXG4gKiAgIGludm9raW5nIGBmbmAgYW5kIGVpdGhlciByZXR1cm4gYSBzdWJzdGl0dXRlIHZhbHVlIG9yIHRocm93IGEgcG90ZW50aWFsbHlcbiAqICAgbmV3IGVycm9yXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8Rj59IGFyZ3MgZm9yIGBmbmBcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPEY+IHwgVX1cbiAqLyRozY9fb25jZS50aHJvd0Vycm9yQ29kZSh0aHJvd0Vycm9yQ29kZSk7XG4gICAgICAgY29uc3QgdHJ5Tm93ID0gKGZuLCB0cmFuc2Zvcm1FcnJvciwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1FcnJvcihlcnIpO1xuICAgIH0gY2F0Y2ggKG5ld0Vycikge1xuICAgICAgLyogVHJ5IHRvIGFzc29jaWF0ZSBgZXJyYCB3aXRoIGBuZXdFcnJgLiovXG4gICAgICBpZiAoIW5ld0Vyci5jYXVzZSkge1xuICAgICAgICBjb25zdCBkZXNjID0ge1xuICAgICAgICAgIHZhbHVlOiBlcnIsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIVJlZmxlY3QuZGVmaW5lUHJvcGVydHkobmV3RXJyLCAnY2F1c2UnLCBkZXNjKSkge1xuICAgICAgICAgIGFzc2VydC5ub3RlKG5ld0VyciwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXdFcnI7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFBhcnNlIEpTT04gdGV4dCwgb3IgaGFuZGxlIGFuIGVycm9yIGJ5IGUuZy4gc3Vic3RpdHV0aW5nIGEgZGVmYXVsdCB2YWx1ZSBvclxuICogcmVwbGFjaW5nIGl0IHdpdGggb25lIGJlYXJpbmcgYSBub24tZ2VuZXJpYyBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBqc29uVGV4dFxuICogQHBhcmFtIHtzdHJpbmcgfCAoKGVycjogRXJyb3IpID0+IHVua25vd24pfSBvbkVycm9yIGFuIGVycm9yIG1lc3NhZ2Ugb3JcbiAqICAgY2FsbGJhY2tcbiAqLyRozY9fb25jZS50cnlOb3codHJ5Tm93KTtcbiAgICAgICBjb25zdCB0cnlKc29uUGFyc2UgPSAoanNvblRleHQsIG9uRXJyb3IpID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtRXJyb3IgPVxuICAgIHR5cGVvZiBvbkVycm9yID09PSAnZnVuY3Rpb24nXG4gICAgICA/IG9uRXJyb3JcbiAgICAgIDogZXJyID0+IEZhaWwoW2Ake29uRXJyb3J9OiAke2Vyci5tZXNzYWdlfSBmb3IgaW5wdXQgYCwgJyddLCBqc29uVGV4dCk7XG4gIHJldHVybiB0cnlOb3coKCkgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YganNvblRleHQ7XG4gICAgdHlwZSA9PT0gJ3N0cmluZycgfHwgRmFpbGBJbnB1dCBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJHtiKHR5cGUpfWA7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblRleHQpO1xuICB9LCB0cmFuc2Zvcm1FcnJvcik7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IGl0ZW1zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUW10+fVxuICovJGjNj19vbmNlLnRyeUpzb25QYXJzZSh0cnlKc29uUGFyc2UpO1xuICAgICAgIGNvbnN0IFByb21pc2VBbGxPckVycm9ycyA9IGFzeW5jIGl0ZW1zID0+IHtcbiAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChpdGVtcykudGhlbihyZXN1bHRzID0+IHtcbiAgICBjb25zdCBlcnJvcnMgPSAvKiogQHR5cGUge1Byb21pc2VSZWplY3RlZFJlc3VsdFtdfSAqLyAoXG4gICAgICByZXN1bHRzLmZpbHRlcigoeyBzdGF0dXMgfSkgPT4gc3RhdHVzID09PSAncmVqZWN0ZWQnKVxuICAgICkubWFwKHJlc3VsdCA9PiByZXN1bHQucmVhc29uKTtcbiAgICBpZiAoIWVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge1Byb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD5bXX0gKi8gKHJlc3VsdHMpLm1hcChcbiAgICAgICAgcmVzdWx0ID0+IHJlc3VsdC52YWx1ZSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IHRyaWVyXG4gKiBAcGFyYW0geyhlcnJvcj86IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj59IGZpbmFsaXplclxuICogQHJldHVybnMge1JldHVyblR5cGU8dHJpZXI+fVxuICovJGjNj19vbmNlLlByb21pc2VBbGxPckVycm9ycyhQcm9taXNlQWxsT3JFcnJvcnMpO1xuICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZVRyeUZpbmFsbHkgPSBhc3luYyAodHJpZXIsIGZpbmFsaXplcikgPT5cbiAgdHJpZXIoKS50aGVuKFxuICAgIGFzeW5jIHJlc3VsdCA9PiBmaW5hbGl6ZXIoKS50aGVuKCgpID0+IHJlc3VsdCksXG4gICAgYXN5bmMgdHJ5RXJyb3IgPT5cbiAgICAgIGZpbmFsaXplcih0cnlFcnJvcilcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKCkgPT4gdHJ5RXJyb3IsXG4gICAgICAgICAgZmluYWxpemVFcnJvciA9PiBtYWtlQWdncmVnYXRlRXJyb3IoW3RyeUVycm9yLCBmaW5hbGl6ZUVycm9yXSksXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSxcbiAgKTtcblxuLyoqXG4gKiBSdW4gYSBmdW5jdGlvbiB3aXRoIHRoZSBhYmlsaXR5IHRvIGRlZmVyIGxhc3QtaW4tZmlyc3Qtb3V0IGNsZWFudXAgY2FsbGJhY2tzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geyhcbiAqICAgYWRkQ2xlYW51cDogKGZuOiAoZXJyPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPikgPT4gdm9pZCxcbiAqICkgPT4gUHJvbWlzZTxUPn0gZm5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPGZuPn1cbiAqLyRozY9fb25jZS5hZ2dyZWdhdGVUcnlGaW5hbGx5KGFnZ3JlZ2F0ZVRyeUZpbmFsbHkpO1xuICAgICAgIGNvbnN0IHdpdGhEZWZlcnJlZENsZWFudXAgPSBhc3luYyBmbiA9PiB7XG4gIC8qKiBAdHlwZSB7KChlcnI/OiB1bmtub3duKSA9PiB1bmtub3duKVtdfSAqL1xuICBjb25zdCBjbGVhbnVwc0xJRk8gPSBbXTtcbiAgLyoqIEB0eXBlIHsoY2xlYW51cDogKGVycj86IHVua25vd24pID0+IHVua25vd24pID0+IHZvaWR9ICovXG4gIGNvbnN0IGFkZENsZWFudXAgPSBjbGVhbnVwID0+IHtcbiAgICBjbGVhbnVwc0xJRk8udW5zaGlmdChjbGVhbnVwKTtcbiAgfTtcbiAgLyoqIEB0eXBlIHsoZXJyPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPn0gKi9cbiAgY29uc3QgZmluYWxpemVyID0gYXN5bmMgZXJyID0+IHtcbiAgICAvKiBSdW4gZWFjaCBjbGVhbnVwIGluIGl0cyBvd24gaXNvbGF0ZWQgc3RhY2suKi9cbiAgICBjb25zdCBjbGVhbnVwUmVzdWx0cyA9IGNsZWFudXBzTElGTy5tYXAoYXN5bmMgY2xlYW51cCA9PiB7XG4gICAgICBhd2FpdCBudWxsO1xuICAgICAgcmV0dXJuIGNsZWFudXAoZXJyKTtcbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlQWxsT3JFcnJvcnMoY2xlYW51cFJlc3VsdHMpO1xuICB9O1xuICByZXR1cm4gYWdncmVnYXRlVHJ5RmluYWxseSgoKSA9PiBmbihhZGRDbGVhbnVwKSwgZmluYWxpemVyKTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHR5cGVkZWYge3sgW1AgaW4ga2V5b2YgVF06IEV4Y2x1ZGU8VFtQXSwgdW5kZWZpbmVkPiB9fSBBbGxEZWZpbmVkXG4gKi9cblxuLyoqXG4gKiBDb25jaXNlIHdheSB0byBjaGVjayB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIG9iamVjdCBsaXRlcmFsIHNob3J0aGFuZC5cbiAqIFRocm93cyBlcnJvciBtZXNzYWdlIHRvIHNwZWNpZnkgdGhlIG1pc3NpbmcgdmFsdWVzLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpID0+IGFzc2VydHMgb2JqIGlzIEFsbERlZmluZWQ8VD59XG4gKiBAdGhyb3dzIGlmIGFueSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGVudHJpZXMgaXMgbm90IGRlZmluZWRcbiAqLyRozY9fb25jZS53aXRoRGVmZXJyZWRDbGVhbnVwKHdpdGhEZWZlcnJlZENsZWFudXApO1xuICAgICAgIGNvbnN0IGFzc2VydEFsbERlZmluZWQgPSBvYmogPT4ge1xuICBjb25zdCBtaXNzaW5nID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaXNzaW5nLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgIEZhaWxgbWlzc2luZyAke3EobWlzc2luZyl9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBBdHRlbnVhdGUgYHNwZWNpbWVuYCB0byBvbmx5IHByb3BlcnRpZXMgYWxsb3dlZCBieSBgcGVybWl0YC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQZXJtaXQ8VD59IFBcbiAqIEBwYXJhbSB7VH0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UH0gcGVybWl0XG4gKiBAcGFyYW0gezxVLCBTdWJQIGV4dGVuZHMgUGVybWl0PFU+PihhdHRlbnVhdGlvbjogVSwgcGVybWl0OiBTdWJQKSA9PiBVfSBbdHJhbnNmb3JtXVxuICogICB1c2VkIHRvIHJlcGxhY2UgdGhlIHJlc3VsdHMgb2YgcmVjdXJzaXZlIHBpY2tzIChidXQgbm90IGJsYW5rZXQgcGVybWl0cylcbiAqIEByZXR1cm5zIHtBdHRlbnVhdGVkPFQsIFA+fVxuICovJGjNj19vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG4gICAgICAgY29uc3QgYXR0ZW51YXRlID0gKHNwZWNpbWVuLCBwZXJtaXQsIHRyYW5zZm9ybSA9IHggPT4geCkgPT4ge1xuICAvKiBGYXN0LXBhdGggZm9yIG5vIGF0dGVudWF0aW9uLiovXG4gIGlmIChwZXJtaXQgPT09IHRydWUgfHwgdHlwZW9mIHBlcm1pdCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtBdHRlbnVhdGVkPFQsIFA+fSAqLyAoc3BlY2ltZW4pO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgcGF0aCA9IFtdO1xuICAvKipcbiAqIEB0ZW1wbGF0ZSBTdWJUXG4gKiBAdGVtcGxhdGUge0V4Y2x1ZGU8UGVybWl0PFN1YlQ+LCBQcmltaXRpdmU+fSBTdWJQXG4gKiBAdHlwZSB7KHNwZWNpbWVuOiBTdWJULCBwZXJtaXQ6IFN1YlApID0+IEF0dGVudWF0ZWQ8U3ViVCwgU3ViUD59XG4gKi9cbiAgY29uc3QgZXh0cmFjdCA9IChzdWJTcGVjaW1lbiwgc3ViUGVybWl0KSA9PiB7XG4gICAgaWYgKHN1YlBlcm1pdCA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViUGVybWl0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgcGF0aC5sZW5ndGggPT09IDBcbiAgICAgICAgPyBGYWlsYGludmFsaWQgcGVybWl0OiAke3EocGVybWl0KX1gXG4gICAgICAgIDogRmFpbGBpbnZhbGlkIHBlcm1pdCBhdCBwYXRoICR7cShwYXRoKX06ICR7cShzdWJQZXJtaXQpfWA7XG4gICAgfSBlbHNlIGlmIChzdWJTcGVjaW1lbiA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViU3BlY2ltZW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBwYXRoLmxlbmd0aCA9PT0gMFxuICAgICAgICA/IEZhaWxgc3BlY2ltZW4gbXVzdCBiZSBhbiBvYmplY3QgZm9yIHBlcm1pdCAke3EocGVybWl0KX1gXG4gICAgICAgIDogRmFpbGBzcGVjaW1lbiBhdCBwYXRoICR7cShwYXRoKX0gbXVzdCBiZSBhbiBvYmplY3QgZm9yIHBlcm1pdCAke3Eoc3ViUGVybWl0KX1gO1xuICAgIH1cbiAgICBjb25zdCBwaWNrcyA9IE9iamVjdC5lbnRyaWVzKHN1YlBlcm1pdCkubWFwKChbc3ViS2V5LCBkZWVwUGVybWl0XSkgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKHN1YlNwZWNpbWVuLCBzdWJLZXkpKSB7XG4gICAgICAgIHRocm93IEZhaWxgc3BlY2ltZW4gaXMgbWlzc2luZyBwYXRoICR7cShwYXRoLmNvbmNhdChzdWJLZXkpKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVlcFNwZWNpbWVuID0gUmVmbGVjdC5nZXQoc3ViU3BlY2ltZW4sIHN1YktleSk7XG4gICAgICBpZiAoZGVlcFBlcm1pdCA9PT0gdHJ1ZSB8fCB0eXBlb2YgZGVlcFBlcm1pdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtzdWJLZXksIGRlZXBTcGVjaW1lbl07XG4gICAgICB9XG4gICAgICBwYXRoLnB1c2goc3ViS2V5KTtcbiAgICAgIGNvbnN0IGV4dHJhY3RlZCA9IGV4dHJhY3QoLyoqIEB0eXBlIHthbnl9ICovIChkZWVwU3BlY2ltZW4pLCBkZWVwUGVybWl0KTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gW3N1YktleSwgZXh0cmFjdGVkXTtcbiAgICAgIHBhdGgucG9wKCk7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zZm9ybShPYmplY3QuZnJvbUVudHJpZXMocGlja3MpLCBzdWJQZXJtaXQpO1xuICB9O1xuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIHJldHVybiBleHRyYWN0KHNwZWNpbWVuLCBwZXJtaXQpO1xufTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDx1bmRlZmluZWQsIG5ldmVyPn0gKi8kaM2PX29uY2UuYXR0ZW51YXRlKGF0dGVudWF0ZSk7XG5jb25zdCBub3REb25lID0gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8bmV2ZXIsIHZvaWQ+fSAqL1xuY29uc3QgYWx3YXlzRG9uZSA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG5cbiAgICAgICBjb25zdCBmb3JldmVyID0gYXN5bmNHZW5lcmF0ZSgoKSA9PiBub3REb25lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlIFRoZSB2YWx1ZSBvZiBgYXdhaXQgcHJvZHVjZSgpYCBpcyB1c2VkIGZvciBpdHNcbiAqICAgdHJ1dGhpbmVzcyB2cyBmYWxzaW5lc3MuIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkXG4gKiAgIG5vdCBib3RoZXIgZG9pbmcgdGhpcyB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaM2PX29uY2UuZm9yZXZlcihmb3JldmVyKTtcbiAgICAgICBjb25zdCB3aGlsZVRydWUgPSBwcm9kdWNlID0+XG4gIGFzeW5jR2VuZXJhdGUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvZHVjZSgpO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBhbHdheXNEb25lO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gIH0pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFR9IHByb2R1Y2UgVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0c1xuICogICB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy4gSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWRcbiAqICAgbm90IGJvdGhlciBkb2luZyB0aGlzIHRoZW1zZWx2ZXMuXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxBd2FpdGVkPFQ+Pn1cbiAqLyRozY9fb25jZS53aGlsZVRydWUod2hpbGVUcnVlKTtcbiAgICAgICBjb25zdCB1bnRpbFRydWUgPSBwcm9kdWNlID0+XG4gIGFzeW5jR2VuZXJhdGUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvZHVjZSgpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbi8qKiBAdHlwZSB7PFgsIFk+KHhzOiBYW10sIHlzOiBZW10pID0+IFtYLCBZXVtdfSAqLyRozY9fb25jZS51bnRpbFRydWUodW50aWxUcnVlKTtcbiAgICAgICBjb25zdCB6aXAgPSAoeHMsIHlzKSA9PiBoYXJkZW4oeHMubWFwKCh4LCBpKSA9PiBbeCwgeXNbK2ldXSkpO1xuXG4vKipcbiAqIEB0eXBlIHs8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEVSZWY8YW55Pj4+KFxuICogICBvYmo6IFQsXG4gKiApID0+IFByb21pc2U8eyBbSyBpbiBrZXlvZiBUXTogQXdhaXRlZDxUW0tdPiB9Pn1cbiAqLyRozY9fb25jZS56aXAoemlwKTtcbiAgICAgICBjb25zdCBhbGxWYWx1ZXMgPSBhc3luYyBvYmogPT4ge1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgcmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyh6aXAoa2V5cyhvYmopLCByZXNvbHZlZCkpKTtcbn07XG5cbi8qKlxuICogQSB0ZWUgaW1wbGVtZW50YXRpb24gd2hlcmUgYWxsIHJlYWRlcnMgYXJlIHN5bmNocm9uaXplZCB3aXRoIGVhY2ggb3RoZXIuIFRoZXlcbiAqIGFsbCBjb25zdW1lIHRoZSBzb3VyY2Ugc3RyZWFtIGluIGxvY2tzdGVwLCBhbmQgYW55IG9uZSByZXR1cm5pbmcgb3IgdGhyb3dpbmdcbiAqIGVhcmx5IHdpbGwgYWZmZWN0IHRoZSBvdGhlcnMuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0FzeW5jSXRlcmF0b3I8VCwgdm9pZCwgdm9pZD59IHNvdXJjZVN0cmVhbVxuICogQHBhcmFtIHtudW1iZXJ9IHJlYWRlckNvdW50XG4gKi8kaM2PX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG4gICAgICAgY29uc3Qgc3luY2hyb25pemVkVGVlID0gKHNvdXJjZVN0cmVhbSwgcmVhZGVyQ291bnQpID0+IHtcbiAgLyoqIEB0eXBlIHtJdGVyYXRvclJldHVyblJlc3VsdDx2b2lkPiB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IGRvbmVSZXN1bHQ7XG5cbiAgLyoqXG4gKiBAdHlwZWRlZiB7SXRlcmF0b3JSZXN1bHQ8XG4gKiAgICh2YWx1ZTogUHJvbWlzZUxpa2U8SXRlcmF0b3JSZXN1bHQ8VD4+KSA9PiB2b2lkXG4gKiA+fSBRdWV1ZVBheWxvYWRcbiAqL1xuICAvKiogQHR5cGUge0FzeW5jUXVldWU8UXVldWVQYXlsb2FkPltdfSAqL1xuICBjb25zdCBxdWV1ZXMgPSBbXTtcblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGNvbnN0IHB1bGxOZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHF1ZXVlcy5tYXAocXVldWUgPT4gcXVldWUuZ2V0KCkpKTtcbiAgICBjb25zdCByZWplY3Rpb25zID0gW107XG4gICAgLyoqIEB0eXBlIHtBcnJheTwodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZD59ICovXG4gICAgY29uc3QgcmVzb2x2ZXJzID0gW107XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHNldHRsZWRSZXN1bHQgb2YgcmVxdWVzdHMpIHtcbiAgICAgIGlmIChzZXR0bGVkUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICByZWplY3Rpb25zLnB1c2goc2V0dGxlZFJlc3VsdC5yZWFzb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSB8fD0gISFzZXR0bGVkUmVzdWx0LnZhbHVlLmRvbmU7XG4gICAgICAgIHJlc29sdmVycy5wdXNoKHNldHRsZWRSZXN1bHQudmFsdWUudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiogQHR5cGUge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+fSAqL1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKGRvbmVSZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IFByb21pc2UucmVzb2x2ZShkb25lUmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG1ha2VFcnJvcihYYFRlZWQgc3RyZWFtIHRocmV3YCk7XG4gICAgICBhbm5vdGF0ZUVycm9yKGVycm9yLCBYYFRlZWQgcmVqZWN0aW9uczogJHtyZWplY3Rpb25zfWApO1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgc291cmNlU3RyZWFtLnRocm93Py4oZXJyb3IpIHx8XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShzb3VyY2VTdHJlYW0ucmV0dXJuPy4oKSkudGhlbigoKSA9PlxuICAgICAgICAgIFByb21pc2UucmVqZWN0KGVycm9yKSxcbiAgICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgIHJlc3VsdCA9XG4gICAgICAgIHNvdXJjZVN0cmVhbS5yZXR1cm4/LigpIHx8XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHNvdXJjZVN0cmVhbS5uZXh0KCk7XG4gICAgfVxuICAgIHJlc3VsdC50aGVuKFxuICAgICAgciA9PiB7XG4gICAgICAgIGlmIChyLmRvbmUpIHtcbiAgICAgICAgICBkb25lUmVzdWx0ID0gcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgZG9uZVJlc3VsdCA9IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgfSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZSBvZiByZXNvbHZlcnMpIHtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHB1bGxOZXh0KCk7XG4gIH07XG5cbiAgY29uc3QgcmVhZGVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHJlYWRlckNvdW50IH0pLm1hcCgoKSA9PiB7XG4gICAgLyoqIEB0eXBlIHtBc3luY1F1ZXVlPFF1ZXVlUGF5bG9hZD59ICovXG4gICAgY29uc3QgcXVldWUgPSBtYWtlUXVldWUoKTtcbiAgICBxdWV1ZXMucHVzaChxdWV1ZSk7XG5cbiAgICAvKiogQHR5cGUge0FzeW5jR2VuZXJhdG9yPFQsIHZvaWQsIHZvaWQ+fSAqL1xuICAgIGNvbnN0IHJlYWRlciA9IGhhcmRlbih7XG4gICAgICBhc3luYyBuZXh0KCkge1xuICAgICAgICAvKipcbiAqIEB0eXBlIHtQcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn1cbiAqL1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICAgIHF1ZXVlLnB1dCh7IHZhbHVlOiByZXNvbHZlLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgICAvKipcbiAqIEB0eXBlIHtQcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn1cbiAqL1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICAgIHF1ZXVlLnB1dCh7IHZhbHVlOiByZXNvbHZlLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBhc3luYyB0aHJvdyhyZWFzb24pIHtcbiAgICAgICAgY29uc3QgcmVqZWN0aW9uID0gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgcXVldWUucHV0KHJlamVjdGlvbik7XG4gICAgICAgIHJldHVybiByZWplY3Rpb247XG4gICAgICB9LFxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gcmVhZGVyO1xuICAgICAgfSxcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuICAgICAgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuICAgICAgICBhd2FpdCByZWFkZXIucmV0dXJuKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH0pO1xuXG4gIHZvaWQgcHVsbE5leHQoKTtcbiAgcmV0dXJuIHJlYWRlcnM7XG59OyRozY9fb25jZS5zeW5jaHJvbml6ZWRUZWUoc3luY2hyb25pemVkVGVlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiLGZhbHNlXSwib2JqZWN0TWV0YU1hcCI6WyJvYmplY3RNZXRhTWFwIixmYWxzZV0sImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxpbWl0ZWRDb25zb2xlIjpbIm1ha2VMaW1pdGVkQ29uc29sZSJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sInN0cmlwUHJlZml4IjpbInN0cmlwUHJlZml4Il0sInRocm93RXJyb3JDb2RlIjpbInRocm93RXJyb3JDb2RlIl0sInRyeU5vdyI6WyJ0cnlOb3ciXSwidHJ5SnNvblBhcnNlIjpbInRyeUpzb25QYXJzZSJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJ3aXRoRGVmZXJyZWRDbGVhbnVwIjpbIndpdGhEZWZlcnJlZENsZWFudXAiXSwiYXNzZXJ0QWxsRGVmaW5lZCI6WyJhc3NlcnRBbGxEZWZpbmVkIl0sImF0dGVudWF0ZSI6WyJhdHRlbnVhdGUiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADaiNsr1gMAANYDAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3RtcERpci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRlbXBEaXJGYWN0b3J5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogQ3JlYXRlIGEgYHRtcERpcmAgZnVuY3Rpb24gdGhhdCBzeW5jaHJvbm91c2x5IGNyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5XG4gKiBhbmQgYSBmdW5jdGlvbiBmb3IgZGVsZXRpbmcgaXQgYWxvbmcgd2l0aCBhbnkgYWRkZWQgY29udGVudHMuXG4gKlxuICogQHBhcmFtIHtQaWNrPElNUE9SVCgndG1wJyksICdkaXJTeW5jJz59IHRtcFxuICovXG4gICAgICAgY29uc3QgbWFrZVRlbXBEaXJGYWN0b3J5ID0gdG1wID0+IHtcbiAgLyoqIEB0eXBlIHsocHJlZml4Pzogc3RyaW5nKSA9PiBbZGlyTmFtZTogc3RyaW5nLCBjbGVhbnVwOiAoKSA9PiB2b2lkXX0gKi9cbiAgY29uc3QgdG1wRGlyID0gcHJlZml4ID0+IHtcbiAgICBjb25zdCB7IG5hbWUsIHJlbW92ZUNhbGxiYWNrIH0gPSB0bXAuZGlyU3luYyh7XG4gICAgICBwcmVmaXgsXG4gICAgICB1bnNhZmVDbGVhbnVwOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBbbmFtZSwgcmVtb3ZlQ2FsbGJhY2tdO1xuICB9O1xuICByZXR1cm4gdG1wRGlyO1xufTskaM2PX29uY2UubWFrZVRlbXBEaXJGYWN0b3J5KG1ha2VUZW1wRGlyRmFjdG9yeSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGVtcERpckZhY3RvcnkiOlsibWFrZVRlbXBEaXJGYWN0b3J5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE5ip5ahBAAAoQQAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUNoZWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FzdCIsIm11c3RNYXRjaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHR5cGVsZXNzTXVzdE1hdGNoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKHR5cGVsZXNzTXVzdE1hdGNoID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge011c3RNYXRjaCwgUGF0dGVyblR5cGUsIFR5cGVkUGF0dGVybn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqIEB0eXBlIHtNdXN0TWF0Y2h9ICovXG4gICAgICAgY29uc3QgbXVzdE1hdGNoID0gdHlwZWxlc3NNdXN0TWF0Y2g7XG5cbi8qKlxuICogQHRlbXBsYXRlIE1cbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7VHlwZWRQYXR0ZXJuPE0+fSBwYXR0XG4gKiBAcmV0dXJucyB7TX1cbiAqLyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTtcbiAgICAgICBjb25zdCBjYXN0ID0gKHNwZWNpbWVuLCBwYXR0KSA9PiB7XG4gIC8qIG11c3RNYXRjaCB0aHJvd3MgaWYgdGhleSBkb24ndCwgd2hpY2ggbWVhbnMgdGhhdCBgY2FzdGAgYWxzbyBuYXJyb3dzIHRoZSovXG4gIC8qIHR5cGUgYnV0IGEgZnVuY3Rpb24gY2FuJ3QgYm90aCBuYXJyb3cgYW5kIHJldHVybiBhIHR5cGUuIFRoYXQgaXMgYnkgZGVzaWduOiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzQ2MzYjaXNzdWVjb21tZW50LTU0NTAyNTkxNiovXG4gIG11c3RNYXRjaChzcGVjaW1lbiwgcGF0dCk7XG4gIHJldHVybiBzcGVjaW1lbjtcbn07JGjNj19vbmNlLmNhc3QoY2FzdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImNhc3QiOlsiY2FzdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrfHXEowUAAKMFAAApAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJCcmlkZ2VCaWdJbnRTaGFwZSIsIlN0b3JhZ2VOb2RlU2hhcGUiLCJVbmd1YXJkZWRIZWxwZXJJIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4gICAgICAgY29uc3QgU3RvcmFnZU5vZGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpO1xuXG4vKiogVG8gYmUgdXNlZCBvbmx5IGZvciAnaGVscGVyJyBmYWNldHMgd2hlcmUgdGhlIGNhbGxzIGFyZSBmcm9tIHRydXN0ZWQgY29kZS4gKi8kaM2PX29uY2UuU3RvcmFnZU5vZGVTaGFwZShTdG9yYWdlTm9kZVNoYXBlKTtcbiAgICAgICBjb25zdCBVbmd1YXJkZWRIZWxwZXJJID0gTS5pbnRlcmZhY2UoXG4gICdoZWxwZXInLFxuICB7fSxcbiAgLyogbm90IGV4cG9zZWQgc28gdXNpbmcgYGRlZmF1bHRHdWFyZHNgIGlzIGZpbmUuKi9cbiAgeyBkZWZhdWx0R3VhcmRzOiAncGFzc2FibGUnIH0sXG4pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCBgJHtiaWdpbnR9YH0gQnJpZGdlQmlnSW50IEVuc3VyZSB0aGF0IGNhbGxlZXMgcGFzc2VkIGFcbiAqICAgYnJpZGdlIG1lc3NhZ2UgdGhhdCB3YXMgc2VyaWFsaXNlZCBmcm9tIGEgR29sYW5nIGludDY0IG9yIHVpbnQ2NCBhY2NlcHRcbiAqICAgZWl0aGVyIGEgSlMgbnVtYmVyIG9yIGEgc3RyaW5naWZpZWQgSlMgYmlnaW50LlxuICovXG5cbi8qKlxuICogQHR5cGUge1R5cGVkUGF0dGVybjxCcmlkZ2VCaWdJbnQ+fVxuICovJGjNj19vbmNlLlVuZ3VhcmRlZEhlbHBlckkoVW5ndWFyZGVkSGVscGVySSk7XG4gICAgICAgY29uc3QgQnJpZGdlQmlnSW50U2hhcGUgPSBNLm9yKE0ubnVtYmVyKCksIE0uc3RyaW5nKCkpOyRozY9fb25jZS5CcmlkZ2VCaWdJbnRTaGFwZShCcmlkZ2VCaWdJbnRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdG9yYWdlTm9kZVNoYXBlIjpbIlN0b3JhZ2VOb2RlU2hhcGUiXSwiVW5ndWFyZGVkSGVscGVySSI6WyJVbmd1YXJkZWRIZWxwZXJJIl0sIkJyaWRnZUJpZ0ludFNoYXBlIjpbIkJyaWRnZUJpZ0ludFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA14cZPXAMAABwDAAAKgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiLCJpc0FiYW5kb25lZEVycm9yIiwiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiIsIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sbWF0Y2hlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgaXNGcm96ZW4gfSA9IE9iamVjdDtcblxuLyoqXG4gKiBBbiBFcnJvci1saWtlIG9iamVjdCBmb3IgdXNlIGFzIHRoZSByZWplY3Rpb24gcmVhc29uIG9mIHByb21pc2VzIGFiYW5kb25lZCBieVxuICogdXBncmFkZS5cbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICBuYW1lOiAndmF0VXBncmFkZWQnO1xuICogICB1cGdyYWRlTWVzc2FnZTogc3RyaW5nO1xuICogICBpbmNhcm5hdGlvbk51bWJlcjogbnVtYmVyO1xuICogfX0gVXBncmFkZURpc2Nvbm5lY3Rpb25cbiAqL1xuXG4gICAgICAgY29uc3QgVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSA9IGhhcmRlbih7XG4gIG5hbWU6ICd2YXRVcGdyYWRlZCcsXG4gIHVwZ3JhZGVNZXNzYWdlOiBNLnN0cmluZygpLFxuICBpbmNhcm5hdGlvbk51bWJlcjogTS5udW1iZXIoKSxcbn0pO1xuXG4vKipcbiAqIE1ha2VzIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciB1c2UgYXMgdGhlIHJlamVjdGlvbiByZWFzb24gb2YgcHJvbWlzZXNcbiAqIGFiYW5kb25lZCBieSB1cGdyYWRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cGdyYWRlTWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IHRvSW5jYXJuYXRpb25OdW1iZXJcbiAqIEByZXR1cm5zIHtVcGdyYWRlRGlzY29ubmVjdGlvbn1cbiAqLyRozY9fb25jZS5VcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICh1cGdyYWRlTWVzc2FnZSwgdG9JbmNhcm5hdGlvbk51bWJlcikgPT5cbiAgaGFyZGVuKHtcbiAgICBuYW1lOiAndmF0VXBncmFkZWQnLFxuICAgIHVwZ3JhZGVNZXNzYWdlLFxuICAgIGluY2FybmF0aW9uTnVtYmVyOiB0b0luY2FybmF0aW9uTnVtYmVyLFxuICB9KTskaM2PX29uY2UubWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gcmVhc29uIElmIGByZWFzb25gIGlzIG5vdCBmcm96ZW4sIGl0IGNhbm5vdCBiZSBhblxuICogICBVcGdyYWRlRGlzY29ubmVjdGlvbiwgc28gcmV0dXJucyBmYWxzZSB3aXRob3V0IGV2ZW4gY2hlY2tpbmcgYWdhaW5zdCB0aGVcbiAqICAgc2hhcGUuXG4gKiBAcmV0dXJucyB7cmVhc29uIGlzIFVwZ3JhZGVEaXNjb25uZWN0aW9ufVxuICovXG4gICAgICAgY29uc3QgaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9IHJlYXNvbiA9PlxuICByZWFzb24gIT0gbnVsbCAmJiAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcSovXG4gIGlzRnJvemVuKHJlYXNvbikgJiZcbiAgbWF0Y2hlcyhyZWFzb24sIFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpOyRozY9fb25jZS5pc1VwZ3JhZGVEaXNjb25uZWN0aW9uKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuaGFyZGVuKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhIHJlYXNvbiBpcyBhICd2YXQgdGVybWluYXRlZCcgZXJyb3IgZ2VuZXJhdGVkIHdoZW4gYW4gb2JqZWN0XG4gKiBpcyBhYmFuZG9uZWQgYnkgYSB2YXQgZHVyaW5nIGFuIHVwZ3JhZGUuXG4gKlxuICogTm9ybWFsbHkgd2UgZG8gbm90IHdhbnQgdG8gcmVseSBvbiB0aGUgYG1lc3NhZ2VgIG9mIGFuIGVycm9yIG9iamVjdCwgYnV0IHRoaXNcbiAqIGlzIGEgcHJhZ21hdGljIHNvbHV0aW9uIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHZhdCB1cGdyYWRlIGVycm9ycy4gSW4gdGhlXG4gKiBmdXR1cmUgd2UnZCBwcmVmZXIgaGF2aW5nIGFuIGVycm9yIHdpdGggYSBjYXVzZSByZWZlcmVuY2luZyBhIGRpc2Nvbm5lY3Rpb25cbiAqIG9iamVjdCBsaWtlIGZvciBwcm9taXNlIHJlamVjdGlvbnMuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85NTgyXG4gKlxuICogQHBhcmFtIHthbnl9IHJlYXNvblxuICogQHJldHVybnMge3JlYXNvbiBpcyBFcnJvcn1cbiAqL1xuICAgICAgIGNvbnN0IGlzQWJhbmRvbmVkRXJyb3IgPSByZWFzb24gPT5cbiAgcmVhc29uICE9IG51bGwgJiYgLyogZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXEqL1xuICBpc0Zyb3plbihyZWFzb24pICYmXG4gIG1hdGNoZXMocmVhc29uLCBNLmVycm9yKCkpICYmXG4gIC8qIFdlJ3JlIG5vdCB1c2luZyBhIGNvbnN0YW50IGhlcmUgc2luY2UgdGhpcyBzcGVjaWFsIHZhbHVlIGlzIGFscmVhZHkqL1xuICAvKiBzcHJpbmtsZWQgdGhyb3VnaG91dCB0aGUgU0RLKi9cbiAgcmVhc29uLm1lc3NhZ2UgPT09ICd2YXQgdGVybWluYXRlZCc7JGjNj19vbmNlLmlzQWJhbmRvbmVkRXJyb3IoaXNBYmFuZG9uZWRFcnJvcik7XG5oYXJkZW4oaXNBYmFuZG9uZWRFcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlIjpbIlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiXSwibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIjpbIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwiaXNBYmFuZG9uZWRFcnJvciI6WyJpc0FiYW5kb25lZEVycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD/hQTwZFAAAGRQAADMAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLHN1YnNjcmliZUxhdGVzdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7QmFzZU5vdGlmaWVyLCBJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWN9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYHN1YnNjcmliZUxhdGVzdGAgZnJvbSBgQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanNgIGluc3RlYWQuXG4gKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9IRUFEL21haW4vZ3VpZGVzL2pzLXByb2dyYW1taW5nL25vdGlmaWVycy5tZFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIgPSBzdWJzY3JpYmVMYXRlc3Q7XG5cbi8qKlxuICogVGhpcyBhZHZhbmNlcyBgYXN5bmNJdGVyYXRvclBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRvcmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYXRvcjxUPj59IGFzeW5jSXRlcmF0b3JQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRozY9fb25jZS5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZUl0ZXJhdG9yID0gKGFzeW5jSXRlcmF0b3JQLCBpdGVyYXRpb25PYnNlcnZlcikgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKGFjaywgb2JzZXJ2ZXJFcnJvcikgPT4ge1xuICAgIGNvbnN0IHJlY3VyID0gKCkgPT4ge1xuICAgICAgRS53aGVuKFxuICAgICAgICBFKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4gICAgICAgICh7IHZhbHVlLCBkb25lIH0pID0+IHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoICYmIGl0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG4gICAgICAgICAgICBhY2sodW5kZWZpbmVkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUgJiZcbiAgICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xuICAgICAgICAgICAgcmVjdXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbiA9PiB7XG4gICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCAmJiBpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG4gICAgICAgICAgYWNrKHVuZGVmaW5lZCk7XG4gICAgICAgIH0sXG4gICAgICApLmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuICAgIH07XG4gICAgcmVjdXIoKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRoaXMgcmVhZHMgZnJvbSBgYXN5bmNJdGVyYWJsZVBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRpb25gIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaM2PX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZUl0ZXJhdGlvbiA9IChhc3luY0l0ZXJhYmxlUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+IHtcbiAgY29uc3QgaXRlcmF0b3JQID0gRShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gIHJldHVybiBvYnNlcnZlSXRlcmF0b3IoaXRlcmF0b3JQLCBpdGVyYXRpb25PYnNlcnZlcik7XG59O1xuXG4vKipcbiAqIEFzIHVwZGF0ZXMgY29tZSBpbiBmcm9tIHRoZSBwb3NzaWJseSByZW1vdGUgYG5vdGlmaWVyUGAsIHVwZGF0ZVxuICogdGhlIGxvY2FsIGB1cGRhdGVyYC4gU2luY2UgdGhlIHVwZGF0ZXMgY29tZSBmcm9tIGEgbm90aWZpZXIsIHRoZXlcbiAqIGFyZSBsb3NzeSwgaS5lLiwgb25jZSBhIG1vcmUgcmVjZW50IHN0YXRlIGNhbiBiZSByZXBvcnRlZCwgbGVzcyByZWNlbnRcbiAqIHN0YXRlcyBhcmUgYXNzdW1lZCBpcnJlbGV2YW50IGFuZCBkcm9wcGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSBub3RpZmllclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjNj19vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZU5vdGlmaWVyID0gKG5vdGlmaWVyUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+XG4gIG9ic2VydmVJdGVyYXRpb24oc3Vic2NyaWJlTGF0ZXN0KG5vdGlmaWVyUCksIGl0ZXJhdGlvbk9ic2VydmVyKTskaM2PX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJvYnNlcnZlTm90aWZpZXIiOlsib2JzZXJ2ZU5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMI+7bjrBwAA6wcAACQAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi9ub3RpZmllci5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vdG9waWMuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Iiwic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0IixudWxsXSwicmVleHBvcnRzIjpbIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW11dLFtcIi4vbm90aWZpZXIuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbXV0sW1wiLi90b3BpYy5qc1wiLCBbXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV0sW1wiLi9zdG9yZWQtbm90aWZpZXIuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3B1Ymxpc2gta2l0LmpzIjpbWyJtYWtlUHVibGlzaEtpdCIsIm1ha2VQdWJsaXNoS2l0Il0sWyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSxbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sWyJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUVhY2hUb3BpY0kiXSxbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSxbIlN1YnNjcmliZXJTaGFwZSIsIlN1YnNjcmliZXJTaGFwZSJdXSwiLi9zdWJzY3JpYmUuanMiOltbInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVFYWNoIl0sWyJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXV0sIi4vbm90aWZpZXIuanMiOltbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllciJdLFsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0Il0sWyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl0sWyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl1dLCIuL3N1YnNjcmliZXIuanMiOltbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uIl0sWyJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCJdXSwiLi90b3BpYy5qcyI6W1sibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyIsIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXV0sIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOltbIm9ic2VydmVOb3RpZmllciIsIm9ic2VydmVOb3RpZmllciJdLFsib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIl0sWyJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdGlvbiJdLFsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAs0n/TsUbAADFGwAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0LEUsRmFyLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUxhdGVzdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0xhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFB1Ymxpc2hLaXQsIFN1YnNjcmliZXIsIFVwZGF0ZVJlY29yZH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXIgPSBzaGFyYWJsZUludGVybmFsc1AgPT4ge1xuICAvKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLi4uc3Vic2NyaWJlTGF0ZXN0KHNoYXJhYmxlSW50ZXJuYWxzUCksXG4gICAgZ2V0VXBkYXRlU2luY2U6IGFzeW5jIHVwZGF0ZUNvdW50ID0+XG4gICAgICBFKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4gICAgLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbiAgICBnZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOiBhc3luYyAoKSA9PiBzaGFyYWJsZUludGVybmFsc1AsXG4gICAgLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogVXNlZCBvbmx5IGJ5IGBtYWtlQ2FzdGluZ1NwZWNGcm9tUmVmYC4gIEluc3RlYWQgdGhhdCBmdW5jdGlvbiBzaG91bGQgdXNlXG4gKiB0aGUgYFN0b3JlZEZhY2V0YCBBUEkuXG4gKi9cbiAgICBnZXRTdG9yZUtleTogKCkgPT4gaGFyZGVuKHsgbm90aWZpZXIgfSksXG4gIH0pO1xuICByZXR1cm4gbm90aWZpZXI7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj4gfCBSZW1vdGU8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRozY9fb25jZS5tYWtlTm90aWZpZXIobWFrZU5vdGlmaWVyKTtcbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciA9IHN1YnNjcmliZXIgPT4ge1xuICAvKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuICBjb25zdCBiYXNlTm90aWZpZXIgPSBoYXJkZW4oe1xuICAgIGdldFVwZGF0ZVNpbmNlOiAodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpID0+XG4gICAgICBFKHN1YnNjcmliZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuICAgIC4uLmJhc2VOb3RpZmllcixcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qKlxuICogUHJvZHVjZXMgYSBwYWlyIG9mIG9iamVjdHMsIHdoaWNoIGFsbG93IGEgc2VydmljZSB0byBwcm9kdWNlIGEgc3RyZWFtIG9mXG4gKiB1cGRhdGUgcHJvbWlzZXMuXG4gKlxuICogVGhlIGluaXRpYWwgc3RhdGUgYXJndW1lbnQgaGFzIHRvIGJlIHRydWx5IG9wdGlvbmFsIGV2ZW4gdGhvdWdoIGl0IGNhblxuICogYmUgYW55IGZpcnN0IGNsYXNzIHZhbHVlIGluY2x1ZGluZyBgdW5kZWZpbmVkYC4gV2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVcbiAqIHByZXNlbmNlIHZzIHRoZSBhYnNlbmNlIG9mIGl0LCB3aGljaCB3ZSBjYW5ub3QgZG8gd2l0aCB0aGUgb3B0aW9uYWwgYXJndW1lbnRcbiAqIHN5bnRheC4gUmF0aGVyIHdlIHVzZSB0aGUgYXJpdHkgb2YgdGhlIGBpbml0aWFsU3RhdGVBcnJgIGFycmF5LlxuICpcbiAqIElmIG5vIGluaXRpYWwgc3RhdGUgaXMgcHJvdmlkZWQgdG8gYG1ha2VOb3RpZmllcktpdGAsIHRoZW4gaXQgc3RhcnRzIHdpdGhvdXRcbiAqIGFuIGluaXRpYWwgc3RhdGUuIEl0cyBpbml0aWFsIHN0YXRlIHdpbGwgaW5zdGVhZCBiZSB0aGUgc3RhdGUgb2YgdGhlIGZpcnN0XG4gKiB1cGRhdGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W10gfCBbVF19IGluaXRpYWxTdGF0ZUFyciB0aGUgZmlyc3Qgc3RhdGUgdG8gYmUgcmV0dXJuZWQgKHR5cGVkIGFzIHJlc3QgYXJyYXkgdG8gcGVybWl0IGB1bmRlZmluZWRgKVxuICogQHJldHVybnMge05vdGlmaWVyUmVjb3JkPFQ+fSB0aGUgbm90aWZpZXIgYW5kIHVwZGF0ZXJcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllcktpdCA9ICguLi5pbml0aWFsU3RhdGVBcnIpID0+IHtcbiAgLyoqIEB0eXBlIHtQdWJsaXNoS2l0PFQ+fSAqL1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICBjb25zdCBub3RpZmllciA9IG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKHN1YnNjcmliZXIpO1xuXG4gIGNvbnN0IHVwZGF0ZXIgPSBGYXIoJ3VwZGF0ZXInLCB7XG4gICAgdXBkYXRlU3RhdGU6IHN0YXRlID0+IHB1Ymxpc2hlci5wdWJsaXNoKHN0YXRlKSxcbiAgICBmaW5pc2g6IGNvbXBsZXRpb24gPT4gcHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbiAgICBmYWlsOiByZWFzb24gPT4gcHVibGlzaGVyLmZhaWwocmVhc29uKSxcbiAgfSk7XG5cbiAgYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGggPD0gMSwgJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuICBpZiAoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgIHVwZGF0ZXIudXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlQXJyWzBdKTtcbiAgfVxuXG4gIC8qIG5vdGlmaWVyIGZhY2V0IGlzIHNlcGFyYXRlIHNvIGl0IGNhbiBiZSBoYW5kZWQgb3V0IHdoaWxlIHVwZGF0ZXIqL1xuICAvKiBpcyB0aWdodGx5IGhlbGQqL1xuICByZXR1cm4gaGFyZGVuKHsgbm90aWZpZXIsIHVwZGF0ZXIgfSk7XG59O1xuXG4vKipcbiAqIEFkYXB0b3IgZnJvbSBhc3luYyBpdGVyYWJsZSB0byBub3RpZmllci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBUaGUgcmVzdWx0aW5nIG5vdGlmaWVyIGlzIGxvc3NsZXNzLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlLlxuICogUHJlZmVyIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLCBhbmQgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTQxMyBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU2OTUgZm9yIGNvbnRleHQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRozY9fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSA9IGFzeW5jSXRlcmFibGVQID0+IHtcbiAgY29uc3QgaXRlcmF0b3JQID0gRShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xuICBsZXQgb3B0TmV4dFByb21pc2U7XG4gIGxldCBjdXJyZW50VXBkYXRlQ291bnQgPSAwbjtcbiAgLyoqIEB0eXBlIHtFUmVmPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xuICBsZXQgY3VycmVudFJlc3BvbnNlO1xuICBsZXQgZmluYWwgPSBmYWxzZTtcblxuICAvKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuICBjb25zdCBiYXNlTm90aWZpZXIgPSBGYXIoJ2Jhc2VOb3RpZmllcicsIHtcbiAgICBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCA9IC0xbikge1xuICAgICAgaWYgKHVwZGF0ZUNvdW50IDwgY3VycmVudFVwZGF0ZUNvdW50KSB7XG4gICAgICAgIGlmIChjdXJyZW50UmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodXBkYXRlQ291bnQgIT09IGN1cnJlbnRVcGRhdGVDb3VudCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnZ2V0VXBkYXRlU2luY2UgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8qIFJldHVybiBhIGZpbmFsIHJlc3BvbnNlIGlmIHdlIGhhdmUgb25lLCBvdGhlcndpc2UgYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuICAgICAgaWYgKGZpbmFsKSB7XG4gICAgICAgIGFzc2VydChjdXJyZW50UmVzcG9uc2UgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmICghb3B0TmV4dFByb21pc2UpIHtcbiAgICAgICAgY29uc3QgbmV4dEl0ZXJSZXN1bHRQID0gRShpdGVyYXRvclApLm5leHQoKTtcbiAgICAgICAgb3B0TmV4dFByb21pc2UgPSBFLndoZW4oXG4gICAgICAgICAgbmV4dEl0ZXJSZXN1bHRQLFxuICAgICAgICAgICh7IGRvbmUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICAgIGFzc2VydCghZmluYWwpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgZmluYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudFVwZGF0ZUNvdW50ICs9IDFuO1xuICAgICAgICAgICAgY3VycmVudFJlc3BvbnNlID0gaGFyZGVuKHtcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHVwZGF0ZUNvdW50OiBkb25lID8gdW5kZWZpbmVkIDogY3VycmVudFVwZGF0ZUNvdW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcHROZXh0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBfcmVhc29uID0+IHtcbiAgICAgICAgICAgIGZpbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIGN1cnJlbnRSZXNwb25zZSA9XG4gICAgICAgICAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSAqL1xuICAgICAgICAgICAgICAobmV4dEl0ZXJSZXN1bHRQKTtcbiAgICAgICAgICAgIG9wdE5leHRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdE5leHRQcm9taXNlO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG4gIGNvbnN0IG5vdGlmaWVyID0gRmFyKCdub3RpZmllcicsIHtcbiAgICAvKiBEb24ndCBsZWFrIHRoZSBvcmlnaW5hbCBhc3luY0l0ZXJhYmxlUCBzaW5jZSBpdCBtYXkgYmUgcmVtb3RlIGFuZCB3ZSBhbHNvKi9cbiAgICAvKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4gICAgLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4gICAgLi4uYmFzZU5vdGlmaWVyLFxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUobWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCJdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAbIRejM0IAADNCAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3B1Ymxpc2gta2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGF0dGVybnMiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiUHVibGlzaGVySSIsIlN1YnNjcmliZXJJIiwiU3Vic2NyaWJlclNoYXBlIiwiVXBkYXRlQ291bnRTaGFwZSIsIm1ha2VQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHVibGlzaEtpdElLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRSxGYXIsbWFrZVByb21pc2VLaXQsTSxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQsY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLFskaM2PX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlLCBEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgUHVibGljYXRpb25SZWNvcmQsIFB1Ymxpc2hlciwgUHVibGlzaEtpdCwgU3Vic2NyaWJlciwgVXBkYXRlUmVjb3JkfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICovXG5cbmNvbnN0IHNpbmsgPSAoKSA9PiB7fTtcbmNvbnN0IG1ha2VRdWlldFJlamVjdGlvbiA9IHJlYXNvbiA9PiB7XG4gIGNvbnN0IHJlamVjdGlvbiA9IGhhcmRlbihQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbiAgdm9pZCBFLndoZW4ocmVqZWN0aW9uLCBzaW5rLCBzaW5rKTtcbiAgcmV0dXJuIHJlamVjdGlvbjtcbn07XG5jb25zdCB0b29GYXJSZWplY3Rpb24gPSBtYWtlUXVpZXRSZWplY3Rpb24oXG4gIGhhcmRlbihFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKSxcbik7XG5cbiAgICAgICBjb25zdCBQdWJsaXNoZXJJID0gTS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicsIHtcbiAgcHVibGlzaDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmluaXNoOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxufSk7XG5cbi8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIE5vdGlmaWVyIGBnZXRVcGRhdGVTaW5jZWAuKi8kaM2PX29uY2UuUHVibGlzaGVySShQdWJsaXNoZXJJKTtcbiAgICAgICBjb25zdCBVcGRhdGVDb3VudFNoYXBlID0gTS5vcihNLmJpZ2ludCgpLCBNLm51bWJlcigpKTskaM2PX29uY2UuVXBkYXRlQ291bnRTaGFwZShVcGRhdGVDb3VudFNoYXBlKTtcbiAgICAgICBjb25zdCBTdWJzY3JpYmVySSA9IE0uaW50ZXJmYWNlKCdTdWJzY3JpYmVyJywge1xuICBzdWJzY3JpYmVBZnRlcjogTS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldFVwZGF0ZVNpbmNlOiBNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG4gICAgICAgY29uc3QgcHVibGlzaEtpdElLaXQgPSBoYXJkZW4oe1xuICBwdWJsaXNoZXI6IFB1Ymxpc2hlckksXG4gIHN1YnNjcmliZXI6IFN1YnNjcmliZXJJLFxufSk7JGjNj19vbmNlLnB1Ymxpc2hLaXRJS2l0KHB1Ymxpc2hLaXRJS2l0KTtcblxuICAgICAgIGNvbnN0IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUgPSBNLmludGVyZmFjZShcbiAgJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyxcbiAge1xuICAgIGZvcms6IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSwgLyogb29wczogcmVjdXJzaXZlIHR5cGUqL1xuICAgIG5leHQ6IE0uY2FsbFdoZW4oKS5yZXR1cm5zKE0uYW55KCkpLFxuICB9LFxuKTskaM2PX29uY2UuRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZShGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlKTtcblxuICAgICAgIGNvbnN0IEl0ZXJhYmxlRWFjaFRvcGljSSA9IE0uaW50ZXJmYWNlKCdJdGVyYWJsZUVhY2hUb3BpYycsIHtcbiAgc3Vic2NyaWJlQWZ0ZXI6XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFN1YnNjcmliZXJJKS5tZXRob2RHdWFyZHMuc3Vic2NyaWJlQWZ0ZXIsXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IE0uY2FsbCgpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyksXG4gICksXG59KTskaM2PX29uY2UuSXRlcmFibGVFYWNoVG9waWNJKEl0ZXJhYmxlRWFjaFRvcGljSSk7XG5cbiAgICAgICBjb25zdCBJdGVyYWJsZUxhdGVzdFRvcGljSSA9IE0uaW50ZXJmYWNlKCdJdGVyYWJsZUxhdGVzdFRvcGljJywge1xuICBnZXRVcGRhdGVTaW5jZTpcbiAgICBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoU3Vic2NyaWJlckkpLm1ldGhvZEd1YXJkcy5nZXRVcGRhdGVTaW5jZSxcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InKSxcbiAgKSxcbn0pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBBcmdcbiAqIEB0ZW1wbGF0ZSBSZXRcbiAqIEBwYXJhbSB7KGFyZzogQXJnKSA9PiBSZXR9IGZuXG4gKiBAcmV0dXJucyB7KGFyZzogQXJnKSA9PiBSZXR9XG4gKi8kaM2PX29uY2UuSXRlcmFibGVMYXRlc3RUb3BpY0koSXRlcmFibGVMYXRlc3RUb3BpY0kpO1xuY29uc3Qgd2Vha01lbW9pemVVbmFyeSA9IGZuID0+IHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuICByZXR1cm4gYXJnID0+IHtcbiAgICAvKiogQHR5cGUge29iamVjdH0gKi9cbiAgICBjb25zdCBvYXJnID0gYXJnO1xuICAgIGlmIChjYWNoZS5oYXMob2FyZykpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQob2FyZyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGZuKGFyZyk7XG4gICAgY2FjaGUuc2V0KG9hcmcsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGljYXRpb25SZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge1VwZGF0ZVJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZCA9IHJlY29yZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBoZWFkOiB7IHZhbHVlLCBkb25lIH0sXG4gICAgcHVibGlzaENvdW50LFxuICB9ID0gcmVjb3JkO1xuICBpZiAoZG9uZSkge1xuICAgIC8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIHVwZGF0ZUNvdW50OiB1bmRlZmluZWQgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCB1cGRhdGVDb3VudDogcHVibGlzaENvdW50IH0pO1xufTtcblxuLyoqXG4gKiBNYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1B1Ymxpc2hLaXQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUHVibGlzaEtpdCA9ICgpID0+IHtcbiAgLyoqIEB0eXBlIHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gKi9cbiAgbGV0IHRhaWxQO1xuICAvKiogQHR5cGUge3VuZGVmaW5lZCB8ICgodmFsdWU6IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+KSA9PiB2b2lkKX0gKi9cbiAgbGV0IHRhaWxSO1xuICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuXG4gIGxldCBjdXJyZW50UHVibGlzaENvdW50ID0gMG47XG4gIGxldCBjdXJyZW50UCA9IHRhaWxQO1xuICBjb25zdCBhZHZhbmNlQ3VycmVudCA9IChkb25lLCB2YWx1ZSwgcmVqZWN0aW9uKSA9PiB7XG4gICAgaWYgKHRhaWxSID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRQdWJsaXNoQ291bnQgKz0gMW47XG4gICAgY3VycmVudFAgPSB0YWlsUDtcbiAgICBjb25zdCByZXNvbHZlQ3VycmVudCA9IHRhaWxSO1xuXG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHRhaWxQID0gdG9vRmFyUmVqZWN0aW9uO1xuICAgICAgdGFpbFIgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlamVjdGlvbikge1xuICAgICAgcmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZUN1cnJlbnQoXG4gICAgICAgIGhhcmRlbih7XG4gICAgICAgICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgICAgICAgIHB1Ymxpc2hDb3VudDogY3VycmVudFB1Ymxpc2hDb3VudCxcbiAgICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQgPSB3ZWFrTWVtb2l6ZVVuYXJ5KFxuICAgIG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQsXG4gICk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge1N1YnNjcmliZXI8VD59XG4gKi9cbiAgY29uc3Qgc3Vic2NyaWJlciA9IEZhcignU3Vic2NyaWJlcicsIHtcbiAgICBzdWJzY3JpYmVBZnRlcjogKHB1Ymxpc2hDb3VudCA9IC0xbikgPT4ge1xuICAgICAgYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsICdiaWdpbnQnKTtcbiAgICAgIGlmIChwdWJsaXNoQ291bnQgPT09IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIHRhaWxQO1xuICAgICAgfSBlbHNlIGlmIChwdWJsaXNoQ291bnQgPCBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50UDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4ge1xuICAgICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVDb3VudCA9IEJpZ0ludCh1cGRhdGVDb3VudCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzdWJzY3JpYmVyXG4gICAgICAgICAgLyogYHN1YnNjcmliZUFmdGVyYCBtYXkgcmVzb2x2ZSB3aXRoIHRoZSB1cGRhdGUgcmVjb3JkIG51bWJlcmVkKi9cbiAgICAgICAgICAvKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuICAgICAgICAgIC8qIHNhbWUgY3JhbmsuLi4qL1xuICAgICAgICAgIC5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbiAgICAgICAgICAvKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbiAgICAgICAgICAvKiBmdXJ0aGVyIG9uZXMuKi9cbiAgICAgICAgICAudGhlbigoKSA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpXG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuICBjb25zdCBwdWJsaXNoZXIgPSBGYXIoJ1B1Ymxpc2hlcicsIHtcbiAgICBwdWJsaXNoOiB2YWx1ZSA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudChmYWxzZSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZmluaXNoOiBmaW5hbFZhbHVlID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KHRydWUsIGZpbmFsVmFsdWUpO1xuICAgIH0sXG4gICAgZmFpbDogcmVhc29uID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KHRydWUsIHVuZGVmaW5lZCwgbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaGFyZGVuKHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0pO1xufTskaM2PX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuY29uc3QgRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlID0gaGFyZGVuKHtcbiAgdmFsdWVEdXJhYmlsaXR5OiBNLmFueSgpLFxuICBwdWJsaXNoQ291bnQ6IE0uYW55KCksXG4gIHN0YXR1czogTS5hbnkoKSxcbiAgaGFzVmFsdWU6IE0uYW55KCksXG4gIHZhbHVlOiBNLmFueSgpLFxufSk7XG5cbi8qIFRPRE86IE1vdmUgZHVyYWJsZSBwdWJsaXNoIGtpdCB0byBhIG5ldyBmaWxlPyovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSAmICdtYW5kYXRvcnknfSBbb3B0aW9ucy52YWx1ZUR1cmFiaWxpdHldXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX1cbiAqL1xuY29uc3QgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGUgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgdmFsdWVEdXJhYmlsaXR5ID0gJ21hbmRhdG9yeScgfSA9IG9wdGlvbnM7XG4gIGFzc2VydC5lcXVhbCh2YWx1ZUR1cmFiaWxpdHksICdtYW5kYXRvcnknKTtcbiAgcmV0dXJuIHtcbiAgICAvKiBjb25maWd1cmF0aW9uKi9cbiAgICB2YWx1ZUR1cmFiaWxpdHksXG5cbiAgICAvKiBsaWZlY3ljbGUgcHJvZ3Jlc3MqL1xuICAgIHB1Ymxpc2hDb3VudDogMG4sXG4gICAgc3RhdHVzOiAnbGl2ZScsIC8qIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnKi9cblxuICAgIC8qIHBlcnNpc3RlZCByZXN1bHQgZGF0YSovXG4gICAgLyogTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIG5vbi10ZXJtaW5hbCB2YWx1ZXMgZnJvbSBgcHVibGlzaGAsKi9cbiAgICAvKiB2YWx1ZSBhbHNvIGhvbGRzIHRoZSB0ZXJtaW5hbCB2YWx1ZSBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYC4qL1xuICAgIGhhc1ZhbHVlOiBmYWxzZSxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICB9O1xufTtcblxuLyogV2UgbmVlZCB0aGUgV2Vha01hcCBrZXkgZm9yIGEga2l0IHRvIGJlIGEgdnJlZi1iZWFyaW5nIG9iamVjdCovXG4vKiBpbiBpdHMgY29ob3J0LCBhbmQgaGF2ZSBhcmJpdHJhcmlseSBjaG9zZW4gdGhlIHB1Ymxpc2hlciBmYWNldC4qL1xuLyoqIEB0eXBlZGVmIHtQdWJsaXNoZXI8Kj59IER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5ICovXG4vKipcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXl9XG4gKi9cbmNvbnN0IGdldEVwaGVtZXJhbEtleSA9IGZhY2V0cyA9PiBmYWNldHMucHVibGlzaGVyO1xuXG4vKipcbiAqIEB0eXBlZGVmIER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YVxuICogQHByb3BlcnR5IHtQcm9taXNlPCo+IHwgdW5kZWZpbmVkfSBjdXJyZW50UCBUaGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZVxuICogICAodW5kZWZpbmVkIHVubGVzcyByZXNvbHZlZCB3aXRoIHVucmVjb3ZlcmFibGUgZXBoZW1lcmFsIGRhdGEpXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj59IHRhaWxQIFRoZSBuZXh0LXJlc3VsdCBwcm9taXNlXG4gKiBAcHJvcGVydHkgeygodmFsdWU6IGFueSkgPT4gdm9pZCkgfCB1bmRlZmluZWR9IHRhaWxSIFRoZSBuZXh0LXJlc3VsdCByZXNvbHZlclxuICogICAodW5kZWZpbmVkIHdoZW4gdGhlIHB1Ymxpc2gga2l0IGhhcyB0ZXJtaW5hdGVkKVxuICovXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSwgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPn0gKi9cbmNvbnN0IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBkdXJhYmxlXG4gKiBwdWJsaXNoIGtpdCwgcmVjcmVhdGVkIHVubGVzcyB3ZSBhbHJlYWR5IGhhdmUgb25lIHdpdGggcmV0YWluZWRcbiAqIGVwaGVtZXJhbCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcGFyYW0ge1Byb21pc2U8Kj59IHRhaWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFAgPSAoc3RhdGUsIGZhY2V0cywgdGFpbCkgPT4ge1xuICBjb25zdCBlcGhlbWVyYWxLZXkgPSBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbiAgY29uc3QgZm91bmREYXRhID0gZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuICBjb25zdCBjdXJyZW50UCA9IGZvdW5kRGF0YSAmJiBmb3VuZERhdGEuY3VycmVudFA7XG4gIGlmIChjdXJyZW50UCkge1xuICAgIHJldHVybiBjdXJyZW50UDtcbiAgfVxuXG4gIGNvbnN0IHsgcHVibGlzaENvdW50LCBzdGF0dXMsIGhhc1ZhbHVlLCB2YWx1ZSB9ID0gc3RhdGU7XG4gIGlmICghaGFzVmFsdWUpIHtcbiAgICBhc3NlcnQoc3RhdHVzID09PSAnbGl2ZScpO1xuICAgIHJldHVybiB0YWlsO1xuICB9XG4gIGlmIChzdGF0dXMgPT09ICdsaXZlJyB8fCBzdGF0dXMgPT09ICdmaW5pc2hlZCcpIHtcbiAgICBjb25zdCBjZWxsID0gaGFyZGVuKHtcbiAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmU6IHN0YXR1cyAhPT0gJ2xpdmUnIH0sXG4gICAgICBwdWJsaXNoQ291bnQsXG4gICAgICB0YWlsLFxuICAgIH0pO1xuICAgIHJldHVybiBFLnJlc29sdmUoY2VsbCk7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEZhaWxgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0LXJlc3VsdCBwcm9taXNlIGFuZCByZXNvbHZlciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICogZHVyYWJsZSBwdWJsaXNoIGtpdC5cbiAqIFRoZXNlIGFyZSBsb3N0IG9uIHVwZ3JhZGUgYnV0IHJlY3JlYXRlZCBvbi1kZW1hbmQsIHByZXNlcnZpbmcgdGhlXG4gKiB2YWx1ZSBpbiAoYnV0IG5vdCB0aGUgaWRlbnRpdHkgb2YpIHRoZSBjdXJyZW50IHsgdmFsdWUsIGRvbmUgfSByZXN1bHRcbiAqIHdoZW4gcG9zc2libGUsIHdoaWNoIGlzIGFsd2F5cyB0aGUgY2FzZSB3aGVuIHRoYXQgdmFsdWUgaXMgdGVybWluYWxcbiAqIChpLmUuLCBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCkgb3Igd2hlbiB0aGUgZHVyYWJsZSBwdWJsaXNoIGtpdCBpc1xuICogY29uZmlndXJlZCB3aXRoIGB2YWx1ZUR1cmFiaWxpdHk6ICdtYW5kYXRvcnknYC5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YX1cbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IChzdGF0ZSwgZmFjZXRzKSA9PiB7XG4gIGNvbnN0IGVwaGVtZXJhbEtleSA9IGdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuICBjb25zdCBmb3VuZERhdGEgPSBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG4gIGlmIChmb3VuZERhdGEpIHtcbiAgICByZXR1cm4gZm91bmREYXRhO1xuICB9XG5cbiAgY29uc3QgeyBzdGF0dXMgfSA9IHN0YXRlO1xuICBsZXQgdGFpbFA7XG4gIGxldCB0YWlsUjtcbiAgaWYgKHN0YXR1cyA9PT0gJ2xpdmUnKSB7XG4gICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB2b2lkIEUud2hlbih0YWlsUCwgc2luaywgc2luayk7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnZmluaXNoZWQnIHx8IHN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gIH1cbiAgLyogY3VycmVudFAgaXMgbm90IGVwaGVtZXJhbCB3aGVuIHJlc3RvcmluZyBmcm9tIHBlcnNpc3RlZCBzdGF0ZS4qL1xuICBjb25zdCBvYmogPSBoYXJkZW4oeyBjdXJyZW50UDogdW5kZWZpbmVkLCB0YWlsUCwgdGFpbFIgfSk7XG4gIGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoZXBoZW1lcmFsS2V5LCBvYmopO1xuICByZXR1cm4gb2JqO1xufTtcblxuLyoqXG4gKiBFeHRlbmRzIHRoZSBzZXF1ZW5jZSBvZiByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSB7e3N0YXRlOiBEdXJhYmxlUHVibGlzaEtpdFN0YXRlLCBmYWNldHM6IFB1Ymxpc2hLaXQ8Kj59fSBjb250ZXh0XG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVsnc3RhdHVzJ119IFt0YXJnZXRTdGF0dXNdXG4gKi9cbmNvbnN0IGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCA9IChjb250ZXh0LCB2YWx1ZSwgdGFyZ2V0U3RhdHVzID0gJ2xpdmUnKSA9PiB7XG4gIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gY29udGV4dDtcbiAgY29uc3QgeyB2YWx1ZUR1cmFiaWxpdHksIHN0YXR1cyB9ID0gc3RhdGU7XG4gIGlmIChzdGF0dXMgIT09ICdsaXZlJykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuICB9XG4gIGNvbnN0IGRvbmUgPSB0YXJnZXRTdGF0dXMgIT09ICdsaXZlJztcbiAgaWYgKGRvbmUgfHwgdmFsdWVEdXJhYmlsaXR5ID09PSAnbWFuZGF0b3J5Jykge1xuICAgIGNhbkJlRHVyYWJsZSh2YWx1ZSkgfHwgRmFpbGBDYW5ub3QgYWNjZXB0IG5vbi1kdXJhYmxlIHZhbHVlOiAke3ZhbHVlfWA7XG4gIH1cbiAgY29uc3QgeyB0YWlsUDogb2xkVGFpbFAsIHRhaWxSOiByZXNvbHZlT2xkVGFpbCB9ID1cbiAgICBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLCBmYWNldHMpO1xuICBhc3NlcnQudHlwZW9mKHJlc29sdmVPbGRUYWlsLCAnZnVuY3Rpb24nKTtcblxuICBjb25zdCBwdWJsaXNoQ291bnQgPSBzdGF0ZS5wdWJsaXNoQ291bnQgKyAxbjtcbiAgc3RhdGUucHVibGlzaENvdW50ID0gcHVibGlzaENvdW50O1xuXG4gIGxldCB0YWlsUDtcbiAgbGV0IHRhaWxSO1xuICBpZiAoZG9uZSkge1xuICAgIHN0YXRlLnN0YXR1cyA9IHRhcmdldFN0YXR1cztcbiAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgICB0YWlsUiA9IHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuICAgIHZvaWQgRS53aGVuKHRhaWxQLCBzaW5rLCBzaW5rKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50UDtcbiAgaWYgKHRhcmdldFN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICBzdGF0ZS5oYXNWYWx1ZSA9IHRydWU7XG4gICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICBjb25zdCByZWplY3Rpb24gPSBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuICAgIHJlc29sdmVPbGRUYWlsKHJlamVjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLyogUGVyc2lzdCBhIHRlcm1pbmFsIHZhbHVlLCBvciBhIG5vbi10ZXJtaW5hbCB2YWx1ZSovXG4gICAgLyogaWYgY29uZmlndXJlZCBhcyAnbWFuZGF0b3J5JyBvciAnb3Bwb3J0dW5pc3RpYycuKi9cbiAgICBpZiAoZG9uZSB8fCAodmFsdWVEdXJhYmlsaXR5ICE9PSAnaWdub3JlZCcgJiYgY2FuQmVEdXJhYmxlKHZhbHVlKSkpIHtcbiAgICAgIHN0YXRlLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIC8qIFJldGFpbiBhbnkgcHJvbWlzZSB3aXRoIG5vbi1kdXJhYmxlIHJlc29sdXRpb24uKi9cbiAgICAgIGN1cnJlbnRQID0gb2xkVGFpbFA7XG4gICAgfVxuXG4gICAgcmVzb2x2ZU9sZFRhaWwoXG4gICAgICBoYXJkZW4oe1xuICAgICAgICBoZWFkOiB7IHZhbHVlLCBkb25lIH0sXG4gICAgICAgIHB1Ymxpc2hDb3VudCxcbiAgICAgICAgdGFpbDogdGFpbFAsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChcbiAgICBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbiAgICBoYXJkZW4oeyBjdXJyZW50UCwgdGFpbFAsIHRhaWxSIH0pLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHJldHVybnMgezxUPihvcHRpb25zPzogUGFyYW1ldGVyczx0eXBlb2YgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGU+WzBdKSA9PiBQdWJsaXNoS2l0PFQ+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gKGJhZ2dhZ2UsIGtpbmROYW1lKSA9PiB7XG4gIC8qIFRPRE86IE9uY2Ugd2UgdW5pZnkgd2l0aCBtYWtlUHVibGlzaEtpdCwgd2Ugd2lsbCB1c2UgYSBab25lLWNvbXBhdGlibGUgd2VhayovXG4gIC8qIG1hcCBmb3IgbWVtb2l6YXRpb24uKi9cbiAgY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkID0gbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZDtcblxuICByZXR1cm4gcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgcHVibGlzaEtpdElLaXQsXG4gICAgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGUsXG4gICAge1xuICAgICAgLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuICAgICAgLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG4gICAgICBwdWJsaXNoZXI6IHtcbiAgICAgICAgcHVibGlzaCh2YWx1ZSkge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZpbmlzaChmaW5hbFZhbHVlKSB7XG4gICAgICAgICAgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsIGZpbmFsVmFsdWUsICdmaW5pc2hlZCcpO1xuICAgICAgICB9LFxuICAgICAgICBmYWlsKHJlYXNvbikge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCByZWFzb24sICdmYWlsZWQnKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8qIFRoZSBzdWJzY3JpYmVyIGZhY2V0IG9mIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCovXG4gICAgICAvKiBwcm9wYWdhdGVzIHZhbHVlcy4qL1xuICAgICAgc3Vic2NyaWJlcjoge1xuICAgICAgICBzdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQgPSAtMW4pIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdWJsaXNoQ291bnQ6IGN1cnJlbnRQdWJsaXNoQ291bnQgfSA9IHN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgY3VycmVudFAsIHRhaWxQIH0gPSBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBmYWNldHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocHVibGlzaENvdW50ID09PSBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFpbFA7XG4gICAgICAgICAgfSBlbHNlIGlmIChwdWJsaXNoQ291bnQgPCBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFAgfHwgcHJvdmlkZUN1cnJlbnRQKHN0YXRlLCBmYWNldHMsIHRhaWxQKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICdzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmYWNldHM6IHsgc3Vic2NyaWJlciB9LFxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBkYXRlQ291bnQgPSBCaWdJbnQodXBkYXRlQ291bnQpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzdWJzY3JpYmVyXG4gICAgICAgICAgICAgIC8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4gICAgICAgICAgICAgIC8qIGB1cGRhdGVDb3VudCArIDFgLCBldmVuIGlmIHNldmVyYWwgdXBkYXRlcyBhcmUgcHVibGlzaGVkIGluIHRoZSovXG4gICAgICAgICAgICAgIC8qIHNhbWUgY3JhbmsuLi4qL1xuICAgICAgICAgICAgICAuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4gICAgICAgICAgICAgIC8qIC4uLiBzbyB3ZSBwb2xsIHRoZSBsYXRlc3QgcHVibGlzaGVkIHVwZGF0ZSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbnkqL1xuICAgICAgICAgICAgICAvKiBmdXJ0aGVyIG9uZXMuKi9cbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhdGVTaGFwZTogRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlLFxuICAgIH0sXG4gICk7XG59OyRozY9fb25jZS5wcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcbmhhcmRlbihwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuXG4gICAgICAgY29uc3QgU3Vic2NyaWJlclNoYXBlID0gTS5yZW1vdGFibGUoJ1N1YnNjcmliZXInKTskaM2PX29uY2UuU3Vic2NyaWJlclNoYXBlKFN1YnNjcmliZXJTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaXNoZXJJIjpbIlB1Ymxpc2hlckkiXSwiVXBkYXRlQ291bnRTaGFwZSI6WyJVcGRhdGVDb3VudFNoYXBlIl0sIlN1YnNjcmliZXJJIjpbIlN1YnNjcmliZXJJIl0sInB1Ymxpc2hLaXRJS2l0IjpbInB1Ymxpc2hLaXRJS2l0Il0sIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLCJJdGVyYWJsZUVhY2hUb3BpY0kiOlsiSXRlcmFibGVFYWNoVG9waWNJIl0sIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIjpbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sIm1ha2VQdWJsaXNoS2l0IjpbIm1ha2VQdWJsaXNoS2l0Il0sInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCI6WyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSwiU3Vic2NyaWJlclNoYXBlIjpbIlN1YnNjcmliZXJTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAsSEQ3qgwAAKoMAAAuAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UsRSxGYXIsb2JzZXJ2ZU5vdGlmaWVyOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsWyRozY9fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsWyRozY9fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0Jhc2VOb3RpZmllciwgTm90aWZpZXJ9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7RVJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7U3RvcmVkRmFjZXQsIFN0b3JhZ2VOb2RlLCBVbnNlcmlhbGl6ZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7UGFzc2FibGVDYXB9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD4gJiBPbWl0PFN0b3JlZEZhY2V0LCAnZ2V0U3RvcmVLZXknPn0gU3RvcmVkTm90aWZpZXJcbiAqL1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkTm90aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGVDYXB9IFRcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZE5vdGlmaWVyPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVN0b3JlZE5vdGlmaWVyID0gKG5vdGlmaWVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBhc3NlcnRBbGxEZWZpbmVkKHsgbm90aWZpZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyIH0pO1xuXG4gIGNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlID0gbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcik7XG5cbiAgb2JzZXJ2ZU5vdGlmaWVyKG5vdGlmaWVyLCB7XG4gICAgdXBkYXRlU3RhdGUodmFsdWUpIHtcbiAgICAgIG1hcnNoYWxsVG9TdG9yYWdlKHZhbHVlKS5jYXRjaChyZWFzb24gPT5cbiAgICAgICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIHVwZGF0ZVN0YXRlJywgcmVhc29uKSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBmYWlsKHJlYXNvbikge1xuICAgICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLCByZWFzb24pO1xuICAgIH0sXG4gIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgaGFsdGVkIGl0ZXJhdGlvbicsIHJlYXNvbik7XG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7U3RvcmVkTm90aWZpZXI8VD59ICovXG4gIGNvbnN0IHN0b3JlZE5vdGlmaWVyID0gRmFyKCdTdG9yZWROb3RpZmllcicsIHtcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4gRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuICAgIGdldFBhdGg6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgfSk7XG4gIHJldHVybiBzdG9yZWROb3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VTdG9yZWROb3RpZmllcihtYWtlU3RvcmVkTm90aWZpZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0b3JlZE5vdGlmaWVyIjpbIm1ha2VTdG9yZWROb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB65k5eJCYAACQmAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3Jlc3ViLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiLCJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixtYWtlTWFyc2hhbCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Usb2JzZXJ2ZUl0ZXJhdGlvbixtYWtlUHVibGlzaEtpdCxtYWtlU3Vic2NyaXB0aW9uS2l0LHN1YnNjcmliZUVhY2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIixbJGjNj19hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLFskaM2PX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsWyRozY9fYSA9PiAobWFrZVN1YnNjcmlwdGlvbktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgUHVibGljYXRpb25SZWNvcmQsIFB1Ymxpc2hlciwgUHVibGlzaEtpdCwgU3RvcmVkUHVibGlzaEtpdCwgU3RvcmVkU3Vic2NyaXB0aW9uLCBTdG9yZWRTdWJzY3JpYmVyLCBTdWJzY3JpYmVyLCBTdWJzY3JpcHRpb24sIFVwZGF0ZVJlY29yZH0gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1N0b3JhZ2VOb2RlLCBVbnNlcmlhbGl6ZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlQ2FwfSBmcm9tICdAZW5kby9tYXJzaGFsJztcbiAqL1xuXG4vKipcbiAqIE5COiBkb2VzIG5vdCB5ZXQgc3Vydml2ZSB1cGdyYWRlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjg5M1xuICpcbiAqIEBhbHBoYVxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHsodjogVCkgPT4gdm9pZH0gY29uc3VtZVZhbHVlXG4gKi9cbiAgICAgICBjb25zdCBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQgPSBhc3luYyAoc3Vic2NyaWJlciwgY29uc3VtZVZhbHVlKSA9PiB7XG4gIC8qIFdlIG9wZW4tY29kZSB0aGUgZm9yLWF3YWl0LW9mIGltcGxlbWVudGF0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoYXQgc3ludGF4Ki9cbiAgLyogZGlyZWN0bHkgYmVjYXVzZSB3ZSB3YW50IHRvIHJ1biB0aGUgY29uc3VtZXIgb24gdGhlIGRvbmUgdmFsdWUgYXMgd2VsbC4qL1xuICBjb25zdCBpdGVyYXRvciA9IHN1YnNjcmliZUVhY2goc3Vic2NyaWJlcilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gIGF3YWl0IG51bGw7XG4gIHdoaWxlICghZmluaXNoZWQpIHtcbiAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbiAgICBmaW5pc2hlZCA9ICEhZG9uZTtcbiAgfVxufTtcblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmliZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGVDYXB9IFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fVxuICovJGjNj19vbmNlLmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRTdWJzY3JpYmVyID0gKHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGFzc2VydEFsbERlZmluZWQoeyBzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciB9KTtcblxuICBjb25zdCBtYXJzaGFsbFRvU3RvcmFnZSA9IG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpO1xuXG4gIC8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuICBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlciwgbWFyc2hhbGxUb1N0b3JhZ2UpLmNhdGNoKGVyciA9PiB7XG4gICAgLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4gICAgLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTc2NiNkaXNjdXNzaW9uX3I5MjI0OTgwODgqL1xuICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLCBlcnIpO1xuICB9KTtcblxuICAvKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICB9KTtcblxuICAvKiogQHR5cGUge1N0b3JlZFN1YnNjcmliZXI8VD59ICovXG4gIGNvbnN0IHN0b3Jlc3ViID0gRmFyKCdTdG9yZWRTdWJzY3JpYmVyJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiBwdWJsaXNoQ291bnQgPT4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuICAgIGdldFVwZGF0ZVNpbmNlOiB1cGRhdGVDb3VudCA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgICBnZXRQYXRoOiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG4gICAgZ2V0U3RvcmVLZXk6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG4gICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiB1bnNlcmlhbGl6ZXIsXG4gIH0pO1xuICByZXR1cm4gc3RvcmVzdWI7XG59O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkU3Vic2NyaWJlclxuICpcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCB0aGUgaXRlcmF0aW9uIHdpbGwgYmUgdGVybWluYXRlZC5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPiB8IG51bGx9IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn1cbiAqLyRozY9fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFN1YnNjcmlwdGlvbiA9IChcbiAgc3Vic2NyaXB0aW9uLFxuICBzdG9yYWdlTm9kZSxcbiAgbWFyc2hhbGxlciA9IG1ha2VNYXJzaGFsKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG4gICAgbWFyc2hhbFNhdmVFcnJvcjogKCkgPT4ge30sXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pLFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG4gIGxldCBwdWJsaXNoRmFpbGVkID0gZmFsc2U7XG4gIGxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG4gIGNvbnN0IGZhaWwgPSBlcnIgPT4ge1xuICAgIHB1Ymxpc2hGYWlsZWQgPSB0cnVlO1xuICAgIHB1Ymxpc2hFeGNlcHRpb24gPSBlcnI7XG4gIH07XG5cbiAgLyogTXVzdCAqbm90KiBiZSBhbiBhc3luYyBmdW5jdGlvbiwgYmVjYXVzZSBpdCBzb21ldGltZXMgbXVzdCB0aHJvdyB0byBhYm9ydCovXG4gIC8qIHRoZSBpdGVyYXRpb24uKi9cbiAgY29uc3QgcHVibGlzaFZhbHVlID0gb2JqID0+IHtcbiAgICBhc3NlcnQoc3RvcmFnZU5vZGUpO1xuICAgIGlmIChwdWJsaXNoRmFpbGVkKSB7XG4gICAgICAvKiBUbyBwcm9wZXJseSBhYm9ydCB0aGUgaXRlcmF0aW9uLCB0aGlzIG11c3QgYmUgYSBzeW5jaHJvbm91cyBleGNlcHRpb24uKi9cbiAgICAgIHRocm93IHB1Ymxpc2hFeGNlcHRpb247XG4gICAgfVxuXG4gICAgLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbiAgICBFKG1hcnNoYWxsZXIpXG4gICAgICAudG9DYXBEYXRhKG9iailcbiAgICAgIC50aGVuKHNlcmlhbGl6ZWQgPT4ge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG4gICAgICAgIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZmFpbCk7XG4gIH07XG5cbiAgaWYgKHN0b3JhZ2VOb2RlKSB7XG4gICAgLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG4gICAgb2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpcHRpb24sIHtcbiAgICAgIHVwZGF0ZVN0YXRlOiBwdWJsaXNoVmFsdWUsXG4gICAgICBmaW5pc2g6IHB1Ymxpc2hWYWx1ZSxcbiAgICB9KS5jYXRjaChmYWlsKTtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuICBjb25zdCBzdG9yZXN1YiA9IEZhcignU3RvcmVkU3Vic2NyaXB0aW9uJywge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgZ2V0U3RvcmVLZXkgdHlwZSBkb2VzIG5vdCBoYXZlIGBzdWJzY3JpcHRpb25gKi9cbiAgICBnZXRTdG9yZUtleTogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzdG9yYWdlTm9kZSkge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgc3Vic2NyaXB0aW9uIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RvcmVLZXkgPSBhd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IC4uLnN0b3JlS2V5LCBzdWJzY3JpcHRpb24gfSk7XG4gICAgfSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgICBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczogKCkgPT5cbiAgICAgIHN1YnNjcmlwdGlvbi5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFscygpLFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbiAgICBzdWJzY3JpYmVBZnRlcjogcHVibGlzaENvdW50ID0+IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuICB9KTtcbiAgcmV0dXJuIHN0b3Jlc3ViO1xufTskaM2PX29uY2UubWFrZVN0b3JlZFN1YnNjcmlwdGlvbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkUHVibGlzaEtpdFxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hlcktpdFxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpcHRpb248VD59IHN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1Ymxpc2hlclxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW5jb21wYXRpYmxlIHdpdGggZHVyYWJpbGl0eTsgaW5zdGVhZCBoYW5kbGUgdnN0b3JhZ2UgZXBoZW1lcmFsbHkgb24gYSBkdXJhYmxlIFB1Ymxpc2hLaXRcbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT4gfCBudWxsfSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIsIGNoaWxkUGF0aCkgPT4ge1xuICBjb25zdCB7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfSA9IG1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuICBpZiAoc3RvcmFnZU5vZGUgJiYgY2hpbGRQYXRoKSB7XG4gICAgc3RvcmFnZU5vZGUgPSBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gIH1cblxuICAvKiB3cmFwIHRoZSBzdWJzY3JpcHRpb24gdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlLCByZXBlYXRpbmcgdG8gdGhpcyBgc3Vic2NyaWJlcmAqL1xuICBjb25zdCBzdWJzY3JpYmVyID0gbWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbiAgICBzdWJzY3JpcHRpb24sXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgbWFyc2hhbGxlcixcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHB1Ymxpc2hlcjogcHVibGljYXRpb24sXG4gICAgc3Vic2NyaWJlcixcbiAgfTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW5jb21wYXRpYmxlIHdpdGggZHVyYWJpbGl0eTsgaW5zdGVhZCBoYW5kbGUgdnN0b3JhZ2UgZXBoZW1lcmFsbHkgb24gYSBkdXJhYmxlIFB1Ymxpc2hLaXRcbiAqXG4gKiBMaWtlIG1ha2VQdWJsaXNoS2l0IHRoaXMgbWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogV2hhdCdzIGRpZmZlcmVudCBpcyBgc3Vic2NyaWJlcmAgdGVlcyByZWNvcmRzLCB3cml0aW5nIG91dCB0byBzdG9yYWdlTm9kZS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRozY9fb25jZS5tYWtlU3RvcmVkUHVibGlzaGVyS2l0KG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRQdWJsaXNoS2l0ID0gKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyLFxuICAgIC8qIHdyYXAgdGhlIHN1YnNjcmliZXIgdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlKi9cbiAgICBzdWJzY3JpYmVyOiBtYWtlU3RvcmVkU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciksXG4gIH07XG59OyRozY9fb25jZS5tYWtlU3RvcmVkUHVibGlzaEtpdChtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGQOvXzyKQAA8ikAACgAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyJdLCJleHBvcnRzIjpbInN1YnNjcmliZSIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLEZhaWwsYW5ub3RhdGVFcnJvcixFLEZhcixpc1ByaW1pdGl2ZSxpc1VwZ3JhZGVEaXNjb25uZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsWyRozY9fYSA9PiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0l0ZXJhdGlvbk9ic2VydmVyLCBMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBQdWJsaWNhdGlvblJlY29yZCwgUHVibGlzaGVyLCBQdWJsaXNoS2l0LCBTdG9yZWRQdWJsaXNoS2l0LCBTdG9yZWRTdWJzY3JpcHRpb24sIFN0b3JlZFN1YnNjcmliZXIsIFN1YnNjcmliZXIsIFN1YnNjcmlwdGlvbiwgVXBkYXRlUmVjb3JkLCBFYWNoVG9waWMsIEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHNpbmsgPSAoKSA9PiB7fTtcblxuLyoqXG4gKiBDaGVjayB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGZvciByZWplY3Rpb24gYnkgdmF0IHVwZ3JhZGUsXG4gKiBhbmQgcmVmZXRjaCB1cG9uIGVuY291bnRlcmluZyB0aGF0IGNvbmRpdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBFUmVmPFQ+fSBnZXR0ZXJcbiAqIEBwYXJhbSB7RVJlZjxUPltdfSBbc2VlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fVxuICovXG5jb25zdCByZWNvbm5lY3RBc05lZWRlZCA9IGFzeW5jIChnZXR0ZXIsIHNlZWQgPSBbXSkgPT4ge1xuICBsZXQgZGlzY29ubmVjdGlvbjtcbiAgbGV0IGxhc3RWZXJzaW9uID0gLUluZmluaXR5O1xuICAvKiBFbmQgc3luY2hyb25vdXMgcHJlbHVkZS4qL1xuICBhd2FpdCBudWxsO1xuICBmb3IgKGxldCBpID0gMDsgOyBpICs9IDEpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0UCA9IGkgPCBzZWVkLmxlbmd0aCA/IHNlZWRbaV0gOiBnZXR0ZXIoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24oZXJyKSkge1xuICAgICAgICBpZiAoIWRpc2Nvbm5lY3Rpb24pIHtcbiAgICAgICAgICBkaXNjb25uZWN0aW9uID0gZXJyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaW5jYXJuYXRpb25OdW1iZXI6IHZlcnNpb24gfSA9IGVycjtcbiAgICAgICAgaWYgKHZlcnNpb24gPiBsYXN0VmVyc2lvbikge1xuICAgICAgICAgIC8qIFdlIGRvbid0IGV4cGVjdCBhbm90aGVyIHVwZ3JhZGUgaW4gYmV0d2VlbiByZWNlaXZpbmcqL1xuICAgICAgICAgIC8qIGEgZGlzY29ubmVjdGlvbiBhbmQgcmUtcmVxdWVzdGluZyBhbiB1cGRhdGUsIGJ1dCBtdXN0Ki9cbiAgICAgICAgICAvKiBuZXZlcnRoZWxlc3MgYmUgcHJlcGFyZWQgZm9yIHRoYXQuKi9cbiAgICAgICAgICBsYXN0VmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIGlmIGBlcnJgIGlzIGFuIChFcnJvcikgb2JqZWN0LCB3ZSBjYW4gdHJ5IHRvIGFzc29jaWF0ZSBpdCB3aXRoKi9cbiAgICAgIC8qIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaXNjb25uZWN0aW9uIHRoYXQgcHJvbXB0ZWQgdGhlIHJlcXVlc3QqL1xuICAgICAgLyogZm9yIHdoaWNoIGl0IGlzIGEgcmVzdWx0LiovXG4gICAgICBpZiAoIWlzUHJpbWl0aXZlKGVycikgJiYgZGlzY29ubmVjdGlvbiAmJiBkaXNjb25uZWN0aW9uICE9PSBlcnIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhbm5vdGF0ZUVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgWGBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBkaXNjb25uZWN0aW9uOiAke2Rpc2Nvbm5lY3Rpb259YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgLyogbm9vcCovXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgbmVhciBpdGVyYWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcG90ZW50aWFsbHkgZmFyIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGVJdGVyYXRvcjxUPj59IGl0UFxuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlID0gaXRQID0+XG4gIEZhcignQXN5bmNJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBpdCA9IEUoaXRQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IHNlbGYgPSBGYXIoJ0FzeW5jSXRlcmFibGVJdGVyYXRvcicsIHtcbiAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc2VsZixcbiAgICAgICAgbmV4dDogYXN5bmMgKCkgPT4gRShpdCkubmV4dCgpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuICB9KTtcblxuLyoqXG4gKiBBc3luY3Jvbm91c2x5IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGEgUHVibGljYXRpb25SZWNvcmQgY2hhaW4gYXMgdGhleVxuICogYXBwZWFyLiAgVGhpcyBpdGVyYXRpb24gbXVzdCBkcm9wIHBhcnRzIG9mIHB1YmxpY2F0aW9uIHJlY29yZHMgdGhhdCBhcmUgbm9cbiAqIGxvbmdlciBuZWVkZWQgc28gdGhleSBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gbmV4dENlbGxQXG4gKiAgIFB1YmxpY2F0aW9uUmVjb3JkIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgZmlyc3QgaXRlcmF0aW9uIHJlc3VsdFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovJGjNj19vbmNlLnN1YnNjcmliZShzdWJzY3JpYmUpO1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvciA9ICh0b3BpYywgbmV4dENlbGxQKSA9PiB7XG4gIC8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbiAgLyogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDA0MTIyMjUwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPXN0cmF3bWFuOmNvbmN1cnJlbmN5I2luZmluaXRlX3F1ZXVlKi9cbiAgY29uc3Qgc2VsZiA9IEZhcignRWFjaEl0ZXJhdG9yJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgbmV4dDogKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBoZWFkOiByZXN1bHRQLFxuICAgICAgICBwdWJsaXNoQ291bnQ6IHB1Ymxpc2hDb3VudFAsXG4gICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgfSA9IEUuZ2V0KG5leHRDZWxsUCk7XG5cbiAgICAgIC8qIElmIHRhaWxQIGlzIGJyb2tlbiBieSB1cGdyYWRlLCB3ZSB3aWxsIG5lZWQgdG8gcmUtcmVxdWVzdCBpdCovXG4gICAgICAvKiBkaXJlY3RseSBmcm9tIGB0b3BpY2AuKi9cbiAgICAgIGNvbnN0IGdldFN1Y2Nlc3NvciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHVibGlzaENvdW50ID0gYXdhaXQgcHVibGlzaENvdW50UDtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsICdiaWdpbnQnKTtcbiAgICAgICAgY29uc3Qgc3VjY2Vzc29yID0gYXdhaXQgRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiAgICAgICAgY29uc3QgbmV3UHVibGlzaENvdW50ID0gc3VjY2Vzc29yLnB1Ymxpc2hDb3VudDtcbiAgICAgICAgaWYgKG5ld1B1Ymxpc2hDb3VudCAhPT0gcHVibGlzaENvdW50ICsgMW4pIHtcbiAgICAgICAgICBGYWlsYGVhY2hJdGVyYXRvciBicm9rZW4gYnkgZ2FwIGZyb20gcHVibGlzaENvdW50ICR7cHVibGlzaENvdW50fSB0byAke25ld1B1Ymxpc2hDb3VudH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZXNzb3I7XG4gICAgICB9O1xuXG4gICAgICAvKiBSZXBsYWNlIG5leHRDZWxsUCBvbiBldmVyeSBjYWxsIHRvIG5leHQoKSBzbyB0aGluZ3Mgd29yayBldmVuKi9cbiAgICAgIC8qIHdpdGggYW4gZWFnZXIgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhaXQgZm9yIHJlc3VsdHMgdG8gc2V0dGxlLiovXG4gICAgICBuZXh0Q2VsbFAgPSByZWNvbm5lY3RBc05lZWRlZChnZXRTdWNjZXNzb3IsIFt0YWlsUF0pO1xuXG4gICAgICAvKiBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uIHdhcm5pbmdzIGhlcmUgaWYgdGhlIHByZXZpb3VzIGNlbGwgd2FzIHJlamVjdGVkIG9yKi9cbiAgICAgIC8qIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcmVxdWVzdCBvZiB0aGlzIGl0ZXJhdG9yLiovXG4gICAgICAvKiBgdGFpbFBgIGlzIGhhbmRsZWQgaW5zaWRlIGByZWNvbm5lY3RBc05lZWRlZGAgYW5kIGByZXN1bHRQYCBpcyB0aGUgY2FsbGVyJ3MqL1xuICAgICAgLyogY29uY2VybiwgbGVhdmluZyBvbmx5IGBwdWJsaXNoQ291bnRQYCBhbmQgdGhlIG5ldyBgbmV4dENlbGxQYC4qL1xuICAgICAgdm9pZCBFLndoZW4ocHVibGlzaENvdW50UCwgc2luaywgc2luayk7XG4gICAgICB2b2lkIEUud2hlbihuZXh0Q2VsbFAsIHNpbmssIHNpbmspO1xuICAgICAgcmV0dXJuIHJlc3VsdFA7XG4gICAgfSxcbiAgICBmb3JrOiAoKSA9PiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLCBuZXh0Q2VsbFApLFxuICB9KTtcbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcInByZWZpeCBsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJwcmVmaXggbG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBldmVyeXRoaW5nIHB1Ymxpc2hlZCBiZWZvcmVcbiAqIHlvdSBhc2sgdGhlIHJldHVybmVkIGl0ZXJhYmxlIGZvciBhbiBpdGVyYXRvci4gQnV0IHRoZSByZXR1cm5lZCBpdGVyYXRvclxuICogd2lsbCBlbnVtZXJhdGUgZWFjaCB0aGluZyBwdWJsaXNoZWQgZnJvbSB0aGF0IGl0ZXJhdG9yJ3Mgc3RhcnRpbmcgcG9pbnRcbiAqIHVwIHRvIGEgZGlzY29ubmVjdGlvbiByZXN1bHQgaW5kaWNhdGluZyB1cGdyYWRlIG9mIHRoZSBwcm9kdWNlclxuICogKHdoaWNoIGJyZWFrcyB0aGUgZ2FwLWZyZWUgZ3VhcmFudGVlIGFuZCB0aGVyZWZvcmUgdGVybWluYXRlcyBhbnkgYWN0aXZlXG4gKiBpdGVyYXRvciB3aGlsZSBzdGlsbCBzdXBwb3J0aW5nIGNyZWF0aW9uIG9mIG5ldyBpdGVyYXRvcnMpLlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkLCB0aGF0IHRlcm1pbmFsIHZhbHVlIHdpbGwgYmVcbiAqIHJlcG9ydGVkIGxvc3NsZXNzbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlRWFjaCA9IHRvcGljID0+IHtcbiAgY29uc3QgaXRlcmFibGUgPSBGYXIoJ0VhY2hJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdENlbGxQID0gcmVjb25uZWN0QXNOZWVkZWQoKCkgPT4gRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIoKSk7XG4gICAgICByZXR1cm4gbWFrZUVhY2hJdGVyYXRvcih0b3BpYywgZmlyc3RDZWxsUCk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcGFyYW0ge2JpZ2ludH0gW2xvY2FsVXBkYXRlQ291bnRdXG4gKiBAcGFyYW0ge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PFQ+fSBbdGVybWluYWxSZXN1bHRdXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi9cbmNvbnN0IGNsb25lTGF0ZXN0SXRlcmF0b3IgPSAodG9waWMsIGxvY2FsVXBkYXRlQ291bnQsIHRlcm1pbmFsUmVzdWx0KSA9PiB7XG4gIGxldCBtdXRleCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICogUmVxdWVzdCB0aGUgbmV4dCB1cGRhdGUgcmVjb3JkIGZyb20gdGhlIHRvcGljLCB1cGRhdGluZyBvdXIgbG9jYWwgc3RhdGUsXG4gKiBhbmQgY29udmVydCBpdCB0byBhbiBpdGVyYXRvciByZXN1bHQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVD4+fVxuICovXG4gIGNvbnN0IG1heWJlUmVxdWVzdE5leHRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRlcm1pbmFsUmVzdWx0KSB7XG4gICAgICAvKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0IHJlc3VsdCovXG4gICAgICAvKiB3aXRob3V0IGZ1cnRoZXIgcmVxdWVzdHMuKi9cbiAgICAgIHJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiAgICB9XG5cbiAgICAvKiBTZW5kIHRoZSBuZXh0IHJlcXVlc3Qgbm93LCBza2lwcGluZyBwYXN0IGludGVybWVkaWF0ZSB1cGRhdGVzKi9cbiAgICAvKiBhbmQgdXBncmFkZSBkaXNjb25uZWN0aW9ucy4qL1xuICAgIGNvbnN0IHsgdmFsdWUsIHVwZGF0ZUNvdW50IH0gPSBhd2FpdCByZWNvbm5lY3RBc05lZWRlZCgoKSA9PlxuICAgICAgRSh0b3BpYykuZ2V0VXBkYXRlU2luY2UobG9jYWxVcGRhdGVDb3VudCksXG4gICAgKTtcbiAgICAvKiBNYWtlIHN1cmUgdGhlIG5leHQgcmVxdWVzdCBpcyBmb3IgYSBmcmVzaGVyIHZhbHVlLiovXG4gICAgbG9jYWxVcGRhdGVDb3VudCA9IHVwZGF0ZUNvdW50O1xuXG4gICAgLyogTWFrZSBhbiBJdGVyYXRvclJlc3VsdC4qL1xuICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXJtaW5hbFJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlIH0pO1xuICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNlbGYgPSBGYXIoJ0xhdGVzdEl0ZXJhdG9yJywge1xuICAgIGZvcms6ICgpID0+IGNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMsIGxvY2FsVXBkYXRlQ291bnQsIHRlcm1pbmFsUmVzdWx0KSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgIG5leHQ6IGFzeW5jICgpID0+IHtcbiAgICAgIC8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4gdW5yZXNvbHZlZCovXG4gICAgICAvKiBwcm9taXNlLCBmdXJ0aGVyIGBuZXh0KClgIGNhbGxzIHdpbGwgYWxzbyByZXR1cm4gdW5yZXNvbHZlZCBwcm9taXNlcyovXG4gICAgICAvKiBidXQgZWFjaCBjYWxsIHdpbGwgbm90IHRyaWdnZXIgYW5vdGhlciBgdG9waWNgIHJlcXVlc3QgdW50aWwgdGhlIHByaW9yKi9cbiAgICAgIC8qIG9uZSBoYXMgc2V0dGxlZC4qL1xuICAgICAgLyoqL1xuICAgICAgLyogVGhpcyBsaW5lYXIgcXVldWVpbmcgYmVoYXZpb3IgaXMgb25seSBuZWVkZWQgZm9yIGNvZGUgdGhhdCB1c2VzIHRoZSovXG4gICAgICAvKiBhc3luYyBpdGVyYXRvciBwcm90b2NvbCBleHBsaWNpdGx5LiBXaGVuIHRoaXMgYXN5bmMgaXRlcmF0b3IgaXMqL1xuICAgICAgLyogY29uc3VtZWQgYnkgYSBmb3IvYXdhaXQvb2YgbG9vcCwgYG5leHQoKWAgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUqL1xuICAgICAgLyogcHJvbWlzZSBmb3IgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiByZXN1bHQgaGFzIGZ1bGZpbGxlZC4gSWYgaXQgZnVsZmlsbHMqL1xuICAgICAgLyogd2l0aCBgZG9uZTogdHJ1ZWAsIHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB3aWxsIG5ldmVyIGNhbGwgYG5leHQoKWAqL1xuICAgICAgLyogYWdhaW4uKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFNlZSovXG4gICAgICAvKiBodHRwczovLzJhbGl0eS5jb20vMjAxNi8xMC9hc3luY2hyb25vdXMtaXRlcmF0aW9uLmh0bWwjcXVldWluZy1uZXh0KCktaW52b2NhdGlvbnMqL1xuICAgICAgLyogZm9yIGFuIGV4cGxpY2l0IHVzZSB0aGF0IHNlbmRzIGBuZXh0KClgIHdpdGhvdXQgd2FpdGluZy4qL1xuXG4gICAgICBpZiAodGVybWluYWxSZXN1bHQpIHtcbiAgICAgICAgLyogV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB0b3BpYywganVzdCBrZWVwIHJldHVybmluZyB0aGUgbGFzdCovXG4gICAgICAgIC8qIHJlc3VsdC4qL1xuICAgICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8qIEJFR0lOIENSSVRJQ0FMIFNFQ1RJT04gLSBzeW5jaHJvbm91c2x5IGVucXVldWUgYW5kIHJlYXNzaWduIGBtdXRleGAqL1xuICAgICAgLyoqL1xuICAgICAgLyogVXNlIGBtdXRleGAgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSBubyBtb3JlIHRoYW4gYSBzaW5nbGUgcmVxdWVzdCBpbiovXG4gICAgICAvKiBmbGlnaHQuKi9cbiAgICAgIGNvbnN0IG5leHRSZXN1bHQgPSBtdXRleC50aGVuKG1heWJlUmVxdWVzdE5leHRSZXN1bHQpO1xuICAgICAgbXV0ZXggPSBuZXh0UmVzdWx0LnRoZW4oc2luaywgc2luayk7XG4gICAgICAvKiBFTkQgQ1JJVElDQUwgU0VDVElPTiovXG5cbiAgICAgIHJldHVybiBuZXh0UmVzdWx0O1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi9cbmNvbnN0IG1ha2VMYXRlc3RJdGVyYXRvciA9IHRvcGljID0+IGNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMpO1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcImxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcImxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgYW55IHB1Ymxpc2hlZCBzdGF0ZSBpZiBhIG1vcmVcbiAqIHJlY2VudCBwdWJsaXNoZWQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQgYnkgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXIsXG4gKiBpdCB3aWxsIGJlIHJlLXJlcXVlc3RlZC4gQWxsIG90aGVyIHRlcm1pbmFsIHZhbHVlcyB3aWxsIGJlIGxvc3NsZXNzbHlcbiAqIHByb3BhZ2F0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKi9cbiAgICAgICBjb25zdCBzdWJzY3JpYmVMYXRlc3QgPSB0b3BpYyA9PiB7XG4gIGNvbnN0IGl0ZXJhYmxlID0gRmFyKCdMYXRlc3RJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBtYWtlTGF0ZXN0SXRlcmF0b3IodG9waWMpLFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2Uuc3Vic2NyaWJlTGF0ZXN0KHN1YnNjcmliZUxhdGVzdCk7XG5oYXJkZW4oc3Vic2NyaWJlTGF0ZXN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZSI6WyJzdWJzY3JpYmUiXSwic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIl0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAV6oEkSkNAAApDQAAKQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vc3Vic2NyaWJlLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vdG9waWMuanMiXSwiZXhwb3J0cyI6WyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsRmFyLHN1YnNjcmliZUVhY2gsbWFrZVB1Ymxpc2hLaXQsbWFrZVBpbm5lZEhpc3RvcnlUb3BpYzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIixbJGjNj19hID0+IChzdWJzY3JpYmVFYWNoID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vdG9waWMuanNcIiwgW1tcIm1ha2VQaW5uZWRIaXN0b3J5VG9waWNcIixbJGjNj19hID0+IChtYWtlUGlubmVkSGlzdG9yeVRvcGljID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RWFjaFRvcGljLCBJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgU3Vic2NyaXB0aW9uUmVjb3JkLCBQdWJsaXNoZXIsIFB1Ymxpc2hLaXQsIFN0b3JlZFB1Ymxpc2hLaXQsIFN0b3JlZFN1YnNjcmlwdGlvbiwgU3RvcmVkU3Vic2NyaWJlciwgU3Vic2NyaWJlciwgU3Vic2NyaXB0aW9uLCBVcGRhdGVSZWNvcmR9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uID0gdG9waWMgPT4ge1xuICBjb25zdCBzdWJzY3JpcHRpb24gPSBGYXIoJ1N1YnNjcmlwdGlvbicsIHtcbiAgICAuLi5zdWJzY3JpYmVFYWNoKHRvcGljKSxcbiAgICBzdWJzY3JpYmVBZnRlcjogYXN5bmMgcHVibGlzaENvdW50ID0+IEUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5cbiAgICAvKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBTdWJzY3JpcHRpb24gZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIFN1YnNjcmlwdGlvbiB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlU3Vic2NyaXB0aW9uYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIFN1YnNjcmlwdGlvbiBhdCB0aGF0IHNpdGUuXG4gKi9cbiAgICBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczogYXN5bmMgKCkgPT4gdG9waWMsXG5cbiAgICBnZXRTdG9yZUtleTogKCkgPT4gaGFyZGVuKHsgc3Vic2NyaXB0aW9uIH0pLFxuICB9KTtcbiAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbn07JGjNj19vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBQcm9kdWNlcnMgc2hvdWxkIHVzZVxuICogYGBganNcbiAqIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuICogY29uc3QgdG9waWMgPSBtYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuICogYGBgXG4gKiBpbnN0ZWFkLCB3aGljaCBtYWtlcyBpdCBjbGVhcmVyIHRoYXQgYWxsIHRoZSBzdWJzY3JpYmVyJ3MgaGlzdG9yeSBpc1xuICogcmV0YWluZWQsIHByZXZlbnRpbmcgR0MuICBQb3RlbnRpYWxseSByZW1vdGUgY29uc3VtZXJzIHVzZVxuICogYGBganNcbiAqIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2Ygc3Vic2NyaWJlRWFjaCh0b3BpYykpIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0ID0gKCkgPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICAvKiBUaGUgcHVibGlzaCBraXQgc3Vic2NyaWJlciBpcyBwcmVmaXgtbG9zc3ksIHNvIG1ha2luZyAqdGhpcyogc3Vic2NyaWJlciBjb21wbGV0ZWx5Ki9cbiAgLyogbG9zc2xlc3MgZnJvbSBpbml0aWFsaXNhdGlvbiByZXF1aXJlcyBwaW5uaW5nIHRoZSBmb3JtZXIncyBoaXN0b3J5LiovXG5cbiAgY29uc3QgcGlubmVkSGlzdG9yeVRvcGljID0gbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbWFrZVN1YnNjcmlwdGlvbihwaW5uZWRIaXN0b3J5VG9waWMpO1xuXG4gIC8qKiBAdHlwZSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59ICovXG4gIGNvbnN0IHB1YmxpY2F0aW9uID0gRmFyKCdwdWJsaWNhdGlvbicsIHtcbiAgICB1cGRhdGVTdGF0ZTogbm9uRmluYWxWYWx1ZSA9PiBwdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbiAgICBmaW5pc2g6IGNvbXBsZXRpb24gPT4gcHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbiAgICBmYWlsOiByZWFzb24gPT4gcHVibGlzaGVyLmZhaWwocmVhc29uKSxcbiAgfSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfSk7XG59OyRozY9fb25jZS5tYWtlU3Vic2NyaXB0aW9uS2l0KG1ha2VTdWJzY3JpcHRpb25LaXQpO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb25LaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB35kpGlQYAAJUGAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VhY2hUb3BpYywgTGF0ZXN0VG9waWN9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBBIHBpbm5lZC1oaXN0b3J5IHRvcGljIHByZXNlcnZlcyBhbGwgb2YgaXRzIHB1Ymxpc2hlZCB2YWx1ZXMgaW5cbiAqIG1lbW9yeS4gIFVzZSBhIHByZWZpeC1sb3NzeSBtYWtlUHVibGlzaEtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VhY2hUb3BpYzxUPiAmIExhdGVzdFRvcGljPFQ+fSB0b3BpYyBuZWVkcyB0byBiZSBuZWFyIGluIG9yZGVyIHRvXG4gKiBwcmVzZXJ2ZSBzdWJzY3JpcHRpb24gdGltaW5ncy4gIFRPRE86IGRyb3AgYExhdGVzdFRvcGljPFQ+YCByZXF1aXJlbWVudFxuICogQHJldHVybnMge0VhY2hUb3BpYzxUPiAmIExhdGVzdFRvcGljPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9IHRvcGljID0+IHtcbiAgLyogU3VjaCBsb3NzbGVzc25lc3MgaW5oaWJpdHMgR0MsIHdoaWNoIGlzIHdoeSB3ZSdyZSBtb3ZpbmcgYXdheSBmcm9tIGl0LiovXG5cbiAgLyogV2UgbmVlZCB0byB0YWtlIGFuIGltbWVkaWF0ZSBzbmFwc2hvdCBvZiB0aGUgdG9waWMncyBjdXJyZW50IHN0YXRlLiovXG4gIGNvbnN0IHBpbm5lZFB1Ykxpc3QgPSB0b3BpYy5zdWJzY3JpYmVBZnRlcigpO1xuXG4gIHJldHVybiBGYXIoJ1Bpbm5lZEhpc3RvcnlUb3BpYycsIHtcbiAgICBzdWJzY3JpYmVBZnRlcjogYXN5bmMgKHB1Ymxpc2hDb3VudCA9IC0xbikgPT4ge1xuICAgICAgaWYgKHB1Ymxpc2hDb3VudCA9PT0gLTFuKSB7XG4gICAgICAgIHJldHVybiBwaW5uZWRQdWJMaXN0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvcGljLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCk7XG4gICAgfSxcbiAgICBnZXRVcGRhdGVTaW5jZTogYXN5bmMgKHVwZGF0ZUNvdW50ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAvKiBUT0RPOiBCdWlsZCB0aGlzIG91dCBvZiBFYWNoVG9waWM8VD4uKi9cbiAgICAgIHJldHVybiB0b3BpYy5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlUGlubmVkSGlzdG9yeVRvcGljKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xuaGFyZGVuKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARxpyk0YOAABGDgAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIkBlbmRvL2V4byIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyIsIm11c3RNYXRjaCIsInByb3ZpZGVMYXp5IiwicHJvdmlkZUxhenkiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0eXBlbGVzc011c3RNYXRjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+ICh0eXBlbGVzc011c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtdXSxbXCJAZW5kby9leG9cIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogWFhYIEBhZ29yaWMvc3RvcmUgc2hvdWxkIG5vdCBkZXBlbmQgb24gQGFnb3JpYy9pbnRlcm5hbCovXG4vKiBUT0RPIG1vdmUgdG8gRW5kbyovXG4vKiogQHR5cGUge011c3RNYXRjaH0gKi9cbiAgICAgICBjb25zdCBtdXN0TWF0Y2ggPSB0eXBlbGVzc011c3RNYXRjaDskaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6W1sibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUF0b21pY1Byb3ZpZGVyIl0sWyJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5Il1dLCJAZW5kby9wYXR0ZXJucyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXSxbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl0sWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl0sWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il0sWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXSxbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdXSwiQGVuZG8vZXhvIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAD9JGLuILAADiCwAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0byBlYXNlIGFcbiAqIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsIGFuZCB3aWxsIGV2ZW50dWFsbHlcbiAqIGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydCBzb21lIG9mIHRoZSB1c2VzIG9mIHRoZSBvbGRcbiAqIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG5ldy4gVGhlIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGVcbiAqIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhbiBiZSB1c2VkIGFzIHZhbHVlcywgYW5kIG9ubHkga2V5cyAocm91Z2hseSxcbiAqIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcykgY2FuIGJlIHVzZWQgYXMgdmFsdWVzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC8zNTY3XG4gKlxuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqXG4gKiBgYGBqc1xuICogLy8gTGVnYWN5IGJlY2F1c2UuLi5cbiAqIGBgYFxuICpcbiAqIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgcHJvYmxlbSBpbmhpYml0aW5nIGNvbnZlcnNpb24gdG8gdGhlIG5ldyBzeXN0ZW0uIFNvbWVcbiAqIG9mIHRoZXNlIHByb2JsZW1zIGFzIG9mIHRoaXMgd3JpdGluZzpcbiAqXG4gKiAtIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3QgYSBwYXNzYWJsZS5cbiAqICAgU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnQgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGFcbiAqICAgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogLSBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLiBGcmVlemluZyB0aGVcbiAqICAgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVhayB0aGUgc3Vic2VxdWVudFxuICogICBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTGVnYWN5TWFwID0gKHRhZyA9ICdrZXknKSA9PiB7XG4gIGNvbnN0IG0gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICFtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAgbS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczoga2V5ID0+IHtcbiAgICAgIC8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbiAgICAgIC8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbiAgICAgIC8qIGluIHRoaXMgbWFwLiovXG4gICAgICByZXR1cm4gbS5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIG0uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICByZXR1cm4gbS5nZXQoa2V5KTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgbS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uZGVsZXRlKGtleSk7XG4gICAgfSxcbiAgICBrZXlzOiAoKSA9PiBtLmtleXMoKSxcbiAgICB2YWx1ZXM6ICgpID0+IG0udmFsdWVzKCksXG4gICAgZW50cmllczogKCkgPT4gbS5lbnRyaWVzKCksXG4gICAgZ2V0U2l6ZTogKCkgPT4gbS5zaXplLFxuICAgIGNsZWFyOiAoKSA9PiBtLmNsZWFyKCksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUxlZ2FjeU1hcChtYWtlTGVnYWN5TWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADbxEI1bQcAAG0HAAAwAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogU2VlIGRvY2NvbW1lbnQgaW4gdGhlIGNsb3NlbHkgcmVsYXRlZCBgbGVnYWN5TWFwLmpzYCBtb2R1bGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhcldlYWtNYXAgaWYgcG9zc2libGUsIFdlYWtNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUge1dlYWtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeVdlYWtNYXA8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTGVnYWN5V2Vha01hcCA9ICh0YWcgPSAna2V5JykgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59ICovXG4gIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0ID0ga2V5ID0+XG4gICAgIXdtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAgd20uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4gICAgICAvKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4gICAgICAvKiBpbiB0aGlzIG1hcC4qL1xuICAgICAgcmV0dXJuIHdtLmhhcyhrZXkpO1xuICAgIH0sXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICAvKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtWfSAqLyAod20uZ2V0KGtleSkpO1xuICAgIH0sXG4gICAgc2V0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICB3bS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIHdtLmRlbGV0ZShrZXkpO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUxlZ2FjeVdlYWtNYXAobWFrZUxlZ2FjeVdlYWtNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lXZWFrTWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANehQUbqGAAA6hgAADEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiLCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsWyRozY9fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIixbJGjNj19hID0+IChtYXBJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7S2V5LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtNYXBTdG9yZSwgTWFwU3RvcmVNZXRob2RzLCBTdG9yZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge01hcDxLLCBWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXVxuICogQHJldHVybnMge01hcFN0b3JlTWV0aG9kczxLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXBTdG9yZU1ldGhvZHMgPSAoXG4gIGpzbWFwLFxuICBhc3NlcnRLVk9rVG9BZGQsXG4gIGFzc2VydEtWT2tUb1NldCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgdGFnID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgeyBhc3NlcnRVcGRhdGVPbkFkZCwgYXNzZXJ0VXBkYXRlT25EZWxldGUsIGl0ZXJhYmxlS2V5cyB9ID1cbiAgICBtYWtlQ3VycmVudEtleXNLaXQoXG4gICAgICAoKSA9PiBqc21hcC5rZXlzKCksXG4gICAgICBrID0+IGpzbWFwLmhhcyhrKSxcbiAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgICAgIHRhZyxcbiAgICApO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuICBjb25zdCBrZXlzID0gKGtleVBhdHQsIHZhbHVlUGF0dCkgPT4ge1xuICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBpdGVyYWJsZUtleXM7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IGsgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgIT09IHVuZGVmaW5lZCAmJiAhbWF0Y2hlcyhrLCBrZXlQYXR0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiBVc2VzIHRoZSBjdXJyZW50IGpzbWFwIHZhbHVlLCBzaW5jZSB0aGUgaXRlcmF0YXRvciBzdXJ2aXZlcyBgLnNldGAqL1xuICAgICAgaWYgKHZhbHVlUGF0dCAhPT0gdW5kZWZpbmVkICYmICFtYXRjaGVzKGpzbWFwLmdldChrKSwgdmFsdWVQYXR0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsIGZpbHRlcik7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPFY+fVxuICovXG4gIGNvbnN0IHZhbHVlcyA9IChrZXlQYXR0LCB2YWx1ZVBhdHQpID0+XG4gICAgbWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpLCBrID0+IC8qKiBAdHlwZSB7Vn0gKi8gKGpzbWFwLmdldChrKSkpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSywgVl0+fVxuICovXG4gIGNvbnN0IGVudHJpZXMgPSAoa2V5UGF0dCwgdmFsdWVQYXR0KSA9PlxuICAgIG1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSwgayA9PiBbXG4gICAgICBrLFxuICAgICAgLyoqIEB0eXBlIHtWfSAqLyAoanNtYXAuZ2V0KGspKSxcbiAgICBdKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgLyoqIEB0eXBlIHsoazogSywgdjogVikgPT4gdm9pZH0gKi8gKGFzc2VydFVwZGF0ZU9uQWRkKSxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgICAgdGFnLFxuICAgICksXG4gICAga2V5cyxcbiAgICB2YWx1ZXMsXG4gICAgZW50cmllcyxcblxuICAgIHNuYXBzaG90OiAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LCB2YWx1ZVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBqc21hcC5zaXplXG4gICAgICAgIDogWy4uLmtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG4gICAgY2xlYXI6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAganNtYXAuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSkge1xuICAgICAgICBqc21hcC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvciByZWZlcmVuY2luZyBhXG4gKiBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCwgYHNldGAgYW5kXG4gKiBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgSz1hbnlcbiAqIEB0ZW1wbGF0ZSBWPWFueVxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGhlIGNvbHVtbiBuYW1lIGZvciB0aGUga2V5XG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SywgVj59XG4gKi8kaM2PX29uY2UubWFrZU1hcFN0b3JlTWV0aG9kcyhtYWtlTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyTWFwU3RvcmUgPSAoXG4gIHRhZyA9ICdrZXknLFxuICB7IGtleVNoYXBlLCB2YWx1ZVNoYXBlIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBqc21hcCA9IG5ldyBNYXAoKTtcbiAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiAgfVxuICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiAgfVxuXG4gIGNvbnN0IGFzc2VydEtWT2tUb1NldCA9IChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgIC8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbiAgICBoYXJkZW4odmFsdWUpO1xuXG4gICAgYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuICAgIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSwgJ21hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuXG4gICAgYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnbWFwU3RvcmUga2V5Jyk7XG4gICAgfVxuICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG4gICAgICBqc21hcCxcbiAgICAgIGFzc2VydEtWT2tUb0FkZCxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhZyxcbiAgICApLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmQkq1EREAABERAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIixbJGjNj19hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1NldFN0b3JlLCBTZXRTdG9yZU1ldGhvZHMsIFN0b3JlT3B0aW9uc30gZnJvbSAnLi4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmVNZXRob2RzPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVNldFN0b3JlTWV0aG9kcyA9IChcbiAganNzZXQsXG4gIGFzc2VydEtleU9rVG9BZGQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCB7IGFzc2VydFVwZGF0ZU9uQWRkLCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSwgaXRlcmFibGVLZXlzIH0gPVxuICAgIG1ha2VDdXJyZW50S2V5c0tpdChcbiAgICAgICgpID0+IGpzc2V0LmtleXMoKSxcbiAgICAgIGsgPT4ganNzZXQuaGFzKGspLFxuICAgICAgY29tcGFyZVJhbmssXG4gICAgICBhc3NlcnRLZXlPa1RvQWRkLFxuICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgICAgIGtleU5hbWUsXG4gICAgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbiAgY29uc3Qga2V5cyA9IGtleVBhdHQgPT5cbiAgICBrZXlQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgID8gaXRlcmFibGVLZXlzXG4gICAgICA6IGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cywgayA9PiBtYXRjaGVzKGssIGtleVBhdHQpKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzc2V0LFxuICAgICAgYXNzZXJ0VXBkYXRlT25BZGQsXG4gICAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICAgIGtleU5hbWUsXG4gICAgKSxcblxuICAgIGtleXMsXG5cbiAgICB2YWx1ZXM6IGtleXMsXG5cbiAgICBzbmFwc2hvdDogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+IG1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG4gICAgZ2V0U2l6ZTogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgPyBqc3NldC5zaXplIDogWy4uLmtleXMoa2V5UGF0dCldLmxlbmd0aCxcblxuICAgIGNsZWFyOiAoa2V5UGF0dCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBqc3NldC5jbGVhcigpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0KSkge1xuICAgICAgICBqc3NldC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvciByZWZlcmVuY2luZyBhXG4gKiBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCwgYHNldGAgYW5kXG4gKiBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRozY9fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJTZXRTdG9yZSA9ICh0YWcgPSAna2V5JywgeyBrZXlTaGFwZSB9ID0ge30pID0+IHtcbiAgY29uc3QganNzZXQgPSBuZXcgU2V0KCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLZXlPa1RvQWRkID0ga2V5ID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKGtleSk7XG5cbiAgICBhc3NlcnRTY2FsYXJLZXkoa2V5KTtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICdzZXRTdG9yZSBrZXknKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEZhcihgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhclNldFN0b3JlKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhclNldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPk186ftFgAA7RYAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weU1hcDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJpZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dLFtcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXl9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlLCBTdG9yZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssIFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAoXG4gIGpzbWFwLFxuICBhc3NlcnRLVk9rVG9BZGQsXG4gIGFzc2VydEtWT2tUb1NldCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSA9IHVuZGVmaW5lZCxcbiAga2V5TmFtZSA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICFqc21hcC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIGpzbWFwLmhhcyhrZXkpIHx8IEZhaWxgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuICAgICAgLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuICAgICAgLyogaW4gdGhpcyBtYXAuKi9cbiAgICAgIHJldHVybiBqc21hcC5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7Vn0gKi8gKGpzbWFwLmdldChrZXkpKTtcbiAgICB9LFxuXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgYXNzZXJ0S1ZPa1RvQWRkKGtleSwgdmFsdWUpO1xuICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBhc3NlcnRLVk9rVG9TZXQoa2V5LCB2YWx1ZSk7XG4gICAgICBqc21hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGlmIChhc3NlcnRLZXlPa1RvRGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAganNtYXAuZGVsZXRlKGtleSk7XG4gICAgfSxcblxuICAgIGFkZEFsbDogZW50cmllcyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGVudHJpZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGVudHJpZXMpICYmIGlzQ29weU1hcChlbnRyaWVzKSkge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYKi9cbiAgICAgICAgICBlbnRyaWVzID0gZ2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAvKiogQHR5cGUge0l0ZXJhYmxlPFtLLCBWXT59ICovIChlbnRyaWVzKSkge1xuICAgICAgICAvKiBEb24ndCBhc3NlcnQgdGhhdCB0aGUga2V5IGVpdGhlciBkb2VzIG9yIGRvZXMgbm90IGV4aXN0LiovXG4gICAgICAgIGFzc2VydEtWT2tUb0FkZChrZXksIHZhbHVlKTtcbiAgICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgX3NjYWxhcl8gbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLiBPdGhlciBtYXBTdG9yZXMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLFxuICogY29weUFycmF5cyBhbmQgY29weVJlY29yZHMgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mXG4gKiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dCBpdFxuICogc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlIHJlbW90YWJsZXMsXG4gKiBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlT2JqZWN0ICYgV2Vha01hcFN0b3JlPEssIFY+fVxuICovJGjNj19vbmNlLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gKFxuICB0YWcgPSAna2V5JyxcbiAgeyBsb25nTGl2ZWQgPSB0cnVlLCBrZXlTaGFwZSA9IHVuZGVmaW5lZCwgdmFsdWVTaGFwZSA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuICBjb25zdCBqc21hcCA9IGxvbmdMaXZlZCA/IG5ldyBXZWFrTWFwKCkgOiBuZXcgTWFwKCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cbiAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLVk9rVG9TZXQgPSAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKHZhbHVlKTtcblxuICAgIGFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbiAgICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUsICd3ZWFrTWFwU3RvcmUgdmFsdWUnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvQWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKGtleSk7XG4gICAgcGFzc1N0eWxlT2Yoa2V5KSA9PT0gJ3JlbW90YWJsZScgfHxcbiAgICAgIEZhaWxgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuICAgIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2goa2V5LCBrZXlTaGFwZSwgJ3dlYWtNYXBTdG9yZSBrZXknKTtcbiAgICB9XG4gICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuICAgICAganNtYXAsXG4gICAgICBhc3NlcnRLVk9rVG9BZGQsXG4gICAgICBhc3NlcnRLVk9rVG9TZXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0YWcsXG4gICAgKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJRapRtOEQAAThEAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLHBhc3NTdHlsZU9mLGdldENvcHlTZXRLZXlzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weVNldDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlTZXRcIixbJGjNj19hID0+IChpc0NvcHlTZXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5fSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtTdG9yZU9wdGlvbnMsIFdlYWtTZXRTdG9yZSwgV2Vha1NldFN0b3JlTWV0aG9kc30gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtXZWFrU2V0PEsgJiBvYmplY3Q+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlTWV0aG9kczxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gKFxuICBqc3NldCxcbiAgYXNzZXJ0S2V5T2tUb0FkZCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSA9IHVuZGVmaW5lZCxcbiAga2V5TmFtZSA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIGpzc2V0LmhhcyhrZXkpIHx8IEZhaWxgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuICAgICAgLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuICAgICAgLyogaW4gdGhpcyBzZXQuKi9cbiAgICAgIHJldHVybiBqc3NldC5oYXMoa2V5KTtcbiAgICB9LFxuXG4gICAgYWRkOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuICAgICAganNzZXQuYWRkKGtleSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGlmIChhc3NlcnRLZXlPa1RvRGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAganNzZXQuZGVsZXRlKGtleSk7XG4gICAgfSxcblxuICAgIGFkZEFsbDoga2V5cyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGtleXMpICYmIGlzQ29weVNldChrZXlzKSkge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYKi9cbiAgICAgICAgICBrZXlzID0gZ2V0Q29weVNldEtleXMoa2V5cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7a2V5c31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiAvKiogQHR5cGUge0l0ZXJhYmxlPEs+fSAqLyAoa2V5cykpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuICAgICAgICBqc3NldC5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIF9zY2FsYXJfIHNldCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlU2V0cyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrU2V0IGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrU2V0IGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0IGl0XG4gKiBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBzZXQuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGUgcmVtb3RhYmxlcyxcbiAqIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRozY9fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsgbG9uZ0xpdmVkID0gdHJ1ZSwga2V5U2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzc2V0ID0gbmV3IChsb25nTGl2ZWQgPyBXZWFrU2V0IDogU2V0KSgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S2V5T2tUb0FkZCA9IGtleSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICBGYWlsYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACqV+8u2xoAANsaAAAuAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhcHBlbmRUb1N0b3JlZEFycmF5IiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRmFyLGlzQ29weU1hcCxpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSksJGjNj19saXZlW1wiaXNDb3B5TWFwXCJdXV0sW1wiaXNDb3B5U2V0XCIsWyRozY9fYSA9PiAoaXNDb3B5U2V0ID0gJGjNj19hKSwkaM2PX2xpdmVbXCJpc0NvcHlTZXRcIl1dXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDdXJyZW50S2V5c0tpdFxuICogQHByb3BlcnR5IHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uQWRkXG4gKiBAcHJvcGVydHkgeyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkRlbGV0ZVxuICogQHByb3BlcnR5IHtJdGVyYWJsZTxLPn0gaXRlcmFibGVLZXlzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDdXJyZW50S2V5c0tpdCA9IChcbiAgZ2V0UmF3S2V5cyxcbiAgY2hlY2tIYXMsXG4gIGNvbXBhcmUsXG4gIGFzc2VydE9rVG9BZGQsXG4gIGFzc2VydE9rVG9EZWxldGUsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBsZXQgdXBkYXRlQ291bnQgPSAwO1xuICAvKiogQHR5cGUge0FycmF5PEs+IHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgc29ydGVkS2V5c01lbW87XG5cbiAgY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQgPSAoaywgdiA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFzc2VydE9rVG9BZGQoaywgdik7XG4gICAgdXBkYXRlQ291bnQgKz0gMTtcbiAgICBzb3J0ZWRLZXlzTWVtbyA9IHVuZGVmaW5lZDtcbiAgfTtcblxuICBjb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSA9IGsgPT4gYXNzZXJ0T2tUb0RlbGV0ZSAmJiBhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG4gIGNvbnN0IGdldFNvcnRlZEtleXMgPSAoKSA9PiB7XG4gICAgaWYgKHNvcnRlZEtleXNNZW1vID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNvcnRlZEtleXNNZW1vID0gaGFyZGVuKFsuLi5nZXRSYXdLZXlzKCldLnNvcnQoY29tcGFyZSkpO1xuICAgIH1cbiAgICByZXR1cm4gc29ydGVkS2V5c01lbW87XG4gIH07XG5cbiAgY29uc3QgaXRlcmFibGVLZXlzID0gRmFyKCdJdGVyYWJsZSBvZiBrZXlzJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBnZW5lcmF0aW9uID0gdXBkYXRlQ291bnQ7XG4gICAgICBnZXRTb3J0ZWRLZXlzKCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFRTIGRvZXNuJ3QgdHJhY2sgdGhhdCBzb3J0ZWRLZXlzTWVtbyBpcyBkZWZpbmVkKi9cbiAgICAgIGNvbnN0IGxlbiA9IHNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBnZW5lcmF0aW9uID09PSB1cGRhdGVDb3VudCB8fCBGYWlsYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYDtcbiAgICAgICAgICAvKiBJZiB0aGV5J3JlIGVxdWFsLCB0aGVuIHRoZSBzb3J0ZWRLZXlNZW1vIGlzIHRoZSBzYW1lIG9uZSovXG4gICAgICAgICAgLyogd2Ugc3RhcnRlZCB3aXRoLiovXG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUUyBkb2Vzbid0IHRyYWNrIHRoYXQgc29ydGVkS2V5c01lbW8gaXMgZGVmaW5lZCovXG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc29ydGVkS2V5c01lbW9baV07XG4gICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrSGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oLyoqIEB0eXBlIHtjb25zdH0gKi8gKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge2NvbnN0fSAqLyAoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGFzc2VydFVwZGF0ZU9uQWRkLFxuICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgIGl0ZXJhYmxlS2V5cyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQ3VycmVudEtleXNLaXQobWFrZUN1cnJlbnRLZXlzS2l0KTtcbmhhcmRlbihtYWtlQ3VycmVudEtleXNLaXQpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVMYXp5YCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuIElmIHRoZXJlXG4gKiBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSwgY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhc1xuICogdGhlIHZhbHVlIGZvciB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG4gICAgICAgY29uc3QgcHJvdmlkZUxhenkgPSAobWFwU3RvcmUsIGtleSwgbWFrZVZhbHVlKSA9PiB7XG4gIGlmICghbWFwU3RvcmUuaGFzKGtleSkpIHtcbiAgICBtYXBTdG9yZS5pbml0KGtleSwgbWFrZVZhbHVlKGtleSkpO1xuICB9XG4gIHJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbn07JGjNj19vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLiBGb3IgdHdvXG4gKiBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGUgb3RoZXIgY2FsbFxuICogc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZFxuICogdHJpZXMgdG8gc3RvcmUgdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseVxuICogc3RvcmluZyBhIFByb21pc2UgZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IHN0b3JlXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXRvbWljUHJvdmlkZXIgPSBzdG9yZSA9PiB7XG4gIC8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuICBjb25zdCBwZW5kaW5nID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIHdoZW5cbiAqIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yIHRoYXQga2V5LCBhbmQgcmV0dXJuXG4gKiBpdC5cbiAqXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBQcm9taXNlPFY+fSBtYWtlVmFsdWUgbWFrZSB0aGUgdmFsdWUgZm9yIHRoZSBzdG9yZSBpZlxuICogICBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqICAgb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG4gIGNvbnN0IHByb3ZpZGVBc3luYyA9IChrZXksIG1ha2VWYWx1ZSwgZmluaXNoVmFsdWUpID0+IHtcbiAgICBpZiAoc3RvcmUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RvcmUuZ2V0KGtleSkpO1xuICAgIH1cbiAgICBpZiAoIXBlbmRpbmcuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IHZhbFAgPSBtYWtlVmFsdWUoa2V5KVxuICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICBzdG9yZS5pbml0KGtleSwgdik7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICAgIGlmIChmaW5pc2hWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmlzaFZhbHVlKGtleSwgdikudGhlbigoKSA9PiB2KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBwZW5kaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgICB9KTtcbiAgICAgIHBlbmRpbmcuc2V0KGtleSwgdmFsUCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbFAgPSBwZW5kaW5nLmdldChrZXkpO1xuICAgIGFzc2VydCh2YWxQKTtcbiAgICByZXR1cm4gdmFsUDtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvdmlkZUFzeW5jIH0pO1xufTskaM2PX29uY2UubWFrZUF0b21pY1Byb3ZpZGVyKG1ha2VBdG9taWNQcm92aWRlcik7XG5oYXJkZW4obWFrZUF0b21pY1Byb3ZpZGVyKTtcbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7TWFwU3RvcmU8SywgVltdPn0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0ge1Z9IGl0ZW1cbiAqL1xuICAgICAgIGNvbnN0IGFwcGVuZFRvU3RvcmVkQXJyYXkgPSAobWFwU3RvcmUsIGtleSwgaXRlbSkgPT4ge1xuICBpZiAobWFwU3RvcmUuaGFzKGtleSkpIHtcbiAgICBjb25zdCBleHRhbnQgPSBtYXBTdG9yZS5nZXQoa2V5KTtcbiAgICBtYXBTdG9yZS5zZXQoa2V5LCBoYXJkZW4oWy4uLmV4dGFudCwgaXRlbV0pKTtcbiAgfSBlbHNlIHtcbiAgICBtYXBTdG9yZS5pbml0KGtleSwgaGFyZGVuKFtpdGVtXSkpO1xuICB9XG59OyRozY9fb25jZS5hcHBlbmRUb1N0b3JlZEFycmF5KGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xuaGFyZGVuKGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiaXNDb3B5TWFwIjpbImlzQ29weU1hcCIsZmFsc2VdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0IixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl0sImFwcGVuZFRvU3RvcmVkQXJyYXkiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO31mJswAgAAMAIAABwAAABAYWdvcmljL3RpbWUtdjAuMy4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvdGltZU1hdGguanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALQzbZQKJQAACiUAACMAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90aW1lTWF0aC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiVGltZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsRmFpbCxxLG11c3RNYXRjaCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRozY9fYSldXSxbXCJUaW1lc3RhbXBSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFJlY29yZFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZWxhdGl2ZVRpbWUsIFJlbGF0aXZlVGltZVZhbHVlLCBUaW1lckJyYW5kLCBUaW1lTWF0aFR5cGUsIFRpbWVzdGFtcCwgVGltZXN0YW1wUmVjb3JkLCBUaW1lc3RhbXBWYWx1ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtSYW5rQ29tcGFyaXNvbn0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKi9cblxuLyoqXG4gKiBgYWdyZWVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSBsZWZ0QnJhbmRcbiAqIEBwYXJhbSB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH0gcmlnaHRCcmFuZFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGFncmVlZFRpbWVyQnJhbmQgPSAobGVmdEJyYW5kLCByaWdodEJyYW5kKSA9PiB7XG4gIGlmIChsZWZ0QnJhbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByaWdodEJyYW5kO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbGVmdEJyYW5kO1xuICB9IGVsc2Uge1xuICAgIGxlZnRCcmFuZCA9PT0gcmlnaHRCcmFuZCB8fFxuICAgICAgRmFpbGBUaW1lckJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdEJyYW5kKX0gdnMgJHtxKHJpZ2h0QnJhbmQpfWA7XG4gICAgcmV0dXJuIGxlZnRCcmFuZDtcbiAgfVxufTtcblxuLyoqXG4gKiBgc2hhcmVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBpbXBsZW1lbnRzIHRoZVxuICogdHJhbnNpdGlvbmFsIGJyYW5kIGNoZWNraW5nIGFuZCBjb250YWlnaW9uIGxvZ2ljIGV4cGxhaW5lZCBpbiB0aGUgYFRpbWVNYXRoYFxuICogY29tbWVudC4gSXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGJpbmFyeSBvcGVyYXRvcnMgdGhhdCBzaG91bGQgZm9sbG93XG4gKiB0aGlzIGxvZ2ljLiBJdCBkb2VzIHRoZSBlcnJvciBjaGVja2luZyBiZXR3ZWVuIHRoZSBvcGVyYW5kcywgYW5kIHJldHVybnNcbiAqIHRoZSBicmFuZCwgaWYgYW55LCB0aGF0IHNob3VsZCBsYWJlbCB0aGUgcmVzdWx0aW5nIHRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgY29uc3QgbGVmdEJyYW5kID0gdHlwZW9mIGxlZnQgPT09ICdiaWdpbnQnID8gdW5kZWZpbmVkIDogbGVmdC50aW1lckJyYW5kO1xuICBjb25zdCByaWdodEJyYW5kID0gdHlwZW9mIHJpZ2h0ID09PSAnYmlnaW50JyA/IHVuZGVmaW5lZCA6IHJpZ2h0LnRpbWVyQnJhbmQ7XG4gIHJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCwgcmlnaHRCcmFuZCk7XG59O1xuXG4vKipcbiAqIGBhYnNMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgVGltZXN0YW1wYFxuICogcmF0aGVyIHRoYW4gYSBgUmVsYXRpdmVUaW1lYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcFZhbHVlfSBhYnNWYWx1ZVxuICogQHJldHVybnMge1RpbWVzdGFtcH1cbiAqL1xuY29uc3QgYWJzTGlrZSA9IChsZWZ0LCByaWdodCwgYWJzVmFsdWUpID0+IHtcbiAgTmF0KGFic1ZhbHVlKTtcbiAgY29uc3QgdGltZXJCcmFuZCA9IHNoYXJlZFRpbWVyQnJhbmQobGVmdCwgcmlnaHQpO1xuICBpZiAodGltZXJCcmFuZCkge1xuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgdGltZXJCcmFuZCxcbiAgICAgIGFic1ZhbHVlLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhYnNWYWx1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiBgcmVsTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFJlbGF0aXZlVGltZWBcbiAqIHJhdGhlciB0aGFuIGEgYFRpbWVzdGFtcGAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWVWYWx1ZX0gcmVsVmFsdWVcbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWV9XG4gKi9cbmNvbnN0IHJlbExpa2UgPSAobGVmdCwgcmlnaHQsIHJlbFZhbHVlKSA9PiB7XG4gIE5hdChyZWxWYWx1ZSk7XG4gIGNvbnN0IHRpbWVyQnJhbmQgPSBzaGFyZWRUaW1lckJyYW5kKGxlZnQsIHJpZ2h0KTtcbiAgaWYgKHRpbWVyQnJhbmQpIHtcbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHRpbWVyQnJhbmQsXG4gICAgICByZWxWYWx1ZSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVsVmFsdWU7XG4gIH1cbn07XG5cbi8qIEZvciBhbGwgdGhlIGZvbGxvd2luZyB0aW1lIG9wZXJhdG9ycywgdGhlaXIgZG9jdW1lbnRhdGlvbiBpcyBpbiovXG4vKiB0aGUgYFRpbWVNYXRoVHlwZWAsIHNpbmNlIHRoYXQgaXMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBzaG93cyB1cCovXG4vKiBpbiB0aGUgSURFLiBXZWxsLCBhdCBsZWFzdCB0aGUgdnNjb2RlIElERS4qL1xuXG5jb25zdCBhYnNWYWx1ZSA9IGFicyA9PiB7XG4gIGlmICh0eXBlb2YgYWJzID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQoYWJzKTtcbiAgfVxuICBtdXN0TWF0Y2goYWJzLCBUaW1lc3RhbXBSZWNvcmRTaGFwZSwgJ3RpbWVzdGFtcCcpO1xuICByZXR1cm4gTmF0KGFicy5hYnNWYWx1ZSk7XG59O1xuXG5jb25zdCByZWxWYWx1ZSA9IHJlbCA9PiB7XG4gIGlmICh0eXBlb2YgcmVsID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQocmVsKTtcbiAgfVxuICBtdXN0TWF0Y2gocmVsLCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwgJ3JlbGF0aXZlJyk7XG4gIHJldHVybiBOYXQocmVsLnJlbFZhbHVlKTtcbn07XG5cbmNvbnN0IG1ha2VUaW1lc3RhbXBSZWNvcmQgPSAoYWJzLCB0aW1lckJyYW5kKSA9PlxuICBoYXJkZW4oeyBhYnNWYWx1ZTogYWJzLCB0aW1lckJyYW5kIH0pO1xuY29uc3QgbWFrZVJlbGF0aXZlVGltZVJlY29yZCA9IChyZWwsIHRpbWVyQnJhbmQpID0+XG4gIGhhcmRlbih7IHJlbFZhbHVlOiByZWwsIHRpbWVyQnJhbmQgfSk7XG5cbmNvbnN0IGNvZXJjZVRpbWVzdGFtcFJlY29yZCA9ICh0cywgYnJhbmQpID0+IHtcbiAgYnJhbmQgfHwgRmFpbGBtdXN0IGhhdmUgYSBicmFuZGA7XG4gIGlmICh0eXBlb2YgdHMgPT09ICdudW1iZXInKSB7XG4gICAgdHMgPSBOYXQodHMpO1xuICB9XG4gIGlmICh0eXBlb2YgdHMgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIG1ha2VUaW1lc3RhbXBSZWNvcmQodHMsIGJyYW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHRpbWVyQnJhbmQgfSA9IHRzO1xuICAgIG11c3RNYXRjaCh0cywgVGltZXN0YW1wUmVjb3JkU2hhcGUsICd0aW1lc3RhbXAnKTtcbiAgICBhZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsIGJyYW5kKTtcbiAgICByZXR1cm4gdHM7XG4gIH1cbn07XG5cbmNvbnN0IGNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCA9IChydCwgYnJhbmQpID0+IHtcbiAgYnJhbmQgfHwgRmFpbGBtdXN0IGhhdmUgYSBicmFuZGA7XG4gIGlmICh0eXBlb2YgcnQgPT09ICdudW1iZXInKSB7XG4gICAgcnQgPSBOYXQocnQpO1xuICB9XG4gIGlmICh0eXBlb2YgcnQgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIG1ha2VSZWxhdGl2ZVRpbWVSZWNvcmQocnQsIGJyYW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHRpbWVyQnJhbmQgfSA9IHJ0O1xuICAgIG11c3RNYXRjaChydCwgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsICdyZWxhdGl2ZVRpbWUnKTtcbiAgICBhZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsIGJyYW5kKTtcbiAgICByZXR1cm4gcnQ7XG4gIH1cbn07XG5cbmNvbnN0IGFkZEFic1JlbCA9IChhYnMsIHJlbCkgPT5cbiAgYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSArIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBhZGRSZWxSZWwgPSAocmVsMSwgcmVsMikgPT5cbiAgcmVsTGlrZShyZWwxLCByZWwyLCByZWxWYWx1ZShyZWwxKSArIHJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3Qgc3VidHJhY3RBYnNBYnMgPSAoYWJzMSwgYWJzMikgPT5cbiAgcmVsTGlrZShhYnMxLCBhYnMyLCBhYnNWYWx1ZShhYnMxKSAtIGFic1ZhbHVlKGFiczIpKTtcblxuY29uc3QgY2xhbXBlZFN1YnRyYWN0QWJzQWJzID0gKGFiczEsIGFiczIpID0+IHtcbiAgY29uc3QgdmFsMSA9IGFic1ZhbHVlKGFiczEpO1xuICBjb25zdCB2YWwyID0gYWJzVmFsdWUoYWJzMik7XG4gIHJldHVybiByZWxMaWtlKGFiczEsIGFiczIsIHZhbDEgPiB2YWwyID8gdmFsMSAtIHZhbDIgOiAwbik7XG59O1xuXG5jb25zdCBzdWJ0cmFjdEFic1JlbCA9IChhYnMsIHJlbCkgPT5cbiAgYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSAtIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBzdWJ0cmFjdFJlbFJlbCA9IChyZWwxLCByZWwyKSA9PlxuICByZWxMaWtlKHJlbDEsIHJlbDIsIHJlbFZhbHVlKHJlbDEpIC0gcmVsVmFsdWUocmVsMikpO1xuXG5jb25zdCBpc1JlbFplcm8gPSByZWwgPT4gcmVsVmFsdWUocmVsKSA9PT0gMG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpICogbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpIC8gbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsID0gKHJlbDEsIHJlbDIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChyZWwxLCByZWwyKTsgLyoganVzdCBlcnJvciBjaGVjayovXG4gIHJldHVybiByZWxWYWx1ZShyZWwxKSAvIHJlbFZhbHVlKHJlbDIpO1xufTtcblxuY29uc3QgbW9kQWJzUmVsID0gKGFicywgc3RlcCkgPT5cbiAgcmVsTGlrZShhYnMsIHN0ZXAsIGFic1ZhbHVlKGFicykgJSByZWxWYWx1ZShzdGVwKSk7XG5cbmNvbnN0IG1vZFJlbFJlbCA9IChyZWwsIHN0ZXApID0+XG4gIHJlbExpa2UocmVsLCBzdGVwLCByZWxWYWx1ZShyZWwpICUgcmVsVmFsdWUoc3RlcCkpO1xuXG4vKipcbiAqIGBjb21wYXJlVmFsdWVzYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50XG4gKiB0aGUgdGltZSBjb21wYXJpc29uIG9wZXJhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge2JpZ2ludH0gdjFcbiAqIEBwYXJhbSB7YmlnaW50fSB2MlxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG5jb25zdCBjb21wYXJlVmFsdWVzID0gKGxlZnQsIHJpZ2h0LCB2MSwgdjIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChsZWZ0LCByaWdodCk7XG4gIGlmICh2MSA8IHYyKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2UgaWYgKHYxID09PSB2Mikge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydCh2MSA+IHYyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgYFRpbWVNYXRoYCBvYmplY3QgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpYyBvbiBsYWJlbGVkXG4gKiB0aW1lIHZhbHVlcywgbXVjaCBsaWtlIGBBbW91bnRNYXRoYCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljXG4gKiBvbiBsYWJlbGVkIGFzc2V0L21vbmV5IHZhbHVlcy4gQm90aCBjaGVjayBmb3IgY29uc2lzdGVuY3kgb2YgbGFiZWxzOiBhXG4gKiBiaW5hcnkgb3BlcmF0aW9uIG9uIHR3byBsYWJlbGVkIG9iamVjdHMgZW5zdXJlcyB0aGF0IHRoZSBib3RoIGNhcnJ5XG4gKiB0aGUgc2FtZSBsYWJlbC4gSWYgdGhleSBwcm9kdWNlIGFub3RoZXIgb2JqZWN0IGZyb20gdGhlIHNhbWUgZG9tYWluLCBpdFxuICogd2lsbCBjYXJyeSB0aGUgc2FtZSBsYWJlbC4gSWYgdGhlIG9wZXJhbmRzIGhhdmUgaW5jb21wYXRpYmxlIGxhYmVscyxcbiAqIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBVbmxpa2UgYW1vdW50IGFyaXRobWV0aWMsIHRpbWUgYXJpdGhtZXRpYyBkZWFscyBpbiB0d28ga2luZHMgb2YgdGltZSBvYmplY3RzOlxuICogVGltZXN0YW1wcywgd2hpY2ggcmVwcmVzZW50IGFic29sdXRlIHRpbWUsIGFuZCBSZWxhdGl2ZVRpbWUsIHdoaWNoIHJlcHJlc2VudHNcbiAqIHRoZSBkdXJhdGlvbiBiZXR3ZWVuIHR3byBhYnNvbHV0ZSB0aW1lcy4gQm90aCBraW5kcyBvZiB0aW1lIG9iamVjdFxuICogYXJlIGxhYmVsZWQgYnkgYSBgVGltZXJCcmFuZGAuIEZvciBhIFRpbWVzdGFtcCBvYmplY3QsIHRoZSB2YWx1ZSBpc1xuICogYSBiaWdpbnQgaW4gYW4gYGFic1ZhbHVlYCBwcm9wZXJ0eS4gRm9yIGEgUmVsYXRpdmVUaW1lIG9iamVjdCwgdGhlIHZhbHVlXG4gKiBpcyBhIGJpZ2ludCBpbiBhIGByZWxWYWx1ZWAgcHJvcGVydHkuIFRodXMgd2UgaGF2ZSBhIHJ1bnRpbWUgc2FmZXR5IGNoZWNrXG4gKiB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBjb25mdXNlZCB0aGUgdHdvLCBldmVuIGlmIHdlIGhhdmUgbWFuYWdlZCB0byBmb29sXG4gKiB0aGUgKHVuc291bmQpIHN0YXRpYyB0eXBlIHN5c3RlbS5cbiAqXG4gKiBBcyBhIHRyYW5zaXRpb25hbCBtZWFzdXJlLCBjdXJyZW50bHkgbWFueSBUaW1lc3RhbXBzIGFuZCBSZWxhdGl2ZVRpbWVzIGFyZVxuICogc3RpbGwgcmVwcmVzZW50ZWQgYnkgdW5sYWJlbGVkIGJpZ2ludHMuIER1cmluZyB0aGlzIHRyYW5zaXRpb25hbCBwZXJpb2QsXG4gKiB3ZSBhbGxvdyB0aGlzLCBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5LiBGb3IgYSBub3JtYWwgYmluYXJ5XG4gKiBvcGVyYXRpb24sIGlmIGJvdGggaW5wdXRzIGFyZSBsYWJlbGVkLCB0aGVuIHdlIGRvIHRoZSBmdWxsIGNoZWNraW5nIGFzXG4gKiBleHBsYWluZWQgYWJvdmUgYW5kIHJldHVybiBhIGxhYmVsZWQgcmVzdWx0LiBJZiBib3RoIGlucHV0cyBhcmUgdW5sYWJlbGVkXG4gKiBiaWdpbnRzLCB3ZSAqYXNzdW1lKiB0aGF0IHRoZXkgaW5kaWNhdGUgYSB0aW1lIG9mIHRoZSByaWdodCBraW5kXG4gKiAoVGltZXN0YW1wIHZzIFJlbGF0aXZlVGltZSkgYW5kIHRpbWVyIGJyYW5kLiBTaW5jZSB3ZSBkb24ndCBrbm93IHdoYXRcbiAqIGJyYW5kIHdhcyBpbnRlbmRlZCwgd2UgY2FuIG9ubHkgcmV0dXJuIHlldCBhbm90aGVyIHVubGFiZWxlZCBiaWdpbnQuXG4gKlxuICogSWYgb25lIG9wZXJhbmQgaXMgbGFiZWxlZCBhbmQgdGhlIG90aGVyIGlzIG5vdCwgd2UgY2hlY2sgdGhlIGxhYmVsZWQgb3BlcmFuZCxcbiAqICphc3N1bWUqIHRoZSB1bmxhYmVsZWQgYmlnaW50IHJlcHJlc2VudHMgdGhlIHZhbHVlIG5lZWRlZCBmb3IgdGhlIG90aGVyXG4gKiBvcGVyYW5kLCBhbmQgcmV0dXJuIGEgbGFiZWxlZCB0aW1lIG9iamVjdCB3aXRoIHRoZSBicmFuZCBvZiB0aGUgbGFiZWxlZFxuICogb3BlcmFuZC5cbiAqXG4gKiBAdHlwZSB7VGltZU1hdGhUeXBlfVxuICovXG4gICAgICAgY29uc3QgVGltZU1hdGggPSBoYXJkZW4oe1xuICBhYnNWYWx1ZSxcbiAgcmVsVmFsdWUsXG4gIGNvZXJjZVRpbWVzdGFtcFJlY29yZCxcbiAgY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIHh4eCBkeW5hbWljIHR5cGluZyovXG4gIGFkZEFic1JlbCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciB4eHggZHluYW1pYyB0eXBpbmcqL1xuICBhZGRSZWxSZWwsXG4gIHN1YnRyYWN0QWJzQWJzLFxuICBjbGFtcGVkU3VidHJhY3RBYnNBYnMsXG4gIHN1YnRyYWN0QWJzUmVsLFxuICBzdWJ0cmFjdFJlbFJlbCxcbiAgaXNSZWxaZXJvLFxuICBtdWx0aXBseVJlbE5hdCxcbiAgZGl2aWRlUmVsTmF0LFxuICBkaXZpZGVSZWxSZWwsXG4gIG1vZEFic1JlbCxcbiAgbW9kUmVsUmVsLFxuICBjb21wYXJlQWJzOiAoYWJzMSwgYWJzMikgPT5cbiAgICBjb21wYXJlVmFsdWVzKGFiczEsIGFiczIsIGFic1ZhbHVlKGFiczEpLCBhYnNWYWx1ZShhYnMyKSksXG4gIGNvbXBhcmVSZWw6IChyZWwxLCByZWwyKSA9PlxuICAgIGNvbXBhcmVWYWx1ZXMocmVsMSwgcmVsMiwgcmVsVmFsdWUocmVsMSksIHJlbFZhbHVlKHJlbDIpKSxcbn0pOyRozY9fb25jZS5UaW1lTWF0aChUaW1lTWF0aCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lTWF0aCI6WyJUaW1lTWF0aCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA09hXE8wkAAPMJAAAlAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIiwiUmVsYXRpdmVUaW1lU2hhcGUiLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIiwiVGltZXJCcmFuZFNoYXBlIiwiVGltZXJTZXJ2aWNlU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtUaW1lc3RhbXBSZWNvcmQsIFRpbWVzdGFtcFZhbHVlLCBSZWxhdGl2ZVRpbWVWYWx1ZSwgUmVsYXRpdmVUaW1lUmVjb3JkfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4gICAgICAgY29uc3QgVGltZXJCcmFuZFNoYXBlID0gTS5yZW1vdGFibGUoJ1RpbWVyQnJhbmQnKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48YmlnaW50Pn0gKi8kaM2PX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG4gICAgICAgY29uc3QgVGltZXN0YW1wVmFsdWVTaGFwZSA9IE0ubmF0KCk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPGJpZ2ludD59ICovJGjNj19vbmNlLlRpbWVzdGFtcFZhbHVlU2hhcGUoVGltZXN0YW1wVmFsdWVTaGFwZSk7XG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSA9IE0ubmF0KCk7IC8qIFNob3VsZCB3ZSBhbGxvdyBuZWdhdGl2ZXM/Ki9cblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48VGltZXN0YW1wUmVjb3JkPn0gKi8kaM2PX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcbiAgICAgICBjb25zdCBUaW1lc3RhbXBSZWNvcmRTaGFwZSA9IHtcbiAgdGltZXJCcmFuZDogVGltZXJCcmFuZFNoYXBlLFxuICBhYnNWYWx1ZTogVGltZXN0YW1wVmFsdWVTaGFwZSxcbn07JGjNj19vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcbmhhcmRlbihUaW1lc3RhbXBSZWNvcmRTaGFwZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFJlbGF0aXZlVGltZVJlY29yZD59ICovXG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSB7XG4gIHRpbWVyQnJhbmQ6IFRpbWVyQnJhbmRTaGFwZSxcbiAgcmVsVmFsdWU6IFJlbGF0aXZlVGltZVZhbHVlU2hhcGUsXG59OyRozY9fb25jZS5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZShSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG5oYXJkZW4oUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxUaW1lc3RhbXBSZWNvcmQgfCBUaW1lc3RhbXBWYWx1ZT59ICovXG4gICAgICAgY29uc3QgVGltZXN0YW1wU2hhcGUgPSBNLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLCBUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48UmVsYXRpdmVUaW1lUmVjb3JkIHwgUmVsYXRpdmVUaW1lVmFsdWU+fSAqLyRozY9fb25jZS5UaW1lc3RhbXBTaGFwZShUaW1lc3RhbXBTaGFwZSk7XG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lU2hhcGUgPSBNLm9yKFxuICBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcbiAgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSxcbik7JGjNj19vbmNlLlJlbGF0aXZlVGltZVNoYXBlKFJlbGF0aXZlVGltZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFRpbWVyU2VydmljZVNoYXBlID0gTS5yZW1vdGFibGUoJ1RpbWVyU2VydmljZScpOyRozY9fb25jZS5UaW1lclNlcnZpY2VTaGFwZShUaW1lclNlcnZpY2VTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lckJyYW5kU2hhcGUiOlsiVGltZXJCcmFuZFNoYXBlIl0sIlRpbWVzdGFtcFZhbHVlU2hhcGUiOlsiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIjpbIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiXSwiVGltZXN0YW1wUmVjb3JkU2hhcGUiOlsiVGltZXN0YW1wUmVjb3JkU2hhcGUiXSwiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiOlsiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiXSwiVGltZXN0YW1wU2hhcGUiOlsiVGltZXN0YW1wU2hhcGUiXSwiUmVsYXRpdmVUaW1lU2hhcGUiOlsiUmVsYXRpdmVUaW1lU2hhcGUiXSwiVGltZXJTZXJ2aWNlU2hhcGUiOlsiVGltZXJTZXJ2aWNlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADYPWJQtLAAALSwAACgAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiaWdub3JlQ29udGV4dCIsIm1ha2VFeG9VdGlscyIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlU2luZ2xldG9uIiwicHJvdmlkZUtpbmRIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbml0RW1wdHkscHJvdmlkZSxnbG9iYWxWYXREYXRhOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wicHJvdmlkZVwiLFskaM2PX2EgPT4gKHByb3ZpZGUgPSAkaM2PX2EpXV0sW1wiVmF0RGF0YVwiLFskaM2PX2EgPT4gKGdsb2JhbFZhdERhdGEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1JlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlLCBEZWZpbmVLaW5kT3B0aW9ucywgRHVyYWJsZUtpbmRIYW5kbGUsIEludGVyZmFjZUd1YXJkS2l0fSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtQbHVzQ29udGV4dH0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7VmF0RGF0YX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7UHJlcGFyZUtpbmR9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1ByZXBhcmVLaW5kTXVsdGl9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge0d1YXJkZWR9IGZyb20gJ0BlbmRvL2V4byc7XG4gKiBAaW1wb3J0IHtHdWFyZGVkS2l0fSBmcm9tICdAZW5kby9leG8nO1xuICovXG5cbi8qIFNvbWUgZmVlZGJhY2sgaWYgdGhlIGluaXQgZnVuY3Rpb24gaXMgYXN5bmMqL1xuLyoqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEluaXRTdGF0ZVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxJPiBleHRlbmRzIFByb21pc2U8YW55PiA/IG5ldmVyIDogUmV0dXJuVHlwZTxJPn0gU3RhdGVSZXN1bHRcbiAqL1xuXG4vKipcbiAqIE1ha2UgYSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCBmdW5jdGlvbiB0aGF0IHRha2VzIGEga2luZCBjb250ZXh0IGJ1dCBpZ25vcmVzXG4gKiBpdC5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyAoLi4uYXJnczogYW55KSA9PiBhbnk+KFxuICogICBmbjogVCxcbiAqICkgPT4gUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG4gICAgICAgY29uc3QgaWdub3JlQ29udGV4dCA9XG4gIGZuID0+XG4gIChfY29udGV4dCwgLi4uYXJncykgPT5cbiAgICBmbiguLi5hcmdzKTskaM2PX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyogVE9ETzogRmluZCBhIGdvb2QgaG9tZSBmb3IgdGhpcyBmdW5jdGlvbiB1c2VkIGJ5IEBhZ29yaWMvdmF0LWRhdGEgYW5kIHRlc3RpbmcgY29kZSovXG4vKiogQHBhcmFtIHtWYXREYXRhfSBWYXREYXRhICovXG4gICAgICAgY29uc3QgbWFrZUV4b1V0aWxzID0gVmF0RGF0YSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWZpbmVLaW5kLFxuICAgIGRlZmluZUtpbmRNdWx0aSxcbiAgICBkZWZpbmVEdXJhYmxlS2luZCxcbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpLFxuICAgIG1ha2VLaW5kSGFuZGxlLFxuICB9ID0gVmF0RGF0YTtcblxuICAvKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHtEdXJhYmxlS2luZEhhbmRsZX1cbiAqL1xuICBjb25zdCBwcm92aWRlS2luZEhhbmRsZSA9IChiYWdnYWdlLCBraW5kTmFtZSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwgKCkgPT4gbWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbiAgaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuICAvKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3MgaW5zdGVhZFxuICogQHR5cGUge1ByZXBhcmVLaW5kfVxuICovXG4gIGNvbnN0IHByZXBhcmVLaW5kID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUtpbmQoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbml0LFxuICAgICAgYmVoYXZpb3IsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIGhhcmRlbihwcmVwYXJlS2luZCk7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4b0NsYXNzS2l0IGluc3RlYWRcbiAqIEB0eXBlIHtQcmVwYXJlS2luZE11bHRpfVxuICovXG4gIGNvbnN0IHByZXBhcmVLaW5kTXVsdGkgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbml0LFxuICAgIGJlaGF2aW9yLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT5cbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpKFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW5pdCxcbiAgICAgIGJlaGF2aW9yLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUtpbmRNdWx0aSk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgVCBiZWhhdmlvclxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIHNlbGY6IFQ7XG4gKiAgICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogICB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIHNlbGY6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZDxUPn1cbiAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MgPSAodGFnLCBpbnRlcmZhY2VHdWFyZCwgaW5pdCwgbWV0aG9kcywgb3B0aW9ucykgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUtpbmQodGFnLCBpbml0LCBtZXRob2RzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIGZhY2V0czogR3VhcmRlZEtpdDxUPjtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxUPn1cbiAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQgPSAoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUtpbmRNdWx0aSh0YWcsIGluaXQsIGZhY2V0cywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtJbml0U3RhdGV9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBUO1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8VD59XG4gKi9cbiAgY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzID0gKFxuICAgIGtpbmRIYW5kbGUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsIGluaXQsIG1ldGhvZHMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0aGlzZnVsTWV0aG9kczogdHJ1ZSxcbiAgICAgIGludGVyZmFjZUd1YXJkLFxuICAgIH0pO1xuICBoYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkS2l0IHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJlxuICogICBUaGlzVHlwZTx7XG4gKiAgICAgZmFjZXRzOiBHdWFyZGVkS2l0PFQ+O1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVDtcbiAqICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkS2l0PFQ+fVxuICovXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCA9IChcbiAgICBraW5kSGFuZGxlLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSwgaW5pdCwgZmFjZXRzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBSZW1vdGFibGVPYmplY3QgJiBUO1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8VD59XG4gKi9cbiAgY29uc3QgcHJlcGFyZUV4b0NsYXNzID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT5cbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAgIGluaXQsXG4gICAgICBtZXRob2RzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIGZhY2V0czogR3VhcmRlZEtpdDxUPjtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxUPn1cbiAqL1xuICBjb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgICBpbml0LFxuICAgICAgZmFjZXRzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzS2l0KTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7TSAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBSZW1vdGFibGVPYmplY3QgJiBNO1xuICogICB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge0d1YXJkZWQ8TT59XG4gKi9cbiAgY29uc3QgcHJlcGFyZUV4byA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIG1ldGhvZHMsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgY29uc3QgbWFrZVNpbmdsZXRvbiA9IHByZXBhcmVFeG9DbGFzcyhcbiAgICAgIGJhZ2dhZ2UsXG4gICAgICBraW5kTmFtZSxcbiAgICAgIGludGVyZmFjZUd1YXJkLFxuICAgICAgaW5pdEVtcHR5LFxuICAgICAgbWV0aG9kcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcblxuICAgIHJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9zaW5nbGV0b25gLCAoKSA9PiBtYWtlU2luZ2xldG9uKCkpO1xuICB9O1xuICBoYXJkZW4ocHJlcGFyZUV4byk7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4byBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtHdWFyZGVkPE0+fVxuICovXG4gIGNvbnN0IHByZXBhcmVTaW5nbGV0b24gPSAoYmFnZ2FnZSwga2luZE5hbWUsIG1ldGhvZHMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+XG4gICAgcHJlcGFyZUV4byhiYWdnYWdlLCBraW5kTmFtZSwgdW5kZWZpbmVkLCBtZXRob2RzLCBvcHRpb25zKTtcbiAgaGFyZGVuKHByZXBhcmVTaW5nbGV0b24pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbiAgICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbiAgICBwcmVwYXJlRXhvQ2xhc3MsXG4gICAgcHJlcGFyZUV4b0NsYXNzS2l0LFxuICAgIHByZXBhcmVFeG8sXG5cbiAgICBwcmVwYXJlU2luZ2xldG9uLFxuICAgIHByb3ZpZGVLaW5kSGFuZGxlLFxuICAgIHByZXBhcmVLaW5kLFxuICAgIHByZXBhcmVLaW5kTXVsdGksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUV4b1V0aWxzKG1ha2VFeG9VdGlscyk7XG5cbmNvbnN0IGdsb2JhbEV4b1V0aWxzID0gbWFrZUV4b1V0aWxzKGdsb2JhbFZhdERhdGEpO1xuXG4gICAgICAgY29uc3Qge1xuICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG4gIGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbiAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG4gIHByZXBhcmVFeG9DbGFzcyxcbiAgcHJlcGFyZUV4b0NsYXNzS2l0LFxuICBwcmVwYXJlRXhvLFxuICBwcmVwYXJlU2luZ2xldG9uLFxufSA9IGdsb2JhbEV4b1V0aWxzO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovJGjNj19vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzcyhkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7JGjNj19vbmNlLnByZXBhcmVFeG8ocHJlcGFyZUV4byk7JGjNj19vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG4gICAgICAgY29uc3QgeyBwcm92aWRlS2luZEhhbmRsZSwgcHJlcGFyZUtpbmQsIHByZXBhcmVLaW5kTXVsdGkgfSA9XG4gIGdsb2JhbEV4b1V0aWxzOyRozY9fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByZXBhcmVLaW5kKHByZXBhcmVLaW5kKTskaM2PX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJtYWtlRXhvVXRpbHMiOlsibWFrZUV4b1V0aWxzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4b0NsYXNzIjpbInByZXBhcmVFeG9DbGFzcyJdLCJwcmVwYXJlRXhvQ2xhc3NLaXQiOlsicHJlcGFyZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG8iOlsicHJlcGFyZUV4byJdLCJwcmVwYXJlU2luZ2xldG9uIjpbInByZXBhcmVTaW5nbGV0b24iXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwicHJlcGFyZUtpbmQiOlsicHJlcGFyZUtpbmQiXSwicHJlcGFyZUtpbmRNdWx0aSI6WyJwcmVwYXJlS2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCIuL2V4by11dGlscy5qcyJdLCJleHBvcnRzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtdXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2V4by11dGlscy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvc3RvcmUiOltbIk0iLCJNIl0sWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjpbWyJtYWtlS2luZEhhbmRsZSIsIm1ha2VLaW5kSGFuZGxlIl0sWyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSxbIndhdGNoUHJvbWlzZSIsIndhdGNoUHJvbWlzZSJdLFsibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLFsiY2FuQmVEdXJhYmxlIiwiY2FuQmVEdXJhYmxlIl0sWyJwaWNrRmFjZXQiLCJwaWNrRmFjZXQiXSxbInBhcnRpYWxBc3NpZ24iLCJwYXJ0aWFsQXNzaWduIl0sWyJwcm92aWRlIiwicHJvdmlkZSJdLFsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl0sWyJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZCJdLFsiZGVmaW5lS2luZE11bHRpIiwiZGVmaW5lS2luZE11bHRpIl0sWyJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kIl0sWyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdXSwiLi9leG8tdXRpbHMuanMiOltbImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLFsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzIl0sWyJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvIl0sWyJwcmVwYXJlU2luZ2xldG9uIiwicHJlcGFyZVNpbmdsZXRvbiJdLFsiaWdub3JlQ29udGV4dCIsImlnbm9yZUNvbnRleHQiXSxbInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZUtpbmRIYW5kbGUiXSxbInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmQiXSxbInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlS2luZE11bHRpIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADvd74wOSMAADkjAAAwAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxwcm92aWRlTGF6eTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge0JhZ2dhZ2UsIFBpY2tGYWNldCwgVmF0RGF0YX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnICovXG5cbi8qKiBAdHlwZSB7VmF0RGF0YX0gKi9cbmxldCBWYXREYXRhR2xvYmFsO1xuaWYgKCdWYXREYXRhJyBpbiBnbG9iYWxUaGlzKSB7XG4gIGdsb2JhbFRoaXMuVmF0RGF0YSB8fCBGYWlsYFZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWRgO1xuICAvKiBYWFggdHlwZXMgaW5jb21wYXRpYmlsaXR5Ki9cbiAgVmF0RGF0YUdsb2JhbCA9IC8qKiBAdHlwZSB7YW55fSAqLyAoZ2xvYmFsVGhpcy5WYXREYXRhKTtcbn0gZWxzZSB7XG4gIC8qIFhYWCB0aGlzIG1vZHVsZSBoYXMgYmVlbiBrbm93biB0byBnZXQgaW1wb3J0ZWQgKHRyYW5zaXRpdmVseSkgaW4gY2FzZXMgdGhhdCovXG4gIC8qIG5ldmVyIHVzZSBpdCBzbyB3ZSBtYWtlIGEgdmVyc2lvbiB0aGF0IHdpbGwgc2F0aXNmeSBtb2R1bGUgcmVzb2x1dGlvbiBidXQqL1xuICAvKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbiAgY29uc3QgdW5hdmFpbGFibGUgPSAoKSA9PiBGYWlsYFZhdERhdGEgdW5hdmFpbGFibGVgO1xuICBWYXREYXRhR2xvYmFsID0ge1xuICAgIGRlZmluZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUtpbmRNdWx0aTogdW5hdmFpbGFibGUsXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGk6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VLaW5kSGFuZGxlOiB1bmF2YWlsYWJsZSxcbiAgICBwcm92aWRlUHJvbWlzZVdhdGNoZXI6IHVuYXZhaWxhYmxlLFxuICAgIHdhdGNoUHJvbWlzZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIGNhbkJlRHVyYWJsZTogdW5hdmFpbGFibGUsXG4gIH07XG59XG5cbmNvbnN0IFZhdERhdGFFeHBvcnQgPSBWYXREYXRhR2xvYmFsOyRozY9fb25jZS5WYXREYXRhRXhwb3J0KFZhdERhdGFFeHBvcnQpO1xuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEV4b3MvRXhvQ2xhc3NlcyBpbnN0ZWFkIG9mIEtpbmRzXG4gKi9cbiAgICAgICBjb25zdCB7XG4gIGRlZmluZUtpbmQsXG4gIGRlZmluZUtpbmRNdWx0aSxcbiAgZGVmaW5lRHVyYWJsZUtpbmQsXG4gIGRlZmluZUR1cmFibGVLaW5kTXVsdGksXG59ID0gVmF0RGF0YUdsb2JhbDskaM2PX29uY2UuZGVmaW5lS2luZChkZWZpbmVLaW5kKTskaM2PX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVLaW5kKGRlZmluZUR1cmFibGVLaW5kKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShkZWZpbmVEdXJhYmxlS2luZE11bHRpKTtcblxuICAgICAgIGNvbnN0IHtcbiAgbWFrZUtpbmRIYW5kbGUsXG4gIHByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbiAgd2F0Y2hQcm9taXNlLFxuICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbiAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbiAgY2FuQmVEdXJhYmxlLFxufSA9IFZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuXG4gKiBFLmcuLFxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gKGEsIGIsIGMsIGQpID0+IG1ha2VGb29CYXNlKGEsIGIsIGMsIGQpLnNlbGY7XG4gKlxuICogVGhpcyBoZWxwZXIgcmVkdWNlcyB0aGUgZHVwbGljYXRpb246XG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSBwaWNrRmFjZXQobWFrZUZvb0Jhc2UsICdzZWxmJyk7XG4gKlxuICogQHR5cGUge1BpY2tGYWNldH1cbiAqLyRozY9fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRozY9fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbiAgICAgICBjb25zdCBwaWNrRmFjZXQgPVxuICAobWFrZXIsIGZhY2V0TmFtZSkgPT5cbiAgKC4uLmFyZ3MpID0+XG4gICAgbWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaM2PX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuICAgICAgIGNvbnN0IHBhcnRpYWxBc3NpZ24gPSAodGFyZ2V0LCBzb3VyY2UpID0+IHtcbiAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSk7XG59OyRozY9fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKiogQGltcG9ydCB7U3RvcmVPcHRpb25zfSBmcm9tICdAYWdvcmljL3N0b3JlJyAqL1xuXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2Ugd2l0aGluIGFueSB2YXRcbiAqIGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLCB3aGVyZSB0aGUgdG90YWwgbnVtYmVyIG9mXG4gKiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZSBsb3cgY2FyZGluYWxpdHksIHNpbmNlIHdlIGtlZXAgdGhlIGJvb2trZWVwaW5nIHRvXG4gKiBkZXRlY3QgY29sbGlzaW9ucyBpbiBub3JtYWwgbGFuZ3VhZ2UtaGVhcCBtZW1vcnkuIEFsbCB0aGUgb3RoZXJcbiAqIGJhZ2dhZ2Utb3JpZW50ZWQgYHByb3ZpZGUqYCBhbmQgYHByZXBhcmUqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsIGFuZCBzb1xuICogaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBvdXIgZXhwZWN0ZWQgZHVyYWJpbGl0eVxuICogcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqXG4gKiAtIGtpbmRIYW5kbGVzLCB3aGljaCBhcmUgcGVyIGtpbmQsIHdoaWNoIG11c3QgYmUgbG93IGNhcmRpbmFsaXR5XG4gKiAtIGRhdGEgXCJ2YXJpYWJsZXNcIiBmb3IgcmVlc3RhYmxpc2hpbmcgdGhlIGxleGljYWwgc2NvcGUsIGVzcGVjaWFsbHkgb2ZcbiAqICAgc2luZ2xldG9uc1xuICogLSBuYW1lZCBub24tYmFnZ2FnZSBjb2xsZWN0aW9ucyBhdCB0aGUgbGVhdmVzIG9mIHRoZSBiYWdnYWdlIHRyZWUuXG4gKlxuICogV2hhdCBpcyBleHBlY3RlZCB0byBiZSBoaWdoIGNhcmRpbmFsaXR5IGFyZSB0aGUgaW5zdGFuY2VzIG9mIHRoZSBraW5kcywgYW5kXG4gKiB0aGUgbWVtYmVycyBvZiB0aGUgbm9uLWJhZ2dnYWdlIGNvbGxlY3Rpb25zLlxuICpcbiAqIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTg3NSA6IEltcGxlbWVudFxuICogZGV2ZWxvcG1lbnQtdGltZSBpbnN0cnVtZW50YXRpb24gdG8gZGV0ZWN0IHdoZW4gYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZVxuICogcHJlc2NyaXB0aW9uLCBhbmQgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHZhdCBpbmNhcm5hdGlvbiB3aXRoXG4gKiB0aGUgc2FtZSBiYWdnYWdlLGtleSBwYWlyLlxuICovXG5cbiAgICAgICBjb25zdCBwcm92aWRlID1cbiAgLyogWFhYIGNhc3QgYmVjYXVzZSBwcm92aWRlTGF6eSBpcyBgYW55YCBkdWUgdG8gYnJva2VuIHR5cGUgaW1wb3J0Ki9cbiAgLyoqXG4gKiBAdHlwZSB7PEssIFY+KFxuICogICBiYWdnYWdlOiBCYWdnYWdlLFxuICogICBrZXk6IEssXG4gKiAgIG1ha2VWYWx1ZTogKGtleTogSykgPT4gVixcbiAqICkgPT4gVn1cbiAqLyAgIChwcm92aWRlTGF6eSk7XG5cbi8qIFRPRE86IEZpbmQgYSBnb29kIGhvbWUgZm9yIHRoaXMgZnVuY3Rpb24gdXNlZCBieSBAYWdvcmljL3ZhdC1kYXRhIGFuZCB0ZXN0aW5nIGNvZGUqL1xuLyoqIEBwYXJhbSB7VmF0RGF0YX0gVmF0RGF0YSAqLyRozY9fb25jZS5wcm92aWRlKHByb3ZpZGUpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZVV0aWxzID0gVmF0RGF0YSA9PiB7XG4gIGNvbnN0IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xuICAgIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuICB9ID0gVmF0RGF0YTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVNldFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVNldFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG4gICAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVN0b3JlVXRpbHMobWFrZVN0b3JlVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxTdG9yZVV0aWxzID0gbWFrZVN0b3JlVXRpbHMoVmF0RGF0YUdsb2JhbCk7XG4gICAgICAgY29uc3Qge1xuICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG59ID0gZ2xvYmFsU3RvcmVVdGlsczskaM2PX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJWYXREYXRhIjpbIlZhdERhdGFFeHBvcnQiXSwiZGVmaW5lS2luZCI6WyJkZWZpbmVLaW5kIl0sImRlZmluZUtpbmRNdWx0aSI6WyJkZWZpbmVLaW5kTXVsdGkiXSwiZGVmaW5lRHVyYWJsZUtpbmQiOlsiZGVmaW5lRHVyYWJsZUtpbmQiXSwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSI6WyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIl0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIl0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIl0sInByb3ZpZGUiOlsicHJvdmlkZSJdLCJtYWtlU3RvcmVVdGlscyI6WyJtYWtlU3RvcmVVdGlscyJdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEV7+BmsCAAArAgAACUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9tYWtlSGFuZGxlLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXJyb3JzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUhhbmRsZSIsIm1ha2VIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbml0RW1wdHksbWFrZUV4byxwcmVwYXJlRXhvQ2xhc3MsRmFpbCxIYW5kbGVJOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dLFtcIm1ha2VFeG9cIixbJGjNj19hID0+IChtYWtlRXhvID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiSGFuZGxlSVwiLFskaM2PX2EgPT4gKEhhbmRsZUkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7SGFuZGxlLCBJbnN0YW5jZX0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEhcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtIfSBoYW5kbGVUeXBlXG4gKiBAcmV0dXJucyB7SCBleHRlbmRzICdJbnN0YW5jZScgPyAoKSA9PiBJbnN0YW5jZSA6ICgpID0+IEhhbmRsZTxIPn1cbiAqL1xuICAgICAgIGNvbnN0IGRlZmluZUR1cmFibGVIYW5kbGUgPSAoYmFnZ2FnZSwgaGFuZGxlVHlwZSkgPT4ge1xuICB0eXBlb2YgaGFuZGxlVHlwZSA9PT0gJ3N0cmluZycgfHwgRmFpbGBoYW5kbGVUeXBlIG11c3QgYmUgYSBzdHJpbmdgO1xuICBjb25zdCBtYWtlSGFuZGxlID0gcHJlcGFyZUV4b0NsYXNzKFxuICAgIGJhZ2dhZ2UsXG4gICAgYCR7aGFuZGxlVHlwZX1IYW5kbGVgLFxuICAgIEhhbmRsZUksXG4gICAgaW5pdEVtcHR5LFxuICAgIHt9LFxuICApO1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIEJpdCBieSBvdXIgb3duIG9wYXF1ZSB0eXBlcy4qL1xuICByZXR1cm4gLyoqIEB0eXBlIHsoKSA9PiBIYW5kbGU8SD59ICovIChtYWtlSGFuZGxlKTtcbn07JGjNj19vbmNlLmRlZmluZUR1cmFibGVIYW5kbGUoZGVmaW5lRHVyYWJsZUhhbmRsZSk7XG5oYXJkZW4oZGVmaW5lRHVyYWJsZUhhbmRsZSk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIG9wYXF1ZSBoYW5kbGUgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBIXG4gKiBAcGFyYW0ge0h9IGhhbmRsZVR5cGUgdGhlIHN0cmluZyBsaXRlcmFsIHR5cGUgb2YgdGhlIGhhbmRsZVxuICogQHJldHVybnMge0ggZXh0ZW5kcyAnSW5zdGFuY2UnID8gSW5zdGFuY2UgOiBIYW5kbGU8SD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSGFuZGxlID0gaGFuZGxlVHlwZSA9PiB7XG4gIHR5cGVvZiBoYW5kbGVUeXBlID09PSAnc3RyaW5nJyB8fCBGYWlsYGhhbmRsZVR5cGUgbXVzdCBiZSBhIHN0cmluZ2A7XG4gIC8qIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIHR5cGUgKHJlYWxseSBqdXN0IGFuIGVtcHR5IG9iamVjdCkuKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBCaXQgYnkgb3VyIG93biBvcGFxdWUgdHlwZXMuKi9cbiAgcmV0dXJuIC8qKiBAdHlwZSB7SGFuZGxlPEg+fSAqLyAobWFrZUV4byhgJHtoYW5kbGVUeXBlfUhhbmRsZWAsIEhhbmRsZUksIHt9KSk7XG59OyRozY9fb25jZS5tYWtlSGFuZGxlKG1ha2VIYW5kbGUpO1xuaGFyZGVuKG1ha2VIYW5kbGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmaW5lRHVyYWJsZUhhbmRsZSI6WyJkZWZpbmVEdXJhYmxlSGFuZGxlIl0sIm1ha2VIYW5kbGUiOlsibWFrZUhhbmRsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAB0/RLSEsAAEhLAAAlAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbIkFkbWluRmFjZXRJIiwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIiwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSIsIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIiwiQnVuZGxlQ2FwU2hhcGUiLCJCdW5kbGVTaGFwZSIsIkVtcHR5UHJvcG9zYWxTaGFwZSIsIkV4aXRPYmplY3RJIiwiRXhpdE9iamVjdFNoYXBlIiwiRmVlTWludEFjY2Vzc1NoYXBlIiwiRnVsbFByb3Bvc2FsU2hhcGUiLCJIYW5kbGVJIiwiSGFuZGxlT2ZmZXJJIiwiSW5zdGFsbGF0aW9uU2hhcGUiLCJJbnN0YW5jZUFkbWluSSIsIkluc3RhbmNlQWRtaW5TaGFwZSIsIkluc3RhbmNlSGFuZGxlU2hhcGUiLCJJbnN0YW5jZVJlY29yZFNoYXBlIiwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIiwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIiwiSW52aXRhdGlvblNoYXBlIiwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclJlY29yZFNoYXBlIiwiS2V5d29yZFNoYXBlIiwiT2ZmZXJIYW5kbGVySSIsIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIiwiUHJpY2VRdW90ZVNoYXBlIiwiUHJvcG9zYWxTaGFwZSIsIlNlYXREYXRhU2hhcGUiLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSIsIlNlYXRTaGFwZSIsIlRlcm1zU2hhcGUiLCJUaW1lclNoYXBlIiwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiLCJab2VNaW50SSIsIlpvZU1pbnRTaGFwZSIsIlpvZVNlcnZpY2VJIiwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IiwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiLCJpc09uRGVtYW5kRXhpdFJ1bGUiLCJpc1dhaXZlZEV4aXRSdWxlIiwibWFrZUhhbmRsZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50U2hhcGUsQXNzZXRLaW5kU2hhcGUsQnJhbmRTaGFwZSxEaXNwbGF5SW5mb1NoYXBlLElzc3VlcktpdFNoYXBlLElzc3VlclNoYXBlLFBheW1lbnRTaGFwZSxTdWJzY3JpYmVyU2hhcGUsTSxUaW1lc3RhbXBTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50U2hhcGVcIixbJGjNj19hID0+IChBbW91bnRTaGFwZSA9ICRozY9fYSldXSxbXCJBc3NldEtpbmRTaGFwZVwiLFskaM2PX2EgPT4gKEFzc2V0S2luZFNoYXBlID0gJGjNj19hKV1dLFtcIkJyYW5kU2hhcGVcIixbJGjNj19hID0+IChCcmFuZFNoYXBlID0gJGjNj19hKV1dLFtcIkRpc3BsYXlJbmZvU2hhcGVcIixbJGjNj19hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjNj19hKV1dLFtcIklzc3VlcktpdFNoYXBlXCIsWyRozY9fYSA9PiAoSXNzdWVyS2l0U2hhcGUgPSAkaM2PX2EpXV0sW1wiSXNzdWVyU2hhcGVcIixbJGjNj19hID0+IChJc3N1ZXJTaGFwZSA9ICRozY9fYSldXSxbXCJQYXltZW50U2hhcGVcIixbJGjNj19hID0+IChQYXltZW50U2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7QWZ0ZXJEZWFkbGluZUV4aXRSdWxlLCBJbnN0YWxsYXRpb24sIFpvZUlzc3VlclJlY29yZH0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7RXhpdFJ1bGUsIEludml0YXRpb24sIEludml0YXRpb25IYW5kbGUsIFdhaXZlZEV4aXRSdWxlfSBmcm9tICcuL3R5cGVzLWluZGV4LmpzJztcbiAqIEBpbXBvcnQge0ludml0YXRpb25EZXRhaWxzfSBmcm9tICcuL3R5cGVzLWluZGV4LmpzJztcbiAqL1xuXG4vKiBrZXl3b3JkcyBoYXZlIGFuIGluaXRpYWwgY2FwKi9cbiAgICAgICBjb25zdCBLZXl3b3JkU2hhcGUgPSBNLnN0cmluZygpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxJbnZpdGF0aW9uSGFuZGxlPn0gKi8kaM2PX29uY2UuS2V5d29yZFNoYXBlKEtleXdvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgSW52aXRhdGlvbkhhbmRsZVNoYXBlID0gTS5yZW1vdGFibGUoJ0ludml0YXRpb25IYW5kbGUnKTtcbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEludml0YXRpb24+fSAqLyRozY9fb25jZS5JbnZpdGF0aW9uSGFuZGxlU2hhcGUoSW52aXRhdGlvbkhhbmRsZVNoYXBlKTtcbiAgICAgICBjb25zdCBJbnZpdGF0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnSW52aXRhdGlvbicpOyRozY9fb25jZS5JbnZpdGF0aW9uU2hhcGUoSW52aXRhdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBJbnN0YW5jZUhhbmRsZVNoYXBlID0gTS5yZW1vdGFibGUoJ0luc3RhbmNlSGFuZGxlJyk7XG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxJbnN0YWxsYXRpb24+fSAqLyRozY9fb25jZS5JbnN0YW5jZUhhbmRsZVNoYXBlKEluc3RhbmNlSGFuZGxlU2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbGxhdGlvblNoYXBlID0gTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpOyRozY9fb25jZS5JbnN0YWxsYXRpb25TaGFwZShJbnN0YWxsYXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgU2VhdFNoYXBlID0gTS5yZW1vdGFibGUoJ1NlYXQnKTskaM2PX29uY2UuU2VhdFNoYXBlKFNlYXRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKEtleXdvcmRTaGFwZSwgQW1vdW50U2hhcGUpOyRozY9fb25jZS5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihcbiAgS2V5d29yZFNoYXBlLFxuICBNLnBhdHRlcm4oKSxcbik7JGjNj19vbmNlLkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKFxuICBLZXl3b3JkU2hhcGUsXG4gIE0uZXJlZihQYXltZW50U2hhcGUpLFxuKTskaM2PX29uY2UuUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUoUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBJc3N1ZXJTaGFwZSk7JGjNj19vbmNlLklzc3VlcktleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKFxuICBLZXl3b3JkU2hhcGUsXG4gIE0uZXJlZihJc3N1ZXJTaGFwZSksXG4pOyRozY9fb25jZS5Jc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IEJyYW5kS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsIEJyYW5kU2hhcGUpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxab2VJc3N1ZXJSZWNvcmQ+fSAqLyRozY9fb25jZS5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZShCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgSXNzdWVyUmVjb3JkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgYnJhbmQ6IEJyYW5kU2hhcGUsXG4gICAgaXNzdWVyOiBJc3N1ZXJTaGFwZSxcbiAgICBhc3NldEtpbmQ6IEFzc2V0S2luZFNoYXBlLFxuICB9LFxuICB7IGRpc3BsYXlJbmZvOiBEaXNwbGF5SW5mb1NoYXBlIH0sXG4pOyRozY9fb25jZS5Jc3N1ZXJSZWNvcmRTaGFwZShJc3N1ZXJSZWNvcmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBUZXJtc1NoYXBlID0ge1xuICBpc3N1ZXJzOiBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUsXG4gIGJyYW5kczogQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUsXG59OyRozY9fb25jZS5UZXJtc1NoYXBlKFRlcm1zU2hhcGUpO1xuaGFyZGVuKFRlcm1zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSW5zdGFuY2VSZWNvcmRTaGFwZSA9IHtcbiAgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb25TaGFwZSxcbiAgaW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gIHRlcm1zOiBNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpLFxufTskaM2PX29uY2UuSW5zdGFuY2VSZWNvcmRTaGFwZShJbnN0YW5jZVJlY29yZFNoYXBlKTtcbmhhcmRlbihJbnN0YW5jZVJlY29yZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IEhhbmRsZUkgPSBNLmludGVyZmFjZSgnSGFuZGxlJywge30pOyRozY9fb25jZS5IYW5kbGVJKEhhbmRsZUkpO1xuXG4gICAgICAgY29uc3QgbWFrZUhhbmRsZVNoYXBlID0gbmFtZSA9PiBNLnJlbW90YWJsZShgJHtuYW1lfUhhbmRsZWApOyRozY9fb25jZS5tYWtlSGFuZGxlU2hhcGUobWFrZUhhbmRsZVNoYXBlKTtcbiAgICAgICBjb25zdCBUaW1lclNoYXBlID0gbWFrZUhhbmRsZVNoYXBlKCd0aW1lcicpO1xuXG4vKipcbiAqIEFmdGVyIGRlZmF1bHRzIGFyZSBmaWxsZWQgaW5cbiAqXG4gKiBAc2VlIHtQcm9wb3NhbFJlY29yZH0gdHlwZVxuICovJGjNj19vbmNlLlRpbWVyU2hhcGUoVGltZXJTaGFwZSk7XG4gICAgICAgY29uc3QgRnVsbFByb3Bvc2FsU2hhcGUgPSB7XG4gIHdhbnQ6IEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUsXG4gIGdpdmU6IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgLyogVG8gYWNjZXB0IG9ubHkgb25lLCB3ZSBjb3VsZCB1c2UgTS5vciByYXRoZXIgdGhhbiBNLnNwbGl0UmVjb3JkLCovXG4gIC8qIGJ1dCB0aGUgZXJyb3IgbWVzc2FnZXMgd291bGQgaGF2ZSBiZWVuIHdvcnNlLiBSYXRoZXIsKi9cbiAgLyogY2xlYW5Qcm9wb3NhbCdzIGFzc2VydEV4aXQgY2hlY2tzIHRoYXQgdGhlcmUncyBleGFjdGx5IG9uZS4qL1xuICBleGl0OiBNLnNwbGl0UmVjb3JkKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIG9uRGVtYW5kOiBudWxsLFxuICAgICAgd2FpdmVkOiBudWxsLFxuICAgICAgYWZ0ZXJEZWFkbGluZToge1xuICAgICAgICB0aW1lcjogTS5lcmVmKFRpbWVyU2hhcGUpLFxuICAgICAgICBkZWFkbGluZTogVGltZXN0YW1wU2hhcGUsXG4gICAgICB9LFxuICAgIH0sXG4gICAge30sXG4gICksXG59OyRozY9fb25jZS5GdWxsUHJvcG9zYWxTaGFwZShGdWxsUHJvcG9zYWxTaGFwZSk7XG5oYXJkZW4oRnVsbFByb3Bvc2FsU2hhcGUpO1xuXG4vKiogQHNlZSB7UHJvcG9zYWx9IHR5cGUgKi9cbiAgICAgICBjb25zdCBQcm9wb3NhbFNoYXBlID0gTS5zcGxpdFJlY29yZCh7fSwgRnVsbFByb3Bvc2FsU2hhcGUsIHt9KTskaM2PX29uY2UuUHJvcG9zYWxTaGFwZShQcm9wb3NhbFNoYXBlKTtcblxuICAgICAgIGNvbnN0IEVtcHR5UHJvcG9zYWxTaGFwZSA9IE0uc3BsaXRSZWNvcmQoe1xuICBnaXZlOiB7fSxcbiAgd2FudDoge30sXG4gIGV4aXQ6IHsgb25EZW1hbmQ6IG51bGwgfSxcbn0pOyRozY9fb25jZS5FbXB0eVByb3Bvc2FsU2hhcGUoRW1wdHlQcm9wb3NhbFNoYXBlKTtcblxuICAgICAgIGNvbnN0IGlzT25EZW1hbmRFeGl0UnVsZSA9IGV4aXQgPT4ge1xuICBjb25zdCBbZXhpdEtleV0gPSBPYmplY3Qua2V5cyhleGl0KTtcbiAgcmV0dXJuIGV4aXRLZXkgPT09ICdvbkRlbWFuZCc7XG59OyRozY9fb25jZS5pc09uRGVtYW5kRXhpdFJ1bGUoaXNPbkRlbWFuZEV4aXRSdWxlKTtcbmhhcmRlbihpc09uRGVtYW5kRXhpdFJ1bGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIFdhaXZlZEV4aXRSdWxlfVxuICovXG4gICAgICAgY29uc3QgaXNXYWl2ZWRFeGl0UnVsZSA9IGV4aXQgPT4ge1xuICBjb25zdCBbZXhpdEtleV0gPSBPYmplY3Qua2V5cyhleGl0KTtcbiAgcmV0dXJuIGV4aXRLZXkgPT09ICd3YWl2ZWQnO1xufTskaM2PX29uY2UuaXNXYWl2ZWRFeGl0UnVsZShpc1dhaXZlZEV4aXRSdWxlKTtcbmhhcmRlbihpc1dhaXZlZEV4aXRSdWxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBBZnRlckRlYWRsaW5lRXhpdFJ1bGV9XG4gKi9cbiAgICAgICBjb25zdCBpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSA9IGV4aXQgPT4ge1xuICBjb25zdCBbZXhpdEtleV0gPSBPYmplY3Qua2V5cyhleGl0KTtcbiAgcmV0dXJuIGV4aXRLZXkgPT09ICdhZnRlckRlYWRsaW5lJztcbn07JGjNj19vbmNlLmlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKTtcbmhhcmRlbihpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEludml0YXRpb25EZXRhaWxzPn0gKi9cbiAgICAgICBjb25zdCBJbnZpdGF0aW9uRWxlbWVudFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGRlc2NyaXB0aW9uOiBNLnN0cmluZygpLFxuICBoYW5kbGU6IEludml0YXRpb25IYW5kbGVTaGFwZSxcbiAgaW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gIGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU2hhcGUsXG59KTskaM2PX29uY2UuSW52aXRhdGlvbkVsZW1lbnRTaGFwZShJbnZpdGF0aW9uRWxlbWVudFNoYXBlKTtcblxuICAgICAgIGNvbnN0IE9mZmVySGFuZGxlckkgPSBNLmludGVyZmFjZSgnT2ZmZXJIYW5kbGVyJywge1xuICBoYW5kbGU6IE0uY2FsbChTZWF0U2hhcGUpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSksXG59KTskaM2PX29uY2UuT2ZmZXJIYW5kbGVySShPZmZlckhhbmRsZXJJKTtcblxuICAgICAgIGNvbnN0IFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlID0gTS5hcnJheU9mKHtcbiAgc2VhdEhhbmRsZTogU2VhdFNoYXBlLFxuICBhbGxvY2F0aW9uOiBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG59KTskaM2PX29uY2UuU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgWm9lTWludFNoYXBlID0gTS5yZW1vdGFibGUoJ1pvZU1pbnQnKTskaM2PX29uY2UuWm9lTWludFNoYXBlKFpvZU1pbnRTaGFwZSk7XG4gICAgICAgY29uc3QgWm9lTWludEkgPSBNLmludGVyZmFjZSgnWm9lTWludCcsIHtcbiAgZ2V0SXNzdWVyUmVjb3JkOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbiAgbWludEFuZEVzY3JvdzogTS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG4gIHdpdGhkcmF3QW5kQnVybjogTS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG59KTskaM2PX29uY2UuWm9lTWludEkoWm9lTWludEkpO1xuXG4gICAgICAgY29uc3QgRmVlTWludEFjY2Vzc1NoYXBlID0gTS5yZW1vdGFibGUoJ0ZlZU1pbnRBY2Nlc3MnKTskaM2PX29uY2UuRmVlTWludEFjY2Vzc1NoYXBlKEZlZU1pbnRBY2Nlc3NTaGFwZSk7XG5cbiAgICAgICBjb25zdCBFeGl0T2JqZWN0SSA9IE0uaW50ZXJmYWNlKCdFeGl0IE9iamVjdCcsIHtcbiAgZXhpdDogTS5jYWxsKCkucmV0dXJucygpLFxufSk7JGjNj19vbmNlLkV4aXRPYmplY3RJKEV4aXRPYmplY3RJKTtcblxuICAgICAgIGNvbnN0IEV4aXRPYmplY3RTaGFwZSA9IE0ucmVtb3RhYmxlKCdFeGl0T2JqJyk7JGjNj19vbmNlLkV4aXRPYmplY3RTaGFwZShFeGl0T2JqZWN0U2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbmNlQWRtaW5TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnN0YW5jZUFkbWluJyk7JGjNj19vbmNlLkluc3RhbmNlQWRtaW5TaGFwZShJbnN0YW5jZUFkbWluU2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbmNlQWRtaW5JID0gTS5pbnRlcmZhY2UoJ0luc3RhbmNlQWRtaW4nLCB7XG4gIG1ha2VJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLCBNLnN0cmluZygpKVxuICAgIC5vcHRpb25hbChNLnJlY29yZCgpLCBNLnBhdHRlcm4oKSlcbiAgICAucmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuICBzYXZlSXNzdWVyOiBNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpLCBLZXl3b3JkU2hhcGUpLnJldHVybnMoXG4gICAgSXNzdWVyUmVjb3JkU2hhcGUsXG4gICksXG4gIG1ha2VOb0VzY3Jvd1NlYXQ6IE0uY2FsbChcbiAgICBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgUHJvcG9zYWxTaGFwZSxcbiAgICBFeGl0T2JqZWN0U2hhcGUsXG4gICAgU2VhdFNoYXBlLFxuICApLnJldHVybnMoU2VhdFNoYXBlKSxcbiAgZXhpdEFsbFNlYXRzOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsQWxsU2VhdHM6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGV4aXRTZWF0OiBNLmNhbGwoU2VhdFNoYXBlLCBNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZhaWxTZWF0OiBNLmNhbGwoU2VhdFNoYXBlLCBNLmFueSgpKS5yZXR1cm5zKCksXG4gIG1ha2Vab2VNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlKVxuICAgIC5vcHRpb25hbChcbiAgICAgIEFzc2V0S2luZFNoYXBlLFxuICAgICAgRGlzcGxheUluZm9TaGFwZSxcbiAgICAgIE0uc3BsaXRSZWNvcmQoe30sIHsgZWxlbWVudFNoYXBlOiBNLnBhdHRlcm4oKSB9KSxcbiAgICApXG4gICAgLnJldHVybnMoTS5yZW1vdGFibGUoJ3pvZU1pbnQnKSksXG4gIHJlZ2lzdGVyRmVlTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSwgRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdmZWVNaW50JyksXG4gICksXG4gIHJlcGxhY2VBbGxvY2F0aW9uczogTS5jYWxsKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKS5yZXR1cm5zKCksXG4gIHN0b3BBY2NlcHRpbmdPZmZlcnM6IE0uY2FsbCgpLnJldHVybnMoKSxcbiAgc2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoKSxcbiAgZ2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbiAgZ2V0RXhpdFN1YnNjcmliZXI6IE0uY2FsbChTZWF0U2hhcGUpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbiAgaXNCbG9ja2VkOiBNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gIHJlcGFpckNvbnRyYWN0Q29tcGxldGlvbldhdGNoZXI6IE0uY2FsbCgpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5JbnN0YW5jZUFkbWluSShJbnN0YW5jZUFkbWluSSk7XG5cbiAgICAgICBjb25zdCBJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCA9IHtcbiAgaW5zdGFuY2VTdG9yYWdlTWFuYWdlcjogTS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLCB7XG4gICAgZ2V0VGVybXM6IE0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG4gICAgZ2V0SXNzdWVyczogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEJyYW5kczogTS5jYWxsKCkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbGxhdGlvblNoYXBlKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuICAgIHNhdmVJc3N1ZXI6IE0uY2FsbChJc3N1ZXJTaGFwZSwgS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBtYWtlWm9lTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSlcbiAgICAgIC5vcHRpb25hbChcbiAgICAgICAgQXNzZXRLaW5kU2hhcGUsXG4gICAgICAgIERpc3BsYXlJbmZvU2hhcGUsXG4gICAgICAgIE0uc3BsaXRSZWNvcmQoe30sIHsgZWxlbWVudFNoYXBlOiBNLnBhdHRlcm4oKSB9KSxcbiAgICAgIClcbiAgICAgIC5yZXR1cm5zKE0uZXJlZihab2VNaW50U2hhcGUpKSxcbiAgICByZWdpc3RlckZlZU1pbnQ6IE0uY2FsbChLZXl3b3JkU2hhcGUsIEZlZU1pbnRBY2Nlc3NTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ucmVtb3RhYmxlKCdmZWVNaW50JyksXG4gICAgKSxcbiAgICBnZXRJbnN0YW5jZVJlY29yZDogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbiAgICBnZXRJc3N1ZXJSZWNvcmRzOiBNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihJc3N1ZXJSZWNvcmRTaGFwZSkpLFxuICAgIGdldFdpdGhkcmF3RmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1dpdGhkcmF3RmFjZXQnKSksXG4gICAgaW5pdEluc3RhbmNlQWRtaW46IE0uY2FsbChcbiAgICAgIEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gICAgICBNLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpLFxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgZGVsZXRlSW5zdGFuY2VBZG1pbjogTS5jYWxsKEluc3RhbmNlQWRtaW5TaGFwZSkucmV0dXJucygpLFxuICAgIG1ha2VJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLCBNLnN0cmluZygpKVxuICAgICAgLm9wdGlvbmFsKE0ucmVjb3JkKCksIE0ucGF0dGVybigpKVxuICAgICAgLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbiAgICBnZXRSb290OiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuICAgIGdldEFkbWluTm9kZTogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpLFxuICB9KSxcbiAgd2l0aGRyYXdGYWNldDogTS5pbnRlcmZhY2UoJ1dpdGhkcmF3RmFjZXQnLCB7XG4gICAgd2l0aGRyYXdQYXltZW50czogTS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcbiAgICAgIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLFxuICAgICksXG4gIH0pLFxuICBoZWxwZXJzOiBNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlciBoZWxwZXInLCB7XG4gICAgd3JhcElzc3VlcktpdFdpdGhab2VNaW50OiBNLmNhbGwoXG4gICAgICBLZXl3b3JkU2hhcGUsXG4gICAgICBJc3N1ZXJLaXRTaGFwZSxcbiAgICAgIE0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSxcbiAgICApLnJldHVybnMoWm9lTWludFNoYXBlKSxcbiAgfSksXG59OyRozY9fb25jZS5JbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdChJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5oYXJkZW4oSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG4gICAgICAgY29uc3QgQnVuZGxlQ2FwU2hhcGUgPSBNLnJlbW90YWJsZSgnYnVuZGxlQ2FwJyk7JGjNj19vbmNlLkJ1bmRsZUNhcFNoYXBlKEJ1bmRsZUNhcFNoYXBlKTtcbiAgICAgICBjb25zdCBCdW5kbGVTaGFwZSA9IE0uYW5kKFxuICBNLnNwbGl0UmVjb3JkKHsgbW9kdWxlRm9ybWF0OiBNLmFueSgpIH0pLFxuICBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0uc3RyaW5nKHsgc3RyaW5nTGVuZ3RoTGltaXQ6IEluZmluaXR5IH0pKSxcbik7JGjNj19vbmNlLkJ1bmRsZVNoYXBlKEJ1bmRsZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAgeyBpbnN0YWxsYXRpb246IEluc3RhbGxhdGlvblNoYXBlIH0sXG4gIHtcbiAgICBidW5kbGU6IE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5zdHJpbmcoeyBzdHJpbmdMZW5ndGhMaW1pdDogSW5maW5pdHkgfSkpLFxuICAgIGJ1bmRsZUNhcDogQnVuZGxlQ2FwU2hhcGUsXG4gICAgYnVuZGxlSUQ6IE0uc3RyaW5nKCksXG4gIH0sXG4gIHt9LFxuKTskaM2PX29uY2UuVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUoVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgWm9lU3RvcmFnZU1hbmFnZXJJS2l0ID0ge1xuICB6b2VTZXJ2aWNlRGF0YUFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UgZGF0YUFjY2VzcycsIHtcbiAgICBnZXRUZXJtczogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG4gICAgZ2V0SXNzdWVyczogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRCcmFuZHM6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSksXG4gICAgKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuICAgIGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjogTS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0uc3RyaW5nKCkpLFxuICAgICksXG4gICAgaW5zdGFsbEJ1bmRsZTogTS5jYWxsKEJ1bmRsZVNoYXBlKVxuICAgICAgLm9wdGlvbmFsKE0uc3RyaW5nKCkpXG4gICAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgaW5zdGFsbEJ1bmRsZUlEOiBNLmNhbGwoTS5zdHJpbmcoKSlcbiAgICAgIC5vcHRpb25hbChNLnN0cmluZygpKVxuICAgICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG4gICAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSxcbiAgICApLFxuICAgIGdldE9mZmVyRmlsdGVyOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuICAgIGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5vcHQoTS5wYXR0ZXJuKCkpLFxuICAgICksXG4gIH0pLFxuICBtYWtlT2ZmZXJBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIG1ha2VPZmZlciBhY2Nlc3MnLCB7XG4gICAgZ2V0QXNzZXRLaW5kQnlCcmFuZDogTS5jYWxsKEJyYW5kU2hhcGUpLnJldHVybnMoQXNzZXRLaW5kU2hhcGUpLFxuICAgIGdldEluc3RhbmNlQWRtaW46IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSxcbiAgICApLFxuICAgIGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5vcHQoTS5wYXR0ZXJuKCkpLFxuICAgICksXG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG4gICAgZGVwb3NpdFBheW1lbnRzOiBNLmNhbGwoUHJvcG9zYWxTaGFwZSwgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG4gICAgICBNLnByb21pc2UoKSxcbiAgICApLFxuICB9KSxcbiAgc3RhcnRJbnN0YW5jZUFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2Ugc3RhcnRJbnN0YW5jZSBhY2Nlc3MnLCB7XG4gICAgbWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI6IE0uY2FsbChcbiAgICAgIEluc3RhbGxhdGlvblNoYXBlLFxuICAgICAgTS5hbnkoKSxcbiAgICAgIElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgICBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICAgICAgTS5vcihCdW5kbGVDYXBTaGFwZSwgQnVuZGxlU2hhcGUpLFxuICAgICAgTS5zdHJpbmcoKSxcbiAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHVud3JhcEluc3RhbGxhdGlvbjogTS5jYWxsV2hlbihNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuICAgICAgVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgKSxcbiAgfSksXG4gIGludml0YXRpb25Jc3N1ZXJBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIGludml0YXRpb25Jc3N1ZXInLCB7XG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG4gIH0pLFxufTskaM2PX29uY2UuWm9lU3RvcmFnZU1hbmFnZXJJS2l0KFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5oYXJkZW4oWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuICAgICAgIGNvbnN0IFpvZVNlcnZpY2VJID0gTS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UnLCB7XG4gIGluc3RhbGw6IE0uY2FsbChNLmFueSgpKS5vcHRpb25hbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgaW5zdGFsbEJ1bmRsZUlEOiBNLmNhbGwoTS5zdHJpbmcoKSkub3B0aW9uYWwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHN0YXJ0SW5zdGFuY2U6IE0uY2FsbChNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKVxuICAgIC5vcHRpb25hbChJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLCBNLnJlY29yZCgpLCBNLnJlY29yZCgpLCBNLnN0cmluZygpKVxuICAgIC5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgb2ZmZXI6IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSlcbiAgICAub3B0aW9uYWwoUHJvcG9zYWxTaGFwZSwgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsIE0uYW55KCkpXG4gICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG4gIGdldE9mZmVyRmlsdGVyOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgTS5hcnJheU9mKE0uc3RyaW5nKCkpLFxuICApLFxuICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0RmVlSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0QnJhbmRzOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICksXG4gIGdldElzc3VlcnM6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICksXG4gIGdldFB1YmxpY0ZhY2V0OiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JyksXG4gICksXG4gIGdldFRlcm1zOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG4gIGdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSksXG4gICksXG4gIGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbGxhdGlvblNoYXBlKSkucmV0dXJucyhcbiAgICBNLmVyZWYoTS5zdHJpbmcoKSksXG4gICksXG5cbiAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRJbnN0YW5jZTogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0Q29uZmlndXJhdGlvbjogTS5jYWxsKCkucmV0dXJucyh7XG4gICAgZmVlSXNzdWVyQ29uZmlnOiB7XG4gICAgICBuYW1lOiBNLnN0cmluZygpLFxuICAgICAgYXNzZXRLaW5kOiAnbmF0JyxcbiAgICAgIGRpc3BsYXlJbmZvOiBEaXNwbGF5SW5mb1NoYXBlLFxuICAgIH0sXG4gIH0pLFxuICBnZXRJbnZpdGF0aW9uRGV0YWlsczogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuICBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICBNLm9wdChNLnBhdHRlcm4oKSksXG4gICksXG59KTskaM2PX29uY2UuWm9lU2VydmljZUkoWm9lU2VydmljZUkpO1xuXG4gICAgICAgY29uc3QgQWRtaW5GYWNldEkgPSBNLmludGVyZmFjZSgnWmNmQWRtaW5GYWNldCcsIHtcbiAgZ2V0VmF0U2h1dGRvd25Qcm9taXNlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgcmVzdGFydENvbnRyYWN0OiBNLmNhbGwoKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgdXBncmFkZUNvbnRyYWN0OiBNLmNhbGwoTS5zdHJpbmcoKSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHRlcm1pbmF0ZUNvbnRyYWN0OiBNLmNhbGwoTS5lcnJvcigpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5BZG1pbkZhY2V0SShBZG1pbkZhY2V0SSk7XG5cbiAgICAgICBjb25zdCBTZWF0RGF0YVNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIHByb3Bvc2FsOiBQcm9wb3NhbFNoYXBlLFxuICAgIGluaXRpYWxBbGxvY2F0aW9uOiBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgc2VhdEhhbmRsZTogU2VhdFNoYXBlLFxuICB9LFxuICB7XG4gICAgb2ZmZXJBcmdzOiBNLmFueSgpLFxuICB9LFxuKTskaM2PX29uY2UuU2VhdERhdGFTaGFwZShTZWF0RGF0YVNoYXBlKTtcblxuICAgICAgIGNvbnN0IEhhbmRsZU9mZmVySSA9IE0uaW50ZXJmYWNlKCdIYW5kbGVPZmZlcicsIHtcbiAgaGFuZGxlT2ZmZXI6IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsIFNlYXREYXRhU2hhcGUpLnJldHVybnMoe1xuICAgIG9mZmVyUmVzdWx0UHJvbWlzZTogTS5wcm9taXNlKCksXG4gICAgZXhpdE9iajogRXhpdE9iamVjdFNoYXBlLFxuICB9KSxcbn0pOyRozY9fb25jZS5IYW5kbGVPZmZlckkoSGFuZGxlT2ZmZXJJKTtcblxuICAgICAgIGNvbnN0IFByaWNlUXVvdGVTaGFwZSA9IHtcbiAgcXVvdGVBbW91bnQ6IEFtb3VudFNoYXBlLFxuICBxdW90ZVBheW1lbnQ6IE0uZXJlZihQYXltZW50U2hhcGUpLFxufTskaM2PX29uY2UuUHJpY2VRdW90ZVNoYXBlKFByaWNlUXVvdGVTaGFwZSk7XG5oYXJkZW4oUHJpY2VRdW90ZVNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IktleXdvcmRTaGFwZSI6WyJLZXl3b3JkU2hhcGUiXSwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIjpbIkludml0YXRpb25IYW5kbGVTaGFwZSJdLCJJbnZpdGF0aW9uU2hhcGUiOlsiSW52aXRhdGlvblNoYXBlIl0sIkluc3RhbmNlSGFuZGxlU2hhcGUiOlsiSW5zdGFuY2VIYW5kbGVTaGFwZSJdLCJJbnN0YWxsYXRpb25TaGFwZSI6WyJJbnN0YWxsYXRpb25TaGFwZSJdLCJTZWF0U2hhcGUiOlsiU2VhdFNoYXBlIl0sIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSI6WyJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSI6WyJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIl0sIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIjpbIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIl0sIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIjpbIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclJlY29yZFNoYXBlIjpbIklzc3VlclJlY29yZFNoYXBlIl0sIlRlcm1zU2hhcGUiOlsiVGVybXNTaGFwZSJdLCJJbnN0YW5jZVJlY29yZFNoYXBlIjpbIkluc3RhbmNlUmVjb3JkU2hhcGUiXSwiSGFuZGxlSSI6WyJIYW5kbGVJIl0sIm1ha2VIYW5kbGVTaGFwZSI6WyJtYWtlSGFuZGxlU2hhcGUiXSwiVGltZXJTaGFwZSI6WyJUaW1lclNoYXBlIl0sIkZ1bGxQcm9wb3NhbFNoYXBlIjpbIkZ1bGxQcm9wb3NhbFNoYXBlIl0sIlByb3Bvc2FsU2hhcGUiOlsiUHJvcG9zYWxTaGFwZSJdLCJFbXB0eVByb3Bvc2FsU2hhcGUiOlsiRW1wdHlQcm9wb3NhbFNoYXBlIl0sImlzT25EZW1hbmRFeGl0UnVsZSI6WyJpc09uRGVtYW5kRXhpdFJ1bGUiXSwiaXNXYWl2ZWRFeGl0UnVsZSI6WyJpc1dhaXZlZEV4aXRSdWxlIl0sImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIjpbImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIl0sIkludml0YXRpb25FbGVtZW50U2hhcGUiOlsiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSJdLCJPZmZlckhhbmRsZXJJIjpbIk9mZmVySGFuZGxlckkiXSwiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiOlsiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiXSwiWm9lTWludFNoYXBlIjpbIlpvZU1pbnRTaGFwZSJdLCJab2VNaW50SSI6WyJab2VNaW50SSJdLCJGZWVNaW50QWNjZXNzU2hhcGUiOlsiRmVlTWludEFjY2Vzc1NoYXBlIl0sIkV4aXRPYmplY3RJIjpbIkV4aXRPYmplY3RJIl0sIkV4aXRPYmplY3RTaGFwZSI6WyJFeGl0T2JqZWN0U2hhcGUiXSwiSW5zdGFuY2VBZG1pblNoYXBlIjpbIkluc3RhbmNlQWRtaW5TaGFwZSJdLCJJbnN0YW5jZUFkbWluSSI6WyJJbnN0YW5jZUFkbWluSSJdLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJCdW5kbGVDYXBTaGFwZSI6WyJCdW5kbGVDYXBTaGFwZSJdLCJCdW5kbGVTaGFwZSI6WyJCdW5kbGVTaGFwZSJdLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSI6WyJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSJdLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiWm9lU3RvcmFnZU1hbmFnZXJJS2l0Il0sIlpvZVNlcnZpY2VJIjpbIlpvZVNlcnZpY2VJIl0sIkFkbWluRmFjZXRJIjpbIkFkbWluRmFjZXRJIl0sIlNlYXREYXRhU2hhcGUiOlsiU2VhdERhdGFTaGFwZSJdLCJIYW5kbGVPZmZlckkiOlsiSGFuZGxlT2ZmZXJJIl0sIlByaWNlUXVvdGVTaGFwZSI6WyJQcmljZVF1b3RlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2fSTtJYBAACWAQAAHgAAAEBhZ29yaWMvem9uZS12MC4yLjIvZHVyYWJsZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kdXJhYmxlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZHVyYWJsZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kdXJhYmxlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIAyUsraEwAA2hMAACIAAABAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9iYXNlLXpvbmUiXSwiZXhwb3J0cyI6WyJtYWtlRHVyYWJsZVpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEZhcixpc1Bhc3NhYmxlLGNhbkJlRHVyYWJsZSxtYWtlU2NhbGFyTWFwU3RvcmUscHJlcGFyZUV4byxwcmVwYXJlRXhvQ2xhc3MscHJlcGFyZUV4b0NsYXNzS2l0LHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUscHJvdmlkZUR1cmFibGVTZXRTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSx3YXRjaFByb21pc2Usa2V5cyxtYWtlT25jZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGlzUGFzc2FibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIixbJGjNj19hID0+IChjYW5CZUR1cmFibGUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9cIixbJGjNj19hID0+IChwcmVwYXJlRXhvID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVTZXRTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlID0gJGjNj19hKV1dLFtcIndhdGNoUHJvbWlzZVwiLFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lXCIsIFtbXCJhZ29yaWNWYXREYXRhS2V5c1wiLFskaM2PX2EgPT4gKGtleXMgPSAkaM2PX2EpXV0sW1wibWFrZU9uY2VLaXRcIixbJGjNj19hID0+IChtYWtlT25jZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICcuL2luZGV4LmpzJztcbiAqIEBpbXBvcnQge1N0b3Jlc30gZnJvbSAnLi9pbmRleC5qcyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKi9cblxuLyoqXG4gKiBBIHZhcmlhbnQgb2YgYGNhbkJlRHVyYWJsZWAgdGhhdCByZXR1cm5zIGBmYWxzZWAgaW5zdGVhZCBvZiBldmVyIHRocm93aW5nLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1N0b3JhYmxlID0gc3BlY2ltZW4gPT4gaXNQYXNzYWJsZShzcGVjaW1lbikgJiYgY2FuQmVEdXJhYmxlKHNwZWNpbWVuKTtcbmhhcmRlbihpc1N0b3JhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0geygpID0+IEJhZ2dhZ2V9IGdldEJhZ2dhZ2VcbiAqL1xuY29uc3QgYXR0YWNoRHVyYWJsZVN0b3JlcyA9IGdldEJhZ2dhZ2UgPT4ge1xuICAvKiogQHR5cGUge1pvbmVbJ21hcFN0b3JlJ119ICovXG4gIGNvbnN0IG1hcFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgYmFnZ2FnZSA9IGdldEJhZ2dhZ2UoKTtcbiAgICBjb25zdCByZXQgPSBwcm92aWRlRHVyYWJsZU1hcFN0b3JlKGJhZ2dhZ2UsIGxhYmVsLCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmV0O1xuICB9O1xuICAvKiogQHR5cGUge1pvbmVbJ3NldFN0b3JlJ119ICovXG4gIGNvbnN0IHNldFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PlxuICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnd2Vha1NldFN0b3JlJ119ICovXG4gIGNvbnN0IHdlYWtTZXRTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgICBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShnZXRCYWdnYWdlKCksIGxhYmVsLCBvcHRpb25zKTtcbiAgLyoqIEB0eXBlIHtab25lWyd3ZWFrTWFwU3RvcmUnXX0gKi9cbiAgY29uc3Qgd2Vha01hcFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PlxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKGdldEJhZ2dhZ2UoKSwgbGFiZWwsIG9wdGlvbnMpO1xuXG4gIC8qKiBAdHlwZSB7U3RvcmVzfSAqL1xuICByZXR1cm4gRmFyKCdkdXJhYmxlU3RvcmVzJywge1xuICAgIGRldGFjaGVkOiAoKSA9PiBkZXRhY2hlZER1cmFibGVTdG9yZXMsXG4gICAgaXNTdG9yYWJsZSxcbiAgICBtYXBTdG9yZSxcbiAgICBzZXRTdG9yZSxcbiAgICB3ZWFrTWFwU3RvcmUsXG4gICAgd2Vha1NldFN0b3JlLFxuICB9KTtcbn07XG5cbi8qKiBAdHlwZSB7U3RvcmVzfSAqL1xuY29uc3QgZGV0YWNoZWREdXJhYmxlU3RvcmVzID0gYXR0YWNoRHVyYWJsZVN0b3JlcygoKSA9PlxuICBtYWtlU2NhbGFyTWFwU3RvcmUoJ2RldGFjaGVkJyksXG4pO1xuXG4vKipcbiAqIENyZWF0ZSBhIHpvbmUgd2hvc2Ugb2JqZWN0cyBwZXJzaXN0IGJldHdlZW4gQWdvcmljIHZhdCB1cGdyYWRlcy5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZUxhYmVsXVxuICogQHJldHVybnMge1pvbmV9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRHVyYWJsZVpvbmUgPSAoYmFnZ2FnZSwgYmFzZUxhYmVsID0gJ2R1cmFibGVab25lJykgPT4ge1xuICBiYWdnYWdlIHx8IEZhaWxgYmFnZ2FnZSByZXF1aXJlZGA7XG5cbiAgY29uc3QgYXR0YWNoZWRTdG9yZXMgPSBhdHRhY2hEdXJhYmxlU3RvcmVzKCgpID0+IGJhZ2dhZ2UpO1xuXG4gIGNvbnN0IHsgbWFrZU9uY2UsIHdyYXBQcm92aWRlciB9ID0gbWFrZU9uY2VLaXQoXG4gICAgYmFzZUxhYmVsLFxuICAgIGF0dGFjaGVkU3RvcmVzLFxuICAgIGJhZ2dhZ2UsXG4gICk7XG5cbiAgLyoqIEB0eXBlIHtab25lWydleG9DbGFzcyddfSAqL1xuICBjb25zdCBleG9DbGFzcyA9ICguLi5hcmdzKSA9PiBwcmVwYXJlRXhvQ2xhc3MoYmFnZ2FnZSwgLi4uYXJncyk7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnZXhvQ2xhc3NLaXQnXX0gKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAtLSBoYXBwZW5zIG9ubHkgaW50ZWdyYXRpbmcgd2l0aCBFbmRvIG1hc3RlciovXG4gIC8qIEB0cy1pZ25vcmUgRklYTUUgaW4gRW5kbyovXG4gIGNvbnN0IGV4b0NsYXNzS2l0ID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG9DbGFzc0tpdChiYWdnYWdlLCAuLi5hcmdzKTtcbiAgLyoqIEB0eXBlIHtab25lWydleG8nXX0gKi9cbiAgY29uc3QgZXhvID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG8oYmFnZ2FnZSwgLi4uYXJncyk7XG5cbiAgY29uc3Qgc3ViWm9uZVN0b3JlID0gd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLm1hcFN0b3JlLCBrZXlzLnpvbmUpO1xuXG4gIC8qKiBAdHlwZSB7Wm9uZVsnc3ViWm9uZSddfSAqL1xuICBjb25zdCBzdWJab25lID0gKGxhYmVsLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAvKiogQHR5cGUge0JhZ2dhZ2V9ICovXG4gICAgY29uc3Qgc3ViQmFnZ2FnZSA9IHN1YlpvbmVTdG9yZShsYWJlbCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG1ha2VEdXJhYmxlWm9uZShzdWJCYWdnYWdlLCBgJHtiYXNlTGFiZWx9LiR7bGFiZWx9YCk7XG4gIH07XG5cbiAgcmV0dXJuIEZhcignZHVyYWJsZVpvbmUnLCB7XG4gICAgZXhvOiB3cmFwUHJvdmlkZXIoZXhvLCBrZXlzLmV4byksXG4gICAgZXhvQ2xhc3M6IHdyYXBQcm92aWRlcihleG9DbGFzcywga2V5cy5leG9DbGFzcyksXG4gICAgZXhvQ2xhc3NLaXQ6IHdyYXBQcm92aWRlcihleG9DbGFzc0tpdCwga2V5cy5leG9DbGFzc0tpdCksXG4gICAgc3ViWm9uZSxcblxuICAgIG1ha2VPbmNlLFxuICAgIHdhdGNoUHJvbWlzZSxcbiAgICBkZXRhY2hlZDogYXR0YWNoZWRTdG9yZXMuZGV0YWNoZWQsXG4gICAgaXNTdG9yYWJsZTogYXR0YWNoZWRTdG9yZXMuaXNTdG9yYWJsZSxcblxuICAgIG1hcFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMubWFwU3RvcmUsIGtleXMuc3RvcmUpLFxuICAgIHNldFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMuc2V0U3RvcmUsIGtleXMuc3RvcmUpLFxuICAgIHdlYWtNYXBTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLndlYWtNYXBTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgd2Vha1NldFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMud2Vha1NldFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRHVyYWJsZVpvbmUobWFrZUR1cmFibGVab25lKTtcbmhhcmRlbihtYWtlRHVyYWJsZVpvbmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUR1cmFibGVab25lIjpbIm1ha2VEdXJhYmxlWm9uZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABvUSGPYQsAAGELAAAsAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvYXBwbHktbGFiZWxpbmctZXJyb3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi90aHJvdy1sYWJlbGVkLmpzIl0sImV4cG9ydHMiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxpc1Byb21pc2UsdGhyb3dMYWJlbGVkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi90aHJvdy1sYWJlbGVkLmpzXCIsIFtbXCJ0aHJvd0xhYmVsZWRcIixbJGjNj19hID0+ICh0aHJvd0xhYmVsZWQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBDYWxscyBgZnVuYyguLi5hcmdzKWAsIGJ1dCBhbm5vdGF0aW5nIGFueSBmYWlsdXJlIGVycm9yIHdpdGggYGxhYmVsYC5cbiAqXG4gKiBJZiBgbGFiZWxgIGlzIG9taXR0ZWQgb3IgYHVuZGVmaW5lZGAsIHRoZW4gdGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gKiBgZnVuYyguLi5hcmdzKS5cbiAqXG4gKiBPdGhlcndpc2UsIGlmIGl0IHN1Y2Nlc3NmdWxseSByZXR1cm5zIGEgbm9uLXByb21pc2UsIHRoYXQgbm9uLXByb21pc2UgaXNcbiAqIHJldHVybmVkLlxuICpcbiAqIElmIGl0IHRocm93cywgcmV0aHJvdyBhIHNpbWlsYXIgZXJyb3Igd2hvc2UgbWVzc2FnZSBpc1xuICogYGBganNcbiAqIGAke2xhYmVsfTogJHtvcmlnaW5hbE1lc3NhZ2V9YFxuICogYGBgXG4gKiBUaGF0IHdheSwgaW4gYW4gZXJyb3IgaGFwcGVucyBkZWVwIHdpdGhpbiBhIHN0YWNrIG9mIGNhbGxzIHRvXG4gKiBgYXBwbHlMYWJlbGluZ0Vycm9yYCwgdGhlIHJlc3VsdGluZyBlcnJvciB3aWxsIHNob3cgdGhlIHN0YWNrIG9mIGxhYmVscy5cbiAqXG4gKiBJZiBpdCByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiBgYXBwbHlMYWJlbGluZ0Vycm9yYCBjYW5ub3QgdGVsbCB1bnRpbCB0aGF0XG4gKiBwcm9taXNlIHNldHRsZXMgd2hldGhlciBpdCByZXByZXNlbnRzIGEgc3VjY2VzcyBvciBmYWlsdXJlLiBTbyBpdCBpbW1lZGlhdGVseVxuICogcmV0dXJucyBhIG5ldyBwcm9taXNlLiBJZiB0aGUgb3JpZ2luYWwgcHJvbWlzZSBmdWxmaWxscywgdGhlbiB0aGVcbiAqIGZ1bGZpbGxtZW50IGlzIHByb3BhZ2F0ZWQgdG8gdGhlIHJldHVybmVkIHByb21pc2UuXG4gKlxuICogSWYgdGhlIHByb21pc2UgcmVqZWN0cyB3aXRoIGFuIGVycm9yLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzXG4gKiByZWplY3RlZCB3aXRoIGEgc2ltaWxhciBwcm9taXNlLCBwcmVmaXhlZCB3aXRoIHRoZSBsYWJlbCBpbiB0aGF0IHNhbWUgd2F5LlxuICpcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbiAgICAgICBjb25zdCBhcHBseUxhYmVsaW5nRXJyb3IgPSAoZnVuYywgYXJncywgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgaWYgKGxhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZnVuYyguLi5hcmdzKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICB0cnkge1xuICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93TGFiZWxlZChlcnIsIGxhYmVsKTtcbiAgfVxuICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAvKiBDYW5ub3QgYmUgYXQtdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgaXMgbm8gdHlwZSBlcnJvciBsb2NhbGx5LiovXG4gICAgLyogUmF0aGVyLCBhIHR5cGUgZXJyb3Igb25seSBhcyBpbXBvcnRlZCBpbnRvIGV4by4qL1xuICAgIC8qIEB0cy1pZ25vcmUgSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsKi9cbiAgICAvKiByZXR1cm4gYSBwcm9taXNlIHdpdGggYSBkaWZmZXJlbnQgcmVqZWN0aW9uIHJlYXNvbi4gQnV0IHRoaXMqL1xuICAgIC8qIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCovXG4gICAgLyogd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciBmdWxmbGwuKi9cbiAgICAvKiBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuICAgIC8qIHdoZW4gYHJlc3VsdGAgd2FzIGEgcmVqZWN0ZWQgcHJvbWlzZS4gSW4gb25seSB0aGlzIGNhc2UgYFJgKi9cbiAgICAvKiBzaG91bGQgYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xuICAgIHJldHVybiBFLndoZW4ocmVzdWx0LCB1bmRlZmluZWQsIHJlYXNvbiA9PiB0aHJvd0xhYmVsZWQocmVhc29uLCBsYWJlbCkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07JGjNj19vbmNlLmFwcGx5TGFiZWxpbmdFcnJvcihhcHBseUxhYmVsaW5nRXJyb3IpO1xuaGFyZGVuKGFwcGx5TGFiZWxpbmdFcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhcHBseUxhYmVsaW5nRXJyb3IiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEj4QsrdBQAA3QUAACsAAABAZW5kby9jb21tb24tdjEuMi4xMy9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImZyb21VbmlxdWVFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEBwYXJhbSB7SXRlcmFibGU8cmVhZG9ubHkgW1Byb3BlcnR5S2V5LCBUXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7IFtrOiBzdHJpbmddOiBUOyB9fVxuICovXG4gICAgICAgY29uc3QgZnJvbVVuaXF1ZUVudHJpZXMgPSBhbGxFbnRyaWVzID0+IHtcbiAgY29uc3QgZW50cmllc0FycmF5ID0gWy4uLmFsbEVudHJpZXNdO1xuICBjb25zdCByZXN1bHQgPSBoYXJkZW4oZnJvbUVudHJpZXMoZW50cmllc0FycmF5KSk7XG4gIGlmIChvd25LZXlzKHJlc3VsdCkubGVuZ3RoID09PSBlbnRyaWVzQXJyYXkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgX10gb2YgZW50cmllc0FycmF5KSB7XG4gICAgaWYgKG5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgRmFpbGBjb2xsaXNpb24gb24gcHJvcGVydHkgbmFtZSAke3EobmFtZSl9OiAke2VudHJpZXNBcnJheX1gO1xuICAgIH1cbiAgICBuYW1lcy5hZGQobmFtZSk7XG4gIH1cbiAgdGhyb3cgRmFpbGBpbnRlcm5hbDogZmFpbGVkIHRvIGNyZWF0ZSBvYmplY3QgZnJvbSB1bmlxdWUgZW50cmllc2A7XG59OyRozY9fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAt5VT7iUIAAAlCAAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2lkZW50LWNoZWNrZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlkZW50Q2hlY2tlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBUT0RPIENvbXBsZXRlIG1pZ3JhdGlvbiBvZiBDaGVja2VyIHR5cGUgZnJvbSBAZW5kby9wYXNzLXN0eWxlIHRvIEBlbmRvL2NvbW1vbiovXG4vKiBieSBoYXZpbmcgQGVuZG8vcGFzcy1zdHlsZSwgYW5kIGV2ZXJ5b25lIGVsc2Ugd2hvIG5lZWRzIGl0LCBpbXBvcnQgaXQgZnJvbSovXG4vKiBgQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNgLiovXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja2VyXG4gKiBJbnRlcm5hbCB0byBhIHVzZWZ1bCBwYXR0ZXJuIGZvciB3cml0aW5nIGNoZWNraW5nIGxvZ2ljXG4gKiAoYSBcImNoZWNrRm9vXCIgZnVuY3Rpb24pIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGEgcHJlZGljYXRlXG4gKiAoYW4gXCJpc0Zvb1wiIGZ1bmN0aW9uKSBvciBhIHZhbGlkYXRvciAoYW4gXCJhc3NlcnRGb29cIiBmdW5jdGlvbikuXG4gKlxuICogICAgKiBBIHByZWRpY2F0ZSBpZGVhbGx5IG9ubHkgcmV0dXJucyBgdHJ1ZWAgb3IgYGZhbHNlYCBhbmQgcmFyZWx5IHRocm93cy5cbiAqICAgICogQSB2YWxpZGF0b3IgdGhyb3dzIGFuIGluZm9ybWF0aXZlIGRpYWdub3N0aWMgd2hlbiB0aGUgcHJlZGljYXRlXG4gKiAgICAgIHdvdWxkIGhhdmUgcmV0dXJuZWQgYGZhbHNlYCwgYW5kIHNpbXBseSByZXR1cm5zIGB1bmRlZmluZWRgIG5vcm1hbGx5XG4gKiAgICAgIHdoZW4gdGhlIHByZWRpY2F0ZSB3b3VsZCBoYXZlIHJldHVybmVkIGB0cnVlYC5cbiAqICAgICogVGhlIGludGVybmFsIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgdGhleSBzaGFyZSBpcyBwYXJhbWV0ZXJpemVkIGJ5IGFcbiAqICAgICAgYENoZWNrZXJgIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gcHJvY2VlZCB3aXRoIGEgZmFpbHVyZSBjb25kaXRpb24uXG4gKiAgICAgIFByZWRpY2F0ZXMgcGFzcyBpbiBhbiBpZGVudGl0eSBmdW5jdGlvbiBhcyBjaGVja2VyLiBWYWxpZGF0b3JzXG4gKiAgICAgIHBhc3MgaW4gYGFzc2VydENoZWNrZXJgIHdoaWNoIGlzIGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCBgYXNzZXJ0YC5cbiAqXG4gKiBTZWUgdGhlIHZhcmlvdXMgdXNlcyBmb3IgZ29vZCBleGFtcGxlcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY29uZFxuICogQHBhcmFtIHtJTVBPUlQoJ3NlcycpLkRldGFpbHN9IFtkZXRhaWxzXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBJbiB0aGUgYGFzc2VydEZvb2AvYGlzRm9vYC9gY2hlY2tGb29gIHBhdHRlcm4sIGBjaGVja0Zvb2AgaGFzIGEgYGNoZWNrYFxuICogcGFyYW1ldGVyIG9mIHR5cGUgYENoZWNrZXJgLiBgYXNzZXJ0Rm9vYCBjYWxscyBgY2hlY2tGb29gIHBhc3Nlc1xuICogYGFzc2VydENoZWNrZXJgIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaXNGb29gIHBhc3NlcyBgaWRlbnRDaGVja2VyYFxuICogYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpZGVudENoZWNrZXJgIGFjdHMgcHJlY2lzZWx5IGxpa2UgYW5cbiAqIGlkZW50aXR5IGZ1bmN0aW9uLCBidXQgaXMgdHlwZWQgYXMgYSBgQ2hlY2tlcmAgdG8gaW5kaWNhdGUgaXRzXG4gKiBpbnRlbmRlZCB1c2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbiAgICAgICBjb25zdCBpZGVudENoZWNrZXIgPSAoY29uZCwgX2RldGFpbHMpID0+IGNvbmQ7JGjNj19vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGGv/Gq4BAAAuAQAACcAAABAZW5kby9jb21tb24tdjEuMi4xMy9saXN0LWRpZmZlcmVuY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImxpc3REaWZmZXJlbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGVsZW1lbnRzIHByZXNlbnQgaW4gdGhlIGBsZWZ0TGlzdGAgYW5kIG5vdFxuICogaW4gdGhlIGByaWdodExpc3RgLiBSZXR1cm4gaW4gdGhlIG9yZGVyIG9mIHRoZWlyIGFwcGVhcmFuY2UgaW4gYGxlZnRMaXN0YC5cbiAqIFVzZXMgdGhlIGNvbXBhcmlzb24gYnVpbHQgaW50byBgU2V0YCBtZW1iZXJzaGlwIChTYW1lVmFsdWVaZXJvKVxuICogd2hpY2ggaXMgbGlrZSBKYXZhU2NyaXB0J3MgYD09PWAgZXhjZXB0IHRoYXQgaXQganVkZ2VzIGFueSBgTmFOYCB0b1xuICogYmUgdGhlIHNhbWUgYXMgYW55IGBOYU5gIGFuZCBpdCBqdWRnZXMgYDBgIHRvIGJlIHRoZSBzYW1lIGEgYC0wYC5cbiAqXG4gKiBUaGlzIGlzIG9mdGVuIHVzZWQgb24gbGlzdHMgb2YgbmFtZXMgdGhhdCBzaG91bGQgbWF0Y2gsIGluIG9yZGVyIHRvIGdlbmVyYXRlXG4gKiB1c2VmdWwgZGlhZ25vc3RpY3MgYWJvdXQgdGhlIHVubWF0Y2hlZCBuYW1lcy5cbiAqXG4gKiBAdGVtcGxhdGUge2FueX0gVlxuICogQHBhcmFtIHtWW119IGxlZnRMaXN0XG4gKiBAcGFyYW0ge1ZbXX0gcmlnaHRMaXN0XG4gKi9cbiAgICAgICBjb25zdCBsaXN0RGlmZmVyZW5jZSA9IChsZWZ0TGlzdCwgcmlnaHRMaXN0KSA9PiB7XG4gIGNvbnN0IHJpZ2h0U2V0ID0gbmV3IFNldChyaWdodExpc3QpO1xuICByZXR1cm4gbGVmdExpc3QuZmlsdGVyKGVsZW1lbnQgPT4gIXJpZ2h0U2V0LmhhcyhlbGVtZW50KSk7XG59OyRozY9fb25jZS5saXN0RGlmZmVyZW5jZShsaXN0RGlmZmVyZW5jZSk7XG5oYXJkZW4obGlzdERpZmZlcmVuY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibGlzdERpZmZlcmVuY2UiOlsibGlzdERpZmZlcmVuY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJexd93kEAAB5BAAAKwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtYXJyYXktaXRlcmF0b3IuanN7ImltcG9ydHMiOlsiLi9tYWtlLWl0ZXJhdG9yLmpzIl0sImV4cG9ydHMiOlsibWFrZUFycmF5SXRlcmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlSXRlcmF0b3I7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VJdGVyYXRvclwiLFskaM2PX2EgPT4gKG1ha2VJdGVyYXRvciA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQSBgaGFyZGVuYGluZyBhbmFsb2cgb2YgQXJyYXkucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0uXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0FycmF5PFQ+fSBhcnJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUFycmF5SXRlcmF0b3IgPSBhcnIgPT4ge1xuICBjb25zdCB7IGxlbmd0aCB9ID0gYXJyO1xuICBsZXQgaSA9IDA7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgIHZhbHVlID0gYXJyW2ldO1xuICAgICAgaSArPSAxO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KTtcbiAgICB9XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdGVybWluYWwgdmFsdWUgZG9lc24ndCBtYXR0ZXIqL1xuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZSB9KTtcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQXJyYXlJdGVyYXRvcihtYWtlQXJyYXlJdGVyYXRvcik7XG5oYXJkZW4obWFrZUFycmF5SXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFycmF5SXRlcmF0b3IiOlsibWFrZUFycmF5SXRlcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXTavegYDAAAGAwAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtaXRlcmF0b3IuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VJdGVyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIE1ha2VzIGEgb25lLXNob3QgaXRlcmFibGUgaXRlcmF0b3IgZnJvbSBhIHByb3ZpZGVkIGBuZXh0YCBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmF0b3JSZXN1bHQ8VD59IG5leHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUl0ZXJhdG9yID0gbmV4dCA9PiB7XG4gIGNvbnN0IGl0ZXIgPSBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiBpdGVyLFxuICAgIG5leHQsXG4gIH0pO1xuICByZXR1cm4gaXRlcjtcbn07JGjNj19vbmNlLm1ha2VJdGVyYXRvcihtYWtlSXRlcmF0b3IpO1xuaGFyZGVuKG1ha2VJdGVyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSXRlcmF0b3IiOlsibWFrZUl0ZXJhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHbnqxlvCgAAbwoAACIAAABAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Y29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8a2V5b2YgTywgUj59XG4gKi9cbiAgICAgICBjb25zdCBvYmplY3RNYXAgPSAob3JpZ2luYWwsIG1hcEZuKSA9PiB7XG4gIGNvbnN0IGVudHMgPSBlbnRyaWVzKG9yaWdpbmFsKTtcbiAgY29uc3QgbWFwRW50cyA9IGVudHMubWFwKFxuICAgIChbaywgdl0pID0+IC8qKiBAdHlwZSB7W2tleW9mIE8sIFJdfSAqLyAoW2ssIG1hcEZuKHYsIGspXSksXG4gICk7XG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxrZXlvZiBPLCBSPn0gKi8gKGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqJog2jsJAAA7CQAAJwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL29iamVjdC1tZXRhLW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWV0YU1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGNyZWF0ZSwgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBMaWtlIGBvYmplY3RNYXBgLCBidXQgYXQgdGhlIHJlZmxlY3RpdmUgbGV2ZWwgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnNcbiAqIHJhdGhlciB0aGFuIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBFeGNlcHQgZm9yIGhhcmRlbmluZywgdGhlIGVkZ2UgY2FzZSBiZWhhdmlvciBpcyBtb3N0bHkgdGhlIG9wcG9zaXRlIG9mXG4gKiB0aGUgYG9iamVjdE1hcGAgZWRnZSBjYXNlcy5cbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIEFsbCBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWwgYXJlIG1hcHBlZCwgZXZlbiBpZiBzeW1ib2wtbmFtZWRcbiAqICAgICAgb3Igbm9uLWVudW1lcmFibGUuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgdGhlIGRlc2NyaXB0b3JcbiAqICAgICAgY29udGFpbmluZyB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXJlIGdpdmVuIHRvIGBtZXRhTWFwRm5gLlxuICogICAgKiBUaGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIGFyZSBhY2NvcmRpbmcgdG8gdGhlIGRlc2NyaXB0b3JzXG4gKiAgICAgIHJldHVybmVkIGJ5IGBtZXRhTWFwRm5gLlxuICogICAgKiBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IHdob3NlIHN0YXRlIGlzXG4gKiAgICAgIG9ubHkgdGhlc2UgbWFwcGVkIG93biBwcm9wZXJ0aWVzLiBJdCB3aWxsIGluaGVyaXQgZnJvbSB0aGUgdGhpcmRcbiAqICAgICAgYXJndW1lbnQgaWYgcHJvdmlkZWQsIGRlZmF1bHRpbmcgdG8gYE9iamVjdC5wcm90b3R5cGVgIGlmIG9taXR0ZWQuXG4gKlxuICogQmVjYXVzZSBhIHByb3BlcnR5IGRlc2NyaXB0b3IgaXMgZGlzdGluY3QgZnJvbSBgdW5kZWZpbmVkYCwgd2UgYnVuZGxlXG4gKiBtYXBwaW5nIGFuZCBmaWx0ZXJpbmcgdG9nZXRoZXIuIFdoZW4gdGhlIGBtZXRhTWFwRm5gIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gKiB0aGF0IHByb3BlcnR5IGlzIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+fSBPXG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAcGFyYW0geyhcbiAqICAgZGVzYzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8T1trZXlvZiBPXT4sXG4gKiAgIGtleToga2V5b2YgT1xuICogKSA9PiAoUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkKX0gbWV0YU1hcEZuXG4gKiBAcGFyYW0ge2FueX0gW3Byb3RvXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuICAgICAgIGNvbnN0IG9iamVjdE1ldGFNYXAgPSAoXG4gIG9yaWdpbmFsLFxuICBtZXRhTWFwRm4sXG4gIHByb3RvID0gT2JqZWN0LnByb3RvdHlwZSxcbikgPT4ge1xuICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob3JpZ2luYWwpO1xuICBjb25zdCBrZXlzID0gb3duS2V5cyhvcmlnaW5hbCk7XG5cbiAgY29uc3QgZGVzY0VudHJpZXMgPSAvKiogQHR5cGUge1tQcm9wZXJ0eUtleSxQcm9wZXJ0eURlc2NyaXB0b3JdW119ICovIChcbiAgICBrZXlzXG4gICAgICAubWFwKGtleSA9PiBba2V5LCBtZXRhTWFwRm4oZGVzY3Nba2V5XSwga2V5KV0pXG4gICAgICAuZmlsdGVyKChbX2tleSwgb3B0RGVzY10pID0+IG9wdERlc2MgIT09IHVuZGVmaW5lZClcbiAgKTtcbiAgcmV0dXJuIGhhcmRlbihjcmVhdGUocHJvdG8sIGZyb21FbnRyaWVzKGRlc2NFbnRyaWVzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWV0YU1hcChvYmplY3RNZXRhTWFwKTtcbmhhcmRlbihvYmplY3RNZXRhTWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1ldGFNYXAiOlsib2JqZWN0TWV0YU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADYs0GCmQUAAJkFAAAlAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvdGhyb3ctbGFiZWxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJ0aHJvd0xhYmVsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEdpdmVuIGFuIGVycm9yIGBpbm5lckVycmAgYW5kIGEgYGxhYmVsYCwgdGhyb3dzIGEgc2ltaWxhclxuICogZXJyb3Igd2hvc2UgbWVzc2FnZSBzdHJpbmcgaXMgYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YC5cbiAqIFNlZSBgYXBwbHlMYWJlbGluZ0Vycm9yYCBmb3IgdGhlIG1vdGl2YXRpbmcgdXNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGlubmVyRXJyXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhYmVsXG4gKiBAcGFyYW0ge0lNUE9SVCgnc2VzJykuR2VuZXJpY0Vycm9yQ29uc3RydWN0b3J9IFtlcnJDb25zdHJ1Y3Rvcl1cbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5Bc3NlcnRNYWtlRXJyb3JPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuICAgICAgIGNvbnN0IHRocm93TGFiZWxlZCA9IChcbiAgaW5uZXJFcnIsXG4gIGxhYmVsLFxuICBlcnJDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZCxcbiAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAodHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJykge1xuICAgIGxhYmVsID0gYFske2xhYmVsfV1gO1xuICB9XG4gIGNvbnN0IG91dGVyRXJyID0gbWFrZUVycm9yKFxuICAgIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG4gICAgZXJyQ29uc3RydWN0b3IsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgYW5ub3RhdGVFcnJvcihvdXRlckVyciwgWGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbiAgdGhyb3cgb3V0ZXJFcnI7XG59OyRozY9fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidGhyb3dMYWJlbGVkIjpbInRocm93TGFiZWxlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA0oqGpogEAAKIBAAAiAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2Vudi1vcHRpb25zLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALwBM4I4FgAAOBYAACwAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLWNoZWNrKi9cblxuLyogYEBlbmRvL2Vudi1vcHRpb25zYCBuZWVkcyB0byBiZSBpbXBvcnRlZCBxdWl0ZSBlYXJseSwgYW5kIHNvIHNob3VsZCovXG4vKiBhdm9pZCBpbXBvcnRpbmcgZnJvbSBzZXMgb3IgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHNlcy4qL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG4vKiBQcmVsdWRlIG9mIGNoZWFwIGdvb2QgLSBlbm91Z2ggaW1pdGF0aW9ucyBvZiB0aGluZ3Mgd2UnZCB1c2Ugb3IqL1xuLyogZG8gZGlmZmVyZW50bHkgaWYgd2UgY291bGQgZGVwZW5kIG9uIHNlcyovXG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgbG9jYWxUaGlzID0gZ2xvYmFsVGhpcztcblxuY29uc3QgeyBPYmplY3QsIFJlZmxlY3QsIEFycmF5LCBTdHJpbmcsIEpTT04sIEVycm9yIH0gPSBsb2NhbFRoaXM7XG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLyogU2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gdGhlIG9uZSBpbiBzZXMnIGNvbW1vbnMuanMgZXZlbiB0aG91Z2ggaXQqL1xuLyogdXNlcyB0aGUgb3RoZXIgdGVjaG5pcXVlLiovXG5jb25zdCB1bmN1cnJ5VGhpcyA9XG4gIGZuID0+XG4gIChyZWNlaXZlciwgLi4uYXJncykgPT5cbiAgICBhcHBseShmbiwgcmVjZWl2ZXIsIGFyZ3MpO1xuY29uc3QgYXJyYXlQdXNoID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuY29uc3QgYXJyYXlJbmNsdWRlcyA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyk7XG5jb25zdCBzdHJpbmdTcGxpdCA9IHVuY3VycnlUaGlzKFN0cmluZy5wcm90b3R5cGUuc3BsaXQpO1xuXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IEZhaWwgPSAobGl0ZXJhbHMsIC4uLmFyZ3MpID0+IHtcbiAgbGV0IG1zZyA9IGxpdGVyYWxzWzBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBtc2cgPSBgJHttc2d9JHthcmdzW2ldfSR7bGl0ZXJhbHNbaSArIDFdfWA7XG4gIH1cbiAgdGhyb3cgRXJyb3IobXNnKTtcbn07XG5cbi8qIGVuZCBwcmVsdWRlKi9cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBgbWFrZUVudmlyb25tZW50Q2FwdG9yYCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZ2V0dGluZyBlbnZpcm9ubWVudFxuICogdmFyaWFibGVzLCBpZiB0aGV5IGFyZSBuZWVkZWQsIGFuZCBhIHdheSB0byBjYXRhbG9nIHRoZSBuYW1lcyBvZiBhbGxcbiAqIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3ZXJlIGNhcHR1cmVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhR2xvYmFsXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtkcm9wTmFtZXNdIERlZmF1bHRzIHRvIGZhbHNlLiBJZiB0cnVlLCBkb24ndCB0cmFja1xuICogbmFtZXMgdXNlZC5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbnZpcm9ubWVudENhcHRvciA9IChhR2xvYmFsLCBkcm9wTmFtZXMgPSBmYWxzZSkgPT4ge1xuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSBbXTtcblxuICAvKipcbiAqIEdldHMgYW4gZW52aXJvbm1lbnQgb3B0aW9uIGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIG9wdGlvbiB2YWx1ZSBvciB0aGVcbiAqIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0U2V0dGluZ1xuICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdE90aGVyVmFsdWVzXVxuICogSWYgcHJvdmlkZWQsIHRoZSBvcHRpb24gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBvciBtYXRjaCBgZGVmYXVsdFNldHRpbmdgLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbiA9IChcbiAgICBvcHRpb25OYW1lLFxuICAgIGRlZmF1bHRTZXR0aW5nLFxuICAgIG9wdE90aGVyVmFsdWVzID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICB0eXBlb2Ygb3B0aW9uTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWUgJHtxKG9wdGlvbk5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG4gICAgdHlwZW9mIGRlZmF1bHRTZXR0aW5nID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gZGVmYXVsdCBzZXR0aW5nICR7cShcbiAgICAgICAgZGVmYXVsdFNldHRpbmcsXG4gICAgICApfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG5cbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQgc2V0dGluZyA9IGRlZmF1bHRTZXR0aW5nO1xuICAgIGNvbnN0IGdsb2JhbFByb2Nlc3MgPSBhR2xvYmFsLnByb2Nlc3MgfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGdsb2JhbEVudiA9XG4gICAgICAodHlwZW9mIGdsb2JhbFByb2Nlc3MgPT09ICdvYmplY3QnICYmIGdsb2JhbFByb2Nlc3MuZW52KSB8fCB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxFbnYgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAob3B0aW9uTmFtZSBpbiBnbG9iYWxFbnYpIHtcbiAgICAgICAgaWYgKCFkcm9wTmFtZXMpIHtcbiAgICAgICAgICBhcnJheVB1c2goY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLCBvcHRpb25OYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IGdsb2JhbEVudltvcHRpb25OYW1lXTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwqL1xuICAgICAgICB0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxuICAgICAgICAgICAgb3B0aW9uTmFtZSxcbiAgICAgICAgICApfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG4gICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICApfWA7XG4gICAgICAgIHNldHRpbmcgPSBvcHRpb25WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3B0T3RoZXJWYWx1ZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2V0dGluZyA9PT0gZGVmYXVsdFNldHRpbmcgfHxcbiAgICAgIGFycmF5SW5jbHVkZXMob3B0T3RoZXJWYWx1ZXMsIHNldHRpbmcpIHx8XG4gICAgICBGYWlsYFVucmVjb2duaXplZCAke3Eob3B0aW9uTmFtZSl9IHZhbHVlICR7cShcbiAgICAgICAgc2V0dGluZyxcbiAgICAgICl9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywgLi4ub3B0T3RoZXJWYWx1ZXNdKX1gO1xuICAgIHJldHVybiBzZXR0aW5nO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFtUPXN0cmluZ11cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QgPSBvcHRpb25OYW1lID0+IHtcbiAgICBjb25zdCBvcHRpb24gPSBnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnJyk7XG4gICAgcmV0dXJuIGZyZWV6ZShvcHRpb24gPT09ICcnID8gW10gOiBzdHJpbmdTcGxpdChvcHRpb24sICcsJykpO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gW1Q9c3RyaW5nXVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7VH0gZWxlbWVudFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9IChvcHRpb25OYW1lLCBlbGVtZW50KSA9PlxuICAgIGFycmF5SW5jbHVkZXMoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChvcHRpb25OYW1lKSwgZWxlbWVudCk7XG5cbiAgY29uc3QgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzID0gKCkgPT4ge1xuICAgIHJldHVybiBmcmVlemUoWy4uLmNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc10pO1xuICB9O1xuICBmcmVlemUoZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzKTtcblxuICByZXR1cm4gZnJlZXplKHtcbiAgICBnZXRFbnZpcm9ubWVudE9wdGlvbixcbiAgICBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0LFxuICAgIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG4gICAgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VFbnZpcm9ubWVudENhcHRvcihtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuZnJlZXplKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5cbi8qKlxuICogRm9yIHRoZSBzaW1wbGUgY2FzZSwgd2hlcmUgdGhlIGdsb2JhbCBpbiBxdWVzdGlvbiBpcyBgZ2xvYmFsVGhpc2AgYW5kIG5vXG4gKiByZXBvcnRpbmcgb2Ygb3B0aW9uIG5hbWVzIGlzIGRlc2lyZWQuXG4gKi9cbiAgICAgICBjb25zdCB7XG4gIGdldEVudmlyb25tZW50T3B0aW9uLFxuICBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0LFxuICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxufSA9IG1ha2VFbnZpcm9ubWVudENhcHRvcihsb2NhbFRoaXMsIHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAamZ24mQNAABkDQAAHQAAAEBlbmRvL2Vycm9ycy12MS4yLjEzL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJGYWlsIiwiWCIsImFubm90YXRlRXJyb3IiLCJhc3NlcnQiLCJiIiwiYmFyZSIsIm1ha2VFcnJvciIsIm5vdGUiLCJxIiwicXVvdGUiLCJyZWRhY3RlZCIsInRocm93UmVkYWN0ZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIFRoaXMgbW9kdWxlIGFzc3VtZXMgdGhlIGV4aXN0ZW5jZSBvZiBhIG5vbi1zdGFuZGFyZCBgYXNzZXJ0YCBob3N0IG9iamVjdC4qL1xuLyogU0VTIHZlcnNpb24gMC4xMS4wIGludHJvZHVjZXMgdGhpcyBnbG9iYWwgb2JqZWN0IGFuZCBlbnRhbmdsZXMgaXQqL1xuLyogd2l0aCB0aGUgYGNvbnNvbGVgIGhvc3Qgb2JqZWN0IGluIHNjb3BlIHdoZW4gaXQgaW5pdGlhbGl6ZXMsKi9cbi8qIGFsbG93aW5nIGVycm9ycywgcGFydGljdWxhcmx5IGFzc2VydGlvbiBlcnJvcnMsIHRvIGhpZGUgdGhlaXIgXCJkZXRhaWxzXCIqL1xuLyogZnJvbSBjYWxsZXJzIHRoYXQgbWlnaHQgY2F0Y2ggdGhvc2UgZXJyb3JzLCB0aGVuIHJldmVhbCB0aGVtIHRvIHRoZSovXG4vKiB1bmRlcmx5aW5nIGNvbnNvbGUuKi9cbi8qIFRvIHRoZSBleHRlbnQgdGhhdCB0aGlzIGBjb25zb2xlYCBpcyBjb25zaWRlcmVkIGEgcmVzb3VyY2UsKi9cbi8qIHRoaXMgbW9kdWxlIG11c3QgYmUgY29uc2lkZXJlZCBhIHJlc291cmNlIG1vZHVsZS4qL1xuXG4vKiBUaGUgYXNzZXJ0aW9ucyByZS1leHBvcnRlZCBoZXJlIGFyZSBkZWZpbmVkIGluKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL0hFQUQvcGFja2FnZXMvc2VzL3NyYy9lcnJvci9hc3NlcnQuanMqL1xuXG5jb25zdCBnbG9iYWxBc3NlcnQgPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuaWYgKGdsb2JhbEFzc2VydCA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BlbmRvL2Vycm9ycydgLFxuICApO1xufVxuXG5jb25zdCBtaXNzaW5nID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtcbiAgJ3R5cGVvZicsXG4gICdlcnJvcicsXG4gICdmYWlsJyxcbiAgJ2VxdWFsJyxcbiAgJ3N0cmluZycsXG4gICdub3RlJyxcbiAgJ2RldGFpbHMnLFxuICAnRmFpbCcsXG4gICdxdW90ZScsXG4gIC8qIEFzIG9mIDIwMjQtMDIsIHRoZSBBZ29yaWMgY2hhaW4ncyBib290c3RyYXAgdmF0IHJ1bnMgd2l0aCBhIHZlcnNpb24gb2YgU0VTIHRoYXQqL1xuICAvKiBwcmVkYXRlcyBhZGRpdGlvbiBvZiB0aGUgJ2JhcmUnIG1ldGhvZCwgc28gd2UgbXVzdCB0b2xlcmF0ZSBpdHMgYWJzZW5jZSBhbmQgZmFsbCovXG4gIC8qIGJhY2sgdG8gcXVvdGUgYmVoYXZpb3IgaW4gdGhhdCBlbnZpcm9ubWVudCAoc2VlIGJlbG93KS4qL1xuICAvKiAnYmFyZScsKi9cbiAgJ21ha2VBc3NlcnQnLFxuXSkuZmlsdGVyKG5hbWUgPT4gZ2xvYmFsQXNzZXJ0W25hbWVdID09PSB1bmRlZmluZWQpO1xuaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4gICAgICAnLCAnLFxuICAgICl9YCxcbiAgKTtcbn1cblxuLyogVGhlIGdsb2JhbCBhc3NlcnQgbWl4ZWQgYXNzZXJ0aW9ucyBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuKi9cbi8qIFRoaXMgbW9kdWxlIHNwbGl0cyB0aGVtIGFwYXJ0Ki9cbi8qIGFuZCBhbHNvIHVwZGF0ZXMgdGhlIG5hbWVzIG9mIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucy4qL1xuY29uc3Qge1xuICBiYXJlLFxuICBkZXRhaWxzOiByZWRhY3RlZCxcbiAgZXJyb3I6IG1ha2VFcnJvcixcbiAgRmFpbDogdGhyb3dSZWRhY3RlZCxcbiAgbWFrZUFzc2VydDogX29taXR0ZWRNYWtlQXNzZXJ0LFxuICBub3RlLFxuICBxdW90ZSxcbiAgLi4uYXNzZXJ0aW9uc1xufSA9IGdsb2JhbEFzc2VydDtcbi8qKiBAdHlwZSB7SU1QT1JUKFwic2VzXCIpLkFzc2VydGlvbkZ1bmN0aW9ucyB9ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIG1pc3NpbmcgcHJvcGVydGllcyBhc3NpZ25lZCBuZXh0Ki8kaM2PX29uY2UucmVkYWN0ZWQocmVkYWN0ZWQpOyRozY9fb25jZS5tYWtlRXJyb3IobWFrZUVycm9yKTskaM2PX29uY2UudGhyb3dSZWRhY3RlZCh0aHJvd1JlZGFjdGVkKTskaM2PX29uY2Uubm90ZShub3RlKTskaM2PX29uY2UucXVvdGUocXVvdGUpO1xuY29uc3QgYXNzZXJ0ID0gKHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKSA9PlxuICBnbG9iYWxBc3NlcnQodmFsdWUsIG9wdERldGFpbHMsIGVyckNvbnRydWN0b3IsIG9wdGlvbnMpOyRozY9fb25jZS5hc3NlcnQoYXNzZXJ0KTtcbk9iamVjdC5hc3NpZ24oYXNzZXJ0LCBhc3NlcnRpb25zKTtcblxuLyogQXMgb2YgMjAyNC0wMiwgdGhlIEFnb3JpYyBjaGFpbidzIGJvb3RzdHJhcCB2YXQgcnVucyB3aXRoIGEgdmVyc2lvbiBvZiBTRVMqL1xuLyogdGhhdCBwcmVkYXRlcyB0aGUgYWRkaXRpb24gb2YgdGhlICdiYXJlJyBtZXRob2QsIHNvIHdlIG11c3QgZmFsbCBiYWNrIHRvKi9cbi8qIHF1b3RlIGJlaGF2aW9yIGZvciB0aGF0IGVudmlyb25tZW50LiovXG5jb25zdCBiYXJlT3JRdW90ZSA9IGJhcmUgfHwgcXVvdGU7XG5cbi8qIFhYWCBtb2R1bGUgZXhwb3J0cyBmYWlsIGlmIHRoZXNlIGFyZW4ndCBpbiBzY29wZSovXG4vKiogQGltcG9ydCB7QXNzZXJ0TWFrZUVycm9yT3B0aW9ucywgRGV0YWlscywgR2VuZXJpY0Vycm9yQ29uc3RydWN0b3J9IGZyb20gJ3NlcycgKi8kaM2PX29uY2UuYmFyZU9yUXVvdGUoYmFyZU9yUXVvdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVkYWN0ZWQiOlsicmVkYWN0ZWQiXSwiWCI6WyJyZWRhY3RlZCJdLCJtYWtlRXJyb3IiOlsibWFrZUVycm9yIl0sInRocm93UmVkYWN0ZWQiOlsidGhyb3dSZWRhY3RlZCJdLCJGYWlsIjpbInRocm93UmVkYWN0ZWQiXSwibm90ZSI6WyJub3RlIl0sImFubm90YXRlRXJyb3IiOlsibm90ZSJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sImFzc2VydCI6WyJhc3NlcnQiXSwiYmFyZSI6WyJiYXJlT3JRdW90ZSJdLCJiIjpbImJhcmVPclF1b3RlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANPpRggQRwAAEEcAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIiwiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHRyYWNrVHVybnMsbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLFskaM2PX2EgPT4gKHRyYWNrVHVybnMgPSAkaM2PX2EpXV1dXSxbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCwgZXJyb3I6IG1ha2VFcnJvciB9ID0gYXNzZXJ0O1xuY29uc3QgeyBhc3NpZ24sIGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEBpbXBvcnQgeyBIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yLCBSZW1vdGFibGVCcmFuZCwgQ2FsbGFibGUsIFNldHRsZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCBvblNlbmQgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fU0VORF9CUkVBS1BPSU5UUycpO1xuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlciA9IHtcbiAgc2V0KF90YXJnZXQsIF9wcm9wLCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzRXh0ZW5zaWJsZShfdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZihfdGFyZ2V0LCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIF9wcm9wKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxufTtcblxuLyogRSBQcm94eSBoYW5kbGVycyBwcmV0ZW5kIHRoYXQgYW55IHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgdGFyZ2V0IGFuZCByZXR1cm5zKi9cbi8qIGEgZnVuY3Rpb24gZm9yIHRoZWlyIHZhbHVlLiBXaGlsZSB0aGlzIGZ1bmN0aW9uIGlzIFwiYm91bmRcIiBieSBjb250ZXh0LCBpdCBpcyovXG4vKiBtZWFudCB0byBiZSBjYWxsZWQgYXMgYSBtZXRob2QuIEZvciB0aGF0IHJlYXNvbiwgdGhlIHJldHVybmVkIGZ1bmN0aW9uKi9cbi8qIGluY2x1ZGVzIGEgY2hlY2sgdGhhdCB0aGUgYHRoaXNgIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsKi9cbi8qIHJlY2VpdmVyIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZXRyaWV2ZWQuKi9cbi8qIEUgUHJveHkgaGFuZGxlcnMgYWxzbyBmb3J3YXJkIGRpcmVjdCBjYWxscyB0byB0aGUgdGFyZ2V0IGluIGNhc2UgdGhlIHJlbW90ZSovXG4vKiBpcyBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYW4gb2JqZWN0LiBObyBzdWNoIHJlY2VpdmVyIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGluKi9cbi8qIHRoYXQgY2FzZS4qL1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRSh4KS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVjaXBpZW50IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcjx1bmtub3duPn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbiAgICAgICAgICAvKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuICAgICAgICAgIC8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4gICAgICAgICAgLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuICAgICAgICAgIC8qKiBAdHlwZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPHVua25vd24+fSAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgaWYgKHRoaXMgIT09IHJlY2VpdmVyKSB7XG4gICAgICAgICAgICAgIC8qIFJlamVjdCB0aGUgYXN5bmMgZnVuY3Rpb24gY2FsbCovXG4gICAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICAgICAgbWFrZUVycm9yKFxuICAgICAgICAgICAgICAgICAgWGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShwcm9wZXJ0eUtleSl9XCIgbWV0aG9kIG9mIEUoJHtxKFxuICAgICAgICAgICAgICAgICAgICByZWNpcGllbnQsXG4gICAgICAgICAgICAgICAgICApfSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICAgICAgICAgICAgZGVidWdnZXI7IC8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbiAgICAgICAgICAgICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIG1ldGhvZC1jYWxsKi9cbiAgICAgICAgICAgICAgLyogbWVzc2FnZSwqL1xuICAgICAgICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovXG4gICAgICAgIH1bcHJvcGVydHlLZXldLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ0FycmF5ID0gW10pID0+IHtcbiAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBmdW5jdGlvbi1jYWxsIG1lc3NhZ2UsKi9cbiAgICAgICAgLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbiAgICAgICAgLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuICAgICAgfVxuICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdBcnJheSk7XG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBfcCkgPT4ge1xuICAgICAgLyogV2UganVzdCBwcmV0ZW5kIGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuc2VuZE9ubHkoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7YW55fSByZWNpcGllbnQgQW55IHZhbHVlIHBhc3NlZCB0byBFLnNlbmRPbmx5KHgpXG4gKiBAcGFyYW0ge0hhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyPHVua25vd24+fSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyID0gKHJlY2lwaWVudCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oXG4gICAgICAgIHtcbiAgICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4gICAgICAgICAgLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbiAgICAgICAgICAvKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuICAgICAgICAgIC8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbiAgICAgICAgICAvKiogQHR5cGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gdW5kZWZpbmVkfSAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG4gICAgICAgICAgICB0aGlzID09PSByZWNlaXZlciB8fFxuICAgICAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICApfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShyZWNpcGllbnQpfSlgO1xuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgbWV0aG9kLWNhbGwqL1xuICAgICAgICAgICAgICAvKiBtZXNzYWdlLCovXG4gICAgICAgICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdzQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICAgICAgZGVidWdnZXI7IC8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbiAgICAgICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIGZ1bmN0aW9uLWNhbGwgbWVzc2FnZSwqL1xuICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICB9XG4gICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LCBhcmdzQXJyYXkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLmdldCh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLmdldCh4KVxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcjx1bmtub3duPn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVHZXRQcm94eUhhbmRsZXIgPSAoeCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBoYXM6IChfdGFyZ2V0LCBfcHJvcCkgPT4gdHJ1ZSxcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiBIYW5kbGVkUHJvbWlzZS5nZXQoeCwgcHJvcCksXG4gIH0pO1xuXG4vKipcbiAqIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgdGhlIHByb3h5IHRhcmdldCBzbyBpdCByZW1haW5zIHRyYXBwaW5nLlxuICogVGh1cywgaXQgc2hvdWxkIG5vdCBiZSBzaGFyZWQgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZFxuICovXG5jb25zdCBmdW5jVGFyZ2V0ID0gZnJlZXplKCgpID0+IHt9KTtcblxuLyoqXG4vKipcbiAqIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgdGhlIHByb3h5IHRhcmdldCBzbyBpdCByZW1haW5zIHRyYXBwaW5nLlxuICogVGh1cywgaXQgc2hvdWxkIG5vdCBiZSBzaGFyZWQgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZFxuICovXG5jb25zdCBvYmpUYXJnZXQgPSBmcmVlemUoeyBfX3Byb3RvX186IG51bGwgfSk7XG5cbi8qKlxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICovXG5jb25zdCBtYWtlRSA9IEhhbmRsZWRQcm9taXNlID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBhc3NpZ24oXG4gICAgICAvKipcbiAqIEUoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gY2FsbCBhcmJpdHJhcnkgbWV0aG9kcy4gRWFjaCBvZiB0aGVzZVxuICogbWV0aG9kIGNhbGxzIHJldHVybnMgYSBwcm9taXNlLiBUaGUgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBvbiB3aGF0ZXZlclxuICogJ3gnIGRlc2lnbmF0ZXMgKG9yIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogQW4gZXhhbXBsZSBjYWxsIHdvdWxkIGJlXG4gKlxuICogRSh6b2UpLmluc3RhbGwoYnVuZGxlKVxuICogICAudGhlbihpbnN0YWxsYXRpb25IYW5kbGUgPT4geyAuLi4gfSlcbiAqICAgLmNhdGNoKGVyciA9PiB7IC4uLiB9KTtcbiAqXG4gKiAgU2VlIGh0dHBzOi8vZW5kb2pzLmdpdGh1Yi5pby9lbmRvL2Z1bmN0aW9ucy9fZW5kb19mYXIuRS5odG1sIGZvciBkZXRhaWxzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCB0eXBlZGVmKi9cbiAgICAgIHggPT4gbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFUHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG4gICAgICB7XG4gICAgICAgIC8qKlxuICogRS5nZXQoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gZ2V0IGFyYml0cmFyeSBwcm9wZXJ0aWVzLlxuICogRWFjaCBvZiB0aGVzZSBwcm9wZXJ0aWVzIHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgcHJvcGVydHkuICBUaGUgcHJvbWlzZVxuICogdmFsdWUgd2lsbCBiZSB0aGUgcHJvcGVydHkgZmV0Y2hlZCBmcm9tIHdoYXRldmVyICd4JyBkZXNpZ25hdGVzIChvclxuICogcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgcHJvcGVydHkgZ2V0XG4gKiBAcmV0dXJucyB7RUdldHRlcnM8TG9jYWxSZWNvcmQ8VD4+fSBwcm9wZXJ0eSBnZXQgcHJveHlcbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIHR5cGVkZWYqL1xuICAgICAgICBnZXQ6IHggPT4gbmV3IFByb3h5KG9ialRhcmdldCwgbWFrZUVHZXRQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKipcbiAqIEUucmVzb2x2ZSh4KSBjb252ZXJ0cyB4IHRvIGEgaGFuZGxlZCBwcm9taXNlLiBJdCBpc1xuICogc2hvcnRoYW5kIGZvciBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gaGFuZGxlZCBwcm9taXNlIGZvciB4XG4gKiBAcmVhZG9ubHlcbiAqL1xuICAgICAgICByZXNvbHZlOiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlLFxuXG4gICAgICAgIC8qKlxuICogRS5zZW5kT25seSByZXR1cm5zIGEgcHJveHkgc2ltaWxhciB0byBFLCBidXQgZm9yIHdoaWNoIHRoZSByZXN1bHRzXG4gKiBhcmUgaWdub3JlZCAodW5kZWZpbmVkIGlzIHJldHVybmVkKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgc2VuZE9ubHk6IHggPT5cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCB0eXBlZGVmKi9cbiAgICAgICAgICBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qKlxuICogRS53aGVuKHgsIHJlcywgcmVqKSBpcyBlcXVpdmFsZW50IHRvXG4gKiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4ocmVzLCByZWopXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVSA9IFRdXG4gKiBAcGFyYW0ge1R8UHJvbWlzZUxpa2U8VD59IHggdmFsdWUgdG8gY29udmVydCB0byBhIGhhbmRsZWQgcHJvbWlzZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IEVSZWY8VT59IFtvbmZ1bGZpbGxlZF1cbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiBFUmVmPFU+fSBbb25yZWplY3RlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFU+fVxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgd2hlbjogKHgsIG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSA9PlxuICAgICAgICAgIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbiAgICAgICAgICAgIC4uLnRyYWNrVHVybnMoW29uZnVsZmlsbGVkLCBvbnJlamVjdGVkXSksXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgKSxcbiAgKTtcbn07XG5cbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxtYWtlRT59IEVQcm94eSAqL1xuXG4vKipcbiAqIERlY2xhcmUgYW4gb2JqZWN0IHRoYXQgaXMgcG90ZW50aWFsbHkgYSBmYXIgcmVmZXJlbmNlIG9mIHR5cGUgUHJpbWFyeSB3aG9zZVxuICogYXV4aWxsaWFyeSBkYXRhIGhhcyB0eXBlIExvY2FsLiAgVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBjb25zdW1lcnMgb2ZcbiAqIEZhciBvYmplY3RzIGluIGFyZ3VtZW50cyBhbmQgZGVjbGFyYXRpb25zOyB0aGUgb25seSBjcmVhdG9ycyBvZiBGYXIgb2JqZWN0c1xuICogYXJlIGRpc3RyaWJ1dGVkIG9iamVjdCBjcmVhdG9yIGNvbXBvbmVudHMgbGlrZSB0aGUgYEZhcmAgb3IgYFJlbW90YWJsZWBcbiAqIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgUHJpbWFyeSBUaGUgdHlwZSBvZiB0aGUgcHJpbWFyeSByZWZlcmVuY2UuXG4gKiBAdGVtcGxhdGUgW0xvY2FsPURhdGFPbmx5PFByaW1hcnk+XSBUaGUgbG9jYWwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0LlxuICogQHR5cGVkZWYge0VSZWY8TG9jYWwgJiBSZW1vdGFibGVCcmFuZDxMb2NhbCwgUHJpbWFyeT4+fSBGYXJSZWZcbiAqL1xuXG4vKipcbiAqIGBEYXRhT25seTxUPmAgbWVhbnMgdG8gcmV0dXJuIGEgcmVjb3JkIHR5cGUgYFQyYCBjb25zaXN0aW5nIG9ubHkgb2ZcbiAqIHByb3BlcnRpZXMgdGhhdCBhcmUgKm5vdCogZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIHRvIGJlIGZpbHRlcmVkLlxuICogQHR5cGVkZWYge09taXQ8VCwgRmlsdGVyZWRLZXlzPFQsIENhbGxhYmxlPj59IERhdGFPbmx5XG4gKi9cblxuLyoqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxMzk0fVxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQcm9taXNlTGlrZTxUPiB8IFR9IEVSZWZcbiAqIERlY2xhcmUgdGhhdCBgVGAgbWF5IG9yIG1heSBub3QgYmUgYSBQcm9taXNlLiAgVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvclxuICogY29uc3VtZXJzIG9mIGFyZ3VtZW50cyBhbmQgZGVjbGFyYXRpb25zOyByZXR1cm4gdmFsdWVzIHNob3VsZCBzcGVjaWZpY2FsbHkgYmVcbiAqIGBQcm9taXNlPFQ+YCBvciBgVGAgaXRzZWxmLlxuICovXG5cbi8qKlxuICogVGhlIGF3YWl0ZWQgcmV0dXJuIHR5cGUgb2YgYSBmdW5jdGlvbi5cbiAqIEZvciB0aGUgZXZlbnR1YWwgcmVzdWx0IG9mIGFuIEUgY2FsbCwgQHNlZSB7RVJlc3VsdH0gb3IgQHNlZSB7RUNhbGxhYmxlUmV0dXJufVxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBpbmZlciBSID8gQXdhaXRlZDxSPiA6IG5ldmVyfSBFUmV0dXJuXG4gKi9cblxuLyoqXG4gKiBBbiBldmVudHVhbCB2YWx1ZSB3aGVyZSByZW1vdGFibGUgb2JqZWN0cyBhcmUgcmVjdXJzaXZlbHkgbWFwcGVkIHRvIFJlbW90ZSB0eXBlc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QXdhaXRlZDxUPn0gRVJlc3VsdFxuICovXG5cbi8qKlxuICogRXhwZXJpbWVudGFsIHR5cGUgbWFwcGluZyByZW1vdGFibGUgb2JqZWN0cyB0byBSZW1vdGUgdHlwZXNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgMCBleHRlbmRzICgxICYgVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgVCBpcyBhbnlcbiAqICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBhbnkgdHlwZSB0aHJvdWdoIHRoZSByZXN1bHRcbiAqICAgICA6IFQgZXh0ZW5kcyBSZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBQPiAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIFJlbW90YWJsZVxuICogICAgICAgPyAoUCB8IFJlbW90YWJsZUJyYW5kPEwsIFA+KSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXAgaXQgdG8gaXRzIFwibWF5YmUgcmVtb3RlXCIgZm9ybSAocHJpbWFyeSBiZWhhdmlvciBvciByZW1vdGFibGUgcHJlc2VuY2UpXG4gKiAgICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgICAgIC8vIElmIFQgaXMgYSBwcm9taXNlXG4gKiAgICAgICAgID8gUHJvbWlzZTxFQXdhaXRlZFJlc3VsdDxBd2FpdGVkPFQ+Pj4gICAgICAgICAgICAgIC8vIG1hcCBpdHMgcmVzb2x1dGlvblxuICogICAgICAgICA6IFQgZXh0ZW5kcyAobnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzeW1ib2wgfCBiaWdpbnQgfCBDYWxsYWJsZSkgLy8gSW50ZXJzZWN0aW9ucyBvZiB0aGVzZSB0eXBlcyB3aXRoIG9iamVjdHMgYXJlIG5vdCBtYXBwZWRcbiAqICAgICAgICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbWl0aXZlcyBhbmQgbm9uLXJlbW90YWJsZSBmdW5jdGlvbnMgYXJlIHBhc3NlZC10aHJvdWdoXG4gKiAgICAgICAgICAgOiBUIGV4dGVuZHMgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gKiAgICAgICAgICAgICA/IHsgW1AgaW4ga2V5b2YgVF06IEVBd2FpdGVkUmVzdWx0PFRbUF0+OyB9ICAgIC8vIG90aGVyIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgY29weSBkYXRhIGFuZCBwcm9wZXJ0aWVzIG1hcHBlZFxuICogICAgICAgICAgICAgOiBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIGFueXRoaW5nIHdhc24ndCBjb3ZlcmVkLCBmYWxsYmFjayB0byBwYXNzLXRocm91Z2hcbiAqICl9IEVBd2FpdGVkUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBUaGUgQHNlZSB7RVJlc3VsdH0gcmV0dXJuIHR5cGUgb2YgYSByZW1vdGUgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gVFxuICogQHR5cGVkZWYgeyhcbiAqICAgMCBleHRlbmRzICgxICYgVCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIFQgaXMgYW55XG4gKiAgICAgPyBhbnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgdGhlIGFueSB0eXBlIHRocm91Z2ggdGhlIHJlc3VsdFxuICogICAgIDogVCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gaW5mZXIgUiAgLy8gRWxzZSBpbmZlciB0aGUgcmV0dXJuIHR5cGVcbiAqICAgICAgID8gRVJlc3VsdDxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoZSBmdXR1cmUsIG1hcCB0aGUgZXZlbnR1YWwgcmVzdWx0XG4gKiAgICAgICA6IG5ldmVyXG4gKiApfSBFQ2FsbGFibGVSZXR1cm5cbiAqL1xuXG4vKiBUT0RPOiBGaWd1cmUgb3V0IGEgd2F5IHRvIG1hcCBnZW5lcmljIGNhbGxhYmxlIHJldHVybiB0eXBlcywgb3IgYXQgbGVhc3QgYmV0dGVyIGRldGVjdCB0aGVtLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy82MTgzOC4gV2l0aG91dCB0aGF0LCBgRShzdGFydEdvdmVybmVkVXBncmFkYWJsZSlgKi9cbi8qIGluIGFnb3JpYy1zZGsgZG9lc24ndCBwcm9wYWdhdGUgdGhlIHN0YXJ0IGZ1bmN0aW9uIHR5cGUuKi9cbi8qKlxuICogTWFwcyBhIGNhbGxhYmxlIHRvIGl0cyByZW1vdGVseSBjYWxsZWQgdHlwZVxuICpcbiAqIEB0ZW1wbGF0ZSB7Q2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgICBSZXR1cm5UeXBlPFQ+IGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBjYWxsYWJsZSByZXR1cm5zIGEgcHJvbWlzZVxuICogICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnlwYXNzIG1hcHBpbmcgdG8gbWFpbnRhaW4gYW55IGdlbmVyaWNcbiAqICAgICAgOiAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTxFQ2FsbGFibGVSZXR1cm48VD4+IC8vIE1hcCBpdCBhbnl3YXkgdG8gZW5zdXJlIHByb21pc2UgcmV0dXJuIHR5cGVcbiAqICl9IEVDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IFRbUF1cbiAqICAgICA6IFByb21pc2U8QXdhaXRlZDxUW1BdPj47XG4gKiB9fSBFR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDYWxsYWJsZX0gVFxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBQcm9taXNlPHZvaWQ+fSBFU2VuZE9ubHlDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFRbUF0+XG4gKiAgICAgOiBuZXZlcjtcbiAqIH19IEVTZW5kT25seU1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFQ+ICYgRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICAgICA6IDAgZXh0ZW5kcyAoMSAmIFQpXG4gKiAgICAgICA/IG5ldmVyXG4gKiAgICAgICA6IEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gRUNhbGxhYmxlPFQ+ICYgRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiAgICAgOiAwIGV4dGVuZHMgKDEgJiBUKVxuICogICAgICAgPyBuZXZlclxuICogICAgICAgOiBFTWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICl9IEVDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogUmV0dXJuIGEgdW5pb24gb2YgcHJvcGVydHkgbmFtZXMvc3ltYm9scy9udW1iZXJzIFAgZm9yIHdoaWNoIHRoZSByZWNvcmQgZWxlbWVudCBUW1BdJ3MgdHlwZSBleHRlbmRzIFUuXG4gKlxuICogR2l2ZW4gY29uc3QgeCA9IHsgYTogMTIzLCBiOiAnaGVsbG8nLCBjOiA0MiwgNDk6ICgpID0+IHt9LCA1MzogNjcgfSxcbiAqXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIG51bWJlcj4gaXMgdGhlIHR5cGUgJ2EnIHwgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIHN0cmluZz4gaXMgdGhlIHR5cGUgJ2InLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCA0MiB8IDY3PiBpcyB0aGUgdHlwZSAnYycgfCA1My5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgYm9vbGVhbj4gaXMgdGhlIHR5cGUgbmV2ZXIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAdHlwZWRlZiB7eyBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFUgPyBQIDogbmV2ZXI7IH1ba2V5b2YgVF19IEZpbHRlcmVkS2V5c1xuICovXG5cbi8qKlxuICogYFBpY2tDYWxsYWJsZTxUPmAgbWVhbnMgdG8gcmV0dXJuIGEgc2luZ2xlIHJvb3QgY2FsbGFibGUgb3IgYSByZWNvcmQgdHlwZVxuICogY29uc2lzdGluZyBvbmx5IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBSZXR1cm5UeXBlPFQ+ICAgICAgICAgICAgICAgICAgICAgLy8gYSByb290IGNhbGxhYmxlLCBubyBtZXRob2RzXG4gKiAgICAgOiBQaWNrPFQsIEZpbHRlcmVkS2V5czxULCBDYWxsYWJsZT4+ICAgICAgICAgIC8vIGFueSBjYWxsYWJsZSBtZXRob2RzXG4gKiApfSBQaWNrQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIGBSZW1vdGVGdW5jdGlvbnM8VD5gIG1lYW5zIHRvIHJldHVybiB0aGUgZnVuY3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlbW90ZWx5IGNhbGxhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj4gICAvLyBpZiBhIGdpdmVuIFQgaXMgc29tZSByZW1vdGUgaW50ZXJmYWNlIFJcbiAqICAgICA/IFBpY2tDYWxsYWJsZTxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIGNhbGxhYmxlIHByb3BlcnRpZXMgb2YgUlxuICogICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+ICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIFQgaXMgYSBwcm9taXNlXG4gKiAgICAgICA/IFJlbW90ZUZ1bmN0aW9uczxVPiAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2Ugb24gdGhlIHJlc29sdmVkIHZhbHVlIG9mIFRcbiAqICAgICAgIDogVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZXR1cm4gVFxuICogKX0gUmVtb3RlRnVuY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+XG4gKiAgICAgPyBMXG4gKiAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IExvY2FsUmVjb3JkPFU+XG4gKiAgICAgOiBUXG4gKiApfSBMb2NhbFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtSID0gdW5rbm93bl1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHByb21pc2U6IFByb21pc2U8Uj47XG4gKiAgIHNldHRsZXI6IFNldHRsZXI8Uj47XG4gKiB9fSBFUHJvbWlzZUtpdFxuICovXG5cbi8qKlxuICogRGVjbGFyZSBhIG5lYXIgb2JqZWN0IHRoYXQgbXVzdCBvbmx5IGJlIGludm9rZWQgd2l0aCBFLCBldmVuIGxvY2FsbHkuICBJdFxuICogc3VwcG9ydHMgdGhlIGBUYCBpbnRlcmZhY2UgYnV0IGFkZGl0aW9uYWxseSBwZXJtaXRzIGBUYCdzIG1ldGhvZHMgdG8gcmV0dXJuXG4gKiBgUHJvbWlzZUxpa2VgcyBldmVuIGlmIGBUYCBkZWNsYXJlcyB0aGVtIGFzIG9ubHkgc3luY2hyb25vdXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFQ+Pj4+XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZT5cbiAqICAgICA/IHtcbiAqICAgICAgICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgICAgICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFRbS10+Pj4+XG4gKiAgICAgICAgICAgOiBUW0tdO1xuICogICAgICAgfVxuICogICAgIDogVFxuICogKX0gRU9ubHlcbiAqLyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHOVMVJyFAAAchQAACcAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbG9jYWwuanN7ImltcG9ydHMiOlsiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TWV0aG9kTmFtZXMiLCJsb2NhbEFwcGx5RnVuY3Rpb24iLCJsb2NhbEFwcGx5TWV0aG9kIiwibG9jYWxHZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBnZXRQcm90b3R5cGVPZiwgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5LCBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG5jb25zdCBudHlwZW9mID0gc3BlY2ltZW4gPT4gKHNwZWNpbWVuID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHNwZWNpbWVuKTtcblxuY29uc3Qgb25EZWxpdmVyeSA9IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19ERUxJVkVSWV9CUkVBS1BPSU5UUycpO1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCBgaXNQcmltaXRpdmVgIHRoYXQncyBjdXJyZW50bHkgaW4gYEBlbmRvL3Bhc3Mtc3R5bGVgLlxuICogTGF5ZXJpbmcgY29uc3RyYWludHMgbWFrZSB0aGlzIHRyaWNreSwgd2hpY2ggaXMgd2h5IHdlIGhhdmVuJ3QgeWV0IGZpZ3VyZWRcbiAqIG91dCBob3cgdG8gZG8gdGhpcy5cbiAqXG4gKiBAdHlwZSB7KHZhbDogdW5rbm93bikgPT4gdmFsIGlzICh1bmRlZmluZWRcbiAqIHwgbnVsbFxuICogfCBib29sZWFuXG4gKiB8IG51bWJlclxuICogfCBiaWdpbnRcbiAqIHwgc3RyaW5nXG4gKiB8IHN5bWJvbCl9XG4gKi9cbmNvbnN0IGlzUHJpbWl0aXZlID0gdmFsID0+XG4gICF2YWwgfHwgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpO1xuXG4vKipcbiAqIFByaW9yaXRpemUgc3ltYm9scyBhcyBlYXJsaWVyIHRoYW4gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbmNvbnN0IGNvbXBhcmVTdHJpbmdpZmllZCA9IChhLCBiKSA9PiB7XG4gIGlmICh0eXBlb2YgYSA9PT0gdHlwZW9mIGIpIHtcbiAgICBjb25zdCBsZWZ0ID0gU3RyaW5nKGEpO1xuICAgIGNvbnN0IHJpZ2h0ID0gU3RyaW5nKGIpO1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG4gICAgcmV0dXJuIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA+IHJpZ2h0ID8gMSA6IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBhID09PSAnc3ltYm9sJykge1xuICAgIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N0cmluZycpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBhc3NlcnQodHlwZW9mIGEgPT09ICdzdHJpbmcnKTtcbiAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3ltYm9sJyk7XG4gIHJldHVybiAxO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2ROYW1lcyA9IHZhbCA9PiB7XG4gIGxldCBsYXllciA9IHZhbDtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KCk7IC8qIFNldCB0byBkZWR1cGxpY2F0ZSovXG4gIHdoaWxlIChsYXllciAhPT0gbnVsbCAmJiBsYXllciAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIC8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSkge1xuICAgICAgLyogSW4gY2FzZSBhIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGEgbm9uLW1ldGhvZCwqL1xuICAgICAgLyogdGVzdCBgdmFsW25hbWVdYCByYXRoZXIgdGhhbiBgbGF5ZXJbbmFtZV1gKi9cbiAgICAgIGlmICh0eXBlb2YgdmFsW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsYXllciA9IGdldFByb3RvdHlwZU9mKGxheWVyKTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbn07XG4vKiBUaGUgdG9wIGxldmVsIG9mIHRoZSBldmVudHVhbCBzZW5kIG1vZHVsZXMgY2FuIGJlIGV2YWx1YXRlZCBiZWZvcmUqL1xuLyogc2VzIGNyZWF0ZXMgYGhhcmRlbmAsIGFuZCBzbyBjYW5ub3QgcmVseSBvbiBgaGFyZGVuYCBhdCB0b3AgbGV2ZWwuKi8kaM2PX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlGdW5jdGlvbiA9IChyZWNpcGllbnQsIGFyZ3MpID0+IHtcbiAgdHlwZW9mIHJlY2lwaWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgIGRlYnVnZ2VyOyAvKiBTVEVQIElOVE8gQVBQTFkqL1xuICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIHRoaXMgZGVsaXZlcnkgb2YgYW4gZXZlbnR1YWwgZnVuY3Rpb24gY2FsbCovXG4gICAgLyogc28gdGhhdCB5b3UgY2FuIHN0ZXAgKmludG8qIHRoZSBmb2xsb3dpbmcgYGFwcGx5YCBpbiBvcmRlciB0byBzZWUgdGhlKi9cbiAgICAvKiBmdW5jdGlvbiBjYWxsIGFzIGl0IGhhcHBlbnMuIE9yIHN0ZXAgKm92ZXIqIHRvIHNlZSB3aGF0IGhhcHBlbnMqL1xuICAgIC8qIGFmdGVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybnMuKi9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShyZWNpcGllbnQsIHVuZGVmaW5lZCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5RnVuY3Rpb24obG9jYWxBcHBseUZ1bmN0aW9uKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlNZXRob2QgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lLCBhcmdzKSA9PiB7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgIC8qIEJhc2UgY2FzZTsgYm90dG9tIG91dCB0byBhcHBseSBmdW5jdGlvbnMuKi9cbiAgICByZXR1cm4gbG9jYWxBcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJncyk7XG4gIH1cbiAgaWYgKHJlY2lwaWVudCA9PT0gdW5kZWZpbmVkIHx8IHJlY2lwaWVudCA9PT0gbnVsbCkge1xuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgZGVsaXZlciAke3EobWV0aG9kTmFtZSl9IHRvIHRhcmdldDsgdHlwZW9mIHRhcmdldCBpcyAke3EoXG4gICAgICAgIG50eXBlb2YocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZuID0gcmVjaXBpZW50W21ldGhvZE5hbWVdO1xuICBpZiAoZm4gPT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGB0YXJnZXQgaGFzIG5vIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9LCBoYXMgJHtxKFxuICAgICAgICBnZXRNZXRob2ROYW1lcyhyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZnR5cGUgPSBudHlwZW9mKGZuKTtcbiAgdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nIHx8XG4gICAgRmFpbGBpbnZva2VkIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9IGlzIG5vdCBhIGZ1bmN0aW9uOyBpdCBpcyBhICR7cShcbiAgICAgIGZ0eXBlLFxuICAgICl9YDtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgbWV0aG9kTmFtZSkpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgIGRlYnVnZ2VyOyAvKiBTVEVQIElOVE8gQVBQTFkqL1xuICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIHRoaXMgZGVsaXZlcnkgb2YgYW4gZXZlbnR1YWwgbWV0aG9kIGNhbGwqL1xuICAgIC8qIHNvIHRoYXQgeW91IGNhbiBzdGVwICppbnRvKiB0aGUgZm9sbG93aW5nIGBhcHBseWAgaW4gb3JkZXIgdG8gc2VlIHRoZSovXG4gICAgLyogbWV0aG9kIGNhbGwgYXMgaXQgaGFwcGVucy4gT3Igc3RlcCAqb3ZlciogdG8gc2VlIHdoYXQgaGFwcGVucyovXG4gICAgLyogYWZ0ZXIgdGhlIG1ldGhvZCBjYWxsIHJldHVybnMuKi9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShmbiwgcmVjaXBpZW50LCBhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmxvY2FsQXBwbHlNZXRob2QobG9jYWxBcHBseU1ldGhvZCk7XG5cbiAgICAgICBjb25zdCBsb2NhbEdldCA9ICh0LCBrZXkpID0+IHRba2V5XTskaM2PX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh3iIufQYAAD0GAAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBoYXNPd24sIGZyZWV6ZSwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCAnKid9IE1hdGNoU3RyaW5nVGFnXG4gKiAgIEEgc3RhciBgJyonYCBtYXRjaGVzIGFueSByZWNpcGllbnQuIE90aGVyd2lzZSwgdGhlIHN0cmluZyBpc1xuICogICBtYXRjaGVkIGFnYWluc3QgdGhlIHZhbHVlIG9mIGEgcmVjaXBpZW50J3MgYEBAdG9TdHJpbmdUYWdgXG4gKiAgIGFmdGVyIHN0cmlwcGluZyBvdXQgYW55IGxlYWRpbmcgYCdBbGxlZ2VkOiAnYCBvciBgJ0RlYnVnTmFtZTogJ2BcbiAqICAgcHJlZml4LiBGb3Igb2JqZWN0cyBkZWZpbmVkIHdpdGggYEZhcmAgdGhpcyBpcyB0aGUgZmlyc3QgYXJndW1lbnQsXG4gKiAgIGtub3duIGFzIHRoZSBgZmFyTmFtZWAuIEZvciBleG9zLCB0aGlzIGlzIHRoZSB0YWcuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8ICcqJ30gTWF0Y2hNZXRob2ROYW1lXG4gKiAgIEEgc3RhciBgJyonYCBtYXRjaGVzIGFueSBtZXRob2QgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nIGlzXG4gKiAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgbWV0aG9kIG5hbWUuIEN1cnJlbnRseSwgdGhpcyBpcyBvbmx5IGFuIGV4YWN0IG1hdGNoLlxuICogICBIb3dldmVyLCBiZXdhcmUgdGhhdCB3ZSBtYXkgaW50cm9kdWNlIGEgc3RyaW5nIHN5bnRheCBmb3JcbiAqICAgc3ltYm9sIG1ldGhvZCBuYW1lcy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7bnVtYmVyIHwgJyonfSBNYXRjaENvdW50ZG93blxuICogICBBIHN0YXIgYCcqJ2Agd2lsbCBhbHdheXMgYnJlYWtwb2ludC4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nXG4gKiAgIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gT25jZSB0aGF0IGlzIHplcm8sIGFsd2F5cyBicmVha3BvaW50LlxuICogICBPdGhlcndpc2UgZGVjcmVtZW50IGJ5IG9uZSBlYWNoIHRpbWUgaXQgbWF0Y2hlcyB1bnRpbCBpdCByZWFjaGVzIHplcm8uXG4gKiAgIEluIG90aGVyIHdvcmRzLCB0aGUgY291bnRkb3duIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZlxuICogICBicmVha3BvaW50IG9jY3VycmVuY2VzIHRvIHNraXAgYmVmb3JlIGFjdHVhbGx5IGJyZWFrcG9pbnRpbmcuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBleHRlcm5hbCBKU09OIHJlcHJlc2VudGF0aW9uLCBpbiB3aGljaFxuICogLSB0aGUgb3V0ZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgY2xhc3MtbGlrZSB0YWcgb3IgJyonLFxuICogLSB0aGUgaW5uZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgbWV0aG9kIG5hbWUgb3IgJyonLFxuICogLSB0aGUgdmFsdWUgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciBjb3VudGRvd24gb3IgJyonLlxuICpcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8TWF0Y2hTdHJpbmdUYWcsIFJlY29yZDxNYXRjaE1ldGhvZE5hbWUsIE1hdGNoQ291bnRkb3duPj59IE1lc3NhZ2VCcmVha3BvaW50c1xuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgaW50ZXJuYWwgSlNPTiByZXByZXNlbnRhdGlvbiwgaW4gd2hpY2hcbiAqIC0gdGhlIG91dGVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIG1ldGhvZCBuYW1lIG9yICcqJyxcbiAqIC0gdGhlIGlubmVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIGNsYXNzLWxpa2UgdGFnIG9yICcqJyxcbiAqIC0gdGhlIHZhbHVlIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgY291bnRkb3duIG9yICcqJy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPE1hdGNoTWV0aG9kTmFtZSwgUmVjb3JkPE1hdGNoU3RyaW5nVGFnLCBNYXRjaENvdW50ZG93bj4+fSBCcmVha3BvaW50VGFibGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IE1lc3NhZ2VCcmVha3BvaW50c30gZ2V0QnJlYWtwb2ludHNcbiAqIEBwcm9wZXJ0eSB7KG5ld0JyZWFrcG9pbnRzPzogTWVzc2FnZUJyZWFrcG9pbnRzKSA9PiB2b2lkfSBzZXRCcmVha3BvaW50c1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlY2lwaWVudDogb2JqZWN0LFxuICogICBtZXRob2ROYW1lOiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWRcbiAqICkgPT4gYm9vbGVhbn0gc2hvdWxkQnJlYWtwb2ludFxuICovXG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICovXG5jb25zdCBpc0pTT05SZWNvcmQgPSB2YWwgPT5cbiAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qKlxuICogUmV0dXJuIGB0YWdgIGFmdGVyIHN0cmlwcGluZyBvZmYgYW55IGAnQWxsZWdlZDogJ2Agb3IgYCdEZWJ1Z05hbWU6ICdgXG4gKiBwcmVmaXggaWYgcHJlc2VudC5cbiAqIGBgYGpzXG4gKiBzaW1wbGlmeVRhZygnQWxsZWdlZDogbW9vbGEgaXNzdWVyJykgPT09ICdtb29sYSBpc3N1ZXInXG4gKiBgYGBcbiAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdWNoIHByZWZpeGVzLCBvbmx5IHRoZSBvdXRlciBvbmUgaXMgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzaW1wbGlmeVRhZyA9IHRhZyA9PiB7XG4gIGZvciAoY29uc3QgcHJlZml4IG9mIFsnQWxsZWdlZDogJywgJ0RlYnVnTmFtZTogJ10pIHtcbiAgICBpZiAodGFnLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIHRhZy5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhZztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEByZXR1cm5zIHtNZXNzYWdlQnJlYWtwb2ludFRlc3RlciB8IHVuZGVmaW5lZH1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9IG9wdGlvbk5hbWUgPT4ge1xuICBsZXQgYnJlYWtwb2ludHMgPSBKU09OLnBhcnNlKGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICdudWxsJykpO1xuXG4gIGlmIChicmVha3BvaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQHR5cGUge0JyZWFrcG9pbnRUYWJsZX0gKi9cbiAgbGV0IGJyZWFrcG9pbnRzVGFibGU7XG5cbiAgY29uc3QgZ2V0QnJlYWtwb2ludHMgPSAoKSA9PiBicmVha3BvaW50cztcbiAgZnJlZXplKGdldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzZXRCcmVha3BvaW50cyA9IChuZXdCcmVha3BvaW50cyA9IGJyZWFrcG9pbnRzKSA9PiB7XG4gICAgaXNKU09OUmVjb3JkKG5ld0JyZWFrcG9pbnRzKSB8fFxuICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuICAgIC8qKiBAdHlwZSB7QnJlYWtwb2ludFRhYmxlfSAqL1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY29uZnVzZWQgYnkgX19wcm90b19fKi9cbiAgICBjb25zdCBuZXdCcmVha3BvaW50c1RhYmxlID0geyBfX3Byb3RvX186IG51bGwgfTtcblxuICAgIGZvciAoY29uc3QgW3RhZywgbWV0aG9kQlBzXSBvZiBlbnRyaWVzKG5ld0JyZWFrcG9pbnRzKSkge1xuICAgICAgdGFnID09PSBzaW1wbGlmeVRhZyh0YWcpIHx8XG4gICAgICAgIEZhaWxgSnVzdCB1c2Ugc2ltcGxlIHRhZyAke3Eoc2ltcGxpZnlUYWcodGFnKSl9IHJhdGhlciB0aGFuICR7cSh0YWcpfWA7XG4gICAgICBpc0pTT05SZWNvcmQobWV0aG9kQlBzKSB8fFxuICAgICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgKX0gdG8gYmUgYSBKU09OIG1ldGhvZHMgYnJlYWtwb2ludHMgcmVjb3JkYDtcbiAgICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIGNvdW50XSBvZiBlbnRyaWVzKG1ldGhvZEJQcykpIHtcbiAgICAgICAgY291bnQgPT09ICcqJyB8fFxuICAgICAgICAgICh0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICBOdW1iZXIuaXNTYWZlSW50ZWdlcihjb3VudCkgJiZcbiAgICAgICAgICAgIGNvdW50ID49IDApIHx8XG4gICAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cSh0YWcpfS4ke3EoXG4gICAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgICl9IHRvIGJlIFwiKlwiIG9yIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzQlBzID0gaGFzT3duKG5ld0JyZWFrcG9pbnRzVGFibGUsIG1ldGhvZE5hbWUpXG4gICAgICAgICAgPyBuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdXG4gICAgICAgICAgOiAobmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSA9IHtcbiAgICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBjb25mdXNlZCBieSBfX3Byb3RvX18qL1xuICAgICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cbiAgICBicmVha3BvaW50cyA9IG5ld0JyZWFrcG9pbnRzO1xuICAgIGJyZWFrcG9pbnRzVGFibGUgPSBuZXdCcmVha3BvaW50c1RhYmxlO1xuICB9O1xuICBmcmVlemUoc2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNob3VsZEJyZWFrcG9pbnQgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lKSA9PiB7XG4gICAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgICAvKiBUT0RPIGVuYWJsZSBmdW5jdGlvbiBicmVha3BvaW50aW5nKi9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NCUHMgPSBicmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdIHx8IGJyZWFrcG9pbnRzVGFibGVbJyonXTtcbiAgICBpZiAoY2xhc3NCUHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgdGFnID0gc2ltcGxpZnlUYWcocmVjaXBpZW50W1N5bWJvbC50b1N0cmluZ1RhZ10pO1xuICAgIGxldCBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhZyA9ICcqJztcbiAgICAgIGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhc3NlcnQodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJiBjb3VudCA+PSAxKTtcbiAgICBjbGFzc0JQc1t0YWddID0gY291bnQgLSAxO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgZnJlZXplKHNob3VsZEJyZWFrcG9pbnQpO1xuXG4gIGNvbnN0IGJyZWFrcG9pbnRUZXN0ZXIgPSBmcmVlemUoe1xuICAgIGdldEJyZWFrcG9pbnRzLFxuICAgIHNldEJyZWFrcG9pbnRzLFxuICAgIHNob3VsZEJyZWFrcG9pbnQsXG4gIH0pO1xuICBicmVha3BvaW50VGVzdGVyLnNldEJyZWFrcG9pbnRzKCk7XG4gIHJldHVybiBicmVha3BvaW50VGVzdGVyO1xufTskaM2PX29uY2UubWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG5mcmVlemUobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKRNV2dYFAADWBQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9uby1zaGltLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vZXhwb3J0cy5qcyJdLCJleHBvcnRzIjpbIkUiLCJIYW5kbGVkUHJvbWlzZSJdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZUU7JGjNj19pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChtYWtlRSA9ICRozY9fYSldXV1dLFtcIi4vZXhwb3J0cy5qc1wiLCBbXV1dKTtcblxuLyogWFhYIG1vZHVsZSBleHBvcnRzIGZvciBIYW5kbGVkUHJvbWlzZSBmYWlsIGlmIHRoZXNlIGFyZW4ndCBpbiBzY29wZSovXG4vKiogQGltcG9ydCB7SGFuZGxlciwgSGFuZGxlZEV4ZWN1dG9yfSBmcm9tICcuL2hhbmRsZWQtcHJvbWlzZS5qcycgKi9cbi8qKiBAaW1wb3J0IHtFQ2FsbGFibGVPck1ldGhvZHMsIEVHZXR0ZXJzLCBFUmVmLCBFUmVtb3RlRnVuY3Rpb25zLCBFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kcywgTG9jYWxSZWNvcmQsIFJlbW90ZUZ1bmN0aW9uc30gZnJvbSAnLi9FLmpzJyAqL1xuXG5jb25zdCBocCA9IEhhbmRsZWRQcm9taXNlO1xuXG4vKipcbiAqIEUoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gY2FsbCBhcmJpdHJhcnkgbWV0aG9kcy4gRWFjaCBvZiB0aGVzZSBtZXRob2QgY2FsbHMgcmV0dXJucyBhIHByb21pc2UuXG4gKiBUaGUgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBvbiB3aGF0ZXZlciAneCcgZGVzaWduYXRlcyAob3IgcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBFLmdldCh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBnZXQgYXJiaXRyYXJ5IHByb3BlcnRpZXMuIEVhY2ggb2YgdGhlc2UgcHJvcGVydGllcyByZXR1cm5zIGFcbiAqIHByb21pc2UgZm9yIHRoZSBwcm9wZXJ0eS4gIFRoZSBwcm9taXNlIHZhbHVlIHdpbGwgYmUgdGhlIHByb3BlcnR5IGZldGNoZWQgZnJvbSB3aGF0ZXZlciAneCcgZGVzaWduYXRlcyAob3JcbiAqIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogRS53aGVuKHgsIHJlcywgcmVqKSBpcyBlcXVpdmFsZW50IHRvIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihyZXMsIHJlailcbiAqLyRozY9fb25jZS5ocChocCk7XG4gICAgICAgY29uc3QgRSA9IG1ha2VFKGhwKTskaM2PX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAzKKSOVxIAAFcSAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBXZSBhbHNvIGNhbm5vdCBjdXJyZW50bHkgaW1wb3J0IHRoZW0gYmVjYXVzZSBpdCB3b3VsZCBjcmVhdGUgYSBjeWNsaWMqL1xuLyogZGVwZW5kZW5jeSwgdGhvdWdoIHRoaXMgaXMgbW9yZSBlYXNpbHkgZml4ZWQuKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgWCwgRmFpbCB9IGZyb20gJ0BlbmRvL2Vycm9ycyc7Ki9cbi8qIFNlZSBhbHNvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOTUxNSovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm4gPSAwO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiovXG5jb25zdCBFTkFCTEVEID1cbiAgLyoqIEB0eXBlIHsnZGlzYWJsZWQnIHwgJ2VuYWJsZWQnfSAqL1xuICAoZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywgJ2Rpc2FibGVkJywgWydlbmFibGVkJ10pKSA9PT0gJ2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGUgPSBkZXRhaWxzTm90ZSA9PiByZWFzb24gPT4ge1xuICBpZiAocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKHJlYXNvbiwgZGV0YWlsc05vdGUpO1xuICB9XG4gIGlmIChWRVJCT1NFKSB7XG4gICAgY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJywgcmVhc29uKTtcbiAgfVxufTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uID1cbiAgKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBoaWRkZW5QcmlvckVycm9yID0gc2VuZGluZ0Vycm9yO1xuICAgIGhpZGRlbkN1cnJlbnRUdXJuICs9IDE7XG4gICAgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChWRVJCT1NFKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLyogTXVzdCBjYXB0dXJlIHRoaXMgbm93LCBub3Qgd2hlbiB0aGUgY2F0Y2ggdHJpZ2dlcnMuKi9cbiAgICAgIGNvbnN0IGRldGFpbHNOb3RlID0gWGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGlkZGVuUHJpb3JFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMsIHJldHVybnMgYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMgd2hvc2VcbiAqIGB0aGlzYC1mcmVlIGNhbGwgYmVoYXZpb3JzIGFyZSBub3Qgb2JzZXJ2YWJseSBkaWZmZXJlbnQgdG8gdGhvc2UgdGhhdFxuICogY2Fubm90IHNlZSBjb25zb2xlIG91dHB1dC4gVGhlIG9ubHkgcHVycG9zZSBpcyB0byBjYXVzZSBhZGRpdGlvbmFsXG4gKiBpbmZvcm1hdGlvbiB0byBhcHBlYXIgb24gdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIGNhbGwgdG8gYHRyYWNrVHVybnNgIGlzIGl0c2VsZiBhIHNlbmRpbmcgZXZlbnQsIHRoYXQgb2NjdXJzIGluIHNvbWUgY2FsbFxuICogc3RhY2sgaW4gc29tZSB0dXJuIG51bWJlciBhdCBzb21lIGV2ZW50IG51bWJlciB3aXRoaW4gdGhhdCB0dXJuLiBFYWNoIGNhbGxcbiAqIHRvIGFueSBvZiB0aGUgcmV0dXJuZWQgYFR1cm5TdGFydEZuYHMgaXMgYSByZWNlaXZpbmcgZXZlbnQgdGhhdCBiZWdpbnMgYSBuZXdcbiAqIHR1cm4uIFRoaXMgc2VuZGluZyBldmVudCBjYXVzZWQgZWFjaCBvZiB0aG9zZSByZWNlaXZpbmcgZXZlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBAcGFyYW0ge1R9IGZ1bmNzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IHRyYWNrVHVybnMgPSBmdW5jcyA9PiB7XG4gIGlmICghRU5BQkxFRCB8fCB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdsb2JhbFRoaXMuYXNzZXJ0KSB7XG4gICAgcmV0dXJuIGZ1bmNzO1xuICB9XG4gIGNvbnN0IHsgZGV0YWlsczogWCwgbm90ZTogYW5ub3RhdGVFcnJvciB9ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbiAgaGlkZGVuQ3VycmVudEV2ZW50ICs9IDE7XG4gIGNvbnN0IHNlbmRpbmdFcnJvciA9IEVycm9yKFxuICAgIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgKTtcbiAgaWYgKGhpZGRlblByaW9yRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubm90YXRlRXJyb3Ioc2VuZGluZ0Vycm9yLCBYYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKFxuICAgIGZ1bmNzLm1hcChmdW5jID0+IGZ1bmMgJiYgd3JhcEZ1bmN0aW9uKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkpXG4gICk7XG59O1xuXG4vKipcbiAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHRoaXMtc2Vuc2l0aXZlLCBleHBlY3RlZCB0byBiZSBjYWxsZWQgYXRcbiAqIGJvdHRvbSBvZiBzdGFjayB0byBzdGFydCBhIG5ldyB0dXJuLlxuICpcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKi8kaM2PX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANxF2aNgAgAAYAIAABoAAABAZW5kby9leG8tdjEuNS4xMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9leG8tbWFrZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9leG8tbWFrZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvZ2V0LWludGVyZmFjZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2dldC1pbnRlcmZhY2UuanMiOltbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiLCJHRVRfSU5URVJGQUNFX0dVQVJEIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACxkxD/ECAAABAgAAAjAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by1tYWtlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyIsIi4vZXhvLXRvb2xzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzc0tpdCIsImluaXRFbXB0eSIsIm1ha2VFeG8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyxGYWlsLHEsZGVmZW5kUHJvdG90eXBlLGRlZmVuZFByb3RvdHlwZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9leG8tdG9vbHMuanNcIiwgW1tcImRlZmVuZFByb3RvdHlwZVwiLFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRozY9fYSldXSxbXCJkZWZlbmRQcm90b3R5cGVLaXRcIixbJGjNj19hID0+IChkZWZlbmRQcm90b3R5cGVLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QW1wbGlmeSwgRXhvQ2xhc3NLaXRNZXRob2RzLCBFeG9DbGFzc01ldGhvZHMsIEZhckNsYXNzT3B0aW9ucywgR3VhcmRlZCwgR3VhcmRlZEtpdCwgRXhvQ2xhc3NJbnRlcmZhY2VHdWFyZEtpdCwgSXNJbnN0YW5jZSwgS2l0Q29udGV4dCwgRXhvQ2xhc3NJbnRlcmZhY2VHdWFyZCwgTWV0aG9kcywgRmFjZXROYW1lfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgc2VhbCwgZnJlZXplLCBkZWZpbmVQcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5cbi8qIFR1cm4gb24gdG8gZ2l2ZSBlYWNoIGV4byBpbnN0YW5jZSBpdHMgb3duIHRvU3RyaW5nVGFnIHZhbHVlLiovXG5jb25zdCBMQUJFTF9JTlNUQU5DRVMgPSBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsICdsYWJlbC1pbnN0YW5jZXMnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHByb3RvXG4gKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VDb3VudFxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1ha2VTZWxmID0gKHByb3RvLCBpbnN0YW5jZUNvdW50KSA9PiB7XG4gIGNvbnN0IHNlbGYgPSBjcmVhdGUocHJvdG8pO1xuICBpZiAoTEFCRUxfSU5TVEFOQ0VTKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoc2VsZiwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICB2YWx1ZTogYCR7cHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXX0jJHtpbnN0YW5jZUNvdW50fWAsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihzZWxmKTtcbn07XG5cbmNvbnN0IGVtcHR5UmVjb3JkID0gaGFyZGVuKHt9KTtcblxuLyoqXG4gKiBXaGVuIGNhbGxpbmcgYGRlZmluZUR1cmFibGVLaW5kYCBhbmRcbiAqIGl0cyBzaWJsaW5ncywgdXNlZCBhcyB0aGUgYGluaXRgIGZ1bmN0aW9uIGFyZ3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlXG4gKiBzdGF0ZSByZWNvcmQgb2YgdGhlICh2aXJ0dWFsL2R1cmFibGUpIGluc3RhbmNlcyBvZiB0aGUga2luZC9leG9DbGFzc1xuICogc2hvdWxkIGJlIGVtcHR5LCBhbmQgdGhhdCB0aGUgcmV0dXJuZWQgbWFrZXIgZnVuY3Rpb24gc2hvdWxkIGhhdmUgemVyb1xuICogcGFyYW1ldGVycy5cbiAqXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbiAgICAgICBjb25zdCBpbml0RW1wdHkgPSAoKSA9PiBlbXB0eVJlY29yZDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJIGluaXQgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gTSBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0V4b0NsYXNzSW50ZXJmYWNlR3VhcmQ8TT4gfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7RXhvQ2xhc3NNZXRob2RzPE0sIEk+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxJTVBPUlQoJy4vdHlwZXMuanMnKS5DbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZDxNPn1cbiAqLyRozY9fb25jZS5pbml0RW1wdHkoaW5pdEVtcHR5KTtcbiAgICAgICBjb25zdCBkZWZpbmVFeG9DbGFzcyA9IChcbiAgdGFnLFxuICBpbnRlcmZhY2VHdWFyZCxcbiAgaW5pdCxcbiAgbWV0aG9kcyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGhhcmRlbihtZXRob2RzKTtcbiAgY29uc3Qge1xuICAgIGZpbmlzaCA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlQW1wbGlmaWVyID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3RlciA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIHJlY2VpdmVBbXBsaWZpZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgIEZhaWxgT25seSBmYWNldHMgb2YgYW4gZXhvIGNsYXNzIGtpdCBjYW4gYmUgYW1wbGlmaWVkICR7cSh0YWcpfWA7XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwPE0sIElNUE9SVCgnLi90eXBlcy5qcycpLkNsYXNzQ29udGV4dDxSZXR1cm5UeXBlPEk+LCBNPj59ICovXG4gIGNvbnN0IGNvbnRleHRNYXAgPSBuZXcgV2Vha01hcCgpO1xuICBjb25zdCBwcm90byA9IGRlZmVuZFByb3RvdHlwZShcbiAgICB0YWcsXG4gICAgc2VsZiA9PiAvKiogQHR5cGUge2FueX0gKi8gKGNvbnRleHRNYXAuZ2V0KHNlbGYpKSxcbiAgICBtZXRob2RzLFxuICAgIHRydWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICk7XG4gIGxldCBpbnN0YW5jZUNvdW50ID0gMDtcbiAgLyoqXG4gKiBAcGFyYW0gIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbiAgY29uc3QgbWFrZUluc3RhbmNlID0gKC4uLmFyZ3MpID0+IHtcbiAgICAvKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIGluc3RhbmNlQ291bnQgKz0gMTtcbiAgICBjb25zdCBzZWxmID0gbWFrZVNlbGYocHJvdG8sIGluc3RhbmNlQ291bnQpO1xuXG4gICAgLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuICAgIC8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sTT59ICovXG4gICAgY29uc3QgY29udGV4dCA9IGZyZWV6ZSh7IHN0YXRlLCBzZWxmIH0pO1xuICAgIGNvbnRleHRNYXAuc2V0KHNlbGYsIGNvbnRleHQpO1xuICAgIGlmIChmaW5pc2gpIHtcbiAgICAgIGZpbmlzaChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgaWYgKHJlY2VpdmVJbnN0YW5jZVRlc3Rlcikge1xuICAgIC8qKiBAdHlwZSB7SXNJbnN0YW5jZX0gKi9cbiAgICBjb25zdCBpc0luc3RhbmNlID0gKGV4bywgZmFjZXROYW1lID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmYWNldE5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYGZhY2V0TmFtZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYW4gZXhvIGNsYXNzIGtpdDogJHtxKFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgKX0gaGFzIG5vIGZhY2V0ICR7cShmYWNldE5hbWUpfWA7XG4gICAgICByZXR1cm4gY29udGV4dE1hcC5oYXMoZXhvKTtcbiAgICB9O1xuICAgIGhhcmRlbihpc0luc3RhbmNlKTtcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIoaXNJbnN0YW5jZSk7XG4gIH1cblxuICByZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG59OyRozY9fb25jZS5kZWZpbmVFeG9DbGFzcyhkZWZpbmVFeG9DbGFzcyk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gRiBmYWNldCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0V4b0NsYXNzSW50ZXJmYWNlR3VhcmRLaXQ8Rj4gfCB1bmRlZmluZWQgfSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge0V4b0NsYXNzS2l0TWV0aG9kczxGLCBJPn0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8XG4gKiAgIEtpdENvbnRleHQ8UmV0dXJuVHlwZTxJPiwgR3VhcmRlZEtpdDxGPj4sXG4gKiAgIEd1YXJkZWRLaXQ8Rj5cbiAqID59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkS2l0PEY+fVxuICovXG4gICAgICAgY29uc3QgZGVmaW5lRXhvQ2xhc3NLaXQgPSAoXG4gIHRhZyxcbiAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gIGluaXQsXG4gIG1ldGhvZHNLaXQsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBoYXJkZW4obWV0aG9kc0tpdCk7XG4gIGNvbnN0IHtcbiAgICBmaW5pc2ggPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUFtcGxpZmllciA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIgPSB1bmRlZmluZWQsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBjb250ZXh0TWFwS2l0ID0gb2JqZWN0TWFwKG1ldGhvZHNLaXQsICgpID0+IG5ldyBXZWFrTWFwKCkpO1xuICBjb25zdCBnZXRDb250ZXh0S2l0ID0gb2JqZWN0TWFwKFxuICAgIGNvbnRleHRNYXBLaXQsXG4gICAgY29udGV4dE1hcCA9PiBmYWNldCA9PiBjb250ZXh0TWFwLmdldChmYWNldCksXG4gICk7XG4gIGNvbnN0IHByb3RvdHlwZUtpdCA9IGRlZmVuZFByb3RvdHlwZUtpdChcbiAgICB0YWcsXG4gICAgZ2V0Q29udGV4dEtpdCxcbiAgICBtZXRob2RzS2l0LFxuICAgIHRydWUsXG4gICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICk7XG4gIGxldCBpbnN0YW5jZUNvdW50ID0gMDtcbiAgLyoqXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2VLaXQgPSAoLi4uYXJncykgPT4ge1xuICAgIC8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbiAgICBjb25zdCBzdGF0ZSA9IHNlYWwoaW5pdCguLi5hcmdzKSk7XG4gICAgLyogRG9uJ3QgZnJlZXplIGNvbnRleHQgdW50aWwgd2UgYWRkIGZhY2V0cyovXG4gICAgLyoqIEB0eXBlIHt7IHN0YXRlOiBSZXR1cm5UeXBlPEk+LCBmYWNldHM6IGFueSB9fSAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IHN0YXRlLCBmYWNldHM6IG51bGwgfTtcbiAgICBpbnN0YW5jZUNvdW50ICs9IDE7XG4gICAgY29uc3QgZmFjZXRzID0gb2JqZWN0TWFwKHByb3RvdHlwZUtpdCwgKHByb3RvLCBmYWNldE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBtYWtlU2VsZihwcm90bywgaW5zdGFuY2VDb3VudCk7XG4gICAgICBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0uc2V0KHNlbGYsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSk7XG4gICAgY29udGV4dC5mYWNldHMgPSBmYWNldHM7XG4gICAgLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuICAgIGZyZWV6ZShjb250ZXh0KTtcbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBmaW5pc2goY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiAvKiogQHR5cGUge0d1YXJkZWRLaXQ8Rj59ICovIChjb250ZXh0LmZhY2V0cyk7XG4gIH07XG5cbiAgaWYgKHJlY2VpdmVBbXBsaWZpZXIpIHtcbiAgICAvKiogQHR5cGUge0FtcGxpZnl9ICovXG4gICAgY29uc3QgYW1wbGlmeSA9IGV4b0ZhY2V0ID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29udGV4dE1hcCBvZiB2YWx1ZXMoY29udGV4dE1hcEtpdCkpIHtcbiAgICAgICAgaWYgKGNvbnRleHRNYXAuaGFzKGV4b0ZhY2V0KSkge1xuICAgICAgICAgIGNvbnN0IHsgZmFjZXRzIH0gPSBjb250ZXh0TWFwLmdldChleG9GYWNldCk7XG4gICAgICAgICAgcmV0dXJuIGZhY2V0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgRmFpbGBNdXN0IGJlIGEgZmFjZXQgb2YgJHtxKHRhZyl9OiAke2V4b0ZhY2V0fWA7XG4gICAgfTtcbiAgICBoYXJkZW4oYW1wbGlmeSk7XG4gICAgcmVjZWl2ZUFtcGxpZmllcihhbXBsaWZ5KTtcbiAgfVxuXG4gIGlmIChyZWNlaXZlSW5zdGFuY2VUZXN0ZXIpIHtcbiAgICAvKiogQHR5cGUge0lzSW5zdGFuY2V9ICovXG4gICAgY29uc3QgaXNJbnN0YW5jZSA9IChleG9GYWNldCwgZmFjZXROYW1lID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoZmFjZXROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcyhjb250ZXh0TWFwS2l0KS5zb21lKGNvbnRleHRNYXAgPT5cbiAgICAgICAgICBjb250ZXh0TWFwLmhhcyhleG9GYWNldCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhc3NlcnQudHlwZW9mKGZhY2V0TmFtZSwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgY29udGV4dE1hcCA9IGNvbnRleHRNYXBLaXRbZmFjZXROYW1lXTtcbiAgICAgIGNvbnRleHRNYXAgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYGV4byBjbGFzcyBraXQgJHtxKHRhZyl9IGhhcyBubyBmYWNldCBuYW1lZCAke3EoZmFjZXROYW1lKX1gO1xuICAgICAgcmV0dXJuIGNvbnRleHRNYXAuaGFzKGV4b0ZhY2V0KTtcbiAgICB9O1xuICAgIGhhcmRlbihpc0luc3RhbmNlKTtcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIoaXNJbnN0YW5jZSk7XG4gIH1cblxuICByZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZUtpdCk7XG59OyRozY9fb25jZS5kZWZpbmVFeG9DbGFzc0tpdChkZWZpbmVFeG9DbGFzc0tpdCk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3NLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJTVBPUlQoJ0BlbmRvL3BhdHRlcm5zJykuSW50ZXJmYWNlR3VhcmQ8e1xuICogICBbTSBpbiBrZXlvZiBUXTogSU1QT1JUKCdAZW5kby9wYXR0ZXJucycpLk1ldGhvZEd1YXJkXG4gKiB9PiB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmQgQ0FWRUFUOiBzdGF0aWMgdHlwaW5nIGRvZXMgbm90IHlldCBzdXBwb3J0IGBjYWxsV2hlbmAgdHJhbnNmb3JtYXRpb25cbiAqIEBwYXJhbSB7VH0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2xhc3NDb250ZXh0PHt9LFQ+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7R3VhcmRlZDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFeG8gPSAodGFnLCBpbnRlcmZhY2VHdWFyZCwgbWV0aG9kcywgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBtYWtlSW5zdGFuY2UgPSBkZWZpbmVFeG9DbGFzcyhcbiAgICB0YWcsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdEVtcHR5LFxuICAgIG1ldGhvZHMsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgcmV0dXJuIG1ha2VJbnN0YW5jZSgpO1xufTskaM2PX29uY2UubWFrZUV4byhtYWtlRXhvKTtcbmhhcmRlbihtYWtlRXhvKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImluaXRFbXB0eSI6WyJpbml0RW1wdHkiXSwiZGVmaW5lRXhvQ2xhc3MiOlsiZGVmaW5lRXhvQ2xhc3MiXSwiZGVmaW5lRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRXhvQ2xhc3NLaXQiXSwibWFrZUV4byI6WyJtYWtlRXhvIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABWj/usuRgAALkYAACIAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9lcnJvcnMiLCIuL2dldC1pbnRlcmZhY2UuanMiXSwiZXhwb3J0cyI6WyJkZWZlbmRQcm90b3R5cGUiLCJkZWZlbmRQcm90b3R5cGVLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLGdldFJlbW90YWJsZU1ldGhvZE5hbWVzLHRvVGhyb3dhYmxlLEZhcixtdXN0TWF0Y2gsTSxpc0F3YWl0QXJnR3VhcmQsaXNSYXdHdWFyZCxnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCxnZXRNZXRob2RHdWFyZFBheWxvYWQsZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkLGdldENvcHlNYXBFbnRyaWVzLGxpc3REaWZmZXJlbmNlLG9iamVjdE1hcCxxLEZhaWwsR0VUX0lOVEVSRkFDRV9HVUFSRDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRSZW1vdGFibGVNZXRob2ROYW1lcyA9ICRozY9fYSldXSxbXCJ0b1Rocm93YWJsZVwiLFskaM2PX2EgPT4gKHRvVGhyb3dhYmxlID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiaXNBd2FpdEFyZ0d1YXJkXCIsWyRozY9fYSA9PiAoaXNBd2FpdEFyZ0d1YXJkID0gJGjNj19hKV1dLFtcImlzUmF3R3VhcmRcIixbJGjNj19hID0+IChpc1Jhd0d1YXJkID0gJGjNj19hKV1dLFtcImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIixbJGjNj19hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9nZXQtaW50ZXJmYWNlLmpzXCIsIFtbXCJHRVRfSU5URVJGQUNFX0dVQVJEXCIsWyRozY9fYSA9PiAoR0VUX0lOVEVSRkFDRV9HVUFSRCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RhYmxlTWV0aG9kTmFtZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VHdWFyZCwgTWV0aG9kLCBNZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRQYXlsb2FkLCBEZWZhdWx0R3VhcmRUeXBlfSBmcm9tICdAZW5kby9wYXR0ZXJucydcbiAqIEBpbXBvcnQge0NsYXNzQ29udGV4dCwgQ29udGV4dFByb3ZpZGVyLCBGYWNldE5hbWUsIEtpdENvbnRleHQsIEtpdENvbnRleHRQcm92aWRlciwgTWF0Y2hDb25maWcsIE1ldGhvZHN9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtHZXRJbnRlcmZhY2VHdWFyZH0gZnJvbSAnLi9nZXQtaW50ZXJmYWNlLmpzJztcbiAqL1xuXG5jb25zdCB7IGFwcGx5LCBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBkZWZpbmVQcm9wZXJ0aWVzLCBmcm9tRW50cmllcywgaGFzT3duIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQSBtZXRob2QgZ3VhcmQsIGZvciBpbmNsdXNpb24gaW4gYW4gaW50ZXJmYWNlIGd1YXJkLCB0aGF0IGRvZXMgbm90XG4gKiBlbmZvcmNlIGFueSBjb25zdHJhaW50cyBvZiBpbmNvbWluZyBhcmd1bWVudHMgb3IgcmV0dXJuIHJlc3VsdHMuXG4gKi9cbmNvbnN0IFJhd01ldGhvZEd1YXJkID0gTS5jYWxsKCkucmVzdChNLnJhdygpKS5yZXR1cm5zKE0ucmF3KCkpO1xuXG5jb25zdCBSRURBQ1RFRF9SQVdfQVJHID0gJzxyZWRhY3RlZCByYXcgYXJnPic7XG5cbi8qKlxuICogQSBtZXRob2QgZ3VhcmQsIGZvciBpbmNsdXNpb24gaW4gYW4gaW50ZXJmYWNlIGd1YXJkLCB0aGF0IGVuZm9yY2VzIG9ubHkgdGhhdFxuICogYWxsIGFyZ3VtZW50cyBhcmUgcGFzc2FibGUgYW5kIHRoYXQgdGhlIHJlc3VsdCBpcyBwYXNzYWJsZS4gKEluIGZhciBjbGFzc2VzLFxuICogXCJhbnlcIiBtZWFucyBhbnkgKnBhc3NhYmxlKi4pIFRoaXMgaXMgdGhlIGxlYXN0IHBvc3NpYmxlIG5vbi1yYXdcbiAqIGVuZm9yY2VtZW50IGZvciBhIG1ldGhvZCBndWFyZCwgYW5kIGlzIGltcGxpZWQgYnkgYWxsIG90aGVyXG4gKiBub24tcmF3IG1ldGhvZCBndWFyZHMuXG4gKi9cbmNvbnN0IFBhc3NhYmxlTWV0aG9kR3VhcmQgPSBNLmNhbGwoKS5yZXN0KE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSk7XG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZVtdfSBzeW5jQXJnc1xuICogQHBhcmFtIHtNYXRjaENvbmZpZ30gbWF0Y2hDb25maWdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGVbXX0gUmV0dXJucyB0aGUgYXJncyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHJhdyBtZXRob2QuXG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNBcmdzID0gKHN5bmNBcmdzLCBtYXRjaENvbmZpZywgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY2xhcmVkTGVuLFxuICAgIGhhc1Jlc3RBcmdHdWFyZCxcbiAgICByZXN0QXJnR3VhcmRJc1JhdyxcbiAgICBwYXJhbXNQYXR0ZXJuLFxuICAgIHJlZGFjdGVkSW5kaWNlcyxcbiAgfSA9IG1hdGNoQ29uZmlnO1xuXG4gIC8qIFVzZSBzeW5jQXJncyBpZiBwb3NzaWJsZSwgYnV0IGNvcHkgaXQgd2hlbiBuZWNlc3NhcnkgdG8gaW1wbGVtZW50Ki9cbiAgLyogcmVkYWN0aW9ucy4qL1xuICBsZXQgbWF0Y2hhYmxlQXJncyA9IHN5bmNBcmdzO1xuICBpZiAocmVzdEFyZ0d1YXJkSXNSYXcgJiYgc3luY0FyZ3MubGVuZ3RoID4gZGVjbGFyZWRMZW4pIHtcbiAgICBjb25zdCByZXN0TGVuID0gc3luY0FyZ3MubGVuZ3RoIC0gZGVjbGFyZWRMZW47XG4gICAgY29uc3QgcmVkYWN0ZWRSZXN0ID0gQXJyYXkocmVzdExlbikuZmlsbChSRURBQ1RFRF9SQVdfQVJHKTtcbiAgICBtYXRjaGFibGVBcmdzID0gWy4uLnN5bmNBcmdzLnNsaWNlKDAsIGRlY2xhcmVkTGVuKSwgLi4ucmVkYWN0ZWRSZXN0XTtcbiAgfSBlbHNlIGlmIChcbiAgICByZWRhY3RlZEluZGljZXMubGVuZ3RoID4gMCAmJlxuICAgIHJlZGFjdGVkSW5kaWNlc1swXSA8IHN5bmNBcmdzLmxlbmd0aFxuICApIHtcbiAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgYXJyYXksIGF2b2lkaW5nIGhhcmRlbmluZyB0aGUgcmVkYWN0ZWQgb25lcyAod2hpY2ggYXJlKi9cbiAgICAvKiB0cml2aWFsbHkgbWF0Y2hlZCB1c2luZyBSRURBQ1RFRF9SQVdfQVJHIGFzIGEgc2VudGluZWwgdmFsdWUpLiovXG4gICAgbWF0Y2hhYmxlQXJncyA9IFsuLi5zeW5jQXJnc107XG4gIH1cblxuICBmb3IgKGNvbnN0IGkgb2YgcmVkYWN0ZWRJbmRpY2VzKSB7XG4gICAgaWYgKGkgPj0gbWF0Y2hhYmxlQXJncy5sZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBtYXRjaGFibGVBcmdzW2ldID0gUkVEQUNURURfUkFXX0FSRztcbiAgfVxuXG4gIG11c3RNYXRjaChoYXJkZW4obWF0Y2hhYmxlQXJncyksIHBhcmFtc1BhdHRlcm4sIGxhYmVsKTtcblxuICBpZiAoaGFzUmVzdEFyZ0d1YXJkKSB7XG4gICAgcmV0dXJuIHN5bmNBcmdzO1xuICB9XG4gIHN5bmNBcmdzLmxlbmd0aCA8PSBkZWNsYXJlZExlbiB8fFxuICAgIEZhaWxgJHtxKGxhYmVsKX0gYWNjZXB0cyBhdCBtb3N0ICR7cShkZWNsYXJlZExlbil9IGFyZ3VtZW50cywgbm90ICR7cShcbiAgICAgIHN5bmNBcmdzLmxlbmd0aCxcbiAgICApfTogJHtzeW5jQXJnc31gO1xuICByZXR1cm4gc3luY0FyZ3M7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgYSBtZXRob2QgZ3VhcmQgdG8gYSBtYXRjaCBjb25maWcgZm9yIG1vcmUgZWZmaWNpZW50IHBlci1jYWxsXG4gKiBleGVjdXRpb24uICBUaGlzIGlzIGEgb25lLXRpbWUgY29udmVyc2lvbiwgc28gaXQncyBPSyB0byBiZSBzbG93LlxuICpcbiAqIE1vc3Qgb2YgdGhlIHdvcmsgaXMgZG9uZSB0byBkZXRlY3QgYE0ucmF3KClgIHNvIHRoYXQgd2UgYnVpbGQgYSBtYXRjaCBwYXR0ZXJuXG4gKiBhbmQgbWV0YWRhdGEgaW5zdGVhZCBvZiBkb2luZyB0aGlzIGluIHRoZSBob3QgcGF0aC5cbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmRQYXlsb2FkfSBtZXRob2RHdWFyZFBheWxvYWRcbiAqIEByZXR1cm5zIHtNYXRjaENvbmZpZ31cbiAqL1xuY29uc3QgYnVpbGRNYXRjaENvbmZpZyA9IG1ldGhvZEd1YXJkUGF5bG9hZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcmdHdWFyZHMsXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPSBbXSxcbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG5cbiAgY29uc3QgbWF0Y2hhYmxlQXJnR3VhcmRzID0gWy4uLmFyZ0d1YXJkcywgLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG4gIGNvbnN0IHJlZGFjdGVkSW5kaWNlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoYWJsZUFyZ0d1YXJkcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChpc1Jhd0d1YXJkKG1hdGNoYWJsZUFyZ0d1YXJkc1tpXSkpIHtcbiAgICAgIG1hdGNoYWJsZUFyZ0d1YXJkc1tpXSA9IFJFREFDVEVEX1JBV19BUkc7XG4gICAgICByZWRhY3RlZEluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICAvKiBQYXNzIHRocm91Z2ggcmF3IHJlc3QgYXJndW1lbnRzIHdpdGhvdXQgbWF0Y2hpbmcuKi9cbiAgbGV0IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCA9IHJlc3RBcmdHdWFyZDtcbiAgaWYgKGlzUmF3R3VhcmQobWF0Y2hhYmxlUmVzdEFyZ0d1YXJkKSkge1xuICAgIG1hdGNoYWJsZVJlc3RBcmdHdWFyZCA9IE0uYXJyYXlPZihSRURBQ1RFRF9SQVdfQVJHKTtcbiAgfVxuICBjb25zdCBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQgPSBoYXJkZW4oe1xuICAgIC4uLm1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICBhcmdHdWFyZHM6IG1hdGNoYWJsZUFyZ0d1YXJkcy5zbGljZSgwLCBhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICBvcHRpb25hbEFyZ0d1YXJkczogbWF0Y2hhYmxlQXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgIHJlc3RBcmdHdWFyZDogbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkLFxuICB9KTtcblxuICBjb25zdCBwYXJhbXNQYXR0ZXJuID0gTS5zcGxpdEFycmF5KFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5hcmdHdWFyZHMsXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLm9wdGlvbmFsQXJnR3VhcmRzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5yZXN0QXJnR3VhcmQsXG4gICk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgZGVjbGFyZWRMZW46IG1hdGNoYWJsZUFyZ0d1YXJkcy5sZW5ndGgsXG4gICAgaGFzUmVzdEFyZ0d1YXJkOiByZXN0QXJnR3VhcmQgIT09IHVuZGVmaW5lZCxcbiAgICByZXN0QXJnR3VhcmRJc1JhdzogcmVzdEFyZ0d1YXJkICE9PSBtYXRjaGFibGVSZXN0QXJnR3VhcmQsXG4gICAgcGFyYW1zUGF0dGVybixcbiAgICByZWRhY3RlZEluZGljZXMsXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHsocmVwcmVzZW50YXRpdmU6IGFueSkgPT4gQ2xhc3NDb250ZXh0IHwgS2l0Q29udGV4dH0gZ2V0Q29udGV4dFxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kID0gKFxuICBnZXRDb250ZXh0LFxuICBiZWhhdmlvck1ldGhvZCxcbiAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICBsYWJlbCxcbikgPT4ge1xuICBjb25zdCB7IHJldHVybkd1YXJkIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gIGNvbnN0IGlzUmF3UmV0dXJuID0gaXNSYXdHdWFyZChyZXR1cm5HdWFyZCk7XG4gIGNvbnN0IG1hdGNoQ29uZmlnID0gYnVpbGRNYXRjaENvbmZpZyhtZXRob2RHdWFyZFBheWxvYWQpO1xuICBjb25zdCB7IHN5bmNNZXRob2QgfSA9IHtcbiAgICAvKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbiAgICBzeW5jTWV0aG9kKC4uLnN5bmNBcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzKTtcbiAgICAgICAgLyogT25seSBoYXJkZW4gYXJncyBhbmQgcmV0dXJuIHZhbHVlIGlmIG5vdCBkZWFsaW5nIHdpdGggYSByYXcgdmFsdWUgZ3VhcmQuKi9cbiAgICAgICAgY29uc3QgcmVhbEFyZ3MgPSBkZWZlbmRTeW5jQXJncyhzeW5jQXJncywgbWF0Y2hDb25maWcsIGxhYmVsKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHkoYmVoYXZpb3JNZXRob2QsIGNvbnRleHQsIHJlYWxBcmdzKTtcbiAgICAgICAgaWYgKCFpc1Jhd1JldHVybikge1xuICAgICAgICAgIG11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSwgcmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKHRocm93blRoaW5nKSB7XG4gICAgICAgIHRocm93IHRvVGhyb3dhYmxlKHRocm93blRoaW5nKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICByZXR1cm4gc3luY01ldGhvZDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICovXG5jb25zdCBkZXN5bmMgPSBtZXRob2RHdWFyZFBheWxvYWQgPT4ge1xuICBjb25zdCB7XG4gICAgYXJnR3VhcmRzLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzID0gW10sXG4gICAgcmVzdEFyZ0d1YXJkLFxuICB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICAhaXNBd2FpdEFyZ0d1YXJkKHJlc3RBcmdHdWFyZCkgfHxcbiAgICBGYWlsYFJlc3QgYXJncyBtYXkgbm90IGJlIGF3YWl0ZWQ6ICR7cmVzdEFyZ0d1YXJkfWA7XG4gIGNvbnN0IHJhd0FyZ0d1YXJkcyA9IFsuLi5hcmdHdWFyZHMsIC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuICBjb25zdCBhd2FpdEluZGV4ZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXdBcmdHdWFyZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBhcmdHdWFyZCA9IHJhd0FyZ0d1YXJkc1tpXTtcbiAgICBpZiAoaXNBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKSkge1xuICAgICAgcmF3QXJnR3VhcmRzW2ldID0gZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkO1xuICAgICAgYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgYXdhaXRJbmRleGVzLFxuICAgIHJhd01ldGhvZEd1YXJkUGF5bG9hZDoge1xuICAgICAgLi4ubWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgYXJnR3VhcmRzOiByYXdBcmdHdWFyZHMuc2xpY2UoMCwgYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgICBvcHRpb25hbEFyZ0d1YXJkczogcmF3QXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgIH0sXG4gIH07XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7KHJlcHJlc2VudGF0aXZlOiBhbnkpID0+IENsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9IGdldENvbnRleHRcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmRQYXlsb2FkfSBtZXRob2RHdWFyZFBheWxvYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICovXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZCA9IChcbiAgZ2V0Q29udGV4dCxcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgbGFiZWwsXG4pID0+IHtcbiAgY29uc3QgeyByZXR1cm5HdWFyZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBjb25zdCBpc1Jhd1JldHVybiA9IGlzUmF3R3VhcmQocmV0dXJuR3VhcmQpO1xuXG4gIGNvbnN0IHsgYXdhaXRJbmRleGVzLCByYXdNZXRob2RHdWFyZFBheWxvYWQgfSA9IGRlc3luYyhtZXRob2RHdWFyZFBheWxvYWQpO1xuICBjb25zdCBtYXRjaENvbmZpZyA9IGJ1aWxkTWF0Y2hDb25maWcocmF3TWV0aG9kR3VhcmRQYXlsb2FkKTtcblxuICBjb25zdCB7IGFzeW5jTWV0aG9kIH0gPSB7XG4gICAgLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4gICAgYXN5bmNNZXRob2QoLi4uYXJncykge1xuICAgICAgY29uc3QgYXdhaXRMaXN0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGkgb2YgYXdhaXRJbmRleGVzKSB7XG4gICAgICAgIGlmIChpID49IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXRMaXN0LnB1c2goYXJnc1tpXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwID0gUHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbiAgICAgIGNvbnN0IHN5bmNBcmdzID0gWy4uLmFyZ3NdO1xuICAgICAgY29uc3QgcmVzdWx0UCA9IEUud2hlbihcbiAgICAgICAgcCxcbiAgICAgICAgLyoqIEBwYXJhbSB7YW55W119IGF3YWl0ZWRBcmdzICovIGF3YWl0ZWRBcmdzID0+IHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF3YWl0ZWRBcmdzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICBzeW5jQXJnc1thd2FpdEluZGV4ZXNbal1dID0gYXdhaXRlZEFyZ3Nbal07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIEdldCB0aGUgY29udGV4dCBhZnRlciBhbGwgd2FpdGluZyBpbiBjYXNlIHdlIGV2ZXIgZG8gcmV2b2NhdGlvbiovXG4gICAgICAgICAgLyogYnkgcmVtb3ZpbmcgdGhlIGNvbnRleHQgZW50cnkuIEF2b2lkIFRPQ1RUT1UhKi9cbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzKTtcbiAgICAgICAgICBjb25zdCByZWFsQXJncyA9IGRlZmVuZFN5bmNBcmdzKHN5bmNBcmdzLCBtYXRjaENvbmZpZywgbGFiZWwpO1xuICAgICAgICAgIHJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCwgY29udGV4dCwgcmVhbEFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBFLndoZW4ocmVzdWx0UCwgZnVsZmlsbG1lbnQgPT4ge1xuICAgICAgICBpZiAoIWlzUmF3UmV0dXJuKSB7XG4gICAgICAgICAgbXVzdE1hdGNoKGhhcmRlbihmdWxmaWxsbWVudCksIHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxmaWxsbWVudDtcbiAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PlxuICAgICAgICAvKiBEb25lIGlzIGEgY2hhaW5lZCBgLmNhdGNoYCByYXRoZXIgdGhhbiBhbiBvblJlamVjdGVkIGNsYXVzZSBvZiB0aGUqL1xuICAgICAgICAvKiBgRS53aGVuYCBhYm92ZSBpbiBjYXNlIHRoZSBgbXVzdE1hdGNoYCB0aHJvd3MuKi9cbiAgICAgICAgUHJvbWlzZS5yZWplY3QodG9UaHJvd2FibGUocmVhc29uKSksXG4gICAgICApO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBhc3luY01ldGhvZDtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7KHJlcHJlc2VudGF0aXZlOiBhbnkpID0+IENsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9IGdldENvbnRleHRcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kID0gKGdldENvbnRleHQsIGJlaGF2aW9yTWV0aG9kLCBtZXRob2RHdWFyZCwgbGFiZWwpID0+IHtcbiAgY29uc3QgbWV0aG9kR3VhcmRQYXlsb2FkID0gZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKG1ldGhvZEd1YXJkKTtcbiAgY29uc3QgeyBjYWxsS2luZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBpZiAoY2FsbEtpbmQgPT09ICdzeW5jJykge1xuICAgIHJldHVybiBkZWZlbmRTeW5jTWV0aG9kKFxuICAgICAgZ2V0Q29udGV4dCxcbiAgICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgICAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgbGFiZWwsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoY2FsbEtpbmQgPT09ICdhc3luYycpO1xuICAgIHJldHVybiBkZWZlbmRBc3luY01ldGhvZChcbiAgICAgIGdldENvbnRleHQsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGxhYmVsLFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFRhZ1xuICogQHBhcmFtIHtDb250ZXh0UHJvdmlkZXJ9IGNvbnRleHRQcm92aWRlclxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqL1xuY29uc3QgYmluZE1ldGhvZCA9IChcbiAgbWV0aG9kVGFnLFxuICBjb250ZXh0UHJvdmlkZXIsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZCxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKGJlaGF2aW9yTWV0aG9kLCAnZnVuY3Rpb24nKTtcblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSByZXByZXNlbnRhdGl2ZVxuICogQHJldHVybnMge0NsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9XG4gKi9cbiAgY29uc3QgZ2V0Q29udGV4dCA9IHJlcHJlc2VudGF0aXZlID0+IHtcbiAgICByZXByZXNlbnRhdGl2ZSB8fFxuICAgICAgLyogc2VwYXJhdGUgbGluZSB0byBlYXNlIGJyZWFrcG9pbnRpbmcqL1xuICAgICAgRmFpbGBNZXRob2QgJHttZXRob2RUYWd9IGNhbGxlZCB3aXRob3V0ICd0aGlzJyBvYmplY3RgO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjb250ZXh0UHJvdmlkZXIocmVwcmVzZW50YXRpdmUpO1xuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEZhaWxgJHtxKFxuICAgICAgICBtZXRob2RUYWcsXG4gICAgICApfSBtYXkgb25seSBiZSBhcHBsaWVkIHRvIGEgdmFsaWQgaW5zdGFuY2U6ICR7cmVwcmVzZW50YXRpdmV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH07XG5cbiAgY29uc3QgbWV0aG9kID0gZGVmZW5kTWV0aG9kKFxuICAgIGdldENvbnRleHQsXG4gICAgYmVoYXZpb3JNZXRob2QsXG4gICAgbWV0aG9kR3VhcmQsXG4gICAgbWV0aG9kVGFnLFxuICApO1xuXG4gIGRlZmluZVByb3BlcnRpZXMobWV0aG9kLCB7XG4gICAgbmFtZTogeyB2YWx1ZTogbWV0aG9kVGFnIH0sXG4gICAgbGVuZ3RoOiB7IHZhbHVlOiBiZWhhdmlvck1ldGhvZC5sZW5ndGggfSxcbiAgfSk7XG4gIHJldHVybiBtZXRob2Q7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0NvbnRleHRQcm92aWRlcn0gY29udGV4dFByb3ZpZGVyXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPHsgW00gaW4ga2V5b2YgVF06IE1ldGhvZEd1YXJkIH0+fSBbaW50ZXJmYWNlR3VhcmRdXG4gKi9cbiAgICAgICBjb25zdCBkZWZlbmRQcm90b3R5cGUgPSAoXG4gIHRhZyxcbiAgY29udGV4dFByb3ZpZGVyLFxuICBiZWhhdmlvck1ldGhvZHMsXG4gIHRoaXNmdWxNZXRob2RzID0gZmFsc2UsXG4gIGludGVyZmFjZUd1YXJkID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGNvbnN0IHByb3RvdHlwZSA9IHt9O1xuICBjb25zdCBtZXRob2ROYW1lcyA9IGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKGJlaGF2aW9yTWV0aG9kcykuZmlsdGVyKFxuICAgIC8qIEJ5IGlnbm9yaW5nIGFueSBtZXRob2QgdGhhdCBzZWVtcyB0byBiZSBhIGNvbnN0cnVjdG9yLCB3ZSBjYW4gdXNlIGEqL1xuICAgIC8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuICAgIGtleSA9PiB7XG4gICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29uc3RydWN0b3IgPSBiZWhhdmlvck1ldGhvZHMuY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlICYmXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9PT0gY29uc3RydWN0b3JcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgTWV0aG9kR3VhcmQ+IHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgbWV0aG9kR3VhcmRzO1xuICAvKiogQHR5cGUge0RlZmF1bHRHdWFyZFR5cGV9ICovXG4gIGxldCBkZWZhdWx0R3VhcmRzO1xuICBpZiAoaW50ZXJmYWNlR3VhcmQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcmZhY2VOYW1lLFxuICAgICAgbWV0aG9kR3VhcmRzOiBtZyxcbiAgICAgIHN5bWJvbE1ldGhvZEd1YXJkcyxcbiAgICAgIHNsb3BweSxcbiAgICAgIGRlZmF1bHRHdWFyZHM6IGRnID0gc2xvcHB5ID8gJ3Bhc3NhYmxlJyA6IGRlZmF1bHRHdWFyZHMsXG4gICAgfSA9IGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChpbnRlcmZhY2VHdWFyZCk7XG4gICAgbWV0aG9kR3VhcmRzID0gaGFyZGVuKHtcbiAgICAgIC4uLm1nLFxuICAgICAgLi4uKHN5bWJvbE1ldGhvZEd1YXJkcyAmJlxuICAgICAgICBmcm9tRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyhzeW1ib2xNZXRob2RHdWFyZHMpKSksXG4gICAgfSk7XG4gICAgZGVmYXVsdEd1YXJkcyA9IGRnO1xuICAgIHtcbiAgICAgIGNvbnN0IG1ldGhvZEd1YXJkTmFtZXMgPSBvd25LZXlzKG1ldGhvZEd1YXJkcyk7XG4gICAgICBjb25zdCB1bmltcGxlbWVudGVkID0gbGlzdERpZmZlcmVuY2UobWV0aG9kR3VhcmROYW1lcywgbWV0aG9kTmFtZXMpO1xuICAgICAgdW5pbXBsZW1lbnRlZC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgRmFpbGBtZXRob2RzICR7cSh1bmltcGxlbWVudGVkKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgICBpZiAoZGVmYXVsdEd1YXJkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHVuZ3VhcmRlZCA9IGxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLCBtZXRob2RHdWFyZE5hbWVzKTtcbiAgICAgICAgdW5ndWFyZGVkLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgIEZhaWxgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIG1ldGhvZE5hbWVzKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBiZWhhdmlvck1ldGhvZHNbcHJvcF07XG4gICAgY29uc3QgeyBzaGlmdGVkTWV0aG9kIH0gPSB7XG4gICAgICBzaGlmdGVkTWV0aG9kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGJlaGF2aW9yTWV0aG9kID0gdGhpc2Z1bE1ldGhvZHMgPyBvcmlnaW5hbE1ldGhvZCA6IHNoaWZ0ZWRNZXRob2Q7XG4gICAgLyogVE9ETyBzb21lIHRvb2wgZG9lcyBub3QgeWV0IHVuZGVyc3RhbmQgdGhlIGA/LltgIHN5bnRheCovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzIyNDcjZGlzY3Vzc2lvbl9yMTU4MzcyNDQyNCovXG4gICAgbGV0IG1ldGhvZEd1YXJkID0gbWV0aG9kR3VhcmRzICYmIG1ldGhvZEd1YXJkc1twcm9wXTtcbiAgICBpZiAoIW1ldGhvZEd1YXJkKSB7XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRHdWFyZHMpIHtcbiAgICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgICBpZiAodGhpc2Z1bE1ldGhvZHMpIHtcbiAgICAgICAgICAgIG1ldGhvZEd1YXJkID0gUGFzc2FibGVNZXRob2RHdWFyZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWV0aG9kR3VhcmQgPSBSYXdNZXRob2RHdWFyZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGFzc2FibGUnOiB7XG4gICAgICAgICAgbWV0aG9kR3VhcmQgPSBQYXNzYWJsZU1ldGhvZEd1YXJkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Jhdyc6IHtcbiAgICAgICAgICBtZXRob2RHdWFyZCA9IFJhd01ldGhvZEd1YXJkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBkZWZhdWx0R3VhcmRzICR7cShkZWZhdWx0R3VhcmRzKX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByb3RvdHlwZVtwcm9wXSA9IGJpbmRNZXRob2QoXG4gICAgICBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuICAgICAgY29udGV4dFByb3ZpZGVyLFxuICAgICAgYmVoYXZpb3JNZXRob2QsXG4gICAgICBtZXRob2RHdWFyZCxcbiAgICApO1xuICB9XG5cbiAgaWYgKCFoYXNPd24ocHJvdG90eXBlLCBHRVRfSU5URVJGQUNFX0dVQVJEKSkge1xuICAgIGNvbnN0IGdldEludGVyZmFjZUd1YXJkTWV0aG9kID0ge1xuICAgICAgW0dFVF9JTlRFUkZBQ0VfR1VBUkRdKCkge1xuICAgICAgICAvKiBOb3RlOiBNYXkgYmUgYHVuZGVmaW5lZGAqL1xuICAgICAgICByZXR1cm4gaW50ZXJmYWNlR3VhcmQ7XG4gICAgICB9LFxuICAgIH1bR0VUX0lOVEVSRkFDRV9HVUFSRF07XG4gICAgcHJvdG90eXBlW0dFVF9JTlRFUkZBQ0VfR1VBUkRdID0gYmluZE1ldGhvZChcbiAgICAgIGBJbiAke3EoR0VUX0lOVEVSRkFDRV9HVUFSRCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXIsXG4gICAgICBnZXRJbnRlcmZhY2VHdWFyZE1ldGhvZCxcbiAgICAgIFBhc3NhYmxlTWV0aG9kR3VhcmQsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBGYXIodGFnLCAvKiogQHR5cGUge1QgJiBHZXRJbnRlcmZhY2VHdWFyZDxUPn0gKi8gKHByb3RvdHlwZSkpO1xufTskaM2PX29uY2UuZGVmZW5kUHJvdG90eXBlKGRlZmVuZFByb3RvdHlwZSk7XG5oYXJkZW4oZGVmZW5kUHJvdG90eXBlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxGYWNldE5hbWUsIE1ldGhvZHM+fSBGXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge3sgW0sgaW4ga2V5b2YgRl06IEtpdENvbnRleHRQcm92aWRlciB9fSBjb250ZXh0UHJvdmlkZXJLaXRcbiAqIEBwYXJhbSB7Rn0gYmVoYXZpb3JNZXRob2RzS2l0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7eyBbSyBpbiBrZXlvZiBGXTogSW50ZXJmYWNlR3VhcmQ8UmVjb3JkPGtleW9mIEZbS10sIE1ldGhvZEd1YXJkPj4gfX0gW2ludGVyZmFjZUd1YXJkS2l0XVxuICovXG4gICAgICAgY29uc3QgZGVmZW5kUHJvdG90eXBlS2l0ID0gKFxuICB0YWcsXG4gIGNvbnRleHRQcm92aWRlcktpdCxcbiAgYmVoYXZpb3JNZXRob2RzS2l0LFxuICB0aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuICBpbnRlcmZhY2VHdWFyZEtpdCA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBmYWNldE5hbWVzID0gb3duS2V5cyhiZWhhdmlvck1ldGhvZHNLaXQpLnNvcnQoKTtcbiAgZmFjZXROYW1lcy5sZW5ndGggPiAxIHx8IEZhaWxgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG4gIGlmIChpbnRlcmZhY2VHdWFyZEtpdCkge1xuICAgIGNvbnN0IGludGVyZmFjZU5hbWVzID0gb3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG4gICAgY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGludGVyZmFjZU5hbWVzKTtcbiAgICBleHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgY29uc3QgZXh0cmFGYWNldE5hbWVzID0gbGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsIGZhY2V0TmFtZXMpO1xuICAgIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gIH1cbiAgY29uc3QgY29udGV4dE1hcE5hbWVzID0gb3duS2V5cyhjb250ZXh0UHJvdmlkZXJLaXQpO1xuICBjb25zdCBleHRyYUNvbnRleHROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGNvbnRleHRNYXBOYW1lcyk7XG4gIGV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gIGNvbnN0IGV4dHJhRmFjZXROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGNvbnRleHRNYXBOYW1lcywgZmFjZXROYW1lcyk7XG4gIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG1pc3NpbmcgY29udGV4dHNgO1xuICBjb25zdCBwcm90b0tpdCA9IG9iamVjdE1hcChiZWhhdmlvck1ldGhvZHNLaXQsIChiZWhhdmlvck1ldGhvZHMsIGZhY2V0TmFtZSkgPT5cbiAgICBkZWZlbmRQcm90b3R5cGUoXG4gICAgICBgJHt0YWd9ICR7U3RyaW5nKGZhY2V0TmFtZSl9YCxcbiAgICAgIGNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuICAgICAgYmVoYXZpb3JNZXRob2RzLFxuICAgICAgdGhpc2Z1bE1ldGhvZHMsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCAmJiBpbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdLFxuICAgICksXG4gICk7XG4gIHJldHVybiBwcm90b0tpdDtcbn07JGjNj19vbmNlLmRlZmVuZFByb3RvdHlwZUtpdChkZWZlbmRQcm90b3R5cGVLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMkl2jYLBQAACwUAACYAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZ2V0LWludGVyZmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90YWJsZU1ldGhvZE5hbWV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGF1dG9tYXRpY2FsbHkgYWRkZWQgZGVmYXVsdCBtZXRhLW1ldGhvZCBmb3JcbiAqIG9idGFpbmluZyBhbiBleG8ncyBpbnRlcmZhY2UsIGlmIGl0IGhhcyBvbmUuXG4gKlxuICogSW50ZW5kZWQgdG8gYmUgc2ltaWxhciB0byBgR0VUX01FVEhPRF9OQU1FU2AgZnJvbSBgQGVuZG8vcGFzcy1zdHlsZWAuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE4MDkjZGlzY3Vzc2lvbl9yMTM4ODA1MjQ1NFxuICpcbiAqIEJld2FyZSB0aGF0IGFuIGV4bydzIGludGVyZmFjZSBjYW4gY2hhbmdlIGFjcm9zcyBhbiB1cGdyYWRlLFxuICogc28gcmVtb3RlcyB0aGF0IGNhY2hlIGl0IGNhbiBiZWNvbWUgc3RhbGUuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfSU5URVJGQUNFX0dVQVJEID0gJ19fZ2V0SW50ZXJmYWNlR3VhcmRfXyc7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgQ2FsbGFibGVGdW5jdGlvbj59IE1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtHRVRfSU5URVJGQUNFX0dVQVJEXT86ICgpID0+XG4gKiAgICAgSU1QT1JUKCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkPHtcbiAqICAgICAgIFtLIGluIGtleW9mIE1dOiBJTVBPUlQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kR3VhcmRcbiAqICAgICB9PiB8IHVuZGVmaW5lZFxuICogfX0gR2V0SW50ZXJmYWNlR3VhcmRcbiAqLyRozY9fb25jZS5HRVRfSU5URVJGQUNFX0dVQVJEKEdFVF9JTlRFUkZBQ0VfR1VBUkQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiR0VUX0lOVEVSRkFDRV9HVUFSRCI6WyJHRVRfSU5URVJGQUNFX0dVQVJEIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAAB4AAABAZW5kby9leG8tdjEuNS4xMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIAAAAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKkm1lCYAgAAmAIAAB4AAABAZW5kby9mYXItdjEuMS4xNC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIixudWxsXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAZW5kby9ldmVudHVhbC1zZW5kIjpbWyJFIiwiRSJdXSwiQGVuZG8vcGFzcy1zdHlsZSI6W1siRmFyIiwiRmFyIl0sWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl0sWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1Rn/ZBwgAAAcIAAAdAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL3JhbmtPcmRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImNvbXBhcmVCeUNvZGVQb2ludHMiLCJjb21wYXJlQnlDb2RlUG9pbnRzIiwibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFyc2UiLCJwYXJzZSIsInBhc3NhYmxlQXNKdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIixudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9yYW5rT3JkZXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjpbWyJRQ0xBU1MiLCJRQ0xBU1MiXV0sIi4vc3JjL21hcnNoYWwuanMiOltbIm1ha2VNYXJzaGFsIiwibWFrZU1hcnNoYWwiXV0sIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjpbWyJzdHJpbmdpZnkiLCJzdHJpbmdpZnkiXSxbInBhcnNlIiwicGFyc2UiXV0sIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjpbWyJkZWNvZGVUb0p1c3RpbiIsImRlY29kZVRvSnVzdGluIl0sWyJwYXNzYWJsZUFzSnVzdGluIiwicGFzc2FibGVBc0p1c3RpbiJdLFsicXAiLCJxcCJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VQYXNzYWJsZUtpdCIsIm1ha2VQYXNzYWJsZUtpdCJdLFsibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJjb21wYXJlTnVtZXJpY3MiLCJjb21wYXJlTnVtZXJpY3MiXSxbImNvbXBhcmVCeUNvZGVQb2ludHMiLCJjb21wYXJlQnlDb2RlUG9pbnRzIl0sWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGC/aqjJfQAAyX0AACoAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VQYXNzYWJsZUtpdCIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGZyb21FbnRyaWVzLCBpcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCovXG5jb25zdCByQzAgPSAvW1xceDAwLVxceDFGXS87XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdWZmaXggb2YgYSBzdHJpbmcgc3RhcnRpbmcgYXQgYSBwYXJ0aWN1bGFyIGluZGV4LlxuICogVGhpcyBib3RoIGV4cHJlc3NlcyBpbnRlbnQgYW5kIHBvdGVudGlhbGx5IGF2b2lkcyBzbG93IGBzdWJzdHJpbmdgIGluIFhTLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRTdWZmaXggPSAoc3RyLCBpbmRleCkgPT4gKGluZGV4ID09PSAwID8gc3RyIDogc3RyLnN1YnN0cmluZyhpbmRleCkpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG4gICAgICAgY29uc3QgcmVjb3JkTmFtZXMgPSByZWNvcmQgPT5cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3IxMDAzNjU3MjQ0Ki9cbiAgLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbiAgLyogaXMgY3VycmVudGx5IGZhc3RlciBvbiBNb2RkYWJsZSBYUywgd2hpbGUgdGhlIG90aGVyIHdheSwqL1xuICAvKiBgLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IpYCwgaXMgZmFzdGVyIG9uIHY4LiBXZSBjdXJyZW50bHkgY2FyZSBtb3JlIGFib3V0Ki9cbiAgLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG4gIGhhcmRlbigvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhyZWNvcmQpKS5zb3J0KCkucmV2ZXJzZSgpKTskaM2PX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCBhbmQgYG5hbWVzYCBpcyBgcmVjb3JkTmFtZXMocmVjb3JkKWAsXG4gKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuICAgICAgIGNvbnN0IHJlY29yZFZhbHVlcyA9IChyZWNvcmQsIG5hbWVzKSA9PlxuICBoYXJkZW4obmFtZXMubWFwKG5hbWUgPT4gcmVjb3JkW25hbWVdKSk7JGjNj19vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0IHplcm9lcyA9IEFycmF5KDE2KVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGkpID0+ICcwJy5yZXBlYXQoaSkpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gblxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCB6ZXJvUGFkID0gKG4sIHNpemUpID0+IHtcbiAgY29uc3QgblN0ciA9IGAke259YDtcbiAgY29uc3QgZmlsbExlbiA9IHNpemUgLSBuU3RyLmxlbmd0aDtcbiAgaWYgKGZpbGxMZW4gPT09IDApIHJldHVybiBuU3RyO1xuICBhc3NlcnQoZmlsbExlbiA+IDAgJiYgZmlsbExlbiA8IHplcm9lcy5sZW5ndGgpO1xuICByZXR1cm4gYCR7emVyb2VzW2ZpbGxMZW5dfSR7blN0cn1gO1xufTskaM2PX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyID0gbmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cyA9IG5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vKiBKYXZhU2NyaXB0IG51bWJlcnMgYXJlIGVuY29kZWQgYnkgb3V0cHV0dGluZyB0aGUgYmFzZS0xNiovXG4vKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nIElFRUUgZmxvYXRpbmcgcG9pbnQqL1xuLyogcmVwcmVzZW50YXRpb24uICBGb3IgbmVnYXRpdmUgdmFsdWVzLCBhbGwgYml0cyBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIGFyZSovXG4vKiBjb21wbGVtZW50ZWQgcHJpb3IgdG8gdGhlIGJhc2UtMTYgY29udmVyc2lvbiwgd2hpbGUgZm9yIHBvc2l0aXZlIHZhbHVlcywgdGhlKi9cbi8qIHNpZ24gYml0IGlzIGNvbXBsZW1lbnRlZC4gIFRoaXMgZW5zdXJlcyBib3RoIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYmVmb3JlKi9cbi8qIHBvc2l0aXZlIHZhbHVlcyBhbmQgdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVnYXRpdmUqL1xuLyogbWFnbml0dWRlIHJhdGhlciB0aGFuIHRoZWlyIHBvc2l0aXZlIG1hZ25pdHVkZS4gIFRoaXMgcmVzdWx0cyBpbiBhbiBBU0NJSSovXG4vKiBlbmNvZGluZyB3aG9zZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWVyaWMgc29ydCBvcmRlciovXG4vKiBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLiovXG5cbi8qIFRPRE8gQ2hvb3NlIHRoZSBzYW1lIGNhbm9uaWNhbCBOYU4gZW5jb2RpbmcgdGhhdCBjb3NtV2FzbSBhbmQgZXdhc20gY2hvc2UuKi9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHMgPSAnZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0ID0gbiA9PiB7XG4gIC8qIE5vcm1hbGl6ZSAtMCB0byAwIGFuZCBOYU4gdG8gYSBjYW5vbmljYWwgZW5jb2RpbmcqL1xuICBpZiAoaXMobiwgLTApKSB7XG4gICAgbiA9IDA7XG4gIH0gZWxzZSBpZiAoaXMobiwgTmFOKSkge1xuICAgIHJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuICB9XG4gIGFzTnVtYmVyWzBdID0gbjtcbiAgbGV0IGJpdHMgPSBhc0JpdHNbMF07XG4gIGlmIChuIDwgMCkge1xuICAgIGJpdHMgXj0gMHhmZmZmZmZmZmZmZmZmZmZmbjtcbiAgfSBlbHNlIHtcbiAgICBiaXRzIF49IDB4ODAwMDAwMDAwMDAwMDAwMG47XG4gIH1cbiAgcmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLCAxNil9YDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0ID0gKGVuY29kZWQsIHNraXAgPSAwKSA9PiB7XG4gIGVuY29kZWQuY2hhckF0KHNraXApID09PSAnZicgfHwgRmFpbGBFbmNvZGVkIG51bWJlciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBiaXRzID0gQmlnSW50KGAweCR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKX1gKTtcbiAgaWYgKGVuY29kZWQuY2hhckF0KHNraXAgKyAxKSA8ICc4Jykge1xuICAgIGJpdHMgXj0gMHhmZmZmZmZmZmZmZmZmZmZmbjtcbiAgfSBlbHNlIHtcbiAgICBiaXRzIF49IDB4ODAwMDAwMDAwMDAwMDAwMG47XG4gIH1cbiAgYXNCaXRzWzBdID0gYml0cztcbiAgY29uc3QgcmVzdWx0ID0gYXNOdW1iZXJbMF07XG4gICFpcyhyZXN1bHQsIC0wKSB8fFxuICAgIEZhaWxgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBFbmNvZGUgYSBKYXZhU2NyaXB0IGJpZ2ludCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuXG4gKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGFcbiAqIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZVxuICogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uXG4gKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlXG4gKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5XG4gKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2ZcbiAqIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlXG4gKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZFxuICogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0c1xuICogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieVxuICogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50ID0gbiA9PiB7XG4gIGNvbnN0IGFicyA9IG4gPCAwbiA/IC1uIDogbjtcbiAgY29uc3QgbkRpZ2l0cyA9IGFicy50b1N0cmluZygpLmxlbmd0aDtcbiAgY29uc3QgbERpZ2l0cyA9IG5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG4gIGlmIChuIDwgMG4pIHtcbiAgICByZXR1cm4gYG4ke1xuICAgICAgLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbiAgICAgIC8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbiAgICAgICcjJy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgY291bnQgb2YgZGlnaXRzLiovXG4gICAgICAoMTAgKiogbERpZ2l0cyAtIG5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywgJzAnKVxuICAgIH06JHtcbiAgICAgIC8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbiAgICAgICgxMG4gKiogQmlnSW50KG5EaWdpdHMpICsgbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCAnMCcpXG4gICAgfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBwJHtcbiAgICAgIC8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4gICAgICAvKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4gICAgICAnficucmVwZWF0KGxEaWdpdHMgLSAxKVxuICAgIH0ke1xuICAgICAgLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuICAgICAgbkRpZ2l0c1xuICAgIH06JHtcbiAgICAgIC8qIFRoZSBkaWdpdHMuKi9cbiAgICAgIG5cbiAgICB9YDtcbiAgfVxufTtcblxuY29uc3QgckJpZ0ludFBheWxvYWQgPSAvKFswLTldKykoOihbMC05XSskfCl8KS9zO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5jb25zdCBkZWNvZGVCaWdJbnQgPSBlbmNvZGVkID0+IHtcbiAgY29uc3QgdHlwZVByZWZpeCA9IGVuY29kZWQuY2hhckF0KDApOyAvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbiAgdHlwZVByZWZpeCA9PT0gJ3AnIHx8XG4gICAgdHlwZVByZWZpeCA9PT0gJ24nIHx8XG4gICAgRmFpbGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbiAgY29uc3Qge1xuICAgIGluZGV4OiBsRGlnaXRzLFxuICAgIDE6IHNuRGlnaXRzLFxuICAgIDI6IHRhaWwsXG4gICAgMzogZGlnaXRzLFxuICB9ID0gZW5jb2RlZC5tYXRjaChyQmlnSW50UGF5bG9hZCkgfHwgRmFpbGBEaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbiAgc25EaWdpdHMubGVuZ3RoID09PSBsRGlnaXRzIHx8XG4gICAgRmFpbGBVbmFyeS1wcmVmaXhlZCBkZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IG5EaWdpdHMgPSBwYXJzZUludChzbkRpZ2l0cywgMTApO1xuICBpZiAodHlwZVByZWZpeCA9PT0gJ24nKSB7XG4gICAgLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuICAgIC8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbiAgICBuRGlnaXRzID0gMTAgKiogLyoqIEB0eXBlIHtudW1iZXJ9ICovIChsRGlnaXRzKSAtIG5EaWdpdHM7XG4gIH1cblxuICB0YWlsLmNoYXJBdCgwKSA9PT0gJzonIHx8IEZhaWxgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgZGlnaXRzLmxlbmd0aCA9PT0gbkRpZ2l0cyB8fFxuICAgIEZhaWxgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IG4gPSBCaWdJbnQoZGlnaXRzKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbiAgICAvKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xuICAgIG4gPSAtKDEwbiAqKiBCaWdJbnQobkRpZ2l0cykgLSBuKTtcbiAgfVxuXG4gIHJldHVybiBuO1xufTtcblxuLyoqXG4gKiBBIHNwYXJzZSBhcnJheSBmb3Igd2hpY2ggZXZlcnkgcHJlc2VudCBpbmRleCBtYXBzIGEgY29kZSBwb2ludCBpbiB0aGUgQVNDSUlcbiAqIHJhbmdlIHRvIGEgY29ycmVzcG9uZGluZyBlc2NhcGUgc2VxdWVuY2UuXG4gKlxuICogRXNjYXBlcyBhbGwgY2hhcmFjdGVycyBmcm9tIFUrMDAwMCBOVUxMIHRvIFUrMDAxRiBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FXG4gKiBsaWtlIGAhPGNoYXJhY3RlciBvZmZzZXQgYnkgMHgyMT5gIHRvIGF2b2lkIEpTT04uc3RyaW5naWZ5IGV4cGFuc2lvbiBhc1xuICogYFxcdUhISEhgLCBhbmQgc3BlY2lhbGx5IGVzY2FwZXMgVSswMDIwIFNQQUNFICh0aGUgYXJyYXkgZWxlbWVudCB0ZXJtaW5hdG9yKVxuICogYXMgYCFfYCBhbmQgVSswMDIxIEVYQ0xBTUFUSU9OIE1BUksgKHRoZSBlc2NhcGUgcHJlZml4KSBhcyBgIXxgIChib3RoIGNob3NlblxuICogZm9yIHZpc3VhbCBhcHByb3hpbWF0aW9uKS5cbiAqIFJlbGF0aXZlIGxleGljb2dyYXBoaWMgb3JkZXJpbmcgaXMgcHJlc2VydmVkIGJ5IHRoaXMgbWFwcGluZyBvZiBhbnkgY2hhcmFjdGVyXG4gKiBhdCBvciBiZWZvcmUgYCFgIGluIHRoZSBjb250aWd1b3VzIHJhbmdlIFsweDAwLi4weDIxXSB0byBhIHJlc3BlY3RpdmVcbiAqIGNoYXJhY3RlciBpbiBbMHgyMS4uMHg0MCwgMHg1RiwgMHg3Q10gcHJlY2VkZWQgYnkgYCFgICh3aGljaCBpcyBpdHNlbGYgaW4gdGhlXG4gKiByZXBsYWNlZCByYW5nZSkuXG4gKiBTaW1pbGFybHksIGVzY2FwZXMgYF5gIGFzIGBfQGAgYW5kIGBfYCBhcyBgX19gIGJlY2F1c2UgYF5gIGluZGljYXRlcyB0aGVcbiAqIHN0YXJ0IG9mIGFuIGVuY29kZWQgYXJyYXkuXG4gKlxuICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gKi9cbmNvbnN0IHN0cmluZ0VzY2FwZXMgPSBBcnJheSgweDIyKVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGNwKSA9PiB7XG4gICAgc3dpdGNoIChTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSkge1xuICAgICAgY2FzZSAnICc6XG4gICAgICAgIHJldHVybiAnIV8nO1xuICAgICAgY2FzZSAnISc6XG4gICAgICAgIHJldHVybiAnIXwnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwICsgMHgyMSl9YDtcbiAgICB9XG4gIH0pO1xuc3RyaW5nRXNjYXBlc1snXicuY2hhckNvZGVBdCgwKV0gPSAnX0AnO1xuc3RyaW5nRXNjYXBlc1snXycuY2hhckNvZGVBdCgwKV0gPSAnX18nO1xuXG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgd2l0aCBlc2NhcGUgc2VxdWVuY2VzIGZvciB1c2UgaW4gdGhlIFwiY29tcGFjdE9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gc3RyID0+XG4gIHN0ci5yZXBsYWNlKC9bXFwwLSFeX10vZywgY2ggPT4gc3RyaW5nRXNjYXBlc1tjaC5jaGFyQ29kZUF0KDApXSk7XG5cbi8qKlxuICogRGVjb2RlcyBhIHN0cmluZyBmcm9tIHRoZSBcImNvbXBhY3RPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IHtcbiAgcmV0dXJuIGVuY29kZWQucmVwbGFjZSgvKFtcXDAtIV9dKSgufFxcbik/L2csIChlc2MsIHByZWZpeCwgc3VmZml4KSA9PiB7XG4gICAgc3dpdGNoIChlc2MpIHtcbiAgICAgIGNhc2UgJyFfJzpcbiAgICAgICAgcmV0dXJuICcgJztcbiAgICAgIGNhc2UgJyF8JzpcbiAgICAgICAgcmV0dXJuICchJztcbiAgICAgIGNhc2UgJ19AJzpcbiAgICAgICAgcmV0dXJuICdeJztcbiAgICAgIGNhc2UgJ19fJzpcbiAgICAgICAgcmV0dXJuICdfJztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgY2ggPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHN1ZmZpeCk7XG4gICAgICAgIC8qIFRoZSByYW5nZSBvZiB2YWxpZCBgIWAtZXNjYXBlIHN1ZmZpeGVzIGlzIFsoMHgwMCsweDIxKS4uKDB4MUYrMHgyMSldLCBpLmUuKi9cbiAgICAgICAgLyogWzB4MjEuLjB4NDBdIChVKzAwMjEgRVhDTEFNQVRJT04gTUFSSyB0byBVKzAwNDAgQ09NTUVSQ0lBTCBBVCkuKi9cbiAgICAgICAgKHByZWZpeCA9PT0gJyEnICYmIHN1ZmZpeCAhPT0gdW5kZWZpbmVkICYmIGNoID49ICchJyAmJiBjaCA8PSAnQCcpIHx8XG4gICAgICAgICAgRmFpbGBpbnZhbGlkIHN0cmluZyBlc2NhcGU6ICR7cShlc2MpfWA7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgLSAweDIxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBUcml2aWFsbHkgaWRlbnRpdHktZW5jb2RlcyBhIHN0cmluZyBmb3IgdXNlIGluIHRoZSBcImxlZ2FjeU9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXggPSBzdHIgPT4gc3RyO1xuXG4vKipcbiAqIFRyaXZpYWxseSBpZGVudGl0eS1kZWNvZGVzIGEgc3RyaW5nIGZyb20gdGhlIFwibGVnYWN5T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KGVuY29kZWQ6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IGVuY29kZWQ7XG5cbi8qKlxuICogRW5jb2RlcyBhbiBhcnJheSBpbnRvIGEgc2VxdWVuY2Ugb2YgZW5jb2RlZCBlbGVtZW50cyBmb3IgdXNlIGluIHRoZSBcImNvbXBhY3RPcmRlcmVkXCJcbiAqIGZvcm1hdCwgZWFjaCB0ZXJtaW5hdGVkIGJ5IGEgc3BhY2UgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGVzY2FwZWQgcmFuZ2UgaW5cbiAqIFwiY29tcGFjdE9yZGVyZWRcIiBlbmNvZGVkIHN0cmluZ3MpLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gYXJyYXlcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9IGVuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydeJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGNoYXJzLnB1c2goZW5jLCAnICcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9IGRlY29kZVBhc3NhYmxlXG4gKiBAcGFyYW0ge251bWJlcn0gW3NraXBdXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RBcnJheSA9IChlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgLyogU2NhbiBlbmNvZGVkIHJhdGhlciB0aGFuIGl0cyB0YWlsIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgbGV0IG5leHRJbmRleCA9IHNraXAgKyAxO1xuICBsZXQgY3VycmVudEVsZW1lbnRTdGFydCA9IHNraXAgKyAxO1xuICBmb3IgKGNvbnN0IHsgMDogY2gsIGluZGV4OiBpIH0gb2YgZW5jb2RlZC5tYXRjaEFsbCgvW1xcXiBdL2cpKSB7XG4gICAgY29uc3QgaW5kZXggPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGkpO1xuICAgIGlmIChpbmRleCA8PSBza2lwKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHNraXApIHtcbiAgICAgICAgY2ggPT09ICdeJyB8fCBGYWlsYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gJ14nKSB7XG4gICAgICAvKiBUaGlzIGlzIHRoZSBzdGFydCBvZiBhIG5lc3RlZCBhcnJheS4qL1xuICAgICAgLyogVE9ETzogU2luY2UgdGhlIHN5bnRheCBvZiBuZXN0ZWQgYXJyYXlzIG11c3QgYmUgdmFsaWRhdGVkIGFzIHBhcnQgb2YqL1xuICAgICAgLyogZGVjb2RpbmcgdGhlIG91dGVyIG9uZSwgY29uc2lkZXIgZGVjb2RpbmcgdGhlbSBoZXJlIGludG8gYSBzaGFyZWQgY2FjaGUqL1xuICAgICAgLyogcmF0aGVyIHRoYW4gZGlzY2FyZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBjb250ZW50cyB1bnRpbCB0aGUgbGF0ZXIqL1xuICAgICAgLyogZGVjb2RlUGFzc2FibGUuKi9cbiAgICAgIGRlcHRoICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIFRoaXMgaXMgYSB0ZXJtaW5hdGVkIGVsZW1lbnQuKi9cbiAgICAgIGlmIChpbmRleCA9PT0gbmV4dEluZGV4KSB7XG4gICAgICAgIC8qIEEgdGVybWluYXRvciBhZnRlciBgW2Agb3IgYW4gYW5vdGhlciB0ZXJtaW5hdG9yIGluZGljYXRlcyB0aGF0IGFuIGFycmF5IGlzIGRvbmUuKi9cbiAgICAgICAgZGVwdGggLT0gMTtcbiAgICAgICAgZGVwdGggPj0gMCB8fFxuICAgICAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcjogJHtlbmNvZGVkLnNsaWNlKHNraXAsIGluZGV4ICsgMil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAvKiBXZSBoYXZlIGEgY29tcGxldGUgZWxlbWVudCBvZiB0aGUgdG9wbW9zdCBhcnJheS4qL1xuICAgICAgICBlbGVtZW50cy5wdXNoKFxuICAgICAgICAgIGRlY29kZVBhc3NhYmxlKGVuY29kZWQuc2xpY2UoY3VycmVudEVsZW1lbnRTdGFydCwgaW5kZXgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgY3VycmVudEVsZW1lbnRTdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogQWR2YW5jZSB0aGUgaW5kZXguKi9cbiAgICBuZXh0SW5kZXggPSBpbmRleCArIDE7XG4gIH1cbiAgZGVwdGggPT09IDAgfHwgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIG5leHRJbmRleCA9PT0gZW5jb2RlZC5sZW5ndGggfHxcbiAgICBGYWlsYHVudGVybWluYXRlZCBhcnJheSBlbGVtZW50OiAke2dldFN1ZmZpeChcbiAgICAgIGVuY29kZWQsXG4gICAgICBjdXJyZW50RWxlbWVudFN0YXJ0LFxuICAgICl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBvcmlnaW5hbCBhcnJheSBlbmNvZGluZywgd2hpY2ggZXNjYXBlcyBhbGwgZW5jb2RlZCBhcnJheVxuICogZWxlbWVudHMgcmF0aGVyIHRoYW4ganVzdCBzdHJpbmdzIChgXFx1MDAwMGAgYXMgdGhlIGVsZW1lbnQgdGVybWluYXRvciBhbmRcbiAqIGBcXHUwMDAxYCBhcyB0aGUgZXNjYXBlIHByZWZpeCBmb3IgYFxcdTAwMDBgIG9yIGBcXHUwMDAxYCkuXG4gKiBUaGlzIG5lY2Vzc2l0YXRlZCBhbiB1bmRlc2lyYWJsZSBhbW91bnQgb2YgaXRlcmF0aW9uIGFuZCBleHBhbnNpb247IHNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3I5NjAzNjk4MjZcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGFycmF5XG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gc3RyaW5nfSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydbJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgYyBvZiBlbmMpIHtcbiAgICAgIGlmIChjID09PSAnXFx1MDAwMCcgfHwgYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICAgIGNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiAgICAgIH1cbiAgICAgIGNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVMZWdhY3lBcnJheSA9IChlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgY29uc3QgZWxlbUNoYXJzID0gW107XG4gIC8qIFVzZSBhIHN0cmluZyBpdGVyYXRvciB0byBhdm9pZCBzbG93IGluZGV4ZWQgYWNjZXNzIGluIFhTLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gIGxldCBzdGlsbFRvU2tpcCA9IHNraXAgKyAxO1xuICBsZXQgaW5Fc2NhcGUgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBjIG9mIGVuY29kZWQpIHtcbiAgICBpZiAoc3RpbGxUb1NraXAgPiAwKSB7XG4gICAgICBzdGlsbFRvU2tpcCAtPSAxO1xuICAgICAgaWYgKHN0aWxsVG9Ta2lwID09PSAwKSB7XG4gICAgICAgIGMgPT09ICdbJyB8fCBGYWlsYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbkVzY2FwZSkge1xuICAgICAgYyA9PT0gJ1xcdTAwMDAnIHx8XG4gICAgICAgIGMgPT09ICdcXHUwMDAxJyB8fFxuICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjfWA7XG4gICAgICBlbGVtQ2hhcnMucHVzaChjKTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHUwMDAwJykge1xuICAgICAgY29uc3QgZW5jb2RlZEVsZW1lbnQgPSBlbGVtQ2hhcnMuam9pbignJyk7XG4gICAgICBlbGVtQ2hhcnMubGVuZ3RoID0gMDtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG4gICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICBpbkVzY2FwZSA9IHRydWU7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWUqL1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH1cbiAgICBpbkVzY2FwZSA9IGZhbHNlO1xuICB9XG4gICFpbkVzY2FwZSB8fCBGYWlsYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGVsZW1DaGFycy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0J5dGVBcnJheX0gYnl0ZUFycmF5XG4gKiBAcGFyYW0geyhieXRlQXJyYXk6IEJ5dGVBcnJheSkgPT4gc3RyaW5nfSBfZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJ5dGVBcnJheSA9IChieXRlQXJyYXksIF9lbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAvKiBUT0RPIGltcGxlbWVudCovXG4gIEZhaWxgZW5jb2RlUGFzc2FibGUoYnl0ZUFycmF5KSBub3QgeWV0IGltcGxlbWVudGVkOiAke2J5dGVBcnJheX1gO1xuICByZXR1cm4gJyc7IC8qIEp1c3QgZm9yIHRoZSB0eXBlKi9cbn07XG5cbmNvbnN0IGVuY29kZVJlY29yZCA9IChyZWNvcmQsIGVuY29kZUFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBuYW1lcyA9IHJlY29yZE5hbWVzKHJlY29yZCk7XG4gIGNvbnN0IHZhbHVlcyA9IHJlY29yZFZhbHVlcyhyZWNvcmQsIG5hbWVzKTtcbiAgcmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLCB2YWx1ZXNdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG59O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQgPSAoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBhc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICcoJyk7XG4gIC8qIFNraXAgdGhlIFwiKFwiIGluc2lkZSBgZGVjb2RlQXJyYXlgIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgY29uc3QgdW56aXBwZWRFbnRyaWVzID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdW56aXBwZWRFbnRyaWVzLmxlbmd0aCA9PT0gMiB8fFxuICAgIEZhaWxgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgW2tleXMsIHZhbHNdID0gdW56aXBwZWRFbnRyaWVzO1xuXG4gIChwYXNzU3R5bGVPZihrZXlzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBwYXNzU3R5bGVPZih2YWxzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBrZXlzLmxlbmd0aCA9PT0gdmFscy5sZW5ndGggJiZcbiAgICBrZXlzLmV2ZXJ5KGtleSA9PiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykpIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IG1hcEVudHJpZXMgPSBrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWxzW2ldXSk7XG4gIGNvbnN0IHJlY29yZCA9IGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG4gIGFzc2VydFJlY29yZChyZWNvcmQsICdkZWNvZGVkIHJlY29yZCcpO1xuICByZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkID0gKHRhZ2dlZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PlxuICBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSwgdGFnZ2VkLnBheWxvYWRdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJzonKTtcbiAgLyogU2tpcCB0aGUgXCI6XCIgaW5zaWRlIGBkZWNvZGVBcnJheWAgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICBjb25zdCB0YWdnZWRQYXlsb2FkID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdGFnZ2VkUGF5bG9hZC5sZW5ndGggPT09IDIgfHxcbiAgICBGYWlsYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IFt0YWcsIHBheWxvYWRdID0gdGFnZ2VkUGF5bG9hZDtcbiAgcGFzc1N0eWxlT2YodGFnKSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVSZW1vdGFibGUgPSAodW5zYWZlRW5jb2RlUmVtb3RhYmxlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSAociwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVJlbW90YWJsZShyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAncicpIHx8XG4gICAgICBGYWlsYFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1JlbW90YWJsZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVJlbW90YWJsZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVQcm9taXNlID0gKHVuc2FmZUVuY29kZVByb21pc2UsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSAocCwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVByb21pc2UocCwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJz8nKSB8fFxuICAgICAgRmFpbGBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnUHJvbWlzZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVByb21pc2U7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlRXJyb3IgPSAodW5zYWZlRW5jb2RlRXJyb3IsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gKGVyciwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZUVycm9yKGVyciwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJyEnKSB8fFxuICAgICAgRmFpbGBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ0Vycm9yJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlRXJyb3I7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZU9iamVjdCxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVFcnJvcl1cbiAqIEBwcm9wZXJ0eSB7J2xlZ2FjeU9yZGVyZWQnIHwgJ2NvbXBhY3RPcmRlcmVkJ30gW2Zvcm1hdF1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7KHN0cjogc3RyaW5nKSA9PiBzdHJpbmd9IGVuY29kZVN0cmluZ1N1ZmZpeFxuICogQHBhcmFtIHsoYXJyOiB1bmtub3duW10sIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZykgPT4gc3RyaW5nfSBlbmNvZGVBcnJheVxuICogQHBhcmFtIHtSZXF1aXJlZDxFbmNvZGVPcHRpb25zPiAmIHt2ZXJpZnlFbmNvZGluZz86IChlbmNvZGVkOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcpID0+IHZvaWR9fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IG1ha2VJbm5lckVuY29kZSA9IChlbmNvZGVTdHJpbmdTdWZmaXgsIGVuY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGU6IHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICBlbmNvZGVQcm9taXNlOiB1bnNhZmVFbmNvZGVQcm9taXNlLFxuICAgIGVuY29kZUVycm9yOiB1bnNhZmVFbmNvZGVFcnJvcixcbiAgICB2ZXJpZnlFbmNvZGluZyA9ICgpID0+IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gbWFrZUVuY29kZVJlbW90YWJsZShcbiAgICB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgdmVyaWZ5RW5jb2RpbmcsXG4gICk7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSBtYWtlRW5jb2RlUHJvbWlzZSh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZyk7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gbWFrZUVuY29kZUVycm9yKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZyk7XG5cbiAgY29uc3QgaW5uZXJFbmNvZGUgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4gICAgICAvKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuICAgICAgLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbiAgICAgIC8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuICAgICAgLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuICAgICAgLyoqL1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4gICAgICAvKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4gICAgICAvKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbiAgICAgIC8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbiAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOiB7XG4gICAgICAgIHJldHVybiAndic7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiAneic7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIHJldHVybiBgcyR7ZW5jb2RlU3RyaW5nU3VmZml4KHBhc3NhYmxlKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgcmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlbW90YWJsZShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVByb21pc2UocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgLyogU3RyaW5ncyBhbmQgc3ltYm9scyBzaGFyZSBlbmNvZGluZyBsb2dpYy4qL1xuICAgICAgICBjb25zdCBuYW1lID0gbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgIHJldHVybiBgeSR7ZW5jb2RlU3RyaW5nU3VmZml4KG5hbWUpfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQnl0ZUFycmF5KHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLCBlbmNvZGVBcnJheSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLCBlbmNvZGVBcnJheSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJFbmNvZGU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGVPYmplY3R9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnMgPSAvKiogQHR5cGUge1JlcXVpcmVkPERlY29kZU9wdGlvbnM+fSAqLyAoXG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHtcbiAgICBkZWNvZGVSZW1vdGFibGU6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZVByb21pc2U6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZUVycm9yOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgfSlcbik7XG5cbi8qKlxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9IGRlY29kZVN0cmluZ1N1ZmZpeFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nLCBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGUsIHNraXA/OiBudW1iZXIpID0+IHVua25vd25bXX0gZGVjb2RlQXJyYXlcbiAqIEBwYXJhbSB7UmVxdWlyZWQ8RGVjb2RlT3B0aW9ucz59IG9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nLCBza2lwPzogbnVtYmVyKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlID0gKGRlY29kZVN0cmluZ1N1ZmZpeCwgZGVjb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH0gPSBvcHRpb25zO1xuICAvKiogQHR5cGUgeyhlbmNvZGVkOiBzdHJpbmcsIHNraXA/OiBudW1iZXIpID0+IFBhc3NhYmxlfSAqL1xuICBjb25zdCBpbm5lckRlY29kZSA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICAgIHN3aXRjaCAoZW5jb2RlZC5jaGFyQXQoc2tpcCkpIHtcbiAgICAgIGNhc2UgJ3YnOiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY2FzZSAneic6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2YnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3MnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdiJzoge1xuICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpO1xuICAgICAgICBpZiAoc3Vic3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJpbmcgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gICAgICB9XG4gICAgICBjYXNlICduJzpcbiAgICAgIGNhc2UgJ3AnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3InOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZW1vdGFibGUoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICc/Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3knOiB7XG4gICAgICAgIC8qIFN0cmluZ3MgYW5kIHN5bWJvbHMgc2hhcmUgZGVjb2RpbmcgbG9naWMuKi9cbiAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZVN0cmluZ1N1ZmZpeChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpKTtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1snOlxuICAgICAgY2FzZSAnXic6IHtcbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUeXBlICd1bmtub3duW10nIGlzIG5vdCBQYXNzYWJsZSovXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICcoJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICc6Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJEZWNvZGU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhc3NhYmxlS2l0XG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8bWFrZUlubmVyRW5jb2RlPn0gZW5jb2RlUGFzc2FibGVcbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTxtYWtlSW5uZXJEZWNvZGU+fSBkZWNvZGVQYXNzYWJsZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zICYgRGVjb2RlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXR9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGFzc2FibGVLaXQgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGUgPSAociwgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyfWAsXG4gICAgZW5jb2RlUHJvbWlzZSA9IChwLCBfKSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwfWAsXG4gICAgZW5jb2RlRXJyb3IgPSAoZXJyLCBfKSA9PiBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWAsXG4gICAgZm9ybWF0ID0gJ2xlZ2FjeU9yZGVyZWQnLFxuXG4gICAgZGVjb2RlUmVtb3RhYmxlID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlUHJvbWlzZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgICBkZWNvZGVFcnJvciA9IChlbmNvZGluZywgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8qKiBAdHlwZSB7UGFzc2FibGVLaXRbJ2VuY29kZVBhc3NhYmxlJ119ICovXG4gIGxldCBlbmNvZGVQYXNzYWJsZTtcbiAgY29uc3QgZW5jb2RlT3B0aW9ucyA9IHsgZW5jb2RlUmVtb3RhYmxlLCBlbmNvZGVQcm9taXNlLCBlbmNvZGVFcnJvciwgZm9ybWF0IH07XG4gIGlmIChmb3JtYXQgPT09ICdjb21wYWN0T3JkZXJlZCcpIHtcbiAgICBjb25zdCBsaWJlcmFsRGVjb2RlID0gbWFrZUlubmVyRGVjb2RlKFxuICAgICAgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICAgIGRlY29kZUNvbXBhY3RBcnJheSxcbiAgICAgIGxpYmVyYWxEZWNvZGVycyxcbiAgICApO1xuICAgIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgY29uc3QgdmVyaWZ5RW5jb2RpbmcgPSAoZW5jb2RpbmcsIGxhYmVsKSA9PiB7XG4gICAgICAhZW5jb2RpbmcubWF0Y2gockMwKSB8fFxuICAgICAgICBGYWlsYCR7YihcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgKX0gZW5jb2RpbmcgbXVzdCBub3QgY29udGFpbiBhIEMwIGNvbnRyb2wgY2hhcmFjdGVyOiAke2VuY29kaW5nfWA7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlQ29tcGFjdEFycmF5KGBediAke2VuY29kaW5nfSB2IGAsIGxpYmVyYWxEZWNvZGUpO1xuICAgICAgKGlzQXJyYXkoZGVjb2RlZCkgJiZcbiAgICAgICAgZGVjb2RlZC5sZW5ndGggPT09IDMgJiZcbiAgICAgICAgZGVjb2RlZFswXSA9PT0gbnVsbCAmJlxuICAgICAgICBkZWNvZGVkWzJdID09PSBudWxsKSB8fFxuICAgICAgICBGYWlsYCR7YihsYWJlbCl9IGVuY29kaW5nIG11c3QgYmUgZW1iZWRkYWJsZTogJHtlbmNvZGluZ31gO1xuICAgIH07XG4gICAgY29uc3QgZW5jb2RlQ29tcGFjdCA9IG1ha2VJbm5lckVuY29kZShcbiAgICAgIGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBlbmNvZGVDb21wYWN0QXJyYXksXG4gICAgICB7IC4uLmVuY29kZU9wdGlvbnMsIHZlcmlmeUVuY29kaW5nIH0sXG4gICAgKTtcbiAgICBlbmNvZGVQYXNzYWJsZSA9IHBhc3NhYmxlID0+IGB+JHtlbmNvZGVDb21wYWN0KHBhc3NhYmxlKX1gO1xuICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2xlZ2FjeU9yZGVyZWQnKSB7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgICBlbmNvZGVMZWdhY3lBcnJheSxcbiAgICAgIGVuY29kZU9wdGlvbnMsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBmb3JtYXQ6ICR7cShmb3JtYXQpfWA7XG4gIH1cblxuICBjb25zdCBkZWNvZGVPcHRpb25zID0geyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH07XG4gIGNvbnN0IGRlY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlTGVnYWN5ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbiAgICBkZWNvZGVMZWdhY3lBcnJheSxcbiAgICBkZWNvZGVPcHRpb25zLFxuICApO1xuICBjb25zdCBkZWNvZGVQYXNzYWJsZSA9IGVuY29kZWQgPT4ge1xuICAgIC8qIEEgbGVhZGluZyBcIn5cIiBpbmRpY2F0ZXMgdGhlIHYyIGVuY29kaW5nICh3aXRoIGVzY2FwaW5nIGluIHN0cmluZ3MgcmF0aGVyIHRoYW4gYXJyYXlzKS4qL1xuICAgIC8qIFNraXAgaXQgaW5zaWRlIGBkZWNvZGVDb21wYWN0YCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4gICAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgICBpZiAoZW5jb2RlZC5jaGFyQXQoMCkgPT09ICd+Jykge1xuICAgICAgcmV0dXJuIGRlY29kZUNvbXBhY3QoZW5jb2RlZCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IGVuY29kZVBhc3NhYmxlLCBkZWNvZGVQYXNzYWJsZSB9KTtcbn07JGjNj19vbmNlLm1ha2VQYXNzYWJsZUtpdChtYWtlUGFzc2FibGVLaXQpO1xuaGFyZGVuKG1ha2VQYXNzYWJsZUtpdCk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXNzYWJsZUtpdFsnZW5jb2RlUGFzc2FibGUnXX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVQYXNzYWJsZSA9IGVuY29kZU9wdGlvbnMgPT4ge1xuICBjb25zdCB7IGVuY29kZVBhc3NhYmxlIH0gPSBtYWtlUGFzc2FibGVLaXQoZW5jb2RlT3B0aW9ucyk7XG4gIHJldHVybiBlbmNvZGVQYXNzYWJsZTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXNzYWJsZUtpdFsnZGVjb2RlUGFzc2FibGUnXX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVQYXNzYWJsZSA9IGRlY29kZU9wdGlvbnMgPT4ge1xuICBjb25zdCB7IGRlY29kZVBhc3NhYmxlIH0gPSBtYWtlUGFzc2FibGVLaXQoZGVjb2RlT3B0aW9ucyk7XG4gIHJldHVybiBkZWNvZGVQYXNzYWJsZTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbiAgICAgICBjb25zdCBpc0VuY29kZWRSZW1vdGFibGUgPSBlbmNvZGVkID0+IGVuY29kZWQuY2hhckF0KDApID09PSAncic7JGjNj19vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3by1jaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4IChgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiKSwgYW5kIGNvcHlBcnJheSBpcyBhIHR3by1jaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2Ugb25lIGVuY29kaW5nXG4gKiBwcmVmaXhlcyBhcnJheXMgd2l0aCBgW2Agd2hpbGUgdGhlIG90aGVyIHVzZXMgYF5gICh3aGljaCBpcyBwcm9oaWJpdGVkIGZyb21cbiAqIGFwcGVhcmluZyBpbiBhbiBlbmNvZGVkIHN0cmluZykuXG4gKiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlIHJhbmtPcmRlcmluZyBvZiB0aGVpclxuICogcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLCBhbmQgcmFua09yZGVyLmpzIGltcG9ydHMgdGhlIHRhYmxlIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG4gICAgICAgY29uc3QgcGFzc1N0eWxlUHJlZml4ZXMgPSB7XG4gIGVycm9yOiAnIScsXG4gIGNvcHlSZWNvcmQ6ICcoJyxcbiAgdGFnZ2VkOiAnOicsXG4gIHByb21pc2U6ICc/JyxcbiAgY29weUFycmF5OiAnW14nLFxuICBieXRlQXJyYXk6ICdhJyxcbiAgYm9vbGVhbjogJ2InLFxuICBudW1iZXI6ICdmJyxcbiAgYmlnaW50OiAnbnAnLFxuICByZW1vdGFibGU6ICdyJyxcbiAgc3RyaW5nOiAncycsXG4gIG51bGw6ICd2JyxcbiAgc3ltYm9sOiAneScsXG4gIC8qIEJlY2F1c2UgQXJyYXkucHJvdG90eXBlLnNvcnQgcHV0cyB1bmRlZmluZWQgdmFsdWVzIGF0IHRoZSBlbmQgd2l0aG91dCovXG4gIC8qIHBhc3NpbmcgdGhlbSB0byBhIGNvbXBhcmlzb24gZnVuY3Rpb24sIHVuZGVmaW5lZCBNVVNUIGJlIHRoZSBsYXN0Ki9cbiAgLyogY2F0ZWdvcnkuKi9cbiAgdW5kZWZpbmVkOiAneicsXG59OyRozY9fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VQYXNzYWJsZUtpdCI6WyJtYWtlUGFzc2FibGVLaXQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1cJzuhdEAAAXRAAAKwAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzUHJpbWl0aXZlLGdldFRhZyxhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc2FibGUsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cbi8qKiBAaW1wb3J0IHtFbmNvZGluZywgRW5jb2RpbmdVbmlvbn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgZGVmaW5lUHJvcGVydGllcyxcbiAgaXMsXG4gIGVudHJpZXMsXG4gIGZyb21FbnRyaWVzLFxuICBmcmVlemUsXG4gIGhhc093bixcbn0gPSBPYmplY3Q7XG5cbi8qKlxuICogU3BlY2lhbCBwcm9wZXJ0eSBuYW1lIHRoYXQgaW5kaWNhdGVzIGFuIGVuY29kaW5nIHRoYXQgbmVlZHMgc3BlY2lhbFxuICogZGVjb2RpbmcuXG4gKi9cbmNvbnN0IFFDTEFTUyA9ICdAcWNsYXNzJzskaM2PX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nICYgb2JqZWN0fSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3MgPSBlbmNvZGVkID0+IGhhc093bihlbmNvZGVkLCBRQ0xBU1MpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxY2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzID0gKGVuY29kZWQsIHFjbGFzcykgPT5cbiAgIWlzUHJpbWl0aXZlKGVuY29kZWQpICYmXG4gICFpc0FycmF5KGVuY29kZWQpICYmXG4gIGhhc1FDbGFzcyhlbmNvZGVkKSAmJlxuICBlbmNvZGVkW1FDTEFTU10gPT09IHFjbGFzcztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGVPYmplY3QsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IHJlbSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IHByb20gPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEgPSBlcnIgPT4gRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVRvQ2FwRGF0YSA9IChlbmNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuICAgIGVuY29kZUVycm9yVG9DYXBEYXRhID0gZG9udEVuY29kZUVycm9yVG9DYXBEYXRhLFxuICB9ID0gZW5jb2RlT3B0aW9ucztcblxuICAvKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHthbnl9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGFSZWN1ciA9IHBhc3NhYmxlID0+IHtcbiAgICAvKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbiAgICAvKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAndW5kZWZpbmVkJyB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdOYU4nIH07XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdJbmZpbml0eScgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICctSW5maW5pdHknIH07XG4gICAgICAgIH1cbiAgICAgICAgLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xuICAgICAgICByZXR1cm4gaXMocGFzc2FibGUsIC0wKSA/IDAgOiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ2JpZ2ludCcsXG4gICAgICAgICAgZGlnaXRzOiBTdHJpbmcocGFzc2FibGUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAnc3ltYm9sJyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGhhc093bihwYXNzYWJsZSwgUUNMQVNTKSkge1xuICAgICAgICAgIC8qIEhpbGJlcnQgaG90ZWwqL1xuICAgICAgICAgIGNvbnN0IHsgW1FDTEFTU106IHFjbGFzc1ZhbHVlLCAuLi5yZXN0IH0gPSBwYXNzYWJsZTtcbiAgICAgICAgICAvKiogQHR5cGUge0VuY29kaW5nfSAqL1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIFtRQ0xBU1NdOiAnaGlsYmVydCcsXG4gICAgICAgICAgICBvcmlnaW5hbDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKG93bktleXMocmVzdCkubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIC8qIFdlIGhhcmRlbiB0aGUgZW50aXJlIGNhcERhdGEgZW5jb2RpbmcgYmVmb3JlIHdlIHJldHVybiBpdC4qL1xuICAgICAgICAgICAgLyogYGVuY29kZVRvQ2FwRGF0YWAgcmVxdWlyZXMgdGhhdCBpdHMgaW5wdXQgYmUgUGFzc2FibGUsIGFuZCovXG4gICAgICAgICAgICAvKiB0aGVyZWZvcmUgaGFyZGVuZWQuKi9cbiAgICAgICAgICAgIC8qIFRoZSBgZnJlZXplYCBoZXJlIGlzIG5lZWRlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGByZXN0YCBpcyovXG4gICAgICAgICAgICAvKiBmcmVzaGx5IGNvbnN0cnVjdGVkIGJ5IHRoZSBgLi4uYCBhYm92ZSwgYW5kIHdlJ3JlIHVzaW5nIGl0Ki9cbiAgICAgICAgICAgIC8qIGFzIGltcHV0IGluIGFub3RoZXIgY2FsbCB0byBgZW5jb2RlVG9DYXBEYXRhYC4qL1xuICAgICAgICAgICAgcmVzdWx0LnJlc3QgPSBlbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4gICAgICAgIC8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4gICAgICAgIC8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG4gICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoXG4gICAgICAgICAgbmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLyogVE9ETyBpbXBsZW1lbnQqL1xuICAgICAgICB0aHJvdyBGYWlsYG1hcnNhbCBvZiBieXRlQXJyYXkgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAndGFnZ2VkJyxcbiAgICAgICAgICB0YWc6IGdldFRhZyhwYXNzYWJsZSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9DYXBEYXRhUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICAvKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICl9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICAgJ3Nsb3QnLFxuICAgICAgICApfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdlcnJvcicpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YSA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbiAgICAgIC8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4gICAgICAvKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuICAgICAgLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4gICAgICAvKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4gICAgICAvKiovXG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbiAgICAgIC8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbiAgICAgIC8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuICAgICAgLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuICAgICAgcmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlT2JqZWN0KX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlT2JqZWN0KX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gc2xvdEVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhID0gZXJyb3JFbmNvZGluZyA9PlxuICBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhLFxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9PT0gZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIHx8XG4gICAgRmFpbGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEsXG4gICAgKX0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuICAvKipcbiAqIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbWF5IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBganNvbkVuY29kZWRgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb0NhcERhdGFgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21DYXBEYXRhYCBjYW5ub3QgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21DYXBEYXRhYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGpzb25FbmNvZGVkIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuICBjb25zdCBkZWNvZGVGcm9tQ2FwRGF0YSA9IGpzb25FbmNvZGVkID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUoanNvbkVuY29kZWQpKSB7XG4gICAgICAvKiBwcmltaXRpdmVzIHBhc3MgdGhyb3VnaCovXG4gICAgICByZXR1cm4ganNvbkVuY29kZWQ7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KGpzb25FbmNvZGVkKSkge1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkLm1hcChlbmNvZGVkVmFsID0+IGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiAgICB9IGVsc2UgaWYgKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IGpzb25FbmNvZGVkW1FDTEFTU107XG4gICAgICB0eXBlb2YgcWNsYXNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYGludmFsaWQgJHtxKFFDTEFTUyl9IHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbiAgICAgIHN3aXRjaCAocWNsYXNzKSB7XG4gICAgICAgIC8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ05hTic6IHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0luZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICctSW5maW5pdHknOiB7XG4gICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHR5cGVvZiBkaWdpdHMgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbiAgICAgICAgICByZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIC8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuICAgICAgICAgIC8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4gICAgICAgICAgLyogdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzdXBwb3J0ZWQgc2VuZGVycy4qL1xuICAgICAgICAgIC8qKi9cbiAgICAgICAgICByZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHJldHVybiBtYWtlVGFnZ2VkKHRhZywgZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgLyogU2VlIG5vdGUgYWJvdmUgYWJvdXQgaG93IHRoZSBjdXJyZW50IGVuY29kaW5nIGNhbm5vdCByZWxpYWJseSovXG4gICAgICAgICAgLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbiAgICAgICAgICAvKiBib3RoIG11c3QgYmUgdGhlIHNhbWUgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHdlIGNhbGwuKi9cbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLyogQkVXQVJFOiBjYXBkYXRhIGRvZXMgbm90IGNoZWNrIHRoYXQgYGRlY29kZWRgIGlzKi9cbiAgICAgICAgICAvKiBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUsIHNpbmNlIHRoYXQgd291bGQgYnJlYWsgc29tZSovXG4gICAgICAgICAgLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuICAgICAgICAgIC8qIHdpbGwgbmVlZCB0byB1cGRhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzbWFsbGNhcHMuKi9cbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlT2YoZGVjb2RlZCkgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICBoYXNPd24oanNvbkVuY29kZWQsICdvcmlnaW5hbCcpIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4gICAgICAgICAgLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IFtRQ0xBU1NdOiBkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCkgfTtcbiAgICAgICAgICBpZiAoaGFzT3duKGpzb25FbmNvZGVkLCAncmVzdCcpKSB7XG4gICAgICAgICAgICBjb25zdCBpc05vbkVtcHR5T2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIHJlc3QgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgIHJlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMTtcbiAgICAgICAgICAgIGlmICghaXNOb25FbXB0eU9iamVjdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdE9iaiA9IGRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuICAgICAgICAgICAgLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuICAgICAgICAgICAgLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4gICAgICAgICAgICAvKiBlYXJseSB0byBkbyB0aGF0LiovXG4gICAgICAgICAgICAhaGFzT3duKHJlc3RPYmosIFFDTEFTUykgfHxcbiAgICAgICAgICAgICAgRmFpbGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIHRoZSBlcnJvciBjYXNlIHdlJ3JlIHRlc3RpbmcgZm9yKi9cbiAgICAgICAgY2FzZSAnaWJpZCc6IHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxuICAgICAgICAgICAgcWNsYXNzLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydCh0eXBlb2YganNvbkVuY29kZWQgPT09ICdvYmplY3QnICYmIGpzb25FbmNvZGVkICE9PSBudWxsKTtcbiAgICAgIGNvbnN0IGRlY29kZUVudHJ5ID0gKFtuYW1lLCBlbmNvZGVkVmFsXSkgPT4ge1xuICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgIHJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAANU1+O9EUAAPRFAAAtAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsZ2V0VGFnLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc2FibGUsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cbi8qIEZJWE1FIGRlZmluZSBhY3R1YWwgdHlwZXMqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBpcywgZW50cmllcywgZnJvbUVudHJpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuXG5jb25zdCBCQU5HID0gJyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIID0gJy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qKlxuICogQW4gYGVuY29kZVRvU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhIHBhc3NhYmxlIGFuZCByZXR1cm5zIGFcbiAqIEpTT04tcmVwcmVzZW50YWJsZSBvYmplY3QgKGkuZS4sIHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2hcbiAqIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlcGxhY2VycyBvciByZXZpdmVyc1xuICogcmV0dXJucyBhbiBlcXVpdmFsZW50IHN0cnVjdHVyZSBleGNlcHQgZm9yIG9iamVjdCBpZGVudGl0eSkuXG4gKiBXZSBjYWxsIHRoaXMgcmVwcmVzZW50YXRpb24gYSBTbWFsbGNhcHMgRW5jb2RpbmcuXG4gKlxuICogQSBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnQgd2hhdCBpdFxuICogKmFzc3VtZXMqIGlzIHRoZSByZXN1bHQgb2YgYSBwbGFpbiBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXNvbHZlci4gSXQgdGhlblxuICogbXVzdCB2YWxpZGF0ZSB0aGF0IGl0IGlzIGEgdmFsaWQgU21hbGxjYXBzIEVuY29kaW5nLCBhbmQgaWYgaXQgaXMsXG4gKiByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHBhc3NhYmxlLlxuICpcbiAqIFNtYWxsY2FwcyBjb25zaWRlcnMgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBgIWAgKGFzY2lpIGNvZGUgMzMsIEJBTkcpXG4gKiBhbmQgYC1gIChhc2NpaSBjb2RlIDQ1LCBEQVNIKSB0byBiZSBzcGVjaWFsIHByZWZpeGVzIGFsbG93aW5nXG4gKiByZXByZXNlbnRhdGlvbiBvZiBKU09OLWluY29tcGF0aWJsZSBkYXRhIHVzaW5nIHN0cmluZ3MuXG4gKiBUaGVzZSBjaGFyYWN0ZXJzLCBpbiBvcmRlciwgYXJlIGAhXCIjJCUmJygpKissLWBcbiAqIE9mIHRoZXNlLCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgKiBgIWAgLSBlc2NhcGVkIHN0cmluZ1xuICogICogYCtgIC0gbm9uLW5lZ2F0aXZlIGJpZ2ludFxuICogICogYC1gIC0gbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgI2AgLSBtYW5pZmVzdCBjb25zdGFudFxuICogICogYCVgIC0gc3ltYm9sXG4gKiAgKiBgJGAgLSByZW1vdGFibGVcbiAqICAqIGAmYCAtIHByb21pc2VcbiAqXG4gKiBBbGwgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIChgXCInKCkqLGApIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgY29uc3RhbnRzIHRoYXQgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIGZvciB2YWx1ZXM6XG4gKiAgKiBgI3VuZGVmaW5lZGBcbiAqICAqIGAjTmFOYFxuICogICogYCNJbmZpbml0eWBcbiAqICAqIGAjLUluZmluaXR5YFxuICpcbiAqIGFuZCBmb3IgcHJvcGVydHkgbmFtZXMgYW5hbG9nb3VzIHRvIGNhcGRhdGEgQHFjbGFzczpcbiAqICAqIGAjdGFnYFxuICogICogYCNlcnJvcmBcbiAqXG4gKiBBbGwgb3RoZXIgZW5jb2RlZCBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGAjYCBhcmUgcmVzZXJ2ZWQgZm9yXG4gKiBmdXR1cmUgdXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkU3RyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbCA9IGVuY29kZWRTdHIgPT4ge1xuICBpZiAoZW5jb2RlZFN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyogY2hhckNvZGVBdCgwKSBhbmQgbnVtYmVyIGNvbXBhcmUgaXMgYSBiaXQgZmFzdGVyLiovXG4gIGNvbnN0IGNvZGUgPSBlbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB5b2RhKi9cbiAgcmV0dXJuIEJBTkcgPD0gY29kZSAmJiBjb2RlIDw9IERBU0g7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlT2JqZWN0LFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IHJlbSA9PlxuICBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZXJyID0+XG4gIEZhaWxgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogZW5jb2RlT3B0aW9ucyBpcyBhY3R1YWxseSBvcHRpb25hbCwgYnV0IG5vdCBtYXJrZWQgYXMgc3VjaCB0byB3b3JrIGFyb3VuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDI4NlxuICpcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ31cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9IChlbmNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG4gICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzLFxuICB9ID0gZW5jb2RlT3B0aW9ucztcblxuICBjb25zdCBhc3NlcnRFbmNvZGVkRXJyb3IgPSBlbmNvZGluZyA9PiB7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ29iamVjdCcgJiYgaGFzT3duKGVuY29kaW5nLCAnI2Vycm9yJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxuICAgICAgICBlbmNvZGluZyxcbiAgICAgICl9YDtcbiAgICAvKiBBc3NlcnQgdGhhdCB0aGUgI2Vycm9yIHByb3BlcnR5IGRlY29kZXMgdG8gYSBzdHJpbmcuKi9cbiAgICBjb25zdCBtZXNzYWdlID0gZW5jb2RpbmdbJyNlcnJvciddO1xuICAgICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICghc3RhcnRzU3BlY2lhbChtZXNzYWdlKSB8fCBtZXNzYWdlLmNoYXJBdCgwKSA9PT0gJyEnKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gIH07XG5cbiAgLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4gICAgLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmIChzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSkge1xuICAgICAgICAgIC8qIFN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGEgc3BlY2lhbCBjaGFyIGFyZSBxdW90ZWQgd2l0aCBgIWAuKi9cbiAgICAgICAgICAvKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuICAgICAgICAgIC8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4gICAgICAgICAgLyogYSBjb250aW51b3VzIHN1YnJhbmdlIG9mIGFzY2lpLCB0aGlzIHF1b3RpbmcgaXMgc29ydC1vcmRlciovXG4gICAgICAgICAgLyogcHJlc2VydmluZy4qL1xuICAgICAgICAgIHJldHVybiBgISR7cGFzc2FibGV9YDtcbiAgICAgICAgfVxuICAgICAgICAvKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuICcjdW5kZWZpbmVkJztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiAnI05hTic7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjSW5maW5pdHknO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyMtSW5maW5pdHknO1xuICAgICAgICB9XG4gICAgICAgIC8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbiAgICAgICAgcmV0dXJuIGlzKHBhc3NhYmxlLCAtMCkgPyAwIDogcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhwYXNzYWJsZSk7XG4gICAgICAgIHJldHVybiAvKiogQHR5cGUge2JpZ2ludH0gKi8gKHBhc3NhYmxlKSA8IDBuID8gc3RyIDogYCske3N0cn1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICByZXR1cm4gYCUke25hbWV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4gICAgICAgIC8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4gICAgICAgIC8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG4gICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoXG4gICAgICAgICAgbmFtZXMubWFwKG5hbWUgPT4gW1xuICAgICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgICAvKiBUT0RPIGltcGxlbWVudCovXG4gICAgICAgIHRocm93IEZhaWxgbWFyc2FsIG9mIGJ5dGVBcnJheSBub3QgeWV0IGltcGxlbWVudGVkOiAke3Bhc3NhYmxlfWA7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJyN0YWcnOiBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKGdldFRhZyhwYXNzYWJsZSkpLFxuICAgICAgICAgIHBheWxvYWQ6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyAmJiByZXN1bHQuY2hhckF0KDApID09PSAnJCcpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyYnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbiAgICAgIC8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4gICAgICAvKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuICAgICAgLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4gICAgICAvKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4gICAgICAvKiovXG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbiAgICAgIC8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbiAgICAgIC8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuICAgICAgLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSxcbiAgICAgICk7XG4gICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlT2JqZWN0fSBbZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbVNtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gKGRlY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgIGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHMsXG4gIH0gPSBkZWNvZGVPcHRpb25zO1xuXG4gIC8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbiAgY29uc3QgZGVjb2RlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+IHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBlbmNvZGluZykge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgaWYgKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjID0gZW5jb2RpbmcuY2hhckF0KDApO1xuICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICBjYXNlICchJzoge1xuICAgICAgICAgICAgLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG4gICAgICAgICAgICByZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyUnOiB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnIyc6IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgY2FzZSAnI3VuZGVmaW5lZCc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyNOYU4nOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjSW5maW5pdHknOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyMtSW5maW5pdHknOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICAgICAgICBYYHVua25vd24gY29uc3RhbnQgXCIke3EoZW5jb2RpbmcpfVwiYCxcbiAgICAgICAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgIGNhc2UgJy0nOiB7XG4gICAgICAgICAgICByZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8qIEB0cy1pZ25vcmUgWFhYIFNtYWxsQ2Fwc0VuY29kaW5nKi9cbiAgICAgICAgICAgIGlmIChwYXNzU3R5bGVPZihyZXN1bHQpICE9PSAncmVtb3RhYmxlJykge1xuICAgICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyYnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdwcm9taXNlJykge1xuICAgICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBTcGVjaWFsIGNoYXIgJHtxKFxuICAgICAgICAgICAgICBjLFxuICAgICAgICAgICAgKX0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXJyYXkoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nLm1hcCh2YWwgPT4gZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd24oZW5jb2RpbmcsICcjdGFnJykpIHtcbiAgICAgICAgICBjb25zdCB7ICcjdGFnJzogdGFnLCBwYXlsb2FkLCAuLi5yZXN0IH0gPSBlbmNvZGluZztcbiAgICAgICAgICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQoXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duKGVuY29kaW5nLCAnI2Vycm9yJykpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXN1bHQpID09PSAnZXJyb3InIHx8XG4gICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbZW5jb2RlZE5hbWUsIGVuY29kZWRWYWxdKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIGVuY29kZWROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBQcm9wZXJ0eSBuYW1lICR7cShcbiAgICAgICAgICAgICAgZW5jb2RlZE5hbWUsXG4gICAgICAgICAgICApfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICBlbmNvZGVkTmFtZS5jaGFyQXQoMCkgIT09ICcjJyB8fFxuICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG4gICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZGVjb2RlZEVudHJpZXMgPSBlbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxuICAgICAgICAgICAgdHlwZW9mIGVuY29kaW5nLFxuICAgICAgICAgICl9OiAke2VuY29kaW5nfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQnQV6b5CAAC+QgAAKgAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iLCJxcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsWCxGYWlsLE5hdCxnZXRFcnJvckNvbnN0cnVjdG9yLGlzUHJpbWl0aXZlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsUUNMQVNTLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLFskaM2PX2EgPT4gKFFDTEFTUyA9ICRozY9fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1N0cmluZ2FibGVQYXlsb2FkfSBmcm9tICdzZXMnO1xuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IHN0cmluZ2lmeTogcXVvdGUgfSA9IEpTT047XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyID0gKCkgPT4ge1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIGxldCBsZXZlbCA9IDA7XG4gIGxldCBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgY29uc3QgbGluZSA9ICgpID0+IHtcbiAgICBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgICByZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCAnICAnLnJlcGVhdChsZXZlbCkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBvcGVuOiBvcGVuQnJhY2tldCA9PiB7XG4gICAgICBsZXZlbCArPSAxO1xuICAgICAgaWYgKG5lZWRTcGFjZSkge1xuICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgIH1cbiAgICAgIG5lZWRTcGFjZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gICAgfSxcbiAgICBsaW5lLFxuICAgIG5leHQ6IHRva2VuID0+IHtcbiAgICAgIGlmIChuZWVkU3BhY2UgJiYgdG9rZW4gIT09ICcsJyAmJiB0b2tlbiAhPT0gJyknKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgfVxuICAgICAgbmVlZFNwYWNlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuICAgIH0sXG4gICAgY2xvc2U6IGNsb3NlQnJhY2tldCA9PiB7XG4gICAgICBhc3NlcnQobGV2ZWwgPj0gMSk7XG4gICAgICBsZXZlbCAtPSAxO1xuICAgICAgbGluZSgpO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuICAgIH0sXG4gICAgZG9uZTogKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGxldmVsLCAwKTtcbiAgICAgIHJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybiA9IC9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLyoqXG4gKiBNaW5pbXVtIHdoaXRlc3BhY2UgbmVlZGVkIHRvIHByZXNldmUgbWVhbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyID0gKCkgPT4ge1xuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG4gICAgbGluZTogKCkgPT4gc3RyaW5ncy5sZW5ndGgsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS0gZXJyb3IqL1xuICAgICAgICBpZiAobGFzdC5sZW5ndGggPj0gMSAmJiB0b2tlbi5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIGNvbnN0IHBhaXIgPSBgJHtsYXN0W2xhc3QubGVuZ3RoIC0gMV19JHt0b2tlblswXX1gO1xuICAgICAgICAgIGlmIChiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKSB7XG4gICAgICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuICAgIH0sXG4gICAgY2xvc2U6IGNsb3NlQnJhY2tldCA9PiB7XG4gICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPj0gMSAmJiBzdHJpbmdzW3N0cmluZ3MubGVuZ3RoIC0gMV0gPT09ICcsJykge1xuICAgICAgICBzdHJpbmdzLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuICAgIH0sXG4gICAgZG9uZTogKCkgPT4gc3RyaW5ncy5qb2luKCcnKSxcbiAgfSk7XG59O1xuXG5jb25zdCBpZGVudFBhdHRlcm4gPSAvXlthLXpBLVpdXFx3KiQvO1xuaGFyZGVuKGlkZW50UGF0dGVybik7XG5jb25zdCBBdEF0UHJlZml4UGF0dGVybiA9IC9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGRJbmRlbnRcbiAqIEBwYXJhbSB7YW55W119IFtzbG90c11cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluID0gKGVuY29kaW5nLCBzaG91bGRJbmRlbnQgPSBmYWxzZSwgc2xvdHMgPSBbXSkgPT4ge1xuICAvKipcbiAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgc29tZSBpbnB1dCB2YWxpZGF0aW9uLlxuICogSXRzIGNvbnRyb2wgZmxvdyBzaG91bGQgbWlycm9yIGByZWN1cmAgYXMgY2xvc2VseSBhcyBwb3NzaWJsZVxuICogYW5kIHRoZSB0d28gc2hvdWxkIGJlIG1haW50YWluZWQgdG9nZXRoZXIuIFRoZXkgbXVzdCB2aXNpdCBldmVyeXRoaW5nXG4gKiBpbiB0aGUgc2FtZSBvcmRlci5cbiAqXG4gKiBUT0RPIG5vdyB0aGF0IGliaWRzIGFyZSBnb25lLCB3ZSBzaG91bGQgZm9sZCB0aGlzIGJhY2sgdG9nZXRoZXIgaW50b1xuICogb25lIHZhbGlkYXRpbmcgcGFzcy5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICBjb25zdCBwcmVwYXJlID0gcmF3VHJlZSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHJhd1RyZWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuICAgIGFzc2VydC50eXBlb2YocmF3VHJlZSwgJ29iamVjdCcpO1xuICAgIGFzc2VydChyYXdUcmVlICE9PSBudWxsKTtcbiAgICBpZiAoUUNMQVNTIGluIHJhd1RyZWUpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IHJhd1RyZWVbUUNMQVNTXTtcbiAgICAgIHR5cGVvZiBxY2xhc3MgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIEZhaWxgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHRhZywgJ3N0cmluZycpO1xuICAgICAgICAgIHByZXBhcmUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgY29uc3QgeyBpbmRleCwgaWZhY2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICAgIE5hdChpbmRleCk7XG4gICAgICAgICAgaWYgKGlmYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YoaWZhY2UsICdzdHJpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICAnb3JpZ2luYWwnIGluIHJhd1RyZWUgfHxcbiAgICAgICAgICAgIEZhaWxgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xuICAgICAgICAgIHByZXBhcmUob3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FycmF5KHJlc3QpKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChRQ0xBU1MgaW4gcmVzdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgcHJlcGFyZShyZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGFzc2VydC5mYWlsKFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgcHJlcGFyZShyYXdUcmVlW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJhd1RyZWUpO1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICB9XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VJbmRlbnRlciA9IHNob3VsZEluZGVudCA/IG1ha2VZZXNJbmRlbnRlciA6IG1ha2VOb0luZGVudGVyO1xuICBsZXQgb3V0ID0gbWFrZUluZGVudGVyKCk7XG5cbiAgLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgY29uc3QgZGVjb2RlID0gcmF3VHJlZSA9PiB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICByZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gIH07XG5cbiAgY29uc3QgZGVjb2RlUHJvcGVydHkgPSAobmFtZSwgdmFsdWUpID0+IHtcbiAgICBvdXQubGluZSgpO1xuICAgIGlmIChuYW1lID09PSAnX19wcm90b19fJykge1xuICAgICAgLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4gICAgICAvKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuICAgICAgLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuICAgICAgLyogSlNPTiBtZWFuaW5nLiovXG4gICAgICBvdXQubmV4dChgW1wiX19wcm90b19fXCJdOmApO1xuICAgIH0gZWxzZSBpZiAoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIG91dC5uZXh0KGAke25hbWV9OmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubmV4dChgJHtxdW90ZShuYW1lKX06YCk7XG4gICAgfVxuICAgIGRlY29kZSh2YWx1ZSk7XG4gICAgb3V0Lm5leHQoJywnKTtcbiAgfTtcblxuICAvKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gIGNvbnN0IHJlY3VyID0gcmF3VHJlZSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHJhd1RyZWUpKSB7XG4gICAgICAvKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xuICAgICAgcmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG4gICAgYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0KHJhd1RyZWUgIT09IG51bGwpO1xuICAgIGlmIChRQ0xBU1MgaW4gcmF3VHJlZSkge1xuICAgICAgY29uc3QgcWNsYXNzID0gcmF3VHJlZVtRQ0xBU1NdO1xuICAgICAgYXNzZXJ0LnR5cGVvZihxY2xhc3MsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICAvKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbiAgICAgIC8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4gICAgICAvKiBlYXJsaWVyLiovXG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICAvKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICAvKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihkaWdpdHMsICdzdHJpbmcnKTtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2woc3ltKTtcbiAgICAgICAgICBpZiAocmVnaXN0ZXJlZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgYXNzZXJ0KFN5bWJvbFtzdWZmaXhdID09PSBzeW0pO1xuICAgICAgICAgICAgYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgcGFzc2FibGVTeW1ib2xGb3JOYW1lKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgb3V0Lm5leHQoYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfWApO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgICAgZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBjb25zdCB7IGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG4gICAgICAgICAgY29uc3QgbmVzdGVkUmVuZGVyID0gYXJnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZE91dCA9IG91dDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIG91dCA9IG1ha2VOb0luZGVudGVyKCk7XG4gICAgICAgICAgICAgIGRlY29kZShhcmcpO1xuICAgICAgICAgICAgICByZXR1cm4gb3V0LmRvbmUoKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIG91dCA9IG9sZE91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpbmRleCA8IHNsb3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRTbG90ID0gbmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG4gICAgICAgICAgICByZXR1cm4gaWZhY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG91dC5uZXh0KGBzbG90VG9WYWwoJHtyZW5kZXJlZFNsb3R9KWApXG4gICAgICAgICAgICAgIDogb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3JlbmRlcmVkU2xvdH0sJHtuZXN0ZWRSZW5kZXIoaWZhY2UpfSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlmYWNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0pYClcbiAgICAgICAgICAgIDogb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0sJHtuZXN0ZWRSZW5kZXIoaWZhY2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KFFDTEFTUywgb3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihyZXN0LCAnb2JqZWN0Jyk7XG4gICAgICAgICAgICBhc3NlcnQocmVzdCAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICl9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgICAgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgY2F1c2UgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBlcnJvciBjYXVzZSBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICBuYW1lICE9PSBgQWdncmVnYXRlRXJyb3JgIHx8XG4gICAgICAgICAgICBGYWlsYEFnZ3JlZ2F0ZUVycm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIGVycm9ycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGVycm9ycyBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdbXScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ1snKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIG91dC5saW5lKCk7XG4gICAgICAgICAgZGVjb2RlKHJhd1RyZWVbaV0pO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnXScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiByYXdUcmVlIGlzIGFuIGBFbmNvZGluZ1JlY29yZGAgd2hpY2ggb25seSBoYXMgc3RyaW5nIGtleXMsKi9cbiAgICAgIC8qIGJ1dCBzaW5jZSBvd25LZXlzIGlzIG5vdCBnZW5lcmljLCBpdCBjYW4ndCBwcm9wYWdhdGUgdGhhdCovXG4gICAgICBjb25zdCBuYW1lcyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChvd25LZXlzKHJhd1RyZWUpKTtcbiAgICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCd7fScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ3snKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmF3VHJlZVtuYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcHJlcGFyZShlbmNvZGluZyk7XG4gIGRlY29kZShlbmNvZGluZyk7XG4gIHJldHVybiBvdXQuZG9uZSgpO1xufTskaM2PX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzaG91bGRJbmRlbnRdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVBc0p1c3RpbiA9IChwYXNzYWJsZSwgc2hvdWxkSW5kZW50ID0gdHJ1ZSkgPT4ge1xuICBsZXQgc2xvdENvdW50ID0gMDtcbiAgLyogVXNpbmcgcG9zdC1pbmNyZW1lbnQgYmVsb3cgb25seSBzbyB0aGF0IHRoZSBpbmRleGVzIHN0YXJ0IGF0IHplcm8qL1xuICAvKiBhbmQgdGhlIGBzbG90Q291bnRgIHZhcmlhYmxlIGNhbiBiZSBpbml0aWFsaXplZCB0byBgMGAgcmF0aGVyIHRoYW4qL1xuICAvKiBgLTFgLiovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG4gIGNvbnN0IGNvbnZlcnRWYWxUb1Nsb3QgPSB2YWwgPT4gYHMke3Nsb3RDb3VudCsrfWA7XG4gIGNvbnN0IHsgdG9DYXBEYXRhIH0gPSBtYWtlTWFyc2hhbChjb252ZXJ0VmFsVG9TbG90KTtcbiAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gdG9DYXBEYXRhKHBhc3NhYmxlKTtcbiAgY29uc3QgZW5jb2RlZCA9IEpTT04ucGFyc2UoYm9keSk7XG4gIHJldHVybiBkZWNvZGVUb0p1c3RpbihlbmNvZGVkLCBzaG91bGRJbmRlbnQsIHNsb3RzKTtcbn07JGjNj19vbmNlLnBhc3NhYmxlQXNKdXN0aW4ocGFzc2FibGVBc0p1c3Rpbik7XG5oYXJkZW4ocGFzc2FibGVBc0p1c3Rpbik7XG5cbi8qIFRoZSBleGFtcGxlIGJlbG93IGlzIHRoZSBgcGF0dDFgIHRlc3QgY2FzZSBmcm9tIGBxcC1vbi1wYXR0ZXJuLnRlc3QuanNgLiovXG4vKiBQbGVhc2UgY28tbWFpbnRhaW4gdGhlIGZvbGxvd2luZyBkb2MtY29tbWVudCBhbmQgdGhhdCB0ZXN0IG1vZHVsZS4qL1xuLyoqXG4gKiBgcXBgIGZvciBxdW90ZSBwYXNzYWJsZSBhcyBhIHF1YXNpLXF1b3RlZCBKdXN0aW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBCb3RoIGBxYCBmcm9tIGBAZW5kby9lcnJvcnNgIGFuZCB0aGlzIGBxcGAgZnJvbSBgQGVuZG8vbWFyc2hhbGAgY2FuXG4gKiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggYEZhaWxgLCBgWGAsIGV0YyBmcm9tIGBAZW5kby9lcnJvcnNgIHRvIG1hcmtcbiAqIGEgc3Vic3RpdHV0aW9uIHZhbHVlIHRvIGJlIGJvdGhcbiAqIC0gdmlzdWFsbHkgcXVvdGVkIGluIHNvbWUgdXNlZnVsIG1hbm5lclxuICogLSB1bnJlZGFjdGVkXG4gKlxuICogRGlmZmVyZW5jZXM6XG4gKiAtIGdpdmVuIGEgcGF0dGVybiBgTS5hbmQoTS5ndGUoLTEwMCksIE0ubHRlKDEwMCkpYCxcbiAqICAgYGBganNcbiAqICAgYCR7cShwYXR0KX1gXG4gKiAgIGBgYFxuICogICBwcm9kdWNlcyBgXCJbbWF0Y2g6YW5kXVwiYCwgd2hlcmVhc1xuICogICBgYGBqc1xuICogICBgJHtxcChwYXR0KX1gXG4gKiAgIGBgYFxuICogICBwcm9kdWNlcyBxdWFzaS1xdW90ZXMgSnVzdGluIG9mIHdoYXQgd291bGQgYmUgcGFzc2VkOlxuICogICBgYGBqc1xuICogICBgbWFrZVRhZ2dlZChcIm1hdGNoOmFuZFwiLCBbXG4gKiAgICAgbWFrZVRhZ2dlZChcIm1hdGNoOmd0ZVwiLCAtMTAwKSxcbiAqICAgICBtYWtlVGFnZ2VkKFwibWF0Y2g6bHRlXCIsIDEwMCksXG4gKiAgIF0pYFxuICogICBgYGBcbiAqIC0gYHFgIGlzIGxhenksIG1pbmltaXppbmcgdGhlIGNvc3QgZm9yIHVzaW5nIGl0IGluIGFuIGVycm9yIHRoYXQncyBuZXZlclxuICogICBsb2dnZWQuIFVuZm9ydHVuYXRlbHksIGR1ZSB0byBsYXllcmluZyBjb25zdHJhaW50cywgYHFwYCBpcyBub3RcbiAqICAgbGF6eSwgYWx3YXlzIHJlbmRlcmluZyB0byBxdWFzaS1xdW90ZWQgSnVzdGluIGltbWVkaWF0ZWx5LlxuICpcbiAqIFNpbmNlIEp1c3RpbiBpcyBhIHN1YnNldCBvZiBIYXJkZW5lZEpTLCBuZWl0aGVyIHRoZSBuYW1lIGBxcGAgbm9yIHRoZVxuICogcmVuZGVyZWQgZm9ybSBuZWVkIHRvIG1ha2UgY2xlYXIgdGhhdCB0aGUgcmVuZGVyZWQgZm9ybSBpcyBpbiBKdXN0aW4gcmF0aGVyXG4gKiB0aGFuIEhhcmRlbmVkSlMuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF5bG9hZFxuICogQHJldHVybnMge1N0cmluZ2FibGVQYXlsb2FkfVxuICovXG4gICAgICAgY29uc3QgcXAgPSBwYXlsb2FkID0+IGBcXGAke3Bhc3NhYmxlQXNKdXN0aW4oaGFyZGVuKHBheWxvYWQpLCB0cnVlKX1cXGBgOyRozY9fb25jZS5xcChxcCk7XG5oYXJkZW4ocXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXSwicGFzc2FibGVBc0p1c3RpbiI6WyJwYXNzYWJsZUFzSnVzdGluIl0sInFwIjpbInFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKtxgfihCQAAoQkAAC0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3QgPSB2YWwgPT5cbiAgRmFpbGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbCA9IChzbG90LCBfaWZhY2UpID0+XG4gIEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlciA9IGhhcmRlbih7XG4gIGdldDogKF90YXJnZXQsIG5hbWUsIF9yZWNlaXZlcikgPT4ge1xuICAgIGlmIChuYW1lID09PSAnbGVuZ3RoJykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbiAgICB0aHJvdyBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuICB9LFxufSk7XG5cbi8qKlxuICogYGZyZWV6ZWAgYnV0IG5vdCBgaGFyZGVuYCB0aGUgcHJveHkgdGFyZ2V0IHNvIGl0IHJlbWFpbnMgdHJhcHBpbmcuXG4gKiBUaHVzLCBpdCBzaG91bGQgbm90IGJlIHNoYXJlZCBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9kb2NzL3ByZXBhcmluZy1mb3Itc3RhYmlsaXplLm1kXG4gKi9cbmNvbnN0IGFycmF5VGFyZ2V0ID0gZnJlZXplKC8qKiBAdHlwZSB7YW55W119ICovIChbXSkpO1xuY29uc3QgYmFkQXJyYXkgPSBuZXcgUHJveHkoYXJyYXlUYXJnZXQsIGJhZEFycmF5SGFuZGxlcik7XG5cbmNvbnN0IHsgc2VyaWFsaXplLCB1bnNlcmlhbGl6ZSB9ID0gbWFrZU1hcnNoYWwoXG4gIGRvTm90Q29udmVydFZhbFRvU2xvdCxcbiAgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nOiAnb2ZmJyxcbiAgICAvKiBUT0RPIGZpeCB0ZXN0cyB0byB3b3JrcyB3aXRoIHNtYWxsY2Fwcy4qL1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdjYXBkYXRhJyxcbiAgfSxcbik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzdHJpbmdpZnkgPSB2YWwgPT4gc2VyaWFsaXplKHZhbCkuYm9keTskaM2PX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlID0gc3RyID0+XG4gIHVuc2VyaWFsaXplKFxuICAgIC8qIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgc2luY2UgdGhlIGBiYWRBcnJheWAgcHJveHkgYW5kIGl0cyB0YXJnZXQqL1xuICAgIC8qIG11c3QgcmVtYWluIHRyYXBwaW5nLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZCovXG4gICAgZnJlZXplKHtcbiAgICAgIGJvZHk6IHN0cixcbiAgICAgIHNsb3RzOiBiYWRBcnJheSxcbiAgICB9KSxcbiAgKTskaM2PX29uY2UucGFyc2UocGFyc2UpO1xuaGFyZGVuKHBhcnNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZViFtXw/AAB8PwAAIwAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsdG9QYXNzYWJsZUVycm9yLFgsRmFpbCxxLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLG9iamVjdE1hcCxRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZU9mXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1widG9QYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAodG9QYXNzYWJsZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLFskaM2PX2EgPT4gKFFDTEFTUyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRozY9fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvbnZlcnRTbG90VG9WYWwsIENvbnZlcnRWYWxUb1Nsb3QsIEZyb21DYXBEYXRhLCBNYWtlTWFyc2hhbE9wdGlvbnMsIFRvQ2FwRGF0YX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgUGFzc2FibGVDYXAsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0VuY29kaW5nfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnRpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm4gPSB4ID0+IHg7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbiA9ICh4LCBfKSA9PiB4O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTbG90XG4gKiBAcGFyYW0ge0NvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IFtjb252ZXJ0VmFsVG9TbG90XVxuICogQHBhcmFtIHtDb252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBbY29udmVydFNsb3RUb1ZhbF1cbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBvcHRpb25zXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFyc2hhbCA9IChcbiAgY29udmVydFZhbFRvU2xvdCA9IGRlZmF1bHRWYWxUb1Nsb3RGbixcbiAgY29udmVydFNsb3RUb1ZhbCA9IGRlZmF1bHRTbG90VG9WYWxGbixcbiAge1xuICAgIGVycm9yVGFnZ2luZyA9ICdvbicsXG4gICAgbWFyc2hhbE5hbWUgPSAnYW5vbi1tYXJzaGFsJyxcbiAgICAvKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG4gICAgZXJyb3JJZE51bSA9IDEwMDAwLFxuICAgIC8qIFdlIHByZWZlciB0aGF0IHRoZSBjYWxsZXIgaW5zdGVhZCBsb2cgdG8gc29tZXdoZXJlIGhpZGRlbiovXG4gICAgLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xuICAgIG1hcnNoYWxTYXZlRXJyb3IgPSBlcnIgPT5cbiAgICAgIGNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJywgZXJyKSxcbiAgICAvKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuICAgIC8qIFNvbWV0aW1lcywgb250b2dlbnkgZG9lcyByZWNhcGl0dWxhdGUgcGh5bG9nZW55IDspKi9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0ID0gJ2NhcGRhdGEnLFxuICB9ID0ge30sXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwgJ3N0cmluZycpO1xuICBlcnJvclRhZ2dpbmcgPT09ICdvbicgfHxcbiAgICBlcnJvclRhZ2dpbmcgPT09ICdvZmYnIHx8XG4gICAgRmFpbGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuICBjb25zdCBuZXh0RXJyb3JJZCA9ICgpID0+IHtcbiAgICBlcnJvcklkTnVtICs9IDE7XG4gICAgcmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiAgfTtcblxuICAvKipcbiAqIEB0eXBlIHtUb0NhcERhdGE8U2xvdD59XG4gKi9cbiAgY29uc3QgdG9DYXBEYXRhID0gcm9vdCA9PiB7XG4gICAgY29uc3Qgc2xvdHMgPSBbXTtcbiAgICAvKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuICAgIGNvbnN0IHNsb3RNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbiAgICBjb25zdCBlbmNvZGVTbG90Q29tbW9uID0gcGFzc2FibGUgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gc2xvdE1hcC5nZXQocGFzc2FibGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogVE9ETyBhc3NlcnQgdGhhdCBpdCdzIHRoZSBzYW1lIGlmYWNlIGFzIGJlZm9yZSovXG4gICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGluZGV4LCByZXBlYXQ6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ID0gc2xvdHMubGVuZ3RoO1xuICAgICAgY29uc3Qgc2xvdCA9IGNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuICAgICAgc2xvdHMucHVzaChzbG90KTtcbiAgICAgIHNsb3RNYXAuc2V0KHBhc3NhYmxlLCBpbmRleCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gdW5rbm93bn0gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fVxuICovXG4gICAgY29uc3QgZW5jb2RlRXJyb3JDb21tb24gPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVuY29kZVJlY3VyKGAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBuYW1lID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm5hbWV9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgIC8qIFRPRE8gTXVzdCBlbmNvZGUgYGNhdXNlYCwgYGVycm9yc2AsIGJ1dCovXG4gICAgICAvKiBvbmx5IG9uY2UgYWxsIHBvc3NpYmxlIGNvdW50ZXJwYXJ0eSBkZWNvZGVycyBhcmUgdG9sZXJhbnQgb2YqL1xuICAgICAgLyogcmVjZWl2aW5nIHRoZW0uKi9cbiAgICAgIGlmIChlcnJvclRhZ2dpbmcgPT09ICdvbicpIHtcbiAgICAgICAgLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4gICAgICAgIC8qIGJlIHVzZWZ1bCB0byBsb2cgdGhlIHN0YWNrIGxvY2FsbHkgc28gc29tZW9uZSB3aG8gaGFzKi9cbiAgICAgICAgLyogcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdGhlIHRocm93aW5nIFZhdCBjYW4gY29ycmVsYXRlKi9cbiAgICAgICAgLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4gICAgICAgIC8qIHN1bW1hcnkuIElmIHdlIGRvIHRoYXQsIHdlIGNvdWxkIGFsbG9jYXRlIHNvbWUgcmFuZG9tKi9cbiAgICAgICAgLyogaWRlbnRpZmllciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbWVzc2FnZSwgdG8gaGVscCovXG4gICAgICAgIC8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG4gICAgICAgIGNvbnN0IGVycm9ySWQgPSBlbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihlcnJvcklkLCAnc3RyaW5nJyk7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJyLCBYYFNlbnQgYXMgJHtlcnJvcklkfWApO1xuICAgICAgICBtYXJzaGFsU2F2ZUVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBlcnJvcklkLCBtZXNzYWdlLCBuYW1lIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzZXJpYWxpemVCb2R5Rm9ybWF0ID09PSAnY2FwZGF0YScpIHtcbiAgICAgIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZUNhcH0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG4gICAgICBjb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhID0gKHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ3Nsb3QnLCBpbmRleCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvKiogQHR5cGUgeyhwcm9taXNlOiBSZW1vdGFibGVPYmplY3QsIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nKSA9PiBFbmNvZGluZ30gKi9cbiAgICAgIGNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9ICh2YWwsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsIGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG4gICAgICAvKiogQHR5cGUgeyhwcm9taXNlOiBQcm9taXNlLCBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZykgPT4gRW5jb2Rpbmd9ICovXG4gICAgICBjb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gKHByb21pc2UsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuICAgICAgLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuICAgICAgY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ2Vycm9yJywgLi4uZXJyRGF0YSB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvQ2FwRGF0YSA9IG1ha2VFbmNvZGVUb0NhcERhdGEoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZUVycm9yVG9DYXBEYXRhLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb0NhcERhdGEocm9vdCk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdzbWFsbGNhcHMnKSB7XG4gICAgICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2FwcyA9IChwcmVmaXgsIHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIC8qIFRPRE8gZXhwbG9yZSByZW1vdmluZyB0aGlzIHNwZWNpYWwgY2FzZSovXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSAocmVtb3RhYmxlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcsIHJlbW90YWJsZSwgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicsIHByb21pc2UpO1xuXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyRGF0YSA9IGVuY29kZUVycm9yQ29tbW9uKGVyciwgZW5jb2RlUmVjdXIpO1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLnJlc3QgfSA9IGVyckRhdGE7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdCB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzID0gbWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbiAgICAgICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgLyogVmFsaWQgSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhIHZhbGlkIHNpZ25hbCovXG4gICAgICAgIC8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuICAgICAgICBib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGUgYHRocm93YCBpcyBhIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQWRkZWQgZm9yIGNvbmZ1c2VkIGxpbnRlcnMuKi9cbiAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlRnVsbFJldml2ZSA9IHNsb3RzID0+IHtcbiAgICAvKiogQHR5cGUge01hcDxudW1iZXIsIFJlbW90YWJsZU9iamVjdCB8IFByb21pc2U+fSAqL1xuICAgIGNvbnN0IHZhbE1hcCA9IG5ldyBNYXAoKTtcblxuICAgIC8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZU9iamVjdCB8IFByb21pc2V9XG4gKi9cbiAgICBjb25zdCBkZWNvZGVTbG90Q29tbW9uID0gc2xvdERhdGEgPT4ge1xuICAgICAgY29uc3QgeyBpZmFjZSA9IHVuZGVmaW5lZCwgaW5kZXgsIC4uLnJlc3QgfSA9IHNsb3REYXRhO1xuICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuICAgICAgY29uc3QgZXh0YW50ID0gdmFsTWFwLmdldChpbmRleCk7XG4gICAgICBpZiAoZXh0YW50KSB7XG4gICAgICAgIHJldHVybiBleHRhbnQ7XG4gICAgICB9XG4gICAgICAvKiBUT0RPIFNFQ1VSSVRZIEhBWkFSRDogbXVzdCBlbmZvY2UgdGhhdCByZW1vdGFibGUgdnMgcHJvbWlzZSovXG4gICAgICAvKiBpcyBhY2NvcmRpbmcgdG8gdGhlIGVuY29kZWQgc3RyaW5nLiovXG4gICAgICBjb25zdCBzbG90ID0gc2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbnZlcnRTbG90VG9WYWwoc2xvdCwgaWZhY2UpO1xuICAgICAgdmFsTWFwLnNldChpbmRleCwgdmFsKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIC8qKlxuICogQHBhcmFtIHt7XG4gKiAgIGVycm9ySWQ/OiBzdHJpbmcsXG4gKiAgIG1lc3NhZ2U6IHN0cmluZyxcbiAqICAgbmFtZTogc3RyaW5nLFxuICogICBjYXVzZTogdW5rbm93bixcbiAqICAgZXJyb3JzOiB1bmtub3duLFxuICogfX0gZXJyRGF0YVxuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IGRlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbiAgICBjb25zdCBkZWNvZGVFcnJvckNvbW1vbiA9IChlcnJEYXRhLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBlcnJvcklkID0gdW5kZWZpbmVkLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgZXJyb3JzID0gdW5kZWZpbmVkLFxuICAgICAgICAuLi5yZXN0XG4gICAgICB9ID0gZXJyRGF0YTtcbiAgICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDUyKi9cbiAgICAgIC8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY2FsbHMqL1xuICAgICAgLyogdG8gYGRlY29kZVJlY3VyYCBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCovXG4gICAgICAvKiBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuICAgICAgY29uc3QgZE5hbWUgPSBkZWNvZGVSZWN1cihuYW1lKTtcbiAgICAgIGNvbnN0IGRNZXNzYWdlID0gZGVjb2RlUmVjdXIobWVzc2FnZSk7XG4gICAgICAvKiBlcnJvcklkIGlzIGEgbGF0ZSBhZGRpdGlvbiBzbyBiZSB0b2xlcmFudCBvZiBpdHMgYWJzZW5jZS4qL1xuICAgICAgY29uc3QgZEVycm9ySWQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGVycm9ySWQgJiYgZGVjb2RlUmVjdXIoZXJyb3JJZCkpO1xuICAgICAgaWYgKHR5cGVvZiBkTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRNZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSkgfHwgRXJyb3I7XG4gICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgICBkRXJyb3JJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICA6IGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgIHNhbml0aXplOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBpZiAoY2F1c2UpIHtcbiAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGRlY29kZVJlY3VyKGNhdXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgb3B0aW9ucy5lcnJvcnMgPSBkZWNvZGVSZWN1cihlcnJvcnMpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3RXJyb3IgPSBtYWtlRXJyb3IoZE1lc3NhZ2UsIGVyckNvbnN0cnVjdG9yLCBvcHRpb25zKTtcbiAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGRlY29kZVJlY3VyIHJlc3QncyBwcm9wZXJ0eSBuYW1lcy4qL1xuICAgICAgLyogVGhpcyB3b3VsZCBiZSBpbmNvbnNpc3RlbnQgd2l0aCBzbWFsbGNhcHMnIGV4cGVjdGVkIGhhbmRsaW5nLCovXG4gICAgICAvKiBidXQgaXMgZmluZSBoZXJlIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCBmb3IgYGFubm90YXRlRXJyb3JgLCovXG4gICAgICAvKiB3aGljaCBpcyBmb3IgZGlhZ25vc3RpYyBpbmZvIHRoYXQgaXMgb3RoZXJ3aXNlIHVub2JzZXJ2YWJsZS4qL1xuICAgICAgY29uc3QgZGVzY3MgPSBvYmplY3RNYXAocmVzdCwgZGF0YSA9PiAoe1xuICAgICAgICB2YWx1ZTogZGVjb2RlUmVjdXIoZGF0YSksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB9KSk7XG4gICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJhd0Vycm9yLCBkZXNjcyk7XG4gICAgICBoYXJkZW4ocmF3RXJyb3IpO1xuICAgICAgcmV0dXJuIHRvUGFzc2FibGVFcnJvcihyYXdFcnJvcik7XG4gICAgfTtcblxuICAgIC8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuICAgIC8qIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvbiovXG4gICAgLyogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUqL1xuICAgIC8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0Ki9cbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IChyYXdUcmVlLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLnNsb3REYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuICAgIH07XG5cbiAgICBjb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhID0gKHJhd1RyZWUsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7IFtRQ0xBU1NdOiBfLCAuLi5lcnJEYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbUNhcERhdGEgPSBtYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOiBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMgPSBwcmVmaXggPT4ge1xuICAgICAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nRW5jb2RpbmdcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBfZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtSZW1vdGFibGVPYmplY3QgfCBQcm9taXNlfVxuICovXG4gICAgICByZXR1cm4gKHN0cmluZ0VuY29kaW5nLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KHN0cmluZ0VuY29kaW5nLmNoYXJBdCgwKSA9PT0gcHJlZml4KTtcbiAgICAgICAgLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG4gICAgICAgIGNvbnN0IGkgPSBzdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsIGkgPCAwID8gdW5kZWZpbmVkIDogaSkpO1xuICAgICAgICAvKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbiAgICAgICAgY29uc3QgaWZhY2UgPSBpIDwgMCA/IHVuZGVmaW5lZCA6IHN0cmluZ0VuY29kaW5nLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZVNsb3RDb21tb24oeyBpZmFjZSwgaW5kZXggfSk7XG4gICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuICAgIGNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbiAgICBjb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSAoZW5jb2RpbmcsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0RXJyRGF0YSB9ID0gZW5jb2Rpbmc7XG4gICAgICAhaGFzT3duKHJlc3RFcnJEYXRhLCAnbWVzc2FnZScpIHx8XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oeyBtZXNzYWdlLCAuLi5yZXN0RXJyRGF0YSB9LCBkZWNvZGVSZWN1cik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG4gICAgICAvKiBAdHMtaWdub3JlIFhYWCBTbWFsbENhcHNFbmNvZGluZyovXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgICAgLyogQHRzLWlnbm9yZSBYWFggU21hbGxDYXBzRW5jb2RpbmcqL1xuICAgICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgICBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGFyZGVuKHsgcmV2aXZlRnJvbUNhcERhdGEsIHJldml2ZUZyb21TbWFsbGNhcHMgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBAdHlwZSB7RnJvbUNhcERhdGE8U2xvdD59XG4gKi9cbiAgY29uc3QgZnJvbUNhcERhdGEgPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IGJvZHksIHNsb3RzIH0gPSBkYXRhO1xuICAgIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG4gICAgaXNBcnJheShkYXRhLnNsb3RzKSB8fFxuICAgICAgRmFpbGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuICAgIGNvbnN0IHsgcmV2aXZlRnJvbUNhcERhdGEsIHJldml2ZUZyb21TbWFsbGNhcHMgfSA9IG1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIC8qIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYW4gdW5hbWJpZ3VvdXMgc2lnbmFsLiovXG4gICAgaWYgKGJvZHkuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBib2R5LnNsaWNlKDEpO1xuICAgICAgY29uc3QgZW5jb2RpbmcgPSBoYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG4gICAgICByZXN1bHQgPSBoYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByYXdUcmVlID0gaGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNyovXG4gICAgLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4gICAgLyogdG8gc21hbGxjYXBzLiovXG4gICAgYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtQYXNzYWJsZUNhcH0gKi8gKHJlc3VsdCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgdG9DYXBEYXRhLFxuICAgIGZyb21DYXBEYXRhLFxuXG4gICAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki9cbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHRvQ2FwRGF0YSAqL1xuICAgIHNlcmlhbGl6ZTogdG9DYXBEYXRhLFxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUNhcERhdGEgKi9cbiAgICB1bnNlcmlhbGl6ZTogZnJvbUNhcERhdGEsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgaK+MehZAADoWQAAJQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9yYW5rT3JkZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVQYXNzYWJsZS5qcyJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVOdW1lcmljcyIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInNvcnRCeVJhbmsiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRlbnYsRmFpbCxxLGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0ZW52ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlUHJlZml4ZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGUsIFBhc3NTdHlsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0Z1bGxDb21wYXJlLCBQYXJ0aWFsQ29tcGFyZSwgUGFydGlhbENvbXBhcmlzb24sIFJhbmtDb21wYXJlLCBSYW5rQ29tcGFyaXNvbiwgUmFua0NvdmVyfSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbmNvbnN0IHsgaXNOYU46IE51bWJlcklzTmFOIH0gPSBOdW1iZXI7XG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBzZXRQcm90b3R5cGVPZiwgaXMgfSA9IE9iamVjdDtcblxuY29uc3QgRU5ET19SQU5LX1NUUklOR1MgPSBnZXRlbnYoJ0VORE9fUkFOS19TVFJJTkdTJywgJ3V0ZjE2LWNvZGUtdW5pdC1vcmRlcicsIFtcbiAgJ3VuaWNvZGUtY29kZS1wb2ludC1vcmRlcicsXG4gICdlcnJvci1pZi1vcmRlci1jaG9pY2UtbWF0dGVycycsXG5dKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5rQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZ1bGxDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24gdXNlZCBieSBKYXZhU2NyaXB0J3MgTWFwIGFuZCBTZXRcbiAqIGFic3RyYWN0aW9ucywgd2hlcmUgTmFOIGlzIHRoZSBzYW1lIGFzIE5hTiBhbmQgLTAgaXMgdGhlIHNhbWUgYXNcbiAqIDAuIE1hcnNoYWwgc2VyaWFsaXplcyAtMCBhcyB6ZXJvLCBzbyB0aGUgc2VtYW50aWNzIG9mIG91ciBkaXN0cmlidXRlZFxuICogb2JqZWN0IHN5c3RlbSBkb2VzIG5vdCBkaXN0aW5ndWlzaCAwIGZyb20gLTAuXG4gKlxuICogYHNhbWVWYWx1ZVplcm9gIGlzIHRoZSBFY21hU2NyaXB0IHNwZWMgbmFtZSBmb3IgdGhpcyBlcXVhbGl0eSBjb21wYXJpc29uLFxuICogYnV0IFRPRE8gd2UgbmVlZCBhIGJldHRlciBuYW1lIGZvciB0aGUgQVBJLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4XG4gKiBAcGFyYW0ge2FueX0geVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm8gPSAoeCwgeSkgPT4geCA9PT0geSB8fCBpcyh4LCB5KTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gbGVmdFxuICogQHBhcmFtIHthbnl9IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PlxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnksIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPT09IHJpZ2h0ID8gMCA6IDE7XG5oYXJkZW4odHJpdmlhbENvbXBhcmF0b3IpO1xuXG4vKiBBcHBhcmVudGx5IGVzbGludCBjb25mdXNlZCBhYm91dCB3aGV0aGVyIHRoZSBmdW5jdGlvbiBjYW4gZXZlciBleGl0Ki9cbi8qIHdpdGhvdXQgYW4gZXhwbGljaXQgcmV0dXJuLiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrKi9cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGxlZnRcbiAqIEBwYXJhbSB7c3RyaW5nfSByaWdodFxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG4gICAgICAgY29uc3QgY29tcGFyZUJ5Q29kZVBvaW50cyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBjb25zdCBsZWZ0SXRlciA9IGxlZnRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICBjb25zdCByaWdodEl0ZXIgPSByaWdodFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IHZhbHVlOiBsZWZ0Q2hhciB9ID0gbGVmdEl0ZXIubmV4dCgpO1xuICAgIGNvbnN0IHsgdmFsdWU6IHJpZ2h0Q2hhciB9ID0gcmlnaHRJdGVyLm5leHQoKTtcbiAgICBpZiAobGVmdENoYXIgPT09IHVuZGVmaW5lZCAmJiByaWdodENoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChsZWZ0Q2hhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiBsZWZ0IGlzIGEgcHJlZml4IG9mIHJpZ2h0LiovXG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChyaWdodENoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLyogcmlnaHQgaXMgYSBwcmVmaXggb2YgbGVmdC4qL1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRDb2RlcG9pbnQgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGxlZnRDaGFyLmNvZGVQb2ludEF0KDApKTtcbiAgICBjb25zdCByaWdodENvZGVwb2ludCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmlnaHRDaGFyLmNvZGVQb2ludEF0KDApKTtcbiAgICBpZiAobGVmdENvZGVwb2ludCA8IHJpZ2h0Q29kZXBvaW50KSByZXR1cm4gLTE7XG4gICAgaWYgKGxlZnRDb2RlcG9pbnQgPiByaWdodENvZGVwb2ludCkgcmV0dXJuIDE7XG4gIH1cbn07JGjNj19vbmNlLmNvbXBhcmVCeUNvZGVQb2ludHMoY29tcGFyZUJ5Q29kZVBvaW50cyk7XG5oYXJkZW4oY29tcGFyZUJ5Q29kZVBvaW50cyk7XG5cbi8qKlxuICogQ29tcGFyZSB0d28gc2FtZS10eXBlIG51bWVyaWMgdmFsdWVzLCByZXR1cm5pbmcgcmVzdWx0cyBjb25zaXN0ZW50IHdpdGhcbiAqIGBjb21wYXJlUmFua2AncyBcInJhbmsgb3JkZXJcIiAoaS5lLiwgdHJlYXRpbmcgYm90aCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgemVyb1xuICogYXMgZXF1YWwgYW5kIHBsYWNpbmcgTmFOIGFzIHNlbGYtZXF1YWwgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMpLlxuICpcbiAqIEB0ZW1wbGF0ZSB7bnVtYmVyIHwgYmlnaW50fSBUXG4gKiBAcGFyYW0ge1R9IGxlZnRcbiAqIEBwYXJhbSB7VH0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuICAgICAgIGNvbnN0IGNvbXBhcmVOdW1lcmljcyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4gIGlmIChsZWZ0IDwgcmlnaHQpIHJldHVybiAtMTtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICBpZiAobGVmdCA+IHJpZ2h0KSByZXR1cm4gMTtcbiAgaWYgKE51bWJlcklzTmFOKGxlZnQpID09PSBOdW1iZXJJc05hTihyaWdodCkpIHJldHVybiAwO1xuICBpZiAoTnVtYmVySXNOYU4ocmlnaHQpKSByZXR1cm4gLTE7XG4gIGFzc2VydChOdW1iZXJJc05hTihsZWZ0KSk7XG4gIHJldHVybiAxO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPFBhc3NTdHlsZSwgeyBpbmRleDogbnVtYmVyLCBjb3ZlcjogUmFua0NvdmVyIH0+fSBQYXNzU3R5bGVSYW5rc1JlY29yZFxuICovJGjNj19vbmNlLmNvbXBhcmVOdW1lcmljcyhjb21wYXJlTnVtZXJpY3MpO1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcyA9IC8qKiBAdHlwZSB7UGFzc1N0eWxlUmFua3NSZWNvcmR9ICovIChcbiAgZnJvbUVudHJpZXMoXG4gICAgZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbiAgICAgIC8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LCBhc3N1bWluZyB0aGF0IGFsbCBwcmVmaXhlcyBhcmUqL1xuICAgICAgLyogbGltaXRlZCB0byB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChVKzAwMDAgdGhyb3VnaCBVK0ZGRkYpIGFuZCovXG4gICAgICAvKiB0aHVzIGNvbnRhaW4gb25seSBjb2RlIHVuaXRzIHRoYXQgYXJlIGVxdWl2YWxlbnQgdG8gY29kZSBwb2ludHMuKi9cbiAgICAgIC8qIEluIHByYWN0aWNlLCB0aGV5IGFyZSBlbnRpcmVseSBwcmludGFibGUgQVNDSUkqL1xuICAgICAgLyogKDB4MjAgU1BBQ0UgdGhyb3VnaCAweDdFIFRJTERFKS4qL1xuICAgICAgLnNvcnQoKFtfbGVmdFN0eWxlLCBsZWZ0UHJlZml4ZXNdLCBbX3JpZ2h0U3R5bGUsIHJpZ2h0UHJlZml4ZXNdKSA9PiB7XG4gICAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMsIHJpZ2h0UHJlZml4ZXMpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKFtwYXNzU3R5bGUsIHByZWZpeGVzXSwgaW5kZXgpID0+IHtcbiAgICAgICAgLyogVmVyaWZ5IHRoYXQgYHByZWZpeGVzYCBpcyBzb3J0ZWQsIGFuZCBjb3ZlciBhbGwgc3RyaW5ncyB0aGF0IHN0YXJ0Ki9cbiAgICAgICAgLyogd2l0aCBhbnkgb2YgaXRzIGNoYXJhY3RlcnMsIGkuZS4qL1xuICAgICAgICAvKiBhbGwgcyBzdWNoIHRoYXQgcHJlZml4ZXMuYXQoMCkg4omkIHMgPCBzdWNjZXNzb3IocHJlZml4ZXMuYXQoLTEpKS4qL1xuICAgICAgICBwcmVmaXhlcyA9PT0gcHJlZml4ZXMuc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSB8fFxuICAgICAgICAgIEZhaWxgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbiAgICAgICAgY29uc3QgY292ZXIgPSBbXG4gICAgICAgICAgcHJlZml4ZXMuY2hhckF0KDApLFxuICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGggLSAxKSArIDEpLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gW3Bhc3NTdHlsZSwgeyBpbmRleCwgY292ZXIgfV07XG4gICAgICB9KSxcbiAgKVxuKTtcbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICAgICAgIGNvbnN0IGdldFBhc3NTdHlsZUNvdmVyID0gcGFzc1N0eWxlID0+IHBhc3NTdHlsZVJhbmtzW3Bhc3NTdHlsZV0uY292ZXI7JGjNj19vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhcnRpYWxDb21wYXJlfSBbY29tcGFyZVJlbW90YWJsZXNdXG4gKiBBIGNvbXBhcmF0b3IgZm9yIGFzc2lnbmluZyBhbiBpbnRlcm5hbCBvcmRlciB0byByZW1vdGFibGVzLlxuICogSXQgZGVmYXVsdHMgdG8gYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIGBOYU5gLCBtZWFuaW5nIHRoYXQgYWxsXG4gKiByZW1vdGFibGVzIGFyZSBpbmNvbXBhcmFibGUgYW5kIHNob3VsZCB0aWUgZm9yIHRoZSBzYW1lIHJhbmsgYnlcbiAqIHNob3J0LWNpcmN1aXRpbmcgd2l0aG91dCBmdXJ0aGVyIHJlZmluZW1lbnQgKGUuZy4sIG5vdCBvbmx5IGFyZSBgcjFgIGFuZCBgcjJgXG4gKiB0aWVkLCBidXQgc28gYXJlIGBbcjEsIDBdYCBhbmQgYFtyMiwgXCJ4XCJdYCkuXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmF0b3JLaXR9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29tcGFyYXRvcktpdCA9IChjb21wYXJlUmVtb3RhYmxlcyA9IChfeCwgX3kpID0+IE5hTikgPT4ge1xuICAvKiogQHR5cGUge1BhcnRpYWxDb21wYXJlfSAqL1xuICBjb25zdCBjb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgaWYgKHNhbWVWYWx1ZVplcm8obGVmdCwgcmlnaHQpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gICAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgICBpZiAobGVmdFN0eWxlICE9PSByaWdodFN0eWxlKSB7XG4gICAgICByZXR1cm4gY29tcGFyZU51bWVyaWNzKFxuICAgICAgICBwYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxuICAgICAgICBwYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8qIGVzbGludC1kaXNhYmxlIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS1cbiAqIFdlIGtub3cgYGxlZnRgIGFuZCBgcmlnaHRgIGFyZSBjb21wYXJhYmxlLlxuICovXG4gICAgc3dpdGNoIChsZWZ0U3R5bGUpIHtcbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIC8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbiAgICAgICAgLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuICAgICAgICAvKiBKYXZhU2NyaXB0J3MgcmVsYXRpb25hbCBvcGVyYXRvcnMgYDxgIGFuZCBgPmAuKi9cbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgc3dpdGNoIChFTkRPX1JBTktfU1RSSU5HUykge1xuICAgICAgICAgIGNhc2UgJ3V0ZjE2LWNvZGUtdW5pdC1vcmRlcic6IHtcbiAgICAgICAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3VuaWNvZGUtY29kZS1wb2ludC1vcmRlcic6IHtcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlQnlDb2RlUG9pbnRzKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnZXJyb3ItaWYtb3JkZXItY2hvaWNlLW1hdHRlcnMnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQxID0gdHJpdmlhbENvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0MiA9IGNvbXBhcmVCeUNvZGVQb2ludHMobGVmdCwgcmlnaHQpO1xuICAgICAgICAgICAgcmVzdWx0MSA9PT0gcmVzdWx0MiB8fFxuICAgICAgICAgICAgICBGYWlsYENvbXBhcmlzb25zIGRpZmZlcmVkOiAke2xlZnR9IHZzICR7cmlnaHR9LCAke3EocmVzdWx0MSl9IHZzICR7cShyZXN1bHQyKX1gO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRocm93IEZhaWxgVW5leHBlY3RlZCBFTkRPX1JBTktfU1RSSU5HUyAke3EoRU5ET19SQU5LX1NUUklOR1MpfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKFxuICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbiAgICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyZU51bWVyaWNzKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIExleGljb2dyYXBoaWMgYnkgaW52ZXJzZSBzb3J0ZWQgb3JkZXIgb2YgcHJvcGVydHkgbmFtZXMsIHRoZW4qL1xuICAgICAgICAvKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbiAgICAgICAgLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4gICAgICAgIC8qIGFsbCByZWNvcmRzIHdpdGggdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHByb3BlcnR5IG5hbWVzIHNvcnQgbmV4dCB0byovXG4gICAgICAgIC8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuICAgICAgICAvKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbiAgICAgICAgLyogYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBhcmUgc3RyaW5ncy4gV2UgbmVlZCB0aGUgcmV2ZXJzZSBzb3J0ZWQgb3JkZXIqL1xuICAgICAgICAvKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuICAgICAgICAvKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4gICAgICAgIC8qIHRoZW4gcmVjb3JkIFggd2lsbCBoYXZlIGFuIGVhcmxpZXIgcmFuayBhbmQgc29ydCB0byB0aGUgbGVmdCBvZiBZLiovXG4gICAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdE5hbWVzLCByaWdodE5hbWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdFZhbHVlcyA9IHJlY29yZFZhbHVlcyhsZWZ0LCBsZWZ0TmFtZXMpO1xuICAgICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnRWYWx1ZXMsIHJpZ2h0VmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLyogTGV4aWNvZ3JhcGhpYyovXG4gICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0W2ldLCByaWdodFtpXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuICAgICAgICAvKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLyogQnl0ZUFycmF5cyBjb21wYXJlIGJ5IHNob3J0bGV4LiovXG4gICAgICAgIC8qIC0gZmlyc3QsIGlmIHRoZXkgYXJlIG9mIHVuZXF1YWwgbGVuZ3RoLCB0aGVuIHRoZSBzaG9ydGVyIGlzIGxlc3MuKi9cbiAgICAgICAgLyogLSB0aGVuLCBhbW9uZyBieXRlQXJyYXlzIG9mIGVxdWFsIGxlbmd0aCwgYnkgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uKi9cbiAgICAgICAgLyogb2YgdGhlaXIgYnl0ZXMgaW4gYXNjZW5kaW5nIG9yZGVyLiovXG4gICAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aDogbGVmdExlbiB9ID0gbGVmdDtcbiAgICAgICAgY29uc3QgeyBieXRlTGVuZ3RoOiByaWdodExlbiB9ID0gcmlnaHQ7XG4gICAgICAgIGlmIChsZWZ0TGVuIDwgcmlnaHRMZW4pIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlZnRMZW4gPiByaWdodExlbikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQWNjb3VudCBmb3IgZ2FwcyBpbiB0aGUgQGVuZG8vaW1tdXRhYmxlLWFycmF5YnVmZmVyIHNoaW0uKi9cbiAgICAgICAgY29uc3QgbGVmdEFycmF5ID1cbiAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YobGVmdCkgPT09IEFycmF5QnVmZmVyLnByb3RvdHlwZVxuICAgICAgICAgICAgPyBuZXcgVWludDhBcnJheShsZWZ0KVxuICAgICAgICAgICAgOiBuZXcgVWludDhBcnJheShsZWZ0LnNsaWNlKDApKTtcbiAgICAgICAgY29uc3QgcmlnaHRBcnJheSA9XG4gICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHJpZ2h0KSA9PT0gQXJyYXlCdWZmZXIucHJvdG90eXBlXG4gICAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KHJpZ2h0KVxuICAgICAgICAgICAgOiBuZXcgVWludDhBcnJheShyaWdodC5zbGljZSgwKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVmdExlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgbGVmdEJ5dGUgPSBsZWZ0QXJyYXlbaV07XG4gICAgICAgICAgY29uc3QgcmlnaHRCeXRlID0gcmlnaHRBcnJheVtpXTtcbiAgICAgICAgICBpZiAobGVmdEJ5dGUgPCByaWdodEJ5dGUpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxlZnRCeXRlID4gcmlnaHRCeXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIC8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbiAgICAgICAgY29uc3QgbGFiZWxDb21wID0gY29tcGFyYXRvcihnZXRUYWcobGVmdCksIGdldFRhZyhyaWdodCkpO1xuICAgICAgICBpZiAobGFiZWxDb21wICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxhYmVsQ29tcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQsIHJpZ2h0LnBheWxvYWQpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgfTtcblxuICAvKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuICBjb25zdCBvdXRlckNvbXBhcmF0b3IgPSAoeCwgeSkgPT5cbiAgICAvKiBXaGVuIHRoZSBpbm5lciBjb21wYXJhdG9yIHJldHVybnMgTmFOIHRvIGluZGljYXRlIGluY29tcGFyYWJpbGl0eSwqL1xuICAgIC8qIHJlcGxhY2UgdGhhdCB3aXRoIDAgdG8gaW5kaWNhdGUgYSB0aWUuKi9cbiAgICAvKiogQHR5cGUge0V4Y2x1ZGU8UGFydGlhbENvbXBhcmlzb24sIE5hTj59ICovIChjb21wYXJhdG9yKHgsIHkpIHx8IDApO1xuXG4gIC8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG4gIGNvbnN0IGFudGlDb21wYXJhdG9yID0gKHgsIHkpID0+IG91dGVyQ29tcGFyYXRvcih5LCB4KTtcblxuICBtZW1vT2ZTb3J0ZWQuc2V0KG91dGVyQ29tcGFyYXRvciwgbmV3IFdlYWtTZXQoKSk7XG4gIG1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsIG5ldyBXZWFrU2V0KCkpO1xuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChvdXRlckNvbXBhcmF0b3IsIGFudGlDb21wYXJhdG9yKTtcbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsIG91dGVyQ29tcGFyYXRvcik7XG5cbiAgcmV0dXJuIGhhcmRlbih7IGNvbXBhcmF0b3I6IG91dGVyQ29tcGFyYXRvciwgYW50aUNvbXBhcmF0b3IgfSk7XG59O1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmU9fVxuICovJGjNj19vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbiAgICAgICBjb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2UgPSBjb21wYXJhdG9yID0+XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbiAgICAgICBjb25zdCBpc1JhbmtTb3J0ZWQgPSAocGFzc2FibGVzLCBjb21wYXJlKSA9PiB7XG4gIGNvbnN0IHN1Yk1lbW9PZlNvcnRlZCA9IG1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG4gIGFzc2VydChzdWJNZW1vT2ZTb3J0ZWQgIT09IHVuZGVmaW5lZCk7XG4gIGlmIChzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBhc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKSA9PT0gJ2NvcHlBcnJheScpO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHBhc3NhYmxlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjb21wYXJlKHBhc3NhYmxlc1tpIC0gMV0sIHBhc3NhYmxlc1tpXSkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmFua1NvcnRlZCA9IChzb3J0ZWQsIGNvbXBhcmUpID0+XG4gIGlzUmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpIHx8XG4gIC8qIFRPRE8gYXNzZXJ0IG9uIGJ1ZyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4gRml4LiovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIEZhaWxgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsIGNvbXBhcmUpfWA7JGjNj19vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG4gICAgICAgY29uc3Qgc29ydEJ5UmFuayA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgLyoqIEB0eXBlIHtUW119IG11dGFibGUgZm9yIGluLXBsYWNlIHNvcnRpbmcsIGJ1dCB3aXRoIGhhcmRlbmVkIGVsZW1lbnRzICovXG4gIGxldCB1bnNvcnRlZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSkge1xuICAgIGhhcmRlbihwYXNzYWJsZXMpO1xuICAgIC8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuICAgIC8qIHRoaXMgYGNvbXBhcmVgIGZ1bmN0aW9uIGV2ZW4gaWYgaXQgd2FzIGFscmVhZHkgbWVtb2l6ZWQgZm9yIGEgZGlmZmVyZW50Ki9cbiAgICAvKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbiAgICBpZiAoaXNSYW5rU29ydGVkKHBhc3NhYmxlcywgY29tcGFyZSkpIHtcbiAgICAgIHJldHVybiBwYXNzYWJsZXM7XG4gICAgfVxuICAgIHVuc29ydGVkID0gWy4uLnBhc3NhYmxlc107XG4gIH0gZWxzZSB7XG4gICAgdW5zb3J0ZWQgPSBBcnJheS5mcm9tKHBhc3NhYmxlcywgaGFyZGVuKTtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSB1bnNvcnRlZC5zb3J0KGNvbXBhcmUpO1xuICAvKiBGb3IgcmV2ZXJzZSBjb21wYXJpc29uLCBtb3ZlIGB1bmRlZmluZWRgIHZhbHVlcyBmcm9tIHRoZSBlbmQgdG8gdGhlIHN0YXJ0LiovXG4gIC8qIE5vdGUgdGhhdCBwYXNzU3R5bGVQcmVmaXhlcyAoQHNlZSB7QGxpbmsgLi9lbmNvZGVQYXNzYWJsZS5qc30pIE1VU1QgTk9UKi9cbiAgLyogc29ydCBhbnkgY2F0ZWdvcnkgYWZ0ZXIgYHVuZGVmaW5lZGAuKi9cbiAgaWYgKGNvbXBhcmUodHJ1ZSwgdW5kZWZpbmVkKSA+IDApIHtcbiAgICBsZXQgaSA9IHNvcnRlZC5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChpID49IDAgJiYgc29ydGVkW2ldID09PSB1bmRlZmluZWQpIGkgLT0gMTtcbiAgICBjb25zdCBuID0gc29ydGVkLmxlbmd0aCAtIGkgLSAxO1xuICAgIGlmIChuID4gMCAmJiBuIDwgc29ydGVkLmxlbmd0aCkge1xuICAgICAgc29ydGVkLmNvcHlXaXRoaW4obiwgMCk7XG4gICAgICBzb3J0ZWQuZmlsbCgvKiogQHR5cGUge1R9ICovICh1bmRlZmluZWQpLCAwLCBuKTtcbiAgICB9XG4gIH1cbiAgaGFyZGVuKHNvcnRlZCk7XG4gIGNvbnN0IHN1Yk1lbW9PZlNvcnRlZCA9IG1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG4gIGFzc2VydChzdWJNZW1vT2ZTb3J0ZWQgIT09IHVuZGVmaW5lZCk7XG4gIHN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbiAgcmV0dXJuIHNvcnRlZDtcbn07JGjNj19vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2ggPSAoc29ydGVkLCBjb21wYXJlLCBrZXksIGJpYXMgPSAnbGVmdE1vc3QnKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgbGV0IGxlZnQgPSAwO1xuICBsZXQgcmlnaHQgPSBzb3J0ZWQubGVuZ3RoO1xuICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcbiAgICBjb25zdCBjb21wID0gY29tcGFyZShzb3J0ZWRbbV0sIGtleSk7XG4gICAgaWYgKGNvbXAgPD0gLTEgfHwgKGNvbXAgPT09IDAgJiYgYmlhcyA9PT0gJ3JpZ2h0TW9zdCcpKSB7XG4gICAgICBsZWZ0ID0gbSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChjb21wID49IDEgfHwgKGNvbXAgPT09IDAgJiYgYmlhcyA9PT0gJ2xlZnRNb3N0JykpO1xuICAgICAgcmlnaHQgPSBtO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmlhcyA9PT0gJ2xlZnRNb3N0JyA/IGxlZnQgOiByaWdodCAtIDE7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuICAgICAgIGNvbnN0IGdldEluZGV4Q292ZXIgPSAoc29ydGVkLCBjb21wYXJlLCBbbGVmdEtleSwgcmlnaHRLZXldKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgY29uc3QgbGVmdEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIGxlZnRLZXksICdsZWZ0TW9zdCcpO1xuICBjb25zdCByaWdodEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIHJpZ2h0S2V5LCAncmlnaHRNb3N0Jyk7XG4gIHJldHVybiBbbGVmdEluZGV4LCByaWdodEluZGV4XTtcbn07JGjNj19vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qKiBAdHlwZSB7UmFua0NvdmVyfSAqL1xuICAgICAgIGNvbnN0IEZ1bGxSYW5rQ292ZXIgPSBoYXJkZW4oWycnLCAneyddKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqLyRozY9fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuICAgICAgIGNvbnN0IGNvdmVyZWRFbnRyaWVzID0gKHNvcnRlZCwgW2xlZnRJbmRleCwgcmlnaHRJbmRleF0pID0+IHtcbiAgLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuICBjb25zdCBpdGVyYWJsZSA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gbGVmdEluZGV4O1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaSA8PSByaWdodEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc29ydGVkW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiBbaSwgZWxlbWVudF0sIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1R9IGFcbiAqIEBwYXJhbSB7VH0gYlxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1heFJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPj0gMCA/IGEgOiBiKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1R9IGFcbiAqIEBwYXJhbSB7VH0gYlxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1pblJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPD0gMCA/IGEgOiBiKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgICAgICBjb25zdCB1bmlvblJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gIGNvbnN0IHVuaW9uUmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1pblJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtYXhSYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLCBbJ3snLCAnJ10pO1xufTskaM2PX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgICAgICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJzID0gKGNvbXBhcmUsIGNvdmVycykgPT4ge1xuICAvKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWF4UmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1pblJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLCBbJycsICd7J10pO1xufTskaM2PX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuICAgICAgIGNvbnN0IHsgY29tcGFyYXRvcjogY29tcGFyZVJhbmssIGFudGlDb21wYXJhdG9yOiBjb21wYXJlQW50aVJhbmsgfSA9XG4gIG1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaM2PX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRozY9fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbiAgICAgICBjb25zdCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9IChsb25nTGl2ZWQgPSBmYWxzZSkgPT4ge1xuICBsZXQgbnVtU2VlbiA9IDA7XG4gIC8qIFdoZW4gZHluYW1pY2FsbHkgY3JlYXRlZCB3aXRoIHNob3J0IGxpZmV0aW1lcyAodGhlIGRlZmF1bHQpIGEgV2Vha01hcCovXG4gIC8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuICAvKiBhcyB0aGUgTWFwLiovXG4gIGNvbnN0IE1hcENvbnN0cnVjdG9yID0gbG9uZ0xpdmVkID8gV2Vha01hcCA6IE1hcDtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuICBjb25zdCB0YWcgPSByID0+IHtcbiAgICBpZiAoc2Vlbi5oYXMocikpIHtcbiAgICAgIHJldHVybiBzZWVuLmdldChyKTtcbiAgICB9XG4gICAgbnVtU2VlbiArPSAxO1xuICAgIHNlZW4uc2V0KHIsIG51bVNlZW4pO1xuICAgIHJldHVybiBudW1TZWVuO1xuICB9O1xuICBjb25zdCBjb21wYXJlUmVtb3RhYmxlcyA9ICh4LCB5KSA9PiBjb21wYXJlUmFuayh0YWcoeCksIHRhZyh5KSk7XG4gIHJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG59OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUJ5Q29kZVBvaW50cyI6WyJjb21wYXJlQnlDb2RlUG9pbnRzIl0sImNvbXBhcmVOdW1lcmljcyI6WyJjb21wYXJlTnVtZXJpY3MiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4xDdI0kMAABJDAAAHQAAAEBlbmRvL25hdC12NS4xLjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsJ25hbWUnLHt2YWx1ZTpcImlzTmF0XCJ9KTskaM2PX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsJ25hbWUnLHt2YWx1ZTpcIk5hdFwifSk7JGjNj19vbmNlLk5hdChOYXQpOy8qIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiovXG4vKiBDb3B5cmlnaHQgKEMpIDIwMTggQWdvcmljKi9cbi8qKi9cbi8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ki9cbi8qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4qL1xuLyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ki9cbi8qKi9cbi8qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCovXG4vKiovXG4vKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlKi9cbi8qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywqL1xuLyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuKi9cbi8qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQqL1xuLyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuKi9cblxuLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBJcyBgYWxsZWdlZE51bWAgYSBudW1iZXIgaW4gdGhlIFtjb250aWd1b3VzIHJhbmdlIG9mIGV4YWN0bHkgYW5kXG4gKiB1bmFtYmlndW91c2x5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiAgbmF0dXJhbCBudW1iZXJzIChub24tbmVnYXRpdmUgaW50ZWdlcnMpP1xuICpcbiAqIFRvIHF1YWxpZnkgYGFsbGVnZWROdW1gIG11c3QgZWl0aGVyIGJlIGFcbiAqIG5vbi1uZWdhdGl2ZSBgYmlnaW50YCwgb3IgYSBub24tbmVnYXRpdmUgYG51bWJlcmAgcmVwcmVzZW50aW5nIGFuIGludGVnZXJcbiAqIHdpdGhpbiByYW5nZSBvZiBbaW50ZWdlcnMgc2FmZWx5IHJlcHJlc2VudGFibGUgaW5cbiAqIGZsb2F0aW5nIHBvaW50XShodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc3NhZmVpbnRlZ2VyKS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gYWxsZWdlZE51bSA+PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkgJiYgYWxsZWdlZE51bSA+PSAwO1xufVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSkge1xuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdiaWdpbnQnKSB7XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwbikge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuICAgIH1cbiAgICByZXR1cm4gYWxsZWdlZE51bTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuICAgIH1cbiAgICBpZiAoYWxsZWdlZE51bSA8IDApIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiAgfVxuXG4gIHRocm93IFR5cGVFcnJvcihcbiAgICBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCxcbiAgKTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbm7eczYLAAA2CwAAIAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvZXJyb3IuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy9zdHJpbmcuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkZhciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiLCJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIiwiaXNPYmplY3QiLCJpc09iamVjdCIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9zdHJpbmcuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2l0ZXItaGVscGVycy5qcyI6W1sibWFwSXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLFsiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSJdXSwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOltbIlBBU1NfU1RZTEUiLCJQQVNTX1NUWUxFIl0sWyJpc09iamVjdCIsImlzT2JqZWN0Il0sWyJpc1ByaW1pdGl2ZSIsImlzUHJpbWl0aXZlIl0sWyJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q2hlY2tlciJdLFsiZ2V0VGFnIiwiZ2V0VGFnIl0sWyJoYXNPd25Qcm9wZXJ0eU9mIiwiaGFzT3duUHJvcGVydHlPZiJdXSwiLi9zcmMvZXJyb3IuanMiOltbImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRFcnJvckNvbnN0cnVjdG9yIl0sWyJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIl1dLCIuL3NyYy9yZW1vdGFibGUuanMiOltbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXV0sIi4vc3JjL3N5bWJvbC5qcyI6W1siYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLFsiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiXSxbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLFsicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sWyJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIl1dLCIuL3NyYy9zdHJpbmcuanMiOltbImlzV2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0UGFzc2FibGVTdHJpbmciXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSJdLFsiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSJdLFsidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIl0sWyJ0b1Rocm93YWJsZSIsInRvVGhyb3dhYmxlIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdLFsiR0VUX01FVEhPRF9OQU1FUyIsIkdFVF9NRVRIT0RfTkFNRVMiXV0sIi4vc3JjL3R5cGVHdWFyZHMuanMiOltbImFzc2VydFJlY29yZCIsImFzc2VydFJlY29yZCJdLFsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5Il0sWyJhc3NlcnRSZW1vdGFibGUiLCJhc3NlcnRSZW1vdGFibGUiXSxbImlzUmVtb3RhYmxlIiwiaXNSZW1vdGFibGUiXSxbImlzUmVjb3JkIiwiaXNSZWNvcmQiXSxbImlzQ29weUFycmF5IiwiaXNDb3B5QXJyYXkiXSxbImlzQXRvbSIsImlzQXRvbSJdLFsiYXNzZXJ0QXRvbSIsImFzc2VydEF0b20iXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE6FbiMVDQAAFQ0AACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvYnl0ZUFycmF5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkJ5dGVBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMsIGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKiBEZXRlY3RzIHRoZSBwcmVzZW5jZSBvZiBhIGltbXV0YWJsZSBBcnJheUJ1ZmZlciBzdXBwb3J0IGluIHRoZSB1bmRlcmx5aW5nKi9cbi8qIHBsYXRmb3JtIGFuZCBwcm92aWRlcyBlaXRoZXIgc3VpdGFibGUgdmFsdWVzIGZyb20gdGhhdCBpbXBsZW1lbnRhdGlvbiBvciovXG4vKiB2YWx1ZXMgdGhhdCB3aWxsIGNvbnNpc3RlbnRseSBkZW55IHRoYXQgaW1tdXRhYmxlIEFycmF5QnVmZmVycyBleGlzdC4qL1xuY29uc3QgYWRhcHRJbW11dGFibGVBcnJheUJ1ZmZlciA9ICgpID0+IHtcbiAgY29uc3QgYW5BcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcblxuICAvKiBPbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBzbGljZVRvSW1tdXRhYmxlLCBwYXNzLXN0eWxlIGJ5dGVBcnJheSovXG4gIC8qIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC4qL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFRPRE8gVGhpcyBlcnJvciB3aWxsIGJlIGFkZHJlc3NlZCB3aGVuIHVwZGF0aW5nKi9cbiAgLyogVHlwZVNjcmlwdCdzIG5hdGl2ZSB0eXBlcyB0byBhIHZlcnNpb24gcmVjb2duaXppbmcgdGhlIHVwY29taW5nIHN0YW5kYXJkLiovXG4gIGlmIChhbkFycmF5QnVmZmVyLnNsaWNlVG9JbW11dGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZTogbnVsbCxcbiAgICAgIGltbXV0YWJsZUdldHRlcjogKCkgPT4gZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBUaGlzIGVycm9yIHdpbGwgYmUgYWRkcmVzc2VkIHdoZW4gdXBkYXRpbmcqL1xuICAvKiBUeXBlU2NyaXB0J3MgbmF0aXZlIHR5cGVzIHRvIGEgdmVyc2lvbiByZWNvZ25pemluZyB0aGUgdXBjb21pbmcgc3RhbmRhcmQuKi9cbiAgY29uc3QgYW5JbW11dGFibGVBcnJheUJ1ZmZlciA9IGFuQXJyYXlCdWZmZXIuc2xpY2VUb0ltbXV0YWJsZSgpO1xuXG4gIC8qKlxuICogQXMgcHJvcG9zZWQsIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyBgQXJyYXlCdWZmZXIucHJvdG90eXBlYC4gQXMgc2hpbW1lZCxcbiAqIHRoaXMgd2lsbCBiZSBhIGhpZGRlbiBpbnRyaW5zaWMgdGhhdCBpbmhlcml0cyBmcm9tIGBBcnJheUJ1ZmZlci5wcm90b3R5cGVgLlxuICogRWl0aGVyIHdheSwgZ2V0IHRoaXMgaW4gYSB3YXkgdGhhdCB3ZSBjYW4gdHJ1c3QgaXQgYWZ0ZXIgbG9ja2Rvd24sIGFuZFxuICogcmVxdWlyZSB0aGF0IGFsbCBpbW11dGFibGUgQXJyYXlCdWZmZXJzIGRpcmVjdGx5IGluaGVyaXQgZnJvbSBpdC5cbiAqL1xuICBjb25zdCBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGFuSW1tdXRhYmxlQXJyYXlCdWZmZXIpO1xuXG4gIGNvbnN0IGltbXV0YWJsZUdldHRlciA9IC8qKiBAdHlwZSB7KHRoaXM6IEFycmF5QnVmZmVyKSA9PiBib29sZWFufSAqLyAoXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IHRoZSBkZXNjaXB0b3IgaXMgdGhlcmUuKi9cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUsICdpbW11dGFibGUnKS5nZXRcbiAgKTtcblxuICByZXR1cm4geyBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSwgaW1tdXRhYmxlR2V0dGVyIH07XG59O1xuXG5jb25zdCB7IGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlLCBpbW11dGFibGVHZXR0ZXIgfSA9XG4gIGFkYXB0SW1tdXRhYmxlQXJyYXlCdWZmZXIoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgQnl0ZUFycmF5SGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnYnl0ZUFycmF5JyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICAoY2FuZGlkYXRlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgJiZcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBIb3cgZG8gSSBhZGQgaXQgdG8gdGhlIEFycmF5QnVmZmVyIHR5cGU/Ki9cbiAgICAgIGNhbmRpZGF0ZS5pbW11dGFibGUpIHx8XG4gICAgKCEhY2hlY2sgJiYgY2hlY2soZmFsc2UsIFhgSW1tdXRhYmxlIEFycmF5QnVmZmVyIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBfcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkgPT09IGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYE1hbGZvcm1lZCBCeXRlQXJyYXkgJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgICBhcHBseShpbW11dGFibGVHZXR0ZXIsIGNhbmRpZGF0ZSwgW10pIHx8XG4gICAgICBGYWlsYE11c3QgYmUgYW4gaW1tdXRhYmxlIEFycmF5QnVmZmVyOiAke2NhbmRpZGF0ZX1gO1xuICAgIG93bktleXMoY2FuZGlkYXRlKS5sZW5ndGggPT09IDAgfHxcbiAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICBYYEJ5dGVBcnJheXMgbXVzdCBub3QgaGF2ZSBvd24gcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCxcbiAgICAgICAgVHlwZUVycm9yLFxuICAgICAgKTtcbiAgfSxcbn0pOyRozY9fb25jZS5CeXRlQXJyYXlIZWxwZXIoQnl0ZUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJ5dGVBcnJheUhlbHBlciI6WyJCeXRlQXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmae90ggIAAAICAAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsYXNzZXJ0Q2hlY2tlcixnZXRPd25EYXRhRGVzY3JpcHRvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5LCBwcm90b3R5cGU6IGFycmF5UHJvdG90eXBlIH0gPSBBcnJheTtcblxuLyoqXG4gKlxuICogQHR5cGUge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IENvcHlBcnJheUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlBcnJheScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgKCEhY2hlY2sgJiYgY2hlY2soZmFsc2UsIFhgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBhcnJheVByb3RvdHlwZSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gICAgLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4gICAgLyogcG9zc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgZ2V0IHRvIGZhaWwuKi9cbiAgICBjb25zdCBsZW4gPSAvKiogQHR5cGUge251bWJlcn0gKi8gKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAnbGVuZ3RoJywgZmFsc2UsIGFzc2VydENoZWNrZXIpLnZhbHVlXG4gICAgKTtcbiAgICAvKiBWYWxpZGF0ZSB0aGF0IGVhY2ggaW5kZXggcHJvcGVydHkgaXMgb3duL2RhdGEvZW51bWVyYWJsZSovXG4gICAgLyogYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlIGlzIHJlY3Vyc2l2ZWx5IHBhc3NhYmxlLiovXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCBpLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8qIEV4cGVjdCBvbmUga2V5IHBlciBpbmRleCBwbHVzIG9uZSBmb3IgJ2xlbmd0aCcuKi9cbiAgICBvd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoID09PSBsZW4gKyAxIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICB9LFxufSk7JGjNj19vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABHL7odZwsAAGcLAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsZ2V0T3duRGF0YURlc2NyaXB0b3IsQ1gsY2FuQmVNZXRob2Q7JGjNj19pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiY2FuQmVNZXRob2RcIixbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja09iamVjdFByb3RvdHlwZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge1Byb3BlcnR5S2V5fSBrZXlcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja1Byb3BlcnR5Q2FuQmVWYWxpZCA9IChjYW5kaWRhdGUsIGtleSwgdmFsdWUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiAoXG4gICAgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICghY2FuQmVNZXRob2QodmFsdWUpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICAvKiBUT0RPOiBVcGRhdGUgbWVzc2FnZSBub3cgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIFwiaW1wbGljaXQgUmVtb3RhYmxlXCIuKi9cbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSlcbiAgKTtcbn07XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBDb3B5UmVjb3JkSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnY29weVJlY29yZCcsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2tPYmplY3RQcm90b3R5cGUoY2FuZGlkYXRlLCBjaGVjaykgJiZcbiAgICAgIC8qIFJlamVjdCBhbnkgY2FuZGlkYXRlIHdpdGggYSBzeW1ib2wta2V5ZWQgcHJvcGVydHkgb3IgbWV0aG9kLWxpa2UgcHJvcGVydHkqL1xuICAgICAgLyogKHN1Y2ggaW5wdXQgaXMgcG90ZW50aWFsbHkgYSBSZW1vdGFibGUpLiovXG4gICAgICBvd25LZXlzKGNhbmRpZGF0ZSkuZXZlcnkoa2V5ID0+XG4gICAgICAgIGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkKGNhbmRpZGF0ZSwga2V5LCBjYW5kaWRhdGVba2V5XSwgY2hlY2spLFxuICAgICAgKVxuICAgICk7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgLyogVmFsaWRhdGUgdGhhdCBlYWNoIG93biBwcm9wZXJ0eSBoYXMgYSByZWN1cnNpdmVseSBwYXNzYWJsZSBhc3NvY2lhdGVkKi9cbiAgICAvKiB2YWx1ZSAod2UgYWxyZWFkeSBrbm93IGZyb20gY2FuQmVWYWxpZCB0aGF0IHRoZSBvdGhlciBjb25zdHJhaW50cyBhcmUqL1xuICAgIC8qIHNhdGlzZmllZCkuKi9cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBnZXRPd25EYXRhRGVzY3JpcHRvcihcbiAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICBuYW1lLFxuICAgICAgICB0cnVlLFxuICAgICAgICBhc3NlcnRDaGVja2VyLFxuICAgICAgKTtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpO1xuICAgIH1cbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ46wtPYGQAA2BkAAC4AAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxLEUsaXNQcm9taXNlLGdldFRhZyxwYXNzU3R5bGVPZixtYWtlVGFnZ2VkLGlzQXRvbTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiaXNBdG9tXCIsWyRozY9fYSA9PiAoaXNBdG9tID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVCcmFuZH0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgQnl0ZUFycmF5LCBDb3B5UmVjb3JkLCBDb3B5QXJyYXksIENvcHlUYWdnZWQsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQ3VycmVudGx5IGNvcGllZCBmcm9tIEBhZ29yaWMvaW50ZXJuYWwgdXRpbHMuanMuXG4gKiBUT0RPIFNob3VsZCBtaWdyYXRlIGhlcmUgYW5kIHRoZW4sIGlmIG5lZWRlZCwgcmVleHBvcnRlZCB0aGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3sgW0tleVR5cGUgaW4ga2V5b2YgVF06IFRbS2V5VHlwZV0gfSAmIHt9fSBTaW1wbGlmeSBmbGF0dGVuIHRoZVxuICogICB0eXBlIG91dHB1dCB0byBpbXByb3ZlIHR5cGUgaGludHMgc2hvd24gaW4gZWRpdG9yc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEN1cnJlbnRseSBjb3BpZWQgZnJvbSBAYWdvcmljL2ludGVybmFsIHV0aWxzLmpzLlxuICogVE9ETyBTaG91bGQgbWlncmF0ZSBoZXJlIGFuZCB0aGVuLCBpZiBuZWVkZWQsIHJlZXhwb3J0ZWQgdGhlcmUuXG4gKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQ3VycmVudGx5IGNvcGllZCBmcm9tIEBhZ29yaWMvaW50ZXJuYWwgdXRpbHMuanMuXG4gKiBUT0RPIFNob3VsZCBtaWdyYXRlIGhlcmUgYW5kIHRoZW4sIGlmIG5lZWRlZCwgcmVleHBvcnRlZCB0aGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIENhbGxhYmxlID8gVFtLXSA6IERlZXBseUF3YWl0ZWQ8VFtLXT47XG4gKiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBDdXJyZW50bHkgY29waWVkIGZyb20gQGFnb3JpYy9pbnRlcm5hbCB1dGlscy5qcy5cbiAqIFRPRE8gU2hvdWxkIG1pZ3JhdGUgaGVyZSBhbmQgdGhlbiwgaWYgbmVlZGVkLCByZWV4cG9ydGVkIHRoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIFByb21pc2VMaWtlPGFueT5cbiAqICAgICA/IEF3YWl0ZWQ8VD5cbiAqICAgICA6IFQgZXh0ZW5kcyAoUmVtb3RhYmxlQnJhbmQ8YW55LCBhbnk+IHwgUmVtb3RhYmxlT2JqZWN0KVxuICogICAgICAgPyBUXG4gKiAgICAgICA6IFQgZXh0ZW5kcyB7fVxuICogICAgICAgICA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+XG4gKiAgICAgICAgIDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gYSBwcm9taXNlIGZvciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLFxuICogd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIHRoZSByZXBsYWNlbWVudCB3b3VsZCBub3QgYmUgUGFzc2FibGUsIGkuZS4sIGlmIGB2YWxgIGlzIG5vdFxuICogUGFzc2FibGUsIG9yIGlmIGFueSBvZiB0aGUgdHJhbnNpdGl2ZSBwcm9taXNlcyBmdWxmaWxsIHRvIHNvbWV0aGluZ1xuICogdGhhdCBpcyBub3QgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2UgcmVqZWN0cy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgUGFzc2FibGVzIG9ubHkgKmJlY2F1c2UqIHRoZXkgY29udGFpblxuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwiQGVuZG8vcGF0dGVybnNcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsXG4gKiBiZWNhdXNlIGl0IGRlZmluZXMgdGhlIGBLZXlgIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVD1QYXNzYWJsZV1cbiAqIEBwYXJhbSB7VH0gdmFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZCA9IGFzeW5jIHZhbCA9PiB7XG4gIC8qIFRPRE8gRmlndXJlIG91dCB3aHkgd2UgbmVlZCB0aGVzZSBhdC1leHBlY3QtZXJyb3IgZGlyZWN0aXZlcyBiZWxvdyovXG4gIC8qIGFuZCBmaXggaWYgcG9zc2libGUuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xMjU3IG1heSBiZSByZWxldmFudC4qL1xuXG4gIC8qIElmIGB2YWxgIGlzIG5vdCBQYXNzYWJsZSwgYGlzQXRvbWAgd2lsbCByZXR1cm4gZmFsc2UgcmF0aGVyIHRoYW4qL1xuICAvKiB0aHJvd2luZy4qL1xuICBpZiAoaXNBdG9tKHZhbCkpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtEZWVwbHlBd2FpdGVkPFQ+fSAqLyAodmFsKTtcbiAgfVxuICAvKiBpZiBgdmFsYCBpcyBhIHByb21pc2UgYnV0IG5vdCBhIHBhc3NhYmxlIHByb21pc2UsIGZvciBleGFtcGxlLCovXG4gIC8qIGJlY2F1c2UgaXQgaXMgbm90IGhhcmRlbmVkLCBgaXNQcm9taXNlYCB3aWxsIHJldHVybiB0cnVlLCB3aGljaCBpcyovXG4gIC8qIG9rIGhlcmUgYmFjYXVzZSB3ZSB1bndyYXAgaXQgdG8gaXRzIHNldHRsZW1lbnQgYW5kIGRpc3BlbnNlIHdpdGggdGhlKi9cbiAgLyogcHJvbWlzZSovXG4gIGlmIChpc1Byb21pc2UodmFsKSkge1xuICAgIHJldHVybiBFLndoZW4odmFsLCBub25wID0+IGRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gIH1cbiAgLyogSWYgYHZhbGAgaXMgYW55IG90aGVyIG5vbi1QYXNzYWJsZSwgdGhlIGBwYXNzU3R5bGVPZih2YWwpYCB3aWxsIHRocm93LiovXG4gIC8qIFNvIHRoaXMgZXhlbXB0aW9uIGZvciBub24tUGFzc2FibGUgcHJvbWlzZXMgaXMgb25seSBmb3IgdGhlIHRvcC1sZXZlbC4qL1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICBjb25zdCByZWMgPSAvKiogQHR5cGUge0NvcHlSZWNvcmR9ICovICh2YWwpO1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhyZWMpKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gbmFtZXMubWFwKG5hbWUgPT4gZGVlcGx5RnVsZmlsbGVkKHJlY1tuYW1lXSkpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PlxuICAgICAgICBoYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsIGkpID0+IFtuYW1lc1tpXSwgY10pKSksXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICBjb25zdCBhcnIgPSAvKiogQHR5cGUge0NvcHlBcnJheX0gKi8gKHZhbCk7XG4gICAgICBjb25zdCB2YWxQcyA9IGFyci5tYXAocCA9PiBkZWVwbHlGdWxmaWxsZWQocCkpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PiBoYXJkZW4odmFscykpO1xuICAgIH1cbiAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICBjb25zdCBieXRlQXJyYXkgPSAvKiogQHR5cGUge0J5dGVBcnJheX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHZhbCkpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gYnl0ZUFycmF5O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0Z2QgPSAvKiogQHR5cGUge0NvcHlUYWdnZWR9ICovICh2YWwpO1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHRnZCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHRnZC5wYXlsb2FkKSwgcGF5bG9hZCA9PlxuICAgICAgICBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCksXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICBjb25zdCByZW0gPSAvKiogQHR5cGUge1JlbW90YWJsZU9iamVjdH0gKi8gKHZhbCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiByZW07XG4gICAgfVxuICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgY29uc3QgZXJyID0gLyoqIEB0eXBlIHtFcnJvcn0gKi8gKHZhbCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICBjb25zdCBwcm9tID0gLyoqIEB0eXBlIHtQcm9taXNlfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAodmFsKSk7XG4gICAgICByZXR1cm4gRS53aGVuKHByb20sIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLCBUeXBlRXJyb3IpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAassmRs0dAADNHQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge0NoZWNrZXIsIFBhc3NTdHlsZSwgUGFzc1N0eWxlT2Z9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGhhc093biwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzID0gbmV3IE1hcChcbiAgLyogQ2FzdCBiZWNhdXNlIG90aGVyd2lzZSBUUyBpcyBjb25mdXNlZCBieSBBZ2dyZWdhdGVFcnJvciovXG4gIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDQyI2Rpc2N1c3Npb25fcjE0ODQ5MzMwMjgqL1xuICAvKiogQHR5cGUge0FycmF5PFtzdHJpbmcsIElNUE9SVCgnc2VzJykuR2VuZXJpY0Vycm9yQ29uc3RydWN0b3JdPn0gKi9cbiAgKFtcbiAgICBbJ0Vycm9yJywgRXJyb3JdLFxuICAgIFsnRXZhbEVycm9yJywgRXZhbEVycm9yXSxcbiAgICBbJ1JhbmdlRXJyb3InLCBSYW5nZUVycm9yXSxcbiAgICBbJ1JlZmVyZW5jZUVycm9yJywgUmVmZXJlbmNlRXJyb3JdLFxuICAgIFsnU3ludGF4RXJyb3InLCBTeW50YXhFcnJvcl0sXG4gICAgWydUeXBlRXJyb3InLCBUeXBlRXJyb3JdLFxuICAgIFsnVVJJRXJyb3InLCBVUklFcnJvcl1cblxuICAgIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvNTUwKi9cbiAgICAvKiBUbyBhY2NvbW1vZGF0ZSBwbGF0Zm9ybXMgcHJpb3IgdG8gQWdncmVnYXRlRXJyb3IsIHdlIGNvbW1lbnQgb3V0IHRoZSovXG4gICAgLyogZm9sbG93aW5nIGxpbmUgYW5kIGluc3RlYWQgY29uZGl0aW9uYWxseSBhZGQgaXQgdG8gdGhlIG1hcCBiZWxvdy4qL1xuICAgIC8qIFsnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcl0sKi9cbiAgXSksXG4pO1xuXG5pZiAodHlwZW9mIEFnZ3JlZ2F0ZUVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICAvKiBDb25kaXRpb25hbCwgdG8gYWNjb21tb2RhdGUgcGxhdGZvcm1zIHByaW9yIHRvIEFnZ3JlZ2F0ZUVycm9yKi9cbiAgZXJyb3JDb25zdHJ1Y3RvcnMuc2V0KCdBZ2dyZWdhdGVFcnJvcicsIEFnZ3JlZ2F0ZUVycm9yKTtcbn1cblxuLyoqXG4gKiBCZWNhdXNlIHRoZSBlcnJvciBjb25zdHJ1Y3RvciByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlXG4gKiBgQWdncmVnYXRlRXJyb3JgLCB3aGljaCBoYXMgZGlmZmVyZW50IGNvbnN0cnVjdGlvbiBwYXJhbWV0ZXJzXG4gKiBmcm9tIHRoZSBvdGhlciBlcnJvciBjb25zdHJ1Y3RvcnMsIGRvIG5vdCB1c2UgaXQgZGlyZWN0bHkgdG8gdHJ5XG4gKiB0byBtYWtlIGFuIGVycm9yIGluc3RhbmNlLiBSYXRoZXIsIHVzZSBgbWFrZUVycm9yYCB3aGljaCBlbmNhcHN1bGF0ZXNcbiAqIHRoaXMgbm9uLXVuaWZvcm1pdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtJTVBPUlQoJ3NlcycpLkdlbmVyaWNFcnJvckNvbnN0cnVjdG9yIHwgdW5kZWZpbmVkfVxuICovXG4gICAgICAgY29uc3QgZ2V0RXJyb3JDb25zdHJ1Y3RvciA9IG5hbWUgPT4gZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRozY9fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xuICByZXR1cm4gKFxuICAgIGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKVxuICApO1xufTtcbmhhcmRlbihjaGVja0Vycm9yTGlrZSk7XG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvci1saWtlIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgaXNFcnJvckxpa2VgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBpc0Vycm9yTGlrZSA9IGNhbmRpZGF0ZSA9PiBjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUpOyRozY9fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wTmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eURlc2NyaXB0b3J9IGRlc2NcbiAqIEBwYXJhbSB7KHZhbDogYW55KSA9PiBQYXNzU3R5bGV9IHBhc3NTdHlsZU9mUmVjdXJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9IChcbiAgcHJvcE5hbWUsXG4gIGRlc2MsXG4gIHBhc3NTdHlsZU9mUmVjdXIsXG4gIGNoZWNrID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGlmIChkZXNjLmVudW1lcmFibGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGlmICghaGFzT3duKGRlc2MsICd2YWx1ZScpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBkYXRhIHByb3BlcnR5OiAke2Rlc2N9YFxuICAgICk7XG4gIH1cbiAgY29uc3QgeyB2YWx1ZSB9ID0gZGVzYztcbiAgc3dpdGNoIChwcm9wTmFtZSkge1xuICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgIGNhc2UgJ3N0YWNrJzoge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt2YWx1ZX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAnY2F1c2UnOiB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKHZhbHVlLCBwYXNzU3R5bGVPZlJlY3VyLCBjaGVjayk7XG4gICAgfVxuICAgIGNhc2UgJ2Vycm9ycyc6IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgcGFzc1N0eWxlT2ZSZWN1cih2YWx1ZSkgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGNvcHlBcnJheTogJHt2YWx1ZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUuZXZlcnkoZXJyID0+XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVyciwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spLFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiAoXG4gICAgISFjaGVjayAmJlxuICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydHkgJHtxKHByb3BOYW1lKX1gXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0geyh2YWw6IGFueSkgPT4gUGFzc1N0eWxlfSBwYXNzU3R5bGVPZlJlY3VyXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKCFjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvdG87XG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbiAgaWYgKGVyckNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgfHwgZXJyQ29uc3RydWN0b3IucHJvdG90eXBlICE9PSBwcm90bykge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICBpZiAoISgnbWVzc2FnZScgaW4gZGVzY3MpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBoYXZlIGFuIG93biBcIm1lc3NhZ2VcIiBzdHJpbmcgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsIGRlc2NdKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBkZXNjLFxuICAgICAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgICAgIGNoZWNrLFxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBFcnJvckhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2Vycm9yJyxcblxuICBjYW5CZVZhbGlkOiBjaGVja0Vycm9yTGlrZSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyLCBhc3NlcnRDaGVja2VyKSxcbn0pOyRozY9fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAewaKenwJAAB8CQAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIGBiYXNlSXRlcmF0b3JgIGFuZFxuICogaGF2ZSB0aGUgc2FtZSB0ZXJtaW5hdGlvbiAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlIG9yIGZhaWx1cmVcbiAqIHJlYXNvbi4gQnV0IHRoZSBub24tZmluYWwgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBub24tZmluYWxcbiAqIHZhbHVlcyBmcm9tIGBiYXNlSXRlcmF0b3JgIGFzIHRyYW5zZm9ybWVkIGJ5IGBmdW5jYC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxVXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBVfSBmdW5jXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VT59XG4gKi9cbiAgICAgICBjb25zdCBtYXBJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIGZ1bmMpID0+XG4gIC8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG4gIEZhcignbWFwcGVkIGl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBiYXNlSXRlcmF0b3IgPSBiYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgcmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyB2YWx1ZTogYmFzZVZhbHVlLCBkb25lIH0gPSBiYXNlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZG9uZSA/IGJhc2VWYWx1ZSA6IGZ1bmMoYmFzZVZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIGRvbmUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTskaM2PX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IGZpbHRlckl0ZXJhYmxlID0gKGJhc2VJdGVyYWJsZSwgcHJlZCkgPT5cbiAgLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbiAgRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChkb25lIHx8IHByZWQodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAChJ4zJ9CUAAPQlAAAnAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJHRVRfTUVUSE9EX05BTUVTIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldE1ldGhvZE5hbWVzLHEsRmFpbCxhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLFskaM2PX2EgPT4gKGFzc2VydElmYWNlID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZU9mXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtSZW1vdGFibGVCcmFuZH0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCcgKi9cbi8qKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgcHJvdG90eXBlOiBmdW5jdGlvblByb3RvdHlwZSB9ID0gRnVuY3Rpb247XG5jb25zdCB7XG4gIGdldFByb3RvdHlwZU9mLFxuICBzZXRQcm90b3R5cGVPZixcbiAgY3JlYXRlLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG59ID0gT2JqZWN0O1xuXG4vKipcbiAqIE5vdyB0aGF0IHRoZSByZW1vdGFibGVQcm90byBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gYHRvU3RyaW5nYCBtZXRob2QsXG4gKiBlbnN1cmUgaXQgYWx3YXlzIGluaGVyaXRzIGZyb20gc29tZXRoaW5nLiBUaGUgb3JpZ2luYWwgcHJvdG90eXBlIG9mXG4gKiBgcmVtb3RhYmxlYCBpZiB0aGVyZSB3YXMgb25lLCBvciBgT2JqZWN0LnByb3RvdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZW1vdGFibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90byA9IChyZW1vdGFibGUsIGlmYWNlKSA9PiB7XG4gIGxldCBvbGRQcm90byA9IGdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG4gIGlmICh0eXBlb2YgcmVtb3RhYmxlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChvbGRQcm90byA9PT0gbnVsbCkge1xuICAgICAgb2xkUHJvdG8gPSBvYmplY3RQcm90b3R5cGU7XG4gICAgfVxuICAgIG9sZFByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9sZFByb3RvICE9PSBudWxsIHx8XG4gICAgICBGYWlsYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xuICAgIG9sZFByb3RvID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgICAgZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgICAgRmFpbGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2Uge1xuICAgIEZhaWxgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuICB9XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9sZFByb3RvLCB7XG4gICAgICBbUEFTU19TVFlMRV06IHsgdmFsdWU6ICdyZW1vdGFibGUnIH0sXG4gICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyB2YWx1ZTogaWZhY2UgfSxcbiAgICB9KSxcbiAgKTtcbn07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlID0gY2FuZGlkYXRlID0+XG4gIFJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAdGVtcGxhdGUge0ludGVyZmFjZVNwZWN9IElcbiAqIEBwYXJhbSB7SX0gW2lmYWNlXSBUaGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gZm9yXG4gKiB0aGUgcmVtb3RhYmxlLiBGb3Igbm93LCBhIHN0cmluZyBpZmFjZSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aFxuICogXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCIsIHRvIHNlcnZlIGFzIHRoZSBhbGxlZ2VkIG5hbWUuIE1vcmVcbiAqIGdlbmVyYWwgaWZhY2VzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkLiBUaGlzIGlzIHRlbXBvcmFyeS4gV2UgaW5jbHVkZSB0aGVcbiAqIFwiQWxsZWdlZFwiIG9yIFwiRGVidWdOYW1lXCIgYXMgYSByZW1pbmRlciB0aGF0IHdlIGRvIG5vdCB5ZXQgaGF2ZSBTd2luZ1NldFxuICogb3IgQ29tbXMgVmF0XG4gKiBzdXBwb3J0IGZvciBlbnN1cmluZyB0aGlzIGlzIGFjY29yZGluZyB0byB0aGUgdmF0IGhvc3RpbmcgdGhlIG9iamVjdC5cbiAqIEN1cnJlbnRseSwgQWxpY2UgY2FuIHRlbGwgQm9iIGFib3V0IENhcm9sLCB3aGVyZSBWYXRBIChvbiBBbGljZSdzIGJlaGFsZilcbiAqIG1pc3JlcHJlc2VudHMgQ2Fyb2wncyBgaWZhY2VgLiBWYXRCIGFuZCB0aGVyZWZvcmUgQm9iIHdpbGwgdGhlbiBzZWVcbiAqIENhcm9sJ3MgYGlmYWNlYCBhcyBtaXNyZXByZXNlbnRlZCBieSBWYXRBLlxuICogQHBhcmFtIHt1bmRlZmluZWR9IFtwcm9wc10gQ3VycmVudGx5IG1heSBvbmx5IGJlIHVuZGVmaW5lZC5cbiAqIFRoYXQgcGxhbiBpcyB0aGF0IG93bi1wcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIHJlbW90YWJsZVxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVPYmplY3Q8ST4gJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbiAgICAgICBjb25zdCBSZW1vdGFibGUgPSAoXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSSBjb3VsZCBoYXZlIGRpZmZlcmVudCBzdWJ0eXBlIHRoYW4gc3RyaW5nKi9cbiAgaWZhY2UgPSAnUmVtb3RhYmxlJyxcbiAgcHJvcHMgPSB1bmRlZmluZWQsXG4gIHJlbW90YWJsZSA9IC8qKiBAdHlwZSB7VH0gKi8gKHt9KSxcbikgPT4ge1xuICBhc3NlcnRJZmFjZShpZmFjZSk7XG4gIGFzc2VydChpZmFjZSk7XG4gIC8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4gIC8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xuICBwcm9wcyA9PT0gdW5kZWZpbmVkIHx8IEZhaWxgUmVtb3RhYmxlIHByb3BzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgJHtwcm9wc31gO1xuXG4gIC8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbiAgYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuICAvKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgbWFya2VkLiovXG4gICEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxuICAgICAgcmVtb3RhYmxlW1BBU1NfU1RZTEVdLFxuICAgICl9YDtcbiAgLyogYGlzRnJvemVuYCBhbHdheXMgcmV0dXJucyB0cnVlIHdpdGggYSBmYWtlIGBoYXJkZW5gLCBidXQgd2Ugd2FudCB0aGF0IGNhc2UqL1xuICAvKiB0byBzdWNjZWVkIGFueXdheS4gRmFraW5nIGBoYXJkZW5gIGlzIG9ubHkgY29ycmVjdG5lc3MgcHJlc2VydmluZyovXG4gIC8qIGlmIHRoZSBjb2RlIGluIHF1ZXN0aW9uIGNvbnRhaW5zIG5vIGJ1Z3MgdGhhdCB0aGUgcmVhbCBgaGFyZGVuYCB3b3VsZCovXG4gIC8qIGhhdmUgY2F1Z2h0LiovXG4gIC8qIEB0cy1pZ25vcmUgYGlzRmFrZWAgcHVycG9zZWx5IG5vdCBpbiB0aGUgdHlwZSovXG4gIGhhcmRlbi5pc0Zha2UgfHxcbiAgICAvKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG4gICAgIWlzRnJvemVuKHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuICBjb25zdCByZW1vdGFibGVQcm90byA9IG1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsIGlmYWNlKTtcblxuICAvKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4gIC8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuICBjb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjayA9IHRhcmdldCA9PiB7XG4gICAgLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbiAgICBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHJlbW90YWJsZVByb3RvKTtcbiAgICBoYXJkZW4odGFyZ2V0KTtcbiAgICBhc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbiAgbXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4gIC8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4gIC8qIENPTU1JVFRFRCEqL1xuICAvKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuICBhc3NlcnQoaWZhY2UgIT09IHVuZGVmaW5lZCk7IC8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG4gIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKHJlbW90YWJsZSk7XG59OyRozY9fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGRlZmF1bHQgbWV0YS1tZXRob2QgZm9yIG9idGFpbmluZyBhXG4gKiBsaXN0IG9mIGFsbCBtZXRob2RzIG9mIGFuIG9iamVjdCBkZWNsYXJlZCB3aXRoIGBGYXJgLCBvciBhbiBvYmplY3QgdGhhdFxuICogaW5oZXJpdHMgZnJvbSBhbiBvYmplY3QgZGVjbGFyZWQgd2l0aCBgRmFyYC5cbiAqXG4gKiBNb2RlbGVkIG9uIGBHRVRfSU5URVJGQUNFX0dVQVJEYCBmcm9tIGBAZW5kby9leG9gLlxuICpcbiAqIFRPRE8gTmFtZSB0byBiZSBiaWtlc2hlZC4gUGVyaGFwcyBldmVuIHdoZXRoZXIgaXQgaXMgYVxuICogc3RyaW5nIG9yIHN5bWJvbCB0byBiZSBiaWtlc2hlZC4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODA5I2Rpc2N1c3Npb25fcjEzODgwNTI0NTRcbiAqXG4gKiBIQVpBUkQ6IEJld2FyZSB0aGF0IGFuIGV4bydzIGludGVyZmFjZSBjYW4gY2hhbmdlIGFjcm9zcyBhbiB1cGdyYWRlLFxuICogc28gcmVtb3RlcyB0aGF0IGNhY2hlIGl0IGNhbiBiZWNvbWUgc3RhbGUuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfTUVUSE9EX05BTUVTID0gJ19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qKlxuICogTm90ZSB0aGF0IGBnZXRNZXRob2ROYW1lc01ldGhvZGAgaXMgYSB0aGlzZnVsIG1ldGhvZCEgSXQgbXVzdCBiZSBzbyB0aGF0XG4gKiBpdCB3b3JrcyBhcyBleHBlY3RlZCB3aXRoIGZhci1vYmplY3QgaW5oZXJpdGFuY2UuXG4gKlxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovJGjNj19vbmNlLkdFVF9NRVRIT0RfTkFNRVMoR0VUX01FVEhPRF9OQU1FUyk7XG5jb25zdCBnZXRNZXRob2ROYW1lc01ldGhvZCA9IGhhcmRlbih7XG4gIFtHRVRfTUVUSE9EX05BTUVTXSgpIHtcbiAgICByZXR1cm4gZ2V0TWV0aG9kTmFtZXModGhpcyk7XG4gIH0sXG59KVtHRVRfTUVUSE9EX05BTUVTXTtcblxuY29uc3QgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yID0gaGFyZGVuKHtcbiAgdmFsdWU6IGdldE1ldGhvZE5hbWVzTWV0aG9kLFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IGZhbHNlLFxufSk7XG5cbi8qKlxuICogTWFyayBhbiBvYmplY3QgdG8gYmUgZXhwb3NlZCBmb3IgcmVtb3RlIGludGVyYWN0aW9uXG4gKiBhbmQgZ2l2ZSBpdCBhIHN1Z2dlc3RpdmUgaW50ZXJmYWNlIG5hbWUgZm9yIGRlYnVnZ2luZy5cbiAqXG4gKiBBbGwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGhhdmUgdG8gYmUgbWV0aG9kcywgbm90IGRhdGEuXG4gKlxuICogVGhlIG9iamVjdCBtdXN0IG5vdCBiZSBoYXJkZW5lZCBiZWZvcmUgaXQgaXMgbWFya2VkLlxuICogSXQgd2lsbCBiZSBoYXJkZW5lZCBhZnRlciBtYXJraW5nLlxuICpcbiAqIEZvciBmYXIgb2JqZWN0cyAoYXMgb3Bwb3NlZCB0byBmYXIgZnVuY3Rpb25zKSwgYWxzbyBhZGRzXG4gKiBgX19nZXRNZXRob2ROYW1lc19fYCBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgbWV0aG9kIG5hbWVzLFxuICogaWYgdGhlcmUgaXMgbm90IHlldCBhbnkgbWV0aG9kIG5hbWVkIGBfX2dldE1ldGhvZE5hbWVzX19gLlxuICpcbiAqIEBleGFtcGxlXG4gKiBGYXIoJ0VtcGxveWVlJywgeyBnZXRNYW5hZ2VyIH0pXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHRvIGJlIG1hcmtlZCBhcyByZW1vdGFibGVcbiAqL1xuICAgICAgIGNvbnN0IEZhciA9IChmYXJOYW1lLCByZW1vdGFibGUgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgciA9IHJlbW90YWJsZSA9PT0gdW5kZWZpbmVkID8gLyoqIEB0eXBlIHtUfSAqLyAoe30pIDogcmVtb3RhYmxlO1xuICBpZiAodHlwZW9mIHIgPT09ICdvYmplY3QnICYmICEoR0VUX01FVEhPRF9OQU1FUyBpbiByKSkge1xuICAgIC8qIFRoaXMgdGVzdCBleGNsdWRlcyBmYXIgZnVuY3Rpb25zLCBzaW5jZSB3ZSBjdXJyZW50bHkgY29uc2lkZXIgdGhlbSovXG4gICAgLyogdG8gb25seSBoYXZlIGEgY2FsbC1iZWhhdmlvciwgd2l0aCBubyBjYWxsYWJsZSBtZXRob2RzLiovXG4gICAgLyogQmV3YXJlOiBNdXRhdGVzIHRoZSBpbnB1dCBhcmd1bWVudCEgQnV0IGBSZW1vdGFibGVgKi9cbiAgICAvKiAqIHJlcXVpcmVzIHRoZSBvYmplY3QgdG8gYmUgbXV0YWJsZSovXG4gICAgLyogKiBkb2VzIGZ1cnRoZXIgbXV0YXRpb25zLCovXG4gICAgLyogKiBoYXJkZW5zIHRoZSBtdXRhdGVkIG9iamVjdCBiZWZvcmUgcmV0dXJuaW5nIGl0LiovXG4gICAgLyogc28gdGhpcyBtdXRhdGlvbiBpcyBub3QgdW5wcmVjZWRlbnRlZC4gQnV0IGl0IGlzIHN1cnByaXNpbmchKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgR0VUX01FVEhPRF9OQU1FUywgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiAgfVxuICByZXR1cm4gUmVtb3RhYmxlKGBBbGxlZ2VkOiAke2Zhck5hbWV9YCwgdW5kZWZpbmVkLCByKTtcbn07JGjNj19vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qKlxuICogQ29lcmNlIGBmdW5jYCB0byBhIGZhciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyBpdHMgY2FsbCBiZWhhdmlvci5cbiAqIElmIGl0IGlzIGFscmVhZHkgYSBmYXIgZnVuY3Rpb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlIG1ha2UgYW5kIHJldHVybiBhXG4gKiBuZXcgZmFyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBmb3J3YXJkcyBjYWxscyB0byBpdC4gVGhpc1xuICogd29ya3MgZXZlbiBpZiBgZnVuY2AgaXMgYWxyZWFkeSBmcm96ZW4uIGBUb0ZhckZ1bmN0aW9uYCBpcyB0byBiZSB1c2VkXG4gKiB3aGVuIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tIGVsc2V3aGVyZSB1bmRlciBsZXNzIGNvbnRyb2wuIEZvciBmdW5jdGlvbnNcbiAqIHlvdSBhdXRob3IgaW4gcGxhY2UsIGJldHRlciB0byB1c2UgYEZhcmAgb24gdGhlaXIgZnVuY3Rpb24gbGl0ZXJhbCBkaXJlY3RseS5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBGXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSB0byBiZSB1c2VkIG9ubHkgaWYgYGZ1bmNgIGlzIG5vdCBhbHJlYWR5IGFcbiAqIGZhciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Rn0gZnVuY1xuICogQHJldHVybnMge0YgJiBSZW1vdGFibGVPYmplY3QgJiBSZW1vdGFibGVCcmFuZDx7fSwgRj59XG4gKi9cbiAgICAgICBjb25zdCBUb0ZhckZ1bmN0aW9uID0gKGZhck5hbWUsIGZ1bmMpID0+IHtcbiAgaWYgKGdldEludGVyZmFjZU9mKGZ1bmMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNoZWNrZWQgY2FzdCovXG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBkaWZmZXJlbnQgc3VidHlwZSovXG4gIHJldHVybiBGYXIoZmFyTmFtZSwgKC4uLmFyZ3MpID0+IGZ1bmMoLi4uYXJncykpO1xufTskaM2PX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJxSYGmDBQAAgwUAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLENvcHlUYWdnZWR9IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFRcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFBcbiAqIEBwYXJhbSB7VH0gdGFnXG4gKiBAcGFyYW0ge1B9IHBheWxvYWRcbiAqIEByZXR1cm5zIHtDb3B5VGFnZ2VkPFQsUD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlVGFnZ2VkID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YDtcbiAgYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBjcmVhdGUob2JqZWN0UHJvdG90eXBlLCB7XG4gICAgICBbUEFTU19TVFlMRV06IHsgdmFsdWU6ICd0YWdnZWQnIH0sXG4gICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyB2YWx1ZTogdGFnIH0sXG4gICAgICBwYXlsb2FkOiB7IHZhbHVlOiBwYXlsb2FkLCBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgfSksXG4gICk7XG59OyRozY9fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHwl6v3qIQAA6iEAADAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiQ1giLCJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0T3duRGF0YURlc2NyaXB0b3IiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1ByaW1pdGl2ZSIsImlzVHlwZWRBcnJheSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBQYXNzU3R5bGUsIEpTUHJpbWl0aXZlfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlIH0gPSBGdW5jdGlvbjtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRQcm90b3R5cGVPZixcbiAgaGFzT3duLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG59ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgdG9TdHJpbmdUYWc6IHRvU3RyaW5nVGFnU3ltYm9sIH0gPSBTeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICB0eXBlZEFycmF5UHJvdG90eXBlLFxuICB0b1N0cmluZ1RhZ1N5bWJvbCxcbik7XG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPSB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnID09PSAnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYE9iamVjdC5oYXNPd25gIGluc3RlYWRcbiAqL1xuICAgICAgIGNvbnN0IGhhc093blByb3BlcnR5T2YgPSBoYXNPd247XG5cbi8qKlxuICogQHR5cGUgeyh2YWw6IHVua25vd24pID0+IHZhbCBpcyBKU1ByaW1pdGl2ZX1cbiAqLyRozY9fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuICAgICAgIGNvbnN0IGlzUHJpbWl0aXZlID0gdmFsID0+XG4gIC8qIFNhZmVyIHdvdWxkIGJlIGBPYmplY3QodmFsKSAhPT0gdmFsYCBidXQgaXMgdG9vIGV4cGVuc2l2ZSBvbiBYUy4qL1xuICAvKiBTbyBpbnN0ZWFkIHdlIHVzZSB0aGlzIGFkaG9jIHNldCBvZiB0eXBlIHRlc3RzLiBCdXQgdGhpcyBpcyBub3Qgc2FmZSBpbiovXG4gIC8qIHRoZSBmYWNlIG9mIHBvc3NpYmxlIGV2b2x1dGlvbiBvZiB0aGUgbGFuZ3VhZ2UuIEJld2FyZSEqL1xuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTskaM2PX29uY2UuaXNQcmltaXRpdmUoaXNQcmltaXRpdmUpO1xuaGFyZGVuKGlzUHJpbWl0aXZlKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgYCFpc1ByaW1pdGl2ZWAgaW5zdGVhZFxuICogQHR5cGUgeyh2YWw6IHVua25vd24pID0+IHZhbCBpcyAoRnVuY3Rpb24gfCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPil9XG4gKi9cbiAgICAgICBjb25zdCBpc09iamVjdCA9IHZhbCA9PlxuICAvKiBTYWZlciB3b3VsZCBiZSBgT2JqZWN0KHZhbCkgLT09IHZhbGAgYnV0IGlzIHRvbyBleHBlbnNpdmUgb24gWFMuKi9cbiAgLyogU28gaW5zdGVhZCB3ZSB1c2UgdGhpcyBhZGhvYyBzZXQgb2YgdHlwZSB0ZXN0cy4gQnV0IHRoaXMgaXMgbm90IHNhZmUgaW4qL1xuICAvKiB0aGUgZmFjZSBvZiBwb3NzaWJsZSBldm9sdXRpb24gb2YgdGhlIGxhbmd1YWdlLiBCZXdhcmUhKi9cbiAgISF2YWwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpOyRozY9fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG4gICAgICAgY29uc3QgaXNUeXBlZEFycmF5ID0gb2JqZWN0ID0+IHtcbiAgLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbiAgY29uc3QgdGFnID0gYXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLCBvYmplY3QsIFtdKTtcbiAgcmV0dXJuIHRhZyAhPT0gdW5kZWZpbmVkO1xufTskaM2PX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuLyoqXG4gKiBXZSBjYXN0IG91ciBgU3ltYm9sLmZvcigpYCB0byBhIHN0cmluZyBjb25zdGFudCBoZXJlIHRvIGF2b2lkIGV4cG9zaW5nIHRoZVxuICogYHVuaXF1ZSBzeW1ib2xgIHR5cGUgcHVibGljbHkuICBUaGUgY2FzdCBkb2Vzbid0IGNoYW5nZSBhbnkgcnVudGltZVxuICogYmVoYXZpb3IuLi4gaXQncyBzdGlsbCBhY3R1YWxseSBhIHN5bWJvbC5cbiAqXG4gKiBXaXRob3V0IHRoaXMgd29ya2Fyb3VuZCwgd2UndmUgb2JzZXJ2ZWQgZXJyb3JzIHdoZW4gdXNpbmdcbiAqIGB0eXBlc2NyaXB0QDUuOS4zYCdzIGB0c2NgIHRvIGdlbmVyYXRlIGRlY2xhcmF0aW9uIGZpbGVzICguZC50cykgZm9yXG4gKiBjb25zdW1lcnMgb2YgbW9kdWxlcyB0aGF0IGltcG9ydCBgUEFTU19TVFlMRWA6XG4gKiBAZXhhbXBsZVxuICogICBlcnJvciBUUzkwMDY6IERlY2xhcmF0aW9uIGVtaXQgZm9yIHRoaXMgZmlsZSByZXF1aXJlcyB1c2luZyBwcml2YXRlIG5hbWVcbiAqICAgJ1BBU1NfU1RZTEUnIGZyb20gbW9kdWxlICcuLi4vQGVuZG8vcGFzcy1zdHlsZS9zcmMvdHlwZXNcIicuIEFuIGV4cGxpY2l0XG4gKiAgIHR5cGUgYW5ub3RhdGlvbiBtYXkgdW5ibG9jayBkZWNsYXJhdGlvbiBlbWl0LlxuICovXG4gICAgICAgY29uc3QgUEFTU19TVFlMRSA9IC8qKiBAdHlwZSB7J1N5bWJvbChwYXNzU3R5bGUpJ30gKi8gKFxuICAvKiogQHR5cGUge3Vua25vd259ICovIChTeW1ib2wuZm9yKCdwYXNzU3R5bGUnKSlcbik7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi8kaM2PX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbiAgICAgICBjb25zdCBhc3NlcnRDaGVja2VyID0gKGNvbmQsIGRldGFpbHMpID0+IHtcbiAgYXNzZXJ0KGNvbmQsIGRldGFpbHMpO1xuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogUmV0dXJucyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIGZ1bmN0aW9uIHRvIGZhaWwgdGhlIHByb3ZpZGVkIENoZWNrZXIgd2l0aCBkZXRhaWxzLlxuICogVGhlIG5hbWUgbXVzdCBiZSBzaG9ydCBmb3IgZXJnb25vbWljIGlubGluZSB1c2UgYXMgaW46XG4gKiBgYGBcbiAqIHJldHVybiBjaGVja0NvbmRpdGlvbiguLi4pIHx8ICghIWNoZWNrICYmIENYKGNoZWNrKWAuLi5gKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuICAgICAgIGNvbnN0IENYID0gY2hlY2sgPT4ge1xuICBjb25zdCByZWplY3QgPSAoVCwgLi4uc3VicykgPT4gY2hlY2soZmFsc2UsIFgoVCwgLi4uc3VicykpO1xuICByZXR1cm4gcmVqZWN0O1xufTskaM2PX29uY2UuQ1goQ1gpO1xuaGFyZGVuKENYKTtcblxuLyoqXG4gKiBWZXJpZmllcyB0aGUgcHJlc2VuY2UgYW5kIGVudW1lcmFiaWxpdHkgb2YgYW4gb3duIGRhdGEgcHJvcGVydHlcbiAqIGFuZCByZXR1cm5zIGl0cyBkZXNjcmlwdG9yLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEJlRW51bWVyYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfVxuICovXG4gICAgICAgY29uc3QgZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcHJvcE5hbWUsXG4gIHNob3VsZEJlRW51bWVyYWJsZSxcbiAgY2hlY2ssXG4pID0+IHtcbiAgY29uc3QgZGVzYyA9IC8qKiBAdHlwZSB7UHJvcGVydHlEZXNjcmlwdG9yfSAqLyAoXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgcHJvcE5hbWUpXG4gICk7XG4gIHJldHVybiAoZGVzYyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYCR7cShwcm9wTmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoaGFzT3duKGRlc2MsICd2YWx1ZScpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKHNob3VsZEJlRW51bWVyYWJsZVxuICAgICAgPyBkZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKVxuICAgICAgOiAhZGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKVxuICAgID8gZGVzY1xuICAgIDogLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh1bmRlZmluZWQpKTtcbn07JGjNj19vbmNlLmdldE93bkRhdGFEZXNjcmlwdG9yKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcbmhhcmRlbihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBUXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZWQ8YW55LCBUPn0gdGFnUmVjb3JkXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IGdldFRhZyA9IHRhZ1JlY29yZCA9PiB0YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaM2PX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuICAgICAgIGNvbnN0IGNoZWNrUGFzc1N0eWxlID0gKG9iaiwgcGFzc1N0eWxlLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICBwYXNzU3R5bGUgPT09IGV4cGVjdGVkUGFzc1N0eWxlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShwYXNzU3R5bGUpfTogJHtvYmp9YClcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZCA9IGNoZWNrUHJvdG8gPT4ge1xuICAvKipcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlZDxhbnksIGFueT59IHRhZ1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGV9IGV4cGVjdGVkUGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrVGFnUmVjb3JkID0gKHRhZ1JlY29yZCwgZXhwZWN0ZWRQYXNzU3R5bGUsIGNoZWNrKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICghaXNQcmltaXRpdmUodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIChpc0Zyb3plbih0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoIWlzQXJyYXkodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUGFzc1N0eWxlKFxuICAgICAgICB0YWdSZWNvcmQsXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgUEFTU19TVFlMRSwgZmFsc2UsIGNoZWNrKS52YWx1ZSxcbiAgICAgICAgZXhwZWN0ZWRQYXNzU3R5bGUsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKSAmJlxuICAgICAgKHR5cGVvZiBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFN5bWJvbC50b1N0cmluZ1RhZywgZmFsc2UsIGNoZWNrKVxuICAgICAgICAudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Byb3RvKHRhZ1JlY29yZCwgZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSwgY2hlY2spXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG59O1xuXG4gICAgICAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKSxcbik7JGjNj19vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbiAgICAgICBjb25zdCBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgKHByb3RvICE9PSBudWxsICYmIGdldFByb3RvdHlwZU9mKHByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWAsXG4gICAgICApKSxcbik7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNQcmltaXRpdmUiOlsiaXNQcmltaXRpdmUiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACYCjrdiPwAAYj8AACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2J5dGVBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vdGFnZ2VkLmpzIiwiLi9lcnJvci5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyIsIi4vc3RyaW5nLmpzIl0sImV4cG9ydHMiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJwYXNzU3R5bGVPZiIsInRvUGFzc2FibGVFcnJvciIsInRvVGhyb3dhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaXNQcm9taXNlLFgsRmFpbCxxLGFubm90YXRlRXJyb3IsbWFrZUVycm9yLGlzUHJpbWl0aXZlLGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLGFzc2VydENoZWNrZXIsQ29weUFycmF5SGVscGVyLEJ5dGVBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsWyRozY9fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vYnl0ZUFycmF5LmpzXCIsIFtbXCJCeXRlQXJyYXlIZWxwZXJcIixbJGjNj19hID0+IChCeXRlQXJyYXlIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIixbJGjNj19hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLFskaM2PX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsWyRozY9fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2NcIixbJGjNj19hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIixbJGjNj19hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vc3RyaW5nLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN0cmluZ1wiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3RyaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge0NvcHlBcnJheSwgQ29weVJlY29yZCwgQ29weVRhZ2dlZCwgUGFzc2FibGV9IGZyb20gJy4vdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge1Bhc3NTdHlsZU9mfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzRnJvemVuLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj59IEhlbHBlcnNSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtIZWxwZXJzUmVjb3JkfVxuICovXG5jb25zdCBtYWtlSGVscGVyVGFibGUgPSBwYXNzU3R5bGVIZWxwZXJzID0+IHtcbiAgY29uc3QgSGVscGVyVGFibGUgPSB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGNvcHlBcnJheTogdW5kZWZpbmVkLFxuICAgIGJ5dGVBcnJheTogdW5kZWZpbmVkLFxuICAgIGNvcHlSZWNvcmQ6IHVuZGVmaW5lZCxcbiAgICB0YWdnZWQ6IHVuZGVmaW5lZCxcbiAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgIHJlbW90YWJsZTogdW5kZWZpbmVkLFxuICB9O1xuICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgY29uc3QgeyBzdHlsZU5hbWUgfSA9IGhlbHBlcjtcbiAgICBzdHlsZU5hbWUgaW4gSGVscGVyVGFibGUgfHwgRmFpbGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gPSBoZWxwZXI7XG4gIH1cbiAgZm9yIChjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpIHtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gIH1cblxuICByZXR1cm4gLyoqIEB0eXBlIHtIZWxwZXJzUmVjb3JkfSAqLyAoXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoaGFyZGVuKEhlbHBlclRhYmxlKSlcbiAgKTtcbn07XG5cbi8qKlxuICogVGhlIGBhc3NlcnRSZXN0VmFsaWRgIGFzc3VtZXMgdGhhdCB0aGUgYGNhbkJlVmFsaWRgIGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAqIENvbnRleHRzIHdoZXJlIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCBzaG91bGQgY2FsbCBgYXNzZXJ0VmFsaWRgIGluc3RlYWQsXG4gKiB3aGljaCBjaGVja3MgYm90aCBjb25kaXRpb25zIGluIHRoZSByaWdodCBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcn0gaGVscGVyXG4gKiBAcGFyYW0ge2FueX0gY2FuZGlkYXRlXG4gKiBAcGFyYW0geyh2YWw6IGFueSkgPT4gUGFzc1N0eWxlfSBwYXNzU3R5bGVPZlJlY3VyXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0VmFsaWQgPSAoaGVscGVyLCBjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgaGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKTtcbiAgaGVscGVyLmFzc2VydFJlc3RWYWxpZChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzIFRoZSBwYXNzU3R5bGVIZWxwZXJzIHRvIHJlZ2lzdGVyLFxuICogaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBOT1RFIFRoZXNlIG11c3QgYWxsIGJlIFwidHJ1c3RlZFwiLFxuICogY29tcGxldGUsIGFuZCBub24tY29sbGlkaW5nLiBgbWFrZVBhc3NTdHlsZU9mYCBtYXkgKmFzc3VtZSogdGhhdCBlYWNoIGhlbHBlclxuICogZG9lcyB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiBgbWFrZVBhc3NTdHlsZU9mYCBpcyBub3QgdHJ5aW5nIHRvIGRlZmVuZFxuICogaXRzZWxmIGFnYWluc3QgbWFsaWNpb3VzIGhlbHBlcnMsIHRob3VnaCBpdCBkb2VzIGRlZmVuZCBhZ2FpbnN0IHNvbWVcbiAqIGFjY2lkZW50cy5cbiAqIEByZXR1cm5zIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgbWFrZVBhc3NTdHlsZU9mID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIGNvbnN0IEhlbHBlclRhYmxlID0gbWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuICBjb25zdCByZW1vdGFibGVIZWxwZXIgPSBIZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbiAgLyoqXG4gKiBQdXJlbHkgZm9yIHBlcmZvcm1hbmNlLiBIb3dldmVyIGl0IGlzIG11dGFibGUgc3RhdGljIHN0YXRlLCBhbmRcbiAqIGl0IGRvZXMgaGF2ZSBzb21lIG9ic2VydmFiaWxpdHkgb24gcHJveGllcy4gVE9ETyBuZWVkIHRvIGFzc2Vzc1xuICogd2hldGhlciB0aGlzIGNyZWF0ZXMgYSBzdGF0aWMgY29tbXVuaWNhdGlvbnMgY2hhbm5lbC5cbiAqXG4gKiBwYXNzU3R5bGVPZiBkb2VzIGEgZnVsbCByZWN1cnNpdmUgd2FsayBvZiBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhleSBhcmUgYWN5Y2xpYy4gSW4gYWRkaXRpb25cbiAqIGl0IGlzIHVzZWQgYnkgb3RoZXIgYWxnb3JpdGhtcyB0byByZWN1cnNpdmVseSB3YWxrIHRoZXNlIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgc28gd2l0aG91dCB0aGlzIGNhY2hlLCB0aGVzZSBhbGdvcml0aG1zIGNvdWxkIGJlXG4gKiBPKE4qKjIpIG9yIHdvcnNlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwPFdlYWtLZXksIFBhc3NTdHlsZT59XG4gKi9cbiAgY29uc3QgcGFzc1N0eWxlTWVtbyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgY29uc3QgcGFzc1N0eWxlT2YgPSBwYXNzYWJsZSA9PiB7XG4gICAgLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4gICAgLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4gICAgLyogdHJhZGVvZmZzLiovXG4gICAgY29uc3QgaW5Qcm9ncmVzcyA9IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IHBhc3NTdHlsZU9mUmVjdXIgPSBpbm5lciA9PiB7XG4gICAgICBjb25zdCBpbm5lcklzT2JqZWN0ID0gIWlzUHJpbWl0aXZlKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGlubmVyU3R5bGUgPSBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gICAgICAgIGlmIChpbm5lclN0eWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGlubmVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgIWluUHJvZ3Jlc3MuaGFzKGlubmVyKSB8fFxuICAgICAgICAgIEZhaWxgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG4gICAgICAgIGluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIHBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLCBwYXNzU3R5bGUpO1xuICAgICAgICBpblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZkludGVybmFsID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgdHlwZXN0ciA9IHR5cGVvZiBpbm5lcjtcbiAgICAgIHN3aXRjaCAodHlwZXN0cikge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIHJldHVybiB0eXBlc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgICBpZiAoaW5uZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNGcm96ZW4oaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbiAgICAgICAgICAgICAgLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuICAgICAgICAgICAgICBpc1R5cGVkQXJyYXkoaW5uZXIpXG4gICAgICAgICAgICAgICAgPyBYYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYFxuICAgICAgICAgICAgICAgIDogWGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1Byb21pc2UoaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnRTYWZlUHJvbWlzZShpbm5lcik7XG4gICAgICAgICAgICByZXR1cm4gJ3Byb21pc2UnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGNvbnN0IHBhc3NTdHlsZVRhZyA9IGlubmVyW1BBU1NfU1RZTEVdO1xuICAgICAgICAgIGlmIChwYXNzU3R5bGVUYWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihwYXNzU3R5bGVUYWcsICdzdHJpbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGhlbHBlciA9IEhlbHBlclRhYmxlW3Bhc3NTdHlsZVRhZ107XG4gICAgICAgICAgICBoZWxwZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICBGYWlsYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZChoZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICAgIHJldHVybiAvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi8gKHBhc3NTdHlsZVRhZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICAgICAgICAgIGlmIChoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpIHtcbiAgICAgICAgICAgICAgaGVscGVyLmFzc2VydFJlc3RWYWxpZChpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICAgIHJldHVybiBoZWxwZXIuc3R5bGVOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NlcnRWYWxpZChyZW1vdGFibGVIZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICByZXR1cm4gJ3JlbW90YWJsZSc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOiB7XG4gICAgICAgICAgaXNGcm96ZW4oaW5uZXIpIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xuICAgICAgICAgIHR5cGVvZiBpbm5lci50aGVuICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChYYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsIFR5cGVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbn07XG5cbiAgICAgICBjb25zdCBQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCA9IFN5bWJvbC5mb3IoJ0BlbmRvIHBhc3NTdHlsZU9mJyk7XG5cbi8qKlxuICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIHByb3BlcnR5IG9uIHRoZSBnbG9iYWwsXG4gKiB0aGVuIHByZXN1bWFibHkgaXQgd2FzIGVuZG93ZWQgZm9yIHVzIGJ5IGxpdmVzbG90cyB3aXRoIGEgYHBhc3NTdHlsZU9mYFxuICogZnVuY3Rpb24sIHNvIHdlIHNob3VsZCB1c2UgYW5kIGV4cG9ydCB0aGF0IG9uZSBpbnN0ZWFkLlxuICogT3RoZXIgc29mdHdhcmUgbWF5IGhhdmUgbGVmdCBpdCBmb3IgdXMgaGVyZSxcbiAqIGJ1dCBpdCB3b3VsZCByZXF1aXJlIHdyaXRlIGFjY2VzcyB0byBvdXIgZ2xvYmFsLCBvciB0aGUgYWJpbGl0eSB0b1xuICogcHJvdmlkZSBlbmRvd21lbnRzIHRvIG91ciBnbG9iYWwsIGJvdGggb2Ygd2hpY2ggc2VlbXMgYWRlcXVhdGUgYXMgYSB0ZXN0IG9mXG4gKiB3aGV0aGVyIGl0IGlzIGF1dGhvcml6ZWQgdG8gc2VydmUgdGhlIHNhbWUgcm9sZSBhcyBsaXZlc2xvdHMuXG4gKlxuICogTk9URSBIQVpBUkQ6IFRoaXMgdXNlIGJ5IGxpdmVzbG90cyBkb2VzIHJlbHkgb24gYHBhc3NTdHlsZU9mYCBiZWluZ1xuICogZGV0ZXJtaW5pc3RpYy4gSWYgaXQgaXMgbm90LCB0aGVuIGluIGEgbGl2ZXNsb3QtbGlrZSB2aXJ0dWFsaXplZFxuICogZW52aXJvbm1lbnQsIGl0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCBHQy5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi8kaM2PX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZU9mID1cbiAgKGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF0pIHx8XG4gIG1ha2VQYXNzU3R5bGVPZihbXG4gICAgQ29weUFycmF5SGVscGVyLFxuICAgIEJ5dGVBcnJheUhlbHBlcixcbiAgICBDb3B5UmVjb3JkSGVscGVyLFxuICAgIFRhZ2dlZEhlbHBlcixcbiAgICBFcnJvckhlbHBlcixcbiAgICBSZW1vdGFibGVIZWxwZXIsXG4gIF0pOyRozY9fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZSA9IHZhbCA9PiB7XG4gIHBhc3NTdHlsZU9mKHZhbCk7IC8qIHRocm93cyBpZiB2YWwgaXMgbm90IGEgcGFzc2FibGUqL1xufTskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcblxuLyoqXG4gKiBJcyBgc3BlY2ltZW5gIFBhc3NhYmxlPyBUaGlzIHJldHVybnMgdHJ1ZSBpZmYgYHBhc3NTdHlsZU9mKHNwZWNpbWVuKWBcbiAqIHJldHVybnMgYSBzdHJpbmcuIFRoaXMgcmV0dXJucyBgZmFsc2VgIGlmZiBgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pYCB0aHJvd3MuXG4gKiBVbmRlciBubyBub3JtYWwgY2lyY3Vtc3RhbmNlIHNob3VsZCBgaXNQYXNzYWJsZShzcGVjaW1lbilgIHRocm93LlxuICpcbiAqIFRPRE8gRGVwcmVjYXRlIGFuZCB1bHRpbWF0ZWx5IGRlbGV0ZSBAYWdvcmljL2Jhc2Utem9uZSdzIGBpc1Bhc3NhYmxlJyBpblxuICogZmF2b3Igb2YgdGhpcyBvbmUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yMDk2XG4gKlxuICogVE9ETyBpbXBsZW1lbnQgYW4gaXNQYXNzYWJsZSB0aGF0IGRvZXMgbm90IHJlbHkgb24gdHJ5L2NhdGNoLlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGEgc3RhbmRpbiB1bnRpbCB0aGVuLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjA5NlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIFBhc3NhYmxlfVxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgdHJ5IHtcbiAgICAvKiBJbiBmYWN0LCBpdCBuZXZlciByZXR1cm5zIHVuZGVmaW5lZC4gSXQgZWl0aGVyIHJldHVybnMgYSovXG4gICAgLyogc3RyaW5nIG9yIHRocm93cy4qL1xuICAgIHJldHVybiBwYXNzU3R5bGVPZihzcGVjaW1lbikgIT09IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTskaM2PX29uY2UuaXNQYXNzYWJsZShpc1Bhc3NhYmxlKTtcbmhhcmRlbihpc1Bhc3NhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eURlc2NyaXB0b3J9IGRlc2NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAobmFtZSwgZGVzYykgPT5cbiAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MobmFtZSwgZGVzYywgcGFzc1N0eWxlT2YpO1xuXG4vKipcbiAqIEFmdGVyIGhhcmRlbmluZywgaWYgYGVycmAgaXMgYSBwYXNzYWJsZSBlcnJvciwgcmV0dXJuIGl0LlxuICpcbiAqIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpY1xuICogaW5mbyBvZiB0aGUgb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBUT0RPIEFkb3B0IGEgbW9yZSBmbGV4aWJsZSBub3Rpb24gb2YgcGFzc2FibGUgZXJyb3IsIGluIHdoaWNoXG4gKiBhIHBhc3NhYmxlIGVycm9yIGNhbiBjb250YWluIG90aGVyIG93biBkYXRhIHByb3BlcnRpZXMgd2l0aFxuICogdGhyb3dhYmxlIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuICAgICAgIGNvbnN0IHRvUGFzc2FibGVFcnJvciA9IGVyciA9PiB7XG4gIGhhcmRlbihlcnIpO1xuICBpZiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLCBwYXNzU3R5bGVPZikpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9XG4gIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gZXJyO1xuICBjb25zdCB7IGNhdXNlOiBjYXVzZURlc2MsIGVycm9yczogZXJyb3JzRGVzYyB9ID1cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGVycik7XG4gIGxldCBjYXVzZTtcbiAgbGV0IGVycm9ycztcbiAgaWYgKGNhdXNlRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2NhdXNlJywgY2F1c2VEZXNjKSkge1xuICAgIGNhdXNlID0gY2F1c2VEZXNjLnZhbHVlO1xuICB9XG4gIGlmIChlcnJvcnNEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnZXJyb3JzJywgZXJyb3JzRGVzYykpIHtcbiAgICBlcnJvcnMgPSBlcnJvcnNEZXNjLnZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGAke25hbWV9YCkgfHwgRXJyb3I7XG4gIGNvbnN0IG5ld0Vycm9yID0gbWFrZUVycm9yKGAke21lc3NhZ2V9YCwgZXJyQ29uc3RydWN0b3IsIHtcbiAgICAvKiBAdHMtaWdub3JlIEFzc3VtaW5nIGNhdXNlIGlzIEVycm9yIHwgdW5kZWZpbmVkKi9cbiAgICBjYXVzZSxcbiAgICBlcnJvcnMsXG4gIH0pO1xuICAvKiBTdGlsbCBuZWVkZWQsIGJlY2F1c2UgYG1ha2VFcnJvcmAgb25seSBkb2VzIGEgc2hhbGxvdyBmcmVlemUuKi9cbiAgaGFyZGVuKG5ld0Vycm9yKTtcbiAgLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuICAvKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuICAvKiB0byBiZSBsb2dnZWQuKi9cbiAgYW5ub3RhdGVFcnJvcihuZXdFcnJvciwgWGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbiAgcGFzc1N0eWxlT2YobmV3RXJyb3IpID09PSAnZXJyb3InIHx8XG4gICAgRmFpbGBFeHBlY3RlZCAke25ld0Vycm9yfSB0byBiZSBhIHBhc3NhYmxlIGVycm9yYDtcbiAgcmV0dXJuIG5ld0Vycm9yO1xufTskaM2PX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcblxuLyoqXG4gKiBBZnRlciBoYXJkZW5pbmcsIGlmIGBzcGVjaW1lbmAgaXMgdGhyb3dhYmxlLCByZXR1cm4gaXQuXG4gKiBBIHNwZWNpbWVuIGlzIHRocm93YWJsZSBpZmYgaXQgaXMgUGFzc2FibGUgYW5kIGNvbnRhaW5zIG5vIFBhc3NhYmxlQ2FwcyxcbiAqIGkuZS4sIG5vIFJlbW90YWJsZXMgb3IgUHJvbWlzZXMuXG4gKiBJT1csIGlmIGl0IGNvbnRhaW5zIG9ubHkgY29weS1kYXRhIGFuZCBwYXNzYWJsZSBlcnJvcnMuXG4gKlxuICogT3RoZXJ3aXNlLCBpZiBgc3BlY2ltZW5gIGlzICphbG1vc3QqIHRocm93YWJsZSwgZm9yIGV4YW1wbGUsIGl0IGlzXG4gKiBhbiBlcnJvciB0aGF0IGNhbiBiZSBtYWRlIHRocm93YWJsZSBieSBgdG9QYXNzYWJsZUVycm9yYCwgdGhlblxuICogcmV0dXJuIGBzcGVjaW1lbmAgY29udmVydGVkIHRvIGEgdGhyb3dhYmxlLlxuICpcbiAqIE90aGVyd2lzZSwgdGhyb3cgYSBkaWFnbm9zdGljIGluZGljYXRpbmcgYSBmYWlsdXJlIHRvIGNvZXJjZS5cbiAqXG4gKiBUaGlzIGlzIGluIHN1cHBvcnQgb2YgdGhlIGV4byBib3VuZGFyeSB0aHJvd2luZyBvbmx5IHRocm93YWJsZXMsIHRvIGVhc2VcbiAqIHNlY3VyaXR5IHJldmlldy5cbiAqXG4gKiBUT0RPIEFkb3B0IGEgbW9yZSBmbGV4aXRibGUgbm90aW9uIG9mIHRocm93YWJsZSwgaW4gd2hpY2hcbiAqIGRhdGEgY29udGFpbmVycyBjb250YWluaW5nIG5vbi1wYXNzYWJsZSBlcnJvcnMgY2FuIHRoZW1zZWx2ZXMgYmUgY29lcmNlZFxuICogdG8gdGhyb3dhYmxlIGJ5IGNvZXJjaW5nIHRvIGEgc2ltaWxhciBjb250YWluZXJzIGNvbnRhaW5pbmdcbiAqIHRoZSByZXN1bHRzIG9mIGNvZXJjaW5nIHRob3NlIGVycm9ycyB0byBwYXNzYWJsZSBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHJldHVybnMge1Bhc3NhYmxlPG5ldmVyLCBFcnJvcj59XG4gKi9cbiAgICAgICBjb25zdCB0b1Rocm93YWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgaGFyZGVuKHNwZWNpbWVuKTtcbiAgaWYgKGlzRXJyb3JMaWtlKHNwZWNpbWVuKSkge1xuICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IoLyoqIEB0eXBlIHtFcnJvcn0gKi8gKHNwZWNpbWVuKSk7XG4gIH1cbiAgaWYgKCFpc1ByaW1pdGl2ZShzcGVjaW1lbikpIHtcbiAgICAvKiBOb3RlIHRoYXQgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiBgc3BlY2ltZW5gIHdvdWxkIGJlIGEgcGFzc2FibGUgY29udGFpbmVyKi9cbiAgICAvKiBleGNlcHQgdGhhdCBpdCBjb250YWlucyBub24tcGFzc2FibGUgZXJyb3JzIHRoYXQgY291bGQgYmUgY29udmVydGVkLiovXG4gICAgLyogVGhpcyB3aWxsIG5lZWQgdG8gYmUgZml4ZWQgdG8gZG8gdGhlIFRPRE8gYWJvdmUuKi9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSAvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi8gKHBhc3NTdHlsZU9mKHNwZWNpbWVuKSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAvKiogQHR5cGUge0NvcHlBcnJheX0gKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgZWxlbWVudCA9PT0gdG9UaHJvd2FibGUoZWxlbWVudCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZWxlbWVudH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgY29uc3QgcmVjID0gLyoqIEB0eXBlIHtDb3B5UmVjb3JkfSAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMocmVjKSkge1xuICAgICAgICAgIHZhbCA9PT0gdG9UaHJvd2FibGUodmFsKSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHt2YWx9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGcgPSAvKiogQHR5cGUge0NvcHlUYWdnZWR9ICovIChzcGVjaW1lbik7XG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gdGc7XG4gICAgICAgIHBheWxvYWQgPT09IHRvVGhyb3dhYmxlKHBheWxvYWQpIHx8XG4gICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtwYXlsb2FkfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVyID0gLyoqIEB0eXBlIHtFcnJvcn0gKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZXIgPT09IHRvVGhyb3dhYmxlKGVyKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZXJ9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgQSAke3EocGFzc1N0eWxlKX0gaXMgbm90IHRocm93YWJsZTogJHtzcGVjaW1lbn1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLyoqIEB0eXBlIHtQYXNzYWJsZTxuZXZlcixuZXZlcj59ICovIChzcGVjaW1lbik7XG59OyRozY9fb25jZS50b1Rocm93YWJsZSh0b1Rocm93YWJsZSk7XG5oYXJkZW4odG9UaHJvd2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXSwiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXSwidG9UaHJvd2FibGUiOlsidG9UaHJvd2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+5yfsjAuAAAwLgAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImNhbkJlTWV0aG9kIiwiZ2V0SW50ZXJmYWNlT2YiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxnZXRNZXRob2ROYW1lcyxhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc1ByaW1pdGl2ZSxnZXRUYWcsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q2hlY2tlciwgUmVtb3RhYmxlTWV0aG9kTmFtZX0gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0ludGVyZmFjZVNwZWMsIFBhc3NTdHlsZWR9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVPYmplY3R9IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuLyoqXG4gKiBGb3IgYSBmdW5jdGlvbiB0byBiZSBhIHZhbGlkIG1ldGhvZCwgaXQgbXVzdCBub3QgYmUgcGFzc2FibGUuXG4gKiBPdGhlcndpc2UsIHdlIHJpc2sgY29uZnVzaW5nIHBhc3MtYnktY29weSBkYXRhIGNhcnJ5aW5nXG4gKiBmYXIgZnVuY3Rpb25zIHdpdGggYXR0ZW1wdHMgYXQgZmFyIG9iamVjdHMgd2l0aCBtZXRob2RzLlxuICpcbiAqIFRPRE8gSEFaQVJEIEJlY2F1c2Ugd2UgY2hlY2sgdGhpcyBvbiB0aGUgd2F5IHRvIGhhcmRlbmluZyBhIHJlbW90YWJsZSxcbiAqIHdlIGNhbm5vdCB5ZXQgY2hlY2sgdGhhdCBgZnVuY2AgaXMgaGFyZGVuZWQuIEhvd2V2ZXIsIHdpdGhvdXRcbiAqIGRvaW5nIHNvLCBpdCdzIGluaGVyaXRhbmNlIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgYFBBU1NfU1RZTEVgXG4gKiBjaGVjayBiZWxvdy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gZnVuY1xuICogQHJldHVybnMge2Z1bmMgaXMgQ2FsbGFibGVGdW5jdGlvbn1cbiAqL1xuICAgICAgIGNvbnN0IGNhbkJlTWV0aG9kID0gZnVuYyA9PlxuICB0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJyAmJiAhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjNj19vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yODg0Ki9cbi8qIEFic3RyYWN0IG91dCBjYW5CZU1ldGhvZE5hbWUgc28gbGF0ZXIgUFJzIGFncmVlIG9uIG1ldGhvZCBuYW1lIHJlc3RyaWN0aW9ucy4qL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBrZXlcbiAqIEByZXR1cm5zIHtrZXkgaXMgUmVtb3RhYmxlTWV0aG9kTmFtZX1cbiAqL1xuY29uc3QgY2FuQmVNZXRob2ROYW1lID0ga2V5ID0+XG4gIC8qIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBrZXkgPT09ICdzeW1ib2wnOyovXG4gIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBrZXkgPT09ICdzeW1ib2wnIHx8IHR5cGVvZiBrZXkgPT09ICdudW1iZXInO1xuaGFyZGVuKGNhbkJlTWV0aG9kTmFtZSk7XG5cbi8qKlxuICogVXNlcyB0aGUgYGdldE1ldGhvZE5hbWVzYCBmcm9tIHRoZSBldmVudHVhbC1zZW5kIGxldmVsIG9mIGFic3RyYWN0aW9uIHRoYXRcbiAqIGRvZXMgbm90IGtub3cgYW55dGhpbmcgYWJvdXQgcmVtb3RhYmxlcy5cbiAqXG4gKiBDdXJyZW50bHksIGp1c3QgYWxpYXMgYGdldE1ldGhvZE5hbWVzYCBidXQgdGhpcyBhYnN0cmFjdGlvbiBleGlzdHMgc29cbiAqIGEgZnV0dXJlIFBSIGNhbiBlbmZvcmNlIHJlc3RyaWN0aW9ucyBvbiBtZXRob2QgbmFtZXMgb2YgcmVtb3RhYmxlcy5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHJldHVybnMge1JlbW90YWJsZU1ldGhvZE5hbWVbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldFJlbW90YWJsZU1ldGhvZE5hbWVzID0gYmVoYXZpb3JNZXRob2RzID0+XG4gIGdldE1ldGhvZE5hbWVzKGJlaGF2aW9yTWV0aG9kcyk7JGjNj19vbmNlLmdldFJlbW90YWJsZU1ldGhvZE5hbWVzKGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRSZW1vdGFibGVNZXRob2ROYW1lcyk7XG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldFByb3RvdHlwZU9mLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGhhc093bixcbn0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2UgPSAoaWZhY2UsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4gICAgKHR5cGVvZiBpZmFjZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpICYmXG4gICAgKGlmYWNlID09PSAnUmVtb3RhYmxlJyB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJykgfHxcbiAgICAgIGlmYWNlLnN0YXJ0c1dpdGgoJ0RlYnVnTmFtZTogJykgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKGNoZWNrKWBGb3Igbm93LCBpZmFjZSAke3EoXG4gICAgICAgICAgaWZhY2UsXG4gICAgICAgICl9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpXG4gICk7XG59O1xuXG4vKipcbiAqIEFuIGBpZmFjZWAgbXVzdCBiZSBwdXJlLiBSaWdodCBub3cgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hpY2ggaXMgcHVyZS5cbiAqIExhdGVyIHdlIGV4cGVjdCB0byBpbmNsdWRlIHNvbWUgb3RoZXIgdmFsdWVzIHRoYXQgcXVhbGlmeSBhcyBgUHVyZURhdGFgLFxuICogd2hpY2ggaXMgYSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgZW5kaW5nIG9ubHkgaW4gcHJpbWl0aXZlcyBvclxuICogZW1wdHkgcGFzcy1ieS1jb3B5IGNvbXBvc2l0ZXMuIE5vIHJlbW90YWJsZXMsIHByb21pc2VzLCBvciBlcnJvcnMuXG4gKiBXZSAqYXNzdW1lKiBmb3Igbm93IHRoYXQgdGhlIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBjb250YWlucyBub1xuICogcHJveGllcy5cbiAqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRJZmFjZSA9IGlmYWNlID0+IGNoZWNrSWZhY2UoaWZhY2UsIGFzc2VydENoZWNrZXIpOyRozY9fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2YgPSAob3JpZ2luYWwsIGNoZWNrKSA9PiB7XG4gICFpc1ByaW1pdGl2ZShvcmlnaW5hbCkgfHxcbiAgICBGYWlsYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4gIC8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuICAvKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4gIC8qIGEgYFBBU1NfU1RZTEVgIHByb3BlcnR5IHdpdGggdmFsdWUgXCJyZW1vdGFibGVcIiBhbmQgYSBzdWl0YWJsZSBgU3ltYm9sLnRvU3RyaW5nVGFnYCovXG4gIC8qIHByb3BlcnR5LiBUaGUgcmVtb3RhYmxlIGNvdWxkIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZCwgb3IqL1xuICAvKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4gIC8qIGluaGVyaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZC4qL1xuICAvKiovXG4gIC8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuICAvKiB3aXRoIFBBU1NfU1RZTEUgZnJvbSBKU0RvYy4qL1xuICAvKiovXG4gIC8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4gIC8qIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcsKi9cbiAgLyogfX0qL1xuICAvKiovXG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuICBpZiAoXG4gICAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgIHByb3RvID09PSBudWxsIHx8XG4gICAgcHJvdG8gPT09IEZ1bmN0aW9uLnByb3RvdHlwZVxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBwcm90b1Byb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIGlmIChwcm90b1Byb3RvICE9PSBvYmplY3RQcm90b3R5cGUgJiYgcHJvdG9Qcm90byAhPT0gbnVsbCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBjaGVja1JlbW90YWJsZShwcm90bywgY2hlY2spO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICghY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4gIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFBBU1NfU1RZTEUpO1xuICBjb25zdCB0YWdLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICBjb25zdCB7XG4gICAgLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhc3NTdHlsZUtleSldOiBfcGFzc1N0eWxlRGVzYyxcbiAgICBbLyoqIEB0eXBlIHtzdHJpbmd9ICovICh0YWdLZXkpXTogeyB2YWx1ZTogaWZhY2UgfSxcbiAgICAuLi5yZXN0RGVzY3NcbiAgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG4gIHJldHVybiAoXG4gICAgKG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3REZXNjcyl9YCkpICYmXG4gICAgY2hlY2tJZmFjZShpZmFjZSwgY2hlY2spXG4gICk7XG59O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZU9iamVjdD59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXMgPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge3ZhbCBpcyBSZW1vdGFibGVPYmplY3R9XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzRnJvemVuKHZhbCkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJiBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gXG4gICAgKTtcbiAgfVxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICBpZiAoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCwgY2hlY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogU2ltcGxlIHNlbWFudGljcywganVzdCB0ZWxsIHdoYXQgaW50ZXJmYWNlIHNwZWMgYSBSZW1vdGFibGUgaGFzLFxuICogb3IgdW5kZWZpbmVkIGlmIG5vdCBkZWVtZWQgdG8gYmUgYSBSZW1vdGFibGUuXG4gKlxuICogQHR5cGUge3tcbiAqIDxUIGV4dGVuZHMgc3RyaW5nPih2YWw6IFBhc3NTdHlsZWQ8YW55LCBUPik6IFQ7XG4gKiAodmFsOiBhbnkpOiBJbnRlcmZhY2VTcGVjIHwgdW5kZWZpbmVkO1xuICogfX1cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZU9mID0gdmFsID0+IHtcbiAgaWYgKFxuICAgIGlzUHJpbWl0aXZlKHZhbCkgfHxcbiAgICB2YWxbUEFTU19TVFlMRV0gIT09ICdyZW1vdGFibGUnIHx8XG4gICAgIWNoZWNrUmVtb3RhYmxlKHZhbClcbiAgKSB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgcmV0dXJuIGdldFRhZyh2YWwpO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IFJlbW90YWJsZUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ3JlbW90YWJsZScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCB2YWxpZFR5cGUgPVxuICAgICAgKCFpc1ByaW1pdGl2ZShjYW5kaWRhdGUpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgKCFpc0FycmF5KGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbiAgICAgIC8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG4gICAgICByZXR1cm4gb3duS2V5cyhkZXNjcykuZXZlcnkoa2V5ID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvKiBUeXBlY2FzdCBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4gICAgICAgICAgKGhhc093bihkZXNjc1svKiogQHR5cGUge3N0cmluZ30gKi8gKGtleSldLCAndmFsdWUnKSB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgKChrZXkgPT09IFN5bWJvbC50b1N0cmluZ1RhZyAmJiBjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLCBjaGVjaykpIHx8XG4gICAgICAgICAgICAoKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKSB8fFxuICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgICAoa2V5ICE9PSBQQVNTX1NUWUxFIHx8XG4gICAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICAgIENYKGNoZWNrKWBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8qIEZhciBmdW5jdGlvbnMgY2Fubm90IGJlIG1ldGhvZHMsIGFuZCBjYW5ub3QgaGF2ZSBtZXRob2RzLiovXG4gICAgICAvKiBUaGV5IG11c3QgaGF2ZSBleGFjdGx5IGV4cGVjdGVkIGAubmFtZWAgYW5kIGAubGVuZ3RoYCBwcm9wZXJ0aWVzKi9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZTogbmFtZURlc2MsXG4gICAgICAgIGxlbmd0aDogbGVuZ3RoRGVzYyxcbiAgICAgICAgLyogQHRzLWlnbm9yZSBUUyBkb2Vzbid0IGxpa2Ugc3ltYm9scyBhcyBjb21wdXRlZCBpbmRleGVzPz8qL1xuICAgICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogdG9TdHJpbmdUYWdEZXNjLFxuICAgICAgICAuLi5yZXN0RGVzY3NcbiAgICAgIH0gPSBkZXNjcztcbiAgICAgIGNvbnN0IHJlc3RLZXlzID0gb3duS2V5cyhyZXN0RGVzY3MpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKChuYW1lRGVzYyAmJiB0eXBlb2YgbmFtZURlc2MudmFsdWUgPT09ICdzdHJpbmcnKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChjaGVjaylgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICgobGVuZ3RoRGVzYyAmJiB0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZSA9PT0gJ251bWJlcicpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKHRvU3RyaW5nVGFnRGVzYyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKCh0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICBjaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSwgY2hlY2spKSkgJiZcbiAgICAgICAgKHJlc3RLZXlzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhIWNoZWNrICYmIENYKGNoZWNrKWB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiBjYW5kaWRhdGUgPT4gY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKSxcblxuICBldmVyeTogKF9wYXNzYWJsZSwgX2ZuKSA9PiB0cnVlLFxufSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiOlsiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXSwiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHgA8oUhYAAFIWAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UscSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKiogQGltcG9ydCB7Q2hlY2tlcn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBpc0Zyb3plbiwgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciwgaGFzT3duIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnIH0gPSBTeW1ib2w7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlfSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cyA9IChwciwgY2hlY2spID0+IHtcbiAgY29uc3Qga2V5cyA9IG93bktleXMocHIpO1xuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gKiBUaGlzIGV4Y2x1ZGVzIHRob3NlIHN5bWJvbC1uYW1lZCBvd24gcHJvcGVydGllcyB0aGF0IGFyZSBhbHNvIGZvdW5kIG9uXG4gKiBgUHJvbWlzZS5wcm90b3R5cGVgLCBzbyB0aGF0IG92ZXJyaWRlcyBvZiB0aGVzZSBwcm9wZXJ0aWVzIGNhbiBiZVxuICogZXhwbGljaXRseSB0b2xlcmF0ZWQgaWYgdGhleSBwYXNzIHRoZSBgY2hlY2tTYWZlT3duS2V5YCBjaGVjayBiZWxvdy5cbiAqIEluIHBhcnRpY3VsYXIsIHdlIHdpc2ggdG8gdG9sZXJhdGVcbiAqICAgKiBBbiBvdmVycmlkaW5nIGB0b1N0cmluZ1RhZ2Agbm9uLWVudW1lcmFibGUgZGF0YSBwcm9wZXJ0eVxuICogICAgIHdpdGggYSBzdHJpbmcgdmFsdWUuXG4gKiAgICogVGhvc2Ugb3duIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSBhZGRlZCBieSBOb2RlJ3MgYXN5bmNfaG9va3MuXG4gKi9cbiAgY29uc3QgdW5rbm93bktleXMgPSBrZXlzLmZpbHRlcihcbiAgICBrZXkgPT4gdHlwZW9mIGtleSAhPT0gJ3N5bWJvbCcgfHwgIWhhc093bihQcm9taXNlLnByb3RvdHlwZSwga2V5KSxcbiAgKTtcblxuICBpZiAodW5rbm93bktleXMubGVuZ3RoICE9PSAwKSB7XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2ssXG4gICAgKWAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWA7XG4gIH1cblxuICAvKipcbiAqIEV4cGxpY2l0bHkgdG9sZXJhdGUgYSBgdG9TdHJpbmdUYWdgIHN5bWJvbC1uYW1lZCBub24tZW51bWVyYWJsZVxuICogZGF0YSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZy4gT3RoZXJ3aXNlLCB0b2xlcmF0ZSB0aG9zZVxuICogc3ltYm9sLW5hbWVkIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSBhZGRlZCBieSBOb2RlSlMncyBhc3luY19ob29rcyxcbiAqIGlmIHRoZXkgb2JleSB0aGUgZXhwZWN0ZWQgc2FmZXR5IHByb3BlcnRpZXMuXG4gKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiAgIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG4gIGNvbnN0IGNoZWNrU2FmZU93bktleSA9IGtleSA9PiB7XG4gICAgaWYgKGtleSA9PT0gdG9TdHJpbmdUYWcpIHtcbiAgICAgIC8qIFRPRE8gc2hvdWxkIHdlIGFsc28gZW5mb3JjZSBhbnl0aGluZyBvbiB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZywqL1xuICAgICAgLyogc3VjaCBhcyB0aGF0IGl0IG11c3Qgc3RhcnQgd2l0aCBgJ1Byb21pc2UnYD8qL1xuICAgICAgY29uc3QgdGFnRGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihwciwgdG9TdHJpbmdUYWcpO1xuICAgICAgYXNzZXJ0KHRhZ0Rlc2MgIT09IHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoaGFzT3duKHRhZ0Rlc2MsICd2YWx1ZScpIHx8XG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYE93biBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBkYXRhIHByb3BlcnR5LCBub3QgYW4gYWNjZXNzb3I6ICR7cSh0YWdEZXNjKX1gKSAmJlxuICAgICAgICAodHlwZW9mIHRhZ0Rlc2MudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYE93biBAQHRvU3RyaW5nVGFnIHZhbHVlIG11c3QgYmUgYSBzdHJpbmc6ICR7cSh0YWdEZXNjLnZhbHVlKX1gKSAmJlxuICAgICAgICAoIXRhZ0Rlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAgIENYKGNoZWNrKWBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke3EodGFnRGVzYyl9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IHByW2tleV07XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbCAhPT0gbnVsbCAmJlxuICAgICAgaXNGcm96ZW4odmFsKSAmJlxuICAgICAgZ2V0UHJvdG90eXBlT2YodmFsKSA9PT0gT2JqZWN0LnByb3RvdHlwZVxuICAgICkge1xuICAgICAgY29uc3Qgc3ViS2V5cyA9IG93bktleXModmFsKTtcbiAgICAgIGlmIChzdWJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzdWJLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBzdWJLZXlzWzBdID09PSAnZGVzdHJveWVkJyAmJlxuICAgICAgICB2YWwuZGVzdHJveWVkID09PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQ1goXG4gICAgICBjaGVjayxcbiAgICApYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuICAgICAgU3RyaW5nKGtleSksXG4gICAgKX0gaXMgJHt2YWx9YDtcbiAgfTtcblxuICByZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVPd25LZXkpO1xufTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlID0gKHByLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIChpc0Zyb3plbihwcikgfHwgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSAmJlxuICAgIChpc1Byb21pc2UocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkgJiZcbiAgICAoZ2V0UHJvdG90eXBlT2YocHIpID09PSBQcm9taXNlLnByb3RvdHlwZSB8fFxuICAgICAgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbiAgICAgICAgZ2V0UHJvdG90eXBlT2YocHIpLFxuICAgICAgKX1gKSAmJlxuICAgIGNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqLyAocHIpLCBjaGVjaylcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbiAgICAgICBjb25zdCBpc1NhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgeCA9PiB4KTskaM2PX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFNhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD8qNkH2w8AANsPAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N0cmluZy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qIGtub3cgYWJvdXRgaXNXZWxsRm9ybWVkYCovXG5jb25zdCBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kID0gISFTdHJpbmcucHJvdG90eXBlLmlzV2VsbEZvcm1lZDtcblxuLyoqXG4gKiBJcyB0aGUgYXJndW1lbnQgYSB3ZWxsLWZvcm1lZCBzdHJpbmc/XG4gKlxuICogVW5mb3J0dW5hdGVseSwgdGhlXG4gKiBbc3RhbmRhcmQgYnVpbHQtaW4gYFN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkYF0oaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXMtdXN2LXN0cmluZylcbiAqIGRvZXMgYSBUb1N0cmluZyBvbiBpdHMgaW5wdXQsIGNhdXNpbmcgaXQgdG8ganVkZ2Ugbm9uLXN0cmluZ3MgdG8gYmVcbiAqIHdlbGwtZm9ybWVkIHN0cmluZ3MgaWYgdGhleSBjb2VyY2UgdG8gYSB3ZWxsLWZvcm1lZCBzdHJpbmdzLiBUaGlzXG4gKiByZWNhcGl0dWxhdGVzIHRoZSBtaXN0YWtlIGluIGhhdmluZyB0aGUgZ2xvYmFsIGBpc05hTmAgY29lcmNlIGl0cyBpbnB1dHMsXG4gKiBjYXVzaW5nIGl0IHRvIGp1ZGdlIG5vbi1zdHJpbmcgdG8gYmUgTmFOIGlmIHRoZXkgY29lcmNlIHRvIE5hTi5cbiAqXG4gKiBUaGlzIGBpc1dlbGxGb3JtZWRTdHJpbmdgIGZ1bmN0aW9uIG9ubHkganVkZ2VzIHdlbGwtZm9ybWVkIHN0cmluZ3MgdG8gYmVcbiAqIHdlbGwtZm9ybWVkIHN0cmluZ3MuIEZvciBhbGwgbm9uLXN0cmluZ3MgaXQgcmV0dXJucyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHN0clxuICogQHJldHVybnMge3N0ciBpcyBzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBpc1dlbGxGb3JtZWRTdHJpbmcgPSBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kXG4gID8gc3RyID0+IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIHN0ci5pc1dlbGxGb3JtZWQoKVxuICA6IHN0ciA9PiB7XG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaCBvZiBzdHIpIHtcbiAgICAgICAgLyogVGhlIHN0cmluZyBpdGVyYXRvciBpdGVyYXRlcyBieSBVbmljb2RlIGNvZGUgcG9pbnQsIG5vdCovXG4gICAgICAgIC8qIFVURjE2IGNvZGUgdW5pdC4gQnV0IGlmIGl0IGVuY291bnRlcnMgYW4gdW5wYWlyZWQgc3Vycm9nYXRlLCovXG4gICAgICAgIC8qIGl0IHdpbGwgcHJvZHVjZSBpdC4qL1xuICAgICAgICBjb25zdCBjcCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2guY29kZVBvaW50QXQoMCkpO1xuICAgICAgICBpZiAoY3AgPj0gMHhkODAwICYmIGNwIDw9IDB4ZGZmZikge1xuICAgICAgICAgIC8qIEFsbCBzdXJyb2dhdGVzIGFyZSBpbiB0aGlzIHJhbmdlLiBUaGUgc3RyaW5nIGl0ZXJhdG9yIG9ubHkqL1xuICAgICAgICAgIC8qIHByb2R1Y2VzIGEgY2hhcmFjdGVyIGluIHRoaXMgcmFuZ2UgZm9yIHVucGFpcmVkIHN1cnJvZ2F0ZXMsKi9cbiAgICAgICAgICAvKiB3aGljaCBvbmx5IGhhcHBlbnMgaWYgdGhlIHN0cmluZyBpcyBub3Qgd2VsbC1mb3JtZWQuKi9cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07JGjNj19vbmNlLmlzV2VsbEZvcm1lZFN0cmluZyhpc1dlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxseSB3aGVuIGBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKWAgd291bGQgcmV0dXJuIHRydWUuXG4gKiBUaHJvd3MgYSBkaWFnbm9zdGljIGVycm9yIHdoZW4gYGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpYCB3b3VsZCByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzdHJcbiAqIEByZXR1cm5zIHthc3NlcnRzIHN0ciBpcyBzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nID0gc3RyID0+IHtcbiAgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cikgfHwgRmFpbGBFeHBlY3RlZCB3ZWxsLWZvcm1lZCB1bmljb2RlIHN0cmluZzogJHtzdHJ9YDtcbn07JGjNj19vbmNlLmFzc2VydFdlbGxGb3JtZWRTdHJpbmcoYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5cbmNvbnN0IE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSA9XG4gIGdldEVudmlyb25tZW50T3B0aW9uKCdPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUnLCAnZGlzYWJsZWQnLCBbXG4gICAgJ2VuYWJsZWQnLFxuICBdKSA9PT0gJ2VuYWJsZWQnO1xuXG4vKipcbiAqIEZvciBub3csXG4gKiBpZiBgT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFYCBlbnZpcm9ubWVudCBvcHRpb24gaXMgYCdlbmFibGVkJ2AsXG4gKiB0aGVuIGBhc3NlcnRQYXNzYWJsZVN0cmluZ2AgaXMgdGhlIHNhbWUgYXMgYGFzc2VydFdlbGxGb3JtZWRTdHJpbmdgLlxuICogT3RoZXJ3aXNlIGBhc3NlcnRQYXNzYWJsZVN0cmluZ2AganVzdCBhc3NlcnRzIHRoYXQgYHN0cmAgaXMgYSBzdHJpbmcuXG4gKlxuICogQ3VycmVudGx5LCBgT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFYCBkZWZhdWx0cyB0byBgJ2Rpc2FibGVkJ2BcbiAqIGJlY2F1c2Ugd2UgZG8gbm90IHlldCBrbm93IHRoZSBwZXJmb3JtYW5jZSBpbXBhY3QuIExhdGVyLCBpZiB3ZSBkZWNpZGUgd2VcbiAqIGNhbiBhZmZvcmQgaXQsIHdlJ2xsIGZpcnN0IGNoYW5nZSB0aGUgZGVmYXVsdCB0byBgJ2VuYWJsZWQnYCBhbmQgdWx0aW1hdGVseVxuICogcmVtb3ZlIHRoZSBzd2l0Y2ggYWx0b2dldGhlci4gQmUgcHJlcGFyZWQgZm9yIHRoZXNlIGNoYW5nZXMuXG4gKlxuICogVE9ETyBvbmNlIHRoZSBzd2l0Y2ggaXMgcmVtb3ZlZCwgc2ltcGxpZnkgYGFzc2VydFBhc3NhYmxlU3RyaW5nYCB0b1xuICogc2ltcGx5IGJlIGBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nYC5cbiAqXG4gKiBAcGFyYW0geyB1bmtub3duIH0gc3RyXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzdHIgaXMgc3RyaW5nIH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3RyaW5nID0gc3RyID0+IHtcbiAgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgRmFpbGBFeHBlY3RlZCBzdHJpbmcgJHtzdHJ9YDtcbiAgIU9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSB8fCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKHN0cik7XG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN0cmluZyhhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNXZWxsRm9ybWVkU3RyaW5nIjpbImlzV2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIjpbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0UGFzc2FibGVTdHJpbmciOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAvc0IsMUAADDFAAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIFRoZSB3ZWxsIGtub3duIHN5bWJvbHMgYXJlIHN0YXRpYyBzeW1ib2wgdmFsdWVzIG9uIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXMgPSBuZXcgTWFwKFxuICBvd25LZXlzKFN5bWJvbClcbiAgICAuZmlsdGVyKFxuICAgICAgbmFtZSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIFN5bWJvbFtuYW1lXSA9PT0gJ3N5bWJvbCcsXG4gICAgKVxuICAgIC5maWx0ZXIobmFtZSA9PiB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4gICAgICAhbmFtZS5zdGFydHNXaXRoKCdAQCcpIHx8XG4gICAgICAgIEZhaWxgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICl9YDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pXG4gICAgLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuICAgIC5tYXAobmFtZSA9PiBbU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pLFxuKTtcblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PlxuICB0eXBlb2Ygc3ltID09PSAnc3ltYm9sJyAmJlxuICAodHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKSA9PT0gJ3N0cmluZycgfHwgd2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRozY9fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgaXNQYXNzYWJsZVN5bWJvbChzeW0pIHx8XG4gIEZhaWxgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbiAgICAgICBjb25zdCBuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSBzeW0gPT4ge1xuICBjb25zdCBuYW1lID0gU3ltYm9sLmtleUZvcihzeW0pO1xuICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuICB9XG4gIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpIHtcbiAgICByZXR1cm4gYEBAJHtuYW1lfWA7XG4gIH1cbiAgcmV0dXJuIG5hbWU7XG59OyRozY9fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCBBdEF0UHJlZml4UGF0dGVybiA9IC9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sfVxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiB7XG4gIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgJHtxKG5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICBjb25zdCBtYXRjaCA9IEF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgIGlmIChzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgICAgcmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3ltID0gU3ltYm9sW3N1ZmZpeF07XG4gICAgICBpZiAodHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIHN5bTtcbiAgICAgIH1cbiAgICAgIEZhaWxgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xufTskaM2PX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbH1cbiAqL1xuICAgICAgIGNvbnN0IHVucGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiBTeW1ib2wobmFtZSk7JGjNj19vbmNlLnVucGFzc2FibGVTeW1ib2xGb3JOYW1lKHVucGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXLhQ2WQJAABkCQAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGdldE93bkRhdGFEZXNjcmlwdG9yLGNoZWNrUGFzc1N0eWxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLFskaM2PX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBUYWdnZWRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICd0YWdnZWQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwgY2FuZGlkYXRlW1BBU1NfU1RZTEVdLCAndGFnZ2VkJywgY2hlY2spLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwgJ3RhZ2dlZCcsIGFzc2VydENoZWNrZXIpO1xuXG4gICAgLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbiAgICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChQQVNTX1NUWUxFKTtcbiAgICBjb25zdCB0YWdLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICAgIGNvbnN0IHtcbiAgICAgIC8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cbiAgICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhc3NTdHlsZUtleSldOiBfcGFzc1N0eWxlRGVzYyxcbiAgICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHRhZ0tleSldOiBfbGFiZWxEZXNjLFxuICAgICAgcGF5bG9hZDogX3BheWxvYWREZXNjLCAvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuICAgICAgLi4ucmVzdERlc2NzXG4gICAgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgICBvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICAgICBGYWlsYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbiAgICAvKiBWYWxpZGF0ZSB0aGF0IHRoZSAncGF5bG9hZCcgcHJvcGVydHkgaXMgb3duL2RhdGEvZW51bWVyYWJsZSovXG4gICAgLyogYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlIGlzIHJlY3Vyc2l2ZWx5IHBhc3NhYmxlLiovXG4gICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgJ3BheWxvYWQnLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICApO1xuICB9LFxufSk7JGjNj19vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGFnZ2VkSGVscGVyIjpbIlRhZ2dlZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3XT1cJhYAACYWAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbImFzc2VydEF0b20iLCJhc3NlcnRCeXRlQXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0F0b20iLCJpc0J5dGVBcnJheSIsImlzQ29weUFycmF5IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxYLGlkZW50Q2hlY2tlcixwYXNzU3R5bGVPZixhc3NlcnRDaGVja2VyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIixbJGjNj19hID0+IChpZGVudENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvcHlBcnJheSwgQ29weVJlY29yZCwgUGFzc2FibGUsIFJlbW90YWJsZU9iamVjdCwgQnl0ZUFycmF5LCBDaGVja2VyLCBBdG9tfSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5QXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2NvcHlBcnJheSc7JGjNj19vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYmluYXJ5IGRhdGEsIEFLQSBhIFwiYnl0ZUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJcbiAqIEByZXR1cm5zIHthcnIgaXMgQnl0ZUFycmF5fVxuICovXG4gICAgICAgY29uc3QgaXNCeXRlQXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2J5dGVBcnJheSc7JGjNj19vbmNlLmlzQnl0ZUFycmF5KGlzQnl0ZUFycmF5KTtcbmhhcmRlbihpc0J5dGVBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7YW55fSByZWNvcmRcbiAqIEByZXR1cm5zIHtyZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG4gICAgICAgY29uc3QgaXNSZWNvcmQgPSByZWNvcmQgPT4gcGFzc1N0eWxlT2YocmVjb3JkKSA9PT0gJ2NvcHlSZWNvcmQnOyRozY9fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGVPYmplY3R9XG4gKi9cbiAgICAgICBjb25zdCBpc1JlbW90YWJsZSA9IHJlbW90YWJsZSA9PiBwYXNzU3R5bGVPZihyZW1vdGFibGUpID09PSAncmVtb3RhYmxlJzskaM2PX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gYXJyXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnIgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDb3B5QXJyYXkgPSAoYXJyLCBvcHROYW1lT2ZBcnJheSA9ICdBbGxlZ2VkIGFycmF5JykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihhcnIpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5QXJyYXknIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2Fycn0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFyclxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyIGlzIEJ5dGVBcnJheX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEJ5dGVBcnJheSA9IChhcnIsIG9wdE5hbWVPZkFycmF5ID0gJ0FsbGVnZWQgYnl0ZUFycmF5JykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihhcnIpO1xuICBwYXNzU3R5bGUgPT09ICdieXRlQXJyYXknIHx8XG4gICAgRmFpbGAke3EoXG4gICAgICBvcHROYW1lT2ZBcnJheSxcbiAgICApfSAke2Fycn0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBiaW5hcnkgZGF0YSwgbm90ICR7cShwYXNzU3R5bGUpfWA7XG59OyRozY9fb25jZS5hc3NlcnRCeXRlQXJyYXkoYXNzZXJ0Qnl0ZUFycmF5KTtcbmhhcmRlbihhc3NlcnRCeXRlQXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7YW55fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmVjb3JkID0gKHJlY29yZCwgb3B0TmFtZU9mUmVjb3JkID0gJ0FsbGVnZWQgcmVjb3JkJykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZWNvcmQpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGVPYmplY3R9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRSZW1vdGFibGUgPSAoXG4gIHJlbW90YWJsZSxcbiAgb3B0TmFtZU9mUmVtb3RhYmxlID0gJ0FsbGVnZWQgcmVtb3RhYmxlJyxcbikgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZW1vdGFibGUpO1xuICBwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsIE5vdCBuZWNlc3NhcmlseSBwYXNzYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ZhbCBpcyBBdG9tfVxuICovXG5jb25zdCBjaGVja0F0b20gPSAodmFsLCBjaGVjaykgPT4ge1xuICBsZXQgcGFzc1N0eWxlO1xuICB0cnkge1xuICAgIHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAoXG4gICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICBjaGVjayhmYWxzZSwgWGBOb3QgZXZlbiBQYXNzYWJsZTogJHtxKGVycil9OiAke3ZhbH1gKVxuICAgICk7XG4gIH1cbiAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgIGNhc2UgJ251bGwnOlxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnYmlnaW50JzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ2J5dGVBcnJheSc6XG4gICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgLyogVGhlIEF0b21TdHlsZSBjYXNlcyovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLyogVGhlIG90aGVyIFBhc3NTdHlsZSBjYXNlcyovXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAgIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhbiBhdG9tOiAke3ZhbH1gKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBBdG9tfVxuICovXG4gICAgICAgY29uc3QgaXNBdG9tID0gdmFsID0+IGNoZWNrQXRvbSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQXRvbShpc0F0b20pO1xuaGFyZGVuKGlzQXRvbSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWwgaXMgQXRvbX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEF0b20gPSB2YWwgPT4ge1xuICBjaGVja0F0b20odmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEF0b20oYXNzZXJ0QXRvbSk7XG5oYXJkZW4oYXNzZXJ0QXRvbSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSJdLCJpc0J5dGVBcnJheSI6WyJpc0J5dGVBcnJheSJdLCJpc1JlY29yZCI6WyJpc1JlY29yZCJdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSJdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5Il0sImFzc2VydEJ5dGVBcnJheSI6WyJhc3NlcnRCeXRlQXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl0sImlzQXRvbSI6WyJpc0F0b20iXSwiYXNzZXJ0QXRvbSI6WyJhc3NlcnRBdG9tIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdU2S3O8OAADvDgAAHgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIiwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIiwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIiwiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyIsIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImJhZ1VuaW9uIiwiYmFnVW5pb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiLCJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiLCJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSIsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlTZXQuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weUJhZy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW11dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbImlzQ29weVNldCIsImlzQ29weVNldCJdLFsiYXNzZXJ0Q29weVNldCIsImFzc2VydENvcHlTZXQiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbImlzQ29weUJhZyIsImlzQ29weUJhZyJdLFsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlCYWciXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdLFsiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlNYXAiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXV0sIi4vc3JjL2tleXMvY29weVNldC5qcyI6W1siY29lcmNlVG9FbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiXV0sIi4vc3JjL2tleXMvY29weUJhZy5qcyI6W1siY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl1dLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjpbWyJiYWdDb21wYXJlIiwiYmFnQ29tcGFyZSJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl1dLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOltbImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzSXNTdXBlcnNldCJdLFsiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50Il0sWyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0NvbXBhcmUiXSxbImVsZW1lbnRzVW5pb24iLCJlbGVtZW50c1VuaW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSxbImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSxbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLFsic2V0SXNTdXBlcnNldCIsInNldElzU3VwZXJzZXQiXSxbInNldElzRGlzam9pbnQiLCJzZXRJc0Rpc2pvaW50Il0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdXSwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjpbWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnVW5pb24iLCJiYWdVbmlvbiJdLFsiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSW50ZXJzZWN0aW9uIl0sWyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnRGlzam9pbnRTdWJ0cmFjdCJdXSwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjpbWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsibXVzdE1hdGNoIiwibXVzdE1hdGNoIl0sWyJpc0F3YWl0QXJnR3VhcmQiLCJpc0F3YWl0QXJnR3VhcmQiXSxbImFzc2VydEF3YWl0QXJnR3VhcmQiLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIl0sWyJpc1Jhd0d1YXJkIiwiaXNSYXdHdWFyZCJdLFsiYXNzZXJ0UmF3R3VhcmQiLCJhc3NlcnRSYXdHdWFyZCJdLFsiYXNzZXJ0TWV0aG9kR3VhcmQiLCJhc3NlcnRNZXRob2RHdWFyZCJdLFsiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCJdLFsia2luZE9mIiwia2luZE9mIl0sWyJjb250YWluZXJIYXNTcGxpdCIsImNvbnRhaW5lckhhc1NwbGl0Il1dLCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIjpbWyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCIsImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIl0sWyJnZXRNZXRob2RHdWFyZFBheWxvYWQiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSxbImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCJdLFsiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyIsImdldEludGVyZmFjZU1ldGhvZEtleXMiXV0sIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOltbImxpc3REaWZmZXJlbmNlIiwibGlzdERpZmZlcmVuY2UiXV0sIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjpbWyJvYmplY3RNYXAiLCJvYmplY3RNYXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKohA+kLSAAAC0gAACoAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY2hlY2tLZXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIi4vY29weVNldC5qcyIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weVNldCIsImFzc2VydEtleSIsImFzc2VydFNjYWxhcktleSIsImNoZWNrQ29weUJhZyIsImNoZWNrQ29weU1hcCIsImNoZWNrQ29weVNldCIsImNoZWNrS2V5IiwiY2hlY2tTY2FsYXJLZXkiLCJjb3B5TWFwS2V5U2V0IiwiZXZlcnlDb3B5QmFnRW50cnkiLCJldmVyeUNvcHlNYXBLZXkiLCJldmVyeUNvcHlNYXBWYWx1ZSIsImV2ZXJ5Q29weVNldEtleSIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cnlBcnJheSIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxLEZhaWwsaWRlbnRDaGVja2VyLGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGlzQXRvbSxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxjaGVja0VsZW1lbnRzLG1ha2VTZXRPZkVsZW1lbnRzLGNoZWNrQmFnRW50cmllcyxtYWtlQmFnT2ZFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIixbJGjNj19hID0+IChpZGVudENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNBdG9tXCIsWyRozY9fYSA9PiAoaXNBdG9tID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIixbJGjNj19hID0+IChjaGVja0VsZW1lbnRzID0gJGjNj19hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGNoZWNrQmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsWyRozY9fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBBdG9tLCBDaGVja2VyfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7Q29weUJhZywgQ29weU1hcCwgQ29weVNldCwgS2V5LCBTY2FsYXJLZXl9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyBBdG9tIGFuZCBTY2FsYXIga2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja1NjYWxhcktleSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChpc0F0b20odmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIGlmIChwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHNjYWxhciBrZXk6ICR7dmFsfWApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7dmFsIGlzIFNjYWxhcktleX1cbiAqLyRozY9fb25jZS5jaGVja1NjYWxhcktleShjaGVja1NjYWxhcktleSk7XG4gICAgICAgY29uc3QgaXNTY2FsYXJLZXkgPSB2YWwgPT4gY2hlY2tTY2FsYXJLZXkodmFsLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Fzc2VydHMgdmFsIGlzIFNjYWxhcktleX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFNjYWxhcktleSA9IHZhbCA9PiB7XG4gIGNoZWNrU2NhbGFyS2V5KHZhbCwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRTY2FsYXJLZXkoYXNzZXJ0U2NhbGFyS2V5KTtcbmhhcmRlbihhc3NlcnRTY2FsYXJLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgS2V5IGRvZXMgbm90IHNhdGlzZnkgV2Vha0tleSovXG4vKiogQHR5cGUge1dlYWtTZXQ8S2V5Pn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgS2V5IGRvZXMgbm90IHNhdGlzZnkgV2Vha0tleSovXG5jb25zdCBrZXlNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja0tleSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChpc0F0b20odmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICBpZiAoa2V5TWVtby5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrS2V5SW50ZXJuYWwodmFsLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICAvKiBEb24ndCBjYWNoZSB0aGUgdW5kZWZpbmVkIGNhc2VzLCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkIGFnYWluKi9cbiAgICAvKiB3aXRoIGBhc3NlcnRDaGVja2VyYCBpdCdsbCB0aHJvdyBhIGRpYWdub3N0aWMgYWdhaW4qL1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgIGtleU1lbW8uYWRkKHZhbCk7XG4gIH1cbiAgLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBtZW1vaXplIGEgbmVnYXRpdmUganVkZ2VtZW50LCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkKi9cbiAgLyogYWdhaW4gd2l0aCBhIGNoZWNrZXIsIGl0IHdpbGwgc3RpbGwgcHJvZHVjZSBhIHVzZWZ1bCBkaWFnbm9zdGljLiovXG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0tleShjaGVja0tleSk7XG5oYXJkZW4oY2hlY2tLZXkpO1xuXG4vKipcbiAqIEB0eXBlIHt7XG4gKiAgICh2YWw6IFBhc3NhYmxlKTogdmFsIGlzIEtleTtcbiAqICAgKHZhbDogYW55KTogYm9vbGVhbjtcbiAqIH19XG4gKi9cbiAgICAgICBjb25zdCBpc0tleSA9IHZhbCA9PiBjaGVja0tleSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtLZXl9IHZhbFxuICogQHJldHVybnMge2Fzc2VydHMgdmFsIGlzIEtleX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEtleSA9IHZhbCA9PiB7XG4gIGNoZWNrS2V5KHZhbCwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRLZXkoYXNzZXJ0S2V5KTtcbmhhcmRlbihhc3NlcnRLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlTZXQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weVNldCBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlTZXQ+fSAqL1xuY29uc3QgY29weVNldE1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrQ29weVNldCA9IChzLCBjaGVjaykgPT4ge1xuICBpZiAoY29weVNldE1lbW8uaGFzKHMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID1cbiAgICAoKHBhc3NTdHlsZU9mKHMpID09PSAndGFnZ2VkJyAmJiBnZXRUYWcocykgPT09ICdjb3B5U2V0JykgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYE5vdCBhIGNvcHlTZXQ6ICR7c31gKSkgJiZcbiAgICBjaGVja0VsZW1lbnRzKHMucGF5bG9hZCwgY2hlY2spICYmXG4gICAgY2hlY2tLZXkocy5wYXlsb2FkLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb3B5U2V0TWVtby5hZGQocyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmNoZWNrQ29weVNldChjaGVja0NvcHlTZXQpO1xuaGFyZGVuKGNoZWNrQ29weVNldCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXR9XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlTZXQgPSBzID0+IGNoZWNrQ29weVNldChzLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlTZXQoaXNDb3B5U2V0KTtcbmhhcmRlbihpc0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzIGlzIENvcHlTZXR9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5U2V0fSAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlTZXQgPSBzID0+IHtcbiAgY2hlY2tDb3B5U2V0KHMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weVNldEtleXMgPSBzID0+IHtcbiAgYXNzZXJ0Q29weVNldChzKTtcbiAgcmV0dXJuIHMucGF5bG9hZDtcbn07JGjNj19vbmNlLmdldENvcHlTZXRLZXlzKGdldENvcHlTZXRLZXlzKTtcbmhhcmRlbihnZXRDb3B5U2V0S2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlTZXRLZXkgPSAocywgZm4pID0+XG4gIGdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBmbihrZXksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5U2V0ID0gZWxlbWVudEl0ZXIgPT4ge1xuICBjb25zdCByZXN1bHQgPSBtYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50SXRlcik7XG4gIGFzc2VydENvcHlTZXQocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLm1ha2VDb3B5U2V0KG1ha2VDb3B5U2V0KTtcbmhhcmRlbihtYWtlQ29weVNldCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weUJhZyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5QmFnIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weUJhZz59ICovXG5jb25zdCBjb3B5QmFnTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tDb3B5QmFnID0gKGIsIGNoZWNrKSA9PiB7XG4gIGlmIChjb3B5QmFnTWVtby5oYXMoYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPVxuICAgICgocGFzc1N0eWxlT2YoYikgPT09ICd0YWdnZWQnICYmIGdldFRhZyhiKSA9PT0gJ2NvcHlCYWcnKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTm90IGEgY29weUJhZzogJHtifWApKSAmJlxuICAgIGNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KGIucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weUJhZ01lbW8uYWRkKGIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBiXG4gKiBAcmV0dXJucyB7YiBpcyBDb3B5QmFnfVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5QmFnID0gYiA9PiBjaGVja0NvcHlCYWcoYiwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2Fzc2VydHMgYiBpcyBDb3B5QmFnfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDb3B5QmFnID0gYiA9PiB7XG4gIGNoZWNrQ29weUJhZyhiLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlCYWdFbnRyaWVzID0gYiA9PiB7XG4gIGFzc2VydENvcHlCYWcoYik7XG4gIHJldHVybiBiLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEBwYXJhbSB7KGVudHJ5OiBbSywgYmlnaW50XSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5QmFnRW50cnkgPSAoYiwgZm4pID0+XG4gIGdldENvcHlCYWdFbnRyaWVzKGIpLmV2ZXJ5KChlbnRyeSwgaW5kZXgpID0+IGZuKGVudHJ5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlCYWdFbnRyeShldmVyeUNvcHlCYWdFbnRyeSk7XG5oYXJkZW4oZXZlcnlDb3B5QmFnRW50cnkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvcHlCYWcgPSBiYWdFbnRyeUl0ZXIgPT4ge1xuICBjb25zdCByZXN1bHQgPSBtYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJ5SXRlcik7XG4gIGFzc2VydENvcHlCYWcocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbiAgY29uc3Qgc29ydGVkID0gc29ydEJ5UmFuayhlbGVtZW50SXRlciwgZnVsbENvbXBhcmUpO1xuICAvKiogQHR5cGUge1tLLGJpZ2ludF1bXX0gKi9cbiAgY29uc3QgZW50cmllcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZC5sZW5ndGg7ICkge1xuICAgIGNvbnN0IGsgPSBzb3J0ZWRbaV07XG4gICAgbGV0IGogPSBpICsgMTtcbiAgICB3aGlsZSAoaiA8IHNvcnRlZC5sZW5ndGggJiYgZnVsbENvbXBhcmUoaywgc29ydGVkW2pdKSA9PT0gMCkge1xuICAgICAgaiArPSAxO1xuICAgIH1cbiAgICBlbnRyaWVzLnB1c2goW2ssIEJpZ0ludChqIC0gaSldKTtcbiAgICBpID0gajtcbiAgfVxuICByZXR1cm4gbWFrZUNvcHlCYWcoZW50cmllcyk7XG59OyRozY9fb25jZS5tYWtlQ29weUJhZ0Zyb21FbGVtZW50cyhtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5oYXJkZW4obWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlNYXAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weU1hcCdzIGtleXMgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5TWFwPn0gKi9cbmNvbnN0IGNvcHlNYXBNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gbVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja0NvcHlNYXAgPSAobSwgY2hlY2spID0+IHtcbiAgaWYgKGNvcHlNYXBNZW1vLmhhcyhtKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghKHBhc3NTdHlsZU9mKG0pID09PSAndGFnZ2VkJyAmJiBnZXRUYWcobSkgPT09ICdjb3B5TWFwJykpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgTm90IGEgY29weU1hcDogJHttfWApO1xuICB9XG4gIGNvbnN0IHsgcGF5bG9hZCB9ID0gbTtcbiAgaWYgKHBhc3NTdHlsZU9mKHBheWxvYWQpICE9PSAnY29weVJlY29yZCcpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gIH1cbiAgY29uc3QgeyBrZXlzLCB2YWx1ZXMsIC4uLnJlc3QgfSA9IHBheWxvYWQ7XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgKG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IG9ubHkgaGF2ZSAua2V5cyBhbmQgLnZhbHVlczogJHttfWAsXG4gICAgICApKSAmJlxuICAgIGNoZWNrRWxlbWVudHMoa2V5cywgY2hlY2spICYmXG4gICAgY2hlY2tLZXkoa2V5cywgY2hlY2spICYmXG4gICAgKHBhc3NTdHlsZU9mKHZhbHVlcykgPT09ICdjb3B5QXJyYXknIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBBIGNvcHlNYXAncyAudmFsdWVzIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7bX1gKSkgJiZcbiAgICAoa2V5cy5sZW5ndGggPT09IHZhbHVlcy5sZW5ndGggfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBBIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzIGFuZCB2YWx1ZXM6ICR7bX1gLFxuICAgICAgKSk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb3B5TWFwTWVtby5hZGQobSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmNoZWNrQ29weU1hcChjaGVja0NvcHlNYXApO1xuaGFyZGVuKGNoZWNrQ29weU1hcCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlNYXAgPSBtID0+IGNoZWNrQ29weU1hcChtLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHthc3NlcnRzIG0gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlNYXAgPSBtID0+IHtcbiAgY2hlY2tDb3B5TWFwKG0sIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwS2V5cyA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICByZXR1cm4gbS5wYXlsb2FkLmtleXM7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwS2V5cyhnZXRDb3B5TWFwS2V5cyk7XG5oYXJkZW4oZ2V0Q29weU1hcEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge1ZbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBWYWx1ZXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgcmV0dXJuIG0ucGF5bG9hZC52YWx1ZXM7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwVmFsdWVzKGdldENvcHlNYXBWYWx1ZXMpO1xuaGFyZGVuKGdldENvcHlNYXBWYWx1ZXMpO1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYSBDb3B5TWFwJ3MgZW50cmllcyBpbiBzdG9yYWdlIG9yZGVyLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0FycmF5PFtLLFZdPn1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBFbnRyeUFycmF5ID0gbSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIGNvbnN0IHtcbiAgICBwYXlsb2FkOiB7IGtleXMsIHZhbHVlcyB9LFxuICB9ID0gbTtcbiAgcmV0dXJuIGhhcmRlbihrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWx1ZXNbaV1dKSk7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwRW50cnlBcnJheShnZXRDb3B5TWFwRW50cnlBcnJheSk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJ5QXJyYXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBFbnRyaWVzID0gbSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIGNvbnN0IHtcbiAgICBwYXlsb2FkOiB7IGtleXMsIHZhbHVlcyB9LFxuICB9ID0gbTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovIChrZXlzKTtcbiAgcmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICByZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmF0b3InLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFtLLFZdLHZvaWQ+fSAqL1xuICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogW2tleXNbaV0sIHZhbHVlc1tpXV0gfSk7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlNYXBLZXkgPSAobSwgZm4pID0+XG4gIGdldENvcHlNYXBLZXlzKG0pLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBmbihrZXksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyh2YWx1ZTogViwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5TWFwVmFsdWUgPSAobSwgZm4pID0+XG4gIGdldENvcHlNYXBWYWx1ZXMobSkuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gZm4odmFsdWUsIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weU1hcFZhbHVlKGV2ZXJ5Q29weU1hcFZhbHVlKTtcbmhhcmRlbihldmVyeUNvcHlNYXBWYWx1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IGNvcHlNYXBLZXlTZXQgPSBtID0+XG4gIC8qIEEgY29weU1hcCdzIGtleXMgYXJlIGFscmVhZHkgaW4gdGhlIGludGVybmFsIGZvcm0gdXNlZCBieSBjb3B5U2V0cy4qL1xuICBtYWtlVGFnZ2VkKCdjb3B5U2V0JywgbS5wYXlsb2FkLmtleXMpOyRozY9fb25jZS5jb3B5TWFwS2V5U2V0KGNvcHlNYXBLZXlTZXQpO1xuaGFyZGVuKGNvcHlNYXBLZXlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBWXT59IGVudHJpZXNcbiAqIEByZXR1cm5zIHtDb3B5TWFwPEssVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weU1hcCA9IGVudHJpZXMgPT4ge1xuICAvKiBUaGlzIGlzIHdlaXJkLCBidXQgcmV2ZXJzZSByYW5rIHNvcnRpbmcgdGhlIGVudHJpZXMgaXMgYSBnb29kIGZpcnN0IHN0ZXAqL1xuICAvKiBmb3IgZ2V0dGluZyB0aGUgcmFuayBzb3J0ZWQga2V5cyB0b2dldGhlciB3aXRoIHRoZSB2YWx1ZXMqL1xuICAvKiBvcmdhbml6ZWQgYnkgdGhvc2Uga2V5cy4gQWxzbywgYW1vbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCovXG4gIC8qIGtleXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MsIHRob3NlIGFyZSByYW5rIHNvcnRlZC4qL1xuICAvKiBUT0RPIFRoaXMqL1xuICAvKiBjb3VsZCBzb2x2ZSB0aGUgY29weU1hcCBjb3ZlciBpc3N1ZSBleHBsYWluZWQgaW4gcGF0dGVybk1hdGNoZXJzLmpzLiovXG4gIC8qIEJ1dCBvbmx5IGlmIHdlIGluY2x1ZGUgdGhpcyBjcml0ZXJpYSBpbiBvdXIgdmFsaWRhdGlvbiBvZiBjb3B5TWFwcywqL1xuICAvKiB3aGljaCB3ZSBjdXJyZW50bHkgZG8gbm90LiovXG4gIGNvbnN0IHNvcnRlZEVudHJpZXMgPSBzb3J0QnlSYW5rKGVudHJpZXMsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGNvbnN0IGtleXMgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW2ssIF92XSkgPT4gayk7XG4gIGNvbnN0IHZhbHVlcyA9IHNvcnRlZEVudHJpZXMubWFwKChbX2ssIHZdKSA9PiB2KTtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnY29weU1hcCcsIHsga2V5cywgdmFsdWVzIH0pO1xuICBhc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyBSZWN1ciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogYGNoZWNrS2V5SW50ZXJuYWxgIGlzIG9ubHkgY2FsbGVkIGlmIGB2YWxgIGlzIFBhc3NhYmxlIGJ1dCBpcyBub3QgYW4gQXRvbS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlJbnRlcm5hbCA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGNoZWNrSXQgPSBjaGlsZCA9PiBjaGVja0tleShjaGlsZCwgY2hlY2spO1xuXG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgLyogQSByZW1vdGFibGUgaXMgYSBTY2FsYXJLZXkgYnV0IG5vdCBhbiBBdG9tLCBzbyB3ZSBwaWNrIGl0IHVwIGhlcmUuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgLyogQSBjb3B5UmVjb3JkIGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIC8qIEEgY29weUFycmF5IGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbiAgICAgIHJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gICAgfVxuICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgIGNvbnN0IHRhZyA9IGdldFRhZyh2YWwpO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjaGVja0NvcHlNYXAodmFsLCBjaGVjaykgJiZcbiAgICAgICAgICAgIC8qIEZvciBhIGNvcHlNYXAgdG8gYmUgYSBrZXksIGFsbCBpdHMga2V5cyBhbmQgdmFsdWVzIG11c3QqL1xuICAgICAgICAgICAgLyogYmUga2V5cy4gS2V5cyBhbHJlYWR5IGNoZWNrZWQgYnkgYGNoZWNrQ29weU1hcGAgc2luY2UqL1xuICAgICAgICAgICAgLyogdGhhdCdzIGEgY29weU1hcCByZXF1aXJlbWVudCBpbiBnZW5lcmFsLiovXG4gICAgICAgICAgICBldmVyeUNvcHlNYXBWYWx1ZSh2YWwsIGNoZWNrSXQpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgICAgICAgIGNoZWNrKGZhbHNlLCBYYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7dmFsfWApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjYXNlICdlcnJvcic6XG4gICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1rZXlzLCBidXQgYW4gdW5leHBlY3RlZCBwYXNzU3R5bGUqL1xuICAgICAgLyogaXMgYWx3YXlzIGFuIGVycm9yLiovXG4gICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YDtcbiAgICB9XG4gIH1cbn07XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjaGVja1NjYWxhcktleSI6WyJjaGVja1NjYWxhcktleSJdLCJpc1NjYWxhcktleSI6WyJpc1NjYWxhcktleSJdLCJhc3NlcnRTY2FsYXJLZXkiOlsiYXNzZXJ0U2NhbGFyS2V5Il0sImNoZWNrS2V5IjpbImNoZWNrS2V5Il0sImlzS2V5IjpbImlzS2V5Il0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiXSwiY2hlY2tDb3B5U2V0IjpbImNoZWNrQ29weVNldCJdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImFzc2VydENvcHlTZXQiOlsiYXNzZXJ0Q29weVNldCJdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyJdLCJldmVyeUNvcHlTZXRLZXkiOlsiZXZlcnlDb3B5U2V0S2V5Il0sIm1ha2VDb3B5U2V0IjpbIm1ha2VDb3B5U2V0Il0sImNoZWNrQ29weUJhZyI6WyJjaGVja0NvcHlCYWciXSwiaXNDb3B5QmFnIjpbImlzQ29weUJhZyJdLCJhc3NlcnRDb3B5QmFnIjpbImFzc2VydENvcHlCYWciXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiXSwiZXZlcnlDb3B5QmFnRW50cnkiOlsiZXZlcnlDb3B5QmFnRW50cnkiXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSwiY2hlY2tDb3B5TWFwIjpbImNoZWNrQ29weU1hcCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sImFzc2VydENvcHlNYXAiOlsiYXNzZXJ0Q29weU1hcCJdLCJnZXRDb3B5TWFwS2V5cyI6WyJnZXRDb3B5TWFwS2V5cyJdLCJnZXRDb3B5TWFwVmFsdWVzIjpbImdldENvcHlNYXBWYWx1ZXMiXSwiZ2V0Q29weU1hcEVudHJ5QXJyYXkiOlsiZ2V0Q29weU1hcEVudHJ5QXJyYXkiXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiXSwiZXZlcnlDb3B5TWFwS2V5IjpbImV2ZXJ5Q29weU1hcEtleSJdLCJldmVyeUNvcHlNYXBWYWx1ZSI6WyJldmVyeUNvcHlNYXBWYWx1ZSJdLCJjb3B5TWFwS2V5U2V0IjpbImNvcHlNYXBLZXlTZXQiXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/9srkD8oAAA/KAAALQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb21wYXJlS2V5cy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jaGVja0tleS5qcyIsIi4va2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJzZXRDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVOdW1lcmljcyxjb21wYXJlUmFuayxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMscSxGYWlsLGFzc2VydEtleSxnZXRDb3B5QmFnRW50cmllcyxnZXRDb3B5TWFwRW50cnlBcnJheSxnZXRDb3B5U2V0S2V5cyxtYWtlQ29tcGFyZUNvbGxlY3Rpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJjb21wYXJlTnVtZXJpY3NcIixbJGjNj19hID0+IChjb21wYXJlTnVtZXJpY3MgPSAkaM2PX2EpXV0sW1wiY29tcGFyZVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlUmFuayA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cnlBcnJheVwiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyeUFycmF5ID0gJGjNj19hKV1dLFtcImdldENvcHlTZXRLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzXCIsIFtbXCJtYWtlQ29tcGFyZUNvbGxlY3Rpb25cIixbJGjNj19hID0+IChtYWtlQ29tcGFyZUNvbGxlY3Rpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge0NvcHlTZXQsIEtleSwgS2V5Q29tcGFyZX0gZnJvbSAnLi4vdHlwZXMuanMnICovXG5cbi8qKlxuICogQ29weVNldCBYIGlzIHNtYWxsZXIgdGhhbiBDb3B5U2V0IFkgaWZmIGFsbCBvZiB0aGVzZSBjb25kaXRpb25zIGhvbGQ6XG4gKiAxLiBGb3IgZXZlcnkgeCBpbiBYLCB4IGlzIGFsc28gaW4gWS5cbiAqIDIuIFRoZXJlIGlzIGEgeSBpbiBZIHRoYXQgaXMgbm90IGluIFguXG4gKlxuICogWCBpcyBlcXVpdmFsZW50IHRvIFkgaWZmIHRoZSBjb25kaXRpb24gMSBob2xkcyBidXQgY29uZGl0aW9uIDIgZG9lcyBub3QuXG4gKi9cbiAgICAgICBjb25zdCBzZXRDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICAvKiogQHR5cGUgezxLIGV4dGVuZHMgS2V5PihzOiBDb3B5U2V0PEs+KSA9PiBBcnJheTxbSywgMV0+fSAqLyAoXG4gICAgcyA9PiBoYXJkZW4oZ2V0Q29weVNldEtleXMocykubWFwKGtleSA9PiBba2V5LCAxXSkpXG4gICksXG4gIDAsXG4gIGNvbXBhcmVOdW1lcmljcyxcbik7JGjNj19vbmNlLnNldENvbXBhcmUoc2V0Q29tcGFyZSk7XG5oYXJkZW4oc2V0Q29tcGFyZSk7XG5cbi8qKlxuICogQ29weUJhZyBYIGlzIHNtYWxsZXIgdGhhbiBDb3B5QmFnIFkgaWZmIGFsbCBvZiB0aGVzZSBjb25kaXRpb25zIGhvbGRcbiAqICh3aGVyZSBgY291bnQoQSwgYSlgIGlzIHNob3J0aGFuZCBmb3IgdGhlIGNvdW50IGFzc29jaWF0ZWQgd2l0aCBgYWAgaW4gYEFgKTpcbiAqIDEuIEZvciBldmVyeSB4IGluIFgsIHggaXMgYWxzbyBpbiBZIGFuZCBjb3VudChYLCB4KSA8PSBjb3VudChZLCB4KS5cbiAqIDIuIFRoZXJlIGlzIGEgeSBpbiBZIHN1Y2ggdGhhdCB5IGlzIG5vdCBpbiBYIG9yIGNvdW50KFgsIHkpIDwgY291bnQoWSwgeSkuXG4gKlxuICogWCBpcyBlcXVpdmFsZW50IHRvIFkgaWZmIHRoZSBjb25kaXRpb24gMSBob2xkcyBidXQgY29uZGl0aW9uIDIgZG9lcyBub3QuXG4gKi9cbiAgICAgICBjb25zdCBiYWdDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICBnZXRDb3B5QmFnRW50cmllcyxcbiAgMG4sXG4gIGNvbXBhcmVOdW1lcmljcyxcbik7JGjNj19vbmNlLmJhZ0NvbXBhcmUoYmFnQ29tcGFyZSk7XG5oYXJkZW4oYmFnQ29tcGFyZSk7XG5cbi8qIFRPRE8gVGhlIGRlc2lyZWQgc2VtYW50aWNzIGZvciBDb3B5TWFwIGNvbXBhcmlzb24gaGF2ZSBub3QgeWV0IGJlZW4gZGVjaWRlZC4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MzcjcHVsbHJlcXVlc3RyZXZpZXctMTU5NjU5NTQxMSovXG4vKiBUaGUgYmVsb3cgaXMgYSBjdXJyZW50bHktdW51c2VkIGV4dGVuc2lvbiBvZiBDb3B5QmFnIHNlbWFudGljcyAoaS5lLiwgYWJzZW50Ki9cbi8qIGVudHJpZXMgdHJlYXRlZCBhcyBwcmVzZW50IHdpdGggYSB2YWx1ZSB0aGF0IGlzIHNtYWxsZXIgdGhhbiBldmVyeXRoaW5nKS4qL1xuLyoqXG4gKiBBIHVuaXF1ZSBsb2NhbCB2YWx1ZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gbm90IGV4aXN0IGluIGFueSBpbmJvdW5kIGRhdGFcbiAqIHN0cnVjdHVyZSAod2hpY2ggd291bGQgbm90IGJlIHRoZSBjYXNlIGlmIHdlIHVzZWQgYFN5bWJvbC5mb3JgKS5cbiAqIE5vdGUgdGhhdCBgQUJTRU5UYCBpcyBub3QgcGFzc2FibGUsIGFuZCBzbyBvbmx5IGV4aXN0cyBhdCB0aGUgSlMgbGV2ZWwgb2ZcbiAqIGFic3RyYWN0aW9uLCBub3QgcGFzcy1zdHlsZS5cbiAqL1xuY29uc3QgQUJTRU5UID0gU3ltYm9sKCdhYnNlbnQnKTtcblxuLyoqXG4gKiBDb3B5TWFwIFggaXMgc21hbGxlciB0aGFuIENvcHlNYXAgWSBpZmYgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnMgaG9sZDpcbiAqIDEuIFggYW5kIFkgYXJlIGJvdGggS2V5cyAoaS5lLiwgbmVpdGhlciBjb250YWlucyBub24tY29tcGFyYWJsZSBkYXRhKS5cbiAqIDIuIEZvciBldmVyeSB4IGluIFgsIHggaXMgYWxzbyBpbiBZIGFuZCBYW3hdIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVpdmFsZW50IHRvIFlbeF0uXG4gKiAzLiBUaGVyZSBpcyBhIHkgaW4gWSBzdWNoIHRoYXQgeSBpcyBub3QgaW4gWCBvciBYW3ldIGlzIHNtYWxsZXIgdGhhbiBZW3ldLlxuICpcbiAqIFggaXMgZXF1aXZhbGVudCB0byBZIGlmZiBjb25kaXRpb25zIDEgYW5kIDIgaG9sZCBidXQgY29uZGl0aW9uIDMgZG9lcyBub3QuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZSovXG5jb25zdCBfbWFwQ29tcGFyZSA9IG1ha2VDb21wYXJlQ29sbGVjdGlvbihcbiAgZ2V0Q29weU1hcEVudHJ5QXJyYXksXG4gIEFCU0VOVCxcbiAgKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSkgPT4ge1xuICAgIGlmIChsZWZ0VmFsdWUgPT09IEFCU0VOVCAmJiByaWdodFZhbHVlID09PSBBQlNFTlQpIHtcbiAgICAgIHRocm93IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgYWJzZW50IGVudHJ5IHBhaXJgO1xuICAgIH0gZWxzZSBpZiAobGVmdFZhbHVlID09PSBBQlNFTlQpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKHJpZ2h0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gY29tcGFyZUtleXMobGVmdFZhbHVlLCByaWdodFZhbHVlKTtcbiAgICB9XG4gIH0sXG4pO1xuaGFyZGVuKF9tYXBDb21wYXJlKTtcblxuLyoqIEB0eXBlIHtLZXlDb21wYXJlfSAqL1xuICAgICAgIGNvbnN0IGNvbXBhcmVLZXlzID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGFzc2VydEtleShsZWZ0KTtcbiAgYXNzZXJ0S2V5KHJpZ2h0KTtcbiAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gIGNvbnN0IHJpZ2h0U3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodCk7XG4gIGlmIChsZWZ0U3R5bGUgIT09IHJpZ2h0U3R5bGUpIHtcbiAgICAvKiBEaWZmZXJlbnQgcGFzc1N0eWxlcyBhcmUgaW5jb21tZW5zdXJhdGUqL1xuICAgIHJldHVybiBOYU47XG4gIH1cbiAgc3dpdGNoIChsZWZ0U3R5bGUpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgIGNhc2UgJ251bGwnOlxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdieXRlQXJyYXknOlxuICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgIC8qIGZvciB0aGVzZSwga2V5cyBjb21wYXJlIHRoZSBzYW1lIGFzIHJhbmsqL1xuICAgICAgcmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQsIHJpZ2h0KTtcbiAgICB9XG4gICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgY29uc3QgcmFua0NvbXAgPSBjb21wYXJlUmFuayhsZWZ0LCByaWdodCk7XG4gICAgICBpZiAocmFua0NvbXAgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKGxlZnQpIHx8IE51bWJlci5pc05hTihyaWdodCkpIHtcbiAgICAgICAgLyogTmFOIGlzIGVxdWFsIHRvIGl0c2VsZiwgYnV0IGluY29tbWVuc3VyYXRlIHdpdGggZXZlcnl0aGluZyBlbHNlKi9cbiAgICAgICAgYXNzZXJ0KCFOdW1iZXIuaXNOYU4obGVmdCkgfHwgIU51bWJlci5pc05hTihyaWdodCkpO1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgLyogQW1vbmcgbm9uLU5hTiBudW1iZXJzLCBrZXkgb3JkZXIgaXMgdGhlIHNhbWUgYXMgcmFuayBvcmRlci4gTm90ZSB0aGF0Ki9cbiAgICAgIC8qIGluIGJvdGggb3JkZXJzLCBgLTBgIGlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzIGFzIGAwYC4qL1xuICAgICAgcmV0dXJuIHJhbmtDb21wO1xuICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICAvKiBJZiB0d28gcmVtb3RhYmxlcyBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiBhcyBrZXlzIHRoZXkgYXJlKi9cbiAgICAgIC8qIGluY29tbWVuc3VyYXRlLiovXG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAvKiBMZXhpY29ncmFwaGljIGJ5IGtleSBvcmRlci4gUmFuayBvcmRlciBvZiBhcnJheXMgaXMgbGV4aWNvZ3JhcGhpYyBieSovXG4gICAgICAvKiByYW5rIG9yZGVyLiovXG4gICAgICAvKiBCZWNhdXNlIHRoZSBpbnZhcmlhbnRzIGFib3ZlIGFwcGx5IHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXksKi9cbiAgICAgIC8qIHRoZXkgYXBwbHkgdG8gdGhlIGFycmF5IGFzIGEgd2hvbGUuKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJlS2V5cyhsZWZ0W2ldLCByaWdodFtpXSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgYXJlIGtleUVRLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4gICAgICAvKiBUaHVzLCBpZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBpcyBzbWFsbGVyIHRoYW4gWS4qL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICByZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAvKiBQYXJldG8gcGFydGlhbCBvcmRlciBjb21wYXJpc29uLiovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgaWYgKCFrZXlFUShsZWZ0TmFtZXMsIHJpZ2h0TmFtZXMpKSB7XG4gICAgICAgIC8qIElmIHRoZXkgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0aWVzLCovXG4gICAgICAgIC8qIHRoZXkgYXJlIGluY29tbWVuc3VyYXRlLiovXG4gICAgICAgIC8qIE5vdGUgdGhhdCByYW5rIHNvcnRpbmcgb2YgY29weVJlY29yZHMgZ3JvdXBzIGFsbCBjb3B5UmVjb3JkcyB3aXRoKi9cbiAgICAgICAgLyogdGhlIHNhbWUga2V5cyB0b2dldGhlciwgZW5hYmxpbmcgcmFuZ2Ugc2VhcmNoaW5nIG92ZXIgY29weVJlY29yZHMqL1xuICAgICAgICAvKiB0byBhdm9pZCBtb3JlIGlycmVsZXZhbnQgb25lcy4qL1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCBsZWZ0VmFsdWVzID0gcmVjb3JkVmFsdWVzKGxlZnQsIGxlZnROYW1lcyk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IHJpZ2h0VmFsdWVzID0gcmVjb3JkVmFsdWVzKHJpZ2h0LCByaWdodE5hbWVzKTtcbiAgICAgIC8qIFByZXN1bWUgdGhhdCBib3RoIGNvcHlSZWNvcmRzIGhhdmUgdGhlIHNhbWUga2V5IG9yZGVyKi9cbiAgICAgIC8qIHVudGlsIGVuY291bnRlcmluZyBhIHByb3BlcnR5IGRpc3Byb3ZpbmcgdGhhdCBoeXBvdGhlc2lzLiovXG4gICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVmdFZhbHVlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBjb21wID0gY29tcGFyZUtleXMobGVmdFZhbHVlc1tpXSwgcmlnaHRWYWx1ZXNbaV0pO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGNvbXApKSB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ICE9PSBjb21wICYmIGNvbXAgIT09IDApIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBjb21wO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIChyZXN1bHQgPT09IC0xICYmIGNvbXAgPT09IDEpIHx8IChyZXN1bHQgPT09IDEgJiYgY29tcCA9PT0gLTEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBJZiBjb3B5UmVjb3JkIFggaXMgc21hbGxlciB0aGFuIGNvcHlSZWNvcmQgWSwgdGhlbiB0aGV5IG11c3QgaGF2ZSB0aGUqL1xuICAgICAgLyogc2FtZSBwcm9wZXJ0eSBuYW1lcyBhbmQgZXZlcnkgdmFsdWUgaW4gWCBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8qL1xuICAgICAgLyogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gWSAod2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgc21hbGxlcikuKi9cbiAgICAgIC8qIFRoZSByYW5rIG9yZGVyIG9mIFggYW5kIFkgaXMgYmFzZWQgb24gbGV4aWNvZ3JhcGhpYyByYW5rIG9yZGVyIG9mKi9cbiAgICAgIC8qIHRoZWlyIHZhbHVlcywgYXMgb3JnYW5pemVkIGJ5IHJldmVyc2UgbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGVpciovXG4gICAgICAvKiBwcm9wZXJ0eSBuYW1lcy4qL1xuICAgICAgLyogVGh1cyBpZiBjb21wYXJlS2V5cyhYLFkpIDwgMCB0aGVuIGNvbXBhcmVSYW5rKFgsWSkgPCAwLiovXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IGxlZnRUYWcgPSBnZXRUYWcobGVmdCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IHJpZ2h0VGFnID0gZ2V0VGFnKHJpZ2h0KTtcbiAgICAgIGlmIChsZWZ0VGFnICE9PSByaWdodFRhZykge1xuICAgICAgICAvKiBkaWZmZXJlbnQgdGFncyBhcmUgaW5jb21tZW5zdXJhdGUqL1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChsZWZ0VGFnKSB7XG4gICAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICAgICAgcmV0dXJuIHNldENvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICAgICAgcmV0dXJuIGJhZ0NvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgLyogVE9ETyBUaGUgZGVzaXJlZCBzZW1hbnRpY3MgZm9yIENvcHlNYXAgY29tcGFyaXNvbiBoYXZlIG5vdCB5ZXQgYmVlbiBkZWNpZGVkLiovXG4gICAgICAgICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MzcjcHVsbHJlcXVlc3RyZXZpZXctMTU5NjU5NTQxMSovXG4gICAgICAgICAgdGhyb3cgRmFpbGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG4gICAgICAgY29uc3Qga2V5TFQgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8IDA7JGjNj19vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbiAgICAgICBjb25zdCBrZXlMVEUgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8PSAwOyRozY9fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG4gICAgICAgY29uc3Qga2V5RVEgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA9PT0gMDskaM2PX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuICAgICAgIGNvbnN0IGtleUdURSA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID49IDA7JGjNj19vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbiAgICAgICBjb25zdCBrZXlHVCA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID4gMDskaM2PX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldENvbXBhcmUiOlsic2V0Q29tcGFyZSJdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiXSwiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADRbU2NNFQAATRUAACkAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weUJhZy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0QmFnRW50cmllcyIsImFzc2VydE5vRHVwbGljYXRlS2V5cyIsImNoZWNrQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyIsIm1ha2VCYWdPZkVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7Q2hlY2tlciwgRnVsbENvbXBhcmV9IGZyb20gJ0BlbmRvL21hcnNoYWwnXG4gKiBAaW1wb3J0IHtDb3B5QmFnLCBLZXl9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHlcbiAqIGtub3duIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0XG4gKiByYXRoZXIgdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZVxuICogYXJyYXkgZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUta2V5cyBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlS2V5cyA9IChiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSwgY2hlY2spID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICAvKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4gIC8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuICBmdWxsQ29tcGFyZSA9IGZ1bGxDb21wYXJlIHx8IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4gIC8qIHNvcnRpbmcgYnkgZnVsbE9yZGVyIGlzIGd1YXJhbnRlZWQgdG8gbWFrZSBkdXBsaWNhdGUga2V5cyovXG4gIC8qIGFkamFjZW50IGluZGVwZW5kZW50IG9mIHRoZWlyIGNvdW50cy4qL1xuICBiYWdFbnRyaWVzID0gc29ydEJ5UmFuayhiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBiYWdFbnRyaWVzO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgazAgPSBiYWdFbnRyaWVzW2kgLSAxXVswXTtcbiAgICBjb25zdCBrMSA9IGJhZ0VudHJpZXNbaV1bMF07XG4gICAgaWYgKGZ1bGxDb21wYXJlKGswLCBrMSkgPT09IDApIHtcbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IFtmdWxsQ29tcGFyZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlLCBhc3NlcnRDaGVja2VyKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5hc3NlcnROb0R1cGxpY2F0ZUtleXMoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKTtcbiAgICAgICBjb25zdCBjaGVja0JhZ0VudHJpZXMgPSAoYmFnRW50cmllcywgY2hlY2spID0+IHtcbiAgaWYgKHBhc3NTdHlsZU9mKGJhZ0VudHJpZXMpICE9PSAnY29weUFycmF5Jykge1xuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGZhbHNlLFxuICAgICAgWGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtiYWdFbnRyaWVzfWAsXG4gICAgKTtcbiAgfVxuICBpZiAoIWlzUmFua1NvcnRlZChiYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmspKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gLFxuICAgICk7XG4gIH1cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKSB7XG4gICAgaWYgKFxuICAgICAgcGFzc1N0eWxlT2YoZW50cnkpICE9PSAnY29weUFycmF5JyB8fFxuICAgICAgZW50cnkubGVuZ3RoICE9PSAyIHx8XG4gICAgICB0eXBlb2YgZW50cnlbMV0gIT09ICdiaWdpbnQnXG4gICAgKSB7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgYmUgcGFpciBvZiBhIGtleSBhbmQgYSBiaWdpbnQgcmVwcmVzZW50aW5nIGEgY291bnQ6ICR7ZW50cnl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChlbnRyeVsxXSA8IDEpIHtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBoYXZlIGEgcG9zaXRpdmUgY291bnQ6ICR7ZW50cnl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIEtleSB0eXBlcyovXG4gIHJldHVybiBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLCB1bmRlZmluZWQsIGNoZWNrKTtcbn07JGjNj19vbmNlLmNoZWNrQmFnRW50cmllcyhjaGVja0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNoZWNrQmFnRW50cmllcyk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sgLS0gZG9lc24ndCB1bmRlcnN0YW5kIGFzc2VydHMqL1xuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHthc3NlcnRzIGJhZ0VudHJpZXMgaXMgW1Bhc3NhYmxlLGJpZ2ludF1bXX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEJhZ0VudHJpZXMgPSBiYWdFbnRyaWVzID0+IHtcbiAgY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0QmFnRW50cmllcyhhc3NlcnRCYWdFbnRyaWVzKTtcbmhhcmRlbihhc3NlcnRCYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgYmlnaW50XT59IGJhZ0VudHJpZXNMaXN0XG4gKi9cbiAgICAgICBjb25zdCBjb2VyY2VUb0JhZ0VudHJpZXMgPSBiYWdFbnRyaWVzTGlzdCA9PiB7XG4gIGNvbnN0IGJhZ0VudHJpZXMgPSBzb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LCBjb21wYXJlQW50aVJhbmspO1xuICBhc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xuICByZXR1cm4gYmFnRW50cmllcztcbn07JGjNj19vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUJhZ09mRW50cmllcyA9IGJhZ0VudHJ5SXRlciA9PlxuICBtYWtlVGFnZ2VkKCdjb3B5QmFnJywgY29lcmNlVG9CYWdFbnRyaWVzKGJhZ0VudHJ5SXRlcikpOyRozY9fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIjpbImFzc2VydE5vRHVwbGljYXRlS2V5cyJdLCJjaGVja0JhZ0VudHJpZXMiOlsiY2hlY2tCYWdFbnRyaWVzIl0sImFzc2VydEJhZ0VudHJpZXMiOlsiYXNzZXJ0QmFnRW50cmllcyJdLCJjb2VyY2VUb0JhZ0VudHJpZXMiOlsiY29lcmNlVG9CYWdFbnRyaWVzIl0sIm1ha2VCYWdPZkVudHJpZXMiOlsibWFrZUJhZ09mRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAsI4MmLBEAACwRAAApAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlTZXQuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydEVsZW1lbnRzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVzIiwiY2hlY2tFbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiLCJtYWtlU2V0T2ZFbGVtZW50cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcImlzUmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBGdWxsQ29tcGFyZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCdcbiAqIEBpbXBvcnQge0NvcHlTZXQsIEtleX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgZWxlbWVudHNgIGlzIGFscmVhZHkga25vd25cbiAqIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0IHJhdGhlclxuICogdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZSBhcnJheVxuICogZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZXMgPSAoZWxlbWVudHMsIGZ1bGxDb21wYXJlLCBjaGVjaykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIC8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbiAgLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG4gIGZ1bGxDb21wYXJlID0gZnVsbENvbXBhcmUgfHwgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBlbGVtZW50cyA9IHNvcnRCeVJhbmsoZWxlbWVudHMsIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVsZW1lbnRzO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgazAgPSBlbGVtZW50c1tpIC0gMV07XG4gICAgY29uc3QgazEgPSBlbGVtZW50c1tpXTtcbiAgICBpZiAoZnVsbENvbXBhcmUoazAsIGsxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnROb0R1cGxpY2F0ZXMgPSAoZWxlbWVudHMsIGZ1bGxDb21wYXJlID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSwgYXNzZXJ0Q2hlY2tlcik7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuICAgICAgIGNvbnN0IGNoZWNrRWxlbWVudHMgPSAoZWxlbWVudHMsIGNoZWNrKSA9PiB7XG4gIGlmIChwYXNzU3R5bGVPZihlbGVtZW50cykgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7ZWxlbWVudHN9YCxcbiAgICApO1xuICB9XG4gIGlmICghaXNSYW5rU29ydGVkKGVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmspKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtlbGVtZW50c31gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLCB1bmRlZmluZWQsIGNoZWNrKTtcbn07JGjNj19vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRFbGVtZW50cyA9IGVsZW1lbnRzID0+IHtcbiAgY2hlY2tFbGVtZW50cyhlbGVtZW50cywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50c0xpc3RcbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZVRvRWxlbWVudHMgPSBlbGVtZW50c0xpc3QgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IHNvcnRCeVJhbmsoZWxlbWVudHNMaXN0LCBjb21wYXJlQW50aVJhbmspO1xuICBhc3NlcnRFbGVtZW50cyhlbGVtZW50cyk7XG4gIHJldHVybiBlbGVtZW50cztcbn07JGjNj19vbmNlLmNvZXJjZVRvRWxlbWVudHMoY29lcmNlVG9FbGVtZW50cyk7XG5oYXJkZW4oY29lcmNlVG9FbGVtZW50cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXRPZkVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weVNldCcsIGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaM2PX29uY2UubWFrZVNldE9mRWxlbWVudHMobWFrZVNldE9mRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VTZXRPZkVsZW1lbnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADbNZpAwyIAAMMiAAA5AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyIsIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLG1ha2VJdGVyYXRvcixtYWtlQXJyYXlJdGVyYXRvcixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlSXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUFycmF5SXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlQXJyYXlJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIFJlZmluZXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzIHRoYXQgaXMgYWxyZWFkeSBzb3J0ZWQgb3ZlciBpdHMga2V5cyBieSB0aGVcbiAqIGByYW5rQ29tcGFyZWAgcHJlb3JkZXIsIHdoZXJlIHRoZXJlIG1heSBiZSBpbnRlcm5hbCBydW5zIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLCBpbnRvIGFuIGl0ZXJhYmxlIHRoYXQgcmVzb2x2ZXMgdGhvc2UgdGllcyB1c2luZyBgZnVsbENvbXBhcmVgLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVj11bmtub3duXVxuICogQHBhcmFtIHtBcnJheTxbS2V5LCBWXT59IGVudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8W0tleSwgVl0+fVxuICovXG5jb25zdCBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzID0gKGVudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBLZXkgdHlwZXMqL1xuICBhc3NlcnRSYW5rU29ydGVkKGVudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IHNhbWVSYW5rSXRlcmF0b3I7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIGlmIChzYW1lUmFua0l0ZXJhdG9yKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV07XG4gICAgICAvKiBMb29rIGFoZWFkIGZvciBzYW1lLXJhbmsgdGllcy4qL1xuICAgICAgbGV0IGogPSBpICsgMTtcbiAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICYmIHJhbmtDb21wYXJlKGVudHJ5WzBdLCBlbnRyaWVzW2pdWzBdKSA9PT0gMCkge1xuICAgICAgICBqICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgLyogTm8gdGllcyBmb3VuZC4qL1xuICAgICAgICBpID0gajtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogZW50cnkgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0aWVzID0gZW50cmllcy5zbGljZShpLCBqKTtcbiAgICAgIGkgPSBqO1xuXG4gICAgICAvKiBTb3J0IHRoZSB0aWVzIGJ5IGBmdWxsQ29tcGFyZWAsIGVuZm9yY2Uga2V5IHVuaXF1ZW5lc3MsIGFuZCBkZWxlZ2F0ZSB0byovXG4gICAgICAvKiBhIHN1Yi1pdGVyYXRvci4qL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggS2V5IHR5cGVzKi9cbiAgICAgIGNvbnN0IHNvcnRlZFRpZXMgPSBzb3J0QnlSYW5rKHRpZXMsIGZ1bGxDb21wYXJlKTtcbiAgICAgIGZvciAobGV0IGsgPSAxOyBrIDwgc29ydGVkVGllcy5sZW5ndGg7IGsgKz0gMSkge1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBLZXkgdHlwZXMqL1xuICAgICAgICBjb25zdCBba2V5MF0gPSBzb3J0ZWRUaWVzW2sgLSAxXTtcbiAgICAgICAgY29uc3QgW2tleTFdID0gc29ydGVkVGllc1trXTtcbiAgICAgICAgTWF0aC5zaWduKGZ1bGxDb21wYXJlKGtleTAsIGtleTEpKSB8fFxuICAgICAgICAgIEZhaWxgRHVwbGljYXRlIGVudHJ5IGtleTogJHtrZXkwfWA7XG4gICAgICB9XG4gICAgICBzYW1lUmFua0l0ZXJhdG9yID0gbWFrZUFycmF5SXRlcmF0b3Ioc29ydGVkVGllcyk7XG4gICAgICByZXR1cm4gc2FtZVJhbmtJdGVyYXRvci5uZXh0KCk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICB9KTtcbn07XG5oYXJkZW4oZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyk7XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IG1lcmdlcyByZXZlcnNlLXJhbmstc29ydGVkIFtrZXksIHZhbHVlXSBlbnRyaWVzIG9mXG4gKiB0d28gS2V5Q29sbGVjdGlvbnMgaW50byBhIHJldmVyc2UtZnVsbC1zb3J0ZWQgW2tleSwgdmFsdWUxLCB2YWx1ZTJdIGVudHJpZXNcbiAqIGJ5IHRoZSBrZXkgdGhleSBoYXZlIGluIGNvbW1vbiwgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBmb3IgYW4gYWJzZW50IGVudHJ5IGluXG4gKiBlaXRoZXIgY29sbGVjdGlvbiBhcyBgYWJzZW50VmFsdWVgLlxuICpcbiAqIEB0ZW1wbGF0ZSBbQz1LZXlDb2xsZWN0aW9uXVxuICogQHRlbXBsYXRlIFtWPXVua25vd25dXG4gKiBAcGFyYW0ge0N9IGMxXG4gKiBAcGFyYW0ge0N9IGMyXG4gKiBAcGFyYW0geyhjb2xsZWN0aW9uOiBDKSA9PiBBcnJheTxbS2V5LCBWXT59IGdldEVudHJpZXNcbiAqIEBwYXJhbSB7YW55fSBhYnNlbnRWYWx1ZVxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8W0tleSwgViB8IGFic2VudFZhbHVlLCBWIHwgYWJzZW50VmFsdWVdPn1cbiAqL1xuICAgICAgIGNvbnN0IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gKFxuICBjMSxcbiAgYzIsXG4gIGdldEVudHJpZXMsXG4gIGFic2VudFZhbHVlLFxuKSA9PiB7XG4gIGNvbnN0IGUxID0gZ2V0RW50cmllcyhjMSk7XG4gIGNvbnN0IGUyID0gZ2V0RW50cmllcyhjMik7XG5cbiAgLyogRXN0YWJsaXNoIGEgaGlzdG9yeS1kZXBlbmRlbnQgY29tcGFyaXNvbiBzY29wZWQgdG8gdGhlIGFjdGl2ZSBpbnZvY2F0aW9uKi9cbiAgLyogYW5kIHVzZSBpdCB0byBtYXAgcmV2ZXJzZS1wcmVvcmRlcmVkIGVudHJpZXMgaW50byBhbiBpdGVyYXRvciB3aXRoIGEqL1xuICAvKiBuYXJyb3dlciB0b3RhbCBvcmRlci4qL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG4gIGNvbnN0IHggPSBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKGUxLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeSA9IGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMoZTIsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuXG4gIC8qIE1haW50YWluIGEgc2luZ2xlLXJlc3VsdCB7IGRvbmUsIGtleSwgdmFsdWUgfSBidWZmZXIgZm9yIGVhY2ggaXRlcmF0b3IqL1xuICAvKiBzbyB0aGV5IGNhbiBiZSBtZXJnZWQuKi9cbiAgbGV0IHhEb25lO1xuICBsZXQgeEtleTtcbiAgbGV0IHhWYWx1ZTtcbiAgbGV0IHlEb25lO1xuICBsZXQgeUtleTtcbiAgbGV0IHlWYWx1ZTtcbiAgY29uc3Qgbm9uRW50cnkgPSBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xuICBjb25zdCBuZXh0WCA9ICgpID0+IHtcbiAgICAheERvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFggbXVzdCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgY29uc3QgcmVzdWx0ID0geFZhbHVlO1xuICAgICh7IGRvbmU6IHhEb25lLCB2YWx1ZTogW3hLZXksIHhWYWx1ZV0gPSBub25FbnRyeSB9ID0geC5uZXh0KCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG5leHRYKCk7XG4gIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICF5RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WSBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICBjb25zdCByZXN1bHQgPSB5VmFsdWU7XG4gICAgKHsgZG9uZTogeURvbmUsIHZhbHVlOiBbeUtleSwgeVZhbHVlXSA9IG5vbkVudHJ5IH0gPSB5Lm5leHQoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbmV4dFkoKTtcbiAgcmV0dXJuIG1ha2VJdGVyYXRvcigoKSA9PiB7XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAvKiogQHR5cGUge1tLZXksIFYgfCBhYnNlbnRWYWx1ZSwgViB8IGFic2VudFZhbHVlXX0gKi9cbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKHhEb25lICYmIHlEb25lKSB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIHZhbHVlID0gW3VuZGVmaW5lZCwgYWJzZW50VmFsdWUsIGFic2VudFZhbHVlXTtcbiAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICB2YWx1ZSA9IFt5S2V5LCBhYnNlbnRWYWx1ZSwgbmV4dFkoKV07XG4gICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgYWJzZW50VmFsdWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBDb21wYXJlIHRoZSBrZXlzIHRvIGRldGVybWluZSBpZiB3ZSBzaG91bGQgcmV0dXJuIGEgbWVyZ2VkIHJlc3VsdCovXG4gICAgICAvKiBvciBhIG9uZS1zaWRlZCByZXN1bHQuKi9cbiAgICAgIGNvbnN0IGNvbXAgPSBmdWxsQ29tcGFyZSh4S2V5LCB5S2V5KTtcbiAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIG5leHRZKCldO1xuICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBhYnNlbnRWYWx1ZV07XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPiAwKSB7XG4gICAgICAgIHZhbHVlID0gW3lLZXksIGFic2VudFZhbHVlLCBuZXh0WSgpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEZhaWxgVW5leHBlY3RlZCBrZXkgY29tcGFyaXNvbiAke3EoY29tcCl9IGZvciAke3hLZXl9IHZzICR7eUtleX1gO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZSwgdmFsdWUgfSk7XG4gIH0pO1xufTskaM2PX29uY2UuZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMoZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMpO1xuaGFyZGVuKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyB0d28gS2V5Q29sbGVjdGlvbnMgb2YgdGhlIHNhbWUgdHlwZSB1c2luZ1xuICogdGhlIHByb3ZpZGVkIGVudHJpZXMgZmFjdG9yeSBhbmQgc2FtZS1rZXkgZW50cnkgdmFsdWUgY29tcGFyYXRvciAod2hlcmUgdGhlXG4gKiB2YWx1ZSBmb3IgYW4gYWJzZW50IGVudHJ5IGluIG9uZSBjb2xsZWN0aW9uIGlzIGBhYnNlbnRWYWx1ZWApLlxuICpcbiAqIElmIHRoZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgZm9yIGFueSBzaW5nbGUga2V5IGFyZSBpbmNvbXBhcmFibGUgb3IgdGhlXG4gKiBjb21wYXJpc29uIHJlc3VsdCBoYXMgdGhlIG9wcG9zaXRlIHNpZ24gb2YgdGhlIHJlc3VsdCBmb3IgYSBkaWZmZXJlbnQga2V5LFxuICogdGhlbiB0aGUgS2V5Q29sbGVjdGlvbnMgYXJlIGluY29tcGFyYWJsZS4gT3RoZXJ3aXNlLCB0aGUgY29sbGVjdGlvbnMgY29tcGFyZVxuICogYnkgdGhlIHJlc3VsdCBvZiBhbnkgbm9uLWVxdWFsIGVudHJ5IGNvbXBhcmlzb24sIG9yIGNvbXBhcmUgZXF1YWwgaWYgdGhlcmUgaXNcbiAqIG5vIG5vbi1lcXVhbCBlbnRyeSBjb21wYXJpc29uIHJlc3VsdC5cbiAqIEZvciBleGFtcGxlLCBnaXZlbiBDb3B5QmFncyBYIGFuZCBZIGFuZCBhIHZhbHVlIGNvbXBhcmF0b3IgdGhhdCBnb2VzIGJ5IGNvdW50XG4gKiAoZGVmYXVsdGluZyBhYnNlbnQga2V5cyB0byBhIGNvdW50IG9mIDApLCBYIGlzIHNtYWxsZXIgdGhhbiBZIChgcmVzdWx0IDwgMGApXG4gKiBpZmYgdGhlcmUgYXJlIG5vIGtleXMgaW4gWCB0aGF0IGFyZSBlaXRoZXIgYWJzZW50IGZyb20gWVxuICogKGBjb21wYXJlVmFsdWVzKHhDb3VudCwgYWJzZW50VmFsdWUpID4gMGApIG9yIHByZXNlbnQgaW4gWSB3aXRoIGEgbG93ZXIgY291bnRcbiAqIChgY29tcGFyZVZhbHVlcyh4Q291bnQsIHlDb3VudCkgPiAwYCkgQU5EIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBrZXkgaW4gWSB0aGF0XG4gKiBpcyBlaXRoZXIgYWJzZW50IGZyb20gWCAoYGNvbXBhcmVWYWx1ZXMoYWJzZW50VmFsdWUsIHlDb3VudCkgPCAwYCkgb3IgcHJlc2VudFxuICogd2l0aCBhIGxvd2VyIGNvdW50IChgY29tcGFyZVZhbHVlcyh4Q291bnQsIHlDb3VudCkgPCAwYCkuXG4gKlxuICogVGhpcyBjYW4gYmUgZ2VuZXJhbGl6ZWQgdG8gdmlydHVhbCBjb2xsZWN0aW9ucyBpbiB0aGUgZnV0dXJlIGJ5IHJlcGxhY2luZ1xuICogYGdldEVudHJpZXMgPT4gQXJyYXlgIHdpdGggYGdlbmVyYXRlRW50cmllcyA9PiBJdGVyYWJsZUl0ZXJhdG9yYC5cbiAqXG4gKiBAdGVtcGxhdGUgW0M9S2V5Q29sbGVjdGlvbl1cbiAqIEB0ZW1wbGF0ZSBbVj11bmtub3duXVxuICogQHBhcmFtIHsoY29sbGVjdGlvbjogQykgPT4gQXJyYXk8W0tleSwgVl0+fSBnZXRFbnRyaWVzXG4gKiBAcGFyYW0ge1Z9IGFic2VudFZhbHVlXG4gKiBAcGFyYW0ge0tleUNvbXBhcmV9IGNvbXBhcmVWYWx1ZXNcbiAqIEByZXR1cm5zIHsobGVmdDogQywgcmlnaHQ6IEMpID0+IEtleUNvbXBhcmlzb259XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29tcGFyZUNvbGxlY3Rpb24gPSAoZ2V0RW50cmllcywgYWJzZW50VmFsdWUsIGNvbXBhcmVWYWx1ZXMpID0+XG4gIGhhcmRlbigobGVmdCwgcmlnaHQpID0+IHtcbiAgICBjb25zdCBtZXJnZWQgPSBnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbiAgICAgIGxlZnQsXG4gICAgICByaWdodCxcbiAgICAgIGdldEVudHJpZXMsXG4gICAgICBhYnNlbnRWYWx1ZSxcbiAgICApO1xuICAgIGxldCBsZWZ0SXNCaWdnZXIgPSBmYWxzZTtcbiAgICBsZXQgcmlnaHRJc0JpZ2dlciA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW19rZXksIGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZV0gb2YgbWVyZ2VkKSB7XG4gICAgICBjb25zdCBjb21wID0gY29tcGFyZVZhbHVlcyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpO1xuICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlKi9cbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgIC8qIEJhc2VkIG9uIHRoaXMga2V5LCBsZWZ0IDwgcmlnaHQuKi9cbiAgICAgICAgcmlnaHRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPiAwKSB7XG4gICAgICAgIC8qIEJhc2VkIG9uIHRoaXMga2V5LCBsZWZ0ID4gcmlnaHQuKi9cbiAgICAgICAgbGVmdElzQmlnZ2VyID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE51bWJlci5pc05hTihjb21wKSB8fFxuICAgICAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICAgICAgRmFpbGBVbmV4cGVjdGVkIHZhbHVlIGNvbXBhcmlzb24gJHtxKGNvbXApfSBmb3IgJHtsZWZ0VmFsdWV9IHZzICR7cmlnaHRWYWx1ZX1gO1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgaWYgKGxlZnRJc0JpZ2dlciAmJiByaWdodElzQmlnZ2VyKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG4gICAgcmV0dXJuIGxlZnRJc0JpZ2dlciA/IDEgOiByaWdodElzQmlnZ2VyID8gLTEgOiAwO1xuICB9KTskaM2PX29uY2UubWFrZUNvbXBhcmVDb2xsZWN0aW9uKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG5oYXJkZW4obWFrZUNvbXBhcmVDb2xsZWN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIjpbImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIl0sIm1ha2VDb21wYXJlQ29sbGVjdGlvbiI6WyJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmcQ4AVcoAABXKAAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlS2V5cyxtYWtlQmFnT2ZFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIixbJGjNj19hID0+IChhc3NlcnROb0R1cGxpY2F0ZUtleXMgPSAkaM2PX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLFskaM2PX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RnVsbENvbXBhcmUsIFJhbmtDb21wYXJlfSBmcm9tICdAZW5kby9tYXJzaGFsJ1xuICogQGltcG9ydCB7S2V5fSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKiBCYXNlZCBvbiBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCBidXQgYWx0ZXJlZCBmb3IgdGhlIGJhZyByZXByZXNlbnRhdGlvbi4qL1xuLyogVE9ETyBzaGFyZSBtb3JlIGNvZGUgd2l0aCB0aGF0IGZpbGUgYW5kIGtleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlXG4gKiB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBiYWdFbnRyaWVzIHdob3NlIGtleXMgYXJlIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgYmFnRW50cmllcyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGJhZ0VudHJpZXNgIGFycmF5XG4gKiBhY2NvcmRpbmdcbiAqIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50XT59XG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydCA9IChiYWdFbnRyaWVzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChiYWdFbnRyaWVzLCByYW5rQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBiYWdFbnRyaWVzO1xuICBsZXQgaSA9IDA7XG4gIGxldCBvcHRJbm5lckl0ZXJhdG9yO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT5cbiAgICAgIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAob3B0SW5uZXJJdGVyYXRvcikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoKi9cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGJhZ0VudHJpZXNbaV07XG4gICAgICAgICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICBqIDwgbGVuZ3RoICYmXG4gICAgICAgICAgICAgIHJhbmtDb21wYXJlKGVudHJ5WzBdLCBiYWdFbnRyaWVzW2pdWzBdKSA9PT0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID09PSBpICsgMSkge1xuICAgICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogZW50cnkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaW1pbGFyUnVuID0gYmFnRW50cmllcy5zbGljZShpLCBqKTtcbiAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgY29uc3QgcmVzb3J0ZWQgPSBzb3J0QnlSYW5rKHNpbWlsYXJSdW4sIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbiAgICAgICAgICAgIC8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbiAgICAgICAgICAgIC8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbiAgICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cyhyZXNvcnRlZCwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuICAgICAgICAgICAgLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4gICAgICAgICAgICAvKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4gICAgICAgICAgICAvKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbiAgICAgICAgICAgIC8qIGFzIGlzLiovXG4gICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gcmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IFtudWxsLCAwbl0gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHhiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geWJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlID0gKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGNvbnN0IHhzID0gYmFnV2luZG93UmVzb3J0KHhiYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeXMgPSBiYWdXaW5kb3dSZXNvcnQoeWJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgLyogVGhlc2Ugc2l4IGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbiAgICAgIC8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4gICAgICAvKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbiAgICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhjO1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeWM7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoe1xuICAgICAgICAgIGRvbmU6IHhEb25lLFxuICAgICAgICAgIHZhbHVlOiBbeCwgeGNdLFxuICAgICAgICB9ID0geGkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WCgpO1xuXG4gICAgICBjb25zdCB5aSA9IHlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICAgICAheURvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHtcbiAgICAgICAgICBkb25lOiB5RG9uZSxcbiAgICAgICAgICB2YWx1ZTogW3ksIHljXSxcbiAgICAgICAgfSA9IHlpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFkoKTtcblxuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAvKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xuICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xuICAgICAgICAgICAgdmFsdWUgPSBbbnVsbCwgMG4sIDBuXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICAgICAgICAvKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbiAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCB5Y107XG4gICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgICAgICAgIC8qIG9ubHkgeHMgYXJlIGxlZnQqL1xuICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIDBuXTtcbiAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBmdWxsQ29tcGFyZSh4LCB5KTtcbiAgICAgICAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgICAgICAgIC8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIHljXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgICAgICAgLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCB4YywgMG5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuICAgICAgICAgICAgICBjb21wID4gMCB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG4gICAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCB5Y107XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTtcbmhhcmRlbihtZXJnZSk7XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNTdXBlcnNldCBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjIDwgeWMpIHtcbiAgICAgIC8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNEaXNqb2ludCBhcyB3ZWxsLiovXG4vKiBUaGUgY29kZSBpcyBpZGVudGljYWwuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBiYWdJdGVySXNEaXNqb2ludCA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnQsYmlnaW50XVtdfSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJVbmlvbiA9IHh5aSA9PiB7XG4gIC8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICByZXN1bHQucHVzaChbbSwgeGMgKyB5Y10pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVySW50ZXJzZWN0aW9uID0geHlpID0+IHtcbiAgLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGNvbnN0IG1jID0geGMgPD0geWMgPyB4YyA6IHljO1xuICAgIHJlc3VsdC5wdXNoKFttLCBtY10pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCA9IHh5aSA9PiB7XG4gIC8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBjb25zdCBtYyA9IHhjIC0geWM7XG4gICAgbWMgPj0gMG4gfHwgRmFpbGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbiAgICBpZiAobWMgPj0gMW4pIHtcbiAgICAgIC8qIHRoZSB4IHdhcyBub3QgaW4geSovXG4gICAgICByZXN1bHQucHVzaChbbSwgbWNdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IG1lcmdlaWZ5ID0gYmFnSXRlck9wID0+ICh4YmFnRW50cmllcywgeWJhZ0VudHJpZXMpID0+XG4gIGJhZ0l0ZXJPcChtZXJnZSh4YmFnRW50cmllcywgeWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWcgPSBtZXJnZWlmeShiYWdJdGVySXNTdXBlcmJhZyk7XG5jb25zdCBiYWdFbnRyaWVzSXNEaXNqb2ludCA9IG1lcmdlaWZ5KGJhZ0l0ZXJJc0Rpc2pvaW50KTtcbmNvbnN0IGJhZ0VudHJpZXNVbmlvbiA9IG1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uID0gbWVyZ2VpZnkoYmFnSXRlckludGVyc2VjdGlvbik7XG5jb25zdCBiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCA9IG1lcmdlaWZ5KGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3QmFnaWZ5ID0gYmFnRW50cmllc09wID0+ICh4YmFnLCB5YmFnKSA9PlxuICBiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLCB5YmFnLnBheWxvYWQpO1xuXG5jb25zdCBiYWdpZnkgPSBiYWdFbnRyaWVzT3AgPT4gKHhiYWcsIHliYWcpID0+XG4gIG1ha2VCYWdPZkVudHJpZXMoYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCwgeWJhZy5wYXlsb2FkKSk7XG5cbiAgICAgICBjb25zdCBiYWdJc1N1cGVyYmFnID0gcmF3QmFnaWZ5KGJhZ0VudHJpZXNJc1N1cGVyYmFnKTskaM2PX29uY2UuYmFnSXNTdXBlcmJhZyhiYWdJc1N1cGVyYmFnKTtcbiAgICAgICBjb25zdCBiYWdJc0Rpc2pvaW50ID0gcmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaM2PX29uY2UuYmFnSXNEaXNqb2ludChiYWdJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBiYWdVbmlvbiA9IGJhZ2lmeShiYWdFbnRyaWVzVW5pb24pOyRozY9fb25jZS5iYWdVbmlvbihiYWdVbmlvbik7XG4gICAgICAgY29uc3QgYmFnSW50ZXJzZWN0aW9uID0gYmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5iYWdJbnRlcnNlY3Rpb24oYmFnSW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBiYWdEaXNqb2ludFN1YnRyYWN0ID0gYmFnaWZ5KGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyJdLCJiYWdJc0Rpc2pvaW50IjpbImJhZ0lzRGlzam9pbnQiXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiJdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdB+PGWUvAABlLwAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlTZXQuanMiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLFskaM2PX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlcyA9ICRozY9fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLFskaM2PX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0Z1bGxDb21wYXJlLCBSYW5rQ29tcGFyZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCdcbiAqIEBpbXBvcnQge0tleUNvbXBhcmlzb259IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGgga2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMuKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGVsZW1lbnRzIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGVsZW1lbnRzYCBhcnJheSBhY2NvcmRpbmdcbiAqICB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCB3aW5kb3dSZXNvcnQgPSAoZWxlbWVudHMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKGVsZW1lbnRzLCByYW5rQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBlbGVtZW50cztcbiAgbGV0IGkgPSAwO1xuICBsZXQgb3B0SW5uZXJJdGVyYXRvcjtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+XG4gICAgICBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdElubmVySXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCovXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50c1tpXTtcbiAgICAgICAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCAmJiByYW5rQ29tcGFyZSh2YWx1ZSwgZWxlbWVudHNbal0pID09PSAwKSB7XG4gICAgICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID09PSBpICsgMSkge1xuICAgICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJSdW4gPSBlbGVtZW50cy5zbGljZShpLCBqKTtcbiAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgY29uc3QgcmVzb3J0ZWQgPSBzb3J0QnlSYW5rKHNpbWlsYXJSdW4sIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbiAgICAgICAgICAgIC8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbiAgICAgICAgICAgIC8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbiAgICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlcyhyZXNvcnRlZCwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuICAgICAgICAgICAgLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4gICAgICAgICAgICAvKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4gICAgICAgICAgICAvKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbiAgICAgICAgICAgIC8qIGFzIGlzLiovXG4gICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gcmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0geGVsZW1lbnRzXG4gKiBAcGFyYW0ge1RbXX0geWVsZW1lbnRzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZSA9ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGNvbnN0IHhzID0gd2luZG93UmVzb3J0KHhlbGVtZW50cywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHlzID0gd2luZG93UmVzb3J0KHllbGVtZW50cywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAvKiBUaGVzZSBmb3VyIGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbiAgICAgIC8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4gICAgICAvKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbiAgICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoeyBkb25lOiB4RG9uZSwgdmFsdWU6IHggfSA9IHhpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFgoKTtcblxuICAgICAgY29uc3QgeWkgPSB5c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAgICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7IGRvbmU6IHlEb25lLCB2YWx1ZTogeSB9ID0geWkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WSgpO1xuXG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIC8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG4gICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG4gICAgICAgICAgICB2YWx1ZSA9IFtudWxsLCAwbiwgMG5dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgICAgICAgIC8qIG9ubHkgeXMgYXJlIGxlZnQqL1xuICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIDFuXTtcbiAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgICAgICAgLyogb25seSB4cyBhcmUgbGVmdCovXG4gICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMG5dO1xuICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHgsIHkpO1xuICAgICAgICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgICAgICAgLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICAgICAgICAvKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAwbl07XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG4gICAgICAgICAgICAgIGNvbXAgPiAwIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbiAgICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIDFuXTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIF95Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID09PSAwbikge1xuICAgICAgLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGl0ZXJJc0Rpc2pvaW50ID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuY29uc3QgaXRlckNvbXBhcmUgPSB4eWkgPT4ge1xuICBsZXQgbG9uZVkgPSBmYWxzZTtcbiAgbGV0IGxvbmVYID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA9PT0gMG4pIHtcbiAgICAgIC8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xuICAgICAgbG9uZVkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoeWMgPT09IDBuKSB7XG4gICAgICAvKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcnNldCBvZiB4Ki9cbiAgICAgIGxvbmVYID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGxvbmVYICYmIGxvbmVZKSB7XG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgfVxuICBpZiAobG9uZVgpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmIChsb25lWSkge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIHtcbiAgICAoIWxvbmVYICYmICFsb25lWSkgfHxcbiAgICAgIEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsIGxvbmVZXSl9YDtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlclVuaW9uID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDBuKSB7XG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeWMgPj0gMG4gfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG4gICAgICAvKiBpZiB4IGFuZCB5IHdlcmUgYm90aCByZWFkeSwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCBhbmQqL1xuICAgICAgLyogYWJvdmUgY2xhdXNlIGFscmVhZHkgdG9vayBjYXJlIG9mIGl0LiBPdGhlcndpc2UgcHVzaCBoZXJlLiovXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFVuaW9uID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgeGMgPT09IDBuIHx8IHljID09PSAwbiB8fCBGYWlsYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gO1xuICAgIGlmICh4YyA+PSAxbikge1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHljID49IDFuIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVySW50ZXJzZWN0aW9uID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyRGlzam9pbnRTdWJ0cmFjdCA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHhjID49IDFuIHx8IEZhaWxgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG4gICAgaWYgKHljID09PSAwbikge1xuICAgICAgLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgbWVyZ2VpZnkgPSBpdGVyT3AgPT4gKHhlbGVtZW50cywgeWVsZW1lbnRzKSA9PlxuICBpdGVyT3AobWVyZ2UoeGVsZW1lbnRzLCB5ZWxlbWVudHMpKTtcblxuICAgICAgIGNvbnN0IGVsZW1lbnRzSXNTdXBlcnNldCA9IG1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaM2PX29uY2UuZWxlbWVudHNJc1N1cGVyc2V0KGVsZW1lbnRzSXNTdXBlcnNldCk7XG4gICAgICAgY29uc3QgZWxlbWVudHNJc0Rpc2pvaW50ID0gbWVyZ2VpZnkoaXRlcklzRGlzam9pbnQpOyRozY9fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBlbGVtZW50c0NvbXBhcmUgPSBtZXJnZWlmeShpdGVyQ29tcGFyZSk7JGjNj19vbmNlLmVsZW1lbnRzQ29tcGFyZShlbGVtZW50c0NvbXBhcmUpO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzVW5pb24gPSBtZXJnZWlmeShpdGVyVW5pb24pOyRozY9fb25jZS5lbGVtZW50c1VuaW9uKGVsZW1lbnRzVW5pb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9IG1lcmdlaWZ5KGl0ZXJEaXNqb2ludFVuaW9uKTskaM2PX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG4gICAgICAgY29uc3QgZWxlbWVudHNJbnRlcnNlY3Rpb24gPSBtZXJnZWlmeShpdGVySW50ZXJzZWN0aW9uKTskaM2PX29uY2UuZWxlbWVudHNJbnRlcnNlY3Rpb24oZWxlbWVudHNJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9IG1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2UuZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd1NldGlmeSA9IGVsZW1lbnRzT3AgPT4gKHhzZXQsIHlzZXQpID0+XG4gIGVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLCB5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnkgPSBlbGVtZW50c09wID0+ICh4c2V0LCB5c2V0KSA9PlxuICBtYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCwgeXNldC5wYXlsb2FkKSk7XG5cbiAgICAgICBjb25zdCBzZXRJc1N1cGVyc2V0ID0gcmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjNj19vbmNlLnNldElzU3VwZXJzZXQoc2V0SXNTdXBlcnNldCk7XG4gICAgICAgY29uc3Qgc2V0SXNEaXNqb2ludCA9IHJhd1NldGlmeShlbGVtZW50c0lzRGlzam9pbnQpOyRozY9fb25jZS5zZXRJc0Rpc2pvaW50KHNldElzRGlzam9pbnQpO1xuICAgICAgIGNvbnN0IHNldFVuaW9uID0gc2V0aWZ5KGVsZW1lbnRzVW5pb24pOyRozY9fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG4gICAgICAgY29uc3Qgc2V0RGlzam9pbnRVbmlvbiA9IHNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRozY9fb25jZS5zZXREaXNqb2ludFVuaW9uKHNldERpc2pvaW50VW5pb24pO1xuICAgICAgIGNvbnN0IHNldEludGVyc2VjdGlvbiA9IHNldGlmeShlbGVtZW50c0ludGVyc2VjdGlvbik7JGjNj19vbmNlLnNldEludGVyc2VjdGlvbihzZXRJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IHNldERpc2pvaW50U3VidHJhY3QgPSBzZXRpZnkoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiJdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiJdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXRpaQisvAAArLwAANgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4va2V5cy9jaGVja0tleS5qcyJdLCJleHBvcnRzIjpbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxBcmdHdWFyZExpc3RTaGFwZSxBd2FpdEFyZ0d1YXJkU2hhcGUsSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsSW50ZXJmYWNlR3VhcmRTaGFwZSxNLE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLE1ldGhvZEd1YXJkU2hhcGUsUmF3R3VhcmRTaGFwZSxTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxTeW5jVmFsdWVHdWFyZFNoYXBlLGFzc2VydEF3YWl0QXJnR3VhcmQsbWF0Y2hlcyxtdXN0TWF0Y2gsZ2V0Q29weU1hcEtleXMsbWFrZUNvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiLi9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIkFyZ0d1YXJkTGlzdFNoYXBlXCIsWyRozY9fYSA9PiAoQXJnR3VhcmRMaXN0U2hhcGUgPSAkaM2PX2EpXV0sW1wiQXdhaXRBcmdHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoQXdhaXRBcmdHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlXCIsWyRozY9fYSA9PiAoSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiSW50ZXJmYWNlR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGVcIixbJGjNj19hID0+IChNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9ICRozY9fYSldXSxbXCJNZXRob2RHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJSYXdHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoUmF3R3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZVwiLFskaM2PX2EgPT4gKFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlID0gJGjNj19hKV1dLFtcIlN5bmNWYWx1ZUd1YXJkU2hhcGVcIixbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcImFzc2VydEF3YWl0QXJnR3VhcmRcIixbJGjNj19hID0+IChhc3NlcnRBd2FpdEFyZ0d1YXJkID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImdldENvcHlNYXBLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEtleXMgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIixbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVNZXRob2ROYW1lfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0F3YWl0QXJnR3VhcmQsIEF3YWl0QXJnR3VhcmRQYXlsb2FkLCBJbnRlcmZhY2VHdWFyZCwgSW50ZXJmYWNlR3VhcmRQYXlsb2FkLCBNZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRQYXlsb2FkfSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKiBUaGUgZ2V0Kkd1YXJkUGF5bG9hZCBmdW5jdGlvbnMgZXhpc3QgdG8gYWRhcHQgdG8gdGhlIHdvcmxkcyBib3RoKi9cbi8qIGJlZm9yZSBhbmQgYWZ0ZXIgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMiAuIFdoZW4qL1xuLyogZ2l2ZW4gc29tZXRoaW5nIHRoYXQgd291bGQgYmUgdGhlIGV4cGVjdGVkIGd1YXJkIGluIGVpdGhlciB3b3JsZCwqL1xuLyogaXQgcmV0dXJucyBhICpHdWFyZFBheWxvYWQgdGhhdCBpcyB2YWxpZCBpbiB0aGUgY3VycmVudCB3b3JsZC4gVGh1cyovXG4vKiBpdCBoZWxwcyBuZXcgY29uc3VtZXJzIG9mIHRoZXNlIGd1YXJkcyBjb3BlIHdpdGggb2xkIGNvZGUgdGhhdCovXG4vKiB3b3VsZCBjb25zdHJ1Y3QgYW5kIHNlbmQgdGhlc2UgZ3VhcmRzLiovXG5cbi8qIEJlY2F1c2UgdGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgbGVnYWN5IGFkYXB0YXRpb24gaXMgaW4gQGVuZG8vZXhvKi9cbi8qIG9yIHBhY2thZ2VzIHRoYXQgZGVwZW5kIG9uIGl0LCB0aGUgdGVzdHMgZm9yIHRoaXMgbGVnYWN5IGFkYXB0YXRpb24qL1xuLyogYXJlIGZvdW5kIGluIHRoZSBAZW5kby9leG8gYHRlc3QtbGVnYWN5LWd1YXJkLXRvbGVyYW5jZS5qc2AuKi9cblxuLyogVW5saWtlIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSwqL1xuLyogYW5kIExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEqL1xuLyogTGVnYWN5UmF3R3VhcmRTaGFwZSwgYmVjYXVzZSByYXcgZ3VhcmRzIHdlcmUgaW50cm9kdWNlZCBhdCovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODMxICwgd2hpY2ggd2FzIG1lcmdlZCB3ZWxsIGFmdGVyKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIgLiBUaHVzLCB0aGVyZSB3YXMgbmV2ZXIgYSovXG4vKiBga2xhc3M6YCBmb3JtIG9mIHRoZSByYXcgZ3VhcmQuKi9cblxuLyogVE9ETyBBdCBzdWNoIGEgdGltZSB0aGF0IHdlIGRlY2lkZSB3ZSBubyBsb25nZXIgbmVlZCB0byBzdXBwb3J0IGNvZGUqL1xuLyogcHJlY2VkaW5nIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIgb3IgZ3VhcmQgZGF0YSovXG4vKiBnZW5lcmF0ZWQgYnkgdGhhdCBjb2RlLCBhbGwgdGhlIGFkYXB0YXRpb24gY29tcGxleGl0eSBpbiB0aGlzIGZpbGUqL1xuLyogc2hvdWxkIGJlIGRlbGV0ZWQuKi9cblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEF3YWl0QXJnR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUgPSBoYXJkZW4oe1xuICBrbGFzczogJ2F3YWl0QXJnJyxcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpLFxufSk7XG5cbi8qKlxuICogQnkgdXNpbmcgdGhpcyBhYnN0cmFjdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIHByb3BlcnRpZXMgZGlyZWN0bHksXG4gKiB3ZSBzbW9vdGggdGhlIHRyYW5zaXRpb24gdG8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMixcbiAqIHRvbGVyYXRpbmcgYm90aCB0aGUgbGVnYWN5IGFuZCBjdXJyZW50IGd1YXJkIHNoYXBlcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGVjaG5pY2FsbHksIHRvbGVyYXRpbmcgdGhlIG9sZCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGVcbiAqIGlzIGFuIGV4cGxvaXRhYmxlIGJ1ZywgaW4gdGhhdCBhIHJlY29yZCB0aGF0IG1hdGNoZXMgdGhpc1xuICogc2hhcGUgaXMgYWxzbyBhIHZhbGlkIHBhcmFtZXRlciBwYXR0ZXJuIHRoYXQgc2hvdWxkIGFsbG93XG4gKiBhbiBhcmd1bWVudCB0aGF0IG1hdGNoZXMgdGhhdCBwYXR0ZXJuLCBpLmUuLCBhIGNvcHlSZWNvcmQgYXJndW1lbnQgdGhhdFxuICogYXQgbGVhc3QgY29udGFpbnMgYSBga2xhc3M6ICdhd2FpdEFyZ0d1YXJkJ2AgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtBd2FpdEFyZ0d1YXJkfSBhd2FpdEFyZ0d1YXJkXG4gKiBAcmV0dXJucyB7QXdhaXRBcmdHdWFyZFBheWxvYWR9XG4gKi9cbiAgICAgICBjb25zdCBnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCA9IGF3YWl0QXJnR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhhd2FpdEFyZ0d1YXJkLCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpKSB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBjb25zdCB7IGtsYXNzOiBfLCAuLi5wYXlsb2FkIH0gPSBhd2FpdEFyZ0d1YXJkO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cbiAgYXNzZXJ0QXdhaXRBcmdHdWFyZChhd2FpdEFyZ0d1YXJkKTtcbiAgcmV0dXJuIGF3YWl0QXJnR3VhcmQucGF5bG9hZDtcbn07JGjNj19vbmNlLmdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCk7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lTeW5jTWV0aG9kR3VhcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBrbGFzczogJ21ldGhvZEd1YXJkJyxcbiAgICBjYWxsS2luZDogJ3N5bmMnLFxuICAgIGFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gICAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4gIHtcbiAgICBvcHRpb25hbEFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gICAgcmVzdEFyZ0d1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEFyZ0d1YXJkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lBcmdHdWFyZFNoYXBlID0gTS5vcihcbiAgUmF3R3VhcmRTaGFwZSxcbiAgQXdhaXRBcmdHdWFyZFNoYXBlLFxuICBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUsXG4gIE0ucGF0dGVybigpLFxuKTtcbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBBcmdHdWFyZExpc3RTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKExlZ2FjeUFyZ0d1YXJkU2hhcGUpO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUFzeW5jTWV0aG9kR3VhcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBrbGFzczogJ21ldGhvZEd1YXJkJyxcbiAgICBjYWxsS2luZDogJ2FzeW5jJyxcbiAgICBhcmdHdWFyZHM6IExlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlLFxuICAgIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuICB7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICAgIHJlc3RBcmdHdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbik7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBNZXRob2RHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUgPSBNLm9yKFxuICBMZWdhY3lTeW5jTWV0aG9kR3VhcmRTaGFwZSxcbiAgTGVnYWN5QXN5bmNNZXRob2RHdWFyZFNoYXBlLFxuKTtcblxuY29uc3QgYWRhcHRMZWdhY3lBcmdHdWFyZCA9IGFyZ0d1YXJkID0+XG4gIG1hdGNoZXMoYXJnR3VhcmQsIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSlcbiAgICA/IE0uYXdhaXQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkKVxuICAgIDogYXJnR3VhcmQ7XG5cbi8qKlxuICogQnkgdXNpbmcgdGhpcyBhYnN0cmFjdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIHByb3BlcnRpZXMgZGlyZWN0bHksXG4gKiB3ZSBzbW9vdGggdGhlIHRyYW5zaXRpb24gdG8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMixcbiAqIHRvbGVyYXRpbmcgYm90aCB0aGUgbGVnYWN5IGFuZCBjdXJyZW50IGd1YXJkIHNoYXBlcy5cbiAqXG4gKiBVbmxpa2UgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlLCB0b2xlcmF0aW5nIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGVcbiAqIGRvZXMgbm90IHNlZW0gbGlrZSBhIGN1cnJlbnRseSBleHBsb2l0YWJsZSBidWcsIGJlY2F1c2UgdGhlcmUgaXMgbm90XG4gKiBjdXJyZW50bHkgYW55IGNvbnRleHQgd2hlcmUgZWl0aGVyIGEgbWV0aG9kR3VhcmQgb3IgYSBjb3B5UmVjb3JkIHdvdWxkXG4gKiBib3RoIGJlIG1lYW5pbmdmdWwuXG4gKlxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEByZXR1cm5zIHtNZXRob2RHdWFyZFBheWxvYWR9XG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2RHdWFyZFBheWxvYWQgPSBtZXRob2RHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKG1ldGhvZEd1YXJkLCBNZXRob2RHdWFyZFNoYXBlKSkge1xuICAgIHJldHVybiBtZXRob2RHdWFyZC5wYXlsb2FkO1xuICB9XG4gIG11c3RNYXRjaChtZXRob2RHdWFyZCwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSwgJ2xlZ2FjeU1ldGhvZEd1YXJkJyk7XG4gIGNvbnN0IHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIGtsYXNzOiBfLFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgY2FsbEtpbmQsXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICByZXR1cm5HdWFyZCxcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkO1xuICBsZXQge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgYXJnR3VhcmRzLFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gIH0gPSBtZXRob2RHdWFyZDtcbiAgaWYgKGNhbGxLaW5kID09PSAnYXN5bmMnKSB7XG4gICAgYXJnR3VhcmRzID0gYXJnR3VhcmRzLm1hcChhZGFwdExlZ2FjeUFyZ0d1YXJkKTtcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9XG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyAmJiBvcHRpb25hbEFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IGhhcmRlbih7XG4gICAgY2FsbEtpbmQsXG4gICAgYXJnR3VhcmRzLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgICByZXR1cm5HdWFyZCxcbiAgfSk7XG4gIC8qIGVuc3VyZSB0aGUgYWRhcHRhdGlvbiBzdWNjZWVkZWQuKi9cbiAgbXVzdE1hdGNoKHBheWxvYWQsIE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLCAnaW50ZXJuYWxNZXRob2RHdWFyZEFkYXB0b3InKTtcbiAgcmV0dXJuIHBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRNZXRob2RHdWFyZFBheWxvYWQoZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VOYW1lOiBNLnN0cmluZygpLFxuICAgIG1ldGhvZEd1YXJkczogTS5yZWNvcmRPZihcbiAgICAgIE0uc3RyaW5nKCksXG4gICAgICBNLm9yKE1ldGhvZEd1YXJkU2hhcGUsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpLFxuICAgICksXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0R3VhcmRzOiBNLm9yKE0udW5kZWZpbmVkKCksICdwYXNzYWJsZScsICdyYXcnKSxcbiAgICBzbG9wcHk6IE0uYm9vbGVhbigpLFxuICAgIC8qIFRoZXJlIGlzIG5vIG5lZWQgdG8gYWNjb21tb2RhdGUgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSBpbiovXG4gICAgLyogdGhpcyBwb3NpdGlvbiwgc2luY2UgYHN5bWJvbE1ldGhvZEd1YXJkcyBoYXBwZW5lZCovXG4gICAgLyogYWZ0ZXIgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMiovXG4gICAgc3ltYm9sTWV0aG9kR3VhcmRzOiBNLm1hcE9mKE0uc3ltYm9sKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuKTtcblxuY29uc3QgYWRhcHRNZXRob2RHdWFyZCA9IG1ldGhvZEd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMobWV0aG9kR3VhcmQsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbEtpbmQsXG4gICAgICBhcmdHdWFyZHMsXG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgICAgcmVzdEFyZ0d1YXJkID0gTS5hbnkoKSxcbiAgICAgIHJldHVybkd1YXJkLFxuICAgIH0gPSBnZXRNZXRob2RHdWFyZFBheWxvYWQobWV0aG9kR3VhcmQpO1xuICAgIGNvbnN0IG1DYWxsID0gY2FsbEtpbmQgPT09ICdzeW5jJyA/IE0uY2FsbCA6IE0uY2FsbFdoZW47XG4gICAgcmV0dXJuIG1DYWxsKC4uLmFyZ0d1YXJkcylcbiAgICAgIC5vcHRpb25hbCguLi5vcHRpb25hbEFyZ0d1YXJkcylcbiAgICAgIC5yZXN0KHJlc3RBcmdHdWFyZClcbiAgICAgIC5yZXR1cm5zKHJldHVybkd1YXJkKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kR3VhcmQ7XG59O1xuXG4vKipcbiAqIEJ5IHVzaW5nIHRoaXMgYWJzdHJhY3Rpb24gcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBwcm9wZXJ0aWVzIGRpcmVjdGx5LFxuICogd2Ugc21vb3RoIHRoZSB0cmFuc2l0aW9uIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIsXG4gKiB0b2xlcmF0aW5nIGJvdGggdGhlIGxlZ2FjeSBhbmQgY3VycmVudCBndWFyZCBzaGFwZXMuXG4gKlxuICogVW5saWtlIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSwgdG9sZXJhdGluZyBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlXG4gKiBkb2VzIG5vdCBzZWVtIGxpa2UgYSBjdXJyZW50bHkgZXhwbG9pdGFibGUgYnVnLCBiZWNhdXNlIHRoZXJlIGlzIG5vdFxuICogY3VycmVudGx5IGFueSBjb250ZXh0IHdoZXJlIGVpdGhlciBhbiBpbnRlcmZhY2VHdWFyZCBvciBhIGNvcHlSZWNvcmQgd291bGRcbiAqIGJvdGggYmUgbWVhbmluZ2Z1bC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBNZXRob2RHdWFyZD59IFtUPVJlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBNZXRob2RHdWFyZD5dXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPFQ+fSBpbnRlcmZhY2VHdWFyZFxuICogQHJldHVybnMge0ludGVyZmFjZUd1YXJkUGF5bG9hZDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9IGludGVyZmFjZUd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMoaW50ZXJmYWNlR3VhcmQsIEludGVyZmFjZUd1YXJkU2hhcGUpKSB7XG4gICAgcmV0dXJuIGludGVyZmFjZUd1YXJkLnBheWxvYWQ7XG4gIH1cbiAgbXVzdE1hdGNoKGludGVyZmFjZUd1YXJkLCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlLCAnbGVnYWN5SW50ZXJmYWNlR3VhcmQnKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG4gIGxldCB7IGtsYXNzOiBfLCBpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIC4uLnJlc3QgfSA9IGludGVyZmFjZUd1YXJkO1xuICBtZXRob2RHdWFyZHMgPSBvYmplY3RNYXAobWV0aG9kR3VhcmRzLCBhZGFwdE1ldGhvZEd1YXJkKTtcbiAgY29uc3QgcGF5bG9hZCA9IGhhcmRlbih7XG4gICAgaW50ZXJmYWNlTmFtZSxcbiAgICBtZXRob2RHdWFyZHMsXG4gICAgLi4ucmVzdCxcbiAgfSk7XG4gIG11c3RNYXRjaChcbiAgICBwYXlsb2FkLFxuICAgIEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLFxuICAgICdpbnRlcm5hbEludGVyZmFjZUd1YXJkQWRhcHRvcicsXG4gICk7XG4gIHJldHVybiBwYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCk7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKTtcblxuY29uc3QgZW1wdHlDb3B5TWFwID0gbWFrZUNvcHlNYXAoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZUd1YXJkXG4gKiBAcmV0dXJucyB7KHN0cmluZyB8IHN5bWJvbClbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZU1ldGhvZEtleXMgPSBpbnRlcmZhY2VHdWFyZCA9PiB7XG4gIGNvbnN0IHsgbWV0aG9kR3VhcmRzLCBzeW1ib2xNZXRob2RHdWFyZHMgPSBlbXB0eUNvcHlNYXAgfSA9XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGludGVyZmFjZUd1YXJkKTtcbiAgLyoqIEB0eXBlIHsoc3RyaW5nIHwgc3ltYm9sKVtdfSAqL1xuICAvKiBUT0RPIGF0LXRzLWV4cGVjdC1lcnJvciB3b3JrcyBsb2NhbGx5IGJ1dCBub3QgZnJvbSBAZW5kby9leG8qL1xuICAvKiBAdHMtaWdub3JlIGluZmVyZW5jZSBpcyB0b28gd2VhayB0byBzZWUgdGhpcyBpcyBvayovXG4gIHJldHVybiBoYXJkZW4oW1xuICAgIC4uLlJlZmxlY3Qub3duS2V5cyhtZXRob2RHdWFyZHMpLFxuICAgIC4uLmdldENvcHlNYXBLZXlzKHN5bWJvbE1ldGhvZEd1YXJkcyksXG4gIF0pO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhnZXRJbnRlcmZhY2VNZXRob2RLZXlzKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VNZXRob2RLZXlzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIjpbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIl0sImdldE1ldGhvZEd1YXJkUGF5bG9hZCI6WyJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIjpbImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIjpbImdldEludGVyZmFjZU1ldGhvZEtleXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZqTue74yAQC+MgEANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiXSwiZXhwb3J0cyI6WyJBcmdHdWFyZExpc3RTaGFwZSIsIkF3YWl0QXJnR3VhcmRTaGFwZSIsIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIiwiSW50ZXJmYWNlR3VhcmRTaGFwZSIsIk0iLCJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSIsIk1ldGhvZEd1YXJkU2hhcGUiLCJSYXdHdWFyZFNoYXBlIiwiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiLCJTeW5jVmFsdWVHdWFyZFNoYXBlIiwiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIiwiYXNzZXJ0TWV0aG9kR3VhcmQiLCJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UmF3R3VhcmQiLCJjaGVja01hdGNoZXMiLCJjb250YWluZXJIYXNTcGxpdCIsImRlZmF1bHRMaW1pdHMiLCJnZXRSYW5rQ292ZXIiLCJpc0F3YWl0QXJnR3VhcmQiLCJpc1BhdHRlcm4iLCJpc1Jhd0d1YXJkIiwia2luZE9mIiwibWF0Y2hlcyIsIm11c3RNYXRjaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsYixYLEZhaWwsbWFrZUVycm9yLGFubm90YXRlRXJyb3IsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxhc3NlcnRDaGVja2VyLEZhcixnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLHFwLGtleUVRLGtleUdULGtleUdURSxrZXlMVCxrZXlMVEUsYXNzZXJ0S2V5LGNoZWNrS2V5LGlzS2V5LGNoZWNrU2NhbGFyS2V5LGNoZWNrQ29weVNldCxjaGVja0NvcHlNYXAsY29weU1hcEtleVNldCxjaGVja0NvcHlCYWcsZ2V0Q29weU1hcEVudHJ5QXJyYXksbWFrZUNvcHlNYXAsbWFrZUNvcHlTZXQsbWFrZUNvcHlCYWcsZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImJcIixbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIixbJGjNj19hID0+IChpZGVudENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanNcIiwgW1tcImFwcGx5TGFiZWxpbmdFcnJvclwiLFskaM2PX2EgPT4gKGFwcGx5TGFiZWxpbmdFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLFskaM2PX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIixbJGjNj19hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dLFtcImdldFBhc3NTdHlsZUNvdmVyXCIsWyRozY9fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaM2PX2EpXV0sW1wiaW50ZXJzZWN0UmFua0NvdmVyc1wiLFskaM2PX2EgPT4gKGludGVyc2VjdFJhbmtDb3ZlcnMgPSAkaM2PX2EpXV0sW1widW5pb25SYW5rQ292ZXJzXCIsWyRozY9fYSA9PiAodW5pb25SYW5rQ292ZXJzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dLFtcInFwXCIsWyRozY9fYSA9PiAocXAgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcImtleUdUXCIsWyRozY9fYSA9PiAoa2V5R1QgPSAkaM2PX2EpXV0sW1wia2V5R1RFXCIsWyRozY9fYSA9PiAoa2V5R1RFID0gJGjNj19hKV1dLFtcImtleUxUXCIsWyRozY9fYSA9PiAoa2V5TFQgPSAkaM2PX2EpXV0sW1wia2V5TFRFXCIsWyRozY9fYSA9PiAoa2V5TFRFID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImNoZWNrS2V5XCIsWyRozY9fYSA9PiAoY2hlY2tLZXkgPSAkaM2PX2EpXV0sW1wiaXNLZXlcIixbJGjNj19hID0+IChpc0tleSA9ICRozY9fYSldXSxbXCJjaGVja1NjYWxhcktleVwiLFskaM2PX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weVNldFwiLFskaM2PX2EgPT4gKGNoZWNrQ29weVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlNYXBcIixbJGjNj19hID0+IChjaGVja0NvcHlNYXAgPSAkaM2PX2EpXV0sW1wiY29weU1hcEtleVNldFwiLFskaM2PX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyeUFycmF5XCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIixbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5QmFnXCIsWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzXCIsIFtbXCJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllc1wiLFskaM2PX2EgPT4gKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NoZWNrZXIsIENvcHlBcnJheSwgQ29weVJlY29yZCwgQ29weVRhZ2dlZCwgUGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtDb3B5U2V0LCBDb3B5QmFnLCBBcmdHdWFyZCwgQXdhaXRBcmdHdWFyZCwgQ2hlY2tQYXR0ZXJuLCBHZXRSYW5rQ292ZXIsIEludGVyZmFjZUd1YXJkLCBNYXRjaGVyTmFtZXNwYWNlLCBNZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRNYWtlciwgUGF0dGVybiwgUmF3R3VhcmQsIFN5bmNWYWx1ZUd1YXJkLCBLaW5kLCBMaW1pdHMsIEFsbExpbWl0cywgS2V5LCBEZWZhdWx0R3VhcmRUeXBlfSBmcm9tICcuLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge01hdGNoSGVscGVyLCBQYXR0ZXJuS2l0fSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbmNvbnN0IHsgZW50cmllcywgdmFsdWVzLCBoYXNPd24gfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqIEB0eXBlIHtXZWFrU2V0PFBhdHRlcm4+fSAqL1xuY29uc3QgcGF0dGVybk1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuICAgICAgIGNvbnN0IGRlZmF1bHRMaW1pdHMgPSBoYXJkZW4oe1xuICBkZWNpbWFsRGlnaXRzTGltaXQ6IDEwMCxcbiAgc3RyaW5nTGVuZ3RoTGltaXQ6IDEwMF8wMDAsXG4gIHN5bWJvbE5hbWVMZW5ndGhMaW1pdDogMTAwLFxuICBudW1Qcm9wZXJ0aWVzTGltaXQ6IDgwLFxuICBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdDogMTAwLFxuICBhcnJheUxlbmd0aExpbWl0OiAxMF8wMDAsXG4gIGJ5dGVMZW5ndGhMaW1pdDogMTAwXzAwMCxcbiAgbnVtU2V0RWxlbWVudHNMaW1pdDogMTBfMDAwLFxuICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OiAxMF8wMDAsXG4gIG51bU1hcEVudHJpZXNMaW1pdDogNTAwMCxcbn0pO1xuXG4vKipcbiAqIFVzZSB0aGUgcmVzdWx0IG9ubHkgdG8gZ2V0IHRoZSBsaW1pdHMgeW91IG5lZWQgYnkgZGVzdHJ1Y3R1cmluZy5cbiAqIFRodXMsIHRoZSByZXN1bHQgb25seSBuZWVkcyB0byBzdXBwb3J0IGRlc3RydWN0dXJpbmcuIFRoZSBjdXJyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGluaGVyaXRhbmNlIGFzIGEgY2hlYXAgaGFjay5cbiAqXG4gKiBAcGFyYW0ge0xpbWl0c30gW2xpbWl0c11cbiAqIEByZXR1cm5zIHtBbGxMaW1pdHN9XG4gKi8kaM2PX29uY2UuZGVmYXVsdExpbWl0cyhkZWZhdWx0TGltaXRzKTtcbmNvbnN0IGxpbWl0ID0gKGxpbWl0cyA9IHt9KSA9PlxuICAvKiogQHR5cGUge0FsbExpbWl0c30gKi8gKGhhcmRlbih7IF9fcHJvdG9fXzogZGVmYXVsdExpbWl0cywgLi4ubGltaXRzIH0pKTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQgPSAoXG4gIHBheWxvYWQsXG4gIG1haW5QYXlsb2FkU2hhcGUsXG4gIGNoZWNrLFxuICBsYWJlbCxcbikgPT4ge1xuICBhc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiAgfVxuXG4gIC8qIFdhcyB0aGUgZm9sbG93aW5nLCBidXQgaXRzIG92ZXJ1c2Ugb2YgcGF0dGVybnMgY2F1c2VkIGFuIGluZmluaXRlIHJlZ3Jlc3MqL1xuICAvKiBjb25zdCBwYXlsb2FkTGltaXRTaGFwZSA9IGhhcmRlbigqL1xuICAvKiBNLnNwbGl0KCovXG4gIC8qIG1haW5QYXlsb2FkU2hhcGUsKi9cbiAgLyogTS5wYXJ0aWFsKGhhcmRlbihbTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLm51bWJlcigpKV0pLCBoYXJkZW4oW10pKSwqL1xuICAvKiApLCovXG4gIC8qICk7Ki9cbiAgLyogcmV0dXJuIGNoZWNrTWF0Y2hlcyhwYXlsb2FkLCBwYXlsb2FkTGltaXRTaGFwZSwgY2hlY2ssIGxhYmVsKTsqL1xuXG4gIGNvbnN0IG1haW5MZW5ndGggPSBtYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbiAgaWYgKCEocGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggfHwgcGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggKyAxKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuICB9XG4gIGNvbnN0IGxpbWl0cyA9IHBheWxvYWRbbWFpbkxlbmd0aF07XG4gIHBheWxvYWQgPSBoYXJkZW4ocGF5bG9hZC5zbGljZSgwLCBtYWluTGVuZ3RoKSk7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIGlmICghY2hlY2tNYXRjaGVzKHBheWxvYWQsIG1haW5QYXlsb2FkU2hhcGUsIGNoZWNrLCBsYWJlbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxpbWl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIChcbiAgICAocGFzc1N0eWxlT2YobGltaXRzKSA9PT0gJ2NvcHlSZWNvcmQnIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpICYmXG4gICAgZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgcGFzc1N0eWxlT2YodmFsdWUpID09PSAnbnVtYmVyJyB8fFxuICAgICAgICBjaGVjayhmYWxzZSwgWGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApLFxuICAgIClcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHBhcmFtIHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG5jb25zdCBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdCA9IChzcGVjaW1lbiwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVjaykgPT4ge1xuICBpZiAoXG4gICAgTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkgKyAxIDw9XG4gICAgZGVjaW1hbERpZ2l0c0xpbWl0XG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBjaGVjayhcbiAgICBmYWxzZSxcbiAgICBYYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCxcbiAgKTtcbn07XG5cbi8qKlxuICogQHJldHVybnMge1BhdHRlcm5LaXR9XG4gKi9cbmNvbnN0IG1ha2VQYXR0ZXJuS2l0ID0gKCkgPT4ge1xuICAvKipcbiAqIElmIHRoaXMgaXMgYSByZWNvZ25pemVkIG1hdGNoIHRhZywgcmV0dXJuIHRoZSBNYXRjaEhlbHBlci5cbiAqIE90aGVyd2lzZSByZXN1bHQgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtNYXRjaEhlbHBlciB8IHVuZGVmaW5lZH1cbiAqL1xuICBjb25zdCBtYXliZU1hdGNoSGVscGVyID0gdGFnID0+XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICBIZWxwZXJzQnlNYXRjaFRhZ1t0YWddO1xuXG4gIC8qKlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIGFic2VuY2UgYnkgcmV0dXJuaW5nIGB1bmRlZmluZWRgLFxuICogZXZlbiB0aG91Z2ggYHVuZGVmaW5lZGAgaXMgYSB2YWxpZCBwYXR0ZXJuLiBUbyBldmFkZSB0aGlzIGNvbmZ1c2lvbixcbiAqIHRvIHJlZ2lzdGVyIGEgcGF5bG9hZCBzaGFwZSB3aXRoIHRoYXQgbWVhbmluZywgdXNlIGBNTS51bmRlZmluZWQoKWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge1BhdHRlcm4gfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3QgbWF5YmVQYXlsb2FkU2hhcGUgPSB0YWcgPT5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIEd1YXJkUGF5bG9hZFNoYXBlc1t0YWddO1xuXG4gIC8qKiBAdHlwZSB7TWFwPEtpbmQsIHVua25vd24+fSAqL1xuICBjb25zdCBzaW5nbGV0b25LaW5kcyA9IG5ldyBNYXAoW1xuICAgIFsnbnVsbCcsIG51bGxdLFxuICAgIFsndW5kZWZpbmVkJywgdW5kZWZpbmVkXSxcbiAgXSk7XG5cbiAgLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxDb3B5VGFnZ2VkLCBLaW5kPn1cbiAqIE9ubHkgZm9yIHRhZ2dlZCByZWNvcmRzIG9mIHJlY29nbml6ZWQga2luZHMgd2hvc2Ugc3RvcmUtbGV2ZWwgaW52YXJpYW50c1xuICogaGF2ZSBhbHJlYWR5IGJlZW4gY2hlY2tlZC5cbiAqL1xuICBjb25zdCB0YWdNZW1vID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQgdGFncywgYW5kIG9ubHkgaWYgdGhlIHRhZ2dlZFxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHRhZ2dlZFxuICogQHBhcmFtIHtLaW5kfSB0YWdcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrVGFnZ2VkID0gKHRhZ2dlZCwgdGFnLCBjaGVjaykgPT4ge1xuICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbiAgICAgIC8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG4gICAgICByZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsIGNoZWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGF5bG9hZFNoYXBlID0gbWF5YmVQYXlsb2FkU2hhcGUodGFnKTtcbiAgICAgIGlmIChwYXlsb2FkU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgICByZXR1cm4gY2hlY2tNYXRjaGVzKHRhZ2dlZC5wYXlsb2FkLCBwYXlsb2FkU2hhcGUsIGNoZWNrLCB0YWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29weVNldCh0YWdnZWQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgIHJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICByZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX06ICR7dGFnZ2VkfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICogUmV0dXJucyBvbmx5IGEgcmVjb2duaXplZCBraW5kLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW4gcGFzc2VzIHRoZVxuICogaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqIE90aGVyd2lzZSwgYGNoZWNrKGZhbHNlLCAuLi4pYCBhbmQgcmV0dXJucyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge0tpbmQgfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3Qga2luZE9mID0gKHNwZWNpbWVuLCBjaGVjayA9IGlkZW50Q2hlY2tlcikgPT4ge1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbiAgICBpZiAocGFzc1N0eWxlICE9PSAndGFnZ2VkJykge1xuICAgICAgcmV0dXJuIHBhc3NTdHlsZTtcbiAgICB9XG4gICAgLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgc3BlY2ltZW4gaXMgd2VsbCBmb3JtZWQqL1xuICAgIC8qIGFzIGEgdGFnZ2VkIHJlY29yZCwgd2hpY2ggaXMgZGVmaW5lZCBhdCB0aGUgbWFyc2hhbCBsZXZlbCBvZiBhYnN0cmFjdGlvbiwqL1xuICAgIC8qIHNpbmNlIGBwYXNzU3R5bGVPZmAgY2hlY2tzIHRob3NlIGludmFyaWFudHMuKi9cbiAgICBpZiAodGFnTWVtby5oYXMoc3BlY2ltZW4pKSB7XG4gICAgICByZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuICAgIH1cbiAgICBjb25zdCB0YWcgPSBnZXRUYWcoc3BlY2ltZW4pO1xuICAgIGlmIChjaGVja1RhZ2dlZChzcGVjaW1lbiwgdGFnLCBjaGVjaykpIHtcbiAgICAgIHRhZ01lbW8uc2V0KHNwZWNpbWVuLCB0YWcpO1xuICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG4gICAgaWYgKGNoZWNrICE9PSBpZGVudENoZWNrZXIpIHtcbiAgICAgIGNoZWNrKGZhbHNlLCBYYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuICBoYXJkZW4oa2luZE9mKTtcblxuICAvKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQga2luZHMsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lblxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja0tpbmQgPSAoc3BlY2ltZW4sIGtpbmQsIGNoZWNrKSA9PiB7XG4gICAgLyogY2hlY2sgbnVsbCBhbmQgdW5kZWZpbmVkIGFzIEtleXMqL1xuICAgIGlmIChzaW5nbGV0b25LaW5kcy5oYXMoa2luZCkpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHNpbmdsZXRvbktpbmRzLmdldChraW5kKSwgY2hlY2spO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWxLaW5kID0ga2luZE9mKHNwZWNpbWVuLCBjaGVjayk7XG4gICAgaWYgKGtpbmQgPT09IHJlYWxLaW5kKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoZWNrICE9PSBpZGVudENoZWNrZXIpIHtcbiAgICAgIC8qIGBraW5kYCBhbmQgYHJlYWxLaW5kYCBjYW4gYmUgZW1iZWRkZWQgd2l0aG91dCBxdW90ZXMqL1xuICAgICAgLyogYmVjYXVzZSB0aGV5IGFyZSBkcmF3biBmcm9tIHRoZSBlbnVtZXJhdGVkIGNvbGxlY3Rpb24gb2Yga25vd24gS2luZHMuKi9cbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7YihyZWFsS2luZCl9ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhICR7YihraW5kKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tpbmR9IGtpbmRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGlzS2luZCA9IChzcGVjaW1lbiwga2luZCkgPT4gY2hlY2tLaW5kKHNwZWNpbWVuLCBraW5kLCBpZGVudENoZWNrZXIpO1xuXG4gIC8qKlxuICogQ2hlY2tzIGlmIGEgcGF0dGVybiBtYXRjaGVzIG9ubHkgYHVuZGVmaW5lZGAuXG4gKlxuICogQHBhcmFtIHthbnl9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGlzVW5kZWZpbmVkUGF0dCA9IHBhdHQgPT5cbiAgICBwYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAoaXNLaW5kKHBhdHQsICdtYXRjaDpraW5kJykgJiYgcGF0dC5wYXlsb2FkID09PSAndW5kZWZpbmVkJyk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2V5fSBrZXlBc1BhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrQXNLZXlQYXR0ID0gKHNwZWNpbWVuLCBrZXlBc1BhdHRlcm4sIGNoZWNrKSA9PiB7XG4gICAgaWYgKGlzS2V5KHNwZWNpbWVuKSAmJiBrZXlFUShzcGVjaW1lbiwga2V5QXNQYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAvKiBXaGVuIHRoZSBtaXNtYXRjaCBvY2N1cnMgYWdhaW5zdCBhIGtleSB1c2VkIGFzIGEgcGF0dGVybiwqL1xuICAgICAgLyogdGhlIHBhdHRlcm4gc2hvdWxkIHN0aWxsIGJlIHJlZGFjdGVkLiovXG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmU6ICR7a2V5QXNQYXR0ZXJufWApXG4gICAgKTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpc1BhdHRlcm4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7Q2hlY2tQYXR0ZXJufSAqL1xuICBjb25zdCBjaGVja1BhdHRlcm4gPSAocGF0dCwgY2hlY2spID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIC8qIEFsbCBrZXlzIGFyZSBwYXR0ZXJucy4gRm9yIHRoZXNlLCB0aGUga2V5TWVtbyB3aWxsIGRvLiovXG4gICAgICAvKiBBbGwgcHJpbWl0aXZlcyB0aGF0IGFyZSBwYXR0ZXJucyBhcmUgYWxzbyBrZXlzLCB3aGljaCB0aGlzKi9cbiAgICAgIC8qIGFsc28gdGFrZXMgY2FyZSBvZiB3aXRob3V0IG1lbW8uIFRoZSByZXN0IG9mIG91ciBjaGVja2luZyBsb2dpYyovXG4gICAgICAvKiBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG5vbi1rZXkgcGF0dGVybnMuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocGF0dGVybk1lbW8uaGFzKHBhdHQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICBjb25zdCByZXN1bHQgPSBjaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LCBjaGVjayk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcGF0dGVybk1lbW8uYWRkKHBhdHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dCAtIGtub3duIG5vdCB0byBiZSBhIGtleSwgYW5kIHRoZXJlZm9yZSBrbm93blxuICogbm90IHRvIGJlIHByaW1pdGl2ZS5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrUGF0dGVybkludGVybmFsID0gKHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgLyogUHVycG9zZWx5IHBhcmFsbGVscyBjaGVja0tleS4gVE9ETyByZXVzZSBtb3JlIGxvZ2ljIGJldHdlZW4gdGhlbS4qL1xuICAgIC8qIE1vc3Qgb2YgdGhlIHRleHQgb2YgdGhlIHN3aXRjaCBiZWxvdyBub3QgZGVhbGluZyB3aXRoIG1hdGNoZXJzIGlzKi9cbiAgICAvKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbiAgICBjb25zdCBjaGVja0l0ID0gY2hpbGQgPT4gY2hlY2tQYXR0ZXJuKGNoaWxkLCBjaGVjayk7XG5cbiAgICBjb25zdCBraW5kID0ga2luZE9mKHBhdHQsIGNoZWNrKTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIEEgY29weVJlY29yZCBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbiAgICAgICAgLyogcGF0dGVybnMqL1xuICAgICAgICByZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICAvKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbiAgICAgICAgLyogcGF0dGVybnMqL1xuICAgICAgICByZXR1cm4gcGF0dC5ldmVyeShjaGVja0l0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIC8qIEEgY29weU1hcCdzIGtleXMgYXJlIGtleXMgYW5kIHRoZXJlZm9yZSBhbHJlYWR5IGtub3duIHRvIGJlKi9cbiAgICAgICAgLyogcGF0dGVybnMuKi9cbiAgICAgICAgLyogQSBjb3B5TWFwIGlzIGEgcGF0dGVybiBpZiBpdHMgdmFsdWVzIGFyZSBwYXR0ZXJucy4qL1xuICAgICAgICByZXR1cm4gY2hlY2tQYXR0ZXJuKHBhdHQudmFsdWVzLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGlzUGF0dGVybiA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuICBjb25zdCBhc3NlcnRQYXR0ZXJuID0gcGF0dCA9PiB7XG4gICAgY2hlY2tQYXR0ZXJuKHBhdHQsIGFzc2VydENoZWNrZXIpO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja01hdGNoZXMgPSAoc3BlY2ltZW4sIHBhdHRlcm4sIGNoZWNrLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIGFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCwgW3NwZWNpbWVuLCBwYXR0ZXJuLCBjaGVja10sIGxhYmVsKTtcblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbCA9IChzcGVjaW1lbiwgcGF0dCwgY2hlY2spID0+IHtcbiAgICAvKiBXb3J0aCBiZWluZyBhIGJpdCB2ZXJib3NlIGFuZCByZXBldGl0aXZlIGluIG9yZGVyIHRvIG9wdGltaXplKi9cbiAgICBjb25zdCBwYXR0ZXJuS2luZCA9IGtpbmRPZihwYXR0LCBjaGVjayk7XG4gICAgY29uc3Qgc3BlY2ltZW5LaW5kID0ga2luZE9mKHNwZWNpbWVuKTsgLyogbWF5IGJlIHVuZGVmaW5lZCovXG4gICAgc3dpdGNoIChwYXR0ZXJuS2luZCkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgcmV0dXJuIEZhaWxgcGF0dGVybiBleHBlY3RlZDogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gRmFpbGBwcm9taXNlcyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHJldHVybiBGYWlsYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgY2FzZSAnYnl0ZUFycmF5JzpcbiAgICAgIGNhc2UgJ2NvcHlTZXQnOlxuICAgICAgY2FzZSAnY29weUJhZyc6XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIC8qIFRoZXNlIGtpbmRzIGFyZSBuZWNlc3NhcmlseSBrZXlzKi9cbiAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuICAgICAgICAgIC8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5QXJyYXkgdG8gbWF0Y2ggYSBjb3B5QXJyYXkgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBwYXR0O1xuICAgICAgICBpZiAoc3BlY2ltZW4ubGVuZ3RoICE9PSBsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0dC5ldmVyeSgocCwgaSkgPT4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuW2ldLCBwLCBjaGVjaywgaSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4gICAgICAgICAgLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5UmVjb3JkJykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLyogVE9ETyBEZXRlY3QgYW5kIGFjY3VtdWxhdGUgZGlmZmVyZW5jZSBpbiBvbmUgcGFzcy4qL1xuICAgICAgICAvKiBSYXRoZXIgdGhhbiB1c2luZyB0d28gY2FsbHMgdG8gYGxpc3REaWZmZXJlbmNlYCB0byBkZXRlY3QgYW5kKi9cbiAgICAgICAgLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbiAgICAgICAgLyogaW4gc29ydGVkIG9yZGVyLCB3ZSBzaG91bGQgaW5zdGVhZCB1c2UgYW4gYWxnb3JpdGhtIGxpa2UqL1xuICAgICAgICAvKiBgaXRlckRpc2pvaW50VW5pb25gIGZyb20gbWVyZ2Utc29ydC1vcGVyYXRvcnMuanMqL1xuICAgICAgICBjb25zdCBzcGVjaW1lbk5hbWVzID0gcmVjb3JkTmFtZXMoc3BlY2ltZW4pO1xuICAgICAgICBjb25zdCBwYXR0TmFtZXMgPSByZWNvcmROYW1lcyhwYXR0KTtcbiAgICAgICAgY29uc3QgbWlzc2luZyA9IGxpc3REaWZmZXJlbmNlKHBhdHROYW1lcywgc3BlY2ltZW5OYW1lcyk7XG4gICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBoYXZlIG1pc3NpbmcgcHJvcGVydGllcyAke3EobWlzc2luZyl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVuZXhwZWN0ZWQgPSBsaXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLCBwYXR0TmFtZXMpO1xuICAgICAgICBpZiAodW5leHBlY3RlZC5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3Qgbm90IGhhdmUgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3EoXG4gICAgICAgICAgICAgIHVuZXhwZWN0ZWQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzcGVjaW1lblZhbHVlcyA9IHJlY29yZFZhbHVlcyhzcGVjaW1lbiwgc3BlY2ltZW5OYW1lcyk7XG4gICAgICAgIGNvbnN0IHBhdHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocGF0dCwgcGF0dE5hbWVzKTtcbiAgICAgICAgcmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsIGkpID0+XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLCBwYXR0VmFsdWVzW2ldLCBjaGVjaywgbGFiZWwpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4gICAgICAgICAgLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5TWFwJykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5TWFwIHRvIG1hdGNoIGEgY29weU1hcCBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ29tcGFyZSBrZXlzIGFzIGNvcHlTZXRzKi9cbiAgICAgICAgY29uc3QgcGF0dEtleVNldCA9IGNvcHlNYXBLZXlTZXQocGF0dCk7XG4gICAgICAgIGNvbnN0IHNwZWNpbWVuS2V5U2V0ID0gY29weU1hcEtleVNldChzcGVjaW1lbik7XG4gICAgICAgIGlmICghY2hlY2tNYXRjaGVzKHNwZWNpbWVuS2V5U2V0LCBwYXR0S2V5U2V0LCBjaGVjaykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyBhZnRlciBhcHBseWluZyBhIHNoYXJlZCB0b3RhbCBvcmRlci4qL1xuICAgICAgICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBhbnRpUmFua09yZGVyIHNvcnRpbmcgb2YgZWFjaCBtYXAncyovXG4gICAgICAgIC8qIGVudHJpZXMgaXMgYSBwcmVvcmRlciB0aGF0IGFkbWl0cyB0aWVzLiovXG4gICAgICAgIGNvbnN0IHBhdHRWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc3BlY2ltZW5WYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZW50cnlQYWlycyA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgICAgZ2V0Q29weU1hcEVudHJ5QXJyYXksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCBwYXR0VmFsdWUsIHNwZWNpbWVuVmFsdWVdIG9mIGVudHJ5UGFpcnMpIHtcbiAgICAgICAgICBwYXR0VmFsdWVzLnB1c2gocGF0dFZhbHVlKTtcbiAgICAgICAgICBzcGVjaW1lblZhbHVlcy5wdXNoKHNwZWNpbWVuVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVja01hdGNoZXMoaGFyZGVuKHNwZWNpbWVuVmFsdWVzKSwgaGFyZGVuKHBhdHRWYWx1ZXMpLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG4gICAgICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQucGF5bG9hZCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgbWF0Y2hlcyA9IChzcGVjaW1lbiwgcGF0dCkgPT5cbiAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKi9cbiAgY29uc3QgbXVzdE1hdGNoID0gKHNwZWNpbWVuLCBwYXR0LCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGxldCBpbm5lckVycm9yO1xuICAgIHRyeSB7XG4gICAgICBpZiAoY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBpZGVudENoZWNrZXIsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICBpbm5lckVycm9yID0gZXI7XG4gICAgfVxuICAgIC8qIHNob3VsZCBvbmx5IHRocm93Ki9cbiAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGFzc2VydENoZWNrZXIsIGxhYmVsKTtcbiAgICBjb25zdCBvdXRlckVycm9yID0gbWFrZUVycm9yKFxuICAgICAgWGBpbnRlcm5hbDogJHtsYWJlbH06IGluY29uc2lzdGVudCBwYXR0ZXJuIG1hdGNoOiAke3FwKHBhdHQpfWAsXG4gICAgKTtcbiAgICBpZiAoaW5uZXJFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbm5vdGF0ZUVycm9yKG91dGVyRXJyb3IsIFhgY2F1c2VkIGJ5ICR7aW5uZXJFcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgb3V0ZXJFcnJvcjtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBnZXRSYW5rQ292ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7R2V0UmFua0NvdmVyfSAqL1xuICBjb25zdCBnZXRSYW5rQ292ZXIgPSAocGF0dCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQYXNzYWJsZShwYXR0KTtcbiAgICAgIGlmIChlbmNvZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtlbmNvZGVkLCBgJHtlbmNvZGVkfX5gXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGF0dCk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuICAgICAgICAvKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4gICAgICAgIC8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuICAgICAgICAvKiovXG4gICAgICAgIC8qIGNvbnN0IHJhbmtDb3ZlcnMgPSBwYXR0Lm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpOyovXG4gICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgIC8qIHJhbmtDb3ZlcnMubWFwKChbbGVmdCwgX3JpZ2h0XSkgPT4gbGVmdCksKi9cbiAgICAgICAgLyogcmFua0NvdmVycy5tYXAoKFtfbGVmdCwgcmlnaHRdKSA9PiByaWdodCksKi9cbiAgICAgICAgLyogXSk7Ki9cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4gICAgICAgIC8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbiAgICAgICAgLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuICAgICAgICAvKiovXG4gICAgICAgIC8qIGNvbnN0IHBhdHRLZXlzID0gb3duS2V5cyhwYXR0KTsqL1xuICAgICAgICAvKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuICAgICAgICAvKiBjb25zdCBbbGVmdEVudHJpZXNMaW1pdCwgcmlnaHRFbnRyaWVzTGltaXRdID0qL1xuICAgICAgICAvKiBnZXRSYW5rQ292ZXIocGF0dEVudHJpZXMpOyovXG4gICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgIC8qIGZyb21VbmlxdWVFbnRyaWVzKGxlZnRFbnRyaWVzTGltaXQpLCovXG4gICAgICAgIC8qIGZyb21VbmlxdWVFbnRyaWVzKHJpZ2h0RW50cmllc0xpbWl0KSwqL1xuICAgICAgICAvKiBdKTsqL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHBhdHQpO1xuICAgICAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbiAgICAgICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAgICAgLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbiAgICAgICAgICAvKiB0aGUgdmFyaW91cyBwYXR0ZXJuTm9kZXMqL1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLCBlbmNvZGVQYXNzYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgICAgLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuICAgICAgICAgICAgLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuICAgICAgICAgICAgLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4gICAgICAgICAgICAvKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbiAgICAgICAgICAgIC8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbiAgICAgICAgICAgIC8qIGBgYGpzKi9cbiAgICAgICAgICAgIC8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuICAgICAgICAgICAgLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuICAgICAgICAgICAgLyogYGBgKi9cbiAgICAgICAgICAgIC8qKi9cbiAgICAgICAgICAgIC8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbiAgICAgICAgICAgIC8qIHBhdHQucGF5bG9hZFswXSwqL1xuICAgICAgICAgICAgLyogKTsqL1xuICAgICAgICAgICAgLyogcmV0dXJuIGhhcmRlbihbKi9cbiAgICAgICAgICAgIC8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbiAgICAgICAgICAgIC8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4gICAgICAgICAgICAvKiBdKTsqL1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgICAvKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4gICAgICAgICAgICAvKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4gICAgICAgICAgICAvKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4gICAgICAgICAgICAvKiovXG4gICAgICAgICAgICAvKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbiAgICAgICAgICAgIC8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4gICAgICAgICAgICAvKiAvLyBtYXRjaCAxLXRvLTEuKi9cbiAgICAgICAgICAgIC8qIC8vKi9cbiAgICAgICAgICAgIC8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4gICAgICAgICAgICAvKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuICAgICAgICAgICAgLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuICAgICAgICAgICAgLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbiAgICAgICAgICAgIC8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuICAgICAgICAgICAgLyogLy8qL1xuICAgICAgICAgICAgLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbiAgICAgICAgICAgIC8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbiAgICAgICAgICAgIC8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuICAgICAgICAgICAgLyogLy8gdGhpcyBidWcuKi9cbiAgICAgICAgICAgIC8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbiAgICAgICAgICAgIC8qIHBhdHQucGF5bG9hZCwqL1xuICAgICAgICAgICAgLyogZW5jb2RlUGFzc2FibGUsKi9cbiAgICAgICAgICAgIC8qICk7Ki9cbiAgICAgICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgICAgICAvKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbiAgICAgICAgICAgIC8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbiAgICAgICAgICAgIC8qIF0pOyovXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYnJlYWs7IC8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7IC8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYnJlYWs7IC8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGFycmF5XG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxQcmVmaXhdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuID0gKGFycmF5LCBwYXR0LCBjaGVjaywgbGFiZWxQcmVmaXggPSAnJykgPT4ge1xuICAgIGlmIChpc0tpbmQocGF0dCwgJ21hdGNoOmFueScpKSB7XG4gICAgICAvKiBpZiB0aGUgcGF0dGVybiBpcyBNLmFueSgpLCB3ZSBrbm93IGl0cyB0cnVlKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXkuZXZlcnkoKGVsLCBpKSA9PlxuICAgICAgY2hlY2tNYXRjaGVzKGVsLCBwYXR0LCBjaGVjaywgYCR7bGFiZWxQcmVmaXh9WyR7aX1dYCksXG4gICAgKTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQW55SGVscGVyID0gRmFyKCdtYXRjaDphbnkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKF9zcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBfY2hlY2spID0+IHRydWUsXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKG1hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIG1hdGNoZXJQYXlsb2FkID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYG1hdGNoOmFueSBwYXlsb2FkOiAke21hdGNoZXJQYXlsb2FkfSAtIE11c3QgYmUgdW5kZWZpbmVkYCksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnJywgJ3snXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hBbmRIZWxwZXIgPSBGYXIoJ21hdGNoOmFuZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgcmV0dXJuIHBhdHRzLmV2ZXJ5KHBhdHQgPT4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykpO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKGFsbGVnZWRQYXR0cywgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IGNoZWNrSXQgPSBwYXR0ID0+IGNoZWNrUGF0dGVybihwYXR0LCBjaGVjayk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocGFzc1N0eWxlT2YoYWxsZWdlZFBhdHRzKSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICAgICAgICBjaGVjayhmYWxzZSwgWGBOZWVkcyBhcnJheSBvZiBzdWItcGF0dGVybnM6ICR7cXAoYWxsZWdlZFBhdHRzKX1gKSkgJiZcbiAgICAgICAgYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChwYXR0cywgZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzKFxuICAgICAgICBjb21wYXJlUmFuayxcbiAgICAgICAgcGF0dHMubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSksXG4gICAgICApLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaE9ySGVscGVyID0gRmFyKCdtYXRjaDpvciBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHBhdHRzO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGAke3NwZWNpbWVufSAtIG5vIHBhdHRlcm4gZGlzanVuY3RzIHRvIG1hdGNoOiAke3FwKHBhdHRzKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLyogU3BlY2lhbCBjYXNlIGRpc2p1bmN0aW9ucyByZXByZXNlbnRpbmcgYSBzaW5nbGUgb3B0aW9uYWwgcGF0dGVybiBmb3IqL1xuICAgICAgLyogYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG4gICAgICBjb25zdCBiaW5hcnlVbmRlZlBhdHRJZHggPVxuICAgICAgICBwYXR0cy5sZW5ndGggPT09IDJcbiAgICAgICAgICA/IHBhdHRzLmZpbmRJbmRleChwYXR0ID0+IGlzVW5kZWZpbmVkUGF0dChwYXR0KSlcbiAgICAgICAgICA6IC0xO1xuICAgICAgaWYgKGJpbmFyeVVuZGVmUGF0dElkeCAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzcGVjaW1lbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0c1sxIC0gYmluYXJ5VW5kZWZQYXR0SWR4XSwgY2hlY2spXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGF0dHMuc29tZShwYXR0ID0+IG1hdGNoZXMoc3BlY2ltZW4sIHBhdHQpKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgbWF0Y2ggb25lIG9mICR7cXAocGF0dHMpfWApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbmRIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChwYXR0cywgZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICB1bmlvblJhbmtDb3ZlcnMoXG4gICAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgICBwYXR0cy5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKSxcbiAgICAgICksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTm90SGVscGVyID0gRmFyKCdtYXRjaDpub3QgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKG1hdGNoZXMoc3BlY2ltZW4sIHBhdHQpKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBmYWlsIG5lZ2F0ZWQgcGF0dGVybjogJHtxcChwYXR0KX1gLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja1BhdHRlcm4sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfcGF0dCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJycsICd7J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU2NhbGFySGVscGVyID0gRmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sIGNoZWNrKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWydhJywgJ3p+J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoS2V5SGVscGVyID0gRmFyKCdtYXRjaDprZXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tLZXkoc3BlY2ltZW4sIGNoZWNrKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWydhJywgJ3p+J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoUGF0dGVybkhlbHBlciA9IEZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja1BhdHRlcm4oc3BlY2ltZW4sIGNoZWNrKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWydhJywgJ3p+J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoS2luZEhlbHBlciA9IEZhcignbWF0Y2g6a2luZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiBjaGVja0tpbmQsXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKGFsbGVnZWRLZXlLaW5kLCBjaGVjaykgPT5cbiAgICAgIHR5cGVvZiBhbGxlZ2VkS2V5S2luZCA9PT0gJ3N0cmluZycgfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBtYXRjaDpraW5kOiBwYXlsb2FkOiAke2FsbGVnZWRLZXlLaW5kfSAtIEEga2luZCBuYW1lIG11c3QgYmUgYSBzdHJpbmdgLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKGtpbmQsIF9lbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgbGV0IHN0eWxlO1xuICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvcHlTZXQnOlxuICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgIHN0eWxlID0gJ3RhZ2dlZCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHN0eWxlID0ga2luZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHN0eWxlKTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFRhZ2dlZEhlbHBlciA9IEZhcignbWF0Y2g6dGFnZ2VkIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW3RhZ1BhdHQsIHBheWxvYWRQYXR0XSwgY2hlY2spID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihzcGVjaW1lbikgIT09ICd0YWdnZWQnKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYEV4cGVjdGVkIHRhZ2dlZCBvYmplY3QsIG5vdCAke3EoXG4gICAgICAgICAgICBwYXNzU3R5bGVPZihzcGVjaW1lbiksXG4gICAgICAgICAgKX06ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhnZXRUYWcoc3BlY2ltZW4pLCB0YWdQYXR0LCBjaGVjaywgJ3RhZycpICYmXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbi5wYXlsb2FkLCBwYXlsb2FkUGF0dCwgY2hlY2ssICdwYXlsb2FkJylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDp0YWdnZWQgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX2tpbmQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEJpZ2ludEhlbHBlciA9IEZhcignbWF0Y2g6YmlnaW50IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2JpZ2ludCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbiwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVjaylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpiaWdpbnQgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaE5hdEhlbHBlciA9IEZhcignbWF0Y2g6bmF0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2JpZ2ludCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiogQHR5cGUge2JpZ2ludH0gKi8gKHNwZWNpbWVuKSA+PSAwbixcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBub24tbmVnYXRpdmVgLFxuICAgICAgICApICYmXG4gICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOm5hdCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICAvKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU3RyaW5nSGVscGVyID0gRmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3RyaW5nTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnc3RyaW5nJywgY2hlY2spICYmXG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICAgICAgICAgICgvKiogQHR5cGUge3N0cmluZ30gKi8gKHNwZWNpbWVuKS5sZW5ndGggPD0gc3RyaW5nTGVuZ3RoTGltaXQgfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBzdHJpbmcgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzdHJpbmdMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c3RyaW5nIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdzdHJpbmcnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTeW1ib2xIZWxwZXIgPSBGYXIoJ21hdGNoOnN5bWJvbCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBzeW1ib2xOYW1lTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ3N5bWJvbCcsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzeW1ib2xOYW1lID0gbmFtZUZvclBhc3NhYmxlU3ltYm9sKHNwZWNpbWVuKTtcblxuICAgICAgaWYgKHR5cGVvZiBzeW1ib2xOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQYXNzYWJsZSBzeW1ib2wgJHtzcGVjaW1lbn0gbXVzdCBoYXZlIGEgcGFzc2FibGUgbmFtZWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIHN5bWJvbE5hbWUubGVuZ3RoIDw9IHN5bWJvbE5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgWGBTeW1ib2wgbmFtZSAke3EoXG4gICAgICAgICAgc3ltYm9sTmFtZSxcbiAgICAgICAgKX0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpzeW1ib2wgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFJlbW90YWJsZUhlbHBlciA9IEZhcignbWF0Y2g6cmVtb3RhYmxlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmVtb3RhYmxlRGVzYywgY2hlY2spID0+IHtcbiAgICAgIGlmIChpc0tpbmQoc3BlY2ltZW4sICdyZW1vdGFibGUnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVjayA9PT0gaWRlbnRDaGVja2VyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbGFiZWwgfSA9IHJlbW90YWJsZURlc2M7XG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihzcGVjaW1lbik7XG4gICAgICBjb25zdCBraW5kRGV0YWlscyA9XG4gICAgICAgIHBhc3NTdHlsZSAhPT0gJ3RhZ2dlZCdcbiAgICAgICAgICA/IC8qIFBhc3Mgc3R5bGUgY2FuIGJlIGVtYmVkZGVkIGluIGRldGFpbHMgd2l0aG91dCBxdW90ZXMuKi9cbiAgICAgICAgICAgIGIocGFzc1N0eWxlKVxuICAgICAgICAgIDogLyogVGFnIG11c3QgYmUgcXVvdGVkIGJlY2F1c2UgaXQgaXMgcG90ZW50aWFsbHkgYXR0YWNrZXItY29udHJvbGxlZCovXG4gICAgICAgICAgICAvKiAodW5saWtlIGBraW5kT2ZgLCB0aGlzIGRvZXMgbm90IHJlamVjdCB1bnJlY29nbml6ZWQgdGFncykuKi9cbiAgICAgICAgICAgIHEoZ2V0VGFnKHNwZWNpbWVuKSk7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAvKiBgbGFiZWxgIGNhbiBiZSBlbWJlZGRlZCB3aXRob3V0IHF1b3RlcyBiZWNhdXNlIGl0IGlzIHByb3ZpZGVkIGJ5Ki9cbiAgICAgICAgLyogbG9jYWwgY29kZSBsaWtlIGBNLnJlbW90YWJsZShcIi4uLlwiKWAuKi9cbiAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSByZW1vdGFibGUgJHtiKGxhYmVsKX0sIG5vdCAke2tpbmREZXRhaWxzfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKGFsbGVnZWRSZW1vdGFibGVEZXNjLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgYWxsZWdlZFJlbW90YWJsZURlc2MsXG4gICAgICAgIGhhcmRlbih7IGxhYmVsOiBNTS5zdHJpbmcoKSB9KSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX3JlbW90YWJsZURlc2MsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdyZW1vdGFibGUnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hMVEVIZWxwZXIgPSBGYXIoJ21hdGNoOmx0ZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAgICBrZXlMVEUoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogKHJpZ2h0T3BlcmFuZCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4gICAgICAvKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuICAgICAgLyogdG8gYmUgYGxldGAqL1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG4gICAgICBsZXQgW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF0gPSBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuICAgICAgY29uc3QgbmV3UmlnaHRCb3VuZCA9IGAke2VuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCl9fmA7XG4gICAgICBpZiAobmV3UmlnaHRCb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJpZ2h0Qm91bmQgPSBuZXdSaWdodEJvdW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTFRIZWxwZXIgPSBGYXIoJ21hdGNoOmx0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUxUKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPCAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogbWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEdURUhlbHBlciA9IEZhcignbWF0Y2g6Z3RlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUdURShzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID49ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocmlnaHRPcGVyYW5kLCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbiAgICAgIC8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4gICAgICAvKiB0byBiZSBgbGV0YCovXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbiAgICAgIGxldCBbbGVmdEJvdW5kLCByaWdodEJvdW5kXSA9IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gICAgICBjb25zdCBuZXdMZWZ0Qm91bmQgPSBlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpO1xuICAgICAgaWYgKG5ld0xlZnRCb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxlZnRCb3VuZCA9IG5ld0xlZnRCb3VuZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbGVmdEJvdW5kLCByaWdodEJvdW5kXTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEdUSGVscGVyID0gRmFyKCdtYXRjaDpndCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAgICBrZXlHVChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IG1hdGNoR1RFSGVscGVyLmdldFJhbmtDb3ZlcixcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlciA9IEZhcignbWF0Y2g6cmVjb3JkT2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IG51bVByb3BlcnRpZXNMaW1pdCwgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5UmVjb3JkJywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIG93bktleXMoc3BlY2ltZW4pLmxlbmd0aCA8PSBudW1Qcm9wZXJ0aWVzTGltaXQsXG4gICAgICAgICAgWGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG4gICAgICAgICAgICBudW1Qcm9wZXJ0aWVzTGltaXQsXG4gICAgICAgICAgKX0gcHJvcGVydGllczogJHtzcGVjaW1lbn1gLFxuICAgICAgICApICYmXG4gICAgICAgIGVudHJpZXMoc3BlY2ltZW4pLmV2ZXJ5KFxuICAgICAgICAgIChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3IoXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAga2V5Lmxlbmd0aCA8PSBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgICAgICAgICBYYFByb3BlcnR5IG5hbWUgbXVzdCBub3QgYmUgbG9uZ2VyIHRoYW4gJHtxKFxuICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG4gICAgICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICApICYmXG4gICAgICAgICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgICAgICAgIGhhcmRlbihba2V5LCB2YWx1ZV0pLFxuICAgICAgICAgICAgICBoYXJkZW4oW2tleVBhdHQsIHZhbHVlUGF0dF0pLFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiBfZW50cnlQYXR0ID0+IGdldFBhc3NTdHlsZUNvdmVyKCdjb3B5UmVjb3JkJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQXJyYXlPZkhlbHBlciA9IEZhcignbWF0Y2g6YXJyYXlPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtzdWJQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBhcnJheUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlBcnJheScsIGNoZWNrKSAmJlxuICAgICAgICAoLyoqIEB0eXBlIHtBcnJheX0gKi8gKHNwZWNpbWVuKS5sZW5ndGggPD0gYXJyYXlMZW5ndGhMaW1pdCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKHNwZWNpbWVuLCBzdWJQYXR0LCBjaGVjaylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDphcnJheU9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEJ5dGVBcnJheUhlbHBlciA9IEZhcignbWF0Y2g6Ynl0ZUFycmF5IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGJ5dGVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdieXRlQXJyYXknLCBjaGVjaykgJiZcbiAgICAgICAgKC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChzcGVjaW1lbikuYnl0ZUxlbmd0aCA8PSBieXRlTGVuZ3RoTGltaXQgfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBieXRlQXJyYXkgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtieXRlTGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJ5dGVBcnJheSBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYnl0ZUFycmF5JyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU2V0T2ZIZWxwZXIgPSBGYXIoJ21hdGNoOnNldE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2tleVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IG51bVNldEVsZW1lbnRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5U2V0JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovIChzcGVjaW1lbi5wYXlsb2FkKS5sZW5ndGggPCBudW1TZXRFbGVtZW50c0xpbWl0LFxuICAgICAgICAgIFhgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG4gICAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuICAgICAgICAgIH1gLFxuICAgICAgICApICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCwga2V5UGF0dCwgY2hlY2ssICdzZXQgZWxlbWVudHMnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnNldE9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEJhZ09mSGVscGVyID0gRmFyKCdtYXRjaDpiYWdPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCBjb3VudFBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCwgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUJhZycsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiogQHR5cGUge0FycmF5fSAqLyAoc3BlY2ltZW4ucGF5bG9hZCkubGVuZ3RoIDw9XG4gICAgICAgICAgICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuICAgICAgICAgIFhgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG4gICAgICAgICAgKX0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbiAgICAgICAgICAoW2tleSwgY291bnRdLCBpKSA9PlxuICAgICAgICAgICAgY2hlY2tNYXRjaGVzKGtleSwga2V5UGF0dCwgY2hlY2ssIGBiYWcga2V5c1ske2l9XWApICYmXG4gICAgICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3IoXG4gICAgICAgICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuICAgICAgICAgICAgICBbY291bnQsIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2tdLFxuICAgICAgICAgICAgICBgYmFnIGNvdW50c1ske2l9XWAsXG4gICAgICAgICAgICApICYmXG4gICAgICAgICAgICBjaGVja01hdGNoZXMoY291bnQsIGNvdW50UGF0dCwgY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCksXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJhZ09mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKipcbiAqIEBwYXJhbSB7Q29weUFycmF5fSBlbGVtZW50c1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50UGF0dFxuICogQHBhcmFtIHtiaWdpbnR9IGJvdW5kIE11c3QgYmUgPj0gMW5cbiAqIEBwYXJhbSB7Q29weUFycmF5fSBbaW5SZXN1bHRzXVxuICogQHBhcmFtIHtDb3B5QXJyYXl9IFtvdXRSZXN1bHRzXVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBlbGVtZW50c0hhc1NwbGl0ID0gKFxuICAgIGVsZW1lbnRzLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIGluUmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBvdXRSZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBsZXQgY291bnQgPSAwbjtcbiAgICAvKiBTaW5jZSB0aGlzIGZlYXR1cmUgaXMgbW90aXZhdGVkIGJ5IEVSVFAncyB1c2Ugb24qL1xuICAgIC8qIG5vbi1mdW5naWJsZSAoYHNldGAsIGBjb3B5U2V0YCkgYW1vdW50cywqL1xuICAgIC8qIHRoZWlyIGFycmF5cyBzdG9yZSB0aGVpciBlbGVtZW50cyBpbiBkZWNlbmRpbmcgbGV4aWNvZ3JhcGhpYyBvcmRlci4qL1xuICAgIC8qIEJ1dCB0aGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHNvbWUgY2hvaWNlIGFtb3VuZyBlcXVhbGx5IGdvb2QgbWluaW1hbCovXG4gICAgLyogcmVzdWx0cy4gSXQgaXMgbW9yZSBpbnR1aXRpdmUgZm9yIHRoZSBjaG9pY2UgdG8gYmUgdGhlIGZpcnN0IGBib3VuZGAqL1xuICAgIC8qIG1hdGNoaW5nIGVsZW1lbnRzIGluIGFzY2VuZGluZyBsZXhpY2lncmFwaGljIG9yZGVyLCByYXRoZXIgdGhhbiovXG4gICAgLyogZGVjZW5kaW5nLiBUaHVzIHdlIGl0ZXJhdGUgYGVsZW1lbnRzYCBpbiByZXZlcnNlIG9yZGVyLiovXG4gICAgZm9yIChsZXQgaSA9IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoY291bnQgPCBib3VuZCkge1xuICAgICAgICBpZiAobWF0Y2hlcyhlbGVtZW50LCBlbGVtZW50UGF0dCkpIHtcbiAgICAgICAgICBjb3VudCArPSAxbjtcbiAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzKSB7XG4gICAgICAgICAgb3V0UmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgY291bnQgPj0gYm91bmQsXG4gICAgICBYYEhhcyBvbmx5ICR7cShjb3VudCl9IG1hdGNoZXMsIGJ1dCBuZWVkcyAke3EoYm91bmQpfWAsXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7Q29weUFycmF5PFtLZXksIGJpZ2ludF0+fSBwYWlyc1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50UGF0dFxuICogQHBhcmFtIHtiaWdpbnR9IGJvdW5kIE11c3QgYmUgPj0gMW5cbiAqIEBwYXJhbSB7Q29weUFycmF5PFtLZXksIGJpZ2ludF0+fSBbaW5SZXN1bHRzXVxuICogQHBhcmFtIHtDb3B5QXJyYXk8W0tleSwgYmlnaW50XT59IFtvdXRSZXN1bHRzXVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBwYWlyc0hhc1NwbGl0ID0gKFxuICAgIHBhaXJzLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIGluUmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBvdXRSZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBsZXQgY291bnQgPSAwbjtcbiAgICAvKiBTaW5jZSB0aGlzIGZlYXR1cmUgaXMgbW90aXZhdGVkIGJ5IEVSVFAncyB1c2Ugb24qL1xuICAgIC8qIHNlbWktZnVuZ2libGUgKGBjb3B5QmFnYCkgYW1vdW50cywqL1xuICAgIC8qIHRoZWlyIGFycmF5cyBzdG9yZSB0aGVpciBlbGVtZW50cyBpbiBkZWNlbmRpbmcgbGV4aWNvZ3JhcGhpYyBvcmRlci4qL1xuICAgIC8qIEJ1dCB0aGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHNvbWUgY2hvaWNlIGFtb3VuZyBlcXVhbGx5IGdvb2QgbWluaW1hbCovXG4gICAgLyogcmVzdWx0cy4gSXQgaXMgbW9yZSBpbnR1aXRpdmUgZm9yIHRoZSBjaG9pY2UgdG8gYmUgdGhlIGZpcnN0IGBib3VuZGAqL1xuICAgIC8qIG1hdGNoaW5nIGVsZW1lbnRzIGluIGFzY2VuZGluZyBsZXhpY2lncmFwaGljIG9yZGVyLCByYXRoZXIgdGhhbiovXG4gICAgLyogZGVjZW5kaW5nLiBUaHVzIHdlIGl0ZXJhdGUgYHBhaXJzYCBpbiByZXZlcnNlIG9yZGVyLiovXG4gICAgZm9yIChsZXQgaSA9IHBhaXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBjb25zdCBbZWxlbWVudCwgbnVtXSA9IHBhaXJzW2ldO1xuICAgICAgY29uc3QgbnVtUmVzdCA9IGJvdW5kIC0gY291bnQ7XG4gICAgICBpZiAobnVtUmVzdCA+PSAxbikge1xuICAgICAgICBpZiAobWF0Y2hlcyhlbGVtZW50LCBlbGVtZW50UGF0dCkpIHtcbiAgICAgICAgICBpZiAobnVtIDw9IG51bVJlc3QpIHtcbiAgICAgICAgICAgIGNvdW50ICs9IG51bTtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdHMpIGluUmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1dKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbnVtSW4gPSBudW1SZXN0O1xuICAgICAgICAgICAgY291bnQgKz0gbnVtSW47XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtUmVzdF0pO1xuICAgICAgICAgICAgaWYgKG91dFJlc3VsdHMpIG91dFJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtIC0gbnVtUmVzdF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzKSB7XG4gICAgICAgICAgb3V0UmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1dKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRSZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBjb3VudCA+PSBib3VuZCxcbiAgICAgIFhgSGFzIG9ubHkgJHtxKGNvdW50KX0gbWF0Y2hlcywgYnV0IG5lZWRzICR7cShib3VuZCl9YCxcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICogQHR5cGVkZWYge0NvcHlBcnJheSB8IENvcHlTZXQgfCBDb3B5QmFnfSBDb250YWluZXJcbiAqIEBwYXJhbSB7Q29udGFpbmVyfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50UGF0dFxuICogQHBhcmFtIHtiaWdpbnR9IGJvdW5kIE11c3QgYmUgPj0gMW5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW25lZWRJblJlc3VsdHNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtuZWVkT3V0UmVzdWx0c11cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge1tDb250YWluZXIgfCB1bmRlZmluZWQsIENvbnRhaW5lciB8IHVuZGVmaW5lZF0gfCBmYWxzZX1cbiAqL1xuICBjb25zdCBjb250YWluZXJIYXNTcGxpdCA9IChcbiAgICBzcGVjaW1lbixcbiAgICBlbGVtZW50UGF0dCxcbiAgICBib3VuZCxcbiAgICBuZWVkSW5SZXN1bHRzID0gZmFsc2UsXG4gICAgbmVlZE91dFJlc3VsdHMgPSBmYWxzZSxcbiAgICBjaGVjayA9IGlkZW50Q2hlY2tlcixcbiAgKSA9PiB7XG4gICAgY29uc3QgaW5SZXN1bHRzID0gbmVlZEluUmVzdWx0cyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG91dFJlc3VsdHMgPSBuZWVkT3V0UmVzdWx0cyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGtpbmQgPSBraW5kT2Yoc3BlY2ltZW4pO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWVsZW1lbnRzSGFzU3BsaXQoXG4gICAgICAgICAgICBzcGVjaW1lbixcbiAgICAgICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBpblJlc3VsdHMsXG4gICAgICAgICAgICBvdXRSZXN1bHRzLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvKiBjaGVjayBsb2dpYyBhbHJlYWR5IHBlcmZvcm1lZCBieSBlbGVtZW50c0hhc1NwbGl0Ki9cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtpblJlc3VsdHMsIG91dFJlc3VsdHNdO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFlbGVtZW50c0hhc1NwbGl0KFxuICAgICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZCxcbiAgICAgICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBpblJlc3VsdHMsXG4gICAgICAgICAgICBvdXRSZXN1bHRzLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBpblJlc3VsdHMgJiYgbWFrZUNvcHlTZXQoaW5SZXN1bHRzKSxcbiAgICAgICAgICBvdXRSZXN1bHRzICYmIG1ha2VDb3B5U2V0KG91dFJlc3VsdHMpLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFwYWlyc0hhc1NwbGl0KFxuICAgICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZCxcbiAgICAgICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBpblJlc3VsdHMsXG4gICAgICAgICAgICBvdXRSZXN1bHRzLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBpblJlc3VsdHMgJiYgbWFrZUNvcHlCYWcoaW5SZXN1bHRzKSxcbiAgICAgICAgICBvdXRSZXN1bHRzICYmIG1ha2VDb3B5QmFnKG91dFJlc3VsdHMpLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdW5leHBlY3RlZCAke3Eoa2luZCl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQ29udGFpbmVySGFzSGVscGVyID0gRmFyKCdNLmNvbnRhaW5lckhhcyBoZWxwZXInLCB7XG4gICAgLyoqXG4gKiBAcGFyYW0ge0NvcHlBcnJheSB8IENvcHlTZXQgfCBDb3B5QmFnfSBzcGVjaW1lblxuICogQHBhcmFtIHtbUGF0dGVybiwgYmlnaW50LCBMaW1pdHM/XX0gcGF5bG9hZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtlbGVtZW50UGF0dCwgYm91bmQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGtpbmQgPSBraW5kT2Yoc3BlY2ltZW4sIGNoZWNrKTtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgaWYgKFxuICAgICAgICAhYXBwbHlMYWJlbGluZ0Vycm9yKFxuICAgICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuICAgICAgICAgIFtib3VuZCwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVja10sXG4gICAgICAgICAgYCR7a2luZH0gbWF0Y2hlc2AsXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gISFjb250YWluZXJIYXNTcGxpdChcbiAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICBib3VuZCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjaGVjayxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLmd0ZSgxbildKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdNLmNvbnRhaW5lckhhcyBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hNYXBPZkhlbHBlciA9IEZhcignbWF0Y2g6bWFwT2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IG51bU1hcEVudHJpZXNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlNYXAnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyoqIEB0eXBlIHtBcnJheX0gKi8gKHNwZWNpbWVuLnBheWxvYWQua2V5cykubGVuZ3RoIDw9XG4gICAgICAgICAgICBudW1NYXBFbnRyaWVzTGltaXQsXG4gICAgICAgICAgWGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtTWFwRW50cmllc0xpbWl0LFxuICAgICAgICAgICl9IGVudHJpZXM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQua2V5cyxcbiAgICAgICAgICBrZXlQYXR0LFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICdtYXAga2V5cycsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbiAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbiAgICAgICAgICB2YWx1ZVBhdHQsXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgJ21hcCB2YWx1ZXMnLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDptYXBPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IF9lbnRyeVBhdHQgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybltdfSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIHJlc3RTcGVjaW1lbjogUGFzc2FibGVbXVxuICogfX1cbiAqL1xuICBjb25zdCBzcGxpdEFycmF5UGFydHMgPSAoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KSA9PiB7XG4gICAgY29uc3QgbnVtUmVxdWlyZWQgPSByZXF1aXJlZFBhdHQubGVuZ3RoO1xuICAgIGNvbnN0IG51bU9wdGlvbmFsID0gb3B0aW9uYWxQYXR0Lmxlbmd0aDtcbiAgICBjb25zdCByZXF1aXJlZFNwZWNpbWVuID0gc3BlY2ltZW4uc2xpY2UoMCwgbnVtUmVxdWlyZWQpO1xuICAgIGNvbnN0IG9wdGlvbmFsU3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZShcbiAgICAgIG51bVJlcXVpcmVkLFxuICAgICAgbnVtUmVxdWlyZWQgKyBudW1PcHRpb25hbCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3RTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKG51bVJlcXVpcmVkICsgbnVtT3B0aW9uYWwpO1xuICAgIHJldHVybiBoYXJkZW4oeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG4gIGNvbnN0IGFkYXB0QXJyYXlQYXR0ZXJuID0gKG9wdGlvbmFsUGF0dCwgbGVuZ3RoKSA9PlxuICAgIGhhcmRlbihvcHRpb25hbFBhdHQuc2xpY2UoMCwgbGVuZ3RoKS5tYXAocGF0dCA9PiBNTS5vcHQocGF0dCkpKTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXIgPSBGYXIoJ21hdGNoOnNwbGl0QXJyYXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSBbXSwgcmVzdFBhdHQgPSBNTS5hbnkoKV0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUFycmF5JywgY2hlY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgcmVxdWlyZWRTcGVjaW1lbiwgb3B0aW9uYWxTcGVjaW1lbiwgcmVzdFNwZWNpbWVuIH0gPVxuICAgICAgICBzcGxpdEFycmF5UGFydHMoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KTtcbiAgICAgIGNvbnN0IHBhcnRpYWxQYXR0ID0gYWRhcHRBcnJheVBhdHRlcm4oXG4gICAgICAgIG9wdGlvbmFsUGF0dCxcbiAgICAgICAgb3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgsXG4gICAgICApO1xuICAgICAgbGV0IGFyZ051bSA9IDA7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGggPT09IHJlcXVpcmVkUGF0dC5sZW5ndGggfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG4gICAgICAgICAgICAgIHJlcXVpcmVkUGF0dC5sZW5ndGgsXG4gICAgICAgICAgICApfSBhcmd1bWVudHM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgICApKSAmJlxuICAgICAgICByZXF1aXJlZFBhdHQuZXZlcnkoKHAsIGkpID0+XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbiAgICAgICAgICBjaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbltpXSwgcCwgY2hlY2ssIGBhcmcgJHthcmdOdW0rK31gKSxcbiAgICAgICAgKSAmJlxuICAgICAgICBwYXJ0aWFsUGF0dC5ldmVyeSgocCwgaSkgPT5cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhvcHRpb25hbFNwZWNpbWVuW2ldLCBwLCBjaGVjaywgYGFyZyAke2FyZ051bSsrfT9gKSxcbiAgICAgICAgKSAmJlxuICAgICAgICBjaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLCByZXN0UGF0dCwgY2hlY2ssICcuLi5yZXN0JylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICogQHBhcmFtIHtBcnJheX0gc3BsaXRBcnJheVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChzcGxpdEFycmF5LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwYXNzU3R5bGVPZihzcGxpdEFycmF5KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgKHNwbGl0QXJyYXkubGVuZ3RoID49IDEgfHwgc3BsaXRBcnJheS5sZW5ndGggPD0gMylcbiAgICAgICkge1xuICAgICAgICBjb25zdCBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsIHJlc3RQYXR0ID0gdW5kZWZpbmVkXSA9XG4gICAgICAgICAgc3BsaXRBcnJheTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzUGF0dGVybihyZXF1aXJlZFBhdHQpICYmXG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgICAob3B0aW9uYWxQYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSAmJlxuICAgICAgICAgICAgICBwYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpID09PSAnY29weUFycmF5JykpICYmXG4gICAgICAgICAgKHJlc3RQYXR0ID09PSB1bmRlZmluZWQgfHwgaXNQYXR0ZXJuKHJlc3RQYXR0KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbiAgICAgICAgICBzcGxpdEFycmF5LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChbXG4gICAgICBfcmVxdWlyZWRQYXR0LFxuICAgICAgX29wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCxcbiAgICAgIF9yZXN0UGF0dCA9IHVuZGVmaW5lZCxcbiAgICBdKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG4gIH0pO1xuXG4gIC8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG4gIGNvbnN0IHNwbGl0UmVjb3JkUGFydHMgPSAoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KSA9PiB7XG4gICAgLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4gICAgLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbiAgICBjb25zdCByZXF1aXJlZEVudHJpZXMgPSBbXTtcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuICAgIGNvbnN0IG9wdGlvbmFsRW50cmllcyA9IFtdO1xuICAgIC8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG4gICAgY29uc3QgcmVzdEVudHJpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZW50cmllcyhzcGVjaW1lbikpIHtcbiAgICAgIGlmIChoYXNPd24ocmVxdWlyZWRQYXR0LCBuYW1lKSkge1xuICAgICAgICByZXF1aXJlZEVudHJpZXMucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzT3duKG9wdGlvbmFsUGF0dCwgbmFtZSkpIHtcbiAgICAgICAgb3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0RW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHJlcXVpcmVkU3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG4gICAgICBvcHRpb25hbFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxuICAgICAgcmVzdFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyksXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiB2YWx1ZXMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuICBjb25zdCBhZGFwdFJlY29yZFBhdHRlcm4gPSAob3B0aW9uYWxQYXR0LCBuYW1lcykgPT5cbiAgICBmcm9tVW5pcXVlRW50cmllcyhuYW1lcy5tYXAobmFtZSA9PiBbbmFtZSwgTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTcGxpdFJlY29yZEhlbHBlciA9IEZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSB7fSwgcmVzdFBhdHQgPSBNTS5hbnkoKV0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weVJlY29yZCcsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9ID1cbiAgICAgICAgc3BsaXRSZWNvcmRQYXJ0cyhzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpO1xuXG4gICAgICBjb25zdCBwYXJ0aWFsTmFtZXMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhvcHRpb25hbFNwZWNpbWVuKSk7XG4gICAgICBjb25zdCBwYXJ0aWFsUGF0dCA9IGFkYXB0UmVjb3JkUGF0dGVybihvcHRpb25hbFBhdHQsIHBhcnRpYWxOYW1lcyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBjaGVjaykgJiZcbiAgICAgICAgcGFydGlhbE5hbWVzLmV2ZXJ5KG5hbWUgPT5cbiAgICAgICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgICAgICBvcHRpb25hbFNwZWNpbWVuW25hbWVdLFxuICAgICAgICAgICAgcGFydGlhbFBhdHRbbmFtZV0sXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIGAke25hbWV9P2AsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSAmJlxuICAgICAgICBjaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLCByZXN0UGF0dCwgY2hlY2ssICcuLi5yZXN0JylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICogQHBhcmFtIHtBcnJheX0gc3BsaXRBcnJheVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChzcGxpdEFycmF5LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwYXNzU3R5bGVPZihzcGxpdEFycmF5KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgKHNwbGl0QXJyYXkubGVuZ3RoID49IDEgfHwgc3BsaXRBcnJheS5sZW5ndGggPD0gMylcbiAgICAgICkge1xuICAgICAgICBjb25zdCBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsIHJlc3RQYXR0ID0gdW5kZWZpbmVkXSA9XG4gICAgICAgICAgc3BsaXRBcnJheTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzUGF0dGVybihyZXF1aXJlZFBhdHQpICYmXG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSA9PT0gJ2NvcHlSZWNvcmQnICYmXG4gICAgICAgICAgKG9wdGlvbmFsUGF0dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkgJiZcbiAgICAgICAgICAgICAgcGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KSA9PT0gJ2NvcHlSZWNvcmQnKSkgJiZcbiAgICAgICAgICAocmVzdFBhdHQgPT09IHVuZGVmaW5lZCB8fCBpc1BhdHRlcm4ocmVzdFBhdHQpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG4gICAgICAgICAgc3BsaXRBcnJheSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoW1xuICAgICAgcmVxdWlyZWRQYXR0LFxuICAgICAgX29wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCxcbiAgICAgIF9yZXN0UGF0dCA9IHVuZGVmaW5lZCxcbiAgICBdKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBNYXRjaEhlbHBlcj59ICovXG4gIGNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnID0gaGFyZGVuKHtcbiAgICAnbWF0Y2g6YW55JzogbWF0Y2hBbnlIZWxwZXIsXG4gICAgJ21hdGNoOmFuZCc6IG1hdGNoQW5kSGVscGVyLFxuICAgICdtYXRjaDpvcic6IG1hdGNoT3JIZWxwZXIsXG4gICAgJ21hdGNoOm5vdCc6IG1hdGNoTm90SGVscGVyLFxuXG4gICAgJ21hdGNoOnNjYWxhcic6IG1hdGNoU2NhbGFySGVscGVyLFxuICAgICdtYXRjaDprZXknOiBtYXRjaEtleUhlbHBlcixcbiAgICAnbWF0Y2g6cGF0dGVybic6IG1hdGNoUGF0dGVybkhlbHBlcixcbiAgICAnbWF0Y2g6a2luZCc6IG1hdGNoS2luZEhlbHBlcixcbiAgICAnbWF0Y2g6dGFnZ2VkJzogbWF0Y2hUYWdnZWRIZWxwZXIsXG4gICAgJ21hdGNoOmJpZ2ludCc6IG1hdGNoQmlnaW50SGVscGVyLFxuICAgICdtYXRjaDpuYXQnOiBtYXRjaE5hdEhlbHBlcixcbiAgICAnbWF0Y2g6c3RyaW5nJzogbWF0Y2hTdHJpbmdIZWxwZXIsXG4gICAgJ21hdGNoOnN5bWJvbCc6IG1hdGNoU3ltYm9sSGVscGVyLFxuICAgICdtYXRjaDpyZW1vdGFibGUnOiBtYXRjaFJlbW90YWJsZUhlbHBlcixcblxuICAgICdtYXRjaDpsdCc6IG1hdGNoTFRIZWxwZXIsXG4gICAgJ21hdGNoOmx0ZSc6IG1hdGNoTFRFSGVscGVyLFxuICAgICdtYXRjaDpndGUnOiBtYXRjaEdURUhlbHBlcixcbiAgICAnbWF0Y2g6Z3QnOiBtYXRjaEdUSGVscGVyLFxuXG4gICAgJ21hdGNoOmFycmF5T2YnOiBtYXRjaEFycmF5T2ZIZWxwZXIsXG4gICAgJ21hdGNoOmJ5dGVBcnJheSc6IG1hdGNoQnl0ZUFycmF5SGVscGVyLFxuICAgICdtYXRjaDpyZWNvcmRPZic6IG1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4gICAgJ21hdGNoOnNldE9mJzogbWF0Y2hTZXRPZkhlbHBlcixcbiAgICAnbWF0Y2g6YmFnT2YnOiBtYXRjaEJhZ09mSGVscGVyLFxuICAgICdtYXRjaDpjb250YWluZXJIYXMnOiBtYXRjaENvbnRhaW5lckhhc0hlbHBlcixcbiAgICAnbWF0Y2g6bWFwT2YnOiBtYXRjaE1hcE9mSGVscGVyLFxuICAgICdtYXRjaDpzcGxpdEFycmF5JzogbWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuICAgICdtYXRjaDpzcGxpdFJlY29yZCc6IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXIsXG4gIH0pO1xuXG4gIGNvbnN0IG1ha2VNYXRjaGVyID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICAgIGNvbnN0IG1hdGNoZXIgPSBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCk7XG4gICAgYXNzZXJ0UGF0dGVybihtYXRjaGVyKTtcbiAgICByZXR1cm4gbWF0Y2hlcjtcbiAgfTtcblxuICBjb25zdCBtYWtlS2luZE1hdGNoZXIgPSBraW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpraW5kJywga2luZCk7XG5cbiAgY29uc3QgQW55U2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6YW55JywgdW5kZWZpbmVkKTtcbiAgY29uc3QgU2NhbGFyU2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJywgdW5kZWZpbmVkKTtcbiAgY29uc3QgS2V5U2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6a2V5JywgdW5kZWZpbmVkKTtcbiAgY29uc3QgUGF0dGVyblNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOnBhdHRlcm4nLCB1bmRlZmluZWQpO1xuICBjb25zdCBCb29sZWFuU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbiAgY29uc3QgTnVtYmVyU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ251bWJlcicpO1xuICBjb25zdCBCaWdJbnRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJpZ2ludCcsIFtdKTtcbiAgY29uc3QgTmF0U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpuYXQnLCBbXSk7XG4gIGNvbnN0IFN0cmluZ1NoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJywgW10pO1xuICBjb25zdCBTeW1ib2xTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnN5bWJvbCcsIFtdKTtcbiAgY29uc3QgUmVjb3JkU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpyZWNvcmRPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgQXJyYXlTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmFycmF5T2YnLCBbQW55U2hhcGVdKTtcbiAgY29uc3QgQnl0ZUFycmF5U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpieXRlQXJyYXknLCBbXSk7XG4gIGNvbnN0IFNldFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c2V0T2YnLCBbQW55U2hhcGVdKTtcbiAgY29uc3QgQmFnU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgTWFwU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgUmVtb3RhYmxlU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuICBjb25zdCBFcnJvclNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdlcnJvcicpO1xuICBjb25zdCBQcm9taXNlU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3Byb21pc2UnKTtcbiAgY29uc3QgVW5kZWZpbmVkU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4gIC8qKlxuICogRm9yIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGF5bG9hZCBpcyB0aGUgb3B0aW9uYWwgbGltaXRzLFxuICogc28gdGhhdCB3aGVuIGl0IGlzIGB1bmRlZmluZWRgIGl0IGlzIGRyb3BwZWQgZnJvbSB0aGUgZW5kIG9mIHRoZVxuICogcGF5bG9hZHMgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXlsb2FkXG4gKi9cbiAgY29uc3QgbWFrZUxpbWl0c01hdGNoZXIgPSAodGFnLCBwYXlsb2FkKSA9PiB7XG4gICAgaWYgKHBheWxvYWRbcGF5bG9hZC5sZW5ndGggLSAxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkID0gaGFyZGVuKHBheWxvYWQuc2xpY2UoMCwgcGF5bG9hZC5sZW5ndGggLSAxKSk7XG4gICAgfVxuICAgIHJldHVybiBtYWtlTWF0Y2hlcih0YWcsIHBheWxvYWQpO1xuICB9O1xuXG4gIGNvbnN0IG1ha2VSZW1vdGFibGVNYXRjaGVyID0gKGxhYmVsID0gdW5kZWZpbmVkKSA9PlxuICAgIGxhYmVsID09PSB1bmRlZmluZWRcbiAgICAgID8gUmVtb3RhYmxlU2hhcGVcbiAgICAgIDogbWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsIGhhcmRlbih7IGxhYmVsIH0pKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IGVtcHR5XG4gKiBAcGFyYW0ge1R9IGJhc2VcbiAqIEBwYXJhbSB7VH0gW29wdGlvbmFsXVxuICogQHBhcmFtIHtUfSBbcmVzdF1cbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbiAgY29uc3QgbWFrZVNwbGl0UGF5bG9hZCA9IChcbiAgICBlbXB0eSxcbiAgICBiYXNlLFxuICAgIG9wdGlvbmFsID0gdW5kZWZpbmVkLFxuICAgIHJlc3QgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIGlmIChyZXN0KSB7XG4gICAgICByZXR1cm4gW2Jhc2UsIG9wdGlvbmFsIHx8IGVtcHR5LCByZXN0XTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICByZXR1cm4gW2Jhc2UsIG9wdGlvbmFsXTtcbiAgICB9XG4gICAgcmV0dXJuIFtiYXNlXTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hlck5hbWVzcGFjZX0gKi9cbiAgY29uc3QgTSA9IGhhcmRlbih7XG4gICAgYW55OiAoKSA9PiBBbnlTaGFwZSxcbiAgICBhbmQ6ICguLi5wYXR0cykgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmFuZCcsIHBhdHRzKSxcbiAgICBvcjogKC4uLnBhdHRzKSA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6b3InLCBwYXR0cyksXG4gICAgbm90OiBzdWJQYXR0ID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpub3QnLCBzdWJQYXR0KSxcblxuICAgIHNjYWxhcjogKCkgPT4gU2NhbGFyU2hhcGUsXG4gICAga2V5OiAoKSA9PiBLZXlTaGFwZSxcbiAgICBwYXR0ZXJuOiAoKSA9PiBQYXR0ZXJuU2hhcGUsXG4gICAga2luZDogbWFrZUtpbmRNYXRjaGVyLFxuICAgIHRhZ2dlZDogKHRhZ1BhdHQgPSBNLnN0cmluZygpLCBwYXlsb2FkUGF0dCA9IE0uYW55KCkpID0+XG4gICAgICBtYWtlTWF0Y2hlcignbWF0Y2g6dGFnZ2VkJywgaGFyZGVuKFt0YWdQYXR0LCBwYXlsb2FkUGF0dF0pKSxcbiAgICBib29sZWFuOiAoKSA9PiBCb29sZWFuU2hhcGUsXG4gICAgbnVtYmVyOiAoKSA9PiBOdW1iZXJTaGFwZSxcbiAgICBiaWdpbnQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmlnaW50JywgW2xpbWl0c10pIDogQmlnSW50U2hhcGUsXG4gICAgbmF0OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm5hdCcsIFtsaW1pdHNdKSA6IE5hdFNoYXBlLFxuICAgIHN0cmluZzogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzdHJpbmcnLCBbbGltaXRzXSkgOiBTdHJpbmdTaGFwZSxcbiAgICBzeW1ib2w6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3ltYm9sJywgW2xpbWl0c10pIDogU3ltYm9sU2hhcGUsXG4gICAgcmVjb3JkOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5yZWNvcmRPZihNLmFueSgpLCBNLmFueSgpLCBsaW1pdHMpIDogUmVjb3JkU2hhcGUsXG4gICAgLyogc3RydWN0OiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlSZWNvcmRzIHdpdGggYSBmaXhlZCBxdWFudGl0eSBvZiovXG4gICAgLyogZW50cmllcyB3aGVyZSB0aGUgdmFsdWVzIG1hdGNoIHBhdHRlcm5zIGZvciBjb3JyZXNwb25kaW5nIGtleXMgaXMgbWVyZWx5Ki9cbiAgICAvKiBhIGhhcmRlbmVkIG9iamVjdCB3aXRoIHBhdHRlcm5zIGluIHRoZSBwbGFjZXMgb2YgdmFsdWVzIGZvciovXG4gICAgLyogY29ycmVzcG9uZGluZyBrZXlzLiovXG4gICAgLyogRm9yIGV4YW1wbGUsIGEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weVJlY29yZHMgdGhhdCBoYXZlIGEgc3RyaW5nIHZhbHVlKi9cbiAgICAvKiBmb3IgdGhlIGtleSAneCcgYW5kIGEgbnVtYmVyIGZvciB0aGUga2V5ICd5JyBpczoqL1xuICAgIC8qIGhhcmRlbih7IHg6IE0uc3RyaW5nKCksIHk6IE0ubnVtYmVyKCkgfSkuKi9cbiAgICBhcnJheTogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0uYXJyYXlPZihNLmFueSgpLCBsaW1pdHMpIDogQXJyYXlTaGFwZSxcbiAgICAvKiB0dXBsZTogQSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5QXJyYXlzIHdpdGggYSBmaXhlZCBxdWFudGl0eSBvZiB2YWx1ZXMqL1xuICAgIC8qIHRoYXQgbWF0Y2ggYSBoZXRlcm9nZW5lb3VzIGFycmF5IG9mIHBhdHRlcm5zIGlzIG1lcmVseSBhIGhhcmRlbmVkIGFycmF5Ki9cbiAgICAvKiBvZiB0aGUgcmVzcGVjdGl2ZSBwYXR0ZXJucy4qL1xuICAgIC8qIEZvciBleGFtcGxlLCBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlBcnJheXMgb2YgbGVuZ3RoIDIgdGhhdCBoYXZlIGEqL1xuICAgIC8qIHN0cmluZyBhdCBpbmRleCAwIGFuZCBhIG51bWJlciBhdCBpbmRleCAxIGlzOiovXG4gICAgLyogaGFyZGVuKFsgTS5zdHJpbmcoKSwgTS5udW1iZXIoKSBdKS4qL1xuICAgIGJ5dGVBcnJheTogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpieXRlQXJyYXknLCBbbGltaXRzXSkgOiBCeXRlQXJyYXlTaGFwZSxcbiAgICBzZXQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+IChsaW1pdHMgPyBNLnNldE9mKE0uYW55KCksIGxpbWl0cykgOiBTZXRTaGFwZSksXG4gICAgYmFnOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5iYWdPZihNLmFueSgpLCBNLmFueSgpLCBsaW1pdHMpIDogQmFnU2hhcGUsXG4gICAgbWFwOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5tYXBPZihNLmFueSgpLCBNLmFueSgpLCBsaW1pdHMpIDogTWFwU2hhcGUsXG4gICAgLyogaGV0ZXJvZ2VuZW91cyBtYXA6IEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weU1hcHMgd2l0aCBhIGZpeGVkIHF1YW50aXR5Ki9cbiAgICAvKiBvZiBlbnRyaWVzIHdoZXJlIHRoZSB2YWx1ZSBmb3IgZWFjaCBrZXkgbWF0Y2hlcyBhIGNvcnJlc3BvbmRpbmcgcGF0dGVybiovXG4gICAgLyogaXMgbWVyZWx5IGEgKGhhcmRlbmVkKSBDb3B5TWFwIHdpdGggcGF0dGVybnMgaW5zdGVhZCBvZiB2YWx1ZXMgZm9yIHRoZSovXG4gICAgLyogY29ycmVzcG9uZGluZyBrZXlzLiovXG4gICAgLyogRm9yIGV4YW1wbGUsIGEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weU1hcHMgd2hlcmUgdGhlIHZhbHVlIGZvciB0aGUga2V5Ki9cbiAgICAvKiAneCcgaXMgYSBudW1iZXIgYW5kIHRoZSB2YWx1ZSBmb3IgdGhlIGtleSAneScgaXMgYSBzdHJpbmcgaXM6Ki9cbiAgICAvKiBtYWtlQ29weU1hcChbWyd4JywgTS5udW1iZXIoKV0sIFsneScsIE0uc3RyaW5nKCldXSkuKi9cbiAgICByZW1vdGFibGU6IG1ha2VSZW1vdGFibGVNYXRjaGVyLFxuICAgIGVycm9yOiAoKSA9PiBFcnJvclNoYXBlLFxuICAgIHByb21pc2U6ICgpID0+IFByb21pc2VTaGFwZSxcbiAgICB1bmRlZmluZWQ6ICgpID0+IFVuZGVmaW5lZFNoYXBlLFxuICAgIG51bGw6ICgpID0+IG51bGwsXG5cbiAgICBsdDogcmlnaHRPcGVyYW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpsdCcsIHJpZ2h0T3BlcmFuZCksXG4gICAgbHRlOiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmx0ZScsIHJpZ2h0T3BlcmFuZCksXG4gICAgZXE6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXkoa2V5KTtcbiAgICAgIHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/IE0udW5kZWZpbmVkKCkgOiBrZXk7XG4gICAgfSxcbiAgICBuZXE6IGtleSA9PiBNLm5vdChNLmVxKGtleSkpLFxuICAgIGd0ZTogcmlnaHRPcGVyYW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLCByaWdodE9wZXJhbmQpLFxuICAgIGd0OiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmd0JywgcmlnaHRPcGVyYW5kKSxcblxuICAgIHJlY29yZE9mOiAoa2V5UGF0dCA9IE0uYW55KCksIHZhbHVlUGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0c10pLFxuICAgIGFycmF5T2Y6IChzdWJQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmFycmF5T2YnLCBbc3ViUGF0dCwgbGltaXRzXSksXG4gICAgc2V0T2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnNldE9mJywgW2tleVBhdHQsIGxpbWl0c10pLFxuICAgIGJhZ09mOiAoa2V5UGF0dCA9IE0uYW55KCksIGNvdW50UGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiYWdPZicsIFtrZXlQYXR0LCBjb3VudFBhdHQsIGxpbWl0c10pLFxuICAgIGNvbnRhaW5lckhhczogKGVsZW1lbnRQYXR0ID0gTS5hbnkoKSwgY291bnRQYXR0ID0gMW4sIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpjb250YWluZXJIYXMnLCBbZWxlbWVudFBhdHQsIGNvdW50UGF0dCwgbGltaXRzXSksXG4gICAgbWFwT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgdmFsdWVQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm1hcE9mJywgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzXSksXG4gICAgc3BsaXRBcnJheTogKGJhc2UsIG9wdGlvbmFsID0gdW5kZWZpbmVkLCByZXN0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZU1hdGNoZXIoXG4gICAgICAgICdtYXRjaDpzcGxpdEFycmF5JyxcbiAgICAgICAgbWFrZVNwbGl0UGF5bG9hZChbXSwgYmFzZSwgb3B0aW9uYWwsIHJlc3QpLFxuICAgICAgKSxcbiAgICBzcGxpdFJlY29yZDogKGJhc2UsIG9wdGlvbmFsID0gdW5kZWZpbmVkLCByZXN0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZU1hdGNoZXIoXG4gICAgICAgICdtYXRjaDpzcGxpdFJlY29yZCcsXG4gICAgICAgIG1ha2VTcGxpdFBheWxvYWQoe30sIGJhc2UsIG9wdGlvbmFsLCByZXN0KSxcbiAgICAgICksXG4gICAgc3BsaXQ6IChiYXNlLCByZXN0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgLyogVE9ETyBhdC10cy1leHBlY3QtZXJyb3Igd29ya3MgbG9jYWxseSBidXQgbm90IGZyb20gQGVuZG8vZXhvKi9cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG4gICAgICAgIHJldHVybiBNLnNwbGl0QXJyYXkoYmFzZSwgcmVzdCAmJiBbXSwgcmVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTS5zcGxpdFJlY29yZChiYXNlLCByZXN0ICYmIHt9LCByZXN0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHBhcnRpYWw6IChiYXNlLCByZXN0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgLyogVE9ETyBhdC10cy1leHBlY3QtZXJyb3Igd29ya3MgbG9jYWxseSBidXQgbm90IGZyb20gQGVuZG8vZXhvKi9cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG4gICAgICAgIHJldHVybiBNLnNwbGl0QXJyYXkoW10sIGJhc2UsIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sIGJhc2UsIHJlc3QpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlcmVmOiB0ID0+IE0ub3IodCwgTS5wcm9taXNlKCkpLFxuICAgIG9wdDogdCA9PiBNLm9yKE0udW5kZWZpbmVkKCksIHQpLFxuXG4gICAgaW50ZXJmYWNlOiAoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zKSA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VJbnRlcmZhY2VHdWFyZChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMpLFxuICAgIGNhbGw6ICguLi5hcmdQYXR0ZXJucykgPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignc3luYycsIGFyZ1BhdHRlcm5zKSxcbiAgICBjYWxsV2hlbjogKC4uLmFyZ0d1YXJkcykgPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLCBhcmdHdWFyZHMpLFxuXG4gICAgYXdhaXQ6IGFyZ1BhdHRlcm4gPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlQXdhaXRBcmdHdWFyZChhcmdQYXR0ZXJuKSxcbiAgICByYXc6ICgpID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZVJhd0d1YXJkKCksXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNoZWNrTWF0Y2hlcyxcbiAgICBtYXRjaGVzLFxuICAgIG11c3RNYXRjaCxcbiAgICBhc3NlcnRQYXR0ZXJuLFxuICAgIGlzUGF0dGVybixcbiAgICBnZXRSYW5rQ292ZXIsXG4gICAgTSxcbiAgICBraW5kT2YsXG4gICAgY29udGFpbmVySGFzU3BsaXQsXG4gIH0pO1xufTtcblxuLyogT25seSBpbmNsdWRlIHRob3NlIHdob3NlIG1lYW5pbmcgaXMgaW5kZXBlbmRlbnQgb2YgYW4gaW1wdXRlZCBzb3J0IG9yZGVyKi9cbi8qIG9mIHJlbW90YWJsZXMsIG9yIG9mIGVuY29kaW5nIG9mIHBhc3NhYmxlIGFzIHNvcnRhYmxlIHN0cmluZ3MuIFRodXMsKi9cbi8qIGdldFJhbmtDb3ZlciBpcyBvbWl0dGVkLiBUbyBnZXQgb25lLCB5b3UnZCBuZWVkIHRvIGluc3RhbnRpYXRlKi9cbi8qIGBtYWtlUGF0dGVybktpdCgpYCB5b3Vyc2VsZi4gU2luY2UgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBleHRlcm5hbCovXG4vKiB1c2VzIG9mIGBnZXRSYW5rQ292ZXJgLCBmb3IgY2xhcml0eSBkdXJpbmcgZGV2ZWxvcG1lbnQsIGBtYWtlUGF0dGVybktpdGAqL1xuLyogaXMgbm90IGN1cnJlbnRseSBleHBvcnRlZC4qL1xuICAgICAgIGNvbnN0IHtcbiAgY2hlY2tNYXRjaGVzLFxuICBtYXRjaGVzLFxuICBtdXN0TWF0Y2gsXG4gIGFzc2VydFBhdHRlcm4sXG4gIGlzUGF0dGVybixcbiAgZ2V0UmFua0NvdmVyLFxuICBNLFxuICBraW5kT2YsXG4gIGNvbnRhaW5lckhhc1NwbGl0LFxufSA9IG1ha2VQYXR0ZXJuS2l0KCk7JGjNj19vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRozY9fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTskaM2PX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaM2PX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjNj19vbmNlLmdldFJhbmtDb3ZlcihnZXRSYW5rQ292ZXIpOyRozY9fb25jZS5NKE0pOyRozY9fb25jZS5raW5kT2Yoa2luZE9mKTskaM2PX29uY2UuY29udGFpbmVySGFzU3BsaXQoY29udGFpbmVySGFzU3BsaXQpO1xuXG5NTSA9IE07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gR3VhcmRzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE0uYXdhaXQoLi4uKSovXG5jb25zdCBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpLFxufSk7XG5cbiAgICAgICBjb25zdCBBd2FpdEFyZ0d1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtzcGVjaW1lbiBpcyBBd2FpdEFyZ0d1YXJkfVxuICovJGjNj19vbmNlLkF3YWl0QXJnR3VhcmRTaGFwZShBd2FpdEFyZ0d1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGlzQXdhaXRBcmdHdWFyZCA9IHNwZWNpbWVuID0+XG4gIG1hdGNoZXMoc3BlY2ltZW4sIEF3YWl0QXJnR3VhcmRTaGFwZSk7JGjNj19vbmNlLmlzQXdhaXRBcmdHdWFyZChpc0F3YWl0QXJnR3VhcmQpO1xuaGFyZGVuKGlzQXdhaXRBcmdHdWFyZCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBBd2FpdEFyZ0d1YXJkfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QXdhaXRBcmdHdWFyZCA9IHNwZWNpbWVuID0+IHtcbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBBd2FpdEFyZ0d1YXJkU2hhcGUsICdhd2FpdEFyZ0d1YXJkJyk7XG59OyRozY9fb25jZS5hc3NlcnRBd2FpdEFyZ0d1YXJkKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuaGFyZGVuKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gYXJnUGF0dGVyblxuICogQHJldHVybnMge0F3YWl0QXJnR3VhcmR9XG4gKi9cbmNvbnN0IG1ha2VBd2FpdEFyZ0d1YXJkID0gYXJnUGF0dGVybiA9PiB7XG4gIC8qKiBAdHlwZSB7QXdhaXRBcmdHdWFyZH0gKi9cbiAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6YXdhaXRBcmdHdWFyZCcsIHtcbiAgICBhcmdHdWFyZDogYXJnUGF0dGVybixcbiAgfSk7XG4gIGFzc2VydEF3YWl0QXJnR3VhcmQocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qIE0ucmF3KCkqL1xuXG5jb25zdCBSYXdHdWFyZFBheWxvYWRTaGFwZSA9IE0ucmVjb3JkKCk7XG5cbiAgICAgICBjb25zdCBSYXdHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDpyYXdHdWFyZCcpOyRozY9fb25jZS5SYXdHdWFyZFNoYXBlKFJhd0d1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgaXNSYXdHdWFyZCA9IHNwZWNpbWVuID0+IG1hdGNoZXMoc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUpOyRozY9fb25jZS5pc1Jhd0d1YXJkKGlzUmF3R3VhcmQpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UmF3R3VhcmQgPSBzcGVjaW1lbiA9PlxuICBtdXN0TWF0Y2goc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUsICdyYXdHdWFyZCcpO1xuXG4vKipcbiAqIEByZXR1cm5zIHtSYXdHdWFyZH1cbiAqLyRozY9fb25jZS5hc3NlcnRSYXdHdWFyZChhc3NlcnRSYXdHdWFyZCk7XG5jb25zdCBtYWtlUmF3R3VhcmQgPSAoKSA9PiBtYWtlVGFnZ2VkKCdndWFyZDpyYXdHdWFyZCcsIHt9KTtcblxuLyogTS5jYWxsKC4uLikqL1xuLyogTS5jYWxsV2hlbiguLi4pKi9cblxuICAgICAgIGNvbnN0IFN5bmNWYWx1ZUd1YXJkU2hhcGUgPSBNLm9yKFJhd0d1YXJkU2hhcGUsIE0ucGF0dGVybigpKTskaM2PX29uY2UuU3luY1ZhbHVlR3VhcmRTaGFwZShTeW5jVmFsdWVHdWFyZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKFN5bmNWYWx1ZUd1YXJkU2hhcGUpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZExpc3RTaGFwZShTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSk7XG5cbmNvbnN0IEFyZ0d1YXJkU2hhcGUgPSBNLm9yKFJhd0d1YXJkU2hhcGUsIEF3YWl0QXJnR3VhcmRTaGFwZSwgTS5wYXR0ZXJuKCkpO1xuICAgICAgIGNvbnN0IEFyZ0d1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKEFyZ0d1YXJkU2hhcGUpOyRozY9fb25jZS5BcmdHdWFyZExpc3RTaGFwZShBcmdHdWFyZExpc3RTaGFwZSk7XG5cbmNvbnN0IFN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGNhbGxLaW5kOiAnc3luYycsXG4gIGFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gIG9wdGlvbmFsQXJnR3VhcmRzOiBNLm9wdChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSksXG4gIHJlc3RBcmdHdWFyZDogTS5vcHQoU3luY1ZhbHVlR3VhcmRTaGFwZSksXG4gIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxufSk7XG5cbmNvbnN0IEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSBoYXJkZW4oe1xuICBjYWxsS2luZDogJ2FzeW5jJyxcbiAgYXJnR3VhcmRzOiBBcmdHdWFyZExpc3RTaGFwZSxcbiAgb3B0aW9uYWxBcmdHdWFyZHM6IE0ub3B0KEFyZ0d1YXJkTGlzdFNoYXBlKSxcbiAgcmVzdEFyZ0d1YXJkOiBNLm9wdChTeW5jVmFsdWVHdWFyZFNoYXBlKSxcbiAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG59KTtcblxuICAgICAgIGNvbnN0IE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gTS5vcihcbiAgU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuICBBc3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuKTskaM2PX29uY2UuTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgTWV0aG9kR3VhcmRTaGFwZSA9IE0ua2luZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIE1ldGhvZEd1YXJkfVxuICovJGjNj19vbmNlLk1ldGhvZEd1YXJkU2hhcGUoTWV0aG9kR3VhcmRTaGFwZSk7XG4gICAgICAgY29uc3QgYXNzZXJ0TWV0aG9kR3VhcmQgPSBzcGVjaW1lbiA9PiB7XG4gIG11c3RNYXRjaChzcGVjaW1lbiwgTWV0aG9kR3VhcmRTaGFwZSwgJ21ldGhvZEd1YXJkJyk7XG59OyRozY9fb25jZS5hc3NlcnRNZXRob2RHdWFyZChhc3NlcnRNZXRob2RHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0TWV0aG9kR3VhcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7J3N5bmMnfCdhc3luYyd9IGNhbGxLaW5kXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IGFyZ0d1YXJkc1xuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBbb3B0aW9uYWxBcmdHdWFyZHNdXG4gKiBAcGFyYW0ge1N5bmNWYWx1ZUd1YXJkfSBbcmVzdEFyZ0d1YXJkXVxuICogQHJldHVybnMge01ldGhvZEd1YXJkTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyID0gKFxuICBjYWxsS2luZCxcbiAgYXJnR3VhcmRzLFxuICBvcHRpb25hbEFyZ0d1YXJkcyA9IHVuZGVmaW5lZCxcbiAgcmVzdEFyZ0d1YXJkID0gdW5kZWZpbmVkLFxuKSA9PlxuICBoYXJkZW4oe1xuICAgIG9wdGlvbmFsOiAoLi4ub3B0QXJnR3VhcmRzKSA9PiB7XG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG4gICAgICByZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsIGFyZ0d1YXJkcywgb3B0QXJnR3VhcmRzKTtcbiAgICB9LFxuICAgIHJlc3Q6IHJBcmdHdWFyZCA9PiB7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fCBGYWlsYENhbiBvbmx5IGhhdmUgb25lIHJlc3QgYXJnYDtcbiAgICAgIHJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbiAgICAgICAgY2FsbEtpbmQsXG4gICAgICAgIGFyZ0d1YXJkcyxcbiAgICAgICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgICAgIHJBcmdHdWFyZCxcbiAgICAgICk7XG4gICAgfSxcbiAgICByZXR1cm5zOiAocmV0dXJuR3VhcmQgPSBNLnVuZGVmaW5lZCgpKSA9PiB7XG4gICAgICAvKiogQHR5cGUge01ldGhvZEd1YXJkfSAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnLCB7XG4gICAgICAgIGNhbGxLaW5kLFxuICAgICAgICBhcmdHdWFyZHMsXG4gICAgICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgICAgICByZXN0QXJnR3VhcmQsXG4gICAgICAgIHJldHVybkd1YXJkLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnRNZXRob2RHdWFyZChyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9KTtcblxuICAgICAgIGNvbnN0IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdEd1YXJkczogTS5vcihNLnVuZGVmaW5lZCgpLCAncGFzc2FibGUnLCAncmF3JyksXG4gICAgc2xvcHB5OiBNLmJvb2xlYW4oKSxcbiAgICBzeW1ib2xNZXRob2RHdWFyZHM6IE0ubWFwT2YoTS5zeW1ib2woKSwgTWV0aG9kR3VhcmRTaGFwZSksXG4gIH0sXG4pOyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZShJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDppbnRlcmZhY2VHdWFyZCcpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgSW50ZXJmYWNlR3VhcmR9XG4gKi8kaM2PX29uY2UuSW50ZXJmYWNlR3VhcmRTaGFwZShJbnRlcmZhY2VHdWFyZFNoYXBlKTtcbiAgICAgICBjb25zdCBhc3NlcnRJbnRlcmZhY2VHdWFyZCA9IHNwZWNpbWVuID0+IHtcbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBJbnRlcmZhY2VHdWFyZFNoYXBlLCAnaW50ZXJmYWNlR3VhcmQnKTtcbn07JGjNj19vbmNlLmFzc2VydEludGVyZmFjZUd1YXJkKGFzc2VydEludGVyZmFjZUd1YXJkKTtcbmhhcmRlbihhc3NlcnRJbnRlcmZhY2VHdWFyZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIE1ldGhvZEd1YXJkPn0gW00gPSBSZWNvcmQ8UHJvcGVydHlLZXksIE1ldGhvZEd1YXJkPl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlcmZhY2VOYW1lXG4gKiBAcGFyYW0ge019IG1ldGhvZEd1YXJkc1xuICogQHBhcmFtIHt7IHNsb3BweT86IGJvb2xlYW4sIGRlZmF1bHRHdWFyZHM/OiBEZWZhdWx0R3VhcmRUeXBlIH19IFtvcHRpb25zXVxuICogQHJldHVybnMge0ludGVyZmFjZUd1YXJkPE0+fVxuICovXG5jb25zdCBtYWtlSW50ZXJmYWNlR3VhcmQgPSAoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgeyBzbG9wcHkgPSBmYWxzZSwgZGVmYXVsdEd1YXJkcyA9IHNsb3BweSA/ICdwYXNzYWJsZScgOiB1bmRlZmluZWQgfSA9XG4gICAgb3B0aW9ucztcbiAgLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzdHJpbmcta2V5ZWQgbWV0aG9kIGd1YXJkcyBhcmUgcmVwcmVzZW50ZWQgaW4qL1xuICAvKiBhIENvcHlSZWNvcmQuIEJ1dCBzeW1ib2wta2V5ZWQgbWV0aG9kcyBjYW5ub3QgYmUsIHNvIHdlIHB1dCB0aG9zZSBpbiBhKi9cbiAgLyogQ29weU1hcCB3aGVuIHByZXNlbnQuKi9cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBNZXRob2RHdWFyZD59ICovXG4gIGNvbnN0IHN0cmluZ01ldGhvZEd1YXJkcyA9IHt9O1xuICAvKiogQHR5cGUge0FycmF5PFtzeW1ib2wsIE1ldGhvZEd1YXJkXT59ICovXG4gIGNvbnN0IHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygb3duS2V5cyhtZXRob2RHdWFyZHMpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtZXRob2RHdWFyZHNbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChrZXkpXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJpbmdNZXRob2RHdWFyZHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvKiogQHR5cGUge0ludGVyZmFjZUd1YXJkfSAqL1xuICBjb25zdCByZXN1bHQgPSBtYWtlVGFnZ2VkKCdndWFyZDppbnRlcmZhY2VHdWFyZCcsIHtcbiAgICBpbnRlcmZhY2VOYW1lLFxuICAgIG1ldGhvZEd1YXJkczogc3RyaW5nTWV0aG9kR3VhcmRzLFxuICAgIC4uLihzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzLmxlbmd0aFxuICAgICAgPyB7IHN5bWJvbE1ldGhvZEd1YXJkczogbWFrZUNvcHlNYXAoc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcykgfVxuICAgICAgOiB7fSksXG4gICAgZGVmYXVsdEd1YXJkcyxcbiAgfSk7XG4gIGFzc2VydEludGVyZmFjZUd1YXJkKHJlc3VsdCk7XG4gIHJldHVybiAvKiogQHR5cGUge0ludGVyZmFjZUd1YXJkPE0+fSAqLyAocmVzdWx0KTtcbn07XG5cbmNvbnN0IEd1YXJkUGF5bG9hZFNoYXBlcyA9IGhhcmRlbih7XG4gICdndWFyZDphd2FpdEFyZ0d1YXJkJzogQXdhaXRBcmdHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOnJhd0d1YXJkJzogUmF3R3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDptZXRob2RHdWFyZCc6IE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6aW50ZXJmYWNlR3VhcmQnOiBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSxcbn0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdExpbWl0cyI6WyJkZWZhdWx0TGltaXRzIl0sImNoZWNrTWF0Y2hlcyI6WyJjaGVja01hdGNoZXMiXSwibWF0Y2hlcyI6WyJtYXRjaGVzIl0sIm11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXSwiYXNzZXJ0UGF0dGVybiI6WyJhc3NlcnRQYXR0ZXJuIl0sImlzUGF0dGVybiI6WyJpc1BhdHRlcm4iXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciJdLCJNIjpbIk0iXSwia2luZE9mIjpbImtpbmRPZiJdLCJjb250YWluZXJIYXNTcGxpdCI6WyJjb250YWluZXJIYXNTcGxpdCJdLCJBd2FpdEFyZ0d1YXJkU2hhcGUiOlsiQXdhaXRBcmdHdWFyZFNoYXBlIl0sImlzQXdhaXRBcmdHdWFyZCI6WyJpc0F3YWl0QXJnR3VhcmQiXSwiYXNzZXJ0QXdhaXRBcmdHdWFyZCI6WyJhc3NlcnRBd2FpdEFyZ0d1YXJkIl0sIlJhd0d1YXJkU2hhcGUiOlsiUmF3R3VhcmRTaGFwZSJdLCJpc1Jhd0d1YXJkIjpbImlzUmF3R3VhcmQiXSwiYXNzZXJ0UmF3R3VhcmQiOlsiYXNzZXJ0UmF3R3VhcmQiXSwiU3luY1ZhbHVlR3VhcmRTaGFwZSI6WyJTeW5jVmFsdWVHdWFyZFNoYXBlIl0sIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIjpbIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIl0sIkFyZ0d1YXJkTGlzdFNoYXBlIjpbIkFyZ0d1YXJkTGlzdFNoYXBlIl0sIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlIjpbIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlIl0sIk1ldGhvZEd1YXJkU2hhcGUiOlsiTWV0aG9kR3VhcmRTaGFwZSJdLCJhc3NlcnRNZXRob2RHdWFyZCI6WyJhc3NlcnRNZXRob2RHdWFyZCJdLCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSI6WyJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSJdLCJJbnRlcmZhY2VHdWFyZFNoYXBlIjpbIkludGVyZmFjZUd1YXJkU2hhcGUiXSwiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiOlsiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACwKxYbMJAACzCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIixbJGjNj19hID0+IChtZW1vUmFjZSA9ICRozY9fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwnbmFtZScse3ZhbHVlOlwibWFrZVByb21pc2VLaXRcIn0pOyRozY9fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywnbmFtZScse3ZhbHVlOlwicmFjZVByb21pc2VzXCJ9KTskaM2PX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7XG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtQcm9taXNlQ29uc3RydWN0b3J9ICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlID0gZ2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZSB8fCBQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge0lNUE9SVCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZVByb21pc2VLaXQoKSB7XG4gIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9ID0gbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH0pO1xufVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIHtyZWFkb25seSB1bmtub3duW10gfCBbXX0gVFxuICogQHBhcmFtIHtUfSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+fSBBIG5ldyBQcm9taXNlLlxuICovXG4gICAgICAgZnVuY3Rpb24gcmFjZVByb21pc2VzKHZhbHVlcykge1xuICByZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSwgdmFsdWVzKSk7XG59XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA564QmQMDAAADAwAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCduYW1lJyx7dmFsdWU6XCJpc1Byb21pc2VcIn0pOyRozY9fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsvKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbiAgICAgICBmdW5jdGlvbiBpc1Byb21pc2UobWF5YmVQcm9taXNlKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKSA9PT0gbWF5YmVQcm9taXNlO1xufVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMdoTZ9EFgAARBYAACoAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCBgaXNQcmltaXRpdmVgIHRoYXQncyBjdXJyZW50bHkgaW4gYEBlbmRvL3Bhc3Mtc3R5bGVgLlxuICogTGF5ZXJpbmcgY29uc3RyYWludHMgbWFrZSB0aGlzIHRyaWNreSwgd2hpY2ggaXMgd2h5IHdlIGhhdmVuJ3QgeWV0IGZpZ3VyZWRcbiAqIG91dCBob3cgdG8gZG8gdGhpcy5cbiAqXG4gKiBAdHlwZSB7KHZhbDogdW5rbm93bikgPT4gdmFsIGlzICh1bmRlZmluZWRcbiAqIHwgbnVsbFxuICogfCBib29sZWFuXG4gKiB8IG51bWJlclxuICogfCBiaWdpbnRcbiAqIHwgc3RyaW5nXG4gKiB8IHN5bWJvbCl9XG4gKi9cbmNvbnN0IGlzUHJpbWl0aXZlID0gdmFsID0+XG4gICF2YWwgfHwgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBJTVBPUlQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZCA9IHJlY29yZCA9PiB7XG4gIGlmICghcmVjb3JkIHx8IHJlY29yZC5zZXR0bGVkKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxuXG4gIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSByZWNvcmQ7XG4gIE9iamVjdC5hc3NpZ24ocmVjb3JkLCB7XG4gICAgZGVmZXJyZWRzOiB1bmRlZmluZWQsXG4gICAgc2V0dGxlZDogdHJ1ZSxcbiAgfSk7XG4gIE9iamVjdC5mcmVlemUocmVjb3JkKTtcbiAgcmV0dXJuIGRlZmVycmVkcztcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkID0gdmFsdWUgPT4ge1xuICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbiAgICAvKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuICAgIC8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4gICAgLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG4gICAgcmV0dXJuIGhhcmRlbih7IHNldHRsZWQ6IHRydWUgfSk7XG4gIH1cblxuICBsZXQgcmVjb3JkID0ga25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG4gIGlmICghcmVjb3JkKSB7XG4gICAgcmVjb3JkID0geyBkZWZlcnJlZHM6IG5ldyBTZXQoKSwgc2V0dGxlZDogZmFsc2UgfTtcbiAgICBrbm93blByb21pc2VzLnNldCh2YWx1ZSwgcmVjb3JkKTtcbiAgICAvKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbiAgICAgIHZhbCA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyByZXNvbHZlIH0gb2YgbWFya1NldHRsZWQocmVjb3JkKSkge1xuICAgICAgICAgIHJlc29sdmUodmFsKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVyciA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyByZWplY3QgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgeyByYWNlIH0gPSB7XG4gIC8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7cmVhZG9ubHkgdW5rbm93bltdIHwgW119IFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7VH0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUW251bWJlcl0+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiogQHR5cGUge1suLi5UXX0gKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGZpbGxlZCBieSB0aGUgbG9vcCovXG4gICAgY29uc3QgY2FjaGVkVmFsdWVzID0gW107XG4gICAgY29uc3QgQyA9IHRoaXM7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEMoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZGVmZXJyZWQgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICBjb25zdCB7IHNldHRsZWQsIGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuICAgICAgICAgIC8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuICAgIC8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbiAgICByZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpIHtcbiAgICAgICAgY29uc3QgeyBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoZGVmZXJyZWRzKSB7XG4gICAgICAgICAgZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbn07JGjNj19vbmNlLnJhY2UocmFjZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAifqGgdCAAAHQgAADUAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBQcm9taXNlRXhlY3V0b3IgVGhlIHByb21pc2UgZXhlY3V0b3JcbiAqIEBwYXJhbSB7KHZhbHVlOiBJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxJTVBPUlQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG4gICAgICAgY29uc3QgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gKCkgPT4ge1xuICAvKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkKX0gKi9cbiAgbGV0IGludGVybmFsUmVzb2x2ZTtcbiAgLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xuICBsZXQgaW50ZXJuYWxSZWplY3Q7XG5cbiAgLyoqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbiAgY29uc3QgcmVzb2x2ZSA9IHZhbHVlID0+IHtcbiAgICBpZiAoaW50ZXJuYWxSZXNvbHZlKSB7XG4gICAgICBpbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVzb2x2ZSA9PT0gbnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuICBjb25zdCByZWplY3QgPSByZWFzb24gPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlamVjdCkge1xuICAgICAgaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbiAgICAgIGludGVybmFsUmVzb2x2ZSA9IG51bGw7XG4gICAgICBpbnRlcm5hbFJlamVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChpbnRlcm5hbFJlamVjdCA9PT0gbnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGV4ZWN1dG9yID0gKHJlcywgcmVqKSA9PiB7XG4gICAgYXNzZXJ0KGludGVybmFsUmVzb2x2ZSA9PT0gdW5kZWZpbmVkICYmIGludGVybmFsUmVqZWN0ID09PSB1bmRlZmluZWQpO1xuICAgIGludGVybmFsUmVzb2x2ZSA9IHJlcztcbiAgICBpbnRlcm5hbFJlamVjdCA9IHJlajtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9KTtcbn07JGjNj19vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAs5nu6URwAAFEcAAAdAAAAQGVuZG8vc3RyZWFtLXYxLjIuMTMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZVBpcGUiLCJtYWtlUXVldWUiLCJtYWtlU3RyZWFtIiwibWFwUmVhZGVyIiwibWFwV3JpdGVyIiwicHJpbWUiLCJwdW1wIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxtYWtlUHJvbWlzZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogVHlwZVNjcmlwdCBSZWFkT25seSBzZW1hbnRpY3MgYXJlIG5vdCBzdWZmaWNpZW50bHkgZXhwcmVzc2l2ZSB0byBkaXN0aW5ndWlzaCovXG4vKiBhIHZhbHVlIG9uZSBwcm9taXNlcyBub3QgdG8gYWx0ZXIgZnJvbSBhIHZhbHVlIG9uZSBtdXN0IG5vdCBhbHRlciwqL1xuLyogbWFraW5nIGl0IHVzZWxlc3MuKi9cbmNvbnN0IGZyZWV6ZSA9IC8qKiBAdHlwZSB7PFQ+KHY6IFQgfCBSZWFkb25seTxUPikgPT4gVH0gKi8gKE9iamVjdC5mcmVlemUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VRdWV1ZSA9ICgpID0+IHtcbiAgbGV0IHsgcHJvbWlzZTogdGFpbFByb21pc2UsIHJlc29sdmU6IHRhaWxSZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICByZXR1cm4ge1xuICAgIHB1dCh2YWx1ZSkge1xuICAgICAgY29uc3QgeyByZXNvbHZlLCBwcm9taXNlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgdGFpbFJlc29sdmUoZnJlZXplKHsgdmFsdWUsIHByb21pc2UgfSkpO1xuICAgICAgdGFpbFJlc29sdmUgPSByZXNvbHZlO1xuICAgIH0sXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IHRhaWxQcm9taXNlLnRoZW4obmV4dCA9PiBuZXh0LnZhbHVlKTtcbiAgICAgIHRhaWxQcm9taXNlID0gdGFpbFByb21pc2UudGhlbihuZXh0ID0+IG5leHQucHJvbWlzZSk7XG4gICAgICByZXR1cm4gaGFyZGVuKHByb21pc2UpO1xuICAgIH0sXG4gIH07XG59OyRozY9fb25jZS5tYWtlUXVldWUobWFrZVF1ZXVlKTtcbmhhcmRlbihtYWtlUXVldWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZWFkUmV0dXJuXG4gKiBAdGVtcGxhdGUgVFdyaXRlUmV0dXJuXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkFzeW5jU3ByaW5nPEl0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmVhZFJldHVybj4+fSBhY2tzXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkFzeW5jU2luazxJdGVyYXRvclJlc3VsdDxUV3JpdGUsIFRXcml0ZVJldHVybj4+fSBkYXRhXG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3RyZWFtID0gKGFja3MsIGRhdGEpID0+IHtcbiAgY29uc3Qgc3RyZWFtID0gaGFyZGVuKHtcbiAgICAvKipcbiAqIEBwYXJhbSB7VFdyaXRlfSB2YWx1ZVxuICovXG4gICAgbmV4dCh2YWx1ZSkge1xuICAgICAgLyogTm90ZSB0aGUgc2hhbGxvdyBmcmVlemUgc2luY2UgdmFsdWUgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZnJlZXphYmxlKi9cbiAgICAgIC8qICh0eXBlZCBhcnJheXMgYXJlIG5vdCkuKi9cbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiBmYWxzZSB9KSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtUV3JpdGVSZXR1cm59IHZhbHVlXG4gKi9cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICovXG4gICAgdGhyb3coZXJyb3IpIHtcbiAgICAgIGRhdGEucHV0KGhhcmRlbihQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59OyRozY9fb25jZS5tYWtlU3RyZWFtKG1ha2VTdHJlYW0pO1xuaGFyZGVuKG1ha2VTdHJlYW0pO1xuXG4vKiBKU0RvYyBUeXBlU2NyaXB0IHNlZW1zIHVuYWJsZSB0byBleHByZXNzIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbidzKi9cbi8qIGVudGFuZ2xlbWVudCBvZiBxdWV1ZXMsIGJ1dCB0aGUgZGVmaW5pdGlvbiBpbiB0eXBlcy5kLnRzIHdvcmtzIGZvciB0aGUgZW5kKi9cbi8qIHVzZXIuKi9cbiAgICAgICBjb25zdCBtYWtlUGlwZSA9ICgpID0+IHtcbiAgY29uc3QgZGF0YSA9IG1ha2VRdWV1ZSgpO1xuICBjb25zdCBhY2tzID0gbWFrZVF1ZXVlKCk7XG4gIGNvbnN0IHJlYWRlciA9IG1ha2VTdHJlYW0oYWNrcywgZGF0YSk7XG4gIGNvbnN0IHdyaXRlciA9IG1ha2VTdHJlYW0oZGF0YSwgYWNrcyk7XG4gIHJldHVybiBoYXJkZW4oW3dyaXRlciwgcmVhZGVyXSk7XG59OyRozY9fb25jZS5tYWtlUGlwZShtYWtlUGlwZSk7XG5oYXJkZW4obWFrZVBpcGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZWFkUmV0dXJuXG4gKiBAdGVtcGxhdGUgVFdyaXRlUmV0dXJuXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlN0cmVhbTxUV3JpdGUsIFRSZWFkLCBUV3JpdGVSZXR1cm4sIFRSZWFkUmV0dXJuPn0gd3JpdGVyXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlN0cmVhbTxUUmVhZCwgVFdyaXRlLCBUUmVhZFJldHVybiwgVFdyaXRlUmV0dXJuPn0gcmVhZGVyXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbiAgICAgICBjb25zdCBwdW1wID0gYXN5bmMgKHdyaXRlciwgcmVhZGVyLCBwcmltZXIpID0+IHtcbiAgLyoqIEBwYXJhbSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuICBjb25zdCB0aWNrID0gcHJvbWlzZSA9PlxuICAgIEUud2hlbihcbiAgICAgIHByb21pc2UsXG4gICAgICByZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gd3JpdGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qIEJlaG9sZDogbXV0dWFsIHJlY3Vyc2lvbi4qL1xuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICAgICAgcmV0dXJuIHRvY2sod3JpdGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoLyoqIEB0eXBlIHtFcnJvcn0gKi8gZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIC8qKiBAcGFyYW0ge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuICBjb25zdCB0b2NrID0gcHJvbWlzZSA9PlxuICAgIEUud2hlbihcbiAgICAgIHByb21pc2UsXG4gICAgICByZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVhZGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aWNrKHJlYWRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKC8qKiBAdHlwZSB7RXJyb3J9ICovIGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiByZWFkZXIudGhyb3coZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuICBhd2FpdCB0aWNrKHJlYWRlci5uZXh0KHByaW1lcikpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTskaM2PX29uY2UucHVtcChwdW1wKTtcbmhhcmRlbihwdW1wKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmV0dXJuXG4gKiBAcGFyYW0ge0FzeW5jR2VuZXJhdG9yPFRSZWFkLCBUUmV0dXJuLCBUV3JpdGU+fSBnZW5lcmF0b3JcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuICAgICAgIGNvbnN0IHByaW1lID0gKGdlbmVyYXRvciwgcHJpbWVyKSA9PiB7XG4gIC8qIFdlIGNhcHR1cmUgdGhlIGZpcnN0IHJldHVybmVkIHByb21pc2UuKi9cbiAgY29uc3QgZmlyc3QgPSBnZW5lcmF0b3IubmV4dChwcmltZXIpO1xuICAvKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmV0dXJuPj19ICovXG4gIGxldCByZXN1bHQ7XG4gIGNvbnN0IHByaW1lZCA9IGhhcmRlbih7XG4gICAgLyoqIEBwYXJhbSB7VFdyaXRlfSB2YWx1ZSAqL1xuICAgIGFzeW5jIG5leHQodmFsdWUpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGplc3NpZS5qcy9zYWZlLWF3YWl0LXNlcGFyYXRvciovXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLm5leHQodmFsdWUpO1xuICAgIH0sXG4gICAgLyoqIEBwYXJhbSB7VFJldHVybn0gdmFsdWUgKi9cbiAgICBhc3luYyByZXR1cm4odmFsdWUpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGplc3NpZS5qcy9zYWZlLWF3YWl0LXNlcGFyYXRvciovXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLnJldHVybih2YWx1ZSk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtFcnJvcn0gZXJyb3IgKi9cbiAgICBhc3luYyB0aHJvdyhlcnJvcikge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAamVzc2llLmpzL3NhZmUtYXdhaXQtc2VwYXJhdG9yKi9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLnRocm93KGVycm9yKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHByaW1lZDtcbn07JGjNj19vbmNlLnByaW1lKHByaW1lKTtcbmhhcmRlbihwcmltZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZGVyPFRJbj59IHJlYWRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZGVyPFRPdXQ+fVxuICovXG4gICAgICAgY29uc3QgbWFwUmVhZGVyID0gKHJlYWRlciwgdHJhbnNmb3JtKSA9PiB7XG4gIGFzeW5jIGZ1bmN0aW9uKiB0cmFuc2Zvcm1HZW5lcmF0b3IoKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiByZWFkZXIpIHtcbiAgICAgIHlpZWxkIHRyYW5zZm9ybSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaGFyZGVuKHRyYW5zZm9ybUdlbmVyYXRvcik7XG4gIHJldHVybiBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKCkpO1xufTskaM2PX29uY2UubWFwUmVhZGVyKG1hcFJlYWRlcik7XG5oYXJkZW4obWFwUmVhZGVyKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVEluXG4gKiBAdGVtcGxhdGUgVE91dFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Xcml0ZXI8VE91dD59IHdyaXRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuV3JpdGVyPFRJbj59XG4gKi9cbiAgICAgICBjb25zdCBtYXBXcml0ZXIgPSAod3JpdGVyLCB0cmFuc2Zvcm0pID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtZWRXcml0ZXIgPSBoYXJkZW4oe1xuICAgIC8qKlxuICogQHBhcmFtIHtUSW59IHZhbHVlXG4gKi9cbiAgICBhc3luYyBuZXh0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLm5leHQodHJhbnNmb3JtKHZhbHVlKSk7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cbiAgICBhc3luYyB0aHJvdyhlcnJvcikge1xuICAgICAgcmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSB2YWx1ZVxuICovXG4gICAgYXN5bmMgcmV0dXJuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLnJldHVybih2YWx1ZSk7XG4gICAgfSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG59OyRozY9fb25jZS5tYXBXcml0ZXIobWFwV3JpdGVyKTtcbmhhcmRlbihtYXBXcml0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVF1ZXVlIjpbIm1ha2VRdWV1ZSJdLCJtYWtlU3RyZWFtIjpbIm1ha2VTdHJlYW0iXSwibWFrZVBpcGUiOlsibWFrZVBpcGUiXSwicHVtcCI6WyJwdW1wIl0sInByaW1lIjpbInByaW1lIl0sIm1hcFJlYWRlciI6WyJtYXBSZWFkZXIiXSwibWFwV3JpdGVyIjpbIm1hcFdyaXRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADuW/a/0QEAANEBAAAcAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc3siaW1wb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9yaW5nMC9tYWluLmpzXCIsIFtdXSxbXCIuL3JpbmcxL21haW4uanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9mAl5IEBAACBAQAAHwAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL0UuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiQGVuZG8vZmFyIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADehziD9QMAAPUDAAAsAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzeW5jR2VuZXJhdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXN5bmMgaXRlcmFibGUgdGhhdCBwcm9kdWNlcyBpdGVyYXRvciByZXN1bHRzIHZpYSBgbmV4dGAuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgU3ltYm9sLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFRSZXR1cm5cbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4gfFxuICogICAgICAgICAgICAgICBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PlxuICogfSBuZXh0IHByb2R1Y2UgYSBzaW5nbGUtc3RlcCBpdGVyYXRvciByZXN1bHRcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG4gICAgICAgY29uc3QgYXN5bmNHZW5lcmF0ZSA9IG5leHQgPT4ge1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogYXN5bmMgKCkgPT4gaGFyZGVuKG5leHQoKSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLmFzeW5jR2VuZXJhdGUoYXN5bmNHZW5lcmF0ZSk7XG5oYXJkZW4oYXN5bmNHZW5lcmF0ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0dlbmVyYXRlIjpbImFzeW5jR2VuZXJhdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/nr5/fQBAAD0AQAAIgAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21haW4uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9tYWtlcnMuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9FLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyIsIi4vbWFrZXJzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbXV0sW1wiLi9tYWtlcnMuanNcIiwgW11dLFtcIi4vYXN5bmMtZ2VuZXJhdGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwxmxeDMJAAAzCQAAJAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21ha2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZU1hcCIsIm1ha2VQcm9taXNlIiwibWFrZVNldCIsIm1ha2VXZWFrTWFwIiwibWFrZVdlYWtTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cbi8qIFRoZXNlIHdvcmsgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBuZXdgLiovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiIC8+Ki9cblxuLyoqXG4gKiBAdHlwZSB7PFQ+KGV4ZWN1dG9yOiAoXG4gKiAgIHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCxcbiAqICAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkXG4gKiApID0+IHZvaWQpID0+IFByb21pc2U8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUHJvbWlzZSA9IGV4ZWN1dG9yID0+IGhhcmRlbihuZXcgUHJvbWlzZShleGVjdXRvcikpOyRozY9fb25jZS5tYWtlUHJvbWlzZShtYWtlUHJvbWlzZSk7XG5oYXJkZW4obWFrZVByb21pc2UpO1xuXG4vKiogQHR5cGVkZWYgezxLLCBWPihlbnRyaWVzPzogcmVhZG9ubHkgKHJlYWRvbmx5IFtLLCBWXSlbXSkgPT4gTWFwPEssIFY+fSBNYXBGcm9tRW50cmllcyAqL1xuLyoqIEB0eXBlZGVmIHs8SywgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPHJlYWRvbmx5IFtLLCBWXT4pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUl0ZXJhYmxlICovXG5cbi8qKiBAdHlwZSB7TWFwRnJvbUVudHJpZXMgJiBNYXBGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZU1hcCA9IGVudHJpZXNPckl0ZXJhYmxlID0+IGhhcmRlbihuZXcgTWFwKGVudHJpZXNPckl0ZXJhYmxlKSk7JGjNj19vbmNlLm1ha2VNYXAobWFrZU1hcCk7XG5oYXJkZW4obWFrZU1hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQ+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gU2V0PFQ+fSBTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFNldDxUPn0gU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1NldEZyb21WYWx1ZXMgJiBTZXRGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZVNldCA9IHZhbHVlcyA9PiBoYXJkZW4obmV3IFNldCh2YWx1ZXMpKTskaM2PX29uY2UubWFrZVNldChtYWtlU2V0KTtcbmhhcmRlbihtYWtlU2V0KTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgViA9IGFueT4oXG4gKiAgICBlbnRyaWVzPzogcmVhZG9ubHkgW0ssIFZdW10gfCBudWxsXG4gKiApID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tRW50cmllc1xuICovXG4vKiogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxbSywgVl0+KSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtNYXBGcm9tRW50cmllcyAmIFdlYWtNYXBGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtNYXAgPSBlbnRyaWVzID0+IGhhcmRlbihuZXcgV2Vha01hcChlbnRyaWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrTWFwKG1ha2VXZWFrTWFwKTtcbmhhcmRlbihtYWtlV2Vha01hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9PihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha1NldEZyb21WYWx1ZXMgJiBXZWFrU2V0RnJvbUl0ZXJhYmxlfSAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrU2V0ID0gdmFsdWVzID0+IGhhcmRlbihuZXcgV2Vha1NldCh2YWx1ZXMpKTskaM2PX29uY2UubWFrZVdlYWtTZXQobWFrZVdlYWtTZXQpO1xuaGFyZGVuKG1ha2VXZWFrU2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlIjpbIm1ha2VQcm9taXNlIl0sIm1ha2VNYXAiOlsibWFrZU1hcCJdLCJtYWtlU2V0IjpbIm1ha2VTZXQiXSwibWFrZVdlYWtNYXAiOlsibWFrZVdlYWtNYXAiXSwibWFrZVdlYWtTZXQiOlsibWFrZVdlYWtTZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAaVR4XlIFAABSBQAAKQAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4uL3JpbmcwL21haW4uanMiXSwiZXhwb3J0cyI6WyJhc3luY0RvV2hpbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIi4uL3JpbmcwL21haW4uanNcIiwgW1tcIm1ha2VQcm9taXNlXCIsWyRozY9fYSA9PiAobWFrZVByb21pc2UgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBSZXNvbHZlIHJldHVybmVkIHByb21pc2Ugd2l0aCB1bmRlZmluZWQgd2hlbiBgYm9keWAgcmV0dXJucyBmYWxzeS5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgYXdhaXRgIG5vdCBhdCB0aGUgZnVuY3Rpb24tbGV2ZWwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVCB8IFByb21pc2U8VD59IGJvZHkgcGVyZm9ybSBzaWRlLWVmZmVjdHMsIGFuZCByZXR1cm4gdHJ1dGh5IGlmXG4gKiB3ZSBzaG91bGQgcnVuIGFnYWluXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuICAgICAgIGNvbnN0IGFzeW5jRG9XaGlsZSA9IGJvZHkgPT4ge1xuICByZXR1cm4gbWFrZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGxvb3AgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkb0NvbnRpbnVlID0gYXdhaXQgYm9keSgpO1xuICAgICAgaWYgKCFkb0NvbnRpbnVlKSB7XG4gICAgICAgIC8qIFJlc29sdmUgdGhlIG91dGVybW9zdCBwcm9taXNlLiovXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvKiBEbyB0aGUgbG9vcCBhZ2Fpbi4gIFdlIGFyZSBjYXJlZnVsIG5vdCB0byBhd2FpdCBzbyB0aGF0IHdlIGRvbid0IGNyZWF0ZSBhKi9cbiAgICAgIC8qIHByb21pc2UgY2hhaW4uKi9cbiAgICAgIGxvb3AoKS5jYXRjaChyZWplY3QpO1xuICAgIH07XG5cbiAgICBsb29wKCkuY2F0Y2gocmVqZWN0KTtcbiAgfSk7XG59OyRozY9fb25jZS5hc3luY0RvV2hpbGUoYXN5bmNEb1doaWxlKTtcbmhhcmRlbihhc3luY0RvV2hpbGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNEb1doaWxlIjpbImFzeW5jRG9XaGlsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAbaDcDlgEAAJYBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvbWFpbi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2FzeW5jLXRvb2xzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAQpfiqwbsAAAG7AAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAMYBI+I0BAACNAQAAIAAAAAAAAAAAAAAApIE47AAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL2hlYXAuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIED7gAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAABMzBZHzCwAA8wsAACQAAAAAAAAAAAAAAKSBoO8AAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAAAVbrH6eQIAAHkCAAAlAAAAAAAAAAAAAACkgdX7AABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAC1M1ZEhAwAAIQMAACsAAAAAAAAAAAAAAKSBkf4AAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaXMtcGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAbBWnPyIEAAAiBAAAJAAAAAAAAAAAAAAApIH7AQEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9rZXlzLmpzUEsBAh4DCgAAAAAAAAAAAKkbjar6DgAA+g4AACkAAAAAAAAAAAAAAKSBXwYBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvbWFrZS1vbmNlLmpzUEsBAh4DCgAAAAAAAAAAAGC/2hirDQAAqw0AAC0AAAAAAAAAAAAAAKSBoBUBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAADhg52A5zwAAOc8AAAmAAAAAAAAAAAAAACkgZYjAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50TWF0aC5qc1BLAQIeAwoAAAAAAAAAAABf6b1eegUAAHoFAAAnAAAAAAAAAAAAAACkgcFgAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAQ7172XQGAAB0BgAAJwAAAAAAAAAAAAAApIGAZgEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzUEsBAh4DCgAAAAAAAAAAAPNfTQNNAgAATQIAACEAAAAAAAAAAAAAAKSBOW0BAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABoPpBzxzwAAMc8AAAlAAAAAAAAAAAAAACkgcVvAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzUEsBAh4DCgAAAAAAAAAAAFTn3CUTBgAAEwYAADoAAAAAAAAAAAAAAKSBz6wBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAWh3vSSYGAAAmBgAAOgAAAAAAAAAAAAAApIE6swEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAZ8y1+zwYAAM8GAAA2AAAAAAAAAAAAAACkgbi5AQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAPdw1//0HAAD9BwAANgAAAAAAAAAAAAAApIHbwAEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAADJyxEpYBQAAWAUAACMAAAAAAAAAAAAAAKSBLMkBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzUEsBAh4DCgAAAAAAAAAAANgnSHa+NgAAvjYAACkAAAAAAAAAAAAAAKSBxc4BAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAD4gnomXHAAAlxwAACEAAAAAAAAAAAAAAKSBygUCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc1BLAQIeAwoAAAAAAAAAAABg5KxbGQcAABkHAAAtAAAAAAAAAAAAAACkgaAiAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAA5frfq0AtAABALQAAJgAAAAAAAAAAAAAApIEEKgIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIGIVwIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGxhNlyHJAAAhyQAADMAAAAAAAAAAAAAAKSBJVkCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9iaW5hcnlWb3RlQ291bnRlci5qc1BLAQIeAwoAAAAAAAAAAAD+DBr9lQMAAJUDAAAtAAAAAAAAAAAAAACkgf19AgBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY2xvc2luZ1J1bGUuanNQSwECHgMKAAAAAAAAAAAAt5hiXQMRAAADEQAAKgAAAAAAAAAAAAAApIHdgQIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3F1ZXN0aW9uLmpzUEsBAh4DCgAAAAAAAAAAADvlofiUAwAAlAMAAC8AAAAAAAAAAAAAAKSBKJMCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9xdW9ydW1Db3VudGVyLmpzUEsBAh4DCgAAAAAAAAAAAJtAyG0sQAAALEAAACwAAAAAAAAAAAAAAKSBCZcCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAAUYC9zZLAAA2SwAACcAAAAAAAAAAAAAAKSBf9cCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jYWxsYmFjay5qc1BLAQIeAwoAAAAAAAAAAACjNk+m9QQAAPUEAAAoAAAAAAAAAAAAAACkgZ0EAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2xpLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAG0NeBXKDAAAygwAACUAAAAAAAAAAAAAAKSB2AkDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAjb2mAa4IAACuCAAAJAAAAAAAAAAAAAAApIHlFgMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzUEsBAh4DCgAAAAAAAAAAALGT1Y5eAwAAXgMAACUAAAAAAAAAAAAAAKSB1R8DAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanNQSwECHgMKAAAAAAAAAAAAaBzsGv4EAAD+BAAAJAAAAAAAAAAAAAAApIF2IwMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKrVr42mJQAApiUAACcAAAAAAAAAAAAAAKSBtigDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9qcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAAi9VLVrAcAAKwHAAAoAAAAAAAAAAAAAACkgaFOAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMva2V5TWlycm9yLmpzUEsBAh4DCgAAAAAAAAAAAKVsHvRVLQAAVS0AAC8AAAAAAAAAAAAAAKSBk1YDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAAKSDz56xAwAAsQMAADAAAAAAAAAAAAAAAKSBNYQDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL3B1cmUtZGF0YS5qc1BLAQIeAwoAAAAAAAAAAAAr7RBF8Q0AAPENAAArAAAAAAAAAAAAAACkgTSIAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAJD9IHigQgAAoEIAACYAAAAAAAAAAAAAAKSBbpYDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRyaWNzLmpzUEsBAh4DCgAAAAAAAAAAAIq5WvK2DgAAtg4AACsAAAAAAAAAAAAAAKSBUtkDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9uYXR1cmFsLXNvcnQuanNQSwECHgMKAAAAAAAAAAAAT8Qll2pIAABqSAAAKAAAAAAAAAAAAAAApIFR6AMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Nlcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADaiNsr1gMAANYDAAAlAAAAAAAAAAAAAACkgQExBABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdG1wRGlyLmpzUEsBAh4DCgAAAAAAAAAAAE5ip5ahBAAAoQQAACgAAAAAAAAAAAAAAKSBGjUEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlQ2hlY2suanNQSwECHgMKAAAAAAAAAAAAq3x1xKMFAACjBQAAKQAAAAAAAAAAAAAApIEBOgQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAAAAAAAAAAAApIHrPwQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAANeHGT1wDAAAcAwAACoAAAAAAAAAAAAAAKSBi0EEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc1BLAQIeAwoAAAAAAAAAAAA/4UE8GRQAABkUAAAzAAAAAAAAAAAAAACkgUNOBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNQSwECHgMKAAAAAAAAAAAAwj7tuOsHAADrBwAAJAAAAAAAAAAAAAAApIGtYgQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALNJ/07FGwAAxRsAACcAAAAAAAAAAAAAAKSB2moEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAbIRejM0IAADNCAAAqAAAAAAAAAAAAAACkgeSGBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanNQSwECHgMKAAAAAAAAAAAALEhEN6oMAACqDAAALgAAAAAAAAAAAAAApIFfyQQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAB65k5eJCYAACQmAAAnAAAAAAAAAAAAAACkgVXWBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAAZA69fPIpAADyKQAAKAAAAAAAAAAAAAAApIG+/AQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc1BLAQIeAwoAAAAAAAAAAABXqgSRKQ0AACkNAAApAAAAAAAAAAAAAACkgfYmBQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc1BLAQIeAwoAAAAAAAAAAAB35kpGlQYAAJUGAAAkAAAAAAAAAAAAAACkgWY0BQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdG9waWMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAAAAAAAAAAAApIE9OwUAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAEcacpNGDgAARg4AACEAAAAAAAAAAAAAAKSB3TwFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAP0kYu4gsAAOILAAAsAAAAAAAAAAAAAACkgWJLBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAADbxEI1bQcAAG0HAAAwAAAAAAAAAAAAAACkgY5XBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAA16FBRuoYAADqGAAAMQAAAAAAAAAAAAAApIFJXwUAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACmQkq1EREAABERAAAxAAAAAAAAAAAAAACkgYJ4BQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAPk186ftFgAA7RYAADUAAAAAAAAAAAAAAKSB4okFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJRapRtOEQAAThEAADUAAAAAAAAAAAAAAKSBIqEFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAKpX7y7bGgAA2xoAAC4AAAAAAAAAAAAAAKSBw7IFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIHqzQUAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAO31mJswAgAAMAIAABwAAAAAAAAAAAAAAKSBh88FAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAtDNtlAolAAAKJQAAIwAAAAAAAAAAAAAApIHx0QUAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAANPYVxPMJAADzCQAAJQAAAAAAAAAAAAAApIE89wUAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAAAAAAAAAAACkgXIBBgBAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAA2D1iULSwAAC0sAAAoAAAAAAAAAAAAAACkgQ4DBgBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAAAAAAAAAAAAAKSBgS8GAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADvd74wOSMAADkjAAAwAAAAAAAAAAAAAACkgXk4BgBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAARXv4GawIAACsCAAAJQAAAAAAAAAAAAAApIEAXAYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvbWFrZUhhbmRsZS5qc1BLAQIeAwoAAAAAAAAAAAAB0/RLSEsAAEhLAAAlAAAAAAAAAAAAAACkge9kBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAANn0k7SWAQAAlgEAAB4AAAAAAAAAAAAAAKSBerAGAEBhZ29yaWMvem9uZS12MC4yLjIvZHVyYWJsZS5qc1BLAQIeAwoAAAAAAAAAAACAMlLK2hMAANoTAAAiAAAAAAAAAAAAAACkgUyyBgBAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9kdXJhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAG9RIY9hCwAAYQsAACwAAAAAAAAAAAAAAKSBZsYGAEBlbmRvL2NvbW1vbi12MS4yLjEzL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzUEsBAh4DCgAAAAAAAAAAAEj4QsrdBQAA3QUAACsAAAAAAAAAAAAAAKSBEdIGAEBlbmRvL2NvbW1vbi12MS4yLjEzL2Zyb20tdW5pcXVlLWVudHJpZXMuanNQSwECHgMKAAAAAAAAAAAAt5VT7iUIAAAlCAAAJQAAAAAAAAAAAAAApIE32AYAQGVuZG8vY29tbW9uLXYxLjIuMTMvaWRlbnQtY2hlY2tlci5qc1BLAQIeAwoAAAAAAAAAAABhr/xquAQAALgEAAAnAAAAAAAAAAAAAACkgZ/gBgBAZW5kby9jb21tb24tdjEuMi4xMy9saXN0LWRpZmZlcmVuY2UuanNQSwECHgMKAAAAAAAAAAAAJexd93kEAAB5BAAAKwAAAAAAAAAAAAAApIGc5QYAQGVuZG8vY29tbW9uLXYxLjIuMTMvbWFrZS1hcnJheS1pdGVyYXRvci5qc1BLAQIeAwoAAAAAAAAAAABdNq96BgMAAAYDAAAlAAAAAAAAAAAAAACkgV7qBgBAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAHbnqxlvCgAAbwoAACIAAAAAAAAAAAAAAKSBp+0GAEBlbmRvL2NvbW1vbi12MS4yLjEzL29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAAqJog2jsJAAA7CQAAJwAAAAAAAAAAAAAApIFW+AYAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1ldGEtbWFwLmpzUEsBAh4DCgAAAAAAAAAAANizQYKZBQAAmQUAACUAAAAAAAAAAAAAAKSB1gEHAEBlbmRvL2NvbW1vbi12MS4yLjEzL3Rocm93LWxhYmVsZWQuanNQSwECHgMKAAAAAAAAAAAANKKhqaIBAACiAQAAIgAAAAAAAAAAAAAApIGyBwcAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAC8ATOCOBYAADgWAAAsAAAAAAAAAAAAAACkgZQJBwBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAABqZnbiZA0AAGQNAAAdAAAAAAAAAAAAAACkgRYgBwBAZW5kby9lcnJvcnMtdjEuMi4xMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADT6UYIEEcAABBHAAAjAAAAAAAAAAAAAACkgbUtBwBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAAAAAAAAAAACkgQZ1BwBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAABzlTFSchQAAHIUAAAnAAAAAAAAAAAAAACkgaV2BwBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbG9jYWwuanNQSwECHgMKAAAAAAAAAAAAh3iIufQYAAD0GAAANQAAAAAAAAAAAAAApIFciwcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNQSwECHgMKAAAAAAAAAAAAKRNV2dYFAADWBQAAKQAAAAAAAAAAAAAApIGjpAcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAAMyikjlcSAABXEgAALQAAAAAAAAAAAAAApIHAqgcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAAAAAAAAAAAAAKSBYr0HAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANxF2aNgAgAAYAIAABoAAAAAAAAAAAAAAKSBB8AHAEBlbmRvL2V4by12MS41LjEyL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALGTEP8QIAAAECAAACMAAAAAAAAAAAAAAKSBn8IHAEBlbmRvL2V4by12MS41LjEyL3NyYy9leG8tbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAABWj/usuRgAALkYAACIAAAAAAAAAAAAAAKSB8OIHAEBlbmRvL2V4by12MS41LjEyL3NyYy9leG8tdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAySXaNgsFAAALBQAAJgAAAAAAAAAAAAAApIFeKQgAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2dldC1pbnRlcmZhY2UuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAHgAAAAAAAAAAAAAApIGtLggAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACAAAAAAAAAAAAAAAKSBQTAIAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAKkm1lCYAgAAmAIAAB4AAAAAAAAAAAAAAKSB1zEIAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAB1Rn/ZBwgAAAcIAAAdAAAAAAAAAAAAAACkgas0CABAZW5kby9tYXJzaGFsLXYxLjguMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABgv2qoyX0AAMl9AAAqAAAAAAAAAAAAAACkge08CABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAA1cJzuhdEAAAXRAAAKwAAAAAAAAAAAAAApIH+uggAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAAANU1+O9EUAAPRFAAAtAAAAAAAAAAAAAACkgV7/CABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAAQnQV6b5CAAC+QgAAKgAAAAAAAAAAAAAApIGdRQkAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAAKtxgfihCQAAoQkAAC0AAAAAAAAAAAAAAKSBo4gJAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAABlWIW1fD8AAHw/AAAjAAAAAAAAAAAAAACkgY+SCQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAACBor4x6FkAAOhZAAAlAAAAAAAAAAAAAACkgUzSCQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAAAAAAAAAAAAAKSBdywKAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADjEN0jSQwAAEkMAAAdAAAAAAAAAAAAAACkgQ4uCgBAZW5kby9uYXQtdjUuMS4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABubt5zNgsAADYLAAAgAAAAAAAAAAAAAACkgZI6CgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABOhW4jFQ0AABUNAAAoAAAAAAAAAAAAAACkgQZGCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvYnl0ZUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAAJmnvdIICAAACAgAACgAAAAAAAAAAAAAAKSBYVMKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAARy+6HWcLAABnCwAAKQAAAAAAAAAAAAAApIGvWwoAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAAnjrC09gZAADYGQAALgAAAAAAAAAAAAAApIFdZwoAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1BLAQIeAwoAAAAAAAAAAABqyyZGzR0AAM0dAAAkAAAAAAAAAAAAAACkgYGBCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAAewaKenwJAAB8CQAAKwAAAAAAAAAAAAAApIGQnwoAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAChJ4zJ9CUAAPQlAAAnAAAAAAAAAAAAAACkgVWpCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAAnFJgaYMFAACDBQAAKQAAAAAAAAAAAAAApIGOzwoAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAAfCXq/eohAADqIQAAMAAAAAAAAAAAAAAApIFY1QoAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAACYCjrdiPwAAYj8AACoAAAAAAAAAAAAAAKSBkPcKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAAD7nJ+yMC4AADAuAAAoAAAAAAAAAAAAAACkgTo3CwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAIeADyhSFgAAUhYAACsAAAAAAAAAAAAAAKSBsGULAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAA/KjZB9sPAADbDwAAJQAAAAAAAAAAAAAApIFLfAsAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N0cmluZy5qc1BLAQIeAwoAAAAAAAAAAAAC9zQiwxQAAMMUAAAlAAAAAAAAAAAAAACkgWmMCwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3ltYm9sLmpzUEsBAh4DCgAAAAAAAAAAAFy4UNlkCQAAZAkAACUAAAAAAAAAAAAAAKSBb6ELAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAt109XCYWAAAmFgAAKQAAAAAAAAAAAAAApIEWqwsAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJAAAAAAAAAAAAAAApIGDwQsAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAHVNktzvDgAA7w4AAB4AAAAAAAAAAAAAAKSBHcMLAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACqIQPpC0gAAAtIAAAqAAAAAAAAAAAAAACkgUjSCwBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY2hlY2tLZXkuanNQSwECHgMKAAAAAAAAAAAA/9srkD8oAAA/KAAALQAAAAAAAAAAAAAApIGbGgwAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzUEsBAh4DCgAAAAAAAAAAADRbU2NNFQAATRUAACkAAAAAAAAAAAAAAKSBJUMMAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb3B5QmFnLmpzUEsBAh4DCgAAAAAAAAAAACwjgyYsEQAALBEAACkAAAAAAAAAAAAAAKSBuVgMAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb3B5U2V0LmpzUEsBAh4DCgAAAAAAAAAAANs1mkDDIgAAwyIAADkAAAAAAAAAAAAAAKSBLGoMAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAACZxDgBVygAAFcoAAA1AAAAAAAAAAAAAACkgUaNDABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAAB0H48ZZS8AAGUvAAA1AAAAAAAAAAAAAACkgfC1DABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAABdGlpCKy8AACsvAAA2AAAAAAAAAAAAAACkgajlDABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanNQSwECHgMKAAAAAAAAAAAAZqTue74yAQC+MgEANQAAAAAAAAAAAAAApIEnFQ0AQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIgAAAAAAAAAAAAAApIE4SA4AQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAALArFhswkAALMJAAAiAAAAAAAAAAAAAACkgdBJDgBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAOeuEJkDAwAAAwMAACsAAAAAAAAAAAAAAKSBw1MOAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAx2hNn0QWAABEFgAAKgAAAAAAAAAAAAAApIEPVw4AQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAAifqGgdCAAAHQgAADUAAAAAAAAAAAAAAKSBm20OAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAAAAAAAAAAAAAKSBC3YOAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAACzme7pRHAAAURwAAB0AAAAAAAAAAAAAAKSBp3cOAEBlbmRvL3N0cmVhbS12MS4yLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAO5b9r/RAQAA0QEAABwAAAAAAAAAAAAAAKSBM5QOAGplc3NpZS5qcy12MC4zLjQvc3JjL21haW4uanNQSwECHgMKAAAAAAAAAAAA9mAl5IEBAACBAQAAHwAAAAAAAAAAAAAApIE+lg4AamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvRS5qc1BLAQIeAwoAAAAAAAAAAADehziD9QMAAPUDAAAsAAAAAAAAAAAAAACkgfyXDgBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc1BLAQIeAwoAAAAAAAAAAAD+evn99AEAAPQBAAAiAAAAAAAAAAAAAACkgTucDgBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAMMZsXgzCQAAMwkAACQAAAAAAAAAAAAAAKSBb54OAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAABpVHheUgUAAFIFAAApAAAAAAAAAAAAAACkgeSnDgBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9hc3luYy10b29scy5qc1BLAQIeAwoAAAAAAAAAAAAbaDcDlgEAAJYBAAAiAAAAAAAAAAAAAACkgX2tDgBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9tYWluLmpzUEsFBgAAAACcAJwAdTQAAFOvDgAAAA==","endoZipBase64Sha512":"9102b93175fd596862e518eee2f3d51e56d8b2385792b99486c00c5ae82fefe7c733e794e2ac66bff17bb8e9028c6d601f0d393c63d196b46deb5e12dff6f64f"};
|